Skip to content

Section catalogue

The content-section catalogue, the closed set of section types a page may hold and a template may render. Section type = content KIND (coarse); layout/variant is the template’s job. Additive-only: types and fields are added, never removed or re-shaped, within a contract major. Every section is independently omittable, a template must degrade gracefully when any subset is absent.

The page opener: a headline with an optional kicker and sanitised rich-text intro.

Pages: about

Field Kind Required Description
eyebrow text no Short kicker above the headline.
title text yes The headline.
bodyHtml richtext no Sanitised HTML intro, render with the raw filter.

Minimal fixture (the least content your renderer must survive):

{
"title": "Our story"
}

Sample fixture:

{
"eyebrow": "About us",
"title": "Neighbours, looked after.",
"bodyHtml": "<p>The Lantern Trust began in 2011 with a soup pot, a borrowed hall and a belief that nobody in Alderford should face a hard winter alone. Today we run a food bank, a youth club, an advice service and a community garden, powered by more than a hundred volunteers.</p>"
}

A set of principles shown as cards or a numbered list, per the template.

Pages: about

Field Kind Required Description
eyebrow text no Short kicker above the heading.
heading text no The section heading.
items items yes The value entries.
items[].title text yes The value’s name.
items[].description text yes One sentence describing it.
items[].icon icon no Optional emoji/icon.

Minimal fixture (the least content your renderer must survive):

{
"items": [
{
"title": "Transparency",
"description": "Every pound is tracked and reported."
}
]
}

Sample fixture:

{
"eyebrow": "What we stand for",
"heading": "Our values",
"items": [
{
"title": "Openness",
"description": "Every pound is tracked, reported and published in our annual accounts."
},
{
"title": "Dignity",
"description": "No referrals, no means tests at the door. If you say you need help, that is enough."
},
{
"title": "Neighbourliness",
"description": "We work alongside people, not for them. Most of our volunteers first came to us for help."
}
]
}

A closing band: heading, optional line, one button.

Pages: home, about

Field Kind Required Description
heading text yes The band heading.
text text no A supporting line.
buttonLabel text yes The button’s label.
buttonHref url yes The button’s destination (scheme-guarded on save). The editor’s cause picker writes /donate/{slug} here and records causeId beside it (editor bookkeeping, renderers use buttonHref only and may ignore causeId).

Minimal fixture (the least content your renderer must survive):

{
"heading": "Ready to help?",
"buttonLabel": "Donate",
"buttonHref": "/donate"
}

Sample fixture:

{
"heading": "Be somebody's good news today",
"text": "A monthly gift keeps the shelves stocked and the hall warm.",
"buttonLabel": "Donate now",
"buttonHref": "/#donate"
}

The home opener. EVERY field optional: eyebrow/title derive from branding when absent, the lead OMITS when absent (never a fabricated placeholder), buttons fall back to platform defaults.

Pages: home

Field Kind Required Description
eyebrow text no Defaults to the charity’s name.
title text no Defaults to the charity’s tagline.
lead text no A lead paragraph; omitted entirely when blank.
primaryLabel text no Main button label (default: Donate now).
primaryHref url no Main button link (default: #donate).
secondaryLabel text no Second button label (default: Our story).
secondaryHref url no Second button link (default: /about).
givingStyle select no How this hero offers giving: ‘form’ (default) places the donation widget beside the copy; ‘button’ renders copy only, the primary button becomes the giving path (defaulting to /donate). Templates MUST render both.
imageUrl image no Background photograph for the hero (uploaded through the platform pipeline). Superseded by images when that carries any entry, render imageUrl only when images is absent/empty. The template must TREAT the photo (scrim/tint from its own palette variables), never place it raw, and omit for its designed no-photo state.
photoFraming select no How hero photographs meet the hero. ‘fill’ (default): the hero keeps its designed shape and photos crop to fill it (use each photo’s focus to pick the surviving slice). ‘whole’: the hero adapts toward the photo’s own shape (height-clamped) so the FULL scene stays visible, the vista treatment for wide landscape photographs; templates overlay or stack their copy accordingly.
images items no Hero photographs (0–6, uploaded through the platform pipeline). One = a main image; several = rotation material, a template with supports.heroImagery renders at least the first and MAY place the hero_carousel island (or a CSS scroll strip) for the rest. Like every field: absent means the template’s designed no-photo state, never a placeholder.
images[].imageUrl image yes The photograph.
images[].alt text no Accessible description; empty renders as decorative (alt=“”).
images[].focus select no Which part of the photograph survives the fill-crop (templates render photos cover-style, so an aspect mismatch crops, this picks the slice that stays). Maps to background-position/object-position; absent means centre.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"lead": "We turn everyday generosity into food parcels, warm rooms and open doors across Alderford.",
"givingStyle": "button",
"images": [
{
"imageUrl": "p60fixture:hero/dusk",
"alt": "Volunteers serving supper as the light fades"
},
{
"imageUrl": "p60fixture:hero/river",
"alt": "The lantern walk along the River Aldern"
},
{
"imageUrl": "p60fixture:hero/garden",
"alt": "Raised beds in the Foundry Lane community garden"
}
]
}

