@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,346 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.describe('Menu Accessibility', () => {
5
+ test.beforeEach(async ({ page }) => {
6
+ await setupPage(page, { name: 'MenuAccessibilityCase', type: 'useCase' })
7
+ })
8
+
9
+ test('trigger is focusable via tab key', async ({ page }) => {
10
+ await page.waitForLoadState('networkidle')
11
+
12
+ // focus the "before" button first
13
+ const beforeButton = page.getByTestId('before-button')
14
+ await beforeButton.focus()
15
+ await expect(beforeButton).toBeFocused()
16
+
17
+ // tab to menu trigger
18
+ await page.keyboard.press('Tab')
19
+ await page.waitForTimeout(100)
20
+
21
+ const trigger = page.getByTestId('menu-trigger')
22
+ await expect(trigger).toBeFocused()
23
+
24
+ // tab to "after" button
25
+ await page.keyboard.press('Tab')
26
+ await page.waitForTimeout(100)
27
+
28
+ const afterButton = page.getByTestId('after-button')
29
+ await expect(afterButton).toBeFocused()
30
+ })
31
+
32
+ test('menu opens on Enter key and focuses first item', async ({ page }) => {
33
+ await page.waitForLoadState('networkidle')
34
+
35
+ const trigger = page.getByTestId('menu-trigger')
36
+ await trigger.focus()
37
+ await expect(trigger).toBeFocused()
38
+
39
+ // press Enter to open menu
40
+ await page.keyboard.press('Enter')
41
+ await page.waitForTimeout(300)
42
+
43
+ const menuContent = page.getByTestId('menu-content')
44
+ await expect(menuContent).toBeVisible()
45
+
46
+ // first item should be focused for keyboard users
47
+ const firstItem = page.getByTestId('menu-item-1')
48
+ await expect(firstItem).toBeFocused()
49
+ })
50
+
51
+ test('menu opens on Space key and focuses first item', async ({ page }) => {
52
+ await page.waitForLoadState('networkidle')
53
+
54
+ const trigger = page.getByTestId('menu-trigger')
55
+ await trigger.focus()
56
+ await expect(trigger).toBeFocused()
57
+
58
+ // press Space to open menu
59
+ await page.keyboard.press('Space')
60
+ await page.waitForTimeout(300)
61
+
62
+ const menuContent = page.getByTestId('menu-content')
63
+ await expect(menuContent).toBeVisible()
64
+
65
+ // first item should be focused for keyboard users
66
+ const firstItem = page.getByTestId('menu-item-1')
67
+ await expect(firstItem).toBeFocused()
68
+ })
69
+
70
+ test('arrow down from content frame focuses first item', async ({ page }) => {
71
+ await page.waitForLoadState('networkidle')
72
+
73
+ const trigger = page.getByTestId('menu-trigger')
74
+ await trigger.click()
75
+ await page.waitForTimeout(300)
76
+
77
+ const menuContent = page.getByTestId('menu-content')
78
+ await expect(menuContent).toBeVisible()
79
+ await expect(menuContent).toBeFocused()
80
+
81
+ // press ArrowDown to focus first item
82
+ await page.keyboard.press('ArrowDown')
83
+ await page.waitForTimeout(100)
84
+
85
+ const firstItem = page.getByTestId('menu-item-1')
86
+ await expect(firstItem).toBeFocused()
87
+ })
88
+
89
+ test('arrow keys navigate between menu items', async ({ page }) => {
90
+ await page.waitForLoadState('networkidle')
91
+
92
+ const trigger = page.getByTestId('menu-trigger')
93
+ await trigger.click()
94
+ await page.waitForTimeout(300)
95
+
96
+ const menuContent = page.getByTestId('menu-content')
97
+ await expect(menuContent).toBeVisible()
98
+
99
+ // arrow down to focus first item from content frame
100
+ await page.keyboard.press('ArrowDown')
101
+ await page.waitForTimeout(100)
102
+
103
+ const firstItem = page.getByTestId('menu-item-1')
104
+ await expect(firstItem).toBeFocused()
105
+
106
+ // arrow down to second item
107
+ await page.keyboard.press('ArrowDown')
108
+ await page.waitForTimeout(100)
109
+
110
+ const secondItem = page.getByTestId('menu-item-2')
111
+ await expect(secondItem).toBeFocused()
112
+
113
+ // arrow down to third item
114
+ await page.keyboard.press('ArrowDown')
115
+ await page.waitForTimeout(100)
116
+
117
+ const thirdItem = page.getByTestId('menu-item-3')
118
+ await expect(thirdItem).toBeFocused()
119
+
120
+ // arrow up back to second item
121
+ await page.keyboard.press('ArrowUp')
122
+ await page.waitForTimeout(100)
123
+
124
+ await expect(secondItem).toBeFocused()
125
+ })
126
+
127
+ test('escape closes menu and returns focus to trigger', async ({ page }) => {
128
+ await page.waitForLoadState('networkidle')
129
+
130
+ const trigger = page.getByTestId('menu-trigger')
131
+ await trigger.click()
132
+ await page.waitForTimeout(300)
133
+
134
+ const menuContent = page.getByTestId('menu-content')
135
+ await expect(menuContent).toBeVisible()
136
+
137
+ // focus an item
138
+ const firstItem = page.getByTestId('menu-item-1')
139
+ await firstItem.focus()
140
+ await expect(firstItem).toBeFocused()
141
+
142
+ // press Escape to close menu
143
+ await page.keyboard.press('Escape')
144
+ await page.waitForTimeout(300)
145
+
146
+ await expect(menuContent).not.toBeVisible()
147
+
148
+ // focus should return to trigger
149
+ await expect(trigger).toBeFocused()
150
+ })
151
+
152
+ test('escape in submenu closes only submenu first, then parent', async ({ page }) => {
153
+ await page.waitForLoadState('networkidle')
154
+
155
+ const trigger = page.getByTestId('menu-trigger')
156
+ await trigger.click()
157
+ await page.waitForTimeout(300)
158
+
159
+ const menuContent = page.getByTestId('menu-content')
160
+ await expect(menuContent).toBeVisible()
161
+
162
+ // open submenu by clicking on submenu trigger
163
+ const submenuTrigger = page.getByTestId('submenu-trigger')
164
+ await submenuTrigger.click()
165
+ await page.waitForTimeout(300)
166
+
167
+ const submenuContent = page.getByTestId('submenu-content')
168
+ await expect(submenuContent).toBeVisible()
169
+
170
+ // focus a submenu item
171
+ const submenuItem = page.getByTestId('submenu-item-1')
172
+ await submenuItem.focus()
173
+ await expect(submenuItem).toBeFocused()
174
+
175
+ // press Escape - should close submenu only
176
+ await page.keyboard.press('Escape')
177
+ await page.waitForTimeout(300)
178
+
179
+ // submenu should be closed
180
+ await expect(submenuContent).not.toBeVisible()
181
+
182
+ // parent menu should still be open
183
+ await expect(menuContent).toBeVisible()
184
+
185
+ // focus should return to submenu trigger
186
+ await expect(submenuTrigger).toBeFocused()
187
+
188
+ // press Escape again - should close parent menu
189
+ await page.keyboard.press('Escape')
190
+ await page.waitForTimeout(300)
191
+
192
+ await expect(menuContent).not.toBeVisible()
193
+
194
+ // focus should return to main trigger
195
+ await expect(trigger).toBeFocused()
196
+ })
197
+
198
+ test('arrow right opens submenu and focuses first submenu item', async ({ page }) => {
199
+ await page.waitForLoadState('networkidle')
200
+
201
+ const trigger = page.getByTestId('menu-trigger')
202
+ await trigger.click()
203
+ await page.waitForTimeout(300)
204
+
205
+ const menuContent = page.getByTestId('menu-content')
206
+ await expect(menuContent).toBeVisible()
207
+
208
+ // navigate to submenu trigger
209
+ const submenuTrigger = page.getByTestId('submenu-trigger')
210
+ await submenuTrigger.focus()
211
+ await expect(submenuTrigger).toBeFocused()
212
+
213
+ // press ArrowRight to open submenu
214
+ await page.keyboard.press('ArrowRight')
215
+ await page.waitForTimeout(300)
216
+
217
+ const submenuContent = page.getByTestId('submenu-content')
218
+ await expect(submenuContent).toBeVisible()
219
+
220
+ // first submenu item should be focused for keyboard users
221
+ const firstSubmenuItem = page.getByTestId('submenu-item-1')
222
+ await expect(firstSubmenuItem).toBeFocused()
223
+ })
224
+
225
+ test('arrow down in hover-opened submenu focuses first item', async ({ page }) => {
226
+ await page.waitForLoadState('networkidle')
227
+
228
+ const trigger = page.getByTestId('menu-trigger')
229
+ await trigger.click()
230
+ await page.waitForTimeout(300)
231
+
232
+ // hover over submenu trigger to open submenu
233
+ const submenuTrigger = page.getByTestId('submenu-trigger')
234
+ await submenuTrigger.hover()
235
+ await page.waitForTimeout(500)
236
+
237
+ const submenuContent = page.getByTestId('submenu-content')
238
+ await expect(submenuContent).toBeVisible()
239
+
240
+ // focus the submenu content and press down
241
+ await submenuContent.focus()
242
+ await page.keyboard.press('ArrowDown')
243
+ await page.waitForTimeout(100)
244
+
245
+ const firstSubmenuItem = page.getByTestId('submenu-item-1')
246
+ await expect(firstSubmenuItem).toBeFocused()
247
+ })
248
+
249
+ test('arrow left closes submenu and returns to parent', async ({ page }) => {
250
+ await page.waitForLoadState('networkidle')
251
+
252
+ const trigger = page.getByTestId('menu-trigger')
253
+ await trigger.click()
254
+ await page.waitForTimeout(300)
255
+
256
+ // open submenu
257
+ const submenuTrigger = page.getByTestId('submenu-trigger')
258
+ await submenuTrigger.click()
259
+ await page.waitForTimeout(300)
260
+
261
+ const submenuContent = page.getByTestId('submenu-content')
262
+ await expect(submenuContent).toBeVisible()
263
+
264
+ const submenuItem = page.getByTestId('submenu-item-1')
265
+ await submenuItem.focus()
266
+
267
+ // press ArrowLeft to close submenu
268
+ await page.keyboard.press('ArrowLeft')
269
+ await page.waitForTimeout(300)
270
+
271
+ await expect(submenuContent).not.toBeVisible()
272
+
273
+ // focus should return to submenu trigger in parent
274
+ await expect(submenuTrigger).toBeFocused()
275
+ })
276
+
277
+ test('tab key does not navigate within menu', async ({ page }) => {
278
+ await page.waitForLoadState('networkidle')
279
+
280
+ const trigger = page.getByTestId('menu-trigger')
281
+ await trigger.click()
282
+ await page.waitForTimeout(300)
283
+
284
+ const menuContent = page.getByTestId('menu-content')
285
+ await expect(menuContent).toBeVisible()
286
+
287
+ const firstItem = page.getByTestId('menu-item-1')
288
+ await firstItem.focus()
289
+ await expect(firstItem).toBeFocused()
290
+
291
+ // press Tab - menu should close (standard menu behavior)
292
+ await page.keyboard.press('Tab')
293
+ await page.waitForTimeout(300)
294
+
295
+ // menu behavior varies - some close on Tab, some trap focus
296
+ // the key is that Tab doesn't navigate between items like ArrowDown does
297
+ })
298
+
299
+ test('space key opens submenu when focused on submenu trigger', async ({ page }) => {
300
+ await page.waitForLoadState('networkidle')
301
+
302
+ const trigger = page.getByTestId('menu-trigger')
303
+ await trigger.focus()
304
+ await page.keyboard.press('Enter')
305
+ await page.waitForTimeout(300)
306
+
307
+ const menuContent = page.getByTestId('menu-content')
308
+ await expect(menuContent).toBeVisible()
309
+
310
+ // navigate to submenu trigger
311
+ const submenuTrigger = page.getByTestId('submenu-trigger')
312
+ await submenuTrigger.focus()
313
+ await expect(submenuTrigger).toBeFocused()
314
+
315
+ // press Space to open submenu
316
+ await page.keyboard.press('Space')
317
+ await page.waitForTimeout(300)
318
+
319
+ const submenuContent = page.getByTestId('submenu-content')
320
+ await expect(submenuContent).toBeVisible()
321
+ })
322
+
323
+ test('enter key opens submenu when focused on submenu trigger', async ({ page }) => {
324
+ await page.waitForLoadState('networkidle')
325
+
326
+ const trigger = page.getByTestId('menu-trigger')
327
+ await trigger.focus()
328
+ await page.keyboard.press('Enter')
329
+ await page.waitForTimeout(300)
330
+
331
+ const menuContent = page.getByTestId('menu-content')
332
+ await expect(menuContent).toBeVisible()
333
+
334
+ // navigate to submenu trigger
335
+ const submenuTrigger = page.getByTestId('submenu-trigger')
336
+ await submenuTrigger.focus()
337
+ await expect(submenuTrigger).toBeFocused()
338
+
339
+ // press Enter to open submenu
340
+ await page.keyboard.press('Enter')
341
+ await page.waitForTimeout(300)
342
+
343
+ const submenuContent = page.getByTestId('submenu-content')
344
+ await expect(submenuContent).toBeVisible()
345
+ })
346
+ })
@@ -0,0 +1,57 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { getBoundingRect, setupPage } from './test-utils'
3
+
4
+ test.describe('Menu animatePosition', () => {
5
+ test.beforeEach(async ({ page }) => {
6
+ await setupPage(page, {
7
+ name: 'MenuAnimatePositionCase',
8
+ type: 'useCase',
9
+ waitExtra: true,
10
+ })
11
+ })
12
+
13
+ test('content appears near the trigger that opened it', async ({ page }) => {
14
+ const triggerLeft = page.getByTestId('trigger-left')
15
+ await triggerLeft.click()
16
+ await page.waitForTimeout(400)
17
+
18
+ const content = page.getByTestId('menu-content')
19
+ await expect(content).toBeVisible()
20
+
21
+ const triggerBox = await getBoundingRect(page, '[data-testid="trigger-left"]')
22
+ const contentBox = await getBoundingRect(page, '[data-testid="menu-content"]')
23
+ expect(triggerBox).not.toBeNull()
24
+ expect(contentBox).not.toBeNull()
25
+
26
+ // content should be horizontally aligned near the left trigger
27
+ expect(Math.abs(contentBox!.x - triggerBox!.x)).toBeLessThan(50)
28
+ })
29
+
30
+ test('content has transition style when animatePosition is set', async ({ page }) => {
31
+ const triggerLeft = page.getByTestId('trigger-left')
32
+ await triggerLeft.click()
33
+ await page.waitForTimeout(400)
34
+
35
+ const content = page.getByTestId('menu-content')
36
+ await expect(content).toBeVisible()
37
+
38
+ // check that the content element (or its popper wrapper) has a CSS transition
39
+ const hasTransition = await content.evaluate((el) => {
40
+ let node: Element | null = el
41
+ while (node) {
42
+ const style = getComputedStyle(node)
43
+ if (
44
+ style.transition &&
45
+ style.transition !== 'none' &&
46
+ style.transition !== 'all 0s ease 0s'
47
+ ) {
48
+ return true
49
+ }
50
+ node = node.parentElement
51
+ }
52
+ return false
53
+ })
54
+
55
+ expect(hasTransition).toBe(true)
56
+ })
57
+ })
@@ -0,0 +1,71 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ /**
4
+ * Test for Menu/Popover arrow visibility with AnimatePresence
5
+ * Issue: When arrow is wrapped in AnimatePresence, Motion driver applies opacity: 0
6
+ * that doesn't animate back to opacity: 1
7
+ */
8
+ test.describe('Menu Arrow with AnimatePresence', () => {
9
+ test('popover arrow is visible when wrapped in AnimatePresence', async ({ page }) => {
10
+ await page.goto('/?test=MenuArrowAnimatePresenceCase')
11
+ await page.waitForTimeout(500)
12
+
13
+ // open the popover
14
+ const trigger = page.getByTestId('popover-trigger')
15
+ await trigger.click()
16
+ await page.waitForTimeout(500)
17
+
18
+ // find the arrow elements
19
+ const arrowOuter = page.locator('[class*="PopperArrowOuter"]').first()
20
+ const arrowInner = arrowOuter
21
+ .locator('[class*="PopoverArrow"], [class*="PopperArrow"]')
22
+ .first()
23
+
24
+ // verify outer arrow exists and is visible
25
+ await expect(arrowOuter).toBeVisible()
26
+
27
+ // get inner arrow computed opacity - this is the critical check
28
+ const innerOpacity = await arrowInner.evaluate((el) => {
29
+ return getComputedStyle(el).opacity
30
+ })
31
+
32
+ // inner arrow should have opacity 1, not 0
33
+ expect(Number.parseFloat(innerOpacity)).toBeGreaterThan(0.5)
34
+
35
+ // check inline style doesn't have opacity: 0
36
+ const inlineStyle = await arrowInner.getAttribute('style')
37
+ console.log('Arrow inline style:', inlineStyle)
38
+
39
+ // the bug causes inline style to contain "opacity: 0"
40
+ if (inlineStyle) {
41
+ expect(inlineStyle).not.toContain('opacity: 0')
42
+ }
43
+
44
+ // verify arrow is actually visible by checking bounding box
45
+ const arrowBox = await arrowOuter.boundingBox()
46
+ expect(arrowBox).not.toBeNull()
47
+ expect(arrowBox!.width).toBeGreaterThan(0)
48
+ expect(arrowBox!.height).toBeGreaterThan(0)
49
+ })
50
+
51
+ test('menu arrow is visible without AnimatePresence', async ({ page }) => {
52
+ await page.goto('/?test=MenuArrowAnimatePresenceCase')
53
+ await page.waitForTimeout(500)
54
+
55
+ // open the menu
56
+ const trigger = page.getByTestId('menu-trigger')
57
+ await trigger.click()
58
+ await page.waitForTimeout(500)
59
+
60
+ // find the arrow
61
+ const arrowOuter = page.locator('[class*="PopperArrowOuter"]').first()
62
+
63
+ // verify arrow exists and is visible
64
+ await expect(arrowOuter).toBeVisible()
65
+
66
+ const arrowBox = await arrowOuter.boundingBox()
67
+ expect(arrowBox).not.toBeNull()
68
+ expect(arrowBox!.width).toBeGreaterThan(0)
69
+ expect(arrowBox!.height).toBeGreaterThan(0)
70
+ })
71
+ })
@@ -0,0 +1,16 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ test.beforeEach(async ({ page }) => {
4
+ await page.goto('/?test=MenuAsChildPositionCase')
5
+ })
6
+
7
+ test('Menu.Trigger asChild does not leak position static class to child', async ({
8
+ page,
9
+ }) => {
10
+ const menuTrigger = page.locator('[data-testid="menu-trigger-button"]')
11
+ await expect(menuTrigger).toBeVisible()
12
+
13
+ // should not have _pos-static class leaked from View defaults via asChild
14
+ const className = await menuTrigger.getAttribute('class')
15
+ expect(className).not.toContain('_pos-static')
16
+ })
@@ -0,0 +1,54 @@
1
+ import { expect, test } from '@playwright/test'
2
+ import { setupPage } from './test-utils'
3
+
4
+ test.describe('Menu Auto Resize', () => {
5
+ test('menu resizes to fit in small viewport', async ({ page }) => {
6
+ // set a very small viewport height
7
+ await page.setViewportSize({ width: 400, height: 300 })
8
+
9
+ await setupPage(page, { name: 'MenuAutoResizeCase', type: 'useCase' })
10
+ await page.waitForLoadState('networkidle')
11
+
12
+ const trigger = page.getByTestId('menu-trigger')
13
+ await trigger.click()
14
+ await page.waitForTimeout(300)
15
+
16
+ const menuContent = page.getByTestId('menu-content')
17
+ await expect(menuContent).toBeVisible()
18
+
19
+ // get menu content bounding box
20
+ const boundingBox = await menuContent.boundingBox()
21
+ const viewportSize = page.viewportSize()
22
+
23
+ expect(boundingBox).not.toBeNull()
24
+ expect(viewportSize).not.toBeNull()
25
+
26
+ if (boundingBox && viewportSize) {
27
+ // menu should NOT extend beyond viewport top
28
+ expect(boundingBox.y).toBeGreaterThanOrEqual(0)
29
+ // menu should NOT extend beyond viewport bottom
30
+ expect(boundingBox.y + boundingBox.height).toBeLessThanOrEqual(viewportSize.height)
31
+ }
32
+ })
33
+
34
+ test('menu scroll view uses available height CSS variable', async ({ page }) => {
35
+ await page.setViewportSize({ width: 400, height: 300 })
36
+
37
+ await setupPage(page, { name: 'MenuAutoResizeCase', type: 'useCase' })
38
+ await page.waitForLoadState('networkidle')
39
+
40
+ const trigger = page.getByTestId('menu-trigger')
41
+ await trigger.click()
42
+ await page.waitForTimeout(300)
43
+
44
+ const menuScrollView = page.getByTestId('menu-scroll-view')
45
+ await expect(menuScrollView).toBeVisible()
46
+
47
+ // the scroll view should be scrollable (content exceeds available height)
48
+ const isScrollable = await menuScrollView.evaluate((el) => {
49
+ return el.scrollHeight > el.clientHeight
50
+ })
51
+
52
+ expect(isScrollable).toBe(true)
53
+ })
54
+ })