UI Development

Storybook

Storybook é um workshop para componentes de UI. Construa e teste-os isoladamente, documente cada estado e detecte regressões visuais e de acessibilidade antes que cheguem aos usuários.

intermediate12 min readUpdated 15 de set. de 2026
Button.stories.jsx
jsx
// Button.stories.jsx
import { Button } from "./Button";

export default {
  title: "Components/Button",
  component: Button,
  args: { children: "Save" },
};

export const Primary = {
  args: { variant: "primary" },
};

export const Disabled = {
  args: { disabled: true },
};
O que é
Um workshop de componentes
Unidade de trabalho
Uma story
Entradas
args e controls
Docs
Autodocs
Testes
Addons de interação e a11y
Frameworks
React, Vue, Svelte, Angular

Por que importa

Por que as equipes adotam o Storybook

Construa em isolamento

Desenvolva e revise um componente por conta própria, sem precisar executar todo o app ou navegar até a página correta.

Detecte problemas de a11y cedo

O addon de acessibilidade audita cada story e reporta violações enquanto você trabalha, antes que cheguem aos usuários.

Teste cada estado

Codifique casos de carregamento, estados vazios, erros e edge cases como stories, e então execute verificações visuais e de interação sobre eles.

O panorama completo

As três ideias por trás do Storybook

Stories como estados isolados, args como entradas dinâmicas e addons que expandem o workshop para testes e documentação.

Stories

Estados

Cada story renderiza um componente em um estado significativo, com um nome que documenta seu propósito.

Args

Entradas

As props que uma story passa, editáveis em tempo real através do painel de controls.

Addons

Extensão

Acessibilidade, testes de interação, regressão visual e documentação se conectam ao mesmo workshop.

Storybook em resumo

O núcleo do Storybook

Arquivos de story

Coloque um arquivo .stories junto ao componente e exporte uma story por estado.

Args

Defina props padrão no nível de meta e sobrescreva-as por story.

Controls

Ajuste args em tempo real na UI para explorar um componente sem editar o código.

Decorators

Envolva stories com providers, temas ou layout para garantir um contexto consistente.

Testes de interação

Funções play simulam cliques e digitação, e então fazem asserções sobre o resultado.

Addon de acessibilidade

Auditorias automáticas de cada story para violações comuns.

Uma breve historia

De ferramenta interna a padrão da indústria

  1. 2016

    Lançamento do Storybook

    Uma ferramenta específica para React para desenvolver componentes em isolamento.

    16
  2. 2018

    Suporte a frameworks

    Vue, Angular e outros ganham suporte oficial conforme a adoção cresce.

    18
  3. 2020

    Args e Controls

    Um formato de story mais simples com props editáveis em tempo real torna-se o padrão.

    20
  4. 2022

    Testes de interação

    Funções play e o test runner trazem a fase de testes para dentro do workshop.

    22
  5. Hoje

    Um padrão da indústria

    Utilizado para documentação, verificações de acessibilidade e regressão visual em grandes design systems.

    Hoje

O guia completo

Storybook: Tudo que voce precisa saber

O que é o Storybook?

O Storybook é um workshop para componentes de UI. Ele renderiza um componente de forma isolada, fora da sua aplicação, permitindo que você o desenvolva sem precisar navegar até a página correta ou satisfazer condições específicas. Cada estado relevante torna-se uma story, e a coleção de stories transforma-se em uma documentação viva.

O que começou como uma ferramenta de desenvolvimento evoluiu para muito mais: um auditor de acessibilidade, uma superfície para testes de interação e um alvo para regressão visual. Para equipes que constroem design systems ou bibliotecas de componentes compartilhadas, ele é frequentemente a ferramenta de front-end mais valiosa depois do próprio framework.

Stories

Um arquivo de story exporta um objeto meta padrão e um export nomeado para cada estado.

// Button.stories.jsx
import { Button } from "./Button";

export default {
  title: "Components/Button",
  component: Button,
  args: { children: "Save" },
  argTypes: {
    variant: {
      control: "select",
      options: ["primary", "secondary", "ghost"],
    },
  },
};

export const Primary = {
  args: { variant: "primary" },
};

export const Secondary = {
  args: { variant: "secondary" },
};

export const Disabled = {
  args: { disabled: true },
};

O title determina onde o componente aparece na barra lateral. O component vincula a story ao componente para que o Storybook possa inferir as props e gerar a documentação. Cada export nomeado é uma story.

Args e controls

Args são as props que uma story passa para o componente. O Storybook as transforma em um painel de controls, permitindo que você altere os valores em tempo real sem precisar editar o código.

// Card.stories.jsx
export default {
  title: "Components/Card",
  component: Card,
  args: {
    title: "Pro plan",
    description: "Everything you need to ship.",
    elevated: false,
  },
};

Como os args são dados estruturados, eles também alimentam o autodocs, podem ser compartilhados entre stories e podem ser reutilizados por testes de interação. Definir a marcação inline em uma função render funciona, mas você perde os controls em tempo real e a fonte única de verdade, por isso, prefira usar args.

