Communitygithub.com

0xAlchemist-cs/personal-ui-system

Erstelle responsive, barrierefreie UI-Komponenten und Layouts mit Chakra UI v3, installiere oder konfiguriere Chakra UI in neuen und bestehenden Projekten und entwerfe skalierbare Themes mit Tokens, semantischen Tokens, Recipes und Slot Recipes.

Was ist personal-ui-system?

Diese Fähigkeit (Skill) befähigt einen KI-Assistenten, Entwickler beim Erstellen von Benutzeroberflächen mit Chakra UI v3 zu unterstützen. Sie deckt den gesamten Workflow ab: von der Projekteinrichtung (Installation, CLI-Snippets, Provider-Konfiguration) über den Bau konkreter Komponenten (Formulare, Karten, Navigationsleisten, Diagramme) bis hin zur tiefgehenden Theme-Anpassung mit Design-Tokens und Recipes. Der Skill liest zunächst den Projektkontext (package.json, Framework, TypeScript) und erzeugt dann maßgeschneiderten, ausführbaren Code – kein generischer Boilerplate-Code. Er verwendet bevorzugt semantische Tokens für automatische Licht-/Dunkelmodus-Anpassung, mobile-first responsive Stile und Chakra-eigene Layout-Primitive. Für komplexe Anforderungen wie Diagramme oder tiefergehende Theme-Anpassungen verweist der Skill auf spezielle Referenzdateien (references/charts.md, references/theming.md). Der Skill unterstützt gängige Frameworks (Next.js App Router/Pages Router, Vite, React) und stellt sicher, dass Barrierefreiheit (aria-label, semantische Überschriften) und Best Practices (use client in Next.js nur wenn nötig) eingehalten werden.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/0xAlchemist-cs/personal-ui-system/tree/HEAD/.agents/skills/chakra-ui-builder

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Chakra UI Builder

Du erstellst Benutzeroberflächen mit Chakra UI v3 und hilfst Entwicklern, Chakra UI in ihren Projekten einzurichten. Deine Aufgabe ist es, sauberen, barrierefreien, responsiven Code zu produzieren, der zum Projekt passt – kein generischer Boilerplate-Code. Lies zuerst den Projektkontext, dann erstelle oder richte ein.


Schritt 1 — Projektkontext lesen

Überprüfe package.json falls verfügbar. Suche nach:

  • Chakra UI Version (standardmäßig v3 Muster verwenden; v2 nur, wenn explizit v2)
  • Framework: Next.js App Router, Pages Router, Vite, einfaches React
  • TypeScript oder JavaScript
  • Paketmanager (anhand der Lock-Datei: pnpm-lock.yaml, yarn.lock, bun.lock, package-lock.json)

Wirf auch einen Blick auf vorhandene Komponenten, wenn der Benutzer sie erwähnt, damit dein Code den bereits verwendeten Konventionen entspricht (Benennung, Dateistruktur, Import-Stil).

Wenn die Anforderungen vage sind oder die Komponente komplex genug, dass Entscheidungen wichtig sind (Layout-Richtung, Datenstruktur, Farbpalette, Anzahl der Varianten), frage vor dem Erstellen nach, anstatt etwas zu generieren, das weggeworfen werden muss.


Projekteinrichtung

Wenn Chakra UI noch nicht installiert ist, schließe die Einrichtung vor dem Erstellen ab.

Installieren

# npm
npm install @chakra-ui/react @emotion/react

# pnpm
pnpm add @chakra-ui/react @emotion/react

# yarn
yarn add @chakra-ui/react @emotion/react

# bun
bun add @chakra-ui/react @emotion/react

Snippets mit der CLI generieren

npx @chakra-ui/cli snippet add

Ohne Argumente fügt dies das empfohlene Set hinzu – provider, toaster und tooltip – und installiert automatisch erforderliche Abhängigkeiten (einschließlich next-themes). Verwende --all, um jedes Snippet hinzuzufügen, oder snippet list, um zuerst zu browsen.

Die CLI erkennt dein Framework und schreibt die Dateien an die richtige Stelle:

FrameworkAusgabepfad
Next.js (mit src/)src/components/ui/
Next.js (ohne src/)components/ui/
Vite / einfaches Reactsrc/components/ui/
Remixapp/components/ui/

Provider einbinden

Next.js App Router (app/layout.tsx):

import { Provider } from "@/components/ui/provider"

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en" suppressHydrationWarning>
      <body>
        <Provider>{children}</Provider>
      </body>
    </html>
  )
}

suppressHydrationWarning verhindert ein Problem, das durch das Einfügen der Farbmodus-Klasse durch next-themes verursacht wird. Füge kein "use client" zu layout.tsx hinzu – die generierte Provider-Datei hat es bereits.

Next.js Pages Router (pages/_app.tsx):

import { Provider } from "@/components/ui/provider"

export default function App({ Component, pageProps }) {
  return (
    <Provider>
      <Component {...pageProps} />
    </Provider>
  )
}

Vite (src/main.tsx):

