Build the full site from the copy decks

Adds About, Contact, Services (index + 8) and Industries (index + 7),
generated from structured JSON converted out of the .docx copy decks
by scripts/convert-docs.py. Shared header with dropdowns, footer,
contact form (mailto until a backend exists), FAQ/breadcrumb JSON-LD,
sitemap and robots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alejandro Veras
2026-10-08 22:54:50 -04:00
parent 99a48fac2b
commit b8cf7cfbcb
42 changed files with 11488 additions and 151 deletions
+44
View File
@@ -0,0 +1,44 @@
import { Suspense } from "react";
import { notFound } from "next/navigation";
import ContentPage from "@/components/content/content-page";
import { getIndustry } from "@/lib/pages";
import { pageMetadata } from "@/lib/metadata";
import { industryNav } from "@/lib/routes";
type Params = PageProps<"/industries/[slug]">["params"];
export function generateStaticParams() {
return industryNav.map((s) => ({ slug: s.slug }));
}
export async function generateMetadata({ params }: PageProps<"/industries/[slug]">) {
const { slug } = await params;
const page = getIndustry(slug);
return page ? pageMetadata(page) : {};
}
export default function Page({ params }: PageProps<"/industries/[slug]">) {
return (
<Suspense fallback={<section className="hero page-hero" aria-busy="true" />}>
<Content params={params} />
</Suspense>
);
}
async function Content({ params }: { params: Params }) {
const { slug } = await params;
const page = getIndustry(slug);
if (!page) notFound();
const name = industryNav.find((s) => s.slug === slug)?.name ?? slug;
return (
<ContentPage
page={page}
crumbs={[
{ name: "Home", href: "/" },
{ name: "Industries", href: "/industries" },
{ name, href: `/industries/${slug}` },
]}
/>
);
}