Task: declare a named content source under a page, then pass it into a layout section as a complete $source.<name> value. Field-level contracts live on reference and unit pages.
Outcome
pages/<page>/sources/<name>(+ optional.sort/.limit/.filter)- A
layout.aupsection whose top-level prop is the full$source.<name>binding - Undeclared bindings and empty results are diagnosable
Steps (link out only)
- Know what a content object is: Content objects, metadata, and locales.
- Authoring guide for
path/sort/limit/filterand empty states: Bind content to a page. - Field and diagnostic reference: Source-binding reference.
- Where the section sits in a page: Compose pages and layouts · AUP layout boundary.
Canonical units that commonly receive $source
| Consumer role | Unit page |
|---|---|
| Card list | content-card |
| Related reading | related-content |
| Event cards | event-card |
| Tag chips | tag-list |
| Site editorial feed (site package) | site editorial-feed |
| Site period index (site package) | site period-index |
Open the unit page for props such as items, emptyText, and variants. This recipe does not copy those tables.
Binding rules (pointers only)
| Rule | Where it is specified |
|---|---|
Complete $source.<name> as a section top-level prop value | Bind content to a page |
Source path stays under /content/<type>/ | Source-binding reference |
Undeclared name → source-binding-undeclared (when checks run) | same reference + Diagnose a site |
| Component empty state for legitimate zero results | the layout component unit you chose |
AUP data lists (different path)
Interactive AUP apps often list AFS data with the afs-list primitive, not with Web Device $source files:
- Primitive contract:
afs-list - Showcase demos for list variants: Showcase mapping (
list-basic,list-pagination, …)
Do not conflate $source (Web Device content query) with afs-list (AUP tree / session data).
Related recipes
- Collection list page — end-to-end list slice
- Docs board — surface-mounted docs rather than freeform
$sourcelists