feat: achievement badge placeholders on profile page (Phase 2 prep)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ronny
2026-04-12 15:57:32 +02:00
parent 1999ef8a21
commit fe777a2bab
3 changed files with 78 additions and 1 deletions
+15 -1
View File
@@ -173,8 +173,22 @@ export default function DashboardPage(_props: Props) {
</div> </div>
{/* Nudges */} {/* Nudges */}
{nudges.length > 0 && ( {(streakBroken || nudges.length > 0) && (
<div className={styles.nudges}> <div className={styles.nudges}>
{streakBroken && (
<div
className={`card ${styles.nudge} ${styles.nudgeStreak}`}
onClick={() => {
localStorage.removeItem(STREAK_KEY);
navigate('/spiele');
}}
>
<span className={styles.nudgeIcon}>💔</span>
<span className={styles.nudgeText}>
Deine {lastStreak}er-Serie ist gerissen! Starte eine neue.
</span>
</div>
)}
{nudges.map((nudge, i) => ( {nudges.map((nudge, i) => (
<div <div
key={i} key={i}
+42
View File
@@ -240,3 +240,45 @@
color: var(--text-primary); color: var(--text-primary);
word-break: break-all; word-break: break-all;
} }
/* ── Achievements ── */
.achievementsSection {
margin-top: 8px;
}
.badgeGrid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 8px;
}
.badge {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
padding: 14px 8px;
background: var(--surface-mid);
border-radius: var(--radius-md);
border: 1px solid var(--border-subtle);
opacity: 0.4;
filter: grayscale(0.8);
position: relative;
}
.badgeIcon {
font-size: 1.5rem;
}
.badgeName {
font-size: 0.7rem;
font-weight: 700;
color: var(--text-primary);
text-align: center;
}
.badgeDesc {
font-size: 0.6rem;
color: var(--text-muted);
text-align: center;
}
+21
View File
@@ -202,6 +202,27 @@ export default function ProfilePage() {
</div> </div>
</div> </div>
)} )}
{/* Achievements (Phase 2 placeholder) */}
<div className={styles.achievementsSection}>
<h3 className={styles.sectionTitle}>Erfolge</h3>
<div className={styles.badgeGrid}>
{[
{ icon: '🎯', label: 'Scharfschütze', desc: '5 exakte Treffer' },
{ icon: '🔥', label: 'Serien-Tipper', desc: '10er Streak' },
{ icon: '🏆', label: 'Tabellenführer', desc: 'Platz 1 erreichen' },
{ icon: '⚡', label: 'Frühtipper', desc: 'Alle Tipps 24h vorher' },
{ icon: '🌍', label: 'Globetrotter', desc: 'Alle Gruppen getippt' },
{ icon: '💎', label: 'Diamant', desc: '20 exakte Treffer' },
].map((badge, i) => (
<div key={i} className={styles.badge}>
<span className={styles.badgeIcon}>{badge.icon}</span>
<span className={styles.badgeName}>{badge.label}</span>
<span className={styles.badgeDesc}>{badge.desc}</span>
</div>
))}
</div>
</div>
</div> </div>
); );
} }