A list of links, one per row: a bold label, one line of description and an arrow. For many similar items where tiles would be too loud.

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

Do and don't

Do: Articles

Rendered by rows-list.ts

Open example: Rows · Do: Articles Use the full-page example to follow page links.

Label, one line, the kind and reading time.

Do: Plans

Rendered by rows-list.ts

Open example: Rows · Do: Plans Use the full-page example to follow page links.

Plans listed quietly under Coming next.

Don't: A long paragraph

Rendered by rows-list.ts

Open example: Rows · Don't: A long paragraph Use the full-page example to follow page links.

One line per row.

Don't: Click here

Rendered by rows-list.ts

Open example: Rows · Don't: Click here Use the full-page example to follow page links.

Labels say where the row goes.

Rules

RuleWhyCheck
A row's description is one sentence.Rows are for scanning.Automated: npm run site:copy (length rule)

API

PropTypeRequiredDefaultWhat it does
itemslistYesRows: label, href, description, tag.
clsstringNoContext class (rows-hub).

Contract details

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

Identity

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

Use when

  • The article list and plans under 'Coming next'. Why: Rows scan fast when items are alike.

Do not use when

  • For the four jobs or a hub. Why: Tiles carry section colour; rows are quiet.

Anatomy

PartWhat it is
rootul.rows (+ context class rows-hub)
rowli.t-ink with a: b label (+ Tag), span description, arrow icon

Made of: tag, icon, text.

Used in: flow-diagram, repo-tree, tile-grid, titled-section.

Variants

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

States

StateRendered or not applicable
defaultdefault
hoverThe arrow moves 4 px right; the label underlines.
focus-visibleThe --focus ring around the row's link.
activeNot applicable: A link.
disabledNot applicable: Every row is a working link.
loadingNot applicable: Rendered at build time.
emptyNot applicable: Skipped when empty.
errorNot applicable: No data that can fail.
currentNot applicable: Rows never point to their own page.
visitedNot applicable: Visited rows keep their colour for a calm list.
expandedNot applicable: Does not open.

Tokens

PartToken
row.rule--rule-hair --line
label.font--type-strong
description.color--ink-2
arrow.color--ink
--rows-list-t-inkvar(--ink)
--rows-list-gap-space-2var(--space-2)
--rows-list-gap-space-7var(--space-7)
--rows-list-padding-space-7var(--space-7)
--rows-list-padding-space-4var(--space-4)
--rows-list-border-top-rule-hairvar(--rule-hair)
--rows-list-border-top-linevar(--line)
--rows-list-transition-dur-moderatevar(--dur-moderate)
--rows-list-transition-ease-standardvar(--ease-standard)
--rows-list-border-bottom-rule-hairvar(--rule-hair)
--rows-list-border-bottom-linevar(--line)
--rows-list-border-top-color-inkvar(--ink)
--rows-list-font-type-h3var(--type-h3)
--rows-list-letter-spacing-ls-h3var(--ls-h3)
--rows-list-color-ink-2var(--ink-2)
--rows-list-transition-dur-weavevar(--dur-weave)
--rows-list-text-underline-offset-space-3var(--space-3)
--rows-list-gap-space-5var(--space-5)
--rows-list-padding-space-6var(--space-6)
--rows-list-padding-space-2var(--space-2)
--rows-list-t-indigovar(--indigo)
--rows-list-t-maddervar(--madder)
--rows-list-t-saffronvar(--saffron)
--rows-list-t-tealvar(--teal)
--rows-list-t-indigo-inkvar(--indigo-ink)
--rows-list-t-madder-inkvar(--madder-ink)
--rows-list-t-teal-inkvar(--teal-ink)

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
internal--space-5 vertical padding per row.
externalInside the wrap.
rhythmFollows its section heading.

Motion

AspectValue
movesThe arrow, 4 px to the right.
triggerHover or focus on the row.
duration--dur-quick
easing--ease-standard
interruptibleYes; it returns when the pointer leaves.
reducedThe arrow does not move; the underline still shows.
whyA small cue that the whole row is the link.

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
label8 wordsThe page title
description1 sentenceWhat the reader gets

Good: “The manifesto · Why design systems need operations, not more documentation.”

Bad: “Click here”

Japanese: Rows on Japanese pages use reviewed nav-ja labels.

Icons and illustrations

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

Decisions and exceptions

  • None.

Usage

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