Ir para o conteúdo

Guia de Estilo

Versão: 1.0.0 | Data: 2026-03-21 | Status: ✅ Aprovado


Princípios de Design

Princípio Descrição
Calma O usuário expõe seus erros — o design não pode intimidar. Espaço em branco generoso, sem poluição visual.
Clareza Feedback de pronúncia e correções precisam ser legíveis e rápidos de escanear.
Foco Durante a sessão de prática, a UI some — o conteúdo é a conversa.
Confiança Produto de IA com dados de voz — visual profissional e limpo transmite segurança.

1. Paleta de Cores

Cores Primárias

Nome Token Hex Uso
Primary --color-primary #4F46E5 CTAs principais, links, elementos interativos
Primary Dark --color-primary-dark #3730A3 Hover em botões primários
Primary Light --color-primary-light #818CF8 Bordas de foco, highlights sutis
Primary Subtle --color-primary-subtle #EEF2FF Background de elementos selecionados

Cores de Acento

Nome Token Hex Uso
Accent --color-accent #06B6D4 Indicadores de voz, elementos de áudio, destaque
Accent Dark --color-accent-dark #0891B2 Hover em elementos de acento
Accent Subtle --color-accent-subtle #ECFEFF Background de cards de compreensão

Cores Semânticas

Nome Token Hex Uso
Success --color-success #10B981 Pronúncia correta, nível avançado, confirmações
Success Subtle --color-success-subtle #D1FAE5 Background de badges de acerto
Error --color-error #EF4444 Erros de pronúncia, campos inválidos
Error Subtle --color-error-subtle #FEE2E2 Background de correções e erros
Warning --color-warning #F59E0B Limite próximo (8/10 interações), score médio
Warning Subtle --color-warning-subtle #FEF3C7 Background de alertas de limite

Escala de Neutros

Nome Token Hex Uso
Gray 50 --color-gray-50 #F9FAFB Background da página
Gray 100 --color-gray-100 #F3F4F6 Background de cards e inputs
Gray 200 --color-gray-200 #E5E7EB Bordas, divisores
Gray 400 --color-gray-400 #9CA3AF Placeholder, textos secundários
Gray 600 --color-gray-600 #4B5563 Textos de suporte
Gray 800 --color-gray-800 #1F2937 Texto principal
Gray 900 --color-gray-900 #111827 Background dark mode

Modo Escuro

Elemento Light Dark
Background #F9FAFB #111827
Surface (cards) #FFFFFF #1F2937
Texto principal #1F2937 #F9FAFB
Texto secundário #4B5563 #9CA3AF
Borda #E5E7EB #374151

2. Tipografia

Fonte: Inter — Google Fonts, gratuita. Escolhida por ser o padrão do mercado para SaaS, excelente legibilidade em telas e suporte completo a acentos do português.

Escala Tipográfica

Nome Tamanho Peso Line Height Uso
display 48px 700 1.1 Hero da landing page
h1 36px 700 1.2 Títulos de página
h2 30px 600 1.3 Seções principais
h3 24px 600 1.4 Subtítulos, títulos de cards
h4 20px 500 1.4 Labels de seção
body-lg 18px 400 1.6 Texto de destaque, leads
body 16px 400 1.6 Texto padrão da interface
body-sm 14px 400 1.5 Textos secundários, metadados
caption 12px 400 1.4 Legendas, timestamps
label 14px 500 1.4 Labels de formulários, badges
code 14px 400 1.5 Fonemas, exemplos de pronúncia (fonte mono)

Fonte Mono

JetBrains Mono ou Fira Code — usada exclusivamente para: - Transcrições fonéticas (ex: /θriː/) - Exemplos de pronúncia - Trechos de código (documentação)


3. Espaçamento

Baseado em múltiplos de 4px (escala padrão do Tailwind CSS).

Token Valor Uso típico
space-1 4px Espaço mínimo entre elementos inline
space-2 8px Padding interno de badges e chips
space-3 12px Gap entre ícone e texto
space-4 16px Padding interno de inputs e botões
space-6 24px Padding de cards
space-8 32px Espaço entre seções internas
space-12 48px Espaço entre seções da landing page
space-16 64px Espaço entre blocos maiores

