@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,119 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
import { getStyles } from './utils'
|
|
5
|
+
|
|
6
|
+
// Test for GitHub issue #3676 - Context Values Not Accessible in Children Styles
|
|
7
|
+
|
|
8
|
+
test.beforeEach(async ({ page }) => {
|
|
9
|
+
await setupPage(page, { name: 'StyledContextColor', type: 'useCase' })
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test(`standard Button passes color to text children`, async ({ page }) => {
|
|
13
|
+
// Find the button and get the text element inside
|
|
14
|
+
const button = page.getByTestId('standard-button-green')
|
|
15
|
+
await expect(button).toBeVisible()
|
|
16
|
+
|
|
17
|
+
// The text inside the button should have green color
|
|
18
|
+
const text = button.locator('span').first()
|
|
19
|
+
const styles = await getStyles(text)
|
|
20
|
+
|
|
21
|
+
// Color should be green (rgb format)
|
|
22
|
+
expect(styles.color).toContain('0, 128, 0') // green in rgb
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
test(`custom button with color variant passes color to ButtonText via context`, async ({
|
|
26
|
+
page,
|
|
27
|
+
}) => {
|
|
28
|
+
const button = page.getByTestId('custom-button-green')
|
|
29
|
+
await expect(button).toBeVisible()
|
|
30
|
+
|
|
31
|
+
// Find the text element inside
|
|
32
|
+
const text = button.locator('span').first()
|
|
33
|
+
const textStyles = await getStyles(text)
|
|
34
|
+
|
|
35
|
+
// Text should be green - this is the core issue from #3676
|
|
36
|
+
// The color variant on the parent should propagate to children via context
|
|
37
|
+
expect(textStyles.color).toContain('0, 128, 0') // green in rgb
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test(`custom button with red color variant passes to text`, async ({ page }) => {
|
|
41
|
+
const button = page.getByTestId('custom-button-red')
|
|
42
|
+
await expect(button).toBeVisible()
|
|
43
|
+
|
|
44
|
+
const text = button.locator('span').first()
|
|
45
|
+
const textStyles = await getStyles(text)
|
|
46
|
+
|
|
47
|
+
// Text should be red
|
|
48
|
+
expect(textStyles.color).toContain('255, 0, 0') // red in rgb
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test(`explicit context provider passes color to children`, async ({ page }) => {
|
|
52
|
+
const text = page.getByTestId('context-text-blue')
|
|
53
|
+
await expect(text).toBeVisible()
|
|
54
|
+
|
|
55
|
+
const textStyles = await getStyles(text)
|
|
56
|
+
|
|
57
|
+
// Text should be blue
|
|
58
|
+
expect(textStyles.color).toContain('0, 0, 255') // blue in rgb
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
// This is the key test for issue #3676 - $color reference to context value
|
|
62
|
+
// Test with explicit Provider (like direct Button usage with color prop)
|
|
63
|
+
test(`$color reference in child variant gets parent color from Provider (issue #3676)`, async ({
|
|
64
|
+
page,
|
|
65
|
+
}) => {
|
|
66
|
+
const text = page.getByTestId('context-ref-text-link')
|
|
67
|
+
await expect(text).toBeVisible()
|
|
68
|
+
|
|
69
|
+
const textStyles = await getStyles(text)
|
|
70
|
+
|
|
71
|
+
// Text should be green because:
|
|
72
|
+
// 1. Provider sets color: 'green'
|
|
73
|
+
// 2. Child uses color: '$color' which should resolve to 'green' from context
|
|
74
|
+
expect(textStyles.color).toContain('0, 128, 0') // green in rgb
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
// Test with variant setting color (more complex case)
|
|
78
|
+
test(`$color reference works when parent variant sets color`, async ({ page }) => {
|
|
79
|
+
const button = page.getByTestId('context-ref-button-primary')
|
|
80
|
+
await expect(button).toBeVisible()
|
|
81
|
+
|
|
82
|
+
const text = button.locator('span').first()
|
|
83
|
+
const textStyles = await getStyles(text)
|
|
84
|
+
|
|
85
|
+
// Text should be blue from the primary variant's color
|
|
86
|
+
expect(textStyles.color).toContain('0, 0, 255') // blue in rgb
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Issue #3670 - pressStyle color not working on styled Button
|
|
90
|
+
// Requires disableClassName to enable runtime press handling (not CSS transitions)
|
|
91
|
+
test(`pressStyle color propagates to children via context (issue #3670)`, async ({
|
|
92
|
+
page,
|
|
93
|
+
}) => {
|
|
94
|
+
const button = page.getByTestId('press-style-button')
|
|
95
|
+
await expect(button).toBeVisible()
|
|
96
|
+
|
|
97
|
+
const text = button.locator('span').first()
|
|
98
|
+
|
|
99
|
+
// Initially should be green
|
|
100
|
+
const initialStyles = await getStyles(text)
|
|
101
|
+
expect(initialStyles.color).toContain('0, 128, 0') // green in rgb
|
|
102
|
+
|
|
103
|
+
// Press and hold the button using mouse down (triggers onPressIn)
|
|
104
|
+
await button.hover()
|
|
105
|
+
await page.mouse.down()
|
|
106
|
+
await page.waitForTimeout(200)
|
|
107
|
+
|
|
108
|
+
// While pressed, text should be red
|
|
109
|
+
const pressedStyles = await getStyles(text)
|
|
110
|
+
expect(pressedStyles.color).toContain('255, 0, 0') // red in rgb
|
|
111
|
+
|
|
112
|
+
// Release
|
|
113
|
+
await page.mouse.up()
|
|
114
|
+
await page.waitForTimeout(100)
|
|
115
|
+
|
|
116
|
+
// After release, should be back to green
|
|
117
|
+
const releasedStyles = await getStyles(text)
|
|
118
|
+
expect(releasedStyles.color).toContain('0, 128, 0') // green in rgb
|
|
119
|
+
})
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Tests for styled context token preservation (issues #3670, #3676)
|
|
7
|
+
*
|
|
8
|
+
* When a parent component sets a context value via a variant (like gap: '$8'),
|
|
9
|
+
* child components should receive the original token string ('$8') in their
|
|
10
|
+
* functional variants, NOT the resolved CSS variable ('var(--t-space-8)').
|
|
11
|
+
*
|
|
12
|
+
* This is important because functional variants need the token string to
|
|
13
|
+
* look up values in the tokens object.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
test.beforeEach(async ({ page }) => {
|
|
17
|
+
await setupPage(page, { name: 'StyledContextTokens', type: 'useCase' })
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('variant should pass token string to context, not CSS variable - small spacing', async ({
|
|
21
|
+
page,
|
|
22
|
+
}) => {
|
|
23
|
+
// The debug display shows what gap value the child received via context
|
|
24
|
+
const gapValue = await page.locator('#debug-small-gap-value').textContent()
|
|
25
|
+
|
|
26
|
+
// Should be '$2' (the token string), not 'var(--t-space-2)' (the CSS variable)
|
|
27
|
+
expect(gapValue).toBe('$2')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('variant should pass token string to context, not CSS variable - large spacing', async ({
|
|
31
|
+
page,
|
|
32
|
+
}) => {
|
|
33
|
+
const gapValue = await page.locator('#debug-large-gap-value').textContent()
|
|
34
|
+
|
|
35
|
+
// Should be '$8' (the token string), not 'var(--t-space-8)' (the CSS variable)
|
|
36
|
+
expect(gapValue).toBe('$8')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('default context value should be preserved as token string', async ({ page }) => {
|
|
40
|
+
const gapValue = await page.locator('#debug-default-gap-value').textContent()
|
|
41
|
+
|
|
42
|
+
// Default context value should also be a token string
|
|
43
|
+
expect(gapValue).toBe('$4')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
test('debug display should show green background when token is preserved', async ({
|
|
47
|
+
page,
|
|
48
|
+
}) => {
|
|
49
|
+
// The debug display has green background if gap is a token string, red if CSS variable
|
|
50
|
+
const debugSmall = page.locator('#debug-small')
|
|
51
|
+
const bgColor = await debugSmall.evaluate((el) => getComputedStyle(el).backgroundColor)
|
|
52
|
+
|
|
53
|
+
// Green-ish color indicates token was preserved (using $green5 theme token)
|
|
54
|
+
// This is a sanity check that our isToken logic in the component is working
|
|
55
|
+
expect(bgColor).not.toBe('rgb(254, 202, 202)') // not red ($red5)
|
|
56
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { getStyles } from './utils'
|
|
4
|
+
import { setupPage } from './test-utils'
|
|
5
|
+
|
|
6
|
+
test.beforeEach(async ({ page }) => {
|
|
7
|
+
await setupPage(page, { name: 'StyledHOCNamed', type: 'useCase' })
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test(`styled() name works on HOC`, async ({ page }) => {
|
|
11
|
+
const textStyles = await getStyles(page.getByTestId('text-named').first())
|
|
12
|
+
expect(textStyles.color).toBe(`rgb(255, 0, 0)`)
|
|
13
|
+
|
|
14
|
+
const labelStyles = await getStyles(page.getByTestId('label-named').first())
|
|
15
|
+
expect(labelStyles.color).toBe(`rgb(255, 0, 0)`)
|
|
16
|
+
})
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
|
|
5
|
+
test.beforeEach(async ({ page }) => {
|
|
6
|
+
await setupPage(page, { name: 'StyledHtmlCase', type: 'useCase' })
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
test.describe('styled.element() API', () => {
|
|
10
|
+
test.describe('styled.a()', () => {
|
|
11
|
+
test('renders anchor element with proper tag', async ({ page }) => {
|
|
12
|
+
const element = page.getByTestId('styled-a')
|
|
13
|
+
await expect(element).toBeVisible()
|
|
14
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
15
|
+
expect(tagName).toBe('a')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('accepts href attribute', async ({ page }) => {
|
|
19
|
+
const element = page.getByTestId('styled-a')
|
|
20
|
+
expect(await element.getAttribute('href')).toBe('https://example.com')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
test('accepts target attribute', async ({ page }) => {
|
|
24
|
+
const element = page.getByTestId('styled-a')
|
|
25
|
+
expect(await element.getAttribute('target')).toBe('_blank')
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test('accepts rel attribute', async ({ page }) => {
|
|
29
|
+
const element = page.getByTestId('styled-a')
|
|
30
|
+
expect(await element.getAttribute('rel')).toBe('noopener')
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test.describe('styled.button()', () => {
|
|
35
|
+
test('renders button element with proper tag', async ({ page }) => {
|
|
36
|
+
const element = page.getByTestId('styled-button')
|
|
37
|
+
await expect(element).toBeVisible()
|
|
38
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
39
|
+
expect(tagName).toBe('button')
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('accepts type attribute', async ({ page }) => {
|
|
43
|
+
const element = page.getByTestId('styled-button')
|
|
44
|
+
expect(await element.getAttribute('type')).toBe('submit')
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test.describe('styled.div()', () => {
|
|
49
|
+
test('renders div element', async ({ page }) => {
|
|
50
|
+
const element = page.getByTestId('styled-div')
|
|
51
|
+
await expect(element).toBeVisible()
|
|
52
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
53
|
+
expect(tagName).toBe('div')
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
test.describe('styled.span()', () => {
|
|
58
|
+
test('renders span element', async ({ page }) => {
|
|
59
|
+
const element = page.getByTestId('styled-span')
|
|
60
|
+
await expect(element).toBeVisible()
|
|
61
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
62
|
+
expect(tagName).toBe('span')
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test.describe('styled.input()', () => {
|
|
67
|
+
test('renders input element with proper tag', async ({ page }) => {
|
|
68
|
+
const element = page.getByTestId('styled-input')
|
|
69
|
+
await expect(element).toBeVisible()
|
|
70
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
71
|
+
expect(tagName).toBe('input')
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('accepts type attribute', async ({ page }) => {
|
|
75
|
+
const element = page.getByTestId('styled-input')
|
|
76
|
+
expect(await element.getAttribute('type')).toBe('text')
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
test('accepts placeholder attribute', async ({ page }) => {
|
|
80
|
+
const element = page.getByTestId('styled-input')
|
|
81
|
+
expect(await element.getAttribute('placeholder')).toBe('Enter text')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
test('accepts maxLength attribute', async ({ page }) => {
|
|
85
|
+
const element = page.getByTestId('styled-input')
|
|
86
|
+
expect(await element.getAttribute('maxlength')).toBe('100')
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
test.describe('styled.form()', () => {
|
|
91
|
+
test('renders form element with proper tag', async ({ page }) => {
|
|
92
|
+
const element = page.getByTestId('styled-form')
|
|
93
|
+
await expect(element).toBeVisible()
|
|
94
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
95
|
+
expect(tagName).toBe('form')
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test('accepts action attribute', async ({ page }) => {
|
|
99
|
+
const element = page.getByTestId('styled-form')
|
|
100
|
+
expect(await element.getAttribute('action')).toBe('/submit')
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
test('accepts method attribute', async ({ page }) => {
|
|
104
|
+
const element = page.getByTestId('styled-form')
|
|
105
|
+
expect(await element.getAttribute('method')).toBe('post')
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
test.describe('styled.label()', () => {
|
|
110
|
+
test('renders label element with proper tag', async ({ page }) => {
|
|
111
|
+
const element = page.getByTestId('styled-label')
|
|
112
|
+
await expect(element).toBeVisible()
|
|
113
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
114
|
+
expect(tagName).toBe('label')
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
test('accepts htmlFor attribute (rendered as for)', async ({ page }) => {
|
|
118
|
+
const element = page.getByTestId('styled-label')
|
|
119
|
+
expect(await element.getAttribute('for')).toBe('test-input')
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
test.describe('semantic elements', () => {
|
|
124
|
+
test('styled.nav() renders nav element', async ({ page }) => {
|
|
125
|
+
const element = page.getByTestId('styled-nav')
|
|
126
|
+
await expect(element).toBeVisible()
|
|
127
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
128
|
+
expect(tagName).toBe('nav')
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
test('styled.main() renders main element', async ({ page }) => {
|
|
132
|
+
const element = page.getByTestId('styled-main')
|
|
133
|
+
await expect(element).toBeVisible()
|
|
134
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
135
|
+
expect(tagName).toBe('main')
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
test('styled.section() renders section element', async ({ page }) => {
|
|
139
|
+
const element = page.getByTestId('styled-section')
|
|
140
|
+
await expect(element).toBeVisible()
|
|
141
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
142
|
+
expect(tagName).toBe('section')
|
|
143
|
+
})
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
test.describe('styled.a() with variants', () => {
|
|
147
|
+
test('renders with large size variant', async ({ page }) => {
|
|
148
|
+
const element = page.getByTestId('styled-a-variants')
|
|
149
|
+
await expect(element).toBeVisible()
|
|
150
|
+
const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
|
|
151
|
+
expect(tagName).toBe('a')
|
|
152
|
+
expect(await element.getAttribute('href')).toBe('/internal')
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
test('renders with small size variant', async ({ page }) => {
|
|
156
|
+
const element = page.getByTestId('styled-a-variants-small')
|
|
157
|
+
await expect(element).toBeVisible()
|
|
158
|
+
expect(await element.getAttribute('href')).toBe('/small')
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
})
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
test('styled() icon respects color prop', async ({ page }) => {
|
|
4
|
+
await page.goto('/?test=StyledIconColor')
|
|
5
|
+
await page.waitForTimeout(1000)
|
|
6
|
+
|
|
7
|
+
// Helper to get computed stroke color from SVG path
|
|
8
|
+
// Uses computedStyle to resolve CSS variables like var(--color)
|
|
9
|
+
async function getSvgStrokeColor(testId: string) {
|
|
10
|
+
const element = page.getByTestId(testId)
|
|
11
|
+
await expect(element).toBeVisible()
|
|
12
|
+
// The testID is on the svg, path has stroke
|
|
13
|
+
const path = element.locator('path').first()
|
|
14
|
+
return await path.evaluate((el) => getComputedStyle(el).stroke)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Direct color prop should work
|
|
18
|
+
const directColor = await getSvgStrokeColor('direct-blue')
|
|
19
|
+
expect(directColor).toBe('rgb(0, 0, 255)') // blue
|
|
20
|
+
|
|
21
|
+
// styled() with color should work
|
|
22
|
+
const redColor = await getSvgStrokeColor('styled-red')
|
|
23
|
+
expect(redColor).toBe('rgb(255, 0, 0)') // red
|
|
24
|
+
|
|
25
|
+
// another styled() with different color
|
|
26
|
+
const greenColor = await getSvgStrokeColor('styled-green')
|
|
27
|
+
expect(greenColor).toBe('rgb(0, 128, 0)') // green
|
|
28
|
+
|
|
29
|
+
// runtime prop should override styled() default
|
|
30
|
+
const purpleColor = await getSvgStrokeColor('override-purple')
|
|
31
|
+
expect(purpleColor).toBe('rgb(128, 0, 128)') // purple
|
|
32
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { name: 'StyledInputFocusStyle', type: 'useCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test(`styled input + focusStyle`, async ({ page }) => {
|
|
9
|
+
const input = page.locator('input')
|
|
10
|
+
|
|
11
|
+
await input.focus()
|
|
12
|
+
|
|
13
|
+
const styles = await input.evaluate((el) => {
|
|
14
|
+
return window.getComputedStyle(el)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
|
|
18
|
+
expect(styles.borderWidth).toBe(`10px`)
|
|
19
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { name: 'StyledInputOnFocus', type: 'useCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test(`styled input + onFocus`, async ({ page }) => {
|
|
9
|
+
const input = page.locator('#onFocus')
|
|
10
|
+
|
|
11
|
+
await input.focus()
|
|
12
|
+
|
|
13
|
+
await page.waitForFunction(
|
|
14
|
+
async () => {
|
|
15
|
+
const inputElement = document.querySelector('#onFocus')
|
|
16
|
+
return inputElement?.getAttribute('data-onfocus') === 'true'
|
|
17
|
+
},
|
|
18
|
+
{ timeout: 2000 }
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const styles = await input.evaluate((el) => {
|
|
22
|
+
return window.getComputedStyle(el)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
|
|
26
|
+
expect(styles.borderWidth).toBe(`10px`)
|
|
27
|
+
})
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { setupPage } from './test-utils'
|
|
4
|
+
import { getStyles, getHoverStyle } from './utils'
|
|
5
|
+
|
|
6
|
+
test.beforeEach(async ({ page }) => {
|
|
7
|
+
await setupPage(page, { name: 'StyledMediaQueryMerge', type: 'useCase' })
|
|
8
|
+
await page.setViewportSize({ width: 700, height: 600 })
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
test(`styled component media query merge works correctly`, async ({ page }) => {
|
|
12
|
+
// Test 1: $sm media query merge
|
|
13
|
+
const test1 = page.locator('#test1')
|
|
14
|
+
const styles1 = await getStyles(test1)
|
|
15
|
+
|
|
16
|
+
// Test 2: $md media query merge
|
|
17
|
+
const test2 = page.locator('#test2')
|
|
18
|
+
const styles2 = await getStyles(test2)
|
|
19
|
+
|
|
20
|
+
// Test 3: Both media queries
|
|
21
|
+
const test3 = page.locator('#test3')
|
|
22
|
+
const styles3 = await getStyles(test3)
|
|
23
|
+
|
|
24
|
+
// Test 4: Pseudo selector merge
|
|
25
|
+
const test4 = page.locator('#test4')
|
|
26
|
+
const styles4 = await getStyles(test4)
|
|
27
|
+
|
|
28
|
+
// Test 5: Direct component
|
|
29
|
+
const test5 = page.locator('#test5')
|
|
30
|
+
const styles5 = await getStyles(test5)
|
|
31
|
+
|
|
32
|
+
// Test 1: $sm should have styled definition + runtime override
|
|
33
|
+
expect(styles1.paddingTop).toBe('100px')
|
|
34
|
+
expect(styles1.marginLeft).toBe('100px')
|
|
35
|
+
expect(styles1.marginRight).toBe('100px')
|
|
36
|
+
expect(styles1.height).toBe('100px')
|
|
37
|
+
expect(styles1.width).toBe('100px')
|
|
38
|
+
expect(styles1.backgroundColor).toBe('rgb(0, 0, 255)') // blue (runtime override)
|
|
39
|
+
|
|
40
|
+
// Test 2: $sm should have styled definition + runtime override
|
|
41
|
+
expect(styles2.paddingTop).toBe('100px')
|
|
42
|
+
expect(styles2.marginLeft).toBe('100px')
|
|
43
|
+
expect(styles2.marginRight).toBe('100px')
|
|
44
|
+
expect(styles2.height).toBe('100px')
|
|
45
|
+
expect(styles2.width).toBe('100px')
|
|
46
|
+
expect(styles2.backgroundColor).toBe('rgb(128, 0, 128)') // purple (runtime override)
|
|
47
|
+
|
|
48
|
+
// Test 3: $sm media query should be merged with runtime override
|
|
49
|
+
expect(styles3.paddingTop).toBe('100px') // from $sm
|
|
50
|
+
expect(styles3.marginLeft).toBe('100px') // from $sm
|
|
51
|
+
expect(styles3.marginRight).toBe('100px') // from $sm
|
|
52
|
+
expect(styles3.height).toBe('100px') // from $sm
|
|
53
|
+
expect(styles3.width).toBe('100px') // from $sm
|
|
54
|
+
expect(styles3.backgroundColor).toBe('rgb(0, 0, 255)') // blue (from $sm runtime override)
|
|
55
|
+
|
|
56
|
+
// Test 4: Pseudo selectors should be merged (runtime override)
|
|
57
|
+
// Test hover state - runtime override should take precedence
|
|
58
|
+
const hoverStyles4 = await getHoverStyle(test4)
|
|
59
|
+
expect(hoverStyles4.backgroundColor).toBe('rgb(0, 255, 255)') // cyan (runtime override)
|
|
60
|
+
|
|
61
|
+
// Test 5: Direct component should work as expected
|
|
62
|
+
expect(styles5.paddingTop).toBe('50px')
|
|
63
|
+
expect(styles5.marginLeft).toBe('50px')
|
|
64
|
+
expect(styles5.marginRight).toBe('50px')
|
|
65
|
+
expect(styles5.backgroundColor).toBe('rgb(165, 42, 42)') // brown
|
|
66
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
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: 'StyledRNW', type: 'useCase' })
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test(`RNW + styled() + styleable() twice`, async ({ page }) => {
|
|
11
|
+
const inputStyles = await getStyles(page.locator('#styled-rnw-input'))
|
|
12
|
+
expect(inputStyles.fontFamily).toBe(
|
|
13
|
+
`Silkscreen, "Fira Code", Monaco, Consolas, "Ubuntu Mono", monospace`
|
|
14
|
+
)
|
|
15
|
+
expect(inputStyles.paddingLeft).toBe(`14px`)
|
|
16
|
+
expect(inputStyles.paddingTop).toBe(`12px`)
|
|
17
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { name: 'StyledStyleableInputOnFocus', type: 'useCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test(`styled styleable input + onFocus`, async ({ page }) => {
|
|
9
|
+
const input = page.locator('#onFocus')
|
|
10
|
+
|
|
11
|
+
await input.focus()
|
|
12
|
+
|
|
13
|
+
await page.waitForFunction(
|
|
14
|
+
async () => {
|
|
15
|
+
const inputElement = document.querySelector('#onFocus')
|
|
16
|
+
return inputElement?.getAttribute('data-onfocus') === 'true'
|
|
17
|
+
},
|
|
18
|
+
{ timeout: 2000 }
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const styles = await input.evaluate((el) => {
|
|
22
|
+
return window.getComputedStyle(el)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
|
|
26
|
+
expect(styles.borderWidth).toBe(`10px`)
|
|
27
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
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: 'StyledStyleableInputVariant', type: 'useCase' })
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test(`styled(styleable(styled(RNView))) applies proper variant overrides`, async ({
|
|
11
|
+
page,
|
|
12
|
+
}) => {
|
|
13
|
+
const styles = await getStyles(page.locator('#input').first())
|
|
14
|
+
|
|
15
|
+
expect(styles.color).toBe('rgb(255, 0, 0)')
|
|
16
|
+
expect(styles.borderTopLeftRadius).toBe('100px')
|
|
17
|
+
expect(styles.borderColor).toBe('rgb(255, 0, 0)')
|
|
18
|
+
|
|
19
|
+
await page.locator('#input').focus()
|
|
20
|
+
const focusStyle = await getStyles(page.locator('#input').first())
|
|
21
|
+
expect(focusStyle.borderColor).toBe('rgb(0, 128, 0)')
|
|
22
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { name: 'StyledStyledStyleableInputOnFocus', type: 'useCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test(`styled styleable input + onFocus`, async ({ page }) => {
|
|
9
|
+
const input = page.locator('#onFocus')
|
|
10
|
+
|
|
11
|
+
await input.focus()
|
|
12
|
+
|
|
13
|
+
await page.waitForFunction(
|
|
14
|
+
async () => {
|
|
15
|
+
const inputElement = document.querySelector('#onFocus')
|
|
16
|
+
return inputElement?.getAttribute('data-onfocus') === 'true'
|
|
17
|
+
},
|
|
18
|
+
{ timeout: 2000 }
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const styles = await input.evaluate((el) => {
|
|
22
|
+
return window.getComputedStyle(el)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
|
|
26
|
+
expect(styles.borderWidth).toBe(`10px`)
|
|
27
|
+
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
import { getStyles } from './utils'
|
|
4
|
+
import { setupPage } from './test-utils'
|
|
5
|
+
|
|
6
|
+
test.beforeEach(async ({ page }) => {
|
|
7
|
+
await setupPage(page, { name: 'StyledVariantTextColor', type: 'useCase' })
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
test(`sets text colors with variants + theme`, async ({ page }) => {
|
|
11
|
+
const defaultStyles = await getStyles(page.getByTestId('default').first())
|
|
12
|
+
const defaultStylesFlat = await getStyles(page.getByTestId('default-flat').first())
|
|
13
|
+
|
|
14
|
+
// $color - updated for themeDev
|
|
15
|
+
expect(defaultStyles.color).toBe('rgb(17, 50, 100)')
|
|
16
|
+
expect(defaultStylesFlat.color).toBe(defaultStyles.color)
|
|
17
|
+
|
|
18
|
+
const activeStyles = await getStyles(page.getByTestId('active').first())
|
|
19
|
+
const activeStylesFlat = await getStyles(page.getByTestId('active-flat').first())
|
|
20
|
+
|
|
21
|
+
// $color10 - updated for themeDev
|
|
22
|
+
expect(activeStyles.color).toBe('rgb(5, 134, 240)')
|
|
23
|
+
expect(activeStylesFlat.color).toBe(activeStyles.color)
|
|
24
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test'
|
|
2
|
+
import { setupPage } from './test-utils'
|
|
3
|
+
|
|
4
|
+
test.beforeEach(async ({ page }) => {
|
|
5
|
+
await setupPage(page, { name: 'StyledViewOnFocus', type: 'useCase' })
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
test(`styled view + onFocus`, async ({ page }) => {
|
|
9
|
+
const view = page.locator('#onFocus')
|
|
10
|
+
|
|
11
|
+
await view.focus()
|
|
12
|
+
|
|
13
|
+
await page.waitForFunction(
|
|
14
|
+
async () => {
|
|
15
|
+
const element = document.querySelector('#onFocus')
|
|
16
|
+
return element?.getAttribute('data-onfocus') === 'true'
|
|
17
|
+
},
|
|
18
|
+
{ timeout: 2000 }
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
const styles = await view.evaluate((el) => {
|
|
22
|
+
return window.getComputedStyle(el)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
|
|
26
|
+
expect(styles.borderWidth).toBe(`10px`)
|
|
27
|
+
})
|