Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Build performant React Native and Expo apps with best practices for lists, animations, and navigation
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
rules/ui-menus.md
1---2title: Use Native Menus for Dropdowns and Context Menus3impact: HIGH4impactDescription: native accessibility, platform-consistent UX5tags: user-interface, menus, context-menus, zeego, accessibility6---78## Use Native Menus for Dropdowns and Context Menus910Use native platform menus instead of custom JS implementations. Native menus11provide built-in accessibility, consistent platform UX, and better performance.12Use [zeego](https://zeego.dev) for cross-platform native menus.1314**Incorrect (custom JS menu):**1516```tsx17import { useState } from 'react'18import { View, Pressable, Text } from 'react-native'1920function MyMenu() {21const [open, setOpen] = useState(false)2223return (24<View>25<Pressable onPress={() => setOpen(!open)}>26<Text>Open Menu</Text>27</Pressable>28{open && (29<View style={{ position: 'absolute', top: 40 }}>30<Pressable onPress={() => console.log('edit')}>31<Text>Edit</Text>32</Pressable>33<Pressable onPress={() => console.log('delete')}>34<Text>Delete</Text>35</Pressable>36</View>37)}38</View>39)40}41```4243**Correct (native menu with zeego):**4445```tsx46import * as DropdownMenu from 'zeego/dropdown-menu'4748function MyMenu() {49return (50<DropdownMenu.Root>51<DropdownMenu.Trigger>52<Pressable>53<Text>Open Menu</Text>54</Pressable>55</DropdownMenu.Trigger>5657<DropdownMenu.Content>58<DropdownMenu.Item key='edit' onSelect={() => console.log('edit')}>59<DropdownMenu.ItemTitle>Edit</DropdownMenu.ItemTitle>60</DropdownMenu.Item>6162<DropdownMenu.Item63key='delete'64destructive65onSelect={() => console.log('delete')}66>67<DropdownMenu.ItemTitle>Delete</DropdownMenu.ItemTitle>68</DropdownMenu.Item>69</DropdownMenu.Content>70</DropdownMenu.Root>71)72}73```7475**Context menu (long-press):**7677```tsx78import * as ContextMenu from 'zeego/context-menu'7980function MyContextMenu() {81return (82<ContextMenu.Root>83<ContextMenu.Trigger>84<View style={{ padding: 20 }}>85<Text>Long press me</Text>86</View>87</ContextMenu.Trigger>8889<ContextMenu.Content>90<ContextMenu.Item key='copy' onSelect={() => console.log('copy')}>91<ContextMenu.ItemTitle>Copy</ContextMenu.ItemTitle>92</ContextMenu.Item>9394<ContextMenu.Item key='paste' onSelect={() => console.log('paste')}>95<ContextMenu.ItemTitle>Paste</ContextMenu.ItemTitle>96</ContextMenu.Item>97</ContextMenu.Content>98</ContextMenu.Root>99)100}101```102103**Checkbox items:**104105```tsx106import * as DropdownMenu from 'zeego/dropdown-menu'107108function SettingsMenu() {109const [notifications, setNotifications] = useState(true)110111return (112<DropdownMenu.Root>113<DropdownMenu.Trigger>114<Pressable>115<Text>Settings</Text>116</Pressable>117</DropdownMenu.Trigger>118119<DropdownMenu.Content>120<DropdownMenu.CheckboxItem121key='notifications'122value={notifications}123onValueChange={() => setNotifications((prev) => !prev)}124>125<DropdownMenu.ItemIndicator />126<DropdownMenu.ItemTitle>Notifications</DropdownMenu.ItemTitle>127</DropdownMenu.CheckboxItem>128</DropdownMenu.Content>129</DropdownMenu.Root>130)131}132```133134**Submenus:**135136```tsx137import * as DropdownMenu from 'zeego/dropdown-menu'138139function MenuWithSubmenu() {140return (141<DropdownMenu.Root>142<DropdownMenu.Trigger>143<Pressable>144<Text>Options</Text>145</Pressable>146</DropdownMenu.Trigger>147148<DropdownMenu.Content>149<DropdownMenu.Item key='home' onSelect={() => console.log('home')}>150<DropdownMenu.ItemTitle>Home</DropdownMenu.ItemTitle>151</DropdownMenu.Item>152153<DropdownMenu.Sub>154<DropdownMenu.SubTrigger key='more'>155<DropdownMenu.ItemTitle>More Options</DropdownMenu.ItemTitle>156</DropdownMenu.SubTrigger>157158<DropdownMenu.SubContent>159<DropdownMenu.Item key='settings'>160<DropdownMenu.ItemTitle>Settings</DropdownMenu.ItemTitle>161</DropdownMenu.Item>162163<DropdownMenu.Item key='help'>164<DropdownMenu.ItemTitle>Help</DropdownMenu.ItemTitle>165</DropdownMenu.Item>166</DropdownMenu.SubContent>167</DropdownMenu.Sub>168</DropdownMenu.Content>169</DropdownMenu.Root>170)171}172```173174Reference: [Zeego Documentation](https://zeego.dev/components/dropdown-menu)175