76 lines
2.7 KiB
TypeScript
76 lines
2.7 KiB
TypeScript
import { safeJsonLd } from "@/lib/jsonld";
|
|
import type { PortfolioProjectView } from "@/lib/portfolio-data";
|
|
import type { Testimonial } from "@/lib/proof";
|
|
import { buildOfferServicesJsonLd } from "@/lib/seo";
|
|
import About from "../About";
|
|
import type { ClientLink } from "../ClientStrip";
|
|
import Contact from "../Contact";
|
|
import Hero, { type HeroStats } from "../Hero";
|
|
import HomeFaq from "../HomeFaq";
|
|
import Projects from "../Projects";
|
|
import { displayUrl } from "../showcase/BrowserFrame";
|
|
import Testimonials from "../Testimonials";
|
|
import { WorkModalities } from "../WorkModalities";
|
|
import CinematicMain from "./CinematicMain";
|
|
|
|
/** Projeto do navegador de HeroWork (a Lavação 047), cujo endereço, se for domínio próprio, aparece na barra. */
|
|
const HERO_WORK_PROJECT = "lavacao-047";
|
|
|
|
/**
|
|
* Dados estruturados da home: as três ofertas como nós Service (provider ligado à pessoa e área de atendimento). Só elas:
|
|
* o WebSite e a Person já saem do layout, e repeti-los aqui duplicaria os dados. Sem ProfessionalService nem LocalBusiness
|
|
* (docs/seo-geo-operations.md). O script fica aqui, e não em app/page.tsx, para a página continuar devolvendo só a home.
|
|
*/
|
|
const jsonLd = {
|
|
"@context": "https://schema.org",
|
|
"@graph": buildOfferServicesJsonLd(),
|
|
};
|
|
|
|
/**
|
|
* Cenas da home, em componente de servidor: sem hooks aqui. Os hooks de rolagem e de chegada por fragmento ficam
|
|
* na ilha de cliente CinematicMain, que recebe as cenas como filhos.
|
|
* A ordem é a da conversa de venda: hero, projetos (a prova), ofertas ("Escolha por onde começar"), quem conduz,
|
|
* perguntas frequentes e contato. A revisão de app feito com IA não tem cena própria: a oferta e a FAQ levam a /ia.
|
|
*/
|
|
export default function CinematicHome({
|
|
projects,
|
|
clients,
|
|
testimonials,
|
|
heroStats,
|
|
}: {
|
|
heroStats?: HeroStats;
|
|
/** Só projetos de cliente (o filtro é de app/page.tsx). */
|
|
projects: PortfolioProjectView[];
|
|
clients?: ClientLink[];
|
|
testimonials?: Testimonial[];
|
|
}) {
|
|
const shownUrl = displayUrl({
|
|
demoUrl: projects.find((project) => project.id === HERO_WORK_PROJECT)
|
|
?.demoUrl,
|
|
});
|
|
// endereço de hospedagem (vercel.app) nunca vai para a barra: sem domínio próprio, ela mostra "pré-visualização"
|
|
const heroWorkUrl =
|
|
shownUrl && !/vercel\.app/i.test(shownUrl.text) ? shownUrl : null;
|
|
|
|
return (
|
|
<>
|
|
<script type="application/ld+json">{safeJsonLd(jsonLd)}</script>
|
|
<CinematicMain>
|
|
<Hero stats={heroStats} clients={clients} workUrl={heroWorkUrl} />
|
|
|
|
<Projects projects={projects} />
|
|
|
|
<WorkModalities />
|
|
|
|
<About />
|
|
|
|
<Testimonials items={testimonials} />
|
|
|
|
<HomeFaq />
|
|
|
|
<Contact />
|
|
</CinematicMain>
|
|
</>
|
|
);
|
|
}
|