πŸ™ Onigiri

The Crunchyroll design system, rendered live from its own tokens and components. It cannot drift from what ships.

Docs draft

MediaCard

When to use it

useAny landscape media entry: episode grids, history, watchlist, search results, release-calendar rows. Context lives in data (thumbnail state, meta line, trailing actions), never in new variants.
avoidSeries browsing where the 2:3 key art is the identity. poster-card PosterCard.
avoidEditorial articles β€” they need none of the playback chrome. news-card NewsCard.

Variants

layout Β· tile / row β€” tile = vertical thumbnail + text; row = horizontal list entry on bg/secondary with optional airtime (the old Release Episode Card).

state Β· rest / hover / focus / loading β€” Hover: tile washes the thumbnail, row lifts to bg/pressed. Focus: 2px text/primary ring. Loading: skeleton.

Anatomy

thumbnail β€” .Thumbnail block: Wide/Poster Γ— Default/Progress/Watched/Coming Soon/Unavailable/Missing/Loading, with Duration chip on bg/scrim, accent progress bar, state glyphs on a scrim disc, and a Label slot (compose Tag).

text stack β€” Parent title (caption, secondary) β†’ Title (label-lg, primary) β†’ Meta (body-sm, secondary).

airtime β€” Row layout only. The old scooter/base teal died with Link's Scooter variant; airtime rides text/positive.

trailing β€” Slot for kebab / heart / trash β€” the old .Right Decoration set as composition.

Design specifications

tile-width320px, thumbnail 16:9
rowspace.8 padding on color.bg.secondary, thumbnail 128px, gap space.12
titletype.label-lg in color.text.primary
metatype.body-sm in color.text.secondary
duration-chiptype.body-sm on color.bg.scrim, radius.xs, inset space.8
progress4px color.accent.base on color.ink.500 track
focus-ring2px color.text.primary, offset 2

Accessibility

Card renders as a link when href is given. Duration/progress data is exposed via a progressbar role on the thumbnail, and the progressbar MUST carry an accessible name (β€œ<title> β€” watch progress”, falling back to β€œWatch progress”) β€” a bare role with only aria-valuenow fails axe aria-progressbar-name (caught 2026-09-01 by the Storybook a11y gate). Watched/Unavailable overlays keep their text chips β€” never icon-only. The duration chip sits on bg/scrim over artwork; contrast is content-dependent (as in the old system) β€” code may add a stronger backdrop.