Communitygithub.com

addyosmani/agent-skills

Constrói UIs de front-end de qualidade de produção, acessíveis, responsivas e visualmente polidas. Use ao construir ou modificar interfaces e páginas, criar componentes, implementar layouts, atender aos requisitos de acessibilidade WCAG ou quando a saída precisa parecer feita por um engenheiro de design, não por IA.

O que é agent-skills?

Esta skill orienta o desenvolvimento de UIs de front-end com qualidade de produção, focando em acessibilidade, desempenho, design responsivo e adesão a sistemas de design. Ela fornece padrões de arquitetura de componentes, gerenciamento de estado, diretrizes de espaçamento e tipografia, e uma checklist de verificação para garantir que o resultado final não pareça genérico (o 'AI aesthetic'). A skill é independente de plataforma, funcionando com qualquer framework ou agente de IA (como Claude Code, Cursor, Codex), e é ativada sempre que um desenvolvedor estiver construindo ou modificando interfaces voltadas ao usuário. O conteúdo inclui desde a estruturação de arquivos até otimizações de carregamento e transições, com forte ênfase em WCAG 2.1 AA, estados de carregamento/vazio/erro e testes de responsividade em breakpoints específicos.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/addyosmani/agent-skills/tree/HEAD/skills/frontend-ui-engineering

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Engenharia de UI Front-end

Visão Geral

Construa interfaces de usuário de qualidade de produção que sejam acessíveis, com bom desempenho e visualmente polidas. O objetivo é uma UI que pareça ter sido construída por um engenheiro com noção de design em uma empresa de ponta — e não gerada por uma IA. Isso significa aderência real a sistemas de design, acessibilidade adequada, padrões de interação bem pensados e nenhum "estética AI" genérica.

Quando Usar

  • Construindo novos componentes ou páginas de UI
  • Modificando interfaces de usuário existentes
  • Implementando layouts responsivos
  • Adicionando interatividade ou gerenciamento de estado
  • Corrigindo problemas visuais ou de UX

Arquitetura de Componentes

Estrutura de Arquivos

Coloque tudo relacionado a um componente junto:

src/components/
  TaskList/
    TaskList.tsx          # Implementação do componente
    TaskList.test.tsx     # Testes
    TaskList.stories.tsx  # Histórias do Storybook (se estiver usando)
    use-task-list.ts      # Hook personalizado (se o estado for complexo)
    types.ts              # Tipos específicos do componente (se necessário)

Padrões de Componentes

Prefira composição em vez de configuração:

// Bom: Composável
<Card>
  <CardHeader>
    <CardTitle>Tarefas</CardTitle>
  </CardHeader>
  <CardBody>
    <TaskList tasks={tasks} />
  </CardBody>
</Card>

// Evite: Superconfigurado
<Card
  title="Tarefas"
  headerVariant="large"
  bodyPadding="md"
  content={<TaskList tasks={tasks} />}
/>

Mantenha os componentes focados:

// Bom: Faz uma coisa
function TaskItem({ task, onToggle, onDelete }: TaskItemProps) {
  return (
    <li className="flex items-center gap-3 p-3">
      <Checkbox checked={task.done} onChange={() => onToggle(task.id)} />
      <span className={task.done ? 'line-through text-muted' : ''}>{task.title}</span>
      <Button variant="ghost" size="sm" onClick={() => onDelete(task.id)}>
        <TrashIcon />
      </Button>
    </li>
  );
}

Separe a busca de dados da apresentação:

// Container: lida com dados
export function TaskListContainer() {
  const { tasks, isLoading, error } = useTasks();

  if (isLoading) return <TaskListSkeleton />;
  if (error) return <ErrorState message="Falha ao carregar tarefas" retry={refetch} />;
  if (tasks.length === 0) return <EmptyState message="Nenhuma tarefa ainda" />;

  return <TaskList tasks={tasks} />;
}

// Apresentação: lida com renderização
export function TaskList({ tasks }: { tasks: Task[] }) {
  return (
    <ul role="list" className="divide-y">
      {tasks.map(task => <TaskItem key={task.id} task={task} />)}
    </ul>
  );
}

Gerenciamento de Estado

Escolha a abordagem mais simples que funciona:

Estado local (useState)           → Estado de UI específico do componente
Estado elevado                    → Compartilhado entre 2-3 componentes irmãos
Context                           → Tema, autenticação, localidade (leitura pesada, escrita rara)
Estado de URL (searchParams)      → Filtros, paginação, estado de UI compartilhável
Estado de servidor (React Query, SWR) → Dados remotos com cache
Armazenamento global (Zustand, Redux) → Estado de cliente complexo compartilhado em todo o app

Evite prop drilling com mais de 3 níveis. Se você estiver passando props por componentes que não as usam, introduza um context ou reestruture a árvore de componentes.

