Interface multiplateforme et mobile · Nouvelle ressource

Système de design gluestack UI.

Créez une liste de préparation avec les véritables créateurs Button et Input de gluestack, les couleurs sémantiques explicites de la v5 et le code source complet de React Native Web. Examinez la validation, les actions au clavier, l’identité stable des éléments et le calcul local de la progression de préparation.

Guide OpenDesign8 chapitres33 entrées de référenceGuide de l’application d’origine
01

gluestack UI : aperçu de l’interface du système de design

Ajoutez un élément unique, marquez-le comme préparé et vérifiez la progression calculée.

Préparer un kit de terrainOuvrir l’exemple complet
Comportement réel de @gluestack-ui/core 5.0.15 via React Native Web 0.21.3. La mise en page, les illustrations et le modèle d’état du kit de terrain sont des créations originales de OpenDesign. Cet exemple de navigateur utilisant directement les fonctions de création repose sur des styles explicites ; il ne s’agit pas de l’ensemble de composants NativeWind/Uniwind généré par la CLI, et il n’a pas été testé sur iOS ou Android. · Référence de mise en œuvre
02

gluestack UI — Référence du système de design

Cette référence distingue les couleurs claires documentées en v5 du factory core installé API. Les factories directes n’appliquent pas automatiquement le thème de la CLI. L’aperçu associe explicitement les couleurs répertoriées aux styles d’origine et utilise un contour de focus personnalisé plus marqué. La géométrie et les illustrations relèvent de choix propres à l’application.

Rôles de couleur clairs documentés en v5

Source
Nom / règleValeur / configurationUtilisation
background#ffffff Fond de page.
foreground#0a0a0a Texte courant lisible.
card#ffffff Surface de carte.
popover#ffffff Surface superposée ; cette étude n’utilise aucun popover.
popover-foreground#0a0a0a Texte associé à la surface superposée.
muted#f5f5f5 Surfaces d’accompagnement, dont le panneau d’illustration d’origine.
muted-foreground#737373 Descriptions secondaires et détails d’état.
destructive#e7000b Indication d’erreur de saisie ; l’erreur est également affichée sous forme de texte.
border#e5e5e5 Contours des cartes et séparateurs de liste.
input#e5e5e5 Bordure du champ au repos.
ring#d4d4d4 Couleur de l’anneau par défaut documentée ; cette étude utilise un contour de focus d’origine plus marqué, en #737373.
primary#171717 Surface d’action principale et remplissage de la barre de progression.
primary-foreground#fafafa Texte associé à la surface d’action sombre.
secondary#f5f5f5 Surface d’action secondaire.
secondary-foreground#171717 Texte associé aux surfaces secondaires.
accent#f7f7f7 Rôle supplémentaire de surface d’accentuation.
accent-foreground#343434 Texte associé au rôle d’accentuation.

Factory Button de core et états

Source
Nom / règleValeur / configurationUtilisation
createButton{ Root, Text, Group, Spinner, Icon }Fournissez les composants hôtes réels ; la factory ajoute le comportement, pas un thème complet.
Button.TextText hostMaintient le texte du bouton dans le contexte de son état.
Button.GroupGroup hostSous-composant généré pour regrouper les boutons ; inutilisé dans cette mise en page.
Button.SpinnerSpinner hostIndicateur de chargement généré ; ne l’affichez pas pour une action locale instantanée.
Button.IconIcon hostSous-composant d’icône généré ; l’aperçu utilise des actions textuelles explicites.
Button isDisabledbooleanDésactive réellement l’action du bouton, et pas seulement son apparence.
Button data-focus-visibletrue / falseLe CSS d’origine affiche un contour visible lors de la navigation au clavier.
Button data-activetrue / falseExpose un état d’interaction enfoncé pour la mise en forme.

Contexte Input de core et propriétés des composants hôtes

Source
Nom / règleValeur / configurationUtilisation
createInput{ Root, Icon, Slot, Input }Crée le contexte du champ et les emplacements qui lui sont associés.
Input.InputTextInput hostLe composant de saisie de texte renvoyé par la factory.
isInvalidInput root booleanPropage le contexte invalide et aria-invalid au champ.
isRequiredInput root booleanPropage l’état requis ; l’application effectue toujours sa propre validation après suppression des espaces superflus.
value / onChangeTextControlled TextInput propsConservez le texte provisoire dans l’état React.
onSubmitEditingTextInput callbackAjoute un élément lorsque la touche Entrée est pressée dans cet exemple de navigateur.
maxLength60 in the original studyLimite de TextInput choisie pour cette application ; ce n’est pas une valeur par défaut de gluestack.
aria-labelItem name in the original studyDonne un nom au champ en complément d’un libellé visible.
03

gluestack UI — Guide complet du système de design

Un guide pratique pour choisir, appliquer et évaluer ce système dans une interface réelle.

DESIGN-gluestack-ui.md

Des conseils complets, un point de départ pour la mise en œuvre et des liens vers les sources.

Télécharger le guide

gluestack UI — Versions, factories et composants générés du système de design

Choisissez la méthode d’implémentation appropriée

