Layouts
A page selects its wrapper with a {{layout}} /
{{nolayout}} directive that may sit anywhere in the page body.
Wrapping happens at Tier 1 (publish): the layout's {{content}}
placeholder is replaced by the page HTML, then all tags resolve on the combined document.
This page carries no directive, so it was wrapped in
src/layouts/default.html — that layout is where the header above and the footer
below come from.
{{layout}} ← shorthand for {{layout file="default"}}
{{layout file="bare"}} ← wrap this page in src/layouts/bare.html
{{nolayout}} ← opt out: serve the page as a complete HTML documentDirectives are stripped from delivered HTML; if several appear, the first wins (with a warning). The source here is escaped on purpose — a live directive would re-route this very page, so nothing renders on the right.
Resolution rules
| In the page | Layout used |
|---|---|
| no directive | default if src/layouts/default.html exists, otherwise rendered unwrapped |
{{layout}} or {{layout file="default"}} | src/layouts/default.html |
{{layout file="X"}} | src/layouts/X.html — a missing file is a soft failure: unwrapped + a preview warning |
{{nolayout}} | none — the page is served as a complete HTML document |
A layout must contain a {{content}} placeholder; one that doesn't is skipped
(unwrapped + warning). pages.layout_name in the admin is a cached derivative of the
directive — the source file is the truth.
Live layout demos
Each demo page states in its body which layout it expects to be wrapped in:
{{content}} outside a layout
{{content}}Valid only in layout files. In a page body it is an undefined tag: production renders it empty and silent; the preview surfaces the undefined-tag marker instead — which is exactly what the rendered pane should show here.