Communitygithub.com

Sistema de UI Pessoal - 0xAlchemist

Construa componentes de UI responsivos e acessíveis usando Chakra UI v3, instale ou configure Chakra UI em projetos novos e existentes, e projete temas escaláveis usando tokens, tokens semânticos, recipes e slot recipes.

O que é Sistema de UI Pessoal - 0xAlchemist?

Este skill capacita o desenvolvedor a construir interfaces de usuário completas e acessíveis com Chakra UI v3, seja criando novos componentes, páginas ou formulários, seja configurando o Chakra em projetos Next.js, Vite ou React puro. Ele orienta desde a instalação do pacote e geração de snippets via CLI até a fiação correta do Provider, evitando erros comuns como hidratação incorreta ou componentes sem estilo. Além da construção de componentes, o skill cobre o sistema de design tokens e temas semânticos, ensinando a usar tokens como `bg.subtle` e `colorPalette` para criar interfaces que se adaptam automaticamente ao modo claro/escuro. Por fim, ele direciona o usuário a referências especializadas para receitas de componentes, slot recipes, criação de temas completos e gráficos com `@chakra-ui/charts`, incentivando a extração de componentes reutilizáveis quando uma estrutura aparece mais de duas vezes. O skill é acionado por qualquer solicitação relacionada à construção, configuração ou temática do Chakra UI, desde 'adicione minhas cores da marca' até 'construa um gráfico de barras'.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Construtor de Chakra UI

Você está construindo UI com Chakra UI v3 e ajudando desenvolvedores a configurar o Chakra UI em seus projetos. Seu trabalho é produzir código limpo, acessível e responsivo que se encaixe no projeto — não um boilerplate genérico. Leia o contexto do projeto primeiro, depois construa ou configure.


Passo 1 — Leia o contexto do projeto

Verifique o package.json se disponível. Procure por:

  • Versão do Chakra UI (use padrões v3 por padrão; use v2 apenas se explicitamente na v2)
  • Framework: Next.js App Router, Pages Router, Vite, React puro
  • TypeScript ou JavaScript
  • Gerenciador de pacotes (a partir do lockfile: pnpm-lock.yaml, yarn.lock, bun.lock, package-lock.json)

Também dê uma olhada nos componentes existentes se o usuário os mencionar, para que seu código corresponda às convenções já em uso (nomenclatura, estrutura de arquivos, estilo de importação).

Se os requisitos forem vagos ou o componente for complexo o suficiente para que as escolhas importem (direção do layout, formato dos dados, paleta de cores, número de variantes), pergunte antes de construir, em vez de gerar algo que precise ser descartado.


Configuração do projeto

Se o Chakra UI ainda não estiver instalado, conclua a configuração antes de construir.

Instalação

# 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

Gerar snippets com a CLI

npx @chakra-ui/cli snippet add

Sem argumentos, isso adiciona o conjunto recomendado — provider, toaster e tooltip — e instala automaticamente as dependências necessárias (incluindo next-themes). Use --all para adicionar todos os snippets, ou snippet list para navegar primeiro.

A CLI detecta seu framework e escreve os arquivos no local correto:

FrameworkCaminho de saída
Next.js (com src/)src/components/ui/
Next.js (sem src/)components/ui/
Vite / React purosrc/components/ui/
Remixapp/components/ui/

Conectando o Provider

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 evita uma incompatibilidade causada pelo next-themes ao injetar a classe de modo de cor. Não adicione "use client" ao layout.tsx — o arquivo de provider gerado já o tem.

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>,
)

Provider manual (se a CLI não estiver disponível)

Se a CLI falhar, crie components/ui/provider.tsx manualmente e instale o next-themes separadamente:

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

Problemas comuns de configuração

  • Componentes sem estilo — o aplicativo não está envolto em <Provider>. Verifique o caminho de importação e se o Provider envolve a árvore de componentes.
  • Incompatibilidade de hidratação — adicione suppressHydrationWarning ao <html> no App Router.
  • next-themes não encontrado — instale-o: npm install next-themes (necessário apenas para o fallback manual; a CLI lida com isso automaticamente).
  • extendTheme não exportado — este é um padrão v2. Use createSystem na v3.

Passo 2 — Escolha os primitivos de layout corretos

Recorra ao primitivo Chakra certo, em vez de envolver tudo em Box:

NecessidadeUse
Pilha vertical de itensStack (padrão) ou VStack
Linha horizontalHStack ou Flex
CSS GridGrid + GridItem
Grid de colunas iguaisSimpleGrid columns={N}
Conteúdo de página centralizadoContainer maxW="container.lg"
Controle flexbox completoFlex com props explícitas
Seção/artigo semânticoBox as="section" / Box as="article"

Evite aninhamento profundo. Se você estiver três níveis de Box sem motivo semântico, achate. Prefira gap em vez de margem entre irmãos.


Passo 3 — Use tokens, não valores brutos

O Chakra v3 fornece tokens semânticos que se adaptam automaticamente ao modo claro/escuro. Prefira-os em vez de valores de paleta codificados — eles tornam o componente ciente do tema sem nenhum trabalho extra.

// Prefira tokens semânticos
<Box bg="bg.subtle" color="fg.default" borderColor="border.subtle" />
<Text color="fg.muted" />
<Box shadow="md" rounded="lg" />

// Use colorPalette para componentes interativos (não colorScheme)
<Button colorPalette="blue">Enviar</Button>
<Badge colorPalette="green">Ativo</Badge>

Use valores brutos da paleta (blue.500, gray.100) apenas quando uma cor específica for intencional e não deva mudar com o modo de cor.


Passo 4 — Estilos responsivos

O Chakra usa breakpoints mobile-first. Use a sintaxe de array ou objeto de forma consistente:

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

