import Link from "next/link"; import { type CSSProperties, Fragment } from "react"; import HeroField from "./cinematic/HeroField"; const SOCIAL_LINKS = [ { href: "https://github.com/evandrodevbr", label: "GitHub", }, { href: "https://www.linkedin.com/in/evandro-fonseca-junior-0969aa1b0/", label: "LinkedIn", }, { href: "mailto:evandrofonsecajunior@gmail.com", label: "Email", }, ]; /** * Números reais, calculados em app/page.tsx (nada digitado à mão): os anos vêm de public/portfolio-data.json; * repos vem da API do GitHub (lib/github-stats.ts) e some quando nem a consulta nem o último retrato estão disponíveis. */ export type HeroStats = { years?: number; repos?: { total: number; public: number; private: number }; }; type StatItem = { value: string; label: string; prefix?: string; detail?: string; }; /** "Mais de N" só é verdade se N for estritamente menor que o total: arredonda para baixo, em múltiplos de 5. */ export function roundedRepoFloor(total: number) { return Math.floor((total - 1) / 5) * 5; } function statItems(stats?: HeroStats): StatItem[] { if (!stats) return []; const { repos } = stats; const repoFloor = repos ? roundedRepoFloor(repos.total) : 0; const items: Array = [ stats.years ? { value: String(stats.years), label: "anos de experiência" } : null, repos && repoFloor > 0 ? { prefix: "Mais de", value: String(repoFloor), label: "projetos desenvolvidos", detail: `${repos.public} públicos · ${repos.private} privados`, } : null, ]; return items.filter((item): item is StatItem => item !== null); } /** Título em palavras para a entrada em cascata; o texto segue inteiro para leitores de tela e buscadores. */ const TITLE = "Sistemas sob medida para operações que não cabem em soluções prontas.".split( " ", ); const ACCENT = new Set([1, 2]); /** O que cada camada da cena significa, em linguagem simples. */ const CAPTIONS = [ ["A tela", "O que sua equipe e seus clientes usam no dia a dia."], [ "As integrações", "Os programas que você já usa conversando entre si, sem retrabalho.", ], ["Os dados", "Suas informações guardadas, organizadas e seguras."], ] as const; export default function Hero({ stats }: { stats?: HeroStats }) { const items = statItems(stats); return (
); }