Documentação viva

Design system

Tudo que existe no site aparece aqui. Se um componente novo não couber nesta página, ele provavelmente não deveria existir.

01

Superfícies

O mecanismo central. Cada superfície reescreve os tokens semânticos, e os componentes dentro dela se adaptam sozinhos. Repare que o mesmo botão muda de cor sem nenhuma classe extra.

.surface--paper

Texto e título

Parágrafo em texto corrido, com um link no meio.

Primário Outline

.surface--paper-2

Texto e título

Parágrafo em texto corrido, com um link no meio.

Primário Outline

.surface--navy

Texto e título

Parágrafo em texto corrido, com um link no meio.

Primário Outline

.surface--teal

Texto e título

Parágrafo em texto corrido, com um link no meio.

Primário Outline

.surface--lime

Texto e título

Parágrafo em texto corrido, com um link no meio.

Primário Outline

.surface--teal-display

Só título grande

Teal da marca cheio. Texto pequeno amarelo aqui reprova em AA, por isso esta superfície é para blocos de display, e o texto corrido usa branco.

02

Cores e contraste

As três cores da marca foram amostradas pixel a pixel do deck original. As razões abaixo são WCAG 2.1 calculadas, não estimativas.

Navy
#081853 --navy-800 · marca
Teal
#0A8195 --teal-600 · marca
Amarelo
#F2F6A1 --lime-500 · marca
Teal texto
#076374 --teal-800 · seção com texto
Teal interação
#0A6A7B --teal-700 · link, botão, foco
Navy profundo
#050F36 --navy-900 · rodapé
Creme
#FCFDEE --lime-50 · fundo suave
Tinta
#0E1220 --ink · texto em fundo claro

Regras de contraste

Razões de contraste entre as cores da marca
Combinação Razão Uso permitido
#F2F6A1 sobre #081853 14.5:1 qualquer texto
#FFFFFF sobre #081853 16.5:1 qualquer texto
#081853 sobre #F2F6A1 14.5:1 qualquer texto
#0E1220 sobre #FFFFFF 18.7:1 qualquer texto
#5A6470 sobre #FFFFFF 6.0:1 qualquer texto
#0A6A7B sobre #FFFFFF 6.3:1 links e botões
#FFFFFF sobre #076374 6.9:1 qualquer texto
#FFFFFF sobre #0A8195 4.63:1 corpo, no limite
#F2F6A1 sobre #0A8195 4.08:1 só display grande
#081853 sobre #0A8195 3.55:1 só display grande
03

Tipografia

Chau Philomene One nos títulos, Montserrat no corpo. Escala fluida em clamp(): cresce sozinha entre 360px e 1280px de viewport, sem media query.

--fs-display · Chau Philomene One 400

Transformar problemas

--fs-h1 · Chau Philomene One 400

Título de página

--fs-h2 · Chau Philomene One 400

Título de seção

--fs-h3 · Chau Philomene One 400

Título de cartão

.eyebrow · Chau Philomene One 400

Sobrescrito de seção

.lead · Montserrat 400

Parágrafo de abertura. Um pouco maior que o corpo, usado logo abaixo dos títulos para dar o contexto da seção.

corpo · Montserrat 400 · 17px

Texto corrido. A medida é limitada a 42rem pela classe .measure porque linha longa demais cansa a leitura.

.muted · Montserrat 400

Texto secundário, para observações e complementos.

04

Espaçamento

Base de 4px. Nada de valor solto no CSS dos componentes.

--space-2 · 8px
--space-4 · 16px
--space-6 · 32px
--space-8 · 48px
--space-10 · 80px
--space-12 · 128px
06

Cartões

.card--action

Cartão de ação, com ícone grande e texto secundário.

.card--actor

Cartão de ator do ecossistema: ícone em medalhão, centralizado.

.card--pillar

Pilar: sem moldura, para trios de conceito.

07

Listas

.criteria

  1. Primeiro critério da lista
  2. Segundo critério da lista
  3. Terceiro critério da lista

.check-list

  • Item confirmado
  • Outro item confirmado

.flow-list

  1. Origem → Destino Descrição do fluxo entre dois atores.

.badge

Neutro Destaque Discreto

O discreto existe para estado que não é destaque nem problema, como uma situação pendente. Ele não usa a cor de erro de propósito: não estar ativo não deu errado com ninguém.

08

Citação

Empreendedorismo é a arte de transformar problemas em oportunidades Deck institucional, agosto de 2024

09

Formulário

Estrutura pronta, envio não. Nesta fase o site é estático: o back-end entra na fase 3 do roadmap.

Demonstração de componente: este formulário não envia nada.

Quanto mais contexto, melhor a resposta.
10

Ícones

Sprite único em assets/icons/sprite.svg, traço 1.6 em grade 24×24, sempre currentColor.

i-users

i-cap

i-handshake

i-donate

i-society

i-network

i-medal

i-sprout

i-bulb

i-tools

i-journey

