@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,123 @@
1
+ /**
2
+ * Basic theme change test - verifies Theme component correctly updates children
3
+ * when theme name changes (no animations involved).
4
+ *
5
+ * This tests the core theme switching functionality that was broken
6
+ * with react-native and reanimated animation drivers.
7
+ */
8
+
9
+ import * as assert from 'assert'
10
+ import { by, device, element, expect, waitFor } from 'detox'
11
+ import { navigateToTestCase } from './utils/navigation'
12
+ import { getDominantColor, isBlueish, isReddish, formatRGB } from './utils/colors'
13
+
14
+ describe('ThemeChangeBasic', () => {
15
+ beforeAll(async () => {
16
+ await device.launchApp({ newInstance: true })
17
+ })
18
+
19
+ beforeEach(async () => {
20
+ await device.reloadReactNative()
21
+ await navigateToTestCase('ThemeChangeBasic', 'theme-change-basic-root')
22
+ })
23
+
24
+ it('should show initial red theme', async () => {
25
+ await expect(element(by.id('theme-change-basic-label'))).toHaveText(
26
+ 'Current theme: red'
27
+ )
28
+ await expect(element(by.id('theme-change-basic-square'))).toBeVisible()
29
+ })
30
+
31
+ it('should change theme color when toggle is pressed', async () => {
32
+ // verify initial red state
33
+ await expect(element(by.id('theme-change-basic-label'))).toHaveText(
34
+ 'Current theme: red'
35
+ )
36
+
37
+ // take screenshot of red state
38
+ const redScreenshot = await element(
39
+ by.id('theme-change-basic-square')
40
+ ).takeScreenshot('theme-red')
41
+ const redColor = getDominantColor(redScreenshot)
42
+ console.log(`Red theme color: ${formatRGB(redColor)}`)
43
+
44
+ // tap to change to blue
45
+ await element(by.id('theme-change-basic-toggle')).tap()
46
+
47
+ // wait for theme to update
48
+ await waitFor(element(by.id('theme-change-basic-label')))
49
+ .toHaveText('Current theme: blue')
50
+ .withTimeout(5000)
51
+
52
+ // small delay for any potential visual updates
53
+ await new Promise((r) => setTimeout(r, 300))
54
+
55
+ // take screenshot of blue state
56
+ const blueScreenshot = await element(
57
+ by.id('theme-change-basic-square')
58
+ ).takeScreenshot('theme-blue')
59
+ const blueColor = getDominantColor(blueScreenshot)
60
+ console.log(`Blue theme color: ${formatRGB(blueColor)}`)
61
+
62
+ // verify colors changed
63
+ // red theme $color4 should be reddish
64
+ assert.ok(
65
+ isReddish(redColor),
66
+ `Expected red color to be reddish, got ${formatRGB(redColor)}`
67
+ )
68
+ // blue theme $color4 should be blueish
69
+ assert.ok(
70
+ isBlueish(blueColor),
71
+ `Expected blue color to be blueish, got ${formatRGB(blueColor)}`
72
+ )
73
+
74
+ // extra verification: the colors should be different
75
+ const colorsDiffer =
76
+ Math.abs(redColor.r - blueColor.r) > 30 || Math.abs(redColor.b - blueColor.b) > 30
77
+ assert.ok(
78
+ colorsDiffer,
79
+ `Expected colors to be different: red=${formatRGB(redColor)}, blue=${formatRGB(blueColor)}`
80
+ )
81
+ })
82
+
83
+ it('should toggle theme multiple times', async () => {
84
+ // start at red
85
+ await expect(element(by.id('theme-change-basic-label'))).toHaveText(
86
+ 'Current theme: red'
87
+ )
88
+
89
+ // toggle to blue
90
+ await element(by.id('theme-change-basic-toggle')).tap()
91
+ await waitFor(element(by.id('theme-change-basic-label')))
92
+ .toHaveText('Current theme: blue')
93
+ .withTimeout(5000)
94
+
95
+ // verify blue color
96
+ await new Promise((r) => setTimeout(r, 300))
97
+ const blueScreenshot = await element(
98
+ by.id('theme-change-basic-square')
99
+ ).takeScreenshot('theme-blue-toggle')
100
+ const blueColor = getDominantColor(blueScreenshot)
101
+ assert.ok(
102
+ isBlueish(blueColor),
103
+ `Expected blue color to be blueish, got ${formatRGB(blueColor)}`
104
+ )
105
+
106
+ // toggle back to red
107
+ await element(by.id('theme-change-basic-toggle')).tap()
108
+ await waitFor(element(by.id('theme-change-basic-label')))
109
+ .toHaveText('Current theme: red')
110
+ .withTimeout(5000)
111
+
112
+ // verify red color
113
+ await new Promise((r) => setTimeout(r, 300))
114
+ const redScreenshot = await element(
115
+ by.id('theme-change-basic-square')
116
+ ).takeScreenshot('theme-red-toggle')
117
+ const redColor = getDominantColor(redScreenshot)
118
+ assert.ok(
119
+ isReddish(redColor),
120
+ `Expected red color to be reddish, got ${formatRGB(redColor)}`
121
+ )
122
+ })
123
+ })
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Test for theme mutation with DynamicColorIOS optimization.
3
+ *
4
+ * This tests that updateTheme() properly triggers re-renders on iOS
5
+ * even when using DynamicColorIOS optimization (which avoids tracking
6
+ * theme keys for performance).
7
+ *
8
+ * The fix ensures forceUpdateThemes() properly forces re-renders
9
+ * regardless of whether theme keys were tracked.
10
+ */
11
+
12
+ import { by, device, element, expect, waitFor } from 'detox'
13
+ import { navigateToTestCase } from './utils/navigation'
14
+
15
+ describe('ThemeMutation', () => {
16
+ beforeAll(async () => {
17
+ await device.launchApp({ newInstance: true })
18
+ })
19
+
20
+ beforeEach(async () => {
21
+ await device.reloadReactNative()
22
+ await navigateToTestCase('ThemeMutation', 'theme-mutation-button')
23
+ })
24
+
25
+ it('should navigate to ThemeMutation test case', async () => {
26
+ await expect(element(by.id('theme-mutation-button'))).toBeVisible()
27
+ })
28
+
29
+ it('should show initial red color', async () => {
30
+ // Verify the initial color text shows red
31
+ await expect(element(by.id('theme-mutation-color-text'))).toHaveText(
32
+ 'Expected color: red'
33
+ )
34
+ // Verify the square is visible
35
+ await expect(element(by.id('theme-mutation-square'))).toBeVisible()
36
+ })
37
+
38
+ it('should update theme color when button is pressed', async () => {
39
+ // Initial state should be red
40
+ await expect(element(by.id('theme-mutation-color-text'))).toHaveText(
41
+ 'Expected color: red'
42
+ )
43
+
44
+ // Tap the button to change theme color
45
+ await element(by.id('theme-mutation-button')).tap()
46
+
47
+ // Wait for the color to update to blue
48
+ await waitFor(element(by.id('theme-mutation-color-text')))
49
+ .toHaveText('Expected color: blue')
50
+ .withTimeout(5000)
51
+
52
+ // Verify the square is still visible (component re-rendered)
53
+ await expect(element(by.id('theme-mutation-square'))).toBeVisible()
54
+ })
55
+
56
+ it('should cycle through multiple theme colors', async () => {
57
+ const colors = ['red', 'blue', 'green', 'purple', 'orange']
58
+
59
+ for (let i = 0; i < colors.length; i++) {
60
+ const expectedColor = colors[i]
61
+ await expect(element(by.id('theme-mutation-color-text'))).toHaveText(
62
+ `Expected color: ${expectedColor}`
63
+ )
64
+
65
+ // Tap to cycle to next color (except on last iteration)
66
+ if (i < colors.length - 1) {
67
+ await element(by.id('theme-mutation-button')).tap()
68
+ await waitFor(element(by.id('theme-mutation-color-text')))
69
+ .toHaveText(`Expected color: ${colors[i + 1]}`)
70
+ .withTimeout(5000)
71
+ }
72
+ }
73
+
74
+ // Verify it cycles back to red after orange
75
+ await element(by.id('theme-mutation-button')).tap()
76
+ await waitFor(element(by.id('theme-mutation-color-text')))
77
+ .toHaveText('Expected color: red')
78
+ .withTimeout(5000)
79
+ })
80
+ })
@@ -0,0 +1,31 @@
1
+ import { by, device, element, expect, waitFor } from 'detox'
2
+
3
+ describe('RNGH Status Check', () => {
4
+ beforeAll(async () => {
5
+ await device.launchApp({ newInstance: true })
6
+ })
7
+
8
+ it('should show RNGH status on home screen', async () => {
9
+ // Wait for app to load
10
+ await waitFor(element(by.text('Kitchen Sink')))
11
+ .toExist()
12
+ .withTimeout(60000)
13
+
14
+ // Take screenshot to see RNGH status
15
+ await device.takeScreenshot('rngh-status')
16
+
17
+ // Check for RNGH text - it shows either "RNGH: ✓ enabled" or "RNGH: ✗ disabled"
18
+ // We'll log what we see
19
+ try {
20
+ await expect(element(by.text(/RNGH.*enabled/))).toBeVisible()
21
+ console.log('RNGH STATUS: ENABLED')
22
+ } catch {
23
+ try {
24
+ await expect(element(by.text(/RNGH.*disabled/))).toBeVisible()
25
+ console.log('RNGH STATUS: DISABLED')
26
+ } catch {
27
+ console.log('RNGH STATUS: NOT FOUND')
28
+ }
29
+ }
30
+ })
31
+ })
@@ -0,0 +1,19 @@
1
+ // force single worker always - multiple simulators cause resource exhaustion
2
+ // and macOS doesn't properly clean them up between runs
3
+ const maxWorkers = 1
4
+
5
+ /** @type {import('@jest/types').Config.InitialOptions} */
6
+ module.exports = {
7
+ rootDir: '..',
8
+ testMatch: ['<rootDir>/e2e/**/*.test.ts'],
9
+ testTimeout: 180000, // 3 minutes for CI environments with slow emulators
10
+ maxWorkers,
11
+ globalSetup: 'detox/runners/jest/globalSetup',
12
+ globalTeardown: 'detox/runners/jest/globalTeardown',
13
+ reporters: ['detox/runners/jest/reporter'],
14
+ testEnvironment: 'detox/runners/jest/testEnvironment',
15
+ verbose: true,
16
+ transform: {
17
+ '^.+\\.tsx?$': ['ts-jest', { isolatedModules: true }],
18
+ },
19
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Color utilities for screenshot-based testing
3
+ */
4
+
5
+ import * as fs from 'fs'
6
+ import { PNG } from 'pngjs'
7
+
8
+ export type RGB = { r: number; g: number; b: number }
9
+
10
+ /**
11
+ * Get the dominant color from a PNG screenshot
12
+ * Samples pixels from the center region to avoid edges/text
13
+ */
14
+ export function getDominantColor(screenshotPath: string): RGB {
15
+ const data = fs.readFileSync(screenshotPath)
16
+ const png = PNG.sync.read(data)
17
+
18
+ // sample the center 50% of the image to avoid edges and text
19
+ const startX = Math.floor(png.width * 0.25)
20
+ const endX = Math.floor(png.width * 0.75)
21
+ const startY = Math.floor(png.height * 0.25)
22
+ const endY = Math.floor(png.height * 0.75)
23
+
24
+ let totalR = 0,
25
+ totalG = 0,
26
+ totalB = 0,
27
+ count = 0
28
+
29
+ for (let y = startY; y < endY; y++) {
30
+ for (let x = startX; x < endX; x++) {
31
+ const idx = (png.width * y + x) * 4
32
+ totalR += png.data[idx]
33
+ totalG += png.data[idx + 1]
34
+ totalB += png.data[idx + 2]
35
+ count++
36
+ }
37
+ }
38
+
39
+ return {
40
+ r: Math.round(totalR / count),
41
+ g: Math.round(totalG / count),
42
+ b: Math.round(totalB / count),
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Check if a color is predominantly blue (for $blue10)
48
+ */
49
+ export function isBlueish(color: RGB): boolean {
50
+ // blue should have high B, low R, and low-medium G
51
+ return color.b > 100 && color.b > color.r && color.b > color.g
52
+ }
53
+
54
+ /**
55
+ * Check if a color is predominantly red (for $red10)
56
+ */
57
+ export function isReddish(color: RGB): boolean {
58
+ // red should have high R, low B, and low G
59
+ return color.r > 100 && color.r > color.b && color.r > color.g
60
+ }
61
+
62
+ /**
63
+ * Check if a color is predominantly green (for $green10)
64
+ */
65
+ export function isGreenish(color: RGB): boolean {
66
+ // green should have high G, low R, and low B
67
+ return color.g > 100 && color.g > color.r && color.g > color.b
68
+ }
69
+
70
+ /**
71
+ * Format RGB color for error messages
72
+ */
73
+ export function formatRGB(color: RGB): string {
74
+ return `RGB(${color.r}, ${color.g}, ${color.b})`
75
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Shared navigation utilities for Detox e2e tests
3
+ * Uses the quick-nav grid in the collapsible section on home screen
4
+ */
5
+
6
+ import { by, device, element, waitFor } from 'detox'
7
+
8
+ /**
9
+ * Fast navigation to any test case using the quick-nav grid
10
+ * Taps the toggle button to expand the section, then taps the target test case
11
+ *
12
+ * @param testCaseName - The exact name of the test case (e.g., 'SelectAndroidOnPress')
13
+ * @param waitForElementId - Optional testID to wait for after navigation (confirms screen loaded)
14
+ */
15
+ export async function navigateToTestCase(
16
+ testCaseName: string,
17
+ waitForElementId?: string
18
+ ) {
19
+ // disable sync to avoid animation driver blocking
20
+ await device.disableSynchronization()
21
+
22
+ // wait for home screen to load
23
+ await waitFor(element(by.text('Kitchen Sink')))
24
+ .toExist()
25
+ .withTimeout(60000)
26
+
27
+ // small delay for UI to settle before tapping
28
+ await new Promise((r) => setTimeout(r, 500))
29
+
30
+ // tap toggle button to expand the quick-nav section
31
+ await element(by.id('toggle-test-cases')).tap()
32
+
33
+ // wait for the quick-nav element to appear - 15s to allow for:
34
+ // - grid rendering (123 items with useLink hooks)
35
+ // - native layout calculation
36
+ // - any pending main-thread work from previous test
37
+ await waitFor(element(by.id(`detox-nav-${testCaseName}`)))
38
+ .toBeVisible()
39
+ .withTimeout(15000)
40
+
41
+ // tap the quick-nav element for this test case
42
+ await element(by.id(`detox-nav-${testCaseName}`)).tap()
43
+
44
+ // wait for the target screen to load
45
+ if (waitForElementId) {
46
+ await waitFor(element(by.id(waitForElementId)))
47
+ .toExist()
48
+ .withTimeout(10000)
49
+ }
50
+
51
+ // re-enable sync
52
+ await device.enableSynchronization()
53
+ }
package/eas.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "build": {
3
+ "development-simulator": {
4
+ "developmentClient": true,
5
+ "distribution": "internal",
6
+ "ios": {
7
+ "simulator": true
8
+ }
9
+ },
10
+ "development": {
11
+ "developmentClient": true,
12
+ "distribution": "internal"
13
+ },
14
+ "preview": {
15
+ "distribution": "internal"
16
+ },
17
+ "production": {}
18
+ },
19
+ "cli": {
20
+ "promptToConfigurePushNotifications": false
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ appId: com.gui.guikitchensink
2
+ tags:
3
+ - component
4
+ ---
5
+ - runFlow: OpenApp.yaml
6
+ - scrollUntilVisible:
7
+ element: 'AlertDialog'
8
+ centerElement: true
9
+ - tapOn: 'AlertDialog'
10
+ - assertVisible: 'Show Alert'
11
+ # Test: tap button, dialog appears
12
+ - tapOn: 'Show Alert'
13
+ - assertVisible: 'Cancel'
14
+ - assertVisible: 'Accept'
15
+ # Test: dialog closes on cancel
16
+ - tapOn: 'Cancel'
17
+ - assertVisible: 'Show Alert'
@@ -0,0 +1,25 @@
1
+ appId: com.gui.guikitchensink
2
+ tag:
3
+ - util
4
+ ---
5
+ - launchApp
6
+
7
+ # Dismiss any system dialogs (Apple Account Verification, etc.)
8
+ - tapOn:
9
+ text: 'Not Now'
10
+ optional: true
11
+
12
+ # if on dev builds - tap the dev server URL
13
+ - tapOn:
14
+ text: http://.*
15
+ optional: true
16
+
17
+ # Wait for app to load (60s timeout for CI where bundle download can be slow)
18
+ - extendedWaitUntil:
19
+ visible: 'Kitchen Sink'
20
+ timeout: 60000
21
+
22
+ # dismiss expo's first time bottom sheet if present
23
+ - tapOn:
24
+ text: 'Home'
25
+ optional: true
@@ -0,0 +1,13 @@
1
+ appId: com.gui.guikitchensink
2
+ tags:
3
+ - component
4
+ ---
5
+ - runFlow: OpenApp.yaml
6
+ - scrollUntilVisible:
7
+ element: 'Select'
8
+ centerElement: true
9
+ - tapOn: 'Select'
10
+ - assertVisible: 'Apple'
11
+ # Test: select opens when tapped
12
+ - tapOn: 'Apple'
13
+ - assertVisible: 'Pear'
@@ -0,0 +1,12 @@
1
+ appId: com.gui.guikitchensink
2
+ tags:
3
+ - component
4
+ ---
5
+ - runFlow: OpenApp.yaml
6
+ - scrollUntilVisible:
7
+ element: 'Sheet'
8
+ centerElement: true
9
+ - tapOn: 'Sheet'
10
+ - assertVisible: 'Open'
11
+ # Test: sheet opens when button tapped
12
+ - tapOn: 'Open'
@@ -0,0 +1,13 @@
1
+ appId: com.gui.guikitchensink
2
+ tags:
3
+ - component
4
+ ---
5
+ - runFlow: OpenApp.yaml
6
+ - scrollUntilVisible:
7
+ element: 'Tabs'
8
+ centerElement: true
9
+ - tapOn: 'Tabs'
10
+ - assertVisible: 'Profile'
11
+ # Test: tabs are clickable
12
+ - tapOn: 'Notifications'
13
+ - tapOn: 'Profile'
@@ -0,0 +1,14 @@
1
+ appId: com.gui.guikitchensink
2
+ tags:
3
+ - component
4
+ ---
5
+ - runFlow: OpenApp.yaml
6
+ - scrollUntilVisible:
7
+ element: 'Toast'
8
+ centerElement: true
9
+ - tapOn: 'Toast'
10
+ # Toast v1 demo has Show button
11
+ - assertVisible: 'Show'
12
+ # Test: tap show, native toast appears
13
+ - tapOn: 'Show'
14
+ # Toast should appear (but may dismiss quickly)
@@ -0,0 +1,24 @@
1
+ appId: com.gui.guikitchensink
2
+ tag:
3
+ - util
4
+ ---
5
+ # cold start with clearState to prime Hermes bytecode cache
6
+ # subsequent test launches skip clearState so bytecode cache persists = fast restarts
7
+ - launchApp:
8
+ clearState: true
9
+
10
+ - tapOn:
11
+ text: 'Not Now'
12
+ optional: true
13
+
14
+ - tapOn:
15
+ text: http://.*
16
+ optional: true
17
+
18
+ - extendedWaitUntil:
19
+ visible: 'Kitchen Sink'
20
+ timeout: 60000
21
+
22
+ - tapOn:
23
+ text: 'Home'
24
+ optional: true
package/index.html ADDED
@@ -0,0 +1,21 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta httpEquiv="X-UA-Compatible" content="IE=edge" />
6
+ <meta
7
+ name="viewport"
8
+ content="width=device-width, initial-scale=1, maximum-scale=1"
9
+ />
10
+
11
+ <style>
12
+ #root {
13
+ height: 100vh;
14
+ width: 100vw;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body>
19
+ <div id="root"></div>
20
+ </body>
21
+ </html>
package/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // ensure gui config is created before any component imports
2
+ import './src/gui.config'
3
+
4
+ // setup native features - just import, no function calls needed
5
+ import '@hanzogui/native/setup-zeego'
6
+ import '@hanzogui/native/setup-teleport'
7
+ import '@hanzogui/native/setup-gesture-handler'
8
+ // import '@hanzogui/native/setup-safe-area'
9
+ import '@hanzogui/native/setup-keyboard-controller'
10
+ // TODO this causes crash on Select demo?
11
+ // import '@hanzogui/native/setup-burnt'
12
+
13
+ import { registerRootComponent } from 'expo'
14
+
15
+ const App = require('./src/App').default
16
+
17
+ registerRootComponent(() => <App />)
@@ -0,0 +1,64 @@
1
+ const { getDefaultConfig } = require('expo/metro-config')
2
+ const path = require('path')
3
+ const { withGui } = require('@hanzogui/metro-plugin')
4
+ // Find the project and workspace directories
5
+ const projectRoot = __dirname
6
+ // This can be replaced with `find-yarn-workspace-root`
7
+ const monorepoRoot = path.resolve(projectRoot, '../..')
8
+
9
+ const config = getDefaultConfig(projectRoot)
10
+
11
+ config.resolver.unstable_enablePackageExports =
12
+ process.env.HANZO_GUI_PACKAGE_EXPORTS !== 'false'
13
+
14
+ // block unnecessary directories from metro file crawling
15
+ config.resolver.blockList = [
16
+ /code\/gui\.dev\//,
17
+ /code\/.*\/__tests__\//,
18
+ /code\/.*\/\.maestro\//,
19
+ ]
20
+
21
+ // 1. Watch all files within the monorepo
22
+ config.watchFolders = [monorepoRoot]
23
+ // 2. Let Metro know where to resolve packages and in what order
24
+ config.resolver.nodeModulesPaths = [
25
+ path.resolve(projectRoot, 'node_modules'),
26
+ path.resolve(monorepoRoot, 'node_modules'),
27
+ ]
28
+ // 3. Metro seems to be ignoring nested node_modules for packages in monorepo
29
+ // root node_modules (e.g. importing `entities` from
30
+ // `node_modules/parse5/...` should resolve to
31
+ // `node_modules/parse5/node_modules/entities/...` but Metro resolves it to
32
+ // `node_modules/entities/...` instead). This is a workaround to fix it.
33
+ config.resolver.resolveRequest = (context, moduleName, platform) => {
34
+ try {
35
+ return context.resolveRequest(context, moduleName, platform)
36
+ } catch (e) {
37
+ // This isn't 100% safe, it only fixes build-time errors, but it cannot
38
+ // fix runtime errors occurred due to incorrect resolution.
39
+ const hierarchicalNodeModulesPaths = path
40
+ .dirname(context.originModulePath)
41
+ .split(path.sep)
42
+ .map((_, i, parts) =>
43
+ path.join('/', ...parts.slice(1, parts.length - i), 'node_modules')
44
+ )
45
+
46
+ console.info(
47
+ `Metro failed to resolve "${moduleName}" from "${context.originModulePath}": ${e.message}. Retrying with manually specifying hierarchical node_modules paths: ${hierarchicalNodeModulesPaths.join(', ')}`
48
+ )
49
+
50
+ return context.resolveRequest(
51
+ {
52
+ ...context,
53
+ nodeModulesPaths: [...hierarchicalNodeModulesPaths, ...context.nodeModulesPaths],
54
+ },
55
+ moduleName,
56
+ platform
57
+ )
58
+ }
59
+ }
60
+
61
+ module.exports = withGui(config, {
62
+ components: ['@hanzo/gui'],
63
+ config: './src/gui.config.ts',
64
+ })
@@ -0,0 +1,9 @@
1
+ export default {
2
+ push() {},
3
+ replace() {},
4
+ router: null,
5
+ }
6
+ /**
7
+ * @deprecated You imported from the wrong file!
8
+ */
9
+ export const useRouter = () => undefined