feat: revamp portfolio with case studies, curriculo page, and local SEO
Adds dynamic case study and curriculo routes, project health monitoring for live demo status, and strengthens local SEO (structured data, service-area targeting for Garuva/Joinville/Curitiba, a dedicated "criação de sites" service page) so search results better match the professional title (Engenheiro da Computação) and experience (5 anos). Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
1 parent
9236fdd685
commit
d76bbf5974
41 files changed
+1359
-492
No files matched your search
+92
-47
@@ -2,18 +2,19 @@ import type { Metadata, Viewport } from "next";
|
||||
import { Geist_Mono, Syne } from "next/font/google";
|
||||
import localFont from "next/font/local";
|
||||
import type { ReactNode } from "react";
|
||||
import GoogleAnalytics from "./components/GoogleAnalytics";
|
||||
import { regionCities, siteUrl } from "@/lib/site-content";
|
||||
import { getWhatsAppNumber } from "@/lib/whatsapp";
|
||||
import CinematicOverlays from "./components/cinematic/CinematicOverlays";
|
||||
import GoogleAnalytics from "./components/GoogleAnalytics";
|
||||
import { RouteTransition } from "./components/RouteTransition";
|
||||
import { AnimationProvider } from "./providers/AnimationProvider";
|
||||
import { SmoothScrollProvider } from "./providers/SmoothScrollProvider";
|
||||
import "./globals.css";
|
||||
|
||||
const siteUrl = "https://evandro.dev.br";
|
||||
const seoTitle =
|
||||
"Engenharia de Software, Next.js, Tauri, Rust e Consultoria Tecnica | Evandro Fonseca Junior";
|
||||
"Engenheiro da Computação e Desenvolvedor de Software em Garuva, Joinville e Curitiba | Evandro Fonseca Junior";
|
||||
const seoDescription =
|
||||
"Consultoria e engenharia de software para Next.js, Tauri, Rust, IoT e sistemas criticos. Arquitetura de software e integracoes hardware + software para empresas que precisam de estabilidade e escala.";
|
||||
"Evandro Fonseca Junior é engenheiro da computação, desenvolvedor de software e criação de sites para empresas em Garuva, Joinville, São Francisco do Sul, Itapoá, Jaraguá do Sul, Norte de Santa Catarina e Curitiba. Atua com Next.js, TypeScript, Rust, IoT, integração de sistemas e produtos críticos.";
|
||||
|
||||
const syne = Syne({
|
||||
subsets: ["latin"],
|
||||
@@ -50,20 +51,31 @@ export const metadata: Metadata = {
|
||||
title: seoTitle,
|
||||
description: seoDescription,
|
||||
keywords: [
|
||||
"engenharia de software",
|
||||
"engenheiro de software",
|
||||
"consultoria tecnica",
|
||||
"consultoria next.js",
|
||||
"next.js",
|
||||
"tauri",
|
||||
"rust",
|
||||
"desenvolvedor de software em Garuva",
|
||||
"engenheiro da computação em Garuva",
|
||||
"desenvolvedor de sites em Garuva",
|
||||
"desenvolvedor de software em Joinville",
|
||||
"engenheiro da computação em Joinville",
|
||||
"desenvolvedor de sites em Joinville",
|
||||
"criação de sites em Joinville",
|
||||
"programador em Joinville",
|
||||
"desenvolvedor de software em Curitiba",
|
||||
"engenheiro da computação em Curitiba",
|
||||
"criação de sites em Curitiba",
|
||||
"desenvolvedor de sites em Curitiba",
|
||||
"programador em Curitiba",
|
||||
"desenvolvedor de software em São Francisco do Sul",
|
||||
"desenvolvedor de software em Itapoá",
|
||||
"desenvolvedor de software em Jaraguá do Sul",
|
||||
"desenvolvedor full stack Santa Catarina",
|
||||
"engenharia de software Norte de Santa Catarina",
|
||||
"criação de sites Norte de Santa Catarina",
|
||||
"desenvolvimento de sistemas web Santa Catarina",
|
||||
"Next.js",
|
||||
"TypeScript",
|
||||
"Rust",
|
||||
"IoT",
|
||||
"arquitetura de software",
|
||||
"sistemas criticos",
|
||||
"integracao hardware software",
|
||||
"iot",
|
||||
"software para iot",
|
||||
"engenharia full-stack",
|
||||
"aplicacoes de alta performance",
|
||||
],
|
||||
authors: [{ name: "Evandro Fonseca Junior" }],
|
||||
creator: "Evandro Fonseca Junior",
|
||||
@@ -138,27 +150,48 @@ export default function RootLayout({ children }: Readonly<RootLayoutProps>) {
|
||||
inLanguage: "pt-BR",
|
||||
description: seoDescription,
|
||||
},
|
||||
{
|
||||
"@type": "ProfilePage",
|
||||
"@id": `${siteUrl}/curriculo#profile`,
|
||||
url: `${siteUrl}/curriculo`,
|
||||
inLanguage: "pt-BR",
|
||||
mainEntity: { "@id": `${siteUrl}/#person` },
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"@id": `${siteUrl}/#person`,
|
||||
name: "Evandro Fonseca Junior",
|
||||
alternateName: ["Evandro.dev", "evandrodevbr"],
|
||||
jobTitle: "Engenheiro de Software Full-Stack",
|
||||
jobTitle:
|
||||
"Engenheiro da Computação e Desenvolvedor de Software Full-Stack",
|
||||
description: seoDescription,
|
||||
url: siteUrl,
|
||||
image: `${siteUrl}/opengraph-image`,
|
||||
telephone: `+${getWhatsAppNumber()}`,
|
||||
sameAs: [
|
||||
"https://github.com/evandrodevbr",
|
||||
"https://www.linkedin.com/in/evandro-fonseca-junior-0969aa1b0/",
|
||||
"https://www.instagram.com/evandrodevbr/",
|
||||
],
|
||||
worksFor: {
|
||||
"@type": "Organization",
|
||||
name: "Consultoria Independente",
|
||||
address: {
|
||||
"@type": "PostalAddress",
|
||||
addressLocality: "Garuva",
|
||||
addressRegion: "SC",
|
||||
addressCountry: "BR",
|
||||
},
|
||||
homeLocation: {
|
||||
"@type": "Place",
|
||||
name: "Garuva, Santa Catarina, Brasil",
|
||||
geo: {
|
||||
"@type": "GeoCoordinates",
|
||||
latitude: -26.0281,
|
||||
longitude: -48.8467,
|
||||
},
|
||||
},
|
||||
hasOccupation: {
|
||||
"@type": "Occupation",
|
||||
name: "Engenheiro da Computação e Desenvolvedor de Software",
|
||||
occupationalCategory: "15-1252.00 Software Developers",
|
||||
},
|
||||
knowsAbout: [
|
||||
"Engenharia de Software",
|
||||
@@ -166,8 +199,8 @@ export default function RootLayout({ children }: Readonly<RootLayoutProps>) {
|
||||
"Tauri",
|
||||
"Rust",
|
||||
"Arquitetura de Software",
|
||||
"Sistemas Criticos",
|
||||
"Integracao hardware e software",
|
||||
"Sistemas Críticos",
|
||||
"Integração hardware e software",
|
||||
"IoT",
|
||||
"TypeScript",
|
||||
"Cloud Computing",
|
||||
@@ -176,25 +209,46 @@ export default function RootLayout({ children }: Readonly<RootLayoutProps>) {
|
||||
{
|
||||
"@type": "ProfessionalService",
|
||||
"@id": `${siteUrl}/#services`,
|
||||
name: "Evandro Fonseca Junior | Engenharia de Software e Consultoria Tecnica",
|
||||
name: "Evandro Fonseca Junior | Engenharia de Software, Criação de Sites e Consultoria Tecnica",
|
||||
url: siteUrl,
|
||||
image: `${siteUrl}/opengraph-image`,
|
||||
telephone: `+${getWhatsAppNumber()}`,
|
||||
priceRange: "$$",
|
||||
address: {
|
||||
"@type": "PostalAddress",
|
||||
addressLocality: "Garuva",
|
||||
addressRegion: "SC",
|
||||
addressCountry: "BR",
|
||||
},
|
||||
geo: {
|
||||
"@type": "GeoCoordinates",
|
||||
latitude: -26.0281,
|
||||
longitude: -48.8467,
|
||||
},
|
||||
description:
|
||||
"Servico de engenharia de software, arquitetura de software, integracoes criticas e consultoria tecnica para Next.js, Tauri, Rust, IoT e produtos conectados.",
|
||||
"Servico de engenharia de software, criacao de sites, arquitetura de software, integracoes criticas e consultoria tecnica para Next.js, Tauri, Rust, IoT e produtos conectados.",
|
||||
areaServed: [
|
||||
...regionCities.map((name) => ({ "@type": "City", name })),
|
||||
{ "@type": "AdministrativeArea", name: "Norte de Santa Catarina" },
|
||||
{ "@type": "AdministrativeArea", name: "Paraná" },
|
||||
{
|
||||
"@type": "Country",
|
||||
name: "Brasil",
|
||||
},
|
||||
{
|
||||
"@type": "Place",
|
||||
name: "Remote worldwide",
|
||||
"@type": "GeoCircle",
|
||||
geoMidpoint: {
|
||||
"@type": "GeoCoordinates",
|
||||
latitude: -26.0281,
|
||||
longitude: -48.8467,
|
||||
},
|
||||
geoRadius: "150000",
|
||||
},
|
||||
{ "@type": "Country", name: "Brasil" },
|
||||
{ "@type": "Place", name: "Atuação remota" },
|
||||
],
|
||||
provider: {
|
||||
"@id": `${siteUrl}/#person`,
|
||||
},
|
||||
serviceType: [
|
||||
"Engenharia de Software",
|
||||
"Criação de Sites",
|
||||
"Consultoria Tecnica",
|
||||
"Arquitetura de Software",
|
||||
"Integracao hardware + software",
|
||||
@@ -208,6 +262,13 @@ export default function RootLayout({ children }: Readonly<RootLayoutProps>) {
|
||||
"@type": "OfferCatalog",
|
||||
name: "Modelos de contratacao",
|
||||
itemListElement: [
|
||||
{
|
||||
"@type": "Offer",
|
||||
itemOffered: {
|
||||
"@type": "Service",
|
||||
name: "Criação de sites institucionais e sistemas web",
|
||||
},
|
||||
},
|
||||
{
|
||||
"@type": "Offer",
|
||||
itemOffered: {
|
||||
@@ -240,22 +301,6 @@ export default function RootLayout({ children }: Readonly<RootLayoutProps>) {
|
||||
lang="pt-BR"
|
||||
className={`${syne.variable} ${geistMono.variable} ${monumentExtended.variable}`}
|
||||
>
|
||||
<head>
|
||||
<link rel="canonical" href={siteUrl} />
|
||||
{/* Blocking script: creates immediate black overlay BEFORE any paint.
|
||||
This prevents the flash of real content before React hydrates
|
||||
and PageIntro mounts. PageIntro removes the #__loading-blocker div. */}
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `(function(){
|
||||
var el=document.createElement('div');
|
||||
el.id='__loading-blocker';
|
||||
el.style.cssText='position:fixed;inset:0;background:#0a0a0a;z-index:99998;pointer-events:none;';
|
||||
document.documentElement.appendChild(el);
|
||||
})();`,
|
||||
}}
|
||||
/>
|
||||
</head>
|
||||
<body>
|
||||
<SmoothScrollProvider>
|
||||
<AnimationProvider>
|
||||
|
||||
Reference in new issue
Block a user