i-arrow-right

i-check

i-mail

i-phone

i-chat

i-linkedin

i-instagram

i-pin

i-menu

i-globe

11

A marca

Um único PNG de máscara (koi-mask.png) pintado por background-color: currentColor. Por isso o koi acompanha a cor de qualquer superfície sem gerar arquivo novo.

em .surface--navy

em .surface--lime

em .surface--teal

Texto sobre o koi: a chapa

O koi é desenho de linha: texto por cima dele perde contraste onde uma linha passa e recupera onde não passa, e é essa oscilação que cansa a leitura. Onde os dois se encontram entra uma chapa translúcida (color-mix(in srgb, var(--bg) 62%, transparent)) com borda em degradê. A borda macia é o ponto: chapa de corte reto sobre um desenho lê como adesivo colado, porque anuncia duas camadas separadas. Dissolvida, o koi atravessa e as duas viram a mesma imagem. Vale para .cta-band__inner e para o .panel dentro de um .split__media que tenha koi.

A chapa é a cor da própria superfície por cima do traço, e é por isso que ela só resolve legenda curta: lime a 62% sobre lime clareia o koi, nunca o apaga. Onde há texto de corpo do alto ao pé do cartão, o traço volta a cruzar linha por linha, e aí o que resolve não é mais opacidade e sim tirar o desenho de baixo do texto. Esse é o caso do .person em contato.html, o único painel-com-koi nessa situação. Ele usa a mesma chapa, só que mais densa no miolo (94% no centro, morrendo em transparente na borda). Nada muda em espécie, só em dose: o degradê continua sendo o mesmo desenho centrado, e o koi segue atravessando o cartão pelas bordas, que é o que impede a chapa de virar retângulo colado.

O koi atravessa o texto

A mesma regra em qualquer superfície

12

Primeira dobra

.hero--full fecha uma tela: 100svh − --header-real − --hero-peek. A espiada é dimensionada para caber conteúdo da seção seguinte (testeira + primeira linha do título), não só o padding dela, e por isso .hero--full + .section tem o topo reduzido. Convidam a rolar duas coisas: esse conteúdo espiando na borda e o .scroll-cue, que some assim que a pessoa rola.

O conteúdo do herói entra escalonado por animação de CSS no carregamento, sem observer, sem classe pendurada. Não existe caminho em que algo fique invisível. O site não tem revelação ao rolar: conteúdo aparece quando existe.

Role para conhecer

.scroll-cue: a seta pulsa; a animação para no hover e sob prefers-reduced-motion

13

Área de trabalho

O site é para ler; a área de membro é para editar. São coisas diferentes, e .workspace é onde essa diferença vira CSS.

Ele é o mesmo mecanismo das superfícies, num eixo ao lado: assim como .surface--navy reescreve a cor de tudo que cai dentro dela, .workspace reescreve o tamanho. Campo, botão, rótulo e cartão encolhem juntos, sem que nenhum deles precise de uma variante própria.

Ele é densidade e nada mais: uma coluna, e sem opinião sobre largura, que quem o usa define com .measure. Houve aqui um modificador de duas colunas, e ele saiu funcionando: com os campos já densos, a segunda coluna resolvia um problema que a densidade tinha resolvido antes, e desalinhava a área de edição do resto da página.

Corpo de texto do campo não encolhe, e isso é deliberado: abaixo de 16px o Safari do iPhone dá zoom sozinho ao focar um campo. Encolhe altura e respiro, nunca corpo.

.workspace: o mesmo formulário da seção 09, na densidade de edição

.select: appearance: none apaga a decoração do sistema e a seta volta como ícone nosso. A lista aberta é desenhada pelo sistema operacional e nenhuma folha de estilo entra ali, por isso os rótulos nascem em caixa mista no JS: fechado o CSS levanta para versalete, aberto o sistema mostra o texto como ele é.

.progress: as três etapas da importação de currículo

A etapa em curso recebe o koi da marca nadando; as vencidas, um visto. O estado é classe, nunca animação: com movimento desligado a trilha continua dizendo onde está, porque visto, koi e círculo vazio são formas diferentes e não velocidades diferentes. A trilha inteira é aria-hidden: quem anuncia é o role="status" ao lado dela.

.skeleton: o formato do que vem, antes de ele vir

Não é enfeite de espera, é promessa de forma: quem olha já sabe que vai receber campos, quantos e de que tamanho, então a troca pelo texto de verdade não reorganiza a tela debaixo do olho de ninguém. Só token semântico, então ele funciona em qualquer superfície sem uma variante por cor.

14

Cartão de membro

O retrato de uma pessoa numa grade. Ele é montado por assets/js/cartao-membro.js, que não conhece Firebase: a galeria do painel e os cartões públicos de mentor usam o mesmo construtor, e o que é do painel fica atrás de uma opção.

Fabio Augusto Ramalho, o Xuxa

Desenvolve negócios e tecnologia, cria produtos do zero e estrutura operações comerciais