What gifts make possible, optional intro plus icon/title/description cards. Claims must be truthful for the tenant.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
text text no An intro line.
items items yes The impact cards.
items[].imageUrl image no Card image (uploaded through the platform pipeline). Preferred over icon.
items[].icon icon no Legacy emoji/icon, superseded by imageUrl; render it only when imageUrl is absent.
items[].title text yes The card title.
items[].description text yes One sentence describing it.

Minimal fixture (the least content your renderer must survive):

{
"items": [
{
"title": "Warm meals",
"description": "Hot meals served at a community kitchen."
}
]
}

Sample fixture:

{
"eyebrow": "Where your gift goes",
"heading": "Real help, made of small acts",
"items": [
{
"imageUrl": "p60fixture:impact/parcel",
"title": "£10 · A family food parcel",
"description": "Three days of meals, toiletries and a bag of fresh produce from the garden."
},
{
"icon": "🔥",
"title": "£25 · A warm week",
"description": "Heating top-ups for a household choosing between eating and heating."
},
{
"title": "£50 · A month of youth club",
"description": "Coaching, kit and hot food for a young person, four evenings a week."
}
]
}

Upcoming info events (special days, no sign-up). Render the infoEvents context your way, or place {% island ‘whats_on_strip’ %} for the ready-made strip.

Pages: home

Field Kind Required Description

Places island: whats_on_strip

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{}

Upcoming ticketed events on the home page. Your template renders the events context (the curated listing model) however its voice demands, or places {% island ‘events_carousel’ %} for the ready-made rotating showcase. Listing data only: ticket sales happen on the platform-rendered detail view (detailHref).

Pages: home

Field Kind Required Description

Places island: events_carousel

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{}

The newest published articles. Render the latestArticles context your way, or place {% island ‘latest_articles’ %} for the ready-made strip.

Pages: home

Field Kind Required Description

Places island: latest_articles

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{}

The tenant’s LIVE campaigns (appeals, petitions, surveys) as cards linking to each campaign’s page. Render the campaigns context your way; render nothing when no campaign is live.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading; fall back to the campaignsLabel context when unset.
text text no Optional introduction.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"eyebrow": "Get involved",
"heading": "What we are campaigning for",
"text": "The changes Alderford is asking for right now, and how to add your voice."
}

A high-urgency full-width strip, one headline, an optional line, one action. For live emergencies and time-critical appeals.

Pages: home

Field Kind Required Description
heading text yes The urgent headline.
text text no One supporting line.
buttonLabel text no Action label (default: Donate now).
buttonHref url no Action link (default: /donate). Scheme-guarded on save.

Minimal fixture (the least content your renderer must survive):

{
"heading": "Emergency appeal"
}

Sample fixture:

{
"heading": "Flood response appeal",
"text": "The Aldern broke its banks on Sunday. Thirty households need dry bedding and warmth now.",
"buttonLabel": "Give to the flood response",
"buttonHref": "/donate"
}

Big headline numbers, the at-a-glance impact band. Values are author-entered text (write them exactly as they should read), or, per item, a live figure the platform counts (source).

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The band heading.
items items yes The stat entries.
items[].value text yes The number, as it should read (e.g. 12,000 or 98%).
items[].label text yes What it counts (e.g. meals served).
items[].source select no A figure the platform counts rather than the author types (volunteers who helped in the last twelve months, hours logged this year, opportunities open now, volunteers still needed). When set, value is replaced at render with the live count, formatted for the site’s locale; templates render value exactly as before.

Minimal fixture (the least content your renderer must survive):

{
"items": [
{
"value": "1,200",
"label": "meals served"
}
]
}

Sample fixture:

{
"eyebrow": "Last year",
"heading": "What your giving did",
"items": [
{
"value": "9,200",
"label": "food parcels packed"
},
{
"value": "1,400",
"label": "warm space visits"
},
{
"value": "96p",
"label": "of every pound spent in Alderford"
}
]
}

