@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,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct test of keyboard-controller's KeyboardAvoidingView
|
|
3
|
+
*
|
|
4
|
+
* Tests if KeyboardAvoidingView provides smooth keyboard animation
|
|
5
|
+
* without needing any special Sheet integration.
|
|
6
|
+
*/
|
|
7
|
+
import { useState } from 'react'
|
|
8
|
+
import { TextInput, View, Text, StyleSheet, Platform } from 'react-native'
|
|
9
|
+
|
|
10
|
+
// try to import keyboard-controller's KeyboardAvoidingView
|
|
11
|
+
let KeyboardAvoidingView: any
|
|
12
|
+
let KeyboardProvider: any
|
|
13
|
+
let useReanimatedKeyboardAnimation: any
|
|
14
|
+
let kbcAvailable = false
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const rnkc = require('react-native-keyboard-controller')
|
|
18
|
+
KeyboardAvoidingView = rnkc.KeyboardAvoidingView
|
|
19
|
+
KeyboardProvider = rnkc.KeyboardProvider
|
|
20
|
+
useReanimatedKeyboardAnimation = rnkc.useReanimatedKeyboardAnimation
|
|
21
|
+
kbcAvailable = true
|
|
22
|
+
} catch {
|
|
23
|
+
// keyboard-controller not available, use RN's built-in
|
|
24
|
+
KeyboardAvoidingView = require('react-native').KeyboardAvoidingView
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// component to show animated keyboard height (if reanimated hook available)
|
|
28
|
+
function KeyboardHeightDisplay() {
|
|
29
|
+
if (!useReanimatedKeyboardAnimation) {
|
|
30
|
+
return <Text style={styles.status}>useReanimatedKeyboardAnimation not available</Text>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const { height, progress } = useReanimatedKeyboardAnimation()
|
|
35
|
+
// note: these are shared values, need Animated.Text to display
|
|
36
|
+
return (
|
|
37
|
+
<View style={styles.statusBox}>
|
|
38
|
+
<Text style={styles.status}>Reanimated hook available ✓</Text>
|
|
39
|
+
<Text style={styles.small}>(height/progress are Reanimated shared values)</Text>
|
|
40
|
+
</View>
|
|
41
|
+
)
|
|
42
|
+
} catch (e: any) {
|
|
43
|
+
return <Text style={styles.status}>Hook error: {e.message}</Text>
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function TestContent() {
|
|
48
|
+
const [value, setValue] = useState('')
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<KeyboardAvoidingView
|
|
52
|
+
style={styles.container}
|
|
53
|
+
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
|
|
54
|
+
>
|
|
55
|
+
<View style={styles.content}>
|
|
56
|
+
<Text style={styles.title}>KeyboardController Test</Text>
|
|
57
|
+
|
|
58
|
+
<Text style={[styles.status, { color: kbcAvailable ? 'green' : 'orange' }]}>
|
|
59
|
+
keyboard-controller: {kbcAvailable ? '✓ installed' : '✗ not found'}
|
|
60
|
+
</Text>
|
|
61
|
+
|
|
62
|
+
<KeyboardHeightDisplay />
|
|
63
|
+
|
|
64
|
+
<Text style={styles.instruction}>
|
|
65
|
+
Tap the input below - watch if the content moves smoothly with the keyboard.
|
|
66
|
+
{'\n\n'}
|
|
67
|
+
With keyboard-controller, this should be butter smooth (60/120 FPS). Without it,
|
|
68
|
+
you may see slight jank.
|
|
69
|
+
</Text>
|
|
70
|
+
|
|
71
|
+
<View style={styles.spacer} />
|
|
72
|
+
|
|
73
|
+
<View style={styles.inputContainer}>
|
|
74
|
+
<TextInput
|
|
75
|
+
style={styles.input}
|
|
76
|
+
placeholder="Tap here to show keyboard..."
|
|
77
|
+
value={value}
|
|
78
|
+
onChangeText={setValue}
|
|
79
|
+
testID="kbc-test-input"
|
|
80
|
+
/>
|
|
81
|
+
</View>
|
|
82
|
+
</View>
|
|
83
|
+
</KeyboardAvoidingView>
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function KeyboardControllerTest() {
|
|
88
|
+
// wrap in KeyboardProvider if available
|
|
89
|
+
if (KeyboardProvider) {
|
|
90
|
+
return (
|
|
91
|
+
<KeyboardProvider>
|
|
92
|
+
<TestContent />
|
|
93
|
+
</KeyboardProvider>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
return <TestContent />
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const styles = StyleSheet.create({
|
|
100
|
+
container: {
|
|
101
|
+
flex: 1,
|
|
102
|
+
backgroundColor: '#f5f5f5',
|
|
103
|
+
},
|
|
104
|
+
content: {
|
|
105
|
+
flex: 1,
|
|
106
|
+
padding: 20,
|
|
107
|
+
},
|
|
108
|
+
title: {
|
|
109
|
+
fontSize: 24,
|
|
110
|
+
fontWeight: 'bold',
|
|
111
|
+
marginBottom: 16,
|
|
112
|
+
},
|
|
113
|
+
status: {
|
|
114
|
+
fontSize: 16,
|
|
115
|
+
marginBottom: 8,
|
|
116
|
+
},
|
|
117
|
+
statusBox: {
|
|
118
|
+
backgroundColor: '#e8f5e9',
|
|
119
|
+
padding: 12,
|
|
120
|
+
borderRadius: 8,
|
|
121
|
+
marginBottom: 16,
|
|
122
|
+
},
|
|
123
|
+
small: {
|
|
124
|
+
fontSize: 12,
|
|
125
|
+
color: '#666',
|
|
126
|
+
},
|
|
127
|
+
instruction: {
|
|
128
|
+
fontSize: 14,
|
|
129
|
+
color: '#666',
|
|
130
|
+
marginBottom: 16,
|
|
131
|
+
lineHeight: 20,
|
|
132
|
+
},
|
|
133
|
+
spacer: {
|
|
134
|
+
flex: 1,
|
|
135
|
+
},
|
|
136
|
+
inputContainer: {
|
|
137
|
+
backgroundColor: 'white',
|
|
138
|
+
borderRadius: 8,
|
|
139
|
+
marginBottom: 20,
|
|
140
|
+
},
|
|
141
|
+
input: {
|
|
142
|
+
height: 50,
|
|
143
|
+
paddingHorizontal: 16,
|
|
144
|
+
fontSize: 16,
|
|
145
|
+
},
|
|
146
|
+
})
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { H5, ListItem, Separator, View, Theme } from '@hanzo/gui'
|
|
2
|
+
import { ChevronRight, Star, Trash } from '@hanzogui/lucide-icons-2'
|
|
3
|
+
|
|
4
|
+
export const ThemedListItem = () => (
|
|
5
|
+
<View gap="$4">
|
|
6
|
+
<H5>Should change:</H5>
|
|
7
|
+
|
|
8
|
+
<ListItem
|
|
9
|
+
id="themed-list-item-default"
|
|
10
|
+
title="Default"
|
|
11
|
+
subTitle="Default list item"
|
|
12
|
+
icon={ChevronRight}
|
|
13
|
+
size="$3"
|
|
14
|
+
borderRadius="$3"
|
|
15
|
+
/>
|
|
16
|
+
|
|
17
|
+
<Theme name="accent">
|
|
18
|
+
<ListItem
|
|
19
|
+
id="themed-list-item-accent"
|
|
20
|
+
title="Accent"
|
|
21
|
+
subTitle="Accent (contrasting) list item"
|
|
22
|
+
icon={ChevronRight}
|
|
23
|
+
size="$3"
|
|
24
|
+
borderRadius="$3"
|
|
25
|
+
/>
|
|
26
|
+
</Theme>
|
|
27
|
+
|
|
28
|
+
<Separator />
|
|
29
|
+
|
|
30
|
+
<H5>Are fixed:</H5>
|
|
31
|
+
|
|
32
|
+
<Theme name="light">
|
|
33
|
+
<ListItem
|
|
34
|
+
id="themed-list-item-light"
|
|
35
|
+
title='<Theme ="light"/>'
|
|
36
|
+
subTitle="Forcing light theme"
|
|
37
|
+
icon={ChevronRight}
|
|
38
|
+
size="$3"
|
|
39
|
+
borderRadius="$3"
|
|
40
|
+
onPress={() => console.info('Light theme list item pressed')}
|
|
41
|
+
/>
|
|
42
|
+
</Theme>
|
|
43
|
+
|
|
44
|
+
<Theme name="dark">
|
|
45
|
+
<ListItem
|
|
46
|
+
id="themed-list-item-dark"
|
|
47
|
+
title='<Theme ="dark"/>'
|
|
48
|
+
subTitle="Forcing dark theme"
|
|
49
|
+
icon={ChevronRight}
|
|
50
|
+
size="$3"
|
|
51
|
+
borderRadius="$3"
|
|
52
|
+
onPress={() => console.info('Dark theme list item pressed')}
|
|
53
|
+
/>
|
|
54
|
+
</Theme>
|
|
55
|
+
|
|
56
|
+
<Theme name="light">
|
|
57
|
+
<Theme name="accent">
|
|
58
|
+
<ListItem
|
|
59
|
+
id="themed-list-item-light-accent"
|
|
60
|
+
title='<Theme name="accent">'
|
|
61
|
+
subTitle="light + accent = light_accent (contrasting)"
|
|
62
|
+
icon={ChevronRight}
|
|
63
|
+
size="$3"
|
|
64
|
+
borderRadius="$3"
|
|
65
|
+
onPress={() => console.info('Light theme accent list item pressed')}
|
|
66
|
+
/>
|
|
67
|
+
</Theme>
|
|
68
|
+
</Theme>
|
|
69
|
+
|
|
70
|
+
<Theme name="dark">
|
|
71
|
+
<Theme name="accent">
|
|
72
|
+
<ListItem
|
|
73
|
+
id="themed-list-item-dark-accent"
|
|
74
|
+
title='<Theme name="accent">'
|
|
75
|
+
subTitle="dark + accent = dark_accent (contrasting)"
|
|
76
|
+
icon={ChevronRight}
|
|
77
|
+
size="$3"
|
|
78
|
+
borderRadius="$3"
|
|
79
|
+
onPress={() => console.info('Dark theme accent list item pressed')}
|
|
80
|
+
/>
|
|
81
|
+
</Theme>
|
|
82
|
+
</Theme>
|
|
83
|
+
|
|
84
|
+
<Separator />
|
|
85
|
+
|
|
86
|
+
<H5>Variant (outlined):</H5>
|
|
87
|
+
|
|
88
|
+
<ListItem
|
|
89
|
+
id="themed-list-item-outlined"
|
|
90
|
+
variant="outlined"
|
|
91
|
+
title="Outlined"
|
|
92
|
+
subTitle="Using variant prop"
|
|
93
|
+
icon={Star}
|
|
94
|
+
size="$3"
|
|
95
|
+
borderRadius="$3"
|
|
96
|
+
/>
|
|
97
|
+
|
|
98
|
+
<Separator />
|
|
99
|
+
|
|
100
|
+
<H5>Apply (context):</H5>
|
|
101
|
+
|
|
102
|
+
<ListItem.Apply color="$red10">
|
|
103
|
+
<ListItem
|
|
104
|
+
id="themed-list-item-apply-color"
|
|
105
|
+
title="With Apply color"
|
|
106
|
+
subTitle="Icon inherits color from context"
|
|
107
|
+
icon={Trash}
|
|
108
|
+
size="$3"
|
|
109
|
+
borderRadius="$3"
|
|
110
|
+
/>
|
|
111
|
+
</ListItem.Apply>
|
|
112
|
+
|
|
113
|
+
<ListItem.Apply variant="outlined" size="$2">
|
|
114
|
+
<ListItem
|
|
115
|
+
id="themed-list-item-apply-variant"
|
|
116
|
+
title="With Apply variant"
|
|
117
|
+
subTitle="Outlined via context"
|
|
118
|
+
icon={Star}
|
|
119
|
+
borderRadius="$3"
|
|
120
|
+
/>
|
|
121
|
+
</ListItem.Apply>
|
|
122
|
+
</View>
|
|
123
|
+
)
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Text, useMedia, YStack, XStack } from '@hanzo/gui'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test case for v5 media queries
|
|
5
|
+
*
|
|
6
|
+
* v5 uses mobile-first (minWidth) for base queries and desktop-first (maxWidth) for max-* queries
|
|
7
|
+
*
|
|
8
|
+
* Breakpoints:
|
|
9
|
+
* - xxxs: 260, xxs: 340, xs: 460, sm: 640, md: 768, lg: 1024, xl: 1280, xxl: 1536
|
|
10
|
+
*
|
|
11
|
+
* Width queries (mobile-first, minWidth):
|
|
12
|
+
* - $sm, $md, $lg, etc. - apply at minWidth and above
|
|
13
|
+
* - Larger breakpoints override smaller ones
|
|
14
|
+
*
|
|
15
|
+
* Max-width queries (desktop-first, maxWidth):
|
|
16
|
+
* - $max-sm, $max-md, $max-lg, etc. - apply at maxWidth and below
|
|
17
|
+
* - Smaller breakpoints override larger ones
|
|
18
|
+
*
|
|
19
|
+
* Height queries (minHeight):
|
|
20
|
+
* - $height-sm, $height-md, $height-lg, etc.
|
|
21
|
+
*/
|
|
22
|
+
export const MediaQueriesV5 = () => {
|
|
23
|
+
const media = useMedia()
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<YStack p="$4" gap="$4">
|
|
27
|
+
<Text fontWeight="bold">v5 Media Query Test</Text>
|
|
28
|
+
<Text fontSize={12} color="$color10">
|
|
29
|
+
Use ?v5config in URL to test with v5 config
|
|
30
|
+
</Text>
|
|
31
|
+
|
|
32
|
+
{/* Display current media state */}
|
|
33
|
+
<YStack gap="$1">
|
|
34
|
+
<Text testID="media-sm">{`sm (≥640): ${media.sm}`}</Text>
|
|
35
|
+
<Text testID="media-md">{`md (≥768): ${media.md}`}</Text>
|
|
36
|
+
<Text testID="media-lg">{`lg (≥1024): ${media.lg}`}</Text>
|
|
37
|
+
<Text testID="media-max-sm">{`max-sm (≤640): ${media['max-sm']}`}</Text>
|
|
38
|
+
<Text testID="media-max-md">{`max-md (≤768): ${media['max-md']}`}</Text>
|
|
39
|
+
<Text testID="media-max-lg">{`max-lg (≤1024): ${media['max-lg']}`}</Text>
|
|
40
|
+
</YStack>
|
|
41
|
+
|
|
42
|
+
{/* Test 1: Mobile-first (minWidth) - larger should win */}
|
|
43
|
+
<YStack gap="$2">
|
|
44
|
+
<Text fontWeight="bold">Test 1: Mobile-first (larger wins)</Text>
|
|
45
|
+
<Text fontSize={12}>On large screen: should be green ($lg wins over $sm)</Text>
|
|
46
|
+
<YStack
|
|
47
|
+
testID="test-mobile-first"
|
|
48
|
+
height={60}
|
|
49
|
+
width={100}
|
|
50
|
+
backgroundColor="red"
|
|
51
|
+
$sm={{ backgroundColor: 'yellow' }}
|
|
52
|
+
$md={{ backgroundColor: 'orange' }}
|
|
53
|
+
$lg={{ backgroundColor: 'green' }}
|
|
54
|
+
/>
|
|
55
|
+
</YStack>
|
|
56
|
+
|
|
57
|
+
{/* Test 2: Desktop-first (maxWidth) - smaller should win */}
|
|
58
|
+
<YStack gap="$2">
|
|
59
|
+
<Text fontWeight="bold">Test 2: Desktop-first (smaller wins)</Text>
|
|
60
|
+
<Text fontSize={12}>
|
|
61
|
+
On small screen: should be yellow ($max-sm wins over $max-lg)
|
|
62
|
+
</Text>
|
|
63
|
+
<YStack
|
|
64
|
+
testID="test-desktop-first"
|
|
65
|
+
height={60}
|
|
66
|
+
width={100}
|
|
67
|
+
backgroundColor="red"
|
|
68
|
+
{...{
|
|
69
|
+
'$max-lg': { backgroundColor: 'green' },
|
|
70
|
+
'$max-md': { backgroundColor: 'orange' },
|
|
71
|
+
'$max-sm': { backgroundColor: 'yellow' },
|
|
72
|
+
}}
|
|
73
|
+
/>
|
|
74
|
+
</YStack>
|
|
75
|
+
|
|
76
|
+
{/* Test 3: Height queries */}
|
|
77
|
+
<YStack gap="$2">
|
|
78
|
+
<Text fontWeight="bold">Test 3: Height queries</Text>
|
|
79
|
+
<Text fontSize={12}>Taller screens get larger breakpoints</Text>
|
|
80
|
+
<YStack
|
|
81
|
+
testID="test-height"
|
|
82
|
+
height={60}
|
|
83
|
+
width={100}
|
|
84
|
+
backgroundColor="red"
|
|
85
|
+
{...{
|
|
86
|
+
'$height-xs': { backgroundColor: 'yellow' },
|
|
87
|
+
'$height-sm': { backgroundColor: 'orange' },
|
|
88
|
+
'$height-md': { backgroundColor: 'green' },
|
|
89
|
+
}}
|
|
90
|
+
/>
|
|
91
|
+
</YStack>
|
|
92
|
+
|
|
93
|
+
{/* Test 4: Combined width queries */}
|
|
94
|
+
<YStack gap="$2">
|
|
95
|
+
<Text fontWeight="bold">Test 4: All breakpoints</Text>
|
|
96
|
+
<XStack gap="$2" flexWrap="wrap">
|
|
97
|
+
<YStack
|
|
98
|
+
testID="test-sm-only"
|
|
99
|
+
height={40}
|
|
100
|
+
width={40}
|
|
101
|
+
backgroundColor="gray"
|
|
102
|
+
$sm={{ backgroundColor: 'green' }}
|
|
103
|
+
>
|
|
104
|
+
<Text fontSize={10}>sm</Text>
|
|
105
|
+
</YStack>
|
|
106
|
+
<YStack
|
|
107
|
+
testID="test-md-only"
|
|
108
|
+
height={40}
|
|
109
|
+
width={40}
|
|
110
|
+
backgroundColor="gray"
|
|
111
|
+
$md={{ backgroundColor: 'green' }}
|
|
112
|
+
>
|
|
113
|
+
<Text fontSize={10}>md</Text>
|
|
114
|
+
</YStack>
|
|
115
|
+
<YStack
|
|
116
|
+
testID="test-lg-only"
|
|
117
|
+
height={40}
|
|
118
|
+
width={40}
|
|
119
|
+
backgroundColor="gray"
|
|
120
|
+
$lg={{ backgroundColor: 'green' }}
|
|
121
|
+
>
|
|
122
|
+
<Text fontSize={10}>lg</Text>
|
|
123
|
+
</YStack>
|
|
124
|
+
<YStack
|
|
125
|
+
testID="test-xl-only"
|
|
126
|
+
height={40}
|
|
127
|
+
width={40}
|
|
128
|
+
backgroundColor="gray"
|
|
129
|
+
$xl={{ backgroundColor: 'green' }}
|
|
130
|
+
>
|
|
131
|
+
<Text fontSize={10}>xl</Text>
|
|
132
|
+
</YStack>
|
|
133
|
+
</XStack>
|
|
134
|
+
</YStack>
|
|
135
|
+
</YStack>
|
|
136
|
+
)
|
|
137
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Text, useMedia, YStack } from '@hanzo/gui'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test case for media query regression bug (started in 1.132.17)
|
|
5
|
+
*
|
|
6
|
+
* Bug: On small screens (iPhone), $gtMd styles incorrectly apply when they shouldn't.
|
|
7
|
+
* The $md styles should apply on mobile, NOT the $gtMd styles.
|
|
8
|
+
*
|
|
9
|
+
* Breakpoints (from @hanzogui/config):
|
|
10
|
+
* - md: maxWidth 1020 (matches when width <= 1020)
|
|
11
|
+
* - gtMd: minWidth 1021 (matches when width > 1020)
|
|
12
|
+
*
|
|
13
|
+
* Expected behavior on iPhone (~390px width):
|
|
14
|
+
* - Test 1: backgroundColor should be 'yellow' from $md (gtMd doesn't match)
|
|
15
|
+
* - Test 2: backgroundColor should be 'red' (gtMd doesn't match, stays default)
|
|
16
|
+
* - Test 3: backgroundColor should be 'yellow' from $md
|
|
17
|
+
* - Test 4: backgroundColor should be 'yellow' from $md (md has higher priority than sm)
|
|
18
|
+
*/
|
|
19
|
+
export const MediaQueryGtMd = () => {
|
|
20
|
+
const media = useMedia()
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<YStack p="$4" gap="$4">
|
|
24
|
+
{/* Display current media state for Detox verification */}
|
|
25
|
+
<Text testID="media-state-sm">{`sm: ${media.sm}`}</Text>
|
|
26
|
+
<Text testID="media-state-md">{`md: ${media.md}`}</Text>
|
|
27
|
+
<Text testID="media-state-gtMd">{`gtMd: ${media.gtMd}`}</Text>
|
|
28
|
+
|
|
29
|
+
{/* Test 1: Both $md and $gtMd - should respect breakpoint boundaries */}
|
|
30
|
+
<YStack
|
|
31
|
+
id="media-test-both"
|
|
32
|
+
testID="media-test-both"
|
|
33
|
+
height={100}
|
|
34
|
+
width={100}
|
|
35
|
+
backgroundColor="red"
|
|
36
|
+
$md={{ backgroundColor: 'yellow' }}
|
|
37
|
+
$gtMd={{ backgroundColor: 'green' }}
|
|
38
|
+
/>
|
|
39
|
+
|
|
40
|
+
{/* Test 2: Only $gtMd - should NOT apply on small screens */}
|
|
41
|
+
<YStack
|
|
42
|
+
id="media-test-gtmd-only"
|
|
43
|
+
testID="media-test-gtmd-only"
|
|
44
|
+
height={100}
|
|
45
|
+
width={100}
|
|
46
|
+
backgroundColor="red"
|
|
47
|
+
$gtMd={{ backgroundColor: 'green' }}
|
|
48
|
+
/>
|
|
49
|
+
|
|
50
|
+
{/* Test 3: Only $md - should apply on small screens */}
|
|
51
|
+
<YStack
|
|
52
|
+
id="media-test-md-only"
|
|
53
|
+
testID="media-test-md-only"
|
|
54
|
+
height={100}
|
|
55
|
+
width={100}
|
|
56
|
+
backgroundColor="red"
|
|
57
|
+
$md={{ backgroundColor: 'yellow' }}
|
|
58
|
+
/>
|
|
59
|
+
|
|
60
|
+
{/* Test 4: $sm, $md, and $gtMd together */}
|
|
61
|
+
<YStack
|
|
62
|
+
id="media-test-all"
|
|
63
|
+
testID="media-test-all"
|
|
64
|
+
height={100}
|
|
65
|
+
width={100}
|
|
66
|
+
backgroundColor="red"
|
|
67
|
+
$sm={{ backgroundColor: 'blue' }}
|
|
68
|
+
$md={{ backgroundColor: 'yellow' }}
|
|
69
|
+
$gtMd={{ backgroundColor: 'green' }}
|
|
70
|
+
/>
|
|
71
|
+
</YStack>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { useState } from 'react'
|
|
2
|
+
import { Button, Dialog, Paragraph, YStack, XStack } from '@hanzo/gui'
|
|
3
|
+
import { Menu } from '@hanzogui/menu'
|
|
4
|
+
|
|
5
|
+
// tests that Menu renders above Dialog when opened from inside Dialog
|
|
6
|
+
export function MenuAboveDialogCase() {
|
|
7
|
+
const [dialogOpen, setDialogOpen] = useState(false)
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<YStack padding="$4" gap="$4">
|
|
11
|
+
<Paragraph>
|
|
12
|
+
Test: Open dialog, then open menu from inside. Menu should appear above dialog
|
|
13
|
+
overlay.
|
|
14
|
+
</Paragraph>
|
|
15
|
+
|
|
16
|
+
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
|
|
17
|
+
<Dialog.Trigger asChild>
|
|
18
|
+
<Button testID="dialog-trigger">Open Dialog</Button>
|
|
19
|
+
</Dialog.Trigger>
|
|
20
|
+
|
|
21
|
+
<Dialog.Portal>
|
|
22
|
+
<Dialog.Overlay testID="dialog-overlay" key="overlay" opacity={0.5} />
|
|
23
|
+
<Dialog.Content testID="dialog-content" bordered elevate key="content">
|
|
24
|
+
<YStack gap="$3" padding="$4" minWidth={300}>
|
|
25
|
+
<Dialog.Title>Dialog with Menu</Dialog.Title>
|
|
26
|
+
<Dialog.Description>
|
|
27
|
+
Click the menu below. It should appear above this dialog.
|
|
28
|
+
</Dialog.Description>
|
|
29
|
+
|
|
30
|
+
<Menu>
|
|
31
|
+
<Menu.Trigger asChild>
|
|
32
|
+
<Button testID="menu-trigger">Open Menu</Button>
|
|
33
|
+
</Menu.Trigger>
|
|
34
|
+
|
|
35
|
+
<Menu.Portal>
|
|
36
|
+
<Menu.Content
|
|
37
|
+
testID="menu-content"
|
|
38
|
+
p="$2"
|
|
39
|
+
minWidth={180}
|
|
40
|
+
bg="$background"
|
|
41
|
+
borderWidth={1}
|
|
42
|
+
borderColor="$borderColor"
|
|
43
|
+
elevation="$4"
|
|
44
|
+
>
|
|
45
|
+
<Menu.Item testID="menu-item-1">
|
|
46
|
+
<Menu.ItemTitle>Item 1</Menu.ItemTitle>
|
|
47
|
+
</Menu.Item>
|
|
48
|
+
<Menu.Item testID="menu-item-2">
|
|
49
|
+
<Menu.ItemTitle>Item 2</Menu.ItemTitle>
|
|
50
|
+
</Menu.Item>
|
|
51
|
+
<Menu.Item testID="menu-item-3">
|
|
52
|
+
<Menu.ItemTitle>Item 3</Menu.ItemTitle>
|
|
53
|
+
</Menu.Item>
|
|
54
|
+
</Menu.Content>
|
|
55
|
+
</Menu.Portal>
|
|
56
|
+
</Menu>
|
|
57
|
+
|
|
58
|
+
<XStack gap="$3" justifyContent="flex-end">
|
|
59
|
+
<Dialog.Close asChild>
|
|
60
|
+
<Button testID="dialog-close">Close</Button>
|
|
61
|
+
</Dialog.Close>
|
|
62
|
+
</XStack>
|
|
63
|
+
</YStack>
|
|
64
|
+
</Dialog.Content>
|
|
65
|
+
</Dialog.Portal>
|
|
66
|
+
</Dialog>
|
|
67
|
+
|
|
68
|
+
<YStack gap="$2">
|
|
69
|
+
<Paragraph testID="dialog-status">
|
|
70
|
+
Dialog: {dialogOpen ? 'open' : 'closed'}
|
|
71
|
+
</Paragraph>
|
|
72
|
+
</YStack>
|
|
73
|
+
</YStack>
|
|
74
|
+
)
|
|
75
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ChevronRight, FilePlus, Settings, Trash2 } from '@hanzogui/lucide-icons-2'
|
|
2
|
+
import { Menu } from '@hanzogui/menu'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
import { Button, YStack } from '@hanzo/gui'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Menu accessibility test case
|
|
8
|
+
* Tests:
|
|
9
|
+
* - Trigger is focusable via tab
|
|
10
|
+
* - Menu opens on Enter/Space and focuses first item
|
|
11
|
+
* - Arrow keys navigate between items
|
|
12
|
+
* - Escape closes menu and returns focus to trigger
|
|
13
|
+
* - Submenu escape closes only submenu first
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
export function MenuAccessibilityCase() {
|
|
17
|
+
const [subMenuOpen, setSubMenuOpen] = React.useState(false)
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<YStack padding="$4" gap="$4">
|
|
21
|
+
{/* focusable element before menu to test tab order */}
|
|
22
|
+
<Button data-testid="before-button">Before</Button>
|
|
23
|
+
|
|
24
|
+
<Menu placement="bottom-start">
|
|
25
|
+
<Menu.Trigger asChild>
|
|
26
|
+
<Button data-testid="menu-trigger" size="$4">
|
|
27
|
+
Open Menu
|
|
28
|
+
</Button>
|
|
29
|
+
</Menu.Trigger>
|
|
30
|
+
|
|
31
|
+
<Menu.Portal zIndex={100}>
|
|
32
|
+
<Menu.Content
|
|
33
|
+
data-testid="menu-content"
|
|
34
|
+
p="$2"
|
|
35
|
+
minW={200}
|
|
36
|
+
borderWidth={1}
|
|
37
|
+
borderColor="$borderColor"
|
|
38
|
+
elevation="$3"
|
|
39
|
+
>
|
|
40
|
+
<Menu.Item
|
|
41
|
+
data-testid="menu-item-1"
|
|
42
|
+
key="item-1"
|
|
43
|
+
textValue="Settings"
|
|
44
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
45
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
46
|
+
>
|
|
47
|
+
<Settings size={14} />
|
|
48
|
+
<Menu.ItemTitle marginLeft="$2">Settings</Menu.ItemTitle>
|
|
49
|
+
</Menu.Item>
|
|
50
|
+
|
|
51
|
+
<Menu.Item
|
|
52
|
+
data-testid="menu-item-2"
|
|
53
|
+
key="item-2"
|
|
54
|
+
textValue="Profile"
|
|
55
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
56
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
57
|
+
>
|
|
58
|
+
<Menu.ItemTitle>Profile</Menu.ItemTitle>
|
|
59
|
+
</Menu.Item>
|
|
60
|
+
|
|
61
|
+
<Menu.Item
|
|
62
|
+
data-testid="menu-item-3"
|
|
63
|
+
key="item-3"
|
|
64
|
+
textValue="Preferences"
|
|
65
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
66
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
67
|
+
>
|
|
68
|
+
<Menu.ItemTitle>Preferences</Menu.ItemTitle>
|
|
69
|
+
</Menu.Item>
|
|
70
|
+
|
|
71
|
+
<Menu.Separator />
|
|
72
|
+
|
|
73
|
+
{/* submenu for testing nested escape behavior */}
|
|
74
|
+
<Menu.Sub
|
|
75
|
+
open={subMenuOpen}
|
|
76
|
+
onOpenChange={setSubMenuOpen}
|
|
77
|
+
placement="right-start"
|
|
78
|
+
>
|
|
79
|
+
<Menu.SubTrigger
|
|
80
|
+
data-testid="submenu-trigger"
|
|
81
|
+
key="actions"
|
|
82
|
+
justify="space-between"
|
|
83
|
+
textValue="Actions"
|
|
84
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
85
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
86
|
+
>
|
|
87
|
+
<Menu.ItemTitle>Actions</Menu.ItemTitle>
|
|
88
|
+
<ChevronRight size={12} color="$color10" />
|
|
89
|
+
</Menu.SubTrigger>
|
|
90
|
+
|
|
91
|
+
<Menu.Portal zIndex={200}>
|
|
92
|
+
<Menu.SubContent
|
|
93
|
+
data-testid="submenu-content"
|
|
94
|
+
elevation="$3"
|
|
95
|
+
minW={160}
|
|
96
|
+
bg="$background"
|
|
97
|
+
p="$2"
|
|
98
|
+
borderWidth={1}
|
|
99
|
+
borderColor="$borderColor"
|
|
100
|
+
>
|
|
101
|
+
<Menu.Item
|
|
102
|
+
data-testid="submenu-item-1"
|
|
103
|
+
key="create"
|
|
104
|
+
textValue="Create new"
|
|
105
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
106
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
107
|
+
>
|
|
108
|
+
<FilePlus size={14} />
|
|
109
|
+
<Menu.ItemTitle marginLeft="$2">Create new</Menu.ItemTitle>
|
|
110
|
+
</Menu.Item>
|
|
111
|
+
|
|
112
|
+
<Menu.Item
|
|
113
|
+
data-testid="submenu-item-2"
|
|
114
|
+
key="delete"
|
|
115
|
+
textValue="Delete all"
|
|
116
|
+
style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
|
|
117
|
+
focusStyle={{ bg: '$backgroundHover' }}
|
|
118
|
+
>
|
|
119
|
+
<Trash2 size={14} />
|
|
120
|
+
<Menu.ItemTitle marginLeft="$2">Delete all</Menu.ItemTitle>
|
|
121
|
+
</Menu.Item>
|
|
122
|
+
</Menu.SubContent>
|
|
123
|
+
</Menu.Portal>
|
|
124
|
+
</Menu.Sub>
|
|
125
|
+
</Menu.Content>
|
|
126
|
+
</Menu.Portal>
|
|
127
|
+
</Menu>
|
|
128
|
+
|
|
129
|
+
{/* focusable element after menu to test tab order */}
|
|
130
|
+
<Button data-testid="after-button">After</Button>
|
|
131
|
+
</YStack>
|
|
132
|
+
)
|
|
133
|
+
}
|