diff --git a/package-lock.json b/package-lock.json index b9f48bf..6ac81e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,7 +61,6 @@ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1611,7 +1610,6 @@ "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1653,7 +1651,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1776,7 +1773,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", @@ -2130,7 +2126,6 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3282,7 +3277,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -3349,7 +3343,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -3359,7 +3352,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -3694,7 +3686,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz", "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", diff --git a/src/assets/ScrollToTop.png b/src/assets/ScrollToTop.png new file mode 100644 index 0000000..5bbe6de Binary files /dev/null and b/src/assets/ScrollToTop.png differ diff --git a/src/components/ScrollToTop.jsx b/src/components/ScrollToTop.jsx new file mode 100644 index 0000000..1514c81 --- /dev/null +++ b/src/components/ScrollToTop.jsx @@ -0,0 +1,36 @@ +// components/ScrollToTopButton.tsx +import { useEffect, useState } from "react"; +import image from "../assets/ScrollToTop.png"; + +const ScrollToTopButton = () => { + const [isVisible, setIsVisible] = useState(false); + + useEffect(() => { + const toggleVisibility = () => { + setIsVisible(window.scrollY > 300); + }; + + window.addEventListener("scroll", toggleVisibility); + return () => window.removeEventListener("scroll", toggleVisibility); + }, []); + + const scrollToTop = () => { + window.scrollTo({ top: 0, behavior: "smooth" }); + }; + + if (!isVisible) return null; + + return ( + // Scroll to top button + + ); +}; + +export default ScrollToTopButton; diff --git a/src/components/ui/Hero.jsx b/src/components/ui/Hero.jsx index 4e6bb6f..ac0a1b7 100644 --- a/src/components/ui/Hero.jsx +++ b/src/components/ui/Hero.jsx @@ -1,6 +1,7 @@ import { motion } from "framer-motion"; import { useState } from "react"; import HeroAnimation from "../animations/HeroAnimation"; +import ScrollToTopButton from "../ScrollToTop"; import { useNavigate } from "react-router-dom"; function Hero() { @@ -33,6 +34,9 @@ function Hero() { return (
+ {/* scroll to top button */} + + {/* top animation */} diff --git a/src/pages/AboutPage.jsx b/src/pages/AboutPage.jsx index 53ce5fe..9b37da9 100644 --- a/src/pages/AboutPage.jsx +++ b/src/pages/AboutPage.jsx @@ -10,6 +10,7 @@ import { FiHeart, } from "react-icons/fi"; import Footer from "../components/Footer"; +import ScrollToTopButton from "../components/ScrollToTop" //? Scroll to top on mount const AboutPage = () => { @@ -63,6 +64,9 @@ const AboutPage = () => { return (
+ {/* Scroll to Top Button */} + + {/* Hero Section */}
{ useEffect(() => { @@ -153,6 +154,8 @@ const FeaturesPage = () => { return (
+ {/* Scroll to Top Button */} + {/* Hero Section */}
{/* Background decoration */}