@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,270 @@
1
+ import { Menu } from '@hanzogui/menu'
2
+ import { Button, styled, YStack } from '@hanzo/gui'
3
+
4
+ // the actual pattern the user is using - styled() with styles object
5
+ // this creates a styled component where the pseudo styles should override the variant defaults
6
+ const menuItemStyleForStyled = {
7
+ // no unstyled: true - relying on custom pseudo styles
8
+ gap: '$2.5',
9
+ px: '$2',
10
+ height: 36,
11
+ alignItems: 'center',
12
+ cursor: 'default',
13
+ flexDirection: 'row',
14
+ borderRadius: '$2',
15
+ backgroundColor: 'rgba(0,0,0,0)',
16
+ hoverStyle: {
17
+ backgroundColor: 'rgb(0, 0, 255)',
18
+ },
19
+ pressStyle: {
20
+ backgroundColor: 'rgb(0, 255, 0)',
21
+ },
22
+ focusStyle: {
23
+ backgroundColor: 'rgb(255, 0, 0)',
24
+ },
25
+ } as const
26
+
27
+ const menuItemStyleForStyledWithUnstyled = {
28
+ ...menuItemStyleForStyled,
29
+ unstyled: true,
30
+ } as const
31
+
32
+ // styled component WITHOUT unstyled - should use custom pseudo styles
33
+ const StyledMenuItem = styled(Menu.Item, menuItemStyleForStyled)
34
+
35
+ // styled component WITH unstyled - should use custom pseudo styles
36
+ const StyledMenuItemWithUnstyled = styled(Menu.Item, menuItemStyleForStyledWithUnstyled)
37
+
38
+ // simulates the user's pattern - spreading a style object that includes both
39
+ // base styles and pseudo styles, and expects pseudo styles to override defaults
40
+ const menuItemStyle = {
41
+ // note: no unstyled: true here - this is the bug scenario
42
+ gap: '$2.5',
43
+ px: '$2',
44
+ height: 36,
45
+ alignItems: 'center',
46
+ cursor: 'default',
47
+ flexDirection: 'row',
48
+ borderRadius: '$2',
49
+ backgroundColor: 'rgba(0,0,0,0)',
50
+ hoverStyle: {
51
+ backgroundColor: 'rgb(0, 0, 255)',
52
+ },
53
+ pressStyle: {
54
+ backgroundColor: 'rgb(0, 255, 0)',
55
+ },
56
+ focusStyle: {
57
+ backgroundColor: 'rgb(255, 0, 0)',
58
+ },
59
+ } as const
60
+
61
+ const menuItemStyleWithUnstyled = {
62
+ ...menuItemStyle,
63
+ unstyled: true,
64
+ } as const
65
+
66
+ // user's actual pattern with shorthands
67
+ const menuItemStyleWithShorthands = {
68
+ // no unstyled: true
69
+ gap: '$2.5',
70
+ px: '$2',
71
+ height: 36,
72
+ alignItems: 'center',
73
+ cursor: 'default',
74
+ flexDirection: 'row',
75
+ borderRadius: '$2',
76
+ bg: 'rgba(0,0,0,0)',
77
+ hoverStyle: {
78
+ bg: 'rgb(0, 0, 255)',
79
+ },
80
+ pressStyle: {
81
+ bg: 'rgb(0, 255, 0)',
82
+ },
83
+ focusStyle: {
84
+ bg: 'rgb(255, 0, 0)',
85
+ },
86
+ } as const
87
+
88
+ const menuItemStyleWithShorthandsUnstyled = {
89
+ ...menuItemStyleWithShorthands,
90
+ unstyled: true,
91
+ } as const
92
+
93
+ /**
94
+ * Menu Item Pseudo Style Override Test Case
95
+ *
96
+ * Tests that user-provided pseudo styles (focusStyle, pressStyle, hoverStyle)
97
+ * override the default variant pseudo styles when unstyled is NOT set.
98
+ *
99
+ * Bug: When unstyled is not true, the variant's default pseudo styles were
100
+ * overriding user-provided pseudo styles due to style importance merging issues.
101
+ */
102
+ export function MenuItemPseudoOverrideCase() {
103
+ return (
104
+ <YStack padding="$4" gap="$4">
105
+ {/* Test 1: Spread style object WITHOUT unstyled - should still use custom pseudos */}
106
+ <Menu placement="bottom-start" offset={8}>
107
+ <Menu.Trigger asChild>
108
+ <Button data-testid="spread-trigger" size="$4">
109
+ Open Menu (Spread Style)
110
+ </Button>
111
+ </Menu.Trigger>
112
+
113
+ <Menu.Portal>
114
+ <Menu.Content data-testid="spread-content">
115
+ <Menu.Item key="item-1" data-testid="spread-item" {...menuItemStyle}>
116
+ <Menu.ItemTitle>Spread Style Item</Menu.ItemTitle>
117
+ </Menu.Item>
118
+ </Menu.Content>
119
+ </Menu.Portal>
120
+ </Menu>
121
+
122
+ {/* Test 2: Spread style object WITH unstyled - works as expected */}
123
+ <Menu placement="bottom-start" offset={8}>
124
+ <Menu.Trigger asChild>
125
+ <Button data-testid="spread-unstyled-trigger" size="$4">
126
+ Open Unstyled Menu (Spread)
127
+ </Button>
128
+ </Menu.Trigger>
129
+
130
+ <Menu.Portal>
131
+ <Menu.Content data-testid="spread-unstyled-content">
132
+ <Menu.Item
133
+ key="item-1"
134
+ data-testid="spread-unstyled-item"
135
+ {...menuItemStyleWithUnstyled}
136
+ >
137
+ <Menu.ItemTitle>Spread Unstyled Item</Menu.ItemTitle>
138
+ </Menu.Item>
139
+ </Menu.Content>
140
+ </Menu.Portal>
141
+ </Menu>
142
+
143
+ {/* Test 3: Direct props - custom pseudo styles WITHOUT unstyled */}
144
+ <Menu placement="bottom-start" offset={8}>
145
+ <Menu.Trigger asChild>
146
+ <Button data-testid="custom-trigger" size="$4">
147
+ Open Menu (Direct Props)
148
+ </Button>
149
+ </Menu.Trigger>
150
+
151
+ <Menu.Portal>
152
+ <Menu.Content data-testid="custom-content">
153
+ <Menu.Item
154
+ key="item-1"
155
+ data-testid="custom-item"
156
+ focusStyle={{ backgroundColor: 'rgb(255, 0, 0)' }}
157
+ pressStyle={{ backgroundColor: 'rgb(0, 255, 0)' }}
158
+ hoverStyle={{ backgroundColor: 'rgb(0, 0, 255)' }}
159
+ >
160
+ <Menu.ItemTitle>Custom Pseudo Item</Menu.ItemTitle>
161
+ </Menu.Item>
162
+ <Menu.Item key="item-2" data-testid="default-item">
163
+ <Menu.ItemTitle>Default Item</Menu.ItemTitle>
164
+ </Menu.Item>
165
+ </Menu.Content>
166
+ </Menu.Portal>
167
+ </Menu>
168
+
169
+ {/* Test 4: With unstyled=true and custom pseudo styles - for comparison */}
170
+ <Menu placement="bottom-start" offset={8}>
171
+ <Menu.Trigger asChild>
172
+ <Button data-testid="unstyled-trigger" size="$4">
173
+ Open Unstyled Menu
174
+ </Button>
175
+ </Menu.Trigger>
176
+
177
+ <Menu.Portal>
178
+ <Menu.Content data-testid="unstyled-content">
179
+ <Menu.Item
180
+ key="item-1"
181
+ data-testid="unstyled-item"
182
+ unstyled
183
+ focusStyle={{ backgroundColor: 'rgb(255, 0, 0)' }}
184
+ pressStyle={{ backgroundColor: 'rgb(0, 255, 0)' }}
185
+ hoverStyle={{ backgroundColor: 'rgb(0, 0, 255)' }}
186
+ >
187
+ <Menu.ItemTitle>Unstyled Custom Pseudo Item</Menu.ItemTitle>
188
+ </Menu.Item>
189
+ </Menu.Content>
190
+ </Menu.Portal>
191
+ </Menu>
192
+
193
+ {/* Test 5: Shorthands in pseudo styles WITHOUT unstyled */}
194
+ <Menu placement="bottom-start" offset={8}>
195
+ <Menu.Trigger asChild>
196
+ <Button data-testid="shorthand-trigger" size="$4">
197
+ Open Menu (Shorthands)
198
+ </Button>
199
+ </Menu.Trigger>
200
+
201
+ <Menu.Portal>
202
+ <Menu.Content data-testid="shorthand-content">
203
+ <Menu.Item
204
+ key="item-1"
205
+ data-testid="shorthand-item"
206
+ {...menuItemStyleWithShorthands}
207
+ >
208
+ <Menu.ItemTitle>Shorthand Style Item</Menu.ItemTitle>
209
+ </Menu.Item>
210
+ </Menu.Content>
211
+ </Menu.Portal>
212
+ </Menu>
213
+
214
+ {/* Test 6: Shorthands in pseudo styles WITH unstyled */}
215
+ <Menu placement="bottom-start" offset={8}>
216
+ <Menu.Trigger asChild>
217
+ <Button data-testid="shorthand-unstyled-trigger" size="$4">
218
+ Open Unstyled Menu (Shorthands)
219
+ </Button>
220
+ </Menu.Trigger>
221
+
222
+ <Menu.Portal>
223
+ <Menu.Content data-testid="shorthand-unstyled-content">
224
+ <Menu.Item
225
+ key="item-1"
226
+ data-testid="shorthand-unstyled-item"
227
+ {...menuItemStyleWithShorthandsUnstyled}
228
+ >
229
+ <Menu.ItemTitle>Shorthand Unstyled Item</Menu.ItemTitle>
230
+ </Menu.Item>
231
+ </Menu.Content>
232
+ </Menu.Portal>
233
+ </Menu>
234
+
235
+ {/* Test 7: styled() component WITHOUT unstyled - the actual user pattern */}
236
+ <Menu placement="bottom-start" offset={8}>
237
+ <Menu.Trigger asChild>
238
+ <Button data-testid="styled-trigger" size="$4">
239
+ Open Menu (styled() Component)
240
+ </Button>
241
+ </Menu.Trigger>
242
+
243
+ <Menu.Portal>
244
+ <Menu.Content data-testid="styled-content">
245
+ <StyledMenuItem key="item-1" data-testid="styled-item">
246
+ <Menu.ItemTitle>styled() Item</Menu.ItemTitle>
247
+ </StyledMenuItem>
248
+ </Menu.Content>
249
+ </Menu.Portal>
250
+ </Menu>
251
+
252
+ {/* Test 8: styled() component WITH unstyled */}
253
+ <Menu placement="bottom-start" offset={8}>
254
+ <Menu.Trigger asChild>
255
+ <Button data-testid="styled-unstyled-trigger" size="$4">
256
+ Open Menu (styled() + unstyled)
257
+ </Button>
258
+ </Menu.Trigger>
259
+
260
+ <Menu.Portal>
261
+ <Menu.Content data-testid="styled-unstyled-content">
262
+ <StyledMenuItemWithUnstyled key="item-1" data-testid="styled-unstyled-item">
263
+ <Menu.ItemTitle>styled() + unstyled Item</Menu.ItemTitle>
264
+ </StyledMenuItemWithUnstyled>
265
+ </Menu.Content>
266
+ </Menu.Portal>
267
+ </Menu>
268
+ </YStack>
269
+ )
270
+ }
@@ -0,0 +1,47 @@
1
+ import { Menu } from '@hanzogui/menu'
2
+ import { Button, Text, XStack, YStack } from '@hanzo/gui'
3
+
4
+ export function MenuMultiTriggerCase() {
5
+ return (
6
+ <YStack padding="$4" gap="$4">
7
+ <Text>Test: 3 triggers sharing one Menu content</Text>
8
+
9
+ <Menu placement="bottom-start">
10
+ <XStack gap="$4">
11
+ <Menu.Trigger asChild>
12
+ <Button data-testid="trigger-a">Trigger A</Button>
13
+ </Menu.Trigger>
14
+
15
+ <Menu.Trigger asChild>
16
+ <Button data-testid="trigger-b">Trigger B</Button>
17
+ </Menu.Trigger>
18
+
19
+ <Menu.Trigger asChild>
20
+ <Button data-testid="trigger-c">Trigger C</Button>
21
+ </Menu.Trigger>
22
+ </XStack>
23
+
24
+ <Menu.Portal>
25
+ <Menu.Content
26
+ data-testid="menu-content"
27
+ p="$2"
28
+ minWidth={180}
29
+ borderWidth={1}
30
+ borderColor="$borderColor"
31
+ elevation="$3"
32
+ >
33
+ <Menu.Item data-testid="menu-item-1" key="i1" textValue="Item One">
34
+ <Menu.ItemTitle>Item One</Menu.ItemTitle>
35
+ </Menu.Item>
36
+ <Menu.Item data-testid="menu-item-2" key="i2" textValue="Item Two">
37
+ <Menu.ItemTitle>Item Two</Menu.ItemTitle>
38
+ </Menu.Item>
39
+ <Menu.Item data-testid="menu-item-3" key="i3" textValue="Item Three">
40
+ <Menu.ItemTitle>Item Three</Menu.ItemTitle>
41
+ </Menu.Item>
42
+ </Menu.Content>
43
+ </Menu.Portal>
44
+ </Menu>
45
+ </YStack>
46
+ )
47
+ }
@@ -0,0 +1,60 @@
1
+ import { Menu } from '@hanzogui/menu'
2
+ import { Button, YStack } from '@hanzo/gui'
3
+
4
+ /**
5
+ * Menu overflow test case
6
+ * Tests:
7
+ * - Menu content becomes scrollable when items exceed max height
8
+ * - Menu does not overflow the page
9
+ * - Scrollbars are hidden
10
+ * - Menu items remain keyboard navigable while scrolling
11
+ */
12
+
13
+ const ITEM_COUNT = 30
14
+
15
+ export function MenuOverflowCase() {
16
+ return (
17
+ <YStack
18
+ data-testid="container"
19
+ $platform-web={{
20
+ height: '100vh',
21
+ }}
22
+ justifyContent="flex-end"
23
+ padding="$4"
24
+ >
25
+ {/* position menu trigger near bottom of page to test overflow behavior */}
26
+ <Menu placement="top-start" stayInFrame allowFlip>
27
+ <Menu.Trigger asChild>
28
+ <Button data-testid="menu-trigger" size="$4">
29
+ Open Long Menu
30
+ </Button>
31
+ </Menu.Trigger>
32
+
33
+ <Menu.Portal zIndex={100}>
34
+ <Menu.Content
35
+ data-testid="menu-content"
36
+ minWidth={200}
37
+ borderWidth={1}
38
+ borderColor="$borderColor"
39
+ elevation="$3"
40
+ padding="$2"
41
+ >
42
+ <Menu.ScrollView data-testid="menu-scroll-view">
43
+ {Array.from({ length: ITEM_COUNT }).map((_, i) => (
44
+ <Menu.Item
45
+ data-testid={`menu-item-${i + 1}`}
46
+ key={`item-${i}`}
47
+ textValue={`Item ${i + 1}`}
48
+ style={{ paddingHorizontal: 8, paddingVertical: 6, borderRadius: 4 }}
49
+ focusStyle={{ backgroundColor: '$backgroundHover' }}
50
+ >
51
+ <Menu.ItemTitle>Item {i + 1}</Menu.ItemTitle>
52
+ </Menu.Item>
53
+ ))}
54
+ </Menu.ScrollView>
55
+ </Menu.Content>
56
+ </Menu.Portal>
57
+ </Menu>
58
+ </YStack>
59
+ )
60
+ }
@@ -0,0 +1,223 @@
1
+ import { ChevronRight } from '@hanzogui/lucide-icons-2'
2
+ import { Menu } from '@hanzogui/menu'
3
+ import React from 'react'
4
+ import { Button, H1, Paragraph, Text, YStack } from '@hanzo/gui'
5
+
6
+ /**
7
+ * Menu Submenu Test Case
8
+ *
9
+ * Tests the safePolygon behavior when moving from a submenu trigger to submenu content.
10
+ * The polygon should allow the mouse to move diagonally from trigger to content without
11
+ * closing the submenu.
12
+ */
13
+ export function MenuSubCase() {
14
+ const [subMenuOpen, setSubMenuOpen] = React.useState(false)
15
+ const [nestedSubOpen, setNestedSubOpen] = React.useState(false)
16
+ const [lastAction, setLastAction] = React.useState<string>('')
17
+
18
+ return (
19
+ <YStack gap="$4" padding="$4" maxWidth={800} margin="auto">
20
+ <YStack gap="$2">
21
+ <H1>Menu Submenu SafePolygon Test</H1>
22
+ <Paragraph>
23
+ This tests that the safePolygon logic works correctly when hovering from a
24
+ submenu trigger to submenu content. Move your mouse diagonally from the trigger
25
+ to the submenu - it should not close.
26
+ </Paragraph>
27
+ <Text id="last-action" color="$color10">
28
+ Last action: {lastAction || 'None'}
29
+ </Text>
30
+ <Text id="submenu-state" color={subMenuOpen ? '$green10' : '$red10'}>
31
+ Submenu: {subMenuOpen ? 'Open' : 'Closed'}
32
+ </Text>
33
+ </YStack>
34
+
35
+ <YStack alignItems="flex-start" gap="$4">
36
+ <Menu allowFlip placement="bottom-start" offset={8}>
37
+ <Menu.Trigger asChild>
38
+ <Button id="menu-trigger" size="$4">
39
+ Open Menu
40
+ </Button>
41
+ </Menu.Trigger>
42
+
43
+ <Menu.Portal zIndex={100}>
44
+ <Menu.Content
45
+ id="menu-content"
46
+ p="$2"
47
+ minW={220}
48
+ borderWidth={1}
49
+ borderColor="$borderColor"
50
+ bg="$background"
51
+ elevation="$3"
52
+ >
53
+ <Menu.Item
54
+ key="menu-item-1"
55
+ id="menu-item-1"
56
+ onSelect={() => setLastAction('Item 1 selected')}
57
+ style={{ paddingHorizontal: 12, paddingVertical: 8, borderRadius: 4 }}
58
+ focusStyle={{ bg: '$backgroundHover' }}
59
+ >
60
+ <Menu.ItemTitle>Item 1 (above trigger)</Menu.ItemTitle>
61
+ </Menu.Item>
62
+
63
+ <Menu.Item
64
+ key="menu-item-2"
65
+ id="menu-item-2"
66
+ onSelect={() => setLastAction('Item 2 selected')}
67
+ style={{ paddingHorizontal: 12, paddingVertical: 8, borderRadius: 4 }}
68
+ focusStyle={{ bg: '$backgroundHover' }}
69
+ >
70
+ <Menu.ItemTitle>Item 2 (above trigger)</Menu.ItemTitle>
71
+ </Menu.Item>
72
+
73
+ <Menu.Sub
74
+ open={subMenuOpen}
75
+ placement="right-start"
76
+ onOpenChange={(open) => {
77
+ setSubMenuOpen(open)
78
+ setLastAction(`Submenu ${open ? 'opened' : 'closed'}`)
79
+ }}
80
+ >
81
+ <Menu.SubTrigger
82
+ key="submenu-trigger"
83
+ id="submenu-trigger"
84
+ justify="space-between"
85
+ textValue="Actions"
86
+ style={{ paddingHorizontal: 12, paddingVertical: 8, borderRadius: 4 }}
87
+ focusStyle={{ bg: '$backgroundHover' }}
88
+ >
89
+ <Menu.ItemTitle>Actions (submenu)</Menu.ItemTitle>
90
+ <ChevronRight size={14} color="$color10" />
91
+ </Menu.SubTrigger>
92
+
93
+ <Menu.Portal zIndex={200}>
94
+ <Menu.SubContent
95
+ id="submenu-content"
96
+ bg="$background"
97
+ p="$2"
98
+ minW={180}
99
+ borderWidth={1}
100
+ borderColor="$borderColor"
101
+ elevation="$3"
102
+ >
103
+ <Menu.Item
104
+ key="submenu-item-1"
105
+ id="submenu-item-1"
106
+ onSelect={() => setLastAction('Sub Item 1 selected')}
107
+ style={{
108
+ paddingHorizontal: 12,
109
+ paddingVertical: 8,
110
+ borderRadius: 4,
111
+ }}
112
+ focusStyle={{ bg: '$backgroundHover' }}
113
+ >
114
+ <Menu.ItemTitle>Sub Item 1</Menu.ItemTitle>
115
+ </Menu.Item>
116
+
117
+ <Menu.Item
118
+ key="submenu-item-2"
119
+ id="submenu-item-2"
120
+ onSelect={() => setLastAction('Sub Item 2 selected')}
121
+ style={{
122
+ paddingHorizontal: 12,
123
+ paddingVertical: 8,
124
+ borderRadius: 4,
125
+ }}
126
+ focusStyle={{ bg: '$backgroundHover' }}
127
+ >
128
+ <Menu.ItemTitle>Sub Item 2</Menu.ItemTitle>
129
+ </Menu.Item>
130
+
131
+ <Menu.Sub
132
+ open={nestedSubOpen}
133
+ placement="right-start"
134
+ onOpenChange={(open) => {
135
+ setNestedSubOpen(open)
136
+ setLastAction(`Nested submenu ${open ? 'opened' : 'closed'}`)
137
+ }}
138
+ >
139
+ <Menu.SubTrigger
140
+ key="nested-submenu-trigger"
141
+ id="nested-submenu-trigger"
142
+ justify="space-between"
143
+ textValue="More"
144
+ style={{
145
+ paddingHorizontal: 12,
146
+ paddingVertical: 8,
147
+ borderRadius: 4,
148
+ }}
149
+ focusStyle={{ bg: '$backgroundHover' }}
150
+ >
151
+ <Menu.ItemTitle>More (nested)</Menu.ItemTitle>
152
+ <ChevronRight size={14} color="$color10" />
153
+ </Menu.SubTrigger>
154
+
155
+ <Menu.Portal zIndex={300}>
156
+ <Menu.SubContent
157
+ id="nested-submenu-content"
158
+ bg="$background"
159
+ p="$2"
160
+ minW={160}
161
+ borderWidth={1}
162
+ borderColor="$borderColor"
163
+ elevation="$3"
164
+ >
165
+ <Menu.Item
166
+ key="nested-submenu-item-1"
167
+ id="nested-submenu-item-1"
168
+ onSelect={() => setLastAction('Nested Item 1 selected')}
169
+ style={{
170
+ paddingHorizontal: 12,
171
+ paddingVertical: 8,
172
+ borderRadius: 4,
173
+ }}
174
+ focusStyle={{ bg: '$backgroundHover' }}
175
+ >
176
+ <Menu.ItemTitle>Nested Item 1</Menu.ItemTitle>
177
+ </Menu.Item>
178
+ <Menu.Item
179
+ key="nested-submenu-item-2"
180
+ id="nested-submenu-item-2"
181
+ onSelect={() => setLastAction('Nested Item 2 selected')}
182
+ style={{
183
+ paddingHorizontal: 12,
184
+ paddingVertical: 8,
185
+ borderRadius: 4,
186
+ }}
187
+ focusStyle={{ bg: '$backgroundHover' }}
188
+ >
189
+ <Menu.ItemTitle>Nested Item 2</Menu.ItemTitle>
190
+ </Menu.Item>
191
+ </Menu.SubContent>
192
+ </Menu.Portal>
193
+ </Menu.Sub>
194
+ </Menu.SubContent>
195
+ </Menu.Portal>
196
+ </Menu.Sub>
197
+
198
+ <Menu.Item
199
+ key="menu-item-3"
200
+ id="menu-item-3"
201
+ onSelect={() => setLastAction('Item 3 selected')}
202
+ style={{ paddingHorizontal: 12, paddingVertical: 8, borderRadius: 4 }}
203
+ focusStyle={{ bg: '$backgroundHover' }}
204
+ >
205
+ <Menu.ItemTitle>Item 3 (below trigger)</Menu.ItemTitle>
206
+ </Menu.Item>
207
+
208
+ <Menu.Item
209
+ key="menu-item-4"
210
+ id="menu-item-4"
211
+ onSelect={() => setLastAction('Item 4 selected')}
212
+ style={{ paddingHorizontal: 12, paddingVertical: 8, borderRadius: 4 }}
213
+ focusStyle={{ bg: '$backgroundHover' }}
214
+ >
215
+ <Menu.ItemTitle>Item 4 (below trigger)</Menu.ItemTitle>
216
+ </Menu.Item>
217
+ </Menu.Content>
218
+ </Menu.Portal>
219
+ </Menu>
220
+ </YStack>
221
+ </YStack>
222
+ )
223
+ }