@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,292 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.describe('Dismiss Layer Stacking', () => {
5
+ test.beforeEach(async ({ page }) => {
6
+ await setupPage(page, { name: 'DismissLayerStackingCase', type: 'useCase' })
7
+ })
8
+
9
+ test('ESC closes dialog first when dialog is open over popover', async ({ page }) => {
10
+ await page.waitForLoadState('networkidle')
11
+
12
+ // open popover
13
+ const popoverTrigger = page.getByTestId('popover-trigger')
14
+ await popoverTrigger.click()
15
+
16
+ const popoverContent = page.getByTestId('popover-content')
17
+ await expect(popoverContent).toBeVisible({ timeout: 5000 })
18
+ await page.waitForTimeout(300)
19
+
20
+ // open dialog from inside popover
21
+ const dialogTrigger = page.getByTestId('dialog-trigger')
22
+ await dialogTrigger.click()
23
+
24
+ const dialogContent = page.getByTestId('dialog-content')
25
+ await expect(dialogContent).toBeVisible({ timeout: 5000 })
26
+ await page.waitForTimeout(300)
27
+
28
+ // both should be open
29
+ await expect(popoverContent).toBeVisible()
30
+ await expect(dialogContent).toBeVisible()
31
+
32
+ // press ESC - should close dialog, NOT popover
33
+ await page.keyboard.press('Escape')
34
+ await page.waitForTimeout(800)
35
+
36
+ // dialog should be closed
37
+ await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
38
+
39
+ // popover should STILL be open
40
+ await expect(popoverContent).toBeVisible()
41
+
42
+ // press ESC again - now popover should close
43
+ await page.keyboard.press('Escape')
44
+ await page.waitForTimeout(400)
45
+
46
+ await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
47
+ })
48
+
49
+ test('ESC closes popover when only popover is open', async ({ page }) => {
50
+ await page.waitForLoadState('networkidle')
51
+
52
+ // open popover
53
+ const popoverTrigger = page.getByTestId('popover-trigger')
54
+ await popoverTrigger.click()
55
+
56
+ const popoverContent = page.getByTestId('popover-content')
57
+ await expect(popoverContent).toBeVisible({ timeout: 5000 })
58
+ await page.waitForTimeout(300)
59
+
60
+ // press ESC - should close popover
61
+ await page.keyboard.press('Escape')
62
+ await page.waitForTimeout(400)
63
+
64
+ await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
65
+ })
66
+
67
+ test('dialog can be reopened after ESC close', async ({ page }) => {
68
+ await page.waitForLoadState('networkidle')
69
+
70
+ // open popover
71
+ const popoverTrigger = page.getByTestId('popover-trigger')
72
+ await popoverTrigger.click()
73
+
74
+ const popoverContent = page.getByTestId('popover-content')
75
+ await expect(popoverContent).toBeVisible({ timeout: 5000 })
76
+ await page.waitForTimeout(300)
77
+
78
+ // open dialog
79
+ const dialogTrigger = page.getByTestId('dialog-trigger')
80
+ await dialogTrigger.click()
81
+
82
+ const dialogContent = page.getByTestId('dialog-content')
83
+ await expect(dialogContent).toBeVisible({ timeout: 5000 })
84
+ await page.waitForTimeout(300)
85
+
86
+ // close dialog with ESC
87
+ await page.keyboard.press('Escape')
88
+ await page.waitForTimeout(400)
89
+ await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
90
+
91
+ // reopen dialog
92
+ await dialogTrigger.click()
93
+ await expect(dialogContent).toBeVisible({ timeout: 5000 })
94
+
95
+ // close with button this time
96
+ const dialogClose = page.getByTestId('dialog-close')
97
+ await dialogClose.click()
98
+ await page.waitForTimeout(400)
99
+ await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
100
+
101
+ // popover should still be open
102
+ await expect(popoverContent).toBeVisible()
103
+ })
104
+
105
+ test('ESC closes select inside popover first, then popover', async ({ page }) => {
106
+ await page.waitForLoadState('networkidle')
107
+
108
+ // open popover
109
+ const popoverTrigger = page.getByTestId('popover-trigger')
110
+ await popoverTrigger.click()
111
+
112
+ const popoverContent = page.getByTestId('popover-content')
113
+ await expect(popoverContent).toBeVisible({ timeout: 5000 })
114
+ await page.waitForTimeout(300)
115
+
116
+ // open select inside popover
117
+ const selectTrigger = page.getByTestId('popover-select-trigger')
118
+ await selectTrigger.click()
119
+
120
+ const selectViewport = page.getByTestId('popover-select-viewport')
121
+ await expect(selectViewport).toBeVisible({ timeout: 5000 })
122
+ await page.waitForTimeout(300)
123
+
124
+ // press ESC - should close select, NOT popover
125
+ await page.keyboard.press('Escape')
126
+ await page.waitForTimeout(400)
127
+
128
+ // select should be closed
129
+ await expect(selectViewport).not.toBeVisible({ timeout: 5000 })
130
+
131
+ // popover should STILL be open
132
+ await expect(popoverContent).toBeVisible()
133
+
134
+ // press ESC again - now popover should close
135
+ await page.keyboard.press('Escape')
136
+ await page.waitForTimeout(400)
137
+
138
+ await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
139
+ })
140
+
141
+ test('ESC closes select inside dialog first, then dialog', async ({ page }) => {
142
+ await page.waitForLoadState('networkidle')
143
+
144
+ // open popover
145
+ const popoverTrigger = page.getByTestId('popover-trigger')
146
+ await popoverTrigger.click()
147
+
148
+ const popoverContent = page.getByTestId('popover-content')
149
+ await expect(popoverContent).toBeVisible({ timeout: 5000 })
150
+ await page.waitForTimeout(300)
151
+
152
+ // open dialog
153
+ const dialogTrigger = page.getByTestId('dialog-trigger')
154
+ await dialogTrigger.click()
155
+
156
+ const dialogContent = page.getByTestId('dialog-content')
157
+ await expect(dialogContent).toBeVisible({ timeout: 5000 })
158
+ await page.waitForTimeout(300)
159
+
160
+ // open select inside dialog
161
+ const selectTrigger = page.getByTestId('dialog-select-trigger')
162
+ await selectTrigger.click()
163
+
164
+ const selectViewport = page.getByTestId('dialog-select-viewport')
165
+ await expect(selectViewport).toBeVisible({ timeout: 5000 })
166
+ await page.waitForTimeout(300)
167
+
168
+ // press ESC - should close select first
169
+ await page.keyboard.press('Escape')
170
+ await page.waitForTimeout(400)
171
+
172
+ await expect(selectViewport).not.toBeVisible({ timeout: 5000 })
173
+ await expect(dialogContent).toBeVisible()
174
+ await expect(popoverContent).toBeVisible()
175
+
176
+ // press ESC - should close dialog
177
+ await page.keyboard.press('Escape')
178
+ await page.waitForTimeout(400)
179
+
180
+ await expect(dialogContent).not.toBeVisible({ timeout: 5000 })
181
+ await expect(popoverContent).toBeVisible()
182
+
183
+ // press ESC - should close popover
184
+ await page.keyboard.press('Escape')
185
+ await page.waitForTimeout(400)
186
+
187
+ await expect(popoverContent).not.toBeVisible({ timeout: 5000 })
188
+ })
189
+
190
+ test('useHasDismissableLayers hook updates correctly', async ({ page }) => {
191
+ await page.waitForLoadState('networkidle')
192
+
193
+ // initially no layers
194
+ const hasLayersStatus = page.getByTestId('has-layers-status')
195
+ await expect(hasLayersStatus).toContainText('false')
196
+
197
+ // open popover
198
+ const popoverTrigger = page.getByTestId('popover-trigger')
199
+ await popoverTrigger.click()
200
+ await page.waitForTimeout(400)
201
+
202
+ // should have layers now
203
+ await expect(hasLayersStatus).toContainText('true')
204
+
205
+ // close popover
206
+ await page.keyboard.press('Escape')
207
+ await page.waitForTimeout(400)
208
+
209
+ // back to no layers
210
+ await expect(hasLayersStatus).toContainText('false')
211
+ })
212
+
213
+ test('getDismissableLayerCount updates correctly', async ({ page }) => {
214
+ await page.waitForLoadState('networkidle')
215
+
216
+ const layerCountStatus = page.getByTestId('layer-count-status')
217
+
218
+ // initially 0
219
+ await expect(layerCountStatus).toContainText('0')
220
+
221
+ // open popover - should be 1
222
+ const popoverTrigger = page.getByTestId('popover-trigger')
223
+ await popoverTrigger.click()
224
+ await page.waitForTimeout(400)
225
+ await expect(layerCountStatus).toContainText('1')
226
+
227
+ // open dialog - should be 2
228
+ const dialogTrigger = page.getByTestId('dialog-trigger')
229
+ await dialogTrigger.click()
230
+ await page.waitForTimeout(400)
231
+ await expect(layerCountStatus).toContainText('2')
232
+
233
+ // open select - should be 3
234
+ const selectTrigger = page.getByTestId('dialog-select-trigger')
235
+ await selectTrigger.click()
236
+ await page.waitForTimeout(400)
237
+ await expect(layerCountStatus).toContainText('3')
238
+
239
+ // close select - should be 2
240
+ await page.keyboard.press('Escape')
241
+ await page.waitForTimeout(400)
242
+ await expect(layerCountStatus).toContainText('2')
243
+
244
+ // close dialog - should be 1
245
+ await page.keyboard.press('Escape')
246
+ await page.waitForTimeout(400)
247
+ await expect(layerCountStatus).toContainText('1')
248
+
249
+ // close popover - should be 0
250
+ await page.keyboard.press('Escape')
251
+ await page.waitForTimeout(400)
252
+ await expect(layerCountStatus).toContainText('0')
253
+ })
254
+
255
+ test('two dialogs can be opened side by side', async ({ page }) => {
256
+ await page.waitForLoadState('networkidle')
257
+
258
+ // open popover with dialog inside
259
+ const popoverTrigger = page.getByTestId('popover-trigger')
260
+ await popoverTrigger.click()
261
+ await page.waitForTimeout(300)
262
+
263
+ const dialogTrigger = page.getByTestId('dialog-trigger')
264
+ await dialogTrigger.click()
265
+ await page.waitForTimeout(300)
266
+
267
+ const dialogContent = page.getByTestId('dialog-content')
268
+ await expect(dialogContent).toBeVisible()
269
+
270
+ // close this dialog
271
+ await page.keyboard.press('Escape')
272
+ await page.waitForTimeout(400)
273
+ await expect(dialogContent).not.toBeVisible()
274
+
275
+ // close popover
276
+ await page.keyboard.press('Escape')
277
+ await page.waitForTimeout(400)
278
+
279
+ // open the standalone dialog
280
+ const dialog2Trigger = page.getByTestId('dialog2-trigger')
281
+ await dialog2Trigger.click()
282
+ await page.waitForTimeout(300)
283
+
284
+ const dialog2Content = page.getByTestId('dialog2-content')
285
+ await expect(dialog2Content).toBeVisible()
286
+
287
+ // close with ESC
288
+ await page.keyboard.press('Escape')
289
+ await page.waitForTimeout(400)
290
+ await expect(dialog2Content).not.toBeVisible()
291
+ })
292
+ })
@@ -0,0 +1,157 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ /**
5
+ * Tests that non-animatable CSS properties (display, position, flexDirection, etc.)
6
+ * use className (atomic CSS) instead of inline styles for animated components.
7
+ * Animatable properties remain as inline styles for the driver to animate.
8
+ */
9
+
10
+ test.describe('Driver disableAnimationProps className optimization', () => {
11
+ // non-animatable props the motion driver declares it won't animate
12
+ const NON_ANIMATABLE = [
13
+ 'display',
14
+ 'alignItems',
15
+ 'justifyContent',
16
+ 'position',
17
+ 'overflow',
18
+ 'flexDirection',
19
+ ]
20
+
21
+ // props that should be animated (kept as inline styles)
22
+ const ANIMATABLE = ['opacity']
23
+
24
+ test.beforeEach(async ({ page }) => {
25
+ const driver = (test.info().project?.metadata as any)?.animationDriver
26
+ // this optimization only applies to inline animation drivers that don't use RNW
27
+ // css driver already uses classNames, native/reanimated use RNW's Animated.View
28
+ // which doesn't forward className prop
29
+ test.skip(
30
+ driver === 'css' || driver === 'native' || driver === 'reanimated',
31
+ 'only motion driver benefits from this optimization on web'
32
+ )
33
+
34
+ await setupPage(page, {
35
+ name: 'DriverDisableAnimationPropsCase',
36
+ type: 'useCase',
37
+ })
38
+ await page.waitForTimeout(500)
39
+ })
40
+
41
+ test('non-animatable props should use className, not inline style', async ({
42
+ page,
43
+ }) => {
44
+ const result = await page.evaluate((nonAnimatableProps) => {
45
+ const el = document.querySelector('[data-testid="animated-box"]')
46
+ if (!el) return null
47
+
48
+ const inlineStyle = (el as HTMLElement).style
49
+ const classNames = el.className
50
+
51
+ const inlineNonAnimatable: Record<string, string> = {}
52
+ const hasClassName = classNames.length > 0
53
+
54
+ for (const prop of nonAnimatableProps) {
55
+ const inlineVal = inlineStyle.getPropertyValue(prop) || inlineStyle[prop as any]
56
+ if (inlineVal) {
57
+ inlineNonAnimatable[prop] = inlineVal
58
+ }
59
+ }
60
+
61
+ return {
62
+ hasClassName,
63
+ classNameLength: classNames.split(' ').length,
64
+ inlineNonAnimatable,
65
+ inlineStyleCssText: inlineStyle.cssText,
66
+ }
67
+ }, NON_ANIMATABLE)
68
+
69
+ expect(result, 'element should exist').toBeTruthy()
70
+
71
+ // element should have classNames (atomic CSS)
72
+ expect(result?.hasClassName, 'should have className').toBe(true)
73
+ expect(
74
+ result?.classNameLength,
75
+ 'should have multiple atomic CSS classes'
76
+ ).toBeGreaterThan(1)
77
+
78
+ // non-animatable props should NOT be in inline style
79
+ for (const prop of NON_ANIMATABLE) {
80
+ expect(
81
+ result?.inlineNonAnimatable[prop],
82
+ `${prop} should not be in inline style (should be className)`
83
+ ).toBeFalsy()
84
+ }
85
+ })
86
+
87
+ test('animatable props should be inline style for driver to animate', async ({
88
+ page,
89
+ }) => {
90
+ // trigger active state to start animation
91
+ await page.getByTestId('trigger').click()
92
+ await page.waitForTimeout(200)
93
+
94
+ const result = await page.evaluate(() => {
95
+ const el = document.querySelector('[data-testid="animated-box"]')
96
+ if (!el) return null
97
+
98
+ const s = getComputedStyle(el)
99
+ return {
100
+ hasNonDefaultOpacity: Number.parseFloat(s.opacity) < 1,
101
+ opacity: s.opacity,
102
+ }
103
+ })
104
+
105
+ expect(result, 'element should exist').toBeTruthy()
106
+
107
+ // opacity should be animating (not at the start value of 1)
108
+ expect(
109
+ result?.hasNonDefaultOpacity,
110
+ 'opacity should be animating after trigger'
111
+ ).toBe(true)
112
+ })
113
+
114
+ test('animation still works correctly with className optimization', async ({
115
+ page,
116
+ }) => {
117
+ // verify initial opacity
118
+ const initialOpacity = await page.evaluate(() => {
119
+ const el = document.querySelector('[data-testid="animated-box"]')
120
+ return el ? Number.parseFloat(getComputedStyle(el).opacity) : -1
121
+ })
122
+ expect(initialOpacity, 'initial opacity should be 1').toBeCloseTo(1, 1)
123
+
124
+ // trigger animation
125
+ await page.getByTestId('trigger').click()
126
+ await page.waitForTimeout(1000)
127
+
128
+ // verify end state
129
+ const endOpacity = await page.evaluate(() => {
130
+ const el = document.querySelector('[data-testid="animated-box"]')
131
+ return el ? Number.parseFloat(getComputedStyle(el).opacity) : -1
132
+ })
133
+ expect(endOpacity, 'end opacity should be ~0.5').toBeCloseTo(0.5, 1)
134
+
135
+ // verify non-animatable props still work correctly
136
+ const layoutProps = await page.evaluate(() => {
137
+ const el = document.querySelector('[data-testid="animated-box"]')
138
+ if (!el) return null
139
+ const s = getComputedStyle(el)
140
+ return {
141
+ display: s.display,
142
+ alignItems: s.alignItems,
143
+ justifyContent: s.justifyContent,
144
+ position: s.position,
145
+ overflow: s.overflow,
146
+ flexDirection: s.flexDirection,
147
+ }
148
+ })
149
+
150
+ expect(layoutProps?.display).toBe('flex')
151
+ expect(layoutProps?.alignItems).toBe('center')
152
+ expect(layoutProps?.justifyContent).toBe('center')
153
+ expect(layoutProps?.position).toBe('relative')
154
+ expect(layoutProps?.overflow).toBe('hidden')
155
+ expect(layoutProps?.flexDirection).toBe('column')
156
+ })
157
+ })