import { Provider } from "./components/ui/provider"

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <Provider>
      <App />
    </Provider>
  </StrictMode>,
)

Manueller Provider (falls CLI nicht verfügbar)

Wenn die CLI fehlschlägt, erstelle components/ui/provider.tsx manuell und installiere next-themes separat:

"use client"
import { ChakraProvider, defaultSystem } from "@chakra-ui/react"
import { ThemeProvider } from "next-themes"

export function Provider({ children }: { children: React.ReactNode }) {
  return (
    <ChakraProvider value={defaultSystem}>
      <ThemeProvider attribute="class" disableTransitionOnChange>
        {children}
      </ThemeProvider>
    </ChakraProvider>
  )
}

Häufige Einrichtungsprobleme

  • Unformatierte Komponenten – die App ist nicht in <Provider> eingewickelt. Überprüfe den Import-Pfad und dass Provider den Komponentenbaum umschließt.
  • Hydration-Konflikt – füge suppressHydrationWarning zu <html> im App Router hinzu.
  • next-themes nicht gefunden – installiere es: npm install next-themes (nur für manuellen Fallback erforderlich; die CLI erledigt es automatisch).
  • extendTheme nicht exportiert – dies ist ein v2-Muster. Verwende createSystem in v3.

Schritt 2 — Die richtigen Layout-Primitive wählen

Greife zur richtigen Chakra-Primitive, anstatt alles in Box zu verpacken:

BedarfVerwenden
Vertikaler Stapel von ElementenStack (Standard) oder VStack
Horizontale ReiheHStack oder Flex
CSS GridGrid + GridItem
Gleichspaltiges RasterSimpleGrid columns={N}
Zentrierter SeiteninhaltContainer maxW="container.lg"
Volle Flexbox-KontrolleFlex mit expliziten Props
Semantischer Abschnitt/ArtikelBox as="section" / Box as="article"

Vermeide tiefe Verschachtelung. Wenn du drei Box-Ebenen tief ohne semantischen Grund bist, flache es ab. Bevorzuge gap gegenüber Abständen zwischen Geschwistern.


Schritt 3 — Tokens verwenden, keine Rohwerte

Chakra v3 enthält semantische Tokens, die sich automatisch an den Licht-/Dunkelmodus anpassen. Bevorzuge sie gegenüber hartcodierten Palettenwerten – sie machen die Komponente themenbewusst, ohne zusätzliche Arbeit.

// Semantische Tokens bevorzugen
<Box bg="bg.subtle" color="fg.default" borderColor="border.subtle" />
<Text color="fg.muted" />
<Box shadow="md" rounded="lg" />

// Für interaktive Komponenten colorPalette verwenden (nicht colorScheme)
<Button colorPalette="blue">Absenden</Button>
<Badge colorPalette="green">Aktiv</Badge>

Rohpalettenwerte (blue.500, gray.100) nur verwenden, wenn eine bestimmte Farbe beabsichtigt ist und sich nicht mit dem Farbmodus ändern soll.


Schritt 4 — Responsive Stile

Chakra verwendet mobile-first Breakpoints. Verwende Array- oder Objekt-Syntax konsistent:

// Array: [Basis, sm, md, lg, xl]
<Box px={[4, 6, 8]} fontSize={["sm", "md", "lg"]} />

// Objekt: explizite Breakpoints
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={6} />
<Stack direction={{ base: "column", md: "row" }} gap={4} />

Jede Layout-Komponente sollte mindestens base (mobil) und md (Desktop) Breakpoints behandeln, es sei denn, die Anfrage ist explizit nur für Desktop.


Schritt 5 — Formulare

Verwende Field.Root für alle Formularfelder – es verbindet Label, Eingabe, Fehler und Hilfetext korrekt:

<Field.Root invalid={!!error} required>
  <Field.Label>E-Mail-Adresse</Field.Label>
  <Input type="email" placeholder="[email protected]" />
  <Field.ErrorText>{error}</Field.ErrorText>
  <Field.HelpText>Wir geben deine E-Mail niemals weiter.</Field.HelpText>
</Field.Root>

Für den Übermittlungsstatus des Formulars verwende disabled (nicht isDisabled) bei Eingaben und Schaltflächen. Gruppiere verwandte Felder in einem Stack gap={4}.


Schritt 6 — Barrierefreiheit

Die integrierten Komponenten von Chakra erledigen die meiste Barrierefreiheit automatisch – überschreibe sie nicht. Die Dinge, die du bereitstellen musst:

  • Nur-Symbol-Schaltflächen: immer aria-label hinzufügen
    <IconButton aria-label="Dialog schließen" icon={<CloseIcon />} />
    
  • Bilder: immer aussagekräftigen alt-Text übergeben (oder alt="" für dekorative)
  • Formularlabels: Field.Label verwenden oder sicherstellen, dass htmlFor mit der Eingabe-id übereinstimmt
  • Interaktive benutzerdefinierte Elemente: wenn du etwas mit onClick auf einer Box baust, verwende as="button" oder einen echten <button>, damit die Tastaturnavigation funktioniert
  • Semantische Überschriften: h1–h6-Hierarchie verwenden; keine Ebenen überspringen
  • Farbkontrast: kein hellgrauer Text auf weißem Hintergrund; verlasse dich auf semantische Tokens, die auf Kontrast getestet sind

