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:
@@ -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}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user