// Achievements — streak + badges grid + subject progress. function Achievements() { const { ACHIEVEMENTS, SUBJECTS, MATERIALS } = window.ECC_DATA; const unlocked = ACHIEVEMENTS.filter(a => a.unlocked); const locked = ACHIEVEMENTS.filter(a => !a.unlocked); return (

Tu progreso

{unlocked.length} de {ACHIEVEMENTS.length} logros desbloqueados.

{/* Top row: streak + total */}
{/* Subject progress */}

Por asignatura

{SUBJECTS.filter(s => MATERIALS.some(m => m.subject === s.id)).map(s => { const total = MATERIALS.filter(m => m.subject === s.id).length; const done = MATERIALS.filter(m => m.subject === s.id && m.status === 'done').length; const pct = total ? done / total : 0; return (
{done} / {total}
); })}
{/* Achievements grid */}

Logros

{ACHIEVEMENTS.map(a => )}
); } function StatCard({ icon, iconColor, value, label, hint }) { return (
{value} {label}
{hint}
); } function AchievementCard({ a }) { return (
{a.title}

{a.desc}

); } window.Achievements = Achievements;