# 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 |