Plattformübergreifende und mobile Benutzeroberflächen · Neue Ressource

Tamagui-Designsystem.

Erkunden Sie die tatsächlichen Token-Kategorien von Tamagui v5 und die hellen und dunklen blauen Themes anhand einer vollständigen, mit nativen Komponenten erstellten Gewohnheitentafel mit Validierung, Fortschrittsanzeige und Wiederherstellung bei leerem Zustand.

OpenDesign-Leitfaden8 Kapitel50 ReferenzeinträgeOriginaler Anwendungsleitfaden
01

Vorschau der Tamagui-Designsystem-Oberfläche

Fügen Sie eine Gewohnheit hinzu, markieren Sie den Fortschritt, filtern Sie unerledigte Einträge und wechseln Sie zum blauen Theme.

Ein Board für kleine Gewohnheiten erstellenVollständiges Beispiel öffnen
Native Webkomponenten von Tamagui 2.7.7 mit v5-Konfiguration und ursprünglichem lokalem Zustand. · Implementierungsreferenz
02

Designreferenz für das Tamagui-Designsystem

Von @tamagui/config/v5 und @tamagui/themes in Version 2.7.7 exportierte Werte sowie verifizierte Verträge nativer Komponenten.

v5-Größen-Design-Tokens

Quelle
Name / RegelWert / KonfigurationVerwendung
size.$120Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
size.$228Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
size.$336Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
size.$444Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
size.$552Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
size.$664Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.

v5-Abstands-Design-Tokens

Quelle
Name / RegelWert / KonfigurationVerwendung
space.$12Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$1.54Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$27Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$2.510Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$313Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$3.516Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$418Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$524Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
space.$632Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.

v5-Radius-Design-Tokens

Quelle
Name / RegelWert / KonfigurationVerwendung
radius.00Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.13Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.25Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.37Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.49Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.510Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.
radius.616Tatsächlicher Konfigurationswert aus v5. Derselbe numerische Tokenname hat bei Größe, Abstand und Radius jeweils eine andere Bedeutung. Behandeln Sie $4 nicht als universellen Pixelwert.

Semantisches light_blue-Theme

