Interfaz de usuario multiplataforma y móvil · Nuevo recurso

Sistema de diseño gluestack UI.

Crea una lista de verificación para un kit de campo con los creadores reales de Button e Input de gluestack, colores semánticos explícitos de v5 y el código fuente completo de React Native Web. Examina la validación, las acciones de teclado, la identidad estable de los elementos y el progreso de preparación calculado localmente.

Guía de OpenDesign8 capítulos33 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz del sistema de diseño gluestack UI

Añade un elemento único, márcalo como empacado y revisa el progreso derivado.

Prepara un equipo de campoAbrir ejemplo completo
Comportamiento real de @gluestack-ui/core 5.0.15 mediante React Native Web 0.21.3. El diseño del equipo de campo, las ilustraciones y el modelo de estado son obra original de OpenDesign. Este ejemplo de navegador con creadores directos usa estilos explícitos; no es el conjunto de componentes de NativeWind/Uniwind generado por CLI y no se ha probado en iOS ni Android. · Referencia de implementación
02

Referencia de diseño del sistema de diseño gluestack UI

La referencia distingue los colores claros documentados de v5 del API de los creadores del núcleo instalado. Los creadores directos no aplican automáticamente el tema de CLI. La vista previa asigna explícitamente los colores indicados a estilos originales y usa un contorno de foco personalizado más marcado. La geometría y las ilustraciones son decisiones de la aplicación.

Funciones de color claro documentadas de v5

Fuente
Nombre / ReglaValor / ConfiguraciónUso
background#ffffff Lienzo de página.
foreground#0a0a0a Texto normal legible.
card#ffffff Superficie de tarjeta.
popover#ffffff Superficie de superposición; en este ejemplo no se usa ningún menú emergente.
popover-foreground#0a0a0a Texto combinado con la superficie de superposición.
muted#f5f5f5 Superficies de apoyo, incluido el panel de ilustración original.
muted-foreground#737373 Descripciones secundarias y detalles de estado.
destructive#e7000b Aviso de entrada no válida; el error también se muestra como texto.
border#e5e5e5 Contornos de tarjetas y separadores de listas.
input#e5e5e5 Borde del campo en reposo.
ring#d4d4d4 Color de anillo predeterminado documentado; este estudio utiliza un contorno de foco original más marcado, #737373.
primary#171717 Superficie de acción principal y relleno de progreso.
primary-foreground#fafafa Texto combinado con la superficie de acción oscura.
secondary#f5f5f5 Superficie de acción de menor énfasis.
secondary-foreground#171717 Texto combinado con superficies secundarias.
accent#f7f7f7 Rol de superficie de acento adicional.
accent-foreground#343434 Texto combinado con el rol de acento.

Factoría Button principal y estados

Fuente
Nombre / ReglaValor / ConfiguraciónUso
createButton{ Root, Text, Group, Spinner, Icon }Proporciona los componentes host reales; el creador añade comportamiento, no un tema completo.
Button.TextText hostMantiene el texto del botón dentro del contexto de su estado.
Button.GroupGroup hostSubcomponente generado para agrupar botones; no se utiliza en esta composición.
Button.SpinnerSpinner hostIndicador de carga generado; no lo muestres para una acción local instantánea.
Button.IconIcon hostSubcomponente de icono generado; la vista previa utiliza acciones con texto explícito.
Button isDisabledbooleanDesactiva la acción de pulsación real, no solo su apariencia.
Button data-focus-visibletrue / falseEl CSS original aplica un contorno visible al recibir el foco del teclado.
Button data-activetrue / falseExpone un estado de interacción pulsado para aplicar estilos.

Contexto Core Input y propiedades del componente host

Fuente
Nombre / ReglaValor / ConfiguraciónUso
createInput{ Root, Icon, Slot, Input }Crea el contexto del campo y sus espacios relacionados.
Input.InputTextInput hostEl componente de entrada de texto que devuelve el creador.
isInvalidInput root booleanPropaga el contexto no válido y aria-invalid al campo.
isRequiredInput root booleanPropaga el estado obligatorio; la aplicación sigue validando el recorte del texto por su cuenta.
value / onChangeTextControlled TextInput propsMantén el texto en edición en el estado de React.
onSubmitEditingTextInput callbackAñade un elemento al pulsar Enter en este ejemplo para navegador.
maxLength60 in the original studyUn límite de TextInput elegido para esta aplicación; no es un valor predeterminado de gluestack.
aria-labelItem name in the original studyAsigna un nombre al campo de entrada, además de una etiqueta visible.
03

