Design System / 07.10
Media & motion
Components for video, image sequences, production metadata, surface texture, and short reveals. Every animated example includes a still reduced-motion state.
Ambient video
Decorative cover footage with no controls or accessible content. Playback begins only while the element is on screen and the document is visible, and pauses for reduced motion or reduced data. Pair it with independent text; use Video when the footage itself matters.
Live specimen
Rendered output
Ambient study / moving band of light
API reference
Inputs, types, and behavior
- Inputbw
- Typeboolean = false
- BehaviorApplies a static grayscale treatment; leave false to preserve the supplied footage.
- Inputplayback contract
- Typeforced decorative video
- BehaviorA poster is required. Playback is muted, looped, inline, aria-hidden, unfocusable, and preload=none.
- Input…rest / className
- Typerestricted video props / string?
- BehaviorSource and media callbacks pass through. className merges last on the object-cover video.
Logo wall
A still grid for supplied partner marks. It preserves the supplied marks by default and adds no invented hover restoration. The neutral labels below demonstrate density without implying partner relationships.
Live specimen
Rendered output
- Specimen 01
- Specimen 02
- Specimen 03
- Specimen 04
- Specimen 05
- Specimen 06
- Specimen 07
- Specimen 08
API reference
Inputs, types, and behavior
- Inputlogos
- Type{ alt, src?, node? }[]
- Behaviorsrc renders an image; node accepts a supplied static mark. Blank alt marks are decorative.
- Inputcolumns / divided
- Type2 | 3 | 4 | 5 | 6 / boolean
- BehaviorTwo columns on phones, then a responsive ladder to the requested maximum. divided adds /15 hairlines.
- Inputgrayscale
- Typeboolean = false
- BehaviorExplicit static normalization only; never restores color on hover.
- InputclassName
- Typestring?
- BehaviorMerged last on the list grid.
Marquee
A continuous horizontal register with a persistent pause control. It pauses on hover, focus, offscreen placement, hidden tabs, and live reduced-motion changes. Reduced motion resets one complete static row.
Live specimen
Rendered output
API reference
Inputs, types, and behavior
- InputautoPlay / speed
- Typeboolean = true / number = 60
- BehaviorautoPlay sets the initial state; finite speed controls px/s and a negative value reverses direction.
- Inputgap / edgeFade
- Typestring = "3rem" / boolean
- BehaviorControls copy spacing and an optional currentColor mask at the strip edges.
- Inputlabel / children
- Typestring? / ReactNode
- Behaviorlabel names the region. Children repeat once in an aria-hidden, inert loop copy.
- InputclassName
- Typestring?
- BehaviorMerged last on the named region.
Material texture
Static deterministic traces of four real substrates and processes. Choose the variant because the composition refers to paper, film, cloth, or dry print—never as generic atmosphere, fake wear on photography, or invented provenance.
Live specimen
Rendered output
Paper
Uncoated stock / sparse fiber
Film
Fine grain / rare scratch
Cloth
Broken warp and weft
Press
Dry ink / short pull
API reference
Inputs, types, and behavior
- Inputvariant
- Type"paper" | "film" | "cloth" | "press" = "paper"
- BehaviorPaper is sparse fiber; film is fine grain; cloth is broken weave; press is dry ink and short pulls.
- Inputsize
- Typenumber = 160
- BehaviorTile edge in CSS px, rounded and clamped to 48–1024; non-finite input uses 160.
- InputclassName
- Typestring?
- BehaviorMerged last on the absolute decorative SVG; hosts may tune --texture-grain-opacity from its 6% default.
Media sequence
A sequence for full-width, paired, and inset media. The only photograph below is the catalog’s one demo source; the paired document panels are plainly labeled layout specimens, not falsely presented as separate project assets.
Live specimen
Rendered output

