# π Bouwplan β Login Refactor: Email + Wachtwoord Primair **Projectnaam:** Mini EPD Demo Platform - Login Optimalisatie **Versie:** v1.0 **Datum:** 18-01-2025 **Auteur:** Colin (met Claude Code) **Scope:** Login page herontwerp (Email+Password primair, Magic Link secundair) --- ## 1. Doel en Context π― **Doel:** De login flow optimaliseren voor een demo platform door Email + Wachtwoord de primaire methode te maken in plaats van Magic Link. π **Toelichting:** Het huidige login scherm heeft Magic Link als primaire methode, maar voor een **demo platform** is dit suboptimaal omdat prospects direct willen inloggen zonder email roundtrip. We maken Email + Password de primaire methode en verplaatsen Magic Link naar een secundaire optie. **Huidige situatie:** - Magic Link is default (toggle nodig voor demo login) - Demo credentials verborgen achter extra click - 2-3 extra clicks voor demo users - Conditional rendering met `showDemoLogin` state **Gewenste situatie:** - Email + Password formulier als primair scherm - One-click demo login prominent zichtbaar - Magic Link als minimale fallback (kleine link onderaan) - Focus op snelheid: Quick Demo button is de CTA **Context:** - Dit is een DEMO platform, geen productie EPD - Primaire use case: Prospects willen snel kijken - Secundaire use case: Serieuze trial users maken eigen account - Magic Link blijft beschikbaar voor zero-password signup --- ## 2. Uitgangspunten ### 2.2 Projectkaders - **Tijd:** 2-3 uur voor volledige implementatie + testing - **Team:** 1 developer (zelfstandig uit te voeren) - **Demo accounts:** Bestaande demo users blijven ongewijzigd - **Breaking changes:** GEEN - Alle bestaande auth flows blijven werken - **Deployment:** Auto-deploy via Vercel na git push ### 2.3 Programmeer Uitgangspunten **Code Quality Principles:** - β **DRY:** Hergebruik bestaande auth functies (`loginWithPassword`, `loginWithMagicLink`) - β **KISS:** Eenvoudige layout refactor, geen complexe state management - β **SOC:** UI changes in page.tsx, auth logic blijft in lib/auth/client.ts - β **YAGNI:** Alleen login UI optimalisatie, geen extra conversion features **Security:** - Demo credentials blijven in info box (niet hardcoded in code) - Bestaande Supabase auth flows blijven ongewijzigd - Geen nieuwe environment variables nodig **Bestaande Bestanden (NIET wijzigen):** ``` lib/auth/client.ts - Auth functies lib/auth/server.ts - Server auth middleware.ts - Route protection app/auth/callback/route.ts - Magic link callback app/auth/logout/route.ts - Logout handler components/ui/button.tsx - UI components ``` **Te Wijzigen Bestanden:** ``` app/login/page.tsx - Volledige UI refactor ``` --- ## 3. Epics & Stories Overzicht π― **Doel:** De bouw opdelen in logische epics (fases) met stories (subfases). | Epic ID | Titel | Doel | Status | Stories | Geschatte Tijd | |---------|-------|------|--------|---------|----------------| | E1 | Login UI Refactor | Email+Password primair maken | β³ To Do | 3 | 1-2 uur | | E2 | Demo UX Verbetering | One-click demo + betere copy | β³ To Do | 2 | 30 min | | E3 | Testing & Verificatie | Alle flows testen | β³ To Do | 2 | 30 min | **Totale schatting:** 2-3 uur werk --- ## 4. Epics & Stories (Uitwerking) ### Epic 1 β Login UI Refactor **Epic Doel:** Email + Password formulier wordt de primaire login methode zonder toggle logic. | Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | Story Points | |----------|--------------|---------------------|--------|------------------|-----------------| | E1.S1 | Verwijder conditional toggle logic | `showDemoLogin` state verwijderd, geen toggle buttons meer | β³ | β | 2 | | E1.S2 | Herstructureer page layout | Email+Password primair, Magic Link achter kleine link | β³ | E1.S1 | 3 | | E1.S3 | Update copy & labels | Focus op Quick Demo, Magic Link minimaal | β³ | E1.S2 | 1 | **Technical Notes:** **E1.S1 - Toggle Logic Aanpassen:** ```typescript // VERWIJDER: const [showDemoLogin, setShowDemoLogin] = useState(false) // VERVANG door: const [showMagicLink, setShowMagicLink] = useState(false) // VERWIJDER oude toggle buttons: // NIEUWE logic: // Default = Email+Password form zichtbaar // showMagicLink = true β Toon Magic Link form in plaats van password form ``` **E1.S2 - Layout Herstructureren:** ``` NIEUWE STRUCTUUR: βββββββββββββββββββββββββββββββββββββββββββ β Header: "Login" β βββββββββββββββββββββββββββββββββββββββββββ€ β [QuickDemoButton - zie E2.S1] β β β β βββ of vul handmatig in βββ β β β β Email: [________________] β β Password: [________________] β β [Login Button] β β β β [Demo Credentials Info Box - E2.S2] β β β β Liever zonder wachtwoord? β β [Gebruik magic link β] β βββββββββββββββββββββββββββββββββββββββββββ MAGIC LINK FLOW (na click op link): - Conditional state: showMagicLink = true - Toon email input + "Stuur Magic Link" button - "β Terug naar login" link ``` **E1.S3 - Copy Updates:** ```typescript // OUD β NIEUW "π Demo Account Login" β "Login" "π§ Login met Magic Link" β [VERBORGEN achter link] "Login met Demo Account" β [VERWIJDERD - QuickDemoButton vervangt dit] "Snelle Demo Login" β "π Start Demo (geen registratie)" // NIEUW "Liever zonder wachtwoord?" β Link onderaan "Gebruik magic link β" β Toont magic link formulier ``` --- ### Epic 2 β Demo UX Verbetering **Epic Doel:** Demo gebruikers kunnen met één click inloggen zonder formulier in te vullen. | Story ID | Beschrijving | Acceptatiecriteria | Status | Afhankelijkheden | Story Points | |----------|--------------|---------------------|--------|------------------|-----------------| | E2.S1 | Implementeer QuickDemoButton | One-click demo login zonder form invullen | β³ | E1.S2 | 3 | | E2.S2 | Voeg credentials info box toe | Demo credentials zichtbaar voor manual login | β³ | E1.S2 | 2 | **Technical Notes:** **E2.S1 - QuickDemoButton Component:** ```typescript // Inline component in app/login/page.tsx // (of aparte component indien herbruikbaar elders) function QuickDemoButton() { const [loading, setLoading] = useState(false) const router = useRouter() async function handleQuickDemo() { setLoading(true) try { const result = await loginWithPassword( 'demo@mini-ecd.demo', 'Demo2024!' ) if (result.success) { setMessage({ type: 'success', text: 'Ingelogd! Redirect naar EPD...' }) setTimeout(() => router.push('/epd/clients'), 1000) } } catch (error) { setMessage({ type: 'error', text: 'Login mislukt. Probeer opnieuw.' }) setLoading(false) } } return ( ) } ``` **E2.S2 - Credentials Info Box:** ```typescript // Info card onder password form, boven Magic Link divider
Demo Account Credentials:
π§ Email: demo@mini-ecd.demo
π Wachtwoord: Demo2024!
π‘ Of gebruik de "Start Demo" knop voor directe toegang