Call to action

The one action field that closes every page: an invitation to a conversation and the free health check, always on saffron.

Template · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Do and don't

Do: Page close

Rendered by cta-section.ts

Open example: Call to action · Do: Page close Use the full-page example to follow page links.

The same next step everywhere.

Do: Japanese close

Rendered by cta-section.ts

Open example: Call to action · Do: Japanese close Use the full-page example to follow page links.

Japanese copy and links.

Don't: Indigo call to action

Rendered by cta-section.ts

Open example: Call to action · Don't: Indigo call to action Use the full-page example to follow page links.

Always saffron.

Don't: Two on a page

Rendered by cta-section.ts

Open example: Call to action · Don't: Two on a page Use the full-page example to follow page links.

One action field per page.

Rules

RuleWhyCheck
The call to action is always saffron.Saffron means 'do this' everywhere on the site.Automated: scripts/site/system/check-pages.ts (cta field colour)
It is the last section before the footer.Readers learn where the next step is.Automated: scripts/site/system/check-pages.ts (page sequence)

API

PropTypeRequiredDefaultWhat it does
variantpage | landingYespage: the standard close; landing: with the stage finder.
langen | jaNo"en"Language (page).
idstringNoSection id (landing).
headingstringNoHeading (landing).
lefthtmlNoCopy and actions (landing).
finderhtmlNoThe stage finder (landing).

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idcta-section
LayerTemplates
Categorysection
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/templates/cta-section.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Call to action as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Last section before the footer on every page. Why: Every page ends with the same next step, so readers always find it.

Do not use when

  • In the middle of a page. Why: One call to action field per page keeps saffron meaning 'do this'.
  • On another colour. Why: Saffron is the action colour (D-SITE-004).

Anatomy

PartWhat it is
rootsection.section-cta.field-saffron (page) or section.l-cta.l-cta-2.field-saffron (landing)
headingh2 the invitation
textp what happens
actionsCtaPair: Book a conversation, Start with a free health check
finderthe Stage finder showcase beside the copy (landing)

Made of: heading, text, cta-pair, dye-field, stage-finder.

Used in: page-article, page-articles, page-deep, page-demo, page-hub, page-landing, page-status, page-runs-on-loom.

Variants

VariantWhenWhy
pageEvery page but the landing.One sentence and two actions.
landingThe landing.The stage finder helps the reader pick the right first step.

States

StateRendered or not applicable
defaultdefault
hoverNot applicable: The call to action is not interactive, so it has no hover state.
focus-visibleNot applicable: The call to action does not take focus; links and buttons inside it carry their own focus ring.
activeNot applicable: The call to action cannot be pressed.
disabledNot applicable: The call to action has nothing to disable.
loadingNot applicable: The call to action is rendered at build time and is complete when the page loads.
emptyNot applicable: The call to action is not rendered without content; the builder skips it.
errorNot applicable: The call to action shows no data that can fail.
currentNot applicable: The call to action has no current item.
visitedNot applicable: The call to action is not a link.
expandedNot applicable: The call to action does not open or close.

Tokens

PartToken
root.background--field-bg (saffron)
text.color--field-fg
button.primaryink on saffron

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingText wraps; nothing scrolls sideways.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalOne padding: --space-section (D-SITE-005).
externalDirectly before the footer.
rhythmSaffron field, then the woven edge into the footer.

Motion

AspectValue
NoneNo intrinsic element animation. The optional claude-entrance consumer profile may translate below-fold structure once (20px, --dur-weave, --ease-enter, --stagger); reduced motion disables it. This preserved baseline entrance is separate from element playback.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
roleregion (section) named by its heading
nameIts h2, by aria-labelledby
keyboardLinks and buttons inside, in reading order.
focusThe --focus ring on every link and button inside.
screenReaderRead in source order; decorative weaving is aria-hidden.
contrastInk on cotton 14:1; text on every dye field 4.5:1 or better (checked by check-brand).
targetLinks and buttons are 44 px tall.

Content

SlotLengthVoice
heading10 wordsAn invitation, not a sales line

Good: “Start with a conversation about your system.”

Bad: “Get started today!”

Japanese: まずは、自社のデザインシステムについてお聞かせください。 (content token cta.primary)

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

Usage

75 uses across the built pages (measured by npm run site:system).

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.