API reference
Inputs, types, and behavior
- Inputitems
- Typesingle | diptych entries[]
- BehaviorMedia nodes own crop and alternative text. Invalid empty entries are skipped instead of emitting blank figures.
- Inputlayout / balance
- Type"full" | "inset" | "diptych" / "equal" | "left" | "right"
- BehaviorDiptychs stack in source order below md; a malformed one-item tuple collapses to one full track.
- Inputalign / gap
- Type"start" | "center" | "end" / "tight" | "normal" | "open"
- BehaviorPositions inset media and selects the vertical spacing.
- InputclassName
- Typestring?
- BehaviorMerged last on the sequence root; item classes style their own block.
Page fade
A fixed media-ink dip for same-origin full-page navigation. It skips router-prevented, modified, hash, download, external, and opted-out links. Reduced motion never intercepts; a live preference change completes a pending navigation without waiting.
Live specimen
Rendered output
Page A — Catalog index
Open a component page to review its rendered states and API.
API reference
Inputs, types, and behavior
- Inputduration
- Typenumber = 350
- BehaviorArrival duration, clamped to 0–10000ms; non-finite input uses 350ms. Exit is capped at 250ms and uses the exit curve.
- Inputdata-page-fade
- Type"off" link attribute
- BehaviorOpts a link out. Use for client-router links; the component is intended for MPA navigation.
- InputclassName
- Typestring?
- BehaviorMerged last on the fixed, pointer-transparent veil.
// Render once for full-page navigation.
<PageFade />
// Let a client router own this link.
<a data-page-fade="off" href="/archive">Archive</a>Pattern backdrop
Four static currentColor patterns for structure, not simulated wear. Grid measures a field, rule establishes a baseline, hatch marks a hatched zone, and square points create a sparse index. Use one role per region and keep readable content above it.
Live specimen
Rendered output
Grid
Measured field / 32px
Point
Sparse index / 20px
Rule
Baseline register / 24px
Hatch
Marked zone / 28px
API reference
Inputs, types, and behavior
- Inputvariant
- Type"grid" | "dot" | "rule" | "hatch" = "grid"
- BehaviorEach variant has one job: measured field, sparse index, baseline register, or marked zone.
- Inputsize / dotSize
- Typenumber = 24 / number = 1.5
- BehaviorCell size is clamped to 4–512px; point size to 1–2px; non-finite values use defaults.
- InputedgeFade / className
- Typeboolean / string?
- BehaviorAdds a static radial mask; className merges last on the decorative SVG.
<section className="relative overflow-hidden">
<PatternBackdrop edgeFade size={24} variant="rule" />
<div className="relative">Readable foreground content</div>
</section>Preloader
A rare opening curtain with count and typed variants. Count runs over 1400ms, holds for 600ms, then lifts in 700ms. Typed copy uses a 36ms-per-grapheme cadence, pauses 500ms between lines, then honors the hold before a 500ms fade. Reduced motion finishes immediately and still calls onDone.
Live specimen
Rendered output
Count variant
Ran once — replay
Contained for display — on a real site the overlay covers the viewport once, then slides away and unmounts.
Typed variant
Ran once — replay
Contained for display — on a real site the overlay covers the viewport once, then slides away and unmounts.
API reference
Inputs, types, and behavior
- Inputvariant
- Type"count" | "typed" = "count"
- BehaviorMalformed runtime values fall back to count.
- Inputduration / hold
- Typenumber = 1400 / number = 600
- BehaviorDuration controls the count run; hold applies to both modes. Both sanitize to 0–10000ms, while typed mode keeps its fixed 36ms/grapheme rhythm.
- Inputtarget / suffix / label
- Typenumber / string / ReactNode
- BehaviorCount content. A non-finite target falls back to 550.
- Inputlines / onDone
- Typestring[] / () => void
- BehaviorTyped mode uses at most two grapheme-safe lines; onDone fires once after exit or immediately under reduced motion.
Proof frame
A clear margin, four /15 crop marks, and a figcaption around supplied media. The metadata below records only facts visible in this repository; it does not invent a plate, date, client, or production history.
Live specimen
Rendered output

