Theme
Sound
Jump to a component
Core · Content
TagList
TagList keeps words as tags: a character's visual vibe, the garments read from a photo.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Coming soon
TagList 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
TagList 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
- Words kept as tags, each one removable and restorable: a character's visual vibe, the garments read from a photo.
- Not for
- Picking words from a set, such as traitsChip
- A label over artworkBadge
- Who or what a panel holds, with its pictureMentionChip
- A free sentence someone typesTextField
Guidelines
- A tag added after the list first draws rises in; a removed one keeps its place while it fades out, and focus moves to the tag that takes its place.
- Each tag carries its own button:
removeLabelnames what it does ("Leave out Silver chain"). A tag that isoffreads struck through and its button puts it back (restoreLabel). - With a
placeholderthe tags sit in a field you type more into. - Short words, lower case unless a name.
onRemove(label, index)andonRestore(label, index)make the tag buttons work;onAdd(words)takes what is typed in the box when Enter is pressed.
import { TagList } from '@anicanon/sakuga/ui';
export default function TagListExample() {
return (
<>
<TagList
label="Visual vibe"
items={['fire', 'red and black', 'street hero']}
placeholder="Add a vibe…"
/>
<TagList
removeLabel="Leave out"
restoreLabel="Add back"
items={[
{ label: 'Grey plaid overshirt' },
{ label: 'Black crew-neck tee' },
{ label: 'Canvas tote bag', off: true },
]}
/>
</>
);
}PropsTagListProps
itemsrequired(string | { label: string; off?: boolean; })[]placeholderstringlabelstringinputLabelstringremoveLabelstringrestoreLabelstringclassNamestringonRemove(label: string, index: number) => voidonRestore(label: string, index: number) => voidonAdd(words: string) => voidEnter in the box hands its words over and empties it.
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
tag-icon-sizeicon-size-xs14px
tags-gapgap-sm6px
tags-input-min-heightsize-target44px
tags-input-padding-yinset-sm8px
tags-input-padding-xinset-md12px
tags-input-radiusradius-sm8px
tags-input-inset-ring-widthline-hairline1px
tag-gapgap-2xs2px
tag-heightits own value
28px
tag-padding-rightinset-xs4px
tag-padding-leftinset-md12px
tag-radiusradius-full9999px
tag-x-active-scalescale-press-sm.94
tag-x-sizeicon-size-md20px
tag-x-radiusradius-full9999px
tag-x-focus-outline-offsetfocus-ring-offset3px
tags-entry-min-widthits own value
120px
tags-entry-heightits own value
24px
tags-entry-padding-xinset-xs4px
tags-input-focus-inset-ring-widthline-strong2px
tags-forced-edge-widthline-hairline1px
tags-forced-focus-widthline-strong2px
tag-x-target-sizespace-624px
Type
tag-fonttext-caption-strong600 13px/18px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
tags-entry-fonttext-caption500 13px/18px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
Motion
tag-x-press-durationmotion-fast160ms
tag-x-press-easingease-standardcubic-bezier(0.2, 0, 0, 1)
tag-x-active-durationmotion-instant100ms
tag-x-durationmotion-fast160ms
tag-arrive-animationits own value
sk-emerge 240ms cubic-bezier(0, 0, 0, 1)
tag-leave-animationits 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
- A group named by
label: Tab reaches each tag's button ("Remove Gentle", or "Add back Gentle" once it is out;removeLabelandrestoreLabelchange the verb), which runsonRemoveoronRestore, and focus moves to the tag that takes its place; the change is said ("Gentle removed", "Gentle added back"). Withplaceholder, a text input named byinputLabelor the placeholder shows a focus ring and hands its words toonAddon Enter. - 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.