Interfaces sem ruído

Um DSL nativo para interfaces acessíveis.

Interfaces sem ruído

O Valence é o design system de Web Components que sustenta o Portfoliable.js. Construído no Storybook, ele usa custom elements nativos em vez de prender o sistema a um único framework. Um componente pode ser consumido pelo Portfoliable hoje e continuar disponível para outra aplicação JavaScript amanhã.[1][2]

Print de um componente do Valence no Storybook

Os componentes encapsulam comportamento e estilos por meio de Shadow DOM. Os estilos da aplicação não reescrevem acidentalmente um botão, e um componente pode evoluir sem obrigar cada consumidor a copiar seu CSS. Também mantém o design system próximo do modelo nativo do navegador — atributos, slots, eventos e HTML semântico.

import '@portfoliablejs/valence';

const button = document.createElement('ds-button');
button.setAttribute('label', 'Abrir case');
button.setAttribute('variant', 'primary');
document.querySelector('#actions').append(button);

Uma estrutura que acompanha a interface

A biblioteca segue um vocabulário de Atomic Design, mas o utiliza como mapa de engenharia, e não como uma taxonomia por si só:

Camada O que contém Por que importa
Sub-atoms Tokens, modos de acessibilidade, movimento e tipografia Estabelece a linguagem visual
Atoms Button, Icon, Toggle, Pill, Tab, Loader Reutiliza comportamentos primitivos
Molecules Summary, Tooltip, Navigation Menu, Video Controls Codifica padrões recorrentes
Organisms Header, Article, Gallery, Video Player Resolve responsabilidades completas
Templates Case View, Home View, Player View Compõe experiências de produto

Essa separação torna as mudanças mais fáceis de raciocinar. Um ajuste de espaçamento pertence a um token; uma interação de teclado pertence ao componente que a possui; uma decisão de fluxo de leitura pertence ao template consumidor.

flowchart TD subgraph Entry ["DOM Mountpoint (main.js)"] AppShell["<app-shell> (AppShell Class)"] end subgraph Shell ["App Shell Shadow DOM Boundary"] Header["<ds-header id='app-header'>"] Main["<main> Viewport Container"] Toast["<ds-toast id='app-toast'>"] ModalContainer["#modal-container"] VideoPlayer["<ds-video-player id='video-player'>"] end subgraph Views ["Dynamic View Containers"] HomeView["#view-home (<ds-home-view>)"] CaseView["#view-case (<ds-case-view>)"] end subgraph Components ["Valence Component Instances"] GalleryItem["<ds-gallery-item>"] Article["<ds-article>"] Modals["<ds-modal> / <ds-item-row>"] end AppShell --> Header AppShell --> Main AppShell --> Toast AppShell --> ModalContainer AppShell --> VideoPlayer Main --> HomeView Main --> CaseView HomeView --> GalleryItem CaseView --> Article ModalContainer --> Modals

Storybook como superfície de desenvolvimento

O Storybook é mais do que um catálogo. É o lugar onde API, casos extremos, estados visuais e comportamento acessível se tornam inspecionáveis. O Canvas dá feedback imediato; a aba Docs explica o contrato; os controles permitem testar combinações reais de props sem primeiro conectar uma aplicação inteira.

export const Reflow = {
  args: {
    label: 'reflow',
    count: 3,
    background: '#7ED321'
  }
};

Esse fluxo muda o ciclo de feedback. Em vez de perguntar se um componente funciona apenas dentro de uma página, a equipe pode fazer perguntas melhores mais cedo: um label longo se reorganiza? O estado de foco está visível? O que acontece quando a quantidade muda? A mesma API representa os estados de carregamento e desabilitado?

Controles de um componente Valence no Storybook

Acessibilidade como capacidade global

O Valence trata acessibilidade como uma preocupação do sistema. A aplicação consumidora pode alternar modos a partir da raiz do documento e deixar que a biblioteca responda de forma consistente:

<html class="a11y-dark-mode a11y-focus-mode">
  <body>
    <ds-header></ds-header>
  </body>
</html>

Os modos incluem tema escuro, alto contraste, texto grande, redução de movimento, tipografia amigável para dislexia, foco visível, forced colors, destaque de live regions e simulações de deficiências visuais.

No Storybook, esses modos aparecem como controles globais, permitindo avaliar acessibilidade como parte do desenvolvimento normal, e não apenas como auditoria final. Com o Portfoliable, o runtime pode cuidar da preferência e do estado da pessoa usuária, enquanto o Valence cuida da resposta visual.

Integração sem perder fronteiras

O Portfoliable consome o Valence por meio de contratos comuns da Web Platform. Estados simples viajam por atributos; conteúdo rico entra por slots; ações da pessoa usuária retornam como eventos customizados com namespace:

<ds-case-view
  title-text="Criando um onboarding mais claro"
  show-language-menu="true">
  <article slot="content">
    <h2>Resultado</h2>
    <p>A narrativa do case continua pertencendo à aplicação.</p>
  </article>
</ds-case-view>

Essa divisão mantém as responsabilidades claras. O Valence fornece a superfície de interação e a linguagem visual; o Portfoliable fornece dados dos cases, rotas, localização e contexto do produto.

O resultado

O Valence é a camada que permite ao Portfoliable ser coerente sem fazer cada case parecer igual. Ele transforma o cuidado com a interface em infraestrutura compartilhada — mantendo-a próxima da web aberta.

O que eu faria diferente

Se eu começasse o Valence novamente, faria algumas escolhas de forma mais explícita desde o início:

Essas mudanças não alterariam a direção do projeto, mas tornariam suas decisões mais sustentáveis. O objetivo seria preservar a portabilidade dos Web Components e a acessibilidade como capacidade global, reduzindo ao mesmo tempo o peso, a complexidade e o custo de evolução do sistema.

Conheça o repositório do Valence ou veja como ele sustenta o runtime do Portfoliable.


  1. Projeto solo: Lio Schimanko atuou como UX Designer e Desenvolvedor. ↩︎

  2. O Valence evoluiu de uma versão pré-release até a versão 1.1.2, sua versão mais recente. ↩︎