All components
Shimmer Button
buttonsA button with an animated shimmer that sweeps around its border. Pure CSS.
responsive · 350px
Install
Same command in any shadcn project — React (Vite/CRA), Next.js, Remix, Astro, and more:
$
npx shadcn@latest add https://your-domain/r/shimmer-button.jsonUsage
import { ShimmerButton } from "@/registry/buttons/shimmer-button";
export default function ShimmerButtonDemo() {
return (
<ShimmerButton className="shadow-2xl">
<span className="text-sm font-medium text-white">Shimmer Button</span>
</ShimmerButton>
);
}Component source
"use client";
import * as React from "react";
import { cn } from "@/lib/utils";
export interface ShimmerButtonProps
extends React.ComponentPropsWithoutRef<"button"> {
shimmerColor?: string;
shimmerSize?: string;
borderRadius?: string;
shimmerDuration?: string;
background?: string;
}
/**
* A button with an animated shimmer that sweeps around its border.
* Pure CSS — no JS animation loop.
*/
export const ShimmerButton = React.forwardRef<
HTMLButtonElement,
ShimmerButtonProps
>(
(
{
shimmerColor = "#ffffff",
shimmerSize = "0.05em",
shimmerDuration = "3s",
borderRadius = "100px",
background = "rgba(0, 0, 0, 1)",
className,
children,
...props
},
ref,
) => {
return (
<button
ref={ref}
style={
{
"--spread": "90deg",
"--shimmer-color": shimmerColor,
"--radius": borderRadius,
"--speed": shimmerDuration,
"--cut": shimmerSize,
"--bg": background,
} as React.CSSProperties
}
className={cn(
"group relative z-0 flex cursor-pointer items-center justify-center overflow-hidden whitespace-nowrap border border-white/10 px-6 py-3 text-sm font-medium text-white [background:var(--bg)] [border-radius:var(--radius)]",
"transform-gpu transition-transform duration-300 ease-in-out active:translate-y-px",
className,
)}
{...props}
>
<div className="-z-30 blur-[2px] absolute inset-0 overflow-visible [container-type:size]">
<div className="absolute inset-0 h-[100cqh] animate-shimmer-slide [aspect-ratio:1]">
<div className="absolute -inset-full w-auto rotate-0 animate-spin-around [background:conic-gradient(from_calc(270deg-(var(--spread)*0.5)),transparent_0,var(--shimmer-color)_var(--spread),transparent_var(--spread))] [translate:0_0]" />
</div>
</div>
{children}
<div className="absolute size-full inset-0 [border-radius:var(--radius)] shadow-[inset_0_-8px_10px_#ffffff1f] transform-gpu transition-all duration-300 ease-in-out group-hover:shadow-[inset_0_-6px_10px_#ffffff3f] group-active:shadow-[inset_0_-10px_10px_#ffffff3f]" />
<div className="absolute -z-20 [background:var(--bg)] [border-radius:var(--radius)] [inset:var(--cut)]" />
</button>
);
},
);
ShimmerButton.displayName = "ShimmerButton";