@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,393 @@
1
+ /**
2
+ * Playwright E2E tests for Sheet drag resistance behavior
3
+ *
4
+ * Ported from Detox tests to verify web implementation matches native quality.
5
+ *
6
+ * Tests three scenarios:
7
+ * 1. Sheet without ScrollView - drag up should show resistance
8
+ * 2. Sheet with ScrollView but NO scrollable content - drag should move sheet, not scroll
9
+ * 3. Sheet with ScrollView and scrollable content - drag up at top should show resistance
10
+ */
11
+
12
+ import { expect, test, type Page } from '@playwright/test'
13
+ import { setupPage } from './test-utils'
14
+
15
+ // mobile viewport with touch support for realistic sheet testing
16
+ test.use({
17
+ viewport: { width: 390, height: 844 },
18
+ hasTouch: true,
19
+ isMobile: true,
20
+ })
21
+
22
+ test.beforeEach(async ({ page }) => {
23
+ await setupPage(page, { name: 'SheetDragResistCase', type: 'useCase' })
24
+ })
25
+
26
+ /**
27
+ * perform a drag gesture using mouse events
28
+ */
29
+ async function dragSheet(
30
+ page: Page,
31
+ startX: number,
32
+ startY: number,
33
+ deltaY: number,
34
+ options: { steps?: number; stepDelay?: number } = {}
35
+ ) {
36
+ const { steps = 20, stepDelay = 16 } = options
37
+
38
+ await page.mouse.move(startX, startY)
39
+ await page.mouse.down()
40
+
41
+ for (let i = 1; i <= steps; i++) {
42
+ await page.mouse.move(startX, startY + (deltaY * i) / steps)
43
+ await page.waitForTimeout(stepDelay)
44
+ }
45
+
46
+ await page.mouse.up()
47
+ }
48
+
49
+ test.describe('Bug #3: Sheet without ScrollView - drag up resistance', () => {
50
+ /**
51
+ * When at top snap point, dragging up should apply resistance
52
+ * (sheet moves slightly then springs back, showing visual rubber band effect)
53
+ */
54
+ test('should show resistance when dragging up on handle at top position', async ({
55
+ page,
56
+ }) => {
57
+ await page.getByTestId('no-scroll-trigger').click()
58
+ await page.waitForTimeout(600)
59
+
60
+ const frame = page.getByTestId('no-scroll-frame')
61
+ await expect(frame).toBeVisible({ timeout: 5000 })
62
+
63
+ // verify we're at position 0 (top snap point)
64
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
65
+ 'Current snap point: 0'
66
+ )
67
+
68
+ // get handle position
69
+ const handle = page.getByTestId('no-scroll-handle')
70
+ const handleBox = await handle.boundingBox()
71
+ expect(handleBox).toBeTruthy()
72
+
73
+ // drag UP on handle - this should show resistance and spring back
74
+ await dragSheet(
75
+ page,
76
+ handleBox!.x + handleBox!.width / 2,
77
+ handleBox!.y + handleBox!.height / 2,
78
+ -150,
79
+ { steps: 25, stepDelay: 16 }
80
+ )
81
+ await page.waitForTimeout(600)
82
+
83
+ // sheet should still be at position 0 (didn't dismiss or change snap)
84
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
85
+ 'Current snap point: 0'
86
+ )
87
+ // frame should still be visible (sheet didn't disappear)
88
+ await expect(frame).toBeVisible()
89
+ })
90
+
91
+ test('should show resistance when dragging up on frame content', async ({ page }) => {
92
+ await page.getByTestId('no-scroll-trigger').click()
93
+ await page.waitForTimeout(600)
94
+
95
+ const frame = page.getByTestId('no-scroll-frame')
96
+ await expect(frame).toBeVisible({ timeout: 5000 })
97
+
98
+ // verify at position 0
99
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
100
+ 'Current snap point: 0'
101
+ )
102
+
103
+ // reset tracking
104
+ await page.getByTestId('no-scroll-reset').click()
105
+
106
+ // get frame position for dragging on content
107
+ const frameBox = await frame.boundingBox()
108
+ expect(frameBox).toBeTruthy()
109
+
110
+ // drag UP on frame content - should show resistance
111
+ await dragSheet(
112
+ page,
113
+ frameBox!.x + frameBox!.width / 2,
114
+ frameBox!.y + frameBox!.height / 2,
115
+ -200,
116
+ { steps: 30, stepDelay: 16 }
117
+ )
118
+ await page.waitForTimeout(600)
119
+
120
+ // sheet should snap back to position 0
121
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
122
+ 'Current snap point: 0'
123
+ )
124
+ await expect(frame).toBeVisible()
125
+ })
126
+
127
+ test('should drag sheet down to lower snap point', async ({ page }) => {
128
+ await page.getByTestId('no-scroll-trigger').click()
129
+ await page.waitForTimeout(600)
130
+
131
+ const frame = page.getByTestId('no-scroll-frame')
132
+ await expect(frame).toBeVisible({ timeout: 5000 })
133
+
134
+ // verify at position 0
135
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
136
+ 'Current snap point: 0'
137
+ )
138
+
139
+ // get handle position
140
+ const handle = page.getByTestId('no-scroll-handle')
141
+ const handleBox = await handle.boundingBox()
142
+ expect(handleBox).toBeTruthy()
143
+
144
+ // drag DOWN on handle - should move to snap point 1
145
+ await dragSheet(
146
+ page,
147
+ handleBox!.x + handleBox!.width / 2,
148
+ handleBox!.y + handleBox!.height / 2,
149
+ 200,
150
+ { steps: 25, stepDelay: 16 }
151
+ )
152
+ await page.waitForTimeout(600)
153
+
154
+ // sheet should have moved to position 1
155
+ await expect(page.getByTestId('no-scroll-snap-indicator')).toContainText(
156
+ 'Current snap point: 1'
157
+ )
158
+ })
159
+ })
160
+
161
+ test.describe('Bug #1: Sheet with non-scrollable ScrollView', () => {
162
+ /**
163
+ * When ScrollView has content that fits (not scrollable), dragging
164
+ * down should move the sheet to the next snap point.
165
+ */
166
+ test('should drag sheet DOWN when ScrollView content is not scrollable', async ({
167
+ page,
168
+ }) => {
169
+ await page.getByTestId('non-scrollable-trigger').click()
170
+ await page.waitForTimeout(600)
171
+
172
+ const frame = page.getByTestId('non-scrollable-frame')
173
+ await expect(frame).toBeVisible({ timeout: 5000 })
174
+
175
+ // reset counters
176
+ await page.getByTestId('non-scrollable-reset').click()
177
+
178
+ // verify we start at position 0
179
+ await expect(page.getByTestId('non-scrollable-snap-indicator')).toContainText(
180
+ 'Current snap point: 0'
181
+ )
182
+
183
+ // get scrollview position
184
+ const scrollview = page.getByTestId('non-scrollable-scrollview')
185
+ const scrollviewBox = await scrollview.boundingBox()
186
+ expect(scrollviewBox).toBeTruthy()
187
+
188
+ // drag DOWN on the scrollview content - should drag the sheet
189
+ await dragSheet(
190
+ page,
191
+ scrollviewBox!.x + scrollviewBox!.width / 2,
192
+ scrollviewBox!.y + scrollviewBox!.height / 3,
193
+ 200,
194
+ { steps: 25, stepDelay: 16 }
195
+ )
196
+ await page.waitForTimeout(600)
197
+
198
+ // EXPECTED: position changes to 1 (sheet moved down to lower snap)
199
+ await expect(page.getByTestId('non-scrollable-snap-indicator')).toContainText(
200
+ 'Current snap point: 1'
201
+ )
202
+
203
+ // scroll should still be at 0 (no scroll happened)
204
+ await expect(page.getByTestId('non-scrollable-scroll-y')).toContainText('Scroll Y: 0')
205
+ })
206
+
207
+ test('should let handle always be draggable regardless of ScrollView', async ({
208
+ page,
209
+ }) => {
210
+ await page.getByTestId('non-scrollable-trigger').click()
211
+ await page.waitForTimeout(600)
212
+
213
+ const frame = page.getByTestId('non-scrollable-frame')
214
+ await expect(frame).toBeVisible({ timeout: 5000 })
215
+
216
+ // verify we start at position 0
217
+ await expect(page.getByTestId('non-scrollable-snap-indicator')).toContainText(
218
+ 'Current snap point: 0'
219
+ )
220
+
221
+ // get handle position
222
+ const handle = page.getByTestId('non-scrollable-handle')
223
+ const handleBox = await handle.boundingBox()
224
+ expect(handleBox).toBeTruthy()
225
+
226
+ // drag down on handle - this should ALWAYS work
227
+ await dragSheet(
228
+ page,
229
+ handleBox!.x + handleBox!.width / 2,
230
+ handleBox!.y + handleBox!.height / 2,
231
+ 200,
232
+ { steps: 25, stepDelay: 16 }
233
+ )
234
+ await page.waitForTimeout(600)
235
+
236
+ // handle drag should move the sheet
237
+ await expect(page.getByTestId('non-scrollable-snap-indicator')).toContainText(
238
+ 'Current snap point: 1'
239
+ )
240
+ })
241
+ })
242
+
243
+ test.describe('Bug #2: Sheet with scrollable ScrollView - drag up resistance', () => {
244
+ /**
245
+ * At scroll top and sheet top, dragging up should apply resistance
246
+ * (rubber band effect) rather than doing nothing.
247
+ */
248
+ test('should show resistance when dragging up at scroll top and sheet top', async ({
249
+ page,
250
+ }, testInfo) => {
251
+ const driver = (testInfo.project?.metadata as any)?.animationDriver
252
+ if (driver === 'motion') {
253
+ // motion driver layout shifts cause spurious scroll events during handle drag
254
+ test.skip()
255
+ }
256
+
257
+ await page.getByTestId('scrollable-trigger').click()
258
+ await page.waitForTimeout(600)
259
+
260
+ const frame = page.getByTestId('scrollable-frame')
261
+ await expect(frame).toBeVisible({ timeout: 5000 })
262
+
263
+ // reset tracking
264
+ await page.getByTestId('scrollable-reset').click()
265
+
266
+ // ensure we're at scroll top and position 0
267
+ await expect(page.getByTestId('scrollable-at-top')).toContainText(
268
+ 'At scroll top: YES'
269
+ )
270
+
271
+ // get handle position
272
+ const handle = page.getByTestId('scrollable-handle')
273
+ const handleBox = await handle.boundingBox()
274
+ expect(handleBox).toBeTruthy()
275
+
276
+ // drag UP on handle - at scroll top + sheet top, should show resistance
277
+ await dragSheet(
278
+ page,
279
+ handleBox!.x + handleBox!.width / 2,
280
+ handleBox!.y + handleBox!.height / 2,
281
+ -150,
282
+ { steps: 25, stepDelay: 16 }
283
+ )
284
+ await page.waitForTimeout(600)
285
+
286
+ // after rubber band, should still be at scroll top (no scroll happened)
287
+ await expect(page.getByTestId('scrollable-at-top')).toContainText(
288
+ 'At scroll top: YES'
289
+ )
290
+
291
+ // frame should still be visible (sheet didn't disappear)
292
+ await expect(frame).toBeVisible()
293
+ })
294
+
295
+ test('should scroll content when swiping up inside scrollable sheet', async ({
296
+ page,
297
+ }) => {
298
+ await page.getByTestId('scrollable-trigger').click()
299
+ await page.waitForTimeout(600)
300
+
301
+ const frame = page.getByTestId('scrollable-frame')
302
+ await expect(frame).toBeVisible({ timeout: 5000 })
303
+
304
+ // verify starting state - at scroll top
305
+ await expect(page.getByTestId('scrollable-at-top')).toContainText(
306
+ 'At scroll top: YES'
307
+ )
308
+
309
+ // get scrollview
310
+ const scrollview = page.getByTestId('scrollable-scrollview')
311
+ const scrollviewBox = await scrollview.boundingBox()
312
+ expect(scrollviewBox).toBeTruthy()
313
+
314
+ // use wheel to scroll content (more reliable than drag for scroll)
315
+ await page.mouse.move(
316
+ scrollviewBox!.x + scrollviewBox!.width / 2,
317
+ scrollviewBox!.y + scrollviewBox!.height / 2
318
+ )
319
+ await page.mouse.wheel(0, 200)
320
+ await page.waitForTimeout(400)
321
+
322
+ // scroll Y should now be > 0
323
+ await expect(page.getByTestId('scrollable-at-top')).toContainText('At scroll top: NO')
324
+ })
325
+
326
+ test('should drag sheet DOWN via handle when at scroll top', async ({ page }) => {
327
+ await page.getByTestId('scrollable-trigger').click()
328
+ await page.waitForTimeout(600)
329
+
330
+ const frame = page.getByTestId('scrollable-frame')
331
+ await expect(frame).toBeVisible({ timeout: 5000 })
332
+
333
+ // verify at scroll top
334
+ await expect(page.getByTestId('scrollable-at-top')).toContainText(
335
+ 'At scroll top: YES'
336
+ )
337
+
338
+ // get handle position
339
+ const handle = page.getByTestId('scrollable-handle')
340
+ const handleBox = await handle.boundingBox()
341
+ expect(handleBox).toBeTruthy()
342
+
343
+ // drag DOWN on handle - should move sheet to position 1
344
+ await dragSheet(
345
+ page,
346
+ handleBox!.x + handleBox!.width / 2,
347
+ handleBox!.y + handleBox!.height / 2,
348
+ 200,
349
+ { steps: 25, stepDelay: 16 }
350
+ )
351
+ await page.waitForTimeout(600)
352
+
353
+ // sheet should be at lower snap point (position 1)
354
+ await expect(page.getByTestId('scrollable-snap-indicator')).toContainText(
355
+ 'Position: 1'
356
+ )
357
+ })
358
+
359
+ test('should drag sheet DOWN via scrollview area when at scroll top', async ({
360
+ page,
361
+ }) => {
362
+ await page.getByTestId('scrollable-trigger').click()
363
+ await page.waitForTimeout(600)
364
+
365
+ const frame = page.getByTestId('scrollable-frame')
366
+ await expect(frame).toBeVisible({ timeout: 5000 })
367
+
368
+ // verify at scroll top
369
+ await expect(page.getByTestId('scrollable-at-top')).toContainText(
370
+ 'At scroll top: YES'
371
+ )
372
+
373
+ // get scrollview position
374
+ const scrollview = page.getByTestId('scrollable-scrollview')
375
+ const scrollviewBox = await scrollview.boundingBox()
376
+ expect(scrollviewBox).toBeTruthy()
377
+
378
+ // drag DOWN on scrollview - should move sheet (not scroll, since at scroll top)
379
+ await dragSheet(
380
+ page,
381
+ scrollviewBox!.x + scrollviewBox!.width / 2,
382
+ scrollviewBox!.y + scrollviewBox!.height / 3,
383
+ 200,
384
+ { steps: 25, stepDelay: 16 }
385
+ )
386
+ await page.waitForTimeout(600)
387
+
388
+ // sheet should be at lower snap point (position 1)
389
+ await expect(page.getByTestId('scrollable-snap-indicator')).toContainText(
390
+ 'Position: 1'
391
+ )
392
+ })
393
+ })
@@ -0,0 +1,62 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'SheetOnAnimationCompleteCase', type: 'useCase' })
6
+ })
7
+
8
+ test('onAnimationComplete fires with open:true after sheet opens', async ({ page }) => {
9
+ const trigger = page.locator('[data-testid="sheet-open-trigger"]')
10
+ const lastEvent = page.locator('[data-testid="last-event"]')
11
+
12
+ await trigger.waitFor({ state: 'visible' })
13
+ await trigger.click()
14
+ // wait for animation to complete
15
+ await page.waitForTimeout(1500)
16
+
17
+ await expect(lastEvent).toHaveText('opened')
18
+ })
19
+
20
+ test('onAnimationComplete fires with open:false after sheet closes', async ({ page }) => {
21
+ const trigger = page.locator('[data-testid="sheet-open-trigger"]')
22
+ const closeBtn = page.locator('[data-testid="sheet-close"]')
23
+ const lastEvent = page.locator('[data-testid="last-event"]')
24
+
25
+ await trigger.click()
26
+ await page.waitForTimeout(1500)
27
+ await closeBtn.click()
28
+ await page.waitForTimeout(1500)
29
+
30
+ await expect(lastEvent).toHaveText('closed')
31
+ })
32
+
33
+ test('onAnimationComplete fires exactly once per open/close cycle', async ({ page }) => {
34
+ const trigger = page.locator('[data-testid="sheet-open-trigger"]')
35
+ const closeBtn = page.locator('[data-testid="sheet-close"]')
36
+ const eventCount = page.locator('[data-testid="event-count"]')
37
+
38
+ await trigger.click()
39
+ await page.waitForTimeout(1500)
40
+ await expect(eventCount).toHaveText('1')
41
+
42
+ await closeBtn.click()
43
+ await page.waitForTimeout(1500)
44
+ await expect(eventCount).toHaveText('2')
45
+ })
46
+
47
+ test('sheet opacity is 0 after close animation completes (no early vanish)', async ({
48
+ page,
49
+ }) => {
50
+ const trigger = page.locator('[data-testid="sheet-open-trigger"]')
51
+ const closeBtn = page.locator('[data-testid="sheet-close"]')
52
+ const frame = page.locator('[data-testid="sheet-frame"]').first()
53
+
54
+ await trigger.click()
55
+ await page.waitForTimeout(1500)
56
+ await expect(frame).toBeVisible()
57
+
58
+ await closeBtn.click()
59
+ // wait for animation to fully complete
60
+ await page.waitForTimeout(1500)
61
+ await expect(frame).not.toBeInViewport({ ratio: 0.5 })
62
+ })