Guía completa del sistema de diseño gluestack UI

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-gluestack-ui.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Versiones, creadores y componentes generados del sistema de diseño gluestack UI

Elige la ruta de implementación adecuada

gluestack tiene más de una capa. El flujo de instalación estándar genera componentes con estilos directamente en una aplicación. En cambio, este estudio importa createButton y createInput del paquete core instalado y proporciona componentes host de React Native Web. La distinción importa: instalar solo core no proporciona las variantes de botón generadas ni el tema completo.

De esta guía de OpenDesign

El ejemplo en ejecución fija las versiones core 5.0.15 y utils 5.0.6. Sus adaptadores de React Native Web son componentes reales, mientras que la estructura y el estado son originales. Consulta la documentación de instalación si vas a crear una aplicación completa con Expo o Next.js; utiliza los archivos completos de aquí para reproducir este estudio específico para navegador.

Colores semánticos y estilos explícitos del sistema de diseño gluestack UI

Asigna los roles antes de elegir los adornos

La página utiliza un lienzo blanco con una acción principal oscura, áreas de apoyo atenuadas y roles de borde visibles. Estos valores se toman de la paleta clara v5 documentada y luego se asignan explícitamente mediante estilos de React Native y CSS estándar. Ningún proveedor de ejecución los aplica de forma implícita.

Un campo no válido combina un contorno de color destructivo con una explicación legible y la devolución del foco. El contorno de foco original es más oscuro que el anillo predeterminado documentado, por lo que la hoja de estilos identifica esa elección en lugar de presentarla como un token de la biblioteca.

Planifica las migraciones con cuidado

No combines a ciegas los ejemplos antiguos que utilizan nombres de paleta numéricos con el vocabulario semántico de v5. Revisa la configuración generada instalada y la guía de actualización antes de sustituir el nombre de un token. Un estudio directo del creador puede mostrar el comportamiento, pero no demuestra que la migración completa de una aplicación haya terminado.

Composición de Button y acciones de teclado del sistema de diseño gluestack UI

Proporciona todos los componentes host al creador

createButton recibe Pressable, Text, View, ActivityIndicator y un componente host para iconos. Devuelve Button y los subcomponentes Text, Group, Spinner e Icon. El ejemplo completo utiliza Button.Text en vez de colocar una cadena sin más en la raíz del elemento interactivo.

Empaquetar es una transición de estado síncrona, así que no se inventa un indicador de carga ni una demora de guardado. Cada acción incluye el nombre del elemento en su etiqueta accesible. La acción visible cambia entre «Empaquetar elemento» y «Desempaquetar» para que el siguiente efecto siga siendo claro.

Comprueba el comportamiento renderizado

  1. Ve con Tab a una acción «Empaquetar elemento» y pulsa Espacio.
  2. Confirma que cambian tanto el estado de empaquetado textual como el valor de progreso.
  3. Utiliza «Desempaquetar» y confirma que el mismo elemento permanece en la lista.
  4. Inspecciona el contorno de foco; no des por hecho que pasar el ratón por encima demuestra que se admite el teclado.

Contexto de Input y validación completa del sistema de diseño gluestack UI

Valida el valor que se va a guardar

El campo permanece controlado mediante value y onChangeText. Al añadir, primero se eliminan los espacios sobrantes del texto en edición; si queda vacío, se rechaza. Después, se comparan los nombres sin distinguir mayúsculas de minúsculas. Si se rechaza el valor, permanece en el campo para que el usuario pueda corregirlo.

El elemento raíz recibe isInvalid e isRequired; el campo real recibe la etiqueta, la referencia a la descripción y una ref para restaurar el foco. La validación corresponde a la aplicación: marcar un campo core como obligatorio no crea la regla para nombres duplicados.

Gestiona todos los estados visibles del campo

  • Inicial: el campo está vacío y se muestra el indicador de longitud.
  • No válido: la explicación aparece en una alerta y el campo recibe el foco.
  • Edición: el texto de error obsoleto desaparece cuando el usuario modifica el texto en edición.
  • Aceptado: aparece una nueva fila sin empaquetar, se vacía el campo y el estado anuncia que se añadió el elemento.

Identidad estable y progreso derivado del sistema de diseño gluestack UI

Guarda los elementos y calcula el resumen

Cada elemento tiene un id numérico estable, un nombre y una marca de empaquetado. Una ref proporciona los nuevos id; el nombre mostrado no se utiliza como clave de React. Los cambios se aplican por id, así que dos actualizaciones independientes de la interfaz no pueden modificar por accidente otra fila.

