Design para React com IA: o prompt exato para acelerar seu front-end

Diego Fernandes

Diego Fernandes

3 min de leitura
https://prod-files-secure.s3.us-west-2.amazonaws.com/08f749ff-d06d-49a8-a488-9846e081b224/38964c59-50ba-4d32-bfe5-ef146909e1d3/mentoria-figma-para-devs.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466ZB3WQ6N5%2F20260214%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260214T164528Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEEAaCXVzLXdlc3QtMiJGMEQCIHT5FYFu97Chv4WxLw8PewxiRzJd5CEVnZFn077AHILrAiB7ivAkBkITuBY9ViUKbTf1bNyV%2Bk6iU7uRAi%2BSda67ECr%2FAwgJEAAaDDYzNzQyMzE4MzgwNSIMy1Al675%2BZ7xHBfSkKtwDzdqITI9DiU%2BuP2fRz5RGcOqOrAyf%2FDzBh4yD4ouH0EoHAottvKbIiJmHz%2BcNrEIYaUusQ7XamGTvU0fZSek4dg4hCOZkDhBuSaFmto6Ok%2B4qHTv3m%2BB%2BKRnB3jQpPrTx2ejfKyBqrXP%2BblHE2eaVGb%2Bh8HOGzFWms9KawGcUrVPOhpXSe2CIOX%2FnCHQPpN9kf92s1npVkuKXchg6BE90YhEi7cgO4qhw2VDDslMObi%2B8Ho1XkjxREL7%2FKxGLu6DLClnRQjr8EHNFdmHy1mE%2F%2FanyJDfLxSGzsZsvp4qvG5DGvXd0igu8CU%2F5mJg0nxU%2Bb1aYuyof1COMZQ88PxgH1KQVOn6ytCvhoI8%2FNdOQHjBqGquhlysNkpWJjE6diioj2i%2BR2rlhrqIxe5BcbPg%2BsvzL4a%2F%2BZ1FnqFIRm%2BQQY%2Bj53YoW2EyUg2vTc1MnCUPIcc8CjbQ4av0qctcNXs6KWnPcMzdhBArDDIy9yFf4tieS1UwhzlV%2BKIa00rUYNgYDZJ9fZhYe%2FO%2F6gMCPuFmDB%2FafcTGzH6KXVRi9kOkKwrt2IGtsOCC%2BFbZvl4PpkTgaagultSqS7ISnhA%2FHHPMfGtKD2Y7XP58m2wZhBsuV1Kd7L%2BQXw2OtpoT08iEworzCzAY6pgFdmqv%2BdgAHmDCfLZRbR%2FEdJZExEUplR%2BMKs82o%2FK%2Fl7c6hf2%2Fr%2Fwn8flz9wJ9PCYVw303M69pEWs0rkEenDmJ4kWaFcSJFwMMNIz4zI3CrBQSBQhjbt0Ml7%2FaUmWW2MR0sOUjdKhvnYiixLSedZer36d%2B33ZFi6kJskwhAnkh%2BGB9wiUaev8Ttq1qDQ5e0ws%2FiduuAvG%2BUeCITMKjDwoc%2FtgBnEg5t&X-Amz-Signature=264a86ebc511e2a3a519897e97f01f95cbb06ff3a7e1956e1231262c1b817fbe&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject
 
Fala, dev! 💜
 
Design é muito importante na construção de projetos front-end, ele que vai causar a primeira impressão em qualquer usuário que usar nossa aplicação.
 
Do processo de criação do layout no Figma até o resultado em código, muita coisa mudou com a IA. Para mim, automatizar a parte mecânica de criação de componentes faz total sentido, porque me permite focar no que realmente importa: a lógica de negócio e a arquitetura da aplicação.
 
Nesse processo de automatização, criei um prompt estrutural que utilizo para instruir a IA a gerar componentes React modernos, acessíveis e prontos para produção.
 
Na próxima semana, teremos uma mentoria focada nisso, mas resolvi adiantar um dos segredos dela compartilhando esse material com vocês. Aqui tem o prompt completo, seguindo meu padrão de uso, e o contexto para aplicar na prática.

Por que usar IA no design para React?

