Biblioteca do Design System
Tokens, componentes e padrões de tela do novo e-commerce da Lamas Destilaria, extraídos do Figma em 10/09/2026. Tudo nesta página é desenhado com os próprios tokens que ela documenta.
Como usar
- Tokens: copie o bloco da seção Arquivos (ou use o botão de download). Componentes nunca usam hex nem px soltos — sempre
var(--…). - Fontes: Work Sans (Google Fonts) para corpo e interface; Arpona (Adobe Fonts, kit do projeto) para títulos. Nesta prévia a Arpona aparece substituída pela Spectral, porque o kit é privado.
- Mobile-first: o estilo base é o mobile (frame 390px). O desktop entra em
min-width: 1024px. Não existe breakpoint de tablet ainda. - Temas: Light é o padrão.
data-theme="dark"em qualquer elemento troca aquele bloco inteiro — é o equivalente ao "modo explícito" do Figma (é assim que o footer escuro funciona). - Fonte da verdade: o arquivo Figma Lamas Destilaria — Ecommerce. Se esta página e o Figma discordarem, vale o Figma.
Princípios
Regras que explicam as decisões. Quando algo não estiver especificado, decida por elas.
| Regra | Na prática |
|---|---|
| Token primeiro | Nenhum componente existe antes dos seus tokens. Valor novo → cria o token, depois usa. |
| O dourado não veste controle | Botão, input, toggle e chip são neutros (preto/branco/cinza). O dourado aparece em link, ícone pontual, filete e no Badge Gold — nunca como fundo de algo clicável. |
| Quanto mais longe da página, mais redondo | Imagem: 0. Botão Squared: 6. Campo: 8. Card: 10. Flutuante: 14. Modal/drawer: 18. Botão pílula, tag e avatar: 999. |
| Foto sempre com véu | Texto branco sobre imagem só com --color-overlay-media por baixo. Sem o véu, o contraste não é garantido. |
| Overline para rótulo curto, Caption para frase | Caixa alta com tracking de 12% (Overline) só em 1–3 palavras. Frase longa em caixa alta usa Caption (2%). |
| Toque mínimo de 44px | No mobile, todo alvo clicável tem pelo menos --size-control-md, mesmo que o ícone visível tenha 24px. |
| Headline é o teto | 48px no desktop é o maior texto do site. Uma por página. |
Cores
Duas camadas. Primitivos são os valores brutos da marca e não entram direto em componente. Semânticos dizem para que a cor serve e mudam entre Light e Dark. Use sempre o semântico.
Primitivos
Semânticos
A coluna "Agora" mostra o valor do tema ativo. Use a chave Tema escuro na lateral para comparar.
| Agora | Token | Light | Dark | Uso |
|---|
Contraste (calculado ao vivo)
Texto normal precisa de 4,5:1 (WCAG AA). Texto grande e bordas de controle precisam de 3:1. Os valores são recalculados quando você troca o tema.
| Par | Frente | Fundo | Razão | Resultado |
|---|
Tipografia
Duas famílias: Arpona (serifada) para títulos e Work Sans para todo o resto. Cada classe CSS junta o par Mobile/Desktop do Figma e troca sozinha em 1024px.
Mapa Figma → CSS
| Classe | Mobile (< 1024px) | Desktop (≥ 1024px) | Uso |
|---|---|---|---|
.t-headline | Mobile/01 · Arpona 30 / 110% | Desktop/01 · Arpona 48 / 100% | Frase de hero. Uma por página. |
.t-heading-xl | Mobile/02 · Arpona 24 / 110% | Desktop/02 · Arpona 36 / 110% | H1 de PDP e PLP. |
.t-heading-lg | Mobile/03 · Arpona 20 / 120% · caixa alta | Desktop/03 · Arpona 30 / 110% · caixa alta | H2 de seção. |
.t-heading-md | Mobile/04 · Arpona 18 / 120% | Desktop/04 · Arpona 24 / 120% | H3; lista Brasil/Minas. |
.t-heading-sm | Mobile/05 · Arpona 16 / 120% | Desktop/05 · Work Sans 20 / 120% | Nome de produto em card. ⚠ famílias diferentes — ver Pendências. |
.t-sub-headline | Work Sans 18 / 160% (igual nos dois) | Parágrafo logo abaixo da headline. | |
.t-body | Work Sans 16 / 160% | Corpo de texto. Nunca abaixo de 16px em texto corrido no mobile. | |
.t-body-sm | Work Sans 14 / 140% | Texto secundário, frete, ficha técnica. | |
.t-caption | Work Sans 12 / 140% · tracking 2% | Legenda, aviso legal, frases longas em caixa alta. | |
.t-overline | Work Sans Medium 12 / 120% · tracking 12% · caixa alta | Rótulo curto (1–3 palavras), categoria, eyebrow. | |
.t-label | Work Sans Medium 14 / 120% · tracking 2% | Rótulo de campo e de seletor. | |
.t-button | Work Sans SemiBold 14 / 100% · tracking 8% · caixa alta | Texto de botão e link de ação. | |
.t-price-lg | Mobile/09 · SemiBold 16 | Desktop/13 · SemiBold 20 | Preço principal na PDP. ⚠ ver Pendências. |
.t-price | Desktop/14 · SemiBold 14 / 120% | Preço no card e no carrinho. | |
.t-price-strike | Desktop/15 · Regular 14 · riscado | Preço cheio ao lado do preço com desconto. | |
1.6) e em (12% → 0.12em). Os estilos Caption, Overline, Label, Button e Price não têm versão mobile no Figma, então valem para os dois tamanhos (no Figma aparecem com prefixo "Desktop/").Espaçamento
Escala de base 4, alinhada ao grid de 8. Componentes usam o token semântico (o papel), nunca o degrau da escala direto.
Escala
| Token | Valor |
|---|
Semânticos
| Token | Aponta para | Valor | Uso |
|---|
Raio
Quanto mais longe da página, mais redondo. Imagem de mídia é sempre reta.
| Exemplo | Token | Valor | Uso |
|---|
Grid e breakpoints
| Estilo no Figma | Frame | Colunas | Margem | Gutter | Baseline |
|---|---|---|---|---|---|
| Desktop/12 col | 1440px | 12 | --space-layout-margin-desktop 96 | --space-layout-gutter-desktop 24 | 8px |
| Mobile / 4 col | 390px | 4 | --space-layout-margin-mobile 16 | --space-layout-gutter-mobile 16 | 8px |
Largura máxima do conteúdo no desktop: --size-layout-max-width (1248 = 1440 − 2 × 96). Coluna de texto sobre mídia: --size-layout-content-column (470, mantém 45–75 caracteres por linha).
Mobile / 4 col (margem 16, gutter 16)
Ícones
Família Vuesax, estilo linear, 24px. A cor vem de currentColor — o ícone herda a cor do texto do controle onde está.
traço 1.5
traço 1 ⚠
estilo bold ⚠
traço 1 ⚠
traço 1.5
componente DS
Button
Duas famílias com as mesmas 27 variantes (3 estilos × 3 tamanhos × 3 estados): Pill (pílula, principal) e Squared (cantos de 6px, mais discreto — usado em cards, vídeo e newsletter). Cores sempre neutras.
Pill · MD · passe o mouse para ver o hover
Squared · SM, MD e LG
Propriedades
| Figma | Valores | CSS |
|---|---|---|
| Família | Pill · Squared | .btn · .btn.btn--squared |
| Style | Primary · Secondary · Ghost | .btn--primary · .btn--secondary · .btn--ghost |
| Size | SM (36) · MD (44) · LG (56) | .btn--sm · padrão · .btn--lg |
| State | Default · Hover · Disabled | padrão · :hover · :disabled / aria-disabled="true" |
| Label | texto | conteúdo do botão (caixa alta via CSS — escreva normal no HTML) |
| Icon Left / Icon Right | boolean + ícone trocável | <svg> antes/depois do texto, 20px |
Tokens por tamanho
| Size | Altura | Padding lateral | Gap ícone–texto |
|---|---|---|---|
| SM | --size-control-sm 36 | --space-control-pad-x-sm 16 | --space-control-gap-sm 8 |
| MD | --size-control-md 44 | --space-control-pad-x-md 24 | --space-control-gap-md 8 |
| LG | --size-control-lg 56 | --space-control-pad-x-lg 32 | --space-control-gap-lg 12 |
Tokens por estilo e estado
| Style | Default | Hover | Disabled |
|---|---|---|---|
| Primary | fundo action-primary-bg · texto action-on-primary | fundo action-primary-bg-hover | fundo action-disabled-bg · texto action-disabled-text |
| Secondary | borda 1px border-strong · texto text-primary | fundo action-quiet-bg · borda text-primary | borda border-default · texto action-disabled-text |
| Ghost | sem fundo · texto text-primary | fundo action-quiet-bg | texto action-disabled-text |
Raio: --radius-button (999) no Pill, --radius-button-squared (6) no Squared. Texto: estilo Button (.t-button).
Acessibilidade
- Ação →
<button>; navegação →<a class="btn">. Nunca<div>clicável. - Foco visível: anel de 2px em
--color-focus-ring(já no CSS desta biblioteca). - Botão só com ícone precisa de
aria-label. - Sobre foto escura, o Ghost precisa do texto em
--color-text-on-media— no Figma o hero usa essa troca.
<button class="btn btn--primary">Comprar</button>
<a class="btn btn--ghost" href="/sobre">Saiba mais</a>
<button class="btn btn--primary btn--squared btn--sm btn--block">Comprar</button>
Badge
Selo de produto. O tom Gold é a única exceção em que o dourado preenche — reservado a coleção especial e edição limitada, nunca a algo clicável.
| Tone | Fundo | Texto | Quando usar |
|---|---|---|---|
| Neutral | action-quiet-bg | text-primary | Novo, informativo. |
| Gold | accent-signature | accent-on-accent | Edição limitada, coleção especial. |
| Danger | feedback-danger | feedback-on-feedback | Esgotado, alerta. |
| Success | feedback-success | feedback-on-feedback | Disponível, confirmação. |
Padding --space-inset-tag-y × --space-inset-tag-x (4 × 8) · raio --radius-tag · texto Overline (rótulo curto).
<span class="badge badge--gold">Edição limitada</span>
Toggle
Interruptor liga/desliga. Ligado usa o preto de ação — nunca o dourado. Clique para testar.
| Estado | Trilho | Botão |
|---|---|---|
| Off | border-strong | action-on-primary · --size-toggle-knob 20 |
| On | action-primary-bg | |
| Off desabilitado | border-default | |
| On desabilitado | action-disabled-text |
Trilho --size-toggle-track 48 × 28 · padding --space-1 · raio --radius-pill. Use role="switch" + aria-checked e sempre um rótulo visível ou aria-label.
<button class="toggle" role="switch" aria-checked="false" aria-label="Receber novidades"></button>
Input e Form Field
Input é só a caixa. Form Field junta rótulo + Input + mensagem de ajuda. O foco usa o dourado escuro como traço — é borda, não preenchimento, então respeita a regra do dourado.
Input MD · clique para ver o foco
Form Field · Default e Error
Usamos seu e-mail só para o rastreio do pedido.
Falta o domínio completo. Ex.: nome@site.com.br
| State | Fundo | Borda | Texto |
|---|---|---|---|
| Default (vazio) | bg-base | 1px border-default ⚠ | placeholder text-disabled |
| Focus | bg-base | 2px focus-ring | text-primary |
| Filled | bg-base | 1px border-strong | text-primary |
| Error | bg-base | 2px feedback-danger | text-primary · ajuda em feedback-danger |
| Disabled | action-disabled-bg | 1px border-default | text-disabled |
| Size | Altura | Padding | Texto |
|---|---|---|---|
| SM | --size-control-sm 36 | --space-field-pad-x-sm 12 | Body SM 14 |
| MD | --size-control-md 44 | --space-field-pad-x-md 16 | Body 16 |
| LG | --size-control-lg 56 | --space-field-pad-x-lg 20 | Body 16 |
Raio --radius-field (8 — campo não vira pílula). Form Field: pilha com --space-field-stack-gap (8), rótulo em Label, ajuda em Caption.
box-shadow (como no CSS desta página). Assim o campo não muda de tamanho.<div class="form-field">
<label class="form-field__label" for="email">E-mail</label>
<div class="field"><input id="email" type="email" placeholder="seu@email.com" aria-describedby="email-h"></div>
<p class="form-field__helper" id="email-h">Usamos seu e-mail só para o rastreio do pedido.</p>
</div>
Accordion
Item de lista que abre e fecha — FAQ, detalhes do produto, notas de degustação e links do footer mobile. O divisor fica embaixo de cada item, para empilhar sem borda dupla.
| Parte | Especificação |
|---|---|
| Item | borda inferior --size-border-hairline em --color-border-default |
| Cabeçalho | padding vertical --space-4 (16) · gap --space-4 · título em Heading SM desktop (Work Sans 20) text-primary |
| Chevron | Icon / Chevron, --size-icon-lg 24 · para baixo fechado, para cima aberto (girar 180°) |
| Painel | padding inferior --space-6 (24) · Body 16/160% em text-secondary |
Comportamento: cada item abre de forma independente (não fecha os outros). Cabeçalho é <button aria-expanded> controlando uma region. No footer mobile, o painel contém uma lista de links (<ul><li><a>), não um parágrafo.
Card de produto
Ainda não é componente no Figma (é um nó solto na Home). Abaixo, o padrão com os valores normalizados para a escala de tokens — o original tem gaps de 21 e 29,78 e usa padding de 205px para posicionar o badge. Confirme com design antes de fechar.
| Parte | Especificação |
|---|---|
| Card | largura --size-card-product (294) · raio --radius-surface · borda 1px border-default |
| Imagem | 294 × 246 · raio 0 · Badge no canto superior direito (16px de recuo) |
| Categoria / nome | Caption text-secondary / Heading SM |
| Preço + variantes | Price · chips de volume (selecionado com borda border-strong) |
| Botão | Button Squared · Primary · SM · largura total |
Desktop: 4 por linha, gutter 24 (fecha os 1248). Mobile: carrossel horizontal com o mesmo card de 294 — o próximo card "espia" na borda para indicar que dá para arrastar.
Carrossel mobile (arraste)
Implementação: overflow-x: auto + scroll-snap-type: x mandatory, scroll-padding igual à margem mobile, barra de rolagem escondida, região com aria-label e tabindex="0" para rolar pelo teclado.
Seções da Home
Como cada seção se comporta no desktop (1440) e no mobile (390). Os links abrem o nó exato no Figma.
| Seção | Desktop | Mobile | Tokens-chave (mobile) |
|---|---|---|---|
| Nav Figma | Faixa de aviso + menu com logo 158px, 6 links e 4 ícones, sobre o hero com véu de 40%. | Faixa em 2 linhas centralizada. Logo 34px; links e idioma vão para o menu hambúrguer. Ícones busca, perfil, sacola, menu — cada um com área de toque de 44px. Header de 60px. | padding stack-xs × margin-mobile · alvo size-control-md |
| Hero Figma | Foto 1440 × 895, texto na coluna de 470 à esquerda. Headline + sub-headline + 2 CTAs. | 390 × 699, conteúdo ancorado embaixo. Recorte da foto centralizado na garrafa. CTA Ghost sobe para MD (toque). | padding section-y-mobile × margin-mobile · gap stack-md · CTAs stack-sm |
| Vitrine de produtos Figma | Título + filete dourado, 4 cards de 294 com gutter 24. | Título em largura total; cards viram carrossel horizontal com espiada do próximo. | gap título–cards stack-lg · cards gutter-mobile · largura size-card-product |
| Seção de mídia (Vídeo, Inovação, Nossa Missão) Figma | Foto 1440 × 599 com véu, texto na coluna de 470. | 390 × 560, texto ancorado embaixo em largura total. Recorte focal em cada foto. | padding section-y-mobile × margin-mobile · gap stack-md · véu overlay-media |
| Premiações Figma | 7 medalhas de 129px entre setas. | Carrossel de medalhas de 96px, sem setas (arrastar). | gap gutter-mobile · section-y-mobile |
| Depoimentos Figma | Bloco invertido (fundo preto). 3 cards de 364 lado a lado. | Cards empilhados em largura total, altura pelo conteúdo. | surface-inverse · card inset-card · gap stack-md |
| Brasil / Minas Figma | 2 colunas: foto 812 + texto 502. | Foto em cima (390 × 276, mesma proporção), texto embaixo. | texto: padding section-y-mobile × margin-mobile · gap stack-lg |
| Footer atual · proposta | 3 blocos: marca + newsletter, 4 colunas de links, base legal. | Proposta: accordion (ver abaixo). | ver seção seguinte |
Frames completos: Desktop — Home · Mobile — Home (mockup iPhone).
Pendências
O que ainda pode mudar. Onde houver ⚠ nesta página, o motivo está aqui.
Afetam a implementação
- ButtonVariantes SM (Pill e Squared) estão escaladas no Figma (25,43 / 11,3 / 5,65). Implementar com 36 / 16 / 8.
- ContrasteBorda do Input vazio usa
border-default(#D9D9D9 ≈ 1,4:1 no claro). A regra de acessibilidade para contorno de campo pede 3:1, e o próprio token diz para usarborder-strongem inputs. Decisão de design pendente. - ContrasteNo tema escuro, texto branco sobre Success e Warning (e Danger no limite) não passa — veja a tabela de contraste com o tema escuro ligado. Afeta o Badge em blocos Dark.
- TipografiaHeading SM: Mobile é Arpona 16, Desktop é Work Sans 20. Os cards da Home mobile hoje usam o estilo desktop. Definir a família do nome de produto.
- TipografiaMobile/09 Price (16px) diz ser "preço no card mobile", mas os cards mobile usam Desktop/14 (14px). Esta biblioteca trata 16px como preço principal da PDP no mobile.
- BreakpointSem tablet. Desktop a partir de 1024px é proposta desta biblioteca.
- Foco
color/focus/ringexiste mas nenhum componente do Figma aplica. A biblioteca já implementa anel de 2px. - MovimentoNão há tokens de animação. A biblioteca usa 150ms (cor, toggle) e 200ms (chevron),
ease-out, e respeitaprefers-reduced-motion. - SombraElevação/sombra não definida (vai ser necessária para drawer, dropdown e toast).
Componentes ainda não criados
- Select (footer usa prévia), drawer do menu hambúrguer (raio
--radius-overlay), card de produto, card de depoimento, set de ícones como componente, ícones de redes sociais.
Limpeza no Figma (não bloqueia o dev)
- Button / Squared Secondary: espessura da borda ligada a uma variável desconhecida ("size/border/Número") em vez de
size/border/hairline. - Rótulos do footer em
accent-signature(dourado) sobre fundo claro dão 2,74:1 — reprovado para texto pequeno. No Dark passa. - Descrições desatualizadas:
font/family/displayainda cita a Spectral; estilos Desktop 01–05 ainda têm o aviso "[ATENÇÃO: família em Spectral]"; alguns dizem "caixa alta" sem estar em caixa alta. - Pesos de ícone misturados (1 / 1.5 / bold).
- Valores fora da escala herdados do desktop: gaps de 21 e 29,78 no card de produto, avatar do depoimento com padding fracionado, paddings das seções de mídia desktop (151 / 153 / 328).
- Texto: "Proposíto" → "Propósito" (seção Inovação).
Para o Claude do dev
Um arquivo de regras em Markdown para o assistente de código seguir o design system sozinho: quais tokens usar, como montar cada componente, o que é proibido e o que ainda está em aberto.
No Claude Code (terminal ou editor)
- Salve o arquivo no repositório do tema como
.claude/rules/lamas-design-system.md. - Copie
lamas-tokens.csselamas-components.csspara a pastaassets/do tema. - Pronto. O cabeçalho do arquivo faz o Claude carregar as regras automaticamente sempre que abrir arquivos
.liquid,.css,.htmle similares — e só nesses casos, para não ocupar espaço à toa.
No Claude pelo navegador (claude.ai)
- Crie um Projeto para a loja.
- Adicione no conhecimento do projeto: este arquivo,
lamas-tokens.csselamas-components.css.
Quando o design system mudar
O link deste arquivo é fixo. Basta baixar de novo, ou pedir ao próprio Claude Code: “baixe o arquivo do link e substitua a regra em .claude/rules”. A versão aparece logo abaixo do título do arquivo.
Arquivos
Estes são os mesmos arquivos que a página usa — não existe cópia separada. O tokens.json segue o formato W3C de design tokens, para quem usa Style Dictionary, Tailwind ou similar.