skalara-core/components/magicui/shimmer-button.tsx
Christopher Arraya 788b952127 initial commit
2023-11-18 21:09:24 -05:00

81 lines
2.4 KiB
TypeScript

import { cn } from "@/lib/utils";
import React, { CSSProperties } from "react";
export interface ShimmerButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
shimmerColor?: string;
shimmerSize?: string;
borderRadius?: string;
shimmerDuration?: string;
background?: string;
className?: string;
children?: React.ReactNode;
}
const ShimmerButton = React.forwardRef<HTMLButtonElement, ShimmerButtonProps>(
(
{
shimmerColor = "#ffffff",
shimmerSize = "0.1em",
shimmerDuration = "1.5s",
borderRadius = "100px",
background = "rgba(0, 0, 0)",
className,
children,
...props
},
ref
) => {
return (
<button
style={
{
"--spread": "90deg",
"--shimmer-color": shimmerColor,
"--radius": borderRadius,
"--speed": shimmerDuration,
"--cut": shimmerSize,
"--bg": background,
} as 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-white [background:var(--bg)] [border-radius:var(--radius)] dark:text-black",
className
)}
ref={ref}
{...props}
>
{/* spark container */}
<div
className={cn(
"-z-30 blur-sm",
"absolute inset-0 overflow-visible [container-type:size]"
)}
>
{/* spark */}
<div className="absolute inset-0 h-[100cqh] animate-slide [aspect-ratio:1] [border-radius:0] [mask:none]">
{/* spark before */}
<div className="absolute inset-[-100%] w-auto rotate-0 animate-spin [background:conic-gradient(from_calc(270deg-(var(--spread)*0.5)),transparent_0,hsl(0_0%_100%/1)_var(--spread),transparent_var(--spread))] [translate:0_0]" />
</div>
</div>
{children}
{/* Highlight */}
<div className="absolute bottom-0 left-1/2 h-2/5 w-3/4 -translate-x-1/2 rounded-full bg-white/10 opacity-50 blur-lg transition-all duration-300 ease-in-out group-hover:h-3/5 group-hover:opacity-100" />
{/* backdrop */}
<div
className={cn(
"absolute -z-20 [background:var(--bg)] [border-radius:var(--radius)] [inset:var(--cut)]"
)}
/>
</button>
);
}
);
ShimmerButton.displayName = "ShimmerButton";
export default ShimmerButton;