@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,129 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
import { getStyles } from './utils'
|
|
5
|
+
|
|
6
|
+
test.beforeEach(async ({ page }) => {
|
|
7
|
+
await setupPage(page, { name: 'ThemedListItem', type: 'useCase' })
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test('ListItem renders correctly with default theme', async ({ page }) => {
|
|
11
|
+
const listItem = page.locator('#themed-list-item-default')
|
|
12
|
+
const title = listItem.getByText('Default', { exact: true })
|
|
13
|
+
const subTitle = listItem.getByText('Default list item', { exact: true })
|
|
14
|
+
|
|
15
|
+
await expect(listItem).toBeVisible()
|
|
16
|
+
await expect(title).toBeVisible()
|
|
17
|
+
await expect(subTitle).toBeVisible()
|
|
18
|
+
|
|
19
|
+
const styles = await getStyles(listItem)
|
|
20
|
+
expect(styles.backgroundColor).toBe('rgb(242, 242, 242)')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('ListItem renders correctly with light theme', async ({ page }) => {
|
|
24
|
+
const listItem = page.locator('#themed-list-item-light')
|
|
25
|
+
const title = listItem.getByText('<Theme ="light"/>', { exact: true })
|
|
26
|
+
const subTitle = listItem.getByText('Forcing light theme', { exact: true })
|
|
27
|
+
|
|
28
|
+
await expect(listItem).toBeVisible()
|
|
29
|
+
await expect(title).toBeVisible()
|
|
30
|
+
await expect(subTitle).toBeVisible()
|
|
31
|
+
|
|
32
|
+
const styles = await getStyles(listItem)
|
|
33
|
+
expect(styles.backgroundColor).toBe('rgb(242, 242, 242)')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('ListItem renders correctly with dark theme', async ({ page }) => {
|
|
37
|
+
const listItem = page.locator('#themed-list-item-dark')
|
|
38
|
+
const title = listItem.getByText('<Theme ="dark"/>', { exact: true })
|
|
39
|
+
const subTitle = listItem.getByText('Forcing dark theme', { exact: true })
|
|
40
|
+
|
|
41
|
+
await expect(listItem).toBeVisible()
|
|
42
|
+
await expect(title).toBeVisible()
|
|
43
|
+
await expect(subTitle).toBeVisible()
|
|
44
|
+
|
|
45
|
+
const styles = await getStyles(listItem)
|
|
46
|
+
expect(styles.backgroundColor).toBe('rgb(10, 10, 10)')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('ListItem with accent theme renders correctly in light theme', async ({ page }) => {
|
|
50
|
+
const listItem = page.locator('#themed-list-item-light-accent')
|
|
51
|
+
const title = listItem.getByText('<Theme name="accent">', { exact: true })
|
|
52
|
+
const subTitle = listItem.getByText('light + accent = light_accent (contrasting)', {
|
|
53
|
+
exact: true,
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
await expect(listItem).toBeVisible()
|
|
57
|
+
await expect(title).toBeVisible()
|
|
58
|
+
await expect(subTitle).toBeVisible()
|
|
59
|
+
|
|
60
|
+
// Accent theme inverts colors - light + accent = dark background
|
|
61
|
+
const styles = await getStyles(listItem)
|
|
62
|
+
const match = styles.backgroundColor.match(/rgb\((\d+), (\d+), (\d+)\)/)
|
|
63
|
+
expect(match).toBeTruthy()
|
|
64
|
+
const [, r, g, b] = match!.map(Number)
|
|
65
|
+
expect(r).toBeLessThan(50)
|
|
66
|
+
expect(g).toBeLessThan(50)
|
|
67
|
+
expect(b).toBeLessThan(50)
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('ListItem with accent theme renders correctly in dark theme', async ({ page }) => {
|
|
71
|
+
const listItem = page.locator('#themed-list-item-dark-accent')
|
|
72
|
+
const title = listItem.getByText('<Theme name="accent">', { exact: true })
|
|
73
|
+
const subTitle = listItem.getByText('dark + accent = dark_accent (contrasting)', {
|
|
74
|
+
exact: true,
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
await expect(listItem).toBeVisible()
|
|
78
|
+
await expect(title).toBeVisible()
|
|
79
|
+
await expect(subTitle).toBeVisible()
|
|
80
|
+
|
|
81
|
+
// Accent theme inverts colors - dark + accent = light background
|
|
82
|
+
const styles = await getStyles(listItem)
|
|
83
|
+
const match = styles.backgroundColor.match(/rgb\((\d+), (\d+), (\d+)\)/)
|
|
84
|
+
expect(match).toBeTruthy()
|
|
85
|
+
const [, r, g, b] = match!.map(Number)
|
|
86
|
+
expect(r).toBeGreaterThan(200)
|
|
87
|
+
expect(g).toBeGreaterThan(200)
|
|
88
|
+
expect(b).toBeGreaterThan(200)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('ListItem renders correctly with outlined variant', async ({ page }) => {
|
|
92
|
+
const listItem = page.locator('#themed-list-item-outlined')
|
|
93
|
+
const title = listItem.getByText('Outlined', { exact: true })
|
|
94
|
+
const subTitle = listItem.getByText('Using variant prop', { exact: true })
|
|
95
|
+
|
|
96
|
+
await expect(listItem).toBeVisible()
|
|
97
|
+
await expect(title).toBeVisible()
|
|
98
|
+
await expect(subTitle).toBeVisible()
|
|
99
|
+
|
|
100
|
+
const styles = await getStyles(listItem)
|
|
101
|
+
// Outlined variant has transparent background and border
|
|
102
|
+
expect(styles.backgroundColor).toBe('rgba(0, 0, 0, 0)')
|
|
103
|
+
expect(styles.borderWidth).toBe('1px')
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
test('ListItem.Apply passes color to children icons', async ({ page }) => {
|
|
107
|
+
const listItem = page.locator('#themed-list-item-apply-color')
|
|
108
|
+
const title = listItem.getByText('With Apply color', { exact: true })
|
|
109
|
+
|
|
110
|
+
await expect(listItem).toBeVisible()
|
|
111
|
+
await expect(title).toBeVisible()
|
|
112
|
+
|
|
113
|
+
// Check that the icon received the color from Apply context
|
|
114
|
+
const icon = listItem.locator('svg')
|
|
115
|
+
await expect(icon).toBeVisible()
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
test('ListItem.Apply passes variant to children', async ({ page }) => {
|
|
119
|
+
const listItem = page.locator('#themed-list-item-apply-variant')
|
|
120
|
+
const title = listItem.getByText('With Apply variant', { exact: true })
|
|
121
|
+
|
|
122
|
+
await expect(listItem).toBeVisible()
|
|
123
|
+
await expect(title).toBeVisible()
|
|
124
|
+
|
|
125
|
+
const styles = await getStyles(listItem)
|
|
126
|
+
// Outlined variant applied via Apply context
|
|
127
|
+
expect(styles.backgroundColor).toBe('rgba(0, 0, 0, 0)')
|
|
128
|
+
expect(styles.borderWidth).toBe('1px')
|
|
129
|
+
})
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
import { getStyles } from './utils'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Tests for v5 media queries with mobile-first (minWidth) and desktop-first (maxWidth)
|
|
8
|
+
*
|
|
9
|
+
* v5 uses:
|
|
10
|
+
* - minWidth for base queries ($sm, $md, $lg, etc.) - mobile-first: larger wins
|
|
11
|
+
* - maxWidth for max-* queries ($max-sm, $max-md, etc.) - desktop-first: smaller wins
|
|
12
|
+
*
|
|
13
|
+
* NOTE: These tests are currently skipped because the kitchen-sink webpack build
|
|
14
|
+
* evaluates the config selection at bundle time (when window.location is undefined),
|
|
15
|
+
* not at runtime. The v5config query param doesn't work for dynamic config switching.
|
|
16
|
+
*
|
|
17
|
+
* The v5 media config itself is correct - see code/core/config/src/v5-media.ts
|
|
18
|
+
* To properly test, the kitchen-sink would need to be built with v5 config as default,
|
|
19
|
+
* or use a different mechanism for config switching.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
test.describe.skip('v5 Media Queries', () => {
|
|
23
|
+
test.describe('Mobile-first (minWidth) - larger breakpoints should win', () => {
|
|
24
|
+
test.beforeEach(async ({ page }) => {
|
|
25
|
+
// use v5config query param to enable v5 media config
|
|
26
|
+
await setupPage(page, {
|
|
27
|
+
name: 'MediaQueriesV5',
|
|
28
|
+
type: 'useCase',
|
|
29
|
+
searchParams: { v5config: 'true' },
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
test('on large viewport (1280px), $lg should win over $sm and $md', async ({
|
|
34
|
+
page,
|
|
35
|
+
}) => {
|
|
36
|
+
await page.setViewportSize({ width: 1280, height: 800 })
|
|
37
|
+
const element = page.locator('[data-testid="test-mobile-first"]')
|
|
38
|
+
const styles = await getStyles(element)
|
|
39
|
+
// lg (1024) should be active and win over sm (640) and md (768)
|
|
40
|
+
expect(styles.backgroundColor).toBe('rgb(0, 128, 0)') // green from $lg
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('on medium viewport (900px), $md should win over $sm', async ({ page }) => {
|
|
44
|
+
await page.setViewportSize({ width: 900, height: 800 })
|
|
45
|
+
const element = page.locator('[data-testid="test-mobile-first"]')
|
|
46
|
+
const styles = await getStyles(element)
|
|
47
|
+
// md (768) should be active and win over sm (640)
|
|
48
|
+
expect(styles.backgroundColor).toBe('rgb(255, 165, 0)') // orange from $md
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test('on small viewport (700px), $sm should apply', async ({ page }) => {
|
|
52
|
+
await page.setViewportSize({ width: 700, height: 800 })
|
|
53
|
+
const element = page.locator('[data-testid="test-mobile-first"]')
|
|
54
|
+
const styles = await getStyles(element)
|
|
55
|
+
// only sm (640) should be active
|
|
56
|
+
expect(styles.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $sm
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
test('on tiny viewport (500px), base (red) should apply', async ({ page }) => {
|
|
60
|
+
await page.setViewportSize({ width: 500, height: 800 })
|
|
61
|
+
const element = page.locator('[data-testid="test-mobile-first"]')
|
|
62
|
+
const styles = await getStyles(element)
|
|
63
|
+
// none of the breakpoints should be active
|
|
64
|
+
expect(styles.backgroundColor).toBe('rgb(255, 0, 0)') // red (base)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test.describe('Desktop-first (maxWidth) - smaller breakpoints should win', () => {
|
|
69
|
+
test.beforeEach(async ({ page }) => {
|
|
70
|
+
await setupPage(page, {
|
|
71
|
+
name: 'MediaQueriesV5',
|
|
72
|
+
type: 'useCase',
|
|
73
|
+
searchParams: { v5config: 'true' },
|
|
74
|
+
})
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
test('on tiny viewport (500px), $max-sm should win over $max-md and $max-lg', async ({
|
|
78
|
+
page,
|
|
79
|
+
}) => {
|
|
80
|
+
await page.setViewportSize({ width: 500, height: 800 })
|
|
81
|
+
const element = page.locator('[data-testid="test-desktop-first"]')
|
|
82
|
+
const styles = await getStyles(element)
|
|
83
|
+
// max-sm (640), max-md (768), max-lg (1024) all match, but max-sm should win
|
|
84
|
+
expect(styles.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $max-sm
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test('on medium viewport (700px), $max-md should win over $max-lg', async ({
|
|
88
|
+
page,
|
|
89
|
+
}) => {
|
|
90
|
+
await page.setViewportSize({ width: 700, height: 800 })
|
|
91
|
+
const element = page.locator('[data-testid="test-desktop-first"]')
|
|
92
|
+
const styles = await getStyles(element)
|
|
93
|
+
// max-md (768), max-lg (1024) match, but max-md should win
|
|
94
|
+
expect(styles.backgroundColor).toBe('rgb(255, 165, 0)') // orange from $max-md
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
test('on large viewport (900px), $max-lg should apply', async ({ page }) => {
|
|
98
|
+
await page.setViewportSize({ width: 900, height: 800 })
|
|
99
|
+
const element = page.locator('[data-testid="test-desktop-first"]')
|
|
100
|
+
const styles = await getStyles(element)
|
|
101
|
+
// only max-lg (1024) should match
|
|
102
|
+
expect(styles.backgroundColor).toBe('rgb(0, 128, 0)') // green from $max-lg
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
test('on huge viewport (1200px), base (red) should apply', async ({ page }) => {
|
|
106
|
+
await page.setViewportSize({ width: 1200, height: 800 })
|
|
107
|
+
const element = page.locator('[data-testid="test-desktop-first"]')
|
|
108
|
+
const styles = await getStyles(element)
|
|
109
|
+
// none of the max-* breakpoints should match
|
|
110
|
+
expect(styles.backgroundColor).toBe('rgb(255, 0, 0)') // red (base)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
})
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
import { getStyles } from './utils'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Regression test for media query bug starting in 1.132.17
|
|
8
|
+
*
|
|
9
|
+
* Bug: On small screens, $gtMd styles incorrectly apply.
|
|
10
|
+
* The compiler is generating incorrect output where $gtMd overrides $md
|
|
11
|
+
* even when the viewport is below the $gtMd breakpoint.
|
|
12
|
+
*
|
|
13
|
+
* Adding debug="verbose" fixes it, confirming compiler issue.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
test.describe('Media Query $gtMd regression', () => {
|
|
17
|
+
test.describe('Small viewport (mobile - below md breakpoint)', () => {
|
|
18
|
+
test.beforeEach(async ({ page }) => {
|
|
19
|
+
await setupPage(page, { name: 'MediaQueryGtMd', type: 'useCase' })
|
|
20
|
+
// Set viewport to small size (below md breakpoint of 660px)
|
|
21
|
+
await page.setViewportSize({ width: 500, height: 800 })
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
test('$md should apply, NOT $gtMd on small screens', async ({ page }) => {
|
|
25
|
+
// Test 1: Both $md and $gtMd - $md should win on small screen
|
|
26
|
+
const test1 = page.locator('#media-test-both')
|
|
27
|
+
const styles1 = await getStyles(test1)
|
|
28
|
+
expect(styles1.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $md, NOT green from $gtMd
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
test('$gtMd should NOT apply on small screens', async ({ page }) => {
|
|
32
|
+
// Test 2: Only $gtMd - should stay red (base) on small screen
|
|
33
|
+
const test2 = page.locator('#media-test-gtmd-only')
|
|
34
|
+
const styles2 = await getStyles(test2)
|
|
35
|
+
expect(styles2.backgroundColor).toBe('rgb(255, 0, 0)') // red (base), $gtMd should NOT apply
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
test('$md should apply on small screens', async ({ page }) => {
|
|
39
|
+
// Test 3: Only $md - should be yellow on small screen
|
|
40
|
+
const test3 = page.locator('#media-test-md-only')
|
|
41
|
+
const styles3 = await getStyles(test3)
|
|
42
|
+
expect(styles3.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $md
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('$sm should apply on extra small screens', async ({ page }) => {
|
|
46
|
+
// Set to very small viewport to test $sm
|
|
47
|
+
await page.setViewportSize({ width: 400, height: 800 })
|
|
48
|
+
|
|
49
|
+
// Test 4: $sm, $md, $gtMd together - $sm should win on extra small
|
|
50
|
+
const test4 = page.locator('#media-test-all')
|
|
51
|
+
const styles4 = await getStyles(test4)
|
|
52
|
+
expect(styles4.backgroundColor).toBe('rgb(0, 0, 255)') // blue from $sm
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
test.describe('Large viewport (desktop - above gtMd breakpoint)', () => {
|
|
57
|
+
test.beforeEach(async ({ page }) => {
|
|
58
|
+
await setupPage(page, { name: 'MediaQueryGtMd', type: 'useCase' })
|
|
59
|
+
// Set viewport to large size (above gtMd breakpoint of 1021px)
|
|
60
|
+
await page.setViewportSize({ width: 1100, height: 800 })
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test('$gtMd should apply on large screens', async ({ page }) => {
|
|
64
|
+
// Test 1: Both $md and $gtMd - $gtMd should win on large screen
|
|
65
|
+
const test1 = page.locator('#media-test-both')
|
|
66
|
+
const styles1 = await getStyles(test1)
|
|
67
|
+
expect(styles1.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
test('$gtMd should apply when only $gtMd is set', async ({ page }) => {
|
|
71
|
+
// Test 2: Only $gtMd - should be green on large screen
|
|
72
|
+
const test2 = page.locator('#media-test-gtmd-only')
|
|
73
|
+
const styles2 = await getStyles(test2)
|
|
74
|
+
expect(styles2.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
test('all three media queries - $gtMd wins on large screen', async ({ page }) => {
|
|
78
|
+
// Test 4: $sm, $md, $gtMd together - $gtMd should win on large screen
|
|
79
|
+
const test4 = page.locator('#media-test-all')
|
|
80
|
+
const styles4 = await getStyles(test4)
|
|
81
|
+
expect(styles4.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
})
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { type: 'useCase', name: 'MenuAboveDialogCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test('menu renders above dialog overlay', async ({ page }) => {
|
|
9
|
+
await page.waitForLoadState('networkidle')
|
|
10
|
+
|
|
11
|
+
// open dialog
|
|
12
|
+
const dialogTrigger = page.getByTestId('dialog-trigger')
|
|
13
|
+
await dialogTrigger.click()
|
|
14
|
+
|
|
15
|
+
const dialogContent = page.getByTestId('dialog-content')
|
|
16
|
+
await expect(dialogContent).toBeVisible({ timeout: 5000 })
|
|
17
|
+
await page.waitForTimeout(300)
|
|
18
|
+
|
|
19
|
+
// open menu inside dialog
|
|
20
|
+
const menuTrigger = page.getByTestId('menu-trigger')
|
|
21
|
+
await menuTrigger.click()
|
|
22
|
+
|
|
23
|
+
const menuContent = page.getByTestId('menu-content')
|
|
24
|
+
await expect(menuContent).toBeVisible({ timeout: 5000 })
|
|
25
|
+
|
|
26
|
+
// verify menu is clickable (proves it's above dialog)
|
|
27
|
+
const menuItem = page.getByTestId('menu-item-1')
|
|
28
|
+
await expect(menuItem).toBeVisible()
|
|
29
|
+
|
|
30
|
+
// get z-index of portal containers (the fixed positioned wrappers)
|
|
31
|
+
const dialogPortalZIndex = await page.evaluate(() => {
|
|
32
|
+
const dialogContent = document.querySelector('[data-testid="dialog-content"]')
|
|
33
|
+
// find the portal container (fixed position ancestor with z-index)
|
|
34
|
+
let el = dialogContent?.parentElement
|
|
35
|
+
while (el) {
|
|
36
|
+
const style = window.getComputedStyle(el)
|
|
37
|
+
if (style.position === 'fixed' && style.zIndex !== 'auto') {
|
|
38
|
+
return parseInt(style.zIndex)
|
|
39
|
+
}
|
|
40
|
+
el = el.parentElement
|
|
41
|
+
}
|
|
42
|
+
return 0
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const menuPortalZIndex = await page.evaluate(() => {
|
|
46
|
+
const menuContent = document.querySelector('[data-testid="menu-content"]')
|
|
47
|
+
// find the portal container (fixed position ancestor with z-index)
|
|
48
|
+
let el = menuContent?.parentElement
|
|
49
|
+
while (el) {
|
|
50
|
+
const style = window.getComputedStyle(el)
|
|
51
|
+
if (style.position === 'fixed' && style.zIndex !== 'auto') {
|
|
52
|
+
return parseInt(style.zIndex)
|
|
53
|
+
}
|
|
54
|
+
el = el.parentElement
|
|
55
|
+
}
|
|
56
|
+
return 0
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
// menu portal should have higher z-index than dialog portal
|
|
60
|
+
console.log(
|
|
61
|
+
`Dialog portal z-index: ${dialogPortalZIndex}, Menu portal z-index: ${menuPortalZIndex}`
|
|
62
|
+
)
|
|
63
|
+
expect(menuPortalZIndex).toBeGreaterThan(dialogPortalZIndex)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test('menu closes on ESC, dialog stays open', async ({ page }) => {
|
|
67
|
+
await page.waitForLoadState('networkidle')
|
|
68
|
+
|
|
69
|
+
// open dialog
|
|
70
|
+
await page.getByTestId('dialog-trigger').click()
|
|
71
|
+
await expect(page.getByTestId('dialog-content')).toBeVisible({ timeout: 5000 })
|
|
72
|
+
await page.waitForTimeout(300)
|
|
73
|
+
|
|
74
|
+
// open menu
|
|
75
|
+
await page.getByTestId('menu-trigger').click()
|
|
76
|
+
await expect(page.getByTestId('menu-content')).toBeVisible({ timeout: 5000 })
|
|
77
|
+
await page.waitForTimeout(200)
|
|
78
|
+
|
|
79
|
+
// press ESC - menu should close, dialog should stay open
|
|
80
|
+
await page.keyboard.press('Escape')
|
|
81
|
+
await page.waitForTimeout(400)
|
|
82
|
+
|
|
83
|
+
await expect(page.getByTestId('menu-content')).not.toBeVisible({ timeout: 5000 })
|
|
84
|
+
await expect(page.getByTestId('dialog-content')).toBeVisible()
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
test('clicking menu item works when menu is above dialog', async ({ page }) => {
|
|
88
|
+
await page.waitForLoadState('networkidle')
|
|
89
|
+
|
|
90
|
+
// open dialog
|
|
91
|
+
await page.getByTestId('dialog-trigger').click()
|
|
92
|
+
await expect(page.getByTestId('dialog-content')).toBeVisible({ timeout: 5000 })
|
|
93
|
+
await page.waitForTimeout(300)
|
|
94
|
+
|
|
95
|
+
// open menu
|
|
96
|
+
await page.getByTestId('menu-trigger').click()
|
|
97
|
+
await expect(page.getByTestId('menu-content')).toBeVisible({ timeout: 5000 })
|
|
98
|
+
await page.waitForTimeout(200)
|
|
99
|
+
|
|
100
|
+
// click menu item - should work without being blocked by dialog
|
|
101
|
+
const menuItem = page.getByTestId('menu-item-2')
|
|
102
|
+
await menuItem.click()
|
|
103
|
+
|
|
104
|
+
// menu should close after item click
|
|
105
|
+
await expect(page.getByTestId('menu-content')).not.toBeVisible({ timeout: 5000 })
|
|
106
|
+
// dialog should still be open
|
|
107
|
+
await expect(page.getByTestId('dialog-content')).toBeVisible()
|
|
108
|
+
})
|