Audit complet de mise en forme — Liste à puces/numérotée (4e élément)
Implémente toutes les options manquantes identifiées pour les listes :
typographie complète, style/position/couleur/taille de puce (validés
selon le kind), puce personnalisée en SVG pour les listes à puces,
padding uniforme par élément (nouveau, il n'y en avait aucun), espacement
entre éléments réglable, et tous les attributs de boîte partagés sur la
liste entière. Bordure/fond/padding par élément individuel et sous-listes
imbriquées volontairement différés (portée actée avec l'utilisateur
avant implémentation : transformeraient le stockage des éléments en
objets structurés, chantier bien plus lourd).
Trois ajouts transversaux bénéficiant à plusieurs éléments : sections
"Contenu"/"Conteneur" dans tous les panneaux de propriétés, alignement
vertical du contenu dans son bloc (Titre/Paragraphe/Liste/Image
légendée), et une option pour retirer un thème appliqué ("Aucun modèle"
dans la modale, avec une nouvelle fonction db.remove_document_theme).
Quatre bugs réels trouvés et corrigés en chaîne pendant la validation
avec le thème "Sécurité incendie" : un badge de thème s'affichait
au-dessus du texte au lieu d'à côté ; le correctif a d'abord fait
disparaître les puces/numéros natifs de TOUTES les listes (bug plus
grave que celui corrigé) ; puis un marqueur natif redondant apparaissait
à côté du badge du thème ; puis une règle CSS site-large de spécificité
supérieure empêchait silencieusement ce dernier correctif. Chaque étape
vérifiée par navigateur automatisé sur un support jetable.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
8f879f6321
commit
4db1269348
@@ -113,6 +113,41 @@ regroupement à chaque appel.
|
||||
partagée par les deux) — un `<li>` par entrée de `attributes["items"]`.
|
||||
Une liste vide rend `<ul>`/`<ol>` sans enfant plutôt qu'un placeholder :
|
||||
contrairement à une image sans fichier, ce n'est pas un état anormal.
|
||||
Style inline (audit du 26/09/2026, portée actée avec l'utilisateur :
|
||||
la LISTE ENTIÈRE uniquement, jamais par élément individuel ni de
|
||||
sous-listes) : `bold`/`italic`/`underline`/`font_family`/`font_size`/
|
||||
`line_height`/`text_color` (typo, `_list_text_style`) +
|
||||
`list_style_type` (validé selon le `kind` — `disc`/`circle`/`square`/
|
||||
`none` pour `liste_puces`, `decimal`/`decimal-leading-zero`/
|
||||
`lower-roman`/`upper-roman`/`lower-alpha`/`upper-alpha`/`none` pour
|
||||
`liste_numerotee`, toute autre valeur ignorée)/`list_style_position`
|
||||
(`"outside"` par défaut) + les attributs de boîte partagés
|
||||
(`render_box_style`, voir `box_style.py`). `marker_color`/
|
||||
`marker_size`/`item_padding`/`item_spacing` (`_list_marker_style`/
|
||||
`_list_item_style`) passent par des PROPRIÉTÉS PERSONNALISÉES CSS
|
||||
(`--doc-marker-color`/`--doc-marker-size`/`--doc-item-padding`/
|
||||
`--doc-item-spacing`) : un style inline sur le `<ul>`/`<ol>` ne peut
|
||||
pas cibler directement le `::marker` ou le padding de ses `<li>`
|
||||
enfants autrement — ces propriétés sont posées sur le conteneur et
|
||||
consommées par `static/document/document-editor.css`
|
||||
(`.docList li`/`.docList li::marker`), qui hérite jusque-là.
|
||||
`svg_markup` (liste à puces UNIQUEMENT, ignoré pour `liste_numerotee`)
|
||||
: puce personnalisée — nettoyé par `sanitize_svg_markup` puis encodé
|
||||
en URI de données (`urllib.parse.quote`) pour `list-style-image`, qui
|
||||
prime visuellement sur `list_style_type` dès qu'il est posé.
|
||||
`render_content_align(a)` (voir `box_style.py`) également ajouté :
|
||||
`.docList` est `display:flex; flex-direction:column;` (un `<li>` garde
|
||||
son `display:list-item` propre — puce/numéro visibles — même une fois
|
||||
flex-item, ce sont deux notions indépendantes en CSS).
|
||||
**Bug réel corrigé** (retour utilisateur du 26/09/2026 : "si j'enlève
|
||||
les puces ou que les puces se mettent à l'intérieur, il reste un
|
||||
espace devant la liste, cet espace doit être supprimé") :
|
||||
`padding-left:0;` est ajouté automatiquement dès que
|
||||
`list_style_type="none"` ou `list_style_position="inside"` — le
|
||||
`padding-left:1.4em` par défaut (`.docList`, réservé pour une puce
|
||||
EXTÉRIEURE) n'a alors plus lieu d'être ; un `padding` uniforme réglé
|
||||
explicitement par ailleurs (attributs de boîte partagés) reste
|
||||
prioritaire (déclaré après, dans le même style inline).
|
||||
- **Quiz** : toujours une carte résumant la config réelle (nombre de
|
||||
questions, total des points via `quiz_total_points`, minuteur si
|
||||
activé) — sanitizée (`sanitize_quiz_config`) avant lecture, jamais un
|
||||
@@ -246,9 +281,9 @@ Un dict à 4 clés (`BORDER_SIDES`), chacune `{"style": "none", "width":
|
||||
`{"padding": "", "margin": "", "background_color": "", "border_radius":
|
||||
"", "align_self": "stretch", "width": "", "max_width": "", "height": "",
|
||||
"min_height": "", "max_height": "", "min_width": "", "box_shadow": "",
|
||||
"opacity": ""}` — `border` n'y figure PAS (voir `default_border()`, à
|
||||
ajouter séparément par chaque appelant pour éviter le partage par
|
||||
référence).
|
||||
"opacity": "", "content_align": "top"}` — `border` n'y figure PAS (voir
|
||||
`default_border()`, à ajouter séparément par chaque appelant pour éviter
|
||||
le partage par référence).
|
||||
|
||||
### `render_box_style(a: dict[str, Any]) -> str`
|
||||
Construit les déclarations CSS inline pour chaque attribut listé dans
|
||||
@@ -269,6 +304,26 @@ colonne).
|
||||
vide si rien à ajouter.
|
||||
- **Exceptions** : aucune.
|
||||
|
||||
### `render_content_align(a: dict[str, Any]) -> str`
|
||||
Alignement vertical du CONTENU à l'intérieur de son propre bloc (retour
|
||||
utilisateur du 26/09/2026 : "je peux augmenter la hauteur d'un
|
||||
conteneur mais pas l'alignement vertical à l'intérieur") — `content_align`
|
||||
(`"top"` par défaut, `"center"` ou `"bottom"`) mappé vers
|
||||
`justify-content` (`""` pour `"top"`, comportement historique inchangé).
|
||||
Jamais fusionné dans `render_box_style` : contrairement à `align_self`
|
||||
(position du BLOC dans SON parent, valable pour tout consommateur),
|
||||
l'alignement du CONTENU dépend de l'axe interne du conteneur —
|
||||
`justify-content` convient à un conteneur en colonne (`_render_text`/
|
||||
`_render_list`, dont les classes CSS `.docText`/`.docList` sont
|
||||
`display:flex; flex-direction:column;`, et la figure d'une image
|
||||
légendée, déjà flex-colonne), mais serait FAUX pour le Bouton (rangée
|
||||
icône+texte : l'axe vertical y est déjà géré par `align-items`, voir
|
||||
`static/document/document-editor.css`, `.docButton`) — chaque renderer
|
||||
qui veut ce comportement l'appelle donc explicitement lui-même.
|
||||
- **Retour** : `""` si absent/`"top"`/valeur inconnue, sinon
|
||||
`"justify-content:...;"`.
|
||||
- **Exceptions** : aucune.
|
||||
|
||||
## `sanitize_svg_markup.py` — nettoyage du contenu SVG inline d'une image
|
||||
|
||||
### `sanitize_svg_markup(markup: str) -> str`
|
||||
|
||||
Reference in New Issue
Block a user