'use strict'; const paths={home:'m3 10 9-7 9 7v11h-6v-7H9v7H3z',book:'M12 6v15 M2 3h6a4 4 0 0 1 4 4 4 4 0 0 1 4-4h6v17h-6a4 4 0 0 0-4 2 4 4 0 0 0-4-2H2z',calendar:'M8 2v4 M16 2v4 M3 10h18 M5 4h14a2 2 0 0 1 2 2v14H3V6a2 2 0 0 1 2-2 M7 14h2 M15 14h2',spark:'m12 3 2.7 6.3L21 12l-6.3 2.7L12 21l-2.7-6.3L3 12l6.3-2.7z',arrow:'M5 12h14 M13 6l6 6-6 6',check:'m5 12 4 4L19 6',clock:'M12 8v5l3 2 M22 12A10 10 0 1 1 2 12a10 10 0 0 1 20 0',grid:'M3 3h7v7H3z M14 3h7v7h-7z M3 14h7v7H3z M14 14h7v7h-7z',graph:'M6 6l12 5-9 8 M9 19 6 6 M9 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0 M21 11a3 3 0 1 1-6 0 3 3 0 0 1 6 0 M12 19a3 3 0 1 1-6 0 3 3 0 0 1 6 0',users:'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M16 3a4 4 0 0 1 0 8 M22 21v-2a4 4 0 0 0-3-3.87 M13 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0'}; const icon=n=>``; const esc=s=>String(s).replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); const state={role:'student',page:'home',selected:'Emma',tasks:[{id:1,title:'Revoir l’addition de fractions',subject:'Mathématiques',duration:'10 min',day:'Mardi',done:true,symbol:'½',color:''},{id:2,title:'Retenir 8 mots du cours',subject:'Allemand',duration:'8 min',day:'Mercredi',done:false,symbol:'Aa',color:'orange'},{id:3,title:'Revenir aux équations',subject:'Mathématiques',duration:'12 min',day:'Vendredi',done:false,symbol:'𝑥',color:'green'}],quizIndex:0,answers:[],hint:0,coachSaved:false,note:'Reprendre les fractions avec deux représentations visuelles, puis vérifier le transfert vers une équation.',attachment:''}; const students={Emma:{name:'Emma Dubois',initials:'ED',subject:'Mathématiques',issue:'Fractions avant équations',progress:38,description:'Emma additionne parfois les dénominateurs. Revenir au sens des parts avant de reprendre les équations.',lesson:'Jeudi 12 · 16 h 30',goal:'Additionner deux fractions de dénominateurs différents.'},Lucas:{name:'Lucas Bernard',initials:'LB',subject:'Allemand',issue:'Vocabulaire à réactiver',progress:62,description:'Lucas reconnaît les mots à la lecture mais hésite sans les choix de réponse. Prévoir un rappel libre et espacé.',lesson:'Vendredi 13 · 15 h 00',goal:'Retrouver huit mots du cours sans choix de réponse.'},Lea:{name:'Léa Perrin',initials:'LP',subject:'Mathématiques',issue:'Vérifier l’autonomie',progress:78,description:'Léa réussit avec un indice. Proposer une nouvelle équation sans aide pour vérifier sa compréhension.',lesson:'Vendredi 13 · 17 h 00',goal:'Résoudre une équation puis vérifier sa solution seule.'}}; const roles={student:{label:'Élève',name:'Emma Dubois',initials:'ED',sub:'Élève · 10e'},coach:{label:'Coach',name:'Camille Martin',initials:'CM',sub:'Coach · Nash Academy'},parent:{label:'Parents',name:'Famille Dubois',initials:'FD',sub:'Suivi d’Emma'}}; const quizzes=[{q:'Pour additionner ½ et ⅓, quel dénominateur commun peux-tu choisir ?',options:['5','6','8'],answer:1,explanation:'6 est un multiple de 2 et de 3. On peut donc écrire ½ = 3/6 et ⅓ = 2/6.'},{q:'Combien vaut ½ + ⅓ ?',options:['2/5','5/6','1/6'],answer:1,explanation:'On additionne les parts de même taille : 3/6 + 2/6 = 5/6. Le dénominateur reste 6.'},{q:'Dans x + ⅓ = 5/6, quelle est la valeur de x ?',options:['1/2','2/3','1/3'],answer:0,explanation:'On retire ⅓, soit 2/6, des deux côtés. x = 5/6 − 2/6 = 3/6 = ½.'}]; const action=(text,a,cls='')=>``; const link=(text,page)=>`${text} ${icon('arrow')}`; function routes(){return state.role==='coach'?[['home','Ma journée','home'],['students','Mes élèves','users'],['planning','Les séances','calendar'],['progress','Les notions','graph'],['courses','Ressources','book'],['companions','Compagnons','spark']]:state.role==='parent'?[['home','Vue d’ensemble','home'],['planning','Son planning','calendar'],['progress','Ses progrès','graph'],['family','À la maison','book'],['companions','Compagnons','spark']]:[['home','Mon espace','home'],['courses','Mes cours','book'],['planning','Mon planning','calendar'],['progress','Mes progrès','graph'],['challenges','Mes défis','spark'],['companions','Compagnons','users']];} function readRoute(){const [role,page]=location.hash.slice(1).split('/');state.role=roles[role]?role:'student';state.page=page||'home';if(!routes().some(r=>r[0]===state.page))state.page='home';} function shell(){const r=roles[state.role];return `
Mon centre/Nash Academy
${Object.entries(roles).map(([id,v])=>``).join('')}

Maquette interactive · profils et semaine fictifs · aucune donnée transmise

${body()}
`;} function heading(eyebrow,title,sub){return `
${eyebrow}

${title}

${sub}

Semaine du 9 au 15 novembre · démo
`;} function panelHead(title,extra=''){return `

${title}

${extra}
`;} function taskRow(t,interactive=true){return `
${t.symbol}
${t.title}${t.subject} · ${t.duration} · ${t.day}
${interactive?``:`${t.done?'Fait':'Prévu'}`}
`;} function tasksCard(){const n=state.tasks.filter(t=>t.done).length;return `
${panelHead(state.role==='parent'?'Ses prochains petits pas':'Mes prochains petits pas',link('Tout le planning','planning'))}${state.tasks.map(t=>taskRow(t,state.role==='student')).join('')}
${n} sur ${state.tasks.length} terminés
`;} function sessionCard(){return `
LE PROCHAIN RENDEZ-VOUS${icon('calendar')}
Jeudi12

Un moment avec Camille

16 h 30 – 17 h 30 · Mathématiques

Au programme : consolider les fractions, puis faire le lien avec les équations.
`;} function notion(title,pct,cls,caption){return `
${title}${pct} % · exemple

${caption}

`;} function progressCard(){return `
${panelHead('Ça prend forme.',link('Voir les liens','progress'))}LES NOTIONS D’EMMA${notion('Calculs entiers',92,'green','Une base solide pour la suite.')}${notion('Fractions',38,'','Le point de départ de cette semaine.')}${notion('Équations',26,'orange','À reprendre après les fractions.')}
${icon('spark')}

Comprendre les fractions peut débloquer les équations.

`;} function homeStudent(){return `${heading('MARDI · ON GARDE LE FIL','Un petit pas, Emma.','Tu n’as pas besoin de tout réussir aujourd’hui. Juste d’avancer.')}${companionStrip()}
${state.companion==='george'?'George, compagnon pédagogique':portrait(state.companion,'hero-companion')}
TON DÉFI DU JOUR · AVEC ${companions.find(c=>c.id===state.companion).name.toUpperCase()}

Les fractions ?
On y va ensemble.

Trois questions pour comprendre ce qui bloque, et retrouver le déclic.

${action('Commencer mon défi','quiz','orange')}3 minutes · À partir de ton cours de maths
${tasksCard()}
?

Un exercice te résiste ?

On cherche la prochaine étape ensemble.

${sessionCard()}${progressCard()}
${panelHead("À explorer ensuite",link("Tous les défis","challenges"))}
${learningTopics.slice(1,4).map(topicCard).join('')}
`;} function coachWorkspace(){const s=students[state.selected];return `
${panelHead('Les parcours à accompagner','6 élèves · démo')}

Une priorité par élève, à valider avec ce que tu observes en séance.

${Object.entries(students).map(([id,p])=>``).join('')}

PROCHAINE SÉANCE · ${s.lesson}

${icon('book')}

${s.goal}

${panelHead(s.name,''+s.subject+'')}

${s.description}

${notion(s.notion||(state.selected==='Lucas'?'Vocabulaire du cours':state.selected==='Lea'?'Équations':'Fractions'),s.progress,'','Repère fictif pour préparer la séance.')}

Note de démonstration, conservée uniquement jusqu’au rechargement.

`;} function homeCoach(){return `${heading('L’ESSENTIEL AVANT LA SÉANCE','Bonjour, Camille.','Ce qui a avancé. Ce qui résiste. Le bon point de départ pour chacun.')}
À ACCOMPAGNER6 élèvesParcours fictifs à explorer
PROCHAINE SÉANCEJeudiEmma · 16 h 30
PRIORITÉ D’EMMAFractionsAvant de revenir aux équations
${coachWorkspace()}`;} function homeParent(){return `${heading('LE SUIVI D’EMMA','Des progrès, à son rythme.','Un aperçu du travail prévu et des notions à consolider avec son coach.')}
CETTE SEMAINE

Reprendre les bases.
Retrouver la confiance.

Emma travaille les fractions pour avancer ensuite dans les équations. Camille reprendra ce point avec elle jeudi.

${tasksCard()}
UN MOT DU COACH · EXEMPLE
« L’objectif est qu’Emma puisse expliquer sa méthode, pas seulement trouver le résultat. »Camille Martin · coaching mathématiques
${sessionCard()}${progressCard()}

L’accès parents est inclus avec celui de l’élève. Ce suivi présente les progrès et le planning ; les conversations détaillées restent hors de cette vue.

`;} function courses(){return `${heading('LE POINT DE DÉPART','Tes cours. Ton terrain.','George t’accompagne sur les notions que tu travailles vraiment.')}
½

Fractions & équations

Devoir de mathématiques · chapitre 4
Objectif : additionner des fractions, puis isoler x.

À revoir avant jeudi
${action('Explorer mon exercice','help')}
Aa

Wörter im Alltag

Allemand · vocabulaire du quotidien
Objectif : retrouver 8 mots du cours sans aide.

Prévu mercredi · 8 min
${action('Ouvrir la fiche exemple','german','light')}

${state.attachment?esc(state.attachment)+' · aperçu du nom uniquement. Aucun fichier envoyé.':'PDF ou image · cette maquette affiche le nom du fichier, sans le lire ni l’envoyer.'}

${icon('book')}

Les exemples ci-dessus sont déjà préparés. L’analyse d’un vrai devoir et la génération d’exercices seront raccordées au projet George.

`;} function planning(){const coach=state.role==='coach';return `${heading('UNE SEMAINE RÉALISABLE',coach?'Chaque séance, bien préparée.':state.role==='parent'?'Son planning, en un regard.':'Un peu chaque jour. Ça change tout.',coach?'Le contexte de chaque élève accompagne le prochain rendez-vous.':'Des séquences courtes, avec une place pour souffler.')}
${coach?Object.entries(students).map(([id,s])=>`

${s.lesson}

${s.name} · ${s.subject}
${icon('spark')}

${s.goal}

`).join(''):state.tasks.map(t=>`

${t.day}

${t.duration} · une petite étape${taskRow(t,state.role==='student')}${state.role==='student'?``:''}
`).join('')}
${coach?'':sessionCard()}

${coach?'Les séances affichées sont fictives.':'Les changements de la démo restent dans cette visite ; ils ne sont pas envoyés au coach.'}

`;} function progress(){return `${heading('COMPRENDRE LES LIENS','Une base solide. Puis la suite.','Parcours d’Emma · des repères par notion pour choisir le prochain petit pas.')}
${panelHead('Le chemin vers les équations','Mathématiques')}
Calculs entiers92 % · base solide
${icon('arrow')}
Fractions38 % · à consolider
${icon('arrow')}
Équations26 % · prochaine étape
${icon('spark')}

Le point à travailler : comprendre que des fractions doivent représenter des parts de même taille avant de les additionner.

Ces repères sont illustratifs, pas des notes scolaires. Le défi de cette maquette ne modifie pas ces pourcentages.

${state.role==='student'?action('Vérifier ma compréhension','quiz','purple'):''}
${panelHead('Avant, pendant, après')}
01
Repérer le blocageUne question ancrée dans le devoir.
02
Travailler avec CamilleLa méthode et le prérequis manquant.
03
Réussir à nouveau, seulUn autre exercice quelques jours après.
`;} function body(){switch(state.page){case'courses':return richerCourses();case'challenges':return challengePage();case'companions':return companionPage();case'family':return familyPage();case'planning':return planning();case'progress':return progress();case'students':return heading('LE PARCOURS PÉDAGOGIQUE','Chaque élève, son point de départ.','Sélectionne un parcours pour préparer un objectif adapté.')+coachWorkspace();default:return state.role==='coach'?homeCoach():state.role==='parent'?homeParent():homeStudent();}} function render(){document.getElementById('app').innerHTML=shell();document.title=`George · ${roles[state.role].label} · Nash Academy`;} function go(role,page='home'){const hash=`#${role}/${page}`;if(location.hash===hash){readRoute();render();}else location.hash=hash;} const dialog=document.getElementById('dialog'); function dialogHead(label,title){return `
${label}

${title}

`;} function modal(html){document.getElementById('dialog-content').innerHTML=html;if(!dialog.open)dialog.showModal();} function quiz(){const i=state.quizIndex;if(i>=quizzes.length){const count=state.answers.filter((a,j)=>a===quizzes[j].answer).length;state.quizResults[state.activeTopic]=count;render();modal(`${dialogHead('DÉFI TERMINÉ','Un pas de plus dans ta compréhension.')}

${count} réponse${count>1?'s':''} correcte${count>1?'s':''} sur 3

${count===3?'Tu as réussi ce défi. Essaie de retrouver les idées demain sans aide.':'Les explications t’ont donné une méthode à reprendre. Tu peux refaire le défi à ton rythme.'}

Résultat de cette visite uniquement. Rien n’est envoyé au coach ni enregistré dans un dossier élève.

${action('Fermer le bilan','close')}
`);return;}const q=quizzes[i],a=state.answers[i],answered=a!==undefined;modal(`${dialogHead(state.quizLabel||'MATHÉMATIQUES · FRACTIONS',`Question ${i+1} sur 3`)}

${q.q}

${q.options.map((o,n)=>``).join('')}
${answered?`${a===q.answer?'Oui, c’est ça.':'Regardons la méthode.'}
${q.explanation}`:'Choisis une réponse. Chaque essai est une occasion de comprendre.'}
Défi de démonstration
`);} function help(){const hints=['Tu bloques sur cette équation ? Avant de chercher x, regardons les fractions : comment écrire ⅓ avec un dénominateur de 6 ?','⅓ et 2/6 représentent la même quantité. Multiplie le numérateur et le dénominateur par 2. Quel calcul permet ensuite d’isoler x ?','Soustrais 2/6 des deux côtés : x = 5/6 − 2/6 = 3/6. Peux-tu maintenant simplifier cette fraction et vérifier le résultat dans l’équation ?'];modal(`${dialogHead('À PARTIR DE TON DEVOIR','Cherchons la prochaine étape.')}Exercice exemple · chapitre 4
x + ⅓ = ⅚
${portrait(state.companion)}
${hints[state.hint]}

Accompagnement préparé pour cette maquette. L’assistant réel et l’analyse des devoirs ne sont pas encore connectés.

${state.hint<2?action('Un indice de plus','hint','light'):action('Reprendre depuis le début','help','light')}${action('Essayer le défi','quiz','purple')}
`);} let toastTimer;function toast(t){const el=document.getElementById('toast');el.textContent=t;el.classList.add('visible');clearTimeout(toastTimer);toastTimer=setTimeout(()=>el.classList.remove('visible'),3500);} function selectStudent(id){if(!students[id])return;state.selected=id;state.note=students[id].goal;state.coachSaved=false;} document.addEventListener('click',e=>{const b=e.target.closest('button');if(!b)return;if(handleEnrichmentClick(b))return;if(b.dataset.role){go(b.dataset.role);return;}if(b.dataset.task&&state.role==='student'){const t=state.tasks.find(t=>t.id===Number(b.dataset.task));t.done=!t.done;render();document.querySelector(`[data-task="${t.id}"]`)?.focus();return;}if(b.dataset.student){selectStudent(b.dataset.student);render();document.querySelector(`[data-student="${state.selected}"]`)?.focus();return;}if(b.dataset.prepare){selectStudent(b.dataset.prepare);go('coach','students');return;}if(b.dataset.answer!==undefined){if(state.answers[state.quizIndex]!==undefined)return;state.answers[state.quizIndex]=Number(b.dataset.answer);quiz();document.querySelector('[data-action="next"]')?.focus();return;}switch(b.dataset.action){case'close':dialog.close();break;case'quiz':beginTopic('fractions');break;case'next':if(state.answers[state.quizIndex]===undefined)return;state.quizIndex++;quiz();document.getElementById('dialog-title').setAttribute('tabindex','-1');document.getElementById('dialog-title').focus();break;case'help':state.hint=0;help();break;case'hint':state.hint=Math.min(2,state.hint+1);help();break;case'session':modal(`${dialogHead('JEUDI 12 · 16 H 30','Le bon point de départ.')}

Séance fictive avec Camille Martin · Mathématiques

Objectif
Comprendre l’addition des fractions avant de reprendre les équations.

Avant la séance : préparer le devoir du chapitre 4 et noter une question.
Pendant : représenter les fractions, puis expliquer sa méthode.
Après : vérifier la compréhension avec un exercice différent.

${action('C’est noté','close')}
`);break;case'german':modal(`${dialogHead('ALLEMAND · EXEMPLE','Huit mots, un petit rituel.')}

Lis les mots, cache leur traduction, puis essaie de les retrouver.

${[['das Buch','le livre'],['die Schule','l’école'],['der Tag','le jour'],['das Haus','la maison'],['lernen','apprendre'],['lesen','lire'],['schreiben','écrire'],['verstehen','comprendre']].map(([a,b])=>`
${a}

${b}

`).join('')}

Liste d’illustration, à remplacer par le vrai vocabulaire du cours.

`);break;}}); document.addEventListener('change',e=>{if(e.target.dataset.move&&state.role==='student'){const t=state.tasks.find(t=>t.id===Number(e.target.dataset.move));t.day=e.target.value;render();document.getElementById('day-'+t.id)?.focus();toast('Planning ajusté pour cette visite.');}if(e.target.id==='course-file'){const f=e.target.files[0];state.attachment=f?f.name:'';document.getElementById('file-status').textContent=f?f.name+' · aperçu du nom uniquement. Aucun fichier envoyé.':'Aucun fichier sélectionné.';}}); document.addEventListener('input',e=>{if(e.target.id==='coach-note'){state.note=e.target.value;state.coachSaved=false;const b=document.querySelector('#coach-form button');if(b)b.innerHTML='Valider cet objectif '+icon('check');}}); document.addEventListener('submit',e=>{if(e.target.id==='coach-form'){e.preventDefault();state.note=document.getElementById('coach-note').value;state.coachSaved=true;render();toast('Objectif enregistré dans la démo, pour cette visite.');}}); window.addEventListener('hashchange',()=>{if(dialog.open)dialog.close();readRoute();render();window.scrollTo(0,0);}); Object.assign(state,{companion:'george',subjectFilter:'Tout',activeTopic:'fractions',quizLabel:'Mathématiques · Fractions',quizResults:{}}); Object.assign(students,{ Nora:{name:'Nora Martins',initials:'NM',subject:'Français',notion:'Accords sujet-verbe',issue:'Retrouver le noyau du sujet',progress:55,description:'Nora accorde parfois le verbe avec le nom le plus proche. Travailler sur les groupes sujets qui contiennent un complément.',lesson:'Jeudi 12 · 17 h 30',goal:'Identifier le noyau du sujet dans trois phrases avant de conjuguer le verbe.'}, Sami:{name:'Sami Benali',initials:'SB',subject:'Sciences',notion:'Cycle de l’eau',issue:'Distinguer les changements d’état',progress:46,description:'Sami confond condensation et évaporation. Relier les mots à deux observations concrètes : une flaque et une vitre embuée.',lesson:'Vendredi 13 · 14 h 00',goal:'Expliquer le sens de deux changements d’état à partir d’exemples.'}, Chloe:{name:'Chloé Meyer',initials:'CM',subject:'Anglais',notion:'Présent simple',issue:'Utiliser does sans doubler le -s',progress:68,description:'Chloé réussit les phrases affirmatives mais conserve parfois le -s après does. Comparer affirmation, question et négation.',lesson:'Vendredi 13 · 16 h 00',goal:'Transformer trois phrases au présent simple en questions et négations.'} }); readRoute();render();