Quelle
Name / RegelWert / KonfigurationVerwendung
light_blue.backgroundhsla(207, 100%, 98%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.backgroundHoverhsla(210, 100%, 99%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.backgroundPresshsla(205, 92%, 95%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.colorhsla(216, 71%, 23%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.borderColorhsla(203, 100%, 92%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.borderColorFocushsla(203, 100%, 92%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
light_blue.placeholderColorhsla(206, 100%, 50%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.

Semantisches dark_blue-Theme

Quelle
Name / RegelWert / KonfigurationVerwendung
dark_blue.backgroundhsla(218, 39%, 11%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.backgroundHoverhsla(212, 69%, 16%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.backgroundPresshsla(215, 42%, 9%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.colorhsla(205, 100%, 88%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.borderColorhsla(209, 100%, 19%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.borderColorFocushsla(209, 100%, 19%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.
dark_blue.placeholderColorhsla(206, 100%, 50%, 1)Aufgelöste semantische Rolle des blauen Themes in v5. Für Hover-, Drück- oder Aktivzustände kann die Komponente ein spezifischeres untergeordnetes Theme auswählen.

Systemschrift-Rollen

Quelle
Name / RegelWert / KonfigurationVerwendung
body.family-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serifDer System-Stack von v5 benötigt keine externen Schriftart-Anfragen.
body.$213px / 20pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.
body.$314px / 21pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.
body.$415px / 23pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.
body.$516px / 24pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.
body.$618px / 27pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.
body.$826px / 38pxGröße und Zeilenhöhe bilden gemeinsam Schriftrollen und sind unabhängig vom Komponentengrößen-Token mit demselben Namen.

Verträge für die native Komposition

Quelle
Name / RegelWert / KonfigurationVerwendung
createTamaguidefaultConfig from @tamagui/config/v5Eine Konfigurationsinstanz außerhalb von React; getCSS() stellt die Web-Theme-CSS bereit.
TamaguiProviderconfig + defaultThemeDie Anwendung wählt hell oder dunkel, ohne den Board-Zustand zu verändern.
Themename="blue"Löst das blaue untergeordnete Theme der aktuellen Darstellung auf.
Checkboxchecked + onCheckedChangeDas Board zählt nur value === true als erledigt; ein unbestimmter Zustand gilt nicht als erledigt.
Inputvalue + onChangeTextKontrollierter Entwurf, Validierung nach dem Entfernen äußerer Leerzeichen und expliziter Umgang mit Duplikaten.
Progressvalue from 0 to 100Die Fortschrittsanzeige wird aus der Anzahl erledigter Einträge geteilt durch die Gesamtzahl der Zeilen abgeleitet.
YStack / XStackdirectional layout with token gapHalten Sie das Leselayout responsiv, ohne ein separates Imitations-Stylesheet zu verwenden.
03

Vollständiger Leitfaden zum Tamagui-Designsystem

Ein praktischer Leitfaden zur Auswahl, Anwendung und Überprüfung dieses Systems für ein echtes Interface.

DESIGN-tamagui.md

Umfassende Anleitung, Einstieg in die Implementierung und Links zu den Quellen.

Leitfaden herunterladen

Versionskonfiguration und CSS des Tamagui-Designsystems

Das benannte v5-Preset verwenden

Dieses Beispiel legt tamagui und @tamagui/config auf Version 2.7.7 fest und importiert defaultConfig aus @tamagui/config/v5. Der Konfigurationsname lautet v5; er bezeichnet nicht die Hauptversion des npm-Pakets. Werden diese beiden Zahlen vermischt, erhält man einen falschen Installationsbefehl. createTamagui wird einmal außerhalb der Komponente aufgerufen. Das erzeugte CSS wird vor dem Rendern des Boards eingefügt, damit Theme-Variablen und native Stile im Web tatsächlich definiert sind.

Aus diesem OpenDesign-Leitfaden

Die kleine Konfigurationsüberschreibung explizit angeben

Die bereitgestellte Quelle setzt onlyAllowShorthands auf false, da dieses Lehrbeispiel gut lesbare Langformen wie padding und backgroundColor verwendet. Das ist eine Anwendungsentscheidung zusätzlich zum Preset. Die v5-Basis enthält keinen Animationstreiber, und dieses Beispiel erfindet keinen und behauptet auch keine animierten Übergänge. Das einfache Verhalten von Fortschrittsanzeige und Checkbox funktioniert ohne zusätzliche Animationsabhängigkeit.

Tamagui Designsystem: Größen-, Abstands- und Radius-Tokens

Verwechseln Sie nicht identische Token-Bezeichnungen

In der festgelegten v5-Konfiguration beträgt size $4 44, space $4 18 und radius 4 9. Eine Komponentengröße, ein Layoutabstand und ein Eckenradius lassen sich daher nicht mit einer gemeinsamen Multiplikationsregel umrechnen. Die Referenz führt jede Kategorie separat auf, und das Beispiel verwendet die Werte der jeweiligen Kategorie über tatsächliche Tamagui-Props. Das ist hilfreicher als eine Liste allgemeiner 4px-Schritte, die in der Konfiguration nicht verwendet werden.

  • size.$4 = 44
  • space.$4 = 18
  • radius.4 = 9
  • Fließtextschriftgröße $4 = 15px bei einer Zeilenhöhe von 23px

Auch die Schriftgrößenskala separat behandeln

Die Fließtextschriftgröße $4 beträgt 15px bei einer Zeilenhöhe von 23px, während die Komponentengröße $4 weiterhin 44 beträgt. Der Systemschriftstapel wird von v5 bereitgestellt und benötigt keine heruntergeladene Schriftart. H1, H2 und Text erhalten ihren nativen Schriftkontext; die expliziten fontSize- und lineHeight-Werte in der Quelle bestimmen die Hierarchie des ursprünglichen Boards. Die äußere Breite von 880px ist eine lokale Layoutentscheidung und kein globales Tamagui-Token.

Tamagui Designsystem: Semantische Themes und Darstellung

Helles oder dunkles Theme mit einem blauen Unter-Theme kombinieren

TamaguiProvider erhält das ausgewählte defaultTheme, und Theme name="blue" löst ein entsprechendes untergeordnetes Theme auf. Die Quelle verwendet die Rollen background, backgroundHover, color und borderColor, statt im gesamten Komponentenbaum immer wieder hexadezimale Werte einzutragen. Die Tabelle enthält die tatsächlichen Werte von light_blue und dark_blue, damit sich die aufgelöste Konfiguration vergleichen lässt, anstatt von einer festen Markenpalette auszugehen.

Board-Zustand bei Änderungen der Darstellung beibehalten

Das Flag dark ist unabhängig von den Zeilen, dem Eingabeentwurf und dem Filter. Ein Wechsel der Darstellung aktualisiert die nativen Komponenten, ohne das Board zu verändern. Buttons und Checkboxen können eigene Werte für untergeordnete Themes der Komponenten auswählen, sodass ihre berechnete Farbe nicht unbedingt mit dem Hintergrund-Token des übergeordneten Themes übereinstimmt. Prüfen Sie den gerenderten Zustand, bevor Sie die Hierarchie in benutzerdefinierte CSS auflösen.

Tamagui Designsystem: Checkboxen und abgeleiteter Fortschritt

Abschlussstatus in einer einzigen Zeilensammlung halten

Jede Zeile hat eine stabile ID, einen gut lesbaren Text und einen booleschen Wert done. Checkbox erhält checked und onCheckedChange; nur der tatsächliche Wert true markiert die Zeile als erledigt. Checkbox.Indicator zeigt das Häkchen an. Der benachbarte Text und der zugängliche Name beziehen sich auf dieselbe Gewohnheit, während die Durchstreichung den Abschlusszustand visuell wiederholt. Die Quelle erstellt keinen separaten Zähler, der nicht mehr mit den Zeilen übereinstimmen könnte.

Fortschritt anhand des gesamten Boards berechnen

Tamagui Designsystem: Validierung von Entwürfen und Wiederherstellung bei Duplikaten

Ein echtes gesteuertes Eingabefeld hinzufügen

Input speichert den aktuellen Entwurf über value und onChangeText. Die Aktion Add habit entfernt überflüssige Leerzeichen und weist leere Werte mit einer sichtbaren Meldung, aria-invalid und einer Fehlerbeschreibung zurück. Nach dem Absenden eines leeren Werts wird der Fokus wieder auf das Eingabefeld gesetzt. Eine Prüfung auf Duplikate ohne Beachtung der Groß- und Kleinschreibung verhindert eine zweite Zeile mit demselben Text und lässt den Entwurf zur Korrektur stehen. Diese Regeln gehören zum ursprünglichen Board, nicht zur Bibliothek selbst.

Board erst nach einem gültigen Eintrag aktualisieren

Ein gültiger Entwurf fügt eine neue, unerledigte Zeile hinzu, leert das Eingabefeld und entfernt den Fehler. Der Nenner für den Fortschritt ändert sich sofort, da er aus der neuen Sammlung abgeleitet wird. Das Hinzufügen einer Gewohnheit richtet keine Erinnerung ein und erstellt kein Konto. Das Board wird bewusst im lokalen Zustand von React gehalten; nach dem erneuten Laden des Dokuments wird wieder das Beispiel angezeigt.

Tamagui Designsystem: Gefilterte Ansichten und Wiederherstellung bei leeren Ergebnissen

Den Geltungsbereich des Filters verdeutlichen

Show unfinished only blendet erledigte Zeilen aus, lässt sie aber in der Sammlung. Wenn in dieser Ansicht nichts mehr übrig ist, erklärt ein Text für den leeren Zustand, dass die vollständige Liste weiterhin vorhanden ist, und bietet eine direkte Möglichkeit zur Rückkehr. Dieser sinnvolle leere Zustand entsteht durch die Auswahl der Nutzenden – anders als ein dekorativer Schalter, der beliebige Platzhalterkarten austauscht.

Zurücksetzen und Darstellung getrennt halten

Reset sample board stellt die ursprünglichen drei Zeilen wieder her, leert den Entwurf und den Fehler und kehrt zur vollständigen Liste zurück. Die aktuelle Darstellung bleibt unverändert. Da jede Änderung als expliziter Zustand vorliegt, erfordert das Zurücksetzen weder ein erneutes Laden des Dokuments noch das Verwerfen des konfigurierten Providers. Theme- und Inhaltswiederherstellung lassen sich unabhängig voneinander testen.

Tamagui Designsystem: Responsive Stacks und barrierefreies Lesen

Die Höhe durch den Inhalt der Stacks bestimmen lassen

YStack ordnet den Hauptlesefluss an, während XStack die Steuerelemente der Überschrift, Checkbox-Zeilen und Aktionen ausrichtet. Die Steuerelementgruppen umbrechen, statt eine feste Desktopbreite zu erzwingen. Der äußere Container ist höchstens 880px breit und verwendet das tatsächliche Token space $4 für den Innenabstand. Der Text jeder Zeile kann sich verkleinern und umbrechen, während die Steuerelemente sowohl bei 280px als auch bei größeren Testbreiten verfügbar bleiben.

Interaktionen nach dem Umbruch testen

Bei der Browserprüfung wird eine Gewohnheit hinzugefügt, als erledigt markiert, die Liste gefiltert und die Darstellung gewechselt, bevor der Überlauf gemessen wird. Ein Screenshot des anfänglichen Layouts allein würde nicht zeigen, ob ein Fehler, eine lange Bezeichnung oder ein gefilterter Zustand die schmale Darstellung beeinträchtigt. Die native Semantik der Checkboxen und der sichtbare Text wurden zusammen mit dem abgeleiteten Fortschritt geprüft, statt ihr Vorhandensein lediglich festzustellen und ihre Funktionsfähigkeit vorauszusetzen.

Tamagui Designsystem: Vollständiger Browser-Build

Provider, CSS und Build-Definitionen bereitstellen

Die drei bereitgestellten Dateien reichen für die lokale Webstudie aus. Die JSX-Datei enthält den Provider, eine Konfiguration, das generierte Theme CSS und das gesamte Board. build.mjs legt das Webziel und die Produktionsumgebung fest und stellt für andere reine Browser-Umgebungsvariablen einen leeren process.env-Fallback bereit. Ohne diese letzte Definition kann dieses einfache Bundle mit „process is not defined“ fehlschlagen, obwohl es kompiliert.

  1. Lege tamagui.jsx, build.mjs und index.html im selben Verzeichnis ab.
  2. Installiere die festgelegten Pakete React und Tamagui.
  3. Erstelle und stelle das lokale Verzeichnis bereit.
  4. Teste leere und doppelte Einträge, den Abschluss, Filter, Theme und Zurücksetzen.

Native und Web getrennt behandeln

Tamagui-Designsystem: Komponentenbeispiele

tamagui.jsx

Konfiguration, generiertes CSS, native Komponenten und vollständiger Board-Zustand.

jsx
import React,{useState} from 'react';import{createRoot}from'react-dom/client';
import{createTamagui,TamaguiProvider,Theme,YStack,XStack,Text,H1,H2,Button,Input,Checkbox,Progress,Separator}from'tamagui';import{defaultConfig}from'@tamagui/config/v5';
const config=createTamagui({...defaultConfig,settings:{...defaultConfig.settings,onlyAllowShorthands:false}});const sheet=document.createElement('style');sheet.textContent=config.getCSS();document.head.append(sheet);
const initial=[{id:1,text:'Read ten pages',done:false},{id:2,text:'Step outside for a break',done:true},{id:3,text:'Write one useful note',done:false}];
function App(){const[dark,setDark]=useState(false),[rows,setRows]=useState(initial),[draft,setDraft]=useState(''),[error,setError]=useState(''),[filter,setFilter]=useState(false);const done=rows.filter(x=>x.done).length;let shown=rows.filter(x=>!filter||!x.done);function add(){let text=draft.trim();if(!text){setError('Write a small habit before adding it.');document.querySelector('#habit-input')?.focus();return}if(rows.some(x=>x.text.toLowerCase()===text.toLowerCase())){setError('That habit is already in this list.');return}setRows([...rows,{id:Date.now(),text,done:false}]);setDraft('');setError('')}return <TamaguiProvider config={config} defaultTheme={dark?'dark':'light'}><Theme name="blue"><YStack backgroundColor="$background" color="$color" padding="$4" gap="$4" maxWidth={880} margin="auto" width="100%" minHeight={0}><XStack justifyContent="space-between" alignItems="center" flexWrap="wrap" gap="$3"><Text fontSize="$2" fontWeight="700">TAMAGUI / ORIGINAL HABIT BOARD</Text><Button size="$3" onPress={()=>setDark(!dark)}>{dark?'Light appearance':'Dark appearance'}</Button></XStack><H1 fontSize="$8" lineHeight="$8">A little progress, every day.</H1><Text fontSize="$4" lineHeight="$5">A local board built with Tamagui 2.7.7 and its v5 blue theme. Your changes stay in this page; no account or daily reminder is connected.</Text><YStack backgroundColor="$backgroundHover" borderWidth={1} borderColor="$borderColor" borderRadius="$4" padding="$4" gap="$3"><XStack justifyContent="space-between" gap="$3" flexWrap="wrap"><H2 fontSize="$5">Today’s small steps</H2><Text id="progress-count" aria-live="polite">{done} of {rows.length} complete</Text></XStack><Progress value={rows.length?done/rows.length*100:0} size="$2" aria-label="Completed habits"><Progress.Indicator animation={undefined}/></Progress><Button size="$3" alignSelf="flex-start" onPress={()=>setFilter(!filter)}>{filter?'Show all habits':'Show unfinished only'}</Button><Separator/>{shown.length?shown.map(row=><XStack key={row.id} gap="$3" alignItems="center" paddingVertical="$2"><Checkbox id={'habit-'+row.id} checked={row.done} onCheckedChange={value=>setRows(rows.map(x=>x.id===row.id?{...x,done:value===true}:x))} aria-label={row.text} size="$4"><Checkbox.Indicator><Text fontWeight="700">✓</Text></Checkbox.Indicator></Checkbox><Text flex={1} fontSize="$4" lineHeight="$5" textDecorationLine={row.done?'line-through':'none'} opacity={row.done?.65:1}>{row.text}</Text></XStack>):<YStack gap="$3"><Text fontWeight="700">Nothing unfinished in this view</Text><Text>All your habits remain in the full list. You can revisit any completed item.</Text><Button onPress={()=>setFilter(false)}>Return to all habits</Button></YStack>}</YStack><YStack gap="$3"><Text htmlFor="habit-input" tag="label" fontWeight="700">Add one small habit</Text><Input id="habit-input" value={draft} onChangeText={v=>{setDraft(v);setError('')}} placeholder="For example, stretch for five minutes" aria-describedby={error?'habit-error':undefined} aria-invalid={!!error} onKeyPress={e=>{if(e.nativeEvent.key==='Enter')add()}}/><Text id="habit-error" color="$color" aria-live="polite">{error}</Text><XStack gap="$3" flexWrap="wrap"><Button theme="active" onPress={add}>Add habit</Button><Button onPress={()=>{setRows(initial);setDraft('');setError('');setFilter(false)}}>Reset sample board</Button></XStack></YStack><Text fontSize="$2" lineHeight="$3">Native Checkbox, Input, Button and Progress components; original board content and state. Theme changes preserve the current board.</Text></YStack></Theme></TamaguiProvider>}
createRoot(document.getElementById('root')).render(<App/>);

Code-Referenz

  • Verwende diese drei vollständigen Dateien zusammen.

build.mjs

Definitionen der Browserumgebung, die das getestete Bundle verwendet.

javascript
import {build} from 'esbuild';
await build({entryPoints:['tamagui.jsx'],bundle:true,minify:true,outfile:'tamagui.bundle.js',define:{'process.env.NODE_ENV':'"production"','process.env.TAMAGUI_TARGET':'"web"','process.env':'{}'}});

Code-Referenz

  • Verwende diese drei vollständigen Dateien zusammen.

index.html

Eigenständiges Root-Dokument und Bundle-Import.

html
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Small habits board</title><style>body{margin:0}*{box-sizing:border-box}button,input{max-width:100%}</style></head><body><div id="root"></div><script src="./tamagui.bundle.js"></script></body></html>

Code-Referenz

  • Verwende diese drei vollständigen Dateien zusammen.
04

Tamagui-Designsystem: Einrichtung für AI Agents

Ausgangspunkt für die Implementierung

Speichere zuerst die bereitgestellten Dateien und öffne http://localhost:8000/. Diese Einrichtung ist bewusst auf den Browser ausgerichtet.

sh
npm init -y
npm install [email protected] [email protected] [email protected] @tamagui/[email protected]
npm install --save-dev esbuild
node build.mjs
python3 -m http.server 8000

Ein Prompt für dein Projekt

Agenten-Prompt
Implementiere das vollständige Tamagui-Habit-Board 2.7.7 für das Web mit dem v5-Preset. Halte die Kategorien der Design-Tokens für Größen, Abstände, Radien und Schriftarten getrennt; bewahre das generierte Theme CSS, die hellen und dunklen blauen Child-Themes, kontrollierte Kontrollkästchen, Validierung durch Trimmen und auf Duplikate, den Fortschrittsnenner mit allen Zeilen, die Wiederherstellung der Ansicht unerledigter Aufgaben und das Zurücksetzen ohne Änderungen am Erscheinungsbild.
05

Tamagui-Designsystem: Quellen und Umfang

Tatsächliche Tamagui-Webkomponenten 2.7.7 mit dem v5-Preset. Das Habit-Board und die Zustandsregeln sind eigener OpenDesign-Code; es sind keine Konto-, Erinnerungs- oder Funktionen für native Geräte angebunden.