feat(seo): visual breadcrumb navigation on article + application pages

- Create Breadcrumbs.tsx server component — semantic <nav> + <ol>/<li>
  with aria-current, ChevronRight separators, Apple-clean styling
- Add breadcrumbs to news article hero overlay (reuses JSON-LD crumbs)
- Add breadcrumbs to application detail hero (passed as prop to client
  component)
- Refactor breadcrumb data into shared array for JSON-LD + visual nav

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-06 18:10:49 -05:00
parent 7ec99734c5
commit cb7458cded
4 changed files with 83 additions and 16 deletions
@@ -9,6 +9,8 @@ import Script from "next/script";
import { ArrowLeft, CheckCircle2, Zap, LayoutDashboard, Cpu, PencilRuler, Factory, MapPin, ChevronDown, Play, FileText, Box, Loader2, Maximize, X, ChevronLeft, ChevronRight } from "lucide-react";
import BreathingField from "@/components/visuals/BreathingField";
import AutoPlayVideo from "@/components/AutoPlayVideo";
import Breadcrumbs from "@/components/seo/Breadcrumbs";
import type { BreadcrumbItem } from "@/components/seo/Breadcrumbs";
// 🔥 EL TRUCO DEFINITIVO PARA TYPESCRIPT Y WEB COMPONENTS 🔥
// Al asignar el string a una variable con 'as any', TypeScript deja de
@@ -999,7 +1001,7 @@ function ExpandedCaseStudy({ node }: { node: any }) {
}
// --- COMPONENTE PRINCIPAL ---
export default function ApplicationClient({ data, realCases, images }: { data: any, realCases: any[], images: any }) {
export default function ApplicationClient({ data, realCases, images, breadcrumbs }: { data: any, realCases: any[], images: any, breadcrumbs?: BreadcrumbItem[] }) {
const [expandedCase, setExpandedCase] = useState<string | null>(null);
const [mainLightboxOpen, setMainLightboxOpen] = useState(false);
@@ -1053,6 +1055,7 @@ export default function ApplicationClient({ data, realCases, images }: { data: a
<div className="relative z-10 max-w-4xl mx-auto px-6 pb-12 md:pb-16 w-full">
<header>
{breadcrumbs && <Breadcrumbs items={breadcrumbs} />}
<div className="inline-flex items-center gap-2 text-[#0066CC] dark:text-[#00F0FF] mb-3 bg-white/80 dark:bg-black/80 backdrop-blur-sm px-3 py-1.5 rounded-full border border-black/5 dark:border-white/10">
<LayoutDashboard size={14} />
<span className="text-[10px] md:text-xs font-semibold uppercase tracking-widest">{data.category}</span>