12k
All articles

Um Primeiro Olhar sobre o Astryx, o Design System da Meta

Astryx, o design system open source da Meta, reúne mais de 150 componentes React, temas, CLI, níveis de customização e comparação com shadcn/ui e Base UI.

OpenReplay Team
OpenReplay Team
Um Primeiro Olhar sobre o Astryx, o Design System da Meta

O Astryx é a reconstrução open-source, feita pela Meta, do design system que cresceu dentro da empresa. Foi anunciado no blog do Astryx em 18 de junho de 2026 e publicado como beta público sob a licença MIT, entregando mais de 150 componentes React acessíveis, sete temas prontos, templates e uma CLI, construído sobre React 19 ou superior e StyleX.

Se você já entregou algo com MUI, conhece uma versão desse dilema: os componentes funcionam, e então você passa uma sprint inteira brigando com um objeto de tema para fazer um botão parar de parecer o botão de outra pessoa. Se você é dono do código-fonte do shadcn/ui, conhece a outra: quarenta arquivos de componentes no seu repositório, inteiramente seus, sem nenhum upstream de onde puxar uma correção de gerenciamento de foco.

A proposta da Meta é que o Astryx fique entre esses dois extremos. A lista de funcionalidades é fácil de encontrar; o que realmente determina o custo de adotá-lo é a escada de customização de cinco degraus e em qual degrau dessa escada sua equipe vai acabar morando. Este artigo cobre o que é o Astryx, como instalá-lo e consumi-lo, como funciona a tematização, quanto custa cada degrau dessa escada e onde ele se posiciona ao lado do shadcn/ui e do Base UI.

Principais Pontos

  • O Astryx exige React 19 ou superior, e @astryxdesign/core declara react, react-dom e @stylexjs/stylex como peer dependencies.
  • O Astryx oferece dois caminhos de distribuição: importar as folhas de estilo pré-compiladas, ou compilar a partir do código-fonte TypeScript e StyleX para que seu bundler emita CSS apenas para os componentes que você importa.
  • A customização escala por cinco degraus, e apenas o último, fazer swizzle do código-fonte de um componente para dentro do seu repositório, tira você do caminho de atualização compartilhado.
  • Os componentes aceitam tanto uma prop tipada xstyle quanto um className comum, e o caminho pré-compilado não adiciona nada ao seu build: sem plugin de bundler, sem PostCSS, sem configuração de Babel.
  • O Astryx ainda é um beta público em releases 0.x, sem linha estável, o que torna a rotatividade de API um custo real.

O Que É o Astryx?

O Astryx é uma biblioteca de componentes com um sistema inteiro em volta dela: componentes React tipados entregues junto com CSS pré-compilado, além de tematização em nível de marca, modo escuro, templates de página e uma CLI, tudo distribuído como um único conjunto de pacotes. O artigo técnico da Meta o apresenta como a reconstrução open-source de um sistema que cresceu dentro da empresa por oito anos, alcançou mais de 13.000 produtos e recebeu aproximadamente metade de suas atualizações da comunidade de builders interna. Os estilos são escritos com StyleX, o compilador da Meta que transforma objetos de estilo em CSS atômico e livre de colisões em tempo de build, o que importa se sua objeção ao CSS-in-JS é o custo em runtime: não há nenhum engine de estilos rodando no navegador.

A CLI é onde a maior parte do trabalho com o projeto acontece, tanto para pessoas quanto para máquinas. Documentação de componentes, design tokens, templates de página, ferramentas de tematização e codemods de atualização saem todos dela, seja você chamando-a a partir de um terminal, lendo sua saída JSON tipada ou importando suas funções, e agentes e ferramentas de build passam pela mesma API. A forma como o próprio projeto se descreve como “AI-fluent” e pronto para agentes é posicionamento, não um resultado medido; o harness de avaliação que a Meta descreve não tem resultados publicados em nenhum dos posts de anúncio.

Como Você Realmente Consome o Astryx?

React 19 é o piso: @astryxdesign/core lista react e react-dom na versão 19.0.0 ou superior como peer dependencies. Esse é o primeiro portão. O segundo é maturidade: @astryxdesign/core publica em uma linha 0.x no npm, e @astryxdesign/vega e @astryxdesign/charts entregam builds reais apenas sob a dist-tag @canary, com sua tag latest ainda apontando para um release placeholder.

Instale o pacote core, um pacote de tema e o peer do StyleX, com a CLI como dependência de desenvolvimento:

npm install @astryxdesign/core @astryxdesign/theme-neutral @stylexjs/stylex
npm install -D @astryxdesign/cli
npx @astryxdesign/cli init

O passo init escreve o índice de componentes do Astryx no seu AGENTS.md ou CLAUDE.md, o que você pode pular se nenhum agente tocar no repositório. No caminho simples, você então importa três folhas de estilo, nesta ordem, e envolve a aplicação em um theme provider:

@import '@astryxdesign/core/reset.css';
@import '@astryxdesign/core/astryx.css';
@import '@astryxdesign/theme-neutral/theme.css';

