Web components para o Design System

Nicole Oliveira
TOTVS Developers
Published in
4 min readMay 5, 2021
Photo by Vanessa Bucceri on Unsplash

A criação de design system tem crescido cada vez mais, tanto no mercado externo quanto interno. Pois este traz um tipo de esteira de produção para criar novos produtos, mais rápido e com qualidade tanto no que diz respeito a tecnologia (programação) quanto ao design.

Mas então, o que é um design system?

Primeiramente, podemos definir que design system, não é um projeto. Ou seja, não tem início, meio e fim. Sendo, assim, um produto. E ele nasce com o objetivo de servir a outros produtos.

“Um ecossistema de bibliotecas com componentes codados a partir de semânticas de design e gestão de estilo centralizada” — Meiuca Design

É a união entre design e tecnologia para escalar novas interfaces de produtos mantendo a qualidade.

Neste design system pode conter definições de tipografia, animações, cores, biblioteca de componentes, acessibilidade, entre outros.

Tecnologias utilizadas na criação do design system

Pensando em desenvolvimento Web, na criação de bibliotecas dentro do design system é comum utilizar os frameworks ou bibliotecas javascript mais famosos, como: Angular, React e Vue.js.

Esses frameworks são utilizados na criação de componentes como button, accordion ou checkbox. No entanto, trazem consigo uma limitação: só podem ser utilizados em produtos que utilizam a mesma tecnologia. Então, um produto que é desenvolvido em Angular só pode receber outro componente se esse componente também foi desenvolvido em Angular.

Uma outra abordagem adotada para design system utiliza o conceito de Web Components, que detalharei melhor a seguir.

O que é um Web Component?

É um conjunto de tecnologias nativas que possibilita a criação de componentes reutilizáveis em páginas Web. Atualmente, já é possível criar componentes apenas utilizando HTML, CSS e Javascript.

Isso significa que ao criar um Web Component, você pode importá-lo e utilizar dentro de um framework Angular, no React ou em uma página simples com Javascript puro.

Para isso, o Web Component é formado por:

  • Elementos customizáveis (customElements): é um conjunto de APIs javascript que possibilita declarar um elemento customizável e utilizá-lo no HTML.
  • Shadow DOM: Um conjunto de APIs JavaScript para incorporar uma árvore DOM “fantasma” encapsulada a um elemento — que é renderizada separadamente do DOM do documento principal — e controlar a funcionalidade associada.
  • Templates HTML: Usar os elementos <template> e <slot> para reaproveitamento de conteúdo
  • ES Modules: nova forma de se criar módulos utilizando ES6

No exemplo abaixo, temos a definição de um componente do tipo select customizados utilizando essas tecnologias.

const style = `
select {
padding: 8px;
width: 200px;
}
`;
class SelectComponent extends HTMLElement {

constructor() {
super();
this.shadow = this.attachShadow({ mode: 'open' });
}

get items() {
return JSON.parse(this.getAttribute('items'));
}

set items(value) {
this.setAttribute('items', value);
}

static get observedAttributes() {
return ['items'];
}

attributeChangedCallback() {
this.render();
}

connectedCallback() {
this.render();
}

render() {
const options = this.items.reduce((acc, item)=> {
return acc + `<option value="${item.value}">${item.label}</option>`
}, '');

this.shadow.innerHTML = `
<style>${style}</style>
<select>
${options}
</select>
`;
}
}

customElements.define('tdc-select', SelectComponent);

Com isso, basta apenas importar esse arquivo em algum HTML, e estará pronto para ser consumido!

Como está o mercado hoje

Atualmente, diversas empresas já estão utilizando web components. Entre elas, podemos citar a SalesForce, Microsoft, Google, Apple, Amazon, e muitas outras.

Para você ter acesso a essa informação, você pode consultar as principais bibliotecas utilizadas para acelerar a criação de web components. Dentro delas, há um área que mostra as empresas que utilizam:

Por que escolhemos utilizar web components

Para o desenvolvimento de biblioteca de componentes, principalmente quando falamos de design system, identificamos as seguintes vantagens:

  • Flexibilidade para poder utilizar em qualquer outro framework front-end
  • Interoperabilidade com projetos que estão em produção atualmente
  • Menor tamanho de pacote final
  • Suporta os navegadores atualmente mais utilizados: Chrome, Firefox, Safari e Opera. E para o IE11 possui pollyfills.

Desafios encontrados

Algumas ferramentas de apoio ainda não têm muita documentação para suporte. Por exemplo: testes e storybook. Mas isso não chega a ser um impedimento. Conseguimos criar os testes utilizando o Jest. E para o storybook utilizamos como a base a criação no formato HTML.

Custom properties para IE11 não foi possível, tivemos que utilizar fallback. Ou seja, tivemos que duplicar algumas propriedades, como background-color, font-family, padding, colocar um valor fixo para poder funcionar no tema. Conforme o exemplo abaixo:

button {
background-color: blue;
background-color: var(--background);
}

É isso pessoal, espero que este post possa ajudá-los na escolha da tecnologia de vocês.

Segue abaixo alguns links sobre o nosso design system para te ajudar:

--

--

Nicole Oliveira
TOTVS Developers

Gosta de tudo relacionado a front-end. É apaixonada por acessibilidade Web e machine learning. Core time em: PO UI e Animalia DS