Editorial-tech para recrutamento.Neon, chumbo, alta densidade.
Tokens, componentes e padrões extraídos da aplicação real. Toda decisão visual está aqui — paleta, tipografia, motion, a11y.
- Cores de marca
- 8
- Componentes
- 24
- Breakpoints
- 5
- WCAG
- AA
Identidade
Paleta
Apenas um neon por área — neon é leitura, não decoração. Clique no hex para copiar.
Sistema de tipos
Tipografia
Sora em toda a UI. Headings em font-black, números em tabular-nums.
Sample
Eyebrow · 10px
Match com IA
Card heading · text-lg
Body 14px com line-height 1.5. Usado em descrições, helper text e instruções operacionais — sempre legível.
92%
Escala
text-[10px]10pxEyebrow, micro badgestext-xs12pxHint, metadatatext-sm14pxBody, botõestext-base16pxInput, body longotext-lg18pxCard headingstext-xl20pxSection titlestext-2xl24pxPage titletext-3xl30pxHero desktoptext-4xl36pxScore / hero
Controles
Botões
Touch ≥ 44px, transição 180ms, focus-visible com ring neon.
Primário (escuro)
Primário (neon)
Secundário
Ghost / Quiet
<button
className="inline-flex min-h-11 cursor-pointer items-center justify-center gap-2
rounded-md bg-[#25302e] px-4 text-sm font-bold text-[#C4FF57]
transition-colors hover:bg-[#1a2422]
focus:outline-none focus-visible:ring-2 focus-visible:ring-[#C4FF57]/70
disabled:cursor-not-allowed disabled:opacity-50"
>
Publicar vaga
</button><button
className="inline-flex min-h-11 cursor-pointer items-center justify-center gap-2
rounded-md bg-[#C4FF57] px-4 text-sm font-black text-[#25302e]
transition-colors hover:bg-[#b8f040]
focus:outline-none focus-visible:ring-2 focus-visible:ring-[#597048]/45"
>
Gerar match
</button>Formulários
Inputs
Label visível obrigatório, hint à direita, erro inline com ícone.
Padrão · estado normal
Mínimo 5 caracteres
<input
type="email"
placeholder="recrutador@empresa.com"
className="w-full rounded-lg border border-[#8D9999]/25 bg-white
px-3.5 py-3 text-sm text-[#25302e]
placeholder:text-[#8D9999] outline-none transition
focus:border-[#C4FF57] focus:ring-2 focus:ring-[#C4FF57]/25"
/>Indicadores
Badges & Chips
Status com cores semânticas + filter chips com contador.
Status
<span
className="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5
text-[10px] font-black uppercase tracking-wide
bg-[#C4FF57]/20 text-[#3a5230] border-[#C4FF57]/40"
>
<CheckCircle2 className="h-3 w-3" strokeWidth={2.5} />
Aprovado
</span>Filter chips
Containers
Cards & Métricas
Border /18, sombra de 1px, hover discreto. Sem decoração — hierarquia via tipografia.
Pipeline ativo
32
candidatos em andamento
Conversão
18%
contratados no funil
Testes pendentes
9
aguardando resposta
Vagas ativas
6
posições abertas
<article
className="rounded-xl border border-[#8D9999]/18 bg-white p-4 sm:p-5
shadow-[0_1px_2px_rgba(37,48,46,0.04)]
transition-[border-color,box-shadow]
hover:border-[#8D9999]/30
hover:shadow-[0_8px_20px_rgba(37,48,46,0.06)]"
>
{children}
</article>Navegação
Tabs
Indicador neon embaixo da aba ativa, transição 180ms.
Visão executiva do match: score global, alinhamento DISC, recomendação direta.
<button
role="tab"
aria-selected={active}
className={`relative inline-flex shrink-0 items-center gap-1.5 px-3 py-3
text-sm font-bold transition-colors
${active ? "text-[#25302e]" : "text-[#8D9999] hover:text-[#4A5452]"}`}
>
{label}
{active && (
<span className="absolute inset-x-2 bottom-0 h-0.5 rounded-full bg-[#C4FF57]" />
)}
</button>Overlays
Modal
Bottom-sheet no mobile, scale-fade no desktop. Focus trap, ESC, scroll-lock — tudo via ModalShell.
Demonstração interativa com a primitiva real do app.
import {
ModalShell, ModalHeader, ModalBody, ModalFooter, useModalTitleId,
} from "@/app/_components/ui/Modal";
const titleId = useModalTitleId();
{open && (
<ModalShell labelledBy={titleId} onClose={close} size="xl" zIndex={1100}>
<ModalHeader
id={titleId}
eyebrow="Relatório IA · Match"
title="Marina Costa"
description="People Partner Senior · 92% de match"
variant="dark"
onClose={close}
/>
<ModalBody>{/* conteúdo scrollável */}</ModalBody>
<ModalFooter>{/* ações sticky */}</ModalFooter>
</ModalShell>
)}Movimento
Motion
150–300ms · cubic-bezier(0.2, 0, 0, 1). Sempre respeita prefers-reduced-motion.
Skeleton
Shimmer 1.4s
Pop in
scale 0.96→1, 180ms
Fade up
opacity + translateY, 300ms
Domínio
Psicometria
DISC, avatares determinísticos por nome, match score em deep-chumbo + neon.
DISC
Avatares & Score
Match score
Layout
Spacing
Sistema 4pt. gap-3 dentro de cards, gap-6 entre blocos.
gap-14pxgap-28pxgap-312pxgap-416pxgap-520pxgap-624pxgap-832px
Acessibilidade
Pre-Delivery Checklist
O que verificar antes de mergir qualquer UI.