Gradient Border

Pro

Rotating conic gradient border using @property CSS animation. Works on any element.

Borders · primitive · intermediate · css · zero dependencies

gradient-border Borders·preview
Borderscss only

Animated in one wrapper

The border is a single conic gradient rotating behind a one-pixel inset — no SVG, no extra element to position.

ember 6s · bone 2.5s · radius 14 / 8 / 100

Gradient Border

Rotating conic gradient border using @property CSS animation. Works on any element.

Pro component

Join the waitlist to unlock all 14 components at launch.

Join the Pro waitlistor join free for 5 components at launch
Use it for
  • highlighted pricing plan border
  • featured product card outline
  • call-to-action button frame
  • most-popular plan badge border
Props
Prop Type Default Description
children React.ReactNode Content rendered inside the bordered container.
className string Additional classes for the inner content container.
containerClassName string Additional classes for the outer gradient container.
colors string[] ["#a78bfa", "#818cf8", "#c084fc", "#f472b6", "#a78bfa"] Conic-gradient color stops — first and last should match for a seamless loop.
borderWidth number 1 Thickness of the visible border in pixels.
duration number 4 Full rotation time in seconds.
borderRadius string "12px" Corner radius applied to both the outer border and inner content.
FAQ
Does Gradient Border work with Next.js App Router?

Yes. It's a "use client" React component. Note that the @property rule needs a browser that supports the CSS @property API, which all evergreen browsers do.

Are there any dependencies to install?

None. It's pure CSS — a @property-registered custom property animated with @keyframes.

Is it responsive?

Yes. It wraps its children with padding equal to borderWidth, so it resizes with whatever you put inside it; borderRadius can be adjusted per breakpoint via className overrides.

Does it respect prefers-reduced-motion?

Not automatically. The border rotates continuously via a CSS keyframe animation with no reduced-motion media query built in. Wrap the animation in your own @media (prefers-reduced-motion: reduce) block if you need to freeze it.