Aderência ao Sistema de Design

Qualidade de UI Baseada em Referências

Quando o produto precisar de uma direção visual distinta, colete evidências antes de escolher um layout:

  1. Pesquise em um catálogo de referências confiável ou use referências fornecidas pela equipe do produto.
  2. Estude duas ou três telas relevantes. Registre decisões sobre hierarquia, densidade, navegação, controles, comportamento responsivo e estados de interação.
  3. Transforme essas decisões em um breve contrato de design antes da implementação. Nomeie a função da tela, ação principal, estados necessários, regras responsivas e padrões a rejeitar.
  4. Reconstrua a estrutura útil usando os próprios componentes, tokens, conteúdo e linguagem visual do produto. Nunca copie a marca, texto proprietário, imagens ou layout exato de outro produto.

Use referências como evidência, não como modelos. Se as referências não estiverem disponíveis, documente as suposições e verifique o resultado em relação ao sistema de design existente do produto.

Evite a Estética AI

UI gerada por IA tem padrões reconhecíveis. Evite todos eles:

Padrão AIPor que é um ProblemaQualidade de Produção
Tudo roxo/índigoModelos padrão usam paletas visualmente "seguras", fazendo todo app parecer idênticoUse a paleta de cores real do projeto
Gradientes excessivosGradientes adicionam ruído visual e conflitam com a maioria dos sistemas de designGradientes planos ou sutis que correspondem ao sistema de design
Tudo arredondado (rounded-2xl)Arredondamento máximo sinaliza "amigável" mas ignora a hierarquia de raios de borda em designs reaisborder-radius consistente do sistema de design
Seções hero genéricasLayout baseado em modelo sem conexão com o conteúdo real ou necessidade do usuárioLayouts centrados no conteúdo
Texto lorem ipsum genéricoTexto placeholder esconde problemas de layout que o conteúdo real revela (comprimento, quebra de linha, estouro)Conteúdo placeholder realista
Padding enorme em todos os lugaresEspaçamento generoso igual destrói a hierarquia visual e desperdiça espaço na telaEscala de espaçamento consistente
Grades de cards genéricasGrades uniformes são um atalho de layout que ignora a prioridade da informação e padrões de leituraLayouts orientados por propósito
Design pesado em sombrasSombras em camadas adicionam profundidade que compete com o conteúdo e diminui a renderização em dispositivos de baixo custoSombras sutis ou nenhuma, a menos que o sistema de design especifique

Espaçamento e Layout

Use uma escala de espaçamento consistente. Não invente valores:

/* Use a escala: incrementos de 0.25rem (ou o que o projeto usar) */
/* Bom */  padding: 1rem;      /* 16px */
/* Bom */  gap: 0.75rem;       /* 12px */
/* Ruim */  padding: 13px;      /* Não está em nenhuma escala */
/* Ruim */   margin-top: 2.3rem; /* Não está em nenhuma escala */

Tipografia

Respeite a hierarquia tipográfica:

h1 → Título da página (um por página)
h2 → Título da seção
h3 → Título da subseção
body → Texto padrão
small → Texto secundário/auxiliar

Não pule níveis de heading. Não use estilos de heading para conteúdo que não é heading.

Cor

  • Use tokens de cores semânticas: text-primary, bg-surface, border-default — não valores hexadecimais brutos
  • Garanta contraste suficiente (4.5:1 para texto normal, 3:1 para texto grande)
  • Não dependa apenas da cor para transmitir informações (use também ícones, texto ou padrões)

Acessibilidade (WCAG 2.1 AA)

Todo componente deve atender a estes padrões:

Navegação por Teclado

// Todo elemento interativo deve ser acessível por teclado
<button onClick={handleClick}>Clique aqui</button>        // ✓ Focável por padrão
<div onClick={handleClick}>Clique aqui</div>               // ✗ Não focável
<div role="button" tabIndex={0} onClick={handleClick}    // ✓ Mas prefira <button>
     onKeyDown={e => {
       if (e.key === 'Enter') handleClick();
       if (e.key === ' ') e.preventDefault();
     }}
     onKeyUp={e => {
       if (e.key === ' ') handleClick();
     }}>
  Clique aqui
</div>

Rótulos ARIA

// Rotule elementos interativos que não têm texto visível
<button aria-label="Fechar diálogo"><XIcon /></button>

// Rotule inputs de formulário
<label htmlFor="email">Email</label>
<input id="email" type="email" />

// Ou use aria-label quando não houver rótulo visível
<input aria-label="Pesquisar tarefas" type="search" />

Gerenciamento de Foco

