Site footer

Closes every page: the logo and the promise, the full site map, the legal links, the two calls to action, this site's DESIGN.md and its system, and the type licences.

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

Do and don't

Do: English

Rendered by footer.ts

Shown live at the top and the foot of this page.

The map and the legal links.

Do: Japanese

Rendered by footer.ts

Shown live at the top and the foot of this page.

Japanese tagline and the English-only note.

Don't: Marketing in the footer

Rendered by footer.ts

Shown live at the top and the foot of this page.

The footer is a map, not a pitch.

Don't: An ink footer

Rendered by footer.ts

Shown live at the top and the foot of this page.

Under the saffron call to action it would make two fields touch (D-SITE-002).

Rules

RuleWhyCheck
The footer stands on cotton.The saffron call to action is a field; an ink footer under it made two fields touch. On cotton, the join gets the woven edge like every other (D-SITE-002, D-SITE-009).Automated: scripts/site/system/check-pages.ts (adjacent fields)
The footer links to This site runs on Loom.The site is its own proof; the link must be findable from every page.Automated: tests/site/system.spec.ts

API

PropTypeRequiredDefaultWhat it does
langen | jaYesPage language.
navlistYesThe navigation groups.
footerobjectNoFooter content (tagline, note, links).
langNotebooleanNofalseSay that this page is English only.

Contract details

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

Identity

AspectValue
Idfooter
LayerOrganisms
Categorynavigation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/organisms/footer.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Site footer as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Every page built by the site builder. Why: Readers who reach the end look for the map and the legal links.

Do not use when

  • Inside the product tour. Why: The tour has its own chrome.

Anatomy

PartWhat it is
rootfooter.site-footer
branddiv.footer-brand: p.footer-name with the Logo, the tagline
mapnav.footer-map named Site map: one column per section
notep.footer-note
smallp.footer-small: legal links, calls to action, DESIGN.md, This site runs on Loom, type licences, language notes

Made of: logo, text-link.

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

Variants

VariantWhenWhy
defaultWherever the page declaration places it.One shape per job keeps pages predictable.

States

StateRendered or not applicable
defaultdefault
hoverLinks underline.
focus-visibleThe --focus ring.
activeNot applicable: Links.
disabledNot applicable: Every link works.
loadingNot applicable: Build time.
emptyNot applicable: The navigation is required.
errorNot applicable: No data that can fail.
currentNot applicable: The footer does not mark the current page; the header does.
visitedNot applicable: Footer links keep one colour.
expandedNot applicable: Does not open.

Tokens

PartToken
root.background--cotton
text.color--ink; secondary --ink-2
rule.top--rule-hair --line
--footer-field-bg-cottonvar(--cotton)
--footer-field-fg-inkvar(--ink)
--footer-field-fg-2-ink-2var(--ink-2)
--footer-padding-space-12var(--space-12)
--footer-padding-space-10var(--space-10)
--footer-gap-space-10var(--space-10)
--footer-grid-template-columns-columnsvar(--columns)
--footer-gap-grid-gapvar(--grid-gap)
--footer-margin-top-space-5var(--space-5)
--footer-gap-space-9var(--space-9)
--footer-gap-space-8var(--space-8)
--footer-font-type-small-strongvar(--type-small-strong)
--footer-margin-bottom-space-5var(--space-5)
--footer-gap-space-2var(--space-2)
--footer-padding-space-2var(--space-2)
--footer-font-type-smallvar(--type-small)
--footer-margin-top-space-11var(--space-11)
--footer-gap-space-4var(--space-4)
--footer-margin-top-space-6var(--space-6)
--footer-padding-top-space-7var(--space-7)
--footer-border-top-rule-hairvar(--rule-hair)
--footer-padding-top-space-9var(--space-9)
--footer-background-field-bgvar(--field-bg)
--footer-color-field-fgvar(--field-fg)
--footer-color-field-fg-2var(--field-fg-2)
--footer-border-top-field-fgvar(--field-fg)

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.
wrappingThe map is a grid of five columns at 1440, three at 1024, two at 768, one at 390.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalOne padding: --space-section-sm (D-SITE-005).
externalLast on the page.
rhythmOn cotton after the saffron call to action; the composer puts the woven edge at the join (D-SITE-009).

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
rolea landmark or list, as stated in its parts
nameIts visible text
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
tagline8 wordsThe promise

Good: “The next level of your design system.”

Bad: “© All rights reserved”

Japanese: デザインシステムを、次のレベルへ。 Footer notes in Japanese say which pages are English only.

Icons and illustrations

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

Decisions and exceptions

Usage

492 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.