- Alle workshopdetails (datum, tijd, locatie, prijs, email) gecentraliseerd in workshop.js - ThankYou.jsx bijgewerkt: betalingsbevestiging tekst + WORKSHOP_CONFIG variabelen - Signup.jsx open punt opgelost: samenvattingsregel gebruikt nu config-variabelen - TallyForm gedeeld component toegevoegd (fase 3) - deploy.sh post-deploy HTTP-check toegevoegd (fase 4) - PRD.md en workshop materiaal (slides, tips, introtimer) toegevoegd - vite.svg verwijderd (ongebruikt) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
163 lines
5.6 KiB
Markdown
163 lines
5.6 KiB
Markdown
# 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 |
|