feat: add daily challenges system

Three PST-midnight-resetting challenges generated deterministically per
day from click, boss, quest, and prestige types. Progress tracked
server-side for bosses and prestige, client-side for clicks and quests.
Crystal rewards awarded on completion and preserved through prestige resets.
This commit is contained in:
2026-03-06 22:22:18 -08:00
committed by Naomi Carrigan
parent a7d4b72805
commit aaeece1a18
15 changed files with 462 additions and 8 deletions
+105
View File
@@ -1837,3 +1837,108 @@ body {
height: 100vh;
justify-content: center;
}
/* ===================== DAILY CHALLENGES ===================== */
.daily-challenge-panel {
display: flex;
flex-direction: column;
gap: 1rem;
}
.daily-challenge-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.5rem;
}
.daily-challenge-subtitle {
color: var(--colour-text-muted);
font-size: 0.85rem;
margin: 0;
}
.daily-challenge-progress {
color: var(--colour-accent);
font-size: 0.85rem;
font-weight: bold;
white-space: nowrap;
margin: 0;
}
.daily-challenge-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.daily-challenge-card {
background: var(--colour-bg-secondary);
border: 1px solid var(--colour-border);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
padding: 0.75rem 1rem;
transition: border-color 0.2s ease;
}
.daily-challenge-card.completed {
border-color: var(--colour-success, #4caf50);
opacity: 0.8;
}
.daily-challenge-info {
flex: 1;
min-width: 0;
}
.daily-challenge-label {
font-size: 0.95rem;
font-weight: bold;
margin: 0 0 0.25rem;
}
.daily-challenge-reward {
color: var(--colour-text-muted);
font-size: 0.8rem;
margin: 0;
}
.daily-challenge-right {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 0.25rem;
min-width: 120px;
}
.daily-challenge-done {
color: var(--colour-success, #4caf50);
font-size: 0.9rem;
font-weight: bold;
}
.daily-challenge-count {
color: var(--colour-text-muted);
font-size: 0.8rem;
margin: 0;
}
.daily-challenge-bar-track {
background: var(--colour-bg-primary, #1a1a2e);
border-radius: 4px;
height: 6px;
width: 120px;
overflow: hidden;
}
.daily-challenge-bar-fill {
background: var(--colour-accent);
border-radius: 4px;
height: 100%;
transition: width 0.3s ease;
}