Theme
Sound
Jump to a component
AniCanonKit · Writing
ProposalCard
ProposalCard is one event, change or link found in writing, waiting for the person.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Web only
ProposalCard is made for the web, and isn’t part of Sakuga for iOS yet.
Android
Web only
ProposalCard is made for the web, and isn’t part of Sakuga for Android yet.
- Use it for
- One event, change or link found in writing, waiting for the person beside the words it came from: stated, inferred, or a conflict with its Ask Maki.
Guidelines
stated: said in the text; accepted by default.inferred: a reading between the lines; dashed and never accepted for you.conflict: breaks the story; carries its action (Ask Maki).accepteddrives the toggle.
onAccept(accepted)makes the toggle work; it is called with the new state.
import { ProposalCard } from '@anicanon/sakuga/anicanonkit';
export default function ProposalCardExample() {
return (
<>
<ProposalCard
title="Toddy wires a second watch"
note="New event · stated"
accepted
visual={{ kind: 'event', type: 'clue' }}
/>
<ProposalCard
kind="inferred"
title="Lisa · + Flaw"
note="From “the wind answers too hard”"
accepted={false}
/>
</>
);
}PropsProposalCardProps
titlerequiredstringnotestringkind'stated' | 'inferred' | 'conflict'Default 'stated'acceptedbooleanvisualVisualonAccept(accepted: boolean) => voidThe Accept toggle: called with the new state.
actionReactNodeThe action (as slot="action").
childrenReactNodeTypes
Visual is one of 9 names.
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
proposal-bgProposalCard: a stated proposal.bg-surfaceneutral-0#ffffffbg-surfaceneutral-900#111117proposal-borderProposalCard: outline.border-hairlineshade-a08rgba(11,10,16,0.08)border-hairlinewhite-a06rgba(255,255,255,0.06)proposal-inferred-borderProposalCard: dashed outline of an inferred proposal.border-placeholdershade-a24rgba(11,10,16,0.24)border-placeholderwhite-a22rgba(255,255,255,0.22)proposal-conflict-borderProposalCard: a conflict.accentcamellia-600#c2335faccentcamellia-400#f4779fproposal-titleProposalCard: title.text-primaryneutral-925#0b0a10text-primaryneutral-0#ffffffproposal-noteProposalCard: note.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7Space and shape
proposal-gapgap-xs4px
proposal-padding-yinset-sm8px
proposal-padding-xinset-sm8px
proposal-radiusradius-sm8px
proposal-inset-ring-widthline-hairline1px
proposal-inferred-outline-widthline-strong2px
proposal-inferred-outline-offsetits own value
calc(-1 * 2px)
proposal-conflict-inset-ring-widthline-strong2px
proposal-head-gapgap-md8px
proposal-head-entity-visual-slot-widthits own value
16px
proposal-head-entity-visual-avatar-sizeits own value
20px
Type
proposal-head-b-fonttext-small-strong600 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
proposal-note-fonttext-small500 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
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
- Read as text: the title, "conflict" on a conflict, the note and "Inferred" on an inferred find, with the picture hidden; the
actionslot takes focus. Withacceptedset, Tab reaches the "Accept" toggle button, "pressed" when accepted, which runsonAccept. - 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.