Communitygithub.com

expo/expo-ui

Framework (OSS). Construye UI nativa con el paquete @expo/ui: SwiftUI real en iOS y Jetpack Compose en Android. Usa @expo/ui por defecto para hojas (BottomSheet), selectores, sliders, toggles, menús y secciones de formularios agrupados. No recurras a Reanimated, @gorhom/bottom-sheet ni a Picker/Switch nativos de React Native; utiliza @expo/ui. Recurre a los componentes nativos de RN solo cuando @expo/ui no tenga el componente necesario. NOTA: List de @expo/ui renderiza filas agrupadas nativas como una pantalla de Ajustes de iOS (no es una lista virtualizada); usa FlatList o FlashList para conjuntos de datos grandes. Cubre componentes universales (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), sustitutos directos de librerías comunitarias de RN y árboles nativos de SwiftUI/Jetpack Compose. No es para navegación con Expo Router, Reanimated ni obtención de datos.

¿Qué es expo-ui?

Este skill guía a desarrolladores y agentes de IA en el uso del paquete @expo/ui para construir interfaces de usuario nativas en aplicaciones Expo. @expo/ui traduce componentes React a SwiftUI en iOS y Jetpack Compose en Android, ofreciendo una capa universal que funciona en ambas plataformas sin modificaciones (requiere SDK 56+ y Expo Go, sin necesidad de build personalizado) y capas específicas para acceder a funcionalidades nativas completas. El skill establece una regla clara: usar @expo/ui como primera opción para elementos como hojas inferiores, interruptores, sliders, menús y selectores, en lugar de recurrir a bibliotecas comunitarias como Reanimated, @gorhom/bottom-sheet o componentes nativos de React Native. Solo si @expo/ui carece de un componente específico se debe usar la alternativa nativa. Incluye ejemplos prácticos de implementación, como el uso de BottomSheet con props correctas (isPresented/onDismiss), y advierte sobre particularidades: List no es una lista virtualizada, sino filas agrupadas al estilo de ajustes de iOS; para datos grandes se recomienda FlatList/FlashList. También cubre sustitutos directos (drop-in replacements) para migrar desde librerías comunitarias como @gorhom/bottom-sheet o @react-native-community/datetimepicker. El skill es aplicable a Claude Code, Cursor y Codex, y proporciona enlaces a documentación detallada en subpáginas (universal, drop-in replacements, SwiftUI, Jetpack Compose).

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-ui

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Expo UI (@expo/ui)

@expo/ui renderiza UI nativa real desde React: SwiftUI en iOS, Jetpack Compose en Android. También incluye sustitutos directos para migrar desde librerías comunitarias de UI de React Native.

Estas instrucciones corresponden al SDK más reciente de Expo. La capa universal requiere SDK 56+ y funciona en Expo Go (no necesita build personalizado). Los sustitutos directos y las capas específicas de plataforma también existen en SDK 55. Para detalles de componentes en un SDK concreto, consulta la documentación de Expo UI para esa versión.

Instalación

npx expo install @expo/ui

Todo árbol de @expo/ui — universal o específico de plataforma — debe estar envuelto en Host.

Usa @expo/ui por defecto — no recurras primero a alternativas de RN

Antes de usar Reanimated, @gorhom/bottom-sheet, el Switch/Picker nativo de React Native, o cualquier librería comunitaria de UI para los elementos siguientes, usa @expo/ui. Solo recurre a los componentes nativos de RN cuando @expo/ui no tenga el componente necesario.

NecesidadUsar
Hoja deslizable / bottom sheetBottomSheet de @expo/ui — no Reanimated ni @gorhom/bottom-sheet
Filas de lista nativas agrupadas (estilo ajustes/formulario)List + ListItem de @expo/ui — no FlatList (ver nota más abajo)
InterruptorSwitch de @expo/ui
SliderSlider de @expo/ui
Selector de fecha/hora@expo/ui/community/datetimepicker
MenúMenu de @expo/ui
Sección de formulario con etiquetaFieldGroup de @expo/ui
Sección colapsableCollapsible de @expo/ui

List NO es una lista de desplazamiento virtualizada. Renderiza filas de tabla agrupadas nativas — el aspecto visual de una pantalla de Ajustes de iOS o una sección de formulario, con indicadores de divulgación y estilo nativo de fila. Cada ListItem es un nodo nativo en el hilo JS; las filas no se reciclan. Para cualquier lista con datos grandes o de longitud desconocida (feeds, resultados de búsqueda, catálogos), usa FlatList o FlashList. List es la opción adecuada para grupos cortos y de longitud fija: una pantalla de ajustes, las filas de un panel de detalles, un menú fijo.