// Mova o foco quando o conteúdo mudar
function Dialog({ isOpen, onClose }: DialogProps) {
  const closeRef = useRef<HTMLButtonElement>(null);

  useEffect(() => {
    if (isOpen) closeRef.current?.focus();
  }, [isOpen]);

  // Prenda o foco dentro do diálogo quando aberto
  return (
    <dialog open={isOpen}>
      <button ref={closeRef} onClick={onClose}>Fechar</button>
      {/* conteúdo do diálogo */}
    </dialog>
  );
}

Estados de Vazio e Erro Significativos

// Não mostre telas em branco
function TaskList({ tasks }: { tasks: Task[] }) {
  if (tasks.length === 0) {
    return (
      <div role="status" className="text-center py-12">
        <TasksEmptyIcon className="mx-auto h-12 w-12 text-muted" />
        <h3 className="mt-2 text-sm font-medium">Nenhuma tarefa</h3>
        <p className="mt-1 text-sm text-muted">Comece criando uma nova tarefa.</p>
        <Button className="mt-4" onClick={onCreateTask}>Criar Tarefa</Button>
      </div>
    );
  }

  return <ul role="list">...</ul>;
}

Design Responsivo

Projete primeiro para mobile, depois expanda:

// Tailwind: responsivo mobile-first
<div className="
  grid grid-cols-1      /* Mobile: coluna única */
  sm:grid-cols-2        /* Pequeno: 2 colunas */
  lg:grid-cols-3        /* Grande: 3 colunas */
  gap-4
">

Teste nestes breakpoints: 320px, 768px, 1024px, 1440px.

Carregamento e Transições

// Esqueleto de carregamento (não spinners para conteúdo)
function TaskListSkeleton() {
  return (
    <div className="space-y-3" aria-busy="true" aria-label="Carregando tarefas">
      {Array.from({ length: 3 }).map((_, i) => (
        <div key={i} className="h-12 bg-muted animate-pulse rounded" />
      ))}
    </div>
  );
}

// Atualizações otimistas para velocidade percebida
function useToggleTask() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: toggleTask,
    onMutate: async (taskId) => {
      await queryClient.cancelQueries({ queryKey: ['tasks'] });
      const previous = queryClient.getQueryData(['tasks']);

      queryClient.setQueryData(['tasks'], (old: Task[]) =>
        old.map(t => t.id === taskId ? { ...t, done: !t.done } : t)
      );

      return { previous };
    },
    onError: (_err, _taskId, context) => {
      queryClient.setQueryData(['tasks'], context?.previous);
    },
  });
}

Veja Também

Para requisitos detalhados de acessibilidade e ferramentas de teste, veja ../../references/accessibility-checklist.md.

Racionalizações Comuns

RacionalizaçãoRealidade
"Acessibilidade é algo bom de ter"É um requisito legal em muitas jurisdições e um padrão de qualidade de engenharia.
"Vamos deixar responsivo depois"Adaptar o design responsivo depois é 3x mais difícil do que construí-lo desde o início.
"O design não está finalizado, então vou pular o estilo"Use os padrões do sistema de design. UI sem estilo cria uma primeira impressão ruim para os revisores.
"Isso é só um protótipo"Protótipos viram código de produção. Construa a base corretamente.
"A estética AI está boa por enquanto"Ela sinaliza baixa qualidade. Use o sistema de design real do projeto desde o início.

Bandeiras Vermelhas

  • Componentes com mais de 200 linhas (divida-os)
  • Estilos inline ou valores de pixel arbitrários
  • Estados de erro, carregamento ou vazio ausentes
  • Nenhum teste de navegação por teclado
  • Cor como único indicador de estado (vermelho/verde sem texto ou ícones)
  • Visual "AI" genérico (gradientes roxos, cards superdimensionados, layouts padrão)

Verificação

Depois de construir a UI:

  • O componente renderiza sem erros no console
  • Todos os elementos interativos são acessíveis por teclado (Tab pela página)
  • O leitor de tela consegue transmitir o conteúdo e a estrutura da página
  • Responsivo: funciona em 320px, 768px, 1024px, 1440px
  • Estados de carregamento, vazio, erro, sucesso e permissão tratados quando aplicável
  • Segue o sistema de design do projeto (espaçamento, cores, tipografia)
  • O resultado renderizado passa por uma revisão final de qualidade específica de UI
  • Nenhum aviso de acessibilidade nas ferramentas de desenvolvimento ou axe-core

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

addyosmani/agent-skills

Guides stable API and interface design. Use when designing APIs, module boundaries, or any public interface. Use when creating REST or GraphQL endpoints, defining type contracts between modules, or establishing boundaries between frontend and backend.

addyosmani/agent-skills

Prepares production launches. Use when preparing to deploy to production, or when asking what needs to be in place before shipping. Use when you need a pre-launch checklist, when setting up monitoring, when planning a staged rollout, or when you need a rollback strategy.

