pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
at main 57 lines 2.1 kB view raw
1import { useEffect, useState } from "react"; 2import { useTranslation } from "react-i18next"; 3 4import { Icon, Icons } from "@/components/Icon"; 5 6export function ScrollToTopButton() { 7 const { t } = useTranslation(); 8 const [isVisible, setIsVisible] = useState(false); 9 10 const toggleVisibility = () => { 11 const scrolled = window.scrollY > 300; 12 setIsVisible(scrolled); 13 }; 14 15 useEffect(() => { 16 const handleScroll = () => { 17 const timeout = setTimeout(toggleVisibility, 100); 18 return () => clearTimeout(timeout); 19 }; 20 21 window.addEventListener("scroll", handleScroll); 22 return () => window.removeEventListener("scroll", handleScroll); 23 }, []); 24 25 const scrollToTop = () => { 26 window.scrollTo({ top: 0, behavior: "smooth" }); 27 }; 28 29 return ( 30 <div className="fixed bottom-9 md:bottom-4 transform -translate-x-1/2 z-50 left-12 md:left-1/2"> 31 <div 32 className={`absolute inset-0 mx-auto h-[50px] w-[200px] rounded-full blur-[50px] opacity-50 pointer-events-none z-0 ${ 33 isVisible ? "opacity-100 visible" : "opacity-0 invisible" 34 }`} 35 style={{ 36 backgroundImage: `linear-gradient(to right, rgba(var(--colors-buttons-purpleHover)), rgba(var(--colors-progress-filled)))`, 37 transition: "opacity 0.4s ease-in-out, transform 0.2s ease-in-out", 38 }} 39 /> 40 <button 41 type="button" 42 onClick={scrollToTop} 43 className={`relative backdrop-blur-sm flex items-center justify-center space-x-2 rounded-full px-3 py-3 md:py-2 text-lg font-semibold text-white bg-pill-background bg-opacity-80 hover:bg-pill-backgroundHover transition-opacity hover:scale-105 duration-500 ease-in-out ${ 44 isVisible ? "opacity-100 visible" : "opacity-0 invisible" 45 }`} 46 style={{ 47 transition: "opacity 0.4s ease-in-out, transform 0.2s ease-in-out", 48 }} 49 > 50 <Icon icon={Icons.CHEVRON_UP} className="text-2xl z-10" /> 51 <span className="z-10 hidden md:block"> 52 {t("discover.scrollToTop")} 53 </span> 54 </button> 55 </div> 56 ); 57}