@hanzogui/kitchen-sink 3.0.5
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/.detoxrc.js +130 -0
- package/.env.production +2 -0
- package/.maestro/config.yaml +4 -0
- package/.maestro/flows/shorthand-variables.yaml +23 -0
- package/.watchmanconfig +1 -0
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/app.json +43 -0
- package/assets/adaptive-icon.png +0 -0
- package/assets/favicon.png +0 -0
- package/assets/icon.png +0 -0
- package/assets/splash.png +0 -0
- package/babel.config.js +25 -0
- package/e2e/CompilerExtraction.test.ts +147 -0
- package/e2e/GroupPressNative.test.ts +167 -0
- package/e2e/MediaQueryGtMd.test.ts +71 -0
- package/e2e/NativePortal.test.ts +113 -0
- package/e2e/PointerEvents.test.ts +116 -0
- package/e2e/PressStyleNative.noRngh.test.ts +191 -0
- package/e2e/PressStyleNative.test.ts +231 -0
- package/e2e/SafeArea.test.ts +57 -0
- package/e2e/SelectAndroidOnPress.test.ts +181 -0
- package/e2e/SelectRemount.test.ts +137 -0
- package/e2e/SheetDragResist.test.ts +370 -0
- package/e2e/SheetKeyboardDrag.test.ts +249 -0
- package/e2e/SheetScrollableDrag.test.ts +560 -0
- package/e2e/ShorthandVariables.test.ts +53 -0
- package/e2e/ThemeChangeBasic.test.ts +123 -0
- package/e2e/ThemeMutation.test.ts +80 -0
- package/e2e/check-rngh-status.test.ts +31 -0
- package/e2e/jest.config.js +19 -0
- package/e2e/utils/colors.ts +75 -0
- package/e2e/utils/navigation.ts +53 -0
- package/eas.json +22 -0
- package/flows/AlertDialog.yaml +17 -0
- package/flows/OpenApp.yaml +25 -0
- package/flows/Select.yaml +13 -0
- package/flows/Sheet.yaml +12 -0
- package/flows/Tabs.yaml +13 -0
- package/flows/Toast.yaml +14 -0
- package/flows/WarmUp.yaml +24 -0
- package/index.html +21 -0
- package/index.js +17 -0
- package/metro.config.js +64 -0
- package/next-router-shim.ts +9 -0
- package/package.json +118 -0
- package/plans/toast-2.md +471 -0
- package/playwright.config.ts +71 -0
- package/plugins/expo-modules-core-swift6.js +76 -0
- package/pod-install.sh +7 -0
- package/public/favicon.svg +70 -0
- package/public/fonts/inter.css +15 -0
- package/public/fonts/noto-cn.otf +0 -0
- package/public/gui-icon.svg +68 -0
- package/run-detox.sh +230 -0
- package/run-native-tests.sh +4 -0
- package/run-tests-parallel.ts +195 -0
- package/screenshots/Screenshotter.test.tsx +48 -0
- package/src/AnimationDemos.tsx +131 -0
- package/src/App.native.tsx +121 -0
- package/src/App.tsx +121 -0
- package/src/Navigation.tsx +98 -0
- package/src/Sandbox.tsx +87 -0
- package/src/TestDynamicEval.tsx +33 -0
- package/src/TestNativeSheet.tsx +100 -0
- package/src/components/TimedRender.tsx +18 -0
- package/src/constants/test-ids.ts +52 -0
- package/src/features/demos/demo-screen.tsx +72 -0
- package/src/features/home/ColorSchemeListItem.tsx +41 -0
- package/src/features/home/TestBuildAButton.tsx +102 -0
- package/src/features/home/TestSeparator.tsx +0 -0
- package/src/features/home/screen.tsx +285 -0
- package/src/features/testcases/screen.tsx +59 -0
- package/src/features/testcases/test-screen.tsx +50 -0
- package/src/generatedV5Theme.ts +112 -0
- package/src/gui.config.ts +411 -0
- package/src/guy.png +0 -0
- package/src/index.tsx +6 -0
- package/src/provider/index.tsx +18 -0
- package/src/test-gui-stack.tsx +11 -0
- package/src/test.tsx +3 -0
- package/src/useKitchenSinkTheme.tsx +15 -0
- package/src/usecases/ActionsSheetComparison.tsx +194 -0
- package/src/usecases/AnimatePresenceEnterExitCase.tsx +255 -0
- package/src/usecases/AnimatePresenceExitTest.tsx +69 -0
- package/src/usecases/AnimatedByProp.tsx +39 -0
- package/src/usecases/AnimationComprehensiveCase.tsx +2515 -0
- package/src/usecases/AnimationValueLoggingCase.tsx +526 -0
- package/src/usecases/AnimationsWithMediaQueriesCase.tsx +110 -0
- package/src/usecases/Benchmark.tsx +148 -0
- package/src/usecases/BenchmarkSelect.tsx +34 -0
- package/src/usecases/ButtonCircular.tsx +3 -0
- package/src/usecases/ButtonCustom.tsx +33 -0
- package/src/usecases/ButtonIconColor.tsx +18 -0
- package/src/usecases/ButtonInverse.tsx +30 -0
- package/src/usecases/ButtonUnstyled.tsx +31 -0
- package/src/usecases/CheckboxDisabledOnPress.tsx +62 -0
- package/src/usecases/ClickDuringEnterCase.tsx +59 -0
- package/src/usecases/CodeExamplesInput.tsx +9 -0
- package/src/usecases/ColorTokenFallback.tsx +52 -0
- package/src/usecases/CompilerExtraction.tsx +380 -0
- package/src/usecases/ComplexVariants.tsx +164 -0
- package/src/usecases/CrashAdaptSheet.tsx +98 -0
- package/src/usecases/CustomStyledAnimatedPopover.tsx +42 -0
- package/src/usecases/CustomStyledAnimatedTooltip.tsx +72 -0
- package/src/usecases/DOMNodeAPIs.tsx +154 -0
- package/src/usecases/DialogFocusScopeCase.tsx +277 -0
- package/src/usecases/DialogFocusScopeDebug.tsx +85 -0
- package/src/usecases/DialogNestedCase.tsx +121 -0
- package/src/usecases/DialogOpenControlled.tsx +49 -0
- package/src/usecases/DialogPointerEventsCase.tsx +58 -0
- package/src/usecases/DialogScopedCase.tsx +106 -0
- package/src/usecases/DialogSheetAdaptCase.tsx +178 -0
- package/src/usecases/DialogSheetAdaptResizeCase.tsx +98 -0
- package/src/usecases/DismissLayerStackingCase.tsx +223 -0
- package/src/usecases/DriverDisableAnimationPropsCase.tsx +44 -0
- package/src/usecases/Example.tsx +10 -0
- package/src/usecases/ExitCompletionCase.tsx +713 -0
- package/src/usecases/FocusVisibleButton.tsx +14 -0
- package/src/usecases/FocusVisibleButtonPointer.tsx +13 -0
- package/src/usecases/FocusVisibleButtonWithFocusStyle.tsx +16 -0
- package/src/usecases/FocusWithinCase.tsx +55 -0
- package/src/usecases/FontTokensInVariants.tsx +14 -0
- package/src/usecases/FormButtonTypeCase.tsx +34 -0
- package/src/usecases/GlobalScopedTriggerIsolationCase.tsx +178 -0
- package/src/usecases/GroupHoverMobile.tsx +39 -0
- package/src/usecases/GroupPressInVariant.tsx +92 -0
- package/src/usecases/GroupPressNative.tsx +200 -0
- package/src/usecases/GroupProp.tsx +96 -0
- package/src/usecases/GroupPseudoVariantOverride.tsx +56 -0
- package/src/usecases/GroupUseCases.tsx +94 -0
- package/src/usecases/HeightMediaQueryOverrideCase.tsx +183 -0
- package/src/usecases/InputAutoFocusAfterMenuCase.tsx +105 -0
- package/src/usecases/InputAutoFocusStyledCase.tsx +39 -0
- package/src/usecases/KeyboardControllerTest.tsx +146 -0
- package/src/usecases/ListItem.tsx +123 -0
- package/src/usecases/MediaQueriesV5.tsx +137 -0
- package/src/usecases/MediaQueryGtMd.tsx +73 -0
- package/src/usecases/MenuAboveDialogCase.tsx +75 -0
- package/src/usecases/MenuAccessibilityCase.tsx +133 -0
- package/src/usecases/MenuAnimatePositionCase.tsx +41 -0
- package/src/usecases/MenuArrowAnimatePresenceCase.tsx +98 -0
- package/src/usecases/MenuAsChildPositionCase.tsx +24 -0
- package/src/usecases/MenuAutoResizeCase.tsx +57 -0
- package/src/usecases/MenuBottomCase.tsx +55 -0
- package/src/usecases/MenuFocusLeaveCase.tsx +135 -0
- package/src/usecases/MenuHighlightCase.tsx +44 -0
- package/src/usecases/MenuItemFocusCase.tsx +79 -0
- package/src/usecases/MenuItemPseudoOverrideCase.tsx +270 -0
- package/src/usecases/MenuMultiTriggerCase.tsx +47 -0
- package/src/usecases/MenuOverflowCase.tsx +60 -0
- package/src/usecases/MenuSubCase.tsx +223 -0
- package/src/usecases/MenuSubLeftCase.tsx +178 -0
- package/src/usecases/MenuSubNestedPositionCase.tsx +171 -0
- package/src/usecases/MenuSubStyledCase.tsx +145 -0
- package/src/usecases/MenuThemeCase.tsx +50 -0
- package/src/usecases/MenuUnstyledCase.tsx +52 -0
- package/src/usecases/MultiDriverAnimation.tsx +118 -0
- package/src/usecases/NativePortalTest.tsx +179 -0
- package/src/usecases/NewInputBasic.tsx +16 -0
- package/src/usecases/NewInputEvents.tsx +29 -0
- package/src/usecases/NonGuiTextStyledType.tsx +23 -0
- package/src/usecases/OnLayoutCase.tsx +134 -0
- package/src/usecases/OnLayoutScaleCase.tsx +88 -0
- package/src/usecases/OnLayoutStressCase.tsx +353 -0
- package/src/usecases/OpacityModifierCase.tsx +113 -0
- package/src/usecases/OverlayStyled.tsx +66 -0
- package/src/usecases/ParagraphSpanFontInheritance.tsx +53 -0
- package/src/usecases/PlaceholderTextColor.tsx +20 -0
- package/src/usecases/PointerEventsCase.tsx +100 -0
- package/src/usecases/PopoverAndMenuMultiTriggerCase.tsx +138 -0
- package/src/usecases/PopoverCase.tsx +222 -0
- package/src/usecases/PopoverContentStyledPlusAnimations.tsx +44 -0
- package/src/usecases/PopoverFocusScopeCase.tsx +171 -0
- package/src/usecases/PopoverHoverableCase.tsx +167 -0
- package/src/usecases/PopoverHoverableDisableClickCase.tsx +118 -0
- package/src/usecases/PopoverHoverableRapidCase.tsx +103 -0
- package/src/usecases/PopoverHoverableScopedCase.tsx +135 -0
- package/src/usecases/PopoverScopedCase.tsx +76 -0
- package/src/usecases/PopoverTriggerIsolationCase.tsx +80 -0
- package/src/usecases/PressStyleNative.tsx +143 -0
- package/src/usecases/PseudoStyleMerge.tsx +25 -0
- package/src/usecases/PseudoTransitionCase.tsx +174 -0
- package/src/usecases/RawAnimatedValueCase.tsx +231 -0
- package/src/usecases/RemoveScrollCase.tsx +66 -0
- package/src/usecases/RenderPropCase.tsx +263 -0
- package/src/usecases/SafeAreaCase.tsx +236 -0
- package/src/usecases/ScrollViewRefCase.tsx +88 -0
- package/src/usecases/SecondPage.tsx +5 -0
- package/src/usecases/SelectAndroidOnPress.tsx +129 -0
- package/src/usecases/SelectFocusScopeCase.tsx +270 -0
- package/src/usecases/SelectRemount.tsx +136 -0
- package/src/usecases/Shadows.tsx +5 -0
- package/src/usecases/SheetAnimationCase.tsx +155 -0
- package/src/usecases/SheetDragCase.tsx +183 -0
- package/src/usecases/SheetDragResistCase.tsx +433 -0
- package/src/usecases/SheetDragResistCase.web.tsx +359 -0
- package/src/usecases/SheetKeyboardDragCase.tsx +328 -0
- package/src/usecases/SheetKeyboardFitContentCase.tsx +165 -0
- package/src/usecases/SheetOnAnimationCompleteCase.tsx +54 -0
- package/src/usecases/SheetScrollLockCase.tsx +166 -0
- package/src/usecases/SheetScrollableDrag.tsx +249 -0
- package/src/usecases/SheetSnapPointsFitCase.tsx +393 -0
- package/src/usecases/ShorthandVariables.tsx +49 -0
- package/src/usecases/SlowThemeReRender.tsx +48 -0
- package/src/usecases/SpinnerCustomColors.tsx +34 -0
- package/src/usecases/StackZIndex.tsx +82 -0
- package/src/usecases/StressPage.tsx +301 -0
- package/src/usecases/StylePlatform.tsx +30 -0
- package/src/usecases/StyleProp.tsx +29 -0
- package/src/usecases/StyledAnchor.tsx +27 -0
- package/src/usecases/StyledButtonAnimationAuto.tsx +99 -0
- package/src/usecases/StyledButtonTheme.tsx +63 -0
- package/src/usecases/StyledButtonVariantPseudo.tsx +25 -0
- package/src/usecases/StyledButtonVariantPseudoMerge.tsx +77 -0
- package/src/usecases/StyledCheckboxTheme.tsx +23 -0
- package/src/usecases/StyledContextColor.tsx +246 -0
- package/src/usecases/StyledContextTokens.tsx +147 -0
- package/src/usecases/StyledHOCNamed.tsx +20 -0
- package/src/usecases/StyledHtmlCase.tsx +144 -0
- package/src/usecases/StyledIconColor.tsx +19 -0
- package/src/usecases/StyledInputFocusStyle.tsx +21 -0
- package/src/usecases/StyledInputOnFocus.tsx +30 -0
- package/src/usecases/StyledMediaQueryMerge.tsx +95 -0
- package/src/usecases/StyledOverridePsuedo.tsx +26 -0
- package/src/usecases/StyledRNW.tsx +61 -0
- package/src/usecases/StyledStyleableInputOnFocus.tsx +34 -0
- package/src/usecases/StyledStyleableInputVariant.tsx +48 -0
- package/src/usecases/StyledStyledStyleableInputOnFocus.tsx +36 -0
- package/src/usecases/StyledVariantTextColor.tsx +25 -0
- package/src/usecases/StyledViewOnFocus.tsx +32 -0
- package/src/usecases/TabHoverAnimationCase.tsx +212 -0
- package/src/usecases/TextNestedInheritance.tsx +80 -0
- package/src/usecases/ThemeChange.tsx +100 -0
- package/src/usecases/ThemeChangeBasic.tsx +52 -0
- package/src/usecases/ThemeComponentResolution.tsx +119 -0
- package/src/usecases/ThemeConditionalName.tsx +31 -0
- package/src/usecases/ThemeMediaAnimationCase.tsx +39 -0
- package/src/usecases/ThemeMutation.tsx +86 -0
- package/src/usecases/ThemeNested.tsx +103 -0
- package/src/usecases/ThemeReset.tsx +62 -0
- package/src/usecases/ThemeShallowCase.tsx +83 -0
- package/src/usecases/ToastCase.tsx +46 -0
- package/src/usecases/ToggleGroupActiveProps.tsx +40 -0
- package/src/usecases/ToggleGroupXGroupCase.tsx +104 -0
- package/src/usecases/TooltipAnimationCase.tsx +99 -0
- package/src/usecases/TooltipCase.tsx +32 -0
- package/src/usecases/TooltipGlobalPatternCase.tsx +83 -0
- package/src/usecases/TooltipGroupCase.tsx +102 -0
- package/src/usecases/TooltipMultiTriggerCase.tsx +88 -0
- package/src/usecases/TooltipPositionJumpCase.tsx +91 -0
- package/src/usecases/TooltipTriggerInlineCase.tsx +60 -0
- package/src/usecases/TransformMediaQueryMerge.tsx +98 -0
- package/src/usecases/UseCases.tsx +409 -0
- package/src/usecases/UseTheme.tsx +41 -0
- package/src/usecases/V5ThemeBuilderOutput.tsx +231 -0
- package/src/usecases/VariantFontFamily.tsx +25 -0
- package/src/usecases/VariantsOrder.tsx +117 -0
- package/src/usecases/ZIndex.tsx +155 -0
- package/src/usecases/helpers.tsx +44 -0
- package/src/usecases/index.native.ts +122 -0
- package/src/usecases/index.ts +3 -0
- package/src/usecases/index.web.ts +177 -0
- package/tests/AnimatePresenceEnterExit.animated.test.tsx +176 -0
- package/tests/AnimatedByProp.animated.test.tsx +138 -0
- package/tests/AnimationBehavior.animated.test.tsx +543 -0
- package/tests/AnimationTiming.animated.test.tsx +195 -0
- package/tests/AnimationsWithMediaQueries.animated.test.tsx +154 -0
- package/tests/BuildAButton.test.tsx +87 -0
- package/tests/ButtonCircular.test.tsx +17 -0
- package/tests/ButtonCustom.test.tsx +17 -0
- package/tests/ButtonIconColor.test.tsx +23 -0
- package/tests/ButtonUnstyled.test.tsx +56 -0
- package/tests/ClickDuringEnter.animated.test.tsx +174 -0
- package/tests/ColorTokenFallback.test.tsx +45 -0
- package/tests/DOMNodeAPIs.test.tsx +161 -0
- package/tests/DialogFocusScope.animated.test.tsx +309 -0
- package/tests/DialogNested.test.tsx +128 -0
- package/tests/DialogOpenControlled.test.tsx +42 -0
- package/tests/DialogPointerEvents.animated.test.tsx +108 -0
- package/tests/DialogScoped.test.tsx +137 -0
- package/tests/DialogSheetAdapt.test.tsx +68 -0
- package/tests/DialogSheetAdaptResize.test.tsx +161 -0
- package/tests/DismissLayerStacking.test.tsx +292 -0
- package/tests/DriverDisableAnimationProps.animated.test.tsx +157 -0
- package/tests/ExitCompletion.animated.test.tsx +425 -0
- package/tests/ExitTimingCheck.animated.test.ts +34 -0
- package/tests/FocusVisibleButton.test.tsx +41 -0
- package/tests/FocusVisibleButtonPointerFocus.test.tsx +23 -0
- package/tests/FocusVisibleButtonPointerFocusWithFocusStyle.test.tsx +40 -0
- package/tests/FocusWithinStyle.animated.test.tsx +66 -0
- package/tests/FocusWithinStyle.test.tsx +60 -0
- package/tests/FormButtonType.test.tsx +42 -0
- package/tests/GlobalScopedTriggerIsolation.test.tsx +89 -0
- package/tests/GroupHoverMobile.test.tsx +52 -0
- package/tests/GroupPressInVariant.test.tsx +82 -0
- package/tests/GroupProp.test.tsx +30 -0
- package/tests/GroupPseudoVariantOverride.test.tsx +57 -0
- package/tests/GroupUseCases.test.tsx +111 -0
- package/tests/GuiSiteMotion.test.ts +481 -0
- package/tests/HeightMediaQueryOverride.test.tsx +112 -0
- package/tests/InputAutoFocusAfterMenu.test.tsx +55 -0
- package/tests/InputAutoFocusStyled.test.tsx +22 -0
- package/tests/ListItem.test.tsx +129 -0
- package/tests/MediaQueriesV5.test.tsx +113 -0
- package/tests/MediaQueryGtMd.test.tsx +84 -0
- package/tests/MenuAboveDialog.test.tsx +108 -0
- package/tests/MenuAccessibility.test.tsx +346 -0
- package/tests/MenuAnimatePosition.animated.test.tsx +57 -0
- package/tests/MenuArrowAnimatePresence.animated.test.tsx +71 -0
- package/tests/MenuAsChildPosition.test.tsx +16 -0
- package/tests/MenuAutoResize.test.tsx +54 -0
- package/tests/MenuFocusLeave.test.tsx +181 -0
- package/tests/MenuHighlight.test.tsx +165 -0
- package/tests/MenuHoverKeyboardBugs.test.tsx +252 -0
- package/tests/MenuItemFocus.test.tsx +59 -0
- package/tests/MenuItemPseudoOverride.test.tsx +231 -0
- package/tests/MenuMultiTrigger.test.tsx +101 -0
- package/tests/MenuOverflow.test.tsx +93 -0
- package/tests/MenuStayInFrame.test.tsx +102 -0
- package/tests/MenuSubKeyboardFocus.test.tsx +220 -0
- package/tests/MenuSubLeftSafePolygon.test.tsx +88 -0
- package/tests/MenuSubNestedPosition.test.tsx +48 -0
- package/tests/MenuSubSafePolygon.test.tsx +97 -0
- package/tests/MenuSubStyled.test.tsx +40 -0
- package/tests/MenuTheme.test.tsx +34 -0
- package/tests/MenuUnstyled.test.tsx +56 -0
- package/tests/MultiDriverAnimation.test.tsx +207 -0
- package/tests/NewInputBasic.test.tsx +50 -0
- package/tests/NewInputEvents.test.tsx +55 -0
- package/tests/OnLayout.test.tsx +163 -0
- package/tests/OnLayoutScale.test.tsx +100 -0
- package/tests/OnLayoutStress.test.tsx +304 -0
- package/tests/ParagraphSpanFontInheritance.test.tsx +73 -0
- package/tests/PointerEvents.test.tsx +123 -0
- package/tests/Popover.animated.test.tsx +234 -0
- package/tests/PopoverAndMenuMultiTrigger.test.tsx +184 -0
- package/tests/PopoverAnimatePosition.animated.test.tsx +51 -0
- package/tests/PopoverClickDuringEnter.animated.test.tsx +197 -0
- package/tests/PopoverFocusScope.test.tsx +242 -0
- package/tests/PopoverHoverable.test.tsx +383 -0
- package/tests/PopoverHoverableDisableClick.test.tsx +106 -0
- package/tests/PopoverHoverableRapid.test.tsx +129 -0
- package/tests/PopoverHoverableReposition.test.tsx +111 -0
- package/tests/PopoverHoverableScoped.animated.test.tsx +103 -0
- package/tests/PopoverHoverableStress.test.tsx +169 -0
- package/tests/PopoverInitialPosition.animated.test.tsx +82 -0
- package/tests/PopoverMiddlewareSkipRegression.animated.test.tsx +221 -0
- package/tests/PopoverScoped.test.tsx +128 -0
- package/tests/PopoverScopedPositionGlitch.animated.test.tsx +184 -0
- package/tests/PopoverTriggerIsolation.test.tsx +62 -0
- package/tests/PseudoTransition.animated.test.tsx +319 -0
- package/tests/RawAnimatedValue.test.tsx +147 -0
- package/tests/RemoveScroll.test.tsx +223 -0
- package/tests/RenderProp.test.tsx +293 -0
- package/tests/ScrollViewRef.test.tsx +39 -0
- package/tests/SelectClickHold.test.tsx +147 -0
- package/tests/SelectFocusScope.test.tsx +176 -0
- package/tests/SelectInnerPositioning.test.tsx +82 -0
- package/tests/SelectKeyboardNav.test.tsx +173 -0
- package/tests/SelectPositioning.test.tsx +56 -0
- package/tests/SelectTypeahead.test.tsx +63 -0
- package/tests/Shadows.test.tsx +14 -0
- package/tests/SheetAnimation.animated.test.tsx +413 -0
- package/tests/SheetDrag.animated.test.tsx +223 -0
- package/tests/SheetDragResist.animated.test.tsx +393 -0
- package/tests/SheetOnAnimationComplete.animated.test.tsx +62 -0
- package/tests/SheetScrollLock.animated.test.tsx +287 -0
- package/tests/SheetScrollableDrag.animated.test.tsx +1264 -0
- package/tests/SheetSnapPointsFit.animated.test.tsx +259 -0
- package/tests/ShorthandVariables.test.tsx +44 -0
- package/tests/SpinnerCustomColors.test.tsx +67 -0
- package/tests/StackZIndex.test.tsx +51 -0
- package/tests/StressPagePerf.test.tsx +76 -0
- package/tests/StylePlatform.test.tsx +38 -0
- package/tests/StyleProp.test.tsx +20 -0
- package/tests/StyledAnchor.test.tsx +17 -0
- package/tests/StyledButtonTheme.test.tsx +22 -0
- package/tests/StyledButtonVariantPseudo.test.tsx +20 -0
- package/tests/StyledButtonVariantPseudoMerge.animated.test.tsx +33 -0
- package/tests/StyledCheckboxTheme.test.tsx +16 -0
- package/tests/StyledContextColor.test.tsx +119 -0
- package/tests/StyledContextTokens.test.tsx +56 -0
- package/tests/StyledHOCNamed.test.tsx +16 -0
- package/tests/StyledHtml.test.tsx +161 -0
- package/tests/StyledIconColor.test.tsx +32 -0
- package/tests/StyledInputFocusStyle.test.tsx +19 -0
- package/tests/StyledInputOnFocus.test.tsx +27 -0
- package/tests/StyledMediaQueryMerge.test.tsx +66 -0
- package/tests/StyledRNW.test.tsx +17 -0
- package/tests/StyledStyleableInputOnFocus.test.tsx +27 -0
- package/tests/StyledStyleableInputVariant.test.tsx +22 -0
- package/tests/StyledStyledStyleableInputOnFocus.test.tsx +27 -0
- package/tests/StyledVariantTextColor.test.tsx +24 -0
- package/tests/StyledViewOnFocus.test.tsx +27 -0
- package/tests/TabHoverAnimation.animated.test.tsx +468 -0
- package/tests/TabHoverPositionSmooth.animated.test.tsx +129 -0
- package/tests/TextNestedInheritance.test.tsx +93 -0
- package/tests/ThemeChange.test.tsx +70 -0
- package/tests/ThemeComponentResolution.test.tsx +82 -0
- package/tests/ThemeConditionalName.test.tsx +34 -0
- package/tests/ThemeMediaAnimation.test.tsx +65 -0
- package/tests/ThemeNested.test.tsx +141 -0
- package/tests/ThemeReset.test.tsx +63 -0
- package/tests/ThemeShallow.test.tsx +95 -0
- package/tests/Toast.test.tsx +106 -0
- package/tests/ToggleGroup.test.tsx +61 -0
- package/tests/ToggleGroupActiveProps.test.tsx +38 -0
- package/tests/ToggleGroupXGroup.test.tsx +172 -0
- package/tests/TooltipAnimation.animated.test.tsx +260 -0
- package/tests/TooltipEnterInterrupt.animated.test.tsx +76 -0
- package/tests/TooltipGlobalPattern.animated.test.tsx +208 -0
- package/tests/TooltipGroup.animated.test.tsx +79 -0
- package/tests/TooltipMultiTrigger.test.tsx +116 -0
- package/tests/TooltipPositionJump.animated.test.tsx +229 -0
- package/tests/TooltipPositionJumpNotes.md +219 -0
- package/tests/TooltipRapidSwitch.animated.test.tsx +399 -0
- package/tests/TooltipTriggerInline.test.tsx +65 -0
- package/tests/TransformMediaQueryMerge.test.tsx +104 -0
- package/tests/TransitionEnterExit.animated.test.tsx +311 -0
- package/tests/UseTheme.test.tsx +16 -0
- package/tests/V5ThemeBuilderOutput.test.tsx +164 -0
- package/tests/VariantFontFamily.test.tsx +11 -0
- package/tests/VariantsOrder.test.tsx +53 -0
- package/tests/_debug_position.mjs +52 -0
- package/tests/test-utils.ts +106 -0
- package/tests/utils.tsx +54 -0
- package/tsconfig.json +45 -0
- package/vite-env.d.ts +1 -0
- package/vite.config.ts +14 -0
- package/webpack.config.js +139 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.describe('Dismiss Layer Stacking', () => {
|
|
5
|
+
test.beforeEach(async ({ page }) => {
|
|
6
|
+
await setupPage(page, { name: 'DismissLayerStackingCase', type: 'useCase' })
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
test('ESC closes dialog first when dialog is open over popover', async ({ page }) => {
|
|
10
|
+
await page.waitForLoadState('networkidle')
|
|
11
|
+
|
|
12
|
+
// open popover
|
|
13
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
14
|
+
await popoverTrigger.click()
|
|
15
|
+
|
|
16
|
+
const popoverContent = page.getByTestId('popover-content')
|
|
17
|
+
await expect(popoverContent).toBeVisible({ timeout: 5000 })
|
|
18
|
+
await page.waitForTimeout(300)
|
|
19
|
+
|
|
20
|
+
// open dialog from inside popover
|
|
21
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
22
|
+
await dialogTrigger.click()
|
|
23
|
+
|
|
24
|
+
const dialogContent = page.getByTestId('dialog-content')
|
|
25
|
+
await expect(dialogContent).toBeVisible({ timeout: 5000 })
|
|
26
|
+
await page.waitForTimeout(300)
|
|
27
|
+
|
|
28
|
+
// both should be open
|
|
29
|
+
await expect(popoverContent).toBeVisible()
|
|
30
|
+
await expect(dialogContent).toBeVisible()
|
|
31
|
+
|
|
32
|
+
// press ESC - should close dialog, NOT popover
|
|
33
|
+
await page.keyboard.press('Escape')
|
|
34
|
+
await page.waitForTimeout(800)
|
|
35
|
+
|
|
36
|
+
// dialog should be closed
|
|
37
|
+
await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
|
|
38
|
+
|
|
39
|
+
// popover should STILL be open
|
|
40
|
+
await expect(popoverContent).toBeVisible()
|
|
41
|
+
|
|
42
|
+
// press ESC again - now popover should close
|
|
43
|
+
await page.keyboard.press('Escape')
|
|
44
|
+
await page.waitForTimeout(400)
|
|
45
|
+
|
|
46
|
+
await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('ESC closes popover when only popover is open', async ({ page }) => {
|
|
50
|
+
await page.waitForLoadState('networkidle')
|
|
51
|
+
|
|
52
|
+
// open popover
|
|
53
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
54
|
+
await popoverTrigger.click()
|
|
55
|
+
|
|
56
|
+
const popoverContent = page.getByTestId('popover-content')
|
|
57
|
+
await expect(popoverContent).toBeVisible({ timeout: 5000 })
|
|
58
|
+
await page.waitForTimeout(300)
|
|
59
|
+
|
|
60
|
+
// press ESC - should close popover
|
|
61
|
+
await page.keyboard.press('Escape')
|
|
62
|
+
await page.waitForTimeout(400)
|
|
63
|
+
|
|
64
|
+
await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
test('dialog can be reopened after ESC close', async ({ page }) => {
|
|
68
|
+
await page.waitForLoadState('networkidle')
|
|
69
|
+
|
|
70
|
+
// open popover
|
|
71
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
72
|
+
await popoverTrigger.click()
|
|
73
|
+
|
|
74
|
+
const popoverContent = page.getByTestId('popover-content')
|
|
75
|
+
await expect(popoverContent).toBeVisible({ timeout: 5000 })
|
|
76
|
+
await page.waitForTimeout(300)
|
|
77
|
+
|
|
78
|
+
// open dialog
|
|
79
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
80
|
+
await dialogTrigger.click()
|
|
81
|
+
|
|
82
|
+
const dialogContent = page.getByTestId('dialog-content')
|
|
83
|
+
await expect(dialogContent).toBeVisible({ timeout: 5000 })
|
|
84
|
+
await page.waitForTimeout(300)
|
|
85
|
+
|
|
86
|
+
// close dialog with ESC
|
|
87
|
+
await page.keyboard.press('Escape')
|
|
88
|
+
await page.waitForTimeout(400)
|
|
89
|
+
await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
|
|
90
|
+
|
|
91
|
+
// reopen dialog
|
|
92
|
+
await dialogTrigger.click()
|
|
93
|
+
await expect(dialogContent).toBeVisible({ timeout: 5000 })
|
|
94
|
+
|
|
95
|
+
// close with button this time
|
|
96
|
+
const dialogClose = page.getByTestId('dialog-close')
|
|
97
|
+
await dialogClose.click()
|
|
98
|
+
await page.waitForTimeout(400)
|
|
99
|
+
await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
|
|
100
|
+
|
|
101
|
+
// popover should still be open
|
|
102
|
+
await expect(popoverContent).toBeVisible()
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
test('ESC closes select inside popover first, then popover', async ({ page }) => {
|
|
106
|
+
await page.waitForLoadState('networkidle')
|
|
107
|
+
|
|
108
|
+
// open popover
|
|
109
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
110
|
+
await popoverTrigger.click()
|
|
111
|
+
|
|
112
|
+
const popoverContent = page.getByTestId('popover-content')
|
|
113
|
+
await expect(popoverContent).toBeVisible({ timeout: 5000 })
|
|
114
|
+
await page.waitForTimeout(300)
|
|
115
|
+
|
|
116
|
+
// open select inside popover
|
|
117
|
+
const selectTrigger = page.getByTestId('popover-select-trigger')
|
|
118
|
+
await selectTrigger.click()
|
|
119
|
+
|
|
120
|
+
const selectViewport = page.getByTestId('popover-select-viewport')
|
|
121
|
+
await expect(selectViewport).toBeVisible({ timeout: 5000 })
|
|
122
|
+
await page.waitForTimeout(300)
|
|
123
|
+
|
|
124
|
+
// press ESC - should close select, NOT popover
|
|
125
|
+
await page.keyboard.press('Escape')
|
|
126
|
+
await page.waitForTimeout(400)
|
|
127
|
+
|
|
128
|
+
// select should be closed
|
|
129
|
+
await expect(selectViewport).not.toBeVisible({ timeout: 5000 })
|
|
130
|
+
|
|
131
|
+
// popover should STILL be open
|
|
132
|
+
await expect(popoverContent).toBeVisible()
|
|
133
|
+
|
|
134
|
+
// press ESC again - now popover should close
|
|
135
|
+
await page.keyboard.press('Escape')
|
|
136
|
+
await page.waitForTimeout(400)
|
|
137
|
+
|
|
138
|
+
await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
test('ESC closes select inside dialog first, then dialog', async ({ page }) => {
|
|
142
|
+
await page.waitForLoadState('networkidle')
|
|
143
|
+
|
|
144
|
+
// open popover
|
|
145
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
146
|
+
await popoverTrigger.click()
|
|
147
|
+
|
|
148
|
+
const popoverContent = page.getByTestId('popover-content')
|
|
149
|
+
await expect(popoverContent).toBeVisible({ timeout: 5000 })
|
|
150
|
+
await page.waitForTimeout(300)
|
|
151
|
+
|
|
152
|
+
// open dialog
|
|
153
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
154
|
+
await dialogTrigger.click()
|
|
155
|
+
|
|
156
|
+
const dialogContent = page.getByTestId('dialog-content')
|
|
157
|
+
await expect(dialogContent).toBeVisible({ timeout: 5000 })
|
|
158
|
+
await page.waitForTimeout(300)
|
|
159
|
+
|
|
160
|
+
// open select inside dialog
|
|
161
|
+
const selectTrigger = page.getByTestId('dialog-select-trigger')
|
|
162
|
+
await selectTrigger.click()
|
|
163
|
+
|
|
164
|
+
const selectViewport = page.getByTestId('dialog-select-viewport')
|
|
165
|
+
await expect(selectViewport).toBeVisible({ timeout: 5000 })
|
|
166
|
+
await page.waitForTimeout(300)
|
|
167
|
+
|
|
168
|
+
// press ESC - should close select first
|
|
169
|
+
await page.keyboard.press('Escape')
|
|
170
|
+
await page.waitForTimeout(400)
|
|
171
|
+
|
|
172
|
+
await expect(selectViewport).not.toBeVisible({ timeout: 5000 })
|
|
173
|
+
await expect(dialogContent).toBeVisible()
|
|
174
|
+
await expect(popoverContent).toBeVisible()
|
|
175
|
+
|
|
176
|
+
// press ESC - should close dialog
|
|
177
|
+
await page.keyboard.press('Escape')
|
|
178
|
+
await page.waitForTimeout(400)
|
|
179
|
+
|
|
180
|
+
await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
|
|
181
|
+
await expect(popoverContent).toBeVisible()
|
|
182
|
+
|
|
183
|
+
// press ESC - should close popover
|
|
184
|
+
await page.keyboard.press('Escape')
|
|
185
|
+
await page.waitForTimeout(400)
|
|
186
|
+
|
|
187
|
+
await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
test('useHasDismissableLayers hook updates correctly', async ({ page }) => {
|
|
191
|
+
await page.waitForLoadState('networkidle')
|
|
192
|
+
|
|
193
|
+
// initially no layers
|
|
194
|
+
const hasLayersStatus = page.getByTestId('has-layers-status')
|
|
195
|
+
await expect(hasLayersStatus).toContainText('false')
|
|
196
|
+
|
|
197
|
+
// open popover
|
|
198
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
199
|
+
await popoverTrigger.click()
|
|
200
|
+
await page.waitForTimeout(400)
|
|
201
|
+
|
|
202
|
+
// should have layers now
|
|
203
|
+
await expect(hasLayersStatus).toContainText('true')
|
|
204
|
+
|
|
205
|
+
// close popover
|
|
206
|
+
await page.keyboard.press('Escape')
|
|
207
|
+
await page.waitForTimeout(400)
|
|
208
|
+
|
|
209
|
+
// back to no layers
|
|
210
|
+
await expect(hasLayersStatus).toContainText('false')
|
|
211
|
+
})
|
|
212
|
+
|
|
213
|
+
test('getDismissableLayerCount updates correctly', async ({ page }) => {
|
|
214
|
+
await page.waitForLoadState('networkidle')
|
|
215
|
+
|
|
216
|
+
const layerCountStatus = page.getByTestId('layer-count-status')
|
|
217
|
+
|
|
218
|
+
// initially 0
|
|
219
|
+
await expect(layerCountStatus).toContainText('0')
|
|
220
|
+
|
|
221
|
+
// open popover - should be 1
|
|
222
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
223
|
+
await popoverTrigger.click()
|
|
224
|
+
await page.waitForTimeout(400)
|
|
225
|
+
await expect(layerCountStatus).toContainText('1')
|
|
226
|
+
|
|
227
|
+
// open dialog - should be 2
|
|
228
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
229
|
+
await dialogTrigger.click()
|
|
230
|
+
await page.waitForTimeout(400)
|
|
231
|
+
await expect(layerCountStatus).toContainText('2')
|
|
232
|
+
|
|
233
|
+
// open select - should be 3
|
|
234
|
+
const selectTrigger = page.getByTestId('dialog-select-trigger')
|
|
235
|
+
await selectTrigger.click()
|
|
236
|
+
await page.waitForTimeout(400)
|
|
237
|
+
await expect(layerCountStatus).toContainText('3')
|
|
238
|
+
|
|
239
|
+
// close select - should be 2
|
|
240
|
+
await page.keyboard.press('Escape')
|
|
241
|
+
await page.waitForTimeout(400)
|
|
242
|
+
await expect(layerCountStatus).toContainText('2')
|
|
243
|
+
|
|
244
|
+
// close dialog - should be 1
|
|
245
|
+
await page.keyboard.press('Escape')
|
|
246
|
+
await page.waitForTimeout(400)
|
|
247
|
+
await expect(layerCountStatus).toContainText('1')
|
|
248
|
+
|
|
249
|
+
// close popover - should be 0
|
|
250
|
+
await page.keyboard.press('Escape')
|
|
251
|
+
await page.waitForTimeout(400)
|
|
252
|
+
await expect(layerCountStatus).toContainText('0')
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
test('two dialogs can be opened side by side', async ({ page }) => {
|
|
256
|
+
await page.waitForLoadState('networkidle')
|
|
257
|
+
|
|
258
|
+
// open popover with dialog inside
|
|
259
|
+
const popoverTrigger = page.getByTestId('popover-trigger')
|
|
260
|
+
await popoverTrigger.click()
|
|
261
|
+
await page.waitForTimeout(300)
|
|
262
|
+
|
|
263
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
264
|
+
await dialogTrigger.click()
|
|
265
|
+
await page.waitForTimeout(300)
|
|
266
|
+
|
|
267
|
+
const dialogContent = page.getByTestId('dialog-content')
|
|
268
|
+
await expect(dialogContent).toBeVisible()
|
|
269
|
+
|
|
270
|
+
// close this dialog
|
|
271
|
+
await page.keyboard.press('Escape')
|
|
272
|
+
await page.waitForTimeout(400)
|
|
273
|
+
await expect(dialogContent).not.toBeVisible()
|
|
274
|
+
|
|
275
|
+
// close popover
|
|
276
|
+
await page.keyboard.press('Escape')
|
|
277
|
+
await page.waitForTimeout(400)
|
|
278
|
+
|
|
279
|
+
// open the standalone dialog
|
|
280
|
+
const dialog2Trigger = page.getByTestId('dialog2-trigger')
|
|
281
|
+
await dialog2Trigger.click()
|
|
282
|
+
await page.waitForTimeout(300)
|
|
283
|
+
|
|
284
|
+
const dialog2Content = page.getByTestId('dialog2-content')
|
|
285
|
+
await expect(dialog2Content).toBeVisible()
|
|
286
|
+
|
|
287
|
+
// close with ESC
|
|
288
|
+
await page.keyboard.press('Escape')
|
|
289
|
+
await page.waitForTimeout(400)
|
|
290
|
+
await expect(dialog2Content).not.toBeVisible()
|
|
291
|
+
})
|
|
292
|
+
})
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Tests that non-animatable CSS properties (display, position, flexDirection, etc.)
|
|
6
|
+
* use className (atomic CSS) instead of inline styles for animated components.
|
|
7
|
+
* Animatable properties remain as inline styles for the driver to animate.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
test.describe('Driver disableAnimationProps className optimization', () => {
|
|
11
|
+
// non-animatable props the motion driver declares it won't animate
|
|
12
|
+
const NON_ANIMATABLE = [
|
|
13
|
+
'display',
|
|
14
|
+
'alignItems',
|
|
15
|
+
'justifyContent',
|
|
16
|
+
'position',
|
|
17
|
+
'overflow',
|
|
18
|
+
'flexDirection',
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
// props that should be animated (kept as inline styles)
|
|
22
|
+
const ANIMATABLE = ['opacity']
|
|
23
|
+
|
|
24
|
+
test.beforeEach(async ({ page }) => {
|
|
25
|
+
const driver = (test.info().project?.metadata as any)?.animationDriver
|
|
26
|
+
// this optimization only applies to inline animation drivers that don't use RNW
|
|
27
|
+
// css driver already uses classNames, native/reanimated use RNW's Animated.View
|
|
28
|
+
// which doesn't forward className prop
|
|
29
|
+
test.skip(
|
|
30
|
+
driver === 'css' || driver === 'native' || driver === 'reanimated',
|
|
31
|
+
'only motion driver benefits from this optimization on web'
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
await setupPage(page, {
|
|
35
|
+
name: 'DriverDisableAnimationPropsCase',
|
|
36
|
+
type: 'useCase',
|
|
37
|
+
})
|
|
38
|
+
await page.waitForTimeout(500)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
test('non-animatable props should use className, not inline style', async ({
|
|
42
|
+
page,
|
|
43
|
+
}) => {
|
|
44
|
+
const result = await page.evaluate((nonAnimatableProps) => {
|
|
45
|
+
const el = document.querySelector('[data-testid="animated-box"]')
|
|
46
|
+
if (!el) return null
|
|
47
|
+
|
|
48
|
+
const inlineStyle = (el as HTMLElement).style
|
|
49
|
+
const classNames = el.className
|
|
50
|
+
|
|
51
|
+
const inlineNonAnimatable: Record<string, string> = {}
|
|
52
|
+
const hasClassName = classNames.length > 0
|
|
53
|
+
|
|
54
|
+
for (const prop of nonAnimatableProps) {
|
|
55
|
+
const inlineVal = inlineStyle.getPropertyValue(prop) || inlineStyle[prop as any]
|
|
56
|
+
if (inlineVal) {
|
|
57
|
+
inlineNonAnimatable[prop] = inlineVal
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
hasClassName,
|
|
63
|
+
classNameLength: classNames.split(' ').length,
|
|
64
|
+
inlineNonAnimatable,
|
|
65
|
+
inlineStyleCssText: inlineStyle.cssText,
|
|
66
|
+
}
|
|
67
|
+
}, NON_ANIMATABLE)
|
|
68
|
+
|
|
69
|
+
expect(result, 'element should exist').toBeTruthy()
|
|
70
|
+
|
|
71
|
+
// element should have classNames (atomic CSS)
|
|
72
|
+
expect(result?.hasClassName, 'should have className').toBe(true)
|
|
73
|
+
expect(
|
|
74
|
+
result?.classNameLength,
|
|
75
|
+
'should have multiple atomic CSS classes'
|
|
76
|
+
).toBeGreaterThan(1)
|
|
77
|
+
|
|
78
|
+
// non-animatable props should NOT be in inline style
|
|
79
|
+
for (const prop of NON_ANIMATABLE) {
|
|
80
|
+
expect(
|
|
81
|
+
result?.inlineNonAnimatable[prop],
|
|
82
|
+
`${prop} should not be in inline style (should be className)`
|
|
83
|
+
).toBeFalsy()
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test('animatable props should be inline style for driver to animate', async ({
|
|
88
|
+
page,
|
|
89
|
+
}) => {
|
|
90
|
+
// trigger active state to start animation
|
|
91
|
+
await page.getByTestId('trigger').click()
|
|
92
|
+
await page.waitForTimeout(200)
|
|
93
|
+
|
|
94
|
+
const result = await page.evaluate(() => {
|
|
95
|
+
const el = document.querySelector('[data-testid="animated-box"]')
|
|
96
|
+
if (!el) return null
|
|
97
|
+
|
|
98
|
+
const s = getComputedStyle(el)
|
|
99
|
+
return {
|
|
100
|
+
hasNonDefaultOpacity: Number.parseFloat(s.opacity) < 1,
|
|
101
|
+
opacity: s.opacity,
|
|
102
|
+
}
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
expect(result, 'element should exist').toBeTruthy()
|
|
106
|
+
|
|
107
|
+
// opacity should be animating (not at the start value of 1)
|
|
108
|
+
expect(
|
|
109
|
+
result?.hasNonDefaultOpacity,
|
|
110
|
+
'opacity should be animating after trigger'
|
|
111
|
+
).toBe(true)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
test('animation still works correctly with className optimization', async ({
|
|
115
|
+
page,
|
|
116
|
+
}) => {
|
|
117
|
+
// verify initial opacity
|
|
118
|
+
const initialOpacity = await page.evaluate(() => {
|
|
119
|
+
const el = document.querySelector('[data-testid="animated-box"]')
|
|
120
|
+
return el ? Number.parseFloat(getComputedStyle(el).opacity) : -1
|
|
121
|
+
})
|
|
122
|
+
expect(initialOpacity, 'initial opacity should be 1').toBeCloseTo(1, 1)
|
|
123
|
+
|
|
124
|
+
// trigger animation
|
|
125
|
+
await page.getByTestId('trigger').click()
|
|
126
|
+
await page.waitForTimeout(1000)
|
|
127
|
+
|
|
128
|
+
// verify end state
|
|
129
|
+
const endOpacity = await page.evaluate(() => {
|
|
130
|
+
const el = document.querySelector('[data-testid="animated-box"]')
|
|
131
|
+
return el ? Number.parseFloat(getComputedStyle(el).opacity) : -1
|
|
132
|
+
})
|
|
133
|
+
expect(endOpacity, 'end opacity should be ~0.5').toBeCloseTo(0.5, 1)
|
|
134
|
+
|
|
135
|
+
// verify non-animatable props still work correctly
|
|
136
|
+
const layoutProps = await page.evaluate(() => {
|
|
137
|
+
const el = document.querySelector('[data-testid="animated-box"]')
|
|
138
|
+
if (!el) return null
|
|
139
|
+
const s = getComputedStyle(el)
|
|
140
|
+
return {
|
|
141
|
+
display: s.display,
|
|
142
|
+
alignItems: s.alignItems,
|
|
143
|
+
justifyContent: s.justifyContent,
|
|
144
|
+
position: s.position,
|
|
145
|
+
overflow: s.overflow,
|
|
146
|
+
flexDirection: s.flexDirection,
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
expect(layoutProps?.display).toBe('flex')
|
|
151
|
+
expect(layoutProps?.alignItems).toBe('center')
|
|
152
|
+
expect(layoutProps?.justifyContent).toBe('center')
|
|
153
|
+
expect(layoutProps?.position).toBe('relative')
|
|
154
|
+
expect(layoutProps?.overflow).toBe('hidden')
|
|
155
|
+
expect(layoutProps?.flexDirection).toBe('column')
|
|
156
|
+
})
|
|
157
|
+
})
|