Segundo o próprio repositório, essa é toda a configuração: os três imports, o provider, e nenhuma mudança na sua toolchain de build. O caminho avançado compila a partir do código-fonte TypeScript e StyleX usando @astryxdesign/build, que carrega os plugins de Babel, PostCSS e Vite, de modo que o bundler emite estilos apenas para os componentes que você de fato importa. A Meta estima esse caminho em cerca de um terço da folha de estilo completa em sua própria aplicação de referência, o que é a medição deles sobre o código deles, e não uma regra geral. Cada componente vem de seu próprio subpath, e não da raiz do pacote.

Tematização: Comportamento no Sistema, Aparência nos Tokens

O Astryx divide a responsabilidade ao meio. Comportamento e acessibilidade vivem na biblioteca; a aparência vive em uma camada de tokens, de modo que uma configuração de tema contém cor, tipografia, raio, espaçamento e movimento, e editar um único valor reestiliza todos os componentes que o leem, sem que ninguém precise abrir o código de um componente. Valores de tema claro e escuro ficam lado a lado no mesmo tema, em vez de em dois arquivos paralelos, e um tema pode ser trocado em runtime ou compilado para uma folha de estilo estática. Os temas vão além de variáveis CSS: eles podem sobrescrever componentes individuais e partes de componentes, e adicionar variantes próprias.

Sete temas prontos vêm com o projeto, e você parte de um deles em vez de partir do zero: theme list mostra o que está disponível, incluindo temas de integrações instaladas, e theme add <slug> coloca o tema escolhido no seu projeto como código-fonte editável. Essa é a aposta de design em uma linha. O designer é dono de um arquivo de configuração, e ninguém precisa fazer fork ou wrap de um componente para mudar sua aparência.

O Caminho de Customização Gradual

A customização no Astryx escala por cinco degraus: usar os componentes como vêm, ajustar tokens de tema, aplicar nomes de classe, sobrepor seu próprio CSS e, por fim, fazer swizzle do código-fonte de um componente para dentro do seu repositório. Cada degrau compra mais controle e custa mais responsabilidade de manutenção. Os quatro primeiros mantêm você no caminho de atualização compartilhado; o quinto tira aquele componente dele permanentemente.

DegrauO que você mudaO que isso lhe custa
Usar como vemNadaNada; atualizações são de graça
Tokens de temaCor, tipografia, raio, espaçamento, movimentoUm arquivo de configuração que sua equipe mantém
Nomes de classeAparência por instânciaDisciplina com cascade layers
CSS customizadoQualquer coisa que a ordem das camadas permitaSeletores que podem quebrar na atualização
SwizzleO próprio componenteManutenção total, permanentemente

O swizzle é a porta de sentido único. Alguns detalhes internos simplesmente não são expostos pela API pública, como estado privado, estrutura do DOM ou event listeners inalcançáveis, e ejetar o código-fonte é o único caminho até eles; a partir desse ponto, você mantém o componente, não a biblioteca. A CLI ejeta o código-fonte do componente e roda codemods de versão com astryx swizzle Button e astryx upgrade --apply:

npx @astryxdesign/cli swizzle Button

Use a forma com escopo para execuções pontuais: até que @astryxdesign/cli seja uma dependência, o npm resolve um astryx puro para um pacote não relacionado. O movimento prático antes de adotar o Astryx é testar seus dois ou três componentes mais difíceis contra o quinto degrau: se a customização de que você precisa exige detalhes internos, contabilize o custo de ser dono daquele código desde o primeiro dia.

Interoperabilidade de Estilos: xstyle, className e Tailwind

Os componentes do Astryx aceitam tanto uma prop tipada xstyle para overrides de StyleX quanto um className comum, de modo que coexistem com Tailwind, CSS Modules ou folhas de estilo convencionais. O mesmo componente, de três formas:

import * as stylex from '@stylexjs/stylex';
import {Button} from '@astryxdesign/core/Button';

const styles = stylex.create({
  save: {alignSelf: 'flex-end', marginBlockStart: 24},
});

// 1. As shipped
<Button label="Save" variant="primary" />;

// 2. Typed StyleX override, compiled at build time
<Button label="Save" variant="primary" xstyle={styles.save} />;

// 3. Plain className, no compiler involved
<Button label="Save" variant="primary" className="ml-auto mt-6" />;

No caminho pré-compilado, a opção três não exige nenhuma toolchain adicional: o StyleX é como o Astryx escreve seus estilos, não algo que você precise configurar. Uma condição se aplica. O Astryx carrega suas folhas de estilo em cascade layers, @layer reset para o reset e @layer astryx-base para os estilos de componentes, e camadas não respondem a especificidade: qualquer coisa deixada fora de uma camada, ou colocada em uma camada declarada depois, vence de qualquer jeito. Então um projeto que já carrega CSS global, um reset antigo ou Tailwind precisa definir ele mesmo a ordem das camadas e colocar cada folha de estilo em uma camada de forma intencional.

Astryx vs shadcn/ui e Base UI: Como Eles Diferem?

