Score us

Publishes Loom's own scores, low ones included, with every check behind them and the command that reproduces each.

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

Do and don't

Do: The strip

Rendered by score-us.ts

Open example: Score us · Do: The strip Use the full-page example to follow page links.

Three real scores, one with a low band.

Do: The full explorer

Rendered by score-us.ts

Open example: Score us · Do: The full explorer Use the full-page example to follow page links.

Every check and its command.

Don't: Hiding a low score

Rendered by score-us.ts

Open example: Score us · Don't: Hiding a low score Use the full-page example to follow page links.

Credibility comes from publishing the low ones too.

Don't: A private system's areas

Rendered by score-us.ts

Open example: Score us · Don't: A private system's areas Use the full-page example to follow page links.

Aggregate scores only.

Rules

RuleWhyCheck
Score us is computed by Loom's code from Loom's real audit output for an open-source app and Loom's own two systems (written by npm run site:data), not drawn by hand.A showcase is proof only if the product's own code produced what it shows.Automated: scripts/site/interactives/check.ts (recomputes the showcase data and fails on drift)
Low scores are shown alongside high ones.A scoreboard of only good news would not be believed.Automated: scripts/site/interactives/check.ts (checkScoreUs)

API

PropTypeRequiredDefaultWhat it does
instanceKeystringNoOptional deterministic unique key for repeated static specimens. Letter first, then letters, digits, underscore or hyphen, up to64 characters; omit for singleton anchors. Duplicate keys are unsupported.
langen | jaNo"en"Interface language.
variantdemo | stripNo"demo"The full explorer or the three-card strip.

Contract details

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

Identity

AspectValue
Idscore-us
LayerOrganisms
Categoryshowcase
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/organisms/score-us.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Score us: computed by Loom's code from Loom's real audit output for an open-source app and Loom's own two systems (written by npm run site:data).

Use when

  • The proof section (strip) and its demo page (full). Why: Showing our own low scores is the most credible proof that the audit is honest.

Do not use when

  • For a private system's per-area detail. Why: Private systems appear only as aggregate scores.

Anatomy

PartWhat it is
rootfigure.ix-honesty (strip) or div.ix-score (demo)
cardsScore cards: number, name, band word
tableChecks per area
reproduceThe command to reproduce each score
captionReal audit output

Made of: showcase-frame, band-word, stat, table, code-block, control, caption.

Used in: pages directly.

Variants

VariantWhenWhy
stripThe landing's proof section.Three scores at a glance, each linking to its checks.
demo/demos/audit-explorer/.Every check and its command.

States

StateRendered or not applicable
defaultStrip variant shows build-time score cards; full demo shows the actual static audit table/reproduce commands before managed explorer enhancement.
hoverFull native system/area/copy buttons use hover affordances; strip cards retain their native links.
focus-visibleFull buttons, code and scrolling table regions show focus; strip links follow reading order.
activeFull demo selects an audited system/area or copies its reproduce command; no timed playback or Pause exists.
disabledNot applicable: System/area/copy controls have no intrinsic disabled or busy mode; native host preparation is separate.
loadingFull demo prepares required audited JSON/rubric and root-local locale before managed mount; the static table remains readable. Strip is build-time only.
emptyAn unassessed/null area score remains explicitly not assessed; it is not converted to known zero or an empty successful audit.
errorFull preparation/chunk/init failure preserves/restores the static table and host failed state, with remount retry. Clipboard rejection selects the command and gives a keyboard-copy message. Low/failing audit scores are findings, not loading failure.
currentFull system and area buttons expose aria-pressed; matching score/details/reproduce command update together. Strip has no current selection.
visitedNot applicable: No visited state on this root; any contained native links retain their own browser history.
expandedNot applicable: No disclosure state on this root; replacing a view is not aria-expanded.

Tokens

