@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
|
@@ -40,7 +40,7 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
40
40
|
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
41
41
|
import {colorVars, durationVars, easeVars} from '../theme/tokens.stylex';
|
|
42
42
|
import type {Elevation, SizeValue, SpacingStep} from '../utils/types';
|
|
43
|
-
import {mergeProps
|
|
43
|
+
import {mergeProps} from '../utils';
|
|
44
44
|
import {Card} from '../Card/Card';
|
|
45
45
|
import type {CardVariant} from '../Card/Card';
|
|
46
46
|
import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
@@ -48,6 +48,7 @@ import type {BaseProps} from '../BaseProps';
|
|
|
48
48
|
import {themeProps} from '../utils/themeProps';
|
|
49
49
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
50
50
|
|
|
51
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
51
52
|
// =============================================================================
|
|
52
53
|
// Styles — selection + interaction; Card handles the rest
|
|
53
54
|
// =============================================================================
|
|
@@ -346,7 +347,7 @@ export function SelectableCard({
|
|
|
346
347
|
|
|
347
348
|
return (
|
|
348
349
|
<Card
|
|
349
|
-
ref={
|
|
350
|
+
ref={useMergedRefs(ref, containerRef)}
|
|
350
351
|
width={width}
|
|
351
352
|
height={height}
|
|
352
353
|
maxWidth={maxWidth}
|
|
@@ -89,6 +89,20 @@ export const docs = {
|
|
|
89
89
|
description: 'Placeholder text for the search input.',
|
|
90
90
|
default: "'Search...'",
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'emptyText',
|
|
94
|
+
type: 'ReactNode',
|
|
95
|
+
description:
|
|
96
|
+
'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.',
|
|
97
|
+
default: "'No options'",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'emptySearchText',
|
|
101
|
+
type: 'ReactNode',
|
|
102
|
+
description:
|
|
103
|
+
'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).',
|
|
104
|
+
default: "'No results found'",
|
|
105
|
+
},
|
|
92
106
|
{
|
|
93
107
|
name: 'placeholder',
|
|
94
108
|
type: 'string',
|
|
@@ -171,7 +185,7 @@ export const docs = {
|
|
|
171
185
|
name: 'renderValue',
|
|
172
186
|
type: '(option: SelectorOptionData) => ReactNode',
|
|
173
187
|
description:
|
|
174
|
-
'Custom render function for the selected option inside the closed trigger. The trigger is sized by padding, so it is the size token for a one-line value (28/32/36) and exactly one text line taller for a two-line one (48/52/56)
|
|
188
|
+
'Custom render function for the selected option inside the closed trigger. The trigger is sized by padding, so it is the size token for a one-line value (28/32/36) and exactly one text line taller for a two-line one (48/52/56), always on the 4px rhythm, always aligned with the buttons and inputs beside it. Inside an InputGroup the group owns the row height: a SelectorOption folds onto one line and ellipsizes, and any taller node is cut off at the row.',
|
|
175
189
|
},
|
|
176
190
|
{
|
|
177
191
|
name: 'indicatorPosition',
|
|
@@ -186,6 +200,17 @@ export const docs = {
|
|
|
186
200
|
description:
|
|
187
201
|
'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.',
|
|
188
202
|
},
|
|
203
|
+
{
|
|
204
|
+
name: 'startIcon',
|
|
205
|
+
type: 'IconType | ReactNode',
|
|
206
|
+
description: 'Icon displayed at the start of the selector trigger.',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: 'isLoading',
|
|
210
|
+
type: 'boolean',
|
|
211
|
+
description: 'Shows a loading spinner in the trigger.',
|
|
212
|
+
default: 'false',
|
|
213
|
+
},
|
|
189
214
|
{
|
|
190
215
|
name: 'xstyle',
|
|
191
216
|
type: 'StyleXStyles',
|
|
@@ -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,
|
|
@@ -943,6 +944,222 @@ describe('Selector', () => {
|
|
|
943
944
|
expect(empty).toHaveAttribute('role', 'presentation');
|
|
944
945
|
});
|
|
945
946
|
|
|
947
|
+
it('renders emptySearchText in place of the default message', async () => {
|
|
948
|
+
const user = userEvent.setup();
|
|
949
|
+
render(
|
|
950
|
+
<Selector
|
|
951
|
+
label="Fruit"
|
|
952
|
+
options={OPTIONS}
|
|
953
|
+
value="Apple"
|
|
954
|
+
onChange={() => {}}
|
|
955
|
+
hasSearch
|
|
956
|
+
emptySearchText="Nothing like that here"
|
|
957
|
+
/>,
|
|
958
|
+
);
|
|
959
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
960
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
961
|
+
|
|
962
|
+
const listbox = screen.getByRole('listbox', h);
|
|
963
|
+
expect(
|
|
964
|
+
within(listbox).getByText('Nothing like that here'),
|
|
965
|
+
).toBeInTheDocument();
|
|
966
|
+
expect(
|
|
967
|
+
within(listbox).queryByText('No results found'),
|
|
968
|
+
).not.toBeInTheDocument();
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
it('renders emptyText, not emptySearchText, with no options and no query', async () => {
|
|
972
|
+
const user = userEvent.setup();
|
|
973
|
+
render(
|
|
974
|
+
<Selector
|
|
975
|
+
label="Fruit"
|
|
976
|
+
options={[]}
|
|
977
|
+
onChange={() => {}}
|
|
978
|
+
hasSearch
|
|
979
|
+
emptySearchText="Nothing like that here"
|
|
980
|
+
/>,
|
|
981
|
+
);
|
|
982
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
983
|
+
|
|
984
|
+
const listbox = screen.getByRole('listbox', h);
|
|
985
|
+
expect(within(listbox).getByText('No options')).toBeInTheDocument();
|
|
986
|
+
expect(
|
|
987
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
988
|
+
).not.toBeInTheDocument();
|
|
989
|
+
});
|
|
990
|
+
|
|
991
|
+
it('announces emptySearchText, not the catalog default', async () => {
|
|
992
|
+
const user = userEvent.setup();
|
|
993
|
+
render(
|
|
994
|
+
<Selector
|
|
995
|
+
label="Fruit"
|
|
996
|
+
options={OPTIONS}
|
|
997
|
+
value="Apple"
|
|
998
|
+
onChange={() => {}}
|
|
999
|
+
hasSearch
|
|
1000
|
+
emptySearchText="Nothing like that here"
|
|
1001
|
+
/>,
|
|
1002
|
+
);
|
|
1003
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
1004
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
1005
|
+
|
|
1006
|
+
// The panel message is role="presentation", so the live region is the
|
|
1007
|
+
// only thing a screen reader gets — it has to say the same words.
|
|
1008
|
+
await waitFor(() =>
|
|
1009
|
+
expect(politeRegion()?.textContent).toBe('Nothing like that here'),
|
|
1010
|
+
);
|
|
1011
|
+
});
|
|
1012
|
+
|
|
1013
|
+
it('announces the empty state when opened with no options', async () => {
|
|
1014
|
+
const user = userEvent.setup();
|
|
1015
|
+
render(
|
|
1016
|
+
<Selector
|
|
1017
|
+
label="Fruit"
|
|
1018
|
+
options={[]}
|
|
1019
|
+
onChange={() => {}}
|
|
1020
|
+
emptyText="Add a fruit first"
|
|
1021
|
+
/>,
|
|
1022
|
+
);
|
|
1023
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1024
|
+
|
|
1025
|
+
await waitFor(() =>
|
|
1026
|
+
expect(politeRegion()?.textContent).toBe('Add a fruit first'),
|
|
1027
|
+
);
|
|
1028
|
+
});
|
|
1029
|
+
|
|
1030
|
+
it('shows and announces nothing while isLoading', async () => {
|
|
1031
|
+
const user = userEvent.setup();
|
|
1032
|
+
render(
|
|
1033
|
+
<Selector label="Fruit" options={[]} onChange={() => {}} isLoading />,
|
|
1034
|
+
);
|
|
1035
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1036
|
+
|
|
1037
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1038
|
+
// would pass whether or not anything was announced.
|
|
1039
|
+
await act(
|
|
1040
|
+
async () =>
|
|
1041
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1042
|
+
);
|
|
1043
|
+
|
|
1044
|
+
// The options have not arrived, so "No options" would be a claim the
|
|
1045
|
+
// component cannot make; the trigger's spinner carries the state.
|
|
1046
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1047
|
+
expect(within(listbox).queryByText('No options')).not.toBeInTheDocument();
|
|
1048
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1049
|
+
});
|
|
1050
|
+
|
|
1051
|
+
it('announces nothing while isLoading, matching the silent panel', async () => {
|
|
1052
|
+
const user = userEvent.setup();
|
|
1053
|
+
render(
|
|
1054
|
+
<Selector
|
|
1055
|
+
label="Fruit"
|
|
1056
|
+
options={OPTIONS}
|
|
1057
|
+
value="Apple"
|
|
1058
|
+
onChange={() => {}}
|
|
1059
|
+
hasSearch
|
|
1060
|
+
isLoading
|
|
1061
|
+
emptySearchText="Nothing like that here"
|
|
1062
|
+
/>,
|
|
1063
|
+
);
|
|
1064
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
1065
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
1066
|
+
|
|
1067
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1068
|
+
// would pass whether or not anything was announced.
|
|
1069
|
+
await act(
|
|
1070
|
+
async () =>
|
|
1071
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
// The panel is deliberately blank while loading; the live region is the
|
|
1075
|
+
// only channel left, so a result there would be a claim the screen
|
|
1076
|
+
// refuses to make.
|
|
1077
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1078
|
+
expect(
|
|
1079
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
1080
|
+
).not.toBeInTheDocument();
|
|
1081
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1082
|
+
});
|
|
1083
|
+
|
|
1084
|
+
it('announces the seeded query from type-to-open', async () => {
|
|
1085
|
+
render(
|
|
1086
|
+
<Selector
|
|
1087
|
+
label="Fruit"
|
|
1088
|
+
options={OPTIONS}
|
|
1089
|
+
value="Apple"
|
|
1090
|
+
onChange={() => {}}
|
|
1091
|
+
hasSearch
|
|
1092
|
+
emptySearchText="Nothing like that here"
|
|
1093
|
+
/>,
|
|
1094
|
+
);
|
|
1095
|
+
// Typing on the closed trigger opens the popup and seeds the query. That
|
|
1096
|
+
// path bypasses the search input's own change handler, so it has to
|
|
1097
|
+
// announce for itself.
|
|
1098
|
+
const trigger = screen.getByRole('button', {name: 'Fruit'});
|
|
1099
|
+
trigger.focus();
|
|
1100
|
+
fireEvent.keyDown(trigger, {key: 'z'});
|
|
1101
|
+
|
|
1102
|
+
await waitFor(() =>
|
|
1103
|
+
expect(politeRegion()?.textContent).toBe('Nothing like that here'),
|
|
1104
|
+
);
|
|
1105
|
+
});
|
|
1106
|
+
|
|
1107
|
+
it('announces the empty state when a load finishes with no options', async () => {
|
|
1108
|
+
const user = userEvent.setup();
|
|
1109
|
+
function Fetching() {
|
|
1110
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
1111
|
+
return (
|
|
1112
|
+
<>
|
|
1113
|
+
<button type="button" onClick={() => setIsLoading(false)}>
|
|
1114
|
+
land
|
|
1115
|
+
</button>
|
|
1116
|
+
<Selector
|
|
1117
|
+
label="Fruit"
|
|
1118
|
+
options={[]}
|
|
1119
|
+
onChange={() => {}}
|
|
1120
|
+
isLoading={isLoading}
|
|
1121
|
+
emptyText="Add a fruit first"
|
|
1122
|
+
/>
|
|
1123
|
+
</>
|
|
1124
|
+
);
|
|
1125
|
+
}
|
|
1126
|
+
render(<Fetching />);
|
|
1127
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1128
|
+
|
|
1129
|
+
// Open while loading: nothing on screen, nothing spoken.
|
|
1130
|
+
await act(
|
|
1131
|
+
async () =>
|
|
1132
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1133
|
+
);
|
|
1134
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1135
|
+
|
|
1136
|
+
// The fetch lands empty while the panel is open. The message appears, so
|
|
1137
|
+
// the region owes the same words — an open-only announcement misses this.
|
|
1138
|
+
await user.click(screen.getByRole('button', {name: 'land'}));
|
|
1139
|
+
await waitFor(() =>
|
|
1140
|
+
expect(politeRegion()?.textContent).toBe('Add a fruit first'),
|
|
1141
|
+
);
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
it('renders emptyText when there are no options and no search input', async () => {
|
|
1145
|
+
const user = userEvent.setup();
|
|
1146
|
+
render(
|
|
1147
|
+
<Selector
|
|
1148
|
+
label="Fruit"
|
|
1149
|
+
options={[]}
|
|
1150
|
+
onChange={() => {}}
|
|
1151
|
+
emptyText="Add a fruit first"
|
|
1152
|
+
/>,
|
|
1153
|
+
);
|
|
1154
|
+
// Without hasSearch the trigger itself is the combobox.
|
|
1155
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1156
|
+
|
|
1157
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1158
|
+
expect(
|
|
1159
|
+
within(listbox).getByText('Add a fruit first'),
|
|
1160
|
+
).toBeInTheDocument();
|
|
1161
|
+
});
|
|
1162
|
+
|
|
946
1163
|
it('calls onChange when selecting a filtered option', async () => {
|
|
947
1164
|
const user = userEvent.setup();
|
|
948
1165
|
const onChange = vi.fn();
|
|
@@ -961,7 +1178,7 @@ describe('Selector', () => {
|
|
|
961
1178
|
expect(onChange).toHaveBeenCalledWith('Banana');
|
|
962
1179
|
});
|
|
963
1180
|
|
|
964
|
-
it('closes dropdown on Tab without preventing default focus movement', async () => {
|
|
1181
|
+
it('closes the search dropdown on Tab without preventing default focus movement', async () => {
|
|
965
1182
|
const user = userEvent.setup();
|
|
966
1183
|
render(
|
|
967
1184
|
<>
|
|
@@ -1253,6 +1470,29 @@ describe('Selector', () => {
|
|
|
1253
1470
|
});
|
|
1254
1471
|
|
|
1255
1472
|
describe('keyboard accessibility', () => {
|
|
1473
|
+
it('Tab from the open listbox moves focus to the next control', async () => {
|
|
1474
|
+
const user = userEvent.setup();
|
|
1475
|
+
render(
|
|
1476
|
+
<>
|
|
1477
|
+
<Selector
|
|
1478
|
+
label="Fruit"
|
|
1479
|
+
options={OPTIONS}
|
|
1480
|
+
value="Apple"
|
|
1481
|
+
onChange={() => {}}
|
|
1482
|
+
/>
|
|
1483
|
+
<button type="button">Next</button>
|
|
1484
|
+
</>,
|
|
1485
|
+
);
|
|
1486
|
+
|
|
1487
|
+
const trigger = screen.getByRole('combobox');
|
|
1488
|
+
await user.click(trigger);
|
|
1489
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
1490
|
+
|
|
1491
|
+
await user.keyboard('{Tab}');
|
|
1492
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
1493
|
+
expect(screen.getByRole('button', {name: 'Next'})).toHaveFocus();
|
|
1494
|
+
});
|
|
1495
|
+
|
|
1256
1496
|
it('trigger is focusable via Tab when enabled', async () => {
|
|
1257
1497
|
const user = userEvent.setup();
|
|
1258
1498
|
render(<Selector label="Fruit" options={OPTIONS} />);
|
|
@@ -2104,6 +2344,55 @@ describe('Selector', () => {
|
|
|
2104
2344
|
});
|
|
2105
2345
|
});
|
|
2106
2346
|
|
|
2347
|
+
describe('Selector caller-supplied id', () => {
|
|
2348
|
+
it('names the listbox with the id the caller put on the trigger', () => {
|
|
2349
|
+
render(<Selector label="Fruit" options={OPTIONS} id="fruit-picker" />);
|
|
2350
|
+
|
|
2351
|
+
const trigger = screen.getByRole('combobox');
|
|
2352
|
+
expect(trigger).toHaveAttribute('id', 'fruit-picker');
|
|
2353
|
+
|
|
2354
|
+
const labelledBy = screen
|
|
2355
|
+
.getByRole('listbox', h)
|
|
2356
|
+
.getAttribute('aria-labelledby');
|
|
2357
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2358
|
+
});
|
|
2359
|
+
|
|
2360
|
+
it('names the search-variant listbox with the caller id', () => {
|
|
2361
|
+
render(
|
|
2362
|
+
<Selector label="Fruit" options={OPTIONS} id="fruit-picker" hasSearch />,
|
|
2363
|
+
);
|
|
2364
|
+
|
|
2365
|
+
const trigger = document.getElementById('fruit-picker');
|
|
2366
|
+
expect(trigger?.tagName).toBe('BUTTON');
|
|
2367
|
+
|
|
2368
|
+
const labelledBy = screen
|
|
2369
|
+
.getByRole('listbox', h)
|
|
2370
|
+
.getAttribute('aria-labelledby');
|
|
2371
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2372
|
+
});
|
|
2373
|
+
|
|
2374
|
+
it('points the field label at the caller id', () => {
|
|
2375
|
+
render(<Selector label="Fruit" options={OPTIONS} id="fruit-picker" />);
|
|
2376
|
+
|
|
2377
|
+
const trigger = screen.getByRole('combobox', {name: 'Fruit'});
|
|
2378
|
+
expect(trigger).toHaveAttribute('id', 'fruit-picker');
|
|
2379
|
+
expect(screen.getByLabelText('Fruit')).toBe(trigger);
|
|
2380
|
+
});
|
|
2381
|
+
|
|
2382
|
+
it('generates the trigger id when the caller supplies none', () => {
|
|
2383
|
+
render(<Selector label="Fruit" options={OPTIONS} />);
|
|
2384
|
+
|
|
2385
|
+
const trigger = screen.getByRole('combobox', {name: 'Fruit'});
|
|
2386
|
+
expect(trigger.id).not.toBe('');
|
|
2387
|
+
expect(screen.getByLabelText('Fruit')).toBe(trigger);
|
|
2388
|
+
|
|
2389
|
+
const labelledBy = screen
|
|
2390
|
+
.getByRole('listbox', h)
|
|
2391
|
+
.getAttribute('aria-labelledby');
|
|
2392
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2393
|
+
});
|
|
2394
|
+
});
|
|
2395
|
+
|
|
2107
2396
|
describe('Selector statusVariant forwarding', () => {
|
|
2108
2397
|
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
2109
2398
|
const {container} = render(
|
|
@@ -2484,6 +2773,27 @@ describe('Selector section headings', () => {
|
|
|
2484
2773
|
// visible heading must not announce it a second time.
|
|
2485
2774
|
expect(heading).toHaveAttribute('aria-hidden', 'true');
|
|
2486
2775
|
});
|
|
2776
|
+
|
|
2777
|
+
it('hides a standalone divider from the accessibility tree (#4994)', async () => {
|
|
2778
|
+
const user = userEvent.setup();
|
|
2779
|
+
render(
|
|
2780
|
+
<Selector
|
|
2781
|
+
label="Fruit"
|
|
2782
|
+
options={['Apple', {type: 'divider'}, 'Banana']}
|
|
2783
|
+
value={undefined}
|
|
2784
|
+
onChange={() => {}}
|
|
2785
|
+
/>,
|
|
2786
|
+
);
|
|
2787
|
+
await user.click(screen.getByRole('combobox'));
|
|
2788
|
+
|
|
2789
|
+
// role="listbox" only permits option/group children. The divider still
|
|
2790
|
+
// renders role="separator" (unchanged visual/DOM), but must be excluded
|
|
2791
|
+
// from the accessibility tree so it never reaches the listbox's exposed
|
|
2792
|
+
// children (axe aria-required-children).
|
|
2793
|
+
const divider = document.querySelector('[role="separator"]');
|
|
2794
|
+
expect(divider).toBeTruthy();
|
|
2795
|
+
expect(divider).toHaveAttribute('aria-hidden', 'true');
|
|
2796
|
+
});
|
|
2487
2797
|
});
|
|
2488
2798
|
|
|
2489
2799
|
describe('Selector search focus ring', () => {
|