A grid of appeal/campaign cards, image, title, a line, and a per-card action.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
items items yes The appeal cards.
items[].imageUrl image no Card photograph (uploaded through the platform pipeline).
items[].title text yes The appeal’s name.
items[].text text yes One sentence on what it funds.
items[].buttonLabel text no Card action label (default: Donate).
items[].buttonHref url no Card action link (default: /donate). Scheme-guarded on save. The cause picker writes /donate/{slug} and records causeId beside it (editor bookkeeping; renderers use buttonHref only).

Minimal fixture (the least content your renderer must survive):

{
"items": [
{
"title": "Winter appeal",
"text": "Warm meals through the coldest months."
}
]
}

Sample fixture:

{
"eyebrow": "Our appeals",
"heading": "Where help is needed most",
"items": [
{
"title": "Winter Appeal",
"text": "Heating top-ups, warm bedding and a hot meal through the coldest months.",
"buttonLabel": "Support winter",
"buttonHref": "/donate"
},
{
"title": "Food Bank Fund",
"text": "Ten pounds fills a family parcel and keeps the depot shelves stocked.",
"buttonLabel": "Fill a parcel",
"buttonHref": "/donate"
}
]
}

The tenant’s published services and programmes as a dynamic card collection. Render the services context and omit the section when it is empty.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
text text no Optional introduction.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"eyebrow": "What we do",
"heading": "Support that meets you where you are",
"text": "Food, advice, activity and company: five programmes, one front door."
}

Public documents from the tenant’s media library. The resources context contains PUBLIC documents only; private files and storage metadata never reach Liquid.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
text text no Optional introduction.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"eyebrow": "Resources",
"heading": "Reports and documents",
"text": "Our accounts, policies and handbooks, all in one place."
}

The tenant’s public venue directory with safe directions links. Provider references and private venue notes are never exposed.

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
text text no Optional introduction.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"eyebrow": "Find us",
"heading": "Where to find us",
"text": "Two front doors in the middle of Alderford, both step-free."
}

The key people behind the charity, trustees, staff, volunteers, as simple cards: name, position, an optional photograph (uploaded through the platform pipeline) and an optional one-line statement. Templates render a card grid that collapses to a single column on small screens; a card without a photo renders cleanly (initials or plain), never a placeholder face.

Pages: about

Field Kind Required Description
eyebrow text no Short kicker, e.g. Who we are.
heading text no The section heading, e.g. Our team.
text text no An optional intro line.
items items yes The people.
items[].name text yes The person’s name.
items[].role text yes Their position, e.g. Chair of Trustees.
items[].imageUrl image no A photograph (platform pipeline). Absent renders cleanly, never a placeholder face.
items[].statement text no One line in their voice, e.g. why they serve.

Minimal fixture (the least content your renderer must survive):

{
"items": [
{
"name": "Amina Khan",
"role": "Chair of Trustees"
}
]
}

Sample fixture:

{
"eyebrow": "Who we are",
"heading": "The people behind the work",
"text": "A small staff team, a board of local trustees, and more than a hundred volunteers, accountable to you.",
"items": [
{
"name": "Priya Sharma",
"role": "Chair of Trustees",
"imageUrl": "p60fixture:people/priya/portrait",
"statement": "Every pound is a trust. We spend it like a neighbour is watching, because one is."
},
{
"name": "Derek Osei",
"role": "Food Bank Lead",
"imageUrl": "p60fixture:people/derek/portrait"
},
{
"name": "Sara Malik",
"role": "Volunteer Coordinator",
"statement": "A hundred pairs of hands, one purpose."
}
]
}

The organisation’s impact map: a themed map whose points link existing content (campaigns, causes, articles, events, places), each opening a card derived from the linked thing. Place the map island, it brings the map, the points and the cards; your template brings placement and tokens (the island theming contract).

Pages: home

Field Kind Required Description
eyebrow text no Short kicker.
heading text no The section heading.
text text no Optional introduction.
mapSlug text no WHICH map renders here, by its address (the Pages editor’s placement picker writes it; the Maps area is where maps exist). Absent = the tenant’s first published map.

Minimal fixture (the least content your renderer must survive):

{}

Sample fixture:

{
"eyebrow": "Where we work",
"heading": "Our impact, on the map",
"text": "Every marker is a real place: a programme, an appeal, a story. Click one to see what happens there."
}