import Link from "next/link"; import messages from "../messages/en/index"; import { getTranslation } from "../lib/i18n/getTranslation"; import { getGovernanceTemplateCatalogEntry } from "../lib/templates/governanceTemplateCatalog"; import Icon from "./components/asset/icon"; import Button from "./components/buttons/Button"; import HeroDecor from "./components/sections/HeroBanner/HeroDecor"; const NOT_FOUND_TEMPLATE_SLUGS = [ "consensus", "do-ocracy", "devolution", "quadratic-governance", ] as const; /** * Figma: 404 page frame 22078-808557; 480px lockup 22078-808903; title + CTA group 22078-808908 * (filled / Go home left, outline / Browse right, 16px between). * Same [HeroDecor](app/components/sections/HeroBanner/HeroDecor.tsx) SVG as home; 404 places it only behind the title stack. * Shell: [app/layout.tsx](app/layout.tsx) `Top` only — no site footer. * Template chip row: Figma 22078-809968 — one row, 16px gaps, 20px to hint (no inner scroll; page handles overflow if needed). * Hero pattern: behind the 404 + bar + h1; wide SVG is painted with overflow-x-clip on `main` so it does not widen the scrollport. */ export default function NotFound() { const t = (key: string) => getTranslation(messages, key); const templateEntries = NOT_FOUND_TEMPLATE_SLUGS.map((slug) => getGovernanceTemplateCatalogEntry(slug), ).filter( (e): e is NonNullable => e != null, ); return (
{/* Vertical rhythm: 22078-808903 + 22078-808908 — 404→bar 8px, bar→h1 32px, h1→body 16px, body→CTAs 48px, CTA→templates 40px (lockup flex gap), template→hint 20px */}

{t("pages.notFoundPage.description")}

{templateEntries.length > 0 ? (
{templateEntries.map((entry) => ( {entry.title} ))}

{t("pages.notFoundPage.templateHint")}

) : null}
); }