API reference
Inputs, types, and behavior
- Inputchildren
- TypeReactNode
- BehaviorImage, scan, document, or still; the child owns its alternative text.
- Inputcaption / meta
- TypeReactNode? / ReactNode?
- BehaviorNonblank values share one semantic figcaption at the readable /60 floor.
- Inputmarks
- Typeboolean = true
- BehaviorDecorative currentColor crop marks at the /15 structural rung.
- InputmediaClassName / className
- Typestring? / string?
- BehaviorMerge last on the clipped media wrapper and figure respectively.
QR frame
A fixed media-paper presenter for a host-generated code. It does not generate, encode, validate, or guarantee a scanner quiet zone. This specimen is explicitly non-scannable and demonstrates framing only.
Live specimen
Rendered output
API reference
Inputs, types, and behavior
- Inputchildren
- TypeReactNode
- BehaviorHost-generated and validated img, canvas, or SVG. CurrentColor children inherit fixed media ink.
- Inputsize / padded
- Typenumber = 180 / boolean = true
- BehaviorEdge is bounded to 64–512px. Padding adds paper margin but does not certify QR validity.
- Inputlabel / caption
- Typestring? / ReactNode?
- BehaviorA nonblank label creates a named group; a nonblank caption creates the figcaption.
- InputclassName
- Typestring?
- BehaviorMerged last on the figure.
Rule draw
A decorative currentColor hairline that scales from its left edge in 1200ms on the curtain curve. Lead-ins retain a measured drafting cadence; reduced motion and no script show the complete line.
Live specimen
Rendered output
Three-rule sequence
API reference
Inputs, types, and behavior
- Inputdelay
- Typenumber = 0
- BehaviorLead-in in ms, clamped to 0–600; non-finite input uses zero.
- InputclassName
- Typestring?
- BehaviorMerged last on the aria-hidden /15 hairline.
Scroll reveal
A one-shot group reveal. Text rises eight pixels over 700ms; media fades in place over 1000ms. Effective stagger stays within a 480ms staging window. No script and reduced motion present complete content.
Live specimen
Rendered output
Editorial register
Process note / 01
Source notes and captions
Captions, files, and material facts establish authorship more honestly than animated distress.
API reference
Inputs, types, and behavior
- Inputkind
- Type"text" | "media" = "text"
- BehaviorText lifts and fades over 700ms; media fades in place over 1000ms.
- Inputstagger
- Typenumber = 80
- BehaviorRequested per-child delay, clamped by child count inside a 480ms staging window.
- Inputas / className
- Type"div" | "section" / string?
- BehaviorSelects the flow container; className merges last on it. Each child receives one wrapper.
Scroll settle
A rare hero-only, position-mapped settle from 92% scale and 80% opacity to rest. It follows scroll rather than a timer, completes by mid-viewport, and becomes a stable final frame under reduced motion or without scripting.
Live specimen
Rendered output

API reference
Inputs, types, and behavior
- Inputchildren
- TypeReactNode
- BehaviorOne justified hero image or figure; ordinary editorial media should remain static.
- InputclassName
- Typestring?
- BehaviorMerged last on the transform/opacity wrapper.
Slideshow
A named carousel with its rotation control first, visible previous and next controls, optional thumbnails, and a live slide announcement after manual navigation. Its two local sources are the catalog shed photograph and the extracted poster frame from the demo footage. New images dissolve over 1000ms while outgoing images leave in 300ms.
Live specimen
Rendered output

Slide 1 of 2
API reference
Inputs, types, and behavior
- Inputimages / label
- Type{ src, alt }[] / string?
- BehaviorBlank sources are skipped; label names the carousel. Every active slide retains its alt text.
- InputautoPlay / interval
- Typeboolean = true / number = 6000
- BehaviorInitial rotation policy and a finite 4–60s interval. Manual navigation stops rotation until resumed.
- InputhoverHalves / thumbnails
- Typeboolean / boolean
- BehaviorHalf-stage hit zones remain visibly arrowed on touch and keyboard; thumbnails always self-dim.
- InputclassName / stageClassName
- Typestring? / string?
- BehaviorMerge last on the named carousel root and internal 3:2 stage; use stageClassName to override aspect.
Video
A figure around user-controlled native video. Unlike AmbientVideo, it keeps accessible controls and lets the host choose preload, poster, playback, tracks, and source behavior. This demo uses a frame mechanically extracted from the footage rather than the unrelated photograph.
Live specimen
Rendered output
API reference
Inputs, types, and behavior
- Inputcaption
- TypeReactNode?
- BehaviorA nonblank mono figcaption below the native player.
- InputclassName / videoClassName
- Typestring? / string?
- BehaviorMerge last on the figure and video respectively.
- Input…rest
- Typevideo props
- BehaviorSpread last onto the element. controls and preload=metadata are defaults the host may override deliberately.
