style/security: эмодзи→SVG, safeUrl в ассистенте, prefs в localStorage (Спринт3)

- Убраны эмодзи (правило: только inline SVG .ic): classes.html 🃏→layers,
  collection-rb.html →star, pet.html 😋/😢→текст (textContent не держит SVG).
- assistant.js: safeUrl() на динамических href (FAQ/поиск/RAG/правила) —
  блокирует javascript:/data:, пропускает /… и https://….
- LS.prefs: персистентность через localStorage (раньше sync был отключён,
  настройки терялись при перезагрузке). Грузим синхронно + flush на pagehide.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-12 23:00:49 +03:00
parent ccfb151eca
commit 21cea72874
5 changed files with 21 additions and 29 deletions
+2 -2
View File
@@ -1776,11 +1776,11 @@ function showFeedResult(correct, xp, customMsg) {
el.style.cssText = 'display:block;padding:12px 14px;border-radius:12px;background:rgba(56,217,90,.1);border:1.5px solid rgba(56,217,90,.25);font-size:.87rem;font-weight:700;text-align:center;color:#38D95A';
el.textContent = `Правильно! +${xp} XP — питомец доволен!`;
floatLabel(`+${xp} XP`, '#38D95A');
document.getElementById('pet-bubble').textContent = '😋 Вкуснятина!';
document.getElementById('pet-bubble').textContent = 'Вкуснятина!';
setTimeout(() => { closeFeedGame(); startFeedCooldown(1800); }, 1800);
} else {
el.style.cssText = 'display:block;padding:12px 14px;border-radius:12px;background:rgba(249,65,68,.08);border:1.5px solid rgba(249,65,68,.2);font-size:.87rem;font-weight:700;text-align:center;color:#F94144';
el.textContent = 'Неверно — питомец остался голодным 😢';
el.textContent = 'Неверно — питомец остался голодным';
setTimeout(closeFeedGame, 1800);
}
}