A maioria dos devs erra ao usar IA pedindo apenas: "Crie esse componente". O resultado costuma ser um código genérico, com CSS despadronizado e acessibilidade quebrada.
O meu prompt porque ele atua como um Tech Lead. Ele define regras estritas antes mesmo de a IA começar a escrever a primeira linha de código.
Analisando o arquivo que ele liberou, vemos que o prompt força a IA a usar as tecnologias mais recentes, como React 19 e Tailwind CSS v4. Além disso, ele já impõe padrões de arquitetura, como o uso de named exports e a proibição de barrel files (Arquivos que reexportam vários módulos de um único diretório para agilizar as importações) em pastas internas.

O prompt de IA para componentes React (código pronto)

Abaixo está o comando completo.
Como usar: Tire um print do seu componente no Figma, cole na sua IA de preferência (Claude 3.5 Sonnet ou superior, ChatGPT-4o ou v0) e envie junto com o texto abaixo:
# Conversão de Design para Componentes React Analise o design anexado (screenshot ou frame do Figma) e converta para componentes React seguindo os padrões abaixo. --- ## Stack - **React 19** (sem `forwardRef`) - **TypeScript** strict - **Tailwind CSS v4** com `@theme` e CSS variables - **Base UI React** (`@base-ui/react`) para componentes headless - **Tailwind Variants** (`tailwind-variants`) para variantes - **Tailwind Merge** (`tailwind-merge`) para merge de classes - **Lucide React** ou **Phosphor Icons** para ícones --- ## Nomenclatura - Arquivos: **lowercase com hífens** → `user-card.tsx`, `use-modal.ts` - **Sempre named exports**, nunca default export - Não criar barrel files (`index.ts`) para pastas internas --- ## Estrutura de Componente ```tsx import { tv, type VariantProps } from 'tailwind-variants' import { twMerge } from 'tailwind-merge' import type { ComponentProps } from 'react' export const buttonVariants = tv({ base: [ 'inline-flex cursor-pointer items-center justify-center font-medium rounded-lg border transition-colors', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50', ], variants: { variant: { primary: 'border-primary bg-primary text-primary-foreground hover:bg-primary-hover', secondary: 'border-border bg-secondary text-secondary-foreground hover:bg-muted', ghost: 'border-transparent bg-transparent text-muted-foreground hover:text-foreground', destructive: 'border-destructive bg-destructive text-destructive-foreground hover:bg-destructive/90', }, size: { sm: 'h-6 px-2 gap-1.5 text-xs [&_svg]:size-3', md: 'h-7 px-3 gap-2 text-sm [&_svg]:size-3.5', lg: 'h-9 px-4 gap-2.5 text-base [&_svg]:size-4', }, }, defaultVariants: { variant: 'primary', size: 'md' }, }) export interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {} export function Button({ className, variant, size, disabled, children, ...props }: ButtonProps) { return ( <button type="button" data-slot="button" data-disabled={disabled ? '' : undefined} className={twMerge(buttonVariants({ variant, size }), className)} disabled={disabled} {...props} > {children} </button> ) } ``` --- ## Compound Components ```tsx import { twMerge } from 'tailwind-merge' import type { ComponentProps } from 'react' export interface CardProps extends ComponentProps<'div'> {} export function Card({ className, ...props }: CardProps) { return ( <div data-slot="card" className={twMerge('bg-surface flex flex-col gap-6 rounded-xl border border-border p-6 shadow-sm', className)} {...props} /> ) } export function CardHeader({ className, ...props }: ComponentProps<'div'>) { return <div data-slot="card-header" className={twMerge('flex flex-col gap-1.5', className)} {...props} /> } export function CardTitle({ className, ...props }: ComponentProps<'h3'>) { return <h3 data-slot="card-title" className={twMerge('text-lg font-semibold', className)} {...props} /> } export function CardContent({ className, ...props }: ComponentProps<'div'>) { return <div data-slot="card-content" className={className} {...props} /> } ``` --- ## Cores (CSS Variables) ``` bg-surface, bg-surface-raised → fundos bg-primary, bg-secondary, bg-muted → ações/estados bg-destructive → erros/danger text-foreground → texto principal text-foreground-subtle → texto secundário text-muted-foreground → texto desabilitado text-primary-foreground → texto em bg primary border-border, border-input → bordas padrão border-primary, border-destructive → bordas de destaque ring-ring → focus ring ``` --- ## TypeScript ```tsx // ✅ Estender ComponentProps + VariantProps export interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {} // ✅ Import type para tipos import type { ComponentProps } from 'react' import type { VariantProps } from 'tailwind-variants' // ❌ Não usar React.FC nem any ``` --- ## Padrões Importantes ```tsx // Sempre usar twMerge className={twMerge('classes-base', className)} // Sempre usar data-slot <div data-slot="card"> // Estados com data-attributes data-disabled={disabled ? '' : undefined} className="data-[disabled]:opacity-50 data-[selected]:bg-primary" // Focus visible 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring' // Ícones com tamanho <Check className="size-4" /> '[&_svg]:size-3.5' // em variantes // Botões de ícone precisam de aria-label <button aria-label="Fechar"><X className="size-4" /></button> // Props spread no final {...props} ``` --- ## Base UI (componentes headless) ```tsx // Dialog import * as Dialog from '@base-ui/react/dialog' <Dialog.Root><Dialog.Portal><Dialog.Backdrop /><Dialog.Popup /></Dialog.Portal></Dialog.Root> // Tabs import * as Tabs from '@base-ui/react/tabs' <Tabs.Root><Tabs.List><Tabs.Tab /></Tabs.List><Tabs.Panel /></Tabs.Root> // Select import * as Select from '@base-ui/react/select' <Select.Root><Select.Trigger /><Select.Portal><Select.Popup><Select.Item /></Select.Popup></Select.Portal></Select.Root> // Menu import * as Menu from '@base-ui/react/menu' <Menu.Root><Menu.Trigger /><Menu.Portal><Menu.Popup><Menu.Item /></Menu.Popup></Menu.Portal></Menu.Root> ``` --- ## Checklist - [ ] Arquivo lowercase com hífens - [ ] Named export - [ ] `ComponentProps<'elemento'>` + `VariantProps` - [ ] Variantes com `tv()`, classes com `twMerge()` - [ ] `data-slot` para identificação - [ ] Estados via `data-[state]:` - [ ] Cores do tema (não hardcoded) - [ ] Focus visible em interativos - [ ] `aria-label` em botões de ícone - [ ] `{...props}` no final --- Agora analise o design anexado e gere o código do componente.

