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

Diego Fernandes
A hora de investir em você é AGORA!
Um único investimento. Tudo que você precisa para evoluir na carreira!
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:
- Stack atualizada: O código já vem preparado para React 19 (eliminando a necessidade de
forwardRef) e Tailwind v4 (usando variáveis CSS nativas).
- Manutenibilidade: O uso de bibliotecas como
tailwind-variantsetailwind-mergegarante que seus componentes sejam reutilizáveis e fáceis de customizar sem "briga de especificidade" no CSS.
- Acessibilidade nativa: O prompt exige que estados de interação (como disabled ou focus) sejam tratados via
data-attributese exigearia-labelem 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:

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!
NewsletterReceba conteúdos inéditos e novidades gratuitamente