fix(home): oferta leva ao formulário, ofertas logo depois da vitrine
O botão das ofertas rola até o contato com o tipo marcado e não quebra mais as âncoras; ofertas com o que você recebe e primeiro passo, logo depois da vitrine; bloco de IA fora da home; cartão largo da SEV no hero do celular; separador da faixa de clientes só entre itens; favicon de 13 para 1,8 KB; pré-carregamento só no hover e nunca de /#... fora da home; X do menu e cabeçalho opaco; WhatsApp com "o case"; /ia com 3 passos e modelo de relatório ilustrativo; Sobre alinhado ao currículo; CSP Report-Only com os domínios do Ads.
This commit is contained in:
1 parent
fc44a69fb3
commit
9e2d65a926
51 files changed
+1730
-420
No files matched your search
@@ -0,0 +1,44 @@
|
||||
import { HERO_CAPTIONS } from "./hero-captions";
|
||||
|
||||
/*
|
||||
* Sem janela de rolagem sem texto no mergulho do hero: o texto do hero sai de cena e as legendas entram uma depois da
|
||||
* outra (globals.css lê --from e --to de cada item). Aqui ficam as garantias sobre os trechos; o e2e de rolagem
|
||||
* (e2e/scroll.spec.ts) confere, no navegador, que nenhuma posição amostrada fica sem texto.
|
||||
*/
|
||||
|
||||
/** O texto do hero some em `1 / 4,2` do progresso: `opacity: calc(1 - var(--hero-p) * 4.2)` em globals.css. */
|
||||
const HERO_TEXT_GONE = 1 / 4.2;
|
||||
/** Maior intervalo sem legenda entre duas: 0,1 de progresso são cerca de 100 px de rolagem. */
|
||||
const MAX_GAP = 0.1;
|
||||
|
||||
describe("hero dive captions", () => {
|
||||
it("has three captions, each with a valid range, in the order of the scene layers", () => {
|
||||
expect(HERO_CAPTIONS).toHaveLength(3);
|
||||
for (const { from, to } of HERO_CAPTIONS) {
|
||||
expect(from).toBeGreaterThanOrEqual(0);
|
||||
expect(to).toBeGreaterThan(from);
|
||||
}
|
||||
for (let i = 1; i < HERO_CAPTIONS.length; i++) {
|
||||
expect(HERO_CAPTIONS[i].from).toBeGreaterThanOrEqual(
|
||||
HERO_CAPTIONS[i - 1].from,
|
||||
);
|
||||
expect(HERO_CAPTIONS[i].to).toBeGreaterThan(HERO_CAPTIONS[i - 1].to);
|
||||
}
|
||||
});
|
||||
|
||||
it("starts the first caption before the text of the hero is gone", () => {
|
||||
expect(HERO_CAPTIONS[0].from).toBeLessThanOrEqual(HERO_TEXT_GONE);
|
||||
});
|
||||
|
||||
it("leaves a short gap, at most 0.1 of the dive, between one caption and the next", () => {
|
||||
for (let i = 1; i < HERO_CAPTIONS.length; i++) {
|
||||
expect(
|
||||
HERO_CAPTIONS[i].from - HERO_CAPTIONS[i - 1].to,
|
||||
).toBeLessThanOrEqual(MAX_GAP);
|
||||
}
|
||||
});
|
||||
|
||||
it("keeps the last caption on stage past the end of the dive, until Projects covers it", () => {
|
||||
expect(HERO_CAPTIONS[HERO_CAPTIONS.length - 1].to).toBeGreaterThan(1);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user