Sakuga Back to Sakuga
Theme
Sound
Jump to a component

Core · Actions

Chip

Chip filters a feed by kind: All, Episodes, Shorts, Manga, Following.

@anicanon/sakuga/uiv1.0Used onWeb · iOS · Android

Live, from @anicanon/sakuga 2.0.0

Sakuga for iOS and Android is coming

iOS

Coming soon

Chip 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

Chip 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
Narrowing what a feed or a list shows, one kind at a time; with variant="soft", picking several words from a set, such as traits.
Not for

Guidelines

  • Use a row of chips inside Chip.Group (named by label); exactly one is selected.
  • Chips filter what is shown. They never navigate and never run an action; that is Button.
  • 44px tall on every platform so they are easy to hit. A soft chip (multi-select) draws at 32px and is still a 44px target: its hit area reaches above and below it.
  • A chip sinks on press and its fill changes on motion-fast.
  • With sound on, a press plays the press sound (README · Sound).
  • On phones pass scroll to Chip.Group: one row that scrolls sideways instead of wrapping.

Icon and soft

icon adds a leading glyph in the accent. removable is a choice already made that a press takes away (a filter): it draws chosen, onClick removes it, and it is named "Remove" and its words (removeLabel changes the verb). A soft chip with no icon is padded alike on both sides. In a Chip.Group, chips given keys arrive and leave by their motion: one added after the group first draws rises in, and one removed (a removable chip pressed) keeps its place while it fades out. variant="soft" is for multi-select sets such as traits: selected chips take chip-soft-selected-bg with an accent edge instead of the solid fill.

ChipExample.jsxReact
import { useState } from 'react';
import { Chip } from '@anicanon/sakuga/ui';

export default function ChipExample() {
  const [value, setValue] = useState('All');
  return (
    <Chip.Group label="What to show">
      {['All', 'Episodes', 'Shorts', 'Manga', 'Following'].map((c) => (
        <Chip key={c} selected={value === c} onClick={() => setValue(c)}>
          {c}
        </Chip>
      ))}
    </Chip.Group>
  );
}

PropsChipProps

childrenrequired
ReactNode
selected
boolean
icon
IconName
A leading glyph, in the accent.
variant
'soft'
soft: one of a multi-select set, such as traits; chosen ones take a soft fill with an accent edge.
removable
boolean
A choice already made that a press takes away: drawn chosen, named "Remove …" (removeLabel), never a pressed toggle.
removeLabel
stringDefault 'Remove'
className
string

Chip.Group

Chip.Group names a row of chips.

labelrequired
string
childrenrequired
ReactNode
scroll
boolean
One row that scrolls sideways (phones).
className
string

An IconName is any of the names Icon lists.

ChipExample.swiftiOS · coming soon
ChipExample.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.

Colour

chip-bgChip: idle fill.
bg-fill-subtleshade-a06rgba(11,10,16,0.06)
bg-fill-subtlewhite-a08rgba(255,255,255,0.08)
chip-fgChip: idle name.
text-primaryneutral-925#0b0a10
text-primaryneutral-0#ffffff
chip-active-bgChip: selected fill.
action-primaryneutral-925#0b0a10
action-primaryneutral-0#ffffff
chip-active-fgChip: selected name.
text-inverseneutral-0#ffffff
text-inverseneutral-925#0b0a10
chip-iconChip: leading icon.
accentcamellia-600#c2335f
accentcamellia-400#f4779f
chip-soft-selected-bgChip, soft: selected fill (multi-select).
accent-subtlecamellia-600-a10rgba(194,51,95,0.1)
accent-subtlecamellia-400-a14rgba(244,119,159,0.14)
chip-soft-selected-borderChip, soft: selected edge.
accentcamellia-600#c2335f
accentcamellia-400#f4779f

Space and shape

chip-height
size-target
44px
chip-padding-x
inset-lg
16px
chip-radius
radius-full
9999px
chip-active-scale
scale-press-sm
.94
chips-gap
gap-md
8px
chip-gap
gap-sm
6px
chip-soft-height
its own value
32px
chip-soft-padding-right
inset-md
12px
chip-soft-padding-left
inset-sm
8px
chip-soft-pressed-inset-ring-width
line-strong
2px
chip-soft-icon-size
icon-size-sm
16px
chip-icon-size
icon-size-sm
16px
chip-forced-edge-width
line-hairline
1px
chip-soft-target-size
size-target
44px
chip-soft-padding-plain
inset-md
12px

Type

chip-font
text-label
600 14px/20px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
chip-soft-font-size
text-caption-size
13px
Aa
chip-soft-line-height
text-caption-line-height
18px

Motion

chip-duration
motion-fast
160ms
chip-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)
chip-active-duration
motion-instant
100ms
chip-arrive-animation
its own value
sk-emerge 240ms cubic-bezier(0, 0, 0, 1)
chip-leave-animation
its own value
sk-recede 160ms cubic-bezier(0.3, 0, 1, 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
Tab focuses each chip; Enter or Space runs onClick. A screen reader hears the group named by Chip.Group's label, then each chip as a button, "pressed" when selected (a removable one is a plain button, "Remove Smith"); the icon is hidden. When a keyed chip leaves the group with focus on it, focus goes to the chip now in its place, else the last one. In forced colours each chip keeps an edge, and a selected one takes Highlight. A soft chip is a 44px target, though it draws at 32px.
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.