@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,359 @@
1
+ import { useState, useRef, useCallback } from 'react'
2
+ import { Button, Sheet, Text, YStack, Paragraph } from '@hanzo/gui'
3
+
4
+ /**
5
+ * Web test case for Sheet drag resistance behavior
6
+ *
7
+ * Tests three scenarios:
8
+ * 1. Sheet without ScrollView - drag up should show resistance
9
+ * 2. Sheet with ScrollView but NO scrollable content - drag should move sheet, not scroll
10
+ * 3. Sheet with ScrollView and scrollable content - drag up at top should show resistance
11
+ */
12
+ export function SheetDragResistCase() {
13
+ return (
14
+ <YStack padding="$4" gap="$4" data-testid="sheet-drag-resist-screen">
15
+ <Text fontSize="$5" fontWeight="bold">
16
+ Sheet Drag Resistance Tests (Web)
17
+ </Text>
18
+ <NoScrollViewSheet />
19
+ <NonScrollableContentSheet />
20
+ <ScrollableContentSheet />
21
+ </YStack>
22
+ )
23
+ }
24
+
25
+ /**
26
+ * Test 1: Sheet without ScrollView
27
+ * Expected: dragging up at the top snap point should show visual resistance
28
+ */
29
+ function NoScrollViewSheet() {
30
+ const [open, setOpen] = useState(false)
31
+ const [position, setPosition] = useState(0)
32
+ const [maxDragUp, setMaxDragUp] = useState(0)
33
+ const [lastDragY, setLastDragY] = useState(0)
34
+ const startY = useRef(0)
35
+
36
+ return (
37
+ <YStack gap="$2">
38
+ <Button data-testid="no-scroll-trigger" onPress={() => setOpen(true)}>
39
+ Test 1: No ScrollView
40
+ </Button>
41
+ <Paragraph data-testid="no-scroll-position">Position: {position}</Paragraph>
42
+ <Paragraph data-testid="no-scroll-max-drag">
43
+ Max drag up: {maxDragUp.toFixed(0)}px
44
+ </Paragraph>
45
+ <Paragraph data-testid="no-scroll-last-drag">
46
+ Last drag Y: {lastDragY.toFixed(0)}px
47
+ </Paragraph>
48
+ <Sheet
49
+ modal
50
+ open={open}
51
+ onOpenChange={setOpen}
52
+ snapPoints={[70, 40]}
53
+ snapPointsMode="percent"
54
+ position={position}
55
+ onPositionChange={setPosition}
56
+ dismissOnSnapToBottom
57
+ zIndex={100000}
58
+ transition="medium"
59
+ >
60
+ <Sheet.Overlay
61
+ data-testid="no-scroll-overlay"
62
+ transition="lazy"
63
+ bg="$color"
64
+ opacity={0.5}
65
+ enterStyle={{ opacity: 0 }}
66
+ exitStyle={{ opacity: 0 }}
67
+ />
68
+ <Sheet.Handle data-testid="no-scroll-handle" />
69
+ <Sheet.Frame
70
+ data-testid="no-scroll-frame"
71
+ padding="$4"
72
+ gap="$4"
73
+ onTouchStart={(e: any) => {
74
+ startY.current = e.nativeEvent?.pageY ?? e.touches?.[0]?.pageY ?? 0
75
+ }}
76
+ onTouchMove={(e: any) => {
77
+ const currentY = e.nativeEvent?.pageY ?? e.touches?.[0]?.pageY ?? 0
78
+ const dy = startY.current - currentY
79
+ setLastDragY(currentY)
80
+ if (dy > maxDragUp) {
81
+ setMaxDragUp(dy)
82
+ }
83
+ }}
84
+ >
85
+ <Paragraph data-testid="no-scroll-snap-indicator">
86
+ Current snap point: {position}
87
+ </Paragraph>
88
+ <Paragraph>
89
+ Drag UP on this sheet when at top position (0). The sheet should resist and
90
+ show visual feedback.
91
+ </Paragraph>
92
+ <Paragraph
93
+ data-testid="no-scroll-drag-indicator"
94
+ bg="$blue3"
95
+ padding="$2"
96
+ borderRadius="$2"
97
+ >
98
+ Max upward drag detected: {maxDragUp.toFixed(0)}px
99
+ </Paragraph>
100
+ <YStack flex={1} justifyContent="center" alignItems="center">
101
+ <Paragraph opacity={0.5}>Sheet content (no ScrollView)</Paragraph>
102
+ </YStack>
103
+ <Button
104
+ data-testid="no-scroll-reset"
105
+ onPress={() => {
106
+ setMaxDragUp(0)
107
+ setLastDragY(0)
108
+ }}
109
+ theme="red"
110
+ size="$3"
111
+ >
112
+ Reset Drag Tracking
113
+ </Button>
114
+ <Button data-testid="no-scroll-close" onPress={() => setOpen(false)}>
115
+ Close
116
+ </Button>
117
+ </Sheet.Frame>
118
+ </Sheet>
119
+ </YStack>
120
+ )
121
+ }
122
+
123
+ /**
124
+ * Test 2: Sheet with ScrollView but content fits (not scrollable)
125
+ * Expected: dragging should move the sheet, NOT scroll the non-scrollable content
126
+ */
127
+ function NonScrollableContentSheet() {
128
+ const [open, setOpen] = useState(false)
129
+ const [position, setPosition] = useState(0)
130
+ const [scrollY, setScrollY] = useState(0)
131
+ const [scrollEventCount, setScrollEventCount] = useState(0)
132
+ const [dragEventCount, setDragEventCount] = useState(0)
133
+
134
+ return (
135
+ <YStack gap="$2">
136
+ <Button data-testid="non-scrollable-trigger" onPress={() => setOpen(true)}>
137
+ Test 2: Non-Scrollable ScrollView
138
+ </Button>
139
+ <Paragraph data-testid="non-scrollable-position">Position: {position}</Paragraph>
140
+ <Paragraph data-testid="non-scrollable-scroll-y">
141
+ Scroll Y: {scrollY.toFixed(0)}
142
+ </Paragraph>
143
+ <Paragraph data-testid="non-scrollable-scroll-count">
144
+ Scroll events: {scrollEventCount}
145
+ </Paragraph>
146
+ <Paragraph data-testid="non-scrollable-drag-count">
147
+ Drag events: {dragEventCount}
148
+ </Paragraph>
149
+ <Sheet
150
+ modal
151
+ open={open}
152
+ onOpenChange={setOpen}
153
+ snapPoints={[70, 40]}
154
+ snapPointsMode="percent"
155
+ position={position}
156
+ onPositionChange={(pos) => {
157
+ setPosition(pos)
158
+ setDragEventCount((c) => c + 1)
159
+ }}
160
+ dismissOnSnapToBottom
161
+ zIndex={100000}
162
+ transition="medium"
163
+ >
164
+ <Sheet.Overlay
165
+ data-testid="non-scrollable-overlay"
166
+ transition="lazy"
167
+ bg="$color"
168
+ opacity={0.5}
169
+ enterStyle={{ opacity: 0 }}
170
+ exitStyle={{ opacity: 0 }}
171
+ />
172
+ <Sheet.Handle data-testid="non-scrollable-handle" />
173
+ <Sheet.Frame data-testid="non-scrollable-frame">
174
+ <Sheet.ScrollView
175
+ data-testid="non-scrollable-scrollview"
176
+ onScroll={(e: any) => {
177
+ setScrollY(e.nativeEvent.contentOffset.y)
178
+ setScrollEventCount((c) => c + 1)
179
+ }}
180
+ scrollEventThrottle={16}
181
+ >
182
+ <YStack padding="$4" gap="$3">
183
+ <Paragraph data-testid="non-scrollable-snap-indicator">
184
+ Current snap point: {position}
185
+ </Paragraph>
186
+ <Paragraph>
187
+ This content FITS in the sheet (not scrollable). Dragging should move the
188
+ SHEET, not scroll.
189
+ </Paragraph>
190
+ <YStack bg="$yellow3" padding="$3" borderRadius="$2">
191
+ <Text fontWeight="bold">Expected behavior:</Text>
192
+ <Text>• Dragging down: sheet moves to next snap point</Text>
193
+ <Text>• Dragging up: sheet resists at top</Text>
194
+ <Text>• ScrollView should NOT capture gestures</Text>
195
+ </YStack>
196
+ <Paragraph
197
+ data-testid="non-scrollable-status"
198
+ bg="$blue3"
199
+ padding="$2"
200
+ borderRadius="$2"
201
+ >
202
+ Scroll events: {scrollEventCount} | Position changes: {dragEventCount}
203
+ </Paragraph>
204
+ <Button
205
+ data-testid="non-scrollable-reset"
206
+ onPress={() => {
207
+ setScrollEventCount(0)
208
+ setDragEventCount(0)
209
+ }}
210
+ theme="red"
211
+ size="$3"
212
+ >
213
+ Reset Counters
214
+ </Button>
215
+ <Button data-testid="non-scrollable-close" onPress={() => setOpen(false)}>
216
+ Close
217
+ </Button>
218
+ </YStack>
219
+ </Sheet.ScrollView>
220
+ </Sheet.Frame>
221
+ </Sheet>
222
+ </YStack>
223
+ )
224
+ }
225
+
226
+ /**
227
+ * Test 3: Sheet with ScrollView and scrollable content
228
+ * Expected: at top of scroll and top snap point, dragging up should show resistance
229
+ */
230
+ function ScrollableContentSheet() {
231
+ const [open, setOpen] = useState(false)
232
+ const [position, setPosition] = useState(0)
233
+ const [scrollY, setScrollY] = useState(0)
234
+ const [maxDragUp, setMaxDragUp] = useState(0)
235
+ const [isAtScrollTop, setIsAtScrollTop] = useState(true)
236
+ const startY = useRef(0)
237
+
238
+ const handleScrollViewTouch = useCallback(
239
+ (pageY: number) => {
240
+ if (!isAtScrollTop) return
241
+ if (position !== 0) return
242
+
243
+ const dy = startY.current - pageY
244
+ if (dy > maxDragUp) {
245
+ setMaxDragUp(dy)
246
+ }
247
+ },
248
+ [isAtScrollTop, position, maxDragUp]
249
+ )
250
+
251
+ return (
252
+ <YStack gap="$2">
253
+ <Button data-testid="scrollable-trigger" onPress={() => setOpen(true)}>
254
+ Test 3: Scrollable ScrollView
255
+ </Button>
256
+ <Paragraph data-testid="scrollable-position">Position: {position}</Paragraph>
257
+ <Paragraph data-testid="scrollable-scroll-y">
258
+ Scroll Y: {scrollY.toFixed(0)}
259
+ </Paragraph>
260
+ <Paragraph data-testid="scrollable-max-drag">
261
+ Max drag up (at top): {maxDragUp.toFixed(0)}px
262
+ </Paragraph>
263
+ <Paragraph data-testid="scrollable-at-top">
264
+ At scroll top: {isAtScrollTop ? 'YES' : 'NO'}
265
+ </Paragraph>
266
+ <Sheet
267
+ modal
268
+ open={open}
269
+ onOpenChange={setOpen}
270
+ snapPoints={[80, 50]}
271
+ snapPointsMode="percent"
272
+ position={position}
273
+ onPositionChange={setPosition}
274
+ dismissOnSnapToBottom
275
+ zIndex={100000}
276
+ transition="medium"
277
+ >
278
+ <Sheet.Overlay
279
+ data-testid="scrollable-overlay"
280
+ transition="lazy"
281
+ bg="$color"
282
+ opacity={0.5}
283
+ enterStyle={{ opacity: 0 }}
284
+ exitStyle={{ opacity: 0 }}
285
+ />
286
+ <Sheet.Handle data-testid="scrollable-handle" />
287
+ <Sheet.Frame data-testid="scrollable-frame">
288
+ <Sheet.ScrollView
289
+ data-testid="scrollable-scrollview"
290
+ onScroll={(e: any) => {
291
+ const y = e.nativeEvent.contentOffset.y
292
+ setScrollY(y)
293
+ setIsAtScrollTop(y <= 0)
294
+ }}
295
+ scrollEventThrottle={16}
296
+ onTouchStart={(e: any) => {
297
+ startY.current = e.nativeEvent?.pageY ?? e.touches?.[0]?.pageY ?? 0
298
+ }}
299
+ onTouchMove={(e: any) => {
300
+ const pageY = e.nativeEvent?.pageY ?? e.touches?.[0]?.pageY ?? 0
301
+ handleScrollViewTouch(pageY)
302
+ }}
303
+ >
304
+ <YStack padding="$4" gap="$3">
305
+ <Paragraph data-testid="scrollable-snap-indicator">
306
+ Position: {position} | Scroll Y: {scrollY.toFixed(0)}
307
+ </Paragraph>
308
+ <Paragraph
309
+ data-testid="scrollable-status"
310
+ bg="$blue3"
311
+ padding="$2"
312
+ borderRadius="$2"
313
+ >
314
+ Max upward drag (at top): {maxDragUp.toFixed(0)}px
315
+ </Paragraph>
316
+ <Button
317
+ data-testid="scrollable-reset"
318
+ onPress={() => setMaxDragUp(0)}
319
+ theme="red"
320
+ size="$3"
321
+ >
322
+ Reset Drag Tracking
323
+ </Button>
324
+ <Paragraph>
325
+ This content IS scrollable. When at the top of scroll and top snap point,
326
+ dragging UP should show resistance.
327
+ </Paragraph>
328
+ <YStack bg="$green3" padding="$3" borderRadius="$2">
329
+ <Text fontWeight="bold">Expected behavior:</Text>
330
+ <Text>• Scroll down in content: normal scroll</Text>
331
+ <Text>• At scroll top, drag up: resistance effect</Text>
332
+ <Text>• Drag down from scroll top: sheet moves</Text>
333
+ </YStack>
334
+
335
+ {/* lots of items to make it scrollable */}
336
+ {Array.from({ length: 20 }).map((_, i) => (
337
+ <YStack
338
+ key={i}
339
+ data-testid={`scrollable-item-${i}`}
340
+ padding="$3"
341
+ bg="$background"
342
+ borderRadius="$2"
343
+ borderWidth={1}
344
+ borderColor="$borderColor"
345
+ >
346
+ <Text>Scrollable Item {i + 1}</Text>
347
+ </YStack>
348
+ ))}
349
+
350
+ <Button data-testid="scrollable-close" onPress={() => setOpen(false)}>
351
+ Close
352
+ </Button>
353
+ </YStack>
354
+ </Sheet.ScrollView>
355
+ </Sheet.Frame>
356
+ </Sheet>
357
+ </YStack>
358
+ )
359
+ }
@@ -0,0 +1,328 @@
1
+ import { useState, useCallback, useEffect, useRef } from 'react'
2
+ import { Keyboard, Platform } from 'react-native'
3
+ import ActionSheet, {
4
+ type ActionSheetRef,
5
+ ScrollView as ActionScrollView,
6
+ } from 'react-native-actions-sheet'
7
+ import { Button, Input, Sheet, Text, XStack, YStack } from '@hanzo/gui'
8
+ import { getGestureHandler, isKeyboardControllerEnabled } from '@hanzogui/native'
9
+
10
+ /**
11
+ * Test case for Sheet + Keyboard + Drag interaction
12
+ *
13
+ * SMOOTH KEYBOARD HANDOFF requirements:
14
+ * 1. Open keyboard (tap input) -> sheet moves up smoothly
15
+ * 2. Drag sheet down while keyboard open -> keyboard dismisses FIRST, then sheet drags
16
+ * 3. Dismiss keyboard (tap outside) -> sheet returns to original position
17
+ * 4. Fast keyboard show/hide shouldn't cause jank
18
+ */
19
+ export function SheetKeyboardDragCase() {
20
+ const [open, setOpen] = useState(false)
21
+ const [position, setPosition] = useState(0)
22
+ const actionsSheetRef = useRef<ActionSheetRef>(null)
23
+ const [keyboardHeight, setKeyboardHeight] = useState(0)
24
+ const [keyboardVisible, setKeyboardVisible] = useState(false)
25
+ const [events, setEvents] = useState<string[]>([])
26
+ const [inputValue, setInputValue] = useState('')
27
+
28
+ const rnghEnabled = getGestureHandler().isEnabled
29
+ const kbcEnabled = isKeyboardControllerEnabled()
30
+
31
+ useEffect(() => {
32
+ console.warn('[SheetKeyboardDrag] RNGH enabled:', rnghEnabled)
33
+ console.warn('[SheetKeyboardDrag] Keyboard Controller enabled:', kbcEnabled)
34
+ }, [rnghEnabled, kbcEnabled])
35
+
36
+ // track keyboard events for debugging
37
+ useEffect(() => {
38
+ const showEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow'
39
+ const hideEvent = Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide'
40
+
41
+ const showListener = Keyboard.addListener(showEvent, (e) => {
42
+ const height = e.endCoordinates.height
43
+ setKeyboardHeight(height)
44
+ setKeyboardVisible(true)
45
+ addEvent(`kb-show:${height.toFixed(0)}`)
46
+ })
47
+
48
+ const hideListener = Keyboard.addListener(hideEvent, () => {
49
+ setKeyboardHeight(0)
50
+ setKeyboardVisible(false)
51
+ addEvent('kb-hide')
52
+ })
53
+
54
+ return () => {
55
+ showListener.remove()
56
+ hideListener.remove()
57
+ }
58
+ }, [])
59
+
60
+ const addEvent = useCallback((event: string) => {
61
+ setEvents((prev) => [...prev.slice(-6), event])
62
+ }, [])
63
+
64
+ return (
65
+ <YStack padding="$4" gap="$4" testID="sheet-keyboard-drag-screen">
66
+ <Text testID="sheet-keyboard-drag-title" fontSize="$5" fontWeight="bold">
67
+ Sheet + Keyboard Drag Test
68
+ </Text>
69
+
70
+ <XStack gap="$3">
71
+ <Text
72
+ testID="sheet-keyboard-drag-rngh-status"
73
+ fontSize="$2"
74
+ color={rnghEnabled ? '$green10' : '$red10'}
75
+ fontWeight="bold"
76
+ >
77
+ RNGH: {rnghEnabled ? '✓' : '✗'}
78
+ </Text>
79
+ <Text
80
+ testID="sheet-keyboard-drag-kbc-status"
81
+ fontSize="$2"
82
+ color={kbcEnabled ? '$green10' : '$yellow10'}
83
+ fontWeight="bold"
84
+ >
85
+ KBC: {kbcEnabled ? '✓' : '○'}
86
+ </Text>
87
+ </XStack>
88
+
89
+ <Text testID="sheet-keyboard-drag-instructions" fontSize="$3" color="$gray11">
90
+ Test keyboard + sheet interaction: tap input to show keyboard, drag sheet while
91
+ keyboard is open.
92
+ </Text>
93
+
94
+ <YStack flexDirection="row" gap="$2">
95
+ <Button
96
+ testID="sheet-keyboard-drag-trigger"
97
+ onPress={() => setOpen(true)}
98
+ flex={1}
99
+ >
100
+ Open Sheet
101
+ </Button>
102
+ <Button
103
+ testID="sheet-keyboard-drag-action-trigger"
104
+ onPress={() => actionsSheetRef.current?.show()}
105
+ theme="blue"
106
+ >
107
+ Open ActionSheet
108
+ </Button>
109
+ </YStack>
110
+ <Button
111
+ testID="sheet-keyboard-drag-reset"
112
+ onPress={() => {
113
+ setEvents([])
114
+ setInputValue('')
115
+ }}
116
+ theme="red"
117
+ >
118
+ Reset
119
+ </Button>
120
+
121
+ <YStack gap="$2" padding="$3" bg="$backgroundHover" borderRadius="$2">
122
+ <Text testID="sheet-keyboard-drag-position">Sheet position: {position}</Text>
123
+ <Text testID="sheet-keyboard-drag-kb-height">
124
+ Keyboard height: {keyboardHeight}
125
+ </Text>
126
+ <Text testID="sheet-keyboard-drag-kb-visible">
127
+ Keyboard: {keyboardVisible ? 'visible' : 'hidden'}
128
+ </Text>
129
+ <Text testID="sheet-keyboard-drag-events">
130
+ Events: {events.join(', ') || '(none)'}
131
+ </Text>
132
+ </YStack>
133
+
134
+ <YStack gap="$1" padding="$2" bg="$blue3" borderRadius="$2">
135
+ <Text fontSize="$2" fontWeight="bold">
136
+ Expected behavior:
137
+ </Text>
138
+ <Text fontSize="$2">
139
+ 1. Tap input → keyboard shows → sheet moves up{'\n'}
140
+ 2. Drag sheet down → keyboard dismisses FIRST{'\n'}
141
+ 3. Tap outside input → keyboard hides → sheet restores
142
+ </Text>
143
+ </YStack>
144
+
145
+ <Sheet
146
+ modal
147
+ open={open}
148
+ onOpenChange={setOpen}
149
+ snapPoints={[80, 50]}
150
+ snapPointsMode="percent"
151
+ position={position}
152
+ onPositionChange={(pos) => {
153
+ setPosition(pos)
154
+ addEvent(`snap:${pos}`)
155
+ }}
156
+ dismissOnSnapToBottom
157
+ moveOnKeyboardChange
158
+ zIndex={100000}
159
+ transition="medium"
160
+ >
161
+ <Sheet.Overlay
162
+ testID="sheet-keyboard-drag-overlay"
163
+ transition="lazy"
164
+ bg="$color"
165
+ opacity={0.5}
166
+ enterStyle={{ opacity: 0 }}
167
+ exitStyle={{ opacity: 0 }}
168
+ />
169
+ <Sheet.Handle testID="sheet-keyboard-drag-handle" />
170
+ <Sheet.Frame testID="sheet-keyboard-drag-frame">
171
+ <Sheet.ScrollView
172
+ keyboardShouldPersistTaps="handled"
173
+ keyboardDismissMode="interactive"
174
+ >
175
+ <YStack gap="$4" padding="$4">
176
+ <Text
177
+ testID="sheet-keyboard-drag-sheet-title"
178
+ fontSize="$5"
179
+ fontWeight="bold"
180
+ >
181
+ Keyboard Test Sheet
182
+ </Text>
183
+
184
+ <YStack gap="$2" padding="$3" bg="$backgroundHover" borderRadius="$2">
185
+ <Text fontSize="$2">Position: {position}</Text>
186
+ <Text fontSize="$2">KB Height: {keyboardHeight}</Text>
187
+ <Text fontSize="$2">KB Visible: {keyboardVisible ? 'yes' : 'no'}</Text>
188
+ </YStack>
189
+
190
+ <YStack gap="$2">
191
+ <Text fontSize="$3" fontWeight="bold">
192
+ Test Input (tap to show keyboard):
193
+ </Text>
194
+ <Input
195
+ testID="sheet-keyboard-drag-input"
196
+ placeholder="Type something..."
197
+ value={inputValue}
198
+ onChangeText={setInputValue}
199
+ onFocus={() => addEvent('input-focus')}
200
+ onBlur={() => addEvent('input-blur')}
201
+ />
202
+ </YStack>
203
+
204
+ <YStack gap="$2">
205
+ <Text fontSize="$3" fontWeight="bold">
206
+ Second Input:
207
+ </Text>
208
+ <Input
209
+ testID="sheet-keyboard-drag-input-2"
210
+ placeholder="Another input..."
211
+ onFocus={() => addEvent('input2-focus')}
212
+ onBlur={() => addEvent('input2-blur')}
213
+ />
214
+ </YStack>
215
+
216
+ <Button
217
+ testID="sheet-keyboard-drag-dismiss-kb"
218
+ onPress={() => {
219
+ Keyboard.dismiss()
220
+ addEvent('manual-kb-dismiss')
221
+ }}
222
+ >
223
+ Dismiss Keyboard
224
+ </Button>
225
+
226
+ <Button testID="sheet-keyboard-drag-close" onPress={() => setOpen(false)}>
227
+ Close Sheet
228
+ </Button>
229
+
230
+ {/* spacer for testing scroll + keyboard */}
231
+ <YStack
232
+ height={300}
233
+ bg="$gray3"
234
+ borderRadius="$2"
235
+ padding="$4"
236
+ justifyContent="center"
237
+ alignItems="center"
238
+ >
239
+ <Text color="$gray11">Spacer area</Text>
240
+ <Text color="$gray11" fontSize="$2">
241
+ Drag here to test sheet drag
242
+ </Text>
243
+ </YStack>
244
+ </YStack>
245
+ </Sheet.ScrollView>
246
+ </Sheet.Frame>
247
+ </Sheet>
248
+
249
+ {/* ActionSheet for comparison */}
250
+ <ActionSheet
251
+ ref={actionsSheetRef}
252
+ snapPoints={[80, 50]}
253
+ initialSnapIndex={0}
254
+ gestureEnabled
255
+ keyboardHandlerEnabled
256
+ containerStyle={{ maxHeight: '100%', height: '100%' }}
257
+ >
258
+ <ActionScrollView
259
+ style={{ width: '100%', flexShrink: 1 }}
260
+ keyboardShouldPersistTaps="handled"
261
+ keyboardDismissMode="interactive"
262
+ >
263
+ <YStack gap="$4" padding="$4">
264
+ <Text fontSize="$5" fontWeight="bold">
265
+ ActionSheet (Reference)
266
+ </Text>
267
+ <Text fontSize="$3" color="$gray11">
268
+ Compare keyboard + drag behavior
269
+ </Text>
270
+
271
+ <YStack gap="$2" padding="$3" bg="$backgroundHover" borderRadius="$2">
272
+ <Text fontSize="$2">KB Height: {keyboardHeight}</Text>
273
+ <Text fontSize="$2">KB Visible: {keyboardVisible ? 'yes' : 'no'}</Text>
274
+ </YStack>
275
+
276
+ <YStack gap="$2">
277
+ <Text fontSize="$3" fontWeight="bold">
278
+ Test Input (tap to show keyboard):
279
+ </Text>
280
+ <Input
281
+ placeholder="Type something..."
282
+ onFocus={() => addEvent('as-input-focus')}
283
+ onBlur={() => addEvent('as-input-blur')}
284
+ />
285
+ </YStack>
286
+
287
+ <YStack gap="$2">
288
+ <Text fontSize="$3" fontWeight="bold">
289
+ Second Input:
290
+ </Text>
291
+ <Input
292
+ placeholder="Another input..."
293
+ onFocus={() => addEvent('as-input2-focus')}
294
+ onBlur={() => addEvent('as-input2-blur')}
295
+ />
296
+ </YStack>
297
+
298
+ <Button
299
+ onPress={() => {
300
+ Keyboard.dismiss()
301
+ addEvent('as-manual-kb-dismiss')
302
+ }}
303
+ >
304
+ Dismiss Keyboard
305
+ </Button>
306
+
307
+ <Button onPress={() => actionsSheetRef.current?.hide()}>Close Sheet</Button>
308
+
309
+ {/* spacer for testing scroll + keyboard */}
310
+ <YStack
311
+ height={300}
312
+ bg="$gray3"
313
+ borderRadius="$2"
314
+ padding="$4"
315
+ justifyContent="center"
316
+ alignItems="center"
317
+ >
318
+ <Text color="$gray11">Spacer area</Text>
319
+ <Text color="$gray11" fontSize="$2">
320
+ Drag here to test sheet drag
321
+ </Text>
322
+ </YStack>
323
+ </YStack>
324
+ </ActionScrollView>
325
+ </ActionSheet>
326
+ </YStack>
327
+ )
328
+ }