A camada entrega o tema como ficheiros que podes sombrear. Três níveis, do menor
para o maior — e o menor que resolva o problema é o certo, porque um componente
que substituis é um componente que passas a manter.

## Passos

:::steps
1. **Uma cor: redefine o token.** A paleta é o conjunto neutro do shadcn como
   variáveis CSS. Redefine uma na tua própria folha de estilos; não é preciso
   bifurcar o ficheiro da camada.

   ```css [app/assets/css/main.css]
   :root {
     --primary: oklch(0.55 0.2 265);
   }
   .dark {
     --primary: oklch(0.7 0.18 265);
   }
   ```

   Ambos os blocos importam: o tema comuta com uma **classe** `dark`, não com
   uma media query, por isso um token definido uma só vez está errado num dos
   dois modos.

   ::callout{type="warning" title="Verifica o contraste que acabaste de mudar"}
   `--muted-foreground` transporta as descrições das páginas, o índice e a
   navegação estrutural. O valor da camada é deliberadamente mais escuro do que
   o predefinido do shadcn, que mede abaixo de 4,5:1 nas superfícies onde este
   token realmente assenta.
   ::

2. **Uma peça do layout: cria o ficheiro.** O Nuxt resolve primeiro o teu
   componente com o mesmo nome, por isso substituir `DuxtFooter` é criar
   `app/components/DuxtFooter.vue` no teu projeto. Os nomes, props e slots estão
   na [referência de componentes](/reference/components) — um nome documentado
   faz parte da superfície pública, por isso não será renomeado sem um
   lançamento maior.

3. **Um slot, onde exista.** `DuxtPageFeedback` emite `feedback` e expõe o seu
   estado através de um slot, para poderes pendurar o teu próprio formulário sem
   substituir o componente — desenvolvido em
   [Recolher opiniões da página](/guides/collect-page-feedback).

4. **Uma primitiva nova: usa a CLI.** A camada possui os seus componentes
   shadcn-vue em vez de os importar, e o `components.json` já aponta a CLI para
   o alias certo:

   ```bash
   pnpm dlx shadcn-vue@latest add tooltip
   ```

5. **Um componente para Markdown.** Tudo o que estiver em
   `app/components/content/` é invocável a partir de uma página com a sintaxe de
   bloco MDC. O teu ficheiro com o mesmo nome substitui o da camada — ver a
   [referência MDC](/reference/mdc-components).

:::

## Lista de verificação

- [ ] Nada foi copiado da camada que um token pudesse ter mudado
- [ ] Cada token redefinido tem valor para claro e para escuro
- [ ] Os componentes substituídos têm exatamente o nome que a referência lhes dá
- [ ] `pnpm build` continua a apresentar todas as páginas (uma substituição é
      onde o SSR parte)