Iconography

The governed asset set: 55 icons on viewBox 0 0 24 24 with a 1.75 px line, each with a record (icon:<name>) and usage. Lucide icons in the product map to these (lucide-migration.json). The separate inline Icon arrow in atoms/icon.ts retains its 16 px viewBox and 2 px stroke; the asset manifest does not expand that renderer's API.

Foundation · stable · v1.0.0 · owner: Site system lead · contract 18 of 20 points (open: usage, no owned-class occurrences in built pages or metadata-token references in built CSS; application declarations and executed coverage are separate; figma)

Reference

Source reference; not an executed check.

asset viewBox
0 0 24 24
asset live area
3 to 21; 2 px padding; 0.25 coordinate snap
asset stroke
currentColor, 1.75 px; square caps, miter joins
asset sizes
16 / 20 / 24 px
inline Icon arrow
atoms/icon.ts: viewBox 0 0 16 16, 2 px stroke; separate renderer
icon:check
status · Confirms a finished step or a chosen option, beside its word.
icon:circle-check
status · A completed item in a checklist or a good status, always with its band word.
icon:circle-dashed
status · A value that has not been measured yet. Pair it with the words 'not measured'.
icon:circle
status · An open item in a list that is not done yet.
icon:warning
status · A warning that needs attention but does not block. Always with its word.
icon:info
status · A neutral note or an explanation next to a value.
icon:error
status · An error that blocks: a failing rule, a broken build. Always with its word.
icon:shield-check
status · A claim that has been verified (an assurance level, a security check that passed).
icon:shield-question
status · A claim that has not been verified yet, such as a self-reported assurance level.
icon:arrow-right
navigation · Moves forward: a call to action, the next step, a link to a page on this site.
icon:arrow-left
navigation · Moves back: the previous step or page.
icon:arrow-up
navigation · Back to the top of the page, or an ascending sort.
icon:arrow-down
navigation · A descending sort or 'more below'.
icon:arrow-up-right
navigation · A rising trend beside a figure, or 'open this in detail' inside the product tour.
icon:arrow-down-right
navigation · A falling trend beside a figure.
icon:external-link
navigation · A link that leaves the site (GitHub, a standard, a partner).
icon:chevron-right
navigation · A disclosure that opens sideways, or the item separator in a breadcrumb.
icon:chevron-down
navigation · Opens a menu, an accordion or a select.
icon:undo
navigation · Undoes the last action (an accepted change in the simulator, a dismissed item).
icon:repeat
navigation · A value that can be overridden, or something that repeats on a cycle.
icon:close
action · Closes a dialog, a drawer or the menu; removes a chip.
icon:menu
action · Opens the site menu on a phone.
icon:plus
action · Adds an item, or marks a value as extendable.
icon:minus
action · Removes an item or reduces a value.
icon:search
action · Marks a search field or a search action, such as asking the system.
icon:filter
action · Narrows a list (records, findings, pages).
icon:settings
action · Opens preferences or adjusts a value.
icon:download
action · Downloads a file (a report, a PDF, the starter).
icon:copy
action · Copies text or code to the clipboard.
icon:link
action · Copies or shows a link to a heading or a record.
icon:play
media · Starts a replay, a demo or a motion piece.
icon:pause
media · Pauses motion. Every moving element on the site has a pause control.
icon:person
people · An owner or a person in a role. Next to a role name, never next to a real person's name without consent.
icon:team
people · A team, a guild or a group of roles.
icon:calendar
time · A date: a release, a review date, an exception's end date.
icon:clock
time · Time or waiting: a review waiting on its service level.
icon:branch
git · A draft branch where an agent or a person prepares a change.
icon:pull-request
git · A reviewable change: every change Loom proposes arrives as a pull request.
icon:merge
git · A change that has been accepted and merged.
icon:commit
git · A point in history: one commit, one recorded change.
icon:file
files · A file in the repository, or a document.
icon:folder
files · A folder in the repository, such as the loom/ folder.
icon:code
files · Code, a code sample or 'as code' (records, rules).
icon:token
system · A design token: one named value.
icon:component
system · A component in the Library.
icon:contract
system · A component contract: what it promises, its rules and its checks.
icon:decision
system · A decision record: an option chosen, with its why.
icon:exception
system · An exception to a rule, which always has an end date.
icon:queue
system · The review queue: proposals waiting for an owner.
icon:ritual
system · A recurring ritual: the weekly triage, the release review.
icon:agent
system · An agent's work: a suggestion, a draft, a check. Always beside the word 'agent' or the agent's name.
icon:certificate
system · An Academy certificate or a certified skill.
icon:chart
system · A chart or a measure: health over time, usage.
icon:lock
security · A value that is locked, or something kept private.
icon:globe
security · The language switch (English and Japanese) and locale settings.

Do and don't

2 positive / 2 negative authored documentation examples (2 each required); 1 reference (1 required); 0 failed. References and failures do not count; this is not behavior acceptance.

Do: A decorative inline direction cue

Authored by iconography.ts

Rendered consumer example; not an executed correctness check. icon Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Iconography · Do: A decorative inline direction cue Use the full-page example to follow page links.

The real inline arrow is silent decoration for an adjacent action word in its consumer. This isolated fragment retains the inline 16px viewBox and 2px stroke, not the governed asset set's 24px profile.

Do: Name a meaningful inline arrow

Authored by iconography.ts

Rendered consumer example; not an executed correctness check. icon Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Iconography · Do: Name a meaningful inline arrow Use the full-page example to follow page links.

