Arrow link

The quiet next step at the end of a section: read more, see the demo, open the page that proves the claim.

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

Do and don't

Do: One next step

Rendered by arrow-link.ts

Open example: Arrow link · Do: One next step Use the full-page example to follow page links.

The claim's proof sits right after the claim.

Do: A demo and a page

Rendered by arrow-link.ts

Open example: Arrow link · Do: A demo and a page Use the full-page example to follow page links.

Two ways to check the same claim, both quiet.

Don't: 'Read more'

Rendered by arrow-link.ts

Open example: Arrow link · Don't: 'Read more' Use the full-page example to follow page links.

It does not say what is behind it.

Don't: Three or more links

Rendered by arrow-link.ts

Open example: Arrow link · Don't: Three or more links Use the full-page example to follow page links.

A list of links belongs in the related tiles, not at the end of a section.

Rules

RuleWhyCheck
An arrow link is the last thing in its section.The reader meets the proof after the claim, never before it.Automated: scripts/site/system/compose.ts (order inside a section)
At most two arrow links together.More than two is a menu; menus belong in the related tiles.Automated: scripts/site/system/check.ts (props)

API

PropTypeRequiredDefaultWhat it does
linkslistYesOne or two { label, href } pairs.

Contract details

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

Identity

AspectValue
Idarrow-link
LayerAtoms
Categorynavigation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/atoms/arrow-link.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26The 'go further' link at the end of a section, on its own line with the arrow.

Use when

  • A section ends and a page goes deeper into its claim. Why: The reader who wants proof finds it exactly where the claim ends.
  • Two related next steps sit side by side. Why: Arrow links stay quieter than buttons, so the page's one action keeps its weight.

Do not use when

  • The step is the page's main action. Why: That is the primary button's job.
  • Inside a sentence. Why: In a sentence, a text link keeps the line readable.

Anatomy

PartWhat it is
rootp.more holding one or more a.arrow-link.
labelThe words.
iconThe arrow (Icon atom), which moves 3 px on hover.

Made of: icon, tokens:type, tokens:colour.

Used in: header, read-your-stylesheet, stage-finder, flow-section, founder-section, job-section, lead-section, problem-section, proof-section, tile-grid.

Variants

VariantWhenWhy
singleOne next step.Most sections have one place to go deeper.
pairA demo and a page about the same claim.Both proofs are offered side by side, without a second button.

States

StateRendered or not applicable
defaultStrong text, underlined
hoverThe arrow moves 3 px right.
focus-visibleThe --focus ring around the link.
activeNot applicable: Navigation is instant; no pressed state.
disabledNot applicable: Never rendered without a destination.
loadingNot applicable: Static link.
emptyNot applicable: The builder drops a link list with no items.
errorNot applicable: Broken links fail the link test in tests/site/pages.spec.ts.
currentNot applicable: Points away from the current page by definition.
visitedSame colour: the arrow link is a next step, not a reading list.
expandedNot applicable: Does not open anything.

Tokens

PartToken
root.font--type-strong
root.colorinherit (field text on dye fields)
icon.transition--dur-slow --ease-standard
--arrow-link-gap-space-4var(--space-4)
--arrow-link-font-weight-weight-strongvar(--weight-strong)
--arrow-link-text-underline-offset-space-2var(--space-2)
--arrow-link-margin-top-space-8var(--space-8)

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; a pair wraps onto two lines under 600 px.
wrappingWraps between links, never inside the arrow.
textExpansionJapanese labels wrap inside the link.

Spacing and rhythm

AspectValue
internalGap --space-4 between label and arrow; --space-8 between links in a pair.
external--space-7 above, the last element of its section.
rhythmAlways last in the section's reading order (D-SITE-005).

Motion

AspectValue
movesThe arrow, 3 px to the right.
triggerHover on pointer devices.
duration--dur-slow
easing--ease-standard
interruptibleYes, it reverses from where it is.
reducedKept: a 3 px shift under 250 ms is not a vestibular trigger.
whyIt shows the link leads onward, the same gesture as the button's shuttle.

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
rolelink
nameThe visible words
keyboardEnter follows the link.
focusIn reading order.
screenReaderReads the words; the arrow is hidden.
contrastInherits the section's text colour: 4.5:1 or better on cotton and every field.
target44 px tall line box, above the 24 px minimum.

Content

SlotLengthVoice
label7 wordsName the destination or the proof: 'See the agent replay'

Good: “What drift costs, and how to estimate yours” · “See the agent replay”

Bad: “Read more” · “More”

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

  • icon:arrow-right

Decisions and exceptions

Usage

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