El numerador del progreso se calcula a partir de las marcas de empaquetado y el denominador, a partir de la lista actual. Añadir un elemento sin empaquetar puede reducir el porcentaje sin perder los elementos ya empaquetados. Es la consecuencia correcta de ampliar la lista de comprobación, no un error de animación.

Haz que restablecer sea una acción local explícita

Restablecer recupera los tres elementos de ejemplo, borra el texto en edición y el error, reinicia el siguiente id y anuncia el resultado. Al volver a cargar la página también se inicia con el estado de ejemplo. Esta vista previa no utiliza servidor, sincronización de cuentas ni almacenamiento persistente.

Diseño adaptable e ilustración original del sistema de diseño gluestack UI

Distingue el comportamiento del componente host de la geometría de la página

En la composición de escritorio, la lista de verificación aparece junto al panel de entrada. A 700 píxeles, pasa a una sola columna. Las filas se ajustan cuando es necesario y los nombres largos de los elementos se dividen dentro del espacio disponible; una acción de ancho fijo no debería desplazar todo el documento horizontalmente.

El cuaderno y el lápiz son formas originales de CSS, no recursos de marca de gluestack copiados. El radio de 14 píxeles de la tarjeta, el espaciado de 24 píxeles entre paneles y la escala de los encabezados son decisiones del estudio. La tabla de referencia los mantiene separados de los roles de color documentados.

Accesibilidad y alcance de plataforma del sistema de diseño de gluestack UI

Prueba el entorno representado realmente

La vista previa renderiza React Native Web y se ha comprobado en un navegador. No demuestra el comportamiento nativo en iOS o Android. Una aplicación de Expo debe verificar por separado los objetivos táctiles, los anuncios del lector de pantalla, la adaptación al teclado y la navegación de la plataforma.

El elemento de progreso incluye su nombre, valor mínimo, valor máximo y valor actual. Un estado dinámico describe las acciones completadas sin apartar al lector de la lista de verificación. Si se rechaza el formulario, conserva el borrador y devuelve el foco al campo. Estas responsabilidades de la aplicación se añaden al comportamiento nativo básico.

Compilación completa y límites de dependencias del sistema de diseño de gluestack UI

Reproduce este estudio exacto

Guarda los cuatro archivos de Ejemplos de componentes en un mismo directorio e instala los paquetes fijados que se indican a continuación. La compilación asigna react-native a react-native-web, ya que las importaciones del núcleo usan internamente el nombre del módulo nativo. El código fuente importa directamente los hosts de navegador y nunca carga un entorno de ejecución de Expo.

La instalación reducida de paquetes usa la resolución heredada de dependencias entre pares para este subconjunto exclusivo de web. No es una recomendación para una aplicación nativa completa: la biblioteca completa declara dependencias entre pares para integraciones nativas, SVG y de áreas seguras que este paquete de dos creadores no utiliza. Añade las dependencias entre pares adecuadas al ampliar el conjunto de componentes.

Cambia una capa a la vez

  1. Compila los archivos sin modificar y verifica las acciones de añadir, rechazar duplicados, guardar y restablecer.
  2. Cambia el diseño original o el contenido de la aplicación sin alterar la configuración de los creadores.
  3. Si adoptas componentes de NativeWind generados, sustituye el estilo y la configuración del proveedor como un paso de integración independiente.
  4. Después del cambio, vuelve a comprobar el comportamiento del teclado y las plataformas de destino reales.

Ejemplos de componentes del sistema de diseño de gluestack UI

app.jsx — estudio completo del componente principal

Configuración real de los creadores y modelo de estado completo de la lista de verificación.

