@govbr-ds/webcomponents
Version:
Biblioteca de Web Components baseado no GovBR-DS
379 lines (270 loc) • 15.1 kB
Markdown
# Web Components GovBR-DS
<a id="readme-top"></a>
A biblioteca de Web Components do [GovBR-DS](https://gov.br/ds) é desenvolvida utilizando o [Stencil](https://stenciljs.com/), um compilador que cria Web Components (Custom Elements). O Stencil combina os melhores conceitos dos frameworks mais populares em uma ferramenta simples e eficiente. Para mais informações, visite o [site oficial do Stencil](https://stenciljs.com/).
## Demonstração 🚀
Confira nossos componentes em ação:
- [Versão 1.x](https://gov.br/ds/webcomponents/)
- [Versão 2.x (em desenvolvimento)](https://govbr-ds.gitlab.io/bibliotecas/wbc/govbr-ds-wbc/)
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Tecnologias 💻
Este projeto utiliza as seguintes tecnologias:
1. [GovBR-DS](https://gov.br/ds/ 'GovBR-DS')
1. [Stencil](https://stenciljs.com/ 'Stencil')
1. [Font Awesome](https://fontawesome.com/ 'Font Awesome')
1. [Fonte Rawline](https://www.cdnfonts.com/rawline.font/ 'Fonte Rawline')
1. [NX Monorepo](https://nx.dev/ 'NX Monorepo')
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## O que são Web Components? ❓
Web Components são um conjunto de tecnologias que permitem criar novos elementos HTML personalizados, reutilizáveis e encapsulados para uso em páginas e aplicativos web. Baseados em padrões da web, são suportados por todos os navegadores modernos.
O diagrama abaixo ilustra os três principais componentes dos Web Components:
- **Elementos HTML personalizados**: Tags HTML definidas com JavaScript, usadas como qualquer outro elemento HTML.
- **Shadow DOM**: Um espaço de nome encapsulado para cada elemento HTML personalizado, garantindo que estilos e scripts não interfiram no restante da página.
- **Templates**: Fragmentos de HTML reutilizáveis em vários elementos.
- **Slots**: Áreas em um elemento HTML personalizado onde templates podem ser inseridos.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Ciclo de Vida
Para entender melhor o ciclo de vida dos componentes, acesse a página [https://stenciljs.com/docs/component-lifecycle](https://stenciljs.com/docs/component-lifecycle).
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Integração com frameworks 🔗
Integrar Web Components com frameworks pode ser desafiador em algumas situações. Para facilitar, criamos bibliotecas de integração (wrappers), que encapsulam os Web Components em bibliotecas nativas de frameworks, simplificando a integração com funcionalidades como binding.
Para mais detalhes, consulte a [documentação do Stencil sobre integrações](https://stenciljs.com/docs/overview).
Vale lembrar que, em alguns casos, a integração pode não ser possível, dependendo da evolução da especificação de Web Components e do suporte dos frameworks.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Uso 📚
### Instalação
Instale o pacote com o comando abaixo:
```bash
npm install --save-dev @govbr-ds/webcomponents
```
> [!NOTE]
> Certifique-se de que o pacote `@govbr-ds/webcomponents` foi instalado corretamente.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Font Awesome e Fonte Rawline
Nossos componentes utilizam a [Fonte Rawline](https://www.cdnfonts.com/rawline.font/ 'Fonte Rawline') e a [Font Awesome](https://fontawesome.com/ 'Font Awesome') padrão do DS. Ambas são essenciais para garantir a estética e funcionalidade dos componentes. Consulte a documentação no site do [GovBR-DS](https://www.gov.br/ds/como-comecar/instalacao 'GovBR-DS') para mais detalhes sobre como importá-las via CDN.
- **[Font Awesome](https://fontawesome.com/ 'Font Awesome')**: Biblioteca amplamente utilizada para adicionar ícones vetoriais e logotipos aos projetos, fácil de integrar e personalizar.
- **[Fonte Rawline](https://www.cdnfonts.com/rawline.font/ 'Fonte Rawline')**: Fonte moderna e elegante, alinhada à identidade visual do Design System do GovBR-DS.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Passo-a-passo
Os Web Components GOVBR são elementos HTML regulares ou personalizados (Web Components). Em uma página HTML simples, podem ser usados como qualquer outro elemento.
```html
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@govbr-ds/webcomponents/dist/webcomponents/webcomponents.css" />
<script type="module" src="https://cdn.jsdelivr.net/npm/@govbr-ds/webcomponents/dist/webcomponents/webcomponents.esm.js"></script>
<link rel="stylesheet" href="node_modules/@govbr-ds/core/dist/core-tokens.min.css" />
</head>
<body>
<br-button>Clique aqui</br-button>
</body>
</html>
```
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Eventos
Você pode escutar eventos padrão, como clique e mouseover, da mesma forma que faria com elementos HTML normais. Muitos componentes também emitem eventos personalizados, que recomendamos fortemente utilizar. Esses eventos funcionam como os eventos padrão, mas possuem nomes específicos. Consulte a documentação de cada componente para obter detalhes sobre os nomes e dados dos eventos.
```html
<br-button>Label</br-button>
<script>
const button = document.querySelector('br-button')
button.addEventListener('click', (event) => {
console.log('Botão foi clicado', event.detail.valor)
})
</script>
```
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Exemplos de uso
Disponibilizamos exemplos de como usar este projeto com diferentes tecnologias. Consulte o [nosso grupo no GitLab](https://gitlab.com/govbr-ds/bibliotecas/wc 'GovBR-DS/WC') e procure pelos projetos de 'Quickstart' para mais detalhes.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Desenvolvimento 👨💻
### Estrutura do Projeto
```plaintext
├── 📁 src
├── 📁 components
├── 📁 br-component
├── 📁 sections
├── 📄 migrate.md
├── 📁 _tests
├── 📄 br-component.e2e.ts
├── 📄 br-component.spec.tsx
├── 📄 readme.md
├── 📄 br-component.scss
├── 📄 br-component.tsx
├── 📁 pages
├── 📁 components
├── 📁 br-component
├── 📄 index.js
├── 📄 exemplo.html
├── 📁 scripts
├── 📄 index.html
├── 📁 value-accessors
├── 📄 stencil.config.ts
├── ...
```
- **src**: Contém o código-fonte do projeto.
- **components**: Diretório com os componentes Web criados com Stencil. Cada componente possui sua própria pasta.
- **br-component**: Pasta específica para o componente `br-component`.
- **sections**: Contém arquivos markdown para inclusão no site.
- **migrate.md**: Explica como migrar o componente da versão anterior para a nova.
- **_tests**: Contém os arquivos de teste.
- **br-component.e2e.ts**: Testes end-to-end (E2E) do componente.
- **br-component.spec.tsx**: Testes unitários (Unit) do componente.
- **br-component.tsx**: Arquivo principal do componente, com lógica e estrutura.
- **br-component.scss**: Arquivo de estilo do componente.
- **readme.md**: Documentação gerada automaticamente durante o `build`.
- **pages**: Contém exemplos dos componentes Web criados com Stencil.
- **components**: Diretório com exemplos dos componentes.
- **br-component**: Pasta específica para o componente `br-component`.
- **index.js**: Arquivo para executar ações nos exemplos, como escutar eventos.
- **exemplo.html**: Arquivo com o código de cada exemplo.
- **scripts**: Scripts usados no ambiente de desenvolvimento.
- **value-accessors**: Configurações para 2-way binding em Angular e Vue.
- **index.html**: Página inicial do servidor de desenvolvimento.
- **stencil.config.ts**: Arquivo principal de configuração do projeto Stencil, onde são definidas opções como saída do build, plugins e scripts globais.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Scripts Disponíveis
No arquivo `package.json` e `project.json`, você encontrará diversos scripts úteis. Abaixo está uma lista com a descrição de cada um deles:
- **`nx start webcomponents`**: Inicia o site localmente para desenvolvimento.
- **`nx build webcomponents`**: Realiza a compilação do projeto para produção.
- **`nx test:unit webcomponents`**: Executa os testes unitários.
- **`nx lint:tsx webcomponents`**: Realiza a análise estática nos arquivos TypeScript.
- **`nx lint:md webcomponents`**: Realiza a análise estática nos arquivos markdown.
- **`nx lint:styles webcomponents`**: Realiza a análise estática nos arquivos de estilo.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Build
Ao gerar o `build` deste projeto Stencil, são automaticamente criados:
- O arquivo `readme.md` dentro da pasta de cada componente.
- Documentações dos componentes na pasta `apps/site/docs/stencil-generated-docs`, que podem ser utilizadas e versionadas pelo site.
```bash
nx build webcomponents
```
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Testes
Nossa estratégia de testes é dividida em duas abordagens principais: testes unitários e testes end-to-end (E2E).
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
#### Testes Unitários (\*.spec.tsx)
Os testes unitários são ideais para validar a lógica interna dos componentes de forma isolada e eficiente. Utilizamos o método `newSpecPage()` para verificar:
- Estado inicial: comportamento do componente sem propriedades.
- Propriedades: valores válidos, inválidos e alterações em tempo de execução.
- Classes CSS: presença e ausência de classes condicionais.
- Slots: renderização correta do conteúdo.
- Lógica interna: métodos, cálculos e transformações.
- Validações básicas: required, minLength, maxValue, entre outras.
```typescript
import { newSpecPage } from '@stencil/core/testing'
import { BrComponent } from '../component'
it('deve inicializar com o estado padrão', async () => {
const page = await newSpecPage({
components: [BrComponent],
html: /*html*/ `<br-component></br-component>`,
})
expect(page.root).toEqualHtml(`<br-component>...</br-component>`)
})
```
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
### Testes E2E (\*.e2e.ts)
Os testes E2E são realizados em um navegador real utilizando o método `newE2EPage()`. Embora sejam mais lentos, são fundamentais para validar:
- Eventos do componente: clique, blur, change, entre outros.
- Interações do usuário: drag-drop, digitação, atalhos.
- Integrações DOM: forms, validação nativa, atributos aria-\*.
- Estilos visuais: dimensões, cores, transições.
- Shadow DOM: slots, parts, estilos encapsulados.
```typescript
import { newE2EPage } from '@stencil/core/testing'
describe('br-component', () => {
it('deve renderizar', async () => {
const page = await newE2EPage()
await page.setContent(/*html*/ `<br-component></br-component>`)
const element = await page.find('br-component')
expect(element).toHaveClass('hydrated')
})
it('deve ter shadow root', async () => {
const page = await newE2EPage()
await page.setContent(/*html*/ `<br-component-component></br-component-component>`)
const element = await page.find('br-component')
expect(element.shadowRoot).not.toBeNull()
})
})
```
Para mais informações sobre testes no Stencil, consulte a [documentação oficial](https://stenciljs.com/docs/testing-overview).
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## VSCODE
Durante o desenvolvimento de nossos Web Components, utilizamos custom elements. O VSCODE, por padrão, não reconhece esses componentes, o que impede sugestões inteligentes no autocomplete. Para resolver isso, geramos um arquivo `vscode-data.json` com as definições dos componentes, que é disponibilizado junto ao pacote npm.
Para importar no seu VSCODE, adicione o seguinte campo, ajustando o caminho para o local onde o `node_modules` está armazenado no seu projeto:
```json
{
"html.customData": ["./node_modules/@govbr-ds/webcomponents/dist/webcomponents/dist/webcomponents.html-custom-data.json"]
}
```
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Documentações Complementares 📖
Consulte a seção sobre Web Components na nossa [Wiki](https://gov.br/ds/wiki/desenvolvimento/web-components) para obter mais informações sobre este projeto.
Para mais detalhes sobre a especificação de Web Components, recomendamos a consulta ao [MDN](https://developer.mozilla.org/pt-BR/docs/Web/Web_Components 'Web Components | MDN').
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Contribuindo 🤝
Antes de abrir um Merge Request, considere as seguintes orientações:
- Este é um projeto open-source, e contribuições são sempre bem-vindas.
- Para facilitar a aprovação da sua contribuição, utilize um título claro e explicativo no MR e siga os padrões descritos em nossa [wiki](https://gov.br/ds/wiki/ 'Wiki').
- Deseja contribuir? Consulte o nosso guia [como contribuir](https://gov.br/ds/wiki/comunidade/contribuindo-com-o-ds/ 'Como contribuir?').
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Reportar Bugs/Problemas ou Sugestões 🐛
Caso encontre problemas ou tenha sugestões de melhorias, abra uma [issue](https://gitlab.com/govbr-ds/bibliotecas/wbc/govbr-ds-wbc/-/issues/new). Utilize o modelo apropriado e forneça o máximo de detalhes possível.
Nos comprometemos a responder a todas as issues.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Commits 📝
Este projeto segue um padrão específico para branches e commits. Consulte a documentação em nossa [wiki](https://gov.br/ds/wiki/ 'Wiki') para entender mais sobre esses padrões.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Precisa de ajuda? 🆘
Por favor, **não** crie issues para dúvidas gerais.
Utilize os canais abaixo para esclarecer suas dúvidas:
- Site do GovBR-DS [http://gov.br/ds](http://gov.br/ds)
- Web Components [https://gov.br/ds/webcomponents](https://gov.br/ds/webcomponents)
- Canal no Discord [https://discord.gg/U5GwPfqhUP](https://discord.gg/U5GwPfqhUP)
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>
## Créditos 🎉
Os Web Components do [GovBR-DS](https://gov.br/ds/ 'GovBR-DS') foram desenvolvidos pelo [SERPRO](https://www.serpro.gov.br/ 'SERPRO | Serviço Federal de Processamento de Dados') em parceria com a comunidade.
<p align="right">
<a href="#readme-top">Voltar ao topo</a>
</p>