mirror of
https://github.com/BigMarc/Bunny-Agency-Italy.git
synced 2026-10-13 17:00:40 +02:00
Italian-market site for the Bunny Agency network, built on the shared Next.js App Router template with content driven from site-content.json. - 50 routes: home, 5 services, pricing, FAQ, about/apply/contact, 32 blog answers and guides, 5 legal pages - Research-driven Italian copy citing ISTAT, INPS and Agenzia delle Entrate (forfettario 15%/5%, ATECO 73.11.03, INPS 26,07%, tassa etica, DAC7) - 6 long-form guides targeting high-volume Italian creator searches - "Milanese Editoriale" design system with stats band, editorial article layout, creator gallery and footer language switcher to 18 sibling sites - Full SEO/AEO/GEO: JSON-LD entity graph, hreflang cluster, llms.txt, IndexNow, sitemap, AI-crawler-friendly robots - validate-seo.mjs passes with 0 errors Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
32 lines
1.5 KiB
TypeScript
32 lines
1.5 KiB
TypeScript
import Link from "next/link";
|
|
import { content, pages, type SeoPage } from "@/lib/content";
|
|
|
|
export function breadcrumbPages(page: SeoPage): SeoPage[] {
|
|
if (page.path === "/") return [];
|
|
const parentPath = page.path.startsWith("/services/") ? "/services" : page.path.startsWith("/blog/") ? "/blog" : null;
|
|
const parent = parentPath ? pages.find((candidate) => candidate.path === parentPath) : undefined;
|
|
return [...(parent ? [parent] : []), page];
|
|
}
|
|
|
|
type LegacyItem = { label: string; href?: string };
|
|
|
|
export default function Breadcrumbs({ page, items }: { page?: SeoPage; items?: LegacyItem[] }) {
|
|
if (items) return <nav className="breadcrumbs" aria-label="Breadcrumb"><ol>
|
|
<li><Link href="/">{content.labels.home}</Link></li>
|
|
{items.filter((item) => item.href !== "/").map((item, index, list) => <li key={`${item.href ?? "current"}-${item.label}`} aria-current={index === list.length - 1 ? "page" : undefined}>
|
|
{item.href && index !== list.length - 1 ? <Link href={item.href}>{item.label}</Link> : <span>{item.label}</span>}
|
|
</li>)}
|
|
</ol></nav>;
|
|
if (!page) return null;
|
|
const crumbs = breadcrumbPages(page);
|
|
if (!crumbs.length) return null;
|
|
return <nav className="breadcrumbs" aria-label="Breadcrumb">
|
|
<ol>
|
|
<li><Link href="/">{content.labels.home}</Link></li>
|
|
{crumbs.map((crumb, index) => <li key={crumb.path} aria-current={index === crumbs.length - 1 ? "page" : undefined}>
|
|
{index === crumbs.length - 1 ? <span>{crumb.h1}</span> : <Link href={crumb.path}>{crumb.h1}</Link>}
|
|
</li>)}
|
|
</ol>
|
|
</nav>;
|
|
}
|