From cc0dedba5f615931449238a91be3230fd59ff552 Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Sat, 18 Oct 2025 23:54:22 +0000 Subject: [PATCH] Add Achievements component for thresholds and milestones cgen-8b5c84a55a524ff3a4bb85c40f30608a --- client/components/roadmap/Achievements.tsx | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 client/components/roadmap/Achievements.tsx diff --git a/client/components/roadmap/Achievements.tsx b/client/components/roadmap/Achievements.tsx new file mode 100644 index 00000000..3b79fb85 --- /dev/null +++ b/client/components/roadmap/Achievements.tsx @@ -0,0 +1,38 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Trophy, Award, Crown, Compass } from "lucide-react"; + +export default function Achievements({ earnedXp, phaseClaims }: { earnedXp: number; phaseClaims: Record; }) { + const badges: { id: string; label: string; unlocked: boolean; icon: any; desc: string }[] = [ + { id: "rookie", label: "Rookie Explorer", unlocked: earnedXp >= 100, icon: Compass, desc: "Earn 100+ XP" }, + { id: "seasoned", label: "Seasoned Adventurer", unlocked: earnedXp >= 300, icon: Trophy, desc: "Earn 300+ XP" }, + { id: "master", label: "Master Builder", unlocked: earnedXp >= 600, icon: Crown, desc: "Earn 600+ XP" }, + { id: "trailblazer", label: "Trailblazer", unlocked: ["now","month1","month2","month3"].every((k) => (phaseClaims[k] || 0) > 0), icon: Award, desc: "Complete a quest in every phase" }, + ]; + + return ( + + + Achievements + Earn badges as you progress. Displayed publicly soon. + + + {badges.map((b) => { + const Icon = b.icon; + return ( +
+ +
+
{b.label}
+
{b.desc}
+
+ + {b.unlocked ? "Unlocked" : "Locked"} + +
+ ); + })} +
+
+ ); +}