@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,346 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.describe('Menu Accessibility', () => {
|
|
5
|
+
test.beforeEach(async ({ page }) => {
|
|
6
|
+
await setupPage(page, { name: 'MenuAccessibilityCase', type: 'useCase' })
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
test('trigger is focusable via tab key', async ({ page }) => {
|
|
10
|
+
await page.waitForLoadState('networkidle')
|
|
11
|
+
|
|
12
|
+
// focus the "before" button first
|
|
13
|
+
const beforeButton = page.getByTestId('before-button')
|
|
14
|
+
await beforeButton.focus()
|
|
15
|
+
await expect(beforeButton).toBeFocused()
|
|
16
|
+
|
|
17
|
+
// tab to menu trigger
|
|
18
|
+
await page.keyboard.press('Tab')
|
|
19
|
+
await page.waitForTimeout(100)
|
|
20
|
+
|
|
21
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
22
|
+
await expect(trigger).toBeFocused()
|
|
23
|
+
|
|
24
|
+
// tab to "after" button
|
|
25
|
+
await page.keyboard.press('Tab')
|
|
26
|
+
await page.waitForTimeout(100)
|
|
27
|
+
|
|
28
|
+
const afterButton = page.getByTestId('after-button')
|
|
29
|
+
await expect(afterButton).toBeFocused()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('menu opens on Enter key and focuses first item', async ({ page }) => {
|
|
33
|
+
await page.waitForLoadState('networkidle')
|
|
34
|
+
|
|
35
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
36
|
+
await trigger.focus()
|
|
37
|
+
await expect(trigger).toBeFocused()
|
|
38
|
+
|
|
39
|
+
// press Enter to open menu
|
|
40
|
+
await page.keyboard.press('Enter')
|
|
41
|
+
await page.waitForTimeout(300)
|
|
42
|
+
|
|
43
|
+
const menuContent = page.getByTestId('menu-content')
|
|
44
|
+
await expect(menuContent).toBeVisible()
|
|
45
|
+
|
|
46
|
+
// first item should be focused for keyboard users
|
|
47
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
48
|
+
await expect(firstItem).toBeFocused()
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('menu opens on Space key and focuses first item', async ({ page }) => {
|
|
52
|
+
await page.waitForLoadState('networkidle')
|
|
53
|
+
|
|
54
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
55
|
+
await trigger.focus()
|
|
56
|
+
await expect(trigger).toBeFocused()
|
|
57
|
+
|
|
58
|
+
// press Space to open menu
|
|
59
|
+
await page.keyboard.press('Space')
|
|
60
|
+
await page.waitForTimeout(300)
|
|
61
|
+
|
|
62
|
+
const menuContent = page.getByTestId('menu-content')
|
|
63
|
+
await expect(menuContent).toBeVisible()
|
|
64
|
+
|
|
65
|
+
// first item should be focused for keyboard users
|
|
66
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
67
|
+
await expect(firstItem).toBeFocused()
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('arrow down from content frame focuses first item', async ({ page }) => {
|
|
71
|
+
await page.waitForLoadState('networkidle')
|
|
72
|
+
|
|
73
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
74
|
+
await trigger.click()
|
|
75
|
+
await page.waitForTimeout(300)
|
|
76
|
+
|
|
77
|
+
const menuContent = page.getByTestId('menu-content')
|
|
78
|
+
await expect(menuContent).toBeVisible()
|
|
79
|
+
await expect(menuContent).toBeFocused()
|
|
80
|
+
|
|
81
|
+
// press ArrowDown to focus first item
|
|
82
|
+
await page.keyboard.press('ArrowDown')
|
|
83
|
+
await page.waitForTimeout(100)
|
|
84
|
+
|
|
85
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
86
|
+
await expect(firstItem).toBeFocused()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
test('arrow keys navigate between menu items', async ({ page }) => {
|
|
90
|
+
await page.waitForLoadState('networkidle')
|
|
91
|
+
|
|
92
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
93
|
+
await trigger.click()
|
|
94
|
+
await page.waitForTimeout(300)
|
|
95
|
+
|
|
96
|
+
const menuContent = page.getByTestId('menu-content')
|
|
97
|
+
await expect(menuContent).toBeVisible()
|
|
98
|
+
|
|
99
|
+
// arrow down to focus first item from content frame
|
|
100
|
+
await page.keyboard.press('ArrowDown')
|
|
101
|
+
await page.waitForTimeout(100)
|
|
102
|
+
|
|
103
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
104
|
+
await expect(firstItem).toBeFocused()
|
|
105
|
+
|
|
106
|
+
// arrow down to second item
|
|
107
|
+
await page.keyboard.press('ArrowDown')
|
|
108
|
+
await page.waitForTimeout(100)
|
|
109
|
+
|
|
110
|
+
const secondItem = page.getByTestId('menu-item-2')
|
|
111
|
+
await expect(secondItem).toBeFocused()
|
|
112
|
+
|
|
113
|
+
// arrow down to third item
|
|
114
|
+
await page.keyboard.press('ArrowDown')
|
|
115
|
+
await page.waitForTimeout(100)
|
|
116
|
+
|
|
117
|
+
const thirdItem = page.getByTestId('menu-item-3')
|
|
118
|
+
await expect(thirdItem).toBeFocused()
|
|
119
|
+
|
|
120
|
+
// arrow up back to second item
|
|
121
|
+
await page.keyboard.press('ArrowUp')
|
|
122
|
+
await page.waitForTimeout(100)
|
|
123
|
+
|
|
124
|
+
await expect(secondItem).toBeFocused()
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
test('escape closes menu and returns focus to trigger', async ({ page }) => {
|
|
128
|
+
await page.waitForLoadState('networkidle')
|
|
129
|
+
|
|
130
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
131
|
+
await trigger.click()
|
|
132
|
+
await page.waitForTimeout(300)
|
|
133
|
+
|
|
134
|
+
const menuContent = page.getByTestId('menu-content')
|
|
135
|
+
await expect(menuContent).toBeVisible()
|
|
136
|
+
|
|
137
|
+
// focus an item
|
|
138
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
139
|
+
await firstItem.focus()
|
|
140
|
+
await expect(firstItem).toBeFocused()
|
|
141
|
+
|
|
142
|
+
// press Escape to close menu
|
|
143
|
+
await page.keyboard.press('Escape')
|
|
144
|
+
await page.waitForTimeout(300)
|
|
145
|
+
|
|
146
|
+
await expect(menuContent).not.toBeVisible()
|
|
147
|
+
|
|
148
|
+
// focus should return to trigger
|
|
149
|
+
await expect(trigger).toBeFocused()
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
test('escape in submenu closes only submenu first, then parent', async ({ page }) => {
|
|
153
|
+
await page.waitForLoadState('networkidle')
|
|
154
|
+
|
|
155
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
156
|
+
await trigger.click()
|
|
157
|
+
await page.waitForTimeout(300)
|
|
158
|
+
|
|
159
|
+
const menuContent = page.getByTestId('menu-content')
|
|
160
|
+
await expect(menuContent).toBeVisible()
|
|
161
|
+
|
|
162
|
+
// open submenu by clicking on submenu trigger
|
|
163
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
164
|
+
await submenuTrigger.click()
|
|
165
|
+
await page.waitForTimeout(300)
|
|
166
|
+
|
|
167
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
168
|
+
await expect(submenuContent).toBeVisible()
|
|
169
|
+
|
|
170
|
+
// focus a submenu item
|
|
171
|
+
const submenuItem = page.getByTestId('submenu-item-1')
|
|
172
|
+
await submenuItem.focus()
|
|
173
|
+
await expect(submenuItem).toBeFocused()
|
|
174
|
+
|
|
175
|
+
// press Escape - should close submenu only
|
|
176
|
+
await page.keyboard.press('Escape')
|
|
177
|
+
await page.waitForTimeout(300)
|
|
178
|
+
|
|
179
|
+
// submenu should be closed
|
|
180
|
+
await expect(submenuContent).not.toBeVisible()
|
|
181
|
+
|
|
182
|
+
// parent menu should still be open
|
|
183
|
+
await expect(menuContent).toBeVisible()
|
|
184
|
+
|
|
185
|
+
// focus should return to submenu trigger
|
|
186
|
+
await expect(submenuTrigger).toBeFocused()
|
|
187
|
+
|
|
188
|
+
// press Escape again - should close parent menu
|
|
189
|
+
await page.keyboard.press('Escape')
|
|
190
|
+
await page.waitForTimeout(300)
|
|
191
|
+
|
|
192
|
+
await expect(menuContent).not.toBeVisible()
|
|
193
|
+
|
|
194
|
+
// focus should return to main trigger
|
|
195
|
+
await expect(trigger).toBeFocused()
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
test('arrow right opens submenu and focuses first submenu item', async ({ page }) => {
|
|
199
|
+
await page.waitForLoadState('networkidle')
|
|
200
|
+
|
|
201
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
202
|
+
await trigger.click()
|
|
203
|
+
await page.waitForTimeout(300)
|
|
204
|
+
|
|
205
|
+
const menuContent = page.getByTestId('menu-content')
|
|
206
|
+
await expect(menuContent).toBeVisible()
|
|
207
|
+
|
|
208
|
+
// navigate to submenu trigger
|
|
209
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
210
|
+
await submenuTrigger.focus()
|
|
211
|
+
await expect(submenuTrigger).toBeFocused()
|
|
212
|
+
|
|
213
|
+
// press ArrowRight to open submenu
|
|
214
|
+
await page.keyboard.press('ArrowRight')
|
|
215
|
+
await page.waitForTimeout(300)
|
|
216
|
+
|
|
217
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
218
|
+
await expect(submenuContent).toBeVisible()
|
|
219
|
+
|
|
220
|
+
// first submenu item should be focused for keyboard users
|
|
221
|
+
const firstSubmenuItem = page.getByTestId('submenu-item-1')
|
|
222
|
+
await expect(firstSubmenuItem).toBeFocused()
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
test('arrow down in hover-opened submenu focuses first item', async ({ page }) => {
|
|
226
|
+
await page.waitForLoadState('networkidle')
|
|
227
|
+
|
|
228
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
229
|
+
await trigger.click()
|
|
230
|
+
await page.waitForTimeout(300)
|
|
231
|
+
|
|
232
|
+
// hover over submenu trigger to open submenu
|
|
233
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
234
|
+
await submenuTrigger.hover()
|
|
235
|
+
await page.waitForTimeout(500)
|
|
236
|
+
|
|
237
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
238
|
+
await expect(submenuContent).toBeVisible()
|
|
239
|
+
|
|
240
|
+
// focus the submenu content and press down
|
|
241
|
+
await submenuContent.focus()
|
|
242
|
+
await page.keyboard.press('ArrowDown')
|
|
243
|
+
await page.waitForTimeout(100)
|
|
244
|
+
|
|
245
|
+
const firstSubmenuItem = page.getByTestId('submenu-item-1')
|
|
246
|
+
await expect(firstSubmenuItem).toBeFocused()
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
test('arrow left closes submenu and returns to parent', async ({ page }) => {
|
|
250
|
+
await page.waitForLoadState('networkidle')
|
|
251
|
+
|
|
252
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
253
|
+
await trigger.click()
|
|
254
|
+
await page.waitForTimeout(300)
|
|
255
|
+
|
|
256
|
+
// open submenu
|
|
257
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
258
|
+
await submenuTrigger.click()
|
|
259
|
+
await page.waitForTimeout(300)
|
|
260
|
+
|
|
261
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
262
|
+
await expect(submenuContent).toBeVisible()
|
|
263
|
+
|
|
264
|
+
const submenuItem = page.getByTestId('submenu-item-1')
|
|
265
|
+
await submenuItem.focus()
|
|
266
|
+
|
|
267
|
+
// press ArrowLeft to close submenu
|
|
268
|
+
await page.keyboard.press('ArrowLeft')
|
|
269
|
+
await page.waitForTimeout(300)
|
|
270
|
+
|
|
271
|
+
await expect(submenuContent).not.toBeVisible()
|
|
272
|
+
|
|
273
|
+
// focus should return to submenu trigger in parent
|
|
274
|
+
await expect(submenuTrigger).toBeFocused()
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
test('tab key does not navigate within menu', async ({ page }) => {
|
|
278
|
+
await page.waitForLoadState('networkidle')
|
|
279
|
+
|
|
280
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
281
|
+
await trigger.click()
|
|
282
|
+
await page.waitForTimeout(300)
|
|
283
|
+
|
|
284
|
+
const menuContent = page.getByTestId('menu-content')
|
|
285
|
+
await expect(menuContent).toBeVisible()
|
|
286
|
+
|
|
287
|
+
const firstItem = page.getByTestId('menu-item-1')
|
|
288
|
+
await firstItem.focus()
|
|
289
|
+
await expect(firstItem).toBeFocused()
|
|
290
|
+
|
|
291
|
+
// press Tab - menu should close (standard menu behavior)
|
|
292
|
+
await page.keyboard.press('Tab')
|
|
293
|
+
await page.waitForTimeout(300)
|
|
294
|
+
|
|
295
|
+
// menu behavior varies - some close on Tab, some trap focus
|
|
296
|
+
// the key is that Tab doesn't navigate between items like ArrowDown does
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
test('space key opens submenu when focused on submenu trigger', async ({ page }) => {
|
|
300
|
+
await page.waitForLoadState('networkidle')
|
|
301
|
+
|
|
302
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
303
|
+
await trigger.focus()
|
|
304
|
+
await page.keyboard.press('Enter')
|
|
305
|
+
await page.waitForTimeout(300)
|
|
306
|
+
|
|
307
|
+
const menuContent = page.getByTestId('menu-content')
|
|
308
|
+
await expect(menuContent).toBeVisible()
|
|
309
|
+
|
|
310
|
+
// navigate to submenu trigger
|
|
311
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
312
|
+
await submenuTrigger.focus()
|
|
313
|
+
await expect(submenuTrigger).toBeFocused()
|
|
314
|
+
|
|
315
|
+
// press Space to open submenu
|
|
316
|
+
await page.keyboard.press('Space')
|
|
317
|
+
await page.waitForTimeout(300)
|
|
318
|
+
|
|
319
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
320
|
+
await expect(submenuContent).toBeVisible()
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
test('enter key opens submenu when focused on submenu trigger', async ({ page }) => {
|
|
324
|
+
await page.waitForLoadState('networkidle')
|
|
325
|
+
|
|
326
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
327
|
+
await trigger.focus()
|
|
328
|
+
await page.keyboard.press('Enter')
|
|
329
|
+
await page.waitForTimeout(300)
|
|
330
|
+
|
|
331
|
+
const menuContent = page.getByTestId('menu-content')
|
|
332
|
+
await expect(menuContent).toBeVisible()
|
|
333
|
+
|
|
334
|
+
// navigate to submenu trigger
|
|
335
|
+
const submenuTrigger = page.getByTestId('submenu-trigger')
|
|
336
|
+
await submenuTrigger.focus()
|
|
337
|
+
await expect(submenuTrigger).toBeFocused()
|
|
338
|
+
|
|
339
|
+
// press Enter to open submenu
|
|
340
|
+
await page.keyboard.press('Enter')
|
|
341
|
+
await page.waitForTimeout(300)
|
|
342
|
+
|
|
343
|
+
const submenuContent = page.getByTestId('submenu-content')
|
|
344
|
+
await expect(submenuContent).toBeVisible()
|
|
345
|
+
})
|
|
346
|
+
})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { getBoundingRect, setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.describe('Menu animatePosition', () => {
|
|
5
|
+
test.beforeEach(async ({ page }) => {
|
|
6
|
+
await setupPage(page, {
|
|
7
|
+
name: 'MenuAnimatePositionCase',
|
|
8
|
+
type: 'useCase',
|
|
9
|
+
waitExtra: true,
|
|
10
|
+
})
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
test('content appears near the trigger that opened it', async ({ page }) => {
|
|
14
|
+
const triggerLeft = page.getByTestId('trigger-left')
|
|
15
|
+
await triggerLeft.click()
|
|
16
|
+
await page.waitForTimeout(400)
|
|
17
|
+
|
|
18
|
+
const content = page.getByTestId('menu-content')
|
|
19
|
+
await expect(content).toBeVisible()
|
|
20
|
+
|
|
21
|
+
const triggerBox = await getBoundingRect(page, '[data-testid="trigger-left"]')
|
|
22
|
+
const contentBox = await getBoundingRect(page, '[data-testid="menu-content"]')
|
|
23
|
+
expect(triggerBox).not.toBeNull()
|
|
24
|
+
expect(contentBox).not.toBeNull()
|
|
25
|
+
|
|
26
|
+
// content should be horizontally aligned near the left trigger
|
|
27
|
+
expect(Math.abs(contentBox!.x - triggerBox!.x)).toBeLessThan(50)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('content has transition style when animatePosition is set', async ({ page }) => {
|
|
31
|
+
const triggerLeft = page.getByTestId('trigger-left')
|
|
32
|
+
await triggerLeft.click()
|
|
33
|
+
await page.waitForTimeout(400)
|
|
34
|
+
|
|
35
|
+
const content = page.getByTestId('menu-content')
|
|
36
|
+
await expect(content).toBeVisible()
|
|
37
|
+
|
|
38
|
+
// check that the content element (or its popper wrapper) has a CSS transition
|
|
39
|
+
const hasTransition = await content.evaluate((el) => {
|
|
40
|
+
let node: Element | null = el
|
|
41
|
+
while (node) {
|
|
42
|
+
const style = getComputedStyle(node)
|
|
43
|
+
if (
|
|
44
|
+
style.transition &&
|
|
45
|
+
style.transition !== 'none' &&
|
|
46
|
+
style.transition !== 'all 0s ease 0s'
|
|
47
|
+
) {
|
|
48
|
+
return true
|
|
49
|
+
}
|
|
50
|
+
node = node.parentElement
|
|
51
|
+
}
|
|
52
|
+
return false
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
expect(hasTransition).toBe(true)
|
|
56
|
+
})
|
|
57
|
+
})
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test for Menu/Popover arrow visibility with AnimatePresence
|
|
5
|
+
* Issue: When arrow is wrapped in AnimatePresence, Motion driver applies opacity: 0
|
|
6
|
+
* that doesn't animate back to opacity: 1
|
|
7
|
+
*/
|
|
8
|
+
test.describe('Menu Arrow with AnimatePresence', () => {
|
|
9
|
+
test('popover arrow is visible when wrapped in AnimatePresence', async ({ page }) => {
|
|
10
|
+
await page.goto('/?test=MenuArrowAnimatePresenceCase')
|
|
11
|
+
await page.waitForTimeout(500)
|
|
12
|
+
|
|
13
|
+
// open the popover
|
|
14
|
+
const trigger = page.getByTestId('popover-trigger')
|
|
15
|
+
await trigger.click()
|
|
16
|
+
await page.waitForTimeout(500)
|
|
17
|
+
|
|
18
|
+
// find the arrow elements
|
|
19
|
+
const arrowOuter = page.locator('[class*="PopperArrowOuter"]').first()
|
|
20
|
+
const arrowInner = arrowOuter
|
|
21
|
+
.locator('[class*="PopoverArrow"], [class*="PopperArrow"]')
|
|
22
|
+
.first()
|
|
23
|
+
|
|
24
|
+
// verify outer arrow exists and is visible
|
|
25
|
+
await expect(arrowOuter).toBeVisible()
|
|
26
|
+
|
|
27
|
+
// get inner arrow computed opacity - this is the critical check
|
|
28
|
+
const innerOpacity = await arrowInner.evaluate((el) => {
|
|
29
|
+
return getComputedStyle(el).opacity
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// inner arrow should have opacity 1, not 0
|
|
33
|
+
expect(Number.parseFloat(innerOpacity)).toBeGreaterThan(0.5)
|
|
34
|
+
|
|
35
|
+
// check inline style doesn't have opacity: 0
|
|
36
|
+
const inlineStyle = await arrowInner.getAttribute('style')
|
|
37
|
+
console.log('Arrow inline style:', inlineStyle)
|
|
38
|
+
|
|
39
|
+
// the bug causes inline style to contain "opacity: 0"
|
|
40
|
+
if (inlineStyle) {
|
|
41
|
+
expect(inlineStyle).not.toContain('opacity: 0')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// verify arrow is actually visible by checking bounding box
|
|
45
|
+
const arrowBox = await arrowOuter.boundingBox()
|
|
46
|
+
expect(arrowBox).not.toBeNull()
|
|
47
|
+
expect(arrowBox!.width).toBeGreaterThan(0)
|
|
48
|
+
expect(arrowBox!.height).toBeGreaterThan(0)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('menu arrow is visible without AnimatePresence', async ({ page }) => {
|
|
52
|
+
await page.goto('/?test=MenuArrowAnimatePresenceCase')
|
|
53
|
+
await page.waitForTimeout(500)
|
|
54
|
+
|
|
55
|
+
// open the menu
|
|
56
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
57
|
+
await trigger.click()
|
|
58
|
+
await page.waitForTimeout(500)
|
|
59
|
+
|
|
60
|
+
// find the arrow
|
|
61
|
+
const arrowOuter = page.locator('[class*="PopperArrowOuter"]').first()
|
|
62
|
+
|
|
63
|
+
// verify arrow exists and is visible
|
|
64
|
+
await expect(arrowOuter).toBeVisible()
|
|
65
|
+
|
|
66
|
+
const arrowBox = await arrowOuter.boundingBox()
|
|
67
|
+
expect(arrowBox).not.toBeNull()
|
|
68
|
+
expect(arrowBox!.width).toBeGreaterThan(0)
|
|
69
|
+
expect(arrowBox!.height).toBeGreaterThan(0)
|
|
70
|
+
})
|
|
71
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
test.beforeEach(async ({ page }) => {
|
|
4
|
+
await page.goto('/?test=MenuAsChildPositionCase')
|
|
5
|
+
})
|
|
6
|
+
|
|
7
|
+
test('Menu.Trigger asChild does not leak position static class to child', async ({
|
|
8
|
+
page,
|
|
9
|
+
}) => {
|
|
10
|
+
const menuTrigger = page.locator('[data-testid="menu-trigger-button"]')
|
|
11
|
+
await expect(menuTrigger).toBeVisible()
|
|
12
|
+
|
|
13
|
+
// should not have _pos-static class leaked from View defaults via asChild
|
|
14
|
+
const className = await menuTrigger.getAttribute('class')
|
|
15
|
+
expect(className).not.toContain('_pos-static')
|
|
16
|
+
})
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.describe('Menu Auto Resize', () => {
|
|
5
|
+
test('menu resizes to fit in small viewport', async ({ page }) => {
|
|
6
|
+
// set a very small viewport height
|
|
7
|
+
await page.setViewportSize({ width: 400, height: 300 })
|
|
8
|
+
|
|
9
|
+
await setupPage(page, { name: 'MenuAutoResizeCase', type: 'useCase' })
|
|
10
|
+
await page.waitForLoadState('networkidle')
|
|
11
|
+
|
|
12
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
13
|
+
await trigger.click()
|
|
14
|
+
await page.waitForTimeout(300)
|
|
15
|
+
|
|
16
|
+
const menuContent = page.getByTestId('menu-content')
|
|
17
|
+
await expect(menuContent).toBeVisible()
|
|
18
|
+
|
|
19
|
+
// get menu content bounding box
|
|
20
|
+
const boundingBox = await menuContent.boundingBox()
|
|
21
|
+
const viewportSize = page.viewportSize()
|
|
22
|
+
|
|
23
|
+
expect(boundingBox).not.toBeNull()
|
|
24
|
+
expect(viewportSize).not.toBeNull()
|
|
25
|
+
|
|
26
|
+
if (boundingBox && viewportSize) {
|
|
27
|
+
// menu should NOT extend beyond viewport top
|
|
28
|
+
expect(boundingBox.y).toBeGreaterThanOrEqual(0)
|
|
29
|
+
// menu should NOT extend beyond viewport bottom
|
|
30
|
+
expect(boundingBox.y + boundingBox.height).toBeLessThanOrEqual(viewportSize.height)
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('menu scroll view uses available height CSS variable', async ({ page }) => {
|
|
35
|
+
await page.setViewportSize({ width: 400, height: 300 })
|
|
36
|
+
|
|
37
|
+
await setupPage(page, { name: 'MenuAutoResizeCase', type: 'useCase' })
|
|
38
|
+
await page.waitForLoadState('networkidle')
|
|
39
|
+
|
|
40
|
+
const trigger = page.getByTestId('menu-trigger')
|
|
41
|
+
await trigger.click()
|
|
42
|
+
await page.waitForTimeout(300)
|
|
43
|
+
|
|
44
|
+
const menuScrollView = page.getByTestId('menu-scroll-view')
|
|
45
|
+
await expect(menuScrollView).toBeVisible()
|
|
46
|
+
|
|
47
|
+
// the scroll view should be scrollable (content exceeds available height)
|
|
48
|
+
const isScrollable = await menuScrollView.evaluate((el) => {
|
|
49
|
+
return el.scrollHeight > el.clientHeight
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
expect(isScrollable).toBe(true)
|
|
53
|
+
})
|
|
54
|
+
})
|