gluestack comporte plusieurs couches. Le processus d’installation standard génère des composants stylisés dans une application. Cette étude importe plutôt createButton et createInput depuis le package core installé et leur fournit des composants hôtes React Native Web. Cette distinction est importante : l’installation de core seul ne fournit ni les variantes de boutons générées ni le thème complet.

Extrait de ce guide OpenDesign

L’exemple en cours d’exécution utilise core 5.0.15 et utils 5.0.6. Ses adaptateurs React Native Web sont de vrais composants, tandis que la structure et l’état sont propres à l’exemple. Consultez la documentation d’installation pour créer une application Expo ou Next.js complète ; utilisez les fichiers complets présentés ici pour reproduire cette étude spécifique dans un navigateur.

gluestack UI — Couleurs sémantiques et styles explicites du système de design

Associez les rôles avant de choisir les éléments décoratifs

La page utilise un fond blanc, une action principale sombre, des zones d’accompagnement atténuées et des rôles de bordure bien visibles. Ces valeurs sont reprises de la palette claire documentée en v5, puis attribuées explicitement au moyen des styles Native de React et de CSS classiques. Aucun fournisseur d’exécution ne les applique de manière implicite.

Un champ invalide associe un contour de couleur d’erreur à une explication lisible et rend le focus au champ. Le contour de focus d’origine est plus sombre que l’anneau par défaut documenté ; la feuille de style précise donc qu’il s’agit d’un choix propre à l’exemple, et non d’un jeton de la bibliothèque.

Procédez aux migrations avec méthode

Ne mélangez pas sans discernement les anciens exemples utilisant des noms de palette numériques avec le vocabulaire sémantique de la v5. Examinez la configuration générée installée et le guide de mise à niveau avant de remplacer le nom d’un jeton. Une étude avec des factories directes peut illustrer le comportement sans pour autant prouver que la migration complète d’une application est terminée.

gluestack UI — Composition des boutons et actions au clavier du système de design

Fournissez tous les composants hôtes à la factory

createButton reçoit Pressable, Text, View, ActivityIndicator et un composant hôte pour les icônes. Il renvoie Button ainsi que les sous-composants Text, Group, Spinner et Icon. L’exemple complet utilise Button.Text au lieu de placer une chaîne brute dans la racine pressable.

L’emballage est une transition d’état synchrone : aucun indicateur de chargement ni délai de sauvegarde n’est donc simulé. Chaque action inclut le nom de l’élément dans son libellé accessible. Le libellé visible alterne entre « Emballer l’élément » et « Déballer » afin que l’action suivante reste claire.

Vérifiez le comportement rendu

  1. Appuyez sur Tab jusqu’à une action « Emballer l’élément », puis sur Espace.
  2. Vérifiez que l’état textuel d’emballage et la valeur de progression changent.
  3. Utilisez « Déballer » et vérifiez que le même élément reste dans la liste.
  4. Examinez le contour de focus : un survol à la souris ne suffit pas à prouver la prise en charge du clavier.

gluestack UI — Contexte Input et validation complète du système de design

Validez la valeur qui sera enregistrée

Le champ reste contrôlé au moyen de value et onChangeText. Lors de l’ajout, le brouillon est d’abord débarrassé de ses espaces superflus ; si le résultat est vide, l’ajout est refusé, puis les noms sont comparés sans tenir compte de la casse. Une valeur refusée reste dans le champ afin que l’utilisateur puisse la corriger.

La racine reçoit isInvalid et isRequired ; le champ réel reçoit le libellé, la référence vers la description et une ref permettant de rétablir le focus. La validation relève de l’application : rendre un champ core obligatoire ne crée pas la règle qui interdit les doublons.

Gérez tous les états visibles du champ

  • Initial : le champ est vide et l’indication de longueur est visible.
  • Invalide : l’explication apparaît dans une alerte et le focus est placé sur le champ.
  • Modification : le texte d’erreur obsolète disparaît lorsque l’utilisateur modifie le brouillon.
  • Accepté : une nouvelle ligne non emballée apparaît, le champ est vidé et le statut confirme l’ajout.

gluestack UI — Identité stable et progression dérivée du système de design

Enregistrez les éléments, calculez le récapitulatif

Chaque élément possède un identifiant numérique stable, un nom et un indicateur d’emballage. Une ref fournit les nouveaux identifiants ; le nom affiché ne sert pas de clé React. Le basculement s’effectue par identifiant : deux mises à jour indépendantes de l’interface ne peuvent donc pas modifier par inadvertance une autre ligne.

Le numérateur de la progression est calculé à partir des indicateurs d’emballage et le dénominateur à partir de la liste actuelle. L’ajout d’un article non emballé peut faire baisser le pourcentage sans retirer les articles déjà emballés. C’est la conséquence normale d’une liste plus longue, et non une erreur d’animation.

Faire de la réinitialisation une action locale explicite

La réinitialisation restaure les trois articles d’exemple, efface le brouillon et l’erreur, réinitialise l’identifiant suivant et annonce le résultat. Un rechargement rétablit également l’état d’exemple. Cette prévisualisation ne repose sur aucun serveur, aucune synchronisation de compte ni aucun stockage persistant.

