diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index bc4f4bd..b345029 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,10 +1,25 @@ import Stars from "@/components/stars"; import React from "react"; +import FramerTextAnimate from "@/components/framer/framerTextAnimate"; + +const aboutMeText = + "I am a one-person studio with over 1.5 years of experience in organic 3D modeling and resin 3D printing. My work primarily focuses on themes of alien/cosmic horror, although I often strain towards classic themes of daemonic fiends and monsters from high fantasy. Most of conceptual work is done in Blender, while i tend to incorporate ZBRUSH for the rest of the process."; const page = () => { return (
+
+ + {aboutMeText} + +
); }; diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index bc4f4bd..fbdd8bd 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -5,6 +5,7 @@ const page = () => { return (
+
); }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 4ccd570..d1ec954 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,21 +1,50 @@ import Stars from "@/components/stars"; import Skeleton from "@/components/mesh/skeleton"; import Link from "next/link"; -import { Suspense } from "react"; +import FramerTextAnimate from "@/components/framer/framerTextAnimate"; + +const about = "ABOUT ME"; +const models = "MY MODELS"; +const contact = "CONTACT ME"; export default function Home() { return (
-
- - ABOUT ME + +
+ + + {about} + - MY MODELS + + {models} + - CONTACT + + {contact} +
diff --git a/src/components/framer/framerTextAnimate.tsx b/src/components/framer/framerTextAnimate.tsx new file mode 100644 index 0000000..bab058f --- /dev/null +++ b/src/components/framer/framerTextAnimate.tsx @@ -0,0 +1,48 @@ +"use client"; + +import { animate, motion, useMotionValue, useTransform } from "framer-motion"; +import { Special_Elite } from "next/font/google"; +import React, { useEffect } from "react"; + +const special_elite = Special_Elite({ weight: "400", subsets: ["latin"] }); + +type props = { + children: string; + styles: string; + duration: number; + delay: number; +}; + +const FramerTextAnimate = ({ children, styles, duration, delay }: props) => { + const count = useMotionValue(0); + const baseText = children as string; + + const rounded = useTransform(count, (latest) => Math.round(latest)); + const displayText = useTransform(rounded, (latest) => + baseText.slice(0, latest) + ); + + useEffect(() => { + // Delay the animation start + const delayTimeout = setTimeout(() => { + const controls = animate(count, baseText.length, { + duration: duration, + ease: "easeInOut", + }); + return () => controls.stop(); + }, delay * 1000); + + // Clear the timeout on unmount to prevent memory leaks + return () => clearTimeout(delayTimeout); + }, []); + + return ( + <> + + {displayText} + + + ); +}; + +export default FramerTextAnimate;