A Meta posiciona o Astryx contra dois desfechos que nomeia no post de lançamento: adote o design system de uma grande empresa e você herda a marca dela, ou monte componentes copiados e colados e ganhe liberdade abrindo mão de coerência compartilhada, correções vindas do upstream e um caminho de atualização, com a acessibilidade caindo no colo da sua equipe por padrão. Esse é o argumento da Meta em favor do próprio produto, e vale conferir contra o que as alternativas dizem de si mesmas. O shadcn/ui se descreve ao contrário: não uma biblioteca que você instala, mas uma maneira de construir a sua própria, entregando o código dos componentes para você editar diretamente. Ser dono do código é a funcionalidade, não um efeito colateral, como nossa análise sobre por que equipes migram para o shadcn/ui explora com mais profundidade. O Base UI entrega componentes React headless e hooks sem CSS próprio, então a aparência do resultado fica inteiramente por sua conta.

Leia isso como restrições, não como veredictos: o Base UI dá a você comportamento acessível e nenhuma opinião, o shadcn/ui dá a você o código-fonte e a manutenção que vem junto, e o Astryx dá a você um sistema tematizado do qual ainda é possível ejetar componente a componente. O quinto degrau do Astryx chega à posição do shadcn/ui por outro caminho, um componente de cada vez e somente quando você escolhe.

As ressalvas são diretas. É um beta público em 0.x, sem linha estável, exige React 19 e é um projeto de fornecedor único; as discussões no lançamento levantaram questões de governança e manutenção de longo prazo que nada público resolve. A rotatividade típica de um beta não é hipotética: o release 0.6.0 quebra qualquer um que chame useStepperContext diretamente, removendo os campos de layout compacto daquele hook e estreitando StepperContextValue para histórico de transição e registro de etapas. Por outro lado, a página da comunidade descreve um Discord oficial e issues no GitHub triadas semanalmente.

Quem Deveria Experimentar o Astryx Agora, e Quem Deveria Esperar?

Experimente agora se você está começando uma ferramenta interna ou dashboard greenfield em React 19, quer componentes acessíveis sem precisar projetá-los, e tem um designer que preferiria ser dono dos tokens a revisar pull requests de CSS. Espere se você está abaixo do React 19, se mantém um produto voltado ao público onde uma versão minor 0.x alterando o formato de um contexto lhe custaria um release, ou se governança de fornecedor único é uma questão de procurement que você ainda não consegue responder. Um caminho intermediário útil é uma rota de uma aplicação existente: folhas de estilo pré-compiladas, ordem explícita de @layer e uma única tela construída com componentes que, de outra forma, você teria escrito você mesmo.

O que deve ser avaliado não é a quantidade de componentes. É em qual degrau da escada de customização seus requisitos de design vão forçar você a subir, porque é isso que você estará pagando daqui a um ano. Escolha os dois componentes com os quais seu produto não pode fazer concessões, rode npx @astryxdesign/cli component <Name> em cada um, e veja se tokens e className resolvem antes que a ejeção do código-fonte se torne necessária.

Perguntas Frequentes

Qual é a diferença entre Astryx e StyleX?

StyleX é o compilador CSS-in-JS em tempo de build da Meta, que transforma objetos de estilo em CSS atômico e livre de colisões. O Astryx é o design system de componentes React cujos estilos são escritos com ele. O Astryx instala @stylexjs/stylex como peer dependency, mas consumir as folhas de estilo pré-compiladas não exige plugin de build, nem PostCSS, nem configuração de Babel. Apenas builds a partir do código-fonte trazem os plugins do StyleX vindos de @astryxdesign/build.

O Astryx funciona com Next.js, Vite ou uma configuração simples via CDN?

Sim. O README do @astryxdesign/core documenta configurações para Next.js, Tailwind, Vite e CDN. No caminho pré-compilado você importa o reset, a folha de estilo dos componentes e uma folha de estilo de tema, e então envolve a aplicação em um theme provider, sem nenhum plugin de bundler envolvido. Compilar a partir do código-fonte TypeScript e StyleX, por outro lado, exige os plugins de Babel, PostCSS ou Vite entregues em @astryxdesign/build.

Preciso da CLI do Astryx para usar a biblioteca?

Não. Os componentes e o CSS pré-compilado funcionam apenas com os pacotes instalados, e a CLI é uma dependência de desenvolvimento. Você precisa dela para theme list e theme add, documentação completa de componentes, templates, codemods de atualização e swizzling. Rodar astryx init escreve o índice de componentes do Astryx em AGENTS.md ou CLAUDE.md, o que só importa quando agentes de IA trabalham no repositório.

Os componentes de gráficos do Astryx estão prontos para uso em produção?

Não. O @astryxdesign/vega, o wrapper do Vega, e o @astryxdesign/charts, a biblioteca de gráficos baseada em d3, publicam builds reais no npm apenas sob a dist-tag canary; sua tag latest aponta para um release placeholder que o próprio npm avisa para não instalar. O pacote experimental @astryxdesign/lab, onde novos componentes aterrissam antes de se formarem e entrarem no core, é publicado da mesma maneira. Gráficos, portanto, ficam atrás dos pacotes core que já estão em beta 0.x e precisam de um plano de contingência próprio.

Digital experience platform

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.