{"id":2029,"date":"2026-05-10T16:26:11","date_gmt":"2026-05-10T16:26:11","guid":{"rendered":"https:\/\/withifi.muhubonurture.nl\/?page_id=2029"},"modified":"2026-07-10T04:19:51","modified_gmt":"2026-07-10T04:19:51","slug":"oefenen-met-cijfers","status":"publish","type":"page","link":"https:\/\/withifi.muhubonurture.nl\/?page_id=2029","title":{"rendered":"Oefenen Met Cijfers"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2029\" class=\"elementor elementor-2029\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-250c017 e-con-full e-flex e-con e-parent\" data-id=\"250c017\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-90e3a8e elementor-widget elementor-widget-html\" data-id=\"90e3a8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\nbody{\r\n  margin:0;\r\n  font-family:'Inter',sans-serif;\r\n}\r\n\r\n.getal-oefen-page{\r\n  min-height:100vh;\r\n  padding:7rem 7vw 4rem;\r\n  color:#263247;\r\n  background:\r\n    radial-gradient(circle at 18% 20%,rgba(255,255,255,.78) 0%,transparent 30%),\r\n    radial-gradient(circle at 82% 28%,rgba(210,232,255,.58) 0%,transparent 32%),\r\n    radial-gradient(circle at 50% 82%,rgba(232,244,255,.48) 0%,transparent 36%),\r\n    linear-gradient(135deg,#F7FBFF 0%,#EAF6FF 45%,#F4FBF7 100%);\r\n}\r\n\r\n.getal-oefen-page *{\r\n  box-sizing:border-box;\r\n}\r\n\r\n.oefen-hero{\r\n  max-width:980px;\r\n  margin:0 auto 3.5rem;\r\n  padding:3.4rem;\r\n  border-radius:42px;\r\n  background:rgba(255,255,255,.68);\r\n  border:1px solid rgba(255,255,255,.96);\r\n  box-shadow:0 16px 42px rgba(70,105,140,.08);\r\n  backdrop-filter:blur(16px);\r\n  -webkit-backdrop-filter:blur(16px);\r\n  text-align:center;\r\n}\r\n\r\n.oefen-label{\r\n  display:inline-block;\r\n  margin-bottom:22px;\r\n  padding:11px 20px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.78);\r\n  color:#4D6F91;\r\n  font-size:15px;\r\n  font-weight:900;\r\n}\r\n\r\n.oefen-hero h1{\r\n  font-size:clamp(44px,6vw,74px);\r\n  line-height:1;\r\n  margin:0 0 24px;\r\n  color:#263247;\r\n  font-weight:900;\r\n}\r\n\r\n.oefen-hero p{\r\n  font-size:19px;\r\n  line-height:1.9;\r\n  color:#4D5F75;\r\n  font-weight:650;\r\n  max-width:760px;\r\n  margin:0 auto;\r\n}\r\n\r\n.brain-info{\r\n  max-width:980px;\r\n  margin:0 auto 2rem;\r\n  padding:1.4rem;\r\n  border-radius:26px;\r\n  background:rgba(255,255,255,.72);\r\n  border:1px solid rgba(255,255,255,.94);\r\n  text-align:center;\r\n  color:#4D5F75;\r\n  font-weight:800;\r\n  line-height:1.7;\r\n}\r\n\r\n.brain-pills{\r\n  display:flex;\r\n  justify-content:center;\r\n  gap:10px;\r\n  flex-wrap:wrap;\r\n  margin-top:12px;\r\n}\r\n\r\n.brain-pill{\r\n  display:inline-flex;\r\n  padding:8px 14px;\r\n  border-radius:999px;\r\n  background:#EAF6FF;\r\n  color:#365A7A;\r\n  font-size:14px;\r\n  font-weight:900;\r\n}\r\n\r\n.oefenblok{\r\n  max-width:980px;\r\n  margin:0 auto 4rem;\r\n  padding:2.6rem;\r\n  border-radius:40px;\r\n  background:rgba(255,255,255,.84);\r\n  border:1px solid rgba(255,255,255,.96);\r\n  box-shadow:0 18px 44px rgba(70,105,140,.09);\r\n  text-align:center;\r\n}\r\n\r\n.oefen-top{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:14px;\r\n  flex-wrap:wrap;\r\n  margin-bottom:22px;\r\n}\r\n\r\n.level-pill,\r\n.score-pill{\r\n  padding:10px 16px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.9);\r\n  color:#4D6F91;\r\n  font-size:14px;\r\n  font-weight:900;\r\n}\r\n\r\n.progress-wrap{\r\n  width:100%;\r\n  height:14px;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.78);\r\n  overflow:hidden;\r\n  margin:10px 0 26px;\r\n}\r\n\r\n.progress-bar{\r\n  height:100%;\r\n  width:0%;\r\n  border-radius:999px;\r\n  background:#A9D7FF;\r\n  transition:width .35s ease;\r\n}\r\n\r\n.vraag{\r\n  font-size:1.45rem;\r\n  font-weight:900;\r\n  margin-bottom:1rem;\r\n  color:#263247;\r\n}\r\n\r\n.objecten{\r\n  display:flex;\r\n  justify-content:center;\r\n  gap:.7rem;\r\n  flex-wrap:wrap;\r\n  min-height:70px;\r\n  margin:1.4rem 0;\r\n}\r\n\r\n.object{\r\n  width:62px;\r\n  height:62px;\r\n  border-radius:22px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:#DDEFFF;\r\n  font-size:2rem;\r\n  box-shadow:0 8px 20px rgba(70,105,140,.08);\r\n}\r\n\r\n.groot-cijfer{\r\n  font-size:clamp(4rem,8vw,6rem);\r\n  line-height:1;\r\n  font-weight:900;\r\n  margin:1rem 0;\r\n  color:#263247;\r\n}\r\n\r\n.groot-cijfer.woord-cijfer{\r\n  font-size:clamp(3.2rem,7vw,5.4rem);\r\n}\r\n\r\n.helper{\r\n  color:#4D5F75;\r\n  font-weight:750;\r\n  margin-bottom:1.4rem;\r\n  line-height:1.6;\r\n}\r\n\r\n.extra-uitleg{\r\n  display:none;\r\n  max-width:680px;\r\n  margin:1.2rem auto;\r\n  padding:1rem 1.3rem;\r\n  border-radius:20px;\r\n  background:#FFF8E8;\r\n  color:#665437;\r\n  font-weight:800;\r\n  line-height:1.6;\r\n}\r\n\r\n.antwoorden{\r\n  display:flex;\r\n  gap:1.1rem;\r\n  justify-content:center;\r\n  flex-wrap:wrap;\r\n  margin-top:1.5rem;\r\n}\r\n\r\n.knop{\r\n  min-width:90px;\r\n  padding:1rem 1.8rem;\r\n  border-radius:999px;\r\n  background:rgba(255,255,255,.94);\r\n  color:#263247 !important;\r\n  font-size:1.35rem;\r\n  font-weight:900;\r\n  cursor:pointer;\r\n  border:3px solid #7CB8E4;\r\n  box-shadow:0 8px 22px rgba(70,105,140,.08);\r\n  transition:all .25s ease;\r\n}\r\n\r\n.knop:hover{\r\n  transform:translateY(-3px);\r\n  background:#DDEFFF;\r\n}\r\n\r\n.knop.juist{\r\n  background:#DDF5E4 !important;\r\n  border-color:#4E9B68 !important;\r\n  color:#2F6A46 !important;\r\n}\r\n\r\n.knop.fout{\r\n  background:#FFE3E3 !important;\r\n  border-color:#D98585 !important;\r\n  color:#9A4B4B !important;\r\n  opacity:.75;\r\n}\r\n\r\n.feedback{\r\n  margin-top:1.8rem;\r\n  min-height:1.4em;\r\n  color:#4D6F91;\r\n  font-size:1.15rem;\r\n  font-weight:900;\r\n}\r\n\r\n.volgende{\r\n  display:none;\r\n  margin-top:2.2rem;\r\n}\r\n\r\n.volgende button{\r\n  padding:1rem 2.4rem;\r\n  border-radius:999px;\r\n  border:3px solid #7CB8E4;\r\n  background:rgba(255,255,255,.9);\r\n  color:#263247;\r\n  font-weight:900;\r\n  cursor:pointer;\r\n}\r\n\r\n.getal-oefen-note{\r\n  max-width:780px;\r\n  margin:4rem auto 0;\r\n  padding:2rem;\r\n  border-radius:30px;\r\n  background:\r\n    radial-gradient(circle at 12% 18%,rgba(255,255,255,.85) 0%,transparent 34%),\r\n    radial-gradient(circle at 88% 22%,rgba(210,232,255,.58) 0%,transparent 34%),\r\n    linear-gradient(135deg,#FFF8EF 0%,#F3FBF8 48%,#EEF7FE 100%);\r\n  color:#4D5F75;\r\n  font-size:18px;\r\n  line-height:1.9;\r\n  font-weight:650;\r\n  text-align:center;\r\n}\r\n\r\n.getal-oefen-page.ifi-calm-mode .oefenblok{\r\n  max-width:900px;\r\n}\r\n\r\n.getal-oefen-page.ifi-calm-mode .knop{\r\n  padding:1.2rem 2rem;\r\n  font-size:1.45rem;\r\n}\r\n\r\n.getal-oefen-page.ifi-calm-mode .vraag{\r\n  font-size:1.65rem;\r\n}\r\n\r\n@media(max-width:900px){\r\n  .getal-oefen-page{\r\n    padding:5rem 6vw 3rem;\r\n  }\r\n\r\n  .oefen-hero,\r\n  .oefenblok{\r\n    padding:2rem;\r\n  }\r\n\r\n  .oefen-top{\r\n    justify-content:center;\r\n  }\r\n\r\n  .knop{\r\n    width:100%;\r\n  }\r\n}\r\n<\/style>\r\n\r\n<section class=\"getal-oefen-page\" id=\"getallenHerkennenOefening\">\r\n\r\n  <div class=\"oefen-hero\">\r\n    <div class=\"oefen-label\">\ud83d\udd22 Getallenwereld<\/div>\r\n\r\n    <h1>\r\n      Oefenen met cijfers,\r\n      <span class=\"ifi-child-name\">kanjer<\/span>.\r\n    <\/h1>\r\n\r\n    <p id=\"heroText\">\r\n      Kijk rustig. Welk cijfer past erbij?\r\n      We oefenen stap voor stap.\r\n    <\/p>\r\n  <\/div>\r\n\r\n  <div class=\"brain-info\">\r\n    <strong>\ud83e\udde0 Ifi heeft deze oefening voor jou klaargezet<\/strong>\r\n\r\n    <div class=\"brain-pills\">\r\n      <span class=\"brain-pill\" id=\"brainLevel\">Niveau wordt geladen<\/span>\r\n      <span class=\"brain-pill\" id=\"brainQuestionCount\">Aantal vragen wordt geladen<\/span>\r\n      <span class=\"brain-pill\" id=\"brainStyle\">Leerstijl wordt geladen<\/span>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"oefenblok\">\r\n\r\n    <div class=\"oefen-top\">\r\n      <div class=\"level-pill\" id=\"levelNaam\"><\/div>\r\n      <div class=\"score-pill\" id=\"scoreTekst\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"progress-wrap\">\r\n      <div class=\"progress-bar\" id=\"progressBar\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"vraag\" id=\"vraag\"><\/div>\r\n    <div class=\"objecten\" id=\"objecten\"><\/div>\r\n    <div class=\"groot-cijfer\" id=\"grootCijfer\"><\/div>\r\n    <div class=\"helper\" id=\"helper\"><\/div>\r\n    <div class=\"extra-uitleg\" id=\"extraUitleg\"><\/div>\r\n    <div class=\"antwoorden\" id=\"antwoorden\"><\/div>\r\n    <div class=\"feedback\" id=\"feedback\"><\/div>\r\n\r\n    <div class=\"volgende\" id=\"volgende\">\r\n      <button type=\"button\" id=\"volgendeBtn\">Volgende vraag \ud83c\udf3f<\/button>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <div class=\"getal-oefen-note\">\r\n    Kleine reminder \ud83c\udf38<br>\r\n    Je hoeft niet snel te tellen.\r\n    Kijk rustig en kies het antwoord dat past.\r\n  <\/div>\r\n\r\n<\/section>\r\n\r\n<script>\r\n(function(){\r\n  const WORLD = \"getallenwereld\";\r\n  const TOPIC = \"Getallen herkennen\";\r\n\r\n  const PAGE = document.getElementById(\"getallenHerkennenOefening\");\r\n\r\nconst profile = getActiveProfile();\r\nconst settings = getBrainSettings();\r\n\r\n  const levelNaam = document.getElementById(\"levelNaam\");\r\n  const scoreTekst = document.getElementById(\"scoreTekst\");\r\n  const progressBar = document.getElementById(\"progressBar\");\r\n  const vraagEl = document.getElementById(\"vraag\");\r\n  const objectenEl = document.getElementById(\"objecten\");\r\n  const grootCijferEl = document.getElementById(\"grootCijfer\");\r\n  const helperEl = document.getElementById(\"helper\");\r\n  const extraUitlegEl = document.getElementById(\"extraUitleg\");\r\n  const antwoordenEl = document.getElementById(\"antwoorden\");\r\n  const feedbackEl = document.getElementById(\"feedback\");\r\n  const volgende = document.getElementById(\"volgende\");\r\n  const volgendeBtn = document.getElementById(\"volgendeBtn\");\r\n\r\nconst questionBanks = [\r\n  {\r\n    minGroup:1,\r\n    maxGroup:2,\r\n    naam:\"\ud83c\udf31 Niveau 1: Cijfers 1 tot en met 5\",\r\n    questions:[\r\n      {type:\"word\",word:\"een\",answer:\"1\",options:[\"1\",\"2\",\"3\"]},\r\n      {type:\"word\",word:\"twee\",answer:\"2\",options:[\"1\",\"2\",\"4\"]},\r\n      {type:\"word\",word:\"drie\",answer:\"3\",options:[\"2\",\"3\",\"5\"]},\r\n      {type:\"visual\",amount:1,icon:\"\ud83c\udf38\",answer:\"1\",options:[\"1\",\"2\",\"3\"]},\r\n      {type:\"visual\",amount:2,icon:\"\u2b50\",answer:\"2\",options:[\"1\",\"2\",\"4\"]},\r\n      {type:\"visual\",amount:3,icon:\"\ud83c\udf4e\",answer:\"3\",options:[\"2\",\"3\",\"5\"]},\r\n      {type:\"visual\",amount:4,icon:\"\ud83e\uddf8\",answer:\"4\",options:[\"3\",\"4\",\"5\"]},\r\n      {type:\"visual\",amount:5,icon:\"\ud83d\udc1d\",answer:\"5\",options:[\"3\",\"4\",\"5\"]},\r\n      {type:\"number\",number:\"1\",answer:\"een\",options:[\"een\",\"twee\",\"drie\"]},\r\n      {type:\"number\",number:\"4\",answer:\"vier\",options:[\"drie\",\"vier\",\"vijf\"]}\r\n    ]\r\n  },\r\n\r\n  {\r\n    minGroup:3,\r\n    maxGroup:4,\r\n    naam:\"\ud83c\udf3f Niveau 2: Cijfers 6 tot en met 10\",\r\n    questions:[\r\n      {type:\"word\",word:\"zes\",answer:\"6\",options:[\"5\",\"6\",\"7\"]},\r\n      {type:\"word\",word:\"zeven\",answer:\"7\",options:[\"6\",\"7\",\"8\"]},\r\n      {type:\"word\",word:\"acht\",answer:\"8\",options:[\"7\",\"8\",\"9\"]},\r\n      {type:\"word\",word:\"negen\",answer:\"9\",options:[\"8\",\"9\",\"10\"]},\r\n      {type:\"word\",word:\"tien\",answer:\"10\",options:[\"8\",\"9\",\"10\"]},\r\n      {type:\"visual\",amount:6,icon:\"\ud83c\udf38\",answer:\"6\",options:[\"5\",\"6\",\"7\"]},\r\n      {type:\"visual\",amount:7,icon:\"\u2b50\",answer:\"7\",options:[\"6\",\"7\",\"8\"]},\r\n      {type:\"visual\",amount:8,icon:\"\ud83c\udf4e\",answer:\"8\",options:[\"7\",\"8\",\"9\"]},\r\n      {type:\"visual\",amount:9,icon:\"\ud83e\uddf8\",answer:\"9\",options:[\"8\",\"9\",\"10\"]},\r\n      {type:\"visual\",amount:10,icon:\"\ud83d\udc1d\",answer:\"10\",options:[\"8\",\"9\",\"10\"]},\r\n      {type:\"number\",number:\"6\",answer:\"zes\",options:[\"vijf\",\"zes\",\"zeven\"]},\r\n      {type:\"number\",number:\"9\",answer:\"negen\",options:[\"acht\",\"negen\",\"tien\"]}\r\n    ]\r\n  },\r\n\r\n  {\r\n    minGroup:5,\r\n    maxGroup:6,\r\n    naam:\"\ud83c\udf33 Niveau 3: Getallen 11 tot en met 20\",\r\n    questions:[\r\n      {type:\"word\",word:\"elf\",answer:\"11\",options:[\"10\",\"11\",\"12\",\"13\"]},\r\n      {type:\"word\",word:\"twaalf\",answer:\"12\",options:[\"11\",\"12\",\"13\",\"14\"]},\r\n      {type:\"word\",word:\"dertien\",answer:\"13\",options:[\"12\",\"13\",\"14\",\"15\"]},\r\n      {type:\"word\",word:\"veertien\",answer:\"14\",options:[\"13\",\"14\",\"15\",\"16\"]},\r\n      {type:\"word\",word:\"vijftien\",answer:\"15\",options:[\"14\",\"15\",\"16\",\"17\"]},\r\n      {type:\"word\",word:\"zestien\",answer:\"16\",options:[\"15\",\"16\",\"17\",\"18\"]},\r\n      {type:\"word\",word:\"zeventien\",answer:\"17\",options:[\"16\",\"17\",\"18\",\"19\"]},\r\n      {type:\"word\",word:\"achttien\",answer:\"18\",options:[\"17\",\"18\",\"19\",\"20\"]},\r\n      {type:\"word\",word:\"negentien\",answer:\"19\",options:[\"18\",\"19\",\"20\",\"21\"]},\r\n      {type:\"word\",word:\"twintig\",answer:\"20\",options:[\"18\",\"19\",\"20\",\"21\"]},\r\n      {type:\"number\",number:\"12\",answer:\"twaalf\",options:[\"elf\",\"twaalf\",\"dertien\",\"veertien\"]},\r\n      {type:\"number\",number:\"18\",answer:\"achttien\",options:[\"zestien\",\"zeventien\",\"achttien\",\"negentien\"]}\r\n    ]\r\n  },\r\n\r\n  {\r\n    minGroup:7,\r\n    maxGroup:8,\r\n    naam:\"\u2b50 Niveau 4: Getallen tot en met 100\",\r\n    questions:[\r\n      {type:\"word\",word:\"eenentwintig\",answer:\"21\",options:[\"19\",\"20\",\"21\",\"22\"]},\r\n      {type:\"word\",word:\"dertig\",answer:\"30\",options:[\"20\",\"30\",\"40\",\"50\"]},\r\n      {type:\"word\",word:\"twee\u00ebnveertig\",answer:\"42\",options:[\"24\",\"32\",\"42\",\"52\"]},\r\n      {type:\"word\",word:\"achtenvijftig\",answer:\"58\",options:[\"48\",\"58\",\"68\",\"78\"]},\r\n      {type:\"word\",word:\"vierenzeventig\",answer:\"74\",options:[\"64\",\"74\",\"84\",\"94\"]},\r\n      {type:\"word\",word:\"negenennegentig\",answer:\"99\",options:[\"89\",\"90\",\"99\",\"100\"]},\r\n      {type:\"number\",number:\"25\",answer:\"vijfentwintig\",options:[\"vijfentwintig\",\"vijfendertig\",\"vijfenveertig\",\"vijftien\"]},\r\n      {type:\"number\",number:\"40\",answer:\"veertig\",options:[\"dertig\",\"veertig\",\"vijftig\",\"zestig\"]},\r\n      {type:\"number\",number:\"63\",answer:\"drie\u00ebnzestig\",options:[\"drie\u00ebnvijftig\",\"drie\u00ebnzestig\",\"drie\u00ebnzeventig\",\"drie\u00ebntachtig\"]},\r\n      {type:\"number\",number:\"80\",answer:\"tachtig\",options:[\"zeventig\",\"tachtig\",\"negentig\",\"honderd\"]},\r\n      {type:\"number\",number:\"91\",answer:\"eenennegentig\",options:[\"eenenzeventig\",\"eenentachtig\",\"eenennegentig\",\"negenennegentig\"]},\r\n      {type:\"number\",number:\"100\",answer:\"honderd\",options:[\"negentig\",\"honderd\",\"duizend\",\"tien\"]}\r\n    ]\r\n  }\r\n];\r\n\r\n  let bankIndex = getBankIndex(settings.level);\r\n  let questions = createSessionQuestions(questionBanks[bankIndex].questions);\r\n  let current = 0;\r\n  let correctCount = 0;\r\n  let firstTryCorrect = 0;\r\n  let wrongAttempts = 0;\r\n  let locked = false;\r\n  let currentAnswer = \"\";\r\n\r\n  initialise();\r\n\r\n  function initialise(){\r\n    if(settings.calmMode){\r\n      PAGE.classList.add(\"ifi-calm-mode\");\r\n    }\r\n\r\n    document.querySelectorAll(\".ifi-child-name\").forEach(function(el){\r\n      el.textContent = profile.name || \"kanjer\";\r\n    });\r\n\r\n    document.getElementById(\"brainLevel\").textContent =\r\n      \"Niveau: groep \" + settings.level;\r\n\r\n    document.getElementById(\"brainQuestionCount\").textContent =\r\n      questions.length + \" vragen\";\r\n\r\n    document.getElementById(\"brainStyle\").textContent =\r\n      readableStyles(settings.learningStyle);\r\n\r\n    if(settings.extraExplanation){\r\n      document.getElementById(\"heroText\").textContent =\r\n        \"Ifi legt iedere stap rustig uit. Lees, kijk en probeer daarna zelf.\";\r\n    }\r\n\r\n    loadQuestion();\r\n  }\r\n\r\n  function getBrainSettings(){\r\n    if(\r\n      window.WithIfiBrain &&\r\n      typeof window.WithIfiBrain.getExerciseSettings === \"function\"\r\n    ){\r\n      return normaliseSettings(\r\n        window.WithIfiBrain.getExerciseSettings(WORLD,TOPIC)\r\n      );\r\n    }\r\n\r\n    if(\r\n      window.WithIfi &&\r\n      typeof window.WithIfi.getExerciseSettings === \"function\"\r\n    ){\r\n      return normaliseSettings(\r\n        window.WithIfi.getExerciseSettings(WORLD,TOPIC)\r\n      );\r\n    }\r\n\r\n    return buildSettingsFromStorage();\r\n  }\r\n\r\n  function normaliseSettings(raw){\r\n    raw = raw || {};\r\n\r\n    return {\r\n      level:Number(raw.level) || getStoredTopicLevel(),\r\n      childName:raw.childName || profile.name || \"kanjer\",\r\n      learningStyle:Array.isArray(raw.learningStyle)\r\n        ? raw.learningStyle\r\n        : [],\r\n      calmMode:Boolean(raw.calmMode),\r\n      visualSupport:Boolean(\r\n        raw.visualSupport || raw.showVisualSupport\r\n      ),\r\n      extraExplanation:Boolean(\r\n        raw.extraExplanation || raw.showExtraExplanation\r\n      ),\r\n      challengeMode:Boolean(raw.challengeMode),\r\n      questionCount:Number(raw.questionCount) || 8,\r\n      hintCount:Number(raw.hintCount) || 1,\r\n      answerCount:Number(raw.answerCount) || 3\r\n    };\r\n  }\r\n\r\n  function buildSettingsFromStorage(){\r\n    const styles = Array.isArray(profile.learningStyle)\r\n      ? profile.learningStyle\r\n      : (profile.learningStyle ? [profile.learningStyle] : []);\r\n\r\n    return {\r\n      level:getStoredTopicLevel(),\r\n      childName:profile.name || \"kanjer\",\r\n      learningStyle:styles,\r\n      calmMode:styles.includes(\"rustig\"),\r\n      visualSupport:styles.includes(\"plaatjes\"),\r\n      extraExplanation:styles.includes(\"uitleg\"),\r\n      challengeMode:styles.includes(\"uitdaging\"),\r\n      questionCount:styles.includes(\"rustig\") ? 5 : 8,\r\n      hintCount:styles.includes(\"uitleg\") ? 2 : 1,\r\n      answerCount:styles.includes(\"uitdaging\") ? 4 : 3\r\n    };\r\n  }\r\n\r\n  function getStoredTopicLevel(){\r\n    try{\r\n      const assessment =\r\n        profile.fullAssessment ||\r\n        JSON.parse(localStorage.getItem(\"withIfiAssessmentFull\"));\r\n\r\n      const topic =\r\n        assessment &&\r\n        assessment.worlds &&\r\n        assessment.worlds[WORLD] &&\r\n        assessment.worlds[WORLD].topics &&\r\n        assessment.worlds[WORLD].topics[TOPIC];\r\n\r\n      if(topic && topic.estimatedGroup){\r\n        return Number(topic.estimatedGroup);\r\n      }\r\n    }catch(error){}\r\n\r\n    const match = String(profile.group || \"\").match(\/\\d+\/);\r\n    return match ? Number(match[0]) : 3;\r\n  }\r\n\r\n  function getActiveProfile(){\r\n    try{\r\n      return JSON.parse(\r\n        localStorage.getItem(\"withIfiChildProfile\")\r\n      ) || {};\r\n    }catch(error){\r\n      return {};\r\n    }\r\n  }\r\n\r\nfunction createSessionQuestions(source){\r\n  let count = 12;\r\n\r\n  if(settings.calmMode){\r\n    count = 8;\r\n  }\r\n\r\n  if(settings.challengeMode){\r\n    count = 16;\r\n  }\r\n\r\n  let expanded = [];\r\n\r\n  while(expanded.length < count){\r\n    expanded = expanded.concat(shuffle(source));\r\n  }\r\n\r\n  return shuffle(expanded).slice(0,count);\r\n}\r\n\r\n  function loadQuestion(){\r\n    resetQuestion();\r\n\r\n    const item = questions[current];\r\n    const bank = questionBanks[bankIndex];\r\n\r\n    levelNaam.textContent = bank.naam;\r\n    scoreTekst.textContent =\r\n      \"Vraag \" + (current + 1) + \" van \" + questions.length;\r\n\r\n    progressBar.style.width =\r\n      ((current \/ questions.length) * 100) + \"%\";\r\n\r\n    currentAnswer = item.answer;\r\n\r\n    if(item.type === \"word\" || item.type === \"woord\"){\r\n      vraagEl.textContent = \"Welk cijfer hoort bij dit woord?\";\r\n      grootCijferEl.textContent = item.word;\r\n      grootCijferEl.classList.add(\"woord-cijfer\");\r\n      helperEl.textContent = settings.extraExplanation\r\n        ? \"Lees het woord rustig. Denk daarna aan het cijfer dat erbij hoort.\"\r\n        : \"Lees rustig het woord.\";\r\n    }\r\n\r\n    if(item.type === \"visual\"){\r\n      vraagEl.textContent = \"Hoeveel zie je?\";\r\n      showObjects(item.amount,item.icon);\r\n      helperEl.textContent = settings.extraExplanation\r\n        ? \"Wijs de figuren \u00e9\u00e9n voor \u00e9\u00e9n aan terwijl je telt.\"\r\n        : \"Tel rustig de figuren.\";\r\n    }\r\n\r\n    if(item.type === \"number\"){\r\n      vraagEl.textContent = \"Welk woord hoort bij dit cijfer?\";\r\n      grootCijferEl.textContent = item.number;\r\n      helperEl.textContent = settings.extraExplanation\r\n        ? \"Kijk naar het cijfer en spreek het zachtjes uit.\"\r\n        : \"Kijk rustig naar het cijfer.\";\r\n    }\r\n\r\n    let options = shuffle(item.options);\r\n\r\n    if(!settings.challengeMode && settings.answerCount === 3){\r\n      options = reduceOptions(options,item.answer,3);\r\n    }\r\n\r\n    options.forEach(function(option){\r\n      const button = document.createElement(\"button\");\r\n      button.type = \"button\";\r\n      button.className = \"knop\";\r\n      button.textContent = option;\r\n      button.addEventListener(\"click\",function(){\r\n        checkAnswer(button,option);\r\n      });\r\n      antwoordenEl.appendChild(button);\r\n    });\r\n  }\r\n\r\n  function resetQuestion(){\r\n    locked = false;\r\n    feedbackEl.textContent = \"\";\r\n    antwoordenEl.innerHTML = \"\";\r\n    objectenEl.innerHTML = \"\";\r\n    grootCijferEl.textContent = \"\";\r\n    grootCijferEl.classList.remove(\"woord-cijfer\");\r\n    extraUitlegEl.style.display = \"none\";\r\n    extraUitlegEl.textContent = \"\";\r\n    volgende.style.display = \"none\";\r\n  }\r\n\r\n  function checkAnswer(button,choice){\r\n    if(locked) return;\r\n\r\n    if(choice === currentAnswer){\r\n      locked = true;\r\n      correctCount++;\r\n\r\n      if(wrongAttempts === 0){\r\n        firstTryCorrect++;\r\n      }\r\n\r\n      button.classList.add(\"juist\");\r\n      feedbackEl.textContent = getPositiveFeedback();\r\n\r\n      if(settings.extraExplanation){\r\n        extraUitlegEl.style.display = \"block\";\r\n        extraUitlegEl.textContent =\r\n          \"Goed gezien. Het antwoord is \" + currentAnswer + \".\";\r\n      }\r\n\r\n      volgende.style.display = \"block\";\r\n      volgendeBtn.textContent =\r\n        current === questions.length - 1\r\n          ? \"Bekijk mijn resultaat \ud83c\udf38\"\r\n          : \"Volgende vraag \ud83c\udf3f\";\r\n\r\n      volgendeBtn.onclick = function(){\r\n        current++;\r\n\r\n        if(current >= questions.length){\r\n          finishExercise();\r\n        }else{\r\n          wrongAttempts = 0;\r\n          loadQuestion();\r\n        }\r\n      };\r\n\r\n    }else{\r\n      wrongAttempts++;\r\n      button.classList.add(\"fout\");\r\n\r\n      feedbackEl.textContent = settings.calmMode\r\n        ? \"Dat geeft niets. Kijk nog eens rustig \ud83c\udf3f\"\r\n        : \"Probeer het nog een keer.\";\r\n\r\n      if(settings.extraExplanation){\r\n        extraUitlegEl.style.display = \"block\";\r\n        extraUitlegEl.textContent =\r\n          \"Lees of tel nog \u00e9\u00e9n keer. Je mag rustig de tijd nemen.\";\r\n      }\r\n    }\r\n  }\r\n\r\n  function finishExercise(){\r\n    progressBar.style.width = \"100%\";\r\n\r\n    const percentage = Math.round(\r\n      (firstTryCorrect \/ questions.length) * 100\r\n    );\r\n\r\n    vraagEl.textContent = \"Goed geoefend, \" +\r\n      (profile.name || \"kanjer\") + \" \ud83c\udf38\";\r\n\r\n    objectenEl.innerHTML = \"\";\r\n    grootCijferEl.textContent = \"\";\r\n    helperEl.textContent = \"\";\r\n    antwoordenEl.innerHTML = \"\";\r\n\r\n    feedbackEl.innerHTML =\r\n      \"Je had <strong>\" + firstTryCorrect +\r\n      \" van de \" + questions.length +\r\n      \"<\/strong> vragen meteen goed.<br>\" +\r\n      \"Jouw score is <strong>\" + percentage + \"%<\/strong>.\";\r\n\r\n    extraUitlegEl.style.display = \"block\";\r\n    extraUitlegEl.textContent = getResultAdvice(percentage);\r\n\r\n    saveExerciseResult(percentage);\r\n\r\n    volgende.style.display = \"block\";\r\n    volgendeBtn.textContent = \"Nog een keer oefenen \ud83c\udf3f\";\r\n\r\n    volgendeBtn.onclick = function(){\r\n      current = 0;\r\n      correctCount = 0;\r\n      firstTryCorrect = 0;\r\n      wrongAttempts = 0;\r\n\r\n      const newLevel = getStoredTopicLevel();\r\n      bankIndex = getBankIndex(newLevel);\r\n      questions = createSessionQuestions(\r\n        questionBanks[bankIndex].questions\r\n      );\r\n\r\n      loadQuestion();\r\n    };\r\n  }\r\n\r\n  function saveExerciseResult(percentage){\r\n    const completedAt = new Date().toISOString();\r\n    let assessment = null;\r\n\r\n    try{\r\n      assessment =\r\n        profile.fullAssessment ||\r\n        JSON.parse(localStorage.getItem(\"withIfiAssessmentFull\"));\r\n    }catch(error){}\r\n\r\n    if(!assessment){\r\n      assessment = {\r\n        childName:profile.name || \"kanjer\",\r\n        childGroup:getProfileGroup(),\r\n        testedUpToGroup:getProfileGroup(),\r\n        worlds:{},\r\n        completedAt:completedAt\r\n      };\r\n    }\r\n\r\n    assessment.worlds = assessment.worlds || {};\r\n    assessment.worlds[WORLD] =\r\n      assessment.worlds[WORLD] || {\r\n        averageGroup:settings.level,\r\n        weakestTopic:null,\r\n        strongestTopic:null,\r\n        topics:{}\r\n      };\r\n\r\n    const world = assessment.worlds[WORLD];\r\n    world.topics = world.topics || {};\r\n\r\n    const oldTopic = world.topics[TOPIC] || {};\r\n    const oldLevel =\r\n      Number(oldTopic.estimatedGroup) || settings.level;\r\n\r\n    let newLevel = oldLevel;\r\n\r\n    if(percentage >= 85){\r\n      newLevel = Math.min(oldLevel + 1,8);\r\n    }else if(percentage < 45){\r\n      newLevel = Math.max(oldLevel - 1,1);\r\n    }\r\n\r\n    const previousSessions =\r\n      Array.isArray(oldTopic.exerciseSessions)\r\n        ? oldTopic.exerciseSessions\r\n        : [];\r\n\r\n    previousSessions.push({\r\n      percentage:percentage,\r\n      level:settings.level,\r\n      correct:firstTryCorrect,\r\n      total:questions.length,\r\n      completedAt:completedAt\r\n    });\r\n\r\n    world.topics[TOPIC] = {\r\n      score:firstTryCorrect,\r\n      total:questions.length,\r\n      percentage:percentage,\r\n      mastery:percentage,\r\n      estimatedGroup:newLevel,\r\n      status:getStatus(percentage),\r\n      lastPractisedAt:completedAt,\r\n      exerciseSessions:previousSessions.slice(-20)\r\n    };\r\n\r\n    updateWorldSummary(world);\r\n\r\n    assessment.completedAt = completedAt;\r\n\r\n    localStorage.setItem(\r\n      \"withIfiAssessmentFull\",\r\n      JSON.stringify(assessment)\r\n    );\r\n\r\n    const active = getActiveProfile();\r\n\r\n    if(active && active.name){\r\n      active.fullAssessment = assessment;\r\n      active.assessments = assessment.worlds;\r\n      active.lastExercise = {\r\n        world:WORLD,\r\n        topic:TOPIC,\r\n        percentage:percentage,\r\n        completedAt:completedAt\r\n      };\r\n\r\n      localStorage.setItem(\r\n        \"withIfiChildProfile\",\r\n        JSON.stringify(active)\r\n      );\r\n\r\n      updateProfileDatabase(active);\r\n    }\r\n  }\r\n\r\n  function updateWorldSummary(world){\r\n    const topicNames = Object.keys(world.topics);\r\n\r\n    if(topicNames.length === 0) return;\r\n\r\n    let totalLevel = 0;\r\n    let weakest = null;\r\n    let strongest = null;\r\n\r\n    topicNames.forEach(function(topicName){\r\n      const item = world.topics[topicName];\r\n      const level = Number(item.estimatedGroup) || 1;\r\n      const percentage = Number(item.percentage) || 0;\r\n\r\n      totalLevel += level;\r\n\r\n      if(\r\n        !weakest ||\r\n        level < weakest.estimatedGroup ||\r\n        (\r\n          level === weakest.estimatedGroup &&\r\n          percentage < weakest.percentage\r\n        )\r\n      ){\r\n        weakest = {\r\n          topic:topicName,\r\n          estimatedGroup:level,\r\n          percentage:percentage,\r\n          status:item.status || getStatus(percentage)\r\n        };\r\n      }\r\n\r\n      if(\r\n        !strongest ||\r\n        level > strongest.estimatedGroup ||\r\n        (\r\n          level === strongest.estimatedGroup &&\r\n          percentage > strongest.percentage\r\n        )\r\n      ){\r\n        strongest = {\r\n          topic:topicName,\r\n          estimatedGroup:level,\r\n          percentage:percentage,\r\n          status:item.status || getStatus(percentage)\r\n        };\r\n      }\r\n    });\r\n\r\n    world.averageGroup = Math.round(\r\n      totalLevel \/ topicNames.length\r\n    );\r\n\r\n    world.weakestTopic = weakest;\r\n    world.strongestTopic = strongest;\r\n  }\r\n\r\n  function updateProfileDatabase(active){\r\n    try{\r\n      const raw = localStorage.getItem(\"withIfiProfiles\");\r\n      if(!raw) return;\r\n\r\n      const database = JSON.parse(raw);\r\n\r\n      database.profiles = (database.profiles || []).map(function(child){\r\n        if(child.id === active.id){\r\n          return active;\r\n        }\r\n        return child;\r\n      });\r\n\r\n      database.activeProfile = active.id;\r\n\r\n      localStorage.setItem(\r\n        \"withIfiProfiles\",\r\n        JSON.stringify(database)\r\n      );\r\n    }catch(error){}\r\n  }\r\n\r\n  function getStatus(percentage){\r\n    if(percentage >= 85) return \"stevig\";\r\n    if(percentage >= 55) return \"in groei\";\r\n    return \"rustige start\";\r\n  }\r\n\r\n  function getProfileGroup(){\r\n    const match = String(profile.group || \"\").match(\/\\d+\/);\r\n    return match ? Number(match[0]) : 3;\r\n  }\r\n\r\n  function showObjects(amount,icon){\r\n    objectenEl.innerHTML = \"\";\r\n\r\n    for(let i = 0; i < amount; i++){\r\n      const object = document.createElement(\"div\");\r\n      object.className = \"object\";\r\n      object.textContent = icon || \"\ud83c\udf38\";\r\n      objectenEl.appendChild(object);\r\n    }\r\n  }\r\n\r\n  function reduceOptions(options,correct,max){\r\n    const filtered = options.filter(function(option){\r\n      return option !== correct;\r\n    });\r\n\r\n    const result = shuffle(filtered).slice(0,max - 1);\r\n    result.push(correct);\r\n\r\n    return shuffle(result);\r\n  }\r\n\r\n  function shuffle(array){\r\n    const copy = array.slice();\r\n\r\n    for(let i = copy.length - 1; i > 0; i--){\r\n      const j = Math.floor(Math.random() * (i + 1));\r\n      const temp = copy[i];\r\n      copy[i] = copy[j];\r\n      copy[j] = temp;\r\n    }\r\n\r\n    return copy;\r\n  }\r\n\r\n  function getPositiveFeedback(){\r\n    const messages = [\r\n      \"Ja \ud83c\udf38 goed gekeken.\",\r\n      \"Mooi gedaan \ud83c\udf3f\",\r\n      \"Precies, dat klopt.\",\r\n      \"Goed rustig nagedacht.\"\r\n    ];\r\n\r\n    return messages[\r\n      Math.floor(Math.random() * messages.length)\r\n    ];\r\n  }\r\n\r\n  function getResultAdvice(percentage){\r\n    if(percentage >= 85){\r\n      return \"Dit voelt stevig. Ifi mag het de volgende keer iets moeilijker maken.\";\r\n    }\r\n\r\n    if(percentage >= 55){\r\n      return \"Dit groeit mooi. Nog een beetje oefenen helpt om het steviger te maken.\";\r\n    }\r\n\r\n    return \"We beginnen de volgende keer iets rustiger. Dat is helemaal goed.\";\r\n  }\r\n\r\n  function readableStyles(styles){\r\n    if(!Array.isArray(styles) || styles.length === 0){\r\n      return \"Persoonlijke oefening\";\r\n    }\r\n\r\n    const map = {\r\n      rustig:\"\ud83c\udf3f Rustig\",\r\n      plaatjes:\"\ud83e\udde9 Met plaatjes\",\r\n      uitleg:\"\ud83d\udcac Extra uitleg\",\r\n      uitdaging:\"\u2b50 Uitdaging\"\r\n    };\r\n\r\n    return styles.map(function(style){\r\n      return map[style] || style;\r\n    }).join(\" \u00b7 \");\r\n  }\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83d\udd22 Getallenwereld Oefenen met cijfers, kanjer. Kijk rustig. Welk cijfer past erbij? We oefenen stap voor stap. \ud83e\udde0 Ifi heeft deze oefening voor jou klaargezet Niveau wordt geladen Aantal vragen wordt geladen Leerstijl wordt geladen Volgende vraag \ud83c\udf3f Kleine reminder \ud83c\udf38 Je hoeft niet snel te tellen. Kijk rustig en kies het antwoord dat past.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2029","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/pages\/2029","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2029"}],"version-history":[{"count":25,"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/pages\/2029\/revisions"}],"predecessor-version":[{"id":4035,"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=\/wp\/v2\/pages\/2029\/revisions\/4035"}],"wp:attachment":[{"href":"https:\/\/withifi.muhubonurture.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}