The four jobs (dye tiles)

See, Shape, Govern and Run as four dye tiles under the hero, each with a real artefact that plays once, so the four jobs read as one sequence.

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

Do and don't

Do: Four jobs

Rendered by jobs-strip.ts

Open example: The four jobs (dye tiles) · Do: Four jobs Use the full-page example to follow page links.

The product's structure in one row.

Do: Japanese names

Rendered by jobs-strip.ts

Open example: The four jobs (dye tiles) · Do: Japanese names Use the full-page example to follow page links.

All four governed job names and existing Japanese landing headings, in order.

Don't: Five tiles

Rendered by jobs-strip.ts

Open example: The four jobs (dye tiles) · Don't: Five tiles Use the full-page example to follow page links.

There are four jobs; a fifth tile would invent one.

Don't: Tiles outside the strip

Rendered by jobs-strip.ts

Open example: The four jobs (dye tiles) · Don't: Tiles outside the strip Use the full-page example to follow page links.

Dye tiles side by side are allowed only as this template.

Rules

RuleWhyCheck
The four jobs (dye tiles) is computed by Loom's code from the four jobs on the landing and a small real artefact for each, 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)
Exactly four tiles, in the order See, Shape, Govern, Run.The order is the product's sequence, and the numbers 01 to 04 below follow it.Automated: scripts/site/landing.ts (warns unless four)

API

PropTypeRequiredDefaultWhat it does
itemslistYesFour items: label, head, text, href, colour, optional fragment.
langen | jaNo"en"Interface language.

Contract details

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

Identity

AspectValue
Idjobs-strip
LayerOrganisms
Categoryshowcase
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/organisms/jobs-strip.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26The four jobs (dye tiles): computed by Loom's code from the four jobs on the landing and a small real artefact for each.

Use when

  • Under the landing hero. Why: The four jobs are the product's structure; the tiles make it visible at once.

Do not use when

  • For anything other than the four jobs. Why: Four dye tiles side by side are allowed only as this one template (D-SITE-002).

Anatomy

PartWhat it is
rootul.jb (a TileGrid of dye tiles)
tileli.jb-job with the verb, head, text and artefact
artefactjb-pic: bars, a token row, the flow, a draft
goThe arrow to the job's page

Made of: showcase-frame, tile, heading, text, icon.

Used in: hero.

Variants

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

States

StateRendered or not applicable
defaultAuthored job links and final artefacts are readable in build-time markup; enhancement may play their once-only entrance.
hoverEach native job link retains its own hover affordance.
focus-visibleJob links take focus in order with the Site focus ring; decorative artefacts are aria-hidden.
activeNot applicable: Job links navigate; the once-only artefact entrance is motion, not a pressed/playback state.
disabledNot applicable: The four job destinations are links, not disableable playback controls.
loadingJob text/links and settled artefacts remain readable while the optional managed entrance chunk loads.
emptyAn empty items array renders an empty list; it violates the four-jobs content rule and is a documented misuse, not a successful empty-state variant.
errorCaught chunk/init failure restores the original static strip; the host records failed and remount may retry. Invalid job count is a content-rule violation, not a fabricated error panel.
currentNot applicable: The strip links to job pages; it has no selected frame, slider or current-job API.
visitedNative job links retain browser history and inherited text color.
expandedNot applicable: Job links do not disclose panels.

Tokens

PartToken
tile.see--field teal
tile.shape--field madder
tile.govern--field saffron
tile.run--field indigo
verb.font--type-h2 (h3 in Japanese)
--jobs-strip-border-block-start-space-2var(--space-2)
--jobs-strip-border-block-start-cottonvar(--cotton)
--jobs-strip-gap-space-3var(--space-3)
--jobs-strip-padding-space-8var(--space-8)
--jobs-strip-padding-space-5var(--space-5)
--jobs-strip-transition-dur-moderatevar(--dur-moderate)
--jobs-strip-transition-ease-standardvar(--ease-standard)
--jobs-strip-font-type-h3var(--type-h3)
--jobs-strip-transform-space-2var(--space-2)
--jobs-strip-font-type-h2var(--type-h2)
--jobs-strip-letter-spacing-ls-h2var(--ls-h2)
--jobs-strip-font-type-strongvar(--type-strong)
--jobs-strip-font-type-labelvar(--type-label)
--jobs-strip-margin-top-space-5var(--space-5)
--jobs-strip-gap-space-2var(--space-2)
--jobs-strip-padding-space-2var(--space-2)
--jobs-strip-padding-space-3var(--space-3)
--jobs-strip-padding-space-1var(--space-1)
--jobs-strip-padding-top-space-2var(--space-2)
--jobs-strip-font-type-small-strongvar(--type-small-strong)
--jobs-strip-box-shadow-rule-hairvar(--rule-hair)
--jobs-strip-animation-dur-weavevar(--dur-weave)
--jobs-strip-animation-ease-entervar(--ease-enter)
--jobs-strip-animation-delay-staggervar(--stagger)
--jobs-strip-animation-delay-dur-slowvar(--dur-slow)
--jobs-strip-animation-dur-slowvar(--dur-slow)
--jobs-strip-animation-delay-dur-weavevar(--dur-weave)
--jobs-strip-animation-ease-standardvar(--ease-standard)
--jobs-strip-background-field-bgvar(--field-bg)
--jobs-strip-color-field-fgvar(--field-fg)
--jobs-strip-background-field-fgvar(--field-fg)
--jobs-strip-color-field-fg-2var(--field-fg-2)
--jobs-strip-box-shadow-field-fgvar(--field-fg)
--jobs-strip-color-field-bgvar(--field-bg)
--jobs-strip-animation-rulevar(--rule-hair)
--jobs-strip-animation-foregroundvar(--field-fg)
--jobs-strip-animation-backgroundvar(--field-bg)

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
movesEach tile's artefact plays once (bars fill, a token resolves).
triggerWhen the strip scrolls into view.
duration--dur-weave per step, --stagger between tiles
easing--ease-standard
interruptiblePlays once and stops; nothing loops.
reducedThe final state shows at once.
whyA small live proof per job, under the promise.

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/jobs-strip.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 === "jobs-strip");
    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="jobs-strip"]. 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
roleA list of native links; the authored four-job content rule applies.
nameIts heading or caption
keyboardTab through job links; Enter follows the destination. No Space-to-pause or frame slider exists.
focusJob links remain in document reading order; decorative artefacts never receive focus.
screenReaderJob verb/heading/link text; decorative artefacts are aria-hidden, with no automatic playback announcements.
contrastInk on surface 14:1; state dyes only as marks with words.
targetControls are 44 px.

Content

SlotLengthVoice
label1 wordThe job's verb (content token job.*)
head8 wordsWhat the job gives you

Good: “See — Know what you really have.”

Bad: “Feature 1”

Japanese: Job names from content tokens job.* (見える化する・整える・守る・運用する).

Icons and illustrations

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

Decisions and exceptions

Usage

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