feat(home): prova no topo, contato sem atrito e conversão medida

Home mais curta (hero, vitrine de clientes, sobre, serviços, IA resumida, depoimentos e contato), faixa de clientes e telas reais no hero, sem números do GitHub. Barra de cookies fina, WhatsApp fixo no celular, formulário com e-mail opcional e alternativa por e-mail, página /ia, eventos de e-mail, redes e currículo e conversão do Ads opcional por variável. Rodapé em 3 colunas. Remove componentes órfãos (LighthouseMetrics, Skills, Experience, contagem do GitHub).
This commit is contained in:
Evandro Fonseca Junior committed 2026-10-14 03:32:23 -03:00
1 parent 6e1022b58c
commit 8d07b8c6bb
60 files changed
+4392 -2124

No files matched your search

@@ -0,0 +1,68 @@
import { render, screen } from "@testing-library/react";
import type { Testimonial } from "@/lib/proof";
import Testimonials from "./Testimonials";
/**
* Testes de caminhos-base de Testimonials e de initials() (complemento de Testimonials.test.tsx):
* foto presente, iniciais com 1, 2 e 3 palavras, espaços extras, e vários depoimentos.
*/
const base: Testimonial = {
quote: "Entregou no prazo combinado.",
name: "Maria Souza",
role: "Sócia",
company: "Empresa de Teste",
};
describe("Testimonials", () => {
it("path: with a photo -> shows the decorative image and no initials", () => {
const { container } = render(
<Testimonials items={[{ ...base, photo: "/clientes/maria.jpg" }]} />,
);
const image = container.querySelector("img");
expect(image).not.toBeNull();
expect(image).toHaveAttribute("alt", "");
expect(image?.getAttribute("src")).toContain("maria");
expect(screen.queryByText("MS")).toBeNull();
});
it.each([
["Maria", "M"],
["Maria Souza", "MS"],
["maria da silva souza", "MD"],
[" Maria Souza ", "MS"],
])("path: name %j without a photo -> initials %j", (name, initials) => {
const { container } = render(<Testimonials items={[{ ...base, name }]} />);
expect(container.querySelector("img")).toBeNull();
expect(
container.querySelector("span[aria-hidden='true']"),
).toHaveTextContent(new RegExp(`^${initials}$`));
});
it("path: several testimonials -> one card each, keyed by company and name", () => {
render(
<Testimonials
items={[
base,
{ ...base, name: "João Lima", company: "Outra Empresa" },
{ ...base, name: "Maria Souza", company: "Outra Empresa" },
]}
/>,
);
expect(screen.getAllByRole("listitem")).toHaveLength(3);
expect(screen.getAllByText(/Entregou no prazo/)).toHaveLength(3);
expect(screen.getAllByText("Sócia, Outra Empresa")).toHaveLength(2);
});
it("path: a testimonial with a project -> the case link points to that project", () => {
render(<Testimonials items={[{ ...base, projectId: "sc-plus" }]} />);
expect(screen.getByRole("link", { name: "Ver o case" })).toHaveAttribute(
"href",
"/cases/sc-plus",
);
});
});