4. Bordas e Sombras

Token Valor Uso
radius-sm 6px Badges, chips, tags
radius-md 10px Inputs, botões
radius-lg 16px Cards, modais
radius-xl 24px Balões de mensagem
radius-full 9999px Avatares, botão de voz (circular)
Token Valor Uso
shadow-sm 0 1px 2px rgba(0,0,0,0.05) Cards em repouso
shadow-md 0 4px 6px rgba(0,0,0,0.07) Cards com hover
shadow-lg 0 10px 15px rgba(0,0,0,0.10) Modais, dropdowns
shadow-focus 0 0 0 3px rgba(79,70,229,0.3) Foco em inputs (acessibilidade)

5. Componentes

Botões

Primário:     [  Começar grátis  ]   bg: #4F46E5  text: white  hover: #3730A3
Secundário:   [  Ver cenários    ]   bg: white    text: #4F46E5  border: #4F46E5
Ghost:        [  Cancelar        ]   bg: transparent  text: #4B5563  hover: gray-100
Destrutivo:   [  Excluir conta   ]   bg: white    text: #EF4444  border: #EF4444

Tamanhos:

Tamanho Padding Font Uso
sm 8px 16px 14px Ações secundárias em cards
md 12px 24px 16px Ações padrão
lg 16px 32px 18px CTAs principais
icon 10px Botões apenas com ícone

Estados:

Estado Visual
Default Cor base
Hover Escurece 10%, cursor pointer
Focus shadow-focus + outline visível
Loading Spinner + texto "Aguarde..." + desabilitado
Disabled Opacidade 50%, cursor not-allowed

Inputs de Texto

