@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f
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 +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- 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 +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +14 -15
- 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 +6 -9
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +6 -6
- 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/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/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/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/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 -2
- 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/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/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/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +9 -4
- 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/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 +63 -11
- 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.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- 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/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- 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 +3 -3
- package/dist/Selector/Selector.d.ts +17 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +81 -14
- 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.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- 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 +19 -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 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- 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.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +27 -8
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- 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.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +98 -7
- 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/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- 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/en.json +154 -10
- package/locales/pseudo.json +108 -0
- 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 +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- 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 +4 -3
- package/src/Calendar/Calendar.test.tsx +103 -0
- package/src/Calendar/Calendar.tsx +19 -16
- 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 +44 -19
- package/src/Card/Card.tsx +12 -32
- 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/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/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/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/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- 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/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 +62 -14
- 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/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.tsx +9 -4
- 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/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 +277 -0
- package/src/MultiSelector/MultiSelector.tsx +142 -11
- 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.tsx +3 -2
- 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/usePopover.tsx +31 -28
- 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.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +311 -1
- package/src/Selector/Selector.tsx +139 -16
- 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 +17 -8
- 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 +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -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 +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- 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 +18 -0
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Toast/ToastViewport.tsx +17 -1
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- 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.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- 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/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -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/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -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
|
@@ -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', () => {
|