chore: add shine-border

This commit is contained in:
Li Xin 2025-04-29 15:47:39 +08:00
parent 0846b34e46
commit 8a11f07b82
2 changed files with 81 additions and 2 deletions

View File

@ -0,0 +1,63 @@
"use client";
import * as React from "react";
import { cn } from "~/lib/utils";
interface ShineBorderProps extends React.HTMLAttributes<HTMLDivElement> {
/**
* Width of the border in pixels
* @default 1
*/
borderWidth?: number;
/**
* Duration of the animation in seconds
* @default 14
*/
duration?: number;
/**
* Color of the border, can be a single color or an array of colors
* @default "#000000"
*/
shineColor?: string | string[];
}
/**
* Shine Border
*
* An animated background border effect component with configurable properties.
*/
export function ShineBorder({
borderWidth = 1,
duration = 14,
shineColor = "#000000",
className,
style,
...props
}: ShineBorderProps) {
return (
<div
style={
{
"--border-width": `${borderWidth}px`,
"--duration": `${duration}s`,
backgroundImage: `radial-gradient(transparent,transparent, ${
Array.isArray(shineColor) ? shineColor.join(",") : shineColor
},transparent,transparent)`,
backgroundSize: "300% 300%",
mask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,
WebkitMask: `linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)`,
WebkitMaskComposite: "xor",
maskComposite: "exclude",
padding: "var(--border-width)",
...style,
} as React.CSSProperties
}
className={cn(
"pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position] motion-safe:animate-shine",
className,
)}
{...props}
/>
);
}

View File

@ -93,7 +93,23 @@
transform: rotate(-5deg) scale(0.9);
}
}
}
--animate-shine:
shine var(--duration) infinite linear
;
@keyframes shine {
0% {
background-position:
0% 0%;
}
50% {
background-position:
100% 100%;
}
to {
background-position:
0% 0%;
}
}}
:root {
--radius: 0.625rem;