Loading...
Loading...
Framework (OSS). Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, animations, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill.
npx skill4agent add expo/skills expo-native-uiexpo-routerreferences/
animations.md Reanimated: entering, exiting, layout, scroll-driven, gestures
controls.md Native iOS: Switch, Slider, SegmentedControl, DateTimePicker, Picker
gradients.md CSS gradients via experimental_backgroundImage (New Arch only)
icons.md SF Symbols via expo-image (sf: source), names, animations, weights
media.md Camera, audio, video, and file saving
storage.md SQLite, AsyncStorage, SecureStore
visual-effects.md Blur (expo-blur) and liquid glass (expo-glass-effect)
webgpu-three.md 3D graphics, games, GPU visualizations with WebGPU and Three.jsnpx expo run:iosnpx expo run:androidnpx expo startnpx expo run:ios/androideas buildmodules/@bacons/apple-targetsapp.jsonexpo-*comment-card.tsxexpo-audioexpo-avexpo-videoexpo-avexpo-imagesource="sf:name"expo-symbols@expo/vector-iconsreact-native-safe-area-contextprocess.env.EXPO_OSPlatform.OSReact.useReact.useContextexpo-imageimgexpo-glass-effectColorexpo-routerPlatformColor@react-navigation/*expo-router/react-navigation@react-navigation/native/core/elements/routers<ScrollView contentInsetAdjustmentBehavior="automatic" /><SafeAreaView>contentInsetAdjustmentBehavior="automatic"useWindowDimensionsDimensions.get()<Switch />@react-native-community/datetimepickercontentInsetAdjustmentBehavior="automatic"ScrollView<Text selectable />contentInsetAdjustmentBehavior="automatic"{ borderCurve: 'continuous' }contentContainerStyleColorexpo-routerPlatformColorColor.ios.*Color.android.material.*Color.android.dynamic.*colors.web.tsColorPlatform.selectdefaulttheme/colors.tscolors// theme/colors.ts
import { Platform } from "react-native";
import { Color } from "expo-router";
export const colors = {
label: Platform.select({
ios: Color.ios.label,
android: Color.android.dynamic.onSurface,
default: "#000000",
})!,
secondaryLabel: Platform.select({
ios: Color.ios.secondaryLabel,
android: Color.android.dynamic.onSurfaceVariant,
default: "#3c3c43",
})!,
separator: Platform.select({
ios: Color.ios.separator,
android: Color.android.dynamic.outlineVariant,
default: "#c6c6c8",
})!,
systemBackground: Platform.select({
ios: Color.ios.systemBackground,
android: Color.android.dynamic.surface,
default: "#ffffff",
})!,
systemBlue: Platform.select({
ios: Color.ios.systemBlue,
android: Color.android.dynamic.primary,
default: "#007aff",
})!,
};import { colors } from "@/theme/colors";
<View style={{ backgroundColor: colors.systemBackground }}>
<Text style={{ color: colors.label }}>Title</Text>
</View>;useColorScheme()ColorPlatformColorreferences/animations.mdPlatform.select({...})!string | OpaqueColorValueColorValuestring | OpaqueColorValuestringtintColorexpo-imagecolors.label as stringselectable<Text/>{ fontVariant: 'tabular-nums' }boxShadow<View style={{ boxShadow: "0 1px 2px rgba(0, 0, 0, 0.05)" }} />