nexyohub.com.br
Design system

Noite, luz e um ritmo.

O sistema do site da NEXYO: fundamentos, componentes e padrões. Os valores saem dos arquivos do projeto no build, e os componentes são os mesmos da home.

00Marca

Um cata-vento e um nome.

O símbolo é o Cata-vento Fino 85%. O nome é Nexyo com o x cheio e os cantos retos, e o Hub vem em contorno da Hando: a Hando nunca entra como fonte no site. Tudo é desenhado inline em currentColor, então a marca segue a cor do texto no claro e no escuro.

Assinaturas
Horizontal com Hub

A assinatura principal: rodapé, capa, apresentação.

Horizontal sem Hub

Onde a largura aperta ou o Hub já está dito por perto.

Empilhada

Formato quadrado: avatar, selo, crachá.

Ícone 3D
Claro

Aço, gelo e osso sobre azul claro. Vai em fundo claro (luz, bruma).

Escuro

Vidro com brilho gelo sobre azul fundo. Vai em fundo escuro (abismo, noite).

O símbolo em vidro, em loop lento de câmera. A versão clara mora em fundo claro e a escura em fundo escuro, nunca trocadas. Os três módulos e os vãos entre eles não se deformam.

Símbolo
NEXYO64px
NEXYO32px
NEXYO16px

Favicon, ícone do app e a navegação recolhida.

Área de proteção

Metade da altura do símbolo em volta de toda a assinatura. Nada entra nessa faixa.

Tamanho mínimo
Horizontal com Hub
24px
Horizontal sem Hub
20px
Empilhada
48px
Símbolo
16px

Altura na tela. Abaixo disso o Hub e as pás do cata-vento empapam.

01Cor

Claro no meio, escuro nas pontas.

Dois tons claros que se alternam no meio da página e um escuro azul que abre e fecha. No claro o texto é noite, aço e ardósia; no escuro, osso, névoa e fumaça. Destaque no máximo 2 toques por tela, sempre na versão do lado em que está. Cada pilar tem a sua cor: Marca ametista, Presença pinho, Conexão laranja.

Paleta clara
luz
#F7F7F4

Fundo claro quente. Alterna com a bruma.

bruma
#EBF0F2

Fundo claro frio. Nunca duas faixas seguidas no mesmo tom.

noite
#0A111C

Título e texto principal no claro.

aco
#1E3247

Texto forte de apoio no claro.

ardosia
#4A5868

Texto secundário no claro: resumo, nota, legenda.

ametista-escura
#5E56A0

Destaque pequeno no claro: número, foco, uma palavra.

pinho-escuro
#4C7563

Segundo destaque no claro, com a mesma regra.

laranja-escuro
#9C5730

Terceiro destaque no claro: o pilar Conexão em texto pequeno.

Contraste no claro
sobre luz
noite
17,6 : 1
aco
12,2 : 1
ardosia
6,8 : 1
ametista-escura
5,9 : 1
pinho-escuro
4,9 : 1
laranja-escuro
5,1 : 1
fumaca
4,1 : 1
sobre bruma
noite
16,5 : 1
aco
11,4 : 1
ardosia
6,3 : 1
ametista-escura
5,5 : 1
pinho-escuro
4,5 : 1
laranja-escuro
4,8 : 1
fumaca
3,8 : 1

Fumaça sobre o claro fica abaixo de 4,5 para 1: só entra em texto de 18px para cima. Linha no claro é noite com alfa, 8% para divisória e 14% para borda de controle.

Paleta escura · ilha
abismo
#04060A

Fundo escuro de base. Azul quase preto, nunca preto puro.

noite
#0A111C

Superfície: ilha escura, card elevado.

petroleo
#12202F

Superfície mais alta e fundo de ícone.

aco
#1E3247

Borda e divisória no escuro.

osso
#F1F2EF

Texto principal no escuro.

nevoa
#A5B0BD

Texto de apoio no escuro.

fumaca
#6E7A89

Metadado no escuro. No claro só a partir de 18px.

gelo
#D6E2E8

Gradiente metálico do título e o vidro.

ametista
#8E86C4

Destaque no escuro: luz, foco, número ou uma palavra.

pinho
#6F9A86

Segundo destaque no escuro. Cor do pilar Presença.

laranja
#F0A066

Terceiro destaque no escuro. Cor do pilar Conexão (Marca = ametista).

laranja-luz
#3A2418

