import { SiteFooter } from "@/components/site"; import Analytics from "@/components/Analytics"; import JsonLd from "@/components/JsonLd"; import { graph, organization, website } from "@/lib/schema"; // Route group: no URL segment. Wraps every public marketing page in the same shell so the nav and // footer are defined once. The nav itself is rendered per page so it can mark the active link. // These pages are prerendered. Two things in them move on their own: the footer's copyright year, // and — once, on the day plans go live — the price on every page that states one (lib/plans-live.ts). // A minute keeps the pages served from the prerender for every reader while letting the console's // plans switch reach the site without a deploy. export const revalidate = 60; export default function SiteLayout({ children }: { children: React.ReactNode }) { return (
{/* The link has to be the first focusable thing on the page, so it lives here rather than in SiteNav. Its target is the page heading — PageHead carries id="content" — because each page renders its own nav inside `children` to mark the active link, so a target on this wrapper would land above the nav and skip nothing. */} Skip to content
{children}
{/* Who this is and what site it is. Stated once, on the shell every public page uses. */}
); }