Guia de implementação para o app TERPIA
Este documento é para quem vai codar — não repete a narrativa de marca (isso está num Brand Guideline separado, com identidade, voz e posicionamento). Aqui estão os tokens, arquivos e componentes prontos para usar direto no projeto. Os valores abaixo já são os mesmos usados no protótipo navegável do app — são reais e testados, não uma proposta nova.
Início rápido
Dois arquivos CSS resolvem 90% do trabalho: tokens (cor, tipografia, espaçamento) e componentes (botões, badges, formulário, cards). Copie a pasta assets/fonts/ e assets/css/ inteira para o projeto.
1. Importar na ordem certa
<link rel="stylesheet" href="assets/css/tokens.css" /> <link rel="stylesheet" href="assets/css/components.css" /> <!-- seu CSS de tela/produto entra depois destes dois -->
2. Estrutura de pastas esperada
projeto/ ├── assets/ │ ├── fonts/ → TrajanPro3-*.otf + DMSans-*.woff2 │ ├── css/ │ │ ├── tokens.css → cor, tipografia, espaçamento, raio, sombra │ │ └── components.css → botão, badge, form, card, topbar │ └── logos/ → ver seção "Ativos de marca" └── ...
3. Regra de ouro
Nunca escrever um valor de cor, espaçamento ou raio direto no CSS de tela — sempre var(--token). Se o valor que você precisa não existe em tokens.css, é sinal de que precisa ser adicionado lá (e validado com quem cuida da marca) antes de virar um valor solto espalhado pelo código.
Cores
Clique em qualquer cor abaixo para copiar o hex. Todas já estão em tokens.css como custom properties — use sempre a variável, nunca o hex direto.
Paleta
Quando usar cada uma
| Token | Uso |
|---|---|
--green-forest | Cor primária institucional — topbar, botão escuro, ~55% da UI. |
--gold / --gold-deep | Acento — CTA primário, estado de foco/hover. Nunca fundo de tela inteira. |
--cream / --cream-white | Fundo de app e superfícies elevadas (cards, modais, inputs). |
--text-dark / --text-muted | Texto primário e secundário. Nunca usar #000 puro. |
--error / --success | Uso funcional apenas (validação de formulário, status) — nunca decorativo. |
Fazer
- Sempre referenciar via
var(--token). - Testar contraste de texto sobre
--gold/--gold-lightantes de usar (são claros).
Não fazer
- Não hardcodar hex em componentes novos.
- Não inventar uma cor "quase igual" para resolver um caso pontual — perguntar antes.
Tipografia
Duas fontes, licenciadas e auto-hospedadas — sem Google Fonts, sem CDN externo de terceiros.
@font-face (já em tokens.css)
@font-face { font-family: "Trajan Pro 3"; font-weight: 600; src: url("../fonts/TrajanPro3-Semibold.otf") format("opentype"); } /* + 200 (ExtraLight), 300 (Light), 400 (Regular) — ver tokens.css */
Regras não-negociáveis
- Trajan Pro 3 não tem peso Bold (700) licenciado. Pesos válidos: 200, 300, 400, 600. Nunca aplique
font-weight:700nela nem deixe o navegador gerar negrito sintético. - Trajan Pro 3 é só para títulos de destaque — nunca para parágrafo, botão, label ou qualquer texto de UI funcional.
- DM Sans é a fonte de interface — corpo, botões, formulários, navegação, tudo.
Uso em CSS
.titulo-destaque { font-family: var(--font-display); font-weight: 600; /* nunca 700 */ } .texto-ui { font-family: var(--font-sans); }
Espaçamento, raio e sombra
O projeto não usa uma escala numérica de espaçamento (tipo 4/8/16px) — os valores de raio e sombra são tokenizados; espaçamento interno de componente é definido por componente (ver exemplos de código em cada seção abaixo).
Raio de borda
| Token | Valor | Uso |
|---|---|---|
--radius-sm | 12px | Inputs, botões pequenos |
--radius-md | 16px | Cards compactos |
--radius-lg | 20px | Cards padrão, modais |
--radius-xl | 24px | Superfícies grandes, seções destacadas |
--radius-pill | 100px | Botões, badges, chips |
Sombra
| Token | Uso |
|---|---|
--shadow-sm / --shadow-md / --shadow-lg | Sombra simples de elevação — botões, painéis. |
--card-shadow / --card-shadow-hover | Sombra em camadas (duas sombras sobrepostas) para cards — dá profundidade sem parecer "chapada". Use nos cards de conteúdo em vez das sombras simples acima. |
Breakpoints & layout
O app não é um mockup de celular numa página — é responsivo de verdade, com duas molduras de navegação que trocam no mesmo breakpoint.
| Token | Valor | Significado |
|---|---|---|
--bp-desktop-min | 900px | ≥900px → sidebar fixa lateral (desktop/tablet grande) |
--bp-mobile-max | 899px | <900px → navegação inferior, tela cheia (mobile) |
--header-h | 68px | Altura da topbar fixa |
--bottomnav-h | 72px | Altura da navegação inferior mobile |
--max-content | 1180px | Largura máxima de conteúdo em telas grandes |
Padrão de media query
/* mobile-first: escreva o CSS base para mobile, então sobrescreva para desktop */ @media (min-width: 900px) { /* layout desktop: sidebar visível, grid de 2-3 colunas */ }
Movimento & acessibilidade
Tokens de movimento
| Token | Valor | Uso |
|---|---|---|
--ease | cubic-bezier(0.22,1,0.36,1) | Curva padrão de toda transição/animação |
--t-fast | 180ms | Hover, toggle, micro-interação |
--t-med | 280ms | Transição de tela, modal |
--t-slow | 350ms | Transições grandes (splash, onboarding) |
Obrigatório: tokens.css já zera as durações via @media (prefers-reduced-motion: reduce) — nunca remova esse bloco, e nunca crie uma animação com duration hardcoded fora dos tokens acima (ela não vai respeitar essa preferência).
Foco visível
Todo elemento interativo precisa de estado de foco visível — :focus-visible já vem estilizado globalmente em tokens.css (contorno dourado). Não remova o outline sem substituir por algo igualmente visível.
Contraste
Combinações aprovadas
--text-darksobre--cream/--cream-white--cream/--gold-lightsobre--green-forest--green-forestsobre--gold(botão primário)
Nunca combinar
--goldou--gold-lightcomo cor de texto sobre--cream(contraste insuficiente)--text-mutedsobre--green-forest(dessatura demais)
Botões
Classe base .btn + um modificador. Nunca estilizar um <button> do zero — sempre compor com estas classes.
<button class="btn btn-primary">Falar com a equipe</button> <button class="btn btn-outline btn-sm">Ver detalhes</button> <button class="btn btn-primary btn-block" disabled>Enviando…</button>
| Classe | Quando usar |
|---|---|
.btn-primary | Ação principal da tela — sempre uma por tela. |
.btn-dark | Ação secundária com peso visual (ex: em hero escuro). |
.btn-outline | Ação secundária neutra. |
.btn-ghost | Só sobre fundo --green-forest. |
.btn-link | Ação terciária, aparência de link. |
Badges
Para status e categorização curta — nunca para texto de leitura, só rótulo.
<span class="badge badge--gold">Em análise</span> <span class="badge badge--complete">Concluído</span>
Formulário
<div class="form-field"> <label for="nome">Nome completo</label> <input id="nome" type="text" /> </div> <!-- estado de erro: adicionar .has-error no wrapper e .is-invalid no input --> <div class="form-field has-error"> <input class="is-invalid" /> <div class="error-msg">Mensagem de erro</div> </div>
Cards
Avaliação individual para definição do tratamento.
<div class="card"> <strong>Consulta médica</strong> <p>Avaliação individual para definição do tratamento.</p> </div>
Topbar
Referência do cabeçalho fixo já usado no protótipo do app — reaproveitar em vez de recriar.
<header class="topbar"> <div class="topbar__brand"> <img src="imagens/logo-horizontall-para-fundo-escuro.png" alt="TERPIA" /> <span class="topbar__tag">Assessoria Canábica</span> </div> </header>
Ativos de marca
Local canônico dos arquivos: Brand-guideline/imagens/. Não recriar, não exportar de novo a partir de captura de tela.
Tamanho mínimo
Assinatura completa: 160px digital / 35mm impresso. Símbolo isolado: 32px digital / 10mm impresso. Abaixo disso, usar sempre o símbolo isolado, nunca espremer a assinatura completa.
Checklist antes de sair para produção
tokens.css antes de components.css?assets/fonts/ no build de produção?tokens.css?prefers-reduced-motion testado (as transições realmente desligam)?:focus-visible continua visível em todo elemento interativo custom?imagens/, não recriados?Contato
Dúvida sobre um token que falta, uma cor "quase certa" que você precisa, ou uma exceção de layout: confirme com o guardião da marca antes de decidir sozinho por conveniência de prazo.