Fundo de selo laranja no escuro.

osso sobre abismo
18,0 : 1
nevoa sobre abismo
9,2 : 1
fumaca sobre abismo
4,6 : 1
ametista sobre abismo
6,1 : 1
pinho sobre abismo
6,4 : 1
laranja sobre abismo
9,6 : 1
O que a cor não faz aqui
Preto puro

O escuro é sempre azul noite. Branco puro só como texto sobre o escuro.

Degradê entre seções

O corte é seco. O brilho de fundo fica na mesma família dos dois lados: 20% no claro, 28% no escuro.

Semáforo

Erro e situação carregam ícone e palavra. Destaque não vira cor de estado.

02Tipografia

Geist, e nove degraus.

Duas famílias, as duas servidas pelo projeto. Tamanho cru no className reprova no gate: a hierarquia sai da escala, não de um número escolhido na hora.

A escala
Hub de comunicação
text-display54pxaltura 1.1letra -2pxpeso 400
A marca no evento certo
text-subhead48pxaltura 1.1letra -1pxpeso 400
Quem patrocina quer gente, não impressão.
text-pullquote36pxaltura 1.1letra -.5pxpeso 400
Cota ouro: palco, crachá e estande
text-post-title36pxaltura 1.1letra -.6pxpeso 500
Do primeiro contato ao relatório final do evento.
text-body24pxaltura 1.2peso 400
Cada cota diz o que entrega, onde aparece e para quantas pessoas.
text-caption14pxaltura 1.5peso 400
Vamos conversar
text-button14pxaltura 1.5peso 500
[email protected]
text-field16pxaltura 1.5peso 500
01 · Serviços
text-eyebrow10pxaltura 1letra 1pxpeso 400mono
Abaixo de 768px
text-display
40px
text-subhead
34px
text-pullquote
28px
text-post-title
26px
text-body
18px
text-eyebrow
12px

Cinco degraus encolhem no telefone. O text-field fica em 16px porque o Safari do iPhone dá zoom ao focar um campo menor.

Sem linha órfã
título
text-wrap: balance
texto corrido
text-wrap: pretty
famílias
Geist 400 e 500, Geist Mono 400

Medida em pixel, nunca em ch: o ch do CSS é a largura do algarismo zero, 45% maior que a letra média.

03Espaço

Medidas com nome.

Cada medida tem um trabalho, e todas moram em app/tokens.css. Seção respira 96px no desktop e 64px no telefone; dentro dela, 40px entre blocos.

As medidas
container
1600px · Largura máxima do conteúdo.
gutter
40px · Respiro lateral em desktop. No telefone, 24px.
cell-gap
9px · O vão entre peças de uma pilha.
nav-h
46px · Altura da navegação.
medida-nota
448px · Medida do texto de 14px: cerca de 70 caracteres.
medida-manchete
720px · Medida do título de 48px: cerca de 40 caracteres.
medida-corpo
760px · Medida do texto de corpo de 24px, a coluna de texto do padrão de 2 colunas.
04Raio

O raio vem do tipo, não do tamanho.

Sete degraus medidos na humanacademy.ai. Um card pequeno e um card largo têm o mesmo canto; seção não tem canto nenhum. Imagem não tem raio próprio: quem corta é o card.

A escala
2xs
4px

Peça interna de um card com respiro: ícone, poço de imagem.

xs
8px

Peça interna pequena: tile de interface, miniatura.

sm
12px

Campo de formulário e dica.

md
16px

Peça interna grande de um painel.

lg
20px

Todo card, de qualquer tamanho.

xl
28px

Painel, modal, linha de FAQ e ilha escura.

full
9999px

Todo botão, chip e pílula.

Aninhamento
xl 28 − 12 = md 16
lg 20 − 24 → 2xs 4
exceção: card de mídia → lg 20 (não 2xs)

Raio interno = max(raio externo menos o respiro, 4). Vale para a peça que mora dentro de um card ou painel (ícone, poço de imagem, tile). Um card dentro de uma ilha continua card: lg. Exceção: card de mídia (imagem/3D/vídeo) aninhado usa raio próprio lg 20, mesmo quando a conta daria 2xs: um raio de 4px quebra numa peça grande. Marque com data-raio="midia".

05Movimento

Duas curvas, quatro durações.

Easing e duração saem de lib/motion.ts. Com movimento reduzido tudo cai para quase zero, e a peça continua legível e no mesmo lugar.

