TIS Design System

ADR-021 — Coexistência da v1 com vNext em Astro, Storybook e Ark/Zag

Status: Aceita · Data: 2026-07-28

Este arquivo é gerado automaticamente por scripts/sync-docs.mjs. Editar a fonte original, não este HTML.

Contexto

A versão 1.0.0 consolidou um núcleo stack-agnóstico consumível em CSS, JavaScript, tokens DTCG, documentação estática e Storybook HTML/Vite. Esse trabalho permanece útil e estável, mas mostrou um custo alto para criar e manter componentes interativos complexos diretamente, incluindo acessibilidade, lifecycle, composições e paridade entre superfícies.

Ao mesmo tempo, o projeto precisa:

O núcleo declarado na ADR-020 já concluiu o gate de consumo em 1.0.0. Portanto, iniciar um adaptador React não antecipa mais uma superfície sobre um núcleo incompleto.

Decisão

1. A v1 permanece estável e a vNext nasce de forma aditiva

A estrutura existente continua canônica para a linha 1.x:

A vNext nasce no mesmo repositório, sem substituir arquivos ou rotas da v1:

2. Astro/Starlight é o portal documental progressivo

O portal novo organiza conteúdo por idioma e tecnologia em URL. Exemplo:

/next/pt-br/web/components/button/
/next/pt-br/react/components/button/

Cada página pode combinar:

O chrome do portal usa os componentes e estilos nativos do Starlight, com a cor de marca TIS aplicada pelas variables --sl-*. Ele não simula componentes do DS nem carrega o reset visual da v1. Somente os canvases que documentam um componente real importam seu CSS público e os tokens necessários.

As quatro visões editoriais usam semântica de tabs com teclado, hash e fallback server-rendered. Essa escolha é navegação de conteúdo, não uma cópia visual das referências consideradas durante o desenho do portal. Tabs locais continuam reservadas a alternativas equivalentes, como package managers.

3. Ark UI é o provider preferencial e Zag é o motor de comportamento

Na vNext web:

Paridade multiplataforma significa preservar intenção, estados, acessibilidade, tokens e documentação. Não significa compartilhar o mesmo binário ou esconder diferenças legítimas entre frameworks.

shadcn pode distribuir source React sem se tornar provider de comportamento. Quando usado pelo DS, seu registry é somente o canal de aquisição e atualização do adapter React. A escolha entre HTML nativo, Ark UI ou acesso excepcional a Zag continua sendo feita pelo contrato de cada componente, segundo esta ADR.

Uma implementação React com Base UI pode permanecer como trilha beta de comparação, desde que declare o provider real, não seja apresentada como substituição de Ark/Zag e não determine as implementações de Vue, Solid ou Svelte. Sua promoção exige comparação componente a componente contra a opção Ark/Zag e decisão arquitetural explícita; a existência de source validado no registry, isoladamente, não altera o provider preferencial da vNext.

As versões de Ark são fixadas por linha de release e atualizadas somente com changelog upstream, stories de interação, Axe e teste de consumo. Zag é transitivo via Ark; dependência direta só entra quando a exceção acima for aprovada.

Performance é gate de release, não uma suposição baseada na quantidade de pacotes instalados. Os adapters usam imports por subpath, mantêm o framework como peer dependency e medem dois recortes com npm run test:vnext:bundle: o JavaScript incremental do provider e o preview integrado com wrapper, Lucide, tokens e CSS. Na referência inicial (@ark-ui/react 5.37.2), os limites gzip incrementais são 12 KiB para Accordion, 20 KiB para Dialog + Portal e 25 KiB para ambos. Os previews integrados têm limites de 24 KiB, 32 KiB e 38 KiB, respectivamente. Componentes pesados também devem admitir code splitting no consumidor. Esses orçamentos não incluem React/ReactDOM, não representam o overhead do Storybook e não substituem métricas de uma aplicação real, como INP e LCP.

O MCP oficial do Ark e os arquivos llms*.txt de Ark/Zag são ferramentas opcionais para agentes. Não participam do runtime, build, CI nem fonte de verdade da API instalada. Tipos do pacote, contrato aprovado e testes locais prevalecem.

4. Tokens e tema permanecem independentes da biblioteca de componentes

O JSON de tema é o contrato de entrada do motor de estilo. O mesmo tema pode gerar artefatos próprios para React, CSS e outras tecnologias web no futuro.

Nesta etapa:

Flutter permanece uma integração separada. Pode consumir valores e semântica compatíveis quando fizer sentido, mas não define a arquitetura web nem compartilha componentes React.

5. Figma continua sendo superfície de design, não gerador automático de código

O Figma atual permanece associado à v1. A biblioteca vNext será criada em arquivo separado, como cópia controlada da biblioteca original, depois da aprovação visual e estrutural da primeira spec.

O futuro importador de tema:

6. Promoção para versão principal depende de evidência

A vNext só pode substituir a v1 como linha principal depois de provar:

  1. cobertura mínima definida de componentes prioritários;
  2. paridade visual aprovada no Figma;
  3. contratos de acessibilidade e interação em Storybook;
  4. consumo real em pelo menos uma aplicação;
  5. documentação de migração e compatibilidade;
  6. política de atualização de recipes e dependências upstream;
  7. orçamentos de bundle e métricas de runtime aprovados.

Até esse gate, v1 e vNext são superfícies explícitas e não intercambiáveis.

Consequências

Positivas

Negativas

Alternativas consideradas

Reescrever a v1 imediatamente

Descartada. Eliminaria compatibilidade antes de a vNext provar cobertura e consumo.

Continuar criando todos os componentes em CSS/JavaScript próprios

Descartada como padrão para a vNext. Preserva neutralidade, mas mantém o custo e a fragilidade observados em componentes interativos complexos.

Usar MUI como implementação canônica

Descartada para a vNext principal. MUI entrega maior completude imediata, mas impõe API, theming e anatomia mais acoplados à biblioteca. Continua possível em produtos que decidam consumi-la por integração específica.

Usar shadcn com Base UI ou Radix como base canônica

Descartada como estratégia principal. É uma excelente receita para aplicações React, mas prioriza aquisição de código React e frequentemente Tailwind. Não atende tão diretamente ao objetivo atual de manter providers equivalentes em mais de uma tecnologia web. Continua possível em aplicações consumidoras sem se tornar o core.

Usar apenas Base UI

Descartada como provider principal porque sua superfície é React. Pode ser usada por uma integração React específica quando houver ganho demonstrável.

Usar Zag diretamente em todos os componentes

Descartada como padrão. Entrega o máximo de controle e lógica framework-agnostic, mas transfere ao DS a composição de anatomy, parts e adapters que Ark já fornece. Permanece como escape hatch controlado.

Migrar toda a documentação estática para Astro em um único passo

Descartada. A migração progressiva preserva URLs e permite comparar conteúdo, busca, acessibilidade e publicação antes de retirar a superfície antiga.

Referências