diff --git a/content/installatie.md b/content/installatie.md
new file mode 100644
index 0000000..cb7f45f
--- /dev/null
+++ b/content/installatie.md
@@ -0,0 +1,236 @@
+---
+title: Installatie-instructies
+subtitle: Bereid je voor op de workshop door Claude Code alvast te installeren. Volg onderstaande stappen en je bent binnen 10 minuten klaar.
+---
+
+## Wat je nodig hebt
+
+:::checklist
+- **Een Claude abonnement** -- Claude Code werkt alleen met een [betaald Claude account](https://claude.ai/pricing). Claude Pro kost €18/maand, Claude Max €90/maand. Start voor de workshop met Pro.
+- **Een Mac of Windows laptop** -- De desktop app werkt op beide platforms. Neem deze laptop mee naar de workshop. **Let op:** Claude Code werkt *niet* op een Chromebook of Chrome OS!
+- **Een idee wat je wilt maken** -- Denk al na over een klein, uitvoerbaar idee wat je in een paar uur kunt realiseren. Een complete site nabouwen zal niet lukken, een klein deel maken wel.
+:::
+
+## Desktop of terminal?
+
+Claude Code kun je op twee manieren gebruiken: via de desktop app of via de terminal (command line). Beide zijn volwaardig. Voor deze workshop starten we met de desktop app - die is het makkelijkst om mee te beginnen.
+
+Het is wel handig om te weten wat de terminal is. Als je daar al bekend mee bent, sla dit dan over.
+
+:::accordion[Wat is de terminal?]
+Een terminal is een venster waar je tekstcommando's typt in plaats van te klikken. Je hoeft dit niet te beheersen voor de workshop, maar het helpt om te weten dat het bestaat.
+
+**Terminal openen:**
+- **Mac:** Druk `Cmd + Spatie`, typ "Terminal", druk Enter
+- **Windows:** Druk de Windows-toets, typ "PowerShell", klik erop
+
+**4 basiscommando's:**
+
+:::command[pwd]
+Waar ben ik? Toont het pad naar je huidige map.
+:::
+
+:::command[ls]
+Wat staat hier? Toont bestanden en mappen. Op Windows: `dir`
+:::
+
+:::command[cd mapnaam]
+Ga naar een map. `cd ..` gaat een map terug.
+:::
+
+:::command[mkdir mapnaam]
+Maak een nieuwe map aan.
+:::
+:::
+
+## Claude Code desktop app installeren
+
+Ga naar [claude.com/download](https://claude.com/download) en download de app voor jouw besturingssysteem.
+
+
+
+:::tabs{os}
+::tab[Mac]
+### Installatie op Mac
+
+:::steps
+1. Download het .dmg bestand van claude.com/download
+2. Open het bestand en sleep het Claude icoon naar je Applications map
+3. Klaar! Open de app vanuit je Applications map of via Spotlight (Cmd + Spatie, typ "Claude")
+:::
+
+
+::tab[Windows]
+### Installatie op Windows
+
+:::steps
+1. Download het .exe bestand van claude.com/download
+2. Dubbelklik op het bestand om de installer te starten
+3. Volg de installatiestappen
+4. Claude Code wordt automatisch toegevoegd aan je Start menu
+:::
+:::
+
+:::if{os=mac}
+### Installatie hulpprogramma
+We installeren nu extra software voor je Mac waarmee je straks versiebeheer kunt doen. Dit zijn de Apple Xcode Command Line Tools. Hiervoor gaan we kort naar Terminal.
+
+:::steps
+1. Open Terminal (druk Cmd + Spatie, typ "Terminal", druk Enter)
+2. Kopieer dit commando en plak het in de terminal: `xcode-select --install`
+3. Je ziet nu een pop-up verschijnen met de mededeling om Git te installeren. Klik op Install en heb geduld. Dit kan 15 - 20 minuten duren. Doe dit dus ruim vantevoren.
+
+
+
+4. Je krijgt automatisch een melding als de installatie is geslaagd
+
+:::
+
+### Installatie NodeJS
+NodeJS is een programmeer-omgeving die Claude Code veel gebruikt. Hiermee kan Claude Code zelfstandig websites en apps ontwikkelen. Je installeert dit eenmalig op je computer.
+:::steps
+1. Ga naar [de website van NodeJS](https://nodejs.org) en klik op *Get NodeJS*
+2. Kies onder het zwarte scherm voor MacOS Installer (.pkg) en download het programma
+3. Dubbelklik op het bestand en installeer Node.js
+:::
+
+### Installatie Python
+Met Python is veel mogelijk. Van losse applicaties tot scripts, tot uitgebreide berekeningen en analyses. Claude Code wil dit vaak gebruiken in de ontwikkeling, daarom installeren we het nu.
+:::steps
+1. Ga naar [de website van Python](https://python.org) en klik op *Download Python*
+2. De site biedt direct de macOS Installer aan en je download het programma
+3. Dubbelklik op het bestand en installeer Python
+4. Voor Python is nog één extra stap nodig. Je krijgt aan het einde een melding om certificaten te installeren.
+
+
+
+5. Tegelijk opent je Finder en zie je het bestand *Install Certificates.command*. Dubbelklik hier op.
+
+
+:::
+
+De installatie voor Mac is hiermee voltooid.
+:::
+
+:::if{os=windows}
+## Git installeren (Windows)
+
+Op Windows heb je Git nodig om foutmeldingen in de Claude Code desktop app te voorkomen. Git is een programma dat Claude Code gebruikt om je bestanden bij te houden.
+
+
+
+:::steps
+1. Ga naar [git-scm.com/download/win](https://git-scm.com/download/win)
+2. Download de "Standalone Installer" (64-bit)
+3. Voer de installer uit en klik steeds op "Next" (de standaardinstellingen zijn prima)
+4. Klik op "Install" en wacht tot het klaar is
+:::
+
+:::warning
+**Start je computer opnieuw op na de installatie van Git.** Door te herstarten worden alle instellingen automatisch goed gezet. Je hoeft niets handmatig aan te passen.
+:::
+
+## NodeJS installeren
+NodeJS is een programmeer-omgeving die Claude Code veel gebruikt. Hiermee kan Claude Code zelfstandig websites en apps ontwikkelen. Je installeert dit eenmalig op je computer.
+:::steps
+1. Ga naar [de website van NodeJS](https://nodejs.org) en klik op *Get NodeJS*
+2. Kies onder het zwarte scherm voor Windows Installer (.msi) en download het programma
+3. Dubbelklik op het bestand en installeer Node.js
+:::
+
+## Installatie Python
+Met Python is veel mogelijk. Van losse applicaties tot scripts, tot uitgebreide berekeningen en analyses. Claude Code wil dit vaak gebruiken in de ontwikkeling, daarom installeren we het nu.
+:::steps
+1. Ga naar [de website van Python](https://python.org)
+2. In de navigatie zie je Downloads. Ga er overheen en je ziet direct staan "Download stand-alone installer". Klik er op en download naar je computer
+3. Dubbelklik op het bestand en installeer Python met de optie "*Install now*"
+
+
+
+Hiermee heb je alle hulpprogramma's geinstalleerd.
+:::
+:::
+
+## Eerste keer opstarten
+
+:::steps
+1. **Open de Claude app** -- Je ziet een welkomstscherm met de mogelijkheid om in te loggen.
+
+:::image{os=mac}
+
+:::
+:::image{os=windows}
+
+:::
+
+2. **Log in met je Claude account** -- Kies om in te loggen via email of Google. Je browser opent automatisch. Geef toestemming voor de desktop app.
+
+3. **Schakel over naar Claude Code** -- Na het inloggen land je in Claude Chat. Bovenin het scherm zie je een schakelaar. Zet die om naar **Claude Code**. Dit hoef je maar een keer te doen.
+
+
+
+4. **Je ziet het Claude Code scherm** -- Een chat interface in het midden en een overzicht van gesprekken links. Je bent klaar!
+:::
+
+## Projectmap aanmaken
+
+Claude Code werkt altijd binnen een projectmap. Maak vooraf een map aan waar je tijdens de workshop in gaat werken.
+
+:::if{os=mac}
+:::steps
+1. Maak een map aan met de naam `Projecten` in je thuisfolder. Installeer het *niet* in je Documenten-map omdat hiermee extra lees- en schrijfrechten worden gevraagd door Mac.
+2. Op de Mac open je Finder en ga je via het menu naar Ga > Thuismap (Sneltoets Shift-CMD-H) en maak hier de submap `Projecten` aan (Archief > Nieuwe map of Shift-CMD-N)
+3. Open deze map in Claude Code via het mapicoon linksonder.
+:::
+:::
+
+:::if{os=windows}
+:::steps
+1. Maak een map aan met de naam `Projecten` in je thuisfolder. Installeer het *niet* in je Documenten-map omdat hiermee extra lees- en schrijfrechten worden gevraagd door Windows.
+2. Op Windows open je Verkenner en ga je naar de gebruikersmap (`C:/Users/[username]`) en maak hier de submap `Projecten` aan.
+3. Open deze map in Claude Code via het mapicoon linksonder.
+:::
+:::
+
+:::info
+**Let op: werk altijd in een aparte projectmap.** Geef Claude Code niet zomaar toegang tot je hele computer. Claude kan bestanden maken, aanpassen en verwijderen. Door in een aparte map te werken, beperk je wat Claude kan doen. Je computer vraagt mogelijk of Claude toegang mag tot "Documenten" - daarmee geef je alleen toegang tot de gekozen map, niet tot alles in Documenten.
+:::
+
+## Controleer of alles werkt
+
+Typ in Claude Code: `Hallo Claude, vertel me in welke map je nu bent.`
+
+Claude antwoordt met informatie over je huidige werkmap. Dit bevestigt dat alles werkt.
+
+:::checklist-verify
+- Claude abonnement actief
+- Desktop app geinstalleerd en geopend
+- Ingelogd en overgeschakeld naar Claude Code
+- Projecten-map aangemaakt en geopend in Claude Code
+:::
+
+
+## Problemen oplossen
+
+:::troubleshoot[App start niet na installatie]
+- **Mac:** Check of je de app naar Applications hebt gesleept
+- **Windows:** Probeer de installer opnieuw als administrator uit te voeren
+:::
+
+:::troubleshoot[Kan niet inloggen]
+- Check of je een Claude Pro of Max account hebt (gratis werkt niet)
+- Probeer uit te loggen en opnieuw in te loggen in je browser
+:::
+
+:::if{os=windows}
+:::troubleshoot[Foutmelding over Git in de desktop app]
+- Installeer Git via de stappen hierboven
+- Start je computer opnieuw op na de Git-installatie
+- Open daarna pas de Claude Code app weer
+:::
+:::
+
+:::troubleshoot[Geen project directory kunnen kiezen]
+- Zorg dat de Projecten-map bestaat en dat je leesrechten hebt
+- Maak een nieuwe lege map in je thuisfolder als het niet lukt
+:::
diff --git a/package-lock.json b/package-lock.json
index 4d1640b..0c217ff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
"name": "cc-course",
"version": "0.0.0",
"dependencies": {
+ "marked": "^17.0.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router-dom": "^7.13.0"
@@ -2748,6 +2749,18 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/marked": {
+ "version": "17.0.5",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.5.tgz",
+ "integrity": "sha512-6hLvc0/JEbRjRgzI6wnT2P1XuM1/RrrDEX0kPt0N7jGm1133g6X7DlxFasUIx+72aKAr904GTxhSLDrd5DIlZg==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
diff --git a/package.json b/package.json
index 90b8990..c5eb57a 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
+ "marked": "^17.0.5",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-router-dom": "^7.13.0"
diff --git a/public/images/installatie/git-install.png b/public/images/installatie/git-install.png
new file mode 100644
index 0000000..dbe2f90
Binary files /dev/null and b/public/images/installatie/git-install.png differ
diff --git a/public/images/installatie/git-time.png b/public/images/installatie/git-time.png
new file mode 100644
index 0000000..b24d5b9
Binary files /dev/null and b/public/images/installatie/git-time.png differ
diff --git a/public/images/installatie/python-install-certificates.png b/public/images/installatie/python-install-certificates.png
new file mode 100644
index 0000000..ddce6cc
Binary files /dev/null and b/public/images/installatie/python-install-certificates.png differ
diff --git a/public/images/installatie/python-install-warning.png b/public/images/installatie/python-install-warning.png
new file mode 100644
index 0000000..e7961a1
Binary files /dev/null and b/public/images/installatie/python-install-warning.png differ
diff --git a/public/images/installatie/python-self-installer.png b/public/images/installatie/python-self-installer.png
new file mode 100644
index 0000000..3ff8f7a
Binary files /dev/null and b/public/images/installatie/python-self-installer.png differ
diff --git a/src/components/editor/EditorToolbar.jsx b/src/components/editor/EditorToolbar.jsx
new file mode 100644
index 0000000..3c60edd
--- /dev/null
+++ b/src/components/editor/EditorToolbar.jsx
@@ -0,0 +1,107 @@
+/**
+ * EditorToolbar.jsx - Toolbar met opmaakknoppen voor de Markdown editor
+ *
+ * Biedt knoppen voor veelgebruikte Markdown opmaak en custom directives.
+ * Elke knop voegt de juiste syntax in rond de huidige selectie in de textarea.
+ */
+
+import { useCallback } from 'react';
+
+/**
+ * @param {object} props
+ * @param {React.RefObject} props.textareaRef - Ref naar de textarea
+ * @param {function} props.onChange - Callback wanneer content wijzigt
+ * @param {function} props.onSave - Callback voor opslaan
+ * @param {boolean} props.isDirty - Of er onopgeslagen wijzigingen zijn
+ * @param {boolean} props.isSaving - Of er momenteel opgeslagen wordt
+ */
+export default function EditorToolbar({ textareaRef, onChange, onSave, isDirty, isSaving }) {
+ const applyFormat = useCallback((prefix, suffix = '') => {
+ const textarea = textareaRef.current;
+ if (!textarea) return;
+
+ const start = textarea.selectionStart;
+ const end = textarea.selectionEnd;
+ const value = textarea.value;
+ const selected = value.substring(start, end);
+
+ const replacement = selected
+ ? `${prefix}${selected}${suffix}`
+ : `${prefix}tekst${suffix}`;
+
+ const newValue = value.substring(0, start) + replacement + value.substring(end);
+ textarea.value = newValue;
+
+ if (selected) {
+ textarea.selectionStart = start + prefix.length;
+ textarea.selectionEnd = start + prefix.length + selected.length;
+ } else {
+ textarea.selectionStart = start + prefix.length;
+ textarea.selectionEnd = start + prefix.length + 'tekst'.length;
+ }
+
+ textarea.focus();
+ onChange(newValue);
+ }, [textareaRef, onChange]);
+
+ const insertSnippet = useCallback((snippet) => {
+ const textarea = textareaRef.current;
+ if (!textarea) return;
+
+ const start = textarea.selectionStart;
+ const value = textarea.value;
+
+ const before = start > 0 && value[start - 1] !== '\n' ? '\n\n' : '\n';
+ const text = before + snippet + '\n';
+
+ const newValue = value.substring(0, start) + text + value.substring(start);
+ textarea.value = newValue;
+ textarea.selectionStart = start + text.length;
+ textarea.selectionEnd = start + text.length;
+ textarea.focus();
+ onChange(newValue);
+ }, [textareaRef, onChange]);
+
+ return (
+
+ );
+}
+
+/**
+ * Conditioneel blok - toont alleen als de context-waarde matcht.
+ */
+function ConditionalBlock({ block, context }) {
+ const contextValue = getContextValue(block.key, context);
+ if (contextValue !== block.value) return null;
+ return <>{renderBlocks(block.blocks, context)}>;
+}
+
+/**
+ * Conditionele afbeelding - toont alleen als OS matcht.
+ */
+function ConditionalImageBlock({ block, context }) {
+ const contextValue = getContextValue(block.key, context);
+ if (contextValue !== block.value) return null;
+ return (
+
+ );
+}
+
+/**
+ * Probleemoplossing kaart.
+ */
+function TroubleshootBlock({ title, content }) {
+ return (
+
+
{title}
+
+
+ );
+}
diff --git a/src/pages/Installatie.jsx b/src/pages/Installatie.jsx
index 5d8ef88..df1c40a 100644
--- a/src/pages/Installatie.jsx
+++ b/src/pages/Installatie.jsx
@@ -1,18 +1,39 @@
/**
* Installatie.jsx - Installatie-instructies voor workshop deelnemers
*
- * Onepager met stap-voor-stap installatie van de Claude Code desktop app.
- * Bevat OS-tabs (Mac/Windows) en een accordion voor terminal-uitleg.
+ * Rendert content uit content/installatie.md via een custom Markdown parser.
+ * Bevat OS-tabs (Mac/Windows), accordions en andere interactieve elementen.
+ *
+ * Editor modus: bereikbaar via /installatie?editor=
+ * De secret wordt geconfigureerd in src/config/editor.js
*/
-import { useState } from 'react';
-import { Link } from 'react-router-dom';
+import { useState, lazy, Suspense } from 'react';
+import { Link, useSearchParams } from 'react-router-dom';
+import { parseDocument } from '../lib/markdown/directives';
+import { renderBlocks } from '../lib/markdown/render';
+import { EDITOR_CONFIG } from '../config/editor';
+import installatieContent from '../../content/installatie.md?raw';
+
+// Editor lazy-loaded zodat het niet in de productie bundle zit
+const MarkdownEditor = lazy(() => import('../components/editor/MarkdownEditor'));
function Installatie() {
- // Terminal accordion: standaard dicht
- const [terminalOpen, setTerminalOpen] = useState(false);
- // OS-tab: standaard Mac
const [activeOS, setActiveOS] = useState('mac');
+ const [searchParams] = useSearchParams();
+ const [content, setContent] = useState(installatieContent);
+
+ // Editor alleen beschikbaar in dev mode (niet op productie)
+ const showEditor =
+ import.meta.env.DEV &&
+ EDITOR_CONFIG.enabled &&
+ searchParams.get('editor') === EDITOR_CONFIG.secret;
+
+ // Parse de Markdown content
+ const { frontmatter, blocks } = parseDocument(content);
+
+ // Context die gedeeld wordt met de renderer (voor OS-tabs etc.)
+ const context = { activeOS, setActiveOS };
return (
@@ -34,476 +55,43 @@ function Installatie() {
{/* Content */}
- {/* Intro */}
-
Installatie-instructies
-
- Bereid je voor op de workshop door Claude Code alvast te installeren.
- Volg onderstaande stappen en je bent binnen 10 minuten klaar.
-
-
- {/* Sectie 1: Wat je nodig hebt */}
-
-
Wat je nodig hebt
-
-
-
-
-
-
Een Claude abonnement
-
- Claude Code werkt alleen met een{' '}
-
- betaald Claude account
-
- . Claude Pro kost $18/maand, Claude Max $90/maand. Start met Pro.
-
-
-
-
-
-
-
Een Mac of Windows computer
-
De desktop app werkt op beide platforms. Neem deze laptop mee naar de workshop.
-
-
-
-
-
-
Een internetverbinding
-
Voor het downloaden en om met Claude te communiceren. Je installeert een app, maar de AI draait online.
-
-
-
-
-
-
- {/* Sectie 2: Desktop of terminal? */}
-
-
Desktop of terminal?
-
- Claude Code kun je op twee manieren gebruiken: via de desktop app of via de terminal (command line).
- Beide zijn volwaardig. Voor deze workshop starten we met de desktop app - die is het makkelijkst om mee te beginnen.
-
-
- Het is wel handig om te weten wat de terminal is. Als je daar al bekend mee bent, sla dit dan over.
-
-
-
-
-
- {terminalOpen && (
-
-
- Een terminal is een venster waar je tekstcommando's typt in plaats van te klikken.
- Je hoeft dit niet te beheersen voor de workshop, maar het helpt om te weten dat het bestaat.
-
-
-
-
Terminal openen:
-
-
- Mac:
- Druk Cmd + Spatie, typ "Terminal", druk Enter
-
-
- Windows:
- Druk de Windows-toets, typ "PowerShell", klik erop
-
-
-
-
-
-
4 basiscommando's:
-
-
-
pwd
-
Waar ben ik? Toont het pad naar je huidige map.
-
-
-
ls
-
Wat staat hier? Toont bestanden en mappen. Op Windows: dir
- 1
- Download het .exe bestand van claude.com/download
-
-
- 2
- Dubbelklik op het bestand om de installer te starten
-
-
- 3
- Volg de installatiestappen
-
-
- 4
- Claude Code wordt automatisch toegevoegd aan je Start menu
-
-
-
-
- )}
-
-
- {/* Sectie 4: Git voor Windows (alleen zichtbaar bij Windows) */}
- {activeOS === 'windows' && (
-
-
Git installeren (Windows)
-
-
- Op Windows heb je Git nodig om foutmeldingen in de Claude Code desktop app te voorkomen.
- Git is een programma dat Claude Code gebruikt om je bestanden bij te houden.
-
- Claude Code werkt altijd binnen een projectmap. Maak vooraf een map aan waar je tijdens de workshop in gaat werken.
-
-
-
-
- 1
-
-
- Maak een map aan met de naam{' '}
- Projecten
- {' '}in je Documenten (via Finder op Mac of Verkenner op Windows)
-
-
-
-
- 2
-
-
- Open deze map in Claude Code via het mapicoon rechtsboven
- (of Cmd+O op Mac,{' '}
- Ctrl+O op Windows)
-
-
-
-
-
- {/* Waarschuwing over toegang */}
-
-
Let op: werk altijd in een aparte projectmap
-
- Geef Claude Code niet zomaar toegang tot je hele computer. Claude kan bestanden maken, aanpassen en verwijderen.
- Door in een aparte map te werken, beperk je wat Claude kan doen. Je computer vraagt mogelijk of Claude toegang mag
- tot "Documenten" - daarmee geef je alleen toegang tot de gekozen map, niet tot alles in Documenten.
-
-
-
-
-
- {/* Sectie 7: Verificatie */}
-
-
Controleer of alles werkt
-
-
- Typ in Claude Code:{' '}
- Hallo Claude, vertel me waar ik ben.
-
-
- Claude antwoordt met informatie over je huidige werkmap. Dit bevestigt dat alles werkt.
-
-
-
-
Checklist:
-
-
-
- Claude abonnement actief
-
-
-
- Desktop app geinstalleerd en geopend
-
-
-
- Ingelogd en overgeschakeld naar Claude Code
-
-
-
- Projecten-map aangemaakt en geopend in Claude Code
-
- {activeOS === 'windows' && (
-
-
- Git geinstalleerd en computer herstart
-
- )}
-
-
-
-
-
- {/* Sectie 8: Problemen oplossen */}
-
-
Problemen oplossen
-
-
-
App start niet na installatie
-
-
Mac: Check of je de app naar Applications hebt gesleept
-
Windows: Probeer de installer opnieuw als administrator uit te voeren
-
-
-
-
-
Kan niet inloggen
-
-
Check of je een Claude Pro of Max account hebt (gratis werkt niet)
-
Probeer uit te loggen en opnieuw in te loggen in je browser
-
-
-
- {activeOS === 'windows' && (
-
-
Foutmelding over Git in de desktop app
-
-
Installeer Git via de stappen hierboven
-
Start je computer opnieuw op na de Git-installatie
-
Open daarna pas de Claude Code app weer
-
-
- )}
-
-
-
Geen project directory kunnen kiezen
-
-
Zorg dat de Projecten-map bestaat en dat je leesrechten hebt
-
Maak een nieuwe lege map in je Documenten als het niet lukt