Ir para o conteúdo principal

Vue – @govbr-ds/webcomponents-vue

npm (next)

Este wrapper Vue encapsula os Web Components GovBR-DS, permitindo que sejam utilizados como componentes nativos no Vue.

Por que usar este wrapper? 🤔

  • Verificação de tipos.
  • Integração com Vue Router.
  • Suporte a v-model para componentes de formulário.

Mais detalhes na documentação do Stencil.

Instalação 📦

npm install @govbr-ds/webcomponents-vue
# ou
pnpm add @govbr-ds/webcomponents-vue
# ou
yarn add @govbr-ds/webcomponents-vue

peerDependencies

peerDependencies são pacotes que este wrapper não instala automaticamente — o seu projeto precisa tê-los instalados.

Observe que algumas peerDependencies podem ter suas próprias peerDependencies que também precisam ser atendidas. Consulte a documentação de cada pacote para garantir que todas as dependências necessárias estejam presentes.

Por que existem: Garantem que o seu app Vue e o wrapper compartilhem a mesma instância do Vue e dos Web Components. Versões duplicadas causam erros em tempo de execução.

O que isso implica: Se as peers não estiverem instaladas ou forem incompatíveis, componentes podem não funcionar.

As peers declaradas neste pacote são:

PacoteVersão mínima
vue>=3.3.0
@govbr-ds/webcomponents^2

Se você seguiu o comando de instalação acima, ambas as peers já estão incluídas.

Nota importante: pnpm e tree-shaking

Se ao consumir estes pacotes você notar que o bundler não está removendo código não utilizado (tree‑shaking), pode haver uma incompatibilidade com o layout padrão do pnpm.

Solução rápida (opcional, somente se precisar): crie um arquivo .npmrc na raiz do seu projeto com:

node-linker=hoisted

Por que isso ajuda: por padrão, o pnpm organiza as dependências em pastas isoladas com symlinks. Alguns bundlers/otimizadores se baseiam na estrutura de node_modules e no campo sideEffects para decidir o que pode ser eliminado. O layout hoisted aproxima o formato “achatado” (similar ao npm/yarn), facilitando essa análise e, em muitos casos, restaurando o tree‑shaking.

Observações:

  • Use apenas se o tree‑shaking realmente não estiver funcionando.
  • Pode aumentar o uso de disco e alterar a resolução de dependências do seu projeto.

Uso 📚

Fontes e ícones

No stylesheet global do app:

@import '~@govbr-ds/core/dist/core-tokens.min.css';

Configuração do template (Vite)

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.includes('br-'),
},
},
}),
],
})

Uso com componentes

import { BrButton } from '@govbr-ds/webcomponents-vue'

Uso com v-model:

<script setup lang="ts">
import { ref } from 'vue'
const name = ref('Lorem ipsum')
</script>

<template>
<h1>Olá {{ name }}</h1>
<br-input name="name" placeholder="Seu nome" v-model="name" />
</template>

Desenvolvimento 👨‍💻

Estrutura do projeto

├── 📁 src
│ ├── 📁 stencil-generated
│ └── 📄 index.ts

[!WARNING] Tudo dentro de stencil-generated é sobrescrito ao gerar o build de Web Components.

Scripts/Build

nx build webcomponents
nx build vue

Gerenciar baseline de tamanho:

# Da raiz do monorepo:
pnpm run baseline:update:vue # Atualizar baseline
pnpm run baseline:compare:vue # Comparar com baseline atual

Nuxt 3

Para Nuxt 3, configure vue.compilerOptions em nuxt.config.ts:

// nuxt.config.ts
export default defineNuxtConfig({
vue: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('br-'),
},
},
})

Use o plugin defineNuxtPlugin para registrar os Web Components apenas no cliente:

// plugins/govbr-ds.client.ts
import { defineCustomElements } from '@govbr-ds/webcomponents/loader'

export default defineNuxtPlugin(() => {
defineCustomElements()
})

Formatos do build 📦

A tarefa nx build vue compila o wrapper e gera a saída em dist/vue/. Abaixo estão os artefatos produzidos e quando utilizá-los.

Estrutura do dist/vue/

dist/vue/
├── src/
│ ├── index.js ← Entrada principal (ESM)
│ ├── index.d.ts ← Tipos TypeScript
│ └── stencil-generated/
│ └── components.js ← Componentes proxy com v-model (gerados pelo Stencil)
├── package.json
└── README.md

Quando usar cada formato

ArtefatoQuando usarObservações
src/index.jsAplicações Vue 3 (Vite, Webpack, Nuxt)Importação padrão via @govbr-ds/webcomponents-vue
src/index.d.tsAutocomplete e tipagem TypeScriptResolvido automaticamente pelo campo types do package.json

v-model e componentModels

Os componentes de formulário suportam v-model nativamente graças à configuração componentModels do Stencil Vue output target. Isso significa que:

  • br-input, br-select, br-checkbox, br-radio e outros componentes de formulário emitem o evento correto e expõem a prop adequada para two-way binding.
  • Não é necessário configuração extra — use v-model diretamente:
<script setup lang="ts">
import { ref } from 'vue'
import { BrInput } from '@govbr-ds/webcomponents-vue'

const nome = ref('')
</script>

<template>
<BrInput v-model="nome" label="Nome" />
</template>

Documentações Complementares 📖

Contribuindo 🤝

Reportar Bugs/Problemas 🐛

Abra uma issue: gitlab.com/.../issues/new

Commits 📝

Padrões de branches e commits: gov.br/ds/wiki

Precisa de ajuda? 🆘

Créditos 🎉

Desenvolvido pelo SERPRO com a comunidade.