Health check

The free three-minute health check: questions across the rubric's areas, scored in the browser, with the reader's band and gaps. The page carries its mount; health-check.js runs the questions.

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

Do and don't

Do: The mount

Rendered by health-check.ts

Open example: Health check · Do: The mount Use the full-page example to follow page links.

As it ships; the script fills it.

Do: Without JavaScript

Rendered by health-check.ts

Open example: Health check · Do: Without JavaScript Use the full-page example to follow page links.

The notice offers the contact form instead.

Don't: Embedded elsewhere

Rendered by health-check.ts

Open example: Health check · Don't: Embedded elsewhere Use the full-page example to follow page links.

Own page.

Don't: Without its privacy link

Rendered by health-check.ts

Open example: Health check · Don't: Without its privacy link Use the full-page example to follow page links.

Say what happens to the data.

Rules

RuleWhyCheck
Health check is computed by Loom's code from the reader's own answers, scored in the browser by health-check/scoring.js against the public rubric, 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)
The app states what happens to the reader's answers next to where they enter them.Trust: nothing is sent without the reader knowing.Automated: tests/site/health-check-turnstile.spec.ts

API

No props.

Contract details

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

Identity

AspectValue
Idhealth-check
LayerOrganisms
Categoryapp
OwnerSite system lead
Statusbeta
Version1.0.0
Sourceapps/showcase/site/system/organisms/health-check.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Health check: computed by Loom's code from the reader's own answers, scored in the browser by health-check/scoring.js against the public rubric.

Use when

  • /health-check/. Why: A task that needs the whole screen.

Do not use when

  • Embedded in a marketing page. Why: Pages link to it.

Anatomy

PartWhat it is
progressdiv#progress (filled by the app)
appdiv#app: the intro until the script takes over
noscriptA notice and the contact form as the alternative

Made of: showcase-frame, panel, form-field, button, facts-list.

Used in: task-body, page-apps.

Variants

VariantWhenWhy
fullOn its demo page and its section.The whole experience where the claim is made.

States