Label          ← 14px, weight 500, gray-800
[____________] ← border gray-200, radius-md, padding 12px 16px
Hint text      ← 12px, gray-400
Erro           ← 12px, error (#EF4444)

Estados: - Default: borda gray-200 - Focus: borda primary + shadow-focus - Error: borda error + mensagem de erro abaixo - Disabled: background gray-100, opacidade 60%


Balões de Mensagem

Usuário (direita):
  ┌──────────────────────────────────┐
  │  I want to make a check in.     │  bg: #4F46E5, text: white
  └──────────────────────────────────┘  radius: 16px 16px 4px 16px

IA (esquerda):
  ┌──────────────────────────────────┐
  │  Of course! Could I have your   │  bg: white, text: gray-800
  │  name, please?                  │  border: gray-200
  └──────────────────────────────────┘  radius: 16px 16px 16px 4px

Card de correção (abaixo do balão do usuário):

  ┌──────────────────────────────────┐
  │  ✏️  "I want to" → "I'd like to" │  bg: #FEF3C7 (warning-subtle)
  │  Mais natural em contextos       │  border-left: 3px solid #F59E0B
  │  formais.              [Entendi] │  radius: 8px
  └──────────────────────────────────┘

Card de erro de pronúncia:

  ┌──────────────────────────────────┐
  │  🔴 "tree" → "three"            │  bg: #FEE2E2 (error-subtle)
  │  O som /θ/ é diferente de /t/.  │  border-left: 3px solid #EF4444
  └──────────────────────────────────┘  radius: 8px


Badges

Nível A2:   [ A2 ]   bg: #ECFEFF   text: #0891B2   Cyan
Nível B1:   [ B1 ]   bg: #EEF2FF   text: #4F46E5   Indigo
Nível B2:   [ B2 ]   bg: #F0FDF4   text: #059669   Green

FREE:       [ FREE ]  bg: gray-100  text: gray-600
PRO:        [ PRO ★ ] bg: #4F46E5  text: white

Score alto (≥80):  [ 94pts ]  bg: success-subtle   text: success
Score médio (50-79):[ 67pts ]  bg: warning-subtle   text: warning
Score baixo (<50): [ 38pts ]  bg: error-subtle     text: error

Botão de Voz (Push-to-Talk)

Repouso:
  ┌──────┐
  │  🎙️  │   circular, 72px, bg: primary (#4F46E5), shadow-md
  └──────┘   texto abaixo: "Segurar para falar"

Gravando:
  ┌──────┐
  │  ⏹   │   circular, 72px, bg: error (#EF4444)
  └──────┘   animação de pulse no border
             texto abaixo: "Gravando... 00:04"
             visualização de onda sonora acima

Player de Áudio (TTS)

  ┌────────────────────────────────────────────────┐
  │  ▶  ──────────────●──────────── 0:04 / 0:07   │
  │                                                │
  │  [🐢 Lento]  [Normal ●]  [🐇 Rápido]          │
  │                               [🔁 Repetir]     │
  └────────────────────────────────────────────────┘
  bg: gray-50, border: gray-200, radius: 12px, padding: 16px

Cards de Sessão (Histórico)

  ┌───────────────────────────────────────────────────┐
  │  🎭  Check-in em hotel                            │
  │  🎙️ Voz  ·  12 min  ·  18 msgs  ·  16% erros     │
  │  Hoje, 14h03                            [Ver →]  │
  └───────────────────────────────────────────────────┘
  bg: white, border: gray-200, radius: 12px, padding: 20px
  hover: shadow-md, cursor pointer

Barra de Navegação (Mobile)

  ┌─────────────────────────────────────────────────┐
  │  🏠 Home   📋 Histórico   👤 Perfil             │
  │   ●                                             │  ← item ativo
  └─────────────────────────────────────────────────┘
  bg: white, border-top: gray-200, height: 64px
  ícone ativo: primary (#4F46E5)
  ícone inativo: gray-400

6. Ícones

Biblioteca: Lucide Icons — open source, consistente, disponível para React.

Elemento Ícone
Chat / Conversa livre MessageSquare
Roleplay / Cenário Theater ou Layers
Microfone / Voz Mic
Parar gravação Square
Áudio / Som Volume2
Compreensão / Escuta Headphones
Histórico ClockHistory ou History
Perfil User
Configurações Settings
Nível / Progressão TrendingUp
Correção / Edição PenLine
Pronúncia correta CheckCircle
Pronúncia errada XCircle
Cadeado (PRO) Lock
Upgrade / Pro Zap
Notificações Bell
Encerrar sessão LogOut
Repetir áudio RotateCcw

7. Animações e Transições

Princípio: Animações devem ter propósito — indicar estado, guiar atenção, dar feedback. Nunca decorativas.

Elemento Animação Duração
Hover em botões background-color ease 150ms
Hover em cards box-shadow ease 200ms
Abertura de modal fade-in + scale(0.95→1) 200ms
Fechamento de modal fade-out + scale(1→0.95) 150ms
Streaming de texto (IA) Cursor piscando no fim do texto
Botão de voz (gravando) pulse no border (border-color + scale) 1.5s loop
Toast / notificação slide-in-from-top 300ms
Barra de progresso de áudio width linear tempo real
Troca de página fade entre rotas 200ms

Regra de acessibilidade: Todas as animações devem respeitar prefers-reduced-motion:

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}


8. Acessibilidade

Requisito Implementação
Contraste mínimo AA (4.5:1 para texto, 3:1 para UI) — verificado com a paleta definida
Foco visível shadow-focus em todos os elementos interativos
Labels em inputs Sempre presentes — nunca usar apenas placeholder
Textos alternativos aria-label em botões de ícone e controles de áudio
Ordem de foco Tab order lógica em todos os formulários e modais
Mensagens de erro Associadas ao input via aria-describedby
Controles de áudio Teclado: Space = play/pause, ← → = seek, +/- = volume

9. Responsividade

Abordagem: Mobile-first. Breakpoints baseados no Tailwind CSS.

Breakpoint Largura Layout
sm 640px Mobile — nav bottom bar, layout 1 coluna
md 768px Tablet — layout 1-2 colunas
lg 1024px Desktop — sidebar lateral (se necessário)
xl 1280px Desktop wide — conteúdo max-width: 1200px

Regras principais: - Chat ocupa 100% da altura da viewport em mobile (100dvh) - Botão de voz sempre fixo e acessível com o polegar em mobile - Texto mínimo de 16px em mobile (evita zoom automático do iOS) - Player de áudio adaptado para gestos touch