TimerButton
A timer button is a button with a countdown timer that will automatically activate after a given amount of time. It is used for auto-advancing workflows, timed confirmations, or undo-with-timeout patterns.
This headless component uses a <button> element with a visible countdown timer, providing both manual click activation and automatic timer-based activation.
Implementation Notes
- Uses
<button>element for semantic button behavior - Countdown timer shown via
aria-live="polite"region aria-labelincludes remaining time for screen readers- Auto-activates when countdown reaches zero
- User can click to activate immediately before timer expires
- Timer can be cancelled by disabling or unmounting the component
Props
duration: number (required) -- countdown duration in secondslabel: string (required) -- accessible label describing the actiondisabled: boolean (default: false) -- whether the button is disabledonclick: callback (optional) -- handler called when activated (manually or by timer)children: slot -- button content...restProps: Any additional HTML attributes
Usage
<TimerButton duration={10} label="Undo delete" onclick={handleUndo}>
Undo deletion (10s remaining)
</TimerButton>
<TimerButton duration={5} label="Auto-advance to next step" onclick={handleNext}>
Continuing to next step in 5s...
</TimerButton>
<TimerButton duration={15} label="Auto-submit form" onclick={handleSubmit}>
Form will submit automatically in 15s
</TimerButton>
Keyboard Interactions
- Tab: Focus the button
- Enter: Activate the button immediately
- Space: Activate the button immediately
- Escape: Cancel the timer (optional behavior)
ARIA
- Implicit
buttonrole from<button>element aria-label-- describes the action and remaining timearia-live="polite"region for countdown announcements
When to Use
- Use for a button that automatically triggers after a countdown, such as auto-redirect or auto-submit after review.
- Use for undo-with-timeout patterns where an action auto-confirms after a delay.
- Use for auto-advancing wizards or slideshow controls.
- Use when users should have the option to click immediately or wait for the timer.
When Not to Use
- Do not use for countdown display only -- use Timer instead.
- Do not use for immediate actions without a delay -- use Button instead.
- Do not use for critical destructive actions without an undo mechanism -- use SliderButton or AlertDialog instead.
Headless
This component provides a <button> element with countdown timer logic and ARIA live region for accessible time announcements, with zero visual styling. The consumer is responsible for all CSS including countdown display, progress indicator, timer animation, and button appearance.
Styles
The consumer provides all CSS styling. The component renders with a .timer-button class for targeting. No default styles are included -- this is a fully headless component.
Testing
- Verify the component renders a
<button>element with classtimer-button - Verify
aria-labelis applied - Verify countdown timer activates the button at zero
- Verify manual click activates the button immediately
- Verify keyboard interactions work correctly
- Verify pass-through attributes are applied
Advice
- Designers: Show a visual countdown (progress bar, seconds display) so users know how much time remains. Provide a way to cancel or extend the timer.
- Developers: Update
aria-labelwith remaining time for screen reader users. Clean up timer intervals when the component unmounts or is cancelled.
Related components
button— a generic clickable button elementtimer— a countdown or elapsed time display