addyosmani/browser-testing-with-devtools

Tests in real browsers via Chrome DevTools MCP. Use when building or debugging anything that runs in a browser. Use when you need to inspect the DOM, capture console errors, analyze network requests, profile performance, or verify visual output with real runtime data. Requires the chrome-devtools MCP server to be configured.

addyosmani/ci-cd-and-automation

Automates CI/CD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.

addyosmani/code-review-and-quality

Conducts multi-axis code review. Use before merging any change. Use when reviewing code written by yourself, another agent, or a human. Use when you need to assess code quality across multiple dimensions before it enters the main branch.

addyosmani/code-simplification

Simplifies code for clarity. Use when refactoring code for clarity without changing behavior. Use when code works but is harder to read, maintain, or extend than it should be. Use when reviewing code that has accumulated unnecessary complexity.

addyosmani/constraint-driven-development

Establishes a project's quality bar as a written contract and stops agents quietly lowering it. Interviews the user on which dimensions matter, supplies sane default thresholds when they have no number in mind, records everything in CONSTRAINTS.md, and watches the diff for a weakened bar — new @ts-ignore or eslint-disable suppressions, skipped or deleted tests, assertions stripped out, unimplemented stubs, thresholds edited down. Use when no quality bar is written down, when the user says "set up constraints" or "define our standards", when the user wants dimensions they care about — accessibility, web performance, coverage — set up as enforced constraints, when an agent keeps silencing checks or skipping tests to get to green, when you need a coverage or performance threshold and don't know what number to pick, or when an agent writes more code than anyone will read.

addyosmani/debugging-and-error-recovery

Guides systematic root-cause debugging. Use when tests fail, builds break, behavior doesn't match expectations, or you encounter any unexpected error. Use when you need a systematic approach to finding and fixing the root cause rather than guessing.

addyosmani/deprecation-and-migration

Manages deprecation and migration. Use when removing old systems, APIs, or features. Use when migrating users from one implementation to another. Use when deciding whether to maintain or sunset existing code.

addyosmani/documentation-and-adrs

Records decisions and documentation. Use when making architectural decisions, changing public APIs, shipping features, or when you need to record context that future engineers and agents will need to understand the codebase.

addyosmani/doubt-driven-development

Subjects every non-trivial decision to a fresh-context adversarial review before it stands. Use when correctness matters more than speed, when working in unfamiliar code, when stakes are high (production, security-sensitive logic, irreversible operations), or any time a confident output would be cheaper to verify now than to debug later.

addyosmani/git-workflow-and-versioning

Structures git workflow practices. Use when making any code change. Use when committing, branching, resolving conflicts, or when you need to organize work across multiple parallel streams.

addyosmani/idea-refine

Refines raw ideas into sharp, actionable concepts through structured divergent and convergent thinking. Use when an idea is still vague, when you need to stress-test assumptions before committing to a plan, or when you want to expand options before converging on one. Triggers on "ideate", "refine this idea", or "stress-test my plan".

addyosmani/incremental-implementation

Delivers changes incrementally. Use when implementing any feature or change that touches more than one file. Use when you're about to write a large amount of code at once, or when a task feels too big to land in one step.

addyosmani/interview-me

Extracts what the user actually wants instead of what they think they should want. Achieves this through one-question-at-a-time interview until ~95% confidence about the underlying intent. Use when an ask is underspecified ("build me X" without "for whom" or "why now"), when the user explicitly invokes ("interview me", "grill me", "are we sure?", "stress-test my thinking"), or when you catch yourself silently filling in ambiguous requirements before any plan, spec, or code exists.

addyosmani/observability-and-instrumentation

Instruments code so production behavior is visible and diagnosable. Use when adding logging, metrics, tracing, or alerting. Use when shipping any feature that runs in production and you need evidence it works. Use when production issues are reported but you can't tell what happened from the available data.

addyosmani/performance-optimization

Optimizes application performance. Use when performance requirements exist, when you suspect performance regressions, or when Core Web Vitals or load times need improvement. Use when profiling reveals bottlenecks that need fixing.

addyosmani/planning-and-task-breakdown

Breaks work into ordered tasks. Use when you have a spec or clear requirements and need to break work into implementable tasks. Use when a task feels too large to start, when you need to estimate scope, or when parallel work is possible.

addyosmani/security-and-hardening

Hardens code against vulnerabilities. Use when handling user input, authentication, data storage, or external integrations. Use when building any feature that accepts untrusted data, manages user sessions, or interacts with third-party services.

addyosmani/source-driven-development

Grounds every implementation decision in official documentation. Use when you want authoritative, source-cited code free from outdated patterns. Use when building with any framework or library where correctness matters.

Habilidades Relacionadas