UX Ops board (one quarter of a design system)

Plays thirteen weeks of a sample design system with an operating model and with tools only, so the reader sees who acts, what waits and what is decided in time.

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

Do and don't

Do: The full quarter

Rendered by ops-board.ts

Open example: UX Ops board (one quarter of a design system) · Do: The full quarter Use the full-page example to follow page links.

Both modes, same tiles, so like is compared with like.

Do: Exceptions preset

Rendered by ops-board.ts

Open example: UX Ops board (one quarter of a design system) · Do: Exceptions preset Use the full-page example to follow page links.

On Govern, where exceptions are the claim.

Don't: Presented as client data

Rendered by ops-board.ts

Open example: UX Ops board (one quarter of a design system) · Don't: Presented as client data Use the full-page example to follow page links.

The caption must say sample records.

Don't: Autoplay with reduced motion

Rendered by ops-board.ts

Open example: UX Ops board (one quarter of a design system) · Don't: Autoplay with reduced motion Use the full-page example to follow page links.

Reduced motion shows the final week and waits for the reader.

Rules

RuleWhyCheck
UX Ops board (one quarter of a design system) is computed by Loom's code from Harbor UI's sample records simulated week by week by Loom's operations code (scripts/site/interactives/ops-quarter.ts), 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)
Both modes show the same count tiles.The reader can only compare like with like (critic, 26 Oct).Automated: tests/site/interactives.spec.ts

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.
presetstringNo"full"full, or exceptions for the Govern page.

Contract details

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

Identity

AspectValue
Idops-board
LayerOrganisms
Categoryshowcase
OwnerSite system lead
Statusbeta
Version1.0.0
Sourceapps/showcase/site/system/organisms/ops-board.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26UX Ops board (one quarter of a design system): computed by Loom's code from Harbor UI's sample records simulated week by week by Loom's operations code (scripts/site/interactives/ops-quarter.ts).

Use when

  • The UX Ops lead on the landing and the Operations page. Why: It is the one view that shows why an operating model matters.
  • The exceptions preset on the Govern page. Why: It shows an exception expiring on schedule.

Do not use when

  • To claim a client's results. Why: The records are sample data, captioned as such.

Anatomy

PartWhat it is
rootdiv.ix-ob
controlsMode toggle, week slider, play
lanesWork lanes with cards
peopleWho is away
countsThe same tiles in both modes
captionSample records, computed by Loom's code

Made of: showcase-frame, control, playback-controls, stat, caption.

Used in: lead-section.

Variants

VariantWhenWhy
fullLanding and Operations.The whole quarter in both modes.
exceptionsGovern.Focuses on an exception with an expiry.

States

StateRendered or not applicable
defaultThe final, complete step (what readers without JavaScript see).
hoverIts controls show hover; the content does not change on hover.
focus-visibleEvery control shows the --focus ring.
activePlaying: the play control reads Pause and the steps advance.
disabledNot applicable: Controls are hidden, not disabled, when they cannot act.
loadingThe build-time specimen remains readable while its browser chunk loads. Managed bindings expose controls after validated initialization; unmanaged bindings retain their native startup behavior and unverified result.
emptyNot applicable: The data is part of the build; a showcase without data fails the build.
errorManaged bindings restore readable static content and hidden inert controls on caught chunk/initialization failure, then retry by remount. Unmanaged bindings catch chunk/throw failures, but a resolved initializer can mask internal data/DOM failure; its ready marker is not verified success. Unmanaged recovery requires a page reload. Enhancement failure is separate from business-data errors.
currentThe current step is named in words (aria-valuetext and the step label).
visitedNot applicable: Not a link.
expandedNot applicable: It does not open or close.

Tokens

