From 611d51765db2db468d2c6820714a80ce2e7e6e94 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Wed, 21 Jan 2026 12:30:49 +0100 Subject: [PATCH] Animated about --- src/app/about/page.tsx | 199 ++++++++++++++++++++++++----------------- src/lib/animations.ts | 94 +++++++++++++++++-- 2 files changed, 203 insertions(+), 90 deletions(-) diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index dcb26c9..237813a 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Github, Linkedin, @@ -21,6 +23,16 @@ import { SiLinux, } from "@icons-pack/react-simple-icons"; import { cn } from "@/lib/utils"; +import { motion } from "framer-motion"; +import { + staggerContainer, + fadeInUp, + fadeIn, + cardReveal, + timelineItemLeft, + timelineItemRight, + slowFloat, +} from "@/lib/animations"; const timeline = [ { @@ -122,52 +134,78 @@ export default function About() { return ( <> {/* Hero */} -
-
+ +
{/* Image/Avatar */} -
-
-
- Klesti Selimaj + +
+
+
+ Klesti Selimaj +
+ {/* Floating badges */} + + + Available +
- {/* Floating badges */} -
- - Available -
-
+ {/* Content */} -
+ About Me -

+ Hey, I'm{" "} Klesti Selimaj -

-

+ + A 16-year-old software engineer from Albania with 6+ years of experience. I'm passionate about building things that matter, from low-level systems to beautiful user interfaces. -

-

+ + My journey started at age 10 when I had my first laptop (a Asus with pre installed endless linux), and since then I've been hooked on computers, but i didn't exactly know what programming was but i was doing it unconsciously, making winforms apps in c# with visual studio. -

+ {/* Quick Info */} -
+
Albania @@ -180,55 +218,30 @@ export default function About() { @orus-dev
-
+
{/* Social Links */} - -
+ + {[Github, Linkedin, Youtube, Instagram, ExternalLink].map( + (Icon, i) => ( + + + + ), + )} + +
-
+ {/* Tech Stack */}
@@ -246,12 +259,18 @@ export default function About() {

-
+ {techStack.map((tech, index) => ( -
{tech.icon} @@ -259,9 +278,9 @@ export default function About() {

{tech.name}

-
+ ))} -
+
@@ -280,12 +299,18 @@ export default function About() {

-
+ {achievements.map((achievement, index) => ( -
{achievement.icon}

@@ -294,9 +319,9 @@ export default function About() {

{achievement.description}

-

+
))} -
+ @@ -318,10 +343,15 @@ export default function About() {
{timeline.map((item, index) => ( -
{/* Line */} {index !== timeline.length - 1 && ( @@ -351,7 +381,7 @@ export default function About() { {item.description}

-
+ ))} @@ -359,7 +389,10 @@ export default function About() { {/* Philosophy */}
-
+
diff --git a/src/lib/animations.ts b/src/lib/animations.ts index 31c77e4..f4ee4e0 100644 --- a/src/lib/animations.ts +++ b/src/lib/animations.ts @@ -1,22 +1,102 @@ -import { Variant } from "framer-motion"; +import { Variants } from "framer-motion"; -type AnimationVariants = Record; +/** + * Container + */ +export const staggerContainer: Variants = { + hidden: {}, + visible: { + transition: { + staggerChildren: 0.15, + delayChildren: 0.05, + }, + }, +}; -export const fadeInUp: AnimationVariants = { - hidden: { opacity: 0, y: 30 }, +/** + * Basic entrances + */ +export const fadeInUp: Variants = { + hidden: { opacity: 0, y: 24 }, visible: { opacity: 1, y: 0, + transition: { + duration: 0.6, + ease: [0.22, 1, 0.36, 1], // premium easeOut + }, + }, +}; + +export const fadeInDown: Variants = { + hidden: { opacity: 0, y: -24 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.6, + ease: [0.22, 1, 0.36, 1], + }, + }, +}; + +export const fadeIn: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, transition: { duration: 0.6, ease: "easeOut" }, }, }; -export const staggerContainer: AnimationVariants = { - hidden: { opacity: 0 }, +/** + * Cards + */ +export const cardReveal: Variants = { + hidden: { opacity: 0, y: 30, scale: 0.96 }, visible: { opacity: 1, + y: 0, + scale: 1, transition: { - staggerChildren: 0.15, + duration: 0.5, + ease: [0.22, 1, 0.36, 1], + }, + }, +}; + +/** + * Timeline + */ +export const timelineItemLeft: Variants = { + hidden: { opacity: 0, x: -40 }, + visible: { + opacity: 1, + x: 0, + transition: { duration: 0.5, ease: "easeOut" }, + }, +}; + +export const timelineItemRight: Variants = { + hidden: { opacity: 0, x: 40 }, + visible: { + opacity: 1, + x: 0, + transition: { duration: 0.5, ease: "easeOut" }, + }, +}; + +/** + * Decorative / ambient + */ +export const slowFloat: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + y: [0, -10, 0], + transition: { + duration: 6, + repeat: Infinity, + ease: "easeInOut", }, }, };