Três ofertas (site que traz pedidos pelo WhatsApp, sistema para tirar a operação da planilha, revisão de sistema existente) com miniatura e formulário com o tipo escolhido; botão principal do hero abre o WhatsApp; moldura da SEV no hero do celular; menu fecha ao navegar, Esc, foco preso incluindo a barra de cookies e espaço para ela; CinematicHome como componente de servidor com ilha cliente; /ia com H1 de oferta e cartão do que você recebe; botão flutuante em aside com transform; AVIF antes de WebP; copy sem repetir contato direto.
34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { portfolio } from "@/lib/portfolio-data";
|
|
import { loadFeaturedProjects } from "@/lib/portfolio-data.server";
|
|
import { clientNames, isClientProject, testimonials } from "@/lib/proof";
|
|
import CinematicHome from "./components/cinematic/CinematicHome";
|
|
|
|
/**
|
|
* O título da home é o `title.default` de app/layout.tsx ("Sites e sistemas em Joinville e SC | Evandro.dev.br"):
|
|
* o template do layout não se aplica à página do mesmo segmento, então não há `title` aqui.
|
|
* O canônico fica nesta página, e não no layout, para a página 404 não herdá-lo.
|
|
*/
|
|
export const metadata: Metadata = {
|
|
alternates: { canonical: "/" },
|
|
};
|
|
|
|
/** Anos de experiência vêm do próprio texto do portfólio ("5 anos de experiência"); sem o trecho, o número some. */
|
|
function yearsOfExperience() {
|
|
const match = portfolio.personal.summary.match(/(\d+)\s+anos de experi/i);
|
|
return match ? Number(match[1]) : undefined;
|
|
}
|
|
|
|
export default async function Home() {
|
|
// A home mostra só trabalho de cliente; protótipos e projetos pessoais ficam em /cases.
|
|
const projects = (await loadFeaturedProjects()).filter(isClientProject);
|
|
return (
|
|
<CinematicHome
|
|
heroStats={{ years: yearsOfExperience() }}
|
|
clients={clientNames}
|
|
projects={projects}
|
|
testimonials={testimonials}
|
|
/>
|
|
);
|
|
}
|