Step line

The one small line allowed above a heading: a step in a task ('Step 2 of 8'), an article's read time, or the job number in the four-jobs sequence.

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

Do and don't

Do: A step count

Rendered by eyebrow.ts

Open example: Step line · Do: A step count Use the full-page example to follow page links.

It tells the reader where they are.

Do: The job number

Rendered by eyebrow.ts

Open example: Step line · Do: The job number Use the full-page example to follow page links.

Only the four jobs are numbered, because they are one sequence.

Don't: A category label

Rendered by eyebrow.ts

Open example: Step line · Don't: A category label Use the full-page example to follow page links.

Capitals and labels above headings are banned: the heading names the section.

Don't: Numbering a section that is not a sequence

Rendered by eyebrow.ts

Open example: Step line · Don't: Numbering a section that is not a sequence Use the full-page example to follow page links.

Numbers promise an order the page does not have.

Rules

RuleWhyCheck
An eyebrow is a step, a read time or the job number, never a section label.Section labels above every heading add a second title nobody reads.Automated: scripts/site/system/compose.ts (eyebrows only in task flows, articles and the job sequence)
Only the four jobs sequence is numbered.Numbering marks one real sequence; numbering more would dilute it (D-SITE-006).Automated: scripts/site/system/compose.ts

API

PropTypeRequiredDefaultWhat it does
textstringYesThe step, read time or number.
numberedbooleanNofalseThe job number (01 to 04), hidden from screen readers because the heading order says the same.

Contract details

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

Identity

AspectValue
Ideyebrow
LayerAtoms
Categorytypography
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/atoms/eyebrow.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26One small line above a heading: a step count, a read time or the job number.

Use when

  • A task flow shows where the reader is. Why: People finish a form sooner when they know how far they have come.
  • The four jobs sequence on the landing (01 to 04). Why: Numbers show the four jobs are one sequence read in order.

Do not use when

  • As a section label or category tag above every heading. Why: Labels on every heading are noise; the heading itself names the section.
  • In capitals or tracked out. Why: Capitals are harder to read and the brand bans them.

Anatomy

PartWhat it is
rootp.eyebrow (or p.meta) in --type-small-strong, secondary ink.

Made of: tokens:type, tokens:colour.

Used in: byline, job-section.

Variants

VariantWhenWhy
metaA step count or read time.It orients the reader without competing with the heading.
numberedOnly the four jobs sequence.Numbering anything else would invent a sequence that is not there (D-SITE-006).

States

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

Tokens

PartToken
root.font--type-small-strong
root.color--ink-2; --field-fg-2 on a field
--eyebrow-font-type-small-strongvar(--type-small-strong)
--eyebrow-color-ink-2var(--ink-2)
--eyebrow-font-type-labelvar(--type-label)
--eyebrow-color-on-dyevar(--on-dye)
--eyebrow-color-field-inkvar(--field-ink)

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; unchanged at every width.
wrappingOne line; wraps only if a Japanese step label is long.
textExpansionShort by rule (4 words), so expansion stays on one line.

Spacing and rhythm

AspectValue
internalNone.
external--space-4 below, then the heading.
rhythmPart of the section head, before the heading.

Motion

AspectValue
NoneStatic text.

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
roleparagraph (meta) or hidden (numbered)
nameIts text
keyboardNot interactive.
focusNot focusable.
screenReaderReads before the heading; numbered eyebrows are aria-hidden because the heading order carries the sequence.
contrast--ink-2 on cotton 8.6:1; on fields the field's secondary text, 4.5:1 or better.
targetNot a target.

Content

SlotLengthVoice
text4 words or a numberSentence case, the text face

Good: “Step 2 of 8” · “8 min read” · “01”

Bad: “OUR SOLUTION” · “Overview”

Japanese: Text comes from the page content; Japanese strings are reviewed per page (apps/showcase/site/loom/locales). Awaiting native review, as the banner on every Japanese page says.

Icons and illustrations

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

Decisions and exceptions

Usage

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