diff --git a/CLAUDE.md b/CLAUDE.md index 794bea9..fe92971 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -206,7 +206,9 @@ même raison. journal, limitation des connexions, chiffrement des secrets, coordonnées du référent, **mots de passe temporaires jamais mis en file**, secrets de messagerie jamais renvoyés au navigateur, aucune copie cachée dans la chaîne - d'envoi, et rien rendu en HTML brut côté informations. + d'envoi, rien rendu en HTML brut côté informations, et **le HTML de l'éditeur + visuel qui ne quitte jamais la page** (formulaire à champ caché, collage passé + par `DOMParser`, réinjection limitée à `richTextToEditorHtml`). ## Référencement (SEO) @@ -309,16 +311,38 @@ porte ce que publie le bureau depuis `/backend/informations`. Deux tables : `information_reads`. - **Texte riche** : `src/lib/rich-text.ts` est **pur** (`tests/rich-text.test.ts`) - et analyse un sous-ensemble de Markdown — `**gras**`, `*italique*`, `- puce`, - `1. numéro`, `[texte](https://…)`, `## sous-titre`. Deux rendus, un seul + et analyse un sous-ensemble de Markdown — `**gras**`, `_italique_`, `- puce`, + `1. numéro`, `[texte](https://…)`, `## sous-titre`. Trois rendus, un seul analyseur : `richTextNodes()` pour l'écran (des éléments React, jamais - `dangerouslySetInnerHTML`), `richTextToEmailHtml()` pour le message. L'aperçu - du formulaire passe par le premier, il est donc fidèle par construction. Un - lien hors `http`/`https` perd sa cible et ne garde que son libellé - (`safeHttpUrl`, partagé avec `email-templates.ts`). -- **Pas de WYSIWYG** : il produirait du HTML, qu'il faudrait stocker puis - assainir — seconde dépendance, seconde surface d'attaque. La saisie est un - `