Background Type — Image
The default background type: a single full-bleed image, bgStyle defaulting to scroll.
Background Type — Solid Colour
A flat solid-colour background, useful for pull-quote or transition sections between image-heavy chapters.
Background Type — Linear Gradient
A 45° linear gradient between two hex colours.
Background Type — Radial Gradient
A radial gradient, centred on the section.
Background Type — Conic (Box) Gradient
A conic (“box”) gradient sweeping around the section.
Background Type — Video
A looping, muted, playsinline video background with a poster image shown until the video is
ready to play, and used as the static fallback under prefers-reduced-motion or no-JS.
Background Align Centre
The default background type: a single full-bleed image, bgStyle defaulting to scroll.
Background Align - Full
A 45° linear gradient between two hex colours.
Background Align - Left
A looping, muted, playsinline video background with a poster image shown until the video is
ready to play, and used as the static fallback under prefers-reduced-motion or no-JS.
Background Align - Right
A 45° linear gradient between two hex colours.
Background Effect — Default Scroll
The background scrolls naturally with the page content — no pinning, no scrubbing.
Background Effect — Pin
The background stays fixed while this section’s content scrolls over it — the previous section reveals it, the next section covers it. Best for hero moments and image showcases.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Background Effect — Pin Short
The background stays fixed while this section’s content scrolls over it — the previous section reveals it, the next section covers it. Best for hero moments and image showcases.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
Background Effect — Fade In/Out
The background fades in as you scroll into the section, and fades out as you leave it.
Basic Scroll
The background scrolls in, pins while this text is read, then scrolls out — ideal for long-form content that needs sustained focus time over one image.
Background Effect — Scroll Pin
The background scrolls in, pins while this text is read, then scrolls out — ideal for long-form content that needs sustained focus time over one image.
Basic Scroll
The background scrolls in, pins while this text is read, then scrolls out — ideal for long-form content that needs sustained focus time over one image.
Background Effect — Parallax
Three layers move at independent speeds as you scroll, creating a 3D depth effect. Lower
parallaxSpeed values sit further back and move more slowly.
Background Effect — Crossfade
Three-phase: the first image scrolls in, the images crossfade evenly between each other with no flash of the page background, then the last image scrolls out. Works with any number of images.
Background Effect — Swipe (Before/After)
A scroll-driven before/after comparison: the first (“before”) image scrolls in, a wipe at 0° (left-to-right) reveals the second (“after”) image underneath, then it scrolls out.
Background Effect — Swipe (Before/After)
A scroll-driven before/after comparison: the first (“before”) image scrolls in, a wipe at 0° (left-to-right) reveals the second (“after”) image underneath, then it scrolls out.
Background Effect — Swipe (Before/After)
A scroll-driven before/after comparison: the first (“before”) image scrolls in, a wipe at 0° (left-to-right) reveals the second (“after”) image underneath, then it scrolls out.
Background Effect — Default Scroll
The background should scroll when not set
Content Alignment — Left
The title and body text block sits against the left edge of the section, leaving the right side clear for the background to breathe. On mobile this collapses to centred regardless of the setting here.
Content Alignment — Left
The title and body text block sits against the left edge of the section, leaving the right side clear for the background to breathe. On mobile this collapses to centred regardless of the setting here.
Content Alignment — Right
The text block sits against the right edge instead. This is also the alignment that pairs with a
left-pinned pinImage — see the Positioned Image section further down.
Content Alignment — Right
The text block sits against the right edge instead. This is also the alignment that pairs with a
left-pinned pinImage — see the Positioned Image section further down.
Content Alignment — Centre
Centred text, the only alignment available on mobile regardless of what’s set here — every other section in this showcase collapses to this layout below the tablet breakpoint.
Content Alignment — Default (Unset)
No contentAlign set here at all — this section is checking that the template falls back to
centre by default (see THEME_SPEC.md §8.7) rather than erroring or rendering unstyled.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Section Height — Long Content
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Section Height — Long Content
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Every section in this template is at minimum one full viewport tall — but never taller than it needs to be for short content, and never shorter than a screen for long content. This section exists purely to prove that second half of the rule: it holds enough copy that it should grow well past 100vh, pushing the next section down rather than clipping or scrolling internally.
That matters for real long-form work. A photo essay chapter might carry two sentences of caption under a single image, or it might carry six paragraphs of reported narrative — the section template has to hold both without the shorter ones feeling like empty stretches of scroll and without the longer ones getting compressed into a scrollable box-within-a-box, which breaks the full-page scroll-driven feel the whole format depends on.
In practice this means the section’s minimum height is set with min-height: 100vh (or the
svh/dvh equivalents once mobile viewport units are safe to rely on across the target browser
set) rather than a fixed height, so content is always free to push the box taller. Background
effects that rely on scroll-scrubbed progress through the section — scrollpin, fade,
crossfade — need their ScrollTrigger start/end bound to the section’s actual rendered height,
not a hard-coded viewport multiple, or they’ll finish early on sections like this one and sit idle
for the rest of the scroll.
Worth checking specifically on a small phone in landscape orientation, where “one viewport tall” is a much shorter distance than on desktop, and long sections like this one will need considerably more scrolling to clear.
Positioned (Pinned) Image
This section is content-right, so pinImage pins to the left, at roughly 40% of the
viewport width, fading/sliding in as this section enters and out as it leaves. It’s meant for
testimonial portraits, article image callouts, or embedded data visualisations that need to stay
put while several paragraphs of related text scroll past.
On mobile, this same image renders inline at full width in normal document flow — no pinning on touch devices, regardless of viewport width (THEME_SPEC.md §8.8).
Title Style — Plain
No animation — the title is simply visible. This is also the state every titleStyle collapses
to under prefers-reduced-motion: reduce or with JavaScript unavailable.
Title Style — Character Reveal
The default. Individual characters fade in and slide up from below as the title scrolls into view.
Title Style — Fade
The whole title fades in as a single unit, no per-character stagger.
Title Style — Wave
Characters animate up and down in a travelling wave as they appear, rather than all rising together.
Title Style — Split
The title splits — by word or half — and the pieces converge/slide together into place. Paired here with a two-layer parallax background to show effects composing cleanly.
Title Style — Mask Reveal
The title is revealed through a clip-path/mask wipe rather than an opacity or position tween.
Title Style — Scroll Title
The title itself translates into position as the section enters — the whole block moves as one
unit, distinct from the per-character characters style.
Title Style — Scramble
Characters cycle through random glyphs before resolving to the final text (GSAP
ScrambleTextPlugin) — the highest-risk animation for low-end mobile performance, flagged in
THEME_SPEC.md’s open items for early prototyping.
Custom Link Title Example
This should show CustomTile in the submenu not “Custom Link Title Exmaple”