EASE_OUT_QUINT
cubic-bezier(0.22, 1, 0.36, 1)Entrada de qualquer coisa. O padrão.
EASE_IN_OUT
cubic-bezier(0.65, 0, 0.35, 1)O que sai e volta, como a pílula da navegação.
Tocando
Entrada de seção700ms · ease-out-quint
Troca de estado360ms · ease-out-quint
Hover e foco300ms · ease-suave
A marca respirandoA marca respira em 8s, sem parar.
Durações
200ms
0.3s · hover, foco, troca de cor
360ms
0.36s · menu, troca de estado
600ms
0.6s · navegação encolhendo
700ms
0.7s · entrada de seção

A entrada de seção é o Reveal: opacidade de 0 a 1 e 12px de subida, com margem de -10%, uma vez só. Escalona por atraso de 80ms, nunca por duração diferente.

063D

Renderizado fora, servido como vídeo.

As peças 3D nascem no Blender e chegam ao site como vídeo mudo em loop, com pôster. O único WebGL é a órbita do hero, carregada só no cliente e com pôster quando não há WebGL ou o movimento está reduzido.

Regras
formato
mp4 (H.264) e webm; mov HEVC com alfa para o Safari
proporção
3:2 nos pilares, a moldura tem a mesma
reprodução
mudo, loop, inline, play só no cliente
movimento reduzido
parado no pôster
material
vidro e metal na paleta, sem cor fora dela
arquivo ausente
decidido no build: sem vídeo, só o pôster
07Botão

Dois, e sempre pílula.

Sólido para a ação principal, contorno para a secundária. Um sólido por tela. O rótulo diz o que acontece ao clicar. Raio full em todo botão, de qualquer tamanho. Toda variante leva a seta, que é a única parte que se mexe.

Variantes e estados
com ícone
desabilitado

No hover a seta sai pela direita e outra entra pela esquerda (300ms), sem glow e sem sombra. O sólido inverte em 200ms e as letras embaralham. O contorno muda só as letras e a seta. Com movimento reduzido, a seta não anda. Foco: contorno de 1px em fg, afastado 4px, igual em todo o sistema.

Medidas
altura
40px (seta de 28px com 5px de respiro)
respiro lateral
20px à esquerda, 5px à direita da seta
seta
círculo de 28px, borda na cor do texto, flecha de 12px
raio
full
texto
text-button, peso 500
08Campo

Um campo, e o erro sem cor.

Uma linha de classes para todo formulário do site. Campo de uma linha é pílula; a área de texto usa o raio sm. Erro se marca por borda cheia, ícone e palavra.

Estados
Esse endereço não parece completo.
09Escolha

Marcar, escolher, ligar.

Os três usam o controle nativo escondido com sr-only: foco, toque, tecla de espaço e leitor de tela continuam sendo os do navegador, e só a aparência é nossa.

Marcar e escolher
10Etiqueta

Chip e situação.

Chip é pílula, como o botão. Selecionado é inversão. Situação é ícone mais palavra, nunca uma bolinha colorida.

Chip
TodosMarcaPresençaConexão
Situação
EntregueEm andamentoFaltam as artes do patrocinador
11Card

Um card, um canto.

Linha cheia de 1px e raio lg, sempre, do card do rodapé ao card do método. Imagem dentro dele não tem raio próprio: o card corta. Ativo inverte.

RepousoCard
AtivoInverte, não escurece
Com imagemA imagem encosta na borda e o card corta.
13Ícones

132 ícones, um traço só.

Grade de 24 e traço 1,5. Contorno, preenchido para o glifo que só existe como massa, e o ponto de ênfase onde o traço não faz pingo.

