Action button
A compact button for frequent toolbar actions.
import { ActionButton } from "@/forma/arc/action-button/action-button";Base
In FORMA
- Liegt in
kit/arc/action-buttonund ist über@/forma/arc/action-button/action-buttonerreichbar. - Farbe, Ecken, Höhen, Abstände, Tiefe, Schrift und Tempo kommen aus der Richtung (
core/arc-bridge.ts); Arc behält Verhalten, Tastatur und Federn.
When to use
- A single async commit such as Save, Publish, or Submit where the result should appear on the button.
- Call-to-action buttons where a trailing arrow invites the next step.
- Flows where the button should reset to idle on its own after success, via resetAfterMs.
When not to use
- Use button with loading for plain form submits that do not need a success state.
- Use action-swap when the control toggles between lasting states.
- Use hold-to-confirm when the action is destructive and needs a deliberate press.
Usage
import { ActionButton } from "@/forma/arc/action-button/action-button";
export function PublishButton() {
return (
<ActionButton
label="Publish"
pendingLabel="Publishing"
successLabel="Published"
onAction={publish}
onActionError={error => toast.error(String(error))}
/>
);
}API reference
ActionButton
A call-to-action button with a trailing arrow that runs an async action and morphs through pending and success.
| Prop | Type | Default | Description |
|---|---|---|---|
label (required) | string | – | Idle label and accessible name. |
onAction (required) | () => void | Promise<void> | – | Runs on press. The pending state lasts until the promise settles. |
pendingLabel | string | "Saving" | Label while onAction runs. |
successLabel | string | "Saved" | Label after onAction resolves. |
resetAfterMs | number | 2400 | Delay before returning to idle after success. 0 keeps the success state. |
onActionError | (error: unknown) => void | – | Called when onAction rejects; the button returns to idle. |
...props | ButtonHTMLAttributes<HTMLButtonElement> | – | Forwarded to the button, except onClick. |
Keyboard interactions
| Keys | Action |
|---|---|
| Enter / Space | Runs the action. |
Accessibility
- Native button; the visible label is aria-hidden and a visually hidden copy of label names it.
- Pending sets aria-busy and aria-disabled instead of disabled, so keyboard focus stays through the save.
- A role="status" region announces the pending and success labels.
Motion
- Changed letters rise from a soft blur while the width springs to fit; the arrow leaves forward and a check draws itself in.
- Presses scale to about 0.97 on a snappy spring.
- Reduced motion drops the press scale, width spring, and stroke draw, and swaps with an instant fade.
Responsive behavior
- Width springs to fit pending and success labels, so keep them close in length inside tight toolbars.
- Hover shadow applies only on hover-capable fine pointers; touch gets the press scale.
Performance
- Every letter is a motion span with layout position animation plus a small blur; fine for a few buttons, not for dense tables.
- A ResizeObserver drives the width spring.
Notes for AI
- Use for a single async commit (save, publish, submit) where the result should show on the button itself.
- Prefer button with loading for plain forms, and action-swap when the control toggles between lasting states.
- Return the real promise from onAction; handle errors in onActionError since the button just resets.
Guidance for AI tools
Action button: A compact button for frequent toolbar actions. Follow the declared prop types and do not invent props. Keep keyboard access, reduced motion support, and both light and dark themes intact when adapting it.
Full library index: https://uiarc.dev/llms.txt
Komponente und Text: Arc UI (MIT, uiarc.dev), angepasst für FORMA.