Achievement Grid
trophy/achievement-gridFreeComponent
Responsive React achievement grid for displaying collections of badges with progress and rarity across breakpoints. Ideal achievement UI design for galleries and showcases in consumer apps. Open source, built on shadcn/ui + Tailwind.
Live preview
live · rendered by the registry
Rendered by trophy on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.trophy.so/r/achievement-grid.jsonSource
1"use client"23import * as React from "react"4import { cva, type VariantProps } from "class-variance-authority"56import { cn } from "@/lib/utils"7import { AchievementBadge } from "@/components/ui/achievement-badge"89// Types (inlined - only fields used by this component)10interface Achievement {11 id: string12 name: string13 trigger: "metric" | "api" | "streak"14 badgeUrl?: string | null15 progress?: number16 rarity?: number17}1819interface UserAchievement extends Achievement {20 achievedAt: string | null // null = locked21}2223// Variants24const achievementGridVariants = cva("grid", {25 variants: {26 columns: {27 2: "grid-cols-2",28 3: "grid-cols-3",29 4: "grid-cols-4",30 auto: "grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5",31 },32 gap: {33 sm: "gap-2",34 default: "gap-4",35 lg: "gap-6",36 },37 },38 defaultVariants: {39 columns: "auto",40 gap: "default",41 },42})4344// Badge size mapping45// Props46interface AchievementGridProps47 extends48 React.HTMLAttributes<HTMLDivElement>,49 VariantProps<typeof achievementGridVariants> {50 /** Array of achievements */51 achievements: UserAchievement[]52 /** Size of achievement badges */53 badgeSize?: "sm" | "default" | "lg"54 /** Callback when achievement clicked */55 onAchievementClick?: (achievement: UserAchievement) => void56}5758const AchievementGrid = React.forwardRef<HTMLDivElement, AchievementGridProps>(59 (60 {61 className,62 columns,63 gap,64 achievements,65 badgeSize = "default",66 onAchievementClick,67 ...props68 },69 ref70 ) => {71 return (72 <div73 ref={ref}74 role="list"75 aria-label="Achievements"76 className={cn(achievementGridVariants({ columns, gap }), className)}77 {...props}78 >79 {achievements.map((achievement) => {80 return (81 <AchievementBadge82 key={achievement.id}83 achievement={achievement}84 badgeSize={badgeSize}85 onAchievementClick={onAchievementClick}86 />87 )88 })}89 </div>90 )91 }92)93AchievementGrid.displayName = "AchievementGrid"9495export { AchievementGrid, achievementGridVariants }96export type { AchievementGridProps, Achievement, UserAchievement }
What it pulls in
npm packages
Other registry items
Files it writes
More from trophy
All 18 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Achievement Badgeachievement-badge | trophy | Components | Free | 1 dep | |
| Achievement Cardachievement-card | trophy | Components | Free | no deps | |
| Achievement Listachievement-list | trophy | Components | Free | 2 deps | |
| Achievement Unlockedachievement-unlocked | trophy | Components | Free | 1 dep | |
| Leaderboard Cardleaderboard-card | trophy | Components | Free | no deps | |
| Leaderboard Podiumleaderboard-podium | trophy | Components | Free | 2 deps | |
| Leaderboard Rankingsleaderboard-rankings | trophy | Components | Free | 2 deps | |
| Points Awardspoints-awards | trophy | Components | Free | 2 deps |
