Shimmer.tsx 1003 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // src/components/common/Shimmer.tsx
  2. "use client";
  3. import { HTMLAttributes } from "react";
  4. interface ShimmerProps extends HTMLAttributes<HTMLDivElement> {
  5. className?: string;
  6. rounded?: "sm" | "md" | "lg" | "full" | "none";
  7. width?: string | number;
  8. height?: string | number;
  9. }
  10. export function Shimmer({
  11. className,
  12. rounded = "md",
  13. width = "100%",
  14. height = "100%",
  15. ...props
  16. }: ShimmerProps) {
  17. const roundedClass = {
  18. sm: "rounded-sm",
  19. md: "rounded-md",
  20. lg: "rounded-lg",
  21. full: "rounded-full",
  22. none: "rounded-none",
  23. }[rounded];
  24. return (
  25. <div
  26. className={`
  27. relative overflow-hidden
  28. bg-gray-200 dark:bg-gray-700
  29. ${roundedClass}
  30. ${className}
  31. `}
  32. style={{ width, height }}
  33. {...props}
  34. >
  35. <div
  36. className={`
  37. absolute inset-0 -translate-x-full animate-[shimmer_2s_infinite]
  38. bg-gradient-to-r from-transparent via-white/30 to-transparent
  39. `}
  40. />
  41. </div>
  42. );
  43. }