{"id":1687,"date":"2026-09-08T08:08:08","date_gmt":"2026-09-08T08:08:08","guid":{"rendered":"https:\/\/maroczain.com\/scolaire.maroczain.com\/?page_id=1687"},"modified":"2026-09-08T08:08:09","modified_gmt":"2026-09-08T08:08:09","slug":"bac-blanc-cockpit-pro-max-3","status":"publish","type":"page","link":"https:\/\/maroczain.com\/scolaire.maroczain.com\/bac-blanc-cockpit-pro-max-3\/","title":{"rendered":"BAC BLANC COCKPIT PRO MAX 3"},"content":{"rendered":"\n<div id=\"mza-bac-pro3\">\n\n<style>\n#mza-bac-pro3,#mza-bac-pro3 *{box-sizing:border-box}\n#mza-bac-pro3{\n --navy:#06172c;\n --blue:#0d416d;\n --gold:#c99a36;\n --gold2:#efd68c;\n --paper:#f5f6f8;\n --white:#fff;\n --text:#18283a;\n --muted:#69798a;\n --line:#dfe5eb;\n --green:#1c7a47;\n --red:#a83a3a;\n --orange:#a56b18;\n font-family:Arial,Helvetica,sans-serif;\n background:var(--paper);\n color:var(--text)\n}\n#mza-bac-pro3 .wrap{max-width:1280px;margin:auto;padding:0 24px}\n#mza-bac-pro3 section{padding:58px 0}\n#mza-bac-pro3 a{text-decoration:none;color:inherit}\n#mza-bac-pro3 button,\n#mza-bac-pro3 input,\n#mza-bac-pro3 select{font:inherit}\n\n#mza-bac-pro3 .hero{\n padding:76px 0 64px;\n color:#fff;\n background:\n radial-gradient(circle at 85% 10%,rgba(239,214,140,.22),transparent 28%),\n radial-gradient(circle at 10% 100%,rgba(45,110,160,.2),transparent 30%),\n linear-gradient(135deg,#041224,#082b4c 65%,#10517e)\n}\n#mza-bac-pro3 .badge{\n display:inline-block;\n padding:8px 13px;\n border-radius:999px;\n border:1px solid rgba(239,214,140,.42);\n color:var(--gold2);\n font-size:11px;\n font-weight:900;\n letter-spacing:1.3px\n}\n#mza-bac-pro3 h1{\n margin:18px 0 12px;\n color:#fff;\n font:500 clamp(42px,6vw,72px)\/1 Georgia,serif\n}\n#mza-bac-pro3 .hero p{\n max-width:900px;\n color:#d5e0e9;\n font-size:18px;\n line-height:1.75\n}\n#mza-bac-pro3 .actions{\n display:flex;\n gap:10px;\n flex-wrap:wrap;\n margin-top:22px\n}\n#mza-bac-pro3 .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-pro3 .gold{\n background:linear-gradient(135deg,#bd892b,#efd483);\n color:#142238\n}\n#mza-bac-pro3 .darkbtn{background:var(--navy);color:#fff}\n#mza-bac-pro3 .lightbtn{\n background:#fff;\n color:var(--navy);\n border:1px solid var(--line)\n}\n#mza-bac-pro3 .glass{\n color:#fff;\n background:rgba(255,255,255,.08);\n border:1px solid rgba(255,255,255,.16)\n}\n\n#mza-bac-pro3 .head{max-width:920px;margin-bottom:28px}\n#mza-bac-pro3 .kicker{\n color:#987023;\n font-size:10px;\n font-weight:900;\n letter-spacing:1.3px\n}\n#mza-bac-pro3 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-pro3 .head p{\n color:var(--muted);\n line-height:1.7\n}\n\n#mza-bac-pro3 .kpis{\n display:grid;\n grid-template-columns:repeat(5,1fr);\n gap:14px;\n margin-top:-30px\n}\n#mza-bac-pro3 .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,.07)\n}\n#mza-bac-pro3 .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-pro3 .kpi strong{\n display:block;\n margin-top:8px;\n color:var(--navy);\n font:600 30px\/1 Georgia,serif\n}\n#mza-bac-pro3 .kpi span{\n display:block;\n margin-top:8px;\n color:var(--muted);\n font-size:12px\n}\n\n#mza-bac-pro3 .subjects{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:16px\n}\n#mza-bac-pro3 .subject{\n background:#fff;\n border:1px solid var(--line);\n border-radius:20px;\n padding:22px;\n position:relative;\n overflow:hidden\n}\n#mza-bac-pro3 .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-pro3 .subject-top{\n display:flex;\n justify-content:space-between;\n align-items:flex-start;\n gap:12px\n}\n#mza-bac-pro3 .subject h3{\n margin:0;\n color:var(--navy);\n font-size:22px\n}\n#mza-bac-pro3 .code{\n padding:5px 8px;\n border-radius:999px;\n background:#eef2f5;\n color:#5a6978;\n font-size:10px;\n font-weight:900\n}\n#mza-bac-pro3 .score{\n font:600 42px\/1 Georgia,serif;\n color:var(--navy);\n margin:20px 0 4px\n}\n#mza-bac-pro3 .muted{color:var(--muted);font-size:12px}\n#mza-bac-pro3 .bar{\n height:9px;\n background:#edf1f4;\n border-radius:999px;\n overflow:hidden;\n margin:16px 0 12px\n}\n#mza-bac-pro3 .fill{\n height:100%;\n width:0;\n background:linear-gradient(90deg,#0d416d,#c99a36);\n transition:.4s\n}\n#mza-bac-pro3 .subject-grid{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:8px;\n margin-top:12px\n}\n#mza-bac-pro3 .mini{\n background:#f6f8fa;\n border-radius:10px;\n padding:10px\n}\n#mza-bac-pro3 .mini small{\n color:var(--muted);\n font-size:9px;\n font-weight:900\n}\n#mza-bac-pro3 .mini b{\n display:block;\n color:var(--navy);\n margin-top:4px\n}\n#mza-bac-pro3 .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-pro3 .up{background:#eaf6ef;color:#226b42}\n#mza-bac-pro3 .down{background:#fbecec;color:#963939}\n#mza-bac-pro3 .stable{background:#f1f3f5;color:#5d6873}\n\n#mza-bac-pro3 .two{\n display:grid;\n grid-template-columns:1.15fr .85fr;\n gap:18px\n}\n#mza-bac-pro3 .panel{\n background:#fff;\n border:1px solid var(--line);\n border-radius:20px;\n padding:24px\n}\n#mza-bac-pro3 .panel h3{\n margin:0 0 14px;\n color:var(--navy);\n font-size:22px\n}\n\n#mza-bac-pro3 .readiness{\n display:flex;\n flex-direction:column;\n align-items:center;\n justify-content:center;\n text-align:center\n}\n#mza-bac-pro3 .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-pro3 .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-pro3 .ring-inner strong{\n color:var(--navy);\n font:600 42px\/1 Georgia,serif\n}\n#mza-bac-pro3 .ring-inner span{\n color:var(--muted);\n font-size:10px;\n font-weight:900\n}\n\n#mza-bac-pro3 .alerts{\n display:grid;\n gap:10px\n}\n#mza-bac-pro3 .alert{\n padding:14px;\n border:1px solid var(--line);\n border-radius:13px;\n background:#f7f9fb\n}\n#mza-bac-pro3 .alert strong{\n display:block;\n color:var(--navy);\n margin-bottom:4px\n}\n#mza-bac-pro3 .alert p{\n margin:0;\n color:var(--muted);\n line-height:1.55;\n font-size:13px\n}\n\n#mza-bac-pro3 .official{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:12px\n}\n#mza-bac-pro3 .official-box{\n padding:16px;\n background:#f7f9fb;\n border:1px solid var(--line);\n border-radius:14px\n}\n#mza-bac-pro3 .official-box label{\n display:block;\n font-weight:900;\n color:var(--navy);\n margin-bottom:8px\n}\n#mza-bac-pro3 .official-box input{\n width:100%;\n padding:11px;\n border:1px solid #d9e0e6;\n border-radius:9px;\n background:#fff\n}\n\n#mza-bac-pro3 table{\n width:100%;\n border-collapse:collapse\n}\n#mza-bac-pro3 th,\n#mza-bac-pro3 td{\n padding:12px 10px;\n border-bottom:1px solid #e7ebef;\n text-align:left;\n font-size:12px\n}\n#mza-bac-pro3 th{\n color:var(--navy);\n font-size:10px;\n text-transform:uppercase;\n letter-spacing:.6px\n}\n#mza-bac-pro3 .table-wrap{overflow:auto}\n\n#mza-bac-pro3 .recommendations{\n display:grid;\n grid-template-columns:repeat(3,1fr);\n gap:14px\n}\n#mza-bac-pro3 .rec{\n background:#fff;\n border:1px solid var(--line);\n border-radius:18px;\n padding:20px\n}\n#mza-bac-pro3 .rec b{\n display:block;\n color:var(--navy);\n font-size:19px;\n margin-bottom:8px\n}\n#mza-bac-pro3 .rec p{\n margin:0;\n color:var(--muted);\n line-height:1.6\n}\n\n#mza-bac-pro3 .status{\n margin-top:12px;\n padding:12px;\n border-radius:10px;\n background:#edf8ef;\n color:#245d31;\n font-size:12px;\n font-weight:800;\n display:none\n}\n\n#mza-bac-pro3 .danger{\n background:#fff1f1!important;\n color:#8c3030!important\n}\n\n#mza-bac-pro3 .dark{\n background:var(--navy);\n color:#fff\n}\n#mza-bac-pro3 .dark h2{color:#fff}\n#mza-bac-pro3 .dark .head p{color:#cbd7e0}\n#mza-bac-pro3 .dark .panel{\n background:rgba(255,255,255,.06);\n border-color:rgba(255,255,255,.12)\n}\n#mza-bac-pro3 .dark .panel h3{color:#fff}\n\n@media(max-width:1050px){\n #mza-bac-pro3 .kpis{grid-template-columns:repeat(2,1fr)}\n #mza-bac-pro3 .subjects{grid-template-columns:repeat(2,1fr)}\n #mza-bac-pro3 .two{grid-template-columns:1fr}\n}\n@media(max-width:700px){\n #mza-bac-pro3 .kpis,\n #mza-bac-pro3 .subjects,\n #mza-bac-pro3 .official,\n #mza-bac-pro3 .recommendations{grid-template-columns:1fr}\n #mza-bac-pro3 .subject-grid{grid-template-columns:1fr 1fr}\n}\n<\/style>\n\n<header class=\"hero\">\n<div class=\"wrap\">\n\n<span class=\"badge\">MAROC ZAIN ACADEMY \u2022 BAC INTELLIGENCE SYSTEM<\/span>\n\n<h1>BAC BLANC<br>COCKPIT PRO MAX 3<\/h1>\n\n<p>\nUn centre de pilotage unique pour suivre les r\u00e9sultats en Math\u00e9matiques,\nPhysique-Chimie, SVT, Fran\u00e7ais, Arabe et Anglais.\nLe cockpit distingue d\u00e9sormais les auto-\u00e9valuations MZA des notes officielles\net analyse automatiquement la progression.\n<\/p>\n\n<div class=\"actions\">\n<a href=\"#matieres\" class=\"btn gold\">\ud83d\udcca MES MATI\u00c8RES<\/a>\n<a href=\"#diagnostic\" class=\"btn glass\">\ud83e\udde0 DIAGNOSTIC BAC<\/a>\n<a href=\"#officiel\" class=\"btn glass\">\ud83c\udfc5 NOTES OFFICIELLES<\/a>\n<button class=\"btn glass\" onclick=\"mzaBacRefresh()\">\u21bb ACTUALISER<\/button>\n<\/div>\n\n<\/div>\n<\/header>\n\n<div class=\"wrap\">\n<div class=\"kpis\">\n\n<div class=\"kpi\">\n<small>Moyenne MZA<\/small>\n<strong id=\"kpiAverage\">\u2014<\/strong>\n<span>Auto-\u00e9valuations enregistr\u00e9es<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Readiness Bac<\/small>\n<strong id=\"kpiReadiness\">0%<\/strong>\n<span>Indice global de pr\u00e9paration<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Tests enregistr\u00e9s<\/small>\n<strong id=\"kpiAttempts\">0<\/strong>\n<span>Toutes mati\u00e8res confondues<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Meilleure mati\u00e8re<\/small>\n<strong id=\"kpiBest\">\u2014<\/strong>\n<span>Dernier niveau connu<\/span>\n<\/div>\n\n<div class=\"kpi\">\n<small>Priorit\u00e9<\/small>\n<strong id=\"kpiWeak\">\u2014<\/strong>\n<span>Mati\u00e8re \u00e0 renforcer<\/span>\n<\/div>\n\n<\/div>\n<\/div>\n\n<section id=\"matieres\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">SCOREBOARD<\/span>\n<h2>Les 6 mati\u00e8res du Bac.<\/h2>\n<p>\nChaque carte utilise les r\u00e9sultats enregistr\u00e9s par les pages Bac Blanc connect\u00e9es.\n<\/p>\n<\/div>\n\n<div id=\"subjectGrid\" class=\"subjects\"><\/div>\n\n<\/div>\n<\/section>\n\n<section id=\"diagnostic\" style=\"background:#efede7\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">BAC INTELLIGENCE<\/span>\n<h2>Diagnostic automatique.<\/h2>\n<\/div>\n\n<div class=\"two\">\n\n<div class=\"panel\">\n\n<h3>Alertes &#038; signaux<\/h3>\n\n<div id=\"alerts\" class=\"alerts\"><\/div>\n\n<\/div>\n\n<div class=\"panel readiness\">\n\n<h3>Readiness Index<\/h3>\n\n<div id=\"readinessRing\" class=\"ring\">\n<div class=\"ring-inner\">\n<strong id=\"readinessValue\">0%<\/strong>\n<span>PR\u00c9PARATION BAC<\/span>\n<\/div>\n<\/div>\n\n<p id=\"readinessText\" class=\"muted\" style=\"margin-top:16px\">\nAucun r\u00e9sultat enregistr\u00e9.\n<\/p>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<\/section>\n\n<section id=\"officiel\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">NOTES PROFESSEUR \/ BAC BLANC<\/span>\n<h2>Notes officielles.<\/h2>\n<p>\nCette partie est volontairement s\u00e9par\u00e9e des auto-\u00e9valuations MZA.\nSaisissez uniquement une note r\u00e9ellement corrig\u00e9e par un professeur ou issue d&#8217;un Bac Blanc officiel.\n<\/p>\n<\/div>\n\n<div id=\"officialGrid\" class=\"official\"><\/div>\n\n<div class=\"actions\">\n<button class=\"btn gold\" onclick=\"mzaSaveOfficialScores()\">\ud83d\udcbe ENREGISTRER LES NOTES OFFICIELLES<\/button>\n<button class=\"btn lightbtn\" onclick=\"mzaClearOfficialScores()\">EFFACER<\/button>\n<\/div>\n\n<div id=\"officialStatus\" class=\"status\"><\/div>\n\n<\/div>\n<\/section>\n\n<section style=\"background:#efede7\">\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">SMART COACH<\/span>\n<h2>Priorit\u00e9s de travail.<\/h2>\n<p>\nLe moteur classe automatiquement les mati\u00e8res n\u00e9cessitant le plus de travail.\n<\/p>\n<\/div>\n\n<div id=\"recommendations\" class=\"recommendations\"><\/div>\n\n<\/div>\n<\/section>\n\n<section>\n<div class=\"wrap\">\n\n<div class=\"head\">\n<span class=\"kicker\">HISTORIQUE<\/span>\n<h2>Derni\u00e8res tentatives.<\/h2>\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>Type<\/th>\n<th>Tendance<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"historyBody\"><\/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\">SYNCHRONISATION<\/span>\n<h2>Cockpit connect\u00e9.<\/h2>\n<p>\nLes r\u00e9sultats sont lus depuis la base locale commune\n<strong>mza_bac_results_v2<\/strong>.\nLe cockpit se r\u00e9actualise \u00e9galement lorsqu&#8217;un autre onglet du m\u00eame site enregistre un r\u00e9sultat.\n<\/p>\n<\/div>\n\n<div class=\"two\">\n\n<div class=\"panel\">\n<h3>\u00c9tat du syst\u00e8me<\/h3>\n<p id=\"syncState\" style=\"color:#dce6ee;line-height:1.7\">\nInitialisation&#8230;\n<\/p>\n<\/div>\n\n<div class=\"panel\">\n<h3>Important<\/h3>\n<p style=\"color:#dce6ee;line-height:1.7\">\nCette version utilise le stockage du navigateur.\nPour synchroniser les r\u00e9sultats entre plusieurs appareils ou plusieurs \u00e9l\u00e8ves,\nune prochaine version pourra \u00eatre reli\u00e9e aux comptes WordPress MZA.\n<\/p>\n<\/div>\n\n<\/div>\n\n<\/div>\n<\/section>\n\n<script>\n(function(){\n\nconst RESULTS_KEY=\"mza_bac_results_v2\";\nconst OFFICIAL_KEY=\"mza_bac_official_v1\";\n\nconst SUBJECTS={\n maths:{name:\"Math\u00e9matiques\",icon:\"\u2797\"},\n pc:{name:\"Physique-Chimie\",icon:\"\u269b\ufe0f\"},\n svt:{name:\"SVT\",icon:\"\ud83e\uddec\"},\n fr:{name:\"Fran\u00e7ais\",icon:\"\ud83d\udcd6\"},\n ar:{name:\"Arabe\",icon:\"\ud83c\uddf2\ud83c\udde6\"},\n en:{name:\"Anglais\",icon:\"\ud83c\uddec\ud83c\udde7\"}\n};\n\nfunction safeResults(){\n try{\n  const raw=localStorage.getItem(RESULTS_KEY);\n  const data=raw?JSON.parse(raw):[];\n  return Array.isArray(data)?data:[];\n }catch(e){\n  return [];\n }\n}\n\nfunction safeOfficial(){\n try{\n  const raw=localStorage.getItem(OFFICIAL_KEY);\n  const data=raw?JSON.parse(raw):{};\n  return data && typeof data===\"object\"?data:{};\n }catch(e){\n  return {};\n }\n}\n\nfunction formatScore(v){\n if(v===null || v===undefined || isNaN(v))return \"\u2014\";\n const n=Number(v);\n return (Math.round(n*100)\/100).toString()+\"\/20\";\n}\n\nfunction getSubjectResults(results,code){\n return results\n  .filter(r=>r && r.subject===code && Number(r.score)>=0 && Number(r.score)<=20)\n  .sort((a,b)=>(a.timestamp||0)-(b.timestamp||0));\n}\n\nfunction latestScore(arr){\n if(!arr.length)return null;\n return Number(arr[arr.length-1].score);\n}\n\nfunction bestScore(arr){\n if(!arr.length)return null;\n return Math.max(...arr.map(x=>Number(x.score)));\n}\n\nfunction avgScore(arr){\n if(!arr.length)return null;\n return arr.reduce((s,x)=>s+Number(x.score),0)\/arr.length;\n}\n\nfunction trendInfo(arr){\n if(arr.length<2)return {text:\"Pas encore de tendance\",cls:\"stable\",symbol:\"\u2022\"};\n\n const latest=Number(arr[arr.length-1].score);\n const previous=Number(arr[arr.length-2].score);\n const delta=latest-previous;\n\n if(delta>=1)return {\n  text:\"+\"+delta.toFixed(1)+\" pt\",\n  cls:\"up\",\n  symbol:\"\u2191\"\n };\n\n if(delta<=-1)return {\n  text:delta.toFixed(1)+\" pt\",\n  cls:\"down\",\n  symbol:\"\u2193\"\n };\n\n return {\n  text:\"Stable\",\n  cls:\"stable\",\n  symbol:\"\u2192\"\n };\n}\n\nfunction readinessFromScores(latestScores){\n const vals=Object.values(latestScores).filter(v=>v!==null);\n\n if(!vals.length)return 0;\n\n const avg=vals.reduce((a,b)=>a+b,0)\/vals.length;\n\n let completeness=vals.length\/6;\n let readiness=(avg\/20)*80 + completeness*20;\n\n return Math.max(0,Math.min(100,Math.round(readiness)));\n}\n\nfunction renderSubjects(results,official){\n\n const grid=document.getElementById(\"subjectGrid\");\n grid.innerHTML=\"\";\n\n const latest={};\n\n Object.keys(SUBJECTS).forEach(code=>{\n\n  const arr=getSubjectResults(results,code);\n  const last=latestScore(arr);\n  const best=bestScore(arr);\n  const avg=avgScore(arr);\n  const trend=trendInfo(arr);\n  latest[code]=last;\n\n  const officialScore=\n   official[code]!==undefined &&\n   official[code]!==\"\" &&\n   !isNaN(official[code])\n   ?Number(official[code])\n   :null;\n\n  const card=document.createElement(\"div\");\n  card.className=\"subject\";\n\n  card.innerHTML=\n  \"<div class='subject-top'>\"+\n    \"<div><h3>\"+SUBJECTS[code].icon+\" \"+SUBJECTS[code].name+\"<\/h3><\/div>\"+\n    \"<span class='code'>\"+code.toUpperCase()+\"<\/span>\"+\n  \"<\/div>\"+\n\n  \"<div class='score'>\"+formatScore(last)+\"<\/div>\"+\n  \"<div class='muted'>Derni\u00e8re auto-\u00e9valuation MZA<\/div>\"+\n\n  \"<div class='bar'><div class='fill' style='width:\"+(last!==null?(last\/20*100):0)+\"%'><\/div><\/div>\"+\n\n  \"<div class='subject-grid'>\"+\n   \"<div class='mini'><small>TENTATIVES<\/small><b>\"+arr.length+\"<\/b><\/div>\"+\n   \"<div class='mini'><small>MEILLEUR<\/small><b>\"+formatScore(best)+\"<\/b><\/div>\"+\n   \"<div class='mini'><small>MOYENNE<\/small><b>\"+formatScore(avg)+\"<\/b><\/div>\"+\n   \"<div class='mini'><small>OFFICIEL<\/small><b>\"+formatScore(officialScore)+\"<\/b><\/div>\"+\n   \"<div class='mini'><small>\u00c9CART<\/small><b>\"+\n    ((last!==null && officialScore!==null)\n      ?(last-officialScore>=0?\"+\":\"\")+(last-officialScore).toFixed(1)\n      :\"\u2014\")+\n   \"<\/b><\/div>\"+\n   \"<div class='mini'><small>DERNIER TYPE<\/small><b>MZA<\/b><\/div>\"+\n  \"<\/div>\"+\n\n  \"<span class='trend \"+trend.cls+\"'>\"+trend.symbol+\" \"+trend.text+\"<\/span>\";\n\n  grid.appendChild(card);\n });\n\n return latest;\n}\n\nfunction renderKPIs(results,latest){\n\n const values=Object.values(latest).filter(v=>v!==null);\n\n const average=\n values.length\n ?values.reduce((a,b)=>a+b,0)\/values.length\n :null;\n\n document.getElementById(\"kpiAverage\").textContent=formatScore(average);\n document.getElementById(\"kpiAttempts\").textContent=results.length;\n\n let bestCode=null;\n let weakCode=null;\n\n Object.keys(latest).forEach(code=>{\n  if(latest[code]===null)return;\n\n  if(bestCode===null || latest[code]>latest[bestCode])\n   bestCode=code;\n\n  if(weakCode===null || latest[code]<latest[weakCode])\n   weakCode=code;\n });\n\n document.getElementById(\"kpiBest\").textContent=\n bestCode?SUBJECTS[bestCode].name:\"\u2014\";\n\n document.getElementById(\"kpiWeak\").textContent=\n weakCode?SUBJECTS[weakCode].name:\"\u2014\";\n\n const readiness=readinessFromScores(latest);\n\n document.getElementById(\"kpiReadiness\").textContent=readiness+\"%\";\n document.getElementById(\"readinessValue\").textContent=readiness+\"%\";\n\n document.getElementById(\"readinessRing\").style.background=\n \"conic-gradient(#c99a36 \"+readiness+\"%,#e8edf1 \"+readiness+\"%)\";\n\n let txt=\"Commencez par r\u00e9aliser vos premiers Bac Blanc.\";\n\n if(readiness>=40)txt=\"Pr\u00e9paration en construction.\";\n if(readiness>=55)txt=\"Niveau interm\u00e9diaire : consolidez les mati\u00e8res faibles.\";\n if(readiness>=70)txt=\"Bonne pr\u00e9paration g\u00e9n\u00e9rale.\";\n if(readiness>=82)txt=\"Tr\u00e8s bonne pr\u00e9paration Bac.\";\n if(readiness>=92)txt=\"Niveau de pr\u00e9paration tr\u00e8s \u00e9lev\u00e9.\";\n\n document.getElementById(\"readinessText\").textContent=txt;\n}\n\nfunction renderAlerts(results,latest){\n\n const box=document.getElementById(\"alerts\");\n box.innerHTML=\"\";\n\n const activeCodes=\n Object.keys(latest).filter(c=>latest[c]!==null);\n\n if(!activeCodes.length){\n  box.innerHTML=\n  \"<div class='alert'><strong>Aucun r\u00e9sultat<\/strong>\"+\n  \"<p>R\u00e9alisez au moins un Bac Blanc connect\u00e9 pour lancer l'analyse.<\/p><\/div>\";\n  return;\n }\n\n const sorted=\n activeCodes.sort((a,b)=>latest[a]-latest[b]);\n\n const weak=sorted[0];\n const strong=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 : \"+formatScore(latest[weak])+\". 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[strong].name+\"<\/strong>\"+\n \"<p>Derni\u00e8re auto-\u00e9valuation : \"+formatScore(latest[strong])+\". Maintenez ce niveau sans n\u00e9gliger les autres mati\u00e8res.<\/p>\"+\n \"<\/div>\";\n\n Object.keys(SUBJECTS).forEach(code=>{\n  const arr=getSubjectResults(results,code);\n  if(arr.length<2)return;\n\n  const t=trendInfo(arr);\n\n  if(t.cls===\"up\"){\n   box.innerHTML+=\n   \"<div class='alert'>\"+\n   \"<strong>\ud83d\udcc8 Progression : \"+SUBJECTS[code].name+\"<\/strong>\"+\n   \"<p>\"+t.text+\" entre les deux derni\u00e8res tentatives.<\/p>\"+\n   \"<\/div>\";\n  }\n\n  if(t.cls===\"down\"){\n   box.innerHTML+=\n   \"<div class='alert'>\"+\n   \"<strong>\u26a0\ufe0f Baisse : \"+SUBJECTS[code].name+\"<\/strong>\"+\n   \"<p>\"+t.text+\" entre les deux derni\u00e8res tentatives. V\u00e9rifiez les erreurs commises avant de refaire un sujet.<\/p>\"+\n   \"<\/div>\";\n  }\n });\n}\n\nfunction renderRecommendations(latest){\n\n const box=document.getElementById(\"recommendations\");\n box.innerHTML=\"\";\n\n const codes=\n Object.keys(latest)\n .filter(c=>latest[c]!==null)\n .sort((a,b)=>latest[a]-latest[b]);\n\n if(!codes.length){\n  box.innerHTML=\n  \"<div class='rec'><b>Premier objectif<\/b>\"+\n  \"<p>R\u00e9alisez un Bac Blanc dans au moins trois mati\u00e8res pour obtenir un plan de travail intelligent.<\/p><\/div>\";\n  return;\n }\n\n const advice={\n  maths:\"Refaire les exercices non ma\u00eetris\u00e9s puis r\u00e9aliser une nouvelle simulation chronom\u00e9tr\u00e9e.\",\n  pc:\"Revoir les lois, unit\u00e9s et raisonnements avant de refaire un sujet complet.\",\n  svt:\"Travailler l'analyse documentaire et la construction des conclusions scientifiques.\",\n  fr:\"Renforcer compr\u00e9hension, argumentation, structure et relecture.\",\n  ar:\"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  en:\"Review reading, grammar and structured writing before the next test.\"\n };\n\n codes.slice(0,3).forEach((code,index)=>{\n  box.innerHTML+=\n  \"<div class='rec'>\"+\n   \"<b>\"+(index+1)+\". \"+SUBJECTS[code].name+\"<\/b>\"+\n   \"<p><strong>\"+formatScore(latest[code])+\"<\/strong><br>\"+advice[code]+\"<\/p>\"+\n  \"<\/div>\";\n });\n}\n\nfunction renderHistory(results){\n\n const tbody=document.getElementById(\"historyBody\");\n tbody.innerHTML=\"\";\n\n const sorted=\n [...results]\n .filter(r=>r && SUBJECTS[r.subject])\n .sort((a,b)=>(b.timestamp||0)-(a.timestamp||0))\n .slice(0,20);\n\n if(!sorted.length){\n  tbody.innerHTML=\n  \"<tr><td colspan='5'>Aucune tentative enregistr\u00e9e.<\/td><\/tr>\";\n  return;\n }\n\n sorted.forEach((r,index)=>{\n\n  const subjectArr=\n   getSubjectResults(results,r.subject);\n\n  let trend=\"\u2014\";\n\n  const pos=\n   subjectArr.findIndex(x=>\n    x.timestamp===r.timestamp &&\n    Number(x.score)===Number(r.score)\n   );\n\n  if(pos>0){\n   const delta=\n    Number(subjectArr[pos].score)-\n    Number(subjectArr[pos-1].score);\n\n   if(delta>=1)trend=\"\u2191 +\"+delta.toFixed(1);\n   else if(delta<=-1)trend=\"\u2193 \"+delta.toFixed(1);\n   else trend=\"\u2192 stable\";\n  }\n\n  const d=\n   r.timestamp\n   ?new Date(r.timestamp).toLocaleString()\n   :\"\u2014\";\n\n  tbody.innerHTML+=\n  \"<tr>\"+\n   \"<td>\"+d+\"<\/td>\"+\n   \"<td>\"+SUBJECTS[r.subject].name+\"<\/td>\"+\n   \"<td>\"+formatScore(r.score)+\"<\/td>\"+\n   \"<td>\"+(r.mode||\"Auto-\u00e9valuation MZA\")+\"<\/td>\"+\n   \"<td>\"+trend+\"<\/td>\"+\n  \"<\/tr>\";\n });\n}\n\nfunction renderOfficialForm(){\n\n const official=safeOfficial();\n const grid=document.getElementById(\"officialGrid\");\n\n grid.innerHTML=\"\";\n\n Object.keys(SUBJECTS).forEach(code=>{\n\n  const val=\n   official[code]!==undefined\n   ?official[code]\n   :\"\";\n\n  grid.innerHTML+=\n  \"<div class='official-box'>\"+\n   \"<label>\"+SUBJECTS[code].icon+\" \"+SUBJECTS[code].name+\"<\/label>\"+\n   \"<input type='number' min='0' max='20' step='0.25' \"+\n   \"id='official_\"+code+\"' value='\"+val+\"' placeholder='Note \/20'>\"+\n  \"<\/div>\";\n });\n}\n\nwindow.mzaSaveOfficialScores=function(){\n\n const data={};\n\n Object.keys(SUBJECTS).forEach(code=>{\n\n  const el=document.getElementById(\"official_\"+code);\n  if(!el)return;\n\n  const raw=el.value.trim();\n\n  if(raw===\"\")return;\n\n  const n=Number(raw);\n\n  if(n>=0 && n<=20)\n   data[code]=Math.round(n*4)\/4;\n });\n\n localStorage.setItem(\n  OFFICIAL_KEY,\n  JSON.stringify(data)\n );\n\n const status=document.getElementById(\"officialStatus\");\n status.style.display=\"block\";\n status.classList.remove(\"danger\");\n status.textContent=\"\u2705 Notes officielles enregistr\u00e9es.\";\n\n mzaBacRefresh();\n};\n\nwindow.mzaClearOfficialScores=function(){\n\n localStorage.removeItem(OFFICIAL_KEY);\n\n Object.keys(SUBJECTS).forEach(code=>{\n  const el=document.getElementById(\"official_\"+code);\n  if(el)el.value=\"\";\n });\n\n const status=document.getElementById(\"officialStatus\");\n status.style.display=\"block\";\n status.classList.add(\"danger\");\n status.textContent=\"Les notes officielles ont \u00e9t\u00e9 effac\u00e9es.\";\n\n mzaBacRefresh();\n};\n\nwindow.mzaBacRefresh=function(){\n\n const results=safeResults();\n const official=safeOfficial();\n\n const latest=\n renderSubjects(results,official);\n\n renderKPIs(results,latest);\n renderAlerts(results,latest);\n renderRecommendations(latest);\n renderHistory(results);\n\n document.getElementById(\"syncState\").innerHTML=\n \"\u2705 Cockpit op\u00e9rationnel.<br>\"+\n \"<strong>\"+results.length+\"<\/strong> r\u00e9sultat(s) trouv\u00e9(s) dans la base locale.<br>\"+\n \"Derni\u00e8re actualisation : <strong>\"+\n new Date().toLocaleTimeString()+\n \"<\/strong>.\";\n};\n\nwindow.addEventListener(\"storage\",function(e){\n\n if(e.key===RESULTS_KEY || e.key===OFFICIAL_KEY){\n  mzaBacRefresh();\n }\n\n});\n\nrenderOfficialForm();\nmzaBacRefresh();\n\n})();\n<\/script>\n\n<\/div>\n&#8220;`\n\nCe cockpit apporte trois corrections importantes : **la note MZA n\u2019est plus pr\u00e9sent\u00e9e comme une note officielle**, les **notes professeur\/Bac Blanc r\u00e9elles sont saisies s\u00e9par\u00e9ment**, et chaque mati\u00e8re affiche d\u00e9sormais **derni\u00e8re note, meilleure note, moyenne, nombre de tentatives et tendance**.\n\nLe syst\u00e8me est maintenant coh\u00e9rent : **6 pages Bac Blanc \u2192 base commune \u2192 Cockpit PRO MAX 3 \u2192 diagnostic automatique**.\n","protected":false},"excerpt":{"rendered":"<p>MAROC ZAIN ACADEMY \u2022 BAC INTELLIGENCE SYSTEM BAC BLANCCOCKPIT PRO MAX 3 Un centre de pilotage unique pour suivre les r\u00e9sultats en Math\u00e9matiques, Physique-Chimie, SVT, Fran\u00e7ais, Arabe et Anglais. Le cockpit distingue d\u00e9sormais les auto-\u00e9valuations MZA des notes officielles et analyse automatiquement la progression. \ud83d\udcca MES MATI\u00c8RES \ud83e\udde0 DIAGNOSTIC BAC \ud83c\udfc5 NOTES OFFICIELLES \u21bb ACTUALISER [&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-1687","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1687","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=1687"}],"version-history":[{"count":1,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1687\/revisions"}],"predecessor-version":[{"id":1689,"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/pages\/1687\/revisions\/1689"}],"wp:attachment":[{"href":"https:\/\/maroczain.com\/scolaire.maroczain.com\/wp-json\/wp\/v2\/media?parent=1687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}