import SiteHeader from './SiteHeader.jsx' import SiteFooter from './SiteFooter.jsx' import { shellClass } from '../lib/pageShell.js' // Standard page chrome for the public site + wiki. // // ── `shell` — added in MODULE_API_VERSION 1.5.0 ──────────────────────────── // // This component supplies the chrome and NOT the body: every core public page // wraps its own content in `
`, which is what // centres it in a max-width column, gives it its top and bottom padding, and — // through `page-body { flex: 1 }` — pushes the footer to the bottom of the // viewport. Nine of nine core pages do it, so the omission has never shown. // // A module page cannot: it is handed `PublicLayout` through the UI kit // (MODULE_API.md §3.4) and has no way to learn about two class names that appear // in no contract. The Integration Kit's acceptance run built a module exactly as // the kit teaches and it rendered full-bleed at x=0 with the footer riding up // under the content — the precise failure §3.4 says the kit exists to prevent // ("a module page that does not look like the site it is installed in"). // // So the wrapper moves behind the component a module already has. `shell` is // OPT-IN and omitting it is exactly today's behaviour, which is why core's own // nine pages are untouched by this change — they keep their own wrapper, and a // page wanting an unusual body still writes its own. The width mapping and its // fallback are in lib/pageShell.js, where the DOM-less test runner can reach them. export default function PublicLayout({ section = 'website', header = true, shell, children }) { const bodyClass = shellClass(shell) return (
{header && } {bodyClass ?
{children}
: children}
) }