@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,119 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles } from './utils'
5
+
6
+ // Test for GitHub issue #3676 - Context Values Not Accessible in Children Styles
7
+
8
+ test.beforeEach(async ({ page }) => {
9
+ await setupPage(page, { name: 'StyledContextColor', type: 'useCase' })
10
+ })
11
+
12
+ test(`standard Button passes color to text children`, async ({ page }) => {
13
+ // Find the button and get the text element inside
14
+ const button = page.getByTestId('standard-button-green')
15
+ await expect(button).toBeVisible()
16
+
17
+ // The text inside the button should have green color
18
+ const text = button.locator('span').first()
19
+ const styles = await getStyles(text)
20
+
21
+ // Color should be green (rgb format)
22
+ expect(styles.color).toContain('0, 128, 0') // green in rgb
23
+ })
24
+
25
+ test(`custom button with color variant passes color to ButtonText via context`, async ({
26
+ page,
27
+ }) => {
28
+ const button = page.getByTestId('custom-button-green')
29
+ await expect(button).toBeVisible()
30
+
31
+ // Find the text element inside
32
+ const text = button.locator('span').first()
33
+ const textStyles = await getStyles(text)
34
+
35
+ // Text should be green - this is the core issue from #3676
36
+ // The color variant on the parent should propagate to children via context
37
+ expect(textStyles.color).toContain('0, 128, 0') // green in rgb
38
+ })
39
+
40
+ test(`custom button with red color variant passes to text`, async ({ page }) => {
41
+ const button = page.getByTestId('custom-button-red')
42
+ await expect(button).toBeVisible()
43
+
44
+ const text = button.locator('span').first()
45
+ const textStyles = await getStyles(text)
46
+
47
+ // Text should be red
48
+ expect(textStyles.color).toContain('255, 0, 0') // red in rgb
49
+ })
50
+
51
+ test(`explicit context provider passes color to children`, async ({ page }) => {
52
+ const text = page.getByTestId('context-text-blue')
53
+ await expect(text).toBeVisible()
54
+
55
+ const textStyles = await getStyles(text)
56
+
57
+ // Text should be blue
58
+ expect(textStyles.color).toContain('0, 0, 255') // blue in rgb
59
+ })
60
+
61
+ // This is the key test for issue #3676 - $color reference to context value
62
+ // Test with explicit Provider (like direct Button usage with color prop)
63
+ test(`$color reference in child variant gets parent color from Provider (issue #3676)`, async ({
64
+ page,
65
+ }) => {
66
+ const text = page.getByTestId('context-ref-text-link')
67
+ await expect(text).toBeVisible()
68
+
69
+ const textStyles = await getStyles(text)
70
+
71
+ // Text should be green because:
72
+ // 1. Provider sets color: 'green'
73
+ // 2. Child uses color: '$color' which should resolve to 'green' from context
74
+ expect(textStyles.color).toContain('0, 128, 0') // green in rgb
75
+ })
76
+
77
+ // Test with variant setting color (more complex case)
78
+ test(`$color reference works when parent variant sets color`, async ({ page }) => {
79
+ const button = page.getByTestId('context-ref-button-primary')
80
+ await expect(button).toBeVisible()
81
+
82
+ const text = button.locator('span').first()
83
+ const textStyles = await getStyles(text)
84
+
85
+ // Text should be blue from the primary variant's color
86
+ expect(textStyles.color).toContain('0, 0, 255') // blue in rgb
87
+ })
88
+
89
+ // Issue #3670 - pressStyle color not working on styled Button
90
+ // Requires disableClassName to enable runtime press handling (not CSS transitions)
91
+ test(`pressStyle color propagates to children via context (issue #3670)`, async ({
92
+ page,
93
+ }) => {
94
+ const button = page.getByTestId('press-style-button')
95
+ await expect(button).toBeVisible()
96
+
97
+ const text = button.locator('span').first()
98
+
99
+ // Initially should be green
100
+ const initialStyles = await getStyles(text)
101
+ expect(initialStyles.color).toContain('0, 128, 0') // green in rgb
102
+
103
+ // Press and hold the button using mouse down (triggers onPressIn)
104
+ await button.hover()
105
+ await page.mouse.down()
106
+ await page.waitForTimeout(200)
107
+
108
+ // While pressed, text should be red
109
+ const pressedStyles = await getStyles(text)
110
+ expect(pressedStyles.color).toContain('255, 0, 0') // red in rgb
111
+
112
+ // Release
113
+ await page.mouse.up()
114
+ await page.waitForTimeout(100)
115
+
116
+ // After release, should be back to green
117
+ const releasedStyles = await getStyles(text)
118
+ expect(releasedStyles.color).toContain('0, 128, 0') // green in rgb
119
+ })
@@ -0,0 +1,56 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+
5
+ /**
6
+ * Tests for styled context token preservation (issues #3670, #3676)
7
+ *
8
+ * When a parent component sets a context value via a variant (like gap: '$8'),
9
+ * child components should receive the original token string ('$8') in their
10
+ * functional variants, NOT the resolved CSS variable ('var(--t-space-8)').
11
+ *
12
+ * This is important because functional variants need the token string to
13
+ * look up values in the tokens object.
14
+ */
15
+
16
+ test.beforeEach(async ({ page }) => {
17
+ await setupPage(page, { name: 'StyledContextTokens', type: 'useCase' })
18
+ })
19
+
20
+ test('variant should pass token string to context, not CSS variable - small spacing', async ({
21
+ page,
22
+ }) => {
23
+ // The debug display shows what gap value the child received via context
24
+ const gapValue = await page.locator('#debug-small-gap-value').textContent()
25
+
26
+ // Should be '$2' (the token string), not 'var(--t-space-2)' (the CSS variable)
27
+ expect(gapValue).toBe('$2')
28
+ })
29
+
30
+ test('variant should pass token string to context, not CSS variable - large spacing', async ({
31
+ page,
32
+ }) => {
33
+ const gapValue = await page.locator('#debug-large-gap-value').textContent()
34
+
35
+ // Should be '$8' (the token string), not 'var(--t-space-8)' (the CSS variable)
36
+ expect(gapValue).toBe('$8')
37
+ })
38
+
39
+ test('default context value should be preserved as token string', async ({ page }) => {
40
+ const gapValue = await page.locator('#debug-default-gap-value').textContent()
41
+
42
+ // Default context value should also be a token string
43
+ expect(gapValue).toBe('$4')
44
+ })
45
+
46
+ test('debug display should show green background when token is preserved', async ({
47
+ page,
48
+ }) => {
49
+ // The debug display has green background if gap is a token string, red if CSS variable
50
+ const debugSmall = page.locator('#debug-small')
51
+ const bgColor = await debugSmall.evaluate((el) => getComputedStyle(el).backgroundColor)
52
+
53
+ // Green-ish color indicates token was preserved (using $green5 theme token)
54
+ // This is a sanity check that our isToken logic in the component is working
55
+ expect(bgColor).not.toBe('rgb(254, 202, 202)') // not red ($red5)
56
+ })
@@ -0,0 +1,16 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { getStyles } from './utils'
4
+ import { setupPage } from './test-utils'
5
+
6
+ test.beforeEach(async ({ page }) => {
7
+ await setupPage(page, { name: 'StyledHOCNamed', type: 'useCase' })
8
+ })
9
+
10
+ test(`styled() name works on HOC`, async ({ page }) => {
11
+ const textStyles = await getStyles(page.getByTestId('text-named').first())
12
+ expect(textStyles.color).toBe(`rgb(255, 0, 0)`)
13
+
14
+ const labelStyles = await getStyles(page.getByTestId('label-named').first())
15
+ expect(labelStyles.color).toBe(`rgb(255, 0, 0)`)
16
+ })
@@ -0,0 +1,161 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+
5
+ test.beforeEach(async ({ page }) => {
6
+ await setupPage(page, { name: 'StyledHtmlCase', type: 'useCase' })
7
+ })
8
+
9
+ test.describe('styled.element() API', () => {
10
+ test.describe('styled.a()', () => {
11
+ test('renders anchor element with proper tag', async ({ page }) => {
12
+ const element = page.getByTestId('styled-a')
13
+ await expect(element).toBeVisible()
14
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
15
+ expect(tagName).toBe('a')
16
+ })
17
+
18
+ test('accepts href attribute', async ({ page }) => {
19
+ const element = page.getByTestId('styled-a')
20
+ expect(await element.getAttribute('href')).toBe('https://example.com')
21
+ })
22
+
23
+ test('accepts target attribute', async ({ page }) => {
24
+ const element = page.getByTestId('styled-a')
25
+ expect(await element.getAttribute('target')).toBe('_blank')
26
+ })
27
+
28
+ test('accepts rel attribute', async ({ page }) => {
29
+ const element = page.getByTestId('styled-a')
30
+ expect(await element.getAttribute('rel')).toBe('noopener')
31
+ })
32
+ })
33
+
34
+ test.describe('styled.button()', () => {
35
+ test('renders button element with proper tag', async ({ page }) => {
36
+ const element = page.getByTestId('styled-button')
37
+ await expect(element).toBeVisible()
38
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
39
+ expect(tagName).toBe('button')
40
+ })
41
+
42
+ test('accepts type attribute', async ({ page }) => {
43
+ const element = page.getByTestId('styled-button')
44
+ expect(await element.getAttribute('type')).toBe('submit')
45
+ })
46
+ })
47
+
48
+ test.describe('styled.div()', () => {
49
+ test('renders div element', async ({ page }) => {
50
+ const element = page.getByTestId('styled-div')
51
+ await expect(element).toBeVisible()
52
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
53
+ expect(tagName).toBe('div')
54
+ })
55
+ })
56
+
57
+ test.describe('styled.span()', () => {
58
+ test('renders span element', async ({ page }) => {
59
+ const element = page.getByTestId('styled-span')
60
+ await expect(element).toBeVisible()
61
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
62
+ expect(tagName).toBe('span')
63
+ })
64
+ })
65
+
66
+ test.describe('styled.input()', () => {
67
+ test('renders input element with proper tag', async ({ page }) => {
68
+ const element = page.getByTestId('styled-input')
69
+ await expect(element).toBeVisible()
70
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
71
+ expect(tagName).toBe('input')
72
+ })
73
+
74
+ test('accepts type attribute', async ({ page }) => {
75
+ const element = page.getByTestId('styled-input')
76
+ expect(await element.getAttribute('type')).toBe('text')
77
+ })
78
+
79
+ test('accepts placeholder attribute', async ({ page }) => {
80
+ const element = page.getByTestId('styled-input')
81
+ expect(await element.getAttribute('placeholder')).toBe('Enter text')
82
+ })
83
+
84
+ test('accepts maxLength attribute', async ({ page }) => {
85
+ const element = page.getByTestId('styled-input')
86
+ expect(await element.getAttribute('maxlength')).toBe('100')
87
+ })
88
+ })
89
+
90
+ test.describe('styled.form()', () => {
91
+ test('renders form element with proper tag', async ({ page }) => {
92
+ const element = page.getByTestId('styled-form')
93
+ await expect(element).toBeVisible()
94
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
95
+ expect(tagName).toBe('form')
96
+ })
97
+
98
+ test('accepts action attribute', async ({ page }) => {
99
+ const element = page.getByTestId('styled-form')
100
+ expect(await element.getAttribute('action')).toBe('/submit')
101
+ })
102
+
103
+ test('accepts method attribute', async ({ page }) => {
104
+ const element = page.getByTestId('styled-form')
105
+ expect(await element.getAttribute('method')).toBe('post')
106
+ })
107
+ })
108
+
109
+ test.describe('styled.label()', () => {
110
+ test('renders label element with proper tag', async ({ page }) => {
111
+ const element = page.getByTestId('styled-label')
112
+ await expect(element).toBeVisible()
113
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
114
+ expect(tagName).toBe('label')
115
+ })
116
+
117
+ test('accepts htmlFor attribute (rendered as for)', async ({ page }) => {
118
+ const element = page.getByTestId('styled-label')
119
+ expect(await element.getAttribute('for')).toBe('test-input')
120
+ })
121
+ })
122
+
123
+ test.describe('semantic elements', () => {
124
+ test('styled.nav() renders nav element', async ({ page }) => {
125
+ const element = page.getByTestId('styled-nav')
126
+ await expect(element).toBeVisible()
127
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
128
+ expect(tagName).toBe('nav')
129
+ })
130
+
131
+ test('styled.main() renders main element', async ({ page }) => {
132
+ const element = page.getByTestId('styled-main')
133
+ await expect(element).toBeVisible()
134
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
135
+ expect(tagName).toBe('main')
136
+ })
137
+
138
+ test('styled.section() renders section element', async ({ page }) => {
139
+ const element = page.getByTestId('styled-section')
140
+ await expect(element).toBeVisible()
141
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
142
+ expect(tagName).toBe('section')
143
+ })
144
+ })
145
+
146
+ test.describe('styled.a() with variants', () => {
147
+ test('renders with large size variant', async ({ page }) => {
148
+ const element = page.getByTestId('styled-a-variants')
149
+ await expect(element).toBeVisible()
150
+ const tagName = await element.evaluate((el) => el.tagName.toLowerCase())
151
+ expect(tagName).toBe('a')
152
+ expect(await element.getAttribute('href')).toBe('/internal')
153
+ })
154
+
155
+ test('renders with small size variant', async ({ page }) => {
156
+ const element = page.getByTestId('styled-a-variants-small')
157
+ await expect(element).toBeVisible()
158
+ expect(await element.getAttribute('href')).toBe('/small')
159
+ })
160
+ })
161
+ })
@@ -0,0 +1,32 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ test('styled() icon respects color prop', async ({ page }) => {
4
+ await page.goto('/?test=StyledIconColor')
5
+ await page.waitForTimeout(1000)
6
+
7
+ // Helper to get computed stroke color from SVG path
8
+ // Uses computedStyle to resolve CSS variables like var(--color)
9
+ async function getSvgStrokeColor(testId: string) {
10
+ const element = page.getByTestId(testId)
11
+ await expect(element).toBeVisible()
12
+ // The testID is on the svg, path has stroke
13
+ const path = element.locator('path').first()
14
+ return await path.evaluate((el) => getComputedStyle(el).stroke)
15
+ }
16
+
17
+ // Direct color prop should work
18
+ const directColor = await getSvgStrokeColor('direct-blue')
19
+ expect(directColor).toBe('rgb(0, 0, 255)') // blue
20
+
21
+ // styled() with color should work
22
+ const redColor = await getSvgStrokeColor('styled-red')
23
+ expect(redColor).toBe('rgb(255, 0, 0)') // red
24
+
25
+ // another styled() with different color
26
+ const greenColor = await getSvgStrokeColor('styled-green')
27
+ expect(greenColor).toBe('rgb(0, 128, 0)') // green
28
+
29
+ // runtime prop should override styled() default
30
+ const purpleColor = await getSvgStrokeColor('override-purple')
31
+ expect(purpleColor).toBe('rgb(128, 0, 128)') // purple
32
+ })
@@ -0,0 +1,19 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'StyledInputFocusStyle', type: 'useCase' })
6
+ })
7
+
8
+ test(`styled input + focusStyle`, async ({ page }) => {
9
+ const input = page.locator('input')
10
+
11
+ await input.focus()
12
+
13
+ const styles = await input.evaluate((el) => {
14
+ return window.getComputedStyle(el)
15
+ })
16
+
17
+ expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
18
+ expect(styles.borderWidth).toBe(`10px`)
19
+ })
@@ -0,0 +1,27 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'StyledInputOnFocus', type: 'useCase' })
6
+ })
7
+
8
+ test(`styled input + onFocus`, async ({ page }) => {
9
+ const input = page.locator('#onFocus')
10
+
11
+ await input.focus()
12
+
13
+ await page.waitForFunction(
14
+ async () => {
15
+ const inputElement = document.querySelector('#onFocus')
16
+ return inputElement?.getAttribute('data-onfocus') === 'true'
17
+ },
18
+ { timeout: 2000 }
19
+ )
20
+
21
+ const styles = await input.evaluate((el) => {
22
+ return window.getComputedStyle(el)
23
+ })
24
+
25
+ expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
26
+ expect(styles.borderWidth).toBe(`10px`)
27
+ })
@@ -0,0 +1,66 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles, getHoverStyle } from './utils'
5
+
6
+ test.beforeEach(async ({ page }) => {
7
+ await setupPage(page, { name: 'StyledMediaQueryMerge', type: 'useCase' })
8
+ await page.setViewportSize({ width: 700, height: 600 })
9
+ })
10
+
11
+ test(`styled component media query merge works correctly`, async ({ page }) => {
12
+ // Test 1: $sm media query merge
13
+ const test1 = page.locator('#test1')
14
+ const styles1 = await getStyles(test1)
15
+
16
+ // Test 2: $md media query merge
17
+ const test2 = page.locator('#test2')
18
+ const styles2 = await getStyles(test2)
19
+
20
+ // Test 3: Both media queries
21
+ const test3 = page.locator('#test3')
22
+ const styles3 = await getStyles(test3)
23
+
24
+ // Test 4: Pseudo selector merge
25
+ const test4 = page.locator('#test4')
26
+ const styles4 = await getStyles(test4)
27
+
28
+ // Test 5: Direct component
29
+ const test5 = page.locator('#test5')
30
+ const styles5 = await getStyles(test5)
31
+
32
+ // Test 1: $sm should have styled definition + runtime override
33
+ expect(styles1.paddingTop).toBe('100px')
34
+ expect(styles1.marginLeft).toBe('100px')
35
+ expect(styles1.marginRight).toBe('100px')
36
+ expect(styles1.height).toBe('100px')
37
+ expect(styles1.width).toBe('100px')
38
+ expect(styles1.backgroundColor).toBe('rgb(0, 0, 255)') // blue (runtime override)
39
+
40
+ // Test 2: $sm should have styled definition + runtime override
41
+ expect(styles2.paddingTop).toBe('100px')
42
+ expect(styles2.marginLeft).toBe('100px')
43
+ expect(styles2.marginRight).toBe('100px')
44
+ expect(styles2.height).toBe('100px')
45
+ expect(styles2.width).toBe('100px')
46
+ expect(styles2.backgroundColor).toBe('rgb(128, 0, 128)') // purple (runtime override)
47
+
48
+ // Test 3: $sm media query should be merged with runtime override
49
+ expect(styles3.paddingTop).toBe('100px') // from $sm
50
+ expect(styles3.marginLeft).toBe('100px') // from $sm
51
+ expect(styles3.marginRight).toBe('100px') // from $sm
52
+ expect(styles3.height).toBe('100px') // from $sm
53
+ expect(styles3.width).toBe('100px') // from $sm
54
+ expect(styles3.backgroundColor).toBe('rgb(0, 0, 255)') // blue (from $sm runtime override)
55
+
56
+ // Test 4: Pseudo selectors should be merged (runtime override)
57
+ // Test hover state - runtime override should take precedence
58
+ const hoverStyles4 = await getHoverStyle(test4)
59
+ expect(hoverStyles4.backgroundColor).toBe('rgb(0, 255, 255)') // cyan (runtime override)
60
+
61
+ // Test 5: Direct component should work as expected
62
+ expect(styles5.paddingTop).toBe('50px')
63
+ expect(styles5.marginLeft).toBe('50px')
64
+ expect(styles5.marginRight).toBe('50px')
65
+ expect(styles5.backgroundColor).toBe('rgb(165, 42, 42)') // brown
66
+ })
@@ -0,0 +1,17 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles } from './utils'
5
+
6
+ test.beforeEach(async ({ page }) => {
7
+ await setupPage(page, { name: 'StyledRNW', type: 'useCase' })
8
+ })
9
+
10
+ test(`RNW + styled() + styleable() twice`, async ({ page }) => {
11
+ const inputStyles = await getStyles(page.locator('#styled-rnw-input'))
12
+ expect(inputStyles.fontFamily).toBe(
13
+ `Silkscreen, "Fira Code", Monaco, Consolas, "Ubuntu Mono", monospace`
14
+ )
15
+ expect(inputStyles.paddingLeft).toBe(`14px`)
16
+ expect(inputStyles.paddingTop).toBe(`12px`)
17
+ })
@@ -0,0 +1,27 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'StyledStyleableInputOnFocus', type: 'useCase' })
6
+ })
7
+
8
+ test(`styled styleable input + onFocus`, async ({ page }) => {
9
+ const input = page.locator('#onFocus')
10
+
11
+ await input.focus()
12
+
13
+ await page.waitForFunction(
14
+ async () => {
15
+ const inputElement = document.querySelector('#onFocus')
16
+ return inputElement?.getAttribute('data-onfocus') === 'true'
17
+ },
18
+ { timeout: 2000 }
19
+ )
20
+
21
+ const styles = await input.evaluate((el) => {
22
+ return window.getComputedStyle(el)
23
+ })
24
+
25
+ expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
26
+ expect(styles.borderWidth).toBe(`10px`)
27
+ })
@@ -0,0 +1,22 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles } from './utils'
5
+
6
+ test.beforeEach(async ({ page }) => {
7
+ await setupPage(page, { name: 'StyledStyleableInputVariant', type: 'useCase' })
8
+ })
9
+
10
+ test(`styled(styleable(styled(RNView))) applies proper variant overrides`, async ({
11
+ page,
12
+ }) => {
13
+ const styles = await getStyles(page.locator('#input').first())
14
+
15
+ expect(styles.color).toBe('rgb(255, 0, 0)')
16
+ expect(styles.borderTopLeftRadius).toBe('100px')
17
+ expect(styles.borderColor).toBe('rgb(255, 0, 0)')
18
+
19
+ await page.locator('#input').focus()
20
+ const focusStyle = await getStyles(page.locator('#input').first())
21
+ expect(focusStyle.borderColor).toBe('rgb(0, 128, 0)')
22
+ })
@@ -0,0 +1,27 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'StyledStyledStyleableInputOnFocus', type: 'useCase' })
6
+ })
7
+
8
+ test(`styled styleable input + onFocus`, async ({ page }) => {
9
+ const input = page.locator('#onFocus')
10
+
11
+ await input.focus()
12
+
13
+ await page.waitForFunction(
14
+ async () => {
15
+ const inputElement = document.querySelector('#onFocus')
16
+ return inputElement?.getAttribute('data-onfocus') === 'true'
17
+ },
18
+ { timeout: 2000 }
19
+ )
20
+
21
+ const styles = await input.evaluate((el) => {
22
+ return window.getComputedStyle(el)
23
+ })
24
+
25
+ expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
26
+ expect(styles.borderWidth).toBe(`10px`)
27
+ })
@@ -0,0 +1,24 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { getStyles } from './utils'
4
+ import { setupPage } from './test-utils'
5
+
6
+ test.beforeEach(async ({ page }) => {
7
+ await setupPage(page, { name: 'StyledVariantTextColor', type: 'useCase' })
8
+ })
9
+
10
+ test(`sets text colors with variants + theme`, async ({ page }) => {
11
+ const defaultStyles = await getStyles(page.getByTestId('default').first())
12
+ const defaultStylesFlat = await getStyles(page.getByTestId('default-flat').first())
13
+
14
+ // $color - updated for themeDev
15
+ expect(defaultStyles.color).toBe('rgb(17, 50, 100)')
16
+ expect(defaultStylesFlat.color).toBe(defaultStyles.color)
17
+
18
+ const activeStyles = await getStyles(page.getByTestId('active').first())
19
+ const activeStylesFlat = await getStyles(page.getByTestId('active-flat').first())
20
+
21
+ // $color10 - updated for themeDev
22
+ expect(activeStyles.color).toBe('rgb(5, 134, 240)')
23
+ expect(activeStylesFlat.color).toBe(activeStyles.color)
24
+ })
@@ -0,0 +1,27 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { name: 'StyledViewOnFocus', type: 'useCase' })
6
+ })
7
+
8
+ test(`styled view + onFocus`, async ({ page }) => {
9
+ const view = page.locator('#onFocus')
10
+
11
+ await view.focus()
12
+
13
+ await page.waitForFunction(
14
+ async () => {
15
+ const element = document.querySelector('#onFocus')
16
+ return element?.getAttribute('data-onfocus') === 'true'
17
+ },
18
+ { timeout: 2000 }
19
+ )
20
+
21
+ const styles = await view.evaluate((el) => {
22
+ return window.getComputedStyle(el)
23
+ })
24
+
25
+ expect(styles.borderColor).toBe(`rgb(0, 0, 255)`)
26
+ expect(styles.borderWidth).toBe(`10px`)
27
+ })