Audit complet de mise en forme — Image (2e élément du tableau)
Implémente toutes les options manquantes identifiées pour l'élément Image : dimensionnement/ratio/object-fit, filtres CSS, upload de fichier (en plus de l'URL), lien/plein écran au clic, chargement différé, légende, et tous les attributs de boîte partagés déjà créés pour Titre/Paragraphe (padding/margin/fond/bordure/ombre/opacité/ position du bloc). Système de pages : un support peut désormais avoir 0 page (un nouveau support démarre vide), suppression de toutes les pages en un clic, et la pagination automatique insère intelligemment la nouvelle page juste après celle qui déborde plutôt qu'en toute fin de liste. Bugs réels trouvés et corrigés en cours de route : le style de bloc (dont align-self) ciblait l'élément interne au lieu de son enveloppe (légende/lien) ; une image à sa taille native pouvait déclencher une pagination infinie ; upload/mise à jour d'attribut ne déclenchaient jamais le contrôle de débordement. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
6c7675fad0
commit
9ad50c58b8
@@ -52,7 +52,21 @@ regroupement à chaque appel.
|
||||
`<div>` portant directement ce fragment SVG nettoyé par
|
||||
`sanitize_svg_markup` (voir `sanitize_svg_markup.py` ci-dessous) : un
|
||||
contenu vectoriel dessiné/collé par le créateur plutôt qu'un fichier
|
||||
hébergé, sans aucun style qui lui soit propre.
|
||||
hébergé. Style inline : `object_fit` (`"cover"`/`"contain"`/`"fill"`,
|
||||
toute autre valeur ignorée), `aspect_ratio` (valeur CSS libre, ex.
|
||||
`"16 / 9"`), `filter_preset` (`"grayscale"`/`"sepia"`/`"blur"`, mappé
|
||||
vers une vraie valeur `filter` CSS fixe — jamais une valeur de filtre
|
||||
libre) + les attributs de boîte partagés (`render_box_style`, voir
|
||||
`box_style.py`). `lazy_load` (`True`) ajoute `loading="lazy"` sur
|
||||
l'`<img>` uniquement (comportement, pas du style). `click_behavior`
|
||||
(`""`/`"link"`/`"lightbox"`) enveloppe le tout dans un `<a target="_blank"
|
||||
rel="noopener noreferrer">` (si `link_url` est aussi renseigné) ou un
|
||||
`<div class="docImageLightboxTrigger">` — les deux ne deviennent
|
||||
réellement cliquables qu'en Mode Aperçu (voir static/document/js/
|
||||
document-editor.js::forgeDocBindCanvasInteractions/
|
||||
forgeDocOpenImageLightbox), même principe que les mini-jeux et la
|
||||
pièce jointe d'un bouton. `caption` (non vide) enveloppe le tout dans
|
||||
un `<figure><figcaption>` échappée.
|
||||
- **Bouton** : `<button>` avec son `label`, un `data-target` optionnel
|
||||
(navigation) et un `data-attachment-filename` optionnel — marqueur
|
||||
mécanique posé quand un fichier a été joint (voir
|
||||
@@ -213,17 +227,22 @@ Un dict à 4 clés (`BORDER_SIDES`), chacune `{"style": "none", "width":
|
||||
|
||||
### `BOX_DEFAULTS: dict[str, Any]`
|
||||
`{"padding": "", "margin": "", "background_color": "", "border_radius":
|
||||
"", "align_self": "stretch", "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).
|
||||
"", "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).
|
||||
|
||||
### `render_box_style(a: dict[str, Any]) -> str`
|
||||
Construit les déclarations CSS inline pour `padding`/`margin`/
|
||||
`background_color`/`border_radius`/`height`/`min_height`/`max_height`/
|
||||
`min_width`/`box_shadow`/`opacity`/`border`/`align_self` de `a` — un
|
||||
attribut absent ou à sa valeur par défaut ne produit AUCUNE déclaration
|
||||
(comportement historique inchangé). `border` est un dict à 4 clés
|
||||
Construit les déclarations CSS inline pour chaque attribut listé dans
|
||||
`BOX_DEFAULTS` (padding/margin/background_color/border_radius/width/
|
||||
max_width/height/min_height/max_height/min_width/box_shadow/opacity) +
|
||||
`border`/`align_self` de `a`, via une table de correspondance
|
||||
(clé d'attribut, propriété CSS) plutôt qu'un bloc `if` par attribut
|
||||
(complexité cognitive — voir `_render_simple_properties`/`_render_border`,
|
||||
privées) — un attribut absent ou à sa valeur par défaut ne produit
|
||||
AUCUNE déclaration (comportement historique inchangé). `border` est un
|
||||
dict à 4 clés
|
||||
(`BORDER_SIDES`), chacune `{"style", "width", "color"}` — un côté à
|
||||
`style="none"` (ou absent) ne produit rien pour ce côté, jamais un
|
||||
`border-top:none` explicite. `align-self` n'est ajouté que si différent
|
||||
|
||||
Reference in New Issue
Block a user