Skip to content

feat(home): a landing cabe numa tela, com trama no fundo e as cartas na mao - #29

Merged
mcsscalabrin merged 1 commit into
mainfrom
feat/landing-em-uma-tela
Aug 14, 2026
Merged

feat(home): a landing cabe numa tela, com trama no fundo e as cartas na mao#29
mcsscalabrin merged 1 commit into
mainfrom
feat/landing-em-uma-tela

Conversation

@mcsscalabrin

Copy link
Copy Markdown
Owner

A home dizia três coisas — o que é, como usar, como é o resultado — espalhadas por uma página que rolava, sem eixo comum: herói alinhado à esquerda, cartas numa grade centrada, faixa de apoio com peso de bloco. Agora as três cabem juntas na tela e dividem o mesmo eixo vertical, com o cabeçalho e a faixa fechando a composição em cima e embaixo pelo mesmo fio de 1px.

Cabe numa tela

Shell ganhou landing, e só a home passa. Acima de 560px de altura o shell trava em 100dvh e o miolo centraliza no que sobra.

O ajuste é por altura, não por largura: tipografia e largura das cartas crescem em vh com teto em vw, então a composição encolhe junto em vez de estourar. Abaixo de 560px de altura a home volta a rolar de propósito — lá não há o que espremer, e "sem scroll" é uma promessa sobre a composição, não sobre a régua.

O overflow-y: clip da landing é por eixo, e não pelo atalho overflow: o horizontal já é cortado pela regra que #26 acabou de introduzir para o pacote não sair do centro no telefone, e o atalho a apagaria justamente na home.

Medido em 1440×900, 1280×720, 1512×1080 e 390×844 — scrollHeight === clientHeight nos quatro.

Fundo dithered

components/ui/DitherBackground.tsx: o Dither do React Bits portado à mão em WebGL cru. É a mesma decisão que o TiltCard já tinha tomado com o ReflectiveCard da mesma biblioteca, pelo mesmo motivo — o original roda sobre three + @react-three/fiber + postprocessing, e ~600 KB de motor 3D para desenhar um quad de tela cheia não passa num projeto de cinco dependências de runtime. Nenhuma dependência nova.

Ruído simplex somado em oitavas desenha as ondas, a imagem é quantizada em 4 níveis e uma matriz de Bayer 8×8 espalha o erro dessa quantização. Um pass só em vez dos dois do original: pixelar antes de amostrar dá o mesmo resultado que renderizar grande e reduzir depois. A saída é em alpha, não em RGB, então quem pinta o fundo continua sendo --bg — se o componente não montar (WebGL indisponível, JS desligado), a home fica exatamente como era.

Sob prefers-reduced-motion a trama congela num quadro em vez de sumir: o que incomoda é a onda andando, não o desenho existir. Pausa também com a aba oculta.

Cartas

  • Juntas, como na mão. 4% de sobreposição — mais que isso e a vizinha começa a comer os PS, que ficam no canto superior direito da arte. A apontada sobe, vem para a frente e afasta as outras duas. Quem sobe é a carta, não o item: os três rótulos ficam na mesma linha de base, que é o alinhamento que esta página existe para ter.
  • Raio proporcional (4.7cqw). Os 16px fixos foram desenhados para os 340px da página de perfil; na home a mesma carta aparece a 198 ou a 117, e ali 16px é quase 15% da largura — o canto comia a moldura impressa no PNG, que tem o próprio raio. cqw porque a medida certa é a largura da própria carta: % em border-radius mede largura na horizontal e altura na vertical, o que numa carta 5:7 devolve um canto elíptico. Os 4.7% reproduzem exatamente os 16px na largura de origem.

Um bug que veio junto

O dropdown do autocomplete pintava amarelo, e desde sempre. .search-form button (0,1,1) alcançava as sugestões, que também são <button>, e ganhava de .search-dropdown-item (0,1,0) na cascata: a lista saía com o fundo e o padding do botão de envio. O :hover do item (0,2,0) voltava a vencer, então a linha sob o cursor era a única escura — o que fazia o sintoma parecer intencional. O seletor passa a ser button[type="submit"], que é o que de fato separa os dois: um envia o formulário, os outros escolhem um nome.

Testes

Um e2e novo trava o requisito, porque a regressão aqui é silenciosa por construção — um bloco cresce alguns pixels, a barra volta, e nada quebra.

Verde: typecheck, lint, 161 unitários, e o e2e inteiro (22 casos, @stateful de fora). O / não rola de lado que veio no #26 agora cobre a landing nova.

Nota: com 4 workers neste disco o next dev frio derruba alguns casos por timeout de compilação, sem relação com o diff; serial passa tudo.

O que ficou de fora

No celular a faixa de apoio empilha em três linhas. Cabe na tela e está legível, mas fica um pouco solta — dá para apertar, se valer a pena.

…na mao

A home dizia tres coisas (o que e, como usar, como e o resultado) espalhadas por
uma pagina que rolava, sem eixo comum: heroi alinhado a esquerda, cartas numa
grade centrada, faixa de apoio com peso de bloco. Agora as tres cabem juntas na
tela e dividem o mesmo eixo vertical, com o cabecalho e a faixa fechando a
composicao em cima e embaixo pelo mesmo fio de 1px.

O ajuste e por altura, nao por largura: tipografia e largura das cartas crescem
em vh com teto em vw, entao a composicao encolhe junto em vez de estourar. O
corte fica em 560px de altura — abaixo disso nao ha o que espremer e a home volta
a rolar de proposito. O `overflow-y: clip` da landing e por eixo, e nao pelo
atalho: o horizontal ja e cortado pela regra que existe para o pacote nao sair do
centro no telefone, e o atalho a apagaria justo na home.

O fundo e o Dither do React Bits, portado a mao em WebGL cru — a mesma decisao
que o TiltCard tomou com o ReflectiveCard da mesma biblioteca, pelo mesmo motivo:
o original roda sobre three + fiber + postprocessing, e ~600 KB de motor 3D para
um quad de tela cheia nao passa no orcamento de cinco dependencias de runtime. Um
pass so em vez de dois (pixelar antes de amostrar da o mesmo resultado que
renderizar grande e reduzir depois), saida em alpha para o --bg do site continuar
mandando no fundo, e a trama congela num quadro sob prefers-reduced-motion em vez
de sumir.

As cartas de exemplo ficam encostadas, como na mao; a apontada sobe e vem para a
frente, e as outras duas se afastam. Quem sobe e a carta, nao o item — os tres
rotulos ficam na mesma linha de base.

O raio do canto passa a ser proporcional a carta (4.7cqw). Os 16px fixos foram
desenhados para os 340px da pagina de perfil; na home a mesma carta aparece a 198
ou a 117, e ali 16px e quase 15% da largura — o canto comia a moldura impressa no
PNG, que tem o proprio raio. cqw porque a medida certa e a largura da propria
carta, e `%` em border-radius mede altura na vertical, o que numa carta 5:7
devolve um canto eliptico.

Junto vai um bug que o autocomplete tinha desde sempre: `.search-form button`
(0,1,1) alcancava as sugestoes, que tambem sao <button>, e ganhava de
`.search-dropdown-item` (0,1,0) — a lista saia pintada de amarelo, com o padding
do botao de envio. O :hover do item (0,2,0) voltava a vencer, entao a linha sob o
cursor era a unica escura, e o sintoma parecia intencional. O seletor passa a ser
por tipo, que e o que de fato separa os dois.
@github-actions

Copy link
Copy Markdown

@mcsscalabrin
mcsscalabrin merged commit 971da96 into main Aug 14, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant