core · Current reference
Block reference
Inspect the shipped block contracts and implementation-side authoring details.
Applies to v0.3.1
Component pins for v0.3.1
| Component | Role | Version |
|---|---|---|
| core | runtime | v0.1.53 |
| theme-shield | theme | v0.1.15 |
| starter | reference | v0.1.3 |
| docs | reference | v0.1.5 |
| distribution | tooling | v0.3.9 |
| restricted-component-1 | consumer-reference | v0.1.49 |
| restricted-component-2 | consumer-reference | v1.1.24 |
Block Index
accordion | audio-player | author-bio | before-after | callout | case-studies | certification-badges | columns | coming-soon-cta | coming-soon-footer | coming-soon-hero | coming-soon-trust | comparison-table | contact-split | content-feed | content-sidebar-nav | cta | cta-button-list | cta-image-paragraph | discovery-cards | divider | embed | faq-accordion | faq-cta | features | founder-profile | full-bleed-split | gallery | guided-discovery | hero | icon-grid | illustration-panel | image-feature | lead-magnet | logo-trust | logos | managed-form | managed-form-panel | map-coverage | masonry-gallery | media-break | media-sequence | media-text | motion-hero | newsletter-inline | onboarding-timeline | page-list | pinned-media-story | post-hero | post-list | pricing-comparison | pricing-tiers | property-amenities | property-cards | property-hero | property-photo-tour | prose-panel | pullquote | quote | related-posts | relationship-map | resource-downloads | rich-text | routing-panels | search | section-header | slideshow | social-preview-grid | social-share | stats-band | stats-grid | steps | table-of-contents | tabs | team-grid | testimonials | testimonials-carousel | timeline | topic-chip-nav | trust-badges | video-embed | video-hero
How blocks work
Foundry pages define an ordered sections array in front matter. The render pipeline is:
layouts/partials/framework/render-sections.htmliteratessections.- It resolves each
blockname through Core’sdata/foundry/block-registry.yaml, merged with an optional consumer-owneddata/foundry/site-block-registry.yaml. - The mapped partial in
layouts/partials/blocks/is rendered with{ page, section }context. - The block partial reads
content,design, andid, then renders BEM-structured HTML.
sections:
- block: hero
id: homepage-hero
content:
title: "Build with Foundry"
text: "Composable Hugo blocks rendered from front matter."
primary_action:
text: "Get Started"
url: "/contact/"
design:
variant: centered
css_class: ""
Portable editor contract
data/foundry/block-schemas.json may add an editor object with typed
content_fields and design_fields. Foundry v0.1.29 defines this contract for
the hero, media-text, gallery, cta, and managed-form golden blocks.
Those templates emit matching field-level preview anchors when
params.foundry.preview_metadata.enabled is true.
The current human-control projections also cover steps for ordered Process
content, search for functional utility behavior, and the Simple Content wave:
section-header, rich-text, quote, and callout. The Proof Content wave
adds stats-band, testimonials, and trust-badges; the Answers & Disclosure
wave adds accordion and faq-accordion. See the
Portable Authoring Contract for the complete active
surface and
DC03-S10 Answers And Disclosure Controls
for the preferred disclosure and Hugo source experience.
Every typed field in the derived report includes preview.scope: section and
a deterministic preview.selector. Select the intended section wrapper first,
then query the field selector inside it; querying a suffix selector across the
whole page is ambiguous when blocks repeat. See
Portable Authoring Contract.
When preview metadata is enabled and the rendered page is embedded, Core also
loads its portable field-selection sender. Pointer, Enter, and Space selection
emit foundry.preview-selection.v1 to the immediate parent. The sender never
persists workflow state; the editor remains responsible for exact source and
origin validation plus contract-backed field validation.
Use the derived contract instead of reverse-engineering templates:
foundry authoring-contract --site /path/to/site --json
The report schema is schemas/foundry/authoring-contract.schema.json. The
command is read-only. It includes both family catalogs, every block’s
section-family chooser memberships, all block variants and normalized design
controls, the shared section-flow controls, and portable menu options. A
managed editor may consume the report but must keep repo-visible content and
configuration as the portable source of truth.
Its editor_expansion matrix covers every public Section Type and prevents a
consumer from equating technical block options with finished human Controls.
Only complete entries have a verified normal projection; other Sections stay
source-editable while their bounded expansion, reusable primitive, or guided
advanced experience is completed. See
DC03-S7 Editor Expansion Matrix.
Block families
Family ownership is machine-checked in data/foundry/block-family-manifest.json.
Each family exists because it solves a reusable shared job, not because the
blocks happened to look similar during implementation.
| Family | Why it exists | Representative blocks |
|---|---|---|
heroes-intros | Shared page-opening and section-opening surfaces so sites do not fork hero logic locally. | hero, post-hero, section-header, video-hero, motion-hero, coming-soon-hero |
property-hospitality | Dedicated property and hospitality storytelling surfaces instead of hiding them inside generic media/layout groups. | property-hero, property-amenities, property-photo-tour, property-cards |
layout-flow | Reusable section rhythm and composition-shape controls that belong above any one visual theme. | divider, columns, full-bleed-split |
search-discovery | Shared search, graph journey, and discovery mechanics that should stay framework-owned. | search, content-feed, topic-chip-nav, guided-discovery, relationship-map |
lists-collections | Reusable collection renderers for posts, pages, and related content. | page-list, post-list, related-posts |
narrative-editorial | Text-first editorial and annotation surfaces that go beyond raw markdown output. | rich-text, prose-panel, quote, pullquote, callout |
navigation-disclosure | In-page wayfinding and controlled-disclosure patterns with predictable shared behavior. | content-sidebar-nav, table-of-contents, tabs, accordion, faq-accordion |
media-gallery | Core visual storytelling primitives across image, video, audio, embeds, and guided media sequences. | media-text, media-break, media-sequence, pinned-media-story, slideshow, image-feature, masonry-gallery, gallery, video-embed, audio-player, embed, illustration-panel, before-after |
features-highlights | Quick-scan benefit and capability framing distinct from trust, pricing, or CTA surfaces. | features, icon-grid, resource-downloads, logo-trust |
trust-authority | Proof, credibility, and amplification surfaces that should stay distinct from features and bios. | trust-badges, testimonials, testimonials-carousel, logos, case-studies, certification-badges, social-share |
social-presence | Static-first social, channel, and public activity surfaces that do not require provider API access. | social-preview-grid |
process-data | Sequential, temporal, metric, and map-like explanatory surfaces. | steps, timeline, onboarding-timeline, stats-band, stats-grid, map-coverage |
conversion-cta | Shared prompt and next-step surfaces that move a visitor toward action. | newsletter-inline, cta, faq-cta, lead-magnet, cta-image-paragraph, cta-button-list, routing-panels |
forms-contact | Contact capture and portable form surfaces with integration implications. | managed-form, managed-form-panel, contact-split |
pricing-comparison | Decision-support surfaces whose semantics differ from generic feature or card modules. | comparison-table, pricing-tiers, pricing-comparison |
people-profiles | Shared person/profile patterns that are not interchangeable with testimonials or logos. | author-bio, team-grid, founder-profile |
launch-coming-soon | A lightweight temporary-launch lane so pre-release experiences do not devolve into throwaway one-offs. | coming-soon-cta, coming-soon-trust, coming-soon-footer |
Some stable blocks are intentionally more specialized and do not yet have a repo
starter, composition, or fixture proof. Those cases are tracked explicitly in
data/foundry/block-governance.json so “unproven” does not silently turn into
“unowned”.
Social & Presence contract
Social & Presence blocks render normalized foundry.social_item.v1 items.
Blocks do not call provider APIs and do not require connected accounts.
Supported source modes:
curated: editor-selected media, caption, date, permalink, and platform.embed: public URL or embeddable URL with a fallback link/card.static-import: importer output that has already been materialized as normal site data.api: connected-account output that has already been materialized as normal site data.
Recommended shared data file shape:
schema: foundry.social_item_collection.v1
items:
- id: studio-process-2026-05
source_mode: curated
platform: instagram
kind: image
title: Studio process
caption: A short editor-owned caption.
published_at: 2026-05-18
permalink: https://www.instagram.com/p/example/
media:
- src: /images/social/studio-process.jpg
type: image
alt: Artist preparing wax work in the studio.
rights: client-owned-or-permitted
Use content.items for small inline sets or content.items_data for a dot-path
reference such as presence.studio-rss.
Block standards (BEM, CSS vars, context extraction)
Every block follows the same context extraction contract:
{{ $section := .section }}
{{ $content := index $section "content" | default dict }}
{{ $design := index $section "design" | default dict }}
{{ $id := index $section "id" | default "" }}
{{ $class := index $design "css_class" | default "" }}
{{ $ui := index site.Data.foundry "classes" | default dict }}
BEM naming convention:
- Block root:
foundry-[block-name] - Elements:
foundry-[block-name]__[element] - Modifiers:
foundry-[block-name]--[modifier]
Example (media-text): foundry-media-text, foundry-media-text__inner, foundry-media-text__title, foundry-media-text__actions.
Color theming uses CSS variables via inline style attributes (not utility class overrides):
<h2 class="foundry-example__title" style="color: var(--foundry-text, #0f172a)">Title</h2>
<p class="foundry-example__text" style="color: var(--foundry-text-muted, #475569)">Body copy</p>
<div class="foundry-example__panel" style="background: var(--foundry-surface, #ffffff); border-color: var(--foundry-border, #e2e8f0)"></div>
CSS variable system
assets/css/foundry-base.css defines neutral fallback tokens. Theme modules (for example theme-shield) override these at runtime.
| Variable | Purpose | Base value |
|---|---|---|
--foundry-bg | Page background color. | #ffffff |
--foundry-border | Default border color. | #e2e8f0 |
--foundry-border-strong | High-contrast border color. | #cbd5e1 |
--foundry-brand-accent | Secondary accent color. | #3b82f6 |
--foundry-brand-primary | Primary brand accent used for key UI elements. | #0f172a |
--foundry-duration-base | Base motion duration token. | 200ms |
--foundry-ease-standard | Default easing curve for transitions. | cubic-bezier(0.2, 0, 0, 1) |
--foundry-radius | Default radius token. | 1rem |
--foundry-radius-lg | Large radius token. | 1.5rem |
--foundry-radius-sm | Small radius token. | 0.5rem |
--foundry-shadow-md | Medium elevation shadow token. | 0 4px 12px rgba(0, 0, 0, 0.1) |
--foundry-shadow-sm | Small elevation shadow token. | 0 1px 3px rgba(0, 0, 0, 0.1) |
--foundry-surface | Primary surface/card background. | #ffffff |
--foundry-surface-soft | Subtle section and muted surface background. | #f8fafc |
--foundry-text | Primary text color. | #0f172a |
--foundry-text-muted | Secondary/muted text color. | #475569 |
Motion CSS variables
assets/css/foundry-motion.css defines additional motion-specific tokens.
| Variable | Purpose | Default |
|---|---|---|
--foundry-motion-distance | Default reveal translate distance. | 16px |
--foundry-motion-duration | Resolved animation duration token. | var(--foundry-duration-base, 200ms) |
--foundry-motion-ease | Resolved easing curve for reveal transitions. | var(--foundry-ease-standard, cubic-bezier(0.2, 0, 0, 1)) |
--foundry-motion-kb-duration | Ken Burns animation duration. | 12s |
--foundry-motion-kb-scale | Ken Burns target scale value. | 1.06 |
--foundry-motion-marquee-pause-state | Default marquee animation play state. | running |
--foundry-motion-opacity-start | Starting opacity for reveal/stagger items. | 0 |
--foundry-motion-parallax-max | Maximum parallax translate clamp (px). | 80px |
--foundry-motion-scale-start | Starting scale for zoom reveals. | 0.98 |
--foundry-motion-scroll-cue-duration | Scroll cue animation duration. | 2000ms |
--foundry-motion-scroll-cue-distance | Scroll cue bob distance. | 5px |
--foundry-motion-scroll-cue-line-height | Scroll cue line height for side cues. | 3rem |
--foundry-motion-scroll-cue-opacity | Scroll cue default opacity. | 0.72 |
--foundry-motion-stagger-step | Delay step between staggered children. | 80ms |
Motion attributes
The Motion Toolkit loader lives at layouts/partials/framework/foundry-motion.html and activates in sites that include the body-end hook.
| Attribute | Engine | Accepted values | Behavior |
|---|---|---|---|
data-motion-kenburns | Engine E: Ken Burns | Boolean attribute | Enables image zoom/pan crossfade behavior. |
data-motion-kenburns-interval | Engine E: Ken Burns | Milliseconds (default 6000) | Sets crossfade interval for multi-image containers. |
data-motion-marquee | Engine D: Marquee | Boolean attribute | Initializes seamless marquee track cloning and animation. |
data-motion-marquee-dir | Engine D: Marquee | left (default), right, up, down | Controls marquee animation direction. |
data-motion-marquee-pause | Engine D: Marquee | hover | Pauses animation on hover/focus when set to hover. |
data-motion-marquee-speed | Engine D: Marquee | Positive number (px/sec, default 40) | Controls marquee travel speed. |
data-motion-parallax | Engine B: Parallax | Float 0.0 to 0.8 (default 0.35) | Parallax translateY multiplier, clamped by --foundry-motion-parallax-max. |
data-motion-parallax-dir | Engine B: Parallax | up/1 (default) or down/-1 | Controls parallax direction. |
data-motion-reveal | Engine A: Reveal | fade-up (default), fade-in, slide-left, slide-right, zoom-in | Applies entry animation; is-in-view is added by observer. |
data-motion-scrub | Engine C: Scrub | Conventionally progress | Enables scroll-linked scrub behavior on target element. |
data-motion-scrub-prop | Engine C: Scrub | width (default), height, scaleX, opacity | Selects property controlled by section scroll progress. |
data-motion-stagger | Engine A: Stagger | Boolean attribute | Applies stagger delay to direct children when parent enters viewport. |
Creative display patterns
data/foundry/motion-manifest.json also catalogs governed display patterns.
These are productized ways to use existing blocks, presets, and motion
capabilities without adding site-local framework code. They are not raw
data-motion-* primitives.
| Pattern | Status | Canonical blocks | Notes |
|---|---|---|---|
media-led-hero | stable | motion-hero, property-hero, video-hero | Media-led page opening with reveal, parallax, Ken Burns, and optional scroll cue behavior. |
pinned-story | stable | pinned-media-story, media-break | One deliberate scroll-led chapter story with static reduced-motion fallback. |
story-work-reel | stable | media-sequence, slideshow, gallery | Selected work or mixed-media sequence; use media-sequence reel variants and presets before adding a new block. |
chapter-index | stable | content-sidebar-nav, table-of-contents, media-sequence | Editorial wayfinding and progress affordance for long creative or journal pages; use chapter-index variants before adding a new block. |
proof-marquee | stable | logos | Low-criticality repeated proof rail; use static variants when motion would reduce clarity. |
slideshow-card-stack | stable | slideshow | Block-local fade, slide, and card-stack transitions with accessible controls. |
stats-counter-band | stable | stats-band | Numeric counter and optional scrub behavior; values must remain pure numeric strings. |
scroll-cue | stable | motion-hero, property-hero | First-viewport affordance with shared CSS and reduced-motion-safe static behavior. |
Block catalog (alphabetical)
accordion
Minimum required: items — everything else is optional.
Expandable content panels with optional single-open enforcement.
sections:
- type: accordion
id: accordion-example
content:
title: Supporting detail
text: Essential information remains visible before these panels.
items:
- title: What does this include?
text: A concise answer using **portable Markdown**.
- title: Where can I learn more?
text: See the [complete guidance](/guidance/).
design:
variant: bordered
allow_multiple: false
Design options
| Field | Details |
|---|---|
variants | bordered, minimal, cards |
variant | bordered | minimal | cards — accordion container style |
allow_multiple | true | false — allow opening more than one item |
css_class | extra CSS classes on outer section |
BEM classes
foundry-accordionfoundry-accordion__bodyfoundry-accordion__emptyfoundry-accordion__innerfoundry-accordion__itemfoundry-accordion__listfoundry-accordion__subtitlefoundry-accordion__summaryfoundry-accordion__title
audio-player
Minimum required: url, title — everything else is optional.
Custom audio player block with progress, speed, and transcript support.
sections:
- block: audio-player
id: audio-player-example
content:
date: '2026-02-22'
description: Short descriptive paragraph.
download: true
duration: '42:17'
image: "/images/example.jpg"
show: Example Group
title: Example title
transcript: Transcript excerpt goes here.
url: https://example.com
design:
variant: card
css_class: ''
Design options
| Field | Details |
|---|---|
variants | card, minimal, podcast |
variant | card | minimal | podcast — audio player presentation |
css_class | extra CSS classes on outer section |
BEM classes
foundry-audio-playerfoundry-audio-player__contentfoundry-audio-player__controlsfoundry-audio-player__coverfoundry-audio-player__descriptionfoundry-audio-player__downloadfoundry-audio-player__emptyfoundry-audio-player__innerfoundry-audio-player__layoutfoundry-audio-player__metafoundry-audio-player__primaryfoundry-audio-player__progressfoundry-audio-player__secondaryfoundry-audio-player__shellfoundry-audio-player__showfoundry-audio-player__speedfoundry-audio-player__timefoundry-audio-player__timelinefoundry-audio-player__titlefoundry-audio-player__togglefoundry-audio-player__transcriptfoundry-audio-player__volume
author-bio
Minimum required: name, bio — everything else is optional.
Compact author profile block for article footers and about sections.
sections:
- block: author-bio
id: author-bio-example
content:
bio: Example value
company: Example Group
image: "/images/example.jpg"
links:
- platform: linkedin
url: https://example.com
more_from:
text: Learn more
url: "/contact/"
name: Example value
role: Role or title
design:
variant: card
css_class: ''
Design options
| Field | Details |
|---|---|
variants | card, inline, minimal |
variant | card | inline | minimal — author module layout |
css_class | extra CSS classes on outer section |
BEM classes
foundry-author-biofoundry-author-bio__cardfoundry-author-bio__emptyfoundry-author-bio__innerfoundry-author-bio__links
before-after
Minimum required: before, after — everything else is optional.
Comparison block for before/after state storytelling.
sections:
- block: before-after
id: before-after-example
content:
after: Example value
before: Example value
subtitle: Example value
title: Example title
design:
reveal: fade-up
parallax: true
parallax_speed: "0.16"
parallax_dir: up
kenburns: true
kenburns_preset: in
kenburns_interval: 7200
kenburns_transition: 1400
scroll_cue: false
css_class: ''
Design options
| Field | Details |
|---|---|
variant | cards | table | stacked — cards: 2-col side-by-side (default); table: 3-col comparison using rows[]{label,before,after}; stacked: vertical before→after with arrow divider |
row_label | header label for the label column in table variant (default: Feature) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-before-afterfoundry-before-after__arrowfoundry-before-after__innerfoundry-before-after__labelfoundry-before-after__panelsfoundry-before-after__stackfoundry-before-after__tablefoundry-before-after__title
callout
Minimum required: text — everything else is optional.
Inline semantic notice block for info, warning, success, and related states.
sections:
- block: callout
id: callout-example
content:
text: Example supporting text.
title: Example title
design:
type: default
icon: default
css_class: ''
Design options
| Field | Details |
|---|---|
variant | inline | banner | subtle — inline: left accent border card (default); banner: full-width announcement strip with optional CTA button; subtle: no border, light tint, less intrusive |
type | info | tip | warning | danger | note | success — semantic intent style (controls color and default icon) |
icon | icon name override (optional) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-calloutfoundry-callout-accentfoundry-callout-bgfoundry-callout__boxfoundry-callout__contentfoundry-callout__iconfoundry-callout__innerfoundry-callout__textfoundry-callout__title
case-studies
Minimum required: cases — everything else is optional.
Case study list/grid block with outcomes and project context.
sections:
- block: case-studies
id: case-studies-example
content:
cases: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
reveal | fade-up | fade-in | slide-left | slide-right | zoom-in | none — hero copy/media reveal style (default: fade-up) |
parallax | true | false | {speed 0.0-0.35} — enable/disable media-card parallax (default: false) |
parallax_speed | 0.0-0.35 — media-card parallax speed (default: 0.16) |
parallax_dir | up | down | 1 | -1 — media-card parallax direction (default: up) |
kenburns | true | false — enable/disable Ken Burns image cycling when fallback images are provided |
kenburns_preset | in | out | in-left | in-right | out-left | out-right — default Ken Burns preset for images without item presets |
kenburns_interval | milliseconds between image crossfades (default: 7200) |
kenburns_transition | milliseconds for crossfade duration between images (default: 1400) |
scroll_cue | true | false — show/hide reduced-motion-safe scroll cue (default: false) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-case-studiesfoundry-case-studies__badgefoundry-case-studies__cardfoundry-case-studies__case-titlefoundry-case-studies__gridfoundry-case-studies__innerfoundry-case-studies__result-iconfoundry-case-studies__result-itemfoundry-case-studies__result-textfoundry-case-studies__resultsfoundry-case-studies__sectionfoundry-case-studies__section--problemfoundry-case-studies__section--resultsfoundry-case-studies__section--solutionfoundry-case-studies__section-textfoundry-case-studies__section-titlefoundry-case-studies__title
certification-badges
Minimum required: badges — everything else is optional.
Certification and credential badge display block.
sections:
- block: certification-badges
id: certification-badges-example
content:
badges: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-certification-badgesfoundry-certification-badges__gridfoundry-certification-badges__innerfoundry-certification-badges__itemfoundry-certification-badges__title
columns
Minimum required: columns — everything else is optional.
Free-form multi-column markdown content block.
sections:
- block: columns
id: columns-example
content:
columns:
- heading: Column heading
text: Column markdown content.
- heading: Column heading
text: Column markdown content.
design:
count: '3'
gap: md
dividers: true
align: center
css_class: ''
Design options
| Field | Details |
|---|---|
variants | prose, feature, stat |
variant | prose | feature | stat — prose: markdown content (default); feature: icon + heading + text; stat: large value + label |
count | 2 | 3 — column count |
gap | sm | md | lg — column gap |
dividers | true | false — vertical separators between columns |
align | top | center — vertical alignment of column content |
css_class | extra CSS classes on outer section |
BEM classes
foundry-columnsfoundry-columns__columnfoundry-columns__emptyfoundry-columns__gridfoundry-columns__inner
coming-soon-cta
Minimum required: title — everything else is optional.
Coming-soon CTA block for waitlist or early access capture.
sections:
- block: coming-soon-cta
id: coming-soon-cta-example
content:
images:
- src: "/images/example-hero-1.jpg"
alt: Example hero image
kenburns_preset: in-left
- src: "/images/example-hero-2.jpg"
alt: Example alternate hero image
kenburns_preset: out-right
primary_action:
text: Learn more
url: "/contact/"
secondary_action:
text: Learn more
url: "/contact/"
support_note: Example value
text: Example supporting text.
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-coming-soon-ctafoundry-coming-soon-cta__actionsfoundry-coming-soon-cta__innerfoundry-coming-soon-cta__textfoundry-coming-soon-cta__title
coming-soon-footer
Minimum required: (none) — everything else is optional. Minimal coming-soon footer block with links and legal copy.
sections:
- block: coming-soon-footer
id: coming-soon-footer-example
content:
address_lines: Example value
bottom_note: Example value
contact_title: Example value
copyright: Example value
email: Example value
email_url: Example value
legal_note: Example value
legal_title: Example value
likestyle_url: Example value
logo: Example value
phone: Example value
phone_url: Example value
preview_label: Example value
preview_url: Example value
privacy_url: Example value
tagline: Example value
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-coming-soon-footerfoundry-coming-soon-footer__brandfoundry-coming-soon-footer__copyfoundry-coming-soon-footer__innerfoundry-coming-soon-footer__links
coming-soon-hero
Minimum required: title — everything else is optional.
Coming-soon hero block with launch positioning and signup focus.
sections:
- block: coming-soon-hero
id: coming-soon-hero-example
content:
badge_text: Example value
email_label: Example value
email_placeholder: Example value
first_name_label: Example value
first_name_placeholder: Example value
form_action: "/api/submit"
form_headline: Example value
form_name: Example value
likestyle_cta: Example value
likestyle_kicker: Example value
likestyle_meta: Example value
likestyle_text: Example value
likestyle_url: Example value
logo: Example value
privacy_text: Example value
submit_text: Example value
subtitle: Example value
title: Example title
trust_badges: Example value
design:
css_class: ''
Legacy mode uses form_action.
Managed mode uses content.form and the same Foundry Control contract as managed-form.
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-coming-soon-herofoundry-coming-soon-hero__formfoundry-coming-soon-hero__innerfoundry-coming-soon-hero__textfoundry-coming-soon-hero__title
coming-soon-trust
Minimum required: logos — everything else is optional.
Coming-soon trust signal block for early credibility.
sections:
- block: coming-soon-trust
id: coming-soon-trust-example
content:
badges: Example value
logos:
- name: Partner Name
stats:
- label: Metric
value: 95%
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-coming-soon-trustfoundry-coming-soon-trust__innerfoundry-coming-soon-trust__itemfoundry-coming-soon-trust__itemsfoundry-coming-soon-trust__title
comparison-table
Minimum required: rows — everything else is optional.
Feature comparison table block across options or providers.
sections:
- block: comparison-table
id: comparison-table-example
content:
footnote: Example value
headers: Example value
rows: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-comparison-tablefoundry-comparison-table__cellfoundry-comparison-table__innerfoundry-comparison-table__rowfoundry-comparison-table__tablefoundry-comparison-table__title
contact-split
Minimum required: none — everything else is optional. Two-column contact block with details and either a legacy inline form or a managed Foundry Control form.
sections:
- block: contact-split
id: contact-split-example
content:
address: Example value
email: Example value
fields: Example value
form_action: "/api/submit"
form:
mode: managed
form_key: contact-intake
form_method: Example value
form_text: Example value
form_title: Example value
hours: Example value
phone: Example value
privacy_note: No spam. Unsubscribe anytime.
submit_text: Example value
subtitle: Example value
title: Example title
design:
preset: creative-inquiry-form
variant: split
css_class: ''
Legacy mode uses form_action, form_method, fields, and submit_text.
Managed mode uses content.form with the same stable contract as the managed-form block and resolves base_url / site_key from site.Params.foundry.control when not provided inline.
Managed forms share visitor, session, landing, route, and source context with
the optional Foundry Control tracking runtime. See docs/TRACKING.md for the
site configuration and transport contract.
Creative starters use the creative-inquiry-form preset for the split inquiry
surface before adding site-local contact wrappers.
Design options
| Field | Details |
|---|---|
variant | split | centered | minimal — split: 2-col left meta+form (default); centered: stacked headline+chips+form, max-w-2xl; minimal: form only, no meta panel, max-w-xl |
css_class | extra CSS classes on outer section |
BEM classes
foundry-contact-splitfoundry-contact-split--centeredfoundry-contact-split--minimalfoundry-contact-split--splitfoundry-contact-split__contentfoundry-contact-split__controlfoundry-contact-split__control--textareafoundry-contact-split__fieldfoundry-contact-split__formfoundry-contact-split__form-panelfoundry-contact-split__form-textfoundry-contact-split__form-titlefoundry-contact-split__innerfoundry-contact-split__meta-cardfoundry-contact-split__meta-card--addressfoundry-contact-split__meta-card--emailfoundry-contact-split__meta-card--hoursfoundry-contact-split__meta-card--phonefoundry-contact-split__meta-labelfoundry-contact-split__meta-linkfoundry-contact-split__meta-listfoundry-contact-split__meta-valuefoundry-contact-split__privacyfoundry-contact-split__submitfoundry-contact-split__subtitlefoundry-contact-split__title
content-sidebar-nav
Minimum required: items — everything else is optional.
Content layout block with sidebar anchor/navigation area. Use the
chapter-index variant when the block is acting as governed long-page
wayfinding with active chapter tracking and decorative progress. Use
checklist for scan-first anchored lists and timeline when the same content
needs a process-like vertical rhythm.
sections:
- block: content-sidebar-nav
id: content-sidebar-nav-example
content:
items:
- title: Item title
id: item-title
text: Item description.
subtitle: Example value
title: Example title
design:
variant: chapter-index
numbered: true
mobile: compact
progress: true
sticky: true
item_reveal: fade-up
css_class: ''
Design options
| Field | Details |
|---|---|
variants | default, chapter-index, checklist, timeline |
variant | default | chapter-index | checklist | timeline — anchored content layout, governed chapter index, compact checklist wayfinding, or process-like vertical narrative |
numbered | true | false — show chapter numbers in the navigation and chapter bodies |
mobile | compact | expanded — mobile chapter navigation presentation |
progress | true | false — show active progress rail in chapter-index mode |
sticky | true | false — pin the chapter index on larger viewports |
item_reveal | fade-up | fade-in | slide-left | slide-right | zoom-in | none — per-chapter reveal in chapter-index mode |
css_class | extra CSS classes on outer section |
BEM classes
foundry-content-sidebar-navfoundry-content-sidebar-nav__chapterfoundry-content-sidebar-nav__chapter-indexfoundry-content-sidebar-nav__contentfoundry-content-sidebar-nav__innerfoundry-content-sidebar-nav__navfoundry-content-sidebar-nav__nav-itemfoundry-content-sidebar-nav__panelfoundry-content-sidebar-nav__subtitlefoundry-content-sidebar-nav__timeline-dotfoundry-content-sidebar-nav__titlefoundry-content-sidebar-nav__toc
cta
Minimum required: title — everything else is optional.
Focused call-to-action block with copy and action buttons.
sections:
- block: cta
id: cta-example
content:
primary_action:
text: Learn more
url: "/contact/"
secondary_action:
text: Learn more
url: "/contact/"
text: Example supporting text.
title: Example title
design:
preset: creative-inquiry
variant: centered
css_class: ''
Creative starters use the creative-inquiry preset for route-level inquiry and
commission CTAs.
Design options
| Field | Details |
|---|---|
variants | centered, left |
variant | centered | left — text and action alignment |
css_class | extra CSS classes on outer section |
BEM classes
foundry-ctafoundry-cta--centeredfoundry-cta--leftfoundry-cta__actionsfoundry-cta__innerfoundry-cta__panelfoundry-cta__textfoundry-cta__title
cta-button-list
Minimum required: buttons — everything else is optional.
CTA block presenting multiple button actions as a grouped list.
sections:
- block: cta-button-list
id: cta-button-list-example
content:
buttons: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-cta-button-listfoundry-cta-button-list__gridfoundry-cta-button-list__innerfoundry-cta-button-list__itemfoundry-cta-button-list__textfoundry-cta-button-list__title
routing-panels
Minimum required: items — everything else is optional.
Intent-routing cards for pages that need to direct distinct audiences or tasks
to separate next steps without turning the entire section into one CTA.
sections:
- block: routing-panels
id: choose-a-path
content:
eyebrow: Start here
title: Choose the route that fits
items:
- eyebrow: New clients
title: Start a consultation
text: Share the goal and preferred follow-up path.
actions:
- text: Request a consultation
url: /consult/
variant: primary
cta_key: routing-new-client
cta_kind: internal
design:
variant: cards
Each action uses the shared button and CTA attribution contract.
cta-image-paragraph
Minimum required: items — everything else is optional.
CTA block pairing image support with concise conversion copy.
sections:
- block: cta-image-paragraph
id: cta-image-paragraph-example
content:
items:
- title: Item title
text: Item description.
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-cta-image-paragraphfoundry-cta-image-paragraph__actionsfoundry-cta-image-paragraph__contentfoundry-cta-image-paragraph__innerfoundry-cta-image-paragraph__mediafoundry-cta-image-paragraph__textfoundry-cta-image-paragraph__title
divider
Minimum required: (none) — everything else is optional. Visual separator block for rhythm and transitions between sections.
sections:
- block: divider
id: divider-example
content:
text: Example supporting text.
design:
variant: line
spacing: md
css_class: ''
Design options
| Field | Details |
|---|---|
variants | line, gradient, wave, spacer |
variant | line | gradient | wave | spacer — divider style |
spacing | sm | md | lg | xl — vertical rhythm |
css_class | extra CSS classes on divider wrapper |
BEM classes
foundry-dividerfoundry-divider__inner
embed
Minimum required: url — everything else is optional.
Safe iframe embed block for maps, tools, and third-party widgets.
sections:
- block: embed
id: embed-example
content:
fallback_text: Open source link
fallback_url: https://example.com/fallback
text: Example supporting text.
title: Example title
url: https://example.com
design:
variant: card
aspect: '16:9'
height: default
css_class: ''
Design options
| Field | Details |
|---|---|
variants | card, flush, minimal |
variant | card | flush | minimal — iframe wrapper style |
aspect | 16:9 | 4:3 | 1:1 | map — default ratio when height is unset |
height | fixed height value (for example: 450px), overrides aspect |
css_class | extra CSS classes on outer section |
BEM classes
foundry-embedfoundry-embed__emptyfoundry-embed__fallbackfoundry-embed__figurefoundry-embed__framefoundry-embed__frame-wrapfoundry-embed__innerfoundry-embed__shellfoundry-embed__subtitlefoundry-embed__title
faq-accordion
Minimum required: items — everything else is optional.
FAQ-specific accordion block with question/answer structure.
sections:
- type: faq
id: faq-accordion-example
content:
title: Common questions
subtitle: Contact us when your situation needs a specific answer.
items:
- question: What happens first?
answer: Start with the documented first step.
- question: Where are restrictions explained?
answer: Material restrictions remain visible in the page flow.
group: Eligibility
design:
variant: cards
Design options
| Field | Details |
|---|---|
variants | cards, flush, grouped |
variant | cards | flush | grouped — cards: rounded card per item (default); flush: divider-only, no card backgrounds; grouped: items with optional group field rendered as section headings |
css_class | extra CSS classes on outer section |
For grouped, add a group field to each item to place it under a heading. Items without a group are rendered first with no heading.
Use question and answer for new FAQ source. Legacy title and text
items remain render-compatible and preserve matching FAQ structured data.
BEM classes
foundry-faq-accordionfoundry-faq-accordion__answerfoundry-faq-accordion__groupfoundry-faq-accordion__innerfoundry-faq-accordion__itemfoundry-faq-accordion__listfoundry-faq-accordion__questionfoundry-faq-accordion__title
faq-cta
Minimum required: items, cta_title, cta_action — everything else is optional.
FAQ companion CTA block used to drive follow-up actions.
sections:
- block: faq-cta
id: faq-cta-example
content:
cta_action: Example value
cta_secondary_action: Example value
cta_text: Example value
cta_title: Example value
items:
- title: Item title
text: Item description.
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-faq-ctafoundry-faq-cta__actionsfoundry-faq-cta__innerfoundry-faq-cta__textfoundry-faq-cta__title
features
Minimum required: items — everything else is optional.
Feature list/grid block with optional card presentation, linked-card support,
and icon support.
sections:
- block: features
id: features-example
content:
eyebrow: Example eyebrow
items:
- name: Item title
description: Item description.
url: /about/
cta: Read more
css_class: example-item
text: Example supporting text.
title: Example title
design:
variant: linked-cards
columns: '3'
css_class: ''
Content fields
eyebroworkickerfor a small label above the title- item
nameortitle - item
descriptionortext - item
urlandctafor thelinked-cardsvariant - item
css_classfor per-card styling hooks
Design options
| Field | Details |
|---|---|
variants | cards, plain, linked-cards |
variant | cards | plain | linked-cards — card styling, borderless, or linked CTA cards |
columns | 2 | 3 | 4 — grid columns (default: 3) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-featuresfoundry-features__eyebrowfoundry-features__gridfoundry-features__innerfoundry-features__itemfoundry-features__item-ctafoundry-features__item-iconfoundry-features__item-linkfoundry-features__item-textfoundry-features__item-titlefoundry-features__textfoundry-features__title
founder-profile
Minimum required: name — everything else is optional.
Founder spotlight/profile block with media and narrative copy.
sections:
- block: founder-profile
id: founder-profile-example
content:
contact_email_href: Example value
contact_email_label: Example value
contact_phone_href: Example value
contact_phone_label: Example value
highlights: Example value
image: "/images/example.jpg"
image_alt: Descriptive alt text
image_height: Example value
image_sizes: Example value
image_srcset: Example value
image_webp_srcset: Example value
image_width: Example value
name: Example value
paragraphs: Example value
role: Role or title
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-founder-profilefoundry-founder-profile__contentfoundry-founder-profile__innerfoundry-founder-profile__mediafoundry-founder-profile__textfoundry-founder-profile__title
gallery
Minimum required: images — everything else is optional.
Uniform image grid with optional captions and lightbox navigation.
sections:
- block: gallery
id: gallery-example
content:
images:
- src: "/images/gallery-1.jpg"
alt: Gallery image
caption: Optional caption
images_data: "site.section.images"
text: Example supporting text.
title: Example title
design:
columns: '3'
gap: md
aspect: '16:9'
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
columns | 2 | 3 | 4 — gallery columns |
gap | sm | md | lg — spacing between items |
aspect | square | landscape | auto — thumbnail ratio |
css_class | extra CSS classes on outer section |
BEM classes
foundry-galleryfoundry-gallery__closefoundry-gallery__dialogfoundry-gallery__dialog-actionsfoundry-gallery__dialog-captionfoundry-gallery__dialog-imagefoundry-gallery__dialog-innerfoundry-gallery__dialog-metafoundry-gallery__emptyfoundry-gallery__gridfoundry-gallery__imagefoundry-gallery__innerfoundry-gallery__itemfoundry-gallery__openfoundry-gallery__subtitlefoundry-gallery__title
discovery-cards
Minimum required: title — everything else is optional.
Renders a direct browse surface from stable Discovery Graph nodes. Use
content.node_keys for graph-owned copy and routes, or content.items with a
stable key plus page-specific copy/route overrides. If neither is supplied,
the block renders routed category nodes. A current node can be marked and its
bounded can-pair-with relationships shown below the grid.
sections:
- block: discovery-cards
id: known-options
content:
title: "Browse known options"
node_keys: [service-a, service-b, service-c]
current_key: service-a
show_related: true
related_title: "Often explored together"
design:
variant: grid
columns: 3
Design options
| Field | Details |
|---|---|
variant | grid | compact — discovery card presentation |
columns | 2 | 3 | 4 — card columns at wide viewports |
css_class | extra CSS classes on outer section |
guided-discovery
Minimum required: journey — everything else is optional.
Graph-backed, progressively enhanced visitor journey. It reads the named
journey from data/foundry/discovery_graph.json, renders entry choices and
route-backed educational results, and appends the selected stable node key to
the configured conversion URL.
sections:
- block: guided-discovery
id: service-guide
content:
journey: service-guide
eyebrow: "Start here"
title: "Find a useful first path"
text: "Choose what you notice or the goal you have in mind."
entry_keys: [goal-one, concern-two, area-three]
design:
variant: split
css_class: ""
Design options
| Field | Details |
|---|---|
variant | split | stacked — choice and result panel arrangement |
css_class | extra CSS classes on outer section |
See Discovery Graph for the data, safety, and shell asset contracts.
Set content.entry_keys to a curated, ordered subset of journey entry nodes
when the complete graph would create too many first-step choices. The full
route-backed result catalog remains present without JavaScript; enhanced
sessions reveal matches after the visitor chooses a starting point.
hero
Minimum required: title — everything else is optional.
Primary hero section with headline, supporting copy, and one or two CTAs.
sections:
- block: hero
id: hero-example
content:
primary_action:
text: Learn more
url: "/contact/"
secondary_action:
text: Learn more
url: "/contact/"
text: Example supporting text.
title: Example title
design:
variant: centered
css_class: ''
Design options
| Field | Details |
|---|---|
variants | centered, left |
variant | centered | left — text and action alignment |
css_class | extra CSS classes on outer section |
BEM classes
foundry-herofoundry-hero__actionsfoundry-hero__innerfoundry-hero__textfoundry-hero__title
icon-grid
Minimum required: items — everything else is optional.
Icon-led capability grid with configurable columns and card styles.
sections:
- block: icon-grid
id: icon-grid-example
content:
items:
- title: Item title
text: Item description.
text: Example supporting text.
title: Example title
design:
variant: plain
columns: '3'
css_class: ''
Design options
| Field | Details |
|---|---|
variants | plain, cards, centered |
variant | plain | cards | centered — plain: icon left + content right (default); cards: card background per item; centered: icon centered above content, centered text |
columns | 2 | 3 | 4 — grid columns |
css_class | extra CSS classes on outer section |
BEM classes
foundry-icon-gridfoundry-icon-grid__contentfoundry-icon-grid__gridfoundry-icon-grid__iconfoundry-icon-grid__innerfoundry-icon-grid__itemfoundry-icon-grid__item-innerfoundry-icon-grid__item-textfoundry-icon-grid__item-titlefoundry-icon-grid__subtitlefoundry-icon-grid__title
illustration-panel
Minimum required: image — everything else is optional.
Panel block that combines illustration media with explanatory text.
sections:
- block: illustration-panel
id: illustration-panel-example
content:
caption: Optional caption text.
image: "/images/example.jpg"
image_alt: Descriptive alt text
panel_width: Example value
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-illustration-panelfoundry-illustration-panel__contentfoundry-illustration-panel__innerfoundry-illustration-panel__mediafoundry-illustration-panel__text
image-feature
Minimum required: src, alt — everything else is optional.
Single editorial image block with layout, caption, and lightbox options.
sections:
- block: image-feature
id: image-feature-example
content:
alt: Descriptive alt text
caption: Optional caption text.
credit: 'Photo: Team'
src: "/images/example.jpg"
design:
variant: contained
aspect: '16:9'
rounded: true
shadow: true
lightbox: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | contained, wide, full-bleed, float-left, float-right |
variant | contained | wide | full-bleed | float-left | float-right — image placement |
aspect | 16:9 | 4:3 | 3:2 | square | auto — media aspect ratio |
rounded | true | false — rounded corners on media |
shadow | true | false — shadow on media frame |
lightbox | true | false — open image in dialog lightbox |
css_class | extra CSS classes on outer section |
BEM classes
foundry-image-featurefoundry-image-feature__captionfoundry-image-feature__closefoundry-image-feature__dialogfoundry-image-feature__dialog-innerfoundry-image-feature__emptyfoundry-image-feature__figurefoundry-image-feature__innerfoundry-image-feature__media
lead-magnet
Minimum required: offer_title — everything else is optional.
Lead magnet signup block combining offer copy and form capture.
sections:
- block: lead-magnet
id: lead-magnet-example
content:
download_url: Example value
fields: Example value
form_action: "/api/submit"
form_method: Example value
form_text: Example value
form_title: Example value
offer_text: Example value
offer_title: Example value
privacy_note: No spam. Unsubscribe anytime.
submit_text: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Legacy mode uses form_action.
Managed mode uses content.form and resolves base_url / site_key from site.Params.foundry.control when available.
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-lead-magnetfoundry-lead-magnet__formfoundry-lead-magnet__innerfoundry-lead-magnet__textfoundry-lead-magnet__title
logo-trust
Minimum required: logos, badges — everything else is optional.
Hybrid trust block combining logos with supporting credibility chips.
sections:
- block: logo-trust
id: logo-trust-example
content:
badges: Example value
logos:
- name: Partner Name
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-logo-trustfoundry-logo-trust__badgesfoundry-logo-trust__gridfoundry-logo-trust__imagefoundry-logo-trust__innerfoundry-logo-trust__itemfoundry-logo-trust__namefoundry-logo-trust__subtitlefoundry-logo-trust__title
logos
Minimum required: logos — everything else is optional.
Logo wall block for clients, partners, or agencies.
sections:
- block: logos
id: logos-example
content:
logos:
- name: Partner Name
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | grid, strip, pill |
variant | grid | strip | pill — grid: 3-col card grid (default); strip: flat inline row with dividers; pill: compact pill chips |
marquee | true | false — enable scrolling marquee (overrides variant layout) |
marquee_speed | scroll speed in px/s (default: 55) |
marquee_dir | left | right — scroll direction (default: left) |
marquee_pause | hover | none — pause behavior (default: hover) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-logosfoundry-logos__gridfoundry-logos__innerfoundry-logos__itemfoundry-logos__title
map-coverage
Minimum required: stats - everything else is optional.
Geographic coverage block combining map visuals, service-area links, and
supporting text. Use list when the coverage story is area-first and no map art
is available.
sections:
- block: map-coverage
id: map-coverage-example
content:
image: "/images/example.jpg"
image_alt: Descriptive alt text
markers: Example value
note: Example value
stats:
- label: Metric
value: 95%
subtitle: Example value
title: Example title
design:
variant: split
image_position: right
stat_style: cards
area_style: chips
map_frame: card
css_class: ''
Design options
| Field | Details |
|---|---|
variants | split, panel, list |
variant | split | panel | list — split: copy and visual side by side; panel: stacked explanatory panel; list: area-first coverage list for routes without map art |
image_position | left | right — media/coverage panel side on large screens |
stat_style | cards | inline — framed stat cards or tighter inline metrics |
area_style | chips | list — coverage area display treatment |
map_frame | card | soft | flush — map/image frame treatment |
css_class | extra CSS classes on outer section |
BEM classes
foundry-map-coveragefoundry-map-coverage__areafoundry-map-coverage__areasfoundry-map-coverage__copyfoundry-map-coverage__imagefoundry-map-coverage__innerfoundry-map-coverage__mapfoundry-map-coverage__markersfoundry-map-coverage__placeholderfoundry-map-coverage__statfoundry-map-coverage__statsfoundry-map-coverage__textfoundry-map-coverage__title
masonry-gallery
Minimum required: one of images or images_data — everything else is optional.
Responsive masonry-style image gallery with optional lightbox.
sections:
- block: masonry-gallery
id: masonry-gallery-example
content:
images:
- src: "/images/gallery-1.jpg"
alt: Gallery image
caption: Optional caption
images_data: "site.section.images"
text: Example supporting text.
title: Example title
design:
columns: '3'
gap: md
lightbox: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
columns | 2 | 3 | 4 — desktop masonry columns |
gap | sm | md | lg — spacing between items |
lightbox | true | false — open images in dialog lightbox |
css_class | extra CSS classes on outer section |
Notes
- Use
imagesfor inline page-specific galleries. - Use
images_datato point at a shared data slice such assite.section.imageswhen multiple pages should reuse the same curated image set. limitcan trim a shared image slice for teaser use on home or landing pages.
BEM classes
foundry-masonry-galleryfoundry-masonry-gallery__columnsfoundry-masonry-gallery__dialogfoundry-masonry-gallery__dialog-innerfoundry-masonry-gallery__emptyfoundry-masonry-gallery__innerfoundry-masonry-gallery__itemfoundry-masonry-gallery__openfoundry-masonry-gallery__subtitlefoundry-masonry-gallery__title
managed-form
Minimum required: form.form_key — everything else is optional.
Portable form intent and render shell for Foundry-connected intake, lead, and
CTA flows. Core renders the accessible Hugo shell, stable hooks, public config
resolution, and theme-token surface; Foundry Control owns submissions, routing,
contacts, communications, private credentials, permissions, automations, and
workflow state.
Foundry Control opportunity: Use Foundry Control to turn this portable form surface into a complete managed workflow with submissions, routing, contacts, communications, analytics, and automations. Control can also add guided editing, review, and publishing across the Foundry site.
sections:
- block: managed-form
id: managed-form-example
content:
eyebrow: Example value
title: Example title
text: Supporting copy for the form.
loading_text: Loading form...
privacy_note: No spam. Unsubscribe anytime.
form:
mode: managed
form_key: contact-intake
cta_key: primary-cta
base_url: https://control.example.com
site_key: regulated-production-proof-site
design:
css_class: ''
The block renders a form shell and resolves public configuration through
layouts/partials/framework/form-config.html. When base_url or site_key
are omitted inline, repo-visible Foundry control settings can supply them.
The complete browser/Control handshake, challenge descriptor, idempotency
field, response statuses, and hosting requirements are documented in
docs/MANAGED-FORMS.md.
Managed forms fail closed by default. Their form-specific metadata endpoint is
the availability check; Core does not probe a general Control health route.
Standalone managed-form blocks keep their entire section hidden until valid
metadata arrives. When the same managed form is embedded in another block,
only the managed-form region is hidden so surrounding copy and contact details
remain available.
Site defaults live in Hugo configuration:
params:
foundry:
control:
base_url: https://control.example.com
site_key: regulated-production-proof-site
unavailable_behavior: hide
timeout_ms: 5000
Each form can override the availability presentation and request timeout:
content:
form:
mode: managed
form_key: contact-intake
unavailable_behavior: message
timeout_ms: 3000
unavailable_behavior supports hide (the default) and message. Missing or
invalid values resolve to hide. message retains an accessible unavailable
message but never reveals empty controls. timeout_ms defaults to 5000 and
applies to both metadata and submission requests. Numeric values are clamped
to the portable 250–30000 ms range; invalid per-form values fall back to
the normalized site default. A timed-out or failed submission preserves
entered values and selected files where the browser permits, re-enables the
submit button, and resets the form only after a confirmed success response.
The repo setting is the failure fallback when Control cannot answer. When the
metadata endpoint does answer with a disabled availability directive,
Control’s presentation (hide or show_message) and safe public message
take precedence. This lets an authorized Control operator pause one form or
all forms without rebuilding the site, while a missing, rejected, malformed,
or timed-out response still fails closed.
Design options
| Field | Details |
|---|---|
variant | narrow | wide | panel — narrow: max-w-3xl centered (default); wide: max-w-5xl for multi-field forms; panel: framed card with surface background |
css_class | extra CSS classes on outer section |
BEM classes
foundry-managed-formfoundry-managed-form__eyebrowfoundry-managed-form__innerfoundry-managed-form__privacyfoundry-managed-form__statusfoundry-managed-form__textfoundry-managed-form__title
managed-form-panel
Minimum required: form.form_key — everything else is optional.
Two-column managed-form composition for high-consideration services. The
support column remains available for direct contact actions and explanatory
copy while the form column follows the same fail-closed availability contract
as managed-form.
sections:
- block: managed-form-panel
id: consultation-form
content:
support_eyebrow: Consultation support
support_title: Use the form, text, or call
support_text: Choose the contact path that is easiest for you.
support_actions:
- text: Text us
url: sms:+15555550123
style: primary
cta_key: consultation-text
cta_kind: sms
- text: Call us
url: tel:+15555550123
style: secondary
cta_key: consultation-call
cta_kind: tel
form_title: Start your request
form:
mode: managed
form_key: consultation-intake
cta_key: consultation-form
design:
variant: support
Support actions use the shared button and CTA tracking contract. Form fields, submit behavior, availability, and operational privacy copy remain managed by Foundry Control; the site owns the surrounding branded guidance.
media-break
Minimum required: src, alt — everything else is optional.
Full-bleed image or MP4 video break for editorial pages: use it between prose
sections for Munich-style fixed image moments, or as a slower-than-scroll
parallax visual beat with optional overlay copy.
sections:
- block: media-break
id: consultation-room-break
content:
src: "/images/consultation-room.jpg"
alt: high-consideration service proof site consultation room
eyebrow: Consultation
title: The room slows down.
text: A visual pause can sit between article sections without becoming a full pinned chapter.
caption: Optional caption text.
design:
behavior: parallax
height: 88svh
min_height: 30rem
overlay: medium
content_align: left
title_tag: h2
position: center 42%
parallax_speed: "0.12"
parallax_dir: up
css_class: ''
Use behavior: fixed for a desktop background-attachment: fixed image break
that feels locked behind the page as the visitor scrolls through it. Use
behavior: parallax when the image should drift upward more slowly than the
scroll rate. Use behavior: still for a quiet full-bleed image or video break
with no scroll-linked motion.
Design options
| Field | Details |
|---|---|
variants | parallax, fixed, still |
behavior | parallax | fixed | still — parallax drifts the media slower than scroll, fixed uses desktop background-attachment, still renders a static full-bleed media break |
height | CSS length for section height (default: 88svh) |
min_height | CSS length for section minimum height (default: 28rem) |
overlay | none | light | medium | strong — media shade behind optional copy |
content_align | left | center | right — optional overlay copy alignment |
title_tag | h1 | h2 — optional overlay title element for hero vs in-page use (default: h2) |
position | CSS object-position/background-position value (default: center center) |
parallax_speed | 0.0-0.35 — viewport fraction used for slower-than-scroll drift (default: 0.14) |
parallax_dir | up | down — media drift direction as the visitor scrolls (default: up) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-media-breakfoundry-media-break__actionfoundry-media-break__assetfoundry-media-break__captionfoundry-media-break__contentfoundry-media-break__copyfoundry-media-break__emptyfoundry-media-break__eyebrowfoundry-media-break__fixed-bgfoundry-media-break__layerfoundry-media-break__mediafoundry-media-break__shadefoundry-media-break__textfoundry-media-break__title
media-sequence
Minimum required: items — everything else is optional.
Mixed image/video/text storytelling block for creative pages, showcases, and
editorial case-study sequences.
sections:
- block: media-sequence
id: media-sequence-example
content:
text: Example supporting text.
title: Example title
items:
- type: image
title: First frame
text: Supporting description.
src: "/images/example.jpg"
alt: Descriptive alt text
caption: Caption text
credit: Photo credit
- type: video
title: Motion frame
text: Supporting description.
url: "/video/example.mp4"
poster: "/images/example-poster.jpg"
caption: Video caption
- type: quote
quote: This sequence should feel authored, not templated.
author: Example author
- type: credits
title: Project credits
credits:
- label: Series
value: Selected works
- label: Medium
value: Still image / mixed media
design:
variant: story-reel
media_ratio: wide
media_surface: flush
spacing: md
show_progress: true
stagger_items: true
css_class: ''
Use story-reel for mixed-media editorial sequences and work-reel for
selected work lists that benefit from item indexing. Both variants emit the
story-work-reel display pattern and keep progress indicators decorative so
reduced-motion and no-JavaScript states preserve source-order reading.
Content options
| Field | Details |
|---|---|
items[].caption | optional caption rendered below image/video media |
items[].credit | optional credit line rendered below caption |
items[].credits | array of label/value credit rows for type: credits items |
Design options
| Field | Details |
|---|---|
variants | editorial, alternating, cinematic, story-reel, work-reel |
variant | editorial | alternating | cinematic | story-reel | work-reel — mixed-media storytelling layout |
media_ratio | landscape | square | portrait | wide | auto — default media aspect ratio |
media_surface | framed | flush | soft — default media frame treatment |
spacing | sm | md | lg — vertical rhythm between sequence items |
show_progress | true | false — show a reduced-motion-safe scroll progress rail for reel variants (default: true on story-reel/work-reel) |
show_index | true | false — show two-digit item indexes (default: true on work-reel) |
stagger_items | true | false — stagger reel items when item_reveal is not explicitly set (default: true on story-reel/work-reel) |
item_reveal | fade-up | fade-in | slide-left | slide-right | zoom-in | none — explicit per-item reveal style; overrides default reel stagger |
css_class | extra CSS classes on outer section |
BEM classes
foundry-media-sequencefoundry-media-sequence__bodyfoundry-media-sequence__credits-itemfoundry-media-sequence__eyebrowfoundry-media-sequence__galleryfoundry-media-sequence__imagefoundry-media-sequence__indexfoundry-media-sequence__innerfoundry-media-sequence__introfoundry-media-sequence__itemfoundry-media-sequence__itemsfoundry-media-sequence__mediafoundry-media-sequence__media-shellfoundry-media-sequence__progressfoundry-media-sequence__progress-barfoundry-media-sequence__quotefoundry-media-sequence__text-itemfoundry-media-sequence__title
pinned-media-story
Minimum required: items — everything else is optional.
Full-viewport scroll story where each image or MP4 video pins to the back of
the viewport while its chapter copy scrolls over it.
sections:
- block: pinned-media-story
id: city-scroll-story
content:
eyebrow: City guide
title: A day in motion
text: Pair each chapter with the visual that should lock behind it.
primary_action:
text: Plan a visit
url: /visit/
items:
- type: video
title: Morning arrival
text: The opening chapter scrolls while the video remains fixed behind it.
src: "/video/arrival.mp4"
poster: "/images/arrival-poster.jpg"
caption: Short contextual caption.
- type: image
title: Market streets
text: Images use the same pinned treatment as video.
images:
- src: "/images/market-01.jpg"
alt: People walking through a city market
kenburns_preset: in-left
position: center center
- src: "/images/market-02.jpg"
alt: Vendor arranging goods at a city market
kenburns_preset: out-right
position: 55% center
panels:
- eyebrow: First stop
title: Market streets
text: The same pinned media can hold more than one scroll-over text beat.
- eyebrow: Second stop
title: Still the same visual
text: Use panels when one image or rotator should stay locked behind several content moments.
credit: Photo credit
design:
variant: dark
min_height: 120vh
overlay: medium
content_align: left
intro_title_tag: h2
pinned: true
show_progress: true
parallax: true
parallax_speed: "0.14"
parallax_dir: up
kenburns: true
kenburns_interval: 7200
css_class: ''
Design options
| Field | Details |
|---|---|
variants | dark, light, editorial |
variant | dark | light | editorial — pinned full-viewport media storytelling palette |
min_height | CSS length for each chapter scroll span (default: 120vh) |
overlay | none | light | medium | strong — media shade behind copy |
content_align | left | center | right — chapter text alignment |
intro_title_tag | h1 | h2 — intro title element for top-hero vs in-page section use (default: h2) |
pinned | true | false — keep media sticky while chapter panels scroll; false renders the same content as a static chapter stack (default: true) |
show_progress | true | false — show a decorative chapter progress rail scoped to each pinned chapter (default: false) |
parallax | true | false | {speed 0.0-0.35} — normalized alias for media_parallax; item-level parallax can override |
parallax_speed | 0.0-0.35 — normalized alias for media_parallax_speed (default: 0.16) |
parallax_dir | up | down — normalized alias for media_parallax_dir (default: up) |
kenburns | true | false — enable/disable Ken Burns rotation for image chapters; item-level kenburns can override |
kenburns_interval | milliseconds between chapter image crossfades (default: 7200) |
kenburns_transition | milliseconds for crossfade duration between chapter images (default: 1400) |
media_parallax | true | false — compatibility alias for parallax |
media_parallax_speed | 0.0-0.35 — compatibility alias for parallax_speed |
media_parallax_dir | up | down — compatibility alias for parallax_dir |
css_class | extra CSS classes on outer section |
Item-level panels can be used when one pinned image, image rotator, or MP4
should carry several scroll-over text moments. If panels is omitted, the item
renders one panel from its own eyebrow, title, text, caption, credit,
and action fields.
For the Munich-style rhythm of text block, fixed/slower image, then next text
box, prefer media-break. Use pinned-media-story when chapter copy should
scroll over a media plane, or when one image/rotator should remain locked
behind several text beats. Start with min_height: 115vh to 135vh for a
single-panel chapter. Each additional panel adds another full-viewport text
beat over the same pinned image; increase the item min_height only when the
image should linger after the last panel. Use parallax_dir: up for the natural
image-upward drift while scrolling; parallax_speed: "0.10" to "0.16" is
editorial and subtle, while "0.20" to "0.28" is more obvious. Use
show_progress: true only when the progress rail helps orient a longer
chaptered story; it is decorative and hidden under reduced motion.
BEM classes
foundry-pinned-media-storyfoundry-pinned-media-story__actionsfoundry-pinned-media-story__assetfoundry-pinned-media-story__captionfoundry-pinned-media-story__chapterfoundry-pinned-media-story__chapter-eyebrowfoundry-pinned-media-story__chapter-textfoundry-pinned-media-story__chapter-titlefoundry-pinned-media-story__chaptersfoundry-pinned-media-story__contentfoundry-pinned-media-story__creditfoundry-pinned-media-story__eyebrowfoundry-pinned-media-story__introfoundry-pinned-media-story__mediafoundry-pinned-media-story__panelfoundry-pinned-media-story__panel-stackfoundry-pinned-media-story__parallax-layerfoundry-pinned-media-story__rotatorfoundry-pinned-media-story__shadefoundry-pinned-media-story__textfoundry-pinned-media-story__title
media-text
Minimum required: title, text, image - everything else is optional.
Split layout block pairing media with descriptive copy and actions. Named
variants provide stable presets over the lower-level layout knobs.
sections:
- block: media-text
id: media-text-example
content:
eyebrow: Section label
image: "/images/example.jpg"
image_alt: Descriptive alt text
items:
- title: Item title
text: Item description.
kicker: Example value
media_caption: Example value
primary_action:
text: Learn more
url: "/contact/"
secondary_action:
text: Learn more
url: "/contact/"
text: Example supporting text.
title: Example title
design:
variant: split
density: normal
frame: card
layout: balanced
media_fit: cover
media_position: left
media_ratio: landscape
text_measure: normal
vertical_align: center
css_class: ''
Design options
| Field | Details |
|---|---|
variants | split, editorial, feature-panel |
variant | split | editorial | feature-panel — split: balanced media/copy default; editorial: roomier content-led story rhythm; feature-panel: framed copy panel with stronger media emphasis |
media_position | left | right - media placement |
media_ratio | landscape | square | portrait | wide - media aspect ratio |
layout | balanced | media-wide | content-wide | stacked - media/content column balance |
vertical_align | center | start | end - vertical alignment between media and copy |
text_measure | normal | narrow | wide - copy width constraint |
density | normal | compact | spacious - vertical spacing and grid gap |
frame | card | plain | borderless - media frame treatment |
media_fit | cover | contain - image fit inside the media frame |
motion_parallax | number string - optional parallax speed for the media column |
motion_parallax_dir | 1 | -1 - optional media column parallax direction |
css_class | extra CSS classes on outer section |
Non-default layout example
sections:
- block: media-text
id: media-text-editorial-example
content:
title: Editorial image with wider copy
text: Use additive design fields when the same media/copy pattern needs a different balance or rhythm.
image: "/images/example-editorial.jpg"
image_alt: Editorial detail image
design:
variant: editorial
layout: content-wide
vertical_align: start
text_measure: wide
density: spacious
frame: plain
media_fit: contain
BEM classes
foundry-media-textfoundry-media-text__actionsfoundry-media-text__captionfoundry-media-text__contentfoundry-media-text__eyebrowfoundry-media-text__imagefoundry-media-text__innerfoundry-media-text__itemfoundry-media-text__item-iconfoundry-media-text__itemsfoundry-media-text__mediafoundry-media-text__media-framefoundry-media-text__textfoundry-media-text__title
newsletter-inline
Minimum required: none — everything else is optional. Inline email signup form for lead capture inside content flow.
sections:
- block: newsletter-inline
id: newsletter-inline-example
content:
button_text: Submit
form_action: "/api/submit"
placeholder: you@example.com
privacy_note: No spam. Unsubscribe anytime.
text: Example supporting text.
title: Example title
design:
variant: card
css_class: ''
Legacy mode uses form_action.
Managed mode uses content.form and the standard Foundry Control public form API.
Design options
| Field | Details |
|---|---|
variants | card, banner, minimal |
variant | card | banner | minimal — form presentation |
css_class | extra CSS classes on outer section |
BEM classes
foundry-newsletter-inlinefoundry-newsletter-inline__inner
onboarding-timeline
Minimum required: steps — everything else is optional.
Structured onboarding sequence block with phase milestones.
sections:
- block: onboarding-timeline
id: onboarding-timeline-example
content:
steps:
- title: Step title
text: Step detail.
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-onboarding-timelinefoundry-onboarding-timeline__contentfoundry-onboarding-timeline__innerfoundry-onboarding-timeline__itemfoundry-onboarding-timeline__listfoundry-onboarding-timeline__numberfoundry-onboarding-timeline__title
page-list
Minimum required: section — everything else is optional.
Generic content listing block for section pages with card/list/compact modes.
sections:
- block: page-list
id: page-list-example
content:
limit: 6
section: blog
sort: date
text: Example supporting text.
title: Example title
design:
preset: creative-journal-feed
view: list
columns: '3'
show_date: true
show_summary: true
show_image: false
css_class: ''
Creative journal indexes use the creative-journal-feed preset. Listing display
flags (show_date, show_summary, show_image) belong under design because
the block reads them as presentation choices.
Design options
| Field | Details |
|---|---|
variants | cards, list, compact |
view | cards | list | compact — listing layout mode |
columns | 2 | 3 — grid columns for cards mode |
show_date | true | false — show publish date |
show_summary | true | false — show excerpt text |
show_image | true | false — show thumbnails |
css_class | extra CSS classes on outer section |
BEM classes
foundry-page-listfoundry-page-list--cardsfoundry-page-list--compactfoundry-page-list--listfoundry-page-list__actionsfoundry-page-list__bodyfoundry-page-list__cardfoundry-page-list__compactfoundry-page-list__compact-itemfoundry-page-list__emptyfoundry-page-list__gridfoundry-page-list__imagefoundry-page-list__image-linkfoundry-page-list__innerfoundry-page-list__item-titlefoundry-page-list__listfoundry-page-list__list-itemfoundry-page-list__list-layoutfoundry-page-list__metafoundry-page-list__subtitlefoundry-page-list__summaryfoundry-page-list__title
post-hero
Minimum required: title — everything else is optional.
Article-oriented hero with metadata, author context, and optional featured image.
sections:
- block: post-hero
id: post-hero-example
content:
author_image: "/images/example.jpg"
author_name: Author Name
author_role: Example value
category: Example Group
date: '2026-02-22'
image: "/images/example.jpg"
image_alt: Descriptive alt text
read_time: 5 min read
tags:
- compliance
- operations
text: Example supporting text.
title: Example title
design:
variant: centered
css_class: ''
Design options
| Field | Details |
|---|---|
variants | centered, split, stacked |
variant | centered | split | stacked — article hero layout |
css_class | extra CSS classes on outer section |
BEM classes
foundry-post-herofoundry-post-hero__authorfoundry-post-hero__contentfoundry-post-hero__datefoundry-post-hero__imagefoundry-post-hero__innerfoundry-post-hero__mediafoundry-post-hero__metafoundry-post-hero__read-timefoundry-post-hero__splitfoundry-post-hero__standfirstfoundry-post-hero__tagsfoundry-post-hero__title
post-list
Minimum required: section — everything else is optional.
Enhanced blog list block with featured item support and richer card layouts.
sections:
- block: post-list
id: post-list-example
content:
cta:
text: Learn more
url: "/contact/"
featured_first: true
limit: 6
section: blog
sort: date
text: Example supporting text.
title: Example title
design:
view: default
columns: '3'
show_date: true
show_summary: true
show_image: true
show_category: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, list, magazine |
view | cards | list | magazine — listing layout mode |
columns | 2 | 3 — grid columns for cards mode |
show_date | true | false — show publish date |
show_summary | true | false — show excerpt text |
show_image | true | false — show thumbnails |
show_category | true | false — show category badge |
css_class | extra CSS classes on outer section |
BEM classes
foundry-post-listfoundry-post-list__cardfoundry-post-list__ctafoundry-post-list__emptyfoundry-post-list__featuredfoundry-post-list__gridfoundry-post-list__innerfoundry-post-list__listfoundry-post-list__list-itemfoundry-post-list__magazinefoundry-post-list__magazine-itemfoundry-post-list__magazine-leadfoundry-post-list__magazine-stackfoundry-post-list__subtitlefoundry-post-list__title
content-feed
Minimum required: none — query fields are optional but recommended. Query-driven discovery feed that filters pages using normalized discovery metadata instead of section-only listing.
sections:
- block: content-feed
id: content-feed-example
content:
eyebrow: Discover
title: Latest Articles for Operators
text: Curated from shared discovery metadata.
empty_text: No matching content yet.
cta:
text: View all articles
url: "/blog/"
query:
kinds: [article]
sections: [blog]
topics: []
audience: []
series: []
categories: []
tags: []
languages: []
featured_only: false
exclude_current: true
limit: 3
sort: newest
design:
view: cards
columns: '3'
show_image: true
show_summary: true
show_date: true
show_kind: true
show_topics: false
show_audience: false
css_class: ''
Query semantics
- OR within a field
- AND across different fields
- empty
languagesdefaults to the current page language
Supported query fields
kindssectionstopicsaudienceseriescategoriestagslanguagesfeatured_onlyexclude_currentlimitsort
Sort values
newestoldesttitlefeaturedmanual
manual sorts by search.order, then page weight, then newest date.
Design options
| Field | Details |
|---|---|
view | cards | list | compact — feed layout mode |
columns | 2 | 3 | 4 — cards grid columns |
show_image | true | false — show thumbnails |
show_summary | true | false — show excerpt text |
show_date | true | false — show publish date |
show_kind | true | false — show kind badge |
show_topics | true | false — show topic badges |
show_audience | true | false — show audience badge |
css_class | extra CSS classes on outer section |
BEM classes
foundry-content-feedfoundry-content-feed__compactfoundry-content-feed__compact-itemfoundry-content-feed__ctafoundry-content-feed__cardfoundry-content-feed__emptyfoundry-content-feed__eyebrowfoundry-content-feed__gridfoundry-content-feed__innerfoundry-content-feed__listfoundry-content-feed__list-itemfoundry-content-feed__textfoundry-content-feed__title
pricing-comparison
Minimum required: plans — everything else is optional.
Pricing comparison matrix block across plans or competitors.
sections:
- block: pricing-comparison
id: pricing-comparison-example
content:
plans: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-pricing-comparisonfoundry-pricing-comparison__cellfoundry-pricing-comparison__innerfoundry-pricing-comparison__rowfoundry-pricing-comparison__tablefoundry-pricing-comparison__tierfoundry-pricing-comparison__title
pricing-tiers
Minimum required: tiers — everything else is optional.
Tiered pricing card block with features and emphasis controls.
sections:
- block: pricing-tiers
id: pricing-tiers-example
content:
tiers: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | grid, featured, stacked |
variant | grid | featured | stacked — grid: 3 equal cards (default); featured: tier with featured: true gets brand-accent elevated treatment; stacked: full-width rows with feature list |
css_class | extra CSS classes on outer section |
Set featured: true on a tier to elevate it in the featured variant.
BEM classes
foundry-pricing-tiersfoundry-pricing-tiers__cardfoundry-pricing-tiers__featuresfoundry-pricing-tiers__gridfoundry-pricing-tiers__innerfoundry-pricing-tiers__pricefoundry-pricing-tiers__title
prose-panel
Minimum required: text — everything else is optional.
Contained prose block for narrative or explainer content.
sections:
- block: prose-panel
id: prose-panel-example
content:
text: Example supporting text.
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-prose-panelfoundry-prose-panel__contentfoundry-prose-panel__inner
pullquote
Minimum required: quote — everything else is optional.
Editorial pull-quote emphasis block for long-form content.
sections:
- block: pullquote
id: pullquote-example
content:
author: Author Name
quote: A representative quote for this block.
role: Role or title
design:
variant: accent-bar
align: center
css_class: ''
Design options
| Field | Details |
|---|---|
variants | accent-bar, filled, oversized, minimal |
variant | accent-bar | filled | oversized | minimal — pullquote styling |
align | center | left — quote alignment |
css_class | extra CSS classes on outer section |
BEM classes
foundry-pullquotefoundry-pullquote__attributionfoundry-pullquote__boxfoundry-pullquote__innerfoundry-pullquote__quote
quote
Minimum required: quote — everything else is optional.
Standalone quotation block for prominent statements with attribution.
sections:
- block: quote
id: quote-example
content:
author: Author Name
image: "/images/example.jpg"
quote: A representative quote for this block.
role: Role or title
design:
variant: centered
css_class: ''
Design options
| Field | Details |
|---|---|
variants | centered, left, large |
variant | centered | left | large — quote presentation |
css_class | extra CSS classes on outer section |
BEM classes
foundry-quotefoundry-quote__author-textfoundry-quote__author-wrapfoundry-quote__figurefoundry-quote__innerfoundry-quote__markfoundry-quote__metafoundry-quote__text
related-posts
Minimum required: section — everything else is optional.
Related content recommendation block sourced from a section.
sections:
- block: related-posts
id: related-posts-example
content:
exclude_current: true
limit: 6
section: blog
title: Example title
design:
view: default
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, compact |
view | cards | compact — related links layout |
css_class | extra CSS classes on outer section |
BEM classes
foundry-related-postsfoundry-related-posts__cardfoundry-related-posts__compactfoundry-related-posts__gridfoundry-related-posts__innerfoundry-related-posts__title
relationship-map
Minimum required: title — everything else is optional.
Renders a bounded set of related graph nodes around the current page’s
graph.key or an explicit content.node_key. Relationship and result-kind
filters keep the surface contextual instead of exposing a raw graph canvas.
sections:
- block: relationship-map
id: related-paths
content:
title: "Explore related paths"
direction: incoming
relationships: ["explores", "can-pair-with"]
result_kinds: ["category", "option", "resource"]
limit: 6
Design options
| Field | Details |
|---|---|
content.direction | outgoing | incoming | both — relationship direction from the current node; bidirectional edges remain visible from either side |
variant | grid | compact — related-node presentation |
css_class | extra CSS classes on outer section |
resource-downloads
Minimum required: resources — everything else is optional.
Download resource listing block with item metadata.
sections:
- block: resource-downloads
id: resource-downloads-example
content:
email_placeholder: Example value
form_action: "/api/submit"
form_title: Example value
privacy_note: No spam. Unsubscribe anytime.
resources: Example value
submit_text: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Legacy mode uses form_action.
Managed mode uses content.form and the standard Foundry Control public form API.
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-resource-downloadsfoundry-resource-downloads__gridfoundry-resource-downloads__innerfoundry-resource-downloads__itemfoundry-resource-downloads__linkfoundry-resource-downloads__title
rich-text
Minimum required: text — everything else is optional.
Long-form prose block with editorial layout variants.
sections:
- block: rich-text
id: rich-text-example
content:
dropcap: true
title: Example title
text: Example supporting text.
design:
preset: creative-project-notes
variant: magazine
max_width: lg
css_class: ''
Creative work-detail pages use the creative-project-notes preset for governed
project notes and credits. content.title is optional and renders as
foundry-rich-text__title above the rich body.
Content options
| Field | Details |
|---|---|
title | optional heading rendered above the rich text body |
dropcap | true | false — show an editorial drop cap on the first paragraph when variant is magazine |
Design options
| Field | Details |
|---|---|
variants | centered, wide, two-column, magazine |
variant | centered | wide | two-column | magazine — article layout |
max_width | prose | md | lg | xl | full — container width |
css_class | extra CSS classes on outer section |
BEM classes
foundry-rich-textfoundry-rich-text--centeredfoundry-rich-text--magazinefoundry-rich-text--two-columnfoundry-rich-text--widefoundry-rich-text__bodyfoundry-rich-text__innerfoundry-rich-text__title
search
Minimum required: none — everything else is optional. Static-site search interface powered by Pagefind with Foundry styling and graceful fallback.
sections:
- block: search
id: search-example
content:
eyebrow: Search
title: Search the site
text: Find pages, docs, and resources.
placeholder: Search...
loading_text: Loading search index...
empty_text: Start typing to search.
zero_state_title: Start with a treatment, topic, or audience
zero_state_text: Use search directly or begin with one of the curated paths below.
no_results_text: No matching results found.
no_results_title: No exact matches
no_results_panel_text: Try a broader term, adjust the filters, or choose a guided next step.
unavailable_text: Search index unavailable.
clear_filters_text: Clear filters
clear_all_text: Clear all
sort_label: Sort
sort_option_labels:
relevance: Best match
newest: Newest first
overlay_title: Quick search
overlay_text: Jump to the most relevant pages.
overlay_placeholder: Search treatments, articles, and pages...
overlay_empty_text: Start with a search, suggestion, or quick link.
overlay_loading_text: Searching...
overlay_no_results_text: No exact matches yet.
overlay_view_all_text: View all results
overlay_close_label: Close search
overlay_shortcut_text: Press / or Cmd/Ctrl+K
overlay_suggested_queries:
- label: Botox
query: botox
overlay_quick_links:
- label: Treatments
url: /treatments/
description: Explore treatment categories.
overlay_no_results_actions:
- label: Contact
url: /contact/
description: Ask for help.
filter_labels:
kind: Type
topic: Topic
audience: Audience
filter_all_labels:
kind: All types
topic: All topics
audience: All audiences
design:
variant: default
show_images: true
show_sub_results: false
excerpt_length: 22
debounce: 250
filter_fields: [kind, topic, audience]
primary_filter_field: kind
sort_options: [relevance, newest]
default_sort: relevance
sync_query_to_url: true
overlay_enabled: true
overlay_results_limit: 5
overlay_min_query_length: 2
overlay_debounce: 160
css_class: ''
Design options
| Field | Details |
|---|---|
variants | default, minimal |
variant | default | minimal — search panel style |
show_images | true | false — include thumbnails in results |
show_sub_results | true | false — include sub-result snippets |
excerpt_length | number of words shown in result excerpt |
debounce | debounce in milliseconds before querying |
filter_fields | comma list or array of discovery filters to render |
primary_filter_field | optional field rendered as tabs instead of a select |
sort_options | optional sort values rendered as the full-page sort control |
default_sort | optional default sort value; defaults to the first configured option |
sync_query_to_url | true | false — keep q and filter.* state in the URL |
overlay_enabled | true | false — enable the global quick-search overlay from this localized block |
overlay_results_limit | number of overlay results shown before linking to the full page |
overlay_min_query_length | minimum characters before the overlay starts querying |
overlay_debounce | overlay debounce in milliseconds |
css_class | extra CSS classes on outer section |
Optional content fields
| Field | Details |
|---|---|
clear_filters_text | text for the filter reset control |
clear_all_text | text for the summary-level reset that clears query and filters |
sort_label | label shown above the full-page sort control |
sort_option_labels | map of sort option labels keyed by sort value |
filter_labels | map of field labels keyed by filter name |
filter_all_labels | map of default option labels keyed by filter name |
zero_state_title | heading shown in the full-page zero state |
zero_state_text | supporting copy shown in the full-page zero state |
zero_state_suggested_queries_label | heading above the full-page zero-state query chips |
zero_state_quick_links_label | heading above the full-page zero-state quick links |
zero_state_suggested_queries | list of { label, query } chips shown before any search runs |
zero_state_quick_links | list of { label, url, description } links shown in the full-page zero state |
no_results_title | heading shown when the full-page search returns no matches |
no_results_panel_text | supporting copy shown in the full-page no-results state |
no_results_suggested_queries_label | heading above the full-page no-results query chips |
no_results_actions_label | heading above the full-page no-results recovery links |
no_results_suggested_queries | list of { label, query } chips shown when there are no matches |
no_results_actions | list of { label, url, description } recovery links shown when there are no matches |
overlay_title | heading shown in the quick-search overlay |
overlay_text | supporting copy in the quick-search overlay |
overlay_placeholder | overlay input placeholder |
overlay_empty_text | zero-state copy shown before a search runs |
overlay_loading_text | overlay loading message |
overlay_no_results_text | overlay empty-results message |
overlay_view_all_text | CTA label that opens the full search page |
overlay_close_label | accessible label for closing the overlay |
overlay_shortcut_text | helper text for keyboard shortcuts |
overlay_suggested_queries_label | heading above the overlay suggestion chips |
overlay_quick_links_label | heading above the overlay quick links |
overlay_recovery_label | heading above the overlay no-results actions |
overlay_suggested_queries | list of { label, query } suggestion chips |
overlay_quick_links | list of { label, url, description } links shown in zero state |
overlay_no_results_actions | list of { label, url, description } recovery actions |
Discovery metadata
Search and future discovery blocks resolve page metadata through the shared
partial "foundry/helpers/discovery-model.html" helper.
Preferred front matter:
search:
exclude: false
kind: article
section: blog
topics: [neurotoxin]
audience: [men]
series: []
featured: false
order: 0
summary: ""
image: ""
image_alt: ""
Backward-compatible aliases still supported by the resolver:
search_exclude->search.excludesearch_section->search.sectionaudience->search.audiencefeatured->search.featuredfeatured_image/image/og_image->search.image- page or param description/summary ->
search.summary
Current Pagefind emission uses the normalized model for:
kindtopicaudienceseriessectioncategoryauthortaglanguage
URL state
The search block hydrates from shared URL parameters on load:
q=<query>- repeated
filter.kind=<slug> - repeated
filter.topic=<slug> - repeated
filter.audience=<slug> - repeated
filter.series=<slug> - optional
sort=<value>
If the page loads with filters but no q, Foundry runs a filter-only Pagefind query so
filtered discovery links can land on a meaningful result set.
Filter controls use design.filter_fields and pull option labels from
data/foundry/discovery.yaml when that registry is available.
If design.primary_filter_field matches one of those fields, Foundry renders it as a
primary tab bar and keeps the remaining filters in the secondary control row.
If design.overlay_enabled is true, Foundry uses the localized search block content as
the source for the global quick-search overlay triggered from the shared search button,
/, or Cmd/Ctrl+K.
The overlay supports keyboard focus trapping, arrow-key result navigation, and a
mobile-first sheet layout while preserving the normal /search/ link as the no-JS
fallback.
BEM classes
foundry-searchfoundry-search__appfoundry-search__eyebrowfoundry-search__innerfoundry-search__mountfoundry-search__noscriptfoundry-search__panelfoundry-search__statusfoundry-search__textfoundry-search__title
Optional component tokens
Themes can skin the shared search UI without selector overrides by setting optional --foundry-search-* tokens. The most useful ones are:
--foundry-search-panel-bg--foundry-search-panel-shadow--foundry-search-input-border--foundry-search-input-bg--foundry-search-clear-border--foundry-search-clear-bg--foundry-search-filter-label-color--foundry-search-filter-border--foundry-search-filter-bg--foundry-search-filter-color--foundry-search-filter-focus-border--foundry-search-filter-focus-ring--foundry-search-reset-color--foundry-search-reset-hover-color--foundry-search-tabbar-label-color--foundry-search-tab-bg--foundry-search-tab-border--foundry-search-tab-color--foundry-search-tab-active-bg--foundry-search-tab-active-border--foundry-search-tab-active-color--foundry-search-summary-border--foundry-search-summary-bg--foundry-search-summary-chip-bg--foundry-search-summary-chip-border--foundry-search-summary-chip-color--foundry-search-summary-clear-color--foundry-search-summary-clear-hover-color--foundry-search-overlay-backdrop--foundry-search-overlay-surface--foundry-search-overlay-border--foundry-search-overlay-shadow--foundry-search-overlay-chip-bg--foundry-search-overlay-chip-border--foundry-search-overlay-chip-color--foundry-search-overlay-link-bg--foundry-search-overlay-link-border--foundry-search-overlay-link-hover-border--foundry-search-overlay-link-shadow--foundry-search-card-radius--foundry-search-card-border--foundry-search-card-bg--foundry-search-card-shadow--foundry-search-card-hover-shadow--foundry-search-media-border--foundry-search-pill-bg--foundry-search-pill-color--foundry-search-title-hover--foundry-search-tag-bg--foundry-search-tag-color
All of these fall back to the global --foundry-* tokens if they are not set by a theme.
section-header
Minimum required: title — everything else is optional.
Reusable heading intro block used to start a section consistently.
sections:
- block: section-header
id: section-header-example
content:
cta:
text: Learn more
url: "/contact/"
eyebrow: Section label
text: Example supporting text.
title: Example title
design:
align: center
size: lg
title_tag: h2
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
align | center | left — heading alignment |
size | sm | md | lg | xl — heading scale |
title_tag | h1 | h2 — heading element for page-opening vs in-page use (default: h2) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-section-headerfoundry-section-header__ctafoundry-section-header__eyebrowfoundry-section-header__innerfoundry-section-header__textfoundry-section-header__title
slideshow
Minimum required: slides — everything else is optional.
Auto-advancing slideshow/carousel with optional overlays and controls.
sections:
- block: slideshow
id: slideshow-example
content:
slides:
- src: "/images/slide-1.jpg"
alt: Slide image
title: Slide title
text: Slide copy
text: Example supporting text.
title: Example title
design:
variant: fade
aspect: '16:9'
autoplay: true
interval: 5000
show_dots: true
show_arrows: true
show_overlay: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | fade, slide, cards |
variant | fade | slide | cards — transition style |
aspect | 16:9 | 4:3 | 21:9 | auto — viewport ratio |
autoplay | true | false — auto-advance slides |
interval | milliseconds between slide advances (default: 5000) |
show_dots | true | false — dot navigation visibility |
show_arrows | true | false — arrow navigation visibility |
show_overlay | true | false — caption overlay visibility |
css_class | extra CSS classes on outer section |
BEM classes
foundry-slideshowfoundry-slideshow__arrowfoundry-slideshow__arrow--nextfoundry-slideshow__arrow--prevfoundry-slideshow__dotfoundry-slideshow__dotsfoundry-slideshow__emptyfoundry-slideshow__framesfoundry-slideshow__innerfoundry-slideshow__overlayfoundry-slideshow__slidefoundry-slideshow__stackfoundry-slideshow__subtitlefoundry-slideshow__titlefoundry-slideshow__trackfoundry-slideshow__viewport
social-preview-grid
Minimum required: one of items or items_data.
Static-first grid for normalized Social & Presence items.
sections:
- block: social-preview-grid
id: social-preview-grid-example
content:
title: Recent studio activity
text: Selected updates from public channels and site-owned media.
items:
- id: studio-process-2026-05
source_mode: curated
platform: instagram
kind: image
title: Studio process
caption: A short editor-owned caption.
published_at: 2026-05-18
permalink: https://www.instagram.com/p/example/
media:
- src: /images/social/studio-process.jpg
type: image
alt: Artist preparing wax work in the studio.
rights: client-owned-or-permitted
design:
variant: cards
columns: 3
aspect: square
sort: manual
privacy_mode: click-to-load
css_class: ''
items_data resolves a dot path under site.Data, such as
presence.studio-rss. The resolved value may be a list of items or a collection
object with an items array.
The block supports curated, embed, static-import, and api source modes
only as normalized static items. Provider API calls, OAuth, scheduled sync, and
media downloading are outside this block.
Design options
| Field | Details |
|---|---|
variants | cards, compact, editorial |
variant | cards | compact | editorial - card grid presentation |
columns | 2 | 3 | 4 - desktop grid columns |
aspect | square | landscape | portrait | auto - media thumbnail ratio |
sort | manual | newest | featured - item ordering |
limit | number of items to render; 0 renders all |
privacy_mode | click-to-load | inline | link-only - third-party embed behavior |
show_platform | true | false - show platform label |
show_date | true | false - show published date |
show_caption | true | false - show item caption |
show_source_mode | true | false - show source mode badge |
css_class | extra CSS classes on outer section |
BEM classes
foundry-social-preview-gridfoundry-social-preview-grid__bodyfoundry-social-preview-grid__captionfoundry-social-preview-grid__embedfoundry-social-preview-grid__embed-framefoundry-social-preview-grid__embed-loaderfoundry-social-preview-grid__emptyfoundry-social-preview-grid__gridfoundry-social-preview-grid__imagefoundry-social-preview-grid__innerfoundry-social-preview-grid__itemfoundry-social-preview-grid__item-titlefoundry-social-preview-grid__linkfoundry-social-preview-grid__mediafoundry-social-preview-grid__metafoundry-social-preview-grid__placeholderfoundry-social-preview-grid__textfoundry-social-preview-grid__titlefoundry-social-preview-grid__video
social-share
Minimum required: platforms — everything else is optional.
Share controls for social and copy-link actions.
sections:
- block: social-share
id: social-share-example
content:
platforms:
- twitter
- linkedin
- email
title: Example title
design:
variant: buttons
css_class: ''
Design options
| Field | Details |
|---|---|
variants | buttons, icons, minimal |
variant | buttons | icons | minimal — share control style |
css_class | extra CSS classes on outer section |
BEM classes
foundry-social-sharefoundry-social-share__buttonfoundry-social-share__button--copyfoundry-social-share__innerfoundry-social-share__listfoundry-social-share__statusfoundry-social-share__title
stats-band
Minimum required: stats — everything else is optional.
Horizontal KPI/statistics band with palette variants.
sections:
- block: stats-band
id: stats-band-example
content:
stats:
- label: Metric
value: 95%
subtitle: Example value
title: Example title
design:
variant: dark
css_class: ''
Design options
| Field | Details |
|---|---|
variants | dark, light, brand |
variant | dark | light | brand — band palette |
css_class | extra CSS classes on outer section |
BEM classes
foundry-stats-bandfoundry-stats-band--brandfoundry-stats-band--darkfoundry-stats-band--lightfoundry-stats-band__gridfoundry-stats-band__innerfoundry-stats-band__itemfoundry-stats-band__labelfoundry-stats-band__subtitlefoundry-stats-band__titlefoundry-stats-band__value
stats-grid
Minimum required: stats — everything else is optional.
Grid-based statistics block for grouped numeric highlights.
sections:
- block: stats-grid
id: stats-grid-example
content:
stats:
- label: Metric
value: 95%
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | grid, band, highlighted |
variant | grid | band | highlighted — grid: 4-col centered cards (default); band: horizontal inline row, no card wrappers; highlighted: brand-accent colored cards |
css_class | extra CSS classes on outer section |
BEM classes
foundry-stats-gridfoundry-stats-grid__gridfoundry-stats-grid__innerfoundry-stats-grid__itemfoundry-stats-grid__labelfoundry-stats-grid__titlefoundry-stats-grid__value
steps
Minimum required: steps — everything else is optional.
Step-by-step process block with numbered or icon-based steps. Generated number badges and Step N footers automatically hide when a title already starts with the matching step number.
sections:
- block: steps
id: steps-example
content:
steps:
- title: Step title
text: Step detail.
subtitle: Example value
title: Example title
design:
variant: cards
columns: '3'
show_icons: true
show_marker: auto
show_meta: auto
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, plain, numbered |
variant | cards | plain | numbered — cards: card per step (default); plain: no card background; numbered: large editorial step number above text, no badge circle |
columns | 2 | 3 | 4 — grid columns |
show_icons | true | false — use step icon instead of numbers |
show_marker | auto | true | false — control the generated badge; auto hides it when the title already includes the matching number |
show_meta | auto | true | false — control the generated Step N footer; auto hides it when the title already includes the matching number |
css_class | extra CSS classes on outer section |
BEM classes
foundry-stepsfoundry-steps__contentfoundry-steps__gridfoundry-steps__innerfoundry-steps__itemfoundry-steps__item-innerfoundry-steps__item-metafoundry-steps__item-textfoundry-steps__item-titlefoundry-steps__numberfoundry-steps__subtitlefoundry-steps__title
table-of-contents
Minimum required: (none) — everything else is optional.
Manual or auto-generated anchor navigation block for long pages. Use
chapter-index when the TOC is serving as a governed editorial chapter index.
sections:
- block: table-of-contents
id: table-of-contents-example
content:
title: Example title
design:
preset: creative-chapter-index
variant: chapter-index
depth: 3
numbered: true
mobile: compact
progress: true
sticky: true
css_class: ''
Sidebar and chapter-index modes include active-section tracking,
completed-state styling hooks, a progress rail, and compact mobile behavior by
default. The widget also respects the shared header offset so anchor jumps land
below fixed headers.
Creative work-detail starters use the creative-chapter-index preset, which
aliases the governed chapter-index configuration for Creative pages.
Design options
| Field | Details |
|---|---|
variants | sidebar, inline, compact, chapter-index |
variant | sidebar | inline | compact | chapter-index — TOC container style |
depth | 2 | 3 — heading depth when auto-generating |
numbered | true | false — ordered list vs unordered list |
mobile | compact | expanded — compact sticky mobile toggle vs always-open list |
progress | true | false — show the scroll progress rail inside the widget |
sticky | true | false — keep the widget pinned on larger viewports |
css_class | extra CSS classes on outer section |
BEM classes
foundry-table-of-contentsfoundry-table-of-contents__autofoundry-table-of-contents__currentfoundry-table-of-contents__headfoundry-table-of-contents__innerfoundry-table-of-contents__itemfoundry-table-of-contents__linkfoundry-table-of-contents__listfoundry-table-of-contents__panelfoundry-table-of-contents__progressfoundry-table-of-contents__titlefoundry-table-of-contents__togglefoundry-table-of-contents__widgetfoundry-table-of-contents__widget--chapter-index
tabs
Minimum required: tabs — everything else is optional.
Tabbed content block for switching between related panels.
sections:
- block: tabs
id: tabs-example
content:
tabs:
- label: Overview
text: Tab content.
title: Example title
design:
variant: underline
css_class: ''
Design options
| Field | Details |
|---|---|
variants | underline, pills, bordered |
variant | underline | pills | bordered — tab trigger style |
css_class | extra CSS classes on outer section |
BEM classes
foundry-tabsfoundry-tabs__controlsfoundry-tabs__emptyfoundry-tabs__innerfoundry-tabs__panelfoundry-tabs__panelsfoundry-tabs__tabfoundry-tabs__tablistfoundry-tabs__title
team-grid
Minimum required: members — everything else is optional.
Team member grid block with role and bio summaries.
sections:
- block: team-grid
id: team-grid-example
content:
members: Example value
subtitle: Example value
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | grid, compact, list |
variant | grid | compact | list — grid: 3-col cards with bio (default); compact: 4-col, no bio, photo+name+role; list: horizontal rows, photo left + full bio |
css_class | extra CSS classes on outer section |
BEM classes
foundry-team-gridfoundry-team-grid__cardfoundry-team-grid__gridfoundry-team-grid__innerfoundry-team-grid__namefoundry-team-grid__rolefoundry-team-grid__title
testimonials
Minimum required: testimonials — everything else is optional.
Static testimonial grid block for social proof.
sections:
- block: testimonials
id: testimonials-example
content:
subtitle: Example value
testimonials:
- quote: Strong result quote.
author: Client Name
rating: 5
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | grid, featured, stacked |
variant | grid | featured | stacked — grid: 3-col card grid (default); featured: first quote large + 2-col supporting; stacked: single centered column |
css_class | extra CSS classes on outer section |
BEM classes
foundry-testimonialsfoundry-testimonials__authorfoundry-testimonials__featuredfoundry-testimonials__gridfoundry-testimonials__innerfoundry-testimonials__itemfoundry-testimonials__quotefoundry-testimonials__stackfoundry-testimonials__title
testimonials-carousel
Minimum required: testimonials — everything else is optional.
Scrollable testimonial carousel for longer quote sets.
sections:
- block: testimonials-carousel
id: testimonials-carousel-example
content:
subtitle: Example value
testimonials:
- quote: Strong result quote.
author: Client Name
rating: 5
title: Example title
design:
variant: cards
show_rating: true
show_icons: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, spotlight, compact |
variant | cards | spotlight | compact — cards: even scrolling cards; spotlight: first testimonial gets stronger emphasis; compact: denser quote strip |
show_rating | true | false — show rating stars when rating is provided |
show_icons | true | false — show quote icon badge |
css_class | extra CSS classes on outer section |
BEM classes
foundry-testimonials-carouselfoundry-testimonials-carousel__authorfoundry-testimonials-carousel__iconfoundry-testimonials-carousel__icon-wrapfoundry-testimonials-carousel__innerfoundry-testimonials-carousel__itemfoundry-testimonials-carousel__metafoundry-testimonials-carousel__quotefoundry-testimonials-carousel__ratingfoundry-testimonials-carousel__rolefoundry-testimonials-carousel__subtitlefoundry-testimonials-carousel__titlefoundry-testimonials-carousel__track
timeline
Minimum required: events — everything else is optional.
Chronological timeline block for milestones and sequences.
sections:
- block: timeline
id: timeline-example
content:
title: Example title
subtitle: Example value
events:
- date: June 2026
title: Exhibition title
text: Venue, City. Short context.
badge: Upcoming
url: https://example.com
design:
preset: creative-exhibition-spine
variant: compact
css_class: ''
Creative exhibitions and events pages use the creative-exhibition-spine preset
for a compact editorial timeline instead of card stacking.
Content options
| Field | Details |
|---|---|
events[].date | event date or display range |
events[].title | event, exhibition, screening, launch, or talk title |
events[].text | venue, location, or short event context |
events[].badge | optional status label such as Upcoming, Recent, or Archive |
events[].url | optional event detail URL |
Design options
| Field | Details |
|---|---|
variants | vertical, cards, compact |
variant | vertical | cards | compact — vertical: left-border spine (default); cards: standalone card grid, no spine; compact: tighter spine for long lists |
css_class | extra CSS classes on outer section |
BEM classes
foundry-timelinefoundry-timeline--cardsfoundry-timeline--compactfoundry-timeline--verticalfoundry-timeline__contentfoundry-timeline__innerfoundry-timeline__itemfoundry-timeline__listfoundry-timeline__markerfoundry-timeline__title
topic-chip-nav
Minimum required: items — everything else is optional.
Topic chip navigation block for quick in-page or inter-page filtering.
sections:
- block: topic-chip-nav
id: topic-chip-nav-example
content:
items:
- title: Item title
text: Item description.
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-topic-chip-navfoundry-topic-chip-nav__chipfoundry-topic-chip-nav__innerfoundry-topic-chip-nav__listfoundry-topic-chip-nav__title
trust-badges
Minimum required: items — everything else is optional.
Badge strip for compliance, trust, and credibility signals.
sections:
- block: trust-badges
id: trust-badges-example
content:
items:
- title: Item title
text: Item description.
title: Example title
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variant | chips | logos | list — chips: flex-wrap badge chips (default); logos: image-first grayscale tiles (uses items[].image); list: vertical checkmark list for certifications |
css_class | extra CSS classes on outer section |
BEM classes
foundry-trust-badgesfoundry-trust-badges__gridfoundry-trust-badges__innerfoundry-trust-badges__itemfoundry-trust-badges__listfoundry-trust-badges__logofoundry-trust-badges__title
video-embed
Minimum required: url — everything else is optional.
Privacy-first video embed block supporting YouTube, Vimeo, and MP4.
sections:
- block: video-embed
id: video-embed-example
content:
caption: Optional caption text.
poster: "/images/example.jpg"
text: Example supporting text.
title: Example title
transcript: Transcript excerpt goes here.
url: https://example.com
design:
variant: standard
aspect: '16:9'
autoplay: true
css_class: ''
Design options
| Field | Details |
|---|---|
variants | standard, cinema, card |
variant | standard | cinema | card — video frame presentation |
aspect | 16:9 | 4:3 | 1:1 | 9:16 — embed ratio |
autoplay | true | false — autoplay for self-hosted video |
css_class | extra CSS classes on outer section |
BEM classes
foundry-video-embedfoundry-video-embed__captionfoundry-video-embed__emptyfoundry-video-embed__figurefoundry-video-embed__framefoundry-video-embed__iframefoundry-video-embed__innerfoundry-video-embed__playfoundry-video-embed__posterfoundry-video-embed__poster-placeholderfoundry-video-embed__shellfoundry-video-embed__subtitlefoundry-video-embed__titlefoundry-video-embed__transcript
video-hero
Minimum required: title, text — everything else is optional.
Hero block with video/media backdrop treatment.
sections:
- block: video-hero
id: video-hero-example
content:
bullets: Example value
eyebrow: Section label
image: "/images/example.jpg"
image_alt: Descriptive alt text
primary_action:
text: Learn more
url: "/contact/"
secondary_action:
text: Learn more
url: "/contact/"
text: Example supporting text.
title: Example title
video_caption: Example value
video_poster: Example value
video_url: Example value
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
css_class | extra CSS classes on outer section |
BEM classes
foundry-video-herofoundry-video-hero__actionsfoundry-video-hero__innerfoundry-video-hero__mediafoundry-video-hero__overlayfoundry-video-hero__textfoundry-video-hero__title
full-bleed-split
Minimum required: title, text — everything else is optional.
Cinematic editorial split layout with full-height media and structured narrative content.
sections:
- block: full-bleed-split
id: full-bleed-example
content:
eyebrow: The property
title: One house. Nothing held back.
text: A narrative section pairing full-bleed imagery with editorial copy.
items:
- Indoor hot tub porch
- Sauna and cold shower
image: /images/property-detail.jpg
image_alt: Property detail image
primary_action:
text: Explore spaces
url: /property/
design:
image_position: right
bg: light
parallax: true
parallax_speed: '0.2'
parallax_dir: '-1'
kenburns: true
kenburns_interval: '8000'
reveal: slide-left
css_class: ''
Design options
| Field | Details |
|---|---|
variants | (none) |
image_position | right | left — image column position |
min_height | 80vh | 100vh | 70vh — section minimum height |
bg | light | dark | stone | cream — section palette |
parallax | true | false — enable/disable image parallax |
parallax_speed | number string — parallax speed (default: 0.2) |
parallax_dir | 1 | -1 — parallax direction |
kenburns | true | false — enable/disable image Ken Burns |
kenburns_interval | milliseconds for multi-image crossfade |
reveal | slide-right | slide-left | fade-up | fade-in — text reveal style |
css_class | extra CSS classes on outer section |
BEM classes
foundry-full-bleed-split
motion-hero
Minimum required: title - everything else is optional.
Full-screen motion-forward hero showcasing reveal, parallax, and Ken Burns engines in one section.
sections:
- block: motion-hero
id: motion-hero-example
content:
eyebrow: Foundry motion toolkit
title: Scroll-native motion, zero dependencies.
text: Demonstrates layered parallax and optional Ken Burns image cycling.
background_images:
- /images/motion-hero-1.jpg
- /images/motion-hero-2.jpg
primary_action:
text: See live demos
url: /motion/
secondary_action:
text: View reference
url: /docs/
design:
parallax: true
parallax_speed: '0.25'
parallax_dir: up
parallax_front_speed: '0.45'
parallax_front_dir: '-1'
kenburns: true
kenburns_preset: in
kenburns_interval: '6000'
kenburns_transition: '1400'
scroll_cue: true
show_badges: true
overlay_strength: current
overlay_tone: current
content_align: center
min_height: screen
scroll_nudge: true
badge_style: engine
Use the additive visual controls when a site needs theme-safe presentation tuning without forking the block partial:
sections:
- block: motion-hero
content:
title: Cinematic without a local fork
text: Left-aligned copy, neutral overlay, safe crop controls, and proof badges using the same motion runtime.
caption: Studio image sequence, cropped safely on mobile.
badges:
- label: Proof badge
- label: Brand-safe
design:
overlay_strength: medium
overlay_tone: neutral
overlay_shape: left
object_position: center center
mobile_object_position: center top
content_align: left
content_position: lower
content_width: narrow
content_panel: glass
action_style: glass
min_height: large
mobile_min_height: compact
scroll_cue: false
badge_style: proof
badge_position: under-copy
caption_position: bottom-right
ambient_layers: false
Design options
| Field | Details |
|---|---|
variants | (none) |
parallax | true | false | {speed 0.0-0.35} — enable/disable background parallax layers |
parallax_speed | 0.0-0.35 — normalized background parallax speed; compatibility alias for parallax_back_speed (default: 0.25) |
parallax_dir | up | down | 1 | -1 — normalized background parallax direction (default: up) |
kenburns | true | false - enable/disable Ken Burns background cycling |
kenburns_preset | in | out | in-left | in-right | out-left | out-right — default Ken Burns preset for images without item presets |
scroll_cue | true | false — show/hide reduced-motion-safe scroll cue; compatibility alias for scroll_nudge |
show_badges | true | false - show/hide badge row |
overlay_strength | current | none | soft | medium | strong - overlay shade strength; current preserves legacy output |
overlay_tone | current | neutral | warm | cool | brand - overlay color mood |
overlay_shape | full | left | right | bottom - directional scrim shape for readable copy over busy media |
object_position | CSS object-position value for background images without item-level position (default: center center) |
mobile_object_position | CSS object-position override for small screens |
content_align | center | left | right - hero copy and action alignment |
content_position | center | upper | lower - vertical copy placement |
content_width | narrow | standard | wide - copy measure and action row width |
content_panel | none | glass | solid - optional readability panel behind copy |
action_style | solid | glass | minimal - CTA treatment |
badge_position | bottom | under-copy - badge row placement |
caption_position | bottom-right | bottom-left | under-copy - optional content.caption/media_caption placement |
ambient_layers | true | false - toggle decorative parallax ambient layers independently from media parallax |
min_height | screen | large | medium - hero minimum height |
mobile_min_height | screen | large | medium | compact | CSS length - optional small-screen minimum height override |
scroll_nudge | true | false - compatibility alias for scroll_cue |
badge_style | engine | proof | none - engine demo badges, content proof badges, or no badge row |
parallax_back_speed | number string - compatibility alias for parallax_speed |
parallax_front_speed | number string - foreground parallax speed (default: 0.45) |
parallax_front_dir | 1 | -1 - foreground parallax direction |
kenburns_interval | milliseconds between background image crossfades (default: 6000) |
kenburns_transition | milliseconds for crossfade duration between images (default: 1400) |
BEM classes
foundry-motion-herofoundry-motion-hero__contentfoundry-motion-hero__imagefoundry-motion-hero__badgesfoundry-motion-hero__captionfoundry-motion-hero__scrollfoundry-scroll-cue
property-amenities
Minimum required: title, plus one of signature_items or signature_items_data, one of categories or categories_data, and one of included_items or included_items_data.
Editorial property-amenity showcase with signature cards, pill-nav panels on desktop,
and stacked/accordion panels on mobile.
sections:
- block: property-amenities
id: property-amenities-example
content:
eyebrow: Everything included
title: The version guests can scan in 30 seconds.
text: Surface the signature perks first, then group the room and utility details by category.
signature_items:
- badge: Wellness suite
title: Recovery rituals built into the stay.
text: Hot tub, sauna, and cold-plunge access without leaving the house.
image: /images/property/hot-tub.jpg
image_alt: Glass-enclosed wellness patio
icon: sparkles
categories:
- label: Gather & Cook
title: A real kitchen and places to use it.
text: Group the rooms together instead of repeating a long amenity dump.
image: /images/property/kitchen.jpg
image_alt: Kitchen and dining area
icon: fire
items:
- Full kitchen with range, oven, dishwasher, cookware, and utensils
- Dining table sized for the full group
- Living room or hearth space connected to the kitchen
included_items:
- High-speed WiFi
- Fresh linens and bath towels
- Parking on the property
design:
variant: editorial
nav_style: pills
css_class: ''
Design options
| Field | Details |
|---|---|
variants | editorial |
variant | editorial — signature-card and grouped-panel presentation |
nav_style | pills — desktop category trigger style |
css_class | extra CSS classes on outer section |
Notes
signature_itemsshould normally contain 3-6 cards.- Use
signature_items_data,categories_data, andincluded_items_datawhen the same amenity story needs to stay aligned across a retreat page, photo-tour page, and downstream proof fixture. categoriesshould normally contain 3-5 grouped panels.categories[].itemsmay be either simple strings or objects withtitleandtext.- When a category lacks dedicated photography, omit
imageand provideicon; the block will render support art instead.
Shared-data example
sections:
- block: property-amenities
content:
title: Shared amenity story
signature_items_data: "property.retreat.signature_items"
categories_data: "property.retreat.categories"
included_items_data: "property.retreat.included_items"
BEM classes
foundry-property-amenitiesfoundry-property-amenities__innerfoundry-property-amenities__signature-gridfoundry-property-amenities__signature-cardfoundry-property-amenities__controlsfoundry-property-amenities__tabfoundry-property-amenities__panelfoundry-property-amenities__mobile-stackfoundry-property-amenities__included
property-photo-tour
Minimum required: title, plus one of categories or categories_data.
Category-driven property photo tour with room-type tabs on desktop and stacked sections on mobile.
sections:
- block: property-photo-tour
id: property-photo-tour-example
content:
eyebrow: Photo tour
title: Let guests browse the stay by space.
text: Group photos by room type and keep each category curated instead of dumping every image onto the page.
categories:
- label: Arrival & Exterior
title: Start with the outside impression.
text: Orient the guest before they get into the room details.
icon: home
items:
- Front facade and arrival sequence
- Exterior angles that prove privacy and setting
images:
- url: /images/property/exterior-01.jpg
alt: Front facade at golden hour
caption: Arrival view.
- url: /images/property/exterior-02.jpg
alt: Exterior side angle
caption: Exterior angle.
- label: Living Spaces
title: Shared rooms first.
text: Show the rooms people use together before the support spaces.
icon: fire
items:
- Living room wide shot
- Kitchen usability angle
- Dining view that shows scale
images:
- url: /images/property/living-01.jpg
alt: Living room with fireplace
caption: Main living area.
- url: /images/property/kitchen-01.jpg
alt: Kitchen and dining area
caption: Kitchen and dining.
categories_data: "site.property.photo_tour"
design:
variant: editorial
nav_style: pills
css_class: ''
Design options
| Field | Details |
|---|---|
variants | editorial |
variant | editorial — grouped photo tour with featured image and supporting grid |
nav_style | pills — desktop category trigger style |
css_class | extra CSS classes on outer section |
Notes
categoriesshould normally contain 4-7 groups.- Use
categories_datawhen the same photo-tour structure should power a full tour page and smaller previews elsewhere. categories[].imagesshould be curated, not exhaustive; 3-6 strong photos per group usually reads best.- Use room types or meaningful visual groupings, not arbitrary upload order.
- Keep narrative selling copy on the property page and use this block for visual proof.
limitcan trim the number of categories when you want a shorter preview from the same shared source.
BEM classes
foundry-property-photo-tourfoundry-property-photo-tour__innerfoundry-property-photo-tour__controlsfoundry-property-photo-tour__tabfoundry-property-photo-tour__panelfoundry-property-photo-tour__featuredfoundry-property-photo-tour__thumb-gridfoundry-property-photo-tour__mobile-stackfoundry-property-photo-tour__dialog
property-cards
Minimum required: properties — everything else is optional.
Card grid for property/space highlights with optional featured card treatment.
sections:
- block: property-cards
id: property-cards-example
content:
eyebrow: Signature spaces
title: Rooms and amenities worth the stay.
text: Showcase interiors, wellness features, and outdoor living.
properties:
- name: Indoor hot tub porch
label: Wellness
description: Enclosed glass porch with all-season hot tub views.
image: /images/hot-tub.jpg
beds: 2 bedrooms + additional sleeping
size: 4 private acres
price: Extended stay from $X / month
url: /property/
featured: true
- name: Sauna suite
label: Recovery
description: Sauna, full shower, and cold bucket ritual.
image: /images/sauna.jpg
url: /property/
design:
columns: '3'
variant: cards
item_reveal: zoom-in
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, editorial |
variant | cards | editorial — listing presentation |
columns | 2 | 3 — grid columns |
item_reveal | fade-up | zoom-in | fade-in — per-card reveal animation |
css_class | extra CSS classes on outer section |
BEM classes
foundry-property-cardsfoundry-property-cards__innerfoundry-property-cards__eyebrowfoundry-property-cards__titlefoundry-property-cards__textfoundry-property-cards__grid
property-hero
Minimum required: title — everything else is optional.
Cinematic property hero with optional video background, Ken Burns imagery, and estate stats strip.
sections:
- block: property-hero
id: property-hero-example
content:
eyebrow: property proof site · Pennsylvania
title: Away from the noise. Everything you need.
subtitle: First Light
text: A private house on four acres with indoor hot tub and sauna suite.
images:
- /images/hero-1.jpg
- /images/hero-2.jpg
- /images/hero-3.jpg
primary_action:
text: Explore First Light
url: /property/
secondary_action:
text: Plan your stay
url: /inquire/
stat_1_value: 4 Acres
stat_1_label: Private setting
stat_2_value: 2 Weeks+
stat_2_label: Minimum stay
stat_3_value: 8-10
stat_3_label: Guests
design:
overlay: deep
parallax: true
parallax_speed: '0.35'
parallax_dir: up
kenburns: true
kenburns_preset: in
kenburns_interval: '5000'
kenburns_transition: '1400'
text_align: left
min_height: 100vh
scroll_cue: true
Design options
| Field | Details |
|---|---|
variants | (none) |
overlay | dark | light | deep | warm — hero overlay treatment |
parallax | true | false | {speed 0.0-0.35} — enable/disable background parallax |
parallax_speed | 0.0-0.35 — parallax speed (default: 0.35) |
parallax_dir | up | down | 1 | -1 — parallax direction (default: up) |
kenburns | true | false — enable/disable Ken Burns motion |
kenburns_preset | in | out | in-left | in-right | out-left | out-right — default Ken Burns preset for images without item presets |
kenburns_interval | milliseconds for multi-image crossfade (default: 6000) |
kenburns_transition | milliseconds for crossfade duration between images (default: 1400) |
text_align | left | center — content alignment |
min_height | 100vh | 80vh | 70vh — section minimum height |
scroll_cue | true | false — show/hide reduced-motion-safe scroll cue |
show_scroll | true | false — compatibility alias for scroll_cue |
BEM classes
foundry-property-herofoundry-property-hero__scrollfoundry-scroll-cue
Creating a new block
- Copy
layouts/partials/blocks/_template.htmltolayouts/partials/blocks/[block-name].html. - Replace placeholders and implement the block using standard context extraction and BEM classes.
- Core blocks register in
data/foundry/block-registry.yaml. A consumer site registers a genuinely site-specific extension indata/foundry/site-block-registry.yaml; this keeps the Core registry mounted and makes the extension visible to shared rendering and validation. - Document variants/design fields in
data/foundry/block-options.yaml. - Add usage examples in
/docs/BLOCKS.mdand your demo content. - If motion is needed, use
data-motion-*attributes and keep reduced-motion behavior safe.
Feature flags
Feature flags are resolved by foundry/helpers/feature-flag.html.
| Flag | Default(s) in templates | Blocks using it |
|---|---|---|
animations | true | stats-band |
experimentalHero | false | hero |
uiCards | true | case-studies, certification-badges, cta, faq-cta, features, icon-grid, illustration-panel, pricing-comparison, pricing-tiers, resource-downloads, stats-grid, steps, testimonials, testimonials-carousel, trust-badges |