A set of colour tiles, each a link to one page or job: a verb or label, an optional head and text, and an optional real fragment beside the link.

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

Do and don't

Do: Hub tiles

Rendered by tile.ts

Open example: Tiles · Do: Hub tiles Use the full-page example to follow page links.

Each tile names the job and what it gives.

Do: Related

Rendered by tile.ts

Open example: Tiles · Do: Related Use the full-page example to follow page links.

A next step at the end of a page.

Don't: Vague labels

Rendered by tile.ts

Open example: Tiles · Don't: Vague labels Use the full-page example to follow page links.

A tile says where it goes.

Don't: Status chips

Rendered by tile.ts

Open example: Tiles · Don't: Status chips Use the full-page example to follow page links.

No status chips on marketing pages (owner, 26 Oct).

Rules

RuleWhyCheck
A fragment sits outside the tile's link.Interactive content inside a link breaks keyboard and screen-reader use.Automated: tests/site (axe nested-interactive)
A tile's colour is its section's or job's colour.Colour as structure, marks as state (D-SITE-004).Review: Owner, in the Library

API

PropTypeRequiredDefaultWhat it does
itemslistYesThe tiles: label, href, head, text (HTML), colour, state, tag, frag (HTML).
clsstringNoThe context class (fields-hub, fields-related, fields-hero, fields-roles).

Contract details

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

Identity

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

Use when

  • The four jobs under the hero, hubs, related pages and the 404 site map. Why: A tile is a door: colour says which section it opens.

Do not use when

  • For long lists of articles. Why: Rows read faster for many similar items.
  • To show status. Why: Tile colour is the section's, never a state.

Anatomy

PartWhat it is
rootul.fields (+ a context class: fields-hero, fields-hub, fields-related, fields-roles)
tileli.field-card.field-<colour>, with --i for its order
linka: b.field-verb (+ Tag), span.field-head, span.field-text
fragmentdiv.field-frag-wrap outside the link (a real artefact)

Made of: dye-field, tag, text.

Used in: jobs-strip, hero, related, tile-grid.

Variants

VariantWhenWhy
fields-hubA hub's list of pages.Large tiles, two to four columns.
fields-related'Keep going' at the foot of a page.Three smaller tiles.
fields-heroThe four jobs inside the hero.One band of four dye tiles: one template, so it is allowed under the field rule (D-SITE-002).
fields-cardsWith fields-hub and fields-related: tiles on cotton inside the frame, the dye as a rule on top.Full-width dye tiles after a page head joined field to field through the edge and met cotton with no edge (D-SITE-002, D-SITE-003); cards on cotton need neither.

States

StateRendered or not applicable
defaultdefault
hoverThe tile lifts its text colour; the field does not change.
focus-visibleThe --focus ring on the link, inside the tile.
activeNot applicable: A link; no pressed state beyond the browser's.
disabledNot applicable: Every tile is a working link.
loadingNot applicable: Rendered at build time.
emptyNot applicable: The builder skips an empty set.
errorNot applicable: No data that can fail.
currentNot applicable: Tiles never point to the page they are on.
visitedNot applicable: Visited links keep their colour on a field, for contrast.
expandedNot applicable: Does not open.

Tokens

PartToken
tile.background--field-bg of its colour
verb.font--type-h3
text.color--field-fg-2
@hover.text--field-fg
--tile-font-family-font-display-javar(--font-display-ja)
--tile-gap-space-1var(--space-1)
--tile-background-cottonvar(--cotton)
--tile-pad-space-7var(--space-7)
--tile-pad-space-9var(--space-9)
--tile-gap-space-4var(--space-4)
--tile-font-type-h2var(--type-h2)
--tile-letter-spacing-ls-h2var(--ls-h2)
--tile-transition-dur-weavevar(--dur-weave)
--tile-transition-ease-standardvar(--ease-standard)
--tile-font-type-h3var(--type-h3)
--tile-letter-spacing-ls-h3var(--ls-h3)
--tile-margin-left-space-5var(--space-5)
--tile-font-type-strongvar(--type-strong)
--tile-font-size-fs-bodyvar(--fs-body)
--tile-margin-space-7var(--space-7)
--tile-padding-top-space-8var(--space-8)
--tile-margin-bottom-space-8var(--space-8)
--tile-margin-top-space-6var(--space-6)
--tile-padding-space-5var(--space-5)
--tile-padding-space-6var(--space-6)
--tile-font-size-fs-smallvar(--fs-small)
--tile-background-surfacevar(--surface)
--tile-color-inkvar(--ink)
--tile-border-top-rulevar(--rule)
--tile-border-top-inkvar(--ink)
--tile-padding-space-8var(--space-8)
--tile-gap-space-6var(--space-6)
--tile-field-fg-inkvar(--ink)
--tile-field-fg-2-ink-2var(--ink-2)
--tile-box-shadow-rule-heavyvar(--rule-heavy)
--tile-background-field-bgvar(--field-bg)
--tile-color-field-fgvar(--field-fg)
--tile-box-shadow-threadvar(--thread)

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.
wrappingAuto-fit grid: four, two, then one column at 390 px.
textExpansionJapanese verbs and heads break between phrases (jaBreaks); tiles grow downwards.

Spacing and rhythm

AspectValue
internal--space-6 padding in each tile.
externalFull bleed with a 2 px seam between tiles.
rhythmOne set per section.

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
label3 wordsA verb or the page name
text1 sentenceWhat the reader finds there

Good: “See: know what you really have.”

Bad: “Learn more”

Japanese: Labels and descriptions come from nav-ja (reviewed glossary terms).

Icons and illustrations

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

Decisions and exceptions

Usage

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