feat: rebuild landing experience, content and analytics

This commit is contained in:
Evandro Fonseca Junior committed 2026-09-13 04:30:58 -03:00
1 parent d24ee12299
commit 9aff4d1035
51 files changed
+3023 -2595

No files matched your search

+76
View File
@@ -0,0 +1,76 @@
export const GA_MEASUREMENT_ID = "G-QTT9QT0T3S";
export const CONSENT_STORAGE_KEY = "evandro.analytics-consent.v1";
export const GA_DISABLE_KEY = "ga-disable-G-QTT9QT0T3S";
export type AnalyticsConsent = "granted" | "denied";
export type Gtag = (...args: unknown[]) => void;
declare global {
interface Window {
dataLayer?: IArguments[];
"ga-disable-G-QTT9QT0T3S"?: boolean;
gtag?: Gtag;
}
}
export function readConsent(): AnalyticsConsent | null {
try {
const value = localStorage.getItem(CONSENT_STORAGE_KEY);
return value === "granted" || value === "denied" ? value : null;
} catch {
return null;
}
}
function analyticsPagePath(): string {
const path = window.location.pathname.replace(/\/$/, "") || "/";
switch (path) {
case "/":
case "/servicos":
case "/cases":
case "/curriculo":
case "/privacidade":
return path;
default:
// Route templates keep arbitrary slugs and personal data out of metrics.
if (path.startsWith("/servicos/")) return "/servicos/[slug]";
if (path.startsWith("/cases/")) return "/cases/[slug]";
return "/other";
}
}
/** Measures an attempted handoff, not an opened app, delivered message or lead.
* Callers must supply static labels, never form values or destination URLs.
*/
export function trackWhatsAppOpen({
service,
placement,
}: {
service: string;
placement: string;
}): void {
if (
process.env.NODE_ENV !== "production" ||
typeof window === "undefined" ||
readConsent() !== "granted" ||
window[GA_DISABLE_KEY] === true ||
typeof window.gtag !== "function"
) {
return;
}
try {
const pagePath = analyticsPagePath();
window.gtag("event", "whatsapp_open", {
send_to: GA_MEASUREMENT_ID,
service,
placement,
page_path: pagePath,
// Override gtag's URL defaults so query/hash/referrer data cannot leak.
page_location: `https://evandro.dev.br${pagePath}`,
page_referrer: "",
});
} catch {
// Analytics must never interrupt navigation. Dropped events are not replayed.
}
}
+5 -5
View File
@@ -2,13 +2,13 @@ export const siteUrl = "https://evandro.dev.br";
export const siteName = "Evandro.dev.br";
export const intentCtas = {
hiring: {
label: "Avaliar perfil para contratação",
href: "/curriculo",
project: {
label: "Conversar sobre meu projeto",
href: "/#contact",
},
consulting: {
label: "Solicitar consultoria técnica",
href: "/#contact",
label: "Conhecer as soluções",
href: "/servicos",
},
} as const;
+3 -5
View File
@@ -2,10 +2,8 @@ export const CV_URL = "/Profile.pdf";
export const CV_DOWNLOAD_NAME = "Evandro_Fonseca_Junior_CV.pdf";
export const NAVIGATION_ITEMS = [
{ href: "/#home", label: "Home" },
{ href: "/cases", label: "Casos" },
{ href: "/servicos", label: "Serviços" },
{ href: "/curriculo", label: "Currículo" },
{ href: "/#modalities", label: "Soluções" },
{ href: "/cases", label: "Projetos" },
{ href: "/#process", label: "Como trabalho" },
{ href: "/#about", label: "Sobre" },
{ href: "/#contact", label: "Contato" },
] as const;