StateRendered or not applicable
defaultBuild-time task mount shows its loading intro; health-check.js boots the question flow. Without JavaScript a notice links to contact instead of claiming a completed result.
hoverThe task uses native radio, button and link hover affordances.
focus-visibleTask controls show focus; advancing the task focuses its heading and invalid report requests focus the error summary.
activeStart/Next/Back and core/deep choices update the task; report actions use the actual answer scores. No Play/Pause control exists.
disabledThe report-request submit button is disabled while its request is pending; a rejected 400 request enables retry.
loadingInitial configuration/dictionary loading and the contact-step spam check/request belong to health-check.js, not the native showcase host.
emptyUnanswered questions and unsure answers remain distinct inputs to the scoring model; the reader may skip the optional deep section. This is not a build-time empty showcase.
errorMalformed shares show a notice; boot failure renders a localized retry view. Invalid contact/spam requests show associated errors. Network/server delivery failure opens the local report with an explicit not-sent notice; it does not claim delivery.
currentNative checked answers and written question/progress labels identify the current task position; there is no aria-valuetext playback slider.
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
app.ground--cotton
panel.background--surface
--health-check-max-width-w-textvar(--w-text)
--health-check-margin-top-space-4var(--space-4)
--health-check-margin-bottom-space-9var(--space-9)
--health-check-gap-space-3var(--space-3)
--health-check-margin-bottom-space-4var(--space-4)
--health-check-font-type-smallvar(--type-small)
--health-check-color-ink-2var(--ink-2)
--health-check-font-weight-weight-strongvar(--weight-strong)
--health-check-color-inkvar(--ink)
--health-check-gap-space-2var(--space-2)
--health-check-max-width-w-narrowvar(--w-narrow)
--health-check-padding-space-2var(--space-2)
--health-check-background-inkvar(--ink)
--health-check-height-space-6var(--space-6)
--health-check-background-surface-3var(--surface-3)
--health-check-background-ink-2var(--ink-2)
--health-check-gap-space-6var(--space-6)
--health-check-gap-space-5var(--space-5)
--health-check-margin-top-space-9var(--space-9)
--health-check-margin-space-5var(--space-5)
--health-check-margin-space-8var(--space-8)
--health-check-margin-top-space-10var(--space-10)
--health-check-padding-top-space-5var(--space-5)
--health-check-border-top-rule-hairvar(--rule-hair)
--health-check-border-top-linevar(--line)
--health-check-padding-space-1var(--space-1)
--health-check-gap-space-9var(--space-9)
--health-check-margin-bottom-space-10var(--space-10)
--health-check-color-on-dyevar(--on-dye)
--health-check-color-on-saffronvar(--on-saffron)
--health-check-font-type-h2var(--type-h2)
--health-check-letter-spacing-ls-h2var(--ls-h2)
--health-check-font-type-labelvar(--type-label)
--health-check-margin-top-space-1var(--space-1)
--health-check-gap-grid-gapvar(--grid-gap)
--health-check-font-type-h3var(--type-h3)
--health-check-letter-spacing-ls-h3var(--ls-h3)
--health-check-margin-space-2var(--space-2)
--health-check-font-type-small-strongvar(--type-small-strong)
--health-check-font-type-figurevar(--type-figure)
--health-check-background-cottonvar(--cotton)
--health-check-border-rule-hairvar(--rule-hair)
--health-check-border-inkvar(--ink)
--health-check-background-band-holdingvar(--band-holding)
--health-check-background-space-4var(--space-4)
--health-check-background-space-5var(--space-5)
--health-check-transition-dur-weavevar(--dur-weave)
--health-check-background-band-shapevar(--band-shape)
--health-check-background-band-loosevar(--band-loose)
--health-check-margin-top-space-8var(--space-8)
--health-check-field-bg-surface-2var(--surface-2)
--health-check-field-fg-inkvar(--ink)
--health-check-field-fg-2-ink-2var(--ink-2)
--health-check-font-type-ledevar(--type-lede)
--health-check-padding-space-8var(--space-8)
--health-check-background-surfacevar(--surface)
--health-check-border-top-rule-framevar(--rule-frame)
--health-check-border-top-maddervar(--madder)
--health-check-border-radius-radiusvar(--radius)
--health-check-margin-space-4var(--space-4)
--health-check-margin-top-space-3var(--space-3)
--health-check-background-maddervar(--madder)
--health-check-border-top-saffronvar(--saffron)
--health-check-font-type-strongvar(--type-strong)
--health-check-background-saffronvar(--saffron)
--health-check-padding-space-5var(--space-5)
--health-check-margin-space-3var(--space-3)
--health-check-gap-space-4var(--space-4)
--health-check-border-top-line-strongvar(--line-strong)
--health-check-border-top-color-saffronvar(--saffron)
--health-check-padding-space-4var(--space-4)
--health-check-gap-space-8var(--space-8)
--health-check-margin-top-space-12var(--space-12)
--health-check-border-ink-2var(--ink-2)
--health-check-padding-top-space-8var(--space-8)
--health-check-bottom-space-8var(--space-8)
--health-check-padding-space-6var(--space-6)
--health-check-color-cottonvar(--cotton)
--health-check-box-shadow-shadow-floatvar(--shadow-float)
--health-check-transition-dur-moderatevar(--dur-moderate)
--health-check-transition-ease-standardvar(--ease-standard)
--health-check-background-field-bgvar(--field-bg)
--health-check-color-field-fgvar(--field-fg)
--health-check-color-field-fg-2var(--field-fg-2)

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
NoneThe task advances through reader actions, not timed playback. Native focus/hover and the task stylesheet remain applicable.

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
roleTask sections with headings, native question forms and result/report content.
nameIts heading or caption
keyboardNative Tab/radio/button operation; Start, Next, Back and optional deep-section actions advance the task.
focusStep changes focus the task heading; invalid report requests focus the error summary.
screenReaderWritten progress, answer labels, result text and report/spam statuses; no showcase playback announcements.
contrastInk on surface 14:1; state dyes only as marks with words.
targetControls are 44 px.

Content

SlotLengthVoice
question1 sentencePlain, second person

Good: “How do teams find components today?”

Bad: “Rate your synergy”

Japanese: Japanese strings from health-check/i18n/ja.json, opened with ?lang=ja.

Icons and illustrations

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

Decisions and exceptions

Usage

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