<!DOCTYPE html>
<html lang="nl" class="scroll-smooth">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>De Persoonsvorm – Single Page</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<style>
body{font-family:'Inter',sans-serif}
.word-span{cursor:pointer;padding:2px 4px;border-radius:4px;transition:background-color .2s,color .2s}
.word-span:hover{background:#e0f2fe}
.correct{background:#dcfce7;color:#166534;font-weight:600}
.incorrect{background:#fee2e2;color:#991b1b}
.disabled{pointer-events:none}
</style>
</head>
<body class="bg-stone-50 text-slate-800">
<!-- HEADER -->
<header class="bg-white/80 backdrop-blur border-b border-stone-200 sticky top-0 z-10">
<nav class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<h1 class="text-xl font-bold text-sky-700">De Persoonsvorm</h1>
<div class="hidden sm:flex gap-6 text-sm">
<a href="#intro" class="text-slate-600 hover:text-sky-700">Introductie</a>
<a href="#uitleg" class="text-slate-600 hover:text-sky-700">Uitleg</a>
<a href="#oefenen" class="text-slate-600 hover:text-sky-700">Oefenen</a>
<a href="#checklist" class="text-slate-600 hover:text-sky-700">Checklist</a>
</div>
</nav>
</header>
<main class="max-w-4xl mx-auto p-4 sm:p-6 md:p-8 space-y-16">
<!-- INTRO -->
<section id="intro" class="text-center">
<h2 class="text-3xl font-bold mb-4">Wat gaat hier mis?</h2>
<p class="text-lg text-slate-600 mb-6">Je krijgt een appje van een vriend(in). Er klopt iets niet helemaal…</p>
<div class="bg-white p-6 rounded-xl shadow-md border border-stone-200 text-2xl font-mono text-left">
<p>"morgen ik naar de stad <span class="bg-yellow-200 rounded px-2">ga</span>, kom je ook?"</p>
</div>
<!-- Antwoord verbergen tot klik (didactisch netter op één pagina) -->
<button id="toon-uitleg-btn"
class="mt-6 inline-flex items-center justify-center rounded-lg bg-sky-600 text-white px-5 py-2 hover:bg-sky-700">
Toon uitleg bij deze fout
</button>
<p id="intro-uitleg" class="mt-4 text-slate-600 hidden">
Eén woord staat op de verkeerde plek. Als je dat woord verplaatst, klopt de zin ineens wél.
Dat speciale woord noemen we de <strong>persoonsvorm</strong>. Vandaag leer je hoe je die in elke zin vindt.
</p>
<div class="mt-6">
<a href="#uitleg" class="text-sky-700 underline">Ga door naar de Uitleg ↓</a>
</div>
</section>
<!-- UITLEG -->
<section id="uitleg" class="space-y-8">
<div class="text-center">
<h2 class="text-3xl font-bold mb-2">De Uitleg: Twee Handige Proefjes</h2>
<p class="text-lg text-slate-600">De persoonsvorm (pv) is de motor van de zin. Met deze twee proefjes vind je ’m altijd.</p>
</div>
<div class="grid md:grid-cols-2 gap-8">
<div class="bg-white p-6 rounded-xl shadow-md border border-stone-200">
<h3 class="text-2xl font-bold mb-4 text-sky-700">Proef 1: De Vraagproef</h3>
<p class="text-slate-600 mb-4">Maak van de zin een ja/nee-vraag. Het werkwoord dat vooraan komt te staan, is de persoonsvorm.</p>
<div class="bg-stone-100 p-4 rounded-lg space-y-3">
<p class="text-lg" id="vraagproef-zin">De voetballer schiet de bal in het doel.</p>
<button id="btn-vraagproef" class="bg-sky-600 text-white px-4 py-2 rounded-lg hover:bg-sky-700">Voer de vraagproef uit</button>
</div>
</div>
<div class="bg-white p-6 rounded-xl shadow-md border border-stone-200">
<h3 class="text-2xl font-bold mb-4 text-sky-700">Proef 2: De Tijdproef</h3>
<p class="text-slate-600 mb-4">Zet de zin in een andere tijd. Het werkwoord dat verandert, is de persoonsvorm.</p>
<div class="bg-stone-100 p-4 rounded-lg space-y-3">
<p class="text-lg" id="tijdproef-zin">De voetballer schiet de bal in het doel.</p>
<button id="btn-tijdproef" class="bg-sky-600 text-white px-4 py-2 rounded-lg hover:bg-sky-700">Voer de tijdproef uit</button>
</div>
</div>
</div>
<div class="text-center">
<a href="#oefenen" class="inline-flex items-center justify-center rounded-lg bg-slate-700 text-white px-5 py-2 hover:bg-slate-800">
Naar de oefeningen →
</a>
</div>
</section>
<!-- OEFENEN -->
<section id="oefenen" class="space-y-6">
<div class="text-center">
<h2 class="text-3xl font-bold mb-2">Tijd om te oefenen</h2>
<p class="text-lg text-slate-600">Klik op het woord dat volgens jou de persoonsvorm is. Je krijgt meteen feedback.</p>
</div>
<div class="bg-white p-8 rounded-xl shadow-lg border border-stone-200">
<div id="quiz-start" class="space-y-4 text-center">
<p class="text-slate-600">Je gaat 15 zinnen oefenen. Klik op de knop om te beginnen.</p>
<button id="start-btn" class="bg-sky-600 text-white px-6 py-3 rounded-lg text-lg hover:bg-sky-700">Start met Oefenen</button>
</div>
<div id="quiz-area" class="hidden">
<div class="flex justify-between items-center mb-4">
<p id="progress-text" class="text-sm text-slate-500">Zin 1 van 15</p>
<p id="score-text" class="text-sm font-semibold text-green-600">Score: 0</p>
</div>
<div class="bg-slate-100 h-2 w-full rounded-full mb-6">
<div id="progress-bar" class="bg-sky-500 h-2 rounded-full transition-all duration-300" style="width:0%"></div>
</div>
<p id="sentence-container" class="text-2xl text-center leading-loose mb-3"></p>
<p id="feedback-text" class="text-center font-semibold h-6"></p>
<button id="next-button" class="hidden mt-4 block w-full max-w-xs mx-auto bg-slate-700 text-white px-6 py-2 rounded-lg hover:bg-slate-800">
Volgende zin
</button>
<div class="mt-8 border-t pt-6">
<h4 class="font-semibold mb-2">Bonus-oefenzin (zonder internet/AI)</h4>
<p class="text-sm text-slate-500 mb-3">Klik om een extra zin te krijgen uit een interne lijst.</p>
<button id="bonus-btn" class="bg-indigo-600 text-white px-4 py-2 rounded-lg hover:bg-indigo-700">Genereer bonuszin</button>
<div id="bonus-wrap" class="mt-4">
<p id="bonus-sentence" class="text-2xl text-center leading-loose mb-2"></p>
<p id="bonus-feedback" class="text-center font-semibold h-6"></p>
</div>
</div>
</div>
<div id="quiz-end" class="hidden text-center">
<h3 class="text-2xl font-bold mb-2">Goed gedaan!</h3>
<p id="final-score" class="text-lg text-slate-600 mb-4">Je hebt de oefening afgerond.</p>
<a href="#checklist" class="inline-flex items-center justify-center rounded-lg bg-sky-600 text-white px-5 py-2 hover:bg-sky-700">Ga naar de checklist</a>
</div>
</div>
</section>
<!-- CHECKLIST -->
<section id="checklist">
<div class="text-center">
<h2 class="text-3xl font-bold mb-2">Checklist & Samenvatting</h2>
<p class="text-lg text-slate-600">Onthoud dit over de persoonsvorm:</p>
</div>
<div class="mt-6 bg-white p-8 rounded-xl shadow-md border border-stone-200 space-y-4">
<div class="flex items-start gap-4">
<span class="text-green-500 text-2xl mt-1">✓</span>
<div>
<h4 class="font-semibold text-lg">De persoonsvorm is de “motor” van de zin.</h4>
<p class="text-slate-600">Het is een werkwoord dat de tijd bepaalt en meeverandert met het onderwerp.</p>
</div>
</div>
<div class="flex items-start gap-4">
<span class="text-green-500 text-2xl mt-1">✓</span>
<div>
<h4 class="font-semibold text-lg">Vraagproef.</h4>
<p class="text-slate-600">Maak een ja/nee-vraag: het werkwoord dat vooraan komt, is de pv.</p>
</div>
</div>
<div class="flex items-start gap-4">
<span class="text-green-500 text-2xl mt-1">✓</span>
<div>
<h4 class="font-semibold text-lg">Tijdproef.</h4>
<p class="text-slate-600">Verander de tijd: het werkwoord dat mee verandert, is de pv.</p>
</div>
</div>
</div>
<div class="text-center mt-6">
<a href="#intro" class="text-sky-700 underline">Terug naar boven ↑</a>
</div>
</section>
</main>
<footer class="text-center py-8 text-slate-500 text-sm">
<p>Single-page lesmateriaal. Geen dataopslag. Werkt offline.</p>
</footer>
<script>
// --- Intro: uitleg toggler ---
document.getElementById('toon-uitleg-btn').addEventListener('click', ()=>{
document.getElementById('intro-uitleg').classList.toggle('hidden');
});
// --- Uitleg: proefjes ---
let vraagproefOmgedraaid = false;
let tijdproefVerleden = false;
document.getElementById('btn-vraagproef').addEventListener('click', ()=>{
const el = document.getElementById('vraagproef-zin');
if(!vraagproefOmgedraaid){
el.innerHTML = '<span class="font-bold text-sky-700">Schiet</span> de voetballer de bal in het doel?';
} else {
el.textContent = 'De voetballer schiet de bal in het doel.';
}
vraagproefOmgedraaid = !vraagproefOmgedraaid;
});
document.getElementById('btn-tijdproef').addEventListener('click', ()=>{
const el = document.getElementById('tijdproef-zin');
if(!tijdproefVerleden){
el.innerHTML = 'De voetballer <span class="font-bold text-sky-700">schoot</span> de bal in het doel.';
} else {
el.textContent = 'De voetballer schiet de bal in het doel.';
}
tijdproefVerleden = !tijdproefVerleden;
});
// --- Oefenen: quiz ---
const questions = [
{ sentence: "De leerlingen maken hun huiswerk in de studieruimte.", answer: "maken" },
{ sentence: "Mijn oma bakt de lekkerste appeltaart van de wereld.", answer: "bakt" },
{ sentence: "De snelle spits scoorde in de laatste minuut.", answer: "scoorde" },
{ sentence: "Jij hebt een nieuwe fiets voor je verjaardag gekregen.", answer: "hebt" },
{ sentence: "Onze hond blaft altijd naar de postbode.", answer: "blaft" },
{ sentence: "De meester vertelt een spannend verhaal.", answer: "vertelt" },
{ sentence: "De vogels floten een vrolijk lied.", answer: "floten" },
{ sentence: "Wij wonen al tien jaar in dit huis.", answer: "wonen" },
{ sentence: "De regen viel met bakken uit de hemel.", answer: "viel" },
{ sentence: "Zij werken hard voor hun proefwerk.", answer: "werken" },
{ sentence: "Vanwege het slechte weer ging de sportdag niet door.", answer: "ging" },
{ sentence: "Mijn kleine broertje speelt graag met zijn speelgoedauto's.", answer: "speelt" },
{ sentence: "De detective zocht naar sporen op de plaats delict.", answer: "zocht" },
{ sentence: "Omdat ik ziek was, miste ik het schoolfeest.", answer: "miste" },
{ sentence: "Volgende week krijgen we de cijfers van de toets terug.", answer: "krijgen" },
];
let currentIndex = 0;
let score = 0;
const quizStart = document.getElementById('quiz-start');
const quizArea = document.getElementById('quiz-area');
const quizEnd = document.getElementById('quiz-end');
const startBtn = document.getElementById('start-btn');
const sentenceContainer = document.getElementById('sentence-container');
const feedbackText = document.getElementById('feedback-text');
const nextButton = document.getElementById('next-button');
const progressText = document.getElementById('progress-text');
const scoreText = document.getElementById('score-text');
const progressBar = document.getElementById('progress-bar');
startBtn.addEventListener('click', startQuiz);
nextButton.addEventListener('click', nextQuestion);
function startQuiz(){
currentIndex = 0;
score = 0;
quizStart.classList.add('hidden');
quizEnd.classList.add('hidden');
quizArea.classList.remove('hidden');
nextButton.classList.add('hidden');
loadQuestion();
}
function loadQuestion(){
feedbackText.textContent = '';
nextButton.classList.add('hidden');
if(currentIndex >= questions.length){ return showFinal(); }
const q = questions[currentIndex];
sentenceContainer.innerHTML = '';
q.sentence.split(' ').forEach(word=>{
const span = document.createElement('span');
span.textContent = word;
span.className = 'word-span';
span.onclick = ()=> checkAnswer(span, word, q.answer);
sentenceContainer.appendChild(span);
sentenceContainer.appendChild(document.createTextNode(' '));
});
updateProgress();
}
function checkAnswer(span, selectedWord, correctAnswer){
const clean = selectedWord.replace(/[.,]/g,'');
if(clean === correctAnswer){
span.classList.add('correct');
feedbackText.textContent = 'Goed zo!';
feedbackText.style.color = '#16a34a';
score++;
} else {
span.classList.add('incorrect');
feedbackText.textContent = 'Helaas, dat is niet juist.';
feedbackText.style.color = '#dc2626';
}
// Markeer juiste antwoord
document.querySelectorAll('#sentence-container .word-span').forEach(s=>{
s.classList.add('disabled');
if(s.textContent.replace(/[.,]/g,'') === correctAnswer){
s.classList.add('correct');
}
});
nextButton.classList.remove('hidden');
updateProgress();
}
function nextQuestion(){
currentIndex++;
loadQuestion();
}
function updateProgress(){
progressText.textContent = `Zin ${Math.min(currentIndex+1, questions.length)} van ${questions.length}`;
scoreText.textContent = `Score: ${score}`;
const pct = (currentIndex / questions.length) * 100;
progressBar.style.width = pct + '%';
}
function showFinal(){
quizArea.classList.add('hidden');
quizEnd.classList.remove('hidden');
document.getElementById('final-score').textContent =
`Je hebt ${score} van de ${questions.length} goed.`;
}
// --- Bonuszin (lokale set, geen API) ---
const bonusSet = [
{ s:"De docent legt de opgave rustig uit.", a:"legt" },
{ s:"Morgen start de klas met het project.", a:"start" },
{ s:"Gisteren fietste ik naar school.", a:"fietste" },
{ s:"Wij lezen elke week een nieuw boek.", a:"lezen" },
{ s:"De kat sprong op de vensterbank.", a:"sprong" },
{ s:"Zij bakken koekjes voor de pauze.", a:"bakken" }
];
const bonusBtn = document.getElementById('bonus-btn');
const bonusSentenceEl = document.getElementById('bonus-sentence');
const bonusFeedbackEl = document.getElementById('bonus-feedback');
bonusBtn.addEventListener('click', ()=>{
bonusFeedbackEl.textContent = '';
bonusSentenceEl.innerHTML = '';
const pick = bonusSet[Math.floor(Math.random()*bonusSet.length)];
const words = pick.s.split(' ');
words.forEach(w=>{
const sp = document.createElement('span');
sp.textContent = w;
sp.className = 'word-span';
sp.onclick = ()=> {
const clean = w.replace(/[.,]/g,'');
if(clean === pick.a){
sp.classList.add('correct');
bonusFeedbackEl.textContent = 'Helemaal goed!';
bonusFeedbackEl.style.color = '#16a34a';
} else {
sp.classList.add('incorrect');
bonusFeedbackEl.textContent = 'Niet correct. Het juiste woord is gemarkeerd.';
bonusFeedbackEl.style.color = '#dc2626';
}
document.querySelectorAll('#bonus-sentence .word-span').forEach(x=>{
x.classList.add('disabled');
if(x.textContent.replace(/[.,]/g,'') === pick.a){ x.classList.add('correct'); }
});
};
bonusSentenceEl.appendChild(sp);
bonusSentenceEl.appendChild(document.createTextNode(' '));
});
bonusSentenceEl.id = 'bonus-sentence'; // ensure selector works after reset
});
</script>
</body>
</html>