The actual labelled arrow supplies its native img role and accessible name. This does not turn an icon alone into a named interactive control.

Don't: Request an unknown inline icon

Authored by iconography.ts

Rule illustration; not an executed check. icon / icon.set-only

Icon.render({ name: "sparkle" })
The inline Icon contract currently permits only arrow-right; the asset manifest does not expand that enum.
This escaped misuse explains the real API boundary. It is not submitted to the renderer or counted as native refusal evidence.

Don't: An unnamed arrow is the entire link

Authored by iconography.ts

Rule illustration; not an executed check. iconography / icons.with-word

<a href="/product/"><svg aria-hidden="true">…</svg></a>
No destination wording or text alternative accompanies the icon.
The cue alone does not explain where the control goes; the word or accessible alternative must be supplied by the real consumer.

Rules

RuleWhyCheck
Only icons from the governed set, by record id.One grid and one line weight; every icon has a recorded use.Automated: scripts/site/assets/check.ts
An icon always sits beside its word or has a text alternative.Icons alone are ambiguous.Automated: tests/site (axe svg-img-alt)

API

No props.

Contract details

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

Identity

AspectValue
Idiconography
LayerFoundations
Categoryfoundation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/foundations/iconography.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Iconography as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • An icon beside a word. Why: Icons help scanning; the word carries the meaning.

Do not use when

  • As the only sign of a state. Why: An icon alone is ambiguous and invisible to some readers.
  • An icon from outside the set. Why: Off-set icons break the line weight and grid.

Anatomy

PartWhat it is
setapps/showcase/site/assets/icons/*.svg
manifesticons.json (records icon:<name>)
migrationlucide-migration.json
inlineatoms/icon.ts: separate arrow-right path, 16 px viewBox and 2 px stroke

Made of: nothing (a base element).

Used in: pages directly.

Variants

VariantWhenWhy
light and darkEvery page, following the reader's setting.The same roles resolve to light or dark values, so no element chooses its own.

States

StateRendered or not applicable
defaultThe specimen.
hoverNot applicable: A foundation is not interactive.
focus-visibleNot applicable: Not focusable.
activeNot applicable: Not interactive.
disabledNot applicable: Nothing to disable.
loadingNot applicable: Values are built into the stylesheet.
emptyNot applicable: The build fails if a value is missing.
errorNot applicable: Unresolved values fail the brand gate, not the reader.
currentNot applicable: No current item.
visitedNot applicable: Not a link.
expandedNot applicable: Does not open.

Tokens

PartToken
icon.strokecurrentColor, 1.75 px (asset manifest)
icon.size0 0 24 24 asset viewBox; 16 / 20 / 24 px asset sizes; separate inline arrow has a 16 px viewBox

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
internalNot applicable: a foundation has no box of its own.
externalNot applicable.
rhythmApplies to every element that reads it.

Motion

AspectValue
NoneA foundation does not move.

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
roleNot rendered on the site; its specimen in the Library is a list
nameThe foundation's name
keyboardNot interactive.
focusNot focusable.
screenReaderThe specimen is a plain list of names and values.
contrastEvery text and ground pair in the palette is checked (check-brand).
targetNot a target.

Content

SlotLengthVoice
word or text alternative beside an icon (consumer-owned)The consuming control's budget; Icon.label permits three wordsName the action in words. Hide a decorative icon from assistive technology when adjacent wording already says the same thing.
icon record, category and usage (fixed Library specimen)The full icons.json record and usage; no foundation content propUse the governed record to choose an asset. A manifest entry does not imply that every icon is supported by the inline Icon renderer.

Good: “Book a conversation → (Icon's decorative direction cue beside Button's words)” · “Next (Icon's accessible label example for arrow-right)”

Bad: “→ alone as a button (Icon's negative wording example)” · “sparkle (Icon's rejected unknown renderer name)”

Japanese: Translate meaningful labels with the consuming page, using its existing Japanese strings; decorative icons need no duplicate Japanese name. Keep icon:<name> records and renderer names unchanged. The manifest and this specimen are not a new icon or locale API, and native-language review remains open.

Icons and illustrations

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

Decisions and exceptions

Usage

0 owned-class occurrences in built pages plus metadata-token references in built CSS (measured by npm run site:system).

Application and coverage

Asset guidance (declared): The governed SVG manifest declares a 24px grid and 1.75 stroke; the asset checker inspects that set and its records. Native Button and ArrowLink use the separate inline Icon at 16px/2px beside words; that is not adoption of every governed SVG.

Current check result: not assessed by this report. Declarations and source-file presence do not establish executed enforcement or accepted coverage.

Source authority and implementation (paths in the private checkout):

  • apps/showcase/site/assets/icons/icons.json
  • scripts/site/assets/check.ts
  • apps/showcase/site/system/atoms/icon.ts
  • apps/showcase/site/system/atoms/button.ts
  • apps/showcase/site/system/atoms/arrow-link.ts

Declared rules and checks (not execution results):

  • icons.governed: Only icons from the governed set, by record id. Automated check declared: scripts/site/assets/check.ts
  • icons.with-word: An icon always sits beside its word or has a text alternative. Automated check declared: tests/site (axe svg-img-alt)

Coverage still needed (not assessed here):

  • Retain current-input asset-check results and invalid-grid/stroke canaries in tests/unit/site-assets.test.ts.
  • Inspect actual native consumers for adjacent words or accessible names; an asset-geometry result does not establish icons.with-word or use of every governed asset.

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.