Système de design gluestack UI : mise en page responsive et illustrations originales

Distinguer le comportement de l’hôte de la géométrie de la page

Sur ordinateur, la liste de contrôle est placée à côté de son panneau de saisie. À 700 pixels, la mise en page passe sur une seule colonne. Les lignes passent à la ligne si nécessaire et les noms d’articles longs se coupent dans l’espace disponible ; une action à largeur fixe ne doit pas décaler toute la page horizontalement.

Le carnet et le crayon sont des formes originales de CSS, et non des ressources de marque gluestack copiées. Le rayon de 14 pixels des cartes, l’espacement de 24 pixels entre les panneaux et l’échelle des titres sont des choix propres à cette étude. Le tableau de référence les distingue des rôles de couleur documentés.

Système de design gluestack UI : accessibilité du navigateur et périmètre des plateformes

Tester l’environnement réellement représenté

La prévisualisation utilise React Native Web et a été vérifiée dans un navigateur. Elle ne permet pas d’établir le comportement natif sur iOS ou Android. Une application Expo doit vérifier séparément les zones tactiles, les annonces du lecteur d’écran, l’évitement du clavier et la navigation propre à chaque plateforme.

L’élément de progression comprend son nom, ses valeurs minimale et maximale, ainsi que sa valeur actuelle. Un statut dynamique décrit les actions accomplies sans déplacer le lecteur de la liste de contrôle. En cas de rejet, le formulaire conserve le brouillon et redonne le focus au champ. Il s’agit de responsabilités de l’application qui s’ajoutent au comportement natif de base.

Système de design gluestack UI : compilation complète et périmètre des dépendances

Reproduire cette étude à l’identique

Enregistrez les quatre fichiers de la section Component Examples dans un même dossier et installez les packages épinglés indiqués ci-dessous. La configuration de compilation associe react-native à react-native-web, car les imports internes utilisent le nom du module natif. Le code source importe directement les hôtes du navigateur et ne charge jamais l’environnement d’exécution Expo.

L’installation de ce sous-ensemble restreint de packages utilise la résolution historique des dépendances peer, pour le Web uniquement. Ce n’est pas une recommandation pour une application native complète : la bibliothèque entière déclare des dépendances peer pour les intégrations natives, SVG et safe-area que ce bundle à deux créateurs n’utilise pas. Ajoutez les dépendances peer appropriées si vous élargissez l’ensemble de composants.

Modifier une seule couche à la fois

  1. Compilez les fichiers sans modification, puis vérifiez l’ajout, le rejet des doublons, l’emballage et la réinitialisation.
  2. Modifiez la mise en page originale ou le contenu de l’application sans toucher au câblage des créateurs.
  3. Si vous adoptez les composants NativeWind générés, remplacez le style et la configuration du fournisseur dans une étape d’intégration distincte.
  4. Après cette modification, vérifiez à nouveau le comportement du clavier et les plateformes réellement ciblées.

gluestack UI Exemples de composants du système de design

app.jsx — étude complète du composant de base

Le câblage réel des créateurs et l’intégralité du modèle d’état de la liste de contrôle.

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/>);

Référence du code

style.css — mise en page originale et rôles clairs explicites

Structure responsive complète, illustrations, contours d’état et style de focus du navigateur.

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}}

Référence du code

build.mjs — configuration complète du bundler Web

L’alias de l’import natif est nécessaire, même si app.jsx importe directement ses hôtes depuis 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"'}});

Référence du code

index.html — page d’entrée complète du navigateur

Conservez ce fichier dans le même dossier que style.css et le fichier app.js généré.

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>

Référence du code

04

gluestack UI Configuration de l’agent pour le système de design

Point de départ de l’implémentation

Enregistrez d’abord les quatre fichiers complets. Cette configuration se limite au sous-ensemble du navigateur présenté ici et n’initialise ni NativeWind, ni Uniwind, ni Expo, ni un registre de composants généré.

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/

Un prompt pour votre projet

Prompt pour l’agent IA
Implémentez l’étude complète pour le navigateur du kit de champs gluestack core 5.0.15 à l’aide de createButton/createInput et des hôtes React Native Web. Préservez les identifiants stables, le texte contrôlé du brouillon, la suppression des espaces et la validation des doublons, la restauration du focus, le décompte calculé des articles emballés, la réinitialisation locale et le mappage explicite des rôles clairs de la v5. Distinguez les choix de mise en page originaux des valeurs par défaut de la bibliothèque. Ne prétendez pas avoir effectué des tests sur mobile natif ni disposer d’une persistance côté serveur.
05

gluestack UI Sources et périmètre du système de design

Comportement réel de @gluestack-ui/core 5.0.15 via React Native Web 0.21.3. La mise en page, les illustrations et le modèle d’état du kit de champs sont des créations originales de OpenDesign. Cet exemple pour navigateur utilise directement les créateurs et des styles explicites ; il ne s’agit pas de l’ensemble de composants NativeWind/Uniwind généré par l’interface en ligne de commande, et il n’a pas été testé sur iOS ou Android.