{"id":1678,"date":"2026-09-08T08:08:07","date_gmt":"2026-09-08T08:08:07","guid":{"rendered":"https:\/\/maroczain.com\/scolaire.maroczain.com\/?page_id=1678"},"modified":"2026-09-08T08:08:09","modified_gmt":"2026-09-08T08:08:09","slug":"bac-blanc-pro-max-2","status":"publish","type":"page","link":"https:\/\/maroczain.com\/scolaire.maroczain.com\/bac-blanc-pro-max-2\/","title":{"rendered":"BAC BLANC PRO MAX 2"},"content":{"rendered":"\n<div id=\"mza-bac-pro2\">\n\n<style>\n#mza-bac-pro2,#mza-bac-pro2 *{box-sizing:border-box}\n#mza-bac-pro2{\n --navy:#06172c;\n --blue:#0d416d;\n --gold:#c99a36;\n --gold2:#efd68c;\n --paper:#f5f6f8;\n --white:#fff;\n --text:#18283a;\n --muted:#687789;\n --line:#dfe5eb;\n --green:#23764a;\n --red:#a23d3d;\n --orange:#a66c1b;\n font-family:Arial,Helvetica,sans-serif;\n background:var(--paper);\n color:var(--text);\n overflow:hidden\n}\n#mza-bac-pro2 .wrap{max-width:1280px;margin:auto;padding:0 24px}\n#mza-bac-pro2 section{padding:58px 0}\n#mza-bac-pro2 a{text-decoration:none;color:inherit}\n#mza-bac-pro2 button,\n#mza-bac-pro2 input,\n#mza-bac-pro2 select{font:inherit}\n\n\/* HERO *\/\n#mza-bac-pro2 .hero{\n padding:76px 0 70px;\n color:#fff;\n background:\n radial-gradient(circle at 85% 5%,rgba(239,214,140,.22),transparent 28%),\n radial-gradient(circle at 0% 100%,rgba(37,101,154,.24),transparent 32%),\n linear-gradient(135deg,#041224,#082b4c 65%,#10517e)\n}\n#mza-bac-pro2 .badge{\n display:inline-flex;\n align-items:center;\n gap:8px;\n padding:8px 14px;\n border-radius:999px;\n border:1px solid rgba(239,214,140,.4);\n color:var(--gold2);\n font-size:11px;\n font-weight:900;\n letter-spacing:1.2px\n}\n#mza-bac-pro2 h1{\n margin:18px 0 12px;\n color:#fff;\n font:500 clamp(44px,6vw,74px)\/1 Georgia,serif\n}\n#mza-bac-pro2 .hero p{\n max-width:900px;\n color:#d5e0e9;\n font-size:18px;\n line-height:1.75\n}\n#mza-bac-pro2 .actions{\n display:flex;\n gap:10px;\n flex-wrap:wrap;\n margin-top:22px\n}\n#mza-bac-pro2 .btn{\n min-height:44px;\n padding:0 16px;\n border:0;\n border-radius:10px;\n cursor:pointer;\n display:inline-flex;\n align-items:center;\n justify-content:center;\n font-size:11px;\n font-weight:900\n}\n#mza-bac-pro2 .gold{\n background:linear-gradient(135deg,#bd892b,#efd483);\n color:#142238\n}\n#mza-bac-pro2 .glass{\n background:rgba(255,255,255,.08);\n color:#fff;\n border:1px solid rgba(255,255,255,.16)\n}\n#mza-bac-pro2 .darkbtn{\n background:var(--navy);\n color:#fff\n}\n#mza-bac-pro2 .lightbtn{\n background:#fff;\n color:var(--navy);\n border:1px solid var(--line)\n}\n\n\/* HEAD *\/\n#mza-bac-pro2 .head{\n max-width:920px;\n margin-bottom:28px\n}\n#mza-bac-pro2 .kicker{\n color:#987023;\n font-size:10px;\n font-weight:900;\n letter-spacing:1.3px\n}\n#mza-bac-pro2 h2{\n margin:8px 0 10px;\n color:var(--navy);\n font:500 clamp(30px,4vw,46px)\/1.1 Georgia,serif\n}\n#mza-bac-pro2 .head p{\n color:var(--muted);\n line-height:1.7\n}\n\n\/* KPI *\/\n#mza-bac-pro2 .kpis{\n display:grid;\n grid-template-columns:repeat(5,1fr);\n gap:14px;\n margin-top:-32px\n}\n#mza-bac-pro2 .kpi{\n background:#fff;\n border:1px solid var(--line);\n border-radius:18px;\n padding:22px;\n box-shadow:0 14px 35px rgba(6,23,44,.08)\n}\n#mza-bac-pro2 .kpi small{\n display:block;\n color:var(--muted);\n font-size:10px;\n font-weight:900;\n text-transform:uppercase;\n letter-spacing:.8px\n}\n#mza-bac-pro2 .kpi strong{\n display:block;\n margin-top:8px;\n color:var(--navy);\n font:600 28px\/1 Georgia,serif\n}\n#mza-bac-pro2 .kpi span{\n display:block;\n margin-top:8px;\n color:var(--muted);\n font-size:11px\n}\n\n\/* SUBJECTS *\/\n#mza-bac-pro2 .subjects{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:16px\n}\n#mza-bac-pro2 .subject{\n position:relative;\n background:#fff;\n border:1px solid var(--line);\n border-radius:20px;\n padding:22px;\n overflow:hidden\n}\n#mza-bac-pro2 .subject:before{\n content:\"\";\n position:absolute;\n left:0;\n top:0;\n bottom:0;\n width:4px;\n background:linear-gradient(#c99a36,#efd68c)\n}\n#mza-bac-pro2 .subject-top{\n display:flex;\n align-items:flex-start;\n justify-content:space-between;\n gap:12px\n}\n#mza-bac-pro2 .subject h3{\n margin:0;\n color:var(--navy);\n font-size:21px\n}\n#mza-bac-pro2 .code{\n padding:5px 8px;\n border-radius:999px;\n background:#eef2f5;\n color:#5d6b78;\n font-size:9px;\n font-weight:900\n}\n#mza-bac-pro2 .score{\n margin:20px 0 4px;\n color:var(--navy);\n font:600 42px\/1 Georgia,serif\n}\n#mza-bac-pro2 .muted{\n color:var(--muted);\n font-size:12px;\n line-height:1.5\n}\n#mza-bac-pro2 .bar{\n height:9px;\n background:#edf1f4;\n border-radius:999px;\n overflow:hidden;\n margin:16px 0 13px\n}\n#mza-bac-pro2 .fill{\n height:100%;\n width:0;\n background:linear-gradient(90deg,#0d416d,#c99a36);\n transition:.4s\n}\n#mza-bac-pro2 .mini-grid{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:8px\n}\n#mza-bac-pro2 .mini{\n background:#f7f9fb;\n border-radius:10px;\n padding:10px\n}\n#mza-bac-pro2 .mini small{\n display:block;\n color:var(--muted);\n font-size:8px;\n font-weight:900;\n letter-spacing:.4px\n}\n#mza-bac-pro2 .mini b{\n display:block;\n color:var(--navy);\n margin-top:5px;\n font-size:13px\n}\n#mza-bac-pro2 .trend{\n display:inline-block;\n margin-top:12px;\n padding:7px 9px;\n border-radius:999px;\n font-size:10px;\n font-weight:900\n}\n#mza-bac-pro2 .up{background:#eaf6ef;color:#226b42}\n#mza-bac-pro2 .down{background:#fbecec;color:#963939}\n#mza-bac-pro2 .stable{background:#eef1f4;color:#5d6873}\n\n\/* PANELS *\/\n#mza-bac-pro2 .two{\n display:grid;\n grid-template-columns:1.15fr .85fr;\n gap:18px\n}\n#mza-bac-pro2 .panel{\n background:#fff;\n border:1px solid var(--line);\n border-radius:20px;\n padding:24px\n}\n#mza-bac-pro2 .panel h3{\n margin:0 0 16px;\n color:var(--navy);\n font-size:22px\n}\n\n\/* READINESS *\/\n#mza-bac-pro2 .readiness{\n display:flex;\n flex-direction:column;\n align-items:center;\n justify-content:center;\n text-align:center\n}\n#mza-bac-pro2 .ring{\n width:180px;\n height:180px;\n border-radius:50%;\n display:grid;\n place-items:center;\n background:conic-gradient(#c99a36 0%,#e8edf1 0)\n}\n#mza-bac-pro2 .ring-inner{\n width:138px;\n height:138px;\n border-radius:50%;\n background:#fff;\n display:flex;\n flex-direction:column;\n align-items:center;\n justify-content:center\n}\n#mza-bac-pro2 .ring-inner strong{\n color:var(--navy);\n font:600 42px\/1 Georgia,serif\n}\n#mza-bac-pro2 .ring-inner span{\n margin-top:5px;\n color:var(--muted);\n font-size:9px;\n font-weight:900\n}\n\n\/* ALERTS *\/\n#mza-bac-pro2 .alerts{\n display:grid;\n gap:10px\n}\n#mza-bac-pro2 .alert{\n background:#f7f9fb;\n border:1px solid var(--line);\n border-radius:13px;\n padding:14px\n}\n#mza-bac-pro2 .alert strong{\n display:block;\n color:var(--navy);\n margin-bottom:4px\n}\n#mza-bac-pro2 .alert p{\n margin:0;\n color:var(--muted);\n line-height:1.55;\n font-size:13px\n}\n\n\/* RECOMMENDATIONS *\/\n#mza-bac-pro2 .recs{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:14px\n}\n#mza-bac-pro2 .rec{\n background:#fff;\n border:1px solid var(--line);\n border-radius:18px;\n padding:20px\n}\n#mza-bac-pro2 .rec .rank{\n width:30px;\n height:30px;\n display:grid;\n place-items:center;\n border-radius:50%;\n background:var(--navy);\n color:#fff;\n font-size:11px;\n font-weight:900;\n margin-bottom:12px\n}\n#mza-bac-pro2 .rec b{\n display:block;\n color:var(--navy);\n font-size:19px;\n margin-bottom:8px\n}\n#mza-bac-pro2 .rec p{\n margin:0;\n color:var(--muted);\n line-height:1.6;\n font-size:13px\n}\n\n\/* HISTORY *\/\n#mza-bac-pro2 .table-wrap{\n overflow:auto\n}\n#mza-bac-pro2 table{\n width:100%;\n border-collapse:collapse\n}\n#mza-bac-pro2 th,\n#mza-bac-pro2 td{\n padding:12px 10px;\n border-bottom:1px solid #e7ebef;\n text-align:left;\n white-space:nowrap;\n font-size:12px\n}\n#mza-bac-pro2 th{\n color:var(--navy);\n font-size:9px;\n text-transform:uppercase;\n letter-spacing:.7px\n}\n\n\/* SYNC *\/\n#mza-bac-pro2 .syncbox{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:14px\n}\n#mza-bac-pro2 .sync-card{\n background:#fff;\n border:1px solid var(--line);\n border-radius:18px;\n padding:20px\n}\n#mza-bac-pro2 .sync-card strong{\n display:block;\n color:var(--navy);\n font-size:18px;\n margin-bottom:8px\n}\n#mza-bac-pro2 .sync-card p{\n margin:0;\n color:var(--muted);\n font-size:13px;\n line-height:1.6\n}\n\n\/* EMPTY *\/\n#mza-bac-pro2 .empty{\n padding:18px;\n border:1px dashed #ccd5dc;\n border-radius:14px;\n color:var(--muted);\n background:#f8fafb;\n line-height:1.6\n}\n\n\/* DARK *\/\n#mza-bac-pro2 .dark{\n background:var(--navy);\n color:#fff\n}\n#mza-bac-pro2 .dark h2{color:#fff}\n#mza-bac-pro2 .dark .head p{color:#cbd7e0}\n#mza-bac-pro2 .dark .sync-card{\n background:rgba(255,255,255,.06);\n border-color:rgba(255,255,255,.12)\n}\n#mza-bac-pro2 .dark .sync-card strong{color:#fff}\n#mza-bac-pro2 .dark .sync-card p{color:#d1dce5}\n\n\/* FOOT *\/\n#mza-bac-pro2 .footer-note{\n text-align:center;\n padding:22px;\n color:var(--muted);\n font-size:11px\n}\n\n@media(max-width:1050px){\n #mza-bac-pro2 .kpis{grid-template-columns:repeat(2,1fr)}\n #mza-bac-pro2 .subjects{grid-template-columns:repeat(2,1fr)}\n #mza-bac-pro2 .two{grid-template-columns:1fr}\n}\n@media(max-width:760px){\n #mza-bac-pro2 .kpis,\n #mza-bac-pro2 .subjects,\n #mza-bac-pro2 .recs,\n #mza-bac-pro2 .syncbox{grid-template-columns:1fr}\n #mza-bac-pro2 .mini-grid{grid-template-columns:1fr 1fr}\n #mza-bac-pro2 .hero{padding-top:55px}\n}\n<\/style>\n\n<header class=\"hero\">\n<div class=\"wrap\">\n\n<span class=\"badge\">MZA LEARNING \u2022 CONNECTED EXAM COCKPIT<\/span>\n\n<h1>BAC BLANC<br>PRO MAX 2<\/h1>\n\n<p>\nLe cockpit central de pr\u00e9paration au baccalaur\u00e9at de Maroc Zain Academy.\nIl r\u00e9cup\u00e8re automatiquement les r\u00e9sultats enregistr\u00e9s dans les six pages\nBac Blanc connect\u00e9es et transforme les tentatives en diagnostic de progression.\n<\/p>\n\n<div class=\"actions\">\n<a href=\"#matieres\" class=\"btn gold\">\ud83d\udcca VOIR MES MATI\u00c8RES<\/a>\n<a href=\"#analyse\" class=\"btn glass\">\ud83e\udde0 ANALYSE<\/a>\n<a href=\"#historique\" class=\"btn glass\">\ud83d\udd58 HISTORIQUE<\/a>\n<button class=\"btn glass\" type=\"button\" onclick=\"mzaBacPro2Refresh()\">\u21bb ACTUALISER<\/button>\n<\/div>\n\n<\/div>\n<\/header>\n\n<div class=\"wrap\">\n\n<div class=\"kpis\">\n\n<div class=\"kpi\">\n<small>Moyenne actuelle<\/small>\n<strong id=\"pro2Average\">\u2014<\/strong>\n<span>Moyenne des derni\u00e8res auto-\u00e9valuations<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Readiness Bac<\/small>\n<strong id=\"pro2Readiness\">0%<\/strong>\n<span>Indice MZA de pr\u00e9paration<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Bac Blanc r\u00e9alis\u00e9s<\/small>\n<strong id=\"pro2Attempts\">0<\/strong>\n<span>Total des r\u00e9sultats enregistr\u00e9s<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Meilleure mati\u00e8re<\/small>\n<strong id=\"pro2Best\">\u2014<\/strong>\n<span>Dernier score le plus \u00e9lev\u00e9<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Priorit\u00e9<\/small>\n<strong id=\"pro2Weak\">\u2014<\/strong>\n<span>Mati\u00e8re \u00e0 renforcer<\/span>\n<\/div>\n\n<\/div>\n\n<\/div>\n\n<section id=\"matieres\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">SCOREBOARD<\/span>\n<h2>Mes six mati\u00e8res.<\/h2>\n<p>\nLes r\u00e9sultats proviennent directement des pages Bac Blanc\nMath\u00e9matiques, Physique-Chimie, SVT, Fran\u00e7ais, Arabe et Anglais.\n<\/p>\n<\/div>\n\n<div id=\"pro2SubjectGrid\" class=\"subjects\"><\/div>\n\n<\/div>\n<\/section>\n\n<section id=\"analyse\" style=\"background:#efede7\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">MZA BAC INTELLIGENCE<\/span>\n<h2>Analyse automatique.<\/h2>\n<p>\nLe cockpit identifie les points forts, les priorit\u00e9s et les tendances\n\u00e0 partir des r\u00e9sultats d\u00e9j\u00e0 enregistr\u00e9s.\n<\/p>\n<\/div>\n\n<div class=\"two\">\n\n<div class=\"panel\">\n\n<h3>Alertes prioritaires<\/h3>\n\n<div id=\"pro2Alerts\" class=\"alerts\"><\/div>\n\n<\/div>\n\n<div class=\"panel readiness\">\n\n<h3>Readiness Bac<\/h3>\n\n<div id=\"pro2Ring\" class=\"ring\">\n<div class=\"ring-inner\">\n<strong id=\"pro2RingValue\">0%<\/strong>\n<span>PR\u00c9PARATION<\/span>\n<\/div>\n<\/div>\n\n<p id=\"pro2ReadinessText\" class=\"muted\" style=\"margin-top:16px\">\nCommencez par r\u00e9aliser vos premiers Bac Blanc.\n<\/p>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<\/section>\n\n<section>\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">SMART COACH<\/span>\n<h2>Plan de travail prioritaire.<\/h2>\n<p>\nLes mati\u00e8res sont class\u00e9es automatiquement de la plus fragile \u00e0 la plus solide.\n<\/p>\n<\/div>\n\n<div id=\"pro2Recommendations\" class=\"recs\"><\/div>\n\n<\/div>\n<\/section>\n\n<section id=\"historique\" style=\"background:#efede7\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">HISTORIQUE CONNECT\u00c9<\/span>\n<h2>Mes derni\u00e8res tentatives.<\/h2>\n<p>Les 20 derniers r\u00e9sultats enregistr\u00e9s sont affich\u00e9s ici.<\/p>\n<\/div>\n\n<div class=\"panel\">\n<div class=\"table-wrap\">\n\n<table>\n<thead>\n<tr>\n<th>Date<\/th>\n<th>Mati\u00e8re<\/th>\n<th>Score<\/th>\n<th>Mode<\/th>\n<th>\u00c9volution<\/th>\n<\/tr>\n<\/thead>\n\n<tbody id=\"pro2History\"><\/tbody>\n<\/table>\n\n<\/div>\n<\/div>\n\n<\/div>\n<\/section>\n\n<section class=\"dark\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\" style=\"color:#efd68c\">MZA SYNCHRONISATION<\/span>\n<h2>Connected Exam Cockpit.<\/h2>\n<p>\nToutes les pages Bac Blanc utilisent la m\u00eame base locale :\n<strong>mza_bac_results_v2<\/strong>.\n<\/p>\n<\/div>\n\n<div class=\"syncbox\">\n\n<div class=\"sync-card\">\n<strong>\u2713 6 mati\u00e8res<\/strong>\n<p>Math\u00e9matiques, Physique-Chimie, SVT, Fran\u00e7ais, Arabe et Anglais.<\/p>\n<\/div>\n\n<div class=\"sync-card\">\n<strong>\u21bb Mise \u00e0 jour automatique<\/strong>\n<p>Le cockpit se recharge lorsqu&#8217;une page Bac Blanc enregistre un nouveau r\u00e9sultat dans un autre onglet.<\/p>\n<\/div>\n\n<div class=\"sync-card\">\n<strong>\ud83d\udd12 Stockage local<\/strong>\n<p>Les r\u00e9sultats restent dans le navigateur utilis\u00e9 sur le m\u00eame domaine Maroc Zain Academy.<\/p>\n<\/div>\n\n<\/div>\n\n<p id=\"pro2SyncState\" style=\"margin-top:22px;color:#d8e4ec;font-size:13px\"><\/p>\n\n<\/div>\n<\/section>\n\n<div class=\"footer-note\">\nMAROC ZAIN ACADEMY \u2022 BAC BLANC PRO MAX 2 \u2022 MZA LEARNING\n<\/div>\n\n<script>\n(function(){\n\nconst RESULTS_KEY=\"mza_bac_results_v2\";\n\nconst SUBJECTS={\n maths:{\n  name:\"Math\u00e9matiques\",\n  icon:\"\u2797\",\n  advice:\"Reprendre les exercices non ma\u00eetris\u00e9s puis refaire un sujet chronom\u00e9tr\u00e9.\"\n },\n pc:{\n  name:\"Physique-Chimie\",\n  icon:\"\u269b\ufe0f\",\n  advice:\"Revoir les lois, unit\u00e9s, m\u00e9thodes de calcul et interpr\u00e9tations physiques.\"\n },\n svt:{\n  name:\"SVT\",\n  icon:\"\ud83e\uddec\",\n  advice:\"Renforcer l'analyse documentaire, les liens logiques et les conclusions scientifiques.\"\n },\n fr:{\n  name:\"Fran\u00e7ais\",\n  icon:\"\ud83d\udcd6\",\n  advice:\"Travailler compr\u00e9hension, argumentation, structure et qualit\u00e9 de la r\u00e9daction.\"\n },\n ar:{\n  name:\"Arabe\",\n  icon:\"\ud83c\uddf2\ud83c\udde6\",\n  advice:\"Renforcer \u0627\u0644\u0641\u0647\u0645 \u0648\u0627\u0644\u062a\u062d\u0644\u064a\u0644 \u0648\u0627\u0644\u062a\u0639\u0628\u064a\u0631 \u0627\u0644\u0643\u062a\u0627\u0628\u064a \u0648\u062a\u0646\u0638\u064a\u0645 \u0627\u0644\u0623\u0641\u0643\u0627\u0631.\"\n },\n en:{\n  name:\"Anglais\",\n  icon:\"\ud83c\uddec\ud83c\udde7\",\n  advice:\"Review reading comprehension, grammar, vocabulary and structured writing.\"\n }\n};\n\nfunction mzaGetResults(){\n\n try{\n  const raw=localStorage.getItem(RESULTS_KEY);\n  const parsed=raw?JSON.parse(raw):[];\n\n  if(!Array.isArray(parsed))return [];\n\n  return parsed.filter(function(r){\n   return r &&\n          SUBJECTS[r.subject] &&\n          !isNaN(Number(r.score)) &&\n          Number(r.score)>=0 &&\n          Number(r.score)<=20;\n  });\n\n }catch(e){\n  return [];\n }\n\n}\n\nfunction mzaFormatScore(score){\n\n if(score===null || score===undefined || isNaN(score)){\n  return \"\u2014\";\n }\n\n const n=Math.round(Number(score)*100)\/100;\n\n return n.toString()+\"\/20\";\n}\n\nfunction mzaResultsForSubject(results,code){\n\n return results\n .filter(function(r){\n  return r.subject===code;\n })\n .sort(function(a,b){\n  return (a.timestamp||0)-(b.timestamp||0);\n });\n\n}\n\nfunction mzaLatest(arr){\n\n if(!arr.length)return null;\n\n return Number(arr[arr.length-1].score);\n}\n\nfunction mzaBest(arr){\n\n if(!arr.length)return null;\n\n return Math.max.apply(\n  null,\n  arr.map(function(r){\n   return Number(r.score);\n  })\n );\n}\n\nfunction mzaAverage(arr){\n\n if(!arr.length)return null;\n\n const total=arr.reduce(function(sum,r){\n  return sum+Number(r.score);\n },0);\n\n return total\/arr.length;\n}\n\nfunction mzaTrend(arr){\n\n if(arr.length<2){\n  return{\n   cls:\"stable\",\n   symbol:\"\u2022\",\n   text:\"Pas encore de tendance\"\n  };\n }\n\n const current=Number(arr[arr.length-1].score);\n const previous=Number(arr[arr.length-2].score);\n\n const delta=current-previous;\n\n if(delta>=1){\n  return{\n   cls:\"up\",\n   symbol:\"\u2191\",\n   text:\"+\"+delta.toFixed(1)+\" pt\"\n  };\n }\n\n if(delta<=-1){\n  return{\n   cls:\"down\",\n   symbol:\"\u2193\",\n   text:delta.toFixed(1)+\" pt\"\n  };\n }\n\n return{\n  cls:\"stable\",\n  symbol:\"\u2192\",\n  text:\"Stable\"\n };\n}\n\nfunction mzaLatestScores(results){\n\n const latest={};\n\n Object.keys(SUBJECTS).forEach(function(code){\n\n  latest[code]=mzaLatest(\n   mzaResultsForSubject(results,code)\n  );\n\n });\n\n return latest;\n}\n\nfunction mzaCalculateReadiness(latest){\n\n const values=Object.keys(latest)\n .map(function(code){\n  return latest[code];\n })\n .filter(function(v){\n  return v!==null;\n });\n\n if(!values.length)return 0;\n\n const average=\n values.reduce(function(a,b){\n  return a+b;\n },0)\/values.length;\n\n const scorePart=(average\/20)*80;\n const completionPart=(values.length\/6)*20;\n\n return Math.round(\n  Math.max(\n   0,\n   Math.min(100,scorePart+completionPart)\n  )\n );\n}\n\nfunction mzaRenderSubjects(results){\n\n const grid=document.getElementById(\"pro2SubjectGrid\");\n\n grid.innerHTML=\"\";\n\n Object.keys(SUBJECTS).forEach(function(code){\n\n  const arr=mzaResultsForSubject(results,code);\n\n  const latest=mzaLatest(arr);\n  const best=mzaBest(arr);\n  const average=mzaAverage(arr);\n  const trend=mzaTrend(arr);\n\n  const percent=\n   latest!==null\n   ?Math.max(0,Math.min(100,(latest\/20)*100))\n   :0;\n\n  const card=document.createElement(\"div\");\n\n  card.className=\"subject\";\n\n  card.innerHTML=\n   \"<div class='subject-top'>\"+\n    \"<h3>\"+SUBJECTS[code].icon+\" \"+SUBJECTS[code].name+\"<\/h3>\"+\n    \"<span class='code'>\"+code.toUpperCase()+\"<\/span>\"+\n   \"<\/div>\"+\n\n   \"<div class='score'>\"+mzaFormatScore(latest)+\"<\/div>\"+\n\n   \"<div class='muted'>Derni\u00e8re auto-\u00e9valuation MZA<\/div>\"+\n\n   \"<div class='bar'>\"+\n    \"<div class='fill' style='width:\"+percent+\"%'><\/div>\"+\n   \"<\/div>\"+\n\n   \"<div class='mini-grid'>\"+\n    \"<div class='mini'>\"+\n     \"<small>TENTATIVES<\/small>\"+\n     \"<b>\"+arr.length+\"<\/b>\"+\n    \"<\/div>\"+\n\n    \"<div class='mini'>\"+\n     \"<small>MEILLEUR<\/small>\"+\n     \"<b>\"+mzaFormatScore(best)+\"<\/b>\"+\n    \"<\/div>\"+\n\n    \"<div class='mini'>\"+\n     \"<small>MOYENNE<\/small>\"+\n     \"<b>\"+mzaFormatScore(average)+\"<\/b>\"+\n    \"<\/div>\"+\n   \"<\/div>\"+\n\n   \"<span class='trend \"+trend.cls+\"'>\"+\n    trend.symbol+\" \"+trend.text+\n   \"<\/span>\";\n\n  grid.appendChild(card);\n\n });\n\n}\n\nfunction mzaRenderKPIs(results,latest){\n\n const available=\n Object.keys(latest)\n .filter(function(code){\n  return latest[code]!==null;\n });\n\n let average=null;\n\n if(available.length){\n\n  average=\n   available.reduce(function(sum,code){\n    return sum+latest[code];\n   },0)\/available.length;\n\n }\n\n document.getElementById(\"pro2Average\").textContent=\n mzaFormatScore(average);\n\n document.getElementById(\"pro2Attempts\").textContent=\n results.length;\n\n let best=null;\n let weak=null;\n\n available.forEach(function(code){\n\n  if(best===null || latest[code]>latest[best]){\n   best=code;\n  }\n\n  if(weak===null || latest[code]<latest[weak]){\n   weak=code;\n  }\n\n });\n\n document.getElementById(\"pro2Best\").textContent=\n best ? SUBJECTS[best].name : \"\u2014\";\n\n document.getElementById(\"pro2Weak\").textContent=\n weak ? SUBJECTS[weak].name : \"\u2014\";\n\n const readiness=mzaCalculateReadiness(latest);\n\n document.getElementById(\"pro2Readiness\").textContent=\n readiness+\"%\";\n\n document.getElementById(\"pro2RingValue\").textContent=\n readiness+\"%\";\n\n document.getElementById(\"pro2Ring\").style.background=\n \"conic-gradient(#c99a36 \"+readiness+\"%,#e8edf1 \"+readiness+\"%)\";\n\n let text=\"Commencez par r\u00e9aliser vos premiers Bac Blanc.\";\n\n if(readiness>=35)\n  text=\"La pr\u00e9paration est engag\u00e9e.\";\n\n if(readiness>=50)\n  text=\"Les bases sont pr\u00e9sentes. Renforcez les mati\u00e8res les plus faibles.\";\n\n if(readiness>=65)\n  text=\"Pr\u00e9paration satisfaisante. Continuez les simulations.\";\n\n if(readiness>=75)\n  text=\"Bonne pr\u00e9paration g\u00e9n\u00e9rale.\";\n\n if(readiness>=85)\n  text=\"Tr\u00e8s bonne pr\u00e9paration Bac.\";\n\n if(readiness>=93)\n  text=\"Excellent niveau de pr\u00e9paration MZA.\";\n\n document.getElementById(\"pro2ReadinessText\").textContent=text;\n\n}\n\nfunction mzaRenderAlerts(results,latest){\n\n const box=document.getElementById(\"pro2Alerts\");\n\n box.innerHTML=\"\";\n\n const available=\n Object.keys(latest)\n .filter(function(code){\n  return latest[code]!==null;\n });\n\n if(!available.length){\n\n  box.innerHTML=\n   \"<div class='empty'>\"+\n   \"Aucun r\u00e9sultat n'est encore enregistr\u00e9. \"+\n   \"R\u00e9alisez un Bac Blanc connect\u00e9 dans une mati\u00e8re pour d\u00e9marrer l'analyse.\"+\n   \"<\/div>\";\n\n  return;\n }\n\n const sorted=\n available.slice().sort(function(a,b){\n  return latest[a]-latest[b];\n });\n\n const weak=sorted[0];\n const best=sorted[sorted.length-1];\n\n box.innerHTML+=\n \"<div class='alert'>\"+\n  \"<strong>\ud83c\udfaf Priorit\u00e9 : \"+SUBJECTS[weak].name+\"<\/strong>\"+\n  \"<p>Derni\u00e8re auto-\u00e9valuation : \"+mzaFormatScore(latest[weak])+\n  \". Cette mati\u00e8re doit recevoir davantage de temps de travail.<\/p>\"+\n \"<\/div>\";\n\n box.innerHTML+=\n \"<div class='alert'>\"+\n  \"<strong>\ud83c\udfc6 Point fort : \"+SUBJECTS[best].name+\"<\/strong>\"+\n  \"<p>Derni\u00e8re auto-\u00e9valuation : \"+mzaFormatScore(latest[best])+\n  \". Maintenez ce niveau tout en poursuivant les entra\u00eenements.<\/p>\"+\n \"<\/div>\";\n\n Object.keys(SUBJECTS).forEach(function(code){\n\n  const arr=mzaResultsForSubject(results,code);\n\n  if(arr.length<2)return;\n\n  const trend=mzaTrend(arr);\n\n  if(trend.cls===\"up\"){\n\n   box.innerHTML+=\n   \"<div class='alert'>\"+\n    \"<strong>\ud83d\udcc8 Progression : \"+SUBJECTS[code].name+\"<\/strong>\"+\n    \"<p>\"+trend.text+\" entre les deux derni\u00e8res tentatives.<\/p>\"+\n   \"<\/div>\";\n\n  }\n\n  if(trend.cls===\"down\"){\n\n   box.innerHTML+=\n   \"<div class='alert'>\"+\n    \"<strong>\u26a0\ufe0f Vigilance : \"+SUBJECTS[code].name+\"<\/strong>\"+\n    \"<p>\"+trend.text+\n    \" entre les deux derni\u00e8res tentatives. Analysez les erreurs avant de refaire un sujet.<\/p>\"+\n   \"<\/div>\";\n\n  }\n\n });\n\n}\n\nfunction mzaRenderRecommendations(latest){\n\n const box=document.getElementById(\"pro2Recommendations\");\n\n box.innerHTML=\"\";\n\n const available=\n Object.keys(latest)\n .filter(function(code){\n  return latest[code]!==null;\n })\n .sort(function(a,b){\n  return latest[a]-latest[b];\n });\n\n if(!available.length){\n\n  box.innerHTML=\n   \"<div class='rec'>\"+\n    \"<div class='rank'>1<\/div>\"+\n    \"<b>Premi\u00e8re mission<\/b>\"+\n    \"<p>R\u00e9alisez au moins trois Bac Blanc connect\u00e9s pour obtenir un plan de travail personnalis\u00e9.<\/p>\"+\n   \"<\/div>\";\n\n  return;\n }\n\n available.slice(0,3).forEach(function(code,index){\n\n  box.innerHTML+=\n   \"<div class='rec'>\"+\n    \"<div class='rank'>\"+(index+1)+\"<\/div>\"+\n    \"<b>\"+SUBJECTS[code].name+\"<\/b>\"+\n    \"<p>\"+\n     \"<strong>\"+mzaFormatScore(latest[code])+\"<\/strong><br><br>\"+\n     SUBJECTS[code].advice+\n    \"<\/p>\"+\n   \"<\/div>\";\n\n });\n\n}\n\nfunction mzaRenderHistory(results){\n\n const tbody=document.getElementById(\"pro2History\");\n\n tbody.innerHTML=\"\";\n\n const sorted=\n results.slice()\n .sort(function(a,b){\n  return (b.timestamp||0)-(a.timestamp||0);\n })\n .slice(0,20);\n\n if(!sorted.length){\n\n  tbody.innerHTML=\n   \"<tr>\"+\n    \"<td colspan='5'>Aucune tentative enregistr\u00e9e.<\/td>\"+\n   \"<\/tr>\";\n\n  return;\n }\n\n sorted.forEach(function(item){\n\n  const allForSubject=\n   mzaResultsForSubject(results,item.subject);\n\n  const position=\n   allForSubject.findIndex(function(r){\n    return r.timestamp===item.timestamp &&\n           Number(r.score)===Number(item.score);\n   });\n\n  let evolution=\"\u2014\";\n\n  if(position>0){\n\n   const delta=\n    Number(allForSubject[position].score)-\n    Number(allForSubject[position-1].score);\n\n   if(delta>=1)\n    evolution=\"\u2191 +\"+delta.toFixed(1);\n\n   else if(delta<=-1)\n    evolution=\"\u2193 \"+delta.toFixed(1);\n\n   else\n    evolution=\"\u2192 stable\";\n\n  }\n\n  let date=\"\u2014\";\n\n  if(item.timestamp){\n\n   try{\n    date=new Date(item.timestamp).toLocaleString();\n   }catch(e){\n    date=\"\u2014\";\n   }\n\n  }\n\n  tbody.innerHTML+=\n   \"<tr>\"+\n    \"<td>\"+date+\"<\/td>\"+\n    \"<td>\"+SUBJECTS[item.subject].name+\"<\/td>\"+\n    \"<td>\"+mzaFormatScore(item.score)+\"<\/td>\"+\n    \"<td>\"+(item.mode||\"Bac Blanc\")+\"<\/td>\"+\n    \"<td>\"+evolution+\"<\/td>\"+\n   \"<\/tr>\";\n\n });\n\n}\n\nwindow.mzaBacPro2Refresh=function(){\n\n const results=mzaGetResults();\n\n const latest=mzaLatestScores(results);\n\n mzaRenderSubjects(results);\n mzaRenderKPIs(results,latest);\n mzaRenderAlerts(results,latest);\n mzaRenderRecommendations(latest);\n mzaRenderHistory(results);\n\n const sync=document.getElementById(\"pro2SyncState\");\n\n if(sync){\n\n  sync.innerHTML=\n   \"\u2705 Synchronisation active \u2022 \"+\n   \"<strong>\"+results.length+\"<\/strong> r\u00e9sultat(s) d\u00e9tect\u00e9(s) \u2022 \"+\n   \"Derni\u00e8re actualisation : <strong>\"+\n   new Date().toLocaleTimeString()+\n   \"<\/strong>\";\n\n }\n\n};\n\nwindow.mzaSaveBacResult=function(subject,score,mode){\n\n if(!SUBJECTS[subject]){\n  return false;\n }\n\n score=Number(score);\n\n if(isNaN(score) || score<0 || score>20){\n  return false;\n }\n\n let results=mzaGetResults();\n\n results.push({\n  subject:subject,\n  score:Math.round(score*4)\/4,\n  mode:mode||\"Bac Blanc\",\n  timestamp:Date.now()\n });\n\n localStorage.setItem(\n  RESULTS_KEY,\n  JSON.stringify(results)\n );\n\n mzaBacPro2Refresh();\n\n return true;\n};\n\n\/* Actualisation si une autre page du m\u00eame domaine\n   sauvegarde un r\u00e9sultat dans un autre onglet *\/\nwindow.addEventListener(\"storage\",function(event){\n\n if(event.key===RESULTS_KEY){\n  mzaBacPro2Refresh();\n }\n\n});\n\n\/* Actualisation lorsqu'on revient sur la page *\/\nwindow.addEventListener(\"focus\",function(){\n mzaBacPro2Refresh();\n});\n\n\/* Premi\u00e8re initialisation *\/\nmzaBacPro2Refresh();\n\n})();\n<\/script>\n\n<\/div>\n&#8220;`\n","protected":false},"excerpt":{"rendered":"<p>MZA LEARNING \u2022 CONNECTED EXAM COCKPIT BAC BLANCPRO MAX 2 Le cockpit central de pr\u00e9paration au baccalaur\u00e9at de Maroc Zain Academy. Il r\u00e9cup\u00e8re automatiquement les r\u00e9sultats enregistr\u00e9s dans les six pages Bac Blanc connect\u00e9es et transforme les tentatives en diagnostic de progression. \ud83d\udcca VOIR MES MATI\u00c8RES \ud83e\udde0 ANALYSE \ud83d\udd58 HISTORIQUE \u21bb ACTUALISER Moyenne actuelle \u2014 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1678","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/comments?post=1678"}],"version-history":[{"count":3,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1678\/revisions"}],"predecessor-version":[{"id":1691,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1678\/revisions\/1691"}],"wp:attachment":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/media?parent=1678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}