@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +183 -5
- package/dist/AppShell/observeMainOverflow.d.ts +9 -0
- package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
- package/dist/AppShell/observeMainOverflow.js +125 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +7 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/Carousel/Carousel.d.ts +3 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +12 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +37 -4
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +41 -4
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -4
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +8 -3
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +11 -7
- package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +25 -9
- package/dist/DateInput/useScrollSettle.d.ts +3 -1
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +37 -8
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -12
- package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
- package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts +1 -0
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +7 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +35 -22
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.d.ts +3 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +3 -2
- package/dist/FileInput/FileInput.d.ts +3 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +34 -13
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +21 -7
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layer/popoverOperations.d.ts +27 -0
- package/dist/Layer/popoverOperations.d.ts.map +1 -0
- package/dist/Layer/popoverOperations.js +159 -0
- package/dist/Layer/useLayer.d.ts +1 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +120 -65
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +8 -3
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +26 -10
- package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +26 -5
- package/dist/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +27 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +32 -12
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +10 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +37 -30
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +11 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +18 -7
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +10 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +3 -3
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +26 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +10 -3
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -10
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/TimeInput/TimeInput.d.ts +6 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -14
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +5 -4
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +60 -20
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +101 -54
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +52 -5
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +14 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -7
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -0
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +1 -0
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -4
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +43 -7
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +43 -9
- package/dist/astryx.css +25 -4
- package/dist/gestures/GestureArena.d.ts +32 -1
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +110 -9
- package/dist/gestures/GestureHost.d.ts +351 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +13 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +19 -1
- package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/LongPressGestureRecognizer.js +3 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +3 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +128 -0
- package/dist/gestures/PressTracker.d.ts +112 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -0
- package/dist/gestures/PressTracker.js +267 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +148 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/TapGestureRecognizer.js +3 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/haptics.d.ts +65 -0
- package/dist/gestures/haptics.d.ts.map +1 -0
- package/dist/gestures/haptics.js +182 -0
- package/dist/gestures/index.d.ts +37 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +25 -0
- package/dist/gestures/nativeScroll.d.ts +42 -0
- package/dist/gestures/nativeScroll.d.ts.map +1 -0
- package/dist/gestures/nativeScroll.js +228 -0
- package/dist/gestures/touchAction.d.ts +60 -0
- package/dist/gestures/touchAction.d.ts.map +1 -0
- package/dist/gestures/touchAction.js +157 -0
- package/dist/gestures/touchActionRule.d.ts +34 -0
- package/dist/gestures/touchActionRule.d.ts.map +1 -0
- package/dist/gestures/touchActionRule.js +140 -0
- package/dist/gestures/types.d.ts +18 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/gestures/useGestureRecognizer.d.ts +56 -0
- package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/useGestureRecognizer.js +226 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.js +107 -61
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
- package/dist/hooks/scrollKeyboardDelegation.js +7 -3
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useAnnounce.d.ts +101 -42
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +161 -75
- package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +5 -3
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +6 -12
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/hooks/useScrollOverflow.d.ts +2 -1
- package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
- package/dist/hooks/useScrollOverflow.js +56 -10
- package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
- package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
- package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
- package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
- package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
- package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +8 -5
- package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
- package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
- package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
- package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
- package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
- package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
- package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
- package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
- package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
- package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
- package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
- package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
- package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
- package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
- package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
- package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
- package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
- package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
- package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
- package/dist/i18n/useListFormatter.d.ts +9 -0
- package/dist/i18n/useListFormatter.d.ts.map +1 -0
- package/dist/i18n/useListFormatter.js +41 -0
- package/dist/motion/animator.d.ts +83 -8
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +701 -119
- package/dist/motion/coast.d.ts +4 -1
- package/dist/motion/coast.d.ts.map +1 -1
- package/dist/motion/coast.js +4 -2
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +6 -2
- package/dist/motion/reducedMotionPlan.d.ts +7 -0
- package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
- package/dist/motion/reducedMotionPlan.js +14 -1
- package/dist/motion/resolveMotion.d.ts +42 -0
- package/dist/motion/resolveMotion.d.ts.map +1 -0
- package/dist/motion/resolveMotion.js +43 -0
- package/dist/motion/roleValue.d.ts +2 -1
- package/dist/motion/roleValue.d.ts.map +1 -1
- package/dist/motion/roleValue.js +2 -1
- package/dist/motion/uikit/timing.d.ts +7 -1
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +19 -1
- package/dist/theme/defineTheme.d.ts +19 -5
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +64 -4
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/motionKnobs.d.ts +56 -0
- package/dist/theme/motionKnobs.d.ts.map +1 -0
- package/dist/theme/motionKnobs.js +48 -0
- package/dist/theme/resolveThemeValues.d.ts +11 -4
- package/dist/theme/resolveThemeValues.d.ts.map +1 -1
- package/dist/theme/resolveThemeValues.js +40 -4
- package/dist/theme/themeAdaptations.d.ts +7 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +36 -7
- package/dist/theme/themeMotion.d.ts +96 -0
- package/dist/theme/themeMotion.d.ts.map +1 -0
- package/dist/theme/themeMotion.js +177 -0
- package/dist/theme/tokenReferences.d.ts +31 -0
- package/dist/theme/tokenReferences.d.ts.map +1 -0
- package/dist/theme/tokenReferences.js +132 -0
- package/dist/theme/tokens.d.ts +1 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +9 -129
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +12 -0
- package/dist/utils/focusOutline.stylex.d.ts +6 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +7 -0
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +17 -8
- package/dist/utils/plainDate.d.ts +2 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +46 -3
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -1
- package/dist/utils/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- package/dist/utils/sharedMutationObserver.d.ts +19 -11
- package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
- package/dist/utils/sharedMutationObserver.js +66 -26
- package/dist/utils/timeFormat.d.ts +47 -0
- package/dist/utils/timeFormat.d.ts.map +1 -0
- package/dist/utils/timeFormat.js +240 -0
- package/dist/utils/touchPresentation.d.ts +2 -2
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +13 -8
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/dist/utils/touchQueries.d.ts +13 -0
- package/dist/utils/touchQueries.d.ts.map +1 -0
- package/dist/utils/touchQueries.js +15 -0
- package/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
- package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
- package/dist/utils/useFocusAcrossSwap.js +41 -0
- package/locales/af-ZA.json +0 -21
- package/locales/ar-SA.json +0 -21
- package/locales/ca-ES.json +0 -21
- package/locales/cs-CZ.json +0 -21
- package/locales/da-DK.json +0 -21
- package/locales/de-DE.json +0 -21
- package/locales/el-GR.json +0 -21
- package/locales/en.json +35 -23
- package/locales/es-ES.json +0 -21
- package/locales/fi-FI.json +0 -21
- package/locales/fr-FR.json +0 -21
- package/locales/he-IL.json +0 -21
- package/locales/hu-HU.json +0 -21
- package/locales/it-IT.json +0 -21
- package/locales/ja-JP.json +0 -21
- package/locales/ko-KR.json +0 -21
- package/locales/nl-NL.json +0 -21
- package/locales/no-NO.json +0 -21
- package/locales/pl-PL.json +0 -21
- package/locales/pseudo.json +23 -14
- package/locales/pt-BR.json +0 -21
- package/locales/pt-PT.json +0 -21
- package/locales/ro-RO.json +0 -21
- package/locales/ru-RU.json +0 -21
- package/locales/sr-SP.json +0 -21
- package/locales/sv-SE.json +0 -21
- package/locales/tr-TR.json +0 -21
- package/locales/uk-UA.json +0 -21
- package/locales/vi-VN.json +0 -21
- package/locales/zh-CN.json +0 -21
- package/locales/zh-TW.json +0 -21
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/AppShell/AppShell.doc.mjs +1 -1
- package/src/AppShell/AppShell.spec.md +9 -12
- package/src/AppShell/AppShell.test.tsx +164 -2
- package/src/AppShell/AppShell.tsx +225 -5
- package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
- package/src/AppShell/observeMainOverflow.test.ts +173 -0
- package/src/AppShell/observeMainOverflow.ts +143 -0
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/Badge/Badge.doc.mjs +1 -1
- package/src/Badge/Badge.tsx +19 -2
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/Carousel.doc.mjs +1 -1
- package/src/Carousel/Carousel.spec.md +9 -9
- package/src/Carousel/Carousel.test.tsx +124 -3
- package/src/Carousel/Carousel.tsx +10 -2
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
- package/src/Chat/ChatComposer.spec.md +75 -59
- package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
- package/src/Chat/ChatDictationButton.spec.md +126 -81
- package/src/Chat/ChatLayout.spec.md +41 -36
- package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
- package/src/Chat/ChatMessage.spec.md +64 -65
- package/src/Chat/ChatSendButton.spec.md +78 -67
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Citation/Citation.spec.md +60 -47
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -4
- package/src/ContextMenu/ContextMenu.spec.md +84 -56
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
- package/src/DateInput/DateInput.spec.md +74 -57
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +120 -0
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/TouchDateField.tsx +14 -3
- package/src/DateInput/Wheel.tsx +9 -6
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateInput/usePointerDragScroll.ts +34 -10
- package/src/DateInput/useScrollSettle.ts +38 -7
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
- package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
- package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
- package/src/DateTimeInput/DateTimeInput.tsx +46 -24
- package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
- package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +35 -0
- package/src/Drawer/Drawer.tsx +13 -2
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
- package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
- package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
- package/src/DropdownMenu/DropdownMenu.tsx +43 -21
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
- package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.spec.md +35 -29
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +9 -2
- package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
- package/src/FileInput/FileInput.test.tsx +159 -0
- package/src/FileInput/FileInput.tsx +34 -6
- package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
- package/src/FormLayout/FormLayout.spec.md +11 -20
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.test.tsx +60 -0
- package/src/Item/Item.tsx +16 -8
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Kbd/Kbd.spec.md +81 -38
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
- package/src/Layer/popoverOperations.test.ts +205 -0
- package/src/Layer/popoverOperations.ts +172 -0
- package/src/Layer/useLayer.test.tsx +426 -4
- package/src/Layer/useLayer.tsx +145 -77
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/Link.spec.md +3 -2
- package/src/Link/Link.tsx +11 -0
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
- package/src/MetadataList/MetadataList.spec.md +187 -0
- package/src/MetadataList/MetadataListItem.spec.md +165 -0
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +270 -1
- package/src/MultiSelector/MultiSelector.tsx +25 -10
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.test.tsx +68 -7
- package/src/NumberInput/NumberInput.tsx +44 -4
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/Outline/Outline.spec.md +165 -69
- package/src/Outline/Outline.test.tsx +67 -2
- package/src/Outline/Outline.tsx +23 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
- package/src/OverflowList/OverflowList.spec.md +102 -55
- package/src/Pagination/Pagination.spec.md +158 -84
- package/src/Popover/Popover.test.tsx +84 -0
- package/src/Popover/Popover.tsx +34 -14
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
- package/src/Popover/usePopover.tsx +10 -3
- package/src/PowerSearch/PowerSearch.test.tsx +24 -0
- package/src/PowerSearch/PowerSearch.tsx +42 -31
- package/src/ProgressBar/ProgressBar.spec.md +143 -119
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/RadioList/RadioList.spec.md +1 -1
- package/src/RadioList/RadioList.test.tsx +84 -0
- package/src/RadioList/RadioListItem.tsx +11 -2
- package/src/Resizable/Resizable.spec.md +144 -124
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +151 -4
- package/src/SideNav/SideNavItem.spec.md +14 -24
- package/src/SideNav/SideNavItem.tsx +27 -10
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- package/src/Skeleton/Skeleton.tsx +3 -1
- package/src/Slider/Slider.test.tsx +31 -0
- package/src/Slider/Slider.tsx +8 -3
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +5 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/Stepper/Step.spec.md +36 -42
- package/src/Stepper/Step.tsx +33 -6
- package/src/Stepper/Stepper.doc.mjs +1 -1
- package/src/Stepper/Stepper.test.tsx +69 -7
- package/src/Switch/Switch.spec.md +1 -1
- package/src/Switch/Switch.test.tsx +66 -1
- package/src/Switch/Switch.tsx +11 -3
- package/src/TabList/TabList.test.tsx +58 -4
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/Table.spec.md +1 -1
- package/src/Table/Table.test.tsx +32 -0
- package/src/Table/Table.tsx +43 -11
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/__tests__/Table.a11y.states.ts +1 -5
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
- package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
- package/src/TimeInput/Presentation.test.tsx +21 -0
- package/src/TimeInput/TimeInput.doc.mjs +8 -8
- package/src/TimeInput/TimeInput.spec.md +58 -61
- package/src/TimeInput/TimeInput.test.tsx +76 -0
- package/src/TimeInput/TimeInput.tsx +36 -18
- package/src/TimeInput/TouchTimeField.tsx +4 -6
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +15 -24
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +798 -1
- package/src/Toast/ToastViewport.tsx +121 -53
- package/src/ToggleButton/ToggleButton.test.tsx +27 -0
- package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Token/Token.spec.md +52 -61
- package/src/Token/Token.test.tsx +104 -0
- package/src/Token/Token.tsx +75 -5
- package/src/Token/TokenLink.tsx +21 -7
- package/src/Tokenizer/Tokenizer.spec.md +18 -4
- package/src/Tokenizer/Tokenizer.test.tsx +176 -0
- package/src/Tokenizer/Tokenizer.tsx +48 -12
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
- package/src/TopNav/TopNavMegaMenu.tsx +4 -1
- package/src/TopNav/TopNavMenu.test.tsx +17 -0
- package/src/TopNav/TopNavMenu.tsx +1 -0
- package/src/TreeList/TreeList.test.tsx +26 -0
- package/src/TreeList/TreeListItem.tsx +26 -4
- package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
- package/src/Typeahead/BaseTypeahead.spec.md +45 -45
- package/src/Typeahead/BaseTypeahead.tsx +48 -9
- package/src/Typeahead/Typeahead.test.tsx +294 -11
- package/src/Typeahead/Typeahead.tsx +51 -9
- package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +111 -11
- package/src/gestures/GestureHost.ts +2064 -0
- package/src/gestures/GestureRecognizer.ts +21 -1
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/PressTracker.ts +386 -0
- package/src/gestures/README.md +420 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
- package/src/gestures/SwipeGestureRecognizer.ts +197 -0
- package/src/gestures/TapGestureRecognizer.ts +4 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/PressTracker.test.ts +275 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arena.test.ts +40 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
- package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
- package/src/gestures/__tests__/browser/fixture.ts +307 -0
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
- package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
- package/src/gestures/__tests__/haptics.test.ts +187 -0
- package/src/gestures/__tests__/harness.ts +52 -4
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/index.ts +79 -0
- package/src/gestures/nativeScroll.ts +277 -0
- package/src/gestures/touchAction.ts +191 -0
- package/src/gestures/touchActionRule.ts +157 -0
- package/src/gestures/types.ts +30 -9
- package/src/gestures/useGestureRecognizer.ts +305 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/modalAnnounce.ts +129 -72
- package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
- package/src/hooks/scrollKeyboardDelegation.ts +9 -3
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useAnnounce.doc.mjs +35 -3
- package/src/hooks/useAnnounce.replace.test.tsx +516 -0
- package/src/hooks/useAnnounce.ts +209 -102
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
- package/src/hooks/useAnnounceRenderedText.ts +17 -3
- package/src/hooks/useBusyAnnouncement.ts +7 -10
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/hooks/useScrollOverflow.doc.mjs +1 -1
- package/src/hooks/useScrollOverflow.test.tsx +102 -1
- package/src/hooks/useScrollOverflow.ts +59 -10
- package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
- package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
- package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
- package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
- package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
- package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
- package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
- package/src/i18n/generated-locales/en.generated.ts +9 -6
- package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
- package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
- package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
- package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
- package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
- package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
- package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
- package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
- package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
- package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
- package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
- package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
- package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
- package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
- package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
- package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
- package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
- package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
- package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
- package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/MEASUREMENTS.md +2 -1
- package/src/motion/README.md +113 -33
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
- package/src/motion/__tests__/motionBundle.ts +14 -0
- package/src/motion/animator.test.ts +1125 -32
- package/src/motion/animator.ts +932 -130
- package/src/motion/coast.ts +10 -3
- package/src/motion/reducedMotion.ts +12 -2
- package/src/motion/reducedMotionPlan.test.ts +26 -0
- package/src/motion/reducedMotionPlan.ts +20 -1
- package/src/motion/resolveMotion.test.ts +123 -0
- package/src/motion/resolveMotion.ts +68 -0
- package/src/motion/roleValue.ts +2 -1
- package/src/motion/roles.test.ts +21 -4
- package/src/motion/uikit/tableImports.test.ts +293 -0
- package/src/motion/uikit/timing.ts +15 -1
- package/src/motion/uikit/values.test.ts +23 -12
- package/src/theme/Theme.doc.mjs +1 -1
- package/src/theme/defineTheme.ts +117 -8
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/theme/expandMotionScale.test.ts +1 -1
- package/src/theme/index.ts +5 -0
- package/src/theme/motionKnobs.ts +82 -0
- package/src/theme/resolveThemeValues.ts +68 -6
- package/src/theme/themeAdaptations.ts +52 -12
- package/src/theme/themeMotion.test.ts +620 -0
- package/src/theme/themeMotion.ts +221 -0
- package/src/theme/tokenReferences.ts +149 -0
- package/src/theme/tokens.stylex.ts +10 -0
- package/src/theme/tokens.ts +15 -158
- package/src/utils/focusOutline.stylex.ts +28 -0
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/interactionOverlay.stylex.ts +12 -3
- package/src/utils/plainDate.test.ts +90 -0
- package/src/utils/plainDate.ts +58 -3
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressFeedback.test.ts +138 -0
- package/src/utils/pressFeedback.ts +34 -11
- package/src/utils/pressGesture.test.ts +9 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/sharedMutationObserver.test.ts +54 -1
- package/src/utils/sharedMutationObserver.ts +87 -29
- package/src/utils/timeFormat.test.ts +204 -0
- package/src/utils/timeFormat.ts +314 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +13 -8
- package/src/utils/touchQueries.ts +15 -0
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
- package/src/utils/useFocusAcrossSwap.ts +55 -0
|
@@ -30,7 +30,8 @@ import {
|
|
|
30
30
|
waitFor,
|
|
31
31
|
within,
|
|
32
32
|
} from '@testing-library/react';
|
|
33
|
-
import React from 'react';
|
|
33
|
+
import React, {useRef} from 'react';
|
|
34
|
+
import {createPortal} from 'react-dom';
|
|
34
35
|
import {readFileSync} from 'node:fs';
|
|
35
36
|
import {type AnnounceFn, __resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
36
37
|
import {Button} from '../Button';
|
|
@@ -602,6 +603,173 @@ describe('ToastViewport keyboard reach + focus', () => {
|
|
|
602
603
|
expect(document.activeElement).toBe(dismiss);
|
|
603
604
|
});
|
|
604
605
|
|
|
606
|
+
it('moves focus to the neighbour when a control inside a toast raises its repeat and dismisses it', () => {
|
|
607
|
+
function OfflineFlow() {
|
|
608
|
+
const toast = useToast();
|
|
609
|
+
const dismissOfflineRef = useRef<(() => void) | null>(null);
|
|
610
|
+
const showOffline = (body: string) => {
|
|
611
|
+
dismissOfflineRef.current = toast({
|
|
612
|
+
uniqueID: 'offline',
|
|
613
|
+
isAutoHide: false,
|
|
614
|
+
body,
|
|
615
|
+
endContent: (
|
|
616
|
+
<button
|
|
617
|
+
type="button"
|
|
618
|
+
onClick={() => {
|
|
619
|
+
// A retry reports the state again, then closes the toast it
|
|
620
|
+
// was pressed in.
|
|
621
|
+
const dismissPressed = dismissOfflineRef.current;
|
|
622
|
+
showOffline('Still offline');
|
|
623
|
+
dismissPressed?.();
|
|
624
|
+
}}>
|
|
625
|
+
Retry
|
|
626
|
+
</button>
|
|
627
|
+
),
|
|
628
|
+
});
|
|
629
|
+
};
|
|
630
|
+
return (
|
|
631
|
+
<>
|
|
632
|
+
<button
|
|
633
|
+
type="button"
|
|
634
|
+
onClick={() => {
|
|
635
|
+
toast({isAutoHide: false, body: 'Alpha'});
|
|
636
|
+
toast({isAutoHide: false, body: 'Bravo'});
|
|
637
|
+
}}>
|
|
638
|
+
Show two
|
|
639
|
+
</button>
|
|
640
|
+
<button type="button" onClick={() => showOffline('Offline')}>
|
|
641
|
+
Show offline
|
|
642
|
+
</button>
|
|
643
|
+
</>
|
|
644
|
+
);
|
|
645
|
+
}
|
|
646
|
+
render(
|
|
647
|
+
<ToastViewport isTopLayer={false} maxVisible={2}>
|
|
648
|
+
<OfflineFlow />
|
|
649
|
+
</ToastViewport>,
|
|
650
|
+
);
|
|
651
|
+
act(() => {
|
|
652
|
+
fireEvent.click(screen.getByText('Show two'));
|
|
653
|
+
});
|
|
654
|
+
act(() => {
|
|
655
|
+
fireEvent.click(screen.getByText('Show offline'));
|
|
656
|
+
});
|
|
657
|
+
// Alpha waits hidden; Bravo and Offline show.
|
|
658
|
+
const retry = within(getToastWrapperByText('Offline')).getByRole('button', {
|
|
659
|
+
name: 'Retry',
|
|
660
|
+
});
|
|
661
|
+
retry.focus();
|
|
662
|
+
act(() => {
|
|
663
|
+
fireEvent.click(retry);
|
|
664
|
+
});
|
|
665
|
+
// Toast.spec.md FR10: focus moves to a control in a remaining toast, the
|
|
666
|
+
// neighbour of the dismissed one, not to the hidden oldest toast or the
|
|
667
|
+
// region.
|
|
668
|
+
expect(
|
|
669
|
+
getToastWrapperByText('Bravo').contains(document.activeElement),
|
|
670
|
+
).toBe(true);
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
it('moves focus into the replacement when a control inside the only toast raises its repeat and dismisses it', () => {
|
|
674
|
+
function OfflineFlow() {
|
|
675
|
+
const toast = useToast();
|
|
676
|
+
const dismissOfflineRef = useRef<(() => void) | null>(null);
|
|
677
|
+
const showOffline = (body: string) => {
|
|
678
|
+
dismissOfflineRef.current = toast({
|
|
679
|
+
uniqueID: 'offline',
|
|
680
|
+
isAutoHide: false,
|
|
681
|
+
body,
|
|
682
|
+
endContent: (
|
|
683
|
+
<button
|
|
684
|
+
type="button"
|
|
685
|
+
onClick={() => {
|
|
686
|
+
const dismissPressed = dismissOfflineRef.current;
|
|
687
|
+
showOffline('Still offline');
|
|
688
|
+
dismissPressed?.();
|
|
689
|
+
}}>
|
|
690
|
+
Retry
|
|
691
|
+
</button>
|
|
692
|
+
),
|
|
693
|
+
});
|
|
694
|
+
};
|
|
695
|
+
return (
|
|
696
|
+
<button type="button" onClick={() => showOffline('Offline')}>
|
|
697
|
+
Show offline
|
|
698
|
+
</button>
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
render(
|
|
702
|
+
<ToastViewport isTopLayer={false}>
|
|
703
|
+
<OfflineFlow />
|
|
704
|
+
</ToastViewport>,
|
|
705
|
+
);
|
|
706
|
+
act(() => {
|
|
707
|
+
fireEvent.click(screen.getByText('Show offline'));
|
|
708
|
+
});
|
|
709
|
+
const retry = within(getToastWrapperByText('Offline')).getByRole('button', {
|
|
710
|
+
name: 'Retry',
|
|
711
|
+
});
|
|
712
|
+
retry.focus();
|
|
713
|
+
act(() => {
|
|
714
|
+
fireEvent.click(retry);
|
|
715
|
+
});
|
|
716
|
+
// FR10: the replacement is the remaining toast, so focus goes into it.
|
|
717
|
+
expect(
|
|
718
|
+
getToastWrapperByText('Still offline').contains(document.activeElement),
|
|
719
|
+
).toBe(true);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
it('moves focus to a toast that shows when a control inside a toast raises two toasts at the cap and dismisses its own', () => {
|
|
723
|
+
function UploadFlow() {
|
|
724
|
+
const toast = useToast();
|
|
725
|
+
const dismissSavedRef = useRef<(() => void) | null>(null);
|
|
726
|
+
return (
|
|
727
|
+
<button
|
|
728
|
+
type="button"
|
|
729
|
+
onClick={() => {
|
|
730
|
+
dismissSavedRef.current = toast({
|
|
731
|
+
isAutoHide: false,
|
|
732
|
+
body: 'Saved',
|
|
733
|
+
endContent: (
|
|
734
|
+
<button
|
|
735
|
+
type="button"
|
|
736
|
+
onClick={() => {
|
|
737
|
+
toast({isAutoHide: false, body: 'Uploading'});
|
|
738
|
+
toast({isAutoHide: false, body: 'Uploaded'});
|
|
739
|
+
dismissSavedRef.current?.();
|
|
740
|
+
}}>
|
|
741
|
+
Upload
|
|
742
|
+
</button>
|
|
743
|
+
),
|
|
744
|
+
});
|
|
745
|
+
}}>
|
|
746
|
+
Save
|
|
747
|
+
</button>
|
|
748
|
+
);
|
|
749
|
+
}
|
|
750
|
+
render(
|
|
751
|
+
<ToastViewport isTopLayer={false} maxVisible={1}>
|
|
752
|
+
<UploadFlow />
|
|
753
|
+
</ToastViewport>,
|
|
754
|
+
);
|
|
755
|
+
act(() => {
|
|
756
|
+
fireEvent.click(screen.getByText('Save'));
|
|
757
|
+
});
|
|
758
|
+
const upload = within(getToastWrapperByText('Saved')).getByRole('button', {
|
|
759
|
+
name: 'Upload',
|
|
760
|
+
});
|
|
761
|
+
upload.focus();
|
|
762
|
+
act(() => {
|
|
763
|
+
fireEvent.click(upload);
|
|
764
|
+
});
|
|
765
|
+
// FR10: with one visible place, "Uploaded" shows and "Uploading" waits
|
|
766
|
+
// hidden, so focus goes to "Uploaded", not to the hidden toast or the
|
|
767
|
+
// region.
|
|
768
|
+
expect(
|
|
769
|
+
getToastWrapperByText('Uploaded').contains(document.activeElement),
|
|
770
|
+
).toBe(true);
|
|
771
|
+
});
|
|
772
|
+
|
|
605
773
|
it('dismissing a focused toast moves focus to a remaining toast, not body', () => {
|
|
606
774
|
renderViewport(
|
|
607
775
|
<>
|
|
@@ -675,6 +843,84 @@ describe('ToastViewport keyboard reach + focus', () => {
|
|
|
675
843
|
// No toasts left — focus returns to the element focused before F6.
|
|
676
844
|
expect(document.activeElement).toBe(trigger);
|
|
677
845
|
});
|
|
846
|
+
|
|
847
|
+
it('restores focus after a toast reached with Tab rather than F6 is dismissed', () => {
|
|
848
|
+
renderViewport(
|
|
849
|
+
<ShowToastButton options={INFO_A} triggerLabel="Trigger A" />,
|
|
850
|
+
);
|
|
851
|
+
const trigger = screen.getByText('Trigger A');
|
|
852
|
+
trigger.focus();
|
|
853
|
+
act(() => {
|
|
854
|
+
fireEvent.click(trigger);
|
|
855
|
+
});
|
|
856
|
+
const dismiss = screen.getByRole('button', {name: 'Dismiss notification'});
|
|
857
|
+
// Tab (or a click) moves focus straight to the toast's control.
|
|
858
|
+
act(() => {
|
|
859
|
+
dismiss.focus();
|
|
860
|
+
});
|
|
861
|
+
const toastId = document
|
|
862
|
+
.querySelector('[data-toast-id]')!
|
|
863
|
+
.getAttribute('data-toast-id')!;
|
|
864
|
+
|
|
865
|
+
act(() => {
|
|
866
|
+
fireEvent.click(dismiss);
|
|
867
|
+
});
|
|
868
|
+
act(() => {
|
|
869
|
+
completeExit(toastId);
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
expect(document.activeElement).toBe(trigger);
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
it('keeps the return target while focus visits portaled toast content', () => {
|
|
876
|
+
renderViewport(
|
|
877
|
+
<ShowToastButton
|
|
878
|
+
options={{
|
|
879
|
+
body: 'With a portal',
|
|
880
|
+
isAutoHide: false,
|
|
881
|
+
renderContent: ({body, dismiss}) => (
|
|
882
|
+
<div>
|
|
883
|
+
{body}
|
|
884
|
+
{createPortal(
|
|
885
|
+
<button type="button">Portaled</button>,
|
|
886
|
+
document.body,
|
|
887
|
+
)}
|
|
888
|
+
<Button label="Close" onClick={dismiss} />
|
|
889
|
+
</div>
|
|
890
|
+
),
|
|
891
|
+
}}
|
|
892
|
+
triggerLabel="Trigger P"
|
|
893
|
+
/>,
|
|
894
|
+
);
|
|
895
|
+
const trigger = screen.getByText('Trigger P');
|
|
896
|
+
trigger.focus();
|
|
897
|
+
act(() => {
|
|
898
|
+
fireEvent.click(trigger);
|
|
899
|
+
});
|
|
900
|
+
act(() => {
|
|
901
|
+
fireEvent.keyDown(document, {key: 'F6'});
|
|
902
|
+
});
|
|
903
|
+
// Focus visits the toast's portaled control, then comes back.
|
|
904
|
+
act(() => {
|
|
905
|
+
screen.getByRole('button', {name: 'Portaled'}).focus();
|
|
906
|
+
});
|
|
907
|
+
const close = screen.getByRole('button', {name: 'Close'});
|
|
908
|
+
act(() => {
|
|
909
|
+
close.focus();
|
|
910
|
+
});
|
|
911
|
+
const toastId = document
|
|
912
|
+
.querySelector('[data-toast-id]')!
|
|
913
|
+
.getAttribute('data-toast-id')!;
|
|
914
|
+
|
|
915
|
+
act(() => {
|
|
916
|
+
fireEvent.click(close);
|
|
917
|
+
});
|
|
918
|
+
act(() => {
|
|
919
|
+
completeExit(toastId);
|
|
920
|
+
});
|
|
921
|
+
|
|
922
|
+
expect(document.activeElement).toBe(trigger);
|
|
923
|
+
});
|
|
678
924
|
});
|
|
679
925
|
|
|
680
926
|
describe('Toast blur timer pause', () => {
|
|
@@ -2061,6 +2307,413 @@ describe('toast announcements via singleton live regions', () => {
|
|
|
2061
2307
|
expect(within(viewport).getByText('Kept')).toBeInTheDocument();
|
|
2062
2308
|
expect(within(viewport).queryByText('Dropped')).not.toBeInTheDocument();
|
|
2063
2309
|
});
|
|
2310
|
+
|
|
2311
|
+
it('drops an ignored-collision toast while its namesake is still leaving', () => {
|
|
2312
|
+
renderViewport(
|
|
2313
|
+
<>
|
|
2314
|
+
<ShowToastButton
|
|
2315
|
+
options={{
|
|
2316
|
+
uniqueID: 'offline',
|
|
2317
|
+
collisionBehavior: 'ignore',
|
|
2318
|
+
isAutoHide: false,
|
|
2319
|
+
body: 'You are offline',
|
|
2320
|
+
}}
|
|
2321
|
+
triggerLabel="Show 1"
|
|
2322
|
+
/>
|
|
2323
|
+
<ShowToastButton
|
|
2324
|
+
options={{
|
|
2325
|
+
uniqueID: 'offline',
|
|
2326
|
+
collisionBehavior: 'ignore',
|
|
2327
|
+
isAutoHide: false,
|
|
2328
|
+
body: 'Still offline',
|
|
2329
|
+
}}
|
|
2330
|
+
triggerLabel="Show 2"
|
|
2331
|
+
/>
|
|
2332
|
+
</>,
|
|
2333
|
+
);
|
|
2334
|
+
act(() => {
|
|
2335
|
+
fireEvent.click(screen.getByText('Show 1'));
|
|
2336
|
+
});
|
|
2337
|
+
const first = getToastWrapperByText('You are offline');
|
|
2338
|
+
act(() => {
|
|
2339
|
+
fireEvent.click(
|
|
2340
|
+
within(first).getByRole('button', {name: 'Dismiss notification'}),
|
|
2341
|
+
);
|
|
2342
|
+
});
|
|
2343
|
+
// Toast.spec.md FR8: a leaving toast still holds its uniqueID, so the
|
|
2344
|
+
// ignored namesake is neither shown nor announced.
|
|
2345
|
+
act(() => {
|
|
2346
|
+
fireEvent.click(screen.getByText('Show 2'));
|
|
2347
|
+
});
|
|
2348
|
+
expect(announceSpy).toHaveBeenCalledTimes(1);
|
|
2349
|
+
expect(screen.queryByText('Still offline')).toBeNull();
|
|
2350
|
+
act(() => {
|
|
2351
|
+
completeExit(first.dataset.toastId ?? '');
|
|
2352
|
+
});
|
|
2353
|
+
expect(document.querySelectorAll('[data-toast-id]')).toHaveLength(0);
|
|
2354
|
+
});
|
|
2355
|
+
|
|
2356
|
+
it('lets a leaving toast finish its exit when a new toast arrives with no cap', () => {
|
|
2357
|
+
render(
|
|
2358
|
+
<ToastViewport isTopLayer={false} maxVisible={0}>
|
|
2359
|
+
<ShowToastButton
|
|
2360
|
+
options={{isAutoHide: false, body: 'Saved'}}
|
|
2361
|
+
triggerLabel="Show 1"
|
|
2362
|
+
/>
|
|
2363
|
+
<ShowToastButton
|
|
2364
|
+
options={{isAutoHide: false, body: 'Uploaded'}}
|
|
2365
|
+
triggerLabel="Show 2"
|
|
2366
|
+
/>
|
|
2367
|
+
</ToastViewport>,
|
|
2368
|
+
);
|
|
2369
|
+
act(() => {
|
|
2370
|
+
fireEvent.click(screen.getByText('Show 1'));
|
|
2371
|
+
});
|
|
2372
|
+
const first = getToastWrapperByText('Saved');
|
|
2373
|
+
const firstId = first.dataset.toastId ?? '';
|
|
2374
|
+
act(() => {
|
|
2375
|
+
fireEvent.click(
|
|
2376
|
+
within(first).getByRole('button', {name: 'Dismiss notification'}),
|
|
2377
|
+
);
|
|
2378
|
+
});
|
|
2379
|
+
// maxVisible={0} shows every toast (Toast.spec.md FR7), so the closing
|
|
2380
|
+
// toast keeps its row and collapses (FR5) while the new one arrives.
|
|
2381
|
+
act(() => {
|
|
2382
|
+
fireEvent.click(screen.getByText('Show 2'));
|
|
2383
|
+
});
|
|
2384
|
+
expect(getToastWrapperByText('Saved').dataset.toastId).toBe(firstId);
|
|
2385
|
+
expect(screen.getByText('Uploaded')).toBeInTheDocument();
|
|
2386
|
+
act(() => {
|
|
2387
|
+
completeExit(firstId);
|
|
2388
|
+
});
|
|
2389
|
+
expect(screen.queryByText('Saved')).toBeNull();
|
|
2390
|
+
expect(screen.getByText('Uploaded')).toBeInTheDocument();
|
|
2391
|
+
});
|
|
2392
|
+
|
|
2393
|
+
it('drops a second ignore toast with the same uniqueID raised in the same handler', () => {
|
|
2394
|
+
function ShowTwoIgnored() {
|
|
2395
|
+
const toast = useToast();
|
|
2396
|
+
return (
|
|
2397
|
+
<button
|
|
2398
|
+
type="button"
|
|
2399
|
+
onClick={() => {
|
|
2400
|
+
toast({
|
|
2401
|
+
uniqueID: 'offline',
|
|
2402
|
+
collisionBehavior: 'ignore',
|
|
2403
|
+
isAutoHide: false,
|
|
2404
|
+
body: 'You are offline',
|
|
2405
|
+
});
|
|
2406
|
+
toast({
|
|
2407
|
+
uniqueID: 'offline',
|
|
2408
|
+
collisionBehavior: 'ignore',
|
|
2409
|
+
isAutoHide: false,
|
|
2410
|
+
body: 'Still offline',
|
|
2411
|
+
});
|
|
2412
|
+
}}>
|
|
2413
|
+
Show twice
|
|
2414
|
+
</button>
|
|
2415
|
+
);
|
|
2416
|
+
}
|
|
2417
|
+
render(
|
|
2418
|
+
<ToastViewport isTopLayer={false}>
|
|
2419
|
+
<ShowTwoIgnored />
|
|
2420
|
+
</ToastViewport>,
|
|
2421
|
+
);
|
|
2422
|
+
act(() => {
|
|
2423
|
+
fireEvent.click(screen.getByText('Show twice'));
|
|
2424
|
+
});
|
|
2425
|
+
// Toast.spec.md FR8 and ORD1: the ignored namesake is neither shown nor
|
|
2426
|
+
// announced, even before the first toast renders.
|
|
2427
|
+
expect(announceSpy).toHaveBeenCalledTimes(1);
|
|
2428
|
+
expect(announceSpy).toHaveBeenLastCalledWith('You are offline', 'polite');
|
|
2429
|
+
const rows = [...document.querySelectorAll('[data-toast-id]')];
|
|
2430
|
+
expect(rows).toHaveLength(1);
|
|
2431
|
+
expect(rows[0].textContent).toContain('You are offline');
|
|
2432
|
+
});
|
|
2433
|
+
|
|
2434
|
+
it('leaves no row behind when a new toast takes the last visible slot from a leaving one', () => {
|
|
2435
|
+
render(
|
|
2436
|
+
<ToastViewport isTopLayer={false} maxVisible={1}>
|
|
2437
|
+
<ShowToastButton
|
|
2438
|
+
options={{isAutoHide: false, body: 'Saved'}}
|
|
2439
|
+
triggerLabel="Show 1"
|
|
2440
|
+
/>
|
|
2441
|
+
<ShowToastButton
|
|
2442
|
+
options={{isAutoHide: false, body: 'Uploaded'}}
|
|
2443
|
+
triggerLabel="Show 2"
|
|
2444
|
+
/>
|
|
2445
|
+
</ToastViewport>,
|
|
2446
|
+
);
|
|
2447
|
+
act(() => {
|
|
2448
|
+
fireEvent.click(screen.getByText('Show 1'));
|
|
2449
|
+
});
|
|
2450
|
+
const first = getToastWrapperByText('Saved');
|
|
2451
|
+
act(() => {
|
|
2452
|
+
fireEvent.click(
|
|
2453
|
+
within(first).getByRole('button', {name: 'Dismiss notification'}),
|
|
2454
|
+
);
|
|
2455
|
+
});
|
|
2456
|
+
// A new toast arrives at once; with one visible slot it takes the place of
|
|
2457
|
+
// the leaving toast, which can no longer finish its exit on screen.
|
|
2458
|
+
act(() => {
|
|
2459
|
+
fireEvent.click(screen.getByText('Show 2'));
|
|
2460
|
+
});
|
|
2461
|
+
const second = getToastWrapperByText('Uploaded');
|
|
2462
|
+
act(() => {
|
|
2463
|
+
fireEvent.click(
|
|
2464
|
+
within(second).getByRole('button', {name: 'Dismiss notification'}),
|
|
2465
|
+
);
|
|
2466
|
+
});
|
|
2467
|
+
act(() => {
|
|
2468
|
+
completeExit(second.dataset.toastId ?? '');
|
|
2469
|
+
});
|
|
2470
|
+
// Nothing is left: no row comes back, and the landmark is gone.
|
|
2471
|
+
expect(document.querySelectorAll('[data-toast-id]')).toHaveLength(0);
|
|
2472
|
+
expect(screen.queryByRole('region', {name: 'Notifications'})).toBeNull();
|
|
2473
|
+
});
|
|
2474
|
+
|
|
2475
|
+
it('reports the namesake once when one handler shows a repeat and dismisses the namesake', () => {
|
|
2476
|
+
const onHide = vi.fn();
|
|
2477
|
+
function RepeatAndDismiss() {
|
|
2478
|
+
const toast = useToast();
|
|
2479
|
+
const dismissFirstRef = useRef<(() => void) | null>(null);
|
|
2480
|
+
return (
|
|
2481
|
+
<>
|
|
2482
|
+
<button
|
|
2483
|
+
type="button"
|
|
2484
|
+
onClick={() => {
|
|
2485
|
+
dismissFirstRef.current = toast({
|
|
2486
|
+
uniqueID: 'offline',
|
|
2487
|
+
isAutoHide: false,
|
|
2488
|
+
body: 'Offline',
|
|
2489
|
+
onHide,
|
|
2490
|
+
});
|
|
2491
|
+
}}>
|
|
2492
|
+
Show first
|
|
2493
|
+
</button>
|
|
2494
|
+
<button
|
|
2495
|
+
type="button"
|
|
2496
|
+
onClick={() => {
|
|
2497
|
+
toast({
|
|
2498
|
+
uniqueID: 'offline',
|
|
2499
|
+
isAutoHide: false,
|
|
2500
|
+
body: 'Still offline',
|
|
2501
|
+
});
|
|
2502
|
+
dismissFirstRef.current?.();
|
|
2503
|
+
}}>
|
|
2504
|
+
Repeat and dismiss
|
|
2505
|
+
</button>
|
|
2506
|
+
</>
|
|
2507
|
+
);
|
|
2508
|
+
}
|
|
2509
|
+
render(
|
|
2510
|
+
<ToastViewport isTopLayer={false}>
|
|
2511
|
+
<RepeatAndDismiss />
|
|
2512
|
+
</ToastViewport>,
|
|
2513
|
+
);
|
|
2514
|
+
act(() => {
|
|
2515
|
+
fireEvent.click(screen.getByText('Show first'));
|
|
2516
|
+
});
|
|
2517
|
+
act(() => {
|
|
2518
|
+
fireEvent.click(screen.getByText('Repeat and dismiss'));
|
|
2519
|
+
});
|
|
2520
|
+
// As on `main`: the repeat replaces its namesake in place, and the
|
|
2521
|
+
// namesake's dismissal reports it once.
|
|
2522
|
+
expect(onHide).toHaveBeenCalledTimes(1);
|
|
2523
|
+
const rows = [...document.querySelectorAll('[data-toast-id]')];
|
|
2524
|
+
expect(rows).toHaveLength(1);
|
|
2525
|
+
expect(rows[0].textContent).toContain('Still offline');
|
|
2526
|
+
});
|
|
2527
|
+
|
|
2528
|
+
it('leaves no row behind when one handler raises a toast at the cap and dismisses the one it pushed out', () => {
|
|
2529
|
+
const onHide = vi.fn();
|
|
2530
|
+
function UndoFlow() {
|
|
2531
|
+
const toast = useToast();
|
|
2532
|
+
const dismissDeletedRef = useRef<(() => void) | null>(null);
|
|
2533
|
+
return (
|
|
2534
|
+
<>
|
|
2535
|
+
<button
|
|
2536
|
+
type="button"
|
|
2537
|
+
onClick={() => {
|
|
2538
|
+
dismissDeletedRef.current = toast({
|
|
2539
|
+
isAutoHide: false,
|
|
2540
|
+
body: 'Deleted',
|
|
2541
|
+
onHide,
|
|
2542
|
+
});
|
|
2543
|
+
}}>
|
|
2544
|
+
Delete
|
|
2545
|
+
</button>
|
|
2546
|
+
<button
|
|
2547
|
+
type="button"
|
|
2548
|
+
onClick={() => {
|
|
2549
|
+
// An undo shows its confirmation, then dismisses its own toast.
|
|
2550
|
+
toast({isAutoHide: false, body: 'Restored'});
|
|
2551
|
+
dismissDeletedRef.current?.();
|
|
2552
|
+
}}>
|
|
2553
|
+
Undo
|
|
2554
|
+
</button>
|
|
2555
|
+
</>
|
|
2556
|
+
);
|
|
2557
|
+
}
|
|
2558
|
+
render(
|
|
2559
|
+
<ToastViewport isTopLayer={false} maxVisible={1}>
|
|
2560
|
+
<UndoFlow />
|
|
2561
|
+
</ToastViewport>,
|
|
2562
|
+
);
|
|
2563
|
+
act(() => {
|
|
2564
|
+
fireEvent.click(screen.getByText('Delete'));
|
|
2565
|
+
});
|
|
2566
|
+
act(() => {
|
|
2567
|
+
fireEvent.click(screen.getByText('Undo'));
|
|
2568
|
+
});
|
|
2569
|
+
expect(onHide).toHaveBeenCalledTimes(1);
|
|
2570
|
+
const restored = getToastWrapperByText('Restored');
|
|
2571
|
+
act(() => {
|
|
2572
|
+
fireEvent.click(
|
|
2573
|
+
within(restored).getByRole('button', {name: 'Dismiss notification'}),
|
|
2574
|
+
);
|
|
2575
|
+
});
|
|
2576
|
+
act(() => {
|
|
2577
|
+
completeExit(restored.dataset.toastId ?? '');
|
|
2578
|
+
});
|
|
2579
|
+
// Nothing is left: no row comes back, and the landmark is gone.
|
|
2580
|
+
expect(document.querySelectorAll('[data-toast-id]')).toHaveLength(0);
|
|
2581
|
+
expect(screen.queryByRole('region', {name: 'Notifications'})).toBeNull();
|
|
2582
|
+
});
|
|
2583
|
+
|
|
2584
|
+
it('reports a leaving toast once when it is dismissed again after a new toast pushed it out of view', () => {
|
|
2585
|
+
const onHide = vi.fn();
|
|
2586
|
+
function ShowPushDismiss() {
|
|
2587
|
+
const toast = useToast();
|
|
2588
|
+
const dismissFirstRef = useRef<(() => void) | null>(null);
|
|
2589
|
+
return (
|
|
2590
|
+
<>
|
|
2591
|
+
<button
|
|
2592
|
+
type="button"
|
|
2593
|
+
onClick={() => {
|
|
2594
|
+
dismissFirstRef.current = toast({
|
|
2595
|
+
isAutoHide: false,
|
|
2596
|
+
body: 'Saved',
|
|
2597
|
+
onHide,
|
|
2598
|
+
});
|
|
2599
|
+
}}>
|
|
2600
|
+
Show first
|
|
2601
|
+
</button>
|
|
2602
|
+
<button
|
|
2603
|
+
type="button"
|
|
2604
|
+
onClick={() => {
|
|
2605
|
+
toast({isAutoHide: false, body: 'Uploaded'});
|
|
2606
|
+
}}>
|
|
2607
|
+
Show second
|
|
2608
|
+
</button>
|
|
2609
|
+
<button type="button" onClick={() => dismissFirstRef.current?.()}>
|
|
2610
|
+
Dismiss first
|
|
2611
|
+
</button>
|
|
2612
|
+
</>
|
|
2613
|
+
);
|
|
2614
|
+
}
|
|
2615
|
+
render(
|
|
2616
|
+
<ToastViewport isTopLayer={false} maxVisible={1}>
|
|
2617
|
+
<ShowPushDismiss />
|
|
2618
|
+
</ToastViewport>,
|
|
2619
|
+
);
|
|
2620
|
+
act(() => {
|
|
2621
|
+
fireEvent.click(screen.getByText('Show first'));
|
|
2622
|
+
});
|
|
2623
|
+
// It starts leaving, and reports it.
|
|
2624
|
+
act(() => {
|
|
2625
|
+
fireEvent.click(screen.getByText('Dismiss first'));
|
|
2626
|
+
});
|
|
2627
|
+
expect(onHide).toHaveBeenCalledTimes(1);
|
|
2628
|
+
// A new toast takes the only visible slot: the leaving one leaves the list.
|
|
2629
|
+
act(() => {
|
|
2630
|
+
fireEvent.click(screen.getByText('Show second'));
|
|
2631
|
+
});
|
|
2632
|
+
// Its dismissal again reports nothing more.
|
|
2633
|
+
act(() => {
|
|
2634
|
+
fireEvent.click(screen.getByText('Dismiss first'));
|
|
2635
|
+
});
|
|
2636
|
+
expect(onHide).toHaveBeenCalledTimes(1);
|
|
2637
|
+
const rows = [...document.querySelectorAll('[data-toast-id]')];
|
|
2638
|
+
expect(rows).toHaveLength(1);
|
|
2639
|
+
expect(rows[0].textContent).toContain('Uploaded');
|
|
2640
|
+
});
|
|
2641
|
+
|
|
2642
|
+
it('reports nothing for a toast replaced before it rendered, however often one handler dismisses it', () => {
|
|
2643
|
+
const onHide = vi.fn();
|
|
2644
|
+
function ShowReplaceDismiss() {
|
|
2645
|
+
const toast = useToast();
|
|
2646
|
+
return (
|
|
2647
|
+
<button
|
|
2648
|
+
type="button"
|
|
2649
|
+
onClick={() => {
|
|
2650
|
+
const dismissFirst = toast({
|
|
2651
|
+
uniqueID: 'offline',
|
|
2652
|
+
isAutoHide: false,
|
|
2653
|
+
body: 'Offline',
|
|
2654
|
+
onHide,
|
|
2655
|
+
});
|
|
2656
|
+
toast({
|
|
2657
|
+
uniqueID: 'offline',
|
|
2658
|
+
isAutoHide: false,
|
|
2659
|
+
body: 'Still offline',
|
|
2660
|
+
});
|
|
2661
|
+
dismissFirst();
|
|
2662
|
+
dismissFirst();
|
|
2663
|
+
}}>
|
|
2664
|
+
Show, replace and dismiss
|
|
2665
|
+
</button>
|
|
2666
|
+
);
|
|
2667
|
+
}
|
|
2668
|
+
render(
|
|
2669
|
+
<ToastViewport isTopLayer={false}>
|
|
2670
|
+
<ShowReplaceDismiss />
|
|
2671
|
+
</ToastViewport>,
|
|
2672
|
+
);
|
|
2673
|
+
act(() => {
|
|
2674
|
+
fireEvent.click(screen.getByText('Show, replace and dismiss'));
|
|
2675
|
+
});
|
|
2676
|
+
// Toast.spec.md FR3: a toast replaced through uniqueID is not dismissed
|
|
2677
|
+
// and reports no onHide.
|
|
2678
|
+
expect(onHide).not.toHaveBeenCalled();
|
|
2679
|
+
const rows = [...document.querySelectorAll('[data-toast-id]')];
|
|
2680
|
+
expect(rows).toHaveLength(1);
|
|
2681
|
+
expect(rows[0].textContent).toContain('Still offline');
|
|
2682
|
+
});
|
|
2683
|
+
|
|
2684
|
+
it('replaces a leaving namesake in place under overwrite and announces it again', () => {
|
|
2685
|
+
renderViewport(
|
|
2686
|
+
<>
|
|
2687
|
+
<ShowToastButton
|
|
2688
|
+
options={{uniqueID: 'upload', isAutoHide: false, body: 'Upload 30%'}}
|
|
2689
|
+
triggerLabel="Show 1"
|
|
2690
|
+
/>
|
|
2691
|
+
<ShowToastButton
|
|
2692
|
+
options={{uniqueID: 'upload', isAutoHide: false, body: 'Upload 31%'}}
|
|
2693
|
+
triggerLabel="Show 2"
|
|
2694
|
+
/>
|
|
2695
|
+
</>,
|
|
2696
|
+
);
|
|
2697
|
+
act(() => {
|
|
2698
|
+
fireEvent.click(screen.getByText('Show 1'));
|
|
2699
|
+
});
|
|
2700
|
+
const first = getToastWrapperByText('Upload 30%');
|
|
2701
|
+
act(() => {
|
|
2702
|
+
fireEvent.click(
|
|
2703
|
+
within(first).getByRole('button', {name: 'Dismiss notification'}),
|
|
2704
|
+
);
|
|
2705
|
+
});
|
|
2706
|
+
// Toast.spec.md FR8: an overwrite replaces its namesake in place even
|
|
2707
|
+
// while it is leaving, and is announced again.
|
|
2708
|
+
act(() => {
|
|
2709
|
+
fireEvent.click(screen.getByText('Show 2'));
|
|
2710
|
+
});
|
|
2711
|
+
expect(announceSpy).toHaveBeenLastCalledWith('Upload 31%', 'polite');
|
|
2712
|
+
expect(screen.queryByText('Upload 30%')).toBeNull();
|
|
2713
|
+
const rows = [...document.querySelectorAll('[data-toast-id]')];
|
|
2714
|
+
expect(rows).toHaveLength(1);
|
|
2715
|
+
expect(rows[0].textContent).toContain('Upload 31%');
|
|
2716
|
+
});
|
|
2064
2717
|
});
|
|
2065
2718
|
|
|
2066
2719
|
describe('toast timer lifecycle (#3589)', () => {
|
|
@@ -2084,6 +2737,150 @@ describe('toast timer lifecycle (#3589)', () => {
|
|
|
2084
2737
|
expect(onHide).toHaveBeenCalledTimes(1);
|
|
2085
2738
|
});
|
|
2086
2739
|
|
|
2740
|
+
// spec:Toast FR2/AR3: each pause condition is held on its own, so one
|
|
2741
|
+
// ending never resumes the timer while another still holds.
|
|
2742
|
+
function showPausableToast(onHide: () => void) {
|
|
2743
|
+
renderViewport(
|
|
2744
|
+
<ShowToastButton
|
|
2745
|
+
options={{
|
|
2746
|
+
body: 'Held',
|
|
2747
|
+
autoHideDuration: 3000,
|
|
2748
|
+
endContent: <Button label="Undo" />,
|
|
2749
|
+
onHide,
|
|
2750
|
+
}}
|
|
2751
|
+
triggerLabel="Show held"
|
|
2752
|
+
/>,
|
|
2753
|
+
);
|
|
2754
|
+
act(() => {
|
|
2755
|
+
fireEvent.click(screen.getByText('Show held'));
|
|
2756
|
+
});
|
|
2757
|
+
const viewport = screen.getByRole('region', {name: 'Notifications'});
|
|
2758
|
+
const card = within(viewport).getByText('Held').closest('[role="status"]');
|
|
2759
|
+
if (!(card instanceof HTMLElement)) {
|
|
2760
|
+
throw new Error('toast card not found');
|
|
2761
|
+
}
|
|
2762
|
+
return {card, action: within(card).getByRole('button', {name: 'Undo'})};
|
|
2763
|
+
}
|
|
2764
|
+
|
|
2765
|
+
it('keeps the timer paused while focus is inside after the pointer leaves', () => {
|
|
2766
|
+
vi.useFakeTimers();
|
|
2767
|
+
try {
|
|
2768
|
+
const onHide = vi.fn();
|
|
2769
|
+
const {card, action} = showPausableToast(onHide);
|
|
2770
|
+
act(() => {
|
|
2771
|
+
fireEvent.mouseEnter(card);
|
|
2772
|
+
});
|
|
2773
|
+
act(() => {
|
|
2774
|
+
action.focus();
|
|
2775
|
+
});
|
|
2776
|
+
act(() => {
|
|
2777
|
+
fireEvent.mouseLeave(card);
|
|
2778
|
+
});
|
|
2779
|
+
act(() => {
|
|
2780
|
+
vi.advanceTimersByTime(60_000);
|
|
2781
|
+
});
|
|
2782
|
+
expect(onHide).not.toHaveBeenCalled();
|
|
2783
|
+
// Focus leaving the card releases the last hold.
|
|
2784
|
+
act(() => {
|
|
2785
|
+
action.blur();
|
|
2786
|
+
});
|
|
2787
|
+
act(() => {
|
|
2788
|
+
vi.advanceTimersByTime(60_000);
|
|
2789
|
+
});
|
|
2790
|
+
expect(onHide).toHaveBeenCalledWith('auto');
|
|
2791
|
+
} finally {
|
|
2792
|
+
vi.useRealTimers();
|
|
2793
|
+
}
|
|
2794
|
+
});
|
|
2795
|
+
|
|
2796
|
+
it('keeps the timer paused while the pointer is over it after the window regains focus', () => {
|
|
2797
|
+
vi.useFakeTimers();
|
|
2798
|
+
try {
|
|
2799
|
+
const onHide = vi.fn();
|
|
2800
|
+
const {card} = showPausableToast(onHide);
|
|
2801
|
+
act(() => {
|
|
2802
|
+
fireEvent.blur(window);
|
|
2803
|
+
});
|
|
2804
|
+
act(() => {
|
|
2805
|
+
fireEvent.mouseEnter(card);
|
|
2806
|
+
});
|
|
2807
|
+
act(() => {
|
|
2808
|
+
fireEvent.focus(window);
|
|
2809
|
+
});
|
|
2810
|
+
act(() => {
|
|
2811
|
+
vi.advanceTimersByTime(60_000);
|
|
2812
|
+
});
|
|
2813
|
+
expect(onHide).not.toHaveBeenCalled();
|
|
2814
|
+
act(() => {
|
|
2815
|
+
fireEvent.mouseLeave(card);
|
|
2816
|
+
});
|
|
2817
|
+
act(() => {
|
|
2818
|
+
vi.advanceTimersByTime(60_000);
|
|
2819
|
+
});
|
|
2820
|
+
expect(onHide).toHaveBeenCalledWith('auto');
|
|
2821
|
+
} finally {
|
|
2822
|
+
vi.useRealTimers();
|
|
2823
|
+
}
|
|
2824
|
+
});
|
|
2825
|
+
|
|
2826
|
+
it('releases the focus hold when the focused control is removed', () => {
|
|
2827
|
+
vi.useFakeTimers();
|
|
2828
|
+
try {
|
|
2829
|
+
const onHide = vi.fn();
|
|
2830
|
+
const {card, action} = showPausableToast(onHide);
|
|
2831
|
+
act(() => {
|
|
2832
|
+
fireEvent.mouseEnter(card);
|
|
2833
|
+
});
|
|
2834
|
+
act(() => {
|
|
2835
|
+
action.focus();
|
|
2836
|
+
});
|
|
2837
|
+
// A control that unmounts while focused fires no blur.
|
|
2838
|
+
act(() => {
|
|
2839
|
+
action.remove();
|
|
2840
|
+
});
|
|
2841
|
+
act(() => {
|
|
2842
|
+
fireEvent.mouseLeave(card);
|
|
2843
|
+
});
|
|
2844
|
+
act(() => {
|
|
2845
|
+
vi.advanceTimersByTime(60_000);
|
|
2846
|
+
});
|
|
2847
|
+
expect(onHide).toHaveBeenCalledWith('auto');
|
|
2848
|
+
} finally {
|
|
2849
|
+
vi.useRealTimers();
|
|
2850
|
+
}
|
|
2851
|
+
});
|
|
2852
|
+
|
|
2853
|
+
it('keeps the timer paused while focus moves between controls inside the card', () => {
|
|
2854
|
+
vi.useFakeTimers();
|
|
2855
|
+
try {
|
|
2856
|
+
const onHide = vi.fn();
|
|
2857
|
+
const {card, action} = showPausableToast(onHide);
|
|
2858
|
+
const dismiss = within(card)
|
|
2859
|
+
.getAllByRole('button')
|
|
2860
|
+
.find(button => button !== action);
|
|
2861
|
+
if (!dismiss) {
|
|
2862
|
+
throw new Error('dismiss button not found');
|
|
2863
|
+
}
|
|
2864
|
+
act(() => {
|
|
2865
|
+
action.focus();
|
|
2866
|
+
});
|
|
2867
|
+
act(() => {
|
|
2868
|
+
vi.advanceTimersByTime(2_000);
|
|
2869
|
+
});
|
|
2870
|
+
act(() => {
|
|
2871
|
+
dismiss.focus();
|
|
2872
|
+
});
|
|
2873
|
+
// Moving between the card's own controls neither restarts nor resumes
|
|
2874
|
+
// the timer.
|
|
2875
|
+
act(() => {
|
|
2876
|
+
vi.advanceTimersByTime(60_000);
|
|
2877
|
+
});
|
|
2878
|
+
expect(onHide).not.toHaveBeenCalled();
|
|
2879
|
+
} finally {
|
|
2880
|
+
vi.useRealTimers();
|
|
2881
|
+
}
|
|
2882
|
+
});
|
|
2883
|
+
|
|
2087
2884
|
it('keeps a window-blur pause alive when another toast arrives', () => {
|
|
2088
2885
|
vi.useFakeTimers();
|
|
2089
2886
|
try {
|