// Objeto: breakpoints explícitos
<SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={6} />
<Stack direction={{ base: "column", md: "row" }} gap={4} />

Todo componente de layout deve lidar com pelo menos os breakpoints base (mobile) e md (desktop), a menos que a solicitação seja explicitamente apenas para desktop.


Passo 5 — Formulários

Use Field.Root para todos os campos de formulário — ele conecta corretamente o rótulo, a entrada, o erro e o texto de ajuda:

<Field.Root invalid={!!error} required>
  <Field.Label>Endereço de e-mail</Field.Label>
  <Input type="email" placeholder="[email protected]" />
  <Field.ErrorText>{error}</Field.ErrorText>
  <Field.HelpText>Nunca compartilharemos seu e-mail.</Field.HelpText>
</Field.Root>

Para estado de envio de formulário, use disabled (não isDisabled) em entradas e botões. Agrupe campos relacionados em um Stack gap={4}.


Passo 6 — Acessibilidade

Os componentes integrados do Chakra lidam com a maioria da acessibilidade automaticamente — não a substitua. As coisas que você precisa fornecer:

  • Botões com apenas ícone: sempre adicione aria-label
    <IconButton aria-label="Fechar diálogo" icon={<CloseIcon />} />
    
  • Imagens: sempre passe texto alt significativo (ou alt="" para decorativas)
  • Rótulos de formulário: use Field.Label ou certifique-se de que htmlFor corresponda ao id da entrada
  • Elementos customizados interativos: se você construir algo com onClick em um Box, use as="button" ou um <button> real para que a navegação por teclado funcione
  • Títulos semânticos: use a hierarquia h1–h6; não pule níveis
  • Contraste de cor: não use texto cinza claro em fundos brancos; confie em tokens semânticos que são testados quanto ao contraste

Passo 7 — Next.js: onde adicionar "use client"

No Next.js App Router, Componentes de Servidor são o padrão. Adicione "use client" apenas a arquivos que precisam dele — não a layouts ou páginas inteiras.

Um componente precisa de "use client" quando:

  • Usa hooks React (useState, useEffect, useContext, etc.)
  • Lida com eventos do navegador (onClick com estado, envio de formulário, etc.)
  • Usa APIs do navegador
// Componente de Servidor — nenhuma diretiva necessária
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>
  )
}

// Componente de Cliente — precisa da diretiva
;("use client")
export function AddToCartButton({ productId }: { productId: string }) {
  const [added, setAdded] = useState(false)
  return (
    <Button onClick={() => setAdded(true)} colorPalette="blue">
      {added ? "Adicionado!" : "Adicionar ao carrinho"}
    </Button>
  )
}

O objetivo é empurrar a interatividade para as folhas — manter o máximo possível da árvore como Componentes de Servidor.


Passo 8 — Quando extrair componentes, usar recipes e personalizar o tema

Extraia um componente quando a mesma estrutura aparecer mais de duas vezes, ou quando uma peça for complexa o suficiente para que nomeá-la torne o pai mais claro.

Sugira uma recipe quando um componente tiver variantes de estilo significativas que um desenvolvedor queira personalizar. Sugira uma slot recipe para componentes com múltiplas partes coordenadas (cartão com cabeçalho/corpo/rodapé, estatística com rótulo/valor/ícone, etc.).

Para trabalhos de theming mais profundos — definindo tokens de cor da marca, tokens semânticos com valores de modo escuro, criação completa de recipes/slot-recipes, typegen ou ejeção do tema padrão — leia references/theming.md antes de responder. Ele cobre a API completa defineConfig / createSystem com exemplos completos.

Para qualquer solicitação de gráfico — gráficos de barras, gráficos de área, gráficos de linhas, gráficos de pizza/rosquinha, BarList, BarSegment ou qualquer coisa envolvendo @chakra-ui/charts — leia references/charts.md antes de responder. Ele cobre o hook useChart, todos os três tipos de gráfico, integração com Recharts, tokens de cor e exemplos executáveis completos.

Quando você não tiver certeza de qual componente usar, ou o usuário não tiver especificado um, leia references/component-decision-tree.md. Ele cobre todos os componentes do Chakra com orientação sobre quando escolher um em vez de uma alternativa semelhante.


Formato de saída

Produza:

  1. Código completo e executável — imports corretos, sem placeholders como TODO ou ...resto do componente
  2. Instruções de importação adequadas — agrupe imports do Chakra, depois imports locais
  3. Separação de componentes — divida em múltiplos componentes/arquivos se o componente for complexo ou contiver partes claramente separáveis
  4. Estilos responsivos — no mínimo breakpoints base e md para layout
  5. Breve explicação após o código — 2–4 frases sobre as principais decisões tomadas (abordagem de layout, escolhas de acessibilidade, estratégia responsiva). Pule a explicação se a solicitação foi trivial.
// Bom estilo de importação
import { Box, Button, Field, Stack, Text } from "@chakra-ui/react"
// Depois local
import { SomeLocalComponent } from "./SomeLocalComponent"

Quando perguntar primeiro

Construa imediatamente se a solicitação for clara o suficiente para produzir algo útil. Pergunte primeiro quando:

  • O formato dos dados é desconhecido e altera toda a estrutura (por exemplo, "construa uma tabela" — quantas colunas? quais dados?)
  • Existem escolhas de design significativas sobre as quais o usuário pode se importar (direção do layout, número de colunas, paleta de cores)
  • O usuário faz referência a arquivos ou componentes existentes que você não viu

Em caso de dúvida, declare suas suposições no topo da resposta e construa — é mais rápido para o usuário redirecionar a partir de algo concreto do que a partir de nada.

Habilidades Relacionadas