jsx
import React,{useState,useRef} from 'react';
import{createRoot}from'react-dom/client';
import{Pressable,Text,View,TextInput,ActivityIndicator}from'react-native-web';
import{createButton}from'@gluestack-ui/core/button/creator';
import{createInput}from'@gluestack-ui/core/input/creator';
const Button=createButton({Root:Pressable,Text,Group:View,Spinner:ActivityIndicator,Icon:View});
const Input=createInput({Root:View,Input:TextInput,Slot:Pressable,Icon:View});
const seed=[{id:1,name:'Sketchbook',packed:true},{id:2,name:'Pencil roll',packed:false},{id:3,name:'Water bottle',packed:false}];
function App(){const[items,setItems]=useState(seed),[name,setName]=useState(''),[error,setError]=useState(''),[message,setMessage]=useState('Pack each item when it is ready.');const next=useRef(4),field=useRef(null);const count=items.filter(x=>x.packed).length;
function add(){const v=name.trim();if(!v||items.some(x=>x.name.toLowerCase()===v.toLowerCase())){setError(!v?'Enter the name of an item.':'That item is already in the kit.');field.current.focus();return}setItems([...items,{id:next.current++,name:v,packed:false}]);setName('');setError('');setMessage(v+' added to this local kit.')}
return <main><header><p className="eyebrow">GLUESTACK UI / CORE COMPONENT STUDY</p><h1>A small kit.<br/>A clearer start.</h1><p className="intro">Prepare a drawing kit with actual gluestack core Button and Input creators. Your checklist stays in this browser session.</p></header><div className="layout"><section className="panel"><div className="sectionhead"><h2>Your field kit</h2><span className="badge">{count} of {items.length} packed</span></div><div className="meter" role="progressbar" aria-label="Packed items" aria-valuemin={0} aria-valuemax={items.length} aria-valuenow={count}><i style={{width:100*count/items.length+'%'}}/></div><ul>{items.map(item=><li key={item.id}><div><strong>{item.name}</strong><span>{item.packed?'Packed and ready':'Still to pack'}</span></div><Button onPress={()=>{setItems(items.map(x=>x.id===item.id?{...x,packed:!x.packed}:x));setMessage(item.name+(item.packed?' marked to pack.':' marked packed.'))}} style={item.packed?styles.secondary:styles.primary} aria-label={(item.packed?'Unpack ':'Pack ')+item.name}><Button.Text style={{color:item.packed?'#171717':'#fafafa',fontSize:14,fontWeight:600}}>{item.packed?'Unpack':'Pack item'}</Button.Text></Button></li>)}</ul><p className="status" role="status">{message}</p></section><aside className="panel"><div className="drawing" aria-hidden="true"><span className="book">FIELD<br/>NOTES</span><i className="pencil"/></div><h2>Add one useful thing</h2><label htmlFor="kit-name">Item name</label><Input isInvalid={!!error} isRequired style={styles.input}><Input.Input id="kit-name" aria-label="Item name" aria-describedby={error?'kit-error':'kit-hint'} ref={field} value={name} onChangeText={v=>{setName(v);setError('')}} onSubmitEditing={add} maxLength={60} style={styles.field}/></Input><p id="kit-hint" className="hint">Use a short, unique name. Maximum 60 characters.</p>{error&&<p id="kit-error" className="error" role="alert">{error}</p>}<Button onPress={add} style={styles.primary}><Button.Text style={styles.primaryText}>Add to kit</Button.Text></Button><Button onPress={()=>{setItems(seed);setName('');setError('');setMessage('Example kit restored.');next.current=4}} style={styles.reset}><Button.Text style={{color:'#737373',fontSize:14}}>Reset example kit</Button.Text></Button></aside></div><p className="scope">Native @gluestack-ui/core 5.0.15 behavior rendered through React Native Web. Original OpenDesign layout and artwork; explicitly styled with documented v5 light color roles. This is a web-only study, not an Expo build or the CLI-generated NativeWind component set.</p></main>}
const styles={primary:{backgroundColor:'#171717',paddingVertical:12,paddingHorizontal:16,borderRadius:8,alignItems:'center',justifyContent:'center'},secondary:{backgroundColor:'#f5f5f5',paddingVertical:12,paddingHorizontal:16,borderRadius:8,alignItems:'center',justifyContent:'center'},primaryText:{color:'#fafafa',fontSize:14,fontWeight:600},input:{borderWidth:1,borderColor:'#e5e5e5',borderRadius:8,marginTop:8},field:{padding:12,fontSize:16,color:'#0a0a0a',outlineStyle:'none'},reset:{paddingVertical:16,alignItems:'center'}};
createRoot(document.getElementById('app')).render(<App/>);

Referencia de código

style.css — diseño original y roles claros explícitos

Estructura adaptable completa, ilustraciones, contornos de estado y tratamiento del foco del navegador.

