Sakuga Back to Sakuga
Theme
Sound
Jump to a component

AniCanonKit · Characters

CastCard

A cast member on the cast page: the portrait (an initial until one is approved), the role, the name, what they have, and what is happening to them now.

@anicanon/sakuga/anicanonkitv1.0Used onWeb · iOS · AndroidFrom AniCanon™

Live, from @anicanon/sakuga 2.0.0

Sakuga for iOS and Android is coming

iOS

Coming soon

CastCard for iOS is in the roughs. The tokens it will read are the ones on this page, the same on every platform.

Android

Coming soon

CastCard for Android is in the roughs. The tokens it will read are the ones on this page, the same on every platform.

Use it for
One cast member on the cast page: the portrait, role and name, what they have, what is happening to them now, and the next step at its foot.
Not for

Guidelines

  • state is a live fact about them (attention when it waits on the creator, busy while something is drawn).
  • action is the next step, across the card's foot: attention (review), draft (continue setup), busy with the loader and the time it has run.
  • One state and one action at most. CastGrid lays a faction's cast six across.
CastCardExample.jsxReact
import { CastCard } from '@anicanon/sakuga/anicanonkit';

export default function CastCardExample() {
  return (
    <div
      style={{
        display: 'grid',
        gridTemplateColumns: 'repeat(4,170px)',
        gap: 12,
      }}
    >
      {[
        {
          name: 'Kiko',
          image: '/art/eba-cast-kiko.webp',
          role: 'Leads the E.R.A.',
          meta: '2 looks',
        },
        {
          name: 'Rick',
          initial: 'R',
          action: { label: 'Face sheet ready, review', tone: 'attention' },
        },
        {
          name: 'Sophia',
          initial: 'S',
          action: { label: 'Continue setup', tone: 'draft' },
        },
        {
          name: 'Tattoo',
          initial: 'T',
          action: { label: 'Designing the look', tone: 'busy', time: '0:31' },
        },
        {
          name: 'The Professor',
          image: '/art/eba-cast-the-professor.webp',
          role: 'Arthur Penhaligon',
          state: { label: '1 look waiting on you', tone: 'attention' },
        },
        { name: 'Felix', initial: 'F' },
      ]
        .slice(0, 4)
        .map((c, i) => (
          <CastCard {...Object.assign({ key: i, href: '#' }, c)} />
        ))}
    </div>
  );
}

PropsCastCardProps

namerequired
string
image
string
initial
string
role
string
meta
string
href
string
state
{ label: string; tone?: 'attention' | 'busy'; }
action
{ label: string; tone?: 'attention' | 'draft' | 'busy'; time?: string; }
CastCardExample.swiftiOS · coming soon
CastCardExample.ktAndroid · coming soon

Each token reads a role, and the role lands on a value in each theme. Change the role and every component that reads it follows.

Space and shape

cast-card-action-loader-size
icon-size-sm
16px
cast-card-active-scale
scale-press-lg
.98
cast-card-gap
gap-md
8px
cast-card-padding-top
inset-lg
16px
cast-card-padding-x
inset-md
12px
cast-card-padding-bottom
inset-md
12px
cast-card-radius
radius-lg
16px
cast-card-inset-ring-width
line-hairline
1px
cast-card-focus-outline-offset
focus-ring-offset
3px
cast-card-state-gap
gap-sm
6px
cast-card-state-height
icon-size-md
20px
cast-card-state-padding-x
inset-sm
8px
cast-card-state-radius
radius-full
9999px
cast-card-dot-size
state-dot-size
6px
cast-card-dot-radius
radius-full
9999px
cast-card-action-gap
gap-md
8px
cast-card-action-height
size-control-sm
36px
cast-card-action-margin-top
gap-xs
4px
cast-card-action-margin-x
its own value
calc(-1 * 12px)
cast-card-action-margin-bottom
its own value
calc(-1 * 12px)
cast-card-action-padding-x
inset-md
12px
cast-card-time-opacity
opacity-legible
0.8

Type

cast-card-font-family
font-sans
Funnel Sans
cast-card-role-font
text-eyebrow
700 11px/14px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
cast-card-role-letter-spacing
tracking-caps
.06em
cast-card-name-font
text-label
600 14px/20px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
cast-card-meta-font
text-small
500 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
cast-card-state-font
text-micro
700 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
cast-card-action-font
text-micro
700 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif

Motion

cast-card-press-duration
motion-fast
160ms
cast-card-press-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)
cast-card-active-duration
motion-instant
100ms
cast-card-duration
motion-fast
160ms
cast-card-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)

Checked automatically with axe-core 4.11.4 against WCAG 2.2 A and AA, on the live preview above, in light and dark, on 26 October 2026.

Result
No issues found, in light or in dark.
By design
With href it is a link that Tab reaches and Enter follows, named by name and described by its role, meta, state and action; without href all of these read as text. The portrait and the state dot are hidden, and a busy action's loader stays quiet inside the card.
Not tested
The automated check doesn't test keyboard use, focus order or what a screen reader says. The lines above are the design system's own account of them.