Docs
Magical Button

Magical Button

An enchanting button with magical effects and animations

Installation

Copy and paste the following code into your project.

"use client"
 
import { useEffect, useState } from "react"
import confetti from "canvas-confetti"
import { Loader2, Sparkles } from "lucide-react"
 
import { Button } from "@/components/ui/button"
 
interface ComponentProps {
  buttonText: string
}
 
export function Test({
  buttonText = "Magical Button",
}: ComponentProps) {
  const [isHovered, setIsHovered] = useState(false)
  const [isLoading, setIsLoading] = useState(false)
 
  const handleClick = () => {
    setIsLoading(true)
    confetti({
      particleCount: 100,
      spread: 70,
      origin: { y: 0.6 },
    })
    setTimeout(() => {
      setIsLoading(false)
    }, 2000)
  }
 
  useEffect(() => {
    // Cleanup function to cancel any ongoing confetti animations
    return () => {
      confetti.reset()
    }
  }, [])
 
  return (
    <Button
      className="relative overflow-hidden bg-gradient-to-r from-purple-500 to-pink-500 text-white font-bold py-2 px-4 rounded-full transition-all duration-300 ease-in-out transform hover:scale-105 hover:shadow-lg"
      onMouseEnter={() => setIsHovered(true)}
      onMouseLeave={() => setIsHovered(false)}
      onClick={handleClick}
      disabled={isLoading}
    >
      <span className="relative z-10 flex items-center">
        {isLoading ? (
          <Loader2 className="mr-2 h-4 w-4 animate-spin" />
        ) : (
          <Sparkles className="mr-2 h-4 w-4" />
        )}
        {buttonText}
      </span>
      <span
        className={`absolute inset-0 bg-gradient-to-r from-blue-500 to-green-500 transition-opacity duration-300 ease-in-out ${
          isHovered ? "opacity-100" : "opacity-0"
        }`}
      />
      <span className="absolute inset-0 bg-white opacity-25 animate-pulse" />
    </Button>
  )
}

Update the import paths to match your project setup.

Usage

import { MagicalButton } from "@/components/ui/magical-button"
export default function MagicalButtonDemo() {
  return (
    <div className="w-full max-w-4xl">
      <div className="p-2">
        <h3 className="text-xl font-semibold">MagicalButton</h3>
      </div>
      <div className="min-h-[200px] p-4 flex flex-col justify-center items-center border border-dashed rounded-lg space-y-4">
        <MagicalButton>Cast Spell</MagicalButton>
        <MagicalButton variant="elemental">Elemental</MagicalButton>
        <MagicalButton variant="enchanted">Enchanted</MagicalButton>
        <MagicalButton disabled>No Magic</MagicalButton>
      </div>
    </div>
  )
}