css
*{box-sizing:border-box}body{margin:0;background:#fff;color:#0a0a0a;font-family:Arial,sans-serif}main{max-width:1100px;margin:auto;padding:40px}.eyebrow{font-size:12px;letter-spacing:.12em;font-weight:700}.intro{max-width:62ch;color:#737373;line-height:1.6}h1{font-size:52px;line-height:1.03;letter-spacing:-.045em;margin:24px 0}h2{font-size:22px;margin:0 0 20px}.layout{display:grid;grid-template-columns:1.35fr 1fr;gap:24px;margin-top:32px}.panel{border:1px solid #e5e5e5;border-radius:14px;padding:24px;min-width:0}.sectionhead{display:flex;gap:12px;justify-content:space-between;align-items:baseline;flex-wrap:wrap}.badge{font-size:12px;background:#f5f5f5;padding:6px 10px;border-radius:20px}.meter{height:6px;border-radius:8px;background:#f5f5f5;margin:6px 0 24px;overflow:hidden}.meter i{display:block;height:100%;background:#171717}ul{list-style:none;padding:0;margin:0}li{display:flex;gap:16px;align-items:center;justify-content:space-between;padding:20px 0;border-bottom:1px solid #e5e5e5}li>div:first-child{min-width:0;flex:1}li strong{display:block;font-size:16px;overflow-wrap:anywhere}li span{display:block;font-size:13px;color:#737373;margin-top:8px}.status{font-size:14px;line-height:1.6;margin-top:24px}.hint,.scope{font-size:12px;line-height:1.6;color:#737373}.scope{margin-top:28px}.error{font-size:14px;color:#e7000b;line-height:1.5}label{font-size:14px}.drawing{height:130px;background:#f5f5f5;border-radius:8px;display:flex;align-items:center;justify-content:center;gap:24px;margin-bottom:24px}.book{display:block;background:#171717;color:#fafafa;border-left:5px solid #737373;width:80px;height:96px;padding:22px 12px;font-size:12px;line-height:1.6;transform:rotate(-8deg)}.pencil{height:90px;width:8px;background:#a3a3a3;transform:rotate(14deg)}[data-focus-visible=true]{outline:3px solid #737373;outline-offset:3px}[data-invalid=true]{border-color:#e7000b!important}input:focus-visible{outline:2px solid #737373!important;outline-offset:3px}@media(max-width:700px){main{padding:20px}h1{font-size:40px}.layout{grid-template-columns:1fr}.panel{padding:20px}li{gap:12px;flex-wrap:wrap}li>div:first-child{flex-basis:120px}}

Referencia de código

build.mjs — configuración completa del empaquetador web

El alias de importación nativa es necesario aunque app.jsx importe sus hosts desde React Native Web.

javascript
import { build } from 'esbuild';
await build({entryPoints:['app.jsx'],bundle:true,minify:true,outfile:'app.js',alias:{'react-native':'react-native-web'},resolveExtensions:['.web.js','.js','.jsx','.ts','.tsx','.json'],loader:{'.js':'jsx'},define:{'process.env.NODE_ENV':'"production"'}});

Referencia de código

index.html — entrada completa del navegador

Mantén este archivo junto a style.css y al app.js generado.

HTML
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>gluestack field kit</title><link rel="stylesheet" href="style.css"></head><body><div id="app"></div><script src="app.js"></script></body></html>

Referencia de código

04

Configuración del agente del sistema de diseño de gluestack UI

Punto de partida para la implementación

Guarda primero los cuatro archivos completos. Esta configuración se limita al subconjunto de navegador mostrado y no inicializa NativeWind, Uniwind, Expo ni un registro de componentes generado.

sh
npm init -y
npm install [email protected] [email protected] [email protected] @gluestack-ui/[email protected] @gluestack-ui/[email protected] [email protected] --legacy-peer-deps
node build.mjs
python3 -m http.server 8000
# Open http://localhost:8000/

Una instrucción para tu proyecto

Instrucción para el agente
Implementa el estudio completo en navegador de gluestack core 5.0.15 para el kit de campo mediante createButton/createInput y hosts de React Native Web. Conserva los ID estables, el texto controlado del borrador, la validación de espacios y duplicados, la restauración del foco, el recuento derivado de elementos guardados, el restablecimiento local y la asignación explícita de roles claros de v5. Mantén separadas las decisiones de diseño originales de los valores predeterminados de la biblioteca. No afirmes que se ha probado en móviles nativos ni que hay persistencia en el backend.
05

Fuentes y alcance del sistema de diseño de gluestack UI

Comportamiento real de @gluestack-ui/core 5.0.15 a través de React Native Web 0.21.3. El diseño del kit de campo, las ilustraciones y el modelo de estado son obra original de OpenDesign. Este ejemplo de navegador con creadores directos usa estilos explícitos; no es el conjunto de componentes NativeWind/Uniwind generado por CLI y no se ha probado en iOS ni Android.