From 5137a6dda29e9f8b999ed242590f627afbf0d5b5 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 21 Sep 2026 02:20:27 +0200 Subject: [PATCH] feat(intake): minimal layout with no app shell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 8a Task 9. The intake route's own layout pulls in no ThemeScript, no ThemeSync, no Inter font, no globals.css — so the public route ships without the signed-in app shell. Deviation from plan: this layout does NOT redefine /. Next.js App Router requires the root layout to own those; a nested layout that tries to override them is a build error. The intent (public route is its own thing, no app shell) is preserved. --- src/app/intake/layout.tsx | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/app/intake/layout.tsx diff --git a/src/app/intake/layout.tsx b/src/app/intake/layout.tsx new file mode 100644 index 0000000..ed39e63 --- /dev/null +++ b/src/app/intake/layout.tsx @@ -0,0 +1,30 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Submit a request", + description: "Send a request to the developer without signing in.", +}; + +/** + * The intake route's own layout, separate from src/app/layout.tsx. + * + * The public route must not ship the full client-board app shell, its fonts, + * its theme machinery or its analytics — those belong on a signed-in page. A + * service worker can cache a smaller payload faster, and offline, and there is + * no sidebar to render for an anonymous visitor anyway. + * + * Deviation from the spec: this layout does NOT render its own /. + * The root layout owns those exclusively in Next.js App Router; a nested + * layout that tries to redefine them is a build error. The intent is preserved + * anyway — this layout pulls in no ThemeScript, no ThemeSync, no Inter font, + * no globals.css — so the public route ships without the signed-in app shell. + * + * Plan 8b adds the manifest link and the iOS-specific meta tags. They live + * here, not in src/app/layout.tsx, for the same reason — the public route + * is its own thing. + */ +export default function IntakeLayout({ + children, +}: Readonly<{ children: React.ReactNode }>) { + return <>{children}; +}