Tokens
Primitivos visuais — cores, tipografia, espaçamento, motion, breakpoints.
O DS opera em 3 camadas. Cada camada tem showrooms próprios.
Primitivos visuais — cores, tipografia, espaçamento, motion, breakpoints.
Classes atômicas de spacing, layout, animations e responsive.
Keyframes e classes de animação — entrada, loop, hover, stagger.
48 blocos BEM prontos — base UI, navegação, conteúdo, conversão, forms.
Botão base com 5 variantes (primary, secondary, ghost, danger, link), 3 tamanhos e estado loading.
<button class="btn btn--primary">Primary</button>
<button class="btn btn--primary btn--lg">Large</button>
<button class="btn btn--primary is-loading">
<span class="btn__spinner" aria-hidden="true"></span>
<span>Enviando...</span>
</button>--accent-base--accent-text--accent-shadow--radius-md--tap-target--font-semiboldRótulo inline para status, contadores e categorias. 6 variantes semânticas.
<span class="badge badge--success">Ativo</span>
<span class="badge badge--accent">Novo</span>--success-bg--success-text--accent-muted--text-accent--radius-smRótulo arredondado para tags, filtros e status com dot pulsante.
<span class="pill pill--soft pill--with-dot">
<span class="pill__dot" aria-hidden="true"></span>
Ao vivo
</span>--radius-full--accent-muted--text-accent--border-defaultSistema completo de form fields: input, textarea, select, checkbox, radio, switch + input-group.
<label class="input-field">
<span class="input-field__label">Email</span>
<input class="input" type="email">
</label>
<label class="switch">
<input type="checkbox"><span class="switch__track"></span>
</label>--bg-input--border-default--border-focus--focus-ring--radius-mdContainer de conteúdo agrupado. Variante warm-fixed mantém clareza dentro de seção dark.
Card padrão com sombra suave e borda sutil.
Eleva no hover. Usado em grids interativos.
Borda accent + shadow accent. Destaca oferta.
Permanece claro mesmo dentro de seção dark.
<article class="card card--hoverable">
<h3 class="card__title">Título</h3>
<p class="card__body">Conteúdo.</p>
</article>--bg-surface--bg-card--shadow-card--radius-xl--border-subtleBloco de mensagem semântica com border-left grossa + ícone + título + descrição.
Informação
Mensagem descritiva.
Sucesso
Operação concluída.
Atenção
Verifique antes de prosseguir.
Erro
Falha na operação.
<div class="alert alert--success" role="status">
<span class="alert__icon" aria-hidden="true">✓</span>
<div class="alert__content">
<p class="alert__title">Sucesso</p>
<p class="alert__desc">Operação concluída.</p>
</div>
</div>--success-bg--success-text--danger-bg--info-bg--radius-mdNotificação não-modal flutuante. Top-right desktop, bottom mobile. (Aqui renderizado inline para preview.)
Salvo
Suas alterações foram salvas.
Info
Nova versão disponível.
Falhou
Tente novamente em alguns instantes.
<div class="toast-container" role="region">
<div class="toast toast--success" role="status">
<span class="toast__icon">✓</span>
<div class="toast__content">
<p class="toast__title">Salvo</p>
<p class="toast__desc">...</p>
</div>
<button class="toast__close">×</button>
</div>
</div>--toast-width--toast-padding--z-toast--shadow-lgUsa elemento nativo <dialog>. Foco trap + ESC close pelo browser.
<dialog class="modal" id="confirm">
<header class="modal__header">...</header>
<div class="modal__body">...</div>
<footer class="modal__footer">...</footer>
</dialog>
<script>document.getElementById('confirm').showModal()</script>--modal-max-width--modal-padding--modal-backdrop-bg--shadow-xl100% nativo via <details>/<summary> com animação smooth (Chrome 129+).
Você tem 7 dias para testar todas as funcionalidades. Cancele a qualquer momento sem custo.
Sim, sem multa ou burocracia. Basta acessar suas configurações.
Suporte por email em até 24h e chat ao vivo em horário comercial.
<div class="accordion">
<details class="accordion__item">
<summary class="accordion__summary">
Pergunta?<span class="accordion__chevron"></span>
</summary>
<div class="accordion__panel"><p>Resposta.</p></div>
</details>
</div>--border-subtle--bg-hover--radius-lg--duration-baseNavegação por abas com roles ARIA. JS mínimo para alternar.
<div class="tabs">
<div class="tab-list" role="tablist">
<button class="tab" role="tab" aria-selected="true">Visão</button>
<button class="tab" role="tab" aria-selected="false" tabindex="-1">Detalhes</button>
</div>
<div class="tab-panel" role="tabpanel">...</div>
<div class="tab-panel" role="tabpanel" hidden>...</div>
</div>--accent-base--text-accent--border-default--font-mediumMenu suspenso via <details> nativo — zero JS necessário.
<details class="dropdown">
<summary class="dropdown__trigger">Opções</summary>
<div class="dropdown__menu" role="menu">
<a class="dropdown__item" role="menuitem" href="#">Editar</a>
<hr class="dropdown__divider">
<button class="dropdown__item dropdown__item--danger">Excluir</button>
</div>
</details>--z-dropdown--shadow-lg--radius-md--bg-surfaceCSS-only via [data-tooltip]. Aparece em :hover e :focus-visible. Zero JS.
<button data-tooltip="Salvar" class="btn">Salvar</button>
<span data-tooltip="Texto" data-tooltip-pos="bottom">Item</span>--tooltip-bg--tooltip-text--tooltip-padding--z-tooltipTrilha de navegação hierárquica. Variantes default e chevron.
<nav aria-label="Você está em">
<ol class="breadcrumb">
<li class="breadcrumb__item">
<a class="breadcrumb__link" href="/">Início</a>
<span class="breadcrumb__separator">/</span>
</li>
<li class="breadcrumb__item" aria-current="page">Atual</li>
</ol>
</nav>--text-secondary--text-accent--text-mutedNavegação entre páginas com prev/next + números + ellipsis. Tap target 44px.
<nav class="pagination" aria-label="Paginação">
<a class="pagination__btn pagination__btn--prev" href="?p=1">‹</a>
<a class="pagination__btn pagination__btn--active" aria-current="page">2</a>
<span class="pagination__ellipsis">…</span>
</nav>--tap-target--accent-base--radius-md--radius-fullImagem de perfil redonda com 4 tamanhos e stack sobreposto.
<span class="avatar avatar--md">
<img src="/u/jane.avif" alt="Jane Doe">
</span>
<div class="avatar-stack">
<span class="avatar avatar--sm">...</span>
<span class="avatar avatar--sm">+3</span>
</div>--space-6--space-8--space-11--space-16--radius-fullCitação editorial com border-left de acento e tipografia accent.
O design é como uma piada: se você precisa explicar, não é bom.
— Martin LeBlanc
Menos é mais.
— Mies van der Rohe
<blockquote class="blockquote">
<p>Texto da citação.</p>
<cite class="blockquote__cite">— Autor</cite>
</blockquote>--font-accent--accent-base--text-2xl--leading-snug5 estrelas com modos readonly e interactive. 3 tamanhos.
<div class="rating rating--md rating--readonly" role="img" aria-label="4 de 5">
<svg class="rating__star is-on" viewBox="0 0 24 24"><path d="..."/></svg>
<!-- 5x estrelas, .is-on para acesas -->
</div>--warning-text--text-muted--tap-targetTimer 4 unidades (Dias/Horas/Min/Seg). JS externo atualiza os valores.
<div class="countdown" data-countdown="2026-12-31T23:59:59">
<div class="countdown__unit">
<span class="countdown__value" data-unit="days">00</span>
<span class="countdown__label">Dias</span>
</div>
<!-- horas/min/seg -->
</div>--accent-muted--border-accent--text-display-sm--font-extrabold<hr> base + variantes com label/ícone central.
<hr class="divider">
<div class="divider divider--label">
<span class="divider__label">OU</span>
</div>--border-default--text-muted--text-accentTexto rolante horizontal via animação CSS pura. Pausa em prefers-reduced-motion.
<div class="marquee" aria-label="Marcas">
<div class="marquee__track">
<span class="marquee__item">Marca A</span>
<!-- duplicar conteúdo para loop -->
<span class="marquee__item" aria-hidden="true">Marca A</span>
</div>
</div>--space-12--font-heading--text-lgEyebrow + título display + sub. Estrutura repetida no topo de seções.
Uma plataforma completa para entregar páginas que convertem.
Conteúdo alinhado ao centro.
<header class="section-header">
<span class="section-header__eyebrow">Recursos</span>
<h2 class="section-header__title">Título</h2>
<p class="section-header__sub">Subtítulo.</p>
</header>--text-display-lg--font-bold--tracking-display--container-narrowBarra de progresso horizontal + indicador multi-step.
<div class="progress" role="progressbar" style="--progress: 60">
<div class="progress__bar"></div>
</div>
<ol class="progress-multistep">
<li class="progress-multistep__step is-complete"><span>1</span></li>
<li class="progress-multistep__step is-active"><span>2</span></li>
</ol>--accent-base--success-text--bg-surface-raised--step-sizePlaceholder de carregamento com shimmer.
<div aria-busy="true" aria-live="polite">
<div class="skeleton skeleton--text" style="width: 70%"></div>
<div class="skeleton skeleton--avatar"></div>
<div class="skeleton skeleton--card"></div>
</div>--bg-surface-raised--bg-surface-overlay--radius-md--radius-fullIndicador circular de loading. 3 tamanhos + modifier on-cta.
<span class="spinner" role="status" aria-label="Carregando"></span>
<button class="btn btn--primary" disabled>
<span class="spinner spinner--sm spinner--on-cta"></span>
Enviando...
</button>--accent-base--accent-text--border-subtle--duration-slowestBarra indeterminada fixa no topo da página (estilo NProgress). Renderizada aqui inline.
<div class="loading-bar" role="progressbar" aria-label="Carregando">
<div class="loading-bar__progress"></div>
</div>--accent-base--accent-muted--z-toast--ease-in-outSelo de garantia (escudo + headline + sub). Background warm para destaque.
<aside class="guarantee-box">
<div class="guarantee-box__icon"><svg>...</svg></div>
<div class="guarantee-box__body">
<h3 class="guarantee-box__title">Garantia</h3>
<p class="guarantee-box__sub">Devolução integral.</p>
</div>
</aside>--bg-warm--accent-muted--accent-base--radius-xlFaixa diagonal no canto sup-direito de card. Variantes semânticas.
<article class="card" style="position:relative; overflow:hidden;">
<span class="ribbon ribbon--corner">Novo</span>
...
</article>--accent-base--success-text--danger-text--shadow-smSeção principal acima da dobra. 3 variantes: split, center, bg-image.
<section class="hero hero--split">
<div class="hero__body">
<span class="hero__eyebrow">Lançamento</span>
<h1 class="hero__title">Headline</h1>
<p class="hero__sub">Subtítulo.</p>
<div class="hero__cta"><a class="btn btn--primary">CTA</a></div>
</div>
<div class="hero__media"><img src="..." alt=""></div>
</section>--section-lg--container-narrow--text-display-lg--accent-mutedCard de benefício (ícone + título + texto). Grid responsivo 1/2/3 cols.
Performance excepcional com LCP abaixo de 2.5s.
Saber mais →Entregas dentro do cronograma combinado.
Saber mais →Stack enterprise com tracking server-side dedicado.
Saber mais →<ul class="feature-grid">
<li class="feature-card">
<div class="feature-card__icon"><svg>...</svg></div>
<h3 class="feature-card__title">Título</h3>
<p class="feature-card__desc">Descrição.</p>
<a class="feature-card__link" href="#">Saber mais →</a>
</li>
</ul>--bg-surface--accent-muted--text-accent--shadow-card--radius-xlDepoimento com autor + avatar. Variante featured com foto lateral grande.
Mudou completamente meu negócio em 30 dias. Recomendo demais.
Resultado em 7 dias. ROI foi imediato e o suporte é excelente.
<figure class="testimonial-card">
<blockquote class="testimonial-card__quote">Texto.</blockquote>
<figcaption class="testimonial-card__author">
<img class="testimonial-card__avatar" src="..." alt="">
<span class="testimonial-card__meta">
<span class="testimonial-card__name">Nome</span>
<span class="testimonial-card__role">Cargo</span>
</span>
</figcaption>
</figure>--bg-surface--accent-base--font-accent--shadow-cardNúmero grande + label (KPI). Suporta indicador de tendência.
<div class="stat-card">
<span class="stat-card__value">12.500</span>
<span class="stat-card__label">Alunos</span>
</div>--text-display-sm--font-extrabold--success-bg--danger-bgPlano de preço com features + CTA. Variante featured com badge "Mais popular".
Para começar.
Para times pequenos.
Para grandes operações.
<article class="pricing-card pricing-card--featured" data-badge="Mais popular">
<header class="pricing-card__header">
<h3 class="pricing-card__title">Pro</h3>
</header>
<div class="pricing-card__price">
<span class="pricing-card__amount">R$ 97</span>
<span class="pricing-card__period">/mês</span>
</div>
<ul class="pricing-card__features"><li>Feature</li></ul>
<a class="pricing-card__cta btn btn--primary" href="#">Assinar</a>
</article>--accent-base--accent-shadow--success-text--text-display-md--radius-2xlPassos sequenciais. Horizontal desktop, vertical mobile.
Crie sua conta em 30s.
Personalize o projeto.
Publique em 1 clique.
<ol class="timeline">
<li class="timeline__step">
<span class="timeline__marker">1</span>
<div class="timeline__content">
<h4 class="timeline__title">Cadastro</h4>
<p class="timeline__desc">...</p>
</div>
</li>
</ol>--accent-base--accent-text--space-8--shadow-sm"Nós vs eles" com check/x. Scroll horizontal natural no mobile.
| Nosso | Concorrente A | Concorrente B | |
|---|---|---|---|
| Tracking server-side | ✓ | × | ✓ |
| Free tier | ✓ | × | × |
| Suporte 24h | ✓ | ✓ | × |
| A/B testing | ✓ | × | × |
<div class="comparison-table-wrap">
<table class="comparison-table">
<thead><tr><th></th><th class="comparison-table__col--us">Nosso</th></tr></thead>
<tbody>
<tr><th scope="row">Feature</th><td><span class="comparison-table__check">✓</span></td></tr>
</tbody>
</table>
</div>--accent-muted--text-accent--success-bg--success-textLogos de clientes + selos de segurança. Grayscale por default, colore no hover.
Quem já confiou em nós
<section class="trust-section">
<p class="trust-section__label">Quem confiou</p>
<ul class="trust-section__grid">
<li class="trust-section__item">
<img class="trust-section__logo" src="..." alt="">
</li>
</ul>
</section>--section-sm--text-muted--tracking-widestBloco 2-col (imagem + texto). Variante reverse troca a ordem no desktop.
<section class="split-feature">
<div class="split-feature__media"><img src="..." alt=""></div>
<div class="split-feature__body">
<span class="split-feature__eyebrow">Recurso</span>
<h2 class="split-feature__title">Título</h2>
<p class="split-feature__desc">Descrição.</p>
<a class="split-feature__cta btn btn--primary">CTA</a>
</div>
</section>--container-wide--section-md--text-display-sm--radius-2xlThumbnail clicável com play overlay ou embed responsivo 16:9.
<section class="video-section">
<button class="video-section__thumbnail" data-video-id="abc123">
<img src="thumb.jpg" alt="">
<span class="video-section__play"><svg>...</svg></span>
</button>
</section>
<!-- Variante embed -->
<div class="video-section__embed"><iframe src="..."></iframe></div>--play-btn-size--play-btn-bg--shadow-md--radius-lgFaixa fina no topo com mensagem promocional + botão fechar opcional. Renderizada inline.
<div class="announcement-bar" role="region">
<p class="announcement-bar__text">Aviso. <strong>Destaque</strong></p>
<button class="announcement-bar__close"><svg>...</svg></button>
</div>--announcement-bg--announcement-text--announcement-height--z-raisedBarra fixed bottom com CTA. Aparece após scroll via JS. Renderizada inline com classe --visible.
<div class="sticky-cta-bar" role="region">
<p class="sticky-cta-bar__text">Oferta termina em 2h</p>
<a class="sticky-cta-bar__cta btn btn--primary">Garantir agora</a>
</div>
<!-- JS toggle: .sticky-cta-bar--visible após scroll -->--z-overlay--sticky-cta-height--sticky-cta-shadow--duration-slowBanner LGPD/Consent Mode v2 com 3 ações. Variantes bottom e corner.
<div class="cookie-banner" role="dialog">
<div class="cookie-banner__content">
<h2 class="cookie-banner__title">Sua privacidade</h2>
<p class="cookie-banner__text">Usamos cookies...</p>
</div>
<div class="cookie-banner__actions">
<button class="btn btn--primary">Aceitar todos</button>
</div>
</div>--z-modal--bg-surface--text-accent--border-defaultWizard com indicador no topo + animação slide entre steps.
<form class="form-multistep" data-current="1">
<ol class="form-multistep__progress">
<li class="form-multistep__step" data-step="active">
<span class="form-multistep__bullet">1</span>
<span class="form-multistep__label">Dados</span>
</li>
</ol>
<div class="form-multistep__steps">
<fieldset class="form-step" data-step="active">...</fieldset>
</div>
</form>--step-size--step-active-bg--success-text--container-narrowForm compacto horizontal (1 campo + CTA). Estados error/success.
<form class="lead-form-inline">
<div class="lead-form-inline__field">
<input class="lead-form-inline__input" type="email">
</div>
<button class="lead-form-inline__cta btn btn--primary">Receber</button>
<p class="lead-form-inline__feedback" role="status"></p>
</form>--bg-input--accent-base--danger-text--success-textVariante de .card com 1 canto reto. Assinatura geométrica. Requer ativar --radius-cut-* nos tokens do projeto.
Padrão jpinverno.online.
Variante espelhada.
Top-left + bottom-right.
<article class="card card--corner-cut">
<h3 class="card__title">Título</h3>
</article>
<!-- Para ativar, em theme.css: -->
<!-- :root { --radius-cut-md: 16px; } -->--radius-cut-sm--radius-cut-md--radius-cut-lg--radius-lgAnimação em cascata via nth-child puro CSS. Sem JS. Origem: kathleensantos.com.br.
<section class="hero hero--sequence">
<span class="hero__eyebrow">Eyebrow</span> <!-- delay 0 -->
<h1 class="hero__title">Headline</h1> <!-- delay 150ms -->
<p class="hero__sub">Subtítulo</p> <!-- delay 300ms -->
<div class="hero__cta">...</div> <!-- delay 450ms -->
</section>--delay-2--delay-4--delay-6--duration-slow--ease-outBlockquote premium para artigos longos. Origem: portadamente.com.br.
Toda decisão de design carrega uma hipótese sobre o leitor.
Menos é mais quando o resto faz sentido.
A tipografia carrega o tom antes da palavra.
<figure class="pull-quote">
<blockquote class="pull-quote__quote">Citação.</blockquote>
<figcaption class="pull-quote__cite">Fonte</figcaption>
</figure>--font-accent--accent-base--accent-muted--text-display-md
Social Proof Toast
Notificação live (canto inf-esq). "Maria comprou há 2min". Aqui renderizado com classe --visible.
HTML
Tokens usados
--bg-surface--shadow-lg--radius-xl--duration-slow