Task: one collection list page that selects objects under content/<type>/ and presents them with a list layout component. Contracts live on unit pages; this recipe only sequences them.
Outcome
- At least two real content objects with front matter + body
- A page (or collection layout) that declares an unfiltered source for that type
- A list component bound to
$source.<name>with an empty state - List + one detail route checked in every declared locale
Steps (link out only)
- Start from a working first site: Recipe: first site.
- Object shape and locales: Content objects, metadata, and locales.
- Declare
path/ optionalsort/limit/filterand bind$source.<name>: Bind content to a page · Source-binding reference. - Bind the source into the layout (task order only): Recipe: bind source to layout.
- Full vertical-slice narrative and evidence boundary: Content site.
Canonical units for the list surface
| Role | Unit page |
|---|---|
| Card list for posts / news | content-card |
| Related band | related-content |
| Tags on a card or index | tag-list |
| Optional editorial home mix | site-home · site override site content-card if the site shadows the theme |
Do not restate manifest props on this page — open the unit page for the component you chose.
Markdown on list/detail bodies (optional)
If list items open Markdown detail pages, structure and cards come from MD unit pages, not from inventing HTML in the layout:
- heading · paragraph · list
- Cards:
::link-card·:::info-card·::::card-group - Callouts / tables: GFM admonition · GFM table
Acceptance order
- Unfiltered
/content/<type>/source → list shows items. - Add
sort, thenlimit, thenfilter— rebuild and re-check after each layer. - Open one detail route; confirm locale variants if you declared more than one locale.
- Force an empty source and confirm the component empty state (see the unit page).
Next
- Docs board for documentation shells instead of blog lists
- Slides in an article when a single Markdown object is a deck