@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +49 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +62 -20
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +7 -3
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +21 -23
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +12 -12
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +17 -9
- package/dist/Card/index.d.ts +35 -1
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +21 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -3
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -3
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +128 -8
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +15 -4
- package/dist/Markdown/Markdown.d.ts +1 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +20 -7
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +73 -15
- package/dist/MultiSelector/hooks.d.ts +7 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +3 -2
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +9 -5
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +1 -9
- package/dist/Popover/usePopover.d.ts +7 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +40 -21
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +12 -3
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +91 -18
- package/dist/Selector/hooks.d.ts +7 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +3 -2
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +43 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -3
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -10
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +15 -21
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +22 -7
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +71 -18
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -9
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +7 -4
- package/dist/Tokenizer/Tokenizer.d.ts +14 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +33 -21
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +31 -11
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +22 -7
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +7 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +119 -37
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +5 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +7 -2
- package/dist/astryx.css +113 -11
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/generateThemeRules.d.ts +21 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +26 -0
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/af-ZA.json +6 -6
- package/locales/ar-SA.json +6 -6
- package/locales/ca-ES.json +5 -5
- package/locales/cs-CZ.json +6 -6
- package/locales/da-DK.json +6 -6
- package/locales/de-DE.json +6 -6
- package/locales/el-GR.json +6 -6
- package/locales/en.json +163 -11
- package/locales/es-ES.json +5 -5
- package/locales/fi-FI.json +6 -6
- package/locales/fr-FR.json +6 -6
- package/locales/he-IL.json +6 -6
- package/locales/hu-HU.json +6 -6
- package/locales/it-IT.json +6 -6
- package/locales/ja-JP.json +6 -6
- package/locales/ko-KR.json +6 -6
- package/locales/nl-NL.json +6 -6
- package/locales/no-NO.json +6 -6
- package/locales/pl-PL.json +6 -6
- package/locales/pseudo.json +114 -0
- package/locales/pt-BR.json +6 -6
- package/locales/pt-PT.json +6 -6
- package/locales/ro-RO.json +6 -6
- package/locales/ru-RU.json +6 -6
- package/locales/sr-SP.json +6 -6
- package/locales/sv-SE.json +6 -6
- package/locales/tr-TR.json +6 -6
- package/locales/uk-UA.json +6 -6
- package/locales/vi-VN.json +6 -6
- package/locales/zh-CN.json +6 -6
- package/locales/zh-TW.json +6 -6
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +22 -11
- package/src/Banner/Banner.test.tsx +177 -25
- package/src/Banner/Banner.tsx +93 -27
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +7 -6
- package/src/Calendar/Calendar.test.tsx +143 -0
- package/src/Calendar/Calendar.tsx +30 -26
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
- package/src/ComplexSelector/ComplexSelector.tsx +1 -3
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
- package/src/DateRangeInput/DateRangeInput.tsx +4 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -3
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +324 -15
- package/src/Layer/useLayer.tsx +164 -8
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +311 -0
- package/src/MultiSelector/MultiSelector.tsx +151 -15
- package/src/MultiSelector/hooks.ts +9 -2
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +9 -5
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.test.tsx +14 -0
- package/src/Popover/Popover.tsx +1 -9
- package/src/Popover/usePopover.tsx +57 -32
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +346 -1
- package/src/Selector/Selector.tsx +148 -21
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +67 -1
- package/src/Text/Text.tsx +6 -3
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +37 -24
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +58 -0
- package/src/Timestamp/Timestamp.tsx +12 -10
- package/src/Toast/Toast.doc.mjs +26 -12
- package/src/Toast/Toast.tsx +28 -4
- package/src/Toast/ToastViewport.test.tsx +536 -8
- package/src/Toast/ToastViewport.tsx +81 -12
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +15 -10
- package/src/Token/TokenLink.tsx +14 -5
- package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +53 -24
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -5
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -7
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
- package/src/Typeahead/BaseTypeahead.tsx +181 -39
- package/src/Typeahead/Typeahead.doc.mjs +11 -0
- package/src/Typeahead/Typeahead.test.tsx +203 -0
- package/src/Typeahead/Typeahead.tsx +12 -2
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
- package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
- package/src/hooks/useInteractiveRole.doc.mjs +119 -0
- package/src/hooks/useLongPress.doc.mjs +123 -0
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/derivedVarRegistry.test.ts +26 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +99 -1
- package/src/theme/generateThemeRules.ts +28 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
'use client';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @file ToastViewport.tsx
|
|
7
|
+
* @input Uses React state/effects, ToastContext, useAnnounce, viewport tokens,
|
|
8
|
+
* and placement-derived motion variables
|
|
9
|
+
* @output Exports the ToastViewport provider, stack, live announcement dispatch,
|
|
10
|
+
* focus handoff, safe-area-aware edge gutters, and motion context
|
|
11
|
+
* @position Core provider/imperative viewport for useToast()
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When placement, stacking, focus, announcement, or safe-area behavior
|
|
14
|
+
* changes, update ToastViewport.test.tsx, Toast.doc.mjs, and Toast.stories.tsx.
|
|
15
|
+
*/
|
|
16
|
+
|
|
5
17
|
import {
|
|
6
18
|
isValidElement,
|
|
7
19
|
useCallback,
|
|
@@ -22,13 +34,30 @@ import {ToastContext, type ToastContextValue} from './ToastContext';
|
|
|
22
34
|
import type {ToastEntry, ToastPosition, ToastDismissReason} from './types';
|
|
23
35
|
import {useTranslator} from '../i18n';
|
|
24
36
|
|
|
37
|
+
const SAFE_AREA_INLINE_START = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-left, 0px))`;
|
|
38
|
+
const SAFE_AREA_INLINE_END = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-right, 0px))`;
|
|
39
|
+
const SAFE_AREA_BLOCK_START = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-top, 0px))`;
|
|
40
|
+
const SAFE_AREA_BLOCK_END = `max(${spacingVars['--spacing-4']}, env(safe-area-inset-bottom, 0px))`;
|
|
41
|
+
const TOAST_EDGE_DRIFT = spacingVars['--spacing-2'];
|
|
42
|
+
const TOAST_EDGE_DRIFT_NEGATIVE = `calc(-1 * ${TOAST_EDGE_DRIFT})`;
|
|
43
|
+
|
|
25
44
|
const styles = stylex.create({
|
|
26
45
|
viewport: {
|
|
27
46
|
position: 'fixed',
|
|
28
47
|
zIndex: 500,
|
|
29
48
|
display: 'flex',
|
|
49
|
+
boxSizing: 'border-box',
|
|
30
50
|
flexDirection: 'column',
|
|
31
|
-
|
|
51
|
+
paddingBlockStart: SAFE_AREA_BLOCK_START,
|
|
52
|
+
paddingBlockEnd: SAFE_AREA_BLOCK_END,
|
|
53
|
+
paddingInlineStart: {
|
|
54
|
+
default: SAFE_AREA_INLINE_START,
|
|
55
|
+
':is([dir="rtl"] *)': SAFE_AREA_INLINE_END,
|
|
56
|
+
},
|
|
57
|
+
paddingInlineEnd: {
|
|
58
|
+
default: SAFE_AREA_INLINE_END,
|
|
59
|
+
':is([dir="rtl"] *)': SAFE_AREA_INLINE_START,
|
|
60
|
+
},
|
|
32
61
|
pointerEvents: 'none',
|
|
33
62
|
// Reset popover styles — the popover attribute puts us in the top
|
|
34
63
|
// layer (above dialogs), but we don't want its default styles.
|
|
@@ -40,25 +69,29 @@ const styles = stylex.create({
|
|
|
40
69
|
backgroundColor: 'transparent',
|
|
41
70
|
overflow: 'visible',
|
|
42
71
|
},
|
|
43
|
-
|
|
44
|
-
|
|
72
|
+
viewportInlineSpan: {
|
|
73
|
+
insetInlineStart: 0,
|
|
74
|
+
insetInlineEnd: 0,
|
|
75
|
+
},
|
|
76
|
+
bottomEnd: {bottom: 0, alignItems: 'flex-end'},
|
|
77
|
+
bottomStart: {bottom: 0, alignItems: 'flex-start'},
|
|
45
78
|
topEnd: {
|
|
46
79
|
top: 0,
|
|
47
|
-
insetInlineEnd: 0,
|
|
48
80
|
alignItems: 'flex-end',
|
|
49
81
|
flexDirection: 'column-reverse',
|
|
50
82
|
},
|
|
51
83
|
topStart: {
|
|
52
84
|
top: 0,
|
|
53
|
-
insetInlineStart: 0,
|
|
54
85
|
alignItems: 'flex-start',
|
|
55
86
|
flexDirection: 'column-reverse',
|
|
56
87
|
},
|
|
57
88
|
toastWrapper: {
|
|
58
89
|
pointerEvents: 'auto',
|
|
59
90
|
display: 'grid',
|
|
91
|
+
width: '100%',
|
|
92
|
+
maxWidth: 400,
|
|
93
|
+
minWidth: 0,
|
|
60
94
|
gridTemplateRows: '1fr',
|
|
61
|
-
paddingBlockEnd: spacingVars['--spacing-3'],
|
|
62
95
|
transitionProperty: 'grid-template-rows, padding',
|
|
63
96
|
transitionDuration: {
|
|
64
97
|
default: durationVars['--duration-fast'],
|
|
@@ -70,11 +103,33 @@ const styles = stylex.create({
|
|
|
70
103
|
paddingBlockEnd: 0,
|
|
71
104
|
},
|
|
72
105
|
},
|
|
106
|
+
toastWrapperFromBottom: {
|
|
107
|
+
'--_toast-slide-y': TOAST_EDGE_DRIFT,
|
|
108
|
+
},
|
|
109
|
+
toastWrapperFromTop: {
|
|
110
|
+
'--_toast-slide-y': TOAST_EDGE_DRIFT_NEGATIVE,
|
|
111
|
+
},
|
|
112
|
+
// The inter-toast gap is padding on each wrapper so it collapses with the
|
|
113
|
+
// grid track. The wrapper nearest the viewport edge drops that padding; the
|
|
114
|
+
// child flips because top stacks use column-reverse.
|
|
115
|
+
toastWrapperGap: {
|
|
116
|
+
paddingBlockEnd: {default: spacingVars['--spacing-2'], ':last-child': 0},
|
|
117
|
+
},
|
|
118
|
+
toastWrapperGapReversed: {
|
|
119
|
+
paddingBlockEnd: {default: spacingVars['--spacing-2'], ':first-child': 0},
|
|
120
|
+
},
|
|
73
121
|
toastWrapperExiting: {
|
|
74
122
|
gridTemplateRows: '0fr',
|
|
75
123
|
paddingBlockEnd: 0,
|
|
76
124
|
},
|
|
77
125
|
toastWrapperInner: {
|
|
126
|
+
width: '100%',
|
|
127
|
+
maxWidth: '100%',
|
|
128
|
+
minWidth: 0,
|
|
129
|
+
minHeight: 0,
|
|
130
|
+
// Required for the 1fr -> 0fr exit collapse to hide the shrinking Toast.
|
|
131
|
+
// This preserves main's paint containment; browser-chrome behavior is not
|
|
132
|
+
// changed or claimed by this responsive-layout fix.
|
|
78
133
|
overflow: 'hidden',
|
|
79
134
|
},
|
|
80
135
|
});
|
|
@@ -104,6 +159,7 @@ function getNodeText(node: ReactNode): string {
|
|
|
104
159
|
|
|
105
160
|
export interface ToastViewportProps {
|
|
106
161
|
position?: ToastPosition;
|
|
162
|
+
/** Maximum number of visible toasts. @default 5 */
|
|
107
163
|
maxVisible?: number;
|
|
108
164
|
inset?: {top?: number; bottom?: number; start?: number; end?: number};
|
|
109
165
|
/**
|
|
@@ -341,6 +397,7 @@ export function ToastViewport({
|
|
|
341
397
|
);
|
|
342
398
|
|
|
343
399
|
const visibleToasts = toasts.slice(-maxVisible);
|
|
400
|
+
|
|
344
401
|
const insetStyle: React.CSSProperties = {};
|
|
345
402
|
if (inset?.top) {
|
|
346
403
|
insetStyle.top = inset.top;
|
|
@@ -417,21 +474,31 @@ export function ToastViewport({
|
|
|
417
474
|
: position === 'bottomStart'
|
|
418
475
|
? styles.bottomStart
|
|
419
476
|
: styles.bottomEnd;
|
|
477
|
+
const isReversed = position === 'topEnd' || position === 'topStart';
|
|
478
|
+
const toastWrapperPositionStyle = isReversed
|
|
479
|
+
? styles.toastWrapperFromTop
|
|
480
|
+
: styles.toastWrapperFromBottom;
|
|
481
|
+
const gapStyle = isReversed
|
|
482
|
+
? styles.toastWrapperGapReversed
|
|
483
|
+
: styles.toastWrapperGap;
|
|
420
484
|
|
|
421
485
|
return (
|
|
422
486
|
<ToastContext value={contextValue}>
|
|
423
487
|
{children}
|
|
424
488
|
<div
|
|
425
489
|
ref={viewportRef}
|
|
426
|
-
role=
|
|
427
|
-
aria-label={t('@astryx.toast.viewport')}
|
|
428
|
-
tabIndex={-1}
|
|
490
|
+
role={hasToasts ? 'region' : undefined}
|
|
491
|
+
aria-label={hasToasts ? t('@astryx.toast.viewport') : undefined}
|
|
492
|
+
tabIndex={hasToasts ? -1 : undefined}
|
|
429
493
|
// popover="manual" promotes to the top layer (above dialogs).
|
|
430
494
|
// Omitted inside dialogs where the viewport is already in a top layer.
|
|
431
495
|
popover={isTopLayer ? 'manual' : undefined}
|
|
432
|
-
{...mergeProps(
|
|
433
|
-
|
|
434
|
-
|
|
496
|
+
{...mergeProps(
|
|
497
|
+
stylex.props(styles.viewport, styles.viewportInlineSpan, posStyle),
|
|
498
|
+
{
|
|
499
|
+
style: Object.keys(insetStyle).length > 0 ? insetStyle : undefined,
|
|
500
|
+
},
|
|
501
|
+
)}>
|
|
435
502
|
{visibleToasts.map(entry => {
|
|
436
503
|
const o = entry.options;
|
|
437
504
|
const type = o.type ?? 'info';
|
|
@@ -444,6 +511,8 @@ export function ToastViewport({
|
|
|
444
511
|
data-toast-id={entry.id}
|
|
445
512
|
{...stylex.props(
|
|
446
513
|
styles.toastWrapper,
|
|
514
|
+
toastWrapperPositionStyle,
|
|
515
|
+
gapStyle,
|
|
447
516
|
isExiting && styles.toastWrapperExiting,
|
|
448
517
|
)}
|
|
449
518
|
onTransitionEnd={
|
package/src/Token/Token.test.tsx
CHANGED
|
@@ -521,3 +521,98 @@ describe('Token focus outline', () => {
|
|
|
521
521
|
expect(container.tagName).toBe('SPAN');
|
|
522
522
|
});
|
|
523
523
|
});
|
|
524
|
+
|
|
525
|
+
describe('Token pass-through props', () => {
|
|
526
|
+
it('forwards pass-through props to the token element', () => {
|
|
527
|
+
render(
|
|
528
|
+
<Token
|
|
529
|
+
label="Design"
|
|
530
|
+
aria-label="Design tag"
|
|
531
|
+
id="design-token"
|
|
532
|
+
data-source="filters"
|
|
533
|
+
data-testid="token"
|
|
534
|
+
/>,
|
|
535
|
+
);
|
|
536
|
+
const token = screen.getByTestId('token');
|
|
537
|
+
expect(token).toHaveAttribute('aria-label', 'Design tag');
|
|
538
|
+
expect(token).toHaveAttribute('id', 'design-token');
|
|
539
|
+
expect(token).toHaveAttribute('data-source', 'filters');
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
it('forwards pass-through props on the clickable and link variants', () => {
|
|
543
|
+
const {rerender} = render(
|
|
544
|
+
<Token
|
|
545
|
+
label="Design"
|
|
546
|
+
onClick={() => {}}
|
|
547
|
+
id="clickable"
|
|
548
|
+
data-testid="token"
|
|
549
|
+
/>,
|
|
550
|
+
);
|
|
551
|
+
expect(screen.getByTestId('token')).toHaveAttribute('id', 'clickable');
|
|
552
|
+
|
|
553
|
+
rerender(
|
|
554
|
+
<Token label="Design" href="/tags" id="link" data-testid="token" />,
|
|
555
|
+
);
|
|
556
|
+
expect(screen.getByTestId('token')).toHaveAttribute('id', 'link');
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
it('keeps its own label when the label is visually hidden', () => {
|
|
560
|
+
render(
|
|
561
|
+
<Token
|
|
562
|
+
label="Design"
|
|
563
|
+
isLabelHidden
|
|
564
|
+
aria-label="Caller label"
|
|
565
|
+
data-source="filters"
|
|
566
|
+
data-testid="token"
|
|
567
|
+
/>,
|
|
568
|
+
);
|
|
569
|
+
const token = screen.getByTestId('token');
|
|
570
|
+
expect({
|
|
571
|
+
ariaLabel: token.getAttribute('aria-label'),
|
|
572
|
+
dataSource: token.getAttribute('data-source'),
|
|
573
|
+
}).toEqual({ariaLabel: 'Design', dataSource: 'filters'});
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
describe('Token — owned handlers on the link+remove container', () => {
|
|
578
|
+
it("composes a caller's onMouseUp with the container's link delegation", () => {
|
|
579
|
+
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
580
|
+
const handleMouseUp = vi.fn();
|
|
581
|
+
render(
|
|
582
|
+
<Token
|
|
583
|
+
label="Tag"
|
|
584
|
+
href="/test"
|
|
585
|
+
onRemove={() => {}}
|
|
586
|
+
onMouseUp={handleMouseUp}
|
|
587
|
+
icon={<span data-testid="icon">★</span>}
|
|
588
|
+
/>,
|
|
589
|
+
);
|
|
590
|
+
|
|
591
|
+
fireEvent.mouseUp(screen.getByTestId('icon'), {button: 1});
|
|
592
|
+
|
|
593
|
+
expect(handleMouseUp).toHaveBeenCalledOnce();
|
|
594
|
+
expect(openSpy).toHaveBeenCalledWith('/test', '_blank', 'noopener');
|
|
595
|
+
openSpy.mockRestore();
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
it("does not fire the container's delegation when disabled, but still forwards the caller's onMouseUp", () => {
|
|
599
|
+
const openSpy = vi.spyOn(window, 'open').mockImplementation(() => null);
|
|
600
|
+
const handleMouseUp = vi.fn();
|
|
601
|
+
render(
|
|
602
|
+
<Token
|
|
603
|
+
label="Tag"
|
|
604
|
+
href="/test"
|
|
605
|
+
onRemove={() => {}}
|
|
606
|
+
onMouseUp={handleMouseUp}
|
|
607
|
+
isDisabled
|
|
608
|
+
icon={<span data-testid="icon">★</span>}
|
|
609
|
+
/>,
|
|
610
|
+
);
|
|
611
|
+
|
|
612
|
+
fireEvent.mouseUp(screen.getByTestId('icon'), {button: 1});
|
|
613
|
+
|
|
614
|
+
expect(handleMouseUp).toHaveBeenCalledOnce();
|
|
615
|
+
expect(openSpy).not.toHaveBeenCalled();
|
|
616
|
+
openSpy.mockRestore();
|
|
617
|
+
});
|
|
618
|
+
});
|
package/src/Token/Token.tsx
CHANGED
|
@@ -307,6 +307,7 @@ export function Token({
|
|
|
307
307
|
style,
|
|
308
308
|
'data-testid': testId,
|
|
309
309
|
ref,
|
|
310
|
+
...rest
|
|
310
311
|
}: TokenProps) {
|
|
311
312
|
const t = useTranslator();
|
|
312
313
|
const LinkComponent = useLinkComponent();
|
|
@@ -344,8 +345,8 @@ export function Token({
|
|
|
344
345
|
|
|
345
346
|
const sharedProps = {
|
|
346
347
|
'data-testid': testId,
|
|
347
|
-
'aria-label':
|
|
348
|
-
'aria-description': description,
|
|
348
|
+
...(isLabelHidden ? {'aria-label': label} : {}),
|
|
349
|
+
...(description != null ? {'aria-description': description} : {}),
|
|
349
350
|
};
|
|
350
351
|
|
|
351
352
|
if (role === 'link') {
|
|
@@ -354,8 +355,6 @@ export function Token({
|
|
|
354
355
|
<LinkComponent
|
|
355
356
|
ref={ref as React.Ref<HTMLAnchorElement>}
|
|
356
357
|
href={href as string}
|
|
357
|
-
aria-disabled={isDisabled || undefined}
|
|
358
|
-
{...sharedProps}
|
|
359
358
|
{...mergeProps(
|
|
360
359
|
themeProps('token', {color, size}),
|
|
361
360
|
focusOutlineProps.focusVisible(
|
|
@@ -368,7 +367,10 @@ export function Token({
|
|
|
368
367
|
),
|
|
369
368
|
className,
|
|
370
369
|
style,
|
|
371
|
-
)}
|
|
370
|
+
)}
|
|
371
|
+
{...rest}
|
|
372
|
+
{...(isDisabled ? {'aria-disabled': true} : {})}
|
|
373
|
+
{...sharedProps}>
|
|
372
374
|
{content}
|
|
373
375
|
</LinkComponent>
|
|
374
376
|
);
|
|
@@ -400,7 +402,6 @@ export function Token({
|
|
|
400
402
|
{label}
|
|
401
403
|
</span>
|
|
402
404
|
}
|
|
403
|
-
{...sharedProps}
|
|
404
405
|
{...mergeProps(
|
|
405
406
|
themeProps('token', {color, size}),
|
|
406
407
|
focusOutlineProps.focusWithin(
|
|
@@ -414,6 +415,8 @@ export function Token({
|
|
|
414
415
|
className,
|
|
415
416
|
style,
|
|
416
417
|
)}
|
|
418
|
+
{...rest}
|
|
419
|
+
{...sharedProps}
|
|
417
420
|
/>
|
|
418
421
|
);
|
|
419
422
|
}
|
|
@@ -431,7 +434,6 @@ export function Token({
|
|
|
431
434
|
<span
|
|
432
435
|
ref={ref}
|
|
433
436
|
onClick={isDisabled ? undefined : handleContainerClick}
|
|
434
|
-
{...sharedProps}
|
|
435
437
|
{...mergeProps(
|
|
436
438
|
themeProps('token', {color, size}),
|
|
437
439
|
focusOutlineProps.focusWithin(
|
|
@@ -444,7 +446,9 @@ export function Token({
|
|
|
444
446
|
),
|
|
445
447
|
className,
|
|
446
448
|
style,
|
|
447
|
-
)}
|
|
449
|
+
)}
|
|
450
|
+
{...rest}
|
|
451
|
+
{...sharedProps}>
|
|
448
452
|
{icon}
|
|
449
453
|
<button
|
|
450
454
|
type="button"
|
|
@@ -468,7 +472,6 @@ export function Token({
|
|
|
468
472
|
return (
|
|
469
473
|
<span
|
|
470
474
|
ref={ref}
|
|
471
|
-
{...sharedProps}
|
|
472
475
|
{...mergeProps(
|
|
473
476
|
themeProps('token', {color, size}),
|
|
474
477
|
stylex.props(
|
|
@@ -480,7 +483,9 @@ export function Token({
|
|
|
480
483
|
),
|
|
481
484
|
className,
|
|
482
485
|
style,
|
|
483
|
-
)}
|
|
486
|
+
)}
|
|
487
|
+
{...rest}
|
|
488
|
+
{...sharedProps}>
|
|
484
489
|
{content}
|
|
485
490
|
</span>
|
|
486
491
|
);
|
package/src/Token/TokenLink.tsx
CHANGED
|
@@ -27,10 +27,11 @@
|
|
|
27
27
|
|
|
28
28
|
import type {ReactNode, CSSProperties, Ref, HTMLAttributes} from 'react';
|
|
29
29
|
import {useRef} from 'react';
|
|
30
|
-
import {mergeRefs} from '../utils';
|
|
31
30
|
import {useClickableContainer} from '../hooks/useClickableContainer';
|
|
32
31
|
import type {LinkComponentType} from '../Link/types';
|
|
32
|
+
import {composeEventHandlers} from '../utils';
|
|
33
33
|
|
|
34
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
34
35
|
export interface TokenLinkProps extends HTMLAttributes<HTMLElement> {
|
|
35
36
|
/** Ref forwarded to the container element. */
|
|
36
37
|
ref?: Ref<HTMLElement>;
|
|
@@ -72,6 +73,8 @@ export function TokenLink({
|
|
|
72
73
|
icon,
|
|
73
74
|
endContent,
|
|
74
75
|
removeButton,
|
|
76
|
+
onClick: onClickProp,
|
|
77
|
+
onMouseUp: onMouseUpProp,
|
|
75
78
|
...containerProps
|
|
76
79
|
}: TokenLinkProps) {
|
|
77
80
|
const containerRef = useRef<HTMLElement | null>(null);
|
|
@@ -86,10 +89,16 @@ export function TokenLink({
|
|
|
86
89
|
|
|
87
90
|
return (
|
|
88
91
|
<span
|
|
89
|
-
ref={
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
ref={useMergedRefs(ref, containerRef)}
|
|
93
|
+
{...containerProps}
|
|
94
|
+
onClick={
|
|
95
|
+
isDisabled ? onClickProp : composeEventHandlers(onClickProp, onClick)
|
|
96
|
+
}
|
|
97
|
+
onMouseUp={
|
|
98
|
+
isDisabled
|
|
99
|
+
? onMouseUpProp
|
|
100
|
+
: composeEventHandlers(onMouseUpProp, onMouseUp)
|
|
101
|
+
}>
|
|
93
102
|
{icon}
|
|
94
103
|
<LinkComponent
|
|
95
104
|
ref={linkRef as Ref<HTMLAnchorElement>}
|
|
@@ -132,9 +132,20 @@ export const docs = {
|
|
|
132
132
|
{
|
|
133
133
|
name: 'maxMenuItems',
|
|
134
134
|
type: 'number',
|
|
135
|
-
description: 'Maximum number of
|
|
135
|
+
description: 'Maximum number of search results to display. The hasCreate entry is offered on top of them, so a menu can show one more than this.',
|
|
136
136
|
default: '10',
|
|
137
137
|
},
|
|
138
|
+
{
|
|
139
|
+
name: 'menuWidth',
|
|
140
|
+
type: 'number',
|
|
141
|
+
description: 'Fixed dropdown width in pixels. The menu never shrinks below its anchor width.',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'minQueryLength',
|
|
145
|
+
type: 'number',
|
|
146
|
+
description: 'Minimum query length before the search source is queried. Below it no search runs, and the menu stays closed — unless hasCreate is set, in which case the "Create ..." entry is still offered, being derived from the typed text rather than fetched for it.',
|
|
147
|
+
default: '1',
|
|
148
|
+
},
|
|
138
149
|
{
|
|
139
150
|
name: 'emptySearchResultsText',
|
|
140
151
|
type: 'string',
|
|
@@ -201,6 +212,22 @@ export const docs = {
|
|
|
201
212
|
description:
|
|
202
213
|
'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.',
|
|
203
214
|
},
|
|
215
|
+
{
|
|
216
|
+
name: 'tokenOverflowBehavior',
|
|
217
|
+
type: "'none' | 'unfocusedInline' | 'unfocusedLayer'",
|
|
218
|
+
description: 'Controls how tokens overflow when the container is too narrow.',
|
|
219
|
+
default: "'none'",
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'onFocus',
|
|
223
|
+
type: '(e: FocusEvent<HTMLInputElement>) => void',
|
|
224
|
+
description: 'Fires when focus enters the tokenizer input.',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: 'onBlur',
|
|
228
|
+
type: '(e: FocusEvent<HTMLInputElement>) => void',
|
|
229
|
+
description: 'Fires when focus leaves the tokenizer input.',
|
|
230
|
+
},
|
|
204
231
|
{
|
|
205
232
|
name: 'xstyle',
|
|
206
233
|
type: 'StyleXStyles',
|
|
@@ -365,9 +392,20 @@ export const docsZh = {
|
|
|
365
392
|
{
|
|
366
393
|
name: 'maxMenuItems',
|
|
367
394
|
type: 'number',
|
|
368
|
-
description: '
|
|
395
|
+
description: '下拉列表显示的最大搜索结果数。“创建 ...”条目会在此之外额外提供,因此菜单可能比该数量多显示一项。',
|
|
369
396
|
default: '10',
|
|
370
397
|
},
|
|
398
|
+
{
|
|
399
|
+
name: 'menuWidth',
|
|
400
|
+
type: 'number',
|
|
401
|
+
description: '下拉菜单的固定像素宽度。菜单不会小于其锚点宽度。',
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
name: 'minQueryLength',
|
|
405
|
+
type: 'number',
|
|
406
|
+
description: '查询搜索源前的最小查询长度。低于该长度不会发起搜索,菜单保持关闭;但设置 hasCreate 时仍会提供“创建 ...”条目——该条目由输入的文本推导而来,并非通过搜索获取。',
|
|
407
|
+
default: '1',
|
|
408
|
+
},
|
|
371
409
|
{
|
|
372
410
|
name: 'emptySearchResultsText',
|
|
373
411
|
type: 'string',
|
|
@@ -489,7 +527,9 @@ export const docsDense = {
|
|
|
489
527
|
isOptional: 'Shows optional indicator on label.',
|
|
490
528
|
labelTooltip: 'Tooltip on label.',
|
|
491
529
|
hasEntriesOnFocus: 'Show bootstrap results on focus before typing.',
|
|
492
|
-
maxMenuItems: 'Max
|
|
530
|
+
maxMenuItems: 'Max search results shown; the hasCreate entry sits on top of them.',
|
|
531
|
+
menuWidth: 'Fixed dropdown width in pixels.',
|
|
532
|
+
minQueryLength: 'Min query length before searching. Menu stays closed below it, except the hasCreate entry.',
|
|
493
533
|
emptySearchResultsText: 'Text when search returns no results.',
|
|
494
534
|
hasAutoFocus: 'Auto-focus input on mount.',
|
|
495
535
|
size: 'Input+token size.',
|
|
@@ -94,6 +94,37 @@ const userSource: SearchSource = {
|
|
|
94
94
|
bootstrap: () => users.slice(0, 3),
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
+
describe('Tokenizer minQueryLength', () => {
|
|
98
|
+
it('forwards the threshold to the typeahead engine', async () => {
|
|
99
|
+
const search = vi.fn((query: string) =>
|
|
100
|
+
users.filter(u => u.label.toLowerCase().includes(query.toLowerCase())),
|
|
101
|
+
);
|
|
102
|
+
render(
|
|
103
|
+
<Tokenizer
|
|
104
|
+
label="People"
|
|
105
|
+
searchSource={{search, bootstrap: () => []}}
|
|
106
|
+
value={[]}
|
|
107
|
+
onChange={() => {}}
|
|
108
|
+
minQueryLength={3}
|
|
109
|
+
debounceMs={0}
|
|
110
|
+
/>,
|
|
111
|
+
);
|
|
112
|
+
const input = screen.getByRole('combobox');
|
|
113
|
+
|
|
114
|
+
fireEvent.change(input, {target: {value: 'Al'}});
|
|
115
|
+
await act(async () => {
|
|
116
|
+
await Promise.resolve();
|
|
117
|
+
});
|
|
118
|
+
expect(search).not.toHaveBeenCalled();
|
|
119
|
+
expect(input).toHaveAttribute('aria-expanded', 'false');
|
|
120
|
+
|
|
121
|
+
fireEvent.change(input, {target: {value: 'Ali'}});
|
|
122
|
+
await waitFor(() => {
|
|
123
|
+
expect(input).toHaveAttribute('aria-expanded', 'true');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
97
128
|
describe('Tokenizer', () => {
|
|
98
129
|
it('forwards ref to the root field element', () => {
|
|
99
130
|
let root: HTMLDivElement | null = null;
|
|
@@ -606,6 +637,136 @@ describe('Tokenizer', () => {
|
|
|
606
637
|
bootstrap: () => [],
|
|
607
638
|
};
|
|
608
639
|
|
|
640
|
+
it('still offers Create below minQueryLength, and does not search', async () => {
|
|
641
|
+
// The threshold exists to avoid a fetch too broad to be worth making.
|
|
642
|
+
// Creating costs no fetch, so a field that can create `QA` should not
|
|
643
|
+
// stop being able to just because a search for `QA` would match too
|
|
644
|
+
// much. Reported on #5385.
|
|
645
|
+
const search = vi.fn(() => []);
|
|
646
|
+
const onChange = vi.fn();
|
|
647
|
+
render(
|
|
648
|
+
<Tokenizer
|
|
649
|
+
label="Tags"
|
|
650
|
+
searchSource={{search, bootstrap: () => []}}
|
|
651
|
+
value={[]}
|
|
652
|
+
onChange={onChange}
|
|
653
|
+
hasCreate
|
|
654
|
+
minQueryLength={3}
|
|
655
|
+
debounceMs={0}
|
|
656
|
+
/>,
|
|
657
|
+
);
|
|
658
|
+
|
|
659
|
+
const input = screen.getByRole('combobox');
|
|
660
|
+
await act(async () => {
|
|
661
|
+
fireEvent.change(input, {target: {value: 'QA'}});
|
|
662
|
+
});
|
|
663
|
+
await act(async () => {
|
|
664
|
+
await new Promise(r => setTimeout(r, 50));
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
// Offered...
|
|
668
|
+
expect(screen.queryByText('Create "QA"')).toBeInTheDocument();
|
|
669
|
+
// ...without the source ever being asked.
|
|
670
|
+
expect(search).not.toHaveBeenCalled();
|
|
671
|
+
// ...and it commits.
|
|
672
|
+
fireEvent.click(screen.getByText('Create "QA"'));
|
|
673
|
+
expect(onChange).toHaveBeenCalledWith(
|
|
674
|
+
[expect.objectContaining({id: 'QA', label: 'QA'})],
|
|
675
|
+
expect.objectContaining({type: 'create'}),
|
|
676
|
+
);
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
it('offers no menu below the threshold without hasCreate', async () => {
|
|
680
|
+
// The negative control for the case above: with nothing to derive from
|
|
681
|
+
// the text, a below-threshold query still opens nothing, and never
|
|
682
|
+
// reports "no results" for a query that was not searched.
|
|
683
|
+
const search = vi.fn(() => []);
|
|
684
|
+
render(
|
|
685
|
+
<Tokenizer
|
|
686
|
+
label="Tags"
|
|
687
|
+
searchSource={{search, bootstrap: () => []}}
|
|
688
|
+
value={[]}
|
|
689
|
+
onChange={() => {}}
|
|
690
|
+
minQueryLength={3}
|
|
691
|
+
debounceMs={0}
|
|
692
|
+
/>,
|
|
693
|
+
);
|
|
694
|
+
|
|
695
|
+
const input = screen.getByRole('combobox');
|
|
696
|
+
await act(async () => {
|
|
697
|
+
fireEvent.change(input, {target: {value: 'QA'}});
|
|
698
|
+
});
|
|
699
|
+
await act(async () => {
|
|
700
|
+
await new Promise(r => setTimeout(r, 50));
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
expect(search).not.toHaveBeenCalled();
|
|
704
|
+
expect(input).toHaveAttribute('aria-expanded', 'false');
|
|
705
|
+
expect(screen.queryByText('No results found')).not.toBeInTheDocument();
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
it('does not offer Create below the threshold for a token already held', async () => {
|
|
709
|
+
render(
|
|
710
|
+
<Tokenizer
|
|
711
|
+
label="Tags"
|
|
712
|
+
searchSource={{search: () => [], bootstrap: () => []}}
|
|
713
|
+
value={[{id: 'QA', label: 'QA'}]}
|
|
714
|
+
onChange={() => {}}
|
|
715
|
+
hasCreate
|
|
716
|
+
minQueryLength={3}
|
|
717
|
+
debounceMs={0}
|
|
718
|
+
/>,
|
|
719
|
+
);
|
|
720
|
+
|
|
721
|
+
const input = screen.getByRole('combobox');
|
|
722
|
+
await act(async () => {
|
|
723
|
+
fireEvent.change(input, {target: {value: 'QA'}});
|
|
724
|
+
});
|
|
725
|
+
await act(async () => {
|
|
726
|
+
await new Promise(r => setTimeout(r, 50));
|
|
727
|
+
});
|
|
728
|
+
|
|
729
|
+
expect(screen.queryByText('Create "QA"')).not.toBeInTheDocument();
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
it('offers Create on top of a full menu, not in place of a result', async () => {
|
|
733
|
+
// The Create entry is appended after the results are cut to
|
|
734
|
+
// `maxMenuItems`, so a full menu shows one more option rather than
|
|
735
|
+
// dropping its last result to make room. Deliberate: creating is a
|
|
736
|
+
// different capability from searching, and the cap exists to bound how
|
|
737
|
+
// many *results* a menu shows.
|
|
738
|
+
const many = Array.from({length: 20}, (_, i) => ({
|
|
739
|
+
id: `qa-${i}`,
|
|
740
|
+
label: `QA ${i}`,
|
|
741
|
+
}));
|
|
742
|
+
render(
|
|
743
|
+
<Tokenizer
|
|
744
|
+
label="Tags"
|
|
745
|
+
searchSource={{search: () => many, bootstrap: () => []}}
|
|
746
|
+
value={[]}
|
|
747
|
+
onChange={() => {}}
|
|
748
|
+
hasCreate
|
|
749
|
+
maxMenuItems={3}
|
|
750
|
+
debounceMs={0}
|
|
751
|
+
/>,
|
|
752
|
+
);
|
|
753
|
+
|
|
754
|
+
const input = screen.getByRole('combobox');
|
|
755
|
+
await act(async () => {
|
|
756
|
+
fireEvent.change(input, {target: {value: 'QA'}});
|
|
757
|
+
});
|
|
758
|
+
await act(async () => {
|
|
759
|
+
await new Promise(r => setTimeout(r, 50));
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
// Queried off the document rather than by role: the popover renders
|
|
763
|
+
// into a layer that jsdom keeps out of the accessibility tree, which is
|
|
764
|
+
// why the tests around this one reach for text too.
|
|
765
|
+
const options = document.querySelectorAll('[role="option"]');
|
|
766
|
+
expect(options).toHaveLength(4);
|
|
767
|
+
expect(options[3]).toHaveTextContent('Create "QA"');
|
|
768
|
+
});
|
|
769
|
+
|
|
609
770
|
it('shows a "Create" option when typing with hasCreate', async () => {
|
|
610
771
|
render(
|
|
611
772
|
<Tokenizer
|