Brief 06 · Oefenen-pijler · Leaderboard & Achievements
Motivatie zonder schaamte — daily én weekly in één blik.
Sleutel-states voor Leaderboard, Trophy Case (web) en de cross-pijler streak-chip. Pulse-blue family voor jouw-positie, gold/silver/bronze als smaakvolle accenten op top-3, "Bijna behaald"-laag voor momentum.
A · Concept-rationale
Voor 12-18 met examenstress is een leaderboard alleen behulpzaam als jouw positie nooit verdwijnt — ook niet op #4523. We tonen daarom altijd een persoonlijke "JIJ"-kaart bovenaan elk lijstje, en duwen daily + weekly nooit in een tab-switch maar zetten ze als twee gelijkwaardige glance-kolommen naast elkaar (Robin's hard requirement). Top-3 krijgt smaakvolle gold/silver/bronze accenten via 3px-borders + display-numerals — geen Vegas-trofeeën. In de Trophy Case introduceren we een dedicated "Bijna behaald"-laag voor locked-badges met ≥50% voortgang: dat is waar momentum zit, niet bij 0%-locked. De cross-pijler streak-chip krijgt drie expliciete states (active / not-active / broken) zodat broken nooit als verwijt voelt.
Leidende principes
Jij bent altijd in beeld
Eigen rank zit boven elke lijst als persoonlijke kaart, plus 3px-Pulse-border in de lijst zelf. Niet schreeuwerig, wel onmiskenbaar.
Daily + Weekly = even-weight
Twee kolommen, identieke structuur. Geen dominante hoofd-tab. Glance-comparison ipv switch-cost.
Momentum > volledigheid
"Bijna behaald" sectie tilt locked-met-progress eruit — zien wat dichtbij is motiveert meer dan een muur trofeeën.
Broken streaks = informatie
Geen rode wond, geen schaamte-copy. Neutraal grijs + helpende Pulse-quote.
B · Sleutel-states
11 ontworpen states verdeeld over drie modules (canvas hieronder).
Leaderboard 5 states
- Default mixed — daily én weekly in twee gelijkwaardige glance-kolommen, "JIJ"-kaart per kolom, top-7 zichtbaar, "+93 spelers" naar top-100.
- Around me — 2 boven + jij + 2 onder, met top-3 peek ernaast, sticky-bar-pattern voor outside-top-100.
- Empty period — week zojuist gestart; daily blijft populated, weekly is uitnodigend leeg met "wie vroeg start, staat zichtbaar".
- <16 no-consent — eigen-score-only met dashed Pulse-blue cards; helpende uitleg, geen straf-toon.
- Top-3 special-states — gold/silver/bronze podium-cards + lijst, smaakvolle 3px-accents.
Trophy Case 4 states
- Default mixed — drie-laags layout: Recent behaald → Bijna behaald (≥50%) → Nog op te bouwen.
- All locked — eerste-bezoek met Pulse-CTA "eerste trofee = eerste quiz", grid blijft zichtbaar maar gedimd.
- Filter: behaald (dark) — alleen achieved, met visuele "wat je hebt gewonnen" toon.
- Unlock-modal/toast — niet-blokkerende celebration boven post-quiz scherm, gradient-rand voor cross-pijler-badges.
Streak-chip 2 deliverables
- Catalogue — 3 states (active / not-active / broken) × 2 themes + plaatsing-preview in 3 pijler-topbars.
- Click-popup — 30-dagen kalender met pijler-density (3 vol = rose, 1-2 = amber), 3 cross-pijler-CTA's, recovery-marker.
C · Deviations vs huidige Snapsnelds
Verplicht alleen voor de Trophy Case (mobile bestaat). Leaderboard + streak-chip = blank canvas, geen deviations.
| Onderdeel | Huidig (mobile) | Jij (web) | Waarom |
| Layout achieved+locked | Volledige mix in één grid, sequentieel | Drie-laags: Recent → Bijna behaald (≥50%) → Nog op te bouwen | Web heeft ruimte; "Bijna behaald" tilt momentum eruit. Locked-met-3% en locked-met-87% verdienen niet dezelfde behandeling. |
| Locked badge-styling | Witte achtergrond, slot-icoon rechtsboven | Subtiele diagonal-stripe-pattern + 92% opacity + lock-bubble onderaan icoon | Stripe-pattern leest sneller "incomplete" zonder dat het er kapot uitziet. Lock-bubble matcht check-bubble bij achieved. |
| Stat-headers | Drie aparte cijfers in horizontale strip | Twee compact + Pulse-coach-card "3 staan op 50%+" | Mobile-headers zijn passieve metrics. Web krijgt extra ruimte voor een actionable observatie. |
| Categorie-tabs | 5 tabs (Alle / Leren / Streaks / Sociaal / Speciaal) | 6 tabs incluis dedicated Cross-pijler-categorie | Cross-pijler-badges zijn het zwaarste signaal van studiecyclus-engagement; verdienen eigen filter, niet verstopt onder "Speciaal". |
| Cross-pijler badge-stijl | Identiek aan andere badges | Gradient-rand (Pulse-blue → Oefenen-green → Plannen-purple) + sparkles-icoon | Visueel signaal "deze badge bestrijkt alle drie pijlers" — niet zomaar nóg een trofee. |
| Reward-zichtbaarheid | Datum behaald, geen XP/Snaps zichtbaar | Mini-chips "+XP / +Snaps" op elke kaart, ook locked | Doelgroep wil weten wat ze krijgen vóór ze investeren. Reward-info verlaagt drempel om locked-badges te benaderen. |
D · Challenge-vragen — expliciet beantwoord
1 · Daily én weekly naast elkaar zonder cognitive-load — hoe?
Twee gelijkwaardige glance-kolommen, identieke structuur. Geen tab-switch (verliest "én-én"-betekenis), geen toggle-tussen-cards (extra klik), geen monthly+alltime erbij (te druk in V1). Per kolom: header met periode-naam + reset-countdown → JIJ-kaart (dashed Pulse-blue, persoonlijke score) → top-7 lijst → "+93 spelers · bekijk top 100" link. Cognitive-load blijft laag omdat de structuur identiek is — je leest één kolom-pattern, en past 'm twee keer toe. Bij smalle viewports (mobile / V1.1) stack-en de kolommen verticaal zonder design-aanpassing.
2 · Mix achieved+locked, of aparte "Bijna behaald" sectie?
Drie-laags hybride. Op de web-versie introduceren we naast Recent-unlocks en Nog-op-te-bouwen een dedicated "Bijna behaald · ≥50%" laag — gemarkeerd met een MOMENTUM-pill in amber. Reden: locked-met-3%-progress en locked-met-87%-progress hebben totaal verschillende emotionele waarde. Door ze samen te tonen verlies je de motivatie-piek waar 'ie zit. Op mobile (waar ruimte schaars is) kan de bestaande mix blijven; op web met 4 kolommen is een eigen sectie van 3-4 cards heel betaalbaar en levert direct return-engagement op.
Privacy-question · <16-no-consent state
Communicatie vermijdt "je bent niet zichtbaar" als hoofdboodschap (voelt als straf). Hoofdkop is "Je doet mee — alleen niet zichtbaar voor anderen." en de score-kaarten zijn identiek qua design aan de gewone leaderboard-kaarten — alleen de publieke lijst is afwezig. Een tweede card legt het GDPR-mechanisme uit + toont route naar consent. Toon: feitelijk + behulpzaam, niet excuserend.
Streak-chip · broken-state copy
Bestaande Snapsnelds-conventie zou waarschijnlijk een rood waarschuwingspatroon zijn. Wij kiezen neutraal grijs zonder rood: "0 dagen" met een 55%-opacity vlam-icoon. Pulse-quote in de popup: "Streak weg. Geen ramp — vandaag opnieuw beginnen." Schaamte ontstaat als de UI agreement zoekt met je teleurstelling; door neutraal te blijven biedt 'ie een fresh start in plaats van een autopsie.
E · Robin's bijsturing — verwerkt in deze finale
- Periode-tabs gefinaliseerd: Daily + Weekly verplicht (Robin's OQ5 / A17), Monthly als optioneel 3e tab (matcht school-cijferperiodes — niet kwartaal, dat is willekeurig vergeleken met week/maand-ritme waar 12-18 mee leeft). All-time NIET in V1 — veteranen zouden domineren, conflicteert met "geen schaamte"-principe. → tab-strip toegevoegd in State 1.
- JIJ-cap: geen cap die JIJ verbergt. Default-view toont top-7 visueel + "bekijk top 100"-knop voor scannability. Maar als je in top 100 staat (bv. #47), auto-scrollt de uitgeklapte lijst naar JIJ-row zodat die altijd in viewport blijft — anders is de "top 100"-label misleidend. Bij rank #101+ blijft de bestaande sticky-bar (A18) leidend. → footer-copy in PeriodCard schaalt nu mee in 3 cases (in-top-7 / in-top-100 / outside).
- Achievement-toast: in-app only voor V1 (toast + modal varianten). Push-notif schuift naar V1.1 — V1 = web-only, GDPR voor <16 vereist parental consent voor push, en achievement-unlock werkt het sterkst in context (post-quiz moment). Push als comeback-mechanic ("3 dagen weg") is waardevol maar hoort in V1.1 user-retention scope. → geen push-notif varianten meer in deze brief.
Analytics-events (footnote)
Per Robin's eerdere bijsturing — events die deze states moeten emitteren voor product-analytics:
- achievement_progress_card_viewed { badge_id, progress_pct, surface: 'trophy_case' | 'dashboard' }
- achievement_unlocked { badge_id, unlock_trigger, time_to_unlock_days }
- leaderboard_period_viewed { period: 'daily' | 'weekly' | 'monthly', my_rank, total_players }
- leaderboard_jij_row_clicked { my_rank, period, surface: 'sticky_bar' | 'inline' }
- streak_chip_clicked { streak_days, surface: 'dashboard' | 'quiz' | 'profile' }
- streak_grace_day_used { streak_days_at_use, days_since_last_grace }
Resterende open vragen
- Achievement V1 hardcoded list — mijn 15 badges zijn educated guesses. Voor copy + iconen-keuze validatie graag de echte 10-15-lijst van Robin.
- Test bij 14-jarigen — voelt de "Bijna behaald" sectie als aanmoediging of als "je bent er nog niet"? Aanname: eerste. Dit is precies waar user-tests nodig zijn vóór final copy.
↓ Sleutel-states canvas — sleep, klik om uit te vergroten ↓