| import { useState, useEffect } from "react" |
| import { motion, AnimatePresence } from "framer-motion" |
| import { ChevronUp } from "lucide-react" |
| import "./ScrollToTop.css" |
|
|
| const ScrollToTop = () => { |
| const [isVisible, setIsVisible] = useState(false) |
|
|
| useEffect(() => { |
| const toggleVisibility = () => { |
| if (window.pageYOffset > 300) { |
| setIsVisible(true) |
| } else { |
| setIsVisible(false) |
| } |
| } |
|
|
| window.addEventListener("scroll", toggleVisibility) |
| return () => window.removeEventListener("scroll", toggleVisibility) |
| }, []) |
|
|
| const scrollToTop = () => { |
| window.scrollTo({ |
| top: 0, |
| behavior: "smooth", |
| }) |
| } |
|
|
| return ( |
| <AnimatePresence> |
| {isVisible && ( |
| <motion.button |
| className="scroll-to-top-Premium" |
| onClick={scrollToTop} |
| initial={{ opacity: 0, scale: 0 }} |
| animate={{ opacity: 1, scale: 1 }} |
| exit={{ opacity: 0, scale: 0 }} |
| whileHover={{ scale: 1.1 }} |
| whileTap={{ scale: 0.9 }} |
| transition={{ duration: 0.3 }} |
| > |
| <div className="scroll-icon-container"> |
| <ChevronUp size={24} /> |
| <div className="scroll-glow"></div> |
| </div> |
| <div className="scroll-ripple"></div> |
| </motion.button> |
| )} |
| </AnimatePresence> |
| ) |
| } |
|
|
| export default ScrollToTop |