Follow / Following toggle. Fill→outline morph; unfollow needs no confirm.
Anatomy
Follow → tap → Following ┌──────────┐ ┌──────────────┐ │ bg-brand │ │ transparent │ │ on-brand │ │ outline·muted│ └──────────┘ └──────────────┘ filled morphs 200ms
Props
| Prop | Type | Default | Notes |
|---|---|---|---|
following | boolean | — | Controlled state. Flip optimistically at the call site; roll back on failure. |
onToggle | () => void | — | Fired on tap. |
className | string | — | Merged via cn. |
Motion
--motion-settle (200ms) morphs background / border / color between the two states. Label swaps at the state change (no separate crossfade in v1). Reduced-motion: neutralized globally.
A11y
- ·
aria-pressed={following}communicates toggle state to AT. - · Height 28px per the tide sm-button spec; pair with adequate spacing in dense rows.