core · Current reference
Block reference
Inspect the shipped block contracts and implementation-side authoring details.
Applies to v1.1.10
Component pins for v1.1.10
| Component | Role | Version |
|---|---|---|
| core | runtime | v1.1.10 |
| theme-shield | theme | v0.1.15 |
| docs | reference | v0.1.6 |
| distribution | tooling | v0.3.23 |
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 same block entry may add top-level fields for supported source values
that must remain discoverable but are not routine editor controls. This is the
canonical supplemental field contract for primitive-first, guided-advanced,
derived, operational, invariant, and compatibility values; it is not a second
editor projection. Each entry declares its source path, classification,
semantic type, widget or inspection representation, rendering behavior, output
surfaces, fallback when applicable, preview mapping, and alias relationship.
Core validation requires complete supplemental entries. A field remains in the
editor projection only when the editor-expansion contract says it is safe for
ordinary structured editing.
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; the Structured Explanation wave adds
features and timeline; the Openings & Route Choice wave adds post-hero,
coming-soon-hero, media-break, founder-profile, and discovery-cards.
See the
Portable Authoring Contract for the complete active
surface and
DC03-S12 Openings And Route Choice Controls
for preferred article metadata, launch form, visual pause, profile, route, and
Hugo source guidance.
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.
Use Audio Player when one recording should be played in the page with clear
context, optional download, and a transcript. Use a plain resource link when
playback adds no value; use Media Sequence or Video Embed when synchronized
visuals are part of the evidence.
The normal path starts with an intent preset:
sections:
- block: audio-player
id: episode-audio
design:
preset: episode-feature
content:
show: Field Notes
title: How the work took shape
url: /audio/field-notes-01.mp3
transcript: The complete, corrected transcript goes here.
focused-listen is quiet supporting audio, episode-feature gives a primary
recording artwork and context, and audio-resource makes listening and
download equally visible. Native browser controls are the no-JavaScript floor;
the fingerprinted Core controller progressively adds the custom timeline,
volume, speed, and status behavior. Authors do not write ARIA, scripts, layout
classes, or breakpoint-specific copies.
Design options
| Field | Details |
|---|---|
variants | card, minimal, podcast |
variant | card | minimal | podcast — audio player presentation |
css_class | extra CSS classes on outer section |
Intent presets: focused-listen, episode-feature, audio-resource.
BEM classes
foundry-audio-playerfoundry-audio-player__assistivefoundry-audio-player__contentfoundry-audio-player__controlsfoundry-audio-player__coverfoundry-audio-player__cover-imagefoundry-audio-player__cover-letterfoundry-audio-player__descriptionfoundry-audio-player__downloadfoundry-audio-player__download-iconfoundry-audio-player__emptyfoundry-audio-player__innerfoundry-audio-player__iconfoundry-audio-player__icon-svgfoundry-audio-player__layoutfoundry-audio-player__metafoundry-audio-player__nativefoundry-audio-player__primaryfoundry-audio-player__progressfoundry-audio-player__secondaryfoundry-audio-player__shellfoundry-audio-player__showfoundry-audio-player__speedfoundry-audio-player__speed-labelfoundry-audio-player__speed-selectfoundry-audio-player__timefoundry-audio-player__timelinefoundry-audio-player__titlefoundry-audio-player__togglefoundry-audio-player__transcriptfoundry-audio-player__transcript-bodyfoundry-audio-player__transcript-summaryfoundry-audio-player__volumefoundry-audio-player__volume-iconfoundry-audio-player__volume-rangefoundry-audio-player__volume-svg
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:
title: "What changes after the decision work"
subtitle: "Use paired states for a real transformation, not decorative contrast."
before_label: "Starting point"
after_label: "New direction"
before:
title: "Unclear path"
text: "The visitor sees claims without decision context."
items: ["Proof arrives late", "Next steps feel premature"]
after:
title: "Decision-ready path"
text: "Context, proof, and action follow a deliberate sequence."
items: ["Evidence is qualified", "The next step matches readiness"]
design:
variant: cards
treatment: bordered
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 |
treatment | bordered | editorial — bounded panels/table or an open ruled composition |
row_label | header label for the label column in table variant (default: Feature) |
before_label, after_label | Optional human-readable state labels; defaults remain Before and After |
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.
Use Callout for one concise piece of context, guidance, risk, or confirmation
that belongs in the page’s reading flow. The selected type always renders a
visible meaning label as well as a matching icon and color, so meaning never
depends on color alone. Static warnings intentionally remain ordinary page
content rather than live alert regions.
sections:
- block: callout
id: consultation-context
content:
label: Before you book
title: Bring the products you currently use
text: We will review active ingredients together so your plan does not duplicate or conflict with your current routine.
action:
text: Prepare for the visit
url: /consultation-guide/
design:
preset: useful-context
Intent presets: useful-context for ordinary supporting information,
page-alert for a genuine page-wide warning, and editorial-aside for a quiet
reading note. editorial-callout remains as a compatible subtle-note preset.
Content fields
| Field | Details |
|---|---|
label | optional visible meaning label; defaults to Information, Tip, Warning, Important, Note, or Success from type |
title | optional short heading that says what visitors need to understand |
text | required portable Markdown message; keep it concise and useful |
action | optional single text and url next step that directly resolves or follows from the message |
Design options
| Field | Details |
|---|---|
variant | inline | banner | subtle — a contained notice, page-width announcement, or typographic editorial aside |
type | info | tip | warning | danger | note | success — semantic meaning that controls the default visible label, icon, and accent |
icon | optional icon override; normally leave blank so the icon follows type |
css_class | extra CSS classes on outer section |
Use Warning and Danger only for real risk. Use a normal heading, Rich Text, or CTA when the goal is merely to make marketing copy louder. Theme Families and Customer Brand Systems may change the public Callout variables, while Core retains the semantic anatomy, responsive behavior, and visible meaning.
BEM classes
foundry-calloutfoundry-callout__actionfoundry-callout__action-iconfoundry-callout__action-linkfoundry-callout__boxfoundry-callout__contentfoundry-callout__iconfoundry-callout__icon-symbolfoundry-callout__innerfoundry-callout__meaningfoundry-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:
title: "Representative outcomes"
subtitle: "Explain the constraint, approach, and supported evidence."
cases:
- client_type: "Local service"
title: "A clearer consultation path"
problem: "The original page mixed claims and conversion pressure."
solution: "The new sequence qualified proof before asking for action."
results: ["Normal Hugo source", "No copied renderer"]
design:
variant: editorial
Design options
| Field | Details |
|---|---|
variant | cards | editorial | spotlight — independent cards, open numbered stories, or one leading case with supporting evidence |
subtitle | Optional portable Markdown context for interpreting the cases |
problem_label, solution_label, results_label | Optional replacements for the visible anatomy labels |
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__panelfoundry-coming-soon-hero__form-panelfoundry-coming-soon-hero__formfoundry-coming-soon-hero__innerfoundry-coming-soon-hero__textfoundry-coming-soon-hero__title
coming-soon-trust
Preferred Section source: type: trust-marks with style: launch.
Coming Soon Trust is the launch-reassurance control. It tells a visitor what is ready, what the organization actually promises, and which named relationships support the launch. It must not manufacture credibility from decorative badges. Use Logos for a neutral organization collection, Logo Trust for a verified relationship surface, Trust Badges for mixed ongoing assurances, and the Certifications Style for issued credentials.
At least one accurate fact, assurance, or permissioned logo relationship
should be present. eyebrow, title, and introduction establish context.
Every fact or assurance may keep a qualification and public source next to the
claim. Every logo keeps a visible name and may state its exact relationship;
the mark never establishes partnership or endorsement by itself.
sections:
- type: trust-marks
style: launch
id: launch-readiness
design:
preset: launch-readiness
content:
eyebrow: Public launch record
title: What is ready before the doors open
introduction: Dates, scope, and information handling are stated plainly.
facts:
- value: Sep 2026
label: Public preview opens
details: A planned date, qualified until the schedule is final.
source_url: /launch-details/
assurances:
- label: Waitlist email is used only for launch updates
details: Verify this against the real form, provider, and privacy policy.
source_url: /privacy/
logos:
- name: Example Studio
relationship: Launch collaborator
image: /media/example-studio.svg
image_alt: ''
url: /launch-details/
Design options
| Field | Details |
|---|---|
preset | launch-readiness, compact-status-rail, or privacy-first-note |
variant | ledger, strip, or note; normally selected by a preset |
css_class | extra CSS classes on outer section |
The three presets are different content structures, not color swaps:
launch-readiness balances a public readiness ledger with qualified
assurances; compact-status-rail keeps a small fact set concise; and
privacy-first-note turns one information boundary into an editorial
statement. Legacy block: coming-soon-trust, stats, badges, subtitle,
and variant: grid source remains compatible, but new sites should use the
typed vocabulary above.
BEM classes
foundry-coming-soon-trustfoundry-coming-soon-trust__innerfoundry-coming-soon-trust__headerfoundry-coming-soon-trust__eyebrowfoundry-coming-soon-trust__titlefoundry-coming-soon-trust__introductionfoundry-coming-soon-trust__evidencefoundry-coming-soon-trust__factsfoundry-coming-soon-trust__factfoundry-coming-soon-trust__fact-labelfoundry-coming-soon-trust__fact-valuefoundry-coming-soon-trust__fact-detailsfoundry-coming-soon-trust__fact-sourcefoundry-coming-soon-trust__assurancesfoundry-coming-soon-trust__assurancefoundry-coming-soon-trust__assurance-labelfoundry-coming-soon-trust__assurance-detailsfoundry-coming-soon-trust__assurance-sourcefoundry-coming-soon-trust__logosfoundry-coming-soon-trust__logofoundry-coming-soon-trust__logo-markfoundry-coming-soon-trust__logo-imagefoundry-coming-soon-trust__logo-namefoundry-coming-soon-trust__logo-relationshipfoundry-coming-soon-trust__logo-link
comparison-table
Minimum required: rows — everything else is optional.
General comparison control for measuring two approaches against the same
visitor-centered decision points. Use Pricing Comparison when the columns are
priced plans with shared criteria.
sections:
- block: comparison-table
id: comparison-table-example
content:
title: "Compare the decision"
caption: "Comparison of two approaches"
headers:
- label: "Decision point"
- label: "Evidence-led"
- label: "Shortcut"
rows:
- feature: "Proof"
ours: "State source, scope, and limitation near the claim."
typical: "Move context into fine print."
design:
variant: editorial
Design options
| Field | Details |
|---|---|
variant | bordered | editorial | compact — bounded table, open ruled comparison, or denser operational reading |
headers | Three neutral column labels; legacy string arrays remain supported |
caption | Optional accessible table caption; defaults to the Section title |
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, source-ordered list.
Use it when visitors genuinely have more than one bounded next step; use cta
when one action should dominate.
sections:
- block: cta-button-list
id: cta-button-list-example
design:
preset: inline-actions
content:
title: "Choose how to begin"
subtitle: "Keep each destination distinct and explain the decision boundary in portable Markdown."
buttons:
- text: "Review the outline"
url: "/outline/"
variant: primary
- text: "Ask a question"
url: "/contact/"
variant: secondary
Design options
| Field | Details |
|---|---|
variants | inline |
alignment | left |
css_class | extra CSS classes on outer section |
The named presets are inline-actions, ordered-handoff, and
compact-register. Each action requires a label and a real destination. Use
primary only when one action should lead attention; otherwise leave actions
secondary or choose a quiet ghost alternative. Foundry keeps the list
semantic and source-ordered without JavaScript, and stacks actions on narrow
screens. Tracking fields remain optional metadata passed through the shared
button component.
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.
Media-supported conversion Style for next steps that benefit from visual
context. Prefer a plain CTA when the image does not help the visitor decide.
The normal authoring path is the typed cta.media Section Style; the renderer
name remains supported for compatibility.
sections:
- type: cta
style: media
id: guided-handoffs
content:
eyebrow: Next steps
title: Choose the right working session
items:
- title: Map the story
text: Start with the visitor question, evidence, and next action.
image: /images/story-map.jpg
image_alt: Story map and content notes on a worktable
features:
- Name the visitor job
- Preserve portable source
action:
text: Plan the page
url: /contact/
variant: primary
cta_key: story-planning
design:
preset: guided-handoffs
Recommended presets are guided-handoffs for a longer alternating sequence,
editorial-invitations for an open ruled composition, and
compact-next-steps for a small set of peer choices. Keep items in reading
order; desktop media placement may change, but mobile source and focus order do
not.
Design options
| Field | Details |
|---|---|
variants | alternating, editorial, compact |
variant | alternating | editorial | compact — sequence, open ruled composition, or concise cards |
media_position | alternate | left | right — desktop placement; mobile preserves source order |
media_ratio | landscape | portrait | square | auto — authored media frame |
css_class | advanced declared-Extension escape hatch, not the normal design path |
BEM classes
foundry-cta-image-paragraphfoundry-cta-image-paragraph__actionfoundry-cta-image-paragraph__collectionfoundry-cta-image-paragraph__contentfoundry-cta-image-paragraph__featurefoundry-cta-image-paragraph__headerfoundry-cta-image-paragraph__innerfoundry-cta-image-paragraph__itemfoundry-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, interactive models, tools, and third-party
widgets. Core owns deferred-source activation and loader completion; a consumer
does not need site-local JavaScript for those modes. Set require_activation
when the provider must not be contacted until the visitor chooses to load it.
The fallback link remains available when JavaScript is disabled.
sections:
- block: embed
id: embed-example
content:
fallback_text: Open source link
fallback_url: https://example.com/fallback
activation_title: View the interactive model
activation_text: Loading this model contacts the external provider.
activation_label: Load interactive model
text: Example supporting text.
title: Example title
url: https://example.com
design:
variant: card
aspect: '16:9'
loading: lazy
show_loader: true
require_activation: true
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 |
loading | lazy | eager — native iframe loading hint |
defer_src | true | false — let the Core controller assign the iframe source after parsing |
show_loader | true | false — show an accessible loading state until the iframe is ready |
require_activation | true | false — wait for an explicit visitor action before contacting the provider |
css_class | extra CSS classes on outer section |
BEM classes
foundry-embedfoundry-embed__emptyfoundry-embed__activatefoundry-embed__fallbackfoundry-embed__figurefoundry-embed__framefoundry-embed__frame-wrapfoundry-embed__innerfoundry-embed__loaderfoundry-embed__loader-panelfoundry-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.
Use FAQ Follow-up for the final one to three questions that may prevent a
visitor from taking one accurate next step. Use FAQ Accordion for the complete
question library, and use a generic CTA when no answer-driven transition is
needed. The split and note presentations use native disclosures; guided
keeps every selected answer visible in numbered source order. No JavaScript is
required.
Recommended presets: questions-to-next-step, guided-decision-close, and
quiet-contact-note.
Write questions in the visitor’s language. Keep each answer concise and
qualified, and keep timing, privacy, eligibility, availability, policy, and
process notes accurate. Legacy item title and text fields remain compatible,
but new source should use question and answer.
sections:
- type: cta
style: faq-follow-up
id: final-project-questions
content:
eyebrow: Before we begin
title: The questions that shape a useful first conversation
subtitle: These are the final practical details, not a replacement for the complete FAQ.
items:
- question: Do I need a finished brief?
answer: No. Bring the decision, audience, and constraints you already know; the first conversation identifies what still needs evidence.
- question: What happens after the conversation?
answer: You receive the documented next step that fits the actual scope. No project begins without a separate reviewed agreement.
cta_title: Start with the real decision
cta_text: Share the context that would make a first review useful.
cta_action:
text: Request a project review
url: /contact/
cta_key: project-review
cta_kind: contact
cta_secondary_action:
text: Read the complete FAQ
url: /faq/
cta_note: Initial messages are reviewed privately; response timing should match the site's current published policy.
design:
preset: questions-to-next-step
Design options
| Field | Details |
|---|---|
variants | split, guided, note |
variant | split | guided | note — questions beside the handoff, visible numbered answers ending in the next step, or a restrained editorial contact note |
css_class | extra CSS classes on outer section |
BEM classes
foundry-faq-ctafoundry-faq-cta__answerfoundry-faq-cta__actionsfoundry-faq-cta__bodyfoundry-faq-cta__eyebrowfoundry-faq-cta__guided-itemfoundry-faq-cta__handofffoundry-faq-cta__handoff-markfoundry-faq-cta__handoff-textfoundry-faq-cta__handoff-titlefoundry-faq-cta__headerfoundry-faq-cta__indicatorfoundry-faq-cta__innerfoundry-faq-cta__introfoundry-faq-cta__itemfoundry-faq-cta__notefoundry-faq-cta__numberfoundry-faq-cta__questionfoundry-faq-cta__questionsfoundry-faq-cta__questions--guidedfoundry-faq-cta__summaryfoundry-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.
Use Features for parallel benefits, capabilities, or differentiators. Use
Timeline when chronology matters and Process when visitors must understand a
sequence of actions or expectations. The routine editor uses canonical name
and description fields and preserves compatibility aliases and advanced keys.
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--columns-{2,3,4}foundry-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.
Introduce one founder, principal, artist, practitioner, or other important
person with enough public context to support trust. Use team-grid for several
people and author-bio for compact article attribution.
The shortest good source is an approved public name, accurate role, concise Markdown biography, and approved portrait. Add factual highlights only when they help the visitor understand experience, responsibility, or approach; do not invent credentials, awards, affiliations, or outcome claims.
sections:
- block: founder-profile
id: founder-story
design:
preset: founder-story
content:
title: "The person behind the work"
name: "Jordan Vale"
role: "Founder and creative director"
biography: |
Jordan built the studio around a simple belief: clear decisions and
careful craft should reinforce each other.
highlights:
- text: "Leads every discovery engagement"
context: "From first brief through final review"
- text: "Fifteen years in independent practice"
image: "/images/jordan-vale.jpg"
image_alt: "Jordan Vale working beside material samples in the studio"
primary_action:
text: "Read the studio approach"
url: "/approach/"
subtitle and paragraphs remain supported for older sites, but new source
should use one biography Markdown field. Responsive-image source sets,
intrinsic dimensions, custom sizes, and direct email/phone links remain
advanced source fields; the normal human and AI path does not require them.
Intent presets
founder-story— balanced portrait and narrative for an About page.artist-profile— expressive image-right manifesto with open typography.practitioner-profile— compact, factual authority with clear highlights.
Design options
| Field | Details |
|---|---|
variant | portrait-story (default), open-manifesto, or credential-profile |
css_class | Advanced escape hatch for a declared site Extension; not the normal design path |
Theme Families and Customer Brand Systems may art-direct public
--foundry-founder-profile-* variables for measure, spacing, portrait shape,
media position, typography, accent, rules, and factual-highlight surfaces.
Core continues to own heading order, portrait semantics, biography measure,
contact focus, and responsive reading order.
BEM classes
foundry-founder-profilefoundry-founder-profile__actionsfoundry-founder-profile__contactfoundry-founder-profile__contactsfoundry-founder-profile__contentfoundry-founder-profile__eyebrowfoundry-founder-profile__highlightfoundry-founder-profile__highlightsfoundry-founder-profile__identityfoundry-founder-profile__imagefoundry-founder-profile__innerfoundry-founder-profile__introfoundry-founder-profile__layoutfoundry-founder-profile__mediafoundry-founder-profile__namefoundry-founder-profile__picturefoundry-founder-profile__rolefoundry-founder-profile__textfoundry-founder-profile__title
gallery
Minimum required: images — everything else is optional.
Ordered, accessible image collection with optional captions, credits, related
routes, filter categories, crop focus, and progressively enhanced lightbox
navigation. Use Masonry for irregular editorial rhythm, Slideshow for
sequential presentation, Property Tour for place-aware groups, or Media
Sequence for a mixed-media narrative.
sections:
- block: gallery
id: gallery-example
design:
preset: editorial-pairs
content:
title: Selected places
text: A short introduction that tells visitors what to notice.
images:
- id: lake-arrival
src: "/images/gallery-1.jpg"
alt: Lake house beyond a private cedar edge
caption: Arrival establishes the relationship between house and water.
credit: Photograph by Example Studio
link: /places/lake-house/
category: exteriors
position: center
Start with editorial-pairs, visual-catalog, or natural-archive. The legacy
portfolio-grid preset remains compatible. Each image is a normal link to the
full asset without JavaScript; the fingerprinted Core controller enhances that
link into the dialog only when the required anatomy is available.
Design options
| Field | Details |
|---|---|
variants | None (single style) |
columns | 2 | 3 | 4 — gallery columns |
gap | sm | md | lg — spacing between items |
aspect | square | landscape | portrait | auto — thumbnail ratio |
captions | below | overlay | hidden — caption presentation |
lightbox | true | false — progressively enhance full-asset links into a dialog |
css_class | extra CSS classes on outer section |
BEM classes
foundry-galleryfoundry-gallery__closefoundry-gallery__dialogfoundry-gallery__dialog-actionsfoundry-gallery__dialog-captionfoundry-gallery__dialog-creditfoundry-gallery__dialog-footerfoundry-gallery__dialog-imagefoundry-gallery__dialog-innerfoundry-gallery__dialog-linkfoundry-gallery__dialog-navfoundry-gallery__dialog-positionfoundry-gallery__dialog-stagefoundry-gallery__emptyfoundry-gallery__gridfoundry-gallery__headerfoundry-gallery__imagefoundry-gallery__innerfoundry-gallery__itemfoundry-gallery__mediafoundry-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--{centered,left}foundry-hero--mediafoundry-hero__actionsfoundry-hero__innerfoundry-hero__textfoundry-hero__title
icon-grid
Minimum required: items — everything else is optional.
Use Icon Grid to explain a small set of capabilities, principles, or service
paths that benefit from quick visual anchors. Use Features for denser benefit
copy and Discovery Cards when every item is primarily a destination.
Recommended presets: editorial-capabilities for an open two-column list,
service-cards for scannable destinations, and expressive-symbols for a
centered visual statement. icon-highlight-row remains compatible.
sections:
- block: icon-grid
id: icon-grid-example
content:
items:
- icon: sparkles
title: Thoughtful direction
text: A short explanation of the useful outcome.
url: /approach/
link_label: See our approach
text: Choose the few ideas a visitor should understand first.
title: What makes the work different
design:
preset: service-cards
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__headerfoundry-icon-grid__iconfoundry-icon-grid__icon-svgfoundry-icon-grid__innerfoundry-icon-grid__itemfoundry-icon-grid__item-textfoundry-icon-grid__item-titlefoundry-icon-grid__linkfoundry-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-image editorial Style with bounded emphasis, crop, focal position,
caption, and optional lightbox enhancement. Use Gallery or Slideshow when the
visitor needs to browse several images. The normal authoring path is typed
media-story.image-feature; the renderer name remains supported for
compatibility.
sections:
- type: media-story
style: image-feature
id: evidence-figure
content:
src: /images/process-map.svg
alt: Process map showing discovery, evidence review, and decision handoff
caption: The complete process remains visible without JavaScript.
credit: Internal process study
design:
preset: editorial-figure
Recommended presets are editorial-figure for uncropped evidence,
cinematic-wide for immersive emphasis, full-bleed-statement for an
edge-to-edge beat, and supporting-figure for a bounded side-aligned image.
The optional lightbox is progressive enhancement; the base image and caption
remain ordinary visible HTML.
Design options
| Field | Details |
|---|---|
variants | contained, wide, full-bleed, float-left, float-right |
variant | contained | wide | full-bleed | float-left | float-right — bounded width and alignment; float variants avoid fragile CSS floats |
aspect | 16:9 | 4:3 | 3:2 | square | auto — media frame ratio |
fit | cover | contain — crop photography or preserve the complete asset |
position | center plus eight bounded edge/corner values — focal point for cropped media |
rounded | true | false — rounded media frame |
shadow | true | false — frame elevation; off by default |
lightbox | true | false — progressively enhance with a keyboard-operable dialog; off by default |
css_class | advanced declared-Extension escape hatch, not the normal design path |
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__imagefoundry-image-feature__mediafoundry-image-feature__openerfoundry-image-feature__zoom
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 permissioned logos with supporting credibility
chips. Use only marks the site owns or has explicit permission to publish;
the Core compatibility fixture uses clearly fictional demonstration artwork.
sections:
- block: logo-trust
id: logo-trust-example
content:
eyebrow: Permissioned partners
title: Organizations we are approved to name
subtitle: Every mark is verified before publication.
logos:
- name: Partner Name
image: /media/partner-name.svg
badges:
- Permission verified
- Meaningful alternative names
design:
preset: permissioned-partners
Design options
| Field | Details |
|---|---|
variants | grid (individual permissioned mark tiles), strip (open restrained affiliation row), band (one collective trust surface) |
preset | permissioned-partners, quiet-affiliations, or collective-credibility |
css_class | extra CSS classes on outer section |
Use logo-trust when a small verified set of organizations or affiliations
helps visitors interpret trust. Use logos for a larger neutral logo wall and
certification-badges when credentials, issuing bodies, or destinations are
the primary meaning. Real sites must verify the relationship, publication
rights, organization name, and alternative text before adding a mark.
BEM classes
foundry-logo-trustfoundry-logo-trust--gridfoundry-logo-trust--stripfoundry-logo-trust--bandfoundry-logo-trust__badgesfoundry-logo-trust__badgefoundry-logo-trust__emptyfoundry-logo-trust__eyebrowfoundry-logo-trust__gridfoundry-logo-trust__headerfoundry-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.
An accurately named collection of organizations, publications, tools,
sponsors, collaborators, or brands. This Block does not turn proximity into
trust proof. Use logo-trust for verified organization relationships and
certification-badges for formally issued credentials.
sections:
- block: logos
id: logos-example
design:
preset: brand-wall
content:
title: Selected collaborations
introduction: Every relationship is named plainly and every mark is approved for display.
logos:
- name: Northline Workshop
relationship: Campaign collaborator
description: A limited collaboration for the 2026 launch campaign.
image: /media/northline-workshop.svg
image_alt: ""
url: /work/northline/
Keep name visible even when an image exists. Use relationship when visitors
could otherwise infer a customer, sponsor, partner, endorsement, or publisher
status that the source does not actually establish. Leave image_alt empty
when the adjacent visible name communicates the same information; describe
only unique visual meaning. Verify names, destinations, and display rights
before publishing a real mark.
Start with brand-wall, relationship-index, or compact-mentions.
moving-ticker is an advanced progressive enhancement: the complete static
list remains readable when JavaScript is unavailable, animation is disabled,
or reduced motion is requested. trust-marquee and authority-grid remain
compatible legacy preset names; they do not change this Block into verified
trust evidence.
Design options
| Field | Details |
|---|---|
variants | grid, strip, pill |
variant | grid image-led brand wall; strip relationship index; pill compact named mentions |
marquee | Advanced true | false progressive ticker; defaults false and never replaces the static list |
marquee_speed | Positive advanced ticker speed in px/s (default: 55) |
marquee_dir | Advanced left | right ticker direction (default: left) |
marquee_pause | Advanced hover | none; hover also pauses for keyboard focus |
css_class | extra CSS classes on outer section |
BEM classes
foundry-logosfoundry-logos__headerfoundry-logos__innerfoundry-logos__introductionfoundry-logos__collectionfoundry-logos__motion-optionsfoundry-logos__viewportfoundry-logos__itemsfoundry-logos__itemfoundry-logos__item-linkfoundry-logos__markfoundry-logos__imagefoundry-logos__relationshipfoundry-logos__namefoundry-logos__descriptionfoundry-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%
detail: "Current reporting year; 318 registered participants."
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.- Core applies the selected desktop column count and gap through native CSS; the gallery does not require Tailwind or another utility runtime to size its media. Small viewports collapse to one column.
- The outer section exposes stable
foundry-masonry-gallery--columns-{2|3|4}andfoundry-masonry-gallery--gap-{sm|md|lg}modifiers for downstream theme refinement. Treat these as layout hooks; photograph selection and focal composition remain site/content-owned.
BEM classes
foundry-masonry-galleryfoundry-masonry-gallery--columns-2foundry-masonry-gallery--columns-3foundry-masonry-gallery--columns-4foundry-masonry-gallery--gap-smfoundry-masonry-gallery--gap-mdfoundry-masonry-gallery--gap-lgfoundry-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.
Visitor job: help a visitor follow an ordered visual argument, project story, or body of work without losing reading order. Use Gallery or Masonry Gallery when scanning and comparison matter more than sequence; use Media Text when one image and one concise explanation are enough.
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: ''
For the normal authoring path, choose a preset and write the items. Do not copy the renderer, add a page-local style block, or set every design field.
| Preset | Best starting point |
|---|---|
editorial-story | explanatory case study with media/copy relationships |
cinematic-story | immersive, wide, stacked campaign or destination story |
portfolio-home | concise featured work on a landing page |
portfolio-archive | alternating selected-work archive |
story-reel | expressive mixed-media narrative with progress |
selected-work-reel | indexed portfolio or project reel |
chaptered-media | longer chapter sequence with visible wayfinding |
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.
The semantic wrapper, item grid, gallery, media shell, and credit definition
list have a Core-owned layout floor in foundry-base.css. Credit rows use a
complete surface/border/label/value token pair, so a dark or branded parent can
change the relationship without overriding nested selectors or fighting
inline light colors.
Embedded video posters and play controls are progressively enhanced by the
fingerprinted foundry-media-sequence.js asset. Ordinary images, text, quotes,
credits, captions, links, and source order do not depend on JavaScript. Core
owns frame, ratio, reflow, progress, reduced-motion, and narrow-screen
geometry; Theme Families and Customer Brand Systems art-direct those hooks
through shared media tokens and --foundry-media-sequence-* variables.
Content options
| Field | Details |
|---|---|
items[].eyebrow | optional category, chapter, or context label; when show_index is true, do not repeat the generated number here |
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 — generate two-digit item indexes (default: true on work-reel); use items[].eyebrow for meaning, not a duplicate number |
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__creditsfoundry-media-sequence__credits-itemfoundry-media-sequence__emptyfoundry-media-sequence__eyebrowfoundry-media-sequence__galleryfoundry-media-sequence__imagefoundry-media-sequence__indexfoundry-media-sequence__innerfoundry-media-sequence__introfoundry-media-sequence__itemfoundry-media-sequence__item-eyebrowfoundry-media-sequence__item-titlefoundry-media-sequence__itemsfoundry-media-sequence__mediafoundry-media-sequence__media-shellfoundry-media-sequence__progressfoundry-media-sequence__progress-barfoundry-media-sequence__quotefoundry-media-sequence__quote-attributionfoundry-media-sequence__quote-textfoundry-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.
Visitor job: guide a visitor through a small number of dramatic chapters whose visual context should persist while the explanation advances. Use Media Sequence when normal document flow is clearer, and Media Break when one interruption—not a chapter system—is enough.
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: ''
Start with a named preset; the raw Block keeps parallax, Ken Burns, and video autoplay off.
| Preset | Best starting point |
|---|---|
pinned-story | balanced editorial story with portrait flow fallback |
immersive-chapters | high-impact campaign or destination narrative |
editorial-chapters | restrained image-led essay without ambient motion |
accessible-story-stack | static, light, image-then-copy chapter stack |
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 |
media_fit | cover | contain — use contain when the full diagram or information graphic must remain visible (default: cover) |
media_position | normalized image position — chapter focal position (default: center center) |
media_ratio | landscape | square | portrait | wide | 16:10 — frame used by portrait flow (default: landscape) |
portrait_mode | pinned | flow — preserve pinning or use a normal image-then-content sequence in portrait orientation (default: pinned) |
css_class | extra CSS classes on outer section |
items[].autoplay opts a chapter into muted looping background video. It
defaults to false; a poster or first frame remains visible without ambient
motion. Use autoplay only when the moving image is decorative and the written
chapter carries the complete meaning.
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.
The four media fields can also be set on an individual items[] record. Use
media_fit: contain, media_ratio: "16:10", portrait_mode: flow,
overlay: none, and no parallax/Ken Burns for legible diagrams. Foundry keeps
photo-oriented cover, pinning, and overlays as defaults while motion stays
opt-in; it does not infer intent from an SVG or other file extension. When a
contained chapter explicitly requests parallax, Core warns and disables the
crop-inducing enlargement.
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--media-{left,right}foundry-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.
Ordered onboarding sequence with utility-independent cards, an open editorial
rail, and a compact checkpoint band. Use name/description for current
source; the renderer also preserves the earlier title/text item aliases.
sections:
- block: onboarding-timeline
id: onboarding-timeline-example
content:
eyebrow: Getting started
title: A calm path to the first result
subtitle: Four visible milestones keep the process easy to understand.
steps:
- name: Share the starting point
description: Bring the goals, constraints, and useful source material.
icon: chat-bubble-left-right
- name: Shape the working brief
description: Agree on scope, decisions, and the first review moment.
design:
preset: guided-start
variant: cards
css_class: ''
Design options
| Field | Details |
|---|---|
variants | cards, rail, compact |
variant | cards (approachable default), rail (open editorial sequence), or compact (dense checkpoint band) |
preset | guided-start, editorial-journey, or compact-checkpoints; explicit values win |
css_class | extra CSS classes on outer section |
The base layer owns the ordered list, responsive columns, item alignment,
marker geometry, rhythm, and complete surface/foreground pairs. Themes should
prefer the documented --foundry-onboarding-* variables over rewriting the
internal selectors. All variants collapse to one readable source-ordered
column at narrow widths.
BEM classes
foundry-onboarding-timelinefoundry-onboarding-timeline__contentfoundry-onboarding-timeline__descriptionfoundry-onboarding-timeline__emptyfoundry-onboarding-timeline__eyebrowfoundry-onboarding-timeline__headerfoundry-onboarding-timeline__iconfoundry-onboarding-timeline__innerfoundry-onboarding-timeline__itemfoundry-onboarding-timeline__item-rowfoundry-onboarding-timeline__item-titlefoundry-onboarding-timeline__listfoundry-onboarding-timeline__numberfoundry-onboarding-timeline__subtitlefoundry-onboarding-timeline__title
page-list
Minimum required: section — everything else is optional.
Generic Hugo section collection for ordinary content pages. It keeps each
destination’s title, summary, date, image, and URL in the canonical page file
instead of copying them into the landing page. Use the typed
type: page-list plus style: editorial path when categories, authors,
featured stories, or magazine hierarchy are part of the visitor task. Use
Content Feed or Search when filtering is the visitor job.
sections:
- block: page-list
id: work-directory
content:
title: Selected work
text: Four ordinary Hugo pages, ordered intentionally.
section: work
sort: weight
limit: 4
design:
preset: page-directory
Start with a visitor-job preset: page-directory for visual peers,
journal-index for explanation-led reading, or resource-list for familiar
routes. creative-journal-feed remains a compatibility alias for a text-led
journal list. Override only the one bounded option the page actually needs;
listing display flags belong under design because they change presentation.
Values below 1 for content.limit show every published page, while invalid
values safely default to six. Empty output distinguishes an unchosen section,
a missing section, and a valid section with no published pages; use
content.empty_text only when a more useful truthful message exists.
The Page List Visual Example shows cards, an open register, and a compact route index beside copyable Hugo source. The renderer requires no page-local styles, utility framework, or JavaScript.
Design options
| Field | Details |
|---|---|
variants | cards, list, compact |
view | cards | list | compact — visual recognition, explanation-led scanning, or familiar-route lookup |
columns | 2 | 3 — wide card columns; narrows responsively |
show_date | true | false — show semantic publish date |
show_summary | true | false — show normalized page summary |
show_image | true | false — show an available decorative thumbnail while the title remains the accessible link name |
css_class | advanced declared-Extension escape hatch, not the normal design path |
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__card--without-imagefoundry-page-list__card-contentfoundry-page-list__compactfoundry-page-list__compact-arrowfoundry-page-list__compact-itemfoundry-page-list__compact-linkfoundry-page-list__compact-metafoundry-page-list__compact-titlefoundry-page-list__emptyfoundry-page-list__gridfoundry-page-list__grid-itemfoundry-page-list__headerfoundry-page-list__imagefoundry-page-list__image-linkfoundry-page-list__innerfoundry-page-list__item-titlefoundry-page-list__listfoundry-page-list__list-entryfoundry-page-list__list-itemfoundry-page-list__list-item--without-imagefoundry-page-list__metafoundry-page-list__subtitlefoundry-page-list__summaryfoundry-page-list__title
post-hero
Minimum required: title — everything else is optional.
Use Post Hero to open an article, journal entry, report, or resource with one
public title, a concise standfirst, canonical article metadata, and optional
meaningful featured media. It reads author, date, reading time, category, and
tags from page metadata by default so editors and AI agents do not duplicate
those facts in the Section.
sections:
- block: post-hero
id: article-opening
content:
title: Why slower observation leads to better creative decisions
text: A field note on separating evidence, interpretation, and the urge to make every page louder.
image: "/images/journal/observation-table.webp"
image_alt: "Paper notes, material samples, and a magnifying glass arranged on a work table."
design:
preset: visual-feature
Intent presets: reading-first for a fast text-led opening,
visual-feature for a wide image with an overlapping editorial panel, and
profile-led-story when a portrait-oriented image should share the opening.
Content fields
| Field | Details |
|---|---|
title | required exact public article title; page title remains the renderer fallback |
text | optional concise standfirst in portable Markdown |
image | optional approved featured image that adds meaning |
image_alt | useful description of meaningful image content; later rotating images are decorative to avoid repeated announcements |
Article metadata normally belongs in the page’s canonical date, authors,
category, tags, and reading-time source. Legacy content.author_*, date,
and read_time values remain compatible for migrations, but they are not the
preferred editing path.
Design options
| Field | Details |
|---|---|
variants | centered, split, stacked |
variant | centered | split | stacked — reading-first, portrait-sharing, or wide visual-feature composition |
kenburns | advanced opt-in rotating media; works only when multiple approved images exist and defaults off |
kenburns_interval | advanced image-change interval, bounded to 4000–30000 milliseconds |
kenburns_transition | advanced crossfade duration, bounded to 300–3000 milliseconds |
css_class | extra CSS classes on outer section |
Use plain Hero for a marketing landing page and Section Header inside a page. Use Post Hero only when article identity and reading metadata are the visitor’s job. Core owns heading semantics, source order, media loading, responsive stacking, and byline anatomy; Theme Families and Customer Brand Systems may art-direct the public Post Hero variables without copying the renderer.
BEM classes
foundry-post-herofoundry-post-hero--{centered,split,image-top,stacked}foundry-post-hero__authorfoundry-post-hero__author-copyfoundry-post-hero__author-imagefoundry-post-hero__author-initialsfoundry-post-hero__author-namefoundry-post-hero__author-rolefoundry-post-hero__categoryfoundry-post-hero__contentfoundry-post-hero__datefoundry-post-hero__factsfoundry-post-hero__imagefoundry-post-hero__innerfoundry-post-hero__layoutfoundry-post-hero__mediafoundry-post-hero__media-rotatorfoundry-post-hero__metafoundry-post-hero__read-timefoundry-post-hero__standfirstfoundry-post-hero__tagfoundry-post-hero__tagsfoundry-post-hero__taxonomyfoundry-post-hero__title
post-list
Minimum required: section — everything else is optional.
Editorial Page List Style for a known Hugo content section. It normalizes
titles, summaries, dates, categories, authors, and images through the shared
discovery model. Use Content Feed or Search when filtering is the visitor job.
The normal authoring path is typed page-list.editorial; the renderer name
remains supported for compatibility.
sections:
- type: page-list
style: editorial
id: journal-index
content:
eyebrow: Journal
title: Ideas for better publishing
text: A selected reading list from ordinary Hugo pages.
section: articles
sort: date
limit: 7
cta:
text: Browse every article
url: /articles/
design:
preset: editorial-reading-list
Recommended presets are editorial-reading-list for fast comparison,
magazine-front for one lead story plus a compact rail, and journal-cards
when each entry needs a strong visual memory. Use featured_first: true with
cards only when the first sorted entry genuinely deserves promotion.
Design options
| Field | Details |
|---|---|
variants | cards, list, magazine |
view | cards | list | magazine — visual hierarchy selected by reading task |
columns | 2 | 3 — wide card columns; narrows responsively |
show_date | true | false — show normalized publish date |
show_summary | true | false — show normalized summary |
show_image | true | false — show normalized discovery image |
show_category | true | false — show normalized category badge |
css_class | advanced declared-Extension escape hatch, not the normal design path |
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__media-linkfoundry-post-list__metafoundry-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.
Plan-decision control for comparing accurately priced options against shared
criteria. Pricing Tiers presents offers; Comparison Table compares two general
approaches; Pricing Comparison helps a visitor choose among priced plans.
sections:
- type: comparison
style: pricing
id: choose-a-plan
design:
preset: detailed-plan-matrix
content:
eyebrow: "Plans at a glance"
title: "Choose by the support you need"
introduction: "Every plan is measured against the same working questions."
plans:
- key: foundation
name: "Foundation"
price: "$1,800"
cadence: "one-time"
price_note: "Taxes not included"
- key: partnership
name: "Working partnership"
price: "$3,600"
cadence: "one-time"
highlight: true
highlight_reason: "It fits teams that need decisions made together."
criteria:
- label: "Live working session"
values:
- plan: foundation
state: not-included
text: "Written intake"
- plan: partnership
state: included
text: "One 90-minute session"
footnote: "Keep material price, term, tax, and scope qualifications visible."
Stable plans[].key values connect each plan to criteria[].values[].plan.
Use visible value text or one of included, not-included, limited,
custom, and text; color never carries state by itself. A highlighted plan
needs a truthful highlight_reason. Legacy plan features and subtitle
remain compatible, but shared criteria are the preferred source model.
Design options
| Field | Details |
|---|---|
variant | matrix | ledger | guided — scan-first table, open editorial record, or explained best-fit guidance |
caption | Optional accessible matrix caption; defaults to the Section title |
css_class | extra CSS classes on outer section |
Recommended presets are detailed-plan-matrix, simple-package-ledger, and
guided-best-fit; package-decision-table remains a compatible matrix alias.
BEM classes
foundry-pricing-comparisonfoundry-pricing-comparison__innerfoundry-pricing-comparison__matrixfoundry-pricing-comparison__criterionfoundry-pricing-comparison__ledgerfoundry-pricing-comparison__ledger-planfoundry-pricing-comparison__guidedfoundry-pricing-comparison__focus-planfoundry-pricing-comparison__alternativesfoundry-pricing-comparison__footnotefoundry-pricing-comparison__title
pricing-tiers
Minimum required: tiers — everything else is optional.
Present two or three offers with truthful price meaning, visible fit, concrete
inclusions, and an accurate next step. Use pricing-comparison instead when
visitors must compare every plan against the same criteria.
sections:
- type: pricing
id: pricing-tiers-example
design:
preset: conditional-featured
content:
eyebrow: "Ways to begin"
title: "Choose by the support you need"
introduction: "Prices, cadence, material conditions, and fit remain visible."
tiers:
- key: focused
name: "Focused start"
price: "$900"
cadence: "one-time"
price_note: "Example price · taxes not included"
description: "A bounded package for one defined question."
best_for: "A team that needs a clear starting point."
includes:
- "Written intake"
- "Prioritized direction brief"
- key: partnership
name: "Working partnership"
price: "$2,400"
cadence: "one-time"
price_note: "Example price · scope agreed in writing"
description: "Shared working time for connected decisions."
best_for: "A team coordinating several related decisions."
badge: "Conditional fit"
featured: true
highlight_reason: "This may fit when the team needs a live session and a second scheduled review."
includes:
- "One live working session"
- "Two scheduled review rounds"
action:
text: "Review the fit"
url: "#pricing-tiers-example"
Design options
| Field | Details |
|---|---|
variants | grid, featured, stacked |
variant | grid | featured | stacked — Grid keeps credible choices equal; Featured emphasizes only a tier with featured: true and a visible highlight_reason; Stacked gives longer inclusions an open ledger |
css_class | extra CSS classes on outer section |
Prefer the intent presets equal-choice-grid, conditional-featured, and
expanded-inclusions. An optional tier action needs both text and a real
url; Foundry omits incomplete actions instead of rendering a placeholder.
The source-linked Visual Example at
/pricing-tiers-directions/{equal-choices,conditional-fit,inclusion-ledger}/
shows materially different Structured Clarity, Immersive Atmosphere, and
Editorial Narrative outcomes from the same portable contract.
BEM classes
foundry-pricing-tiersfoundry-pricing-tiers__innerfoundry-pricing-tiers__headerfoundry-pricing-tiers__eyebrowfoundry-pricing-tiers__titlefoundry-pricing-tiers__introductionfoundry-pricing-tiers__collectionfoundry-pricing-tiers__tierfoundry-pricing-tiers__identityfoundry-pricing-tiers__badgefoundry-pricing-tiers__namefoundry-pricing-tiers__descriptionfoundry-pricing-tiers__price-linefoundry-pricing-tiers__pricefoundry-pricing-tiers__cadencefoundry-pricing-tiers__price-notefoundry-pricing-tiers__fit-reasonfoundry-pricing-tiers__best-forfoundry-pricing-tiers__featuresfoundry-pricing-tiers__featurefoundry-pricing-tiers__actionfoundry-pricing-tiers__buttonfoundry-pricing-tiers__empty
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
priority: normal
kind: article
section: blog
topics: [neurotoxin]
audience: [men]
series: []
featured: false
order: 0
summary: ""
image: ""
image_alt: ""
search.priority is the explicit ranking control: high renders Pagefind
weight 2, normal leaves Pagefind’s default weight unchanged, and low
renders weight 0.5. Core emits the normalized value as Pagefind metadata and
as a filter, so browser evidence can confirm the effective relevance contract.
Do not use Hugo’s general page weight as a search-ranking proxy.
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. The full search block also renders up to eight curated quick links, or
eligible site pages when none are configured, inside <noscript> so visitors
retain a browse path without JavaScript.
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.
Focused sequential media browsing for small, deliberately ordered image sets.
Use it when one image should lead at a time. Use gallery or
masonry-gallery when visitors need to scan and compare the collection.
The simple path is to choose a preset and author slides. quiet-fade is the
calm default, editorial-sequence preserves complete assets and captions, and
portfolio-card-stack creates a visibly layered portfolio treatment. All
three inherit the active Theme Family and Customer Brand System; they do not
require page-local renderer copies or a JavaScript framework.
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:
preset: quiet-fade
The unenhanced HTML is a normal source-ordered media sequence. JavaScript adds the carousel behavior, arrow-key navigation, touch swiping, status updates, and optional autoplay. Autoplay is off by default, stops for reduced motion, pauses for hover or focus, and exposes a persistent Play/Pause control when enabled.
Choose the presentation
| Choice | Visitor experience | Best use |
|---|---|---|
fade | One quiet image dissolves into the next. | restrained campaigns, properties, case-study highlights |
slide | The authored sequence moves laterally and makes order explicit. | walkthroughs, process imagery, editorial sequences |
cards | The active image sits above visible neighboring cards. | portfolios and expressive creative work where the collection should feel tactile |
overlay captions maximize the image, below captions protect longer or
information-dense copy, and hidden is only appropriate when the images and
their alternative text carry the complete meaning. Choose contain for
diagrams, screenshots, artwork, and any asset that must not be cropped.
Design options
| Field | Details |
|---|---|
variants | fade, slide, cards |
variant | fade | slide | cards — presentation and transition model; choose by visitor task, not decoration |
aspect | 16:9 | 4:3 | 21:9 | auto — authored media frame ratio (default: 16:9) |
media_fit | cover | contain — crop photography or preserve the complete asset (default: cover) |
media_position | normalized image position — focal point for cropped media (default: center center) |
caption_position | overlay | below | hidden — caption treatment (default: overlay) |
autoplay | true | false — auto-advance slides; off by default and always user-pausable |
interval | milliseconds between automatic advances, clamped to at least 4000 (default: 5000) |
show_dots | true | false — direct slide chooser visibility (default: true) |
show_arrows | true | false — previous and next control visibility (default: true) |
show_overlay | true | false — compatibility alias; false maps to caption_position: hidden |
css_class | advanced escape hatch for a declared site Extension; not the normal design path |
BEM classes
foundry-slideshowfoundry-slideshow__arrowfoundry-slideshow__arrow--nextfoundry-slideshow__arrow--prevfoundry-slideshow__dotfoundry-slideshow__dotsfoundry-slideshow__emptyfoundry-slideshow__framesfoundry-slideshow__headerfoundry-slideshow__mediafoundry-slideshow__imagefoundry-slideshow__innerfoundry-slideshow__captionfoundry-slideshow__slide-titlefoundry-slideshow__slide-textfoundry-slideshow__slidefoundry-slideshow__stackfoundry-slideshow__statusfoundry-slideshow__controlsfoundry-slideshow__autoplayfoundry-slideshow__control-iconfoundry-slideshow__empty-textfoundry-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__button-innerfoundry-social-share__iconfoundry-social-share__labelfoundry-social-share__sr-onlyfoundry-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 |
layout | grid | editorial | rail — independent cards, open ruled evidence, or one compact related proof line |
stats[].detail | Optional visible source, timeframe, population, or qualification |
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.
Use Stats Grid for a small set of factual metrics that help a visitor evaluate
scale, experience, impact, or service quality. Use Stats Band for a short page
transition and Comparison Table when values must be compared row by row. Never
invent proof: detail can hold the date, scope, or qualification.
Recommended presets: evidence-cards, editorial-band, and
brand-highlights.
sections:
- block: stats-grid
id: stats-grid-example
content:
stats:
- label: Returning clients
value: 72%
detail: Rolling 12 months, through June 2026
subtitle: A few useful numbers, each with enough context to trust it.
title: Evidence at a glance
design:
preset: evidence-cards
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 |
columns | 2 | 3 | 4 — maximum wide-layout columns; responsive reflow is automatic |
css_class | extra CSS classes on outer section |
BEM classes
foundry-stats-gridfoundry-stats-grid__gridfoundry-stats-grid__headerfoundry-stats-grid__iconfoundry-stats-grid__innerfoundry-stats-grid__itemfoundry-stats-grid__detailfoundry-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 with a [portable link](/guide/)."
icon: book-open
subtitle: "Process context supports **portable Markdown**."
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 |
content.subtitle and every content.steps[].text value are portable Markdown
fields. They support links, emphasis, lists, and paragraphs through Foundry’s
safe Markdown rendering path. Step headings and icon names remain escaped plain
strings. content.steps[].icon uses a registered Foundry icon name and appears
only when design.show_icons is enabled. The generated Step N label is a
Core-owned localized interface string, not hidden authorable copy.
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.
Visitor job: let a visitor switch among a small set of equivalent views without navigating away or comparing them simultaneously. Use Accordion for long answers on narrow screens, a Comparison Table when differences must stay visible together, and ordinary headings when the content is sequential.
foundry-tabs__inner owns its width, centering, and gutters without a utility
stylesheet. Set --foundry-tabs-container-max when tabs should share a wider
lane with adjacent Features, Media Sequence, or Media Text blocks; do not
rewrite width, margin, and padding selectors in the consumer.
Before JavaScript initializes, every panel remains visible in normal source order. The fingerprinted Core controller then applies the tab pattern, hidden states, click activation, Home/End, and orientation-aware arrow keys. This keeps essential content available under a strict CSP and without JavaScript.
sections:
- block: tabs
id: tabs-example
content:
tabs:
- label: Overview
text: Tab content.
title: Example title
design:
variant: underline
css_class: ''
| Preset | Best starting point |
|---|---|
editorial-underline | quiet reading-oriented content switcher |
compact-pills | short labels, filters, or compact service views |
guided-sidebar | three or more substantial panels needing clear wayfinding |
Design options
| Field | Details |
|---|---|
variants | underline, pills, bordered |
variant | underline | pills | bordered — tab trigger style |
layout | horizontal | sidebar — horizontal trigger row or desktop navigation/panel split |
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.
Use Testimonials for a small, static set of accurately attributed voices. Use
Testimonials Carousel only when the set is long enough to justify interaction,
and Case Studies when proof needs context, method, and outcome. Optional source
links let visitors verify public quotes.
Recommended presets: trusted-voices, lead-story, and editorial-voices.
sections:
- block: testimonials
id: testimonials-example
content:
subtitle: Example value
testimonials:
- quote: The team made every decision understandable and the result feels like us.
author: Client Name
role: Project client
source_url: /work/client-story/
source_label: Read the client story
title: What clients remember
design:
preset: lead-story
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__attributionfoundry-testimonials__avatarfoundry-testimonials__authorfoundry-testimonials__collectionfoundry-testimonials__headerfoundry-testimonials__innerfoundry-testimonials__itemfoundry-testimonials__markfoundry-testimonials__personfoundry-testimonials__quotefoundry-testimonials__rolefoundry-testimonials__sourcefoundry-testimonials__subtitlefoundry-testimonials__title
testimonials-carousel
Minimum required: testimonials — everything else is optional.
Use Testimonials Carousel for several approved voices when a static grid would
be too dense. It uses focusable native horizontal scrolling, never rotates
automatically, and keeps every quote and attribution in source order without
JavaScript. Use Testimonials for a small set that should be compared at once;
use Case Studies when proof needs method, context, and outcome.
Recommended presets: story-reel, lead-voice, and
compact-proof-rail.
Copy only exact approved wording. Confirm attribution and portrait permission,
provide a public source when one exists, and include rating only when the
source explicitly supplies that score. Foundry does not infer ratings from
sentiment.
sections:
- type: testimonials
style: carousel
id: approved-client-voices
content:
eyebrow: Client reflections
title: What changed after the work
subtitle: Each quote is shown in approved wording with its public context.
testimonials:
- quote: We left with three decisions we could act on Monday.
author: Mara Chen
role: Operations lead
rating: 5
source_url: /work/mara-chen/
source_label: Read the client story
design:
preset: story-reel
show_rating: true
Design options
| Field | Details |
|---|---|
variants | cards, spotlight, compact |
variant | cards | spotlight | compact — balanced evidence sequence, lead-voice composition, or open compact quote rail |
show_rating | true | false — show an approved numeric rating when present; never infer one from quote sentiment |
show_icons | true | false — show or hide the decorative quotation mark |
css_class | extra CSS classes on outer section |
BEM classes
foundry-testimonials-carouselfoundry-testimonials-carousel__attributionfoundry-testimonials-carousel__authorfoundry-testimonials-carousel__avatarfoundry-testimonials-carousel__cuefoundry-testimonials-carousel__cue-linefoundry-testimonials-carousel__emptyfoundry-testimonials-carousel__eyebrowfoundry-testimonials-carousel__headerfoundry-testimonials-carousel__innerfoundry-testimonials-carousel__itemfoundry-testimonials-carousel__markfoundry-testimonials-carousel__personfoundry-testimonials-carousel__quotefoundry-testimonials-carousel__quote-areafoundry-testimonials-carousel__ratingfoundry-testimonials-carousel__rolefoundry-testimonials-carousel__sourcefoundry-testimonials-carousel__subtitlefoundry-testimonials-carousel__titlefoundry-testimonials-carousel__trackfoundry-testimonials-carousel__viewport
timeline
Minimum required: events — everything else is optional.
Chronological Section for history, roadmaps, schedules, phases, and archives.
Every presentation renders the explicit source order as a semantic ordered list. Choose by the visitor’s reading job: use a milestone story when context accumulates over time, a phase board when milestones need independent review, or a schedule register when repeated time labels need rapid scanning. Use Process for instructions and Onboarding Timeline for a person’s starting path.
Start with a named preset. Override design.variant only when the preset does
not express the intended reading job; css_class is an advanced declared
Extension escape hatch, not normal authoring.
sections:
- type: timeline
id: project-history
design:
preset: milestone-story
content:
title: "How the work developed"
subtitle: "Milestones stay in explicit chronological source order."
events:
- date: "2024"
title: "Foundation established"
text: "The first portable contract was documented."
- date: "2026"
title: "Structured editing expanded"
text: "Human Controls gained exact item-level preview mapping."
badge: "Current"
url: "/roadmap/"
Intent-named presets are milestone-story (vertical), phase-board
(cards), and schedule-register (compact). The existing
creative-exhibition-spine and milestone-timeline names remain compatible.
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 — narrative milestone spine, independent phase board, or ruled schedule/archive register |
css_class | advanced escape hatch for a declared site Extension; not the normal design path |
BEM classes
foundry-timelinefoundry-timeline--cardsfoundry-timeline--compactfoundry-timeline--verticalfoundry-timeline__badgefoundry-timeline__contentfoundry-timeline__datefoundry-timeline__emptyfoundry-timeline__event-titlefoundry-timeline__headerfoundry-timeline__innerfoundry-timeline__itemfoundry-timeline__linkfoundry-timeline__listfoundry-timeline__markerfoundry-timeline__metafoundry-timeline__subtitlefoundry-timeline__textfoundry-timeline__title
topic-chip-nav
Minimum required: items — everything else is optional.
Topic chip navigation for quick route picking and optional gallery filtering.
When filter is set, chips act as client-side filters against a filterable
gallery. When url (or legacy route) is set, chips are normal links.
sections:
- type: topic-chip-nav
id: topic-chip-nav-example
content:
title: Choose your view
items:
- title: Read more
url: /dc03-s12-article/
icon: arrow-right
- title: Launch proof
filter: launch
icon: sparkles
- title: Baseline
filter: baseline
design:
alignment: center
Content options
| Field | Details |
|---|---|
title | optional section heading introducing the chip row |
items | required ordered topic chips |
items[].title | required chip label (legacy fallback support: items[].text) |
items[].text | optional legacy label source when title is omitted |
items[].url | route destination for link-style chips |
items[].route | compatibility alias for legacy route content |
items[].filter | optional filter key for gallery filtering |
items[].icon | optional icon name for the chip |
Design options
| Field | Details |
|---|---|
alignment | left or center |
target | optional CSS selector for a filterable gallery target |
css_class | extra CSS classes on outer section |
BEM classes
foundry-topic-chip-navfoundry-topic-chip-nav--leftfoundry-topic-chip-nav--centerfoundry-topic-chip-nav__chipfoundry-topic-chip-nav__iconfoundry-topic-chip-nav__innerfoundry-topic-chip-nav__listfoundry-topic-chip-nav__title
trust-badges
Minimum required: items — everything else is optional.
Show a concise set of current, supportable assurances with enough context to
avoid turning a policy, standard, membership, or credential into a broader
claim.
Use logo-trust for permissioned organization relationship logos. Use the
trust-marks.certifications Section Style when the entire job is a formal
certification set. Trust Badges is for mixed assurances that may need a plain
category, qualification, or public source.
sections:
- block: trust-badges
id: essential-assurances
design:
preset: essential-assurances
content:
title: "What is already decided before work begins"
introduction: |
These are operating commitments, not promises about a particular
outcome. Review the linked policy when the detail matters.
items:
- name: "Written scope before work starts"
kind: "Policy"
context: "Deliverables, responsibilities, and change handling are documented."
source_url: "/policies/project-scope/"
source_label: "Review policy"
- name: "Owner-controlled publishing"
kind: "Workflow"
context: "No public release is implied by a preview or approval request."
name is the only required item field. kind, context, image,
image_alt, source_url, and source_label are optional. Use an image only
for a current seal or mark the site is authorized to display. The visible name
always carries the assurance; an image never substitutes for accurate text.
Intent presets
essential-assurances— compact ruled strip for short operating facts.approved-seals— image-led gallery for permissioned seals with visible names.proof-ledger— numbered facts with qualifications and public sources.trust-strip— retained compatibility alias for the original compact preset.
Design options
| Field | Details |
|---|---|
variant | chips (compact assurance strip), logos (approved seal gallery), or list (numbered proof ledger) |
css_class | Advanced escape hatch for a declared site Extension; not the normal design path |
Theme Families and Customer Brand Systems may art-direct public
--foundry-trust-badges-* variables for measure, spacing, type, accent,
rules, surfaces, and mark sizing. Core owns list semantics, visible names,
source-link focus, responsive reading order, and safe fallback output.
BEM classes
foundry-trust-badgesfoundry-trust-badges__contextfoundry-trust-badges__copyfoundry-trust-badges__emptyfoundry-trust-badges__headerfoundry-trust-badges__innerfoundry-trust-badges__introductionfoundry-trust-badges__itemfoundry-trust-badges__itemsfoundry-trust-badges__kindfoundry-trust-badges__logofoundry-trust-badges__markfoundry-trust-badges__markerfoundry-trust-badges__namefoundry-trust-badges__sourcefoundry-trust-badges__title
video-embed
Minimum required: title, url — everything else is optional.
Accessible single-video control supporting native MP4/WebM playback and
click-to-load, allowlisted YouTube/Vimeo handoffs. Use a repository-local
poster so the page does not contact a provider before visitor action.
sections:
- block: video-embed
id: video-embed-example
content:
eyebrow: "Two-minute field guide"
title: "See the method before reading every detail"
text: "Brief portable Markdown that explains why the video is useful."
duration: "2:18"
url: "/video/method.mp4"
poster: "/images/method-poster.jpg"
caption: "Optional context, attribution, or rights note."
captions: "/captions/method-en.vtt"
captions_language: "en"
captions_label: "English"
transcript: "A corrected descriptive transcript including important speech, sound, and visuals."
design:
preset: guided-feature
Provider source is equally simple and remains a normal URL:
sections:
- block: video-embed
id: campaign-film
content:
title: "How the work comes together"
url: "https://www.youtube.com/watch?v=APPROVED_ID"
poster: "/images/campaign-film-poster.jpg"
transcript: "Corrected descriptive transcript."
design:
preset: cinema-screening
Without JavaScript, direct media retains native controls and provider media retains normal source links. Foundry generates provider iframe markup only after Play; do not paste iframe HTML into source.
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 |
poster_fit | cover | contain — poster and direct-media fit |
autoplay | true | false — silent looping for direct media only; remote providers still require visitor action |
css_class | extra CSS classes on outer section |
Intent presets: guided-feature, cinema-screening,
vertical-demonstration.
BEM classes
foundry-video-embedfoundry-video-embed__captionfoundry-video-embed__caption-statusfoundry-video-embed__copyfoundry-video-embed__durationfoundry-video-embed__emptyfoundry-video-embed__eyebrowfoundry-video-embed__figurefoundry-video-embed__framefoundry-video-embed__iframefoundry-video-embed__innerfoundry-video-embed__layoutfoundry-video-embed__playfoundry-video-embed__play-copyfoundry-video-embed__play-iconfoundry-video-embed__posterfoundry-video-embed__poster-placeholderfoundry-video-embed__provider-linkfoundry-video-embed__shellfoundry-video-embed__subtitlefoundry-video-embed__titlefoundry-video-embed__transcriptfoundry-video-embed__transcript-bodyfoundry-video-embed__transcript-linkfoundry-video-embed__transcript-summaryfoundry-video-embed__videofoundry-video-embed__veil
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_captions: Example value
video_captions_language: en
video_captions_label: English
video_poster: Example value
video_transcript: Descriptive transcript for visitors who do not use playback.
video_url: Example value
design:
css_class: ''
Design options
| Field | Details |
|---|---|
variants | None (single style) |
autoplay | true | false — opt into muted looping playback; default false so the poster and native controls remain the safe floor |
reveal | fade-up | fade-in | slide-left | slide-right | zoom-in | none — copy/media reveal style |
parallax | true | false | speed — enable media-card parallax only when it supports the page job |
kenburns | true | false — enable image fallback cycling; reduced motion flattens the effect |
scroll_cue | true | false — show a reduced-motion-safe scroll cue |
css_class | extra CSS classes on outer section |
BEM classes
foundry-video-herofoundry-video-hero__actionsfoundry-video-hero__framefoundry-video-hero__innerfoundry-video-hero__mediafoundry-video-hero__framefoundry-video-hero__videofoundry-video-hero__posterfoundry-video-hero__overlayfoundry-video-hero__textfoundry-video-hero__title
Video Hero remains primitive-first in the editor-expansion contract. Its
first-viewport-media floor keeps the poster or image fallback, native video
controls, captions, descriptive transcript, and direct source link usable
before autoplay or motion enhancement. It should not be promoted to a routine
Control until that primitive has a complete preview, reset, and browser proof.
The draft Visual Example at /video-hero-directions/ makes the current floor
discoverable while preserving that limitation; it is not an intent preset or a
release-ready Control claim.
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.
Visitor job: understand the page’s defining promise, see an intentional visual world, and find the next useful action within the first viewport.
Use motion-hero when media and controlled movement materially strengthen the
opening. Use hero for a faster, quieter introduction, or video-hero when a
specific video is the essential medium. Do not add parallax or Ken Burns simply
because the controls exist: the complete message must work as static HTML first.
Start with a named preset. Each one selects a complete composition; most pages should only need to adjust the image crop and copy.
sections:
- block: motion-hero
id: motion-hero-example
design:
preset: cinematic-opening
object_position: center center
mobile_object_position: 58% center
content:
eyebrow: A defining opening
title: Atmosphere with a clear next step.
text: Give the visitor one promise, a considered visual world, and an obvious route forward.
background_images:
- src: /images/motion-hero-1.jpg
position: center center
kenburns_preset: in
- src: /images/motion-hero-2.jpg
position: 60% center
kenburns_preset: out-right
primary_action:
text: Explore the experience
url: /experience/
secondary_action:
text: Read the story
url: /story/
| Preset | Composition | Best for |
|---|---|---|
cinematic-opening | Centered, full-bleed focus | Hospitality, launches, destinations, defining brand moments |
editorial-reveal | Split canvas with independent copy and media space | Studios, founder stories, editorial services, authored collections |
campaign-evidence | Broad lower-third proposition with proof and actions | Campaigns, high-consideration offers, product or service launches |
aesthetics-results | Warm editorial treatment with proof badges | Results-oriented stories where careful expectation language matters |
The renderer validates every enumerated control, focal point, motion speed, and timing value before output. Motion is progressive enhancement: copy and actions remain normal HTML; the first background image remains visible without JavaScript; later images are lazy; focus remains visible; pointer targets meet the Foundry touch floor; and reduced-motion preferences flatten reveal, parallax, and Ken Burns behavior.
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 | cinematic, editorial, campaign |
variant | cinematic | editorial | campaign — full-bleed focus, split editorial reveal, or broad campaign lower-third |
parallax | true | false | {speed 0.0-0.35} — optional progressive background parallax; default false |
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 the selected badge row; default false |
overlay_strength | none | soft | medium | strong - overlay shade strength |
overlay_tone | 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 | proof | none | engine - customer proof badges, no badges, or development-only engine labels; default none |
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__messagefoundry-motion-hero__mediafoundry-motion-hero__imagefoundry-motion-hero__actionsfoundry-motion-hero__actionfoundry-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
object_position: center center
mobile_object_position: center top
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 |
object_position | CSS object-position value for property images, poster, and video (default: center center) |
mobile_object_position | CSS object-position override for property media on small screens |
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__contentfoundry-property-hero__innerfoundry-property-hero__imagefoundry-property-hero__videofoundry-property-hero__actionsfoundry-property-hero__actionfoundry-property-hero__statsfoundry-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, illustration-panel, pricing-comparison, pricing-tiers, resource-downloads, steps, testimonials-carousel, trust-badges |