From 4db126934815e17e5ef74bd4aa27cc3c4d4853ca Mon Sep 17 00:00:00 2001 From: william Date: Sat, 26 Sep 2026 15:13:14 +0200 Subject: [PATCH] =?UTF-8?q?Audit=20complet=20de=20mise=20en=20forme=20?= =?UTF-8?q?=E2=80=94=20Liste=20=C3=A0=20puces/num=C3=A9rot=C3=A9e=20(4e=20?= =?UTF-8?q?=C3=A9l=C3=A9ment)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- db/__init__.py | 2 + db/supports/__init__.py | 2 + db/supports/remove_document_theme.py | 15 ++ docs/plan/AUDIT_MISE_EN_FORME.md | 196 +++++++++++++- document_engine/labels/element_kind_labels.py | 38 ++- document_engine/labels/labels.md | 25 +- document_engine/rendering/box_style.py | 27 ++ .../rendering/render_document_element.py | 129 +++++++++- document_engine/rendering/rendering.md | 61 ++++- static/document/document-editor.css | 62 ++++- static/document/js/document-editor.js | 210 ++++++++++++++- static/document/themes/securite-incendie.css | 32 ++- templates/document/document_edit.html | 1 + tests/document/test_box_style.py | 20 +- tests/document/test_document_elements.py | 239 ++++++++++++++++++ tests/document/test_document_routes.py | 33 +++ tests/document/test_support_lifecycle.py | 22 ++ 17 files changed, 1080 insertions(+), 34 deletions(-) create mode 100644 db/supports/remove_document_theme.py diff --git a/db/__init__.py b/db/__init__.py index 909df00f..34505ce3 100644 --- a/db/__init__.py +++ b/db/__init__.py @@ -80,6 +80,7 @@ from .supports.create_support import create_support from .supports.delete_support import delete_support from .supports.get_document_theme import get_document_theme from .supports.list_supports import list_supports +from .supports.remove_document_theme import remove_document_theme from .supports.set_document_theme import set_document_theme from .supports.support_dir import support_dir from .supports.support_meta import support_meta @@ -122,6 +123,7 @@ __all__ = [ "support_meta", "delete_support", "get_document_theme", + "remove_document_theme", "set_document_theme", "ONBOARDING_TYPES", "DEFAULT_ONBOARDING_TYPE", diff --git a/db/supports/__init__.py b/db/supports/__init__.py index be218a81..a9ff3448 100644 --- a/db/supports/__init__.py +++ b/db/supports/__init__.py @@ -9,6 +9,7 @@ from .delete_support import delete_support from .ensure_document_pages_schema import ensure_document_pages_schema from .get_document_theme import get_document_theme from .list_supports import list_supports +from .remove_document_theme import remove_document_theme from .set_document_theme import set_document_theme from .support_connection import connect_support, install_support_teardown_safety_net from .support_dir import support_dir @@ -25,6 +26,7 @@ __all__ = [ "get_document_theme", "install_support_teardown_safety_net", "list_supports", + "remove_document_theme", "set_document_theme", "split_slug", "support_dir", diff --git a/db/supports/remove_document_theme.py b/db/supports/remove_document_theme.py new file mode 100644 index 00000000..572178e6 --- /dev/null +++ b/db/supports/remove_document_theme.py @@ -0,0 +1,15 @@ +from .support_connection import connect_support + + +def remove_document_theme(slug: str) -> None: + """Retire le thème appliqué (retour utilisateur du 26/09/2026 : + "aucun modèle" dans la modale doit "revenir à un document de base") + — supprime la LIGNE `_meta` plutôt que d'y stocker une valeur vide, + pour que get_document_theme continue de renvoyer `None` (son + contrat documenté : "aucun thème n'a jamais été appliqué"), jamais + une chaîne vide qui violerait silencieusement ce contrat pour tout + appelant qui compare à `None`.""" + conn = connect_support(slug) + conn.execute("DELETE FROM _meta WHERE key = 'theme'") + conn.commit() + conn.close() diff --git a/docs/plan/AUDIT_MISE_EN_FORME.md b/docs/plan/AUDIT_MISE_EN_FORME.md index 5ad1ebf5..f56ea0cb 100644 --- a/docs/plan/AUDIT_MISE_EN_FORME.md +++ b/docs/plan/AUDIT_MISE_EN_FORME.md @@ -298,7 +298,163 @@ sinon d'un état neutre. Bénéficie automatiquement à TOUS les éléments qui utilisent déjà ce module (Titre/Paragraphe/Image/Bouton), aucune modification nécessaire ailleurs. -### 4. Liste à puces / numérotée — à faire +### 4. Liste à puces / numérotée — ✅ audité et validé (commité) + +**Portée actée avec l'utilisateur avant implémentation** (question +posée explicitement, deux catégories du tableau impliquaient de +transformer `items` — une simple liste de chaînes — en objets +structurés) : style sur la LISTE ENTIÈRE uniquement, jamais par élément +individuel ni de sous-listes imbriquées (chantier bien plus lourd, +différé à une demande séparée si besoin). Seule exception actée : un +padding UNIFORME appliqué à chaque élément (`item_padding`), pas encore +réglable individuellement. + +Implémenté : gras/italique/souligné, police (liste déroulante web-safe, +`FORGE_DOC_FONT_FAMILY_OPTIONS` réutilisé), taille de police, hauteur de +ligne, couleur du texte, style de puce (`list_style_type`, options +propres à chaque kind — disque/cercle/carré/aucune pour puces, +1-2-3/01-02-03/i-ii-iii/I-II-III/a-b-c/A-B-C/aucune pour numérotée), +position de la puce (intérieure/extérieure), couleur et taille de puce +indépendantes du texte, puce personnalisée (icône SVG, liste à puces +uniquement — encodée en URI de données pour `list-style-image`), +espacement intérieur par élément (`item_padding`, **"6px" par défaut, +retour utilisateur explicite : "il faut un padding de base par élément +de liste car y en a pas aujourd'hui"** — n'existait pas du tout avant), +espacement entre éléments réglable (`item_spacing`), tous les attributs +de boîte partagés sur la liste entière (padding/margin/fond/bordure/ +ombre/opacité/position du bloc). + +Mécanisme technique notable : `marker_color`/`marker_size`/ +`item_padding`/`item_spacing` ne peuvent pas passer par un style inline +classique sur le `