Cheatsheet

Cheatsheet — Decisões Rápidas shadcn/ui

Qual componente usar

SituaçãoUsePorque
Poucas opções fixas, sem buscaSelectsimples, sem overhead de filtro
Muitas opções ou precisa buscarComboboxtem filtro/itemToStringValue
SSR puro sem JS extraNativeSelect<select> nativo
Seleção múltipla com tagsCombobox multiple+ComboboxChipsSelect não suporta multi
Notificação transitóriaToast (toast.add)não bloqueia UI
Ação reversível c/ desfazerToast + actionProps (Undo)evita AlertDialog p/ ação leve
Confirmação destrutiva/irreversívelAlert Dialognão fecha ao clicar fora, força decisão
Modal comum (form, detalhes)Dialogfecha ao clicar fora
Painel lateral (filtros, carrinho)Sheetside configurável
Modal mobile-firstDrawerswipe nativo, snapPoints
Modal que troca por telaDialog(desktop)+Drawer(mobile) via useMediaQueryver patterns.md
Tabela simples sem interaçãoTablesó marcação
Tabela c/ sort/filter/paginaçãoData Table (TanStack Table v9 + Table)Table sozinha não tem esses recursos
GráficoChart (Recharts)já integra --chart-1..5
Menu por cliqueDropdown Menutrigger explícito
Menu por botão direitoContext Menumesma API, onContextMenu
Barra de menu desktop-styleMenubarmúltiplos MenubarMenu
Paleta de comandos (Cmd+K)Command + CommandDialogusa cmdk, não Base UI
Preview rico ao hoverHover Carddelay/closeDelay
Popup rico ao cliquePopoverclique/foco, não hover
Dica curta ao hoverTooltipprecisa TooltipProvider na raiz
Loading com forma conhecidaSkeletonforma final já conhecida
Loading indeterminado inlineSpinneranimate-spin + data-icon
Progresso conhecido (%)Progressvalor controlado
Estado vazioEmptyícone/título/descrição/ação padrão
Lista estática c/ mídia/açõesItemField é só p/ input de form
Card clicável inteiroChoice Card (FieldLabel envolve Field)ver patterns.md

Instalação por framework

FrameworkAlias
Next.js, Vite, Astro, Laravel, TanStack Router/Start@/components/ui/*
Remix, React Router~/components/ui/*
Gatsby@/components/ui/*, só Tailwind v3

Todos: npx shadcn@latest init (ou create --template <fw>). Vite e Gatsby exigem configurar o alias tanto no tsconfig quanto no arquivo de build. Projeto existente: Tailwind + cn helper manual, depois shadcn init puro.

Formulários: qual lib

Lib no projetoUseErro
React Hook FormController+zodResolverfieldState.invalid pronto
TanStack Formform.Field render-propfield.state.meta.isTouched && !isValid (manual)
Formisch (Valibot)<Field of={form} path={[...]}> + funções top-levelfield.errors (array, mapear p/ {message})
Nenhuma (Next.js simples)useActionState+Server Action+Zod safeParseroundtrip ao servidor

Sempre: data-invalid no Field pai + aria-invalid no controle, nos dois lugares.

Checklist: criar um registry próprio

  1. registry.json na raiz (name/homepage/items, ou include se dividir por domínio)
  2. Cada item em registry-item.json com type certo: registry:ui/hook/lib/block, registry:page/file (exige target), registry:base (design system), registry:font, registry:item (universal)
  3. files[].target com @components/, @ui/, @lib/, @hooks/ em vez de path hardcoded
  4. registryDependencies pra reaproveitar itens (nome simples, @namespace/item, owner/repo/item#ref, URL/path local)
  5. shadcn build gera o JSON estático publicado
  6. Privado: header Authorization via components.json#registries.@nome.headers, 401/403 customizado (Open in v0 só aceita ?token= em query)
  7. Landing+CLI na mesma URL: content negotiation por Accept/User-Agent, Vary correto
  8. Testar com npx shadcn add @nome/item; opcional registrar em registries.json pra @namespace curto global

Outras decisões rápidas

  • Toast vs Sonner: mesma coisa; Sonner é o alias histórico da mesma API
  • Button de link vs Button real: <a> que navega usa buttonVariants(); Button real força role="button" (só ação, não navegação)
  • Accordion vs Collapsible: Accordion é lista de seções com uma/algumas abertas por vez; Collapsible é o primitivo genérico pra um bloco só
  • Slider vs Progress: Slider é input do usuário; Progress é só display
  • RTL: criar já com --rtl quando souber de antemão; migrar depois exige shadcn migrate rtl + ajuste manual de Calendar/Pagination/Sidebar