PartToken
card.rule--rule in the band colour of the card's own score
reproduce.rule--rule --ix-ink
code.font--font-mono
--score-us-font-size-fs-smallvar(--fs-small)
--score-us-padding-space-4var(--space-4)
--score-us-padding-space-5var(--space-5)
--score-us-border-bottom-linevar(--line)
--score-us-font-type-labelvar(--type-label)
--score-us-color-ink-2var(--ink-2)
--score-us-gap-space-5var(--space-5)
--score-us-gap-space-7var(--space-7)
--score-us-margin-bottom-space-5var(--space-5)
--score-us-gap-space-4var(--space-4)
--score-us-gap-space-10var(--space-10)
--score-us-gap-space-3var(--space-3)
--score-us-background-cottonvar(--cotton)
--score-us-border-linevar(--line)
--score-us-border-radius-radiusvar(--radius)
--score-us-border-color-indigo-inkvar(--indigo-ink)
--score-us-box-shadow-indigo-inkvar(--indigo-ink)
--score-us-padding-top-space-5var(--space-5)
--score-us-border-top-line-strongvar(--line-strong)
--score-us-font-type-h3var(--type-h3)
--score-us-letter-spacing-ls-h3var(--ls-h3)
--score-us-color-inkvar(--ink)
--score-us-font-type-h2var(--type-h2)
--score-us-letter-spacing-ls-h2var(--ls-h2)
--score-us-background-surface-2var(--surface-2)
--score-us-background-indigo-inkvar(--indigo-ink)
--score-us-transition-dur-weavevar(--dur-weave)
--score-us-background-surfacevar(--surface)
--score-us-font-size-fs-labelvar(--fs-label)
--score-us-font-type-figurevar(--type-figure)
--score-us-stroke-linevar(--line)
--score-us-fill-indigo-inkvar(--indigo-ink)
--score-us-stroke-indigo-inkvar(--indigo-ink)
--score-us-fill-surfacevar(--surface)
--score-us-transition-dur-slowvar(--dur-slow)
--score-us-fill-inkvar(--ink)
--score-us-tier-indigo-inkvar(--indigo-ink)
--score-us-tier-teal-inkvar(--teal-ink)
--score-us-tier-madder-inkvar(--madder-ink)
--score-us-tier-ink-2var(--ink-2)
--score-us-gap-space-2var(--space-2)
--score-us-gap-space-6var(--space-6)
--score-us-margin-right-space-3var(--space-3)
--score-us-ix-ok-teal-inkvar(--teal-ink)
--score-us-ix-wait-saffron-inkvar(--saffron-ink)
--score-us-ix-broken-madder-inkvar(--madder-ink)
--score-us-ix-action-indigo-inkvar(--indigo-ink)
--score-us-ix-ink-inkvar(--ink)
--score-us-ix-ink-2-ink-2var(--ink-2)
--score-us-ix-line-linevar(--line)
--score-us-ix-surface-surfacevar(--surface)
--score-us-margin-space-8var(--space-8)
--score-us-gap-space-1var(--space-1)
--score-us-padding-space-6var(--space-6)
--score-us-margin-top-space-5var(--space-5)
--score-us-margin-space-6var(--space-6)
--score-us-padding-bottom-space-4var(--space-4)
--score-us-margin-space-3var(--space-3)
--score-us-padding-left-space-7var(--space-7)
--score-us-margin-top-space-6var(--space-6)
--score-us-border-top-rulevar(--rule)
--score-us-margin-top-space-4var(--space-4)
--score-us-font-type-small-strongvar(--type-small-strong)
--score-us-outline-focusvar(--focus)
--score-us-margin-space-4var(--space-4)
--score-us-margin-space-5var(--space-5)

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px and controls fill the row on phones.
wrappingText wraps; code panes scroll inside their own focusable region.
textExpansionJapanese strings come from the i18n tables and wrap; engine output stays English.

Spacing and rhythm

AspectValue
internalInside the Showcase frame's padding, controls and caption at its foot.
externalFull width of its section.
rhythmOne showcase per section, after the section's claim (D-SITE-008).

Motion

AspectValue
NoneScores are read; the explorer changes only when the reader picks an area.

Runtime and reuse

  1. stylesheet: /css/site.css. Built Site tokens, core and registered element CSS; preserve modes, focus and responsive rules.

  2. stylesheet: /css/demos.css. Existing legacy demo styles where the rendered specimen uses them.

  3. font: /fonts/. Self-hosted files referenced by Site @font-face, with licences; Japanese locale overrides remain applicable.

  4. data: /i18n/ja.json. Required for a Japanese root; English interface fallbacks are authored in source. Root language changes require disposal and fresh preparation.

  5. data: /data/audit-areas-takenote.json. Required first-party native source data; fetch aborts with the mount and invalid consumed fields reject before DOM initialization.

  6. data: /data/audit-areas-loom-base.json. Required first-party native source data; fetch aborts with the mount and invalid consumed fields reject before DOM initialization.

  7. data: /data/audit-areas-control-area.json. Required first-party native source data; fetch aborts with the mount and invalid consumed fields reject before DOM initialization.

  8. data: /data/rubric.json. Required first-party native source data; fetch aborts with the mount and invalid consumed fields reject before DOM initialization.

  9. Static fallback: Original build-time specimen remains readable before loading and after chunk/initialization failure; enhancement controls retain authored hidden state.

  10. Before DOM initialization the configured host awaits apps/showcase/site/demos/explorer.ts#prepare for this root with a mount-owned AbortSignal. Preparation must throw on missing/invalid data; disposal/replacement aborts pending work, and a stale result cannot initialize or claim ready.

  11. Configured initializer: apps/showcase/site/demos/explorer.ts#init. The host owns transactional static-markup restoration and runtime state.

  12. Consumer module (imports relative to the configured source root):
    import { createRuntimeHost } from "./src/workflows/runtime-host";
    import { SITE_RUNTIMES } from "./apps/showcase/site/runtime-registry";
    const definition = SITE_RUNTIMES.find(entry => entry.binding.id === "explorer");
    if (!definition || definition.binding.lifecycle.kind !== "managed") throw new Error("Managed runtime binding unavailable");
    const host = createRuntimeHost([definition]);
    export function mountRuntime(container: ParentNode) { return host.mountAll(container); }
  13. After inserting the rendered markup, call mountRuntime(container) for the container holding [data-demo="explorer"]. Retain the returned disposal function and call it before removing, replacing or remounting, including every Storybook args render. The configured host restores captured static markup/attributes on disposal or caught load/initialization failure; retry starts a fresh managed remount.

Accessibility passport

AspectValue
roleregion with a heading, or a figure
nameIts heading or caption
keyboardTab and Enter/Space select full-demo system/area buttons or copy the command; native regions/code scroll. Strip uses native links.
focusManual button selection retains native focus; phone detail scrolling follows the existing reduced-motion-aware profile.
screenReaderSelected system/area uses aria-pressed; audit scores include words and copy completion/fallback uses a live status. No playback frame exists.
contrastInk on surface 14:1; state dyes only as marks with words.
targetControls are 44 px.

Content

SlotLengthVoice
caption1 sentenceReal audit output, low scores included

Good: “Real audit output, scored with Loom's own open rubric, low scores included.”

Bad: “Industry-leading scores”

Japanese: i18n.ts ix.score.*.

Icons and illustrations

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

Decisions and exceptions

Usage

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