Marca e forma · 6
losangolosango
losango-vaziolosango-vazio
pilhapilha
quadradoquadrado
circulocirculo
triangulotriangulo
Direção · 20
seta-direitaseta-direita
seta-esquerdaseta-esquerda
seta-cimaseta-cima
seta-baixoseta-baixo
seta-diagonalseta-diagonal
chevron-direitachevron-direita
chevron-esquerdachevron-esquerda
chevron-cimachevron-cima
chevron-baixochevron-baixo
primeiraprimeira
ultimaultima
desfazerdesfazer
refazerrefazer
atualizaratualizar
sincronizarsincronizar
expandirexpandir
recolherrecolher
tela-cheiatela-cheia
movermover
arrastararrastar
Interface · 17
menumenu
fecharfechar
maismais
menosmenos
conferidoconferido
opcoesopcoes
opcoes-verticalopcoes-vertical
gradegrade
listalista
barra-lateralbarra-lateral
colunascolunas
filtrarfiltrar
ordenarordenar
buscabusca
externoexterno
olhoolho
olho-fechadoolho-fechado
Ação · 13
editareditar
apagarapagar
copiarcopiar
cortarcortar
anexaranexar
enviarenviar
compartilharcompartilhar
baixarbaixar
subirsubir
imprimirimprimir
marcadormarcador
etiquetaetiqueta
favoritofavorito
Estado · 15
alertaalerta
informacaoinformacao
perguntapergunta
sucessosucesso
erroerro
proibidoproibido
carregandocarregando
sinosino
sino-mudosino-mudo
atividadeatividade
raioraio
escudoescudo
cadeadocadeado
cadeado-abertocadeado-aberto
chavechave
Tempo e lugar · 7
relogiorelogio
historicohistorico
calendariocalendario
ampulhetaampulheta
locallocal
mundomundo
bussolabussola
Conteúdo · 11
notanota
pastapasta
imagemimagem
videovideo
cameracamera
somsom
mudomudo
microfonemicrofone
livrolivro
caixacaixa
cartaocartao
Dado · 5
grafico-linhagrafico-linha
grafico-barrasgrafico-barras
grafico-radargrafico-radar
tabelatabela
painelpainel
Pessoas · 9
pessoapessoa
pessoaspessoas
adicionar-pessoaadicionar-pessoa
balaobalao
baloesbaloes
emailemail
telefonetelefone
respostaresposta
instagraminstagram
Mídia · 7
tocartocar
pausarpausar
pararparar
anterioranterior
proximoproximo
repetirrepetir
aleatorioaleatorio
Construção · 14
codigocodigo
terminalterminal
repositoriorepositorio
commitcommit
bugbug
engrenagemengrenagem
ferramentaferramenta
servidorservidor
banco-de-dadosbanco-de-dados
cpucpu
nuvemnuvem
nuvem-sobenuvem-sobe
wifiwifi
bateriabateria
Texto · 8
negritonegrito
italicoitalico
sublinhadosublinhado
lista-marcadalista-marcada
citacaocitacao
linklink
titulotitulo
alinhar-esquerdaalinhar-esquerda
14Mídia 3D

Os pilares em vidro.

A moldura do pilar é um card na proporção do render; o vídeo encosta na borda sem raio próprio. Nenhum objeto 3D é letra: a Marca é um carimbo de vidro.

Pilar3D · marca

Marca

  • Branding
  • Identidade visual
  • Copywriting
Pilar3D · presença

Presença

  • Design e desenvolvimento
  • Agentes de IA
  • Social media
  • Vídeo
15Vidro

Vidro que deixa a luz passar.

O material dos botões, chips, cards e do formulário. Desfoque de 24px com saturação de 170%, tinta translúcida (8% no escuro, 55% no claro), aresta de 1px clara em cima e escura embaixo, reflexo de cima para baixo e sombra macia. No hover o reflexo segue o mouse, sem glow. Desfoque vivo só em peça pequena; container grande usa o vidro estático. Sem suporte ou com transparência reduzida, a tinta fica opaca.

ChipVidroAtivo
vidroCard pequeno: desfoque vivo, reflexo segue o mouse.
vidro-estaticoContainer grande: mesmo desenho, sem backdrop-filter.
ChipVidroAtivo
vidroCard pequeno: desfoque vivo, reflexo segue o mouse.
vidro-estaticoContainer grande: mesmo desenho, sem backdrop-filter.
Tokens
vidro
backdrop-filter: blur(24px) saturate(170%) · botão, chip, card pequeno
vidro-estatico
sem backdrop-filter · formulário, FAQ, card de seção
--vidro-tinta
rgb(255 255 255 / .08) no escuro · / .55 no claro
--vidro-aresta-topo / -base
inset 1px: branco .18 em cima, preto .35 embaixo
--vx / --vy
posição do reflexo no hover (VidroLuz.tsx, 1 listener delegado)
fallback
@supports not backdrop-filter e prefers-reduced-transparency: --vidro-opaco
16Diagramação

Duas colunas, alinhadas pelo topo.