Papel: Admin Situação: Ativo

Constrói produtos e estrutura áreas comerciais em startups. No mercado de energia, dobrou o faturamento anual de uma startup por 3 anos seguidos, montou o times técnicos do zero e desenhou processos que hoje sustentam a operação.

Quem acabou de entrar

Papel: Visitante Situação: Pendente

Perfil ainda não preenchido.

.member-card, sobre .card e .card--koi, dentro de .surface--lime

É o mesmo cartão em toda tela que mostra gente: a galeria do painel e a galeria pública de mentores usam o mesmo tamanho, a mesma lista de referências e a mesma bio de oito linhas. Existiu uma versão encolhida para caber num terço de tela, com ícone sem rótulo no lugar da lista; ela saiu porque lia mais como um crachá do que como a apresentação de alguém, e uma grade de três colunas já entrega a largura sem precisar apertar o conteúdo. Na galeria de mentores o selo de papel sai, porque a página já se chama "Nossos mentores" e um selo idêntico em cada cartão só repetiria o título.

A lima com o koi atrás é a composição do "Fale com a gente", e num cartão de pessoa ela paga duas contas de uma vez: é a marca, e é a textura que ocupa a sobra de quem escreveu pouco. A chapa radial em cima do koi é a mesma do .person, na dose fechada, porque aqui também há texto de corpo do alto ao pé. A ordem de pintura é fundo, koi, chapa, texto, e ela existe em duas linhas de z-index negativo dentro de um isolation: isolate.

Título corta em duas linhas e o "sobre" em oito, sempre no CSS e nunca na string: o texto inteiro continua no documento, então a busca do navegador acha e o diálogo de detalhe mostra tudo. Quem não tem foto recebe o koi no lugar dela, mais forte que o do fundo, para os dois não parecerem dois carimbos soltos.

O segundo cartão não tem rodapé, e não é esquecimento: quem não tem nenhuma referência não ganha o bloco, porque a borda de cima dele viraria um risco solto no pé do cartão.

Houve um "Ver perfil" no rodapé, e ele saiu quando cartão e diálogo diziam a mesma coisa. Isso mudou em mentores.html: o diálogo de lá mostra título e "sobre" por inteiro, sem o corte de duas e oito linhas que o cartão sempre teve, e o controle de verdade voltou. Só que não no rodapé: quando comDetalhe está ligado, o nome vira um <button> com a cara de título, que é o caminho de teclado e o que existe para leitor de tela. O clique em qualquer outro ponto do cartão abre o mesmo diálogo, atalho de mouse por cima do botão.

A terceira referência do primeiro cartão está de propósito sem link: assets/js/enderecos.js só monta href para http e https, e o que ele não consegue transformar em endereço continua na tela como texto. Some o link, não some a informação, e quem administra vê o que precisa ser corrigido.

.view-switch

Quem manda no estado é o aria-pressed, lido pelo leitor de tela e pelo CSS ao mesmo tempo. Não existe uma classe de estado em paralelo justamente para não haver duas versões da verdade.

15

Cartão de projeto

O irmão do cartão de membro, montado por assets/js/cartao-projeto.js, que também não conhece Firebase. Os dois dividem .card--koi, que é a composição do koi por trás do texto: ela morava dentro do cartão de pessoa e saiu de lá quando o segundo cartão quis a mesma coisa.

Aceleradora

Seis meses ao lado de dez negócios que estão começando em Itajubá

Situação: Executando

Uma turma por semestre, com mentoria quinzenal, três workshops e uma banca no fim. O que se mede não é quantas empresas nascem, e sim quantas continuam de pé um ano depois.

.project-card, sobre .card e .card--koi, dentro de .surface--lime

Duas diferenças em relação ao cartão de pessoa, e as duas saem do que um projeto é. O logo não é redondo: círculo é recorte de rosto, onde a foto sobra por todos os lados, e marca quase sempre tem canto reto ou texto encostado na borda, que é justamente o que o círculo comeria.

E o cartão inteiro é um link, coisa que o de pessoa não é. Lá o clique abre um diálogo que repete o que o cartão já diz; aqui existe página de verdade do outro lado. Quem estica a área clicável é o .card__link::after que já existia, e o link continua sendo um só, com o nome do projeto como texto, para o leitor de tela anunciar "Aceleradora, link" em vez de uma lista de pedaços clicáveis.

O selo de situação aparece sempre, ao contrário do selo de papel na galeria de mentores. Numa página só de mentores o selo repetido não informava nada; aqui cada projeto está numa etapa diferente, e a etapa é metade do que se quer saber correndo os olhos pela grade. Destaque só para "Executando" e "Em conclusão", que são as duas em que existe trabalho acontecendo agora.

O segundo cartão é como um projeto nasce: sem logo, que vira o koi esmaecido no lugar da imagem, e sem descrição. Nenhum dos dois deixa buraco, porque um buraco desalinharia o topo de todos os cartões da fileira.