What changes for each role

Lets the reader pick a role and see what Loom asks of them this week, what waits on them and what they get back, computed from the sample records. Its screen variant shows one captured role home with its source caption and tour links.

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

Do and don't

Do: A system owner’s captured home

Rendered by roles-picker.ts

Open example: What changes for each role · Do: A system owner’s captured home Use the full-page example to follow page links.

The exact existing role screenshot, source caption and tour links; this specimen does not claim interaction execution.

Do: Pick a role

Rendered by roles-picker.ts

Open example: What changes for each role · Do: Pick a role Use the full-page example to follow page links.

Your week.

Do: Sample records

Rendered by roles-picker.ts

Open example: What changes for each role · Do: Sample records Use the full-page example to follow page links.

Captioned as sample.

Don't: Real client data

Rendered by roles-picker.ts

Open example: What changes for each role · Don't: Real client data Use the full-page example to follow page links.

Synthetic only.

Don't: Uncaptioned

Rendered by roles-picker.ts

Open example: What changes for each role · Don't: Uncaptioned Use the full-page example to follow page links.

Say it is sample data.

Rules

RuleWhyCheck
What changes for each role is computed by Loom's code from the product tour's role homes on Harbor UI's synthetic records (scripts/site/roles), 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)
Data comes from the synthetic Harbor UI records.No client data on the site.Automated: tests/unit/site-role-screen.test.ts (source parity and supported role IDs)

API

PropTypeRequiredDefaultWhat it does
variantpicker | screenNo"picker"Picker: six role panels with optional native tabs. Screen: one intrinsic static role-home figure with tour links; no tabs or enhancement.
rolesystem-owner | engineering-lead | product-manager | executive-sponsor | product-designer | frontend-developer | accessibility-owner | content-owner | ops-leadNoRequired only for screen. One of the actual captured role IDs exported by scripts/site/roles.
langenNo"en"Source English only; neither variant has translated UI or captions.

Contract details

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

Identity

AspectValue
Idroles-picker
LayerOrganisms
Categoryshowcase
OwnerSite system lead
Statusbeta
Version1.0.0
Sourceapps/showcase/site/system/organisms/roles-picker.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26What changes for each role: computed by Loom's code from the product tour's role homes on Harbor UI's synthetic records (scripts/site/roles).

Use when

  • The roles hub (picker) or a single role page (screen). Why: Pick a role in the hub; see the captured role home beside its explanation.

Do not use when

  • For an Ops overview screen. Why: ProductScreen owns the separate Ops screen IDs; this family uses the existing role-home screenshots.

Anatomy

PartWhat it is
tabsdiv.roles-change-tabs: one tab per role
paneldiv.roles-change-panel: who, from, steps, measure
shotfigure.roles-shot: the role home in the tour

Made of: control, caption.

Used in: pages directly.

Variants

VariantWhenWhy
pickerThe roles hub.Readers choose among the six role views.
screenAn individual role page.The existing captured role home illustrates that role with explicit sample provenance.

States

StateRendered or not applicable
defaultPicker: all six source-English role panels are present and readable without its page script; roles.client.js enhances them to one selected tab panel. Screen: the selected captured image, descriptive alt, sample-data caption and native tour links; no script or tab panels.
hoverPicker tabs and the native tour links in both variants use their own hover affordances; the static image has no interactive state of its own.
focus-visiblePicker: selected tab, tab panels and links participate in keyboard reading order. Screen: only its native tour links are focusable; the image has descriptive alt.
activePicker only: selecting a role updates aria-selected, tabIndex and hidden panels. Screen has no role-selection or playback state; native links retain their normal activation.
disabledNot applicable: No disabled role state; all authored role tabs remain available.
loadingNot applicable: All role records/panels are rendered at build time. The optional page script changes tab behavior; no pending-data UI or host ready state is promised.
emptyNot applicable: The renderer uses the fixed synthetic role records; there is no caller empty-data variant.
errorNot applicable: No client fetch or error/retry view in this picker. A page-script failure leaves the pre-rendered panels; it is not managed host recovery.
currentPicker only: aria-selected identifies the selected role tab and its associated panel. Screen has no selected-tab/current-view state.
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
tab.current--ink underline
panel.background--surface
--roles-picker-margin-space-9var(--space-9)
--roles-picker-border-line-strongvar(--line-strong)
--roles-picker-background-surfacevar(--surface)
--roles-picker-border-bottom-line-strongvar(--line-strong)
--roles-picker-gap-space-1var(--space-1)
--roles-picker-padding-space-5var(--space-5)
--roles-picker-border-right-linevar(--line)
--roles-picker-color-inkvar(--ink)
--roles-picker-transition-dur-moderatevar(--dur-moderate)
--roles-picker-transition-ease-standardvar(--ease-standard)
--roles-picker-background-surface-2var(--surface-2)
--roles-picker-background-inkvar(--ink)
--roles-picker-color-cottonvar(--cotton)
--roles-picker-box-shadow-saffronvar(--saffron)
--roles-picker-outline-focusvar(--focus)
--roles-picker-font-type-small-strongvar(--type-small-strong)
--roles-picker-font-type-strongvar(--type-strong)
--roles-picker-padding-space-8var(--space-8)
--roles-picker-padding-guttervar(--gutter)
--roles-picker-gap-space-5var(--space-5)
--roles-picker-border-top-linevar(--line)
--roles-picker-font-type-h3var(--type-h3)
--roles-picker-font-type-smallvar(--type-small)
--roles-picker-color-ink-2var(--ink-2)
--roles-picker-gap-space-4var(--space-4)
--roles-picker-border-top-rule-hairvar(--rule-hair)
--roles-picker-border-top-line-strongvar(--line-strong)
--roles-picker-padding-top-space-3var(--space-3)
--roles-picker-padding-top-space-5var(--space-5)
--roles-picker-border-bottom-linevar(--line)

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.
wrappingPicker text wraps in its panels. Screen keeps the source image aspect ratio of 1280 by 1600 and scales to the prose column.
textExpansionSource English only; no translated variant is claimed.

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
NoneRole tabs change panels on reader selection; no timed playback or autoplay.

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
rolePicker: role tablist with labelled tabpanels. Screen: figure, image with descriptive alt, caption and native links into the product tour.
nameIts heading or caption
keyboardPicker: Tab reaches the selected tab; Arrow keys cycle roles; Home/End jump first/last. Screen: Tab and Enter operate its two native tour links; no arrow-key handler.
focusPicker uses roving tabIndex and focusable panels. Screen leaves focus to its two native links; no managed focus.
screenReaderPicker exposes selected tab and associated panel; all panels remain readable without scripting. Screen exposes descriptive image alt and its sample-data caption.
contrastInk on surface 14:1; state dyes only as marks with words.
targetControls are 44 px.

Content

SlotLengthVoice
step1 sentenceWhat Loom asks or gives

Good: “Two decisions wait on you.”

Bad: “Empower your team”

Japanese: English only (sample records are English).

Icons and illustrations

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

Decisions and exceptions

Usage

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