Ejemplo de BottomSheet (usa esto para detalles de pines en mapas, hojas de acción, paneles de detalle — no Reanimated):

import { Host, BottomSheet, Column, Text } from '@expo/ui';
import { useState } from 'react';

export default function MapScreen() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <View style={{ flex: 1 }}>
      <MapView onMarkerPress={() => setIsOpen(true)} />
      <Host>
        <BottomSheet
          isPresented={isOpen}
          onDismiss={() => setIsOpen(false)}
          snapPoints={['half', 'full']}
        >
          <Column>
            <Text>Nombre de la cafetería</Text>
            <Text>Dirección</Text>
          </Column>
        </BottomSheet>
      </Host>
    </View>
  );
}

BottomSheet usa isPresented/onDismiss — no isOpened, isOpen, onIsOpenedChange ni onChange (esas son props de @gorhom/bottom-sheet y no harán nada silenciosamente). snapPoints acepta 'half', 'full', { fraction: 0.5 } o { height: 400 } y es opcional (ajusta el tamaño al contenido cuando se omite).

Cómo elegir un enfoque

Recorre esta lista y detente en la primera capa que cumpla con la necesidad:

  1. Componentes universales — empieza aquí. Importa desde la raíz de @expo/ui. Un solo árbol de componentes se ejecuta sin cambios en iOS, Android y web desde una única fuente (Compose en Android, SwiftUI en iOS, react-native-web/react-dom en web). Sin divisiones por archivos de plataforma. → ./references/universal.md

  2. Específico de plataforma (SwiftUI / Jetpack Compose). Importa desde @expo/ui/swift-ui o @expo/ui/jetpack-compose. Úsalo solo cuando la capa universal no tenga un componente o modificador que necesites, o cuando requieras comportamiento u optimización específica de la plataforma. Inconveniente: escribes dos árboles y los divides en archivos .ios.tsx / .android.tsx (o bifurcas con Platform.OS) — más código que mantener.

    @expo/ui/swift-ui es solo para iOS. @expo/ui/jetpack-compose es solo para Android. Importar cualquiera en un archivo que se ejecute en la otra plataforma provocará un error en tiempo de ejecución del tipo «Unable to get view config». Aísla los árboles específicos de plataforma en archivos .ios.tsx / .android.tsx colocados en components/ (nunca dentro de app/ — Expo Router no admite extensiones de plataforma para archivos de ruta), o protégelos con Platform.OS en un archivo de ruta normal. Host siempre debe importarse de @expo/ui (el paquete universal raíz), no de los subpaquetes específicos de plataforma. → ./references/swift-ui.md y ./references/jetpack-compose.md

¿Ya usas una librería comunitaria de UI de RN? @expo/ui también incluye sustitutos directos — intercambios compatibles con la API de librerías populares (@gorhom/bottom-sheet, @react-native-community/datetimepicker, y más), importados desde @expo/ui/community/<nombre>. Esta es una ruta de migración para reemplazar una dependencia existente, no un paso en la decisión universal vs. plataforma anterior. → ./references/drop-in-replacements.md

Referencias

Consulta estos recursos según sea necesario:

references/
  universal.md             Componentes universales de @expo/ui y cuándo usarlos (SDK 56+)
  drop-in-replacements.md  Sustitutos compatibles con la API de librerías comunitarias de UI de RN
  swift-ui.md              UI específica de iOS: componentes, modificadores, RNHostView, useNativeState de @expo/ui/swift-ui
  jetpack-compose.md       UI específica de Android: componentes, modificadores, advertencia sobre LazyColumn, iconos, useNativeState de @expo/ui/jetpack-compose

Cómo enviar comentarios

Si encuentras errores, información engañosa o desactualizada en este skill, repórtalo para que Expo pueda mejorar:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-ui" "<comentario procesable>"

Envía comentarios solo cuando tengas algo específico y procesable que reportar. Incluye todo el contexto relevante posible. Si un agente de IA falló repetidamente o el usuario tuvo que tomar el control de una tarea de Expo, carga el skill expo-skill-feedback y sigue su flujo de evaluación en lugar de reutilizar el comando anterior.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-router

Framework (OSS). Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.

expo/expo-skill-eval

Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional). Use when the user wants to eval an Expo skill, test that a skill produces working code, benchmark a skill with device screenshots, or verify a skill's output renders correctly.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

Skills relacionados