PartToken
card.rule--rule in the card's state colour (wait saffron, broken madder, ok teal)
lane.ground--surface-2
counts.rule--rule --ix-ink
--ops-board-ob-ok-tealvar(--teal)
--ops-board-ob-ok-ink-teal-inkvar(--teal-ink)
--ops-board-ob-wait-saffronvar(--saffron)
--ops-board-ob-wait-ink-saffron-inkvar(--saffron-ink)
--ops-board-ob-broken-maddervar(--madder)
--ops-board-ob-broken-ink-madder-inkvar(--madder-ink)
--ops-board-ob-idle-line-strongvar(--line-strong)
--ops-board-ob-idle-ink-ink-2var(--ink-2)
--ops-board-margin-top-space-8var(--space-8)
--ops-board-gap-space-5var(--space-5)
--ops-board-color-inkvar(--ink)
--ops-board-outline-focusvar(--focus)
--ops-board-gap-space-4var(--space-4)
--ops-board-gap-space-8var(--space-8)
--ops-board-gap-space-2var(--space-2)
--ops-board-font-type-bodyvar(--type-body)
--ops-board-font-type-h3var(--type-h3)
--ops-board-letter-spacing-ls-h3var(--ls-h3)
--ops-board-font-type-smallvar(--type-small)
--ops-board-color-ink-2var(--ink-2)
--ops-board-gap-space-6var(--space-6)
--ops-board-padding-space-6var(--space-6)
--ops-board-border-radius-radiusvar(--radius)
--ops-board-background-inkvar(--ink)
--ops-board-color-cottonvar(--cotton)
--ops-board-box-shadow-space-2var(--space-2)
--ops-board-box-shadow-saffronvar(--saffron)
--ops-board-font-type-small-strongvar(--type-small-strong)
--ops-board-accent-color-indigovar(--indigo)
--ops-board-gap-grid-gapvar(--grid-gap)
--ops-board-background-surfacevar(--surface)
--ops-board-background-surface-3var(--surface-3)
--ops-board-ob-fg-2-ink-2var(--ink-2)
--ops-board-background-indigovar(--indigo)
--ops-board-color-on-dyevar(--on-dye)
--ops-board-ob-fg-2-on-dye-2var(--on-dye-2)
--ops-board-ob-ok-teal-2var(--teal-2)
--ops-board-ob-broken-madder-2var(--madder-2)
--ops-board-gap-space-1var(--space-1)
--ops-board-padding-top-space-3var(--space-3)
--ops-board-border-top-rulevar(--rule)
--ops-board-font-type-h2var(--type-h2)
--ops-board-letter-spacing-ls-h2var(--ls-h2)
--ops-board-padding-space-5var(--space-5)
--ops-board-border-top-rule-hairvar(--rule-hair)
--ops-board-border-top-linevar(--line)
--ops-board-margin-space-4var(--space-4)
--ops-board-background-surface-2var(--surface-2)
--ops-board-background-space-3var(--space-3)
--ops-board-background-space-5var(--space-5)
--ops-board-font-type-labelvar(--type-label)
--ops-board-background-cottonvar(--cotton)
--ops-board-padding-space-4var(--space-4)
--ops-board-color-indigo-inkvar(--indigo-ink)
--ops-board-stroke-surface-3var(--surface-3)
--ops-board-padding-space-2var(--space-2)
--ops-board-background-teal-softvar(--teal-soft)
--ops-board-margin-top-space-2var(--space-2)
--ops-board-box-shadow-shadow-floatvar(--shadow-float)
--ops-board-color-madder-inkvar(--madder-ink)

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
movesIts steps, one at a time.
triggerScrolled into view (IntersectionObserver), or the play control.
durationAuthored frame holds belong to each registered runtime motion profile, not one shared range. DriftHero: 1.6/2.4/2.4 s, Conversations: 3 s, V4: 4 s; unknown legacy timings remain unassessed. Registered Web Animations transitions use --dur-weave.
easingPer registered profile: Claude showcase arrivals use --ease-enter; V4 geometry uses --ease-standard. Other legacy bindings remain unassessed.
interruptibleYes: pause, the slider and keyboard End stop or jump at once.
reducedNo autoplay: the final step is shown and the reader steps through with the controls.
whyThe showcase proves a claim by letting the reader watch Loom's code do the work.

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/ops-quarter.json. Required first-party native source data; fetch aborts with the mount and invalid consumed fields reject before DOM initialization.

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

  7. Before DOM initialization the configured host awaits apps/showcase/site/interactives/ops-quarter.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.

  8. Configured initializer: apps/showcase/site/interactives/ops-quarter.ts#init. The host owns transactional static-markup restoration and runtime state.

  9. 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 === "ops-quarter");
    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); }
  10. After inserting the rendered markup, call mountRuntime(container) for the container holding [data-demo="ops-quarter"]. 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
caption2 sentencesSample records; computed by Loom's code

Good: “Harbor UI is a made-up React system. Every number is computed from its sample records.”

Bad: “Teams ship 3x faster with Loom.”

Japanese: i18n.ts ix.ob.* and ix.oq.*.

Icons and illustrations

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

Decisions and exceptions

Usage

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