Stage finder

Asks two questions (people and products) and shows the organisation's stage, what it needs now and what breaks next.

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

Do and don't

Do: In the CTA

Rendered by stage-finder.ts

Open example: Stage finder · Do: In the CTA Use the full-page example to follow page links.

Two questions, one useful answer.

Do: Japanese

Rendered by stage-finder.ts

Open example: Stage finder · Do: Japanese Use the full-page example to follow page links.

Translated.

Don't: Presented as a score

Rendered by stage-finder.ts

Open example: Stage finder · Don't: Presented as a score Use the full-page example to follow page links.

It is an orientation, not an audit.

Don't: More questions

Rendered by stage-finder.ts

Open example: Stage finder · Don't: More questions Use the full-page example to follow page links.

Two questions keep it a moment, not a form.

Rules

RuleWhyCheck
Stage finder is computed by Loom's code from Loom's working model of how design-system operations grow (stageFor), 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)
Each static instance supplies a distinct stable instanceKey; native radio groups and local IDs/references remain independent of language. Repeating identical inputs produces identical output.Multiple examples or consumers may share a document without clearing another instance's answers or breaking its heading labels.Automated: tests/site/native-runtime-repairs.spec.ts
Exactly two questions.It stays a quick orientation; the health check is the long form.Review: Owner

API

PropTypeRequiredDefaultWhat it does
instanceKeystringNo"singleton"Stable caller-owned key: starts with a letter, then letters/digits/underscore/hyphen, at most 64 characters. Repeated static instances in one document require distinct keys; language is separate.
langen | jaNo"en"Interface language.

Contract details

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

Identity

AspectValue
Idstage-finder
LayerOrganisms
Categoryshowcase
OwnerSite system lead
Statusbeta
Version1.0.0
Sourceapps/showcase/site/system/organisms/stage-finder.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Stage finder: computed by Loom's code from Loom's working model of how design-system operations grow (stageFor).

Use when

  • The closing call to action. Why: A two-question answer gives the reader a reason to book the conversation.

Do not use when

  • As a scored assessment. Why: That is the health check; this is a quick orientation.

Anatomy

PartWhat it is
rootdiv.ix-sf
formTwo radio questions
cardsThe stage card: needs and what breaks next
captionA working model; headcounts are indicative

Made of: showcase-frame, form-field, arrow-link, caption.

Used in: cta-section.

Variants

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

States

StateRendered or not applicable
defaultQuestions with no answer: no card shown
hoverChoice outline darkens.
focus-visibleThe --focus ring on each radio.
activeNot applicable: Radios have no pressed state.
disabledNot applicable: Never disabled.
loadingAuthored stage descriptions remain readable while the optional question/result enhancement loads.
emptyBefore an answer, a hint asks for both questions.
errorEvery authored answer combination has a stage; caught enhancement failure retains readable stage descriptions and does not claim ready.
currentThe selected answers are checked radios.
visitedNot applicable: Not a link.
expandedThe stage card appears below the questions.

Tokens

PartToken
card.rule--rule --ix-ok (or --ix-wait below stage 1)
--stage-finder-ix-ok-teal-inkvar(--teal-ink)
--stage-finder-ix-wait-saffron-inkvar(--saffron-ink)
--stage-finder-ix-broken-madder-inkvar(--madder-ink)
--stage-finder-ix-action-indigo-inkvar(--indigo-ink)
--stage-finder-ix-ink-inkvar(--ink)
--stage-finder-ix-ink-2-ink-2var(--ink-2)
--stage-finder-ix-line-linevar(--line)
--stage-finder-ix-surface-surfacevar(--surface)
--stage-finder-padding-space-6var(--space-6)
--stage-finder-padding-space-8var(--space-8)
--stage-finder-margin-space-8var(--space-8)
--stage-finder-font-type-h3var(--type-h3)
--stage-finder-margin-space-3var(--space-3)
--stage-finder-letter-spacing-ls-h3var(--ls-h3)
--stage-finder-font-size-fs-smallvar(--fs-small)
--stage-finder-margin-space-6var(--space-6)
--stage-finder-margin-bottom-space-4var(--space-4)
--stage-finder-gap-space-4var(--space-4)
--stage-finder-outline-focusvar(--focus)
--stage-finder-gap-space-5var(--space-5)
--stage-finder-border-top-rulevar(--rule)
--stage-finder-padding-space-5var(--space-5)
--stage-finder-font-type-strongvar(--type-strong)
--stage-finder-margin-space-4var(--space-4)
--stage-finder-gap-space-1var(--space-1)
--stage-finder-gap-space-3var(--space-3)
--stage-finder-gap-space-6var(--space-6)

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 answer appears when both questions are answered; nothing animates.

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. Static fallback: Original build-time specimen remains readable before loading and after chunk/initialization failure; enhancement controls retain authored hidden state.

  5. Configured initializer: apps/showcase/site/interactives/stage-finder.ts#init. The host owns transactional static-markup restoration and runtime state.

  6. 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 === "stage-finder");
    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); }
  7. After inserting the rendered markup, call mountRuntime(container) for the container holding [data-demo="stage-finder"]. 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 to the controls; Space plays or pauses; arrows move the steps; End shows the last step.
focusControls in reading order; focus never moves on its own.
screenReaderManual frame selection and pause announce their settled content. Explicit Play announces the final settled summary once; autoplay and system interruption/disposal stay silent. Legacy initializers outside the shared player remain explicitly unassessed.
contrastInk on surface 14:1; state dyes only as marks with words.
targetControls are 44 px.

Content

SlotLengthVoice
caption1 sentenceA working model; headcounts are indicative

Good: “Our working model of how design-system operations grow. Headcounts are indicative.”

Bad: “Find your maturity score”

Japanese: i18n.ts ix.sf.*.

Icons and illustrations

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

Decisions and exceptions

Usage

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