O que shadcn-svelte faz?
Um framework para construir UI, componentes e sistemas de design para Svelte. Os componentes são adicionados como código-fonte ao projeto do usuário através da CLI.
IMPORTANTE: Execute todos os comandos da CLI usando o executor de pacotes do projeto:
npx shadcn-svelte@latest,pnpm dlx shadcn-svelte@latestoubunx --bun shadcn-svelte@latest— com base no gerenciador de pacotes do projeto. Os exemplos abaixo usamnpx shadcn-svelte@latest, mas substitua pelo executor correto para o projeto.
Contexto Atual do Projeto
Leia components.json na raiz do projeto e, quando precisar do layout de arquivos ativo, liste o diretório fornecido pelo caminho aliases.ui (resolvido com as mesmas regras da CLI).
Importações (Svelte)
Cada componente vive em sua própria pasta com um barrel index.ts. Siga a documentação de instalação:
- Componentes multi-parte (dialog, select, card, field, tabs, …):
import * as Dialog from "$lib/components/ui/dialog"entãoDialog.Content,Dialog.Title,Card.Root,Card.Header, etc. — tudo o que o barrel exportar (nomes curtos e/ou aliasesRoot as …). - Barrels de componente único (apenas um componente significativo na pasta): importações nomeadas —
import { Button } from "$lib/components/ui/button"e<Button>, nãoimport * as Button+Button.Root. Mesmo padrão para{ Input },{ Badge },{ Spinner },{ Checkbox },{ Separator },{ Skeleton }, etc.
import * as Dialog from "$lib/components/ui/dialog";
import { Button } from "$lib/components/ui/button";
import { Separator } from "$lib/components/ui/separator";
Use os aliases reais de components.json (geralmente $lib/components/ui/...), não caminhos fixos.
Princípios
- Use componentes existentes primeiro. Execute
npx shadcn-svelte@latest addsem argumentos para navegar pelos componentes disponíveis, ou verifique Componentes antes de escrever UI personalizada. - Componha, não reinvente. Página de configurações = Tabs + Card + controles de formulário. Dashboard = Sidebar + Card + Chart + Table.
- Use variantes integradas antes de estilos personalizados.
variant="outline",size="sm", etc. - Use cores semânticas.
bg-primary,text-muted-foreground— nunca valores brutos comobg-blue-500.
Regras Críticas
Estas regras são sempre aplicadas. Cada uma tem links para um arquivo com pares Incorreto/Correto.
Estilização e Tailwind → styling.md
classpara layout, não estilização. Nunca substitua cores ou tipografia de componentes.- Sem
space-x-*ouspace-y-*. Useflexcomgap-*. Para pilhas verticais,flex flex-col gap-*. - Use
size-*quando largura e altura são iguais.size-10nãow-10 h-10. - Use a abreviação
truncate. Nãooverflow-hidden text-ellipsis whitespace-nowrap. - Sem substituições manuais de
dark:. Use tokens semânticos (bg-background,text-muted-foreground). - Use
cn()para classes condicionais. Não escreva ternários manuais com template literals. - Sem
z-indexmanual em componentes de sobreposição. Dialog, Sheet, Popover, etc. gerenciam sua própria pilha.
Formulários e Inputs → forms.md
- Formulários usam
Field.FieldGroup+Field.Field. Nunca usedivbruto comspace-y-*ougrid gap-*para layout de formulário. InputGroupusaInputGroup.Input/InputGroup.Textarea. NuncaInput/Textareabruto dentro deInputGroup.Root.- Botões dentro de inputs usam
InputGroup.Root+InputGroup.Addon. - Conjuntos de opções (2–7 escolhas) usam
ToggleGroup. Não faça loop deButtoncom estado ativo manual. Field.FieldSet+Field.FieldLegendpara agrupar checkboxes/radios relacionados. Não use umadivcom um cabeçalho.- Validação de campo usa
data-invalid+aria-invalid.data-invalidnoField,aria-invalidno controle. Para desabilitado:data-disablednoField,disabledno controle.
Estrutura de Componentes → composition.md
- Itens sempre dentro de seu Grupo.
Select.Item→Select.Group.DropdownMenu.Item→DropdownMenu.Group.Command.Item→Command.Group. - Gatilhos personalizados. Envolva controles em
Dialog.Trigger/AlertDialog.Trigger, ou controle o estado aberto combind:openna raiz — veja a documentação do componente. - Dialog, Sheet e Drawer sempre precisam de um Title.
Dialog.Title,Sheet.Title,Drawer.Titleobrigatório para acessibilidade. Useclass="sr-only"se oculto visualmente. - Use a composição completa do Card.
Card.Header/Card.Title/Card.Description/Card.Content/Card.Footer. Não jogue tudo emCard.Content. - Button não tem
isPending/isLoading. Componha comSpinnerdentro deButton+disabled; usedata-icon="inline-start"/inline-endnoSpinnerpara espaçamento correto (import { Button },import { Spinner }). Tabs.Triggerdeve estar dentro deTabs.List. Nunca renderize gatilhos diretamente emTabs.Avatarsempre precisa deAvatar.Fallback. Para quando a imagem falha ao carregar.
Use Componentes, Não Marcação Personalizada → composition.md
- Use componentes existentes antes de marcação personalizada. Verifique se um componente existe antes de escrever uma
divestilizada. - Callouts usam
Alert. Não construa divs estilizadas personalizadas. - Estados vazios usam
Empty. Não construa marcação de estado vazio personalizada. - Toast via
svelte-sonner. Usetoast()desvelte-sonnercom o componente Sonner da sua pasta UI. - Use
Separatorem vez de<hr>ou umadivcom classes apenas de borda. - Use
Skeletonpara placeholders de carregamento. Sem divsanimate-pulsepersonalizadas. - Use
Badgeem vez de spans estilizados personalizados.
Ícones → icons.md
- Ícones em
<Button>usamdata-icon.data-icon="inline-start"oudata-icon="inline-end"no ícone. - Sem classes de tamanho em ícones dentro de componentes. Os componentes lidam com o tamanho dos ícones via CSS. Sem
size-4ouw-4 h-4. - Passe ícones como componentes. Importe da
iconLibraryconfigurada (ex.:@lucide/svelte), não chaves de string.
CLI
- Presets — copie a string codificada do construtor de sistema de design em shadcn-svelte.com e passe para
npx shadcn-svelte@latest init --preset <code>.
Padrões Chave
Estes são os padrões mais comuns que diferenciam o código correto de shadcn-svelte. Para casos extremos, veja os arquivos de regras vinculados acima.
<script lang="ts">
import * as Field from "$lib/components/ui/field";
import { Input } from "$lib/components/ui/input";
import { Button } from "$lib/components/ui/button";
import SearchIcon from "@lucide/svelte/icons/search";
import { Badge } from "$lib/components/ui/badge";
import * as Avatar from "$lib/components/ui/avatar";
</script>
<!-- Layout de formulário: Field.FieldGroup + Field.Field, não div + Label. -->
<Field.FieldGroup>
<Field.Field>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" />
</Field.Field>
</Field.FieldGroup>
<!-- Validação: data-invalid no Field, aria-invalid no controle. -->
<Field.Field data-invalid>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" aria-invalid />
<Field.FieldDescription>Email inválido.</Field.FieldDescription>
</Field.Field>
<!-- Ícones em botões: data-icon, sem classes de tamanho. -->
<Button>
<SearchIcon data-icon="inline-start" />
Pesquisar
</Button>
<!-- Espaçamento: gap-*, não space-y-*. -->
<div class="flex flex-col gap-4"></div>
<!-- Dimensões iguais: size-*, não w-* h-*. -->
<Avatar.Root class="size-10">
<Avatar.Image src="/u.png" alt="Usuário" />
<Avatar.Fallback>U</Avatar.Fallback>
</Avatar.Root>
<!-- Cores de status: variantes de Badge ou tokens semânticos, não cores brutas. -->
<Badge variant="secondary">+20.1%</Badge>
Seleção de Componentes
| Necessidade | Use |
|---|---|
| Botão/ação | Button com variante apropriada (import { Button }) |
| Inputs de formulário | Input, Select, Combobox, Switch, Checkbox, RadioGroup, Textarea, InputOTP, Slider |
| Alternar entre 2–5 opções | ToggleGroup.Root + ToggleGroup.Item |
| Exibição de dados | Table, Card, Badge, Avatar |
| Navegação | Sidebar, NavigationMenu, Breadcrumb, Tabs, Pagination |
| Sobreposições | Dialog (modal), Sheet (painel lateral), Drawer (folha inferior), AlertDialog (confirmação) |
| Feedback | svelte-sonner (toast), Alert, Progress, Skeleton, Spinner |
| Paleta de comandos | Command dentro de Dialog |
| Gráficos | Chart (LayerChart) |
| Layout | Card, Separator, Resizable, ScrollArea, Accordion, Collapsible |
| Estados vazios | Empty |
| Menus | DropdownMenu, ContextMenu, Menubar |
| Dicas/informação | Tooltip, HoverCard, Popover |
Campos Chave
Use components.json e o sistema de arquivos — não um comando info separado:
aliases→ use o prefixo de alias real da configuração (ex.:$lib/), nunca codifique projetos não relacionados.tailwind.css→ o arquivo CSS global onde as variáveis de tema residem. Edite este arquivo para ajustes de tema; não adicione um segundo arquivo globals a menos que o usuário já use um.style→ tratamento visual (ex.:nova,vega, …) e caminho de estilo do registro.iconLibrary→ determina os pacotes de ícones (@lucide/svelte,@tabler/icons-svelte, etc.). Nunca presuma@lucide/svelte.registry→ de onde a CLI busca componentes; registro oficial padrão emshadcn-svelte.com.resolvedPaths(conceitual) → a CLI resolvealiasespara caminhos absolutos; listealiases.uino disco para ver os componentes instalados.
Veja cli.md para comandos e flags.
Documentação de Componentes, Exemplos e Uso
Abra https://shadcn-svelte.com/docs/components/<name>.md para documentação e exemplos. Ao criar, corrigir, depurar ou usar um componente, leia a página oficial primeiro para seguir as APIs documentadas.
Fluxo de Trabalho
- Obter contexto do projeto — leia
components.jsone liste o diretório de componentes UI quando necessário. - Verificar componentes instalados primeiro — antes de executar
add, liste os arquivos sob o caminhouiresolvido. Não importe componentes que não foram adicionados e não adicione novamente os já presentes a menos que esteja atualizando. - Descobrir componentes —
npx shadcn-svelte@latest addsem argumentos (lista interativa), ou o site de documentação. - Instalar ou atualizar —
npx shadcn-svelte@latest add <name>ou uma URL de registro. Para atualizar arquivos existentes do registro, usenpx shadcn-svelte@latest update(veja cli.md). - Corrigir importações em itens de terceiros / adicionados por URL — Após adicionar de uma URL de registro personalizada, verifique se há caminhos codificados que não correspondem aos
aliasesdo projeto. Reescreva as importações para usar os aliasesui/libdo projeto decomponents.json. - Revisar componentes adicionados — Após adicionar, leia os arquivos adicionados e verifique a composição (grupos, títulos, atributos de validação). Alinhe as importações de ícones com
iconLibrary. - Itens de registro remoto — Adicionar por URL é explícito; se o usuário quiser um componente de uma fonte desconhecida, confirme a URL do registro ou o item antes de executar
add.
Sistemas de Design a partir de DESIGN.md
Quando o usuário pedir um sistema de design a partir de um DESIGN.md (ou uma especificação de marca), com ou sem um preset, siga design-system.md de ponta a ponta:
- Para um novo aplicativo, crie o esqueleto do SvelteKit com
npx sv create <app>(ou Svelte + Vite quando solicitado), depois inicialize comnpx shadcn-svelte@latest init --preset <code>. Sem um código, escolha um estilo que se encaixe no DESIGN.md e passe seu nome, ex.:init --preset luma; códigos de preset React e flags de scaffolding não se aplicam. Em um aplicativo existente, preserve personalizações locais. - Instale todos os componentes com
add --all --yesem um novo aplicativo; adicione apenas componentes ausentes em um existente. - Leia o frontmatter do DESIGN.md, os Faça e Não Faça, e as Lacunas Conhecidas antes de editar.
- Mapeie seus tokens para as variáveis em
tailwind.cssdecomponents.json. Fixe a escala de raio, sombras, fontes e utilitáriostype-*. - Reestilize as variantes
tailwind-variantsinstaladas e o CSS de estilo associado. Altere as alturas dos controles juntas. - Construa a página de acordo com design-system-page.md: papéis de cor verificados por contraste, espécimes de tipo, matrizes de estado fixas, casos extremos, pares faça/não faça, receitas. Verifique as importações com
scripts/showcase-coverage.mjs, depois verifique se cada componente renderiza. - Verifique em um navegador:
svelte-check, build de produção incluindo SSR, sem erros no console, carrega no topo, sem overflow horizontal, modo escuro.
Atualizando Componentes
Use o comando update para puxar as versões mais recentes do registro dos componentes já no projeto. Revise as alterações com git diff após update.
- Faça commit ou stash do trabalho local.
- Execute
npx shadcn-svelte@latest update [component]ou--all. - Resolva conflitos de merge se você personalizou arquivos.
- Nunca use
--overwritenoaddsem a aprovação explícita do usuário quando isso destruir edições intencionais.
Referência Rápida
# Inicializar shadcn-svelte em um novo projeto
npx shadcn-svelte@latest init
# Adicionar um componente
npx shadcn-svelte@latest add button
npx shadcn-svelte@latest add https://registry.example.com/button.json
# Adicionar todos os componentes
npx shadcn-svelte@latest add --all
# Atualizar componentes
npx shadcn-svelte@latest update button
npx shadcn-svelte@latest update --all
# Inicializar com um preset
npx shadcn-svelte@latest init --preset <codigo>