design system

João Inverno — visual system

Fundação visual do projeto João Inverno. Tokens, tipografia, espaçamento, componentes e seções da marca consolidados em um único arquivo. Tema light é padrão; qualquer <section data-theme="dark"> herda automaticamente a paleta dark — sem mudar o tema do site inteiro.

Ver IDV em ação Abrir versão dark

Tokens

Estrutura em três camadas: primitivos (cores, neutrals — nunca usar direto) → semânticos (mapeados por contexto e tema) → componentes (consomem apenas semânticos). Para trocar a marca: editar primitivos.

Como o tema funciona

O atributo data-theme é aplicado em seções (não no <html>): o designer decide a composição da página. O :root e [data-theme="light"] compartilham os mesmos tokens — light é o padrão.

<!-- Light é padrão -->
<body>
  <section data-theme="dark"> hero dark </section>
  <section> conteúdo light (herda :root) </section>
  <section data-theme="dark"> CTA final </section>
</body>

<!-- Página inteira dark -->
<body data-theme="dark"> ... </body>

Snippet — tokens semânticos light

:root,
[data-theme="light"] {
  --bg-base:        #edeef1;
  --bg-surface:     #ffffff;
  --text-primary:   #162030;   /* 14.7:1 ✓ */
  --text-secondary: #243448;
  --accent-base:    #1556c4;
  --gradient-cta:   linear-gradient(90deg, #0046bc, #0071ff);
  --shadow-card:    0 2px 12px rgba(0,0,0,0.07), 0 0 0 1px rgba(22,32,48,0.05);
}

Cores

Paleta primitiva (azul João Inverno + neutrals) e tokens semânticos light. Os mesmos tokens semânticos existem em dark — apenas trocando os valores.

Brand — azul João Inverno

brand-50#e8edf7
brand-100#cdd9ee
brand-200#9bb3dd
brand-400#3a64ad
brand-500#1556c4 ★
brand-600#0046bc
brand-700#003a9e
brand-800#22354c
brand-900#1d4178
brand-bright#0071ff

brand-500 (#1556c4) é o azul oficial da marca — usado em CTA, brackets, badges, linhas accent.

Neutrals

gray-50#f7f8fa
gray-100 ★#edeef1 (light bg)
gray-200#e4e5e5
gray-300#c6c6c6
gray-400#a0a5ac
gray-700#243448
gray-800 ★#162030 (text)
gray-900#101722
gray-950 ★#091426 (dark bg)
gray-deepest#000919

Tokens semânticos — Light (em uso aqui)

--bg-base#edeef1
--bg-surface#ffffff
--bg-surface-raised#f7f8fa
--accent-base#1556c4
--text-primary#162030 (14.7:1 ✓)
--text-secondary#243448 (11.4:1 ✓)

Estados

success--success-text: #15803d
warning--warning-text: #b45309
danger--danger-text: #dc2626
info--info-text: #1556c4

Gradientes

--gradient-cta0046bc → 0071ff
--gradient-cta-alt1556c4 → 22354c
--gradient-tagtag pill
--gradient-section-labelsection bg
--gradient-text-accentdestaque inline
--gradient-card-blue-rcard highlight

Tipografia

Sora é a face principal (headings + body). Inter é exclusiva para CTAs e título do FAQ — usada por dar presença mecânica em interações. Pinyon Script aparece apenas no logotipo "Inverno". A maior parte dos H1/H2 da marca mistura weight 400 + weight 700 na mesma linha.

Famílias

Sora 200 — Light · Logotipo "João"

Sora 400 — Regular · body padrão

Sora 700 — Bold · headlines de destaque

Inter 600 — CTAs e FAQ title

Inverno — Pinyon Script (apenas no logotipo)

Escala display

display-xlclamp(48px → 96px)
--text-display-xl

96

display-lg (h1 hero)clamp(40px → 64px)
--text-display-lg

Introversão não é defeito. É falta de compreensão.

display-md (h2 sections)clamp(32px → 42px)
--text-display-md

Por que o jeito tradicional não funcionou.

display-sm (h3)clamp(24px → 32px)
--text-display-sm

O que você vai aprender

Conteúdo

text-xl (FAQ q.)20px
--text-lg

Em quanto tempo eu vejo resultado?

text-md (sub hero)18px
--text-md

Um método validado para introvertidos transformarem silêncio em presença.

text-base (body)16px
--text-base

Texto corrido padrão. Sora 400, line-height 1.6 quando o conteúdo é longo, 1.42 em blocos curtos.

text-sm (tag)13px
--text-sm

› entenda melhor ‹

watermark12px / spacing 12px
--text-xs

COMO LIDAR

Logo lockup

<span class="jlogo">
  <span class="joao">João</span>
  <svg class="mark" ...></svg>
  <span class="inverno">Inverno</span>
</span>

Espaçamento

Grid base de 4px. Use os tokens --space-* via utilitários (.mt-4, .gap-6, etc.) — nunca valores hardcoded. Section spacing usa clamp() para responder ao viewport.

--space-1
4px
--space-2
8px
--space-3
12px
--space-4
16px
--space-5
20px
--space-6
24px
--space-8
32px
--space-10
40px
--space-12
48px
--space-16
64px
--space-20
80px

Section spacing

--section-xs: clamp(2rem,  5vw, 3rem);     /* 32–48px */
--section-sm: clamp(3rem,  6vw, 4.5rem);   /* 48–72px */
--section-md: clamp(4rem,  8vw, 6rem);     /* 64–96px */
--section-lg: clamp(5rem, 10vw, 8rem);     /* 80–128px */
--section-xl: clamp(6rem, 12vw, 10rem);    /* 96–160px */

Raios de borda

Inclui raios corner-cut (canto superior-esquerdo reto, demais arredondados) — elementos visuais marcantes da identidade João Inverno (pain-card, checkout-card, tag-pill).

6
--radius-sm
8
--radius-md
12
--radius-lg
16
--radius-xl
19
--radius-2xl
24
--radius-3xl
--radius-full
cut
--radius-cut-md
cut-lg
--radius-cut-lg

Shadows

Sombras de uma única camada, calibradas por tema. --shadow-cta-idv é a sombra característica dos botões da identidade (sutil, com leve outline).

sm
--shadow-sm
md
--shadow-md
lg
--shadow-lg
card
--shadow-card
cta-idv
--shadow-cta-idv

Botões

O CTA principal usa o gradiente azul João Inverno. A versão "premium" do high-end é envolvida por um wrapper de borda sutil 1.5px #1d4178 com radius 12px e padding 7px — a "dupla-borda" característica.

Primary — sem wrapper (uso comum)

Quero participar do João Inverno
<a href="#" class="btn-primary">
  Quero participar do João Inverno
  <svg ...></svg>
</a>

<!-- Variante secundária (gradiente alternativo) -->
<button class="btn-primary btn-primary--alt">Garantir minha vaga</button>

Primary com dupla-borda — destaque high-end

Quero participar do João Inverno
<span class="cta-wrap">
  <a href="#" class="btn-primary">Quero participar...</a>
</span>

Secondary & Ghost

Continuar lendo →

Section labels & tags

Marcador identitário: texto uppercase entre brackets azuis. Aparece antes de quase todo título de seção e funciona como "ponteiro de leitura".

Section label (› entenda melhor ‹)

entenda melhor pilar 1 garanta sua vaga
<span class="sec-label">
  <span class="bracket">›</span> entenda melhor <span class="bracket">‹</span>
</span>

Tag pill — variante square (front-end)

Para introvertidos Método validado
<span class="tag-pill">Para introvertidos</span>
/* radius: 0 4px 4px 4px (canto superior-esquerdo reto) */

Tag pill — variante rounded (high-end)

Quem criou este método Acesso vitalício
<span class="tag-pill tag-pill--rounded">Quem criou este método</span>
/* radius: full | padding: 6px 13px */

Cards de conteúdo

Cinco famílias visuais — cada uma resolve uma intenção narrativa específica.

Pain Card — com ícone + título + descrição

Você se sente esgotado em reuniões longas

Mesmo dominando o assunto, depois de 30 minutos de fala alheia sua presença evapora.

Aceita ideias inferiores por evitar conflito

<div class="pain-card">
  <svg class="icon" ...></svg>
  <div class="body">
    <p class="title">Você se sente esgotado em reuniões longas</p>
    <p class="desc">Mesmo dominando o assunto, depois de 30 min...</p>
  </div>
</div>

Curriculum Row — badge + tópico misto + descrição

O que vou aprender

Como falar em reuniões sem disputar espaço

Três frameworks de presença que não dependem de extroversão — só de timing e clareza.

<div class="curriculum-row">
  <span class="curriculum-badge">O que vou aprender</span>
  <div>
    <h4 class="topic">Como falar em reuniões <strong>sem disputar espaço</strong></h4>
    <p class="desc">Três frameworks de presença...</p>
  </div>
</div>

Pillar Card — section label + título + bullets

pilar 1

Mapeamento da própria carga

  • Identificar gatilhos de exaustão
  • Construir uma rotina de recarga
  • Reconhecer sinais de saturação
pilar 2

Presença sem performance

  • Comunicar com profundidade
  • Usar o silêncio como ferramenta
pilar 3

Influência por convicção

  • Liderar sem alta voltagem
  • Construir autoridade silenciosa

Goal Card — sem ícone, só conteúdo

Sair de cada reunião com energia

Não importa o tamanho do grupo — o método protege sua bateria.

Ser ouvido sem precisar gritar

Voz sutil pode dominar quando carrega clareza.

Hero info card (240×150) — para uso em hero

+8 horas de conteúdo aplicado e mentoria em grupo

Acesso vitalício às atualizações do programa

Programa cards

Card com header colorido azul em uppercase letter-spacing alto, lista de itens com check. Usado para apresentar formato e diferenciais do programa.

FORMATO
  • 8 encontros ao vivo
  • Materiais aplicados em PDF
  • Mentoria em grupo a cada 15 dias
DIFERENCIAIS
  • Método baseado em pesquisa de campo
  • Comunidade fechada de alunos
  • Atualizações vitalícias
<div class="programa-card">
  <div class="ph">FORMATO</div>
  <ul>
    <li><svg class="ck"></svg> 8 encontros ao vivo</li>
    ...
  </ul>
</div>

CTA section

A seção de conversão tradicional do João Inverno usa fundo azul oficial, label "› garanta sua vaga ‹", headline mista (regular + bold), sub e CTA com dupla-borda.

garanta sua vaga

Sua próxima reunião pode ser diferente.

Se você se reconheceu nas dores acima, este é o lugar.

Quero participar agora →

Checkout & garantia

Card de oferta com glass blur sutil (somente light), preço de/por, checklist 2×2 e badges de segurança. Composição com selo de garantia.

Checkout Card

Investimento:

R$ 1.997 R$ 997
  • 8 encontros ao vivo
  • Mentoria em grupo
  • Material em PDF
  • Acesso vitalício
Quero garantir minha vaga
Acesso imediato Compra segura

Guarantee badge

7
Dias de garantia

Devolução incondicional

FAQ

Acordeão CSS-puro com <details>/<summary>. Ícone + rotaciona 45° para × quando aberto. Resposta em largura total, alinhada abaixo do título. Acessível por teclado out-of-the-box.

Para quem é o método João Inverno?

Para introvertidos que querem ser percebidos pela profundidade e não por volume — sem precisar fingir ser quem não são.

Em quanto tempo eu vejo resultado?

Os primeiros encontros já trazem clareza sobre os próprios padrões. Resultados consolidados aparecem nas primeiras 4 semanas.

Posso assistir em tempo livre?

Sim. Os encontros ao vivo ficam gravados na plataforma e o acesso é vitalício.

O método funciona para introvertidos que têm dificuldade de liderança?

Sim — a maioria dos alunos relata avanços diretos em presença, escuta ativa e influência sem autoritarismo. O método trabalha com os pontos fortes de quem pensa antes de falar.

<details class="faq-card">
  <summary>
    <p class="q">Para quem é o método?</p>
    <svg class="plus" aria-hidden="true">...</svg>
  </summary>
  <p class="a">Para introvertidos que...</p>
</details>

Formulários

Inputs, textareas, selects, checkboxes, radios e toggle switches — todos com estados focus / hover / disabled / error / success, contraste WCAG AA e acessíveis por teclado out-of-the-box. Toggle e radios são CSS-only (sem JS).

Input — text, email, password

Como devemos te chamar nos encontros.
<div class="form-field">
  <label class="label" for="f-email">E-mail</label>
  <div class="input-group">
    <svg class="input-icon" ...></svg>
    <input id="f-email" class="input" type="email"
           placeholder="voce@exemplo.com" />
  </div>
</div>

Estados — focus, error, success, disabled

Este campo está bloqueado neste contexto.

Textarea

Mínimo 20 caracteres. Você pode redimensionar verticalmente.

Select com seta custom

Checkbox & Radio

Múltipla escolha (checkbox)

Escolha única (radio)

<label class="check">
  <input type="checkbox" />
  <span class="box">
    <svg class="check-icon" ...></svg>
  </span>
  <span class="label-text">Quero participar...</span>
</label>

<!-- Radio: trocar type e box.radio -->
<label class="check">
  <input type="radio" name="plano" />
  <span class="box radio"><span class="radio-dot"></span></span>
  <span class="label-text">Plano essencial</span>
</label>

Toggle switch

Form inline — newsletter / lead capture

Use em hero ou rodapé para captura rápida de e-mail.

Composição completa — lead capture

Elementos decorativos

Marcas visuais identitárias que assinam as seções da marca. São puramente decorativos — não devem competir com o CTA.

Watermark vertical

Texto rotacionado 90deg com letter-spacing 12px, opacity baixa (0.25 light, 0.35 dark).

como lidar com a própria introversão
conteúdo principal aqui →

Big J logo watermark

Letra "J" gigante em opacity reduzida — usado em pilares, sobre, hero.

Photo card (high-end)

Wrapper com radius 24px, overlay azul em mix-blend-mode: hue, glow superior.

RETRATO

Divisor wave

SVG inline 100% × 91px, separa seções de cores diferentes. Versão invertida via scaleY(-1).

Seção A (bg-base)
Seção B (bg-surface-overlay)
Seção C (volta para bg-base)

Motion

Catálogo de keyframes, utilitários .anim-*, transições de hover, sistema scroll-triggered (data-animate), stagger via CSS variable, skeleton, spinner, loading bar e toast. Tudo respeita prefers-reduced-motion: reduce.

Tokens — durations, delays, easings

--duration-xfast:  75ms;
--duration-fast:   150ms;
--duration-base:   250ms;   /* padrão para hover/focus */
--duration-slow:   400ms;   /* entradas de cena */
--duration-slower: 600ms;
--duration-hero:   800ms;

--delay-1: 100ms;  --delay-2: 200ms;
--delay-3: 300ms;  --delay-4: 400ms;

--ease-default: cubic-bezier(0.4, 0, 0.2, 1);
--ease-out:     cubic-bezier(0, 0, 0.2, 1);
--ease-in:      cubic-bezier(0.4, 0, 1, 1);
--ease-bounce:  cubic-bezier(0.34, 1.56, 0.64, 1);

Keyframes — catálogo (passe o mouse para repetir)

Cada bloco abaixo aplica um @keyframes diferente. Use .anim-* para entradas de cena e os infinitos (pulse, float, spin) com moderação.

fade-in
slide-up
slide-down
slide-left
slide-right
scale-in
blur-in
pulse-soft ∞
float ∞
spin
<div class="anim-slide-up">Bloco entra de baixo</div>
<div class="anim-slide-up delay-2">Entra 200ms depois</div>
<svg class="anim-spin"> ... </svg>

Stagger — entradas em cascata

Defina --i em cada filho via style (ou JS) e use data-stagger no pai. O delay é --stagger-base × --i (default 80ms).

<ul data-stagger>
  <li style="--i:1">...</li>
  <li style="--i:2">...</li>
  <li style="--i:3">...</li>
</ul>
/* delay = --stagger-base * --i */

Hover utilities

hover-lift
hover-scale
hover-glow
hover-tilt

Scroll-triggered — data-animate

Aplique data-animate em qualquer elemento. Um pequeno IntersectionObserver (no fim do arquivo) adiciona a classe is-visible quando ele entra no viewport. Variantes: slide-up (padrão), slide-left, slide-right, scale, blur, fade.

slide-up (default)

data-animate

slide-left

data-animate="slide-left"

scale

data-animate="scale"

blur

data-animate="blur"

slide-right

data-animate="slide-right"

fade

data-animate="fade"

Role a página até esta seção para ver os elementos entrarem em cena.

Skeleton loaders

Spinner & loading bar

.spinner.sm
.spinner
.spinner.lg
.spinner.on-cta dentro do CTA

Loading bar indeterminado:

Toast notifications

Aviso

Sua sessão expira em 5 minutos.

Inscrição confirmada

Acompanhe os próximos passos no seu e-mail.

Quase lá

Confirme seu e-mail antes de continuar.

Erro ao processar

Não foi possível concluir a inscrição. Tente novamente.

prefers-reduced-motion

O sistema inteiro respeita o setting do usuário. Quando ativo, todas as animações caem para 0.01ms e elementos com data-animate ficam imediatamente visíveis (sem entrada de cena).

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  [data-animate] {
    opacity: 1 !important;
    transform: none !important;
    filter: none !important;
  }
}
tema por seção

Esta seção é dark — sem mudar o tema da página

Tudo dentro deste <section data-theme="dark"> herda os tokens dark. Os mesmos componentes funcionam — pain-card, programa-card, FAQ, CTA dupla-borda.

Funciona em qualquer seção

Sem precisar duplicar componentes ou criar variantes — os tokens já fazem o trabalho.

Misture seções como o briefing pede

Hero dark + dor light + solução dark + sobre dark + final light é um padrão da marca.

CTA dupla-borda em dark

IDV em ação — hero compositivo

Mock de hero com todos os elementos da identidade combinados: section label, tag, headline mista (regular + bold), sub, CTA dupla-borda, pain cards e watermark vertical no canto. Use isso como referência ao montar páginas.

como lidar com a própria introversão
entenda melhor Para introvertidos que cansam de ser invisíveis

Introversão não é defeito. É falta de compreensão.

Um método validado para quem prefere o silêncio mas não quer ser ignorado. Sem performances forçadas, sem rituais que esgotam.

Quero participar do João Inverno Ver o método →

Você se sente esgotado em reuniões longas

Mesmo dominando o assunto, depois de 30 min sua presença evapora.

Aceita ideias inferiores por evitar conflito

Esta composição usa apenas tokens semânticos — alterar primitivos atualiza o hero todo.