Correção (14/08/2026): a versão original desta spec assumia que o grupo de origem (
229:61) era uma cópia solta no canvas, sem relação com o frame de 1440px da página, e derivava o container por alinhamento interno do próprio grupo. Isso estava errado e produzia a seção 103px à esquerda e 256px acima do design real. A seção abaixo documenta o sistema de coordenadas correto, validado por decodificação pixel a pixel do render 1:1 do Figma.
O grupo real desta seção é 101:289 (Group 1000002336), filho direto do frame 101:79 ("App Landing Page", 1440×5887) em x=46, y=943. Ou seja, os nós desta seção usam o mesmo espaço de coordenadas do frame que a navbar (101:222) e o Hero — não um espaço próprio.
A seção começa logo abaixo do Hero, em frame y=687 (fim do Hero: y=100 + 587 de altura). Os valores de código (DECOR, margens) são (frameX − 175, frameY − 687), com 175 sendo a borda esquerda do container, igual ao resto da página.
A coluna de texto (101:299) fica em frame x=730, 638px de largura — 103px além da borda direita do container de 1090px (175 + 1090 = 1265; o texto vai até 730 + 638 = 1368). Essa não é uma inconsistência do design: o frame do Figma tem 1440px de largura, e o texto desta seção é posicionado contra esse frame inteiro, não contra o container de 1090px usado pela navbar/Hero. Decisão tomada com o usuário: manter fidelidade ao Figma — o texto assume a posição exata (x=730) a partir de 1440px de viewport, e cai para um fallback colado à borda do container (sem cortar) entre 1024px e 1439px.
Medições de tinta no render 1:1 do Figma (PNG decodificado localmente, varredura de faixas de luminância) confirmam a tabela abaixo com exatidão:
| Elemento | Figma (frame) | Medido no browser |
|---|---|---|
| eyebrow "FEATURES" | 731, 1071 |
730, 1071 |
h2 "Uifry Premium" |
731, 1103 |
730, 1103 |
| título do bloco 1 | 763, 1183 |
762, 1183 |
| ícone do bloco 1 | — | 730, 1185 |
| Elemento | Node | Topo | Especificação |
|---|---|---|---|
Eyebrow features |
101:302 |
384 | Clash Display Medium (500), 18px/28px, uppercase, letter-spacing: 2.88px, #FF5555 (text-accent) |
Título uifry premium |
101:301 |
416 | Clash Display Bold (700), 48px/48px, capitalize, preto |
| Feature 1 — título | 101:305 |
496 | Clash Display Semibold (600), 18px/28px, capitalize, preto |
Feature 1 — ícone star-05 |
101:306 |
498 | 24×24, gap: 8 até o título |
| Feature 1 — corpo | 101:307 |
536 | Clash Display Medium, 18px/28px, capitalize, text-black/50, 638px |
Feature 2 (cube-02) |
101:310–101:312 |
624 / 626 / 664 | idem |
Feature 3 (cube-04) |
101:315–101:317 |
752 / 754 / 792 | idem |
Ritmo vertical (inalterado pela correção): eyebrow → título 4px (mt-1), título → 1º bloco 32px (mt-8), título do bloco → corpo 12px (mt-3), corpo → próximo bloco 32px (mt-8, passo de 128px entre blocos). Isso é implementado via pt-[384px] na <section> + margens relativas entre os elementos, não top absoluto por elemento.
Posições/tamanhos são os do asset renderizado, obtidos ancorando a geometria interna de cada SVG (retângulo do telefone, elipses do glow) contra a caixa do node correspondente no Figma. Ambos resolveram escala 1.00.
| Elemento | Node de referência | Posição (frame) | DECOR (offset desde o topo da seção) |
Asset |
|---|---|---|---|---|
| iPhone + anéis + glow | 101:323 (telefone) e 101:95 (elipses) |
41.845, 943 |
left: -133.155, top: 256, width: 724, height: 761 |
public/imgs/iphone-section-2.svg |
| Glow laranja direito | 101:89 |
1167.845, 1020.553 |
left: 992.845, top: 333.553, width: 507, height: 444 |
public/imgs/orange-detail-right.svg |
Ambos conferidos por getBoundingClientRect() no browser: 41.9,943 e 1167.8,1020.5 — dentro de 0.1px do alvo.
Os 3 ícones (star-05, cube-02, cube-04) foram exportados via download_assets, mas o export trouxe apenas o layer interno Icon (a "folha"), sem o padding do frame de instância 24×24 que o Figma aplica (inset-[8.33%]/inset-[8.93%_12.5%]/inset-[12.5%]). Os SVGs em public/icons/ foram reconstruídos com viewBox 0 0 24 24 e o path recentralizado no padding correto (1px para star-05; ~2×1.14px para cube-02; 2px para cube-04), preservando o stroke="#FF5555" stroke-width="2" original.
- Peso 600 da Clash Display: os títulos dos blocos de feature são Semibold, peso que o Fontshare não carregava (
layout.tsxsó pedia 500/700). Adicionado600à query string do link. - Nome de arquivo sem espaço:
orange-detail-section-2 right.svgrenomeado paraorange-detail-right.svg— evita a armadilha de URL-encoding de espaço emsrcdonext/image. - Mobile (<
lg): diferente do Hero (que esconde todo decorativo), aqui o iPhone é o único elemento visual da seção — decidido com o usuário manter o SVG do iPhone visível, empilhado e centralizado acima do texto (h-[420px] w-[400px], em fluxo,object-contain), trocando para posicionamento absoluto no tamanho exato do design a partir delg. O glow laranja da borda direita (sangramento de canto) ficahidden lg:block, como no Hero. - Um único
<Image>para o iPhone: a primeira versão tinha dois<Image>do mesmo SVG (umlg:hidden, umhidden lg:block) — o wrapper escondido por CSS não impede o download do recurso, então o asset de 545KB baixava duas vezes. Substituído por um único wrapper cujas classes mudam de posicionamento (relative/mobile →lg:absolute/desktop) em vez de duplicar o elemento. - Texto alinhado à esquerda em todas as larguras: diferente do título centralizado do Hero no mobile — aqui o conteúdo é uma lista (eyebrow + título + 3 blocos), que lê melhor alinhada à esquerda mesmo em telas pequenas.
- Duas faixas de layout desktop (
lge≥1440px): entre 1024px e 1439px de viewport, o texto ficaria cortado se assumisse a posição exata do Figma (x=730,730+638=1368 > 1090do container). Nessa faixa o texto fica colado à borda direita do container (lg:max-[1439px]:ml-[452px]); a partir de 1440px assume o offset exato do Figma (min-[1440px]:ml-[555px]). As duas variantes usam faixas de media query mutuamente exclusivas (uma commax-[1439px]) em vez de duas regras de mesma especificidade — Tailwind não garante que o bloco gerado para um breakpoint customizado (--breakpoint-design, abordagem descartada) apareça depois do delgno CSS final; a tentativa inicial comdesign:ml-[555px]perdia o empate de cascata paralg:ml-[452px]em viewports ≥1440px. overflow-x-cliptambém em<html>: o glow direito e o texto agora sangram até 234px além da borda direita da seção em viewports largos — sangramento intencional (o próprio design do Figma extrapola os 1440px de frame nesse ponto).overflow-x-clipsó no<body>(como já era desde o Hero) não impediu um scroll horizontal real de ~143px nesse cenário — o body ficava com a caixa corretamente recortada, mas<html>(o elemento de rolagem efetivo) continuava comoverflow-x: visiblee permitiascrollTo/roda do mouse moverem a página. Adicionadooverflow-x-cliptambém em<html>(layout.tsx) para fechar a rota de scroll pela raiz, não só pelo body.
src/components/sections/Features.tsxsrc/app/layout.tsx(peso 600 da Clash Display;overflow-x-clipem<html>)src/app/page.tsx(renderiza<Features />depois do<Hero />)public/imgs/iphone-section-2.svg,public/imgs/orange-detail-right.svgpublic/icons/star-05.svg,public/icons/cube-02.svg,public/icons/cube-04.svg
- Build (
npm run build), lint etsc --noEmitsem erros. - Eyebrow, título e os 3 blocos conferidos por
getBoundingClientRect()contra as coordenadas do Figma em viewport ≥1440px — batem exatamente (x=730,yde 1071/1103/1183/1185/1223/1311/1351/1439/1479...). - Viewport 1024–1439px: texto sem corte, colado à borda do container (
x=627), sem regressão nas posições verticais. - Peso 600 da Clash Display carregado (
document.fonts.check('600 18px "Clash Display"')→true). - iPhone e glow laranja conferidos por
getBoundingClientRect()contra a posição derivada do node (41.9,943e1167.8,1020.5, dentro de 0.1px do alvo). - Ícones renderizados no tamanho e posição corretos (24×24, alinhados ao centro da linha do título).
- Sem caixas brancas nos decorativos do Hero (badge-card, estrelas) — ver
02-hero.md. - Sem scroll horizontal real (
scrollWidth === clientWidthescrollXnão muda apósscrollTo) em 495px, 1394px e 1638px de viewport. - SVG do iPhone (545KB) baixado uma única vez (
performance.getEntriesByType('resource')), não duas. - Viewport mobile (~495px): iPhone empilhado centralizado acima do texto, texto alinhado à esquerda.
- Link "features" da navbar aponta para
#features, que existe na página.