diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9059b0e9..dbc2ad47 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -10,6 +10,7 @@ import { AnimatedBackground } from '@/components/AnimatedBackground'; import MaintenanceBanner from '@/components/layout/MaintenanceBanner'; import BackgroundMesh from '@/components/layout/BackgroundMesh'; import PageWrapper from '@/components/layout/PageWrapper'; +import ScrollToTop from '@/components/layout/ScrollToTop'; import { ThemeProvider } from "@/components/providers/theme-provider"; import "./globals.css"; @@ -115,6 +116,7 @@ export default function RootLayout({ {children} + diff --git a/src/components/layout/ScrollToTop.tsx b/src/components/layout/ScrollToTop.tsx new file mode 100644 index 00000000..1d7bf961 --- /dev/null +++ b/src/components/layout/ScrollToTop.tsx @@ -0,0 +1,49 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { ArrowUp } from "lucide-react"; +import { motion, AnimatePresence } from "framer-motion"; + +export default function ScrollToTop() { + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + const toggleVisibility = () => { + if (window.scrollY > 300) { + setIsVisible(true); + } else { + setIsVisible(false); + } + }; + + window.addEventListener("scroll", toggleVisibility); + + return () => { + window.removeEventListener("scroll", toggleVisibility); + }; + }, []); + + const scrollToTop = () => { + window.scrollTo({ + top: 0, + behavior: "smooth", + }); + }; + + return ( + + {isVisible && ( + + + + )} + + ); +}