# WBC - GovBR-DS — 2.1.1
> Documentação completa e guias para a biblioteca de Web Components do GovBR-DS.
Version: 2.1.1
This file contains all documentation content in a single document following the llmstxt.org standard.
## Código de Conduta
## Nosso compromisso
Como pessoas participantes, colaboradoras e líderes, nós nos comprometemos a fazer com que a participação em nossa comunidade seja uma experiência livre de assédio para todas as pessoas, independentemente de idade, tamanho do corpo, deficiência aparente ou não aparente, etnia, características sexuais, identidade ou expressão de gênero, nível de experiência, educação, situação sócio-econômica, nacionalidade, aparência pessoal, raça, religião ou identidade e orientação sexuais.
Comprometemo-nos a agir e interagir de maneiras que contribuam para uma comunidade aberta, acolhedora, diversificada, inclusiva e saudável.
[Veja nosso Código de Conduta completo](https://gov.br/ds/wiki/comunidade/codigo-de-conduta/)
---
## Comece aqui
Escolha sua tecnologia, instale o pacote correspondente e renderize o primeiro componente. As diretrizes visuais continuam no [Padrão Digital de Governo](https://www.gov.br/ds/); este site documenta a implementação.
## Escolha seu caminho
| Tecnologia | Pacote | Melhor para |
| --- | --- | --- |
| HTML ou JavaScript | `@govbr-ds/webcomponents` | Uso direto, sem framework |
| Angular | `@govbr-ds/webcomponents-angular` | Componentes standalone e Reactive Forms |
| React | `@govbr-ds/webcomponents-react` | Props, callbacks, refs e SSR |
| Vue | `@govbr-ds/webcomponents-vue` | Composition API e `v-model` |
Consulte [Integração com frameworks](../frameworks/) para comparar wrappers, SSR e formulários. Para uso sem framework, veja o [guia de CDN](../guias-essenciais/cdn).
## Primeiro componente
```bash npm2yarn
npm install @govbr-ds/core @govbr-ds/webcomponents
```
Importe os estilos uma vez na entrada da aplicação:
```css
@import '@govbr-ds/core/dist/core.min.css';
```
Use o componente:
```html
Continuar
```
## Próximos passos
1. Abra o [catálogo de componentes](../components/).
2. Edite um exemplo no Playground e abra-o no StackBlitz.
3. Clone um dos [quickstarts oficiais](../quickstarts).
4. Consulte a [documentação do componente](../components/) para propriedades, atributos, eventos, slots e CSS Parts.
5. Consulte os guias de [formulários](../frameworks/formularios), [eventos](../guias-essenciais/eventos) e [carregamento/CSP](../guias-tecnicos/carregamento-e-csp) quando a integração não se comportar como esperado.
---
## Compatibilidade
Os pacotes publicados possuem contratos de compatibilidade diferentes. Use a linha correspondente ao pacote que será instalado:
| Pacote | Compatibilidade específica |
| --- | --- |
| `@govbr-ds/webcomponents` | JavaScript/TypeScript com alvo ES2020, Custom Elements, Shadow DOM e navegadores no Baseline Widely Available. |
| `@govbr-ds/webcomponents-angular` | Angular `>=14.0.0`, incluindo `@angular/common`, `@angular/core` e `@angular/forms`, além de `@govbr-ds/webcomponents` `>=2.0.0`. |
| `@govbr-ds/webcomponents-react` | React `^18` ou `^19` e `react-dom` na mesma major, além de `@govbr-ds/webcomponents` `>=2.0.0`. |
| `@govbr-ds/webcomponents-vue` | Vue `>=3.4.38 <4.0.0` e `@govbr-ds/webcomponents` `>=2.0.0`. |
## Navegadores e restrições
Internet Explorer não é suportado. O alvo de navegadores é `baseline widely available`, conforme a configuração do Browserslist do projeto; a lista pode mudar entre releases.
Os contratos críticos são executados em Chromium, Firefox e WebKit. Isso não representa suporte a uma versão específica que não tenha sido validada automaticamente.
## Como interpretar a matriz
As versões acima são as faixas declaradas nas `peerDependencies` dos pacotes. Elas não substituem a compatibilidade do navegador do núcleo: todo wrapper renderiza os Web Components e, portanto, também depende do Baseline Widely Available. O pacote Angular oferece as entradas NgModule e `standalone`; o React oferece uma entrada específica para SSR; e o Vue requer Vue 3, não Vue 2.
## Referências oficiais
- [Compatibilidade de versões do Angular](https://angular.dev/reference/versions) e [Angular Package Format](https://angular.dev/tools/libraries/angular-package-format).
- [Versões e política de versionamento do React](https://react.dev/versions) e [política de versionamento](https://react.dev/community/versioning-policy).
- [FAQ de compatibilidade do Vue](https://vuejs.org/about/faq.html) e [guia de início do Vue 3](https://vuejs.org/guide/quick-start.html).
- [Baseline](https://web.dev/baseline/) e [consulta Baseline do Browserslist](https://github.com/browserslist/browserslist#by-baseline).
Para detalhes de instalação, configuração e formulários, consulte a página da [integração com frameworks](../frameworks/) e o README do pacote correspondente.
---
## Avatar
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/avatar/overview.md";
import Props from "../../stencil-generated-docs/avatar/props.md";
import Parts from "../../stencil-generated-docs/avatar/parts.md";
import Dependencies from "../../stencil-generated-docs/avatar/dependencies.md";
import Migrate from "../../stencil-generated-docs/avatar/sections/migrate.md";
## Exemplo(s)
### Padrão
### Status
---
## Breadcrumb item
import Overview from "../../../stencil-generated-docs/breadcrumb/breadcrumb-item/overview.md";
import Props from "../../../stencil-generated-docs/breadcrumb/breadcrumb-item/props.md";
import Slots from "../../../stencil-generated-docs/breadcrumb/breadcrumb-item/slots.md";
import Events from "../../../stencil-generated-docs/breadcrumb/breadcrumb-item/events.md";
import Dependencies from "../../../stencil-generated-docs/breadcrumb/breadcrumb-item/dependencies.md";
---
## crumb
import Overview from "../../../stencil-generated-docs/breadcrumb/crumb/overview.md";
import Deprecation from "../../../stencil-generated-docs/breadcrumb/crumb/deprecation.md";
import Props from "../../../stencil-generated-docs/breadcrumb/crumb/props.md";
import Slots from "../../../stencil-generated-docs/breadcrumb/crumb/slots.md";
import Events from "../../../stencil-generated-docs/breadcrumb/crumb/events.md";
import Dependencies from "../../../stencil-generated-docs/breadcrumb/crumb/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/breadcrumb/crumb/sections/navigation-migration.md";
---
## Breadcrumb
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/breadcrumb/overview.md";
import Props from "../../stencil-generated-docs/breadcrumb/props.md";
import Slots from "../../stencil-generated-docs/breadcrumb/slots.md";
import Parts from "../../stencil-generated-docs/breadcrumb/parts.md";
import Dependencies from "../../stencil-generated-docs/breadcrumb/dependencies.md";
import Migrate from "../../stencil-generated-docs/breadcrumb/sections/migrate.md";
import NavigationMigration from "../../stencil-generated-docs/breadcrumb/sections/navigation-migration.md";
## Exemplo(s)
---
## Button
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/button/overview.md";
import Props from "../../stencil-generated-docs/button/props.md";
import Slots from "../../stencil-generated-docs/button/slots.md";
import Parts from "../../stencil-generated-docs/button/parts.md";
import Dependencies from "../../stencil-generated-docs/button/dependencies.md";
import Migrate from "../../stencil-generated-docs/button/sections/migrate.md";
import NativeEvents from "../../stencil-generated-docs/button/sections/native-events.md";
## Exemplo(s)
---
## Card
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/card/overview.md";
import Props from "../../stencil-generated-docs/card/props.md";
import Slots from "../../stencil-generated-docs/card/slots.md";
import Parts from "../../stencil-generated-docs/card/parts.md";
import Dependencies from "../../stencil-generated-docs/card/dependencies.md";
import Migrate from "../../stencil-generated-docs/card/sections/migrate.md";
## Exemplo(s)
---
## carousel-page
import Overview from "../../../stencil-generated-docs/carousel/carousel-page/overview.md";
import Props from "../../../stencil-generated-docs/carousel/carousel-page/props.md";
import Slots from "../../../stencil-generated-docs/carousel/carousel-page/slots.md";
import Methods from "../../../stencil-generated-docs/carousel/carousel-page/methods.md";
import Parts from "../../../stencil-generated-docs/carousel/carousel-page/parts.md";
import Dependencies from "../../../stencil-generated-docs/carousel/carousel-page/dependencies.md";
---
## Carousel
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/carousel/overview.md";
import Props from "../../stencil-generated-docs/carousel/props.md";
import Slots from "../../stencil-generated-docs/carousel/slots.md";
import Events from "../../stencil-generated-docs/carousel/events.md";
import Methods from "../../stencil-generated-docs/carousel/methods.md";
import Parts from "../../stencil-generated-docs/carousel/parts.md";
import Dependencies from "../../stencil-generated-docs/carousel/dependencies.md";
## Exemplo(s)
---
## Checkbox
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/checkbox/overview.md";
import Props from "../../stencil-generated-docs/checkbox/props.md";
import Slots from "../../stencil-generated-docs/checkbox/slots.md";
import Events from "../../stencil-generated-docs/checkbox/events.md";
import Methods from "../../stencil-generated-docs/checkbox/methods.md";
import Dependencies from "../../stencil-generated-docs/checkbox/dependencies.md";
import Migrate from "../../stencil-generated-docs/checkbox/sections/migrate.md";
import Validation from "../../stencil-generated-docs/checkbox/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/checkbox/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/checkbox/sections/native-events.md";
## Exemplo(s)
---
## Checkbox-group
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/checkbox-group/overview.md";
import Props from "../../stencil-generated-docs/checkbox-group/props.md";
import Slots from "../../stencil-generated-docs/checkbox-group/slots.md";
import Dependencies from "../../stencil-generated-docs/checkbox-group/dependencies.md";
## Exemplo(s)
---
## Checkgroup
import Playground from "@site/src/components/Playground";
import Deprecation from "../../stencil-generated-docs/checkgroup/deprecation.md";
import Props from "../../stencil-generated-docs/checkgroup/props.md";
import Slots from "../../stencil-generated-docs/checkgroup/slots.md";
import Dependencies from "../../stencil-generated-docs/checkgroup/dependencies.md";
import NativeEvents from "../../stencil-generated-docs/checkgroup/sections/native-events.md";
## Exemplo(s)
---
## Collapse
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/collapse/overview.md";
import Props from "../../stencil-generated-docs/collapse/props.md";
import Slots from "../../stencil-generated-docs/collapse/slots.md";
import Events from "../../stencil-generated-docs/collapse/events.md";
import Methods from "../../stencil-generated-docs/collapse/methods.md";
import Parts from "../../stencil-generated-docs/collapse/parts.md";
import Dependencies from "../../stencil-generated-docs/collapse/dependencies.md";
import Migrate from "../../stencil-generated-docs/collapse/sections/migrate.md";
import NativeEvents from "../../stencil-generated-docs/collapse/sections/native-events.md";
## Exemplo(s)
---
## cookiebar-cookie
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/props.md";
import Slots from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/slots.md";
import Events from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/events.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-cookie/dependencies.md";
---
## cookiebar-group
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-group/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-group/props.md";
import Slots from "../../../stencil-generated-docs/cookiebar/cookiebar-group/slots.md";
import Events from "../../../stencil-generated-docs/cookiebar/cookiebar-group/events.md";
import Methods from "../../../stencil-generated-docs/cookiebar/cookiebar-group/methods.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-group/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-group/dependencies.md";
---
## cookiebar-header
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-header/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-header/props.md";
import Slots from "../../../stencil-generated-docs/cookiebar/cookiebar-header/slots.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-header/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-header/dependencies.md";
---
## cookiebar-link
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-link/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-link/props.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-link/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-link/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/cookiebar/cookiebar-link/sections/navigation-migration.md";
---
## cookiebar-note
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-note/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-note/props.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-note/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-note/dependencies.md";
---
## cookiebar-note-group
import Overview from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/overview.md";
import Props from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/props.md";
import Slots from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/slots.md";
import Events from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/events.md";
import Parts from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/parts.md";
import Dependencies from "../../../stencil-generated-docs/cookiebar/cookiebar-note-group/dependencies.md";
---
## Cookiebar
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/cookiebar/overview.md";
import Props from "../../stencil-generated-docs/cookiebar/props.md";
import Slots from "../../stencil-generated-docs/cookiebar/slots.md";
import Events from "../../stencil-generated-docs/cookiebar/events.md";
import Methods from "../../stencil-generated-docs/cookiebar/methods.md";
import Parts from "../../stencil-generated-docs/cookiebar/parts.md";
import Dependencies from "../../stencil-generated-docs/cookiebar/dependencies.md";
import Migrate from "../../stencil-generated-docs/cookiebar/sections/migrate.md";
## Exemplo(s)
Padrão em que o usuário pode configurar as preferências de cookies individualmente.
## Fluxo, camada e modalidade
O aviso simples permanece como barra `fixed`, fora do fluxo da página. Com `scrim` ou no modo `open`, o container usa
`` modal e a top layer quando disponível. A máscara ocupa a subcamada local 0 e o painel a 1, garantindo que
cliques e foco alcancem sempre os controles do painel.
Sem `showModal()`, o cookiebar usa a camada bloqueadora 4. Nesse fallback CSS, mantenha somente um bloqueador legado
ativo por vez.
---
## DatePicker
import Overview from "../../../stencil-generated-docs/datetime-picker/date-picker/overview.md";
import Props from "../../../stencil-generated-docs/datetime-picker/date-picker/props.md";
import Events from "../../../stencil-generated-docs/datetime-picker/date-picker/events.md";
import Parts from "../../../stencil-generated-docs/datetime-picker/date-picker/parts.md";
import Dependencies from "../../../stencil-generated-docs/datetime-picker/date-picker/dependencies.md";
## Exemplo(s)
---
## DatetimeInput
import Overview from "../../../stencil-generated-docs/datetime-picker/datetime-input/overview.md";
import Props from "../../../stencil-generated-docs/datetime-picker/datetime-input/props.md";
import Events from "../../../stencil-generated-docs/datetime-picker/datetime-input/events.md";
import Parts from "../../../stencil-generated-docs/datetime-picker/datetime-input/parts.md";
import Dependencies from "../../../stencil-generated-docs/datetime-picker/datetime-input/dependencies.md";
## Exemplo(s)
---
## Datetime picker
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/datetime-picker/overview.md";
import Props from "../../stencil-generated-docs/datetime-picker/props.md";
import Events from "../../stencil-generated-docs/datetime-picker/events.md";
import Methods from "../../stencil-generated-docs/datetime-picker/methods.md";
import Parts from "../../stencil-generated-docs/datetime-picker/parts.md";
import Dependencies from "../../stencil-generated-docs/datetime-picker/dependencies.md";
import Validation from "../../stencil-generated-docs/datetime-picker/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/datetime-picker/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/datetime-picker/sections/native-events.md";
## Exemplo(s)
---
## TimePicker
import Overview from "../../../stencil-generated-docs/datetime-picker/time-picker/overview.md";
import Props from "../../../stencil-generated-docs/datetime-picker/time-picker/props.md";
import Events from "../../../stencil-generated-docs/datetime-picker/time-picker/events.md";
import Parts from "../../../stencil-generated-docs/datetime-picker/time-picker/parts.md";
import Dependencies from "../../../stencil-generated-docs/datetime-picker/time-picker/dependencies.md";
## Exemplo(s)
---
## Divider
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/divider/overview.md";
import Props from "../../stencil-generated-docs/divider/props.md";
import Slots from "../../stencil-generated-docs/divider/slots.md";
import Parts from "../../stencil-generated-docs/divider/parts.md";
import Dependencies from "../../stencil-generated-docs/divider/dependencies.md";
import Migrate from "../../stencil-generated-docs/divider/sections/migrate.md";
## Exemplo(s)
---
## Dropdown
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/dropdown/overview.md";
import Props from "../../stencil-generated-docs/dropdown/props.md";
import Slots from "../../stencil-generated-docs/dropdown/slots.md";
import Events from "../../stencil-generated-docs/dropdown/events.md";
import Methods from "../../stencil-generated-docs/dropdown/methods.md";
import Parts from "../../stencil-generated-docs/dropdown/parts.md";
import Dependencies from "../../stencil-generated-docs/dropdown/dependencies.md";
## Exemplo(s)
## Fluxo e sobreposição
O painel do dropdown é uma superfície ancorada fora do fluxo (`position: absolute`), portanto abrir ou fechar o
componente não reserva espaço nem desloca o conteúdo seguinte. No fallback CSS ele usa a camada flutuante 1; o
valor público `targetZIndex` continua podendo sobrescrever essa camada.
Ao abrir um bloqueador externo — scrim, cookiebar modal ou menu sobreposto — o dropdown é fechado. Se estiver
contido nesse bloqueador, ele permanece disponível e é posicionado dentro do respectivo contexto de pintura.
---
## footer-category
import Overview from "../../../stencil-generated-docs/footer/footer-category/overview.md";
import Props from "../../../stencil-generated-docs/footer/footer-category/props.md";
import Slots from "../../../stencil-generated-docs/footer/footer-category/slots.md";
import Dependencies from "../../../stencil-generated-docs/footer/footer-category/dependencies.md";
---
## footer-item
import Overview from "../../../stencil-generated-docs/footer/footer-item/overview.md";
import Props from "../../../stencil-generated-docs/footer/footer-item/props.md";
import Slots from "../../../stencil-generated-docs/footer/footer-item/slots.md";
import Dependencies from "../../../stencil-generated-docs/footer/footer-item/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/footer/footer-item/sections/navigation-migration.md";
---
## footer-legal
import Overview from "../../../stencil-generated-docs/footer/footer-legal/overview.md";
import Props from "../../../stencil-generated-docs/footer/footer-legal/props.md";
import Slots from "../../../stencil-generated-docs/footer/footer-legal/slots.md";
import Parts from "../../../stencil-generated-docs/footer/footer-legal/parts.md";
import Dependencies from "../../../stencil-generated-docs/footer/footer-legal/dependencies.md";
---
## footer-logo
import Overview from "../../../stencil-generated-docs/footer/footer-logo/overview.md";
import Props from "../../../stencil-generated-docs/footer/footer-logo/props.md";
import Parts from "../../../stencil-generated-docs/footer/footer-logo/parts.md";
import Dependencies from "../../../stencil-generated-docs/footer/footer-logo/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/footer/footer-logo/sections/navigation-migration.md";
---
## footer-social
import Overview from "../../../stencil-generated-docs/footer/footer-social/overview.md";
import Props from "../../../stencil-generated-docs/footer/footer-social/props.md";
import Dependencies from "../../../stencil-generated-docs/footer/footer-social/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/footer/footer-social/sections/navigation-migration.md";
---
## Footer
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/footer/overview.md";
import Props from "../../stencil-generated-docs/footer/props.md";
import Slots from "../../stencil-generated-docs/footer/slots.md";
import Parts from "../../stencil-generated-docs/footer/parts.md";
import Dependencies from "../../stencil-generated-docs/footer/dependencies.md";
import Migrate from "../../stencil-generated-docs/footer/sections/migrate.md";
## Exemplo(s)
---
## header-function
import Overview from "../../../stencil-generated-docs/header/header-function/overview.md";
import Props from "../../../stencil-generated-docs/header/header-function/props.md";
import Slots from "../../../stencil-generated-docs/header/header-function/slots.md";
import Dependencies from "../../../stencil-generated-docs/header/header-function/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/header/header-function/sections/navigation-migration.md";
---
## header-link
import Overview from "../../../stencil-generated-docs/header/header-link/overview.md";
import Props from "../../../stencil-generated-docs/header/header-link/props.md";
import Slots from "../../../stencil-generated-docs/header/header-link/slots.md";
import Dependencies from "../../../stencil-generated-docs/header/header-link/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/header/header-link/sections/navigation-migration.md";
---
## header-list
import Overview from "../../../stencil-generated-docs/header/header-list/overview.md";
import Props from "../../../stencil-generated-docs/header/header-list/props.md";
import Slots from "../../../stencil-generated-docs/header/header-list/slots.md";
import Events from "../../../stencil-generated-docs/header/header-list/events.md";
import Methods from "../../../stencil-generated-docs/header/header-list/methods.md";
import Dependencies from "../../../stencil-generated-docs/header/header-list/dependencies.md";
---
## header-logo
import Overview from "../../../stencil-generated-docs/header/header-logo/overview.md";
import Props from "../../../stencil-generated-docs/header/header-logo/props.md";
import Slots from "../../../stencil-generated-docs/header/header-logo/slots.md";
import Parts from "../../../stencil-generated-docs/header/header-logo/parts.md";
import Dependencies from "../../../stencil-generated-docs/header/header-logo/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/header/header-logo/sections/navigation-migration.md";
---
## Header
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/header/overview.md";
import Props from "../../stencil-generated-docs/header/props.md";
import Slots from "../../stencil-generated-docs/header/slots.md";
import Events from "../../stencil-generated-docs/header/events.md";
import Methods from "../../stencil-generated-docs/header/methods.md";
import Parts from "../../stencil-generated-docs/header/parts.md";
import Dependencies from "../../stencil-generated-docs/header/dependencies.md";
import Migrate from "../../stencil-generated-docs/header/sections/migrate.md";
import NavigationMigration from "../../stencil-generated-docs/header/sections/navigation-migration.md";
## Exemplo(s)
---
## Icon
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/icon/overview.md";
import Props from "../../stencil-generated-docs/icon/props.md";
import Parts from "../../stencil-generated-docs/icon/parts.md";
import Dependencies from "../../stencil-generated-docs/icon/dependencies.md";
import Migrate from "../../stencil-generated-docs/icon/sections/migrate.md";
import Iconify from "../../stencil-generated-docs/icon/sections/iconify.md";
## Exemplo(s)
### Imagem ou URL (`src`)
### SVG inline (`svg`)
### Slot padrão
---
## Componentes
import components from '@site/src/data/components';
import { ComponentCatalog } from '@site/src/components/ComponentCard';
# Componentes
Explore os componentes do Gov.br Design System disponíveis em Web Components. Cada componente foi construído seguindo as diretrizes de design, oferecendo acessibilidade e flexibilidade.
---
## Input
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/input/overview.md";
import Props from "../../stencil-generated-docs/input/props.md";
import Slots from "../../stencil-generated-docs/input/slots.md";
import Events from "../../stencil-generated-docs/input/events.md";
import Methods from "../../stencil-generated-docs/input/methods.md";
import Parts from "../../stencil-generated-docs/input/parts.md";
import Dependencies from "../../stencil-generated-docs/input/dependencies.md";
import Migrate from "../../stencil-generated-docs/input/sections/migrate.md";
import Validation from "../../stencil-generated-docs/input/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/input/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/input/sections/native-events.md";
import RelatedDocs from "../../stencil-generated-docs/input/sections/related-docs.md";
## Exemplo(s)
---
## Item
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/item/overview.md";
import Props from "../../stencil-generated-docs/item/props.md";
import Slots from "../../stencil-generated-docs/item/slots.md";
import Events from "../../stencil-generated-docs/item/events.md";
import Methods from "../../stencil-generated-docs/item/methods.md";
import Parts from "../../stencil-generated-docs/item/parts.md";
import Dependencies from "../../stencil-generated-docs/item/dependencies.md";
import Migrate from "../../stencil-generated-docs/item/sections/migrate.md";
import NavigationMigration from "../../stencil-generated-docs/item/sections/navigation-migration.md";
## Exemplo(s)
---
## Link
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/link/overview.md";
import Props from "../../stencil-generated-docs/link/props.md";
import Events from "../../stencil-generated-docs/link/events.md";
import Dependencies from "../../stencil-generated-docs/link/dependencies.md";
import NativeEvents from "../../stencil-generated-docs/link/sections/native-events.md";
import NavigationMigration from "../../stencil-generated-docs/link/sections/navigation-migration.md";
## Exemplo(s)
---
## List
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/list/overview.md";
import Props from "../../stencil-generated-docs/list/props.md";
import Slots from "../../stencil-generated-docs/list/slots.md";
import Parts from "../../stencil-generated-docs/list/parts.md";
import Dependencies from "../../stencil-generated-docs/list/dependencies.md";
import Migrate from "../../stencil-generated-docs/list/sections/migrate.md";
## Exemplo(s)
Para seções extensas que permanecem no DOM, consulte o guia de
[`content-visibility`](/docs/next/guias-tecnicos/content-visibility). A propriedade
reduz layout e pintura fora da viewport, mas não virtualiza os itens fornecidos
por slot.
---
## Loading
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/loading/overview.md";
import Props from "../../stencil-generated-docs/loading/props.md";
import Slots from "../../stencil-generated-docs/loading/slots.md";
import Events from "../../stencil-generated-docs/loading/events.md";
import Methods from "../../stencil-generated-docs/loading/methods.md";
import Parts from "../../stencil-generated-docs/loading/parts.md";
import Dependencies from "../../stencil-generated-docs/loading/dependencies.md";
import Migrate from "../../stencil-generated-docs/loading/sections/migrate.md";
import NativeEvents from "../../stencil-generated-docs/loading/sections/native-events.md";
## Exemplo(s)
---
## Magic button
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/magic-button/overview.md";
import Props from "../../stencil-generated-docs/magic-button/props.md";
import Slots from "../../stencil-generated-docs/magic-button/slots.md";
import Parts from "../../stencil-generated-docs/magic-button/parts.md";
import Dependencies from "../../stencil-generated-docs/magic-button/dependencies.md";
import Migrate from "../../stencil-generated-docs/magic-button/sections/migrate.md";
## Exemplo(s)
---
## Menu
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/menu/overview.md";
import Props from "../../stencil-generated-docs/menu/props.md";
import Slots from "../../stencil-generated-docs/menu/slots.md";
import Events from "../../stencil-generated-docs/menu/events.md";
import Methods from "../../stencil-generated-docs/menu/methods.md";
import Parts from "../../stencil-generated-docs/menu/parts.md";
import Dependencies from "../../stencil-generated-docs/menu/dependencies.md";
import Migrate from "../../stencil-generated-docs/menu/sections/migrate.md";
## Exemplo(s)
### Padrão
### Contextual
### Agrupado por Divider
### Agrupado por Expansão
### Agrupado por Label
## Estado aberto e associação com header
`isOpen` é a fonte de verdade pública do menu. Interação, `open()`, `close()` e
`toggle()` atualizam essa propriedade e emitem `brMenuOpenChange` uma vez, com
`detail.open` e `detail.sourceId`. Escrita com o mesmo valor não emite evento.
Ao usar um trigger no `br-header`, defina `data-target` com o `id` ou `customId`
do menu. Isso isola páginas com vários headers e menus e mantém `aria-expanded`
sincronizado somente no trigger associado.
```html
Menu
```
## Fluxo, camada e modalidade
O menu sobreposto usa um `` modal e a top layer quando `showModal()` está disponível. O painel e a máscara
compartilham o mesmo contexto: máscara na subcamada local 0 e painel na 1. Sem suporte nativo, o conjunto permanece
`fixed` na camada de navegação temporária 3.
Os modos `push`, `fixed` e `contextual` não entram na top layer e mantêm o comportamento local ou persistente. No
fallback CSS, mantenha apenas um bloqueador legado ativo por vez.
No modo `fixed`, o painel usa `20rem` como largura padrão, limitada à viewport.
Defina `--menu-fixed-width` no `br-menu` para personalizar esse valor.
---
## menu-header
import Overview from "../../../stencil-generated-docs/menu/menu-header/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-header/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-header/slots.md";
import Events from "../../../stencil-generated-docs/menu/menu-header/events.md";
import Parts from "../../../stencil-generated-docs/menu/menu-header/parts.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-header/dependencies.md";
---
## menu-info
import Overview from "../../../stencil-generated-docs/menu/menu-info/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-info/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-info/slots.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-info/dependencies.md";
---
## menu-item
import Overview from "../../../stencil-generated-docs/menu/menu-item/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-item/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-item/slots.md";
import Events from "../../../stencil-generated-docs/menu/menu-item/events.md";
import Parts from "../../../stencil-generated-docs/menu/menu-item/parts.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-item/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/menu/menu-item/sections/navigation-migration.md";
---
## menu-link
import Overview from "../../../stencil-generated-docs/menu/menu-link/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-link/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-link/slots.md";
import Events from "../../../stencil-generated-docs/menu/menu-link/events.md";
import Parts from "../../../stencil-generated-docs/menu/menu-link/parts.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-link/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/menu/menu-link/sections/navigation-migration.md";
---
## menu-list
import Overview from "../../../stencil-generated-docs/menu/menu-list/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-list/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-list/slots.md";
import Events from "../../../stencil-generated-docs/menu/menu-list/events.md";
import Parts from "../../../stencil-generated-docs/menu/menu-list/parts.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-list/dependencies.md";
---
## menu-logo
import Overview from "../../../stencil-generated-docs/menu/menu-logo/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-logo/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-logo/slots.md";
import Parts from "../../../stencil-generated-docs/menu/menu-logo/parts.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-logo/dependencies.md";
---
## menu-social
import Overview from "../../../stencil-generated-docs/menu/menu-social/overview.md";
import Props from "../../../stencil-generated-docs/menu/menu-social/props.md";
import Slots from "../../../stencil-generated-docs/menu/menu-social/slots.md";
import Events from "../../../stencil-generated-docs/menu/menu-social/events.md";
import Dependencies from "../../../stencil-generated-docs/menu/menu-social/dependencies.md";
import NavigationMigration from "../../../stencil-generated-docs/menu/menu-social/sections/navigation-migration.md";
---
## Message
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/message/overview.md";
import Props from "../../stencil-generated-docs/message/props.md";
import Slots from "../../stencil-generated-docs/message/slots.md";
import Events from "../../stencil-generated-docs/message/events.md";
import Parts from "../../stencil-generated-docs/message/parts.md";
import Dependencies from "../../stencil-generated-docs/message/dependencies.md";
import Migrate from "../../stencil-generated-docs/message/sections/migrate.md";
## Exemplo(s)
---
## Modal
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/modal/overview.md";
import Props from "../../stencil-generated-docs/modal/props.md";
import Slots from "../../stencil-generated-docs/modal/slots.md";
import Events from "../../stencil-generated-docs/modal/events.md";
import Methods from "../../stencil-generated-docs/modal/methods.md";
import Parts from "../../stencil-generated-docs/modal/parts.md";
import Dependencies from "../../stencil-generated-docs/modal/dependencies.md";
import Migrate from "../../stencil-generated-docs/modal/sections/migrate.md";
import NativeEvents from "../../stencil-generated-docs/modal/sections/native-events.md";
## Exemplo(s)
## Composição com scrim
O modal continua sendo o conteúdo do `br-scrim` e preserva `open()`, `showModal()`, `close()`, eventos, foco e slots.
Quando o scrim fullscreen usa ``, o conjunto entra na top layer; em ambientes sem `showModal()`, usa a camada
bloqueadora 4 e o gerenciamento de foco legado.
A ordem de abertura define a precedência entre diálogos nativos: o último bloqueador aberto fica ativo. No fallback
CSS, mantenha apenas um bloqueador legado ativo por vez.
---
## Notification
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/notification/overview.md";
import Props from "../../stencil-generated-docs/notification/props.md";
import Slots from "../../stencil-generated-docs/notification/slots.md";
import Events from "../../stencil-generated-docs/notification/events.md";
import Methods from "../../stencil-generated-docs/notification/methods.md";
import Parts from "../../stencil-generated-docs/notification/parts.md";
import Dependencies from "../../stencil-generated-docs/notification/dependencies.md";
import Migrate from "../../stencil-generated-docs/notification/sections/migrate.md";
## Exemplo(s)
---
## notification-body
import Overview from "../../../stencil-generated-docs/notification/notification-body/overview.md";
import Props from "../../../stencil-generated-docs/notification/notification-body/props.md";
import Slots from "../../../stencil-generated-docs/notification/notification-body/slots.md";
import Dependencies from "../../../stencil-generated-docs/notification/notification-body/dependencies.md";
---
## notification-header
import Overview from "../../../stencil-generated-docs/notification/notification-header/overview.md";
import Props from "../../../stencil-generated-docs/notification/notification-header/props.md";
import Slots from "../../../stencil-generated-docs/notification/notification-header/slots.md";
import Events from "../../../stencil-generated-docs/notification/notification-header/events.md";
import Dependencies from "../../../stencil-generated-docs/notification/notification-header/dependencies.md";
---
## notification-item
import Overview from "../../../stencil-generated-docs/notification/notification-item/overview.md";
import Props from "../../../stencil-generated-docs/notification/notification-item/props.md";
import Slots from "../../../stencil-generated-docs/notification/notification-item/slots.md";
import Events from "../../../stencil-generated-docs/notification/notification-item/events.md";
import Methods from "../../../stencil-generated-docs/notification/notification-item/methods.md";
import Dependencies from "../../../stencil-generated-docs/notification/notification-item/dependencies.md";
---
## Pagination
import Playground from '@site/src/components/Playground';
import Overview from '../../stencil-generated-docs/pagination/overview.md';
import Props from '../../stencil-generated-docs/pagination/props.md';
import Slots from '../../stencil-generated-docs/pagination/slots.md';
import Events from '../../stencil-generated-docs/pagination/events.md';
import Methods from '../../stencil-generated-docs/pagination/methods.md';
import Parts from '../../stencil-generated-docs/pagination/parts.md';
import Dependencies from '../../stencil-generated-docs/pagination/dependencies.md';
import RelatedDocs from '../../stencil-generated-docs/pagination/sections/related-docs.md';
## Exemplos
### Básico
### Contextual
### Densidade
### Estado loading
## Dados remotos
Use `brPaginationPageChange` e `brPaginationPerPageChange` para iniciar a
consulta. Enquanto ela estiver pendente, defina `loading`; os controles ficam
desabilitados, `aria-busy="true"` é aplicado e o slot `loading` pode substituir
o indicador padrão.
Para confirmar a navegação somente depois da resposta, use `controlled`. Nesse
modo, o evento contém a página solicitada, mas `current` permanece inalterado
até a aplicação atribuir o novo valor:
```js
pagination.addEventListener('brPaginationPageChange', async ({ detail }) => {
pagination.loading = true;
try {
const result = await pageService(detail.page);
pagination.current = result.page;
} finally {
pagination.loading = false;
}
});
```
---
## Radio
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/radio/overview.md";
import Props from "../../stencil-generated-docs/radio/props.md";
import Slots from "../../stencil-generated-docs/radio/slots.md";
import Events from "../../stencil-generated-docs/radio/events.md";
import Methods from "../../stencil-generated-docs/radio/methods.md";
import Parts from "../../stencil-generated-docs/radio/parts.md";
import Dependencies from "../../stencil-generated-docs/radio/dependencies.md";
import Validation from "../../stencil-generated-docs/radio/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/radio/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/radio/sections/native-events.md";
## Exemplo(s)
---
## Radio Group
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/radio-group/overview.md";
import Props from "../../stencil-generated-docs/radio-group/props.md";
import Slots from "../../stencil-generated-docs/radio-group/slots.md";
import Events from "../../stencil-generated-docs/radio-group/events.md";
import Methods from "../../stencil-generated-docs/radio-group/methods.md";
import Parts from "../../stencil-generated-docs/radio-group/parts.md";
import Dependencies from "../../stencil-generated-docs/radio-group/dependencies.md";
import Validation from "../../stencil-generated-docs/radio-group/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/radio-group/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/radio-group/sections/native-events.md";
import NativeAttributes from "../../stencil-generated-docs/radio-group/sections/native-attributes.md";
## Exemplo(s)
---
## Scrim
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/scrim/overview.md";
import Props from "../../stencil-generated-docs/scrim/props.md";
import Slots from "../../stencil-generated-docs/scrim/slots.md";
import Events from "../../stencil-generated-docs/scrim/events.md";
import Methods from "../../stencil-generated-docs/scrim/methods.md";
import Dependencies from "../../stencil-generated-docs/scrim/dependencies.md";
import Migrate from "../../stencil-generated-docs/scrim/sections/migrate.md";
## Exemplo(s)
## Fluxo, camada e top layer
O scrim `fullscreen` das variantes `focus` e `spotlight`, com layout de conteúdo padrão, usa `` modal e
`showModal()`. Isso evita limitações impostas por ancestrais com `transform`, `filter` ou outros stacking contexts.
Sem suporte nativo, permanece `fixed` na camada bloqueadora 4.
As variantes `parent` e `legibility`, além de `content-layout="none"`, continuam locais. Em todas as composições a
máscara ocupa a subcamada 0 e o conteúdo a 1. No fallback CSS, mantenha somente um bloqueador legado ativo por vez.
---
## Select
import Playground from '@site/src/components/Playground';
import Overview from '../../stencil-generated-docs/select/overview.md';
import Props from '../../stencil-generated-docs/select/props.md';
import Slots from '../../stencil-generated-docs/select/slots.md';
import Parts from '../../stencil-generated-docs/select/parts.md';
import Events from '../../stencil-generated-docs/select/events.md';
import Methods from '../../stencil-generated-docs/select/methods.md';
import Dependencies from '../../stencil-generated-docs/select/dependencies.md';
import Migrate from '../../stencil-generated-docs/select/sections/migrate.md';
import Validation from '../../stencil-generated-docs/select/sections/validation.md';
import Accessibility from '../../stencil-generated-docs/select/sections/accessibility.md';
import NativeEvents from '../../stencil-generated-docs/select/sections/native-events.md';
import RelatedDocs from '../../stencil-generated-docs/select/sections/related-docs.md';
## Exemplo
## Busca remota
---
## SelectInput
import Overview from '../../../stencil-generated-docs/select/select-input/overview.md';
import Props from '../../../stencil-generated-docs/select/select-input/props.md';
{/* // import Slots from '../../../stencil-generated-docs/select/select-input/slots.md'; */}
import Events from '../../../stencil-generated-docs/select/select-input/events.md';
import Methods from '../../../stencil-generated-docs/select/select-input/methods.md';
import Dependencies from '../../../stencil-generated-docs/select/select-input/dependencies.md';
import Migrate from '../../../stencil-generated-docs/select/select-input/sections/migrate.md';
## Exemplos
{/* */}
---
## SelectList
import Overview from '../../../stencil-generated-docs/select/select-list/overview.md';
import Props from '../../../stencil-generated-docs/select/select-list/props.md';
{/* // import Slots from '../../../stencil-generated-docs/select/select-list/slots.md'; */}
{/* // import Events from '../../../stencil-generated-docs/select/select-list/events.md'; */}
import Methods from '../../../stencil-generated-docs/select/select-list/methods.md';
import Dependencies from '../../../stencil-generated-docs/select/select-list/dependencies.md';
import Migrate from '../../../stencil-generated-docs/select/select-list/sections/migrate.md';
## Exemplos
{/* */}
{/* */}
---
## SelectOption
import Overview from '../../../stencil-generated-docs/select/select-option/overview.md';
import Props from '../../../stencil-generated-docs/select/select-option/props.md';
{/* // import Slots from '../../../stencil-generated-docs/select/select-option/slots.md'; */}
import Events from '../../../stencil-generated-docs/select/select-option/events.md';
import Methods from '../../../stencil-generated-docs/select/select-option/methods.md';
import Dependencies from '../../../stencil-generated-docs/select/select-option/dependencies.md';
import Migrate from '../../../stencil-generated-docs/select/select-option/sections/migrate.md';
## Exemplos
{/* */}
---
## Sign in
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/sign-in/overview.md";
import Props from "../../stencil-generated-docs/sign-in/props.md";
import Slots from "../../stencil-generated-docs/sign-in/slots.md";
import Parts from "../../stencil-generated-docs/sign-in/parts.md";
import Dependencies from "../../stencil-generated-docs/sign-in/dependencies.md";
import Migrate from "../../stencil-generated-docs/sign-in/sections/migrate.md";
import NavigationMigration from "../../stencil-generated-docs/sign-in/sections/navigation-migration.md";
## Exemplo(s)
---
## Skip Link
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/skip-link/overview.md";
import Props from "../../stencil-generated-docs/skip-link/props.md";
import Events from "../../stencil-generated-docs/skip-link/events.md";
import Methods from "../../stencil-generated-docs/skip-link/methods.md";
import Parts from "../../stencil-generated-docs/skip-link/parts.md";
import Dependencies from "../../stencil-generated-docs/skip-link/dependencies.md";
## Exemplo(s)
---
## Skip Link Item
import Overview from "../../../stencil-generated-docs/skip-link/skip-link-item/overview.md";
import Deprecation from "../../../stencil-generated-docs/skip-link/skip-link-item/deprecation.md";
import Props from "../../../stencil-generated-docs/skip-link/skip-link-item/props.md";
import Methods from "../../../stencil-generated-docs/skip-link/methods.md";
import Dependencies from "../../../stencil-generated-docs/skip-link/skip-link-item/dependencies.md";
---
## Slider
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/slider/overview.md";
import Props from "../../stencil-generated-docs/slider/props.md";
import Slots from "../../stencil-generated-docs/slider/slots.md";
import Events from "../../stencil-generated-docs/slider/events.md";
import Parts from "../../stencil-generated-docs/slider/parts.md";
import Dependencies from "../../stencil-generated-docs/slider/dependencies.md";
import Validation from "../../stencil-generated-docs/slider/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/slider/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/slider/sections/native-events.md";
## Exemplo(s)
---
## Step
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/step/overview.md";
import Props from "../../stencil-generated-docs/step/props.md";
import Slots from "../../stencil-generated-docs/step/slots.md";
import Events from "../../stencil-generated-docs/step/events.md";
import Methods from "../../stencil-generated-docs/step/methods.md";
import Parts from "../../stencil-generated-docs/step/parts.md";
import Dependencies from "../../stencil-generated-docs/step/dependencies.md";
## Exemplo(s)
---
## step-item
import Overview from "../../../stencil-generated-docs/step/step-item/overview.md";
import Props from "../../../stencil-generated-docs/step/step-item/props.md";
import Slots from "../../../stencil-generated-docs/step/step-item/slots.md";
import Methods from "../../../stencil-generated-docs/step/step-item/methods.md";
import Parts from "../../../stencil-generated-docs/step/step-item/parts.md";
import Dependencies from "../../../stencil-generated-docs/step/step-item/dependencies.md";
---
## Switch
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/switch/overview.md";
import Props from "../../stencil-generated-docs/switch/props.md";
import Slots from "../../stencil-generated-docs/switch/slots.md";
import Events from "../../stencil-generated-docs/switch/events.md";
import Methods from "../../stencil-generated-docs/switch/methods.md";
import Dependencies from "../../stencil-generated-docs/switch/dependencies.md";
import Migrate from "../../stencil-generated-docs/switch/sections/migrate.md";
import Validation from "../../stencil-generated-docs/switch/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/switch/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/switch/sections/native-events.md";
## Exemplo(s)
---
## Tab
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/tab/overview.md";
import Props from "../../stencil-generated-docs/tab/props.md";
import Slots from "../../stencil-generated-docs/tab/slots.md";
import Events from "../../stencil-generated-docs/tab/events.md";
import Methods from "../../stencil-generated-docs/tab/methods.md";
import Parts from "../../stencil-generated-docs/tab/parts.md";
import Dependencies from "../../stencil-generated-docs/tab/dependencies.md";
import Migrate from "../../stencil-generated-docs/tab/sections/migrate.md";
## Exemplo(s)
---
## tab-item
import Overview from "../../../stencil-generated-docs/tab/tab-item/overview.md";
import Props from "../../../stencil-generated-docs/tab/tab-item/props.md";
import Slots from "../../../stencil-generated-docs/tab/tab-item/slots.md";
import Events from "../../../stencil-generated-docs/tab/tab-item/events.md";
import Dependencies from "../../../stencil-generated-docs/tab/tab-item/dependencies.md";
---
## Table
import Playground from '@site/src/components/Playground';
import Overview from '../../stencil-generated-docs/table/overview.md';
import Props from '../../stencil-generated-docs/table/props.md';
import Slots from '../../stencil-generated-docs/table/slots.md';
import Parts from '../../stencil-generated-docs/table/parts.md';
import Dependencies from '../../stencil-generated-docs/table/dependencies.md';
import RelatedDocs from '../../stencil-generated-docs/table/sections/related-docs.md';
## Exemplo(s)
## Estado loading
## Dados remotos
Defina `loading` enquanto a aplicação atualiza as linhas. O componente mantém o
conteúdo anterior com opacidade reduzida, aplica `aria-busy="true"` e exibe o
indicador customizado no slot `loading`, centralizado sobre os dados. Também é
possível usar `startLoading()` e `stopLoading()`. A busca, o tratamento de erro
e a substituição dos slots `header`/`body` permanecem sob responsabilidade da
aplicação.
Para reduzir layout e pintura de seções longas ao redor da tabela, consulte o
guia de [`content-visibility`](/docs/next/guias-tecnicos/content-visibility). Essa
técnica não substitui paginação ou virtualização das linhas.
---
## TableBody
import Overview from "../../../stencil-generated-docs/table/table-body/overview.md";
import Parts from "../../../stencil-generated-docs/table/table-body/parts.md";
import Dependencies from "../../../stencil-generated-docs/table/table-body/dependencies.md";
## Exemplo(s)
---
## TableCell
import Overview from "../../../stencil-generated-docs/table/table-cell/overview.md";
import Props from "../../../stencil-generated-docs/table/table-cell/props.md";
import Events from "../../../stencil-generated-docs/table/table-cell/events.md";
import Parts from "../../../stencil-generated-docs/table/table-cell/parts.md";
import Dependencies from "../../../stencil-generated-docs/table/table-cell/dependencies.md";
## Exemplo(s)
---
## TableHeader
import Overview from "../../../stencil-generated-docs/table/table-header/overview.md";
import Parts from "../../../stencil-generated-docs/table/table-header/parts.md";
import Dependencies from "../../../stencil-generated-docs/table/table-header/dependencies.md";
## Exemplo(s)
---
## TableHeaderCell
import Overview from "../../../stencil-generated-docs/table/table-header-cell/overview.md";
import Props from "../../../stencil-generated-docs/table/table-header-cell/props.md";
import Events from "../../../stencil-generated-docs/table/table-header-cell/events.md";
import Parts from "../../../stencil-generated-docs/table/table-header-cell/parts.md";
import Dependencies from "../../../stencil-generated-docs/table/table-header-cell/dependencies.md";
## Exemplo(s)
---
## TableRow
import Overview from "../../../stencil-generated-docs/table/table-row/overview.md";
import Props from "../../../stencil-generated-docs/table/table-row/props.md";
import Events from "../../../stencil-generated-docs/table/table-row/events.md";
import Parts from "../../../stencil-generated-docs/table/table-row/parts.md";
import Dependencies from "../../../stencil-generated-docs/table/table-row/dependencies.md";
## Exemplo(s)
---
## Tag
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/tag/overview.md";
import Props from "../../stencil-generated-docs/tag/props.md";
import Slots from "../../stencil-generated-docs/tag/slots.md";
import Events from "../../stencil-generated-docs/tag/events.md";
import Parts from "../../stencil-generated-docs/tag/parts.md";
import Dependencies from "../../stencil-generated-docs/tag/dependencies.md";
import Validation from "../../stencil-generated-docs/tag/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/tag/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/tag/sections/native-events.md";
## Exemplo(s)
---
## Textarea
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/textarea/overview.md";
import Props from "../../stencil-generated-docs/textarea/props.md";
import Slots from "../../stencil-generated-docs/textarea/slots.md";
import Events from "../../stencil-generated-docs/textarea/events.md";
import Methods from "../../stencil-generated-docs/textarea/methods.md";
import Dependencies from "../../stencil-generated-docs/textarea/dependencies.md";
import Validation from "../../stencil-generated-docs/textarea/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/textarea/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/textarea/sections/native-events.md";
import RelatedDocs from "../../stencil-generated-docs/textarea/sections/related-docs.md";
## Exemplo(s)
---
## Tooltip
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/tooltip/overview.md";
import Props from "../../stencil-generated-docs/tooltip/props.md";
import Slots from "../../stencil-generated-docs/tooltip/slots.md";
import Events from "../../stencil-generated-docs/tooltip/events.md";
import Methods from "../../stencil-generated-docs/tooltip/methods.md";
import Parts from "../../stencil-generated-docs/tooltip/parts.md";
import Dependencies from "../../stencil-generated-docs/tooltip/dependencies.md";
## Exemplo(s)
## Fluxo e sobreposição
O tooltip nunca participa do fluxo da página. Quando a Popover API está disponível, seu conteúdo entra na top
layer; nos demais ambientes usa `position: fixed` e a camada flutuante 1. A posição é aplicada antes do primeiro
cálculo assíncrono para não provocar reflow.
Tooltips externos são fechados quando um bloqueador abre. Tooltips contidos no diálogo permanecem utilizáveis e,
com Popover API, são pintados acima dele pela própria plataforma.
---
## Upload
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/upload/overview.md";
import Props from "../../stencil-generated-docs/upload/props.md";
import Slots from "../../stencil-generated-docs/upload/slots.md";
import Events from "../../stencil-generated-docs/upload/events.md";
import Methods from "../../stencil-generated-docs/upload/methods.md";
import Parts from "../../stencil-generated-docs/upload/parts.md";
import Dependencies from "../../stencil-generated-docs/upload/dependencies.md";
import Validation from "../../stencil-generated-docs/upload/sections/validation.md";
import Accessibility from "../../stencil-generated-docs/upload/sections/accessibility.md";
import NativeEvents from "../../stencil-generated-docs/upload/sections/native-events.md";
import RelatedDocs from "../../stencil-generated-docs/upload/sections/related-docs.md";
## Exemplo(s)
### Handler fornecido pela aplicação
---
## Wizard
import Playground from "@site/src/components/Playground";
import Overview from "../../stencil-generated-docs/wizard/overview.md";
import Props from "../../stencil-generated-docs/wizard/props.md";
import Slots from "../../stencil-generated-docs/wizard/slots.md";
import Events from "../../stencil-generated-docs/wizard/events.md";
import Methods from "../../stencil-generated-docs/wizard/methods.md";
import Parts from "../../stencil-generated-docs/wizard/parts.md";
import Dependencies from "../../stencil-generated-docs/wizard/dependencies.md";
## Exemplo(s)
---
## wizard-panel
import Overview from "../../../stencil-generated-docs/wizard/wizard-panel/overview.md";
import Props from "../../../stencil-generated-docs/wizard/wizard-panel/props.md";
import Slots from "../../../stencil-generated-docs/wizard/wizard-panel/slots.md";
import Parts from "../../../stencil-generated-docs/wizard/wizard-panel/parts.md";
import Dependencies from "../../../stencil-generated-docs/wizard/wizard-panel/dependencies.md";
---
## Contribuindo
import Contributing from '@site/../../CONTRIBUTING.md'
---
## CSS Parts
CSS Parts são pontos de customização visual expostos por componentes com Shadow DOM. Eles permitem aplicar estilos em partes internas específicas usando o seletor `::part()`, sem quebrar o encapsulamento do componente.
Essa é a forma recomendada para pequenos ajustes visuais quando o componente documenta uma parte pública.
## Componentes compostos e `exportparts`
Quando um componente com Shadow DOM contém outro Web Component, `::part()` não atravessa o Shadow DOM
automaticamente. O componente pai só deve expor uma parte interna do filho quando essa parte fizer parte
do contrato visual público. Nesse caso, o filho declara `part` e o pai encaminha o nome com `exportparts`.
Exemplo conceitual:
```html
```
No host, a customização é feita com `::part()`:
```css
br-pagination::part(per-page-input) {
min-width: 6rem;
}
```
O `br-pagination` encaminha as partes públicas de `br-select`, `br-button` e do dropdown de reticências
com nomes estáveis (`per-page-*`, `go-to-*`, `prev-button-inner`, `next-button-inner` e
`ellipsis-button`). `br-select`, `br-datetime-picker`, `br-menu-item` e `br-menu-list` seguem o mesmo
padrão quando compõem controles com partes públicas.
Nem todo filho interno deve ser encaminhado: ícones, elementos auxiliares e classes de implementação
continuam encapsulados. A ausência de `exportparts` é intencional quando o filho não possui uma parte
documentada para consumo externo.
## Quando usar
Use CSS Parts quando você precisa ajustar uma parte interna documentada, por exemplo:
- A área interna de um botão.
- O conteúdo de um card, tooltip ou sign-in.
- Uma célula ou área de conteúdo de tabela.
- Um ícone ou container exposto pelo componente.
Se a personalização for sobre estado, densidade, ênfase ou variação suportada, prefira propriedades do componente. Use `::part()` apenas quando a customização visual não estiver coberta por propriedades.
## Sintaxe
```css
br-button::part(button) {
min-width: 12rem;
}
```
O trecho acima estiliza a parte chamada `button` exposta por `br-button`.
O nome usado dentro de `::part()` precisa existir na documentação do componente. Se o componente não expõe a parte, o seletor não terá efeito.
## Exemplo com botão
```html
Continuar
```
```css
.acao-principal::part(button) {
justify-content: center;
min-width: 14rem;
}
```
Esse ajuste altera apenas a parte interna exposta como `button`, mantendo o comportamento e a acessibilidade do componente.
## Exemplo com sign-in
```html
Entrar com gov.br
```
```css
.entrada-govbr::part(content) {
font-weight: 700;
}
```
Nesse caso, a parte `content` controla a área de texto do `br-sign-in`.
## Exemplo com tabela
```html
Serviço
Situação
Agendamento
Disponível
```
```css
.tabela-servicos::part(container) {
border: 1px solid var(--gray-20);
}
br-table-cell::part(content) {
white-space: nowrap;
}
```
O primeiro seletor ajusta o container exposto por `br-table`. O segundo ajusta a área de conteúdo das células.
## Limitações
`::part()` só alcança partes expostas diretamente pelo componente selecionado. Ele não atravessa várias camadas de componentes sem que cada componente encaminhe explicitamente a parte com `exportparts`.
```css
/* Funciona se br-table expuser a parte container */
br-table::part(container) {
border-radius: 4px;
}
/* Não use ::part() para tentar alcançar uma estrutura interna não documentada */
br-table::part(container) .br-table-content {
padding: 1rem;
}
```
Para customizar componentes filhos, aplique uma classe ou seletor diretamente no componente filho.
```css
.tabela-servicos br-table-cell::part(content) {
font-weight: 600;
}
```
## Boas práticas
- Consulte a seção **CSS Parts** da página de cada componente antes de escrever o seletor.
- Prefira propriedades públicas para variações já previstas pelo componente.
- Evite depender de classes internas do Shadow DOM; elas não fazem parte do contrato público.
- Use classes na instância do componente para limitar o escopo da customização.
- Mantenha ajustes visuais pequenos. Se a mudança alterar comportamento ou estrutura, avalie criar uma variação no componente.
## Relação com tokens
Quando possível, combine CSS Parts com tokens ou variáveis do GovBR-DS. Isso mantém a customização alinhada ao tema e reduz divergências visuais.
```css
.entrada-govbr::part(content) {
color: var(--color-primary-default);
}
```
---
## Customização
Os Web Components do GovBR-DS oferecem recursos para personalização de conteúdo e estilo sem quebrar o encapsulamento ou a acessibilidade.
import DocCardList from '@theme/DocCardList';
---
## Slots
Slots são pontos de entrada para conteúdo dentro de um Web Component. Eles permitem que você componha a interface com textos, ícones, imagens, links e outros elementos sem depender de uma propriedade específica para cada variação de conteúdo.
Na prática, o componente controla a estrutura, acessibilidade e comportamento. A aplicação fornece o conteúdo que entra nos espaços definidos pelo componente.
## Quando usar
Use slots quando o conteúdo precisa ser flexível, sem alterar o contrato principal do componente.
Exemplos comuns:
- Texto ou ícone dentro de um botão.
- Mensagem de erro, sucesso ou ajuda dentro de um campo.
- Itens de navegação dentro de breadcrumb, menu, footer ou tabela.
- Conteúdo complementar, como imagem institucional em `br-sign-in`.
## Slot padrão
O slot padrão recebe o conteúdo que não possui o atributo `slot`.
```html
Enviar solicitação
```
Nesse exemplo, o texto `Enviar solicitação` entra no slot padrão do `br-button`.
## Slots nomeados
Slots nomeados recebem conteúdo marcado com `slot="nome-do-slot"`. Eles são usados quando o componente expõe mais de uma área de composição.
```html
Informe um CPF válido.
```
No exemplo acima, o `br-message` ocupa o slot `feedback` do `br-input`. Isso mantém a mensagem conectada visualmente ao campo, sem exigir que a aplicação conheça a estrutura interna do componente.
## Compondo componentes
Slots também podem receber outros Web Components. Esse padrão é útil em componentes compostos, como tabela, menu, footer e breadcrumb.
```html
Serviço
Situação
Agendamento
Disponível
```
O `br-table` recebe cabeçalho e corpo por slots nomeados. Cada parte continua sendo um componente independente, mas a tabela organiza o conjunto.
## Conteúdo alternativo
Alguns componentes podem renderizar um conteúdo padrão quando o slot não é preenchido. Esse conteúdo é definido pelo próprio componente e deve ser tratado como comportamento interno.
```html
Entrar
```
Se você quiser substituir áreas opcionais, use os slots documentados pelo componente:
```html
Entrar com gov.br
```
## Boas práticas
- Consulte a seção **Slots** da página de cada componente para saber quais nomes estão disponíveis.
- Use o slot padrão para conteúdo principal e slots nomeados para áreas específicas.
- Evite inserir elementos interativos dentro de outro elemento interativo, como um botão dentro de `br-button`.
- Preserve nomes de slots exatamente como documentados, incluindo o caractere `-`.
- Em frameworks, defina o atributo `slot` no elemento filho que deve ser projetado.
## Diferença entre slots e propriedades
Use propriedades para configurar comportamento e estado do componente.
Use slots para fornecer conteúdo.
```html
Salvar
```
Nesse exemplo, `emphasis` e `density` configuram o componente. O texto `Salvar` é conteúdo projetado no slot padrão.
---
## Angular
import Readme from '@site/../../packages/angular/README.md'
---
## Integração com Formulários e Validadores
Os Web Components do GovBR-DS encapsulam a estrutura e a aparência dos inputs em um Shadow DOM, o que altera levemente a forma como as bibliotecas de validação interagem com eles.
Esta página concentra o contrato geral de validação, a matriz de componentes e as receitas de integração com React, Angular e Vue. Os detalhes de cada campo ficam na seção **Validação** da página do componente correspondente.
Para facilitar a integração, nossa documentação sugere algumas "receitas" para cenários práticos nos principais frameworks suportados.
## A diferença fundamental
Os controles emitem `input` e `change` no host e mantêm o valor em propriedades como `value`, `checked` e `files`. Os wrappers oficiais traduzem esse contrato para `ControlValueAccessor`, props React e `v-model`. Consulte [Eventos nativos e eventos customizados](/docs/guias-essenciais/eventos/) para a semântica e a migração dos aliases da série 2.x.
---
## 🔵 Integração com React Hook Form
Com os wrappers nativos exportados do pacote `@govbr-ds/webcomponents-react`, componentes de entrada como `br-input` repassam a referência (`ref`) do `HTMLElement` e os eventos canônicos `onInput` e `onChange`. Para ligar ao ecossistema do React Hook Form sem fricção, a estratégia ideal é o uso do `Controller`.
### Exemplo de uso com \`Controller\`
```tsx
import { useForm, Controller } from 'react-hook-form';
import { br-input, br-button } from '@govbr-ds/webcomponents-react';
export default function MyForm() {
const { control, handleSubmit } = useForm({
defaultValues: {
username: ''
}
});
const onSubmit = data => console.log(data);
return (
);
}
```
### `valueChanges` equivalente, refs e eventos customizados
No React, alterações externas devem passar por state/props. Eventos DOM nativos usam `event.currentTarget.value`;
eventos `CustomEvent` usam `event.detail`:
```tsx
import { useEffect, useRef, useState } from 'react';
import { BrSelect } from '@govbr-ds/webcomponents-react';
export function SelectField() {
const selectRef = useRef(null);
const [value, setValue] = useState('');
const [validationMessage, setValidationMessage] = useState('');
useEffect(() => {
const select = selectRef.current;
if (!select) return;
const onValidation = (event: CustomEvent<{ message: string | null }>) =>
setValidationMessage(event.detail.message ?? '');
select.addEventListener('brSelectValidationChange', onValidation);
return () => select.removeEventListener('brSelectValidationChange', onValidation);
}, []);
return (
setValue(event.currentTarget.value as string)}
/>
);
}
```
---
## 🔴 Integração com Angular Reactive Forms
No pacote `@govbr-ds/webcomponents-angular`, nós providenciamos os *Value Accessors* nativos. Isso garante que as diretivas `formControlName` e `[formControl]` funcionem sem esforço extra, de forma similar ao que você já faz em formulários nativos.
### Aplicação com NgModule
Na entrada tradicional, importe `WebcomponentsAngularModule` de `@govbr-ds/webcomponents-angular`. O método
`forRoot()` registra os Custom Elements e os value accessors do Angular.
```ts
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { WebcomponentsAngularModule } from '@govbr-ds/webcomponents-angular';
@NgModule({
imports: [ReactiveFormsModule, WebcomponentsAngularModule.forRoot()],
})
export class AppModule {}
```
### Aplicação Angular standalone
Em uma aplicação standalone, importe os proxies e os validadores pela entrada
`@govbr-ds/webcomponents-angular/standalone`:
```ts
import { Component } from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
import {
BrButton,
BrInput,
FormValidityValidator,
} from '@govbr-ds/webcomponents-angular/standalone';
@Component({
selector: 'app-user-form',
standalone: true,
imports: [ReactiveFormsModule, BrInput, BrButton, FormValidityValidator],
template: `
`,
})
export class UserFormComponent {
readonly userForm = new FormGroup({
email: new FormControl('', { nonNullable: true }),
});
onSubmit() {
if (this.userForm.valid) console.log(this.userForm.getRawValue());
}
}
```
Não misture `WebcomponentsAngularModule` com os proxies standalone no mesmo componente.
### `valueChanges`, eventos customizados e zonas
O value accessor não chama `onChange` quando a alteração vem do código. Para observar alterações aceitas pelo
formulário use `valueChanges`; para observar a interação nativa use `input`/`change` no host. Callbacks fora da zona
devem voltar para o Angular com `NgZone.run()`:
```ts
import { ChangeDetectorRef, ElementRef, NgZone, ViewChild, inject } from '@angular/core';
// No componente que possui o formulário:
@ViewChild('select', { read: ElementRef })
private readonly select!: ElementRef;
private readonly zone = inject(NgZone);
private readonly cdr = inject(ChangeDetectorRef);
private validationMessage = '';
this.userForm.controls.email.valueChanges.subscribe((value) => {
console.log('valor aceito pelo formulário:', value);
});
this.select.nativeElement.addEventListener('brSelectValidationChange', (event: CustomEvent<{ message: string | null }>) => {
this.zone.run(() => {
this.validationMessage = event.detail.message ?? '';
this.cdr.markForCheck();
});
});
```
No template, associe a referência ao host: ` `. Em aplicações sem zone, atualize o estado explicitamente e chame o
`ChangeDetectorRef` após o evento.
---
## 🟢 Integração com Vue (v-model)
No ecossistema Vue (via pacote `@govbr-ds/webcomponents-vue`), nossos componentes são exportados para entender a diretiva `v-model`.
### Exemplo usando Composition API
```vue
```
### Sincronização externa e eventos customizados
No Vue, `v-model` é a fonte reativa do valor. Eventos DOM devem ser tratados com `@input`/`@change`; eventos
customizados usam `$event.detail`:
```vue
{{ validationMessage }}
```
## Contrato nativo de validação
Os controles associados a formulário participam de `FormData`, respeitam `required`, limites, padrões e comprimentos e expõem a mesma informação de validade por métodos assíncronos:
```ts
type FormValidationState = ValidityState & {
valid: boolean;
validationMessage: string;
willValidate: boolean;
};
const field = document.querySelector('br-input');
await field.setCustomValidity(cpfValido(field.value) ? '' : 'Informe um CPF válido.');
const state = await field.getValidationState();
if (!state.valid) await field.reportValidity();
```
`checkValidity()` apenas consulta e pode emitir `invalid` quando inválido. `reportValidity()` consulta e apresenta a mensagem. `setCustomValidity('mensagem')` torna o controle inválido; passe `''` para limpar. O evento `invalid` é cancelável e não borbulha, como no HTML nativo.
### Constraints por componente
| Componente | Constraints | Estado consultável |
| --- | --- | --- |
| [br-input](/docs/components/input) | `type`, `required`, `pattern`, `min`, `max`, `step`, `minlength`, `maxlength` | `value` |
| [br-textarea](/docs/components/textarea) | `required`, `readonly`, `minlength`, `maxlength` | `value` |
| [br-select](/docs/components/select) | `required`, `min-selections`, `max-selections` | `value` |
| [br-radio-group](/docs/next/components/radio-group) | `required` | `value` |
| [br-checkbox](/docs/components/checkbox), [br-radio](/docs/components/radio), [br-switch](/docs/components/switch) | `required` | `checked`, `value` |
| [br-slider](/docs/components/slider) | `min`, `max`, `step`; intervalo ordenado | `value`, `rangeValue` |
| [br-datetime-picker](/docs/components/datetime-picker) | `required`, `min`, `max`; intervalo completo e ordenado | `value`, `rangeValue` |
| [br-upload](/docs/components/upload) | `required`, `min-files`, `max-files`, `accept`, `max-file-size` | `files` |
| [br-tag](/docs/components/tag) com `interaction-select` | `required`, `min-selections`, `max-selections` | `selected`, `value` |
Constraints HTML ficam no componente. CPF, confirmação de senha, regras de negócio e dependências entre campos ficam na aplicação e devem ser sincronizadas com `setCustomValidity`.
Todos os campos de formulário possuem o slot `feedback` para a mensagem visual. Quando o slot não é preenchido e existe uma mensagem customizada, o componente renderiza um `br-message` padrão. A referência acessível usa `aria-describedby` e `aria-errormessage`; consulte a seção **Validação** de cada componente para os detalhes do seu valor e das suas constraints.
### Validadores síncronos e assíncronos
`br-input`, `br-textarea`, `br-select` e `br-radio-group` também aceitam a propriedade `validator` para regras de domínio que não cabem nas constraints HTML. O contrato é executado no `change` ou quando `validate()` é chamado, e retorna `null` em caso de sucesso ou uma mensagem de erro:
```ts
const validator = async (value: string) => {
const disponivel = await verificarDisponibilidade(value);
return disponivel ? null : 'Esse valor já está em uso.';
};
const field = document.querySelector('br-input');
field.validator = validator;
if (!(await field.validate())) return;
```
No modo múltiplo, `br-select` recebe `string[]` em vez de `string`. Em React, Angular e Vue, passe a função como propriedade com `validator={validator}`, `[validator]="validator"` ou `:validator="validator"`; atributos HTML não transportam funções.
Durante a execução assíncrona, esses campos expõem `aria-busy="true"`, o slot `validation-loading` e um evento específico de mudança de validação. Consulte a seção **Validação** do componente para detalhes, estados de concorrência, mensagens e exemplos.
### Mensagem, acessibilidade e eventos
Mostre o erro em texto e associe-o ao campo com `aria-describedby` ou `aria-errormessage`. Ao apresentar o erro, mantenha `aria-invalid="true"`; não dependa somente de `state="danger"`, cor ou ícone. O label visível deve fazer parte do nome acessível.
```html
Informe um CPF válido.
```
`input` acompanha edição e `change` representa seleção ou commit. Leia o estado em `event.target.value`, `checked`, `files`, `selected` ou `rangeValue`; não espere payload em `detail`. Alterações externas, `form.reset()` e restauração de estado não emitem eventos de usuário.
```js
form.addEventListener('submit', async (event) => {
event.preventDefault();
const cpf = form.elements.cpf;
await cpf.setCustomValidity(isCpfValid(cpf.value) ? '' : 'Informe um CPF válido.');
if (!(await form.reportValidity())) return;
salvar(new FormData(form));
});
```
No Angular, `FormValidityValidator` é declarado pelo módulo e também exportado pela entrada `standalone`; enquanto a Promise de validação está em andamento o controle fica `PENDING`. React usa eventos nativos e refs tipadas. Vue usa `v-model`, incluindo argumentos para `checked`, `files`, `selected` e `rangeValue` quando aplicável.
## Contrato canônico dos quickstarts
As abordagens JavaScript, Angular, React e Vue usam este mesmo contrato. A mensagem indicada é sincronizada com `setCustomValidity` quando a regra não pertence ao HTML.
| Campo | Regra | Mensagem |
| --- | --- | --- |
| nome | obrigatório, 5–100 caracteres | Nome deve ter no mínimo 5 caracteres. |
| e-mail | obrigatório, `type=email`, até 120 caracteres | Informe um e-mail válido. |
| idade | obrigatório, inteiro entre 18 e 120 | A idade mínima é 18 anos. |
| CPF | obrigatório e dígitos verificadores válidos | Informe um CPF válido. |
| celular | obrigatório, 10 ou 11 dígitos | Informe um celular válido. |
| CEP | obrigatório, 8 dígitos | Informe um CEP válido. |
| cidade | seleção obrigatória | Selecione sua cidade. |
| descrição | obrigatória, 10–200 caracteres | O resumo deve ter entre 10 e 200 caracteres. |
| contato | uma opção obrigatória no grupo | Selecione como conheceu o projeto. |
| upload | ao menos um arquivo | Envie um documento probatório. |
| senha | obrigatória, 8–128 caracteres | A senha deve ter no mínimo 8 caracteres. |
| confirmação | igual à senha | As senhas devem ser iguais. |
| termos | checkbox obrigatório | Você deve aceitar os termos. |
| switch, slider, datetime e tags | opcionais; slider entre 0 e 10 | — |
Criação, edição, reset, listagem e persistência devem preservar esse contrato. Os testes Playwright de cada quickstart exercitam as rotas de todas as abordagens e a publicação em base path.
---
## Integração com Frameworks
A integração entre Web Components e frameworks pode não ser fácil em determinadas situações. Por isso, nós criamos as bibliotecas de integração (wrappers). Basicamente, elas encapsulam os Web Components em uma biblioteca de componentes na tecnologia nativa de algum framework. Isso facilita a integração com funcionalidades nativas dos frameworks, como, por exemplo, o binding.
Para mais detalhes sobre como o Stencil faz a integração, consulte [a documentação do Stencil sobre integrações](https://stenciljs.com/docs/overview).
Note que, em determinadas situações, pode não ser possível fazer essa integração. Isso depende muito da evolução da especificação de Web Components e do suporte dos frameworks.
## Web Components vs Frameworks
| Aspecto | Web Components | Frameworks Específicos (Angular, React, Vue) |
| ----------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------- |
| **Independência** | Funciona em qualquer projeto que suporte HTML, CSS e JS | Ligado ao ecossistema do framework, com dependências específicas |
| **Reutilização** | Reutilizável em diferentes contextos e plataformas | Reutilização limitada a projetos usando o mesmo framework |
| **Tamanho e Desempenho** | Mais leve, sem sobrecarga de bibliotecas adicionais | Pode ter uma sobrecarga de recursos, impactando o desempenho |
| **Compatibilidade** | Compatível com várias stacks e frameworks | Pode ter problemas de compatibilidade ao migrar entre frameworks |
| **Comunidade e Suporte** | Comunidade em crescimento, mas menor que a de frameworks populares | Comunidade ampla com suporte robusto e diversas bibliotecas |
| **Curva de Aprendizado** | Requer conhecimento de APIs específicas de Web Components | Curva de aprendizado adaptada ao ecossistema do framework |
| **Ferramentas e Ecossistema** | Ferramentas limitadas e em desenvolvimento | Ferramentas maduras para desenvolvimento, teste e deploy |
| **Modularidade** | Modular por natureza, permite uso seletivo em projetos | Modularidade depende das ferramentas e práticas do framework |
### Estrutura e Filosofia
- A biblioteca em Stencil utiliza a abordagem de Web Components nativos, proporcionando melhor compatibilidade e reutilização em diferentes frameworks.
- Stencil permite a criação de componentes assíncronos e otimizações automáticas de build, melhorando o desempenho.
### Tipo de Dados
- Stencil usa decorators do TypeScript, oferecendo tipagem mais rigorosa e suporte a IDEs, o que facilita o desenvolvimento e a manutenção.
### Ciclo de Vida
- Os métodos do ciclo de vida dos componentes em Stencil diferem dos hooks em Vue. Familiarize-se com os métodos como `componentWillLoad`, `componentDidLoad`, e outros.
### Recomendações
- Avalie cuidadosamente as necessidades do projeto antes de escolher uma ferramenta.
- Considere a curva de aprendizado e a experiência da equipe de desenvolvimento.
- Experimente diferentes ferramentas para encontrar a mais adequada ao projeto.
## Quickstarts oficiais
Use os quickstarts como referência de estrutura de projeto, instalação e bootstrap. Consulte a [página central de quickstarts](../quickstarts) para acessar demonstrações, versões validadas e orientação de escolha.
| Stack | Projeto | Comando local |
| ---------- | --------------------------------------------------------------------------------------------------------------- | --------------- |
| JavaScript | [govbr-ds-wbc-quickstart-js](https://gitlab.com/govbr-ds/bibliotecas/wbc/govbr-ds-wbc-quickstart-js) | `pnpm dev` |
| Angular | [govbr-ds-wbc-quickstart-angular](https://gitlab.com/govbr-ds/bibliotecas/wbc/govbr-ds-wbc-quickstart-angular) | `pnpm start` |
| React | [govbr-ds-wbc-quickstart-react](https://gitlab.com/govbr-ds/bibliotecas/wbc/govbr-ds-wbc-quickstart-react) | `pnpm dev` |
| Vue | [govbr-ds-wbc-quickstart-vue](https://gitlab.com/govbr-ds/bibliotecas/wbc/govbr-ds-wbc-quickstart-vue) | `pnpm dev` |
## Guias Relacionados
- [Navegação dos componentes](../guias-essenciais/navegacao-dos-componentes): como integrar links dos componentes com roteadores de frameworks sem quebrar a navegação nativa.
---
## React
import Readme from '@site/../../packages/react/README.md'
---
## SSR e Hydration (Next, Nuxt, Angular Universal)
Ao trabalhar com frameworks de SSR (Server-Side Rendering) ou SSG (Static Site Generation), o HTML é gerado em um ambiente Node.js, onde objetos de janela (`window` e `document`) não existem.
Uma vez que Web Components, por sua própria natureza, dependem das APIs nativas do navegador (como `customElements.define` e `HTMLElement`), eles requerem uma abordagem de **Hydration** (Hidratação) específica.
Os componentes GovBR-DS são construídos com StencilJS, que suporta hidratação SSR via "Declarative Shadow DOM", reduzindo os clássicos sobressaltos visuais de hidratação (FOUC).
Abaixo detalhamos estratégias de como lidar com os Web Components em Next.js e frameworks similares.
## Next.js (App Router)
A abordagem mais moderna no React 18 e Next.js App Router usa Server Components. Porém, como Web Components dependem do navegador para inicialização interativa, seus arquivos de inicialização devem ser marcados com `'use client'`.
1. **Crie um componente cliente para o Registry:**
```tsx
// components/GovbrRegistry.tsx
'use client'
import { useEffect } from 'react';
import { defineCustomElements } from '@govbr-ds/webcomponents/loader';
import '@govbr-ds/core/dist/core.min.css'; // Estilos globais
export default function GovbrRegistry({ children }: { children: React.ReactNode }) {
useEffect(() => {
// Isso será executado apenas no navegador, e registrará todos os elementos
defineCustomElements(window);
}, []);
return <>{children}>;
}
```
2. **Englobe seu Layout Principal:**
```tsx
// app/layout.tsx
import GovbrRegistry from '../components/GovbrRegistry';
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
{children}
);
}
```
Dessa forma, os wrappers React exportados em `@govbr-ds/webcomponents-react` (``, ``, etc.) podem ser utilizados em arquivos de cliente e serão hidratados com segurança sem disparar erros de SSR, pois o React entende que eles emitem seu próprio HTML pre-renderizado.
## Nuxt.js 3
O Nuxt.js e o Vue trabalham excepcionalmente bem com Custom Elements, mas o compilador do Vue precisa saber que tags começando com `br-` não são componentes Vue e sim componentes da plataforma nativa, para que ele não tente resolvê-los no lado do servidor.
No seu arquivo de configuração `nuxt.config.ts`:
```ts
export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('br-')
}
},
plugins: [
{ src: '~/plugins/govbr.client.ts', mode: 'client' }
]
})
```
E no seu plugin de cliente, faça o carregamento do `defineCustomElements` da mesma maneira.
## Evitando o FOUC (Flash of Unstyled Content)
Um dos problemas clássicos com SSR e Web Components é o FOUC — um piscar de componentes sem estilo enquanto o JavaScript carrega e o `customElements.define` ainda não rodou.
**Solução recomendada:**
Sempre importe as classes base e tokens de estilo nativos do pacote `core` globalmente. Mesmo se o Web Component não tiver inicializado as interações e o Shadow DOM, sua "casca" principal terá as regras globais e a aparência ficará muito próxima da versão hidratada. O componente fará o upgrade silenciosamente ao terminar o download do bundle.
---
## Vue
import Readme from '@site/../../packages/vue/README.md'
---
## Acessibilidade
Os componentes seguem HTML nativo quando existe uma semântica equivalente e usam os padrões [WAI-ARIA APG](https://www.w3.org/WAI/ARIA/apg/patterns/) somente para widgets que não têm equivalente completo. A referência de conformidade é WCAG 2.2 AA. Axe ajuda a encontrar regressões, mas não substitui testes manuais.
## O que o consumidor precisa fornecer
- Um label visível para cada controle; o nome acessível deve conter o texto apresentado.
- Texto de ajuda e erro associado por `aria-describedby` ou `aria-errormessage`.
- Mensagem textual de correção, além de `aria-invalid="true"` quando o erro for mostrado.
- `name`, `value`, `checked` e `selected` coerentes quando o controle participar de formulário.
- IDs estáveis quando usar `aria-labelledby`, `aria-describedby` ou `aria-controls`.
Não use placeholder, cor, ícone ou tooltip como único meio de comunicar instrução, obrigatoriedade ou erro. Não adicione roles redundantes nem `tabindex` positivo.
## Foco e teclado
| Widget | Referência | Operação |
| --- | --- | --- |
| botão/link | `button`/`a` | Tab; Enter e Espaço no botão |
| checkbox/switch | checkbox/switch APG | Espaço alterna |
| radio | radio group APG | setas, Home/End e roving tabindex |
| slider | slider APG | setas, Home/End e páginas |
| select/combobox | select/listbox APG | setas, Enter/Espaço e Escape |
| collapse | `details`/`summary` | Enter/Espaço; `toggle` |
| modal | dialog APG | foco inicial, contenção, Escape e retorno |
| tabs/menu | tabs/menu APG | roving tabindex, setas, Home/End e Escape |
| tooltip | tooltip APG | abre por foco/hover, fecha com Escape, nunca recebe foco |
Os controles de formulário delegam `focus()` ao elemento nativo no Shadow DOM. Relações ARIA não atravessam automaticamente Shadow Roots: o componente mantém as referências internas ou o consumidor deve fornecer a relação no escopo correto.
## Estados e mensagens
`aria-invalid`, `aria-checked`, `aria-selected`, `aria-expanded`, `aria-current` e valores de slider devem acompanhar o estado real. Para mensagens dinâmicas, use uma região de status com texto estável e não mova o foco sem necessidade. Em modais, devolva o foco ao acionador ao fechar.
## Verificação
Antes de publicar uma aplicação, verifique em viewport de 320 CSS px e zoom de 200%/400%, contraste, forced colors, `prefers-reduced-motion`, navegação somente por teclado e leitores de tela. A checklist mínima é:
- NVDA + Firefox;
- VoiceOver + Safari;
- TalkBack + Chrome;
- Tab/Shift+Tab, setas, Home/End, Enter/Espaço e Escape.
Consulte o [contrato de plataforma e APG](/docs/guias-essenciais/contrato-plataforma-e-apg/) para limitações de SSR/hydration e o [guia de formulários](/docs/frameworks/formularios/) para erros de formulário.
---
## Instalação via CDN
Uma das maneiras mais rápidas de começar a usar a biblioteca de Web Components do GovBR-DS é incluindo os scripts e estilos diretamente do CDN na sua página HTML.
Nós recomendamos a utilização do **[jsDelivr](https://www.jsdelivr.com/)**, um CDN global, rápido e confiável para projetos open-source.
## Incluindo os arquivos
Para utilizar os componentes no seu projeto via CDN, adicione as seguintes tags `