O eyebrow fica em cima das duas colunas. O título ocupa a esquerda e o texto a direita, os dois começando na mesma linha. O texto respeita a medida de corpo, 760px, e o título quebra para acompanhar a altura dele.

O padrão
01 · Eyebrow sobre as duas colunas
Título à esquerda
Texto à direita, no topo, com no máximo 760px de medida.
Medidas
entre seções
144px no desktop, 96px no telefone
eyebrow e colunas
24px
coluna de texto
760px (medida-corpo)
telefone
uma coluna, título em cima do texto
17Ritmo

O escuro abre e fecha, o claro conta.

O meio da página é claro, alternando luz e bruma, com corte seco entre faixas. No máximo uma ilha escura para cada duas faixas claras, e uma faixa escura inteira para a oferta. O gate ritmo-de-secoes confere a home a cada commit.

A home, faixa por faixa
  1. 01 · Heroescuro
  2. 02 · Origemluz
  3. 03 · Marcabruma
  4. 04 · Presençaluz
  5. 05 · Conexãobruma
  6. 06 · Provaluz
  7. 07 · Ofertaescuro
  8. 08 · Método, com ilhabruma
  9. 09 · Quem somos, FAQ, conviteescuro
Regras
claro seguido
nunca o mesmo tom duas vezes
ilha escura
raio xl, recuada das bordas, 1 a cada 2 faixas claras
corte
seco, sem degradê
brilho
mesma família: 20% no claro, 28% no escuro
navegação
troca de tinta com a faixa embaixo
18Voz

As palavras também são o design.

pt-BR direto, sem jargão, sem travessão e sem exclamação. O número vem antes do adjetivo. Duas destas regras têm gate e reprovam o commit.

Em vez de, escreva
RegraEm vez deEscreva
TravessãoUma coisa — e outraUma coisa, e outra
PromessaO melhor retorno garantidoO que a entrega inclui, por escrito
JargãoAtivação 360 de awarenessSua marca no palco, no crachá e no estande
19Acessibilidade

O que não é negociável.

Foco visível, alvo grande, controle nativo, contraste medido nos dois lados e movimento que se desliga de verdade.

Foco

Contorno de 1px em fg, afastado 4px, declarado uma vez na folha global.

Alvo de toque

44px de altura em tudo que se clica com o dedo.

Controle nativo

Marcar, escolher e ligar usam o input do navegador escondido com sr-only.

Contraste

Texto de leitura acima de 4,5 para 1 no claro e no escuro. Fumaça no claro só a partir de 18px.

Movimento reduzido

Animação e transição caem para 0,01ms; vídeo 3D fica no pôster.

Cor nunca sozinha

Erro e situação carregam ícone e palavra.

20Gates

O que defende tudo isto.

O sistema se sustenta por gate, não por disciplina. Cada regra que podia ser furada em silêncio virou um programa que reprova o commit, e cada gate nasce com uma mutação que prova que ele fica vermelho.

16 gates, todos rodam sempre
GateO que reprova
sem-travessaoTravessão em texto que uma pessoa lê.
lista-de-gatesGate que existe no package.json e não roda.
checkeslint, tsc e os testes.
buildO build estático, com as duas páginas no lugar.
sem-hypePromessa sem base na copy.
paleta-nexyoCor fora da paleta clara e escura: hex, rgb, hsl, oklch, nome de cor ou classe de cor de fábrica do Tailwind.
escala-tipograficaTamanho de fonte cru fora da escala.
links-vivosLink morto na documentação.
peso-do-bundleBiblioteca pesada no JS inicial de uma rota.
raio-na-escalaRaio fora da escala 4, 8, 12, 16, 20, 28 e full, classe de raio de fábrica do Tailwind e contorno sem classe de raio.
composicao-larguraMedida de leitura errada para o tamanho do texto e margem lateral fora do token.
sem-particulasO efeito de pontos do hero antigo voltando para a home.
ritmo-de-secoesDuas faixas claras seguidas no mesmo tom, página que não abre e fecha no escuro, ilha demais e tom claro sem os tokens de texto do claro.
sem-letra-3dSem descrição nesta página.
textos-patrocinioSem descrição nesta página.
transicao-suaveSem descrição nesta página.
A fonte da verdade

Esta página lê app/tokens.css, app/globals.css, lib/motion.ts e scripts/gates.txt no build, e os componentes vêm de components/ds. Entre o que está escrito e o que o código faz, o código vence.