Para desenvolvedores web, a busca pelo kit de ferramentas de UI perfeito é um esforço constante. Por anos, desenvolvedores React confiaram em bibliotecas de componentes tradicionais como Material-UI (MUI), Ant Design e Chakra UI. Essas bibliotecas oferecem uma vasta gama de componentes pré-construídos, prometendo acelerar o desenvolvimento. No entanto, elas frequentemente vêm com uma desvantagem: falta de controle, substituições de estilo que parecem uma batalha e tamanhos de bundle inflados.
Apresentando o Shadcn UI, uma abordagem que muda paradigmas e que conquistou a comunidade React. Não é uma biblioteca de componentes como você está acostumado; é algo melhor. É uma coleção de componentes lindamente projetados, acessíveis e infinitamente reutilizáveis que você não instala do npm como uma dependência — você os copia diretamente para o seu projeto.
Este tutorial abrangente, com 4000 palavras, servirá como seu guia definitivo, levando você de um iniciante completo a um praticante confiante do Shadcn UI. Exploraremos sua filosofia fundamental, detalharemos a configuração, construiremos UIs complexas, dominaremos temas avançados e manipulação de formulários, e discutiremos as melhores práticas para aplicações em larga escala. Prepare-se para repensar o que você espera de um kit de ferramentas de UI.
Quer uma plataforma integrada, Tudo-em-Um para sua Equipe de Desenvolvedores trabalhar com máxima produtividade?
Apidog entrega todas as suas demandas, e substitui o Postman por um preço muito mais acessível!
A Filosofia do Shadcn UI - Uma Nova Forma de Construir
Antes de escrever uma única linha de código, é fundamental entender por que o Shadcn UI existe e quais problemas ele resolve. Compreender essa filosofia central é a chave para liberar todo o seu potencial.
O Que o Shadcn UI Não É
- Não é um pacote npm tradicional. Você não encontrará
shadcn-ui
na lista de dependências do seupackage.json
. Esta é a distinção mais crucial. - Não é uma biblioteca monolítica. Não força você a instalar centenas de componentes quando você só precisa de um botão e um campo de entrada.
- Não é restritivo. Você nunca fica preso a uma estética de design específica ou limitado pelas capacidades de temas fornecidas pelos mantenedores de uma biblioteca.
O Que o Shadcn UI É
- Uma Coleção de Código Reutilizável: Pense nisso como um conjunto de receitas cuidadosamente selecionadas por especialistas. Você escolhe a receita que deseja (por exemplo, um componente
Card
), e as instruções (o código) são fornecidas para você cozinhar em sua própria cozinha (seu projeto). - Um Compromisso com a Propriedade do Código: Uma vez que você adiciona um componente Shadcn, seu código-fonte — um arquivo
.tsx
— é colocado diretamente em sua base de código, geralmente sobcomponents/ui/
. Agora é seu componente. Você pode mudar sua estrutura, seus estilos, sua lógica — qualquer coisa. Isso elimina a experiência frustrante de lutar com substituições de CSS!important
ou APIs de props complexas para conseguir uma simples alteração visual. - Construído em uma Base Moderna e Sólida: O Shadcn UI não reinventa a roda. Ele se apoia nos ombros de gigantes:
- Tailwind CSS: Um framework CSS focado em utilidades que fornece blocos de construção de baixo nível para criar qualquer design diretamente em sua marcação. Os componentes Shadcn são estilizados exclusivamente com Tailwind, tornando-os incrivelmente fáceis de personalizar se você estiver familiarizado com o framework.
- Radix UI: Uma biblioteca de primitivas de UI de baixo nível, sem estilo e acessíveis. O Radix lida com todos os aspectos complexos e frequentemente negligenciados dos componentes de UI, como navegação por teclado, gerenciamento de foco e atributos ARIA para acessibilidade (a11y). O Shadcn pega essas primitivas poderosas e "headless" e adiciona um estilo bonito com Tailwind CSS.
A principal vantagem deste modelo é a fusão de velocidade e controle. Você obtém a velocidade inicial de usar componentes pré-construídos sem sacrificar a flexibilidade e a manutenibilidade a longo prazo que vêm de possuir seu próprio código.
Preparando o Terreno - Configuração e Instalação do Projeto
Vamos transitar da teoria para a prática. Configuraremos um novo projeto do zero. Para este guia, usaremos principalmente o Next.js, pois seus componentes de servidor e roteamento baseado em arquivos se alinham perfeitamente com o ethos do Shadcn UI. Também abordaremos brevemente a configuração para Vite.
Passo 1: Pré-requisitos do Ambiente
Certifique-se de que seu ambiente de desenvolvimento está pronto. Você precisará de:
- Node.js: A versão mais recente de Suporte de Longo Prazo (LTS) é recomendada. Você pode baixá-la no site oficial do Node.js.
- Um Gerenciador de Pacotes: Este tutorial usará
npm
, que vem junto com o Node.js. Você também pode usaryarn
oupnpm
.
Passo 2: Criando uma Nova Aplicação Next.js
Abra seu terminal e execute o seguinte comando para inicializar um novo projeto Next.js.Bash
npx create-next-app@latest my-pro-shadcn-app --typescript --tailwind --eslint
Este comando estrutura uma nova aplicação em um diretório chamado my-pro-shadcn-app
. Incluímos algumas flags importantes:
--typescript
: O Shadcn UI é escrito em TypeScript e funciona melhor em um ambiente TypeScript.--tailwind
: O Tailwind CSS é uma dependência forte para a estilização do Shadcn UI.--eslint
: Sempre uma boa prática para manter a qualidade do código.
O instalador fará algumas perguntas. Estas são as escolhas recomendadas para uma configuração moderna do Next.js 14+:
✔ Would you like to use `src/` directory? … No / **Yes**
✔ Would you like to use App Router? (recommended) … No / **Yes**
✔ Would you like to customize the default import alias? … **No** / Yes
Usar o App Router é uma prática padrão, e o diretório src/
ajuda na organização do código. Uma vez feito, navegue para o seu novo projeto:Bash
cd my-pro-shadcn-app
Passo 3: O Comando init
- Dando Vida ao Shadcn UI
Este é o passo mais importante. O Shadcn UI fornece uma ferramenta CLI para configurar seu projeto. Execute o seguinte comando a partir do diretório raiz do seu projeto:Bash
npx shadcn-ui@latest init
Isso iniciará um questionário interativo para configurar seu projeto. Vamos detalhar cada pergunta e seu significado:
- Gostaria de usar TypeScript (recomendado)?
Sim
. Estamos em um projeto TypeScript. - Qual estilo você gostaria de usar?
Default
vs.New York
. Estes são dois estilos visuais pré-definidos.Default
é um pouco mais espaçoso, enquantoNew York
é mais compacto. Você pode ver exemplos no site do Shadcn UI. Vamos escolherDefault
. - Qual cor você gostaria de usar como cor base? Isso configura a paleta de cores primárias para sua UI. O padrão é
Slate
. Vamos manterSlate
por enquanto; aprenderemos como mudar isso mais tarde. - Onde está seu arquivo
global.css
? O CLI detecta corretamente emsrc/app/globals.css
. Este arquivo é onde as variáveis CSS principais para temas serão injetadas. - Você quer usar variáveis CSS para temas?
Sim
. Este é o pilar do sistema de temas do Shadcn, permitindo mudanças dinâmicas (como modo claro/escuro) e fácil personalização. - Onde está localizado seu
tailwind.config.ts
? O CLI detectasrc/tailwind.config.ts
. Este arquivo será modificado para integrar os presets de tema do Shadcn. - Configurar alias de importação para componentes:
@/components
. Esta é uma boa prática. Significa que, independentemente de quão aninhado um arquivo esteja, você sempre pode importar um componente com um caminho limpo comoimport { Button } from "@/components/ui/button";
. - Configurar alias de importação para utilitários:
@/lib/utils
. O mesmo que acima, para funções utilitárias. - Você está usando React Server Components?
Sim
. Escolhemos o App Router, que usa Server Components por padrão. - Escrever configuração para
components.json
?Sim
. Isso cria um arquivo crucial que lembra todas as suas escolhas, para que você não precise responder a essas perguntas toda vez que executarnpx shadcn-ui@latest add ...
.
Depois de confirmar, o CLI faz sua mágica:
- Instala Dependências: Adiciona pacotes necessários como
tailwindcss-animate
eclass-variance-authority
. - Cria
components.json
: Armazena suas escolhas de configuração. - Atualiza
tailwind.config.ts
: Injeta o plugin do Shadcn UI e a configuração de temas. - Atualiza
globals.css
: Adiciona um grande bloco de variáveis CSS que definem toda a sua paleta de cores, raios de borda e muito mais. - Cria
lib/utils.ts
: Este arquivo exporta uma função auxiliarcn
, que é uma utilidade inteligente para mesclar condicionalmente classes Tailwind CSS.
Seu projeto agora está totalmente configurado.
(Alternativa: Configuração com Vite)
Se você estiver usando Vite com React, o processo é muito semelhante. Após configurar um projeto Vite + React + TS, você instalaria manualmente o Tailwind CSS e então executaria npx shadcn-ui@latest init. O CLI é inteligente o suficiente para detectar uma configuração Vite e fará perguntas ligeiramente diferentes sobre a localização dos arquivos (por exemplo, index.css em vez de globals.css).
Construindo uma UI - De Componentes Simples a Layouts Complexos
Com a configuração completa, vamos começar a construir. O fluxo de trabalho principal é: identifique uma necessidade, adicione o componente, use-o.
Passo 4: Adicionando e Usando Seus Primeiros Componentes
Vamos limpar o boilerplate padrão do Next.js e construir uma interface simples.
1. Adicionar um Botão:Bash
npx shadcn-ui@latest add button
Observe o que acontece: um novo arquivo, src/components/ui/button.tsx
, é criado. Este é o seu botão. Você é o dono dele.
2. Adicionar um Card:Bash
npx shadcn-ui@latest add card
Este comando é mais interessante. Ele cria src/components/ui/card.tsx
. Se você inspecionar este arquivo, verá que ele exporta múltiplos componentes: Card
, CardHeader
, CardTitle
, CardDescription
, CardContent
e CardFooter
. Este é um padrão comum para componentes compostos.
3. Construir a UI:
Agora, abra src/app/page.tsx
e substitua seu conteúdo pelo seguinte:TypeScript
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input"; // We'll add this next
import { Label } from "@/components/ui/label"; // And this
export default function Home() {
return (
<main className="flex min-h-screen items-center justify-center bg-background p-8">
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-2xl">Create Project</CardTitle>
<CardDescription>
Deploy your new project in one-click.
</CardDescription>
</CardHeader>
<CardContent className="grid gap-4">
<div className="grid gap-2">
<Label htmlFor="name">Name</Label>
<Input id="name" placeholder="Name of your project" />
</div>
<div className="grid gap-2">
<Label htmlFor="framework">Framework</Label>
{/* We'll replace this with a Select component later */}
<Input id="framework" placeholder="e.g. Next.js" />
</div>
</CardContent>
<CardFooter>
<Button className="w-full">Deploy</Button>
</CardFooter>
</Card>
</main>
);
}
Nosso código ainda não funcionará porque estamos faltando os componentes Input
e Label
. Vamos adicioná-los:Bash
npx shadcn-ui@latest add input
npx shadcn-ui@latest add label
Agora, execute seu servidor de desenvolvimento:Bash
npm run dev
Navegue para http://localhost:3000
. Você verá um formulário limpo e com aparência profissional dentro de um card. Observe como usamos classes utilitárias como w-full
, max-w-md
e grid
diretamente em nosso JSX para controlar o layout. Este é o poder de combinar Shadcn e Tailwind CSS.
Passo 5: Introduzindo Componentes Mais Sofisticados
Entradas estáticas são boas, mas aplicações reais precisam de elementos interativos. Vamos aprimorar nosso formulário.
1. Adicionar um Componente Select
: A entrada "Framework" deve ser um dropdown. Vamos adicionar o componente Select
. Este é mais complexo e tem dependências de outros componentes.Bash
npx shadcn-ui@latest add select
O CLI é inteligente. Ele verá que o Select
requer um componente Popover
para funcionar e pedirá sua permissão para instalá-lo e suas dependências também. Esta é uma característica fantástica que impede você de ter que rastrear dependências manualmente.
2. Integrar o Componente Select
: Substitua o Input
para "Framework" em src/app/page.tsx
pelo novo componente Select
.TypeScript
// Add these imports at the top
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
// ... inside the CardContent
<div className="grid gap-2">
<Label htmlFor="framework">Framework</Label>
<Select>
<SelectTrigger id="framework">
<SelectValue placeholder="Select a framework" />
</SelectTrigger>
<SelectContent>
<SelectItem value="nextjs">Next.js</SelectItem>
<SelectItem value="sveltekit">SvelteKit</SelectItem>
<SelectItem value="astro">Astro</SelectItem>
<SelectItem value="nuxt">Nuxt.js</SelectItem>
</SelectContent>
</Select>
</div>
Atualize seu navegador. Agora você tem um dropdown select totalmente funcional e acessível, completo com animações e navegação por teclado adequada, tudo graças ao Radix UI funcionando nos bastidores.
3. Adicionando Feedback ao Usuário com Toast
: O que acontece quando um usuário clica em "Deploy"? Devemos dar a ele algum feedback. O componente Toast
é perfeito para isso.
Primeiro, adicione-o:Bash
npx shadcn-ui@latest add toast
Em seguida, para usar toasts, você precisa adicionar um componente <Toaster />
ao seu layout raiz para que ele possa ser exibido em qualquer lugar na aplicação. Abra src/app/layout.tsx
e modifique-o:TypeScript
import { Toaster } from "@/components/ui/toaster" // Import the Toaster
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
{children}
<Toaster /> {/* Add it here, just before closing body */}
</body>
</html>
)
}
Agora, precisamos de uma maneira de disparar o toast. Usaremos o hook useToast
. Vamos atualizar src/app/page.tsx
para torná-lo um componente cliente e lidar com o clique do botão.TypeScript
'use client'; // <-- Add this at the very top of the file
// ... other imports
import { useToast } from "@/components/ui/use-toast";
export default function Home() {
const { toast } = useToast(); // Get the toast function from the hook
function handleDeploy() {
toast({
title: "Deployment Scheduled!",
description: "Your project 'Name of your project' is being deployed.",
duration: 5000,
});
}
return (
<main className="flex min-h-screen items-center justify-center bg-background p-8">
<Card className="w-full max-w-md">
{/* ... CardHeader and CardContent ... */}
<CardFooter>
<Button className="w-full" onClick={handleDeploy}> {/* Add onClick handler */}
Deploy
</Button>
</CardFooter>
</Card>
</main>
);
}
Agora, quando você clicar no botão "Deploy", uma notificação elegante aparecerá no canto da sua tela.
Construindo um Formulário Profissional com Validação
A maioria das aplicações do mundo real requer um tratamento robusto de formulários, incluindo validação do lado do cliente. A maneira oficial de lidar com isso usando Shadcn UI é combiná-lo com react-hook-form
para gerenciamento de estado e zod
para validação de esquema. Vamos construir isso.
Passo 6: Instalando Dependências de Formulário
Primeiro, vamos instalar as bibliotecas necessárias:Bash
npm install react-hook-form zod @hookform/resolvers
react-hook-form
: Uma biblioteca de formulários performática, flexível e extensível.zod
: Uma biblioteca de declaração e validação de esquema focada em TypeScript.@hookform/resolvers
: Uma biblioteca de ponte para permitir quereact-hook-form
usezod
para validação.
Passo 7: Adicionando o Componente Form
do Shadcn
O Shadcn UI fornece um componente Form
especial que atua como um wrapper para conectar perfeitamente o react-hook-form
com seus componentes de UI.Bash
npx shadcn-ui@latest add form
Isso adicionará src/components/ui/form.tsx
. Este arquivo fornece um conjunto de componentes cientes de contexto (Form
, FormField
, FormItem
, FormLabel
, FormControl
, FormDescription
, FormMessage
) que reduzem drasticamente o boilerplate.
Passo 8: Criando o Esquema de Validação
Em seu src/app/page.tsx
, vamos definir a forma e as regras dos dados do nosso formulário usando zod
.TypeScript
// Add these imports at the top
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
Agora, vamos criar o esquema logo acima do nosso componente Home
:TypeScript
const formSchema = z.object({
projectName: z.string().min(2, {
message: "Project name must be at least 2 characters.",
}).max(50, {
message: "Project name must not exceed 50 characters.",
}),
framework: z.string({
required_error: "Please select a framework to display.",
}),
});
Este esquema define dois campos: projectName
deve ser uma string entre 2 e 50 caracteres, e framework
é uma string obrigatória.
Passo 9: Conectando o Formulário
Agora, vamos refatorar nosso componente Home
para usar todas essas novas ferramentas.TypeScript
export default function Home() {
const { toast } = useToast();
// 1. Define your form.
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
projectName: "",
},
});
// 2. Define a submit handler.
function onSubmit(values: z.infer<typeof formSchema>) {
// Do something with the form values.
// ✅ This will be type-safe and validated.
console.log(values);
toast({
title: "You submitted the following values:",
description: (
<pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4">
<code className="text-white">{JSON.stringify(values, null, 2)}</code>
</pre>
),
});
}
// 3. Build the JSX with Shadcn's Form components
return (
<main className="flex min-h-screen items-center justify-center bg-background p-8">
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-2xl">Create Project</CardTitle>
<CardDescription>
Deploy your new project in one-click.
</CardDescription>
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<FormField
control={form.control}
name="projectName"
render={({ field }) => (
<FormItem>
<FormLabel>Name</FormLabel>
<FormControl>
<Input placeholder="Name of your project" {...field} />
</FormControl>
<FormDescription>
This is your public display name.
</FormDescription>
<FormMessage /> {/* Displays validation errors */}
</FormItem>
)}
/>
<FormField
control={form.control}
name="framework"
render={({ field }) => (
<FormItem>
<FormLabel>Framework</FormLabel>
<Select onValueChange={field.onChange} defaultValue={field.value}>
<FormControl>
<SelectTrigger>
<SelectValue placeholder="Select a framework" />
</SelectTrigger>
</FormControl>
<SelectContent>
<SelectItem value="nextjs">Next.js</SelectItem>
<SelectItem value="sveltekit">SvelteKit</SelectItem>
<SelectItem value="astro">Astro</SelectItem>
<SelectItem value="nuxt">Nuxt.js</SelectItem>
</SelectContent>
</Select>
<FormDescription>
The framework you want to deploy.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="w-full">Deploy</Button>
</form>
</Form>
</CardContent>
</Card>
</main>
);
}
Este é um trecho de código significativo, mas é um padrão incrivelmente poderoso e escalável. O componente FormField
lida com todas as conexões de estado, e FormMessage
exibe automaticamente o erro de validação correto do seu esquema zod
quando um usuário interage com o campo. Tente enviar o formulário com um nome de projeto vazio para ver a validação em ação.
Dominando Temas e Personalização
O verdadeiro poder do Shadcn UI é liberado quando você começa a torná-lo seu.
Passo 10: Temas Avançados com Variáveis CSS
Todo o seu tema é definido por variáveis CSS em src/app/globals.css
. Abra este arquivo e procure pelos blocos :root
e .dark
.CSS
/* Example from globals.css */
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
/* ... and many more */
--radius: 0.5rem;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 11.2%;
/* ... */
}
- Mudando Cores: Os valores são representados como valores HSL (Hue, Saturation, Lightness) sem o wrapper
hsl()
. Esta é uma escolha deliberada para facilitar a manipulação. Para mudar a cor primária da sua marca, você só precisa encontrar os valores HSL para sua cor e atualizar as variáveis--primary
e--primary-foreground
. A página Shadcn UI Themes tem um gerador fantástico que permite escolher uma cor e copiar e colar o bloco de tema inteiro. - Mudando o Raio da Borda: Quer cantos mais nítidos? Mude
--radius: 0.5rem;
para--radius: 0.2rem;
ou até mesmo0rem
. Cada componente que tem cantos arredondados usa esta variável, então sua mudança se propagará globalmente.
Implementando o Modo Escuro:
O Shadcn é pré-configurado para o modo escuro graças ao bloco de classe .dark e à estratégia darkMode: "class" do Tailwind em tailwind.config.ts. Tudo o que você precisa é uma maneira de alternar a classe dark no elemento <html>. Uma biblioteca popular para isso é next-themes.
- Instale-a:
npm install next-themes
- Crie um componente
ThemeProvider
(src/components/theme-provider.tsx
): TypeScript
"use client"
import * as React from "react"
import { ThemeProvider as NextThemesProvider } from "next-themes"
import { type ThemeProviderProps } from "next-themes/dist/types"
export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}
- Envolva seu
RootLayout
neste provider (src/app/layout.tsx
): TypeScript
import { ThemeProvider } from "@/components/theme-provider"
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en" suppressHydrationWarning>
<body>
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
{children}
<Toaster />
</ThemeProvider>
</body>
</html>
)
}
- Finalmente, crie um botão de alternância (por exemplo,
src/components/mode-toggle.tsx
): TypeScript
"use client"
import * as React from "react"
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
import { Button } from "@/components/ui/button"
export function ModeToggle() {
const { theme, setTheme } = useTheme()
return (
<Button
variant="outline"
size="icon"
onClick={() => setTheme(theme === "light" ? "dark" : "light")}
>
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
<span className="sr-only">Toggle theme</span>
</Button>
)
}
Agora você pode colocar este <ModeToggle />
em qualquer lugar da sua aplicação para obter um alternador de modo escuro ciente do sistema e que pode ser sobrescrito pelo usuário.
Passo 11: Personalizando o Código-Fonte do Componente
Este é o superpoder definitivo. Digamos que você queira uma nova variante de sucesso para o seu botão que tenha um fundo verde.
Abra src/components/ui/button.tsx. Encontre a definição de buttonVariants. Ela usa cva (Class Variance Authority). Simplesmente adicione uma nova variante:TypeScript
const buttonVariants = cva(
// ... base styles
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
success: "bg-green-600 text-white hover:bg-green-600/90", // Our new variant
},
// ... size variants
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
É isso. Agora você pode usá-lo em seu código: <Button variant="success">Success</Button>
. Você não precisou escrever substituições de CSS complexas. Você apenas editou o próprio código-fonte do componente. Este fluxo de trabalho é simples, previsível e incrivelmente poderoso.
Parte 6: Melhores Práticas e o Caminho a Seguir
À medida que sua aplicação cresce, aqui estão algumas melhores práticas para ter em mente.
- Organização de Arquivos: Embora o CLI coloque tudo em
components/ui
, esta pasta deve ser considerada seu kit de UI "base". Para componentes mais complexos que você compõe por conta própria (por exemplo, umUserProfileCard
que usaCard
,Avatar
eButton
do Shadcn), crie-os em um diretório diferente, comocomponents/shared
oucomponents/features
. Isso mantém uma separação clara entre a UI fundamental e os componentes específicos da aplicação. - Atualizações de Componentes: Como você obtém atualizações se o componente Shadcn UI original for melhorado? O CLI resolve isso. Você pode executar
npx shadcn-ui@latest add button
novamente. O CLI detectará que você já tem um arquivobutton.tsx
e mostrará uma comparaçãodiff
, permitindo que você sobrescreva seu arquivo ou aceite as mudanças manualmente. É como um mini controle de versão para seus componentes. - Aproveite a Acessibilidade: Lembre-se de que os componentes Shadcn são acessíveis de fábrica porque são construídos sobre primitivas Radix. Ao personalizá-los, tenha cuidado para não quebrar essa acessibilidade. Por exemplo, se você mudar as cores de um botão, certifique-se de que o texto ainda tenha contraste suficiente. Ao construir novos componentes, tente seguir os padrões estabelecidos por Shadcn/Radix para manter a navegabilidade por teclado e o suporte a leitores de tela.
Conclusão: Você É o Autor da Biblioteca
Você agora viajou da filosofia central do Shadcn UI para a implementação de padrões avançados do mundo real. Você viu que sua verdadeira inovação não são apenas os componentes em si, mas a mudança de paradigma que ele representa. Ele move os desenvolvedores de serem meros consumidores de uma biblioteca para serem curadores e proprietários de seu próprio kit de ferramentas de UI.
Ao fornecer o código-fonte bruto, construindo sobre as bases sólidas do Tailwind CSS e Radix UI, e oferecendo uma experiência de CLI fluida, o Shadcn UI atinge o equilíbrio perfeito entre a velocidade de desenvolvimento inicial e a manutenibilidade a longo prazo e a liberdade criativa. Você não está mais limitado pelo sistema de design de outra pessoa. Os componentes em seu projeto são seus — para modificar, estender e aperfeiçoar.
O futuro da UI da sua aplicação não está mais nas mãos de uma dependência de terceiros; está bem ali na sua pasta components
. Boa construção.
Quer uma plataforma integrada, Tudo-em-Um para sua Equipe de Desenvolvedores trabalhar com máxima produtividade?
Apidog entrega todas as suas demandas, e substitui o Postman por um preço muito mais acessível!