workshopclaudecode/PRD.md

164 lines
5.6 KiB
Markdown
Raw Permalink Normal View History

# PRD: Configuratie centraliseren - Claude Code Workshop Sales Page
## Context
De sales page heeft workshopdetails (datum, tijd, locatie, prijs, e-mail) hardcoded staan in 8+ componenten tegelijk. Als de workshop een nieuwe datum krijgt, moet je nu 20+ plekken aanpassen in 8 bestanden - en de kans op fouten is groot. De audit bevestigt dit: Footer.jsx zegt al "Max 7" terwijl alles "Max 8" is.
Doel: één plek om de workshop te updaten, alle componenten lezen daaruit.
---
## Wat het doet (gewone taal)
Je wijzigt de datum van de workshop. Nu open je `src/config/workshop.js`, typt de nieuwe datum, en alle tekst op de pagina klopt automatisch: de hero, de sticky balk, de footer, de FAQ, de pricing-sectie, de e-maillink. Geen "zoek en vervang" meer door 8 bestanden. Geen inconsistentie meer zoals "Max 7 vs Max 8".
---
## Hoe het eruitziet (de config-interface)
Na implementatie ziet `src/config/workshop.js` er zo uit:
```js
export const WORKSHOP_CONFIG = {
// Beschikbaarheid
totalSpots: 8,
availableSpots: 0,
isSoldOut: true,
// Workshopdetails (pas hier aan voor nieuwe editie)
date: 'vrijdag 3 april 2026',
dateShort: '3 april',
time: '9:00 - 14:00',
timeStart: '9:00',
timeEnd: '14:00',
location: 'Utrecht',
venue: 'Wonders of Work, Utrecht',
maxParticipants: 8,
// Prijs
price: '€399',
priceExclBtw: 'excl. BTW',
// Trainer
email: 'frank@frankmeeuwsen.com',
};
```
En `src/config/payment.js` bevat:
```js
export const PAYMENT_CONFIG = {
SIGNUP_URL: '/inschrijven',
WAITLIST_URL: '/wachtlijst-inschrijven',
SIGNUP_TALLY_ID: 'XxGBrV', // was hardcoded in Signup.jsx
WAITLIST_TALLY_ID: 'kdyPJZ',
};
```
Componenten importeren wat ze nodig hebben:
```js
import { WORKSHOP_CONFIG } from '../config/workshop';
const { date, price, email } = WORKSHOP_CONFIG;
```
---
## Bouwfasen
### Fase 1 - Snelle fixes en config completeren (minimum waarde)
**Wat:** Los de bekende bugs op, verwijder rommel, zet de Tally form ID in config.
**Wijzigingen:**
- `Footer.jsx:25` - "Max 7" corrigeren naar "Max 8" (bug fix)
- `public/og-image.old.png` verwijderen (700KB ongebruikt)
- `public/vite.svg` verwijderen (ongebruikt)
- `src/config/payment.js` - voeg `SIGNUP_TALLY_ID: 'XxGBrV'` toe
- `src/pages/Signup.jsx` - vervang hardcoded form ID door `PAYMENT_CONFIG.SIGNUP_TALLY_ID`
- `preflight.sh` - maak ESLint-fouten blokkerend (stop script bij lint-fouten)
**Resultaat:** Geen bugs, geen rommel, form ID beheerbaar vanuit config.
**Verificatie:** `./preflight.sh` slaagt, Footer toont "Max 8", Signup.jsx heeft geen hardcoded Tally ID meer.
---
### Fase 2 - Workshop details centraliseren (kern van het project)
**Wat:** Breid `workshop.js` uit met alle workshopdetails en laat alle componenten daaruit lezen.
**Wijzigingen in `src/config/workshop.js`:**
- Voeg toe: `date`, `dateShort`, `time`, `timeStart`, `timeEnd`, `location`, `venue`, `maxParticipants`, `price`, `priceExclBtw`, `email`
**Componenten bijwerken (hardcoded waarden vervangen door config-import):**
- `Hero.jsx` - datum, tijd, locatie (3 plekken)
- `FinalCTA.jsx` - datum, tijd, max deelnemers (3 plekken)
- `Footer.jsx` - datum, tijd, locatie/venue, email (5 plekken)
- `StickyBar.jsx` - datum, locatie, prijs (4 plekken)
- `Pricing.jsx` - prijs, max deelnemers (3 plekken)
- `Program.jsx` - tijden in de samenvatting-tekst (1 plek)
- `FAQ.jsx` - prijs, refund verwijzingen (2 plekken)
**Resultaat:** Eén config-bestand om een nieuwe editie te lanceren. Geen inconsistente waarden meer.
**Verificatie:** Wijzig `date` in workshop.js en verifieer dat Hero, Footer, StickyBar en FinalCTA allemaal de nieuwe datum tonen. `./preflight.sh` slaagt.
---
### Fase 3 - Code deduplicatie
**Wat:** Verwijder dubbele code in de inschrijfpagina's.
**Wijzigingen:**
- Maak `src/components/TallyForm.jsx` - gedeeld component met `formId` prop
- Vervangt identieke Tally embed-logica in `Signup.jsx` en `WaitlistSignup.jsx`
**Resultaat:** Tally embed-logica op één plek beheerbaar.
**Verificatie:** Inschrijfflow en wachtlijstflow werken beide nog correct. `./preflight.sh` slaagt.
---
### Fase 4 - Deployment en kwaliteitsverbetering
**Wat:** Maak het deployen veiliger en los kleine inconsistenties op.
**Wijzigingen:**
- `deploy.sh` - voeg post-deploy HTTP-check toe (curl naar live URL, verwacht HTTP 200)
- Valutainconsistentie: `FAQ.jsx:34` en `Installatie.jsx:60` uniformeren naar "€"
**Resultaat:** Deploy geeft automatisch feedback of de live URL bereikbaar is. Alle valuta consistent.
**Verificatie:** Deploy uitvoeren en curl-check zien slagen in de output.
---
## Kritieke bestanden
| Bestand | Rol |
|---------|-----|
| `src/config/workshop.js` | Centrale config - wordt uitgebreid |
| `src/config/payment.js` | Betaalconfig - SIGNUP_TALLY_ID toevoegen |
| `src/components/Hero.jsx` | Hardcoded datum/tijd/locatie |
| `src/components/Footer.jsx` | Hardcoded datum/tijd/venue/email + bug "Max 7" |
| `src/components/StickyBar.jsx` | Hardcoded datum/locatie/prijs |
| `src/components/FinalCTA.jsx` | Hardcoded datum/tijd/max deelnemers |
| `src/components/Pricing.jsx` | Hardcoded prijs/max deelnemers |
| `src/components/FAQ.jsx` | Hardcoded prijs + valutainconsistentie |
| `src/pages/Signup.jsx` | Hardcoded Tally form ID |
| `preflight.sh` | ESLint niet blokkerend |
| `deploy.sh` | Geen post-deploy check |
| `public/og-image.old.png` | Ongebruikt, 700KB |
| `public/vite.svg` | Ongebruikt |
---
## Status bouwfasen
| Fase | Beschrijving | Status |
|------|-------------|--------|
| Fase 1 | Snelle fixes + config completeren | Nog niet gestart |
| Fase 2 | Workshop details centraliseren | Nog niet gestart |
| Fase 3 | Code deduplicatie | Nog niet gestart |
| Fase 4 | Deployment en kwaliteit | Nog niet gestart |