@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.
Files changed (431) hide show
  1. package/.detoxrc.js +130 -0
  2. package/.env.production +2 -0
  3. package/.maestro/config.yaml +4 -0
  4. package/.maestro/flows/shorthand-variables.yaml +23 -0
  5. package/.watchmanconfig +1 -0
  6. package/LICENSE +21 -0
  7. package/README.md +11 -0
  8. package/app.json +43 -0
  9. package/assets/adaptive-icon.png +0 -0
  10. package/assets/favicon.png +0 -0
  11. package/assets/icon.png +0 -0
  12. package/assets/splash.png +0 -0
  13. package/babel.config.js +25 -0
  14. package/e2e/CompilerExtraction.test.ts +147 -0
  15. package/e2e/GroupPressNative.test.ts +167 -0
  16. package/e2e/MediaQueryGtMd.test.ts +71 -0
  17. package/e2e/NativePortal.test.ts +113 -0
  18. package/e2e/PointerEvents.test.ts +116 -0
  19. package/e2e/PressStyleNative.noRngh.test.ts +191 -0
  20. package/e2e/PressStyleNative.test.ts +231 -0
  21. package/e2e/SafeArea.test.ts +57 -0
  22. package/e2e/SelectAndroidOnPress.test.ts +181 -0
  23. package/e2e/SelectRemount.test.ts +137 -0
  24. package/e2e/SheetDragResist.test.ts +370 -0
  25. package/e2e/SheetKeyboardDrag.test.ts +249 -0
  26. package/e2e/SheetScrollableDrag.test.ts +560 -0
  27. package/e2e/ShorthandVariables.test.ts +53 -0
  28. package/e2e/ThemeChangeBasic.test.ts +123 -0
  29. package/e2e/ThemeMutation.test.ts +80 -0
  30. package/e2e/check-rngh-status.test.ts +31 -0
  31. package/e2e/jest.config.js +19 -0
  32. package/e2e/utils/colors.ts +75 -0
  33. package/e2e/utils/navigation.ts +53 -0
  34. package/eas.json +22 -0
  35. package/flows/AlertDialog.yaml +17 -0
  36. package/flows/OpenApp.yaml +25 -0
  37. package/flows/Select.yaml +13 -0
  38. package/flows/Sheet.yaml +12 -0
  39. package/flows/Tabs.yaml +13 -0
  40. package/flows/Toast.yaml +14 -0
  41. package/flows/WarmUp.yaml +24 -0
  42. package/index.html +21 -0
  43. package/index.js +17 -0
  44. package/metro.config.js +64 -0
  45. package/next-router-shim.ts +9 -0
  46. package/package.json +118 -0
  47. package/plans/toast-2.md +471 -0
  48. package/playwright.config.ts +71 -0
  49. package/plugins/expo-modules-core-swift6.js +76 -0
  50. package/pod-install.sh +7 -0
  51. package/public/favicon.svg +70 -0
  52. package/public/fonts/inter.css +15 -0
  53. package/public/fonts/noto-cn.otf +0 -0
  54. package/public/gui-icon.svg +68 -0
  55. package/run-detox.sh +230 -0
  56. package/run-native-tests.sh +4 -0
  57. package/run-tests-parallel.ts +195 -0
  58. package/screenshots/Screenshotter.test.tsx +48 -0
  59. package/src/AnimationDemos.tsx +131 -0
  60. package/src/App.native.tsx +121 -0
  61. package/src/App.tsx +121 -0
  62. package/src/Navigation.tsx +98 -0
  63. package/src/Sandbox.tsx +87 -0
  64. package/src/TestDynamicEval.tsx +33 -0
  65. package/src/TestNativeSheet.tsx +100 -0
  66. package/src/components/TimedRender.tsx +18 -0
  67. package/src/constants/test-ids.ts +52 -0
  68. package/src/features/demos/demo-screen.tsx +72 -0
  69. package/src/features/home/ColorSchemeListItem.tsx +41 -0
  70. package/src/features/home/TestBuildAButton.tsx +102 -0
  71. package/src/features/home/TestSeparator.tsx +0 -0
  72. package/src/features/home/screen.tsx +285 -0
  73. package/src/features/testcases/screen.tsx +59 -0
  74. package/src/features/testcases/test-screen.tsx +50 -0
  75. package/src/generatedV5Theme.ts +112 -0
  76. package/src/gui.config.ts +411 -0
  77. package/src/guy.png +0 -0
  78. package/src/index.tsx +6 -0
  79. package/src/provider/index.tsx +18 -0
  80. package/src/test-gui-stack.tsx +11 -0
  81. package/src/test.tsx +3 -0
  82. package/src/useKitchenSinkTheme.tsx +15 -0
  83. package/src/usecases/ActionsSheetComparison.tsx +194 -0
  84. package/src/usecases/AnimatePresenceEnterExitCase.tsx +255 -0
  85. package/src/usecases/AnimatePresenceExitTest.tsx +69 -0
  86. package/src/usecases/AnimatedByProp.tsx +39 -0
  87. package/src/usecases/AnimationComprehensiveCase.tsx +2515 -0
  88. package/src/usecases/AnimationValueLoggingCase.tsx +526 -0
  89. package/src/usecases/AnimationsWithMediaQueriesCase.tsx +110 -0
  90. package/src/usecases/Benchmark.tsx +148 -0
  91. package/src/usecases/BenchmarkSelect.tsx +34 -0
  92. package/src/usecases/ButtonCircular.tsx +3 -0
  93. package/src/usecases/ButtonCustom.tsx +33 -0
  94. package/src/usecases/ButtonIconColor.tsx +18 -0
  95. package/src/usecases/ButtonInverse.tsx +30 -0
  96. package/src/usecases/ButtonUnstyled.tsx +31 -0
  97. package/src/usecases/CheckboxDisabledOnPress.tsx +62 -0
  98. package/src/usecases/ClickDuringEnterCase.tsx +59 -0
  99. package/src/usecases/CodeExamplesInput.tsx +9 -0
  100. package/src/usecases/ColorTokenFallback.tsx +52 -0
  101. package/src/usecases/CompilerExtraction.tsx +380 -0
  102. package/src/usecases/ComplexVariants.tsx +164 -0
  103. package/src/usecases/CrashAdaptSheet.tsx +98 -0
  104. package/src/usecases/CustomStyledAnimatedPopover.tsx +42 -0
  105. package/src/usecases/CustomStyledAnimatedTooltip.tsx +72 -0
  106. package/src/usecases/DOMNodeAPIs.tsx +154 -0
  107. package/src/usecases/DialogFocusScopeCase.tsx +277 -0
  108. package/src/usecases/DialogFocusScopeDebug.tsx +85 -0
  109. package/src/usecases/DialogNestedCase.tsx +121 -0
  110. package/src/usecases/DialogOpenControlled.tsx +49 -0
  111. package/src/usecases/DialogPointerEventsCase.tsx +58 -0
  112. package/src/usecases/DialogScopedCase.tsx +106 -0
  113. package/src/usecases/DialogSheetAdaptCase.tsx +178 -0
  114. package/src/usecases/DialogSheetAdaptResizeCase.tsx +98 -0
  115. package/src/usecases/DismissLayerStackingCase.tsx +223 -0
  116. package/src/usecases/DriverDisableAnimationPropsCase.tsx +44 -0
  117. package/src/usecases/Example.tsx +10 -0
  118. package/src/usecases/ExitCompletionCase.tsx +713 -0
  119. package/src/usecases/FocusVisibleButton.tsx +14 -0
  120. package/src/usecases/FocusVisibleButtonPointer.tsx +13 -0
  121. package/src/usecases/FocusVisibleButtonWithFocusStyle.tsx +16 -0
  122. package/src/usecases/FocusWithinCase.tsx +55 -0
  123. package/src/usecases/FontTokensInVariants.tsx +14 -0
  124. package/src/usecases/FormButtonTypeCase.tsx +34 -0
  125. package/src/usecases/GlobalScopedTriggerIsolationCase.tsx +178 -0
  126. package/src/usecases/GroupHoverMobile.tsx +39 -0
  127. package/src/usecases/GroupPressInVariant.tsx +92 -0
  128. package/src/usecases/GroupPressNative.tsx +200 -0
  129. package/src/usecases/GroupProp.tsx +96 -0
  130. package/src/usecases/GroupPseudoVariantOverride.tsx +56 -0
  131. package/src/usecases/GroupUseCases.tsx +94 -0
  132. package/src/usecases/HeightMediaQueryOverrideCase.tsx +183 -0
  133. package/src/usecases/InputAutoFocusAfterMenuCase.tsx +105 -0
  134. package/src/usecases/InputAutoFocusStyledCase.tsx +39 -0
  135. package/src/usecases/KeyboardControllerTest.tsx +146 -0
  136. package/src/usecases/ListItem.tsx +123 -0
  137. package/src/usecases/MediaQueriesV5.tsx +137 -0
  138. package/src/usecases/MediaQueryGtMd.tsx +73 -0
  139. package/src/usecases/MenuAboveDialogCase.tsx +75 -0
  140. package/src/usecases/MenuAccessibilityCase.tsx +133 -0
  141. package/src/usecases/MenuAnimatePositionCase.tsx +41 -0
  142. package/src/usecases/MenuArrowAnimatePresenceCase.tsx +98 -0
  143. package/src/usecases/MenuAsChildPositionCase.tsx +24 -0
  144. package/src/usecases/MenuAutoResizeCase.tsx +57 -0
  145. package/src/usecases/MenuBottomCase.tsx +55 -0
  146. package/src/usecases/MenuFocusLeaveCase.tsx +135 -0
  147. package/src/usecases/MenuHighlightCase.tsx +44 -0
  148. package/src/usecases/MenuItemFocusCase.tsx +79 -0
  149. package/src/usecases/MenuItemPseudoOverrideCase.tsx +270 -0
  150. package/src/usecases/MenuMultiTriggerCase.tsx +47 -0
  151. package/src/usecases/MenuOverflowCase.tsx +60 -0
  152. package/src/usecases/MenuSubCase.tsx +223 -0
  153. package/src/usecases/MenuSubLeftCase.tsx +178 -0
  154. package/src/usecases/MenuSubNestedPositionCase.tsx +171 -0
  155. package/src/usecases/MenuSubStyledCase.tsx +145 -0
  156. package/src/usecases/MenuThemeCase.tsx +50 -0
  157. package/src/usecases/MenuUnstyledCase.tsx +52 -0
  158. package/src/usecases/MultiDriverAnimation.tsx +118 -0
  159. package/src/usecases/NativePortalTest.tsx +179 -0
  160. package/src/usecases/NewInputBasic.tsx +16 -0
  161. package/src/usecases/NewInputEvents.tsx +29 -0
  162. package/src/usecases/NonGuiTextStyledType.tsx +23 -0
  163. package/src/usecases/OnLayoutCase.tsx +134 -0
  164. package/src/usecases/OnLayoutScaleCase.tsx +88 -0
  165. package/src/usecases/OnLayoutStressCase.tsx +353 -0
  166. package/src/usecases/OpacityModifierCase.tsx +113 -0
  167. package/src/usecases/OverlayStyled.tsx +66 -0
  168. package/src/usecases/ParagraphSpanFontInheritance.tsx +53 -0
  169. package/src/usecases/PlaceholderTextColor.tsx +20 -0
  170. package/src/usecases/PointerEventsCase.tsx +100 -0
  171. package/src/usecases/PopoverAndMenuMultiTriggerCase.tsx +138 -0
  172. package/src/usecases/PopoverCase.tsx +222 -0
  173. package/src/usecases/PopoverContentStyledPlusAnimations.tsx +44 -0
  174. package/src/usecases/PopoverFocusScopeCase.tsx +171 -0
  175. package/src/usecases/PopoverHoverableCase.tsx +167 -0
  176. package/src/usecases/PopoverHoverableDisableClickCase.tsx +118 -0
  177. package/src/usecases/PopoverHoverableRapidCase.tsx +103 -0
  178. package/src/usecases/PopoverHoverableScopedCase.tsx +135 -0
  179. package/src/usecases/PopoverScopedCase.tsx +76 -0
  180. package/src/usecases/PopoverTriggerIsolationCase.tsx +80 -0
  181. package/src/usecases/PressStyleNative.tsx +143 -0
  182. package/src/usecases/PseudoStyleMerge.tsx +25 -0
  183. package/src/usecases/PseudoTransitionCase.tsx +174 -0
  184. package/src/usecases/RawAnimatedValueCase.tsx +231 -0
  185. package/src/usecases/RemoveScrollCase.tsx +66 -0
  186. package/src/usecases/RenderPropCase.tsx +263 -0
  187. package/src/usecases/SafeAreaCase.tsx +236 -0
  188. package/src/usecases/ScrollViewRefCase.tsx +88 -0
  189. package/src/usecases/SecondPage.tsx +5 -0
  190. package/src/usecases/SelectAndroidOnPress.tsx +129 -0
  191. package/src/usecases/SelectFocusScopeCase.tsx +270 -0
  192. package/src/usecases/SelectRemount.tsx +136 -0
  193. package/src/usecases/Shadows.tsx +5 -0
  194. package/src/usecases/SheetAnimationCase.tsx +155 -0
  195. package/src/usecases/SheetDragCase.tsx +183 -0
  196. package/src/usecases/SheetDragResistCase.tsx +433 -0
  197. package/src/usecases/SheetDragResistCase.web.tsx +359 -0
  198. package/src/usecases/SheetKeyboardDragCase.tsx +328 -0
  199. package/src/usecases/SheetKeyboardFitContentCase.tsx +165 -0
  200. package/src/usecases/SheetOnAnimationCompleteCase.tsx +54 -0
  201. package/src/usecases/SheetScrollLockCase.tsx +166 -0
  202. package/src/usecases/SheetScrollableDrag.tsx +249 -0
  203. package/src/usecases/SheetSnapPointsFitCase.tsx +393 -0
  204. package/src/usecases/ShorthandVariables.tsx +49 -0
  205. package/src/usecases/SlowThemeReRender.tsx +48 -0
  206. package/src/usecases/SpinnerCustomColors.tsx +34 -0
  207. package/src/usecases/StackZIndex.tsx +82 -0
  208. package/src/usecases/StressPage.tsx +301 -0
  209. package/src/usecases/StylePlatform.tsx +30 -0
  210. package/src/usecases/StyleProp.tsx +29 -0
  211. package/src/usecases/StyledAnchor.tsx +27 -0
  212. package/src/usecases/StyledButtonAnimationAuto.tsx +99 -0
  213. package/src/usecases/StyledButtonTheme.tsx +63 -0
  214. package/src/usecases/StyledButtonVariantPseudo.tsx +25 -0
  215. package/src/usecases/StyledButtonVariantPseudoMerge.tsx +77 -0
  216. package/src/usecases/StyledCheckboxTheme.tsx +23 -0
  217. package/src/usecases/StyledContextColor.tsx +246 -0
  218. package/src/usecases/StyledContextTokens.tsx +147 -0
  219. package/src/usecases/StyledHOCNamed.tsx +20 -0
  220. package/src/usecases/StyledHtmlCase.tsx +144 -0
  221. package/src/usecases/StyledIconColor.tsx +19 -0
  222. package/src/usecases/StyledInputFocusStyle.tsx +21 -0
  223. package/src/usecases/StyledInputOnFocus.tsx +30 -0
  224. package/src/usecases/StyledMediaQueryMerge.tsx +95 -0
  225. package/src/usecases/StyledOverridePsuedo.tsx +26 -0
  226. package/src/usecases/StyledRNW.tsx +61 -0
  227. package/src/usecases/StyledStyleableInputOnFocus.tsx +34 -0
  228. package/src/usecases/StyledStyleableInputVariant.tsx +48 -0
  229. package/src/usecases/StyledStyledStyleableInputOnFocus.tsx +36 -0
  230. package/src/usecases/StyledVariantTextColor.tsx +25 -0
  231. package/src/usecases/StyledViewOnFocus.tsx +32 -0
  232. package/src/usecases/TabHoverAnimationCase.tsx +212 -0
  233. package/src/usecases/TextNestedInheritance.tsx +80 -0
  234. package/src/usecases/ThemeChange.tsx +100 -0
  235. package/src/usecases/ThemeChangeBasic.tsx +52 -0
  236. package/src/usecases/ThemeComponentResolution.tsx +119 -0
  237. package/src/usecases/ThemeConditionalName.tsx +31 -0
  238. package/src/usecases/ThemeMediaAnimationCase.tsx +39 -0
  239. package/src/usecases/ThemeMutation.tsx +86 -0
  240. package/src/usecases/ThemeNested.tsx +103 -0
  241. package/src/usecases/ThemeReset.tsx +62 -0
  242. package/src/usecases/ThemeShallowCase.tsx +83 -0
  243. package/src/usecases/ToastCase.tsx +46 -0
  244. package/src/usecases/ToggleGroupActiveProps.tsx +40 -0
  245. package/src/usecases/ToggleGroupXGroupCase.tsx +104 -0
  246. package/src/usecases/TooltipAnimationCase.tsx +99 -0
  247. package/src/usecases/TooltipCase.tsx +32 -0
  248. package/src/usecases/TooltipGlobalPatternCase.tsx +83 -0
  249. package/src/usecases/TooltipGroupCase.tsx +102 -0
  250. package/src/usecases/TooltipMultiTriggerCase.tsx +88 -0
  251. package/src/usecases/TooltipPositionJumpCase.tsx +91 -0
  252. package/src/usecases/TooltipTriggerInlineCase.tsx +60 -0
  253. package/src/usecases/TransformMediaQueryMerge.tsx +98 -0
  254. package/src/usecases/UseCases.tsx +409 -0
  255. package/src/usecases/UseTheme.tsx +41 -0
  256. package/src/usecases/V5ThemeBuilderOutput.tsx +231 -0
  257. package/src/usecases/VariantFontFamily.tsx +25 -0
  258. package/src/usecases/VariantsOrder.tsx +117 -0
  259. package/src/usecases/ZIndex.tsx +155 -0
  260. package/src/usecases/helpers.tsx +44 -0
  261. package/src/usecases/index.native.ts +122 -0
  262. package/src/usecases/index.ts +3 -0
  263. package/src/usecases/index.web.ts +177 -0
  264. package/tests/AnimatePresenceEnterExit.animated.test.tsx +176 -0
  265. package/tests/AnimatedByProp.animated.test.tsx +138 -0
  266. package/tests/AnimationBehavior.animated.test.tsx +543 -0
  267. package/tests/AnimationTiming.animated.test.tsx +195 -0
  268. package/tests/AnimationsWithMediaQueries.animated.test.tsx +154 -0
  269. package/tests/BuildAButton.test.tsx +87 -0
  270. package/tests/ButtonCircular.test.tsx +17 -0
  271. package/tests/ButtonCustom.test.tsx +17 -0
  272. package/tests/ButtonIconColor.test.tsx +23 -0
  273. package/tests/ButtonUnstyled.test.tsx +56 -0
  274. package/tests/ClickDuringEnter.animated.test.tsx +174 -0
  275. package/tests/ColorTokenFallback.test.tsx +45 -0
  276. package/tests/DOMNodeAPIs.test.tsx +161 -0
  277. package/tests/DialogFocusScope.animated.test.tsx +309 -0
  278. package/tests/DialogNested.test.tsx +128 -0
  279. package/tests/DialogOpenControlled.test.tsx +42 -0
  280. package/tests/DialogPointerEvents.animated.test.tsx +108 -0
  281. package/tests/DialogScoped.test.tsx +137 -0
  282. package/tests/DialogSheetAdapt.test.tsx +68 -0
  283. package/tests/DialogSheetAdaptResize.test.tsx +161 -0
  284. package/tests/DismissLayerStacking.test.tsx +292 -0
  285. package/tests/DriverDisableAnimationProps.animated.test.tsx +157 -0
  286. package/tests/ExitCompletion.animated.test.tsx +425 -0
  287. package/tests/ExitTimingCheck.animated.test.ts +34 -0
  288. package/tests/FocusVisibleButton.test.tsx +41 -0
  289. package/tests/FocusVisibleButtonPointerFocus.test.tsx +23 -0
  290. package/tests/FocusVisibleButtonPointerFocusWithFocusStyle.test.tsx +40 -0
  291. package/tests/FocusWithinStyle.animated.test.tsx +66 -0
  292. package/tests/FocusWithinStyle.test.tsx +60 -0
  293. package/tests/FormButtonType.test.tsx +42 -0
  294. package/tests/GlobalScopedTriggerIsolation.test.tsx +89 -0
  295. package/tests/GroupHoverMobile.test.tsx +52 -0
  296. package/tests/GroupPressInVariant.test.tsx +82 -0
  297. package/tests/GroupProp.test.tsx +30 -0
  298. package/tests/GroupPseudoVariantOverride.test.tsx +57 -0
  299. package/tests/GroupUseCases.test.tsx +111 -0
  300. package/tests/GuiSiteMotion.test.ts +481 -0
  301. package/tests/HeightMediaQueryOverride.test.tsx +112 -0
  302. package/tests/InputAutoFocusAfterMenu.test.tsx +55 -0
  303. package/tests/InputAutoFocusStyled.test.tsx +22 -0
  304. package/tests/ListItem.test.tsx +129 -0
  305. package/tests/MediaQueriesV5.test.tsx +113 -0
  306. package/tests/MediaQueryGtMd.test.tsx +84 -0
  307. package/tests/MenuAboveDialog.test.tsx +108 -0
  308. package/tests/MenuAccessibility.test.tsx +346 -0
  309. package/tests/MenuAnimatePosition.animated.test.tsx +57 -0
  310. package/tests/MenuArrowAnimatePresence.animated.test.tsx +71 -0
  311. package/tests/MenuAsChildPosition.test.tsx +16 -0
  312. package/tests/MenuAutoResize.test.tsx +54 -0
  313. package/tests/MenuFocusLeave.test.tsx +181 -0
  314. package/tests/MenuHighlight.test.tsx +165 -0
  315. package/tests/MenuHoverKeyboardBugs.test.tsx +252 -0
  316. package/tests/MenuItemFocus.test.tsx +59 -0
  317. package/tests/MenuItemPseudoOverride.test.tsx +231 -0
  318. package/tests/MenuMultiTrigger.test.tsx +101 -0
  319. package/tests/MenuOverflow.test.tsx +93 -0
  320. package/tests/MenuStayInFrame.test.tsx +102 -0
  321. package/tests/MenuSubKeyboardFocus.test.tsx +220 -0
  322. package/tests/MenuSubLeftSafePolygon.test.tsx +88 -0
  323. package/tests/MenuSubNestedPosition.test.tsx +48 -0
  324. package/tests/MenuSubSafePolygon.test.tsx +97 -0
  325. package/tests/MenuSubStyled.test.tsx +40 -0
  326. package/tests/MenuTheme.test.tsx +34 -0
  327. package/tests/MenuUnstyled.test.tsx +56 -0
  328. package/tests/MultiDriverAnimation.test.tsx +207 -0
  329. package/tests/NewInputBasic.test.tsx +50 -0
  330. package/tests/NewInputEvents.test.tsx +55 -0
  331. package/tests/OnLayout.test.tsx +163 -0
  332. package/tests/OnLayoutScale.test.tsx +100 -0
  333. package/tests/OnLayoutStress.test.tsx +304 -0
  334. package/tests/ParagraphSpanFontInheritance.test.tsx +73 -0
  335. package/tests/PointerEvents.test.tsx +123 -0
  336. package/tests/Popover.animated.test.tsx +234 -0
  337. package/tests/PopoverAndMenuMultiTrigger.test.tsx +184 -0
  338. package/tests/PopoverAnimatePosition.animated.test.tsx +51 -0
  339. package/tests/PopoverClickDuringEnter.animated.test.tsx +197 -0
  340. package/tests/PopoverFocusScope.test.tsx +242 -0
  341. package/tests/PopoverHoverable.test.tsx +383 -0
  342. package/tests/PopoverHoverableDisableClick.test.tsx +106 -0
  343. package/tests/PopoverHoverableRapid.test.tsx +129 -0
  344. package/tests/PopoverHoverableReposition.test.tsx +111 -0
  345. package/tests/PopoverHoverableScoped.animated.test.tsx +103 -0
  346. package/tests/PopoverHoverableStress.test.tsx +169 -0
  347. package/tests/PopoverInitialPosition.animated.test.tsx +82 -0
  348. package/tests/PopoverMiddlewareSkipRegression.animated.test.tsx +221 -0
  349. package/tests/PopoverScoped.test.tsx +128 -0
  350. package/tests/PopoverScopedPositionGlitch.animated.test.tsx +184 -0
  351. package/tests/PopoverTriggerIsolation.test.tsx +62 -0
  352. package/tests/PseudoTransition.animated.test.tsx +319 -0
  353. package/tests/RawAnimatedValue.test.tsx +147 -0
  354. package/tests/RemoveScroll.test.tsx +223 -0
  355. package/tests/RenderProp.test.tsx +293 -0
  356. package/tests/ScrollViewRef.test.tsx +39 -0
  357. package/tests/SelectClickHold.test.tsx +147 -0
  358. package/tests/SelectFocusScope.test.tsx +176 -0
  359. package/tests/SelectInnerPositioning.test.tsx +82 -0
  360. package/tests/SelectKeyboardNav.test.tsx +173 -0
  361. package/tests/SelectPositioning.test.tsx +56 -0
  362. package/tests/SelectTypeahead.test.tsx +63 -0
  363. package/tests/Shadows.test.tsx +14 -0
  364. package/tests/SheetAnimation.animated.test.tsx +413 -0
  365. package/tests/SheetDrag.animated.test.tsx +223 -0
  366. package/tests/SheetDragResist.animated.test.tsx +393 -0
  367. package/tests/SheetOnAnimationComplete.animated.test.tsx +62 -0
  368. package/tests/SheetScrollLock.animated.test.tsx +287 -0
  369. package/tests/SheetScrollableDrag.animated.test.tsx +1264 -0
  370. package/tests/SheetSnapPointsFit.animated.test.tsx +259 -0
  371. package/tests/ShorthandVariables.test.tsx +44 -0
  372. package/tests/SpinnerCustomColors.test.tsx +67 -0
  373. package/tests/StackZIndex.test.tsx +51 -0
  374. package/tests/StressPagePerf.test.tsx +76 -0
  375. package/tests/StylePlatform.test.tsx +38 -0
  376. package/tests/StyleProp.test.tsx +20 -0
  377. package/tests/StyledAnchor.test.tsx +17 -0
  378. package/tests/StyledButtonTheme.test.tsx +22 -0
  379. package/tests/StyledButtonVariantPseudo.test.tsx +20 -0
  380. package/tests/StyledButtonVariantPseudoMerge.animated.test.tsx +33 -0
  381. package/tests/StyledCheckboxTheme.test.tsx +16 -0
  382. package/tests/StyledContextColor.test.tsx +119 -0
  383. package/tests/StyledContextTokens.test.tsx +56 -0
  384. package/tests/StyledHOCNamed.test.tsx +16 -0
  385. package/tests/StyledHtml.test.tsx +161 -0
  386. package/tests/StyledIconColor.test.tsx +32 -0
  387. package/tests/StyledInputFocusStyle.test.tsx +19 -0
  388. package/tests/StyledInputOnFocus.test.tsx +27 -0
  389. package/tests/StyledMediaQueryMerge.test.tsx +66 -0
  390. package/tests/StyledRNW.test.tsx +17 -0
  391. package/tests/StyledStyleableInputOnFocus.test.tsx +27 -0
  392. package/tests/StyledStyleableInputVariant.test.tsx +22 -0
  393. package/tests/StyledStyledStyleableInputOnFocus.test.tsx +27 -0
  394. package/tests/StyledVariantTextColor.test.tsx +24 -0
  395. package/tests/StyledViewOnFocus.test.tsx +27 -0
  396. package/tests/TabHoverAnimation.animated.test.tsx +468 -0
  397. package/tests/TabHoverPositionSmooth.animated.test.tsx +129 -0
  398. package/tests/TextNestedInheritance.test.tsx +93 -0
  399. package/tests/ThemeChange.test.tsx +70 -0
  400. package/tests/ThemeComponentResolution.test.tsx +82 -0
  401. package/tests/ThemeConditionalName.test.tsx +34 -0
  402. package/tests/ThemeMediaAnimation.test.tsx +65 -0
  403. package/tests/ThemeNested.test.tsx +141 -0
  404. package/tests/ThemeReset.test.tsx +63 -0
  405. package/tests/ThemeShallow.test.tsx +95 -0
  406. package/tests/Toast.test.tsx +106 -0
  407. package/tests/ToggleGroup.test.tsx +61 -0
  408. package/tests/ToggleGroupActiveProps.test.tsx +38 -0
  409. package/tests/ToggleGroupXGroup.test.tsx +172 -0
  410. package/tests/TooltipAnimation.animated.test.tsx +260 -0
  411. package/tests/TooltipEnterInterrupt.animated.test.tsx +76 -0
  412. package/tests/TooltipGlobalPattern.animated.test.tsx +208 -0
  413. package/tests/TooltipGroup.animated.test.tsx +79 -0
  414. package/tests/TooltipMultiTrigger.test.tsx +116 -0
  415. package/tests/TooltipPositionJump.animated.test.tsx +229 -0
  416. package/tests/TooltipPositionJumpNotes.md +219 -0
  417. package/tests/TooltipRapidSwitch.animated.test.tsx +399 -0
  418. package/tests/TooltipTriggerInline.test.tsx +65 -0
  419. package/tests/TransformMediaQueryMerge.test.tsx +104 -0
  420. package/tests/TransitionEnterExit.animated.test.tsx +311 -0
  421. package/tests/UseTheme.test.tsx +16 -0
  422. package/tests/V5ThemeBuilderOutput.test.tsx +164 -0
  423. package/tests/VariantFontFamily.test.tsx +11 -0
  424. package/tests/VariantsOrder.test.tsx +53 -0
  425. package/tests/_debug_position.mjs +52 -0
  426. package/tests/test-utils.ts +106 -0
  427. package/tests/utils.tsx +54 -0
  428. package/tsconfig.json +45 -0
  429. package/vite-env.d.ts +1 -0
  430. package/vite.config.ts +14 -0
  431. package/webpack.config.js +139 -0
@@ -0,0 +1,143 @@
1
+ import { useState } from 'react'
2
+ import { Text, View, XStack, YStack, styled } from '@hanzo/gui'
3
+
4
+ /**
5
+ * Test cases for native press style behaviors:
6
+ *
7
+ * 1. pressStyle WITHOUT transition - tests fallback path in createComponent
8
+ * 2. pressStyle WITH transition - tests animation driver path
9
+ * 3. Press and drag off behavior - should unpress correctly
10
+ *
11
+ * Colors are chosen to be easily distinguishable in screenshots:
12
+ * - Default: pure blue (#0000ff-ish via $blue10)
13
+ * - Pressed: pure red (#ff0000-ish via $red10)
14
+ */
15
+
16
+ // pressStyle WITHOUT transition - tests the fallback to normal re-render
17
+ const ColorTestPressable = styled(View, {
18
+ name: 'ColorTestPressable',
19
+ width: 200,
20
+ height: 100,
21
+ backgroundColor: '$blue10',
22
+ alignItems: 'center',
23
+ justifyContent: 'center',
24
+
25
+ pressStyle: {
26
+ backgroundColor: '$red10',
27
+ },
28
+ })
29
+
30
+ // pressStyle WITH transition - tests animation driver path
31
+ const ColorTestPressableAnimated = styled(View, {
32
+ name: 'ColorTestPressableAnimated',
33
+ width: 200,
34
+ height: 100,
35
+ backgroundColor: '$blue10',
36
+ alignItems: 'center',
37
+ justifyContent: 'center',
38
+ transition: 'quick',
39
+
40
+ pressStyle: {
41
+ backgroundColor: '$red10',
42
+ },
43
+ })
44
+
45
+ export function PressStyleNative() {
46
+ const [simplePressState, setSimplePressState] = useState({
47
+ pressInCount: 0,
48
+ pressOutCount: 0,
49
+ isPressed: false,
50
+ })
51
+
52
+ const [animatedPressState, setAnimatedPressState] = useState({
53
+ pressInCount: 0,
54
+ pressOutCount: 0,
55
+ isPressed: false,
56
+ })
57
+
58
+ return (
59
+ <YStack gap="$4" padding="$4" testID="press-style-native-root">
60
+ <Text fontSize="$5" fontWeight="bold">
61
+ Press Style Tests
62
+ </Text>
63
+
64
+ {/* test 1: pressStyle WITHOUT transition */}
65
+ <YStack gap="$2">
66
+ <Text fontSize="$3">1. No Transition</Text>
67
+ <Text fontSize="$2" color="$gray11">
68
+ Blue → Red (no animation)
69
+ </Text>
70
+ <ColorTestPressable
71
+ testID="color-test-pressable"
72
+ onPressIn={() => {
73
+ setSimplePressState((s) => ({
74
+ ...s,
75
+ pressInCount: s.pressInCount + 1,
76
+ isPressed: true,
77
+ }))
78
+ }}
79
+ onPressOut={() => {
80
+ setSimplePressState((s) => ({
81
+ ...s,
82
+ pressOutCount: s.pressOutCount + 1,
83
+ isPressed: false,
84
+ }))
85
+ }}
86
+ >
87
+ <Text color="white" fontWeight="bold">
88
+ PRESS ME
89
+ </Text>
90
+ </ColorTestPressable>
91
+ <XStack gap="$2">
92
+ <Text testID="simple-press-in-count">In: {simplePressState.pressInCount}</Text>
93
+ <Text testID="simple-press-out-count">
94
+ Out: {simplePressState.pressOutCount}
95
+ </Text>
96
+ <Text testID="simple-is-pressed">
97
+ Pressed: {simplePressState.isPressed ? 'YES' : 'NO'}
98
+ </Text>
99
+ </XStack>
100
+ </YStack>
101
+
102
+ {/* test 2: pressStyle WITH transition */}
103
+ <YStack gap="$2">
104
+ <Text fontSize="$3">2. With Transition</Text>
105
+ <Text fontSize="$2" color="$gray11">
106
+ Blue → Red (animated)
107
+ </Text>
108
+ <ColorTestPressableAnimated
109
+ testID="animated-color-test-pressable"
110
+ onPressIn={() => {
111
+ setAnimatedPressState((s) => ({
112
+ ...s,
113
+ pressInCount: s.pressInCount + 1,
114
+ isPressed: true,
115
+ }))
116
+ }}
117
+ onPressOut={() => {
118
+ setAnimatedPressState((s) => ({
119
+ ...s,
120
+ pressOutCount: s.pressOutCount + 1,
121
+ isPressed: false,
122
+ }))
123
+ }}
124
+ >
125
+ <Text color="white" fontWeight="bold">
126
+ ANIMATED
127
+ </Text>
128
+ </ColorTestPressableAnimated>
129
+ <XStack gap="$2">
130
+ <Text testID="animated-press-in-count">
131
+ In: {animatedPressState.pressInCount}
132
+ </Text>
133
+ <Text testID="animated-press-out-count">
134
+ Out: {animatedPressState.pressOutCount}
135
+ </Text>
136
+ <Text testID="animated-is-pressed">
137
+ Pressed: {animatedPressState.isPressed ? 'YES' : 'NO'}
138
+ </Text>
139
+ </XStack>
140
+ </YStack>
141
+ </YStack>
142
+ )
143
+ }
@@ -0,0 +1,25 @@
1
+ import { View, Text, YStack, styled } from '@hanzo/gui'
2
+
3
+ const CustomYStack = styled(YStack, {
4
+ backgroundColor: 'yellow',
5
+ hoverStyle: {
6
+ backgroundColor: 'red',
7
+ },
8
+ })
9
+
10
+ export function PseudoStyleMerge() {
11
+ return (
12
+ <View flex={1} items="center" justify="center">
13
+ <CustomYStack
14
+ width={100}
15
+ height={100}
16
+ hoverStyle={{
17
+ scale: 2,
18
+ }}
19
+ transition="quick"
20
+ >
21
+ <Text>hi</Text>
22
+ </CustomYStack>
23
+ </View>
24
+ )
25
+ }
@@ -0,0 +1,174 @@
1
+ import { Square, YStack, Text, XStack, View, styled } from '@hanzo/gui'
2
+
3
+ /**
4
+ * PSEUDO TRANSITION TEST CASES
5
+ *
6
+ * Tests for transition prop inside pseudo-style props (hoverStyle, pressStyle, etc.)
7
+ * CSS semantics: enter uses pseudo's transition, exit uses base transition
8
+ *
9
+ * Test scenarios:
10
+ * 1. hoverStyle with transition - enter fast (200ms), exit slow (1000ms)
11
+ * 2. pressStyle with transition - press fast (200ms), release slow (1000ms)
12
+ * 3. Multiple pseudo states with different transitions
13
+ * 4. $group-hover with transition
14
+ */
15
+
16
+ // styled component for group test
17
+ const GroupHoverSquare = styled(Square, {
18
+ width: 100,
19
+ height: 100,
20
+ backgroundColor: '$blue10',
21
+ transition: '1000ms',
22
+
23
+ variants: {
24
+ groupHover: {
25
+ true: {
26
+ // this would be the $group-hover case - tested via props below
27
+ },
28
+ },
29
+ },
30
+ })
31
+
32
+ export function PseudoTransitionCase() {
33
+ return (
34
+ <YStack padding="$4" gap="$8">
35
+ <Text fontSize="$6" fontWeight="bold">
36
+ Pseudo Transition Tests
37
+ </Text>
38
+
39
+ {/* Scenario 1: hoverStyle transition */}
40
+ <YStack gap="$2">
41
+ <Text>Scenario 1: hover - enter 200ms, exit 1000ms</Text>
42
+ <Text color="$gray10" fontSize="$2">
43
+ Hover over the square. Enter should be fast, exit should be slow.
44
+ </Text>
45
+ <Square
46
+ data-testid="scenario-1-target"
47
+ width={100}
48
+ height={100}
49
+ backgroundColor="$blue10"
50
+ transition="1000ms"
51
+ hoverStyle={{
52
+ transition: '200ms',
53
+ backgroundColor: '$red10',
54
+ }}
55
+ />
56
+ </YStack>
57
+
58
+ {/* Scenario 2: pressStyle transition */}
59
+ <YStack gap="$2">
60
+ <Text>Scenario 2: press - enter 200ms, exit 1000ms</Text>
61
+ <Text color="$gray10" fontSize="$2">
62
+ Press and hold the square. Press should be fast, release should be slow.
63
+ </Text>
64
+ <Square
65
+ data-testid="scenario-2-target"
66
+ width={100}
67
+ height={100}
68
+ backgroundColor="$green10"
69
+ transition="1000ms"
70
+ pressStyle={{
71
+ transition: '200ms',
72
+ backgroundColor: '$purple10',
73
+ }}
74
+ />
75
+ </YStack>
76
+
77
+ {/* Scenario 3: hover and press with different transitions */}
78
+ <YStack gap="$2">
79
+ <Text>Scenario 3: hover 400ms, press 200ms (press takes priority)</Text>
80
+ <Text color="$gray10" fontSize="$2">
81
+ Hover uses 400ms, press uses 200ms. When both active, press wins.
82
+ </Text>
83
+ <Square
84
+ data-testid="scenario-3-target"
85
+ width={100}
86
+ height={100}
87
+ backgroundColor="$orange10"
88
+ transition="1000ms"
89
+ hoverStyle={{
90
+ transition: '400ms',
91
+ backgroundColor: '$yellow10',
92
+ }}
93
+ pressStyle={{
94
+ transition: '200ms',
95
+ backgroundColor: '$pink10',
96
+ }}
97
+ />
98
+ </YStack>
99
+
100
+ {/* Scenario 4: $group-hover with transition - uses opacity for simpler testing */}
101
+ <YStack gap="$2">
102
+ <Text>Scenario 4: group hover - enter 200ms, exit 1000ms</Text>
103
+ <Text color="$gray10" fontSize="$2">
104
+ Hover over the container. Child square opacity animates with group hover.
105
+ </Text>
106
+ <XStack
107
+ data-testid="scenario-4-container"
108
+ group="testy"
109
+ padding="$4"
110
+ backgroundColor="#eee"
111
+ borderRadius="$4"
112
+ >
113
+ <Square
114
+ data-testid="scenario-4-target"
115
+ width={100}
116
+ height={100}
117
+ backgroundColor="#06b6d4"
118
+ opacity={0.3}
119
+ transition="1000ms"
120
+ $group-testy-hover={{
121
+ transition: '200ms',
122
+ opacity: 1,
123
+ }}
124
+ />
125
+ </XStack>
126
+ </YStack>
127
+
128
+ {/* Scenario 5: focusStyle with transition */}
129
+ <YStack gap="$2">
130
+ <Text>Scenario 5: focus - enter 200ms, exit 1000ms</Text>
131
+ <Text color="$gray10" fontSize="$2">
132
+ Click to focus the square. Focus enter should be fast, blur should be slow.
133
+ </Text>
134
+ <View
135
+ data-testid="scenario-5-target"
136
+ tabIndex={0}
137
+ width={100}
138
+ height={100}
139
+ backgroundColor="$purple10"
140
+ transition="1000ms"
141
+ focusStyle={{
142
+ transition: '200ms',
143
+ backgroundColor: '$blue10',
144
+ outlineWidth: 2,
145
+ outlineColor: '$blue10',
146
+ outlineStyle: 'solid',
147
+ }}
148
+ />
149
+ </YStack>
150
+
151
+ {/* Scenario 6: opacity animation in hoverStyle */}
152
+ <YStack gap="$2">
153
+ <Text>Scenario 6: opacity - hover enter 200ms, exit 1000ms</Text>
154
+ <Text color="$gray10" fontSize="$2">
155
+ Opacity fades in fast (200ms) and fades out slow (1000ms).
156
+ </Text>
157
+ <Square
158
+ data-testid="scenario-6-target"
159
+ width={100}
160
+ height={100}
161
+ backgroundColor="$gray10"
162
+ opacity={0.3}
163
+ transition="1000ms"
164
+ hoverStyle={{
165
+ transition: '200ms',
166
+ opacity: 1,
167
+ }}
168
+ />
169
+ </YStack>
170
+ </YStack>
171
+ )
172
+ }
173
+
174
+ export default PseudoTransitionCase
@@ -0,0 +1,231 @@
1
+ import { useEffect, useRef, useState } from 'react'
2
+ import { Animated, View as RNView, Text as RNText, StyleSheet } from 'react-native'
3
+ import { Button, Paragraph, YStack, XStack } from '@hanzo/gui'
4
+
5
+ /**
6
+ * Test case for raw Animated.Value with Animated.createAnimatedComponent
7
+ *
8
+ * This tests the core react-native-web-lite animated implementation
9
+ * to verify AnimatedValue objects are properly consumed/interpolated.
10
+ *
11
+ * Key things being tested:
12
+ * 1. Animated.Value with direct numeric style (opacity)
13
+ * 2. Animated.Value with interpolation (color)
14
+ * 3. Animated.Value with transform
15
+ * 4. Animated.timing driving updates
16
+ */
17
+
18
+ const AnimatedView = Animated.createAnimatedComponent(RNView)
19
+
20
+ export function RawAnimatedValueCase() {
21
+ const opacity = useRef(new Animated.Value(0)).current
22
+ const translateY = useRef(new Animated.Value(50)).current
23
+ const scale = useRef(new Animated.Value(0.5)).current
24
+
25
+ const [isAnimated, setIsAnimated] = useState(false)
26
+ const [debugInfo, setDebugInfo] = useState<string>('')
27
+
28
+ // log the style value to debug
29
+ useEffect(() => {
30
+ const styleObj = {
31
+ opacity,
32
+ transform: [{ translateY }, { scale }],
33
+ }
34
+
35
+ // check what __getValue returns
36
+ // @ts-expect-error
37
+ const opacityValue = opacity.__getValue?.() ?? 'no __getValue'
38
+ // @ts-expect-error
39
+ const translateYValue = translateY.__getValue?.() ?? 'no __getValue'
40
+ // @ts-expect-error
41
+ const scaleValue = scale.__getValue?.() ?? 'no __getValue'
42
+
43
+ setDebugInfo(
44
+ JSON.stringify(
45
+ {
46
+ opacityValue,
47
+ translateYValue,
48
+ scaleValue,
49
+ opacityType: typeof opacity,
50
+ opacityConstructor: opacity?.constructor?.name,
51
+ },
52
+ null,
53
+ 2
54
+ )
55
+ )
56
+
57
+ console.log('[RAW_ANIMATED] Initial values:', {
58
+ opacity: opacityValue,
59
+ translateY: translateYValue,
60
+ scale: scaleValue,
61
+ })
62
+ }, [opacity, translateY, scale])
63
+
64
+ const animateIn = () => {
65
+ console.log('[RAW_ANIMATED] Starting animation IN')
66
+ setIsAnimated(true)
67
+
68
+ Animated.parallel([
69
+ Animated.timing(opacity, {
70
+ toValue: 1,
71
+ duration: 300,
72
+ useNativeDriver: false,
73
+ }),
74
+ Animated.timing(translateY, {
75
+ toValue: 0,
76
+ duration: 300,
77
+ useNativeDriver: false,
78
+ }),
79
+ Animated.timing(scale, {
80
+ toValue: 1,
81
+ duration: 300,
82
+ useNativeDriver: false,
83
+ }),
84
+ ]).start(() => {
85
+ console.log('[RAW_ANIMATED] Animation IN complete')
86
+ })
87
+ }
88
+
89
+ const animateOut = () => {
90
+ console.log('[RAW_ANIMATED] Starting animation OUT')
91
+ setIsAnimated(false)
92
+
93
+ Animated.parallel([
94
+ Animated.timing(opacity, {
95
+ toValue: 0,
96
+ duration: 300,
97
+ useNativeDriver: false,
98
+ }),
99
+ Animated.timing(translateY, {
100
+ toValue: 50,
101
+ duration: 300,
102
+ useNativeDriver: false,
103
+ }),
104
+ Animated.timing(scale, {
105
+ toValue: 0.5,
106
+ duration: 300,
107
+ useNativeDriver: false,
108
+ }),
109
+ ]).start(() => {
110
+ console.log('[RAW_ANIMATED] Animation OUT complete')
111
+ })
112
+ }
113
+
114
+ // interpolated color
115
+ const backgroundColor = opacity.interpolate({
116
+ inputRange: [0, 1],
117
+ outputRange: ['rgb(255, 0, 0)', 'rgb(0, 255, 0)'],
118
+ })
119
+
120
+ return (
121
+ <YStack gap="$4" padding="$4" flex={1}>
122
+ <Paragraph fontWeight="bold">Raw Animated.Value Test</Paragraph>
123
+ <Paragraph size="$2" color="$color10">
124
+ Tests Animated.createAnimatedComponent with AnimatedValue styles
125
+ </Paragraph>
126
+
127
+ <XStack gap="$4">
128
+ <Button testID="animate-in-trigger" onPress={animateIn} disabled={isAnimated}>
129
+ Animate In
130
+ </Button>
131
+ <Button testID="animate-out-trigger" onPress={animateOut} disabled={!isAnimated}>
132
+ Animate Out
133
+ </Button>
134
+ </XStack>
135
+
136
+ {/* The animated box */}
137
+ <AnimatedView
138
+ testID="animated-box"
139
+ style={[
140
+ styles.box,
141
+ {
142
+ opacity,
143
+ backgroundColor,
144
+ transform: [{ translateY }, { scale }],
145
+ },
146
+ ]}
147
+ />
148
+
149
+ {/* Debug info */}
150
+ <YStack
151
+ backgroundColor="$background"
152
+ padding="$2"
153
+ borderRadius="$2"
154
+ borderWidth={1}
155
+ borderColor="$borderColor"
156
+ >
157
+ <Paragraph size="$1" fontFamily="$mono">
158
+ Debug Info:
159
+ </Paragraph>
160
+ <Paragraph testID="debug-info" size="$1" fontFamily="$mono" whiteSpace="pre">
161
+ {debugInfo}
162
+ </Paragraph>
163
+ </YStack>
164
+
165
+ {/* Display computed style for testing */}
166
+ <ComputedStyleDisplay targetId="animated-box" />
167
+ </YStack>
168
+ )
169
+ }
170
+
171
+ /**
172
+ * Component that polls and displays the computed style of a target element
173
+ */
174
+ function ComputedStyleDisplay({ targetId }: { targetId: string }) {
175
+ const [computedStyles, setComputedStyles] = useState<string>('')
176
+
177
+ useEffect(() => {
178
+ let rafId: number
179
+ let running = true
180
+
181
+ const poll = () => {
182
+ if (!running) return
183
+
184
+ const el = document.querySelector(`[data-testid="${targetId}"]`) as HTMLElement
185
+ if (el) {
186
+ const style = getComputedStyle(el)
187
+ const info = {
188
+ opacity: style.opacity,
189
+ transform: style.transform,
190
+ backgroundColor: style.backgroundColor,
191
+ }
192
+
193
+ const newStyles = JSON.stringify(info, null, 2)
194
+ setComputedStyles((prev) => {
195
+ if (prev !== newStyles) {
196
+ console.log('[RAW_ANIMATED] Computed style changed:', info)
197
+ }
198
+ return newStyles
199
+ })
200
+ }
201
+
202
+ rafId = requestAnimationFrame(poll)
203
+ }
204
+
205
+ poll()
206
+
207
+ return () => {
208
+ running = false
209
+ cancelAnimationFrame(rafId)
210
+ }
211
+ }, [targetId])
212
+
213
+ return (
214
+ <YStack backgroundColor="$backgroundHover" padding="$2" borderRadius="$2">
215
+ <Paragraph size="$1" fontFamily="$mono">
216
+ Computed Styles:
217
+ </Paragraph>
218
+ <Paragraph testID="computed-styles" size="$1" fontFamily="$mono" whiteSpace="pre">
219
+ {computedStyles}
220
+ </Paragraph>
221
+ </YStack>
222
+ )
223
+ }
224
+
225
+ const styles = StyleSheet.create({
226
+ box: {
227
+ width: 100,
228
+ height: 100,
229
+ borderRadius: 8,
230
+ },
231
+ })
@@ -0,0 +1,66 @@
1
+ import React from 'react'
2
+ import { Select, H2, Paragraph, YStack } from '@hanzo/gui'
3
+ import { ChevronDown } from '@hanzogui/lucide-icons-2'
4
+
5
+ const items = [
6
+ { value: 'apple', label: 'Apple' },
7
+ { value: 'banana', label: 'Banana' },
8
+ { value: 'orange', label: 'Orange' },
9
+ { value: 'grape', label: 'Grape' },
10
+ ]
11
+
12
+ export function RemoveScrollCase() {
13
+ const [value, setValue] = React.useState('')
14
+
15
+ return (
16
+ <YStack $platform-web={{ minHeight: '200vh' }} padding="$4" gap="$4">
17
+ <H2>RemoveScroll Test</H2>
18
+
19
+ <Paragraph data-testid="scroll-marker">
20
+ Scroll down to find the select. This page is tall enough to scroll.
21
+ </Paragraph>
22
+
23
+ {Array.from({ length: 10 }).map((_, i) => (
24
+ <Paragraph key={i}>
25
+ Filler paragraph {i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing
26
+ elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
27
+ </Paragraph>
28
+ ))}
29
+
30
+ <Select
31
+ value={value}
32
+ onValueChange={setValue}
33
+ renderValue={(v) => items.find((item) => item.value === v)?.label}
34
+ >
35
+ <Select.Trigger data-testid="rs-select-trigger" iconAfter={ChevronDown}>
36
+ <Select.Value placeholder="Pick a fruit" />
37
+ </Select.Trigger>
38
+
39
+ <Select.Content data-testid="rs-select-content">
40
+ <Select.Viewport data-testid="rs-select-viewport">
41
+ <Select.Group>
42
+ {items.map((item, i) => (
43
+ <Select.Item
44
+ key={item.value}
45
+ data-testid={`rs-select-${item.value}`}
46
+ value={item.value}
47
+ index={i}
48
+ >
49
+ <Select.ItemText>{item.label}</Select.ItemText>
50
+ <Select.ItemIndicator />
51
+ </Select.Item>
52
+ ))}
53
+ </Select.Group>
54
+ </Select.Viewport>
55
+ </Select.Content>
56
+ </Select>
57
+
58
+ {Array.from({ length: 20 }).map((_, i) => (
59
+ <Paragraph key={`after-${i}`}>
60
+ After-select paragraph {i + 1}. Ut enim ad minim veniam, quis nostrud
61
+ exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
62
+ </Paragraph>
63
+ ))}
64
+ </YStack>
65
+ )
66
+ }