Form

Animated Button

Storybook
A Button with a continuous pulse, for the one call to action on a screen that has to be found without being read.

Loading playground

Overview

Available since v2.12.0 in @laioutr-core/ui-kit

AnimatedButton is a Button that pulses — scaling and glowing on a two-second loop — so it is found on a busy or media-heavy screen without the visitor having to read the screen first. It takes every Button prop and passes it straight through, so it is a drop-in wherever a button already works:

LAnimatedButton
<LAnimatedButton>Shop the look</LAnimatedButton>

It defaults to the secondary-white variant, the one designed to sit over media.

Motion that never stops is a strong signal, and it competes with every other thing on the screen for the same attention. One per screen is the intent.

Key Business & UX Benefits

  • Draws the eye to a single high-priority action on media-heavy screens, where a static button competes with the imagery behind it.
  • Drop-in for Button, so an existing call to action gains the treatment without a markup change.
  • Pauses itself on hover and under reduced motion, so the pulse never fights a visitor who has already found the button or asked for less movement.

When it pauses

The pulse stops on its own in the cases where it would work against the visitor:

ConditionWhy
Pointer over the buttonThe visitor has found it; continuing to animate makes it harder to hit
prefers-reduced-motion: reduceContinuous motion is exactly what that setting asks to suppress
paused propYour own reason — a pending submit, a disabled form, an off-screen section

paused is additive to the other two, so setting it false does not override a reduced-motion preference.

<template>
  <AnimatedButton :paused="isSubmitting">Reserve a seat</AnimatedButton>
</template>

Tuning the pulse

The timing, the three scale steps, and the three glow steps are custom properties on the root, so a theme can retune the pulse without redefining the keyframes:

.my-cta {
  --animated-button-duration: 3s;
  --animated-button-keyframe-2-scale: 1.1;
  --animated-button-keyframe-2-glow: 0 0 24px rgb(0 0 0 / 0.3);
}

Feature List

  • Continuous scale-and-glow pulse on a two-second loop, for the one call to action on a screen that has to be found before it is read
  • Accepts every `Button` prop and forwards it, so it is a drop-in replacement
  • Defaults to the `secondary-white` variant, designed to sit over media
  • Pauses on hover, under `prefers-reduced-motion`, and via the `paused` prop
  • Duration, timing, and the three scale and glow steps are custom properties, so a theme retunes the pulse without redefining keyframes

API Reference

PropDefaultType
pausedfalseboolean

Suspend the pulse. Additive to the automatic hover pause and reduced-motion suppression.

disabledboolean
size
variantsecondary-white
hrefstring
targetstring
iconLeft
iconRight
loadingboolean
buttonType"submit" | "button"
spinnerType"row" | "round"

Loading spinner shape. Defaults to 'row' for text buttons; IconButton overrides to 'round' to fit the square footprint.

blockboolean

When true, the button stretches to its container's width (display: flex; width: 100%). Default is false — the button hugs its content via display: inline-flex.

SlotType
default{}

Changelog

New component. A Button that pulses on a two-second loop, for the single call to action on a media-heavy screen that has to be found before it is read. Takes every Button prop and forwards it. The pulse pauses on hover, under prefers-reduced-motion, and via the paused prop. See Animated Button.

Copyright © 2026 Laioutr GmbH