@astryxdesign/core 0.7.5 → 0.7.6-canary.00507ba
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/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/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 +7 -3
- 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.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- 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 +2 -1
- 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 +93 -59
- 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/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- 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/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- 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/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- 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/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/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- 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 +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- 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/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +21 -4
- package/dist/gestures/GestureArena.d.ts +6 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +39 -0
- package/dist/gestures/GestureHost.d.ts +352 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +10 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +16 -0
- 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/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/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/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/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +6 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +6 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- 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/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.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- 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/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/locales/en.json +27 -3
- package/locales/pseudo.json +18 -0
- 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/ChatComposerTokenElement.spec.md +45 -33
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- 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 +37 -0
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +76 -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/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- 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.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +10 -3
- 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.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 +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- 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.tsx +2 -1
- 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 +348 -1
- package/src/Layer/useLayer.tsx +118 -71
- 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/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- 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/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- 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/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 +27 -0
- 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/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/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- 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 +45 -48
- 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 +14 -20
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +719 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- 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/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +35 -0
- package/src/gestures/GestureHost.ts +2065 -0
- package/src/gestures/GestureRecognizer.ts +18 -0
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -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 +2087 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -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 +5 -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 +21 -2
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/haptics.ts +203 -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/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/generated-locales/en.generated.ts +7 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- 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/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/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 +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file useScrollOverflow.test.tsx
|
|
5
5
|
* @input Uses vitest, @testing-library/react, useScrollOverflow
|
|
6
|
-
* @output Unit tests for the hook's measurement
|
|
6
|
+
* @output Unit tests for the hook's measurement, what it observes (the
|
|
7
|
+
* container's scroll and size, and its content), and its rendered-only gate
|
|
7
8
|
* @position Testing; jsdom lays nothing out, so the scroll box is faked and
|
|
8
9
|
* `checkVisibility` is stubbed per element.
|
|
9
10
|
*/
|
|
@@ -18,7 +19,10 @@ import {useScrollOverflow} from './useScrollOverflow';
|
|
|
18
19
|
let deliverResize: ((entries: ResizeObserverEntry[]) => void) | null = null;
|
|
19
20
|
|
|
20
21
|
class FakeResizeObserver implements ResizeObserver {
|
|
22
|
+
/** The shared observer, so a test can read what it observes. */
|
|
23
|
+
static last: FakeResizeObserver | null = null;
|
|
21
24
|
constructor(callback: ResizeObserverCallback) {
|
|
25
|
+
FakeResizeObserver.last = this;
|
|
22
26
|
deliverResize = entries => callback(entries, this);
|
|
23
27
|
}
|
|
24
28
|
observe = vi.fn();
|
|
@@ -69,7 +73,9 @@ beforeEach(() => {
|
|
|
69
73
|
|
|
70
74
|
afterEach(() => {
|
|
71
75
|
vi.unstubAllGlobals();
|
|
76
|
+
vi.restoreAllMocks();
|
|
72
77
|
deliverResize = null;
|
|
78
|
+
FakeResizeObserver.last = null;
|
|
73
79
|
});
|
|
74
80
|
|
|
75
81
|
describe('useScrollOverflow', () => {
|
|
@@ -200,6 +206,101 @@ describe('useScrollOverflow', () => {
|
|
|
200
206
|
unmount();
|
|
201
207
|
});
|
|
202
208
|
|
|
209
|
+
// The overflow is the content's width against the container's: it changes
|
|
210
|
+
// when the content does, with the container keeping its size.
|
|
211
|
+
it('measures again when a child is added or removed, though the container keeps its size', async () => {
|
|
212
|
+
const el = document.createElement('div');
|
|
213
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
214
|
+
stubRendered(el, true);
|
|
215
|
+
const {result, unmount} = renderHook(() => useScrollOverflow());
|
|
216
|
+
act(() => {
|
|
217
|
+
result.current.scrollRef(el);
|
|
218
|
+
});
|
|
219
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
220
|
+
|
|
221
|
+
const child = document.createElement('div');
|
|
222
|
+
fakeScrollBox(el, {scrollWidth: 600, clientWidth: 300});
|
|
223
|
+
await act(async () => {
|
|
224
|
+
el.append(child);
|
|
225
|
+
});
|
|
226
|
+
expect(result.current.hasOverflow).toBe(true);
|
|
227
|
+
|
|
228
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
229
|
+
await act(async () => {
|
|
230
|
+
child.remove();
|
|
231
|
+
});
|
|
232
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
233
|
+
unmount();
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('measures again when a child resizes, though the container keeps its size', () => {
|
|
237
|
+
const el = document.createElement('div');
|
|
238
|
+
const child = document.createElement('div');
|
|
239
|
+
el.append(child);
|
|
240
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
241
|
+
stubRendered(el, true);
|
|
242
|
+
const {result, unmount} = renderHook(() => useScrollOverflow());
|
|
243
|
+
act(() => {
|
|
244
|
+
result.current.scrollRef(el);
|
|
245
|
+
});
|
|
246
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
247
|
+
|
|
248
|
+
// The child's content grows past the container.
|
|
249
|
+
fakeScrollBox(el, {scrollWidth: 600, clientWidth: 300});
|
|
250
|
+
act(() => {
|
|
251
|
+
deliverResize?.([resizeEntry(child)]);
|
|
252
|
+
});
|
|
253
|
+
expect(result.current.hasOverflow).toBe(true);
|
|
254
|
+
unmount();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("measures again when the container's class or style changes, as a new gap does", async () => {
|
|
258
|
+
const el = document.createElement('div');
|
|
259
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
260
|
+
stubRendered(el, true);
|
|
261
|
+
const {result, unmount} = renderHook(() => useScrollOverflow());
|
|
262
|
+
act(() => {
|
|
263
|
+
result.current.scrollRef(el);
|
|
264
|
+
});
|
|
265
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
266
|
+
|
|
267
|
+
fakeScrollBox(el, {scrollWidth: 340, clientWidth: 300});
|
|
268
|
+
await act(async () => {
|
|
269
|
+
el.className = 'wider-gap';
|
|
270
|
+
});
|
|
271
|
+
expect(result.current.hasOverflow).toBe(true);
|
|
272
|
+
|
|
273
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
274
|
+
await act(async () => {
|
|
275
|
+
el.style.columnGap = '0px';
|
|
276
|
+
});
|
|
277
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
278
|
+
unmount();
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('stops observing the content when the container detaches', () => {
|
|
282
|
+
const el = document.createElement('div');
|
|
283
|
+
const child = document.createElement('div');
|
|
284
|
+
el.append(child);
|
|
285
|
+
fakeScrollBox(el, {scrollWidth: 300, clientWidth: 300});
|
|
286
|
+
stubRendered(el, true);
|
|
287
|
+
const disconnect = vi.spyOn(MutationObserver.prototype, 'disconnect');
|
|
288
|
+
const {result, unmount} = renderHook(() => useScrollOverflow());
|
|
289
|
+
act(() => {
|
|
290
|
+
result.current.scrollRef(el);
|
|
291
|
+
});
|
|
292
|
+
const observer = FakeResizeObserver.last;
|
|
293
|
+
expect(observer?.observe).toHaveBeenCalledWith(child);
|
|
294
|
+
|
|
295
|
+
act(() => {
|
|
296
|
+
result.current.scrollRef(null);
|
|
297
|
+
});
|
|
298
|
+
expect(disconnect).toHaveBeenCalled();
|
|
299
|
+
expect(observer?.unobserve).toHaveBeenCalledWith(child);
|
|
300
|
+
expect(observer?.unobserve).toHaveBeenCalledWith(el);
|
|
301
|
+
unmount();
|
|
302
|
+
});
|
|
303
|
+
|
|
203
304
|
it('follows a scroll on a rendered container', () => {
|
|
204
305
|
const el = document.createElement('div');
|
|
205
306
|
fakeScrollBox(el, {scrollWidth: 600, clientWidth: 300});
|
|
@@ -10,12 +10,15 @@
|
|
|
10
10
|
* state
|
|
11
11
|
*
|
|
12
12
|
* Observes a scroll container and reports whether content overflows at the
|
|
13
|
-
* start, end, or both edges. Updates on every scroll, and
|
|
14
|
-
*
|
|
13
|
+
* start, end, or both edges. Updates on every scroll, and while the container
|
|
14
|
+
* is rendered on what else changes the overflow with or without the
|
|
15
|
+
* container resizing: its own size, a child's size (a slide's content
|
|
16
|
+
* growing), a child added or removed, and its class or style (a new gap or
|
|
17
|
+
* padding). A layout read on an element the browser is not
|
|
15
18
|
* rendering (an ancestor with `display: none`, or a `content-visibility:
|
|
16
19
|
* hidden` subtree) either answers zeros or makes the browser lay out that
|
|
17
|
-
* whole hidden subtree for the answer, so
|
|
18
|
-
*
|
|
20
|
+
* whole hidden subtree for the answer, so an observation delivered for a
|
|
21
|
+
* hidden container, and the measurement at registration inside one, are
|
|
19
22
|
* skipped; the hook keeps its last state until the resize observation that
|
|
20
23
|
* follows the reveal (one frame after it paints). A scroll is measured
|
|
21
24
|
* whether or not the container is rendered: a scroll of a hidden container
|
|
@@ -52,11 +55,57 @@ function isRendered(el: HTMLElement): boolean {
|
|
|
52
55
|
return typeof el.checkVisibility !== 'function' || el.checkVisibility();
|
|
53
56
|
}
|
|
54
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Observes what changes `el`'s overflow besides its scroll: its own size,
|
|
60
|
+
* each child's size, the children added or removed, and its class or style.
|
|
61
|
+
* Returns the teardown, which ends every observation.
|
|
62
|
+
*/
|
|
63
|
+
function observeContent(el: HTMLElement, measure: () => void): () => void {
|
|
64
|
+
const unobserveContainer = observeResize(el, measure);
|
|
65
|
+
const unobserveChildren = new Map<Element, () => void>();
|
|
66
|
+
const followChildren = () => {
|
|
67
|
+
const children = new Set(el.children);
|
|
68
|
+
for (const [child, unobserve] of unobserveChildren) {
|
|
69
|
+
if (!children.has(child)) {
|
|
70
|
+
unobserve();
|
|
71
|
+
unobserveChildren.delete(child);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const child of children) {
|
|
75
|
+
if (!unobserveChildren.has(child)) {
|
|
76
|
+
unobserveChildren.set(child, observeResize(child, measure));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
followChildren();
|
|
81
|
+
const mutations =
|
|
82
|
+
typeof MutationObserver === 'function'
|
|
83
|
+
? new MutationObserver(() => {
|
|
84
|
+
followChildren();
|
|
85
|
+
measure();
|
|
86
|
+
})
|
|
87
|
+
: null;
|
|
88
|
+
mutations?.observe(el, {
|
|
89
|
+
childList: true,
|
|
90
|
+
attributes: true,
|
|
91
|
+
attributeFilter: ['class', 'style'],
|
|
92
|
+
});
|
|
93
|
+
return () => {
|
|
94
|
+
mutations?.disconnect();
|
|
95
|
+
for (const unobserve of unobserveChildren.values()) {
|
|
96
|
+
unobserve();
|
|
97
|
+
}
|
|
98
|
+
unobserveChildren.clear();
|
|
99
|
+
unobserveContainer();
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
55
103
|
/**
|
|
56
104
|
* Tracks scroll overflow state for a horizontally scrollable container.
|
|
57
105
|
*
|
|
58
106
|
* Returns a ref callback to attach to the scroll container and a state
|
|
59
|
-
* object that updates as the user scrolls
|
|
107
|
+
* object that updates as the user scrolls, the container resizes, or its
|
|
108
|
+
* content changes.
|
|
60
109
|
*
|
|
61
110
|
* @example
|
|
62
111
|
* ```
|
|
@@ -95,10 +144,10 @@ export function useScrollOverflow() {
|
|
|
95
144
|
});
|
|
96
145
|
}, []);
|
|
97
146
|
|
|
98
|
-
// Registration and
|
|
99
|
-
// edges to report, and reading its layout would make the
|
|
100
|
-
// the hidden subtree it sits in; the resize observation that
|
|
101
|
-
// reveal measures again.
|
|
147
|
+
// Registration, resize and content changes: only a rendered container. A
|
|
148
|
+
// hidden one has no edges to report, and reading its layout would make the
|
|
149
|
+
// browser render the hidden subtree it sits in; the resize observation that
|
|
150
|
+
// follows the reveal measures again.
|
|
102
151
|
const measure = useCallback(() => {
|
|
103
152
|
const el = elRef.current;
|
|
104
153
|
if (el && isRendered(el)) {
|
|
@@ -129,7 +178,7 @@ export function useScrollOverflow() {
|
|
|
129
178
|
|
|
130
179
|
if (el) {
|
|
131
180
|
el.addEventListener('scroll', measureOnScroll, {passive: true});
|
|
132
|
-
unobserveRef.current =
|
|
181
|
+
unobserveRef.current = observeContent(el, measure);
|
|
133
182
|
}
|
|
134
183
|
},
|
|
135
184
|
[measure, measureOnScroll],
|
|
@@ -230,9 +230,12 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
230
230
|
'@astryx.sideNav.label': 'Side navigation',
|
|
231
231
|
'@astryx.sideNav.resizeSidebar': 'Resize sidebar',
|
|
232
232
|
'@astryx.sideNav.heading.openMenu': 'Open menu',
|
|
233
|
+
'@astryx.slider.minimumThumb': 'Minimum value',
|
|
234
|
+
'@astryx.slider.maximumThumb': 'Maximum value',
|
|
233
235
|
'@astryx.tabList.label': 'Tabs',
|
|
234
236
|
'@astryx.table.label': 'Table',
|
|
235
237
|
'@astryx.table.noData': 'No data',
|
|
238
|
+
'@astryx.table.columnResize.resizeColumn': 'Resize column {label}',
|
|
236
239
|
'@astryx.table.filter.allPlaceholder': 'All',
|
|
237
240
|
'@astryx.table.filter.reset': 'Reset',
|
|
238
241
|
'@astryx.table.filter.apply': 'Apply',
|
|
@@ -427,6 +430,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
427
430
|
'@astryx.tableTree.expandRow': 'Expand row',
|
|
428
431
|
'@astryx.tableTree.collapseAllRows': 'Collapse all rows',
|
|
429
432
|
'@astryx.tableTree.expandAllRows': 'Expand all rows',
|
|
433
|
+
'@astryx.textArea.counter': '{count, number}/{limit, number}',
|
|
430
434
|
'@astryx.textArea.charactersRemaining':
|
|
431
435
|
'{count, number} {count, plural, one {character} other {characters}} remaining',
|
|
432
436
|
'@astryx.textArea.charactersOverLimit':
|
|
@@ -449,6 +453,8 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
449
453
|
'@astryx.multiSelector.allSelected': 'All selected',
|
|
450
454
|
'@astryx.multiSelector.selectionCount':
|
|
451
455
|
'{count, number} of {total, number} selected',
|
|
456
|
+
'@astryx.multiSelector.selectedCount':
|
|
457
|
+
'{count, plural, one {# selected} other {# selected}}',
|
|
452
458
|
'@astryx.multiSelector.createOption': 'Create "{query}"',
|
|
453
459
|
'@astryx.multiSelector.optionCreated': '{label} created',
|
|
454
460
|
'@astryx.multiSelector.emptySearchResults': 'No results found',
|
|
@@ -595,6 +601,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
595
601
|
'@astryx.comments.resolveFailed': "This thread couldn't be resolved.",
|
|
596
602
|
'@astryx.comments.resolved': 'Resolved',
|
|
597
603
|
'@astryx.comments.resolvedBy': 'Resolved by {name}',
|
|
604
|
+
'@astryx.comments.errorAnnouncement': '{title} {description}',
|
|
598
605
|
'@astryx.comments.retryFailed': "Retrying didn't work.",
|
|
599
606
|
'@astryx.comments.sendFailed': "Couldn't send this comment.",
|
|
600
607
|
'@astryx.comments.threadLabel': 'Thread by {name}',
|
|
@@ -236,9 +236,12 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
236
236
|
'@astryx.sideNav.label': '⟦Šíðé ñàṽíĝàţíóñ⟧',
|
|
237
237
|
'@astryx.sideNav.resizeSidebar': '⟦Řéšížé šíðéƀàř⟧',
|
|
238
238
|
'@astryx.sideNav.heading.openMenu': '⟦Óþéñ ɱéñú⟧',
|
|
239
|
+
'@astryx.slider.minimumThumb': '⟦Ṁíñíɱúɱ ṽàłúé⟧',
|
|
240
|
+
'@astryx.slider.maximumThumb': '⟦Ṁàẋíɱúɱ ṽàłúé⟧',
|
|
239
241
|
'@astryx.tabList.label': '⟦Ţàƀš⟧',
|
|
240
242
|
'@astryx.table.label': '⟦Ţàƀłé⟧',
|
|
241
243
|
'@astryx.table.noData': '⟦Ñó ðàţà⟧',
|
|
244
|
+
'@astryx.table.columnResize.resizeColumn': '⟦Řéšížé çółúɱñ {label}⟧',
|
|
242
245
|
'@astryx.table.filter.allPlaceholder': '⟦Àłł⟧',
|
|
243
246
|
'@astryx.table.filter.reset': '⟦Řéšéţ⟧',
|
|
244
247
|
'@astryx.table.filter.apply': '⟦Àþþłý⟧',
|
|
@@ -436,6 +439,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
436
439
|
'@astryx.tableTree.expandRow': '⟦Éẋþàñð řóŵ⟧',
|
|
437
440
|
'@astryx.tableTree.collapseAllRows': '⟦Çółłàþšé àłł řóŵš⟧',
|
|
438
441
|
'@astryx.tableTree.expandAllRows': '⟦Éẋþàñð àłł řóŵš⟧',
|
|
442
|
+
'@astryx.textArea.counter': '⟦{count, number}/{limit, number}⟧',
|
|
439
443
|
'@astryx.textArea.charactersRemaining':
|
|
440
444
|
'⟦{count, number} {count, plural, one {character} other {characters}} řéɱàíñíñĝ⟧',
|
|
441
445
|
'@astryx.textArea.charactersOverLimit':
|
|
@@ -458,6 +462,8 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
458
462
|
'@astryx.multiSelector.allSelected': '⟦Àłł šéłéçţéð⟧',
|
|
459
463
|
'@astryx.multiSelector.selectionCount':
|
|
460
464
|
'⟦{count, number} óƒ {total, number} šéłéçţéð⟧',
|
|
465
|
+
'@astryx.multiSelector.selectedCount':
|
|
466
|
+
'⟦{count, plural, one {# selected} other {# selected}}⟧',
|
|
461
467
|
'@astryx.multiSelector.createOption': '⟦Çřéàţé "{query}"⟧',
|
|
462
468
|
'@astryx.multiSelector.optionCreated': '⟦{label} çřéàţéð⟧',
|
|
463
469
|
'@astryx.multiSelector.emptySearchResults': '⟦Ñó řéšúłţš ƒóúñð⟧',
|
|
@@ -606,6 +612,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
|
|
|
606
612
|
'@astryx.comments.resolveFailed': "⟦Ţĥíš ţĥřéàð çóúłðñ'ţ ƀé řéšółṽéð.⟧",
|
|
607
613
|
'@astryx.comments.resolved': '⟦Řéšółṽéð⟧',
|
|
608
614
|
'@astryx.comments.resolvedBy': '⟦Řéšółṽéð ƀý {name}⟧',
|
|
615
|
+
'@astryx.comments.errorAnnouncement': '⟦{title} {description}⟧',
|
|
609
616
|
'@astryx.comments.retryFailed': "⟦Řéţřýíñĝ ðíðñ'ţ ŵóřķ.⟧",
|
|
610
617
|
'@astryx.comments.sendFailed': "⟦Çóúłðñ'ţ šéñð ţĥíš çóɱɱéñţ.⟧",
|
|
611
618
|
'@astryx.comments.threadLabel': '⟦Ţĥřéàð ƀý {name}⟧',
|
package/src/motion/README.md
CHANGED
|
@@ -81,7 +81,10 @@ await handle.finished; // true if it ran to the end, false if interrupted
|
|
|
81
81
|
- Promotion: every animation the animator creates, and every `set`, gives its
|
|
82
82
|
channels a compositing layer in the same task (inline `will-change`, merged
|
|
83
83
|
with the element's own), cleared 500 ms after the last motion. Mobile Safari
|
|
84
|
-
needs it to run a curve through a blocked main thread.
|
|
84
|
+
needs it to run a curve through a blocked main thread. A pseudo-element is
|
|
85
|
+
promoted through `--astryx-motion-will-change-<pseudo>` on its host; its
|
|
86
|
+
style opts in with
|
|
87
|
+
`willChange: 'var(--astryx-motion-will-change-before, auto)'`.
|
|
85
88
|
- `atRest(properties)` resolves once none of them is moving, after the last
|
|
86
89
|
curve ends, whoever started it.
|
|
87
90
|
- `rebase({y: -shift})` moves properties at once, as a layout shift does; a
|
|
@@ -121,6 +124,13 @@ await handle.finished; // true if it ran to the end, false if interrupted
|
|
|
121
124
|
- `animatorFor(element)` returns the one animator for an element, so code
|
|
122
125
|
that animates it from several places (a swipe on x, a removal on y)
|
|
123
126
|
composes in one `translate` track.
|
|
127
|
+
- `createAnimator(dialog, {pseudoElement: '::backdrop'})` drives a
|
|
128
|
+
pseudo-element; with no inline style to hold it, a static filling animation
|
|
129
|
+
holds its end value until the next animation replaces it, while the
|
|
130
|
+
pseudo-element exists. A dialog's `::backdrop` is made again each time the
|
|
131
|
+
dialog opens, so a presentation `set`s its starting value right after
|
|
132
|
+
`showModal()`, in the same task (a `set` before it lands on the backdrop
|
|
133
|
+
the open replaces).
|
|
124
134
|
|
|
125
135
|
### How it stays on the compositor
|
|
126
136
|
|
|
@@ -67,18 +67,23 @@ const requestFrame = (callback: () => void) => {
|
|
|
67
67
|
* properties, so the page is modeled here).
|
|
68
68
|
*/
|
|
69
69
|
let stylesheet: Record<string, string> = {};
|
|
70
|
+
/** The stylesheet's values for a pseudo-element of the element. */
|
|
71
|
+
let pseudoStylesheet: Record<string, string> = {};
|
|
70
72
|
|
|
71
73
|
beforeEach(() => {
|
|
72
74
|
clock = 1000;
|
|
73
75
|
recorded = [];
|
|
74
76
|
frameQueue = [];
|
|
75
77
|
stylesheet = {};
|
|
78
|
+
pseudoStylesheet = {};
|
|
76
79
|
vi.spyOn(window, 'getComputedStyle').mockImplementation(
|
|
77
|
-
element =>
|
|
80
|
+
(element, pseudo) =>
|
|
78
81
|
({
|
|
79
82
|
getPropertyValue: (property: string) =>
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
pseudo != null
|
|
84
|
+
? (pseudoStylesheet[property] ?? '')
|
|
85
|
+
: (element as HTMLElement).style.getPropertyValue(property) ||
|
|
86
|
+
(stylesheet[property] ?? ''),
|
|
82
87
|
}) as unknown as CSSStyleDeclaration,
|
|
83
88
|
);
|
|
84
89
|
vi.useFakeTimers();
|
|
@@ -799,6 +804,12 @@ describe('animatorFor: one animator per element', () => {
|
|
|
799
804
|
const b = document.createElement('div');
|
|
800
805
|
expect(animatorFor(a)).toBe(animatorFor(a));
|
|
801
806
|
expect(animatorFor(a)).not.toBe(animatorFor(b));
|
|
807
|
+
expect(animatorFor(a, {pseudoElement: '::backdrop'})).toBe(
|
|
808
|
+
animatorFor(a, {pseudoElement: '::backdrop'}),
|
|
809
|
+
);
|
|
810
|
+
expect(animatorFor(a, {pseudoElement: '::backdrop'})).not.toBe(
|
|
811
|
+
animatorFor(a),
|
|
812
|
+
);
|
|
802
813
|
});
|
|
803
814
|
|
|
804
815
|
it('composes two callers’ axes in one translate track', async () => {
|
|
@@ -902,6 +913,24 @@ describe('promotion: a compositing layer while it moves', () => {
|
|
|
902
913
|
expect(element.style.willChange).toBe('');
|
|
903
914
|
});
|
|
904
915
|
|
|
916
|
+
it('promotes a pseudo-element through a custom property on its host', async () => {
|
|
917
|
+
const {animator, element} = setup({pseudoElement: '::backdrop'});
|
|
918
|
+
animator.set({opacity: 0});
|
|
919
|
+
// set() promotes a pseudo-element too.
|
|
920
|
+
expect(
|
|
921
|
+
element.style.getPropertyValue('--astryx-motion-will-change-backdrop'),
|
|
922
|
+
).toBe('opacity');
|
|
923
|
+
animator.animate({opacity: 1}, {spring: springs.alertPresent});
|
|
924
|
+
expect(
|
|
925
|
+
element.style.getPropertyValue('--astryx-motion-will-change-backdrop'),
|
|
926
|
+
).toBe('opacity');
|
|
927
|
+
expect(element.style.willChange).toBe('');
|
|
928
|
+
await advance(5000 + PROMOTION_LINGER_MS);
|
|
929
|
+
expect(
|
|
930
|
+
element.style.getPropertyValue('--astryx-motion-will-change-backdrop'),
|
|
931
|
+
).toBe('');
|
|
932
|
+
});
|
|
933
|
+
|
|
905
934
|
it('ends promotion on the element it leaves', () => {
|
|
906
935
|
const {animator, element} = setup();
|
|
907
936
|
animator.animate({x: 50}, {spring: springs.settle});
|
|
@@ -1937,6 +1966,75 @@ describe('Reduced Motion (design:reduced-motion)', () => {
|
|
|
1937
1966
|
expect(element.style.translate).toBe('100px 0px');
|
|
1938
1967
|
});
|
|
1939
1968
|
|
|
1969
|
+
it("a pseudo-element's dip borrows its own opacity and hands it back without touching the host", async () => {
|
|
1970
|
+
for (const role of [undefined, 'exit'] as const) {
|
|
1971
|
+
const {animator, element} = setup({
|
|
1972
|
+
reduced: true,
|
|
1973
|
+
coarse: true,
|
|
1974
|
+
pseudoElement: '::before',
|
|
1975
|
+
});
|
|
1976
|
+
element.style.opacity = '0.5'; // the host's own, untouched
|
|
1977
|
+
pseudoStylesheet = {opacity: '0.3'};
|
|
1978
|
+
animator.animate(
|
|
1979
|
+
{x: 100},
|
|
1980
|
+
{spring: springs.navigationPush},
|
|
1981
|
+
role == null ? {} : {crossfadeAs: role},
|
|
1982
|
+
);
|
|
1983
|
+
await commitFrame(clock);
|
|
1984
|
+
const [fadeLayer] = live('opacity');
|
|
1985
|
+
const values = fadeLayer.keyframes.map(k => Number(k.opacity));
|
|
1986
|
+
expect(Math.max(...values)).toBeCloseTo(0.3, 9);
|
|
1987
|
+
await advance(fade * 2 + END_HOLD_MS + 1);
|
|
1988
|
+
expect(animator.get('x')).toBe(100);
|
|
1989
|
+
// The pseudo-element's stylesheet owns its opacity again; the host
|
|
1990
|
+
// keeps its own.
|
|
1991
|
+
expect(live('opacity')).toEqual([]);
|
|
1992
|
+
expect(element.style.opacity).toBe('0.5');
|
|
1993
|
+
}
|
|
1994
|
+
});
|
|
1995
|
+
|
|
1996
|
+
it("a pseudo-element's identity hold follows a node replacement", () => {
|
|
1997
|
+
const {animator, element} = setup({pseudoElement: '::backdrop'});
|
|
1998
|
+
pseudoStylesheet = {opacity: '0'};
|
|
1999
|
+
animator.set({opacity: 1});
|
|
2000
|
+
animator.attach(null);
|
|
2001
|
+
const next = document.createElement('div');
|
|
2002
|
+
document.body.append(next);
|
|
2003
|
+
animator.attach(next);
|
|
2004
|
+
const held = live('opacity').filter(
|
|
2005
|
+
animation => animation.element === next,
|
|
2006
|
+
);
|
|
2007
|
+
expect(held).toHaveLength(1);
|
|
2008
|
+
expect(Number(held[0].keyframes.at(-1)!.opacity)).toBe(1);
|
|
2009
|
+
expect(live('opacity').some(a => a.element === element)).toBe(false);
|
|
2010
|
+
next.remove();
|
|
2011
|
+
});
|
|
2012
|
+
|
|
2013
|
+
it('a pseudo-element shown over a hiding stylesheet keeps its own opacity through a move', async () => {
|
|
2014
|
+
for (const role of [undefined, 'entrance'] as const) {
|
|
2015
|
+
const {animator} = setup({
|
|
2016
|
+
reduced: true,
|
|
2017
|
+
coarse: true,
|
|
2018
|
+
pseudoElement: '::backdrop',
|
|
2019
|
+
});
|
|
2020
|
+
pseudoStylesheet = {opacity: '0'};
|
|
2021
|
+
animator.set({opacity: 1});
|
|
2022
|
+
animator.animate(
|
|
2023
|
+
{x: 100},
|
|
2024
|
+
{spring: springs.navigationPush},
|
|
2025
|
+
role == null ? {} : {crossfadeAs: role},
|
|
2026
|
+
);
|
|
2027
|
+
await commitFrame(clock);
|
|
2028
|
+
for (let step = 0; step < 8; step++) {
|
|
2029
|
+
await advance(fade / 4);
|
|
2030
|
+
}
|
|
2031
|
+
expect(animator.get('x')).toBe(100);
|
|
2032
|
+
expect(animator.get('opacity')).toBe(1);
|
|
2033
|
+
const [held] = live('opacity');
|
|
2034
|
+
expect(Number(held.keyframes.at(-1)?.opacity)).toBe(1);
|
|
2035
|
+
}
|
|
2036
|
+
});
|
|
2037
|
+
|
|
1940
2038
|
it('a move dips: fades out, lands while transparent, fades back in', async () => {
|
|
1941
2039
|
const {animator, element} = reduced();
|
|
1942
2040
|
animator.animate({x: 100}, {spring: springs.navigationPush});
|
|
@@ -2555,6 +2653,56 @@ describe('decay: momentum curves (a coast)', () => {
|
|
|
2555
2653
|
});
|
|
2556
2654
|
});
|
|
2557
2655
|
|
|
2656
|
+
describe('pseudoElement: a dialog\u2019s ::backdrop', () => {
|
|
2657
|
+
it('targets the pseudo-element, writes no inline style and holds the end state', async () => {
|
|
2658
|
+
const {animator, element} = setup({pseudoElement: '::backdrop'});
|
|
2659
|
+
animator.set({opacity: 0});
|
|
2660
|
+
const [held] = live('opacity');
|
|
2661
|
+
expect(held.options).toMatchObject({
|
|
2662
|
+
fill: 'both',
|
|
2663
|
+
pseudoElement: '::backdrop',
|
|
2664
|
+
});
|
|
2665
|
+
expect(held.keyframes.map(k => k.opacity)).toEqual(['0', '0']);
|
|
2666
|
+
expect(element.style.opacity).toBe('');
|
|
2667
|
+
|
|
2668
|
+
animator.animate({opacity: 1}, {spring: springs.alertPresent});
|
|
2669
|
+
// The new animation exists before the hold goes: no frame in between.
|
|
2670
|
+
expect(held.cancelled).toBe(true);
|
|
2671
|
+
const [fade] = live('opacity');
|
|
2672
|
+
expect(fade.options).toMatchObject({
|
|
2673
|
+
fill: 'both',
|
|
2674
|
+
pseudoElement: '::backdrop',
|
|
2675
|
+
});
|
|
2676
|
+
expect(fade.keyframes[fade.keyframes.length - 1].opacity).toBe('1');
|
|
2677
|
+
expect(element.style.opacity).toBe('');
|
|
2678
|
+
await advance(Number(fade.options.duration) + 1000);
|
|
2679
|
+
// Past the curve's end, a static animation holds the end value.
|
|
2680
|
+
expect(fade.cancelled).toBe(true);
|
|
2681
|
+
const [rest] = live('opacity');
|
|
2682
|
+
expect(rest.options).toMatchObject({
|
|
2683
|
+
fill: 'both',
|
|
2684
|
+
pseudoElement: '::backdrop',
|
|
2685
|
+
});
|
|
2686
|
+
expect(rest.keyframes.map(k => k.opacity)).toEqual(['1', '1']);
|
|
2687
|
+
expect(animator.get('opacity')).toBe(1);
|
|
2688
|
+
});
|
|
2689
|
+
|
|
2690
|
+
it('an exit holds 0 until the next animation replaces it', async () => {
|
|
2691
|
+
const {animator} = setup({
|
|
2692
|
+
pseudoElement: '::backdrop',
|
|
2693
|
+
initial: {opacity: 1},
|
|
2694
|
+
});
|
|
2695
|
+
animator.animate({opacity: 0}, {spring: springs.alertDismiss});
|
|
2696
|
+
const [fade] = live('opacity');
|
|
2697
|
+
await advance(Number(fade.options.duration) + 1000);
|
|
2698
|
+
const [rest] = live('opacity');
|
|
2699
|
+
expect(rest.keyframes.map(k => k.opacity)).toEqual(['0', '0']);
|
|
2700
|
+
animator.animate({opacity: 1}, {spring: springs.alertPresent});
|
|
2701
|
+
expect(rest.cancelled).toBe(true);
|
|
2702
|
+
expect(live('opacity')).toHaveLength(1);
|
|
2703
|
+
});
|
|
2704
|
+
});
|
|
2705
|
+
|
|
2558
2706
|
describe('attach', () => {
|
|
2559
2707
|
it('keeps state without an element and resumes the curve on attach', () => {
|
|
2560
2708
|
const animator = createAnimator(null, {
|