@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,129 @@
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: 'ThemedListItem', type: 'useCase' })
8
+ })
9
+
10
+ test('ListItem renders correctly with default theme', async ({ page }) => {
11
+ const listItem = page.locator('#themed-list-item-default')
12
+ const title = listItem.getByText('Default', { exact: true })
13
+ const subTitle = listItem.getByText('Default list item', { exact: true })
14
+
15
+ await expect(listItem).toBeVisible()
16
+ await expect(title).toBeVisible()
17
+ await expect(subTitle).toBeVisible()
18
+
19
+ const styles = await getStyles(listItem)
20
+ expect(styles.backgroundColor).toBe('rgb(242, 242, 242)')
21
+ })
22
+
23
+ test('ListItem renders correctly with light theme', async ({ page }) => {
24
+ const listItem = page.locator('#themed-list-item-light')
25
+ const title = listItem.getByText('<Theme ="light"/>', { exact: true })
26
+ const subTitle = listItem.getByText('Forcing light theme', { exact: true })
27
+
28
+ await expect(listItem).toBeVisible()
29
+ await expect(title).toBeVisible()
30
+ await expect(subTitle).toBeVisible()
31
+
32
+ const styles = await getStyles(listItem)
33
+ expect(styles.backgroundColor).toBe('rgb(242, 242, 242)')
34
+ })
35
+
36
+ test('ListItem renders correctly with dark theme', async ({ page }) => {
37
+ const listItem = page.locator('#themed-list-item-dark')
38
+ const title = listItem.getByText('<Theme ="dark"/>', { exact: true })
39
+ const subTitle = listItem.getByText('Forcing dark theme', { exact: true })
40
+
41
+ await expect(listItem).toBeVisible()
42
+ await expect(title).toBeVisible()
43
+ await expect(subTitle).toBeVisible()
44
+
45
+ const styles = await getStyles(listItem)
46
+ expect(styles.backgroundColor).toBe('rgb(10, 10, 10)')
47
+ })
48
+
49
+ test('ListItem with accent theme renders correctly in light theme', async ({ page }) => {
50
+ const listItem = page.locator('#themed-list-item-light-accent')
51
+ const title = listItem.getByText('<Theme name="accent">', { exact: true })
52
+ const subTitle = listItem.getByText('light + accent = light_accent (contrasting)', {
53
+ exact: true,
54
+ })
55
+
56
+ await expect(listItem).toBeVisible()
57
+ await expect(title).toBeVisible()
58
+ await expect(subTitle).toBeVisible()
59
+
60
+ // Accent theme inverts colors - light + accent = dark background
61
+ const styles = await getStyles(listItem)
62
+ const match = styles.backgroundColor.match(/rgb\((\d+), (\d+), (\d+)\)/)
63
+ expect(match).toBeTruthy()
64
+ const [, r, g, b] = match!.map(Number)
65
+ expect(r).toBeLessThan(50)
66
+ expect(g).toBeLessThan(50)
67
+ expect(b).toBeLessThan(50)
68
+ })
69
+
70
+ test('ListItem with accent theme renders correctly in dark theme', async ({ page }) => {
71
+ const listItem = page.locator('#themed-list-item-dark-accent')
72
+ const title = listItem.getByText('<Theme name="accent">', { exact: true })
73
+ const subTitle = listItem.getByText('dark + accent = dark_accent (contrasting)', {
74
+ exact: true,
75
+ })
76
+
77
+ await expect(listItem).toBeVisible()
78
+ await expect(title).toBeVisible()
79
+ await expect(subTitle).toBeVisible()
80
+
81
+ // Accent theme inverts colors - dark + accent = light background
82
+ const styles = await getStyles(listItem)
83
+ const match = styles.backgroundColor.match(/rgb\((\d+), (\d+), (\d+)\)/)
84
+ expect(match).toBeTruthy()
85
+ const [, r, g, b] = match!.map(Number)
86
+ expect(r).toBeGreaterThan(200)
87
+ expect(g).toBeGreaterThan(200)
88
+ expect(b).toBeGreaterThan(200)
89
+ })
90
+
91
+ test('ListItem renders correctly with outlined variant', async ({ page }) => {
92
+ const listItem = page.locator('#themed-list-item-outlined')
93
+ const title = listItem.getByText('Outlined', { exact: true })
94
+ const subTitle = listItem.getByText('Using variant prop', { exact: true })
95
+
96
+ await expect(listItem).toBeVisible()
97
+ await expect(title).toBeVisible()
98
+ await expect(subTitle).toBeVisible()
99
+
100
+ const styles = await getStyles(listItem)
101
+ // Outlined variant has transparent background and border
102
+ expect(styles.backgroundColor).toBe('rgba(0, 0, 0, 0)')
103
+ expect(styles.borderWidth).toBe('1px')
104
+ })
105
+
106
+ test('ListItem.Apply passes color to children icons', async ({ page }) => {
107
+ const listItem = page.locator('#themed-list-item-apply-color')
108
+ const title = listItem.getByText('With Apply color', { exact: true })
109
+
110
+ await expect(listItem).toBeVisible()
111
+ await expect(title).toBeVisible()
112
+
113
+ // Check that the icon received the color from Apply context
114
+ const icon = listItem.locator('svg')
115
+ await expect(icon).toBeVisible()
116
+ })
117
+
118
+ test('ListItem.Apply passes variant to children', async ({ page }) => {
119
+ const listItem = page.locator('#themed-list-item-apply-variant')
120
+ const title = listItem.getByText('With Apply variant', { exact: true })
121
+
122
+ await expect(listItem).toBeVisible()
123
+ await expect(title).toBeVisible()
124
+
125
+ const styles = await getStyles(listItem)
126
+ // Outlined variant applied via Apply context
127
+ expect(styles.backgroundColor).toBe('rgba(0, 0, 0, 0)')
128
+ expect(styles.borderWidth).toBe('1px')
129
+ })
@@ -0,0 +1,113 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles } from './utils'
5
+
6
+ /**
7
+ * Tests for v5 media queries with mobile-first (minWidth) and desktop-first (maxWidth)
8
+ *
9
+ * v5 uses:
10
+ * - minWidth for base queries ($sm, $md, $lg, etc.) - mobile-first: larger wins
11
+ * - maxWidth for max-* queries ($max-sm, $max-md, etc.) - desktop-first: smaller wins
12
+ *
13
+ * NOTE: These tests are currently skipped because the kitchen-sink webpack build
14
+ * evaluates the config selection at bundle time (when window.location is undefined),
15
+ * not at runtime. The v5config query param doesn't work for dynamic config switching.
16
+ *
17
+ * The v5 media config itself is correct - see code/core/config/src/v5-media.ts
18
+ * To properly test, the kitchen-sink would need to be built with v5 config as default,
19
+ * or use a different mechanism for config switching.
20
+ */
21
+
22
+ test.describe.skip('v5 Media Queries', () => {
23
+ test.describe('Mobile-first (minWidth) - larger breakpoints should win', () => {
24
+ test.beforeEach(async ({ page }) => {
25
+ // use v5config query param to enable v5 media config
26
+ await setupPage(page, {
27
+ name: 'MediaQueriesV5',
28
+ type: 'useCase',
29
+ searchParams: { v5config: 'true' },
30
+ })
31
+ })
32
+
33
+ test('on large viewport (1280px), $lg should win over $sm and $md', async ({
34
+ page,
35
+ }) => {
36
+ await page.setViewportSize({ width: 1280, height: 800 })
37
+ const element = page.locator('[data-testid="test-mobile-first"]')
38
+ const styles = await getStyles(element)
39
+ // lg (1024) should be active and win over sm (640) and md (768)
40
+ expect(styles.backgroundColor).toBe('rgb(0, 128, 0)') // green from $lg
41
+ })
42
+
43
+ test('on medium viewport (900px), $md should win over $sm', async ({ page }) => {
44
+ await page.setViewportSize({ width: 900, height: 800 })
45
+ const element = page.locator('[data-testid="test-mobile-first"]')
46
+ const styles = await getStyles(element)
47
+ // md (768) should be active and win over sm (640)
48
+ expect(styles.backgroundColor).toBe('rgb(255, 165, 0)') // orange from $md
49
+ })
50
+
51
+ test('on small viewport (700px), $sm should apply', async ({ page }) => {
52
+ await page.setViewportSize({ width: 700, height: 800 })
53
+ const element = page.locator('[data-testid="test-mobile-first"]')
54
+ const styles = await getStyles(element)
55
+ // only sm (640) should be active
56
+ expect(styles.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $sm
57
+ })
58
+
59
+ test('on tiny viewport (500px), base (red) should apply', async ({ page }) => {
60
+ await page.setViewportSize({ width: 500, height: 800 })
61
+ const element = page.locator('[data-testid="test-mobile-first"]')
62
+ const styles = await getStyles(element)
63
+ // none of the breakpoints should be active
64
+ expect(styles.backgroundColor).toBe('rgb(255, 0, 0)') // red (base)
65
+ })
66
+ })
67
+
68
+ test.describe('Desktop-first (maxWidth) - smaller breakpoints should win', () => {
69
+ test.beforeEach(async ({ page }) => {
70
+ await setupPage(page, {
71
+ name: 'MediaQueriesV5',
72
+ type: 'useCase',
73
+ searchParams: { v5config: 'true' },
74
+ })
75
+ })
76
+
77
+ test('on tiny viewport (500px), $max-sm should win over $max-md and $max-lg', async ({
78
+ page,
79
+ }) => {
80
+ await page.setViewportSize({ width: 500, height: 800 })
81
+ const element = page.locator('[data-testid="test-desktop-first"]')
82
+ const styles = await getStyles(element)
83
+ // max-sm (640), max-md (768), max-lg (1024) all match, but max-sm should win
84
+ expect(styles.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $max-sm
85
+ })
86
+
87
+ test('on medium viewport (700px), $max-md should win over $max-lg', async ({
88
+ page,
89
+ }) => {
90
+ await page.setViewportSize({ width: 700, height: 800 })
91
+ const element = page.locator('[data-testid="test-desktop-first"]')
92
+ const styles = await getStyles(element)
93
+ // max-md (768), max-lg (1024) match, but max-md should win
94
+ expect(styles.backgroundColor).toBe('rgb(255, 165, 0)') // orange from $max-md
95
+ })
96
+
97
+ test('on large viewport (900px), $max-lg should apply', async ({ page }) => {
98
+ await page.setViewportSize({ width: 900, height: 800 })
99
+ const element = page.locator('[data-testid="test-desktop-first"]')
100
+ const styles = await getStyles(element)
101
+ // only max-lg (1024) should match
102
+ expect(styles.backgroundColor).toBe('rgb(0, 128, 0)') // green from $max-lg
103
+ })
104
+
105
+ test('on huge viewport (1200px), base (red) should apply', async ({ page }) => {
106
+ await page.setViewportSize({ width: 1200, height: 800 })
107
+ const element = page.locator('[data-testid="test-desktop-first"]')
108
+ const styles = await getStyles(element)
109
+ // none of the max-* breakpoints should match
110
+ expect(styles.backgroundColor).toBe('rgb(255, 0, 0)') // red (base)
111
+ })
112
+ })
113
+ })
@@ -0,0 +1,84 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ import { setupPage } from './test-utils'
4
+ import { getStyles } from './utils'
5
+
6
+ /**
7
+ * Regression test for media query bug starting in 1.132.17
8
+ *
9
+ * Bug: On small screens, $gtMd styles incorrectly apply.
10
+ * The compiler is generating incorrect output where $gtMd overrides $md
11
+ * even when the viewport is below the $gtMd breakpoint.
12
+ *
13
+ * Adding debug="verbose" fixes it, confirming compiler issue.
14
+ */
15
+
16
+ test.describe('Media Query $gtMd regression', () => {
17
+ test.describe('Small viewport (mobile - below md breakpoint)', () => {
18
+ test.beforeEach(async ({ page }) => {
19
+ await setupPage(page, { name: 'MediaQueryGtMd', type: 'useCase' })
20
+ // Set viewport to small size (below md breakpoint of 660px)
21
+ await page.setViewportSize({ width: 500, height: 800 })
22
+ })
23
+
24
+ test('$md should apply, NOT $gtMd on small screens', async ({ page }) => {
25
+ // Test 1: Both $md and $gtMd - $md should win on small screen
26
+ const test1 = page.locator('#media-test-both')
27
+ const styles1 = await getStyles(test1)
28
+ expect(styles1.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $md, NOT green from $gtMd
29
+ })
30
+
31
+ test('$gtMd should NOT apply on small screens', async ({ page }) => {
32
+ // Test 2: Only $gtMd - should stay red (base) on small screen
33
+ const test2 = page.locator('#media-test-gtmd-only')
34
+ const styles2 = await getStyles(test2)
35
+ expect(styles2.backgroundColor).toBe('rgb(255, 0, 0)') // red (base), $gtMd should NOT apply
36
+ })
37
+
38
+ test('$md should apply on small screens', async ({ page }) => {
39
+ // Test 3: Only $md - should be yellow on small screen
40
+ const test3 = page.locator('#media-test-md-only')
41
+ const styles3 = await getStyles(test3)
42
+ expect(styles3.backgroundColor).toBe('rgb(255, 255, 0)') // yellow from $md
43
+ })
44
+
45
+ test('$sm should apply on extra small screens', async ({ page }) => {
46
+ // Set to very small viewport to test $sm
47
+ await page.setViewportSize({ width: 400, height: 800 })
48
+
49
+ // Test 4: $sm, $md, $gtMd together - $sm should win on extra small
50
+ const test4 = page.locator('#media-test-all')
51
+ const styles4 = await getStyles(test4)
52
+ expect(styles4.backgroundColor).toBe('rgb(0, 0, 255)') // blue from $sm
53
+ })
54
+ })
55
+
56
+ test.describe('Large viewport (desktop - above gtMd breakpoint)', () => {
57
+ test.beforeEach(async ({ page }) => {
58
+ await setupPage(page, { name: 'MediaQueryGtMd', type: 'useCase' })
59
+ // Set viewport to large size (above gtMd breakpoint of 1021px)
60
+ await page.setViewportSize({ width: 1100, height: 800 })
61
+ })
62
+
63
+ test('$gtMd should apply on large screens', async ({ page }) => {
64
+ // Test 1: Both $md and $gtMd - $gtMd should win on large screen
65
+ const test1 = page.locator('#media-test-both')
66
+ const styles1 = await getStyles(test1)
67
+ expect(styles1.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
68
+ })
69
+
70
+ test('$gtMd should apply when only $gtMd is set', async ({ page }) => {
71
+ // Test 2: Only $gtMd - should be green on large screen
72
+ const test2 = page.locator('#media-test-gtmd-only')
73
+ const styles2 = await getStyles(test2)
74
+ expect(styles2.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
75
+ })
76
+
77
+ test('all three media queries - $gtMd wins on large screen', async ({ page }) => {
78
+ // Test 4: $sm, $md, $gtMd together - $gtMd should win on large screen
79
+ const test4 = page.locator('#media-test-all')
80
+ const styles4 = await getStyles(test4)
81
+ expect(styles4.backgroundColor).toBe('rgb(0, 128, 0)') // green from $gtMd
82
+ })
83
+ })
84
+ })
@@ -0,0 +1,108 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.beforeEach(async ({ page }) => {
5
+ await setupPage(page, { type: 'useCase', name: 'MenuAboveDialogCase' })
6
+ })
7
+
8
+ test('menu renders above dialog overlay', async ({ page }) => {
9
+ await page.waitForLoadState('networkidle')
10
+
11
+ // open dialog
12
+ const dialogTrigger = page.getByTestId('dialog-trigger')
13
+ await dialogTrigger.click()
14
+
15
+ const dialogContent = page.getByTestId('dialog-content')
16
+ await expect(dialogContent).toBeVisible({ timeout: 5000 })
17
+ await page.waitForTimeout(300)
18
+
19
+ // open menu inside dialog
20
+ const menuTrigger = page.getByTestId('menu-trigger')
21
+ await menuTrigger.click()
22
+
23
+ const menuContent = page.getByTestId('menu-content')
24
+ await expect(menuContent).toBeVisible({ timeout: 5000 })
25
+
26
+ // verify menu is clickable (proves it's above dialog)
27
+ const menuItem = page.getByTestId('menu-item-1')
28
+ await expect(menuItem).toBeVisible()
29
+
30
+ // get z-index of portal containers (the fixed positioned wrappers)
31
+ const dialogPortalZIndex = await page.evaluate(() => {
32
+ const dialogContent = document.querySelector('[data-testid="dialog-content"]')
33
+ // find the portal container (fixed position ancestor with z-index)
34
+ let el = dialogContent?.parentElement
35
+ while (el) {
36
+ const style = window.getComputedStyle(el)
37
+ if (style.position === 'fixed' && style.zIndex !== 'auto') {
38
+ return parseInt(style.zIndex)
39
+ }
40
+ el = el.parentElement
41
+ }
42
+ return 0
43
+ })
44
+
45
+ const menuPortalZIndex = await page.evaluate(() => {
46
+ const menuContent = document.querySelector('[data-testid="menu-content"]')
47
+ // find the portal container (fixed position ancestor with z-index)
48
+ let el = menuContent?.parentElement
49
+ while (el) {
50
+ const style = window.getComputedStyle(el)
51
+ if (style.position === 'fixed' && style.zIndex !== 'auto') {
52
+ return parseInt(style.zIndex)
53
+ }
54
+ el = el.parentElement
55
+ }
56
+ return 0
57
+ })
58
+
59
+ // menu portal should have higher z-index than dialog portal
60
+ console.log(
61
+ `Dialog portal z-index: ${dialogPortalZIndex}, Menu portal z-index: ${menuPortalZIndex}`
62
+ )
63
+ expect(menuPortalZIndex).toBeGreaterThan(dialogPortalZIndex)
64
+ })
65
+
66
+ test('menu closes on ESC, dialog stays open', async ({ page }) => {
67
+ await page.waitForLoadState('networkidle')
68
+
69
+ // open dialog
70
+ await page.getByTestId('dialog-trigger').click()
71
+ await expect(page.getByTestId('dialog-content')).toBeVisible({ timeout: 5000 })
72
+ await page.waitForTimeout(300)
73
+
74
+ // open menu
75
+ await page.getByTestId('menu-trigger').click()
76
+ await expect(page.getByTestId('menu-content')).toBeVisible({ timeout: 5000 })
77
+ await page.waitForTimeout(200)
78
+
79
+ // press ESC - menu should close, dialog should stay open
80
+ await page.keyboard.press('Escape')
81
+ await page.waitForTimeout(400)
82
+
83
+ await expect(page.getByTestId('menu-content')).not.toBeVisible({ timeout: 5000 })
84
+ await expect(page.getByTestId('dialog-content')).toBeVisible()
85
+ })
86
+
87
+ test('clicking menu item works when menu is above dialog', async ({ page }) => {
88
+ await page.waitForLoadState('networkidle')
89
+
90
+ // open dialog
91
+ await page.getByTestId('dialog-trigger').click()
92
+ await expect(page.getByTestId('dialog-content')).toBeVisible({ timeout: 5000 })
93
+ await page.waitForTimeout(300)
94
+
95
+ // open menu
96
+ await page.getByTestId('menu-trigger').click()
97
+ await expect(page.getByTestId('menu-content')).toBeVisible({ timeout: 5000 })
98
+ await page.waitForTimeout(200)
99
+
100
+ // click menu item - should work without being blocked by dialog
101
+ const menuItem = page.getByTestId('menu-item-2')
102
+ await menuItem.click()
103
+
104
+ // menu should close after item click
105
+ await expect(page.getByTestId('menu-content')).not.toBeVisible({ timeout: 5000 })
106
+ // dialog should still be open
107
+ await expect(page.getByTestId('dialog-content')).toBeVisible()
108
+ })