modified: package.json modified: src/index.css modified: src/shared/components/Header.tsx new file: src/shared/components/animated/QnASection.css new file: src/shared/components/animated/TypingText.tsx modified: src/shared/components/backtotop/index.tsx modified: src/shared/providers/RouterProviderComponent.tsx modified: tailwind.config.cjsmain
							parent
							
								
									e7cc1d132d
								
							
						
					
					
						commit
						3cb558ad6a
					
				@ -0,0 +1,15 @@ | 
				
			|||||||
 | 
					/* .list-answer { | 
				
			||||||
 | 
					  animation: modalFadeIn ease 0.5s; | 
				
			||||||
 | 
					  background-color: red; | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					@keyframes modalFadeIn { | 
				
			||||||
 | 
					  0% { | 
				
			||||||
 | 
					    opacity: 0; | 
				
			||||||
 | 
					    transform: translateY(-150px); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  100% { | 
				
			||||||
 | 
					    opacity: 1; | 
				
			||||||
 | 
					    transform: translateY(0px); | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} */ | 
				
			||||||
@ -0,0 +1,28 @@ | 
				
			|||||||
 | 
					import React, { useEffect, useState } from "react"; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Props = { | 
				
			||||||
 | 
					  children: string; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					const TypingText = ({ children, ...props }: Props) => { | 
				
			||||||
 | 
					  const [text, setText] = useState(``); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    setText(children); | 
				
			||||||
 | 
					  }); | 
				
			||||||
 | 
					  const [typedText, setTypedText] = useState(""); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => { | 
				
			||||||
 | 
					    if (text.length === typedText.length) { | 
				
			||||||
 | 
					      return; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const timeoutId = setTimeout(() => { | 
				
			||||||
 | 
					      setTypedText(text.slice(0, typedText.length + 1)); | 
				
			||||||
 | 
					    }, 70); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return () => clearTimeout(timeoutId); | 
				
			||||||
 | 
					  }, [text, typedText]); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <h1> {typedText}</h1>; | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					export default TypingText; | 
				
			||||||
@ -1,39 +1,44 @@ | 
				
			|||||||
import { useState } from 'react' | 
					import { useState } from "react"; | 
				
			||||||
import robotLogo from '../../../assets/images/robot-coin1.png' | 
					import robotLogo from "../../../assets/images/robot-coin1.png"; | 
				
			||||||
import { MdOutlineKeyboardDoubleArrowUp } from 'react-icons/md' | 
					import { MdOutlineKeyboardDoubleArrowUp } from "react-icons/md"; | 
				
			||||||
 | 
					import { VscFoldUp } from "react-icons/vsc"; | 
				
			||||||
const BackToTopButton = () => { | 
					const BackToTopButton = () => { | 
				
			||||||
    const [isVisible, setIsVisible] = useState(false) | 
					  const [isVisible, setIsVisible] = useState(false); | 
				
			||||||
 | 
					
 | 
				
			||||||
  const toggleVisibility = () => { | 
					  const toggleVisibility = () => { | 
				
			||||||
    if (window.pageYOffset > 100) { | 
					    if (window.pageYOffset > 100) { | 
				
			||||||
            setIsVisible(true) | 
					      setIsVisible(true); | 
				
			||||||
    } else { | 
					    } else { | 
				
			||||||
            setIsVisible(false) | 
					      setIsVisible(false); | 
				
			||||||
        } | 
					 | 
				
			||||||
    } | 
					    } | 
				
			||||||
 | 
					  }; | 
				
			||||||
 | 
					
 | 
				
			||||||
  const scrollToTop = () => { | 
					  const scrollToTop = () => { | 
				
			||||||
    window.scrollTo({ | 
					    window.scrollTo({ | 
				
			||||||
      top: 0, | 
					      top: 0, | 
				
			||||||
            behavior: 'smooth', | 
					      behavior: "smooth", | 
				
			||||||
        }) | 
					    }); | 
				
			||||||
    } | 
					  }; | 
				
			||||||
 | 
					
 | 
				
			||||||
    window.addEventListener('scroll', toggleVisibility) | 
					  window.addEventListener("scroll", toggleVisibility); | 
				
			||||||
 | 
					
 | 
				
			||||||
  return ( | 
					  return ( | 
				
			||||||
    <div | 
					    <div | 
				
			||||||
      className={`bg-orange-500 back-to-top ${ | 
					      className={`bg-orange-500 back-to-top ${ | 
				
			||||||
                isVisible ? 'visible' : '' | 
					        isVisible ? "visible" : "" | 
				
			||||||
      } group relative m-12 flex justify-center`}
 | 
					      } group relative m-12 flex justify-center`}
 | 
				
			||||||
      onClick={scrollToTop} | 
					      onClick={scrollToTop} | 
				
			||||||
    > | 
					    > | 
				
			||||||
 | 
					      <VscFoldUp | 
				
			||||||
 | 
					        className="absolute top-[-18px] right-[50%] translate-x-[50%] opacity-70 w-4 h-4  transition-all rounded text-center" | 
				
			||||||
 | 
					        width={50} | 
				
			||||||
 | 
					      ></VscFoldUp> | 
				
			||||||
      <img src={robotLogo} className="rounded-full" alt="back" /> | 
					      <img src={robotLogo} className="rounded-full" alt="back" /> | 
				
			||||||
      <span className="absolute scale-0 transition-all rounded bg-orange-500 group-hover:scale-100 p-1 text-center"> | 
					      <span className="absolute scale-0 transition-all rounded bg-orange-500 group-hover:scale-100 p-1 text-center"> | 
				
			||||||
        👆 | 
					        👆 | 
				
			||||||
      </span> | 
					      </span> | 
				
			||||||
    </div> | 
					    </div> | 
				
			||||||
    ) | 
					  ); | 
				
			||||||
} | 
					}; | 
				
			||||||
 | 
					
 | 
				
			||||||
export default BackToTopButton | 
					export default BackToTopButton; | 
				
			||||||
 | 
				
			|||||||
					Loading…
					
					
				
		Reference in new issue