Receita de Web Component

Um web component é registrado como view.component e normalmente renderiza em um shadow root. Escolha a configuração válida mais enxuta.

Variante A: apenas conteúdo

Um gráfico, diagrama, renderizador ou visualização pode omitir PrimeVue e Tailwind quando não renderiza nenhum controle e não escreve nenhum utilitário Tailwind compartilhado.

Ele ainda precisa:

  • Publicar uma tag de custom element válida.
  • Preservar a acessibilidade do conteúdo renderizado.
  • Usar configuração e entrega de CSS suportadas pelo Wippy.
  • Evitar classes privadas da facade do projeto.
  • Compilar através do target Make canônico do repositório do módulo Wippy.

Se um botão, input, formulário, menu ou outro controle no estilo PrimeVue for adicionado depois, essa isenção termina.

Variante B: com controles

Um componente com controles precisa instalar o PrimeVue através do plugin PrimeVue do Wippy e configurar as chaves de entrega de CSS necessárias. A entrada a seguir é o caminho Vue atualmente suportado pelo pacote:

import { defineComponent, h } from 'vue'
import Button from 'primevue/button'
import { PrimeVuePlugin } from '@wippy-fe/theme/primevue-plugin'
import {
  WippyVueElement,
  define,
  type WippyElementConfig,
} from '@wippy-fe/webcomponent-vue'
import pkg from '../package.json'

const Root = defineComponent({
  name: 'ExampleControlsRoot',
  setup() {
    return () => h(Button, { label: 'Save' })
  },
})

class ExampleControlsElement extends WippyVueElement {
  static get wippyConfig(): WippyElementConfig {
    return {
      propsSchema: pkg.wippy.props,
      hostCssKeys: ['themeConfigUrl', 'primeVueCssUrl', 'iframeCssUrl'],
    }
  }

  static get vueConfig() {
    return {
      rootComponent: Root,
      plugins: [PrimeVuePlugin],
    }
  }
}

export async function webComponent() {
  return ExampleControlsElement
}

define(import.meta.url, ExampleControlsElement)

Os metadados do pacote precisam identificar o mesmo custom element:

{
  "name": "@example/controls",
  "version": "0.1.0",
  "type": "module",
  "specification": "wippy-component-1.0",
  "wippy": {
    "type": "component",
    "tagName": "example-controls",
    "props": {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
  }
}

O build do componente usa o plugin estrito de componente do Wippy e o snapshot completo e pinado do import map do host-alvo:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { wippyComponentPlugin } from '@wippy-fe/vite-plugin'
import hostImportMap from './wippy-import-map.json'

export default defineConfig({
  plugins: [vue(), wippyComponentPlugin({ required: true })],
  build: {
    lib: {
      entry: 'src/element.ts',
      formats: ['es'],
      fileName: 'index',
    },
    rollupOptions: {
      external: Object.keys(hostImportMap.imports),
    },
  },
})

Use o preset Tailwind compartilhado do Wippy quando este componente escrever utilitários Tailwind. O próprio PrimeVue não exige que um módulo invente utilitários Tailwind.

Regras do shadow root

  • Variáveis CSS públicas podem ser herdadas dentro do shadow root.
  • Regras de seletor só têm efeito se o host as entregar dentro da raiz.
  • O CSS compartilhado do tema PrimeVue é uma dependência suportada.
  • Classes arbitrárias da facade não são APIs portáveis.
  • O posicionamento de overlay precisa ser verificado no runtime real; não force uma receita genérica de posicionamento.

Metadados e build

Documente props e eventos tanto nos metadados do pacote quanto na entrada do registry, conforme exigido pelo schema selecionado. Invoque o target Make do repositório do módulo; a receita dele usa:

npm run build -- --outDir <target> --emptyOutDir

Não invoque esse comando subjacente diretamente. No Windows, invoque make.bat; ele delega ao make.ps1.

Veja Autoria de Temas, Contrato Tailwind e Contrato de Build e Dependências.