feat(intake): minimal layout with no app shell

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 <html>/<body>.
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.
This commit is contained in:
Dave 2026-09-21 02:20:27 +02:00
parent a5bd613757
commit 5137a6dda2

30
src/app/intake/layout.tsx Normal file
View file

@ -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 <html>/<body>.
* 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}</>;
}