One easing set and four transition durations, with distinct authored sequence holds. Preserve Claude's optional once-only below-fold entrance profile and controlled showcase playback. Reduced motion removes transitions and autoplay; explicit manual frame inspection remains available.

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

Reference

Source reference; not an executed check.

standard
easing.standard
enter
easing.enter
exit
easing.exit
fast
duration.100
moderate
duration.160
slow
duration.240
weave
duration.360

Do and don't

2 positive / 2 negative authored documentation examples (2 each required); 1 reference (1 required); 0 failed. References and failures do not count; this is not behavior acceptance.

Do: An actual inspectable illustration sequence

Authored by motion.ts

Rendered consumer example; not an executed correctness check. identity-motion Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: Motion · Do: An actual inspectable illustration sequence Use the full-page example to follow page links.

The registered native sequence retains its caption identifying an illustration and its real runtime controls. Its draft lifecycle, reduced-motion behavior and playback acceptance remain separate from this authored example.

Do: Reduced motion retains the explanation

Authored by motion.ts

Rule illustration; not an executed check. motion / motion.reduced

Reduced motion: show the authored static frame, remove autoplay and transitions, retain explicit manual frame controls.
A live preference change pauses playback rather than restarting an animation.
This positive rule illustration preserves the registered behavior contract; it does not simulate a preference change or invent another timing profile.

Don't: Autoplay carries the only explanation

Authored by motion.ts

Rule illustration; not an executed check. motion / motion.reduced

With prefers-reduced-motion active, the diagram keeps autoplaying and its labels appear only during transitions.
There is no complete static explanation.
Readers who request less motion would lose the argument or be forced to watch movement; a timing list cannot repair that consumer.

Don't: A moving showcase has no pause action

Authored by motion.ts

Rule illustration; not an executed check. playback-controls / playback.pause

A showcase advances frames over time, but its Pause button and manual selection controls are removed.
The reader cannot stop and inspect the explanation.
The actual playback contract requires reader control. This escaped misuse is neither an executed animation nor a native refusal.

Rules

RuleWhyCheck
With prefers-reduced-motion, no autoplay or animated transitions. Manual controls remain available; changing the preference pauses current playback.Motion can make some readers ill.Automated: tests/site (reduced-motion spec)

API

No props.

Contract details

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

Identity

AspectValue
Idmotion
LayerFoundations
Categoryfoundation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/foundations/motion.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Motion as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Showcases, menus opening, hover cues. Why: Motion explains a change or proves a claim.

Do not use when

  • Unregistered continuous decorative or scroll-coupled effects. Why: The preserved claude-entrance runs once. The existing cloth knot pulse and fray use one finite cycle per owned root: visible roots only, settled on interruption, absent under reduced motion, and disposed with their root. New free-form loops are unsupported.

Anatomy

PartWhat it is
easing--ease-standard, --ease-enter, --ease-exit
durations--dur-quick, --dur-moderate, --dur-slow, --dur-weave

Made of: nothing (a base element).

Used in: pages directly.

Variants

VariantWhenWhy
light and darkEvery page, following the reader's setting.The same roles resolve to light or dark values, so no element chooses its own.

States

StateRendered or not applicable
defaultThe specimen.
hoverNot applicable: A foundation is not interactive.
focus-visibleNot applicable: Not focusable.
activeNot applicable: Not interactive.
disabledNot applicable: Nothing to disable.
loadingNot applicable: Values are built into the stylesheet.
emptyNot applicable: The build fails if a value is missing.
errorNot applicable: Unresolved values fail the brand gate, not the reader.
currentNot applicable: No current item.
visitedNot applicable: Not a link.
expandedNot applicable: Does not open.

Tokens

PartToken
--ease-standardeasing.standard
--dur-moderateduration.160

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingText wraps; nothing scrolls sideways.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalNot applicable: a foundation has no box of its own.
externalNot applicable.
rhythmApplies to every element that reads it.

Motion

AspectValue
movesShowcase steps, menu panels, hover cues and the registered claude-entrance profile (20px once; at most six --stagger intervals). Existing cloth retains its explicit finite profiles: one knot pulse (--dur-weave × 6.7 = 2412ms) and one fray cycle (--dur-weave × 8.9 = 3204ms), both with --ease-standard. Completion or interruption consumes the cycle and leaves the static final pose; neither restarts automatically. The knot applies to loose cell markers; fray applies only to the fray variant.
triggerThe reader, or a showcase entering view.
duration100 to 360 ms per transition; claude-entrance, DriftHero and Conversations use --dur-weave. Sequence holds are separate per motion-profiles.ts (including 3-second Conversations and 4-second V4 frames).
easing--ease-standard
interruptibleAlways.
reducedNo autoplay or animated transition; static authored frame shown. Explicit controls can inspect frames or request timed playback without transitions. A live preference change pauses and restores the authored static frame.
whyMotion must earn its place by explaining a change.

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
roleNot rendered on the site; its specimen in the Library is a list
nameThe foundation's name
keyboardNot interactive.
focusNot focusable.
screenReaderThe specimen is a plain list of names and values.
contrastEvery text and ground pair in the palette is checked (check-brand).
targetNot a target.

Content

SlotLengthVoice
playback controls and frame names (consumer-owned)PlaybackControls declares two words for play; frame wording follows the owning sequenceSay Play or Pause for the current action and name the frame in words. Only components with playback expose those controls; a motion token adds no playback API.
static frame explanation or captionThe consuming illustration or showcase contract's caption budgetKeep the explanation readable with playback stopped or reduced motion active. Distinguish an illustration from a live system result.

Good: “Play / Pause (PlaybackControls' named action)” · “Illustration of the idea; not a live system result. (IdentityMotion's caption)”

Bad: “▶ as the only playback name (PlaybackControls' rejected symbol)” · “A result explained only by an autoplay transition”

Japanese: Use the owning sequence's existing Japanese control, frame and caption strings; IdentityMotion already names Previous frame and Next frame in Japanese. Keep timing token identifiers unchanged. Recheck static and manually selected Japanese frames under reduced motion; this guidance is not a playback test or completed native review.

Icons and illustrations

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

Decisions and exceptions

  • None.

Usage

64 owned-class occurrences in built pages plus metadata-token references in built CSS (measured by npm run site:system).

No application mechanism is declared.

Current check result: not assessed by this report. Declarations and source-file presence do not establish executed enforcement or accepted coverage.

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.