Vantagens de utilizar esse prompt no front-end

Vejo três pilares fundamentais de um software de qualidade incluídos nesse prompt, e que vão ser inseridos no seu projeto quando usado:
  1. Stack atualizada: O código já vem preparado para React 19 (eliminando a necessidade de forwardRef) e Tailwind v4 (usando variáveis CSS nativas).
  1. Manutenibilidade: O uso de bibliotecas como tailwind-variants e tailwind-merge garante que seus componentes sejam reutilizáveis e fáceis de customizar sem "briga de especificidade" no CSS.
  1. Acessibilidade nativa: O prompt exige que estados de interação (como disabled ou focus) sejam tratados via data-attributes e exige aria-label em botões de ícone, algo que a IA costuma esquecer.

Vamos codar juntos?

Ter o prompt é apenas o começo. Saber integrar essa ferramenta no seu fluxo de trabalho diário é o que vai te diferenciar no mercado.
Na semana que vem, vou te mostrar ao vivo como como pegar um design complexo e transformar em uma aplicação funcional em tempo recorde usando essas técnicas. Essa mentoria acontece ao vivo e não fica gravada nem terá reprises, é para quem quer aprender com foco e prática.
👇 Não perca essa oportunidade:
https://www.rocketseat.com.br/cursos/workshop/design-para-devs?utm_source=blog&utm_medium=artigo&utm_campaign=mentoria-design&utm_term=artigo-design-para-react-com-ia
Never Stop Learning! 🚀

Perguntas frequentes sobre Design com IA (FAQ)

Posso usar esse prompt no ChatGPT gratuito?

Sim, mas recomendamos o Claude 3.5 Sonnet ou o GPT-4o. Modelos mais simples podem ignorar algumas regras de arquitetura complexas, como o uso correto do tailwind-variants.

Esse prompt serve para Next.js?

Com certeza. O código gerado é React 19 puro, totalmente compatível com Next.js 14/15 (App Router). Basta garantir que você está usando a diretiva 'use client' se o componente tiver interatividade.

O código gerado pela IA é acessível?

Este prompt específico foi desenhado para forçar a acessibilidade (ex: exigindo aria-label e focus-visible). Porém, como Tech Lead, você deve sempre validar o resultado final com ferramentas como o Axe DevTools.
 

A hora de investir em você é AGORA!

Um único investimento. Tudo que você precisa para evoluir na carreira!

Imagem contendo uma carta e um símbolo de check
NewsletterReceba conteúdos inéditos e novidades gratuitamente