From 1ece5a037e4f981af27dc2d0f4d9338c10941147 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Sun, 21 Dec 2025 02:29:47 -0800 Subject: [PATCH] feat(frontend): Add smooth page transitions and animations --- frontend/app/leaderboards/page.tsx | 183 ++++++++++++++++++----------- frontend/app/profile/page.tsx | 70 +++++++---- 2 files changed, 165 insertions(+), 88 deletions(-) diff --git a/frontend/app/leaderboards/page.tsx b/frontend/app/leaderboards/page.tsx index 36c9dda..571074c 100644 --- a/frontend/app/leaderboards/page.tsx +++ b/frontend/app/leaderboards/page.tsx @@ -8,6 +8,7 @@ import Link from "next/link" import { Star, MapPin, Music, User, Trophy, Calendar, Sparkles } from "lucide-react" import { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import { motion, AnimatePresence } from "framer-motion" interface TopShow { show: { id: number; date: string; venue_id: number } @@ -87,14 +88,19 @@ export default function LeaderboardsPage() { return (
-
+

Leaderboards

Discover the highest rated shows, legendary jams, and top contributors.

-
+ @@ -106,61 +112,81 @@ export default function LeaderboardsPage() { {/* HEADY JAMS CONTENT */} - -
- {topPerformances.map((item, i) => ( -
-
- -
-
-
- - {item.song.title} - - {item.performance.notes && ( - - {item.performance.notes} - - )} + + +
+ {topPerformances.map((item, i) => ( + +
+
-
- - - {new Date(item.show.date).toLocaleDateString(undefined, { - weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' - })} - - - {item.venue.name} +
+
+ + {item.song.title} + + {item.performance.notes && ( + + {item.performance.notes} + + )} +
+
+ + + {new Date(item.show.date).toLocaleDateString(undefined, { + weekday: 'short', year: 'numeric', month: 'short', day: 'numeric' + })} + + + {item.venue.name} +
-
-
-
- - {item.avg_score.toFixed(2)} +
+
+ + {item.avg_score.toFixed(2)} +
+ {item.rating_count} votes
- {item.rating_count} votes + + ))} + {topPerformances.length === 0 && ( +
+ No ranked jams yet. Start rating performances!
-
- ))} - {topPerformances.length === 0 && ( -
- No ranked jams yet. Start rating performances! -
- )} -
- + )} +
+
+
{/* TOP SHOWS CONTENT */} -
+ {topShows.map((item, i) => ( -
+
{i + 1}
@@ -181,16 +207,27 @@ export default function LeaderboardsPage() {
{item.review_count} ratings
-
+
))} -
+
{/* VENUES CONTENT */} -
+ {topVenues.map((item, i) => ( -
+
{item.avg_score.toFixed(2)} -
+ ))} -
+
{/* USERS CONTENT */} -
+ {topUsers.map((item, i) => ( - - - - U - -
User {item.profile.user_id}
-

Top Contributor

- - {item.review_count} Reviews - -
+ + + + + U + +
User {item.profile.user_id}
+

Top Contributor

+ + {item.review_count} Reviews + +
+
))} {topUsers.length === 0 &&

No active users yet.

} -
+
diff --git a/frontend/app/profile/page.tsx b/frontend/app/profile/page.tsx index ab17c50..c03069b 100644 --- a/frontend/app/profile/page.tsx +++ b/frontend/app/profile/page.tsx @@ -12,6 +12,7 @@ import { UserAttendanceList } from "@/components/profile/user-attendance-list" import { UserReviewsList } from "@/components/profile/user-reviews-list" import { UserGroupsList } from "@/components/profile/user-groups-list" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" +import { motion } from "framer-motion" // Types interface UserProfile { @@ -105,7 +106,12 @@ export default function ProfilePage() { return (
{/* Header Section */} -
+
-
+ @@ -170,34 +176,56 @@ export default function ProfilePage() { - - - - - Achievements - - - - - {displayBadges.length === 0 && ( -

No badges earned yet. Keep active!

- )} -
-
- - {/* Recent Activity or generic stats summary could go here later */} + + + + + + Achievements + + + + + {displayBadges.length === 0 && ( +

No badges earned yet. Keep active!

+ )} +
+
+
- + + + - + + + - + + +