Schritt 7 — Next.js: wo "use client" hinzufügen

Im Next.js App Router sind Server-Komponenten der Standard. Füge "use client" nur zu Dateien hinzu, die es benötigen – nicht zu ganzen Layouts oder Seiten.

Eine Komponente benötigt "use client", wenn sie:

  • React-Hooks verwendet (useState, useEffect, useContext usw.)
  • Browser-Ereignisse behandelt (onClick mit Zustand, Formularübermittlung usw.)
  • Browser-APIs verwendet
// Server-Komponente – keine Direktive nötig
export default function ProductCard({ name, price }: Props) {
  return (
    <Box p={4} borderWidth={1} rounded="md">
      <Text fontWeight="bold">{name}</Text>
      <Text color="fg.muted">{price}</Text>
    </Box>
  )
}

// Client-Komponente – benötigt die Direktive
;("use client")
export function AddToCartButton({ productId }: { productId: string }) {
  const [added, setAdded] = useState(false)
  return (
    <Button onClick={() => setAdded(true)} colorPalette="blue">
      {added ? "Hinzugefügt!" : "In den Warenkorb"}
    </Button>
  )
}

Das Ziel ist es, Interaktivität an die Blätter zu drängen – so viel des Baums wie möglich als Server-Komponenten zu behalten.


Schritt 8 — Wann Komponenten extrahiert, Recipes verwendet und das Theme angepasst wird

Extrahiere eine Komponente, wenn dieselbe Struktur mehr als zweimal vorkommt oder wenn ein Teil komplex genug ist, dass die Benennung das übergeordnete Element klarer macht.

Schlage ein Recipe vor, wenn eine Komponente sinnvolle Stilvarianten hat, die ein Entwickler anpassen möchte. Schlage ein Slot Recipe für Komponenten mit mehreren koordinierten Teilen vor (Karte mit Kopfzeile/Hauptteil/Fußzeile, Statistik mit Label/Wert/Symbol usw.).

Für tiefergehende Theme-Arbeiten – Definieren von Markenfarb-Tokens, semantischen Tokens mit Dunkelmodus-Werten, vollständiges Authoring von Recipes/Slot-Recipes, Typegen oder Auslagern des Standard-Themes – lies references/theming.md, bevor du antwortest. Es behandelt die vollständige defineConfig/createSystem-API mit vollständigen Beispielen.

Für Diagrammanfragen – Balkendiagramme, Flächendiagramme, Liniendiagramme, Kreisdiagramme/Donut-Diagramme, BarList, BarSegment oder alles, was @chakra-ui/charts betrifft – lies references/charts.md, bevor du antwortest. Es behandelt den useChart-Hook, alle drei Diagrammtypen, Recharts-Integration, Farb-Tokens und vollständige ausführbare Beispiele.

Wenn du dir unsicher bist, welche Komponente zu verwenden ist, oder der Benutzer keine angegeben hat, lies references/component-decision-tree.md. Es behandelt jede Chakra-Komponente mit Hinweisen, wann eine einer ähnlichen Alternative vorzuziehen ist.


Ausgabeformat

Erstelle:

  1. Vollständigen, ausführbaren Code – korrekte Importe, keine Platzhalter wie TODO oder ...rest der Komponente
  2. Korrekte Import-Anweisungen – gruppiere Chakra-Importe, dann lokale Importe
  3. Komponententrennung – in mehrere Komponenten/Dateien aufteilen, wenn die Komponente komplex ist oder klar trennbare Teile enthält
  4. Responsive Stile – mindestens base- und md-Breakpoints für Layout
  5. Kurze Erklärung nach dem Code – 2–4 Sätze zu den wichtigsten getroffenen Entscheidungen (Layout-Ansatz, Barrierefreiheitsentscheidungen, responsive Strategie). Überspringe die Erklärung, wenn die Anfrage trivial war.
// Guter Import-Stil
import { Box, Button, Field, Stack, Text } from "@chakra-ui/react"
// Dann lokal
import { SomeLocalComponent } from "./SomeLocalComponent"

Wann zuerst fragen

Baue sofort, wenn die Anfrage klar genug ist, um etwas Nützliches zu produzieren. Frage zuerst, wenn:

  • Die Datenstruktur unbekannt ist und sie die gesamte Struktur ändert (z. B. "baue eine Tabelle" – wie viele Spalten? welche Daten?)
  • Es bedeutende Design-Entscheidungen gibt, die dem Benutzer wichtig sein könnten (Layout-Richtung, Anzahl der Spalten, Farbpalette)
  • Der Benutzer Dateien oder vorhandene Komponenten erwähnt, die du nicht gesehen hast

Im Zweifelsfall nenne deine Annahmen am Anfang der Antwort und baue – es ist für den Benutzer schneller, von etwas Konkretem umzulenken als von nichts.

Verwandte Skills