File size: 6,066 Bytes
3c9e8aa | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | console.log("✅ script.js chargé");
// =====================================================
// Données apprenant (exemple)
// =====================================================
const learnerData = {
intention: "Améliorer mon écriture académique",
difficulty: "Je me sens parfois bloqué pour structurer mes idées",
profile: { engagement: "moyen", risk: "modéré" },
domains: { discours: 65, texte: 52, phrase: 78, mot: 82 },
activity: { errorsRate: 35 }
};
// =====================================================
// Radar professionnel – Indicateurs décideur
// =====================================================
const radarMetrics = [
{ label: "Démarrage des activités", value: 85 },
{ label: "Éléments de connaissance validés", value: 72 },
{ label: "Niveau moyen de compétence", value: 68 },
{ label: "Taux d’erreur (inversé)", value: 65 },
{ label: "Achèvement des activités", value: 74 },
{ label: "Interactions avec les ressources", value: 80 },
{ label: "Score PIX (performance)", value: 70 },
{ label: "Domaines de compétence", value: 78 }
];
// =====================================================
// Trust metrics
// =====================================================
const trustMetrics = { RA: 0, EA: 0, RE: 0, MCS: 0, MS: 0 };
const trustWeights = { RA: 0.30, EA: 0.20, RE: 0.20, MCS: 0.10, MS: 0.20 };
// =====================================================
// Initialisation
// =====================================================
document.addEventListener("DOMContentLoaded", () => {
document.getElementById("intent").textContent = learnerData.intention;
document.getElementById("difficulty").textContent = learnerData.difficulty;
setBar("discours", learnerData.domains.discours);
setBar("texte", learnerData.domains.texte);
setBar("phrase", learnerData.domains.phrase);
setBar("mot", learnerData.domains.mot);
const riskValue = learnerData.profile.risk === "élevé" ? 80 :
learnerData.profile.risk === "modéré" ? 50 : 20;
setBar("risk", riskValue, true);
drawRadar();
generateEmpathicFeedback();
initTrustStars();
});
// =====================================================
// UI helpers
// =====================================================
function setBar(id, value, isRisk = false) {
const el = document.getElementById(id);
el.style.width = value + "%";
el.textContent = value + "%";
if (isRisk) el.style.background = value > 70 ? "#E53935" : value > 40 ? "#FB8C00" : "#43A047";
}
// =====================================================
// Radar professionnel
// =====================================================
function drawRadar() {
const canvas = document.getElementById("radar");
const ctx = canvas.getContext("2d");
const cx = canvas.width / 2, cy = canvas.height / 2;
const radius = 200, levels = 5, count = radarMetrics.length;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.font = "12px Arial";
for (let l = 1; l <= levels; l++) {
ctx.beginPath();
ctx.arc(cx, cy, (radius / levels) * l, 0, 2 * Math.PI);
ctx.strokeStyle = "#e0e0e0";
ctx.stroke();
}
radarMetrics.forEach((m, i) => {
const angle = (2 * Math.PI / count) * i - Math.PI / 2;
ctx.beginPath();
ctx.moveTo(cx, cy);
ctx.lineTo(cx + radius * Math.cos(angle), cy + radius * Math.sin(angle));
ctx.strokeStyle = "#cfd8dc";
ctx.stroke();
ctx.fillText(m.label,
cx + (radius + 18) * Math.cos(angle) - 50,
cy + (radius + 18) * Math.sin(angle)
);
});
ctx.beginPath();
radarMetrics.forEach((m, i) => {
const angle = (2 * Math.PI / count) * i - Math.PI / 2;
const r = radius * (m.value / 100);
const x = cx + r * Math.cos(angle);
const y = cy + r * Math.sin(angle);
i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
});
ctx.closePath();
ctx.fillStyle = "rgba(25,118,210,0.25)";
ctx.strokeStyle = "#1976D2";
ctx.lineWidth = 2;
ctx.fill();
ctx.stroke();
}
// =====================================================
// Feedback empathique
// =====================================================
function generateEmpathicFeedback() {
let msg = "Il est normal de rencontrer des difficultés dans l’écriture académique. ";
if (learnerData.domains.texte < 60)
msg += "Les indicateurs montrent que la structuration du texte reste un défi important. ";
if (learnerData.activity.errorsRate > 30)
msg += "Un taux d’erreurs élevé peut provoquer frustration et doute, ce qui est compréhensible. ";
msg += "Vos compétences linguistiques constituent cependant une base solide. ";
msg += "En planifiant vos activités et en progressant étape par étape, vous pouvez renforcer votre confiance.";
document.getElementById("feedback").textContent = msg;
}
// =====================================================
// Trust metrics UI
// =====================================================
function initTrustStars() {
document.querySelectorAll(".stars").forEach(container => {
const metric = container.dataset.metric;
for (let i = 1; i <= 5; i++) {
const star = document.createElement("span");
star.textContent = "★";
star.classList.add("inactive");
star.onclick = () => {
trustMetrics[metric] = i;
[...container.children].forEach((s, idx) => s.classList.toggle("inactive", idx >= i));
updateTrustScore();
};
container.appendChild(star);
}
});
}
function updateTrustScore() {
let T = 0, max = 0;
for (const m in trustMetrics) {
T += trustMetrics[m] * trustWeights[m];
max += 5 * trustWeights[m];
}
const score = Math.round((T / max) * 100);
const bar = document.getElementById("trust-bar");
bar.style.width = score + "%";
bar.textContent = score + "%";
bar.style.background = score < 40 ? "#E53935" : score < 70 ? "#FB8C00" : "#43A047";
}
|