Decorators e contexto

Alguns componentes precisam de um provider, um tema ou um wrapper de layout. Os Decorators fornecem esse contexto ao redor de uma story.

// preview.jsx
export default {
  decorators: [
    (Story) => (
      <ThemeProvider theme="dark">
        <div style={{ padding: "1rem" }}>
          <Story />
        </div>
      </ThemeProvider>
    ),
  ],
};

Um decorator pode ser global, por arquivo ou por story, o que facilita a revisão de um componente em diferentes temas ou locales sem a necessidade de alterar o próprio componente.

Autodocs

O Storybook pode gerar uma página de documentação a partir das suas stories e seus args. Com o autodocs habilitado, cada componente recebe uma página listando suas props, controls e cada story, que permanece sincronizada automaticamente por ser gerada a partir da mesma fonte. Você pode enriquecê-la com descrições, notas de uso e exemplos de código utilizando a API parameters.docs.

Testes de interação

Uma story pode definir uma play function que é executada após a renderização do componente. Ela utiliza as mesmas queries e eventos do Testing Library, portanto, o modelo mental é transferido diretamente.

// Search.stories.jsx
import { expect, userEvent, within } from "@storybook/test";

export const TypesAndSubmits = {
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);

    await userEvent.type(canvas.getByLabelText("Search"), "vitest");
    await userEvent.click(canvas.getByRole("button", { name: "Go" }));

    await expect(canvas.getByText("3 results")).toBeVisible();
  },
};

Como o teste é executado dentro do Storybook, você pode acompanhá-lo passo a passo, o que torna a depuração muito mais fácil do que analisar uma falha no CI. As mesmas stories podem ser executadas em modo headless no CI utilizando o test runner do Storybook.

Acessibilidade e testes visuais

O addon de acessibilidade executa o axe em cada story e reporta violações no painel do addon, agrupadas por impacto. Ele detecta labels ausentes, contraste insuficiente, ARIA inválido e problemas semelhantes enquanto você desenvolve, o que é muito mais barato do que corrigi-los posteriormente.

Ferramentas de regressão visual capturam um screenshot por story e o comparam com um baseline. Como cada estado já é um story, você obtém uma ampla cobertura visual com pouco esforço extra. Um screenshot alterado sinaliza uma mudança visual não intencional para revisão.

Onde o Storybook se encaixa

O Storybook fica posicionado entre os testes unitários e os testes end-to-end. Ele não substitui nenhum dos dois. Use-o para desenvolver e documentar componentes isoladamente, testar estados interativos com play functions e auditar a acessibilidade e o visual. Mantenha os testes de lógica rápidos no Vitest, o comportamento dos componentes no Testing Library e as jornadas completas no Playwright.

Melhores práticas

  • Escreva uma story para cada estado relevante, incluindo loading, vazio e erro.
  • Prefira args em vez de markup inline para que os controles e a documentação permaneçam precisos.
  • Coloque as stories junto aos seus componentes e nomeie-as de acordo com a finalidade.
  • Use decorators para providers, temas e layout em vez de duplicar wrappers.
  • Adicione play functions para interações e execute-as no CI.
  • Ative o addon de acessibilidade e corrija as violações conforme elas surgirem.
  • Publique o Storybook buildado como documentação viva.

Erros comuns

  • Escrever apenas uma story “Default” e ignorar estados reais.
  • Fazer hardcode de props em render, perdendo os controles e a documentação.
  • Tratar o Storybook como um substituto para testes unitários ou end-to-end.
  • Deixar que as stories fiquem defasadas em relação às props reais do componente.
  • Ignorar avisos de acessibilidade até que eles se acumulem.
  • Duplicar a configuração de providers em cada story em vez de usar um decorator.

Próximos passos

O Storybook transforma componentes em um catálogo documentado e testável. Combine-o com Testing Library para as queries dentro das play functions, Vitest para testes de lógica e Playwright para fluxos end-to-end. Agora, escolha o seu componente mais reutilizado e crie stories para cada estado possível dele.

Definindo entradas de story

Args alimentam os controls e a documentação. JSX hardcoded duplica a marcação e não pode ser ajustado em tempo real.

Preferível
export const Large = {
  args: {
    size: "large",
    children: "Save",
  },
};
Evite
export const Large = {
  render: () => (
    <Button size="large">
      Save
    </Button>
  ),
};

Cobertura de estados

Uma story por estado significativo documenta o componente e fornece alvos para a execução de testes.

Preferível
export const Loading = {
  args: { state: "loading" },
};
export const Empty = {
  args: { state: "empty" },
};
export const Error = {
  args: { state: "error" },
};
Evite
export const Default = {
  args: { state: "ready" },
};
// every other state lives
// only in the real app

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Storybook?

Nosso tutorial interativo te guia por Storybook passo a passo — com quizzes e codigo real que voce pode executar no navegador.