@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,263 @@
1
+ import { isWeb } from '@hanzogui/constants'
2
+ import { Text, View, styled, GuiComponentState } from '@hanzogui/core'
3
+ import { forwardRef } from 'react'
4
+
5
+ // Test: render prop with string in styled()
6
+ const StyledButton = styled(View, {
7
+ render: 'button',
8
+ padding: '$4',
9
+ backgroundColor: '$background',
10
+ borderRadius: '$4',
11
+ cursor: 'pointer',
12
+ })
13
+
14
+ // Test: styled.a() - styled-components style API with proper href typing
15
+ const StyledAnchor = styled.a({
16
+ color: '$blue10',
17
+ textDecorationLine: 'underline',
18
+ })
19
+
20
+ // Test: render prop with semantic elements
21
+ const StyledNav = styled(View, {
22
+ render: 'nav',
23
+ padding: '$2',
24
+ backgroundColor: '$backgroundHover',
25
+ })
26
+
27
+ const StyledMain = styled(View, {
28
+ render: 'main',
29
+ padding: '$4',
30
+ flex: 1,
31
+ })
32
+
33
+ const StyledSection = styled(View, {
34
+ render: 'section',
35
+ padding: '$3',
36
+ borderWidth: 1,
37
+ borderColor: '$borderColor',
38
+ })
39
+
40
+ const StyledArticle = styled(View, {
41
+ render: 'article',
42
+ padding: '$3',
43
+ })
44
+
45
+ const StyledFooter = styled(View, {
46
+ render: 'footer',
47
+ padding: '$2',
48
+ backgroundColor: '$backgroundPress',
49
+ })
50
+
51
+ // Test: render prop with form elements
52
+ const StyledForm = styled(View, {
53
+ render: 'form',
54
+ gap: '$3',
55
+ })
56
+
57
+ const StyledLabel = styled(Text, {
58
+ render: 'label',
59
+ fontSize: '$3',
60
+ })
61
+
62
+ const StyledFieldset = styled(View, {
63
+ render: 'fieldset',
64
+ padding: '$3',
65
+ borderWidth: 1,
66
+ borderColor: '$borderColor',
67
+ borderRadius: '$2',
68
+ })
69
+
70
+ // Test: render prop with heading elements
71
+ const StyledH1 = styled(Text, {
72
+ render: 'h1',
73
+ fontSize: '$9',
74
+ fontWeight: 'bold',
75
+ })
76
+
77
+ const StyledH2 = styled(Text, {
78
+ render: 'h2',
79
+ fontSize: '$7',
80
+ fontWeight: 'bold',
81
+ })
82
+
83
+ // Test: render prop with list elements
84
+ const StyledUl = styled(View, {
85
+ render: 'ul',
86
+ paddingLeft: '$4',
87
+ })
88
+
89
+ const StyledLi = styled(View, {
90
+ render: 'li',
91
+ marginBottom: '$2',
92
+ })
93
+
94
+ // Test: render prop override at runtime
95
+ const RuntimeOverrideView = styled(View, {
96
+ padding: '$2',
97
+ backgroundColor: '$background',
98
+ })
99
+
100
+ // Custom component for function render test
101
+ const CustomButton = forwardRef<any, any>((props, ref) =>
102
+ isWeb ? (
103
+ <button ref={ref} {...props} data-custom-button="true" />
104
+ ) : (
105
+ <View ref={ref} {...props} aria-label="custom-button" />
106
+ )
107
+ )
108
+ CustomButton.displayName = 'CustomButton'
109
+
110
+ export function RenderPropCase() {
111
+ return (
112
+ <View gap="$4" padding="$4" testID="render-prop-container">
113
+ {/* Test styled() render prop */}
114
+ <StyledButton testID="styled-button" data-testid="styled-button">
115
+ <Text testID="styled-button-text">Styled Button (render='button')</Text>
116
+ </StyledButton>
117
+
118
+ {/* href is now properly typed because styled.a() adds AnchorHTMLAttributes */}
119
+ <StyledAnchor data-testid="styled-anchor" href={isWeb ? '#' : undefined}>
120
+ Styled Anchor (styled.a())
121
+ </StyledAnchor>
122
+
123
+ {/* Test semantic elements */}
124
+ <StyledNav testID="styled-nav" data-testid="styled-nav">
125
+ <Text>Nav Element</Text>
126
+ </StyledNav>
127
+
128
+ <StyledMain testID="styled-main" data-testid="styled-main">
129
+ <Text>Main Element</Text>
130
+ </StyledMain>
131
+
132
+ <StyledSection testID="styled-section" data-testid="styled-section">
133
+ <Text>Section Element</Text>
134
+ </StyledSection>
135
+
136
+ <StyledArticle testID="styled-article" data-testid="styled-article">
137
+ <Text>Article Element</Text>
138
+ </StyledArticle>
139
+
140
+ <StyledFooter testID="styled-footer" data-testid="styled-footer">
141
+ <Text>Footer Element</Text>
142
+ </StyledFooter>
143
+
144
+ {/* Test form elements */}
145
+ <StyledForm data-testid="styled-form">
146
+ <StyledFieldset data-testid="styled-fieldset">
147
+ <StyledLabel data-testid="styled-label" htmlFor="test-input">
148
+ Label Element
149
+ </StyledLabel>
150
+ </StyledFieldset>
151
+ </StyledForm>
152
+
153
+ {/* Test heading elements */}
154
+ <StyledH1 data-testid="styled-h1">H1 Heading</StyledH1>
155
+ <StyledH2 data-testid="styled-h2">H2 Heading</StyledH2>
156
+
157
+ {/* Test list elements */}
158
+ <StyledUl data-testid="styled-ul">
159
+ <StyledLi data-testid="styled-li-1">
160
+ <Text>List Item 1</Text>
161
+ </StyledLi>
162
+ <StyledLi data-testid="styled-li-2">
163
+ <Text>List Item 2</Text>
164
+ </StyledLi>
165
+ </StyledUl>
166
+
167
+ {/* Test runtime render prop override */}
168
+ <RuntimeOverrideView data-testid="runtime-button" render="button">
169
+ <Text>Runtime Override to Button</Text>
170
+ </RuntimeOverrideView>
171
+
172
+ <RuntimeOverrideView data-testid="runtime-anchor" render="a">
173
+ <Text>Runtime Override to Anchor</Text>
174
+ </RuntimeOverrideView>
175
+
176
+ {/* Test Stack with runtime render */}
177
+ <View data-testid="stack-as-section" render="section" padding="$2">
178
+ <Text>Stack as Section</Text>
179
+ </View>
180
+
181
+ <View data-testid="stack-as-aside" render="aside" padding="$2">
182
+ <Text>Stack as Aside</Text>
183
+ </View>
184
+
185
+ {/* Test Text with runtime render */}
186
+ <Text data-testid="text-as-span" render="span">
187
+ Text as Span
188
+ </Text>
189
+
190
+ <Text data-testid="text-as-strong" render="strong">
191
+ Text as Strong
192
+ </Text>
193
+
194
+ <Text data-testid="text-as-em" render="em">
195
+ Text as Em
196
+ </Text>
197
+
198
+ {/* Test JSX element render prop */}
199
+ <View
200
+ data-testid="jsx-element-render"
201
+ render={<a href="/test-link" data-jsx-element="true" />}
202
+ padding="$2"
203
+ backgroundColor="$blue5"
204
+ >
205
+ <Text>JSX Element Render (anchor with href)</Text>
206
+ </View>
207
+
208
+ <View
209
+ data-testid="jsx-element-button"
210
+ render={<button type="submit" data-jsx-button="true" />}
211
+ padding="$3"
212
+ backgroundColor="$green5"
213
+ >
214
+ <Text>JSX Element Render (button with type)</Text>
215
+ </View>
216
+
217
+ {/* Test function render prop */}
218
+ <View
219
+ testID="function-render"
220
+ data-testid="function-render"
221
+ render={(props) => <CustomButton {...props} />}
222
+ padding="$2"
223
+ backgroundColor="$red5"
224
+ >
225
+ <Text testID="function-render-text">Function Render (CustomButton)</Text>
226
+ </View>
227
+
228
+ {isWeb ? (
229
+ <View
230
+ data-testid="function-render-with-state"
231
+ render={(props, state: GuiComponentState) => (
232
+ <button
233
+ {...props}
234
+ data-hover={state.hover ? 'true' : 'false'}
235
+ data-press={state.press ? 'true' : 'false'}
236
+ />
237
+ )}
238
+ padding="$3"
239
+ backgroundColor="$purple5"
240
+ hoverStyle={{ backgroundColor: '$purple7' }}
241
+ pressStyle={{ backgroundColor: '$purple9' }}
242
+ >
243
+ <Text>Function Render with State</Text>
244
+ </View>
245
+ ) : (
246
+ <View
247
+ testID="function-render-with-state"
248
+ render={(props, state: GuiComponentState) => (
249
+ <View
250
+ {...props}
251
+ aria-description={`hover:${state.hover},press:${state.press}`}
252
+ />
253
+ )}
254
+ padding="$3"
255
+ backgroundColor="$purple5"
256
+ pressStyle={{ backgroundColor: '$purple9' }}
257
+ >
258
+ <Text testID="function-render-state-text">Function Render with State</Text>
259
+ </View>
260
+ )}
261
+ </View>
262
+ )
263
+ }
@@ -0,0 +1,236 @@
1
+ // /**
2
+ // * Test case for $safeAreaTop, $safeAreaBottom, $safeAreaLeft, $safeAreaRight tokens
3
+ // * Tests that safe area tokens resolve correctly on native (via initialMetrics)
4
+ // */
5
+
6
+ // import { Platform } from 'react-native'
7
+ // import { Text, View, XStack, YStack, Square, isWeb } from '@hanzo/gui'
8
+ // import { getSafeArea } from '@hanzogui/native'
9
+
10
+ // function SafeAreaStatus() {
11
+ // const safeAreaState = getSafeArea().state
12
+ // const initialInsets = getSafeArea().getInsets()
13
+
14
+ // return (
15
+ // <YStack padding="$3" bg="$backgroundHover" borderRadius="$2" gap="$2">
16
+ // <Text fontWeight="bold">Safe Area Status:</Text>
17
+ // <XStack gap="$2" alignItems="center">
18
+ // <Square
19
+ // size={12}
20
+ // borderRadius={6}
21
+ // bg={safeAreaState.enabled ? '$green10' : '$red10'}
22
+ // />
23
+ // <Text testID="safe-area-status">
24
+ // {safeAreaState.enabled ? 'Enabled' : 'Not enabled'}
25
+ // </Text>
26
+ // </XStack>
27
+ // <Text fontSize="$2" color="$colorHover">
28
+ // platform: {Platform.OS}
29
+ // </Text>
30
+ // <Text fontSize="$2" color="$colorHover" testID="initial-insets">
31
+ // initial insets: top={initialInsets.top}, bottom={initialInsets.bottom},
32
+ // left={initialInsets.left}, right={initialInsets.right}
33
+ // </Text>
34
+ // </YStack>
35
+ // )
36
+ // }
37
+
38
+ // function TokenDemo() {
39
+ // // these use the $safeAreaTop/Bottom/Left/Right tokens
40
+ // // on native, they resolve to numeric values from initialMetrics
41
+ // // on web, they resolve to env(safe-area-inset-*) CSS values
42
+ // return (
43
+ // <YStack gap="$3">
44
+ // <Text fontWeight="bold">Safe Area Token Demo:</Text>
45
+ // <Text fontSize="$2" color="$colorHover">
46
+ // Using $safeAreaTop, $safeAreaBottom, $safeAreaLeft, $safeAreaRight tokens
47
+ // </Text>
48
+
49
+ // {/* paddingTop using $safeAreaTop token */}
50
+ // <View
51
+ // testID="token-padding-top"
52
+ // paddingTop="$safeAreaTop"
53
+ // bg="$red5"
54
+ // padding="$2"
55
+ // >
56
+ // <Text>paddingTop: $safeAreaTop</Text>
57
+ // </View>
58
+
59
+ // {/* paddingBottom using $safeAreaBottom token */}
60
+ // <View
61
+ // testID="token-padding-bottom"
62
+ // paddingBottom="$safeAreaBottom"
63
+ // bg="$blue5"
64
+ // padding="$2"
65
+ // >
66
+ // <Text>paddingBottom: $safeAreaBottom</Text>
67
+ // </View>
68
+
69
+ // {/* marginLeft using $safeAreaLeft token */}
70
+ // <View
71
+ // testID="token-margin-left"
72
+ // marginLeft="$safeAreaLeft"
73
+ // bg="$green5"
74
+ // padding="$2"
75
+ // >
76
+ // <Text>marginLeft: $safeAreaLeft</Text>
77
+ // </View>
78
+
79
+ // {/* marginRight using $safeAreaRight token */}
80
+ // <View
81
+ // testID="token-margin-right"
82
+ // marginRight="$safeAreaRight"
83
+ // bg="$yellow5"
84
+ // padding="$2"
85
+ // >
86
+ // <Text>marginRight: $safeAreaRight</Text>
87
+ // </View>
88
+
89
+ // {/* combined usage */}
90
+ // <View
91
+ // testID="token-combined"
92
+ // paddingTop="$safeAreaTop"
93
+ // paddingBottom="$safeAreaBottom"
94
+ // paddingLeft="$safeAreaLeft"
95
+ // paddingRight="$safeAreaRight"
96
+ // bg="$purple5"
97
+ // padding="$2"
98
+ // >
99
+ // <Text>all safe area tokens combined</Text>
100
+ // </View>
101
+ // </YStack>
102
+ // )
103
+ // }
104
+
105
+ // function EdgeToEdgeDemo() {
106
+ // const insets = getSafeArea().getInsets()
107
+
108
+ // return (
109
+ // <YStack gap="$2">
110
+ // <Text fontWeight="bold">Edge-to-Edge Demo:</Text>
111
+ // <Text fontSize="$2" color="$colorHover">
112
+ // Visual representation of safe area insets (from initialMetrics)
113
+ // </Text>
114
+
115
+ // {/* visual representation of safe areas */}
116
+ // <YStack
117
+ // position="relative"
118
+ // height={200}
119
+ // bg="$background"
120
+ // borderWidth={1}
121
+ // borderColor="$borderColor"
122
+ // borderRadius="$2"
123
+ // overflow="hidden"
124
+ // >
125
+ // {/* top safe area */}
126
+ // <Square
127
+ // testID="safe-area-top-bar"
128
+ // position="absolute"
129
+ // top={0}
130
+ // left={0}
131
+ // right={0}
132
+ // height={Math.max(insets.top, 20)}
133
+ // bg="$red10"
134
+ // opacity={0.5}
135
+ // />
136
+
137
+ // {/* bottom safe area */}
138
+ // <Square
139
+ // testID="safe-area-bottom-bar"
140
+ // position="absolute"
141
+ // bottom={0}
142
+ // left={0}
143
+ // right={0}
144
+ // height={Math.max(insets.bottom, 20)}
145
+ // bg="$blue10"
146
+ // opacity={0.5}
147
+ // />
148
+
149
+ // {/* left safe area */}
150
+ // <Square
151
+ // testID="safe-area-left-bar"
152
+ // position="absolute"
153
+ // top={0}
154
+ // bottom={0}
155
+ // left={0}
156
+ // width={Math.max(insets.left, 10)}
157
+ // bg="$green10"
158
+ // opacity={0.5}
159
+ // />
160
+
161
+ // {/* right safe area */}
162
+ // <Square
163
+ // testID="safe-area-right-bar"
164
+ // position="absolute"
165
+ // top={0}
166
+ // bottom={0}
167
+ // right={0}
168
+ // width={Math.max(insets.right, 10)}
169
+ // bg="$yellow10"
170
+ // opacity={0.5}
171
+ // />
172
+
173
+ // {/* content area */}
174
+ // <YStack
175
+ // position="absolute"
176
+ // top={Math.max(insets.top, 20)}
177
+ // bottom={Math.max(insets.bottom, 20)}
178
+ // left={Math.max(insets.left, 10)}
179
+ // right={Math.max(insets.right, 10)}
180
+ // alignItems="center"
181
+ // justifyContent="center"
182
+ // >
183
+ // <Text fontSize="$3" textAlign="center">
184
+ // Safe Content Area
185
+ // </Text>
186
+ // </YStack>
187
+ // </YStack>
188
+
189
+ // <XStack gap="$2" flexWrap="wrap">
190
+ // <XStack gap="$1" alignItems="center">
191
+ // <Square size={12} bg="$red10" borderRadius={2} />
192
+ // <Text fontSize="$2">Top</Text>
193
+ // </XStack>
194
+ // <XStack gap="$1" alignItems="center">
195
+ // <Square size={12} bg="$blue10" borderRadius={2} />
196
+ // <Text fontSize="$2">Bottom</Text>
197
+ // </XStack>
198
+ // <XStack gap="$1" alignItems="center">
199
+ // <Square size={12} bg="$green10" borderRadius={2} />
200
+ // <Text fontSize="$2">Left</Text>
201
+ // </XStack>
202
+ // <XStack gap="$1" alignItems="center">
203
+ // <Square size={12} bg="$yellow10" borderRadius={2} />
204
+ // <Text fontSize="$2">Right</Text>
205
+ // </XStack>
206
+ // </XStack>
207
+ // </YStack>
208
+ // )
209
+ // }
210
+
211
+ // export function SafeAreaCase() {
212
+ // return (
213
+ // <YStack padding="$4" gap="$4" flex={1} testID="safe-area-case">
214
+ // <Text fontWeight="bold" fontSize="$6">
215
+ // Safe Area Token Integration
216
+ // </Text>
217
+
218
+ // <SafeAreaStatus />
219
+ // <TokenDemo />
220
+ // <EdgeToEdgeDemo />
221
+
222
+ // {isWeb && (
223
+ // <YStack padding="$3" bg="$yellow2" borderRadius="$2" gap="$2">
224
+ // <Text fontWeight="bold" color="$yellow11">
225
+ // Web Note:
226
+ // </Text>
227
+ // <Text fontSize="$2" color="$yellow11">
228
+ // On web, $safeArea* tokens resolve to CSS env(safe-area-inset-*).
229
+ // The visual demo above uses getSafeArea().getInsets() which returns
230
+ // zeros on web (use CSS env() for actual web safe areas).
231
+ // </Text>
232
+ // </YStack>
233
+ // )}
234
+ // </YStack>
235
+ // )
236
+ // }
@@ -0,0 +1,88 @@
1
+ import { useRef, useState } from 'react'
2
+ import { ScrollView, type ScrollView as ScrollViewType } from '@hanzogui/scroll-view'
3
+ import { Button, Text, YStack } from '@hanzo/gui'
4
+
5
+ export function ScrollViewRefCase() {
6
+ const scrollRef = useRef<ScrollViewType>(null)
7
+ const [status, setStatus] = useState('ready')
8
+
9
+ const handleScrollTo = () => {
10
+ if (scrollRef.current?.scrollTo) {
11
+ scrollRef.current.scrollTo({ x: 0, y: 200, animated: false })
12
+ setStatus('scrolled-to-200')
13
+ } else {
14
+ setStatus('no-scrollTo-method')
15
+ }
16
+ }
17
+
18
+ const handleScrollToEnd = () => {
19
+ if (scrollRef.current?.scrollToEnd) {
20
+ scrollRef.current.scrollToEnd({ animated: false })
21
+ setStatus('scrolled-to-end')
22
+ } else {
23
+ setStatus('no-scrollToEnd-method')
24
+ }
25
+ }
26
+
27
+ const handleGetScrollableNode = () => {
28
+ if (scrollRef.current?.getScrollableNode) {
29
+ const node = scrollRef.current.getScrollableNode()
30
+ if (node && node instanceof HTMLElement) {
31
+ setStatus('got-scrollable-node')
32
+ } else {
33
+ setStatus('invalid-node')
34
+ }
35
+ } else {
36
+ setStatus('no-getScrollableNode-method')
37
+ }
38
+ }
39
+
40
+ return (
41
+ <YStack gap="$2" padding="$2" height={400}>
42
+ <Text id="status" testID="status">
43
+ {status}
44
+ </Text>
45
+
46
+ <YStack flexDirection="row" gap="$2">
47
+ <Button
48
+ id="scroll-to-btn"
49
+ testID="scroll-to-btn"
50
+ size="$2"
51
+ onPress={handleScrollTo}
52
+ >
53
+ scrollTo(200)
54
+ </Button>
55
+ <Button
56
+ id="scroll-to-end-btn"
57
+ testID="scroll-to-end-btn"
58
+ size="$2"
59
+ onPress={handleScrollToEnd}
60
+ >
61
+ scrollToEnd
62
+ </Button>
63
+ <Button
64
+ id="get-node-btn"
65
+ testID="get-node-btn"
66
+ size="$2"
67
+ onPress={handleGetScrollableNode}
68
+ >
69
+ getScrollableNode
70
+ </Button>
71
+ </YStack>
72
+
73
+ <ScrollView
74
+ ref={scrollRef}
75
+ id="test-scrollview"
76
+ testID="test-scrollview"
77
+ flex={1}
78
+ backgroundColor="$background"
79
+ >
80
+ {Array.from({ length: 50 }, (_, i) => (
81
+ <Text key={i} id={`item-${i}`} padding="$2">
82
+ Item {i}
83
+ </Text>
84
+ ))}
85
+ </ScrollView>
86
+ </YStack>
87
+ )
88
+ }
@@ -0,0 +1,5 @@
1
+ import { Square } from '@hanzo/gui'
2
+
3
+ export function SecondPage() {
4
+ return <Square zIndex={100_001} />
5
+ }