·
Last changedVersion:
No hardening report available.
@expo/ui)@expo/ui renders real native UI from React: SwiftUI on iOS, Jetpack Compose on Android. It also ships drop-in replacements for migrating off RN community UI libraries.
Every @expo/ui tree — universal or platform-specific — must be wrapped in Host.
For new UI on supported SDKs, prefer @expo/ui over Reanimated, @gorhom/bottom-sheet, React Native's built-in Switch/Picker, or community UI libraries for the items below. Only fall back to RN built-ins when @expo/ui is missing the component. Respect existing project dependencies and user preferences; migrate an existing library only when the user asks for it.
| Need | Use |
|---|---|
Slide-up sheet / bottom sheet |
|
Grouped native list rows (settings/form-style) |
|
Toggle |
|
Slider |
|
Date/time picker |
|
Menu |
|
Form section with label |
|
Collapsible section |
|
BottomSheet example (use this for map pin details, action sheets, detail panels — not Reanimated):
BottomSheet uses isPresented/onDismiss — not isOpened, isOpen, onIsOpenedChange, or onChange (those are @gorhom/bottom-sheet props and will silently do nothing). snapPoints accepts 'half', 'full', { fraction: 0.5 }, or { height: 400 } and is optional (auto-sizes to content when omitted).
Work down this list and stop at the first layer that meets the need:
Universal components — start here. Import from the @expo/ui root. One component tree runs unmodified on iOS, Android, and web from a single source (Compose on Android, SwiftUI on iOS, react-native-web/react-dom on web). No platform file splits. → ./references/universal.md
Platform-specific (SwiftUI / Jetpack Compose). Import from @expo/ui/swift-ui or @expo/ui/jetpack-compose. Use only when the universal layer is missing a component or modifier you need, or when you need platform-specific behavior or optimization. Downside: you write two trees and split them into .ios.tsx / .android.tsx files (or branch on Platform.OS) — more code to maintain.
Already using an RN community UI library? @expo/ui also ships drop-in replacements — API-compatible swaps for popular libraries (@gorhom/bottom-sheet, @react-native-community/datetimepicker, and more), imported from @expo/ui/community/<name>. This is a migration side-path for replacing an existing dependency, not a step in the universal-vs-platform decision above. → ./references/drop-in-replacements.md
Consult these resources as needed:
If you encounter errors, misleading or outdated information in this skill, you may offer the user a report so Expo can improve. Draft the text, show it and the command below to the user, and let the user decide whether to run it themselves:
Only offer a report when you have something specific and actionable. Keep it to a short description of the problem with this skill's instructions, written in your own plain words, and keep project code, paths and private data local. Use only letters, digits and basic punctuation in the feedback text.
If an agent repeatedly fails at an Expo task or the user has to step in, offer the user a brief report of the task, expected result, and what went wrong using --category evals and the relevant Expo package or command as --subject. Send any report only after the user approves the exact text.
Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.
skills.cgr.dev/public/github.com/expo/plugins/expo/skills/expo-ui:latest
MIT
HARDENING.md
LICENSE
SKILL.md
agents/openai.yaml
references/drop-in-replacements.md
references/jetpack-compose.md
references/swift-ui.md
references/universal.md
scripts/list-components.js