Ajoute icône/largeur/arrondi/gras/majuscules à l'étiquette (badge)
Nouveaux attributs par élément (svg_markup/width/border_radius/bold/ uppercase, tous vides ou False par défaut = comportement historique inchangé), réglables depuis le panneau Propriétés — même esprit que bold/align/color déjà présents sur titre/paragraphe. Fixer une largeur implique toujours de sortir de l'étirement pleine largeur par défaut (align-self:flex-start posé automatiquement avec elle). Le kicker "Module obligatoire" du thème Sécurité Incendie s'en sert maintenant (icône flamme, largeur au contenu, arrondi complet, gras, majuscules) pour être conforme à la maquette d'origine — la puce décorative CSS générique qui la remplaçait disparaît du thème. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
1296edc2f8
commit
e03bea39c5
@@ -3,6 +3,8 @@ import json
|
||||
import random
|
||||
from typing import Any
|
||||
|
||||
from .sanitize_svg_markup import sanitize_svg_markup
|
||||
|
||||
|
||||
def render_document(elements: list[dict[str, Any]]) -> str:
|
||||
"""Assemble le document ENTIER à partir de la liste à plat renvoyée
|
||||
@@ -79,8 +81,6 @@ def _render_image(el: dict[str, Any], _children_by_parent: dict[int | None, list
|
||||
# element_kind_labels.element_default_attributes). Nettoyé à
|
||||
# CHAQUE rendu (jamais seulement à l'écriture) par sanitize_svg_markup,
|
||||
# même défense en profondeur que html.escape sur les autres kinds.
|
||||
from .sanitize_svg_markup import sanitize_svg_markup
|
||||
|
||||
sanitized = sanitize_svg_markup(svg_markup)
|
||||
return f'<div class="docImage" data-element-id="{el["id"]}" data-kind="image">{sanitized}</div>'
|
||||
src = html_lib.escape(str(a.get("src", "")))
|
||||
@@ -128,8 +128,31 @@ def _render_button(el: dict[str, Any], _children_by_parent: dict[int | None, lis
|
||||
|
||||
|
||||
def _render_badge(el: dict[str, Any], _children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str:
|
||||
content = html_lib.escape(str(el["attributes"].get("content", "")))
|
||||
return f'<div class="docBadge" data-element-id="{el["id"]}" data-kind="badge">{content}</div>'
|
||||
a = el["attributes"]
|
||||
content = html_lib.escape(str(a.get("content", "")))
|
||||
svg_markup = str(a.get("svg_markup", "")).strip()
|
||||
icon_html = f'<span class="docBadgeIcon">{sanitize_svg_markup(svg_markup)}</span>' if svg_markup else ""
|
||||
|
||||
style_parts = []
|
||||
width = str(a.get("width", "")).strip()
|
||||
if width:
|
||||
# Fixer une largeur implique de ne plus s'étirer sur toute la
|
||||
# largeur de .docPageContent (comportement par défaut d'un enfant
|
||||
# flex en colonne, voir static/document/document-editor.css) —
|
||||
# les deux vont toujours ensemble, jamais l'un sans l'autre.
|
||||
style_parts.append(f"align-self:flex-start; width:{html_lib.escape(width)};")
|
||||
border_radius = str(a.get("border_radius", "")).strip()
|
||||
if border_radius:
|
||||
style_parts.append(f"border-radius:{html_lib.escape(border_radius)};")
|
||||
if a.get("bold"):
|
||||
style_parts.append("font-weight:800;")
|
||||
if a.get("uppercase"):
|
||||
style_parts.append("text-transform:uppercase;")
|
||||
style_attr = f' style="{" ".join(style_parts)}"' if style_parts else ""
|
||||
|
||||
return (
|
||||
f'<div class="docBadge" data-element-id="{el["id"]}" data-kind="badge"{style_attr}>{icon_html}{content}</div>'
|
||||
)
|
||||
|
||||
|
||||
def _render_carte(el: dict[str, Any], _children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str:
|
||||
|
||||
@@ -50,7 +50,18 @@ regroupement à chaque appel.
|
||||
partir de `data-element-id` + `FORGE_DOCUMENT.slug`, même principe que
|
||||
le reste des appels AJAX de l'éditeur).
|
||||
- **Étiquette** (`badge`) : `<div>` portant `attributes["content"]`
|
||||
échappé — contenu pur, aucun attribut de style.
|
||||
échappé, précédé d'un `<span class="docBadgeIcon">` optionnel si
|
||||
`svg_markup` est non vide (nettoyé par `sanitize_svg_markup`, même
|
||||
mécanisme que le mode SVG de `"image"`). `width` (non vide) ajoute
|
||||
`align-self:flex-start; width:{valeur};` en style inline — fixer une
|
||||
largeur implique TOUJOURS de sortir de l'étirement pleine largeur par
|
||||
défaut d'un enfant flex en colonne (voir static/document/
|
||||
document-editor.css, `.docPageContent`), jamais l'un sans l'autre.
|
||||
`border_radius` (non vide) ajoute `border-radius:{valeur};`. `bold`/
|
||||
`uppercase` ajoutent respectivement `font-weight:800;`/
|
||||
`text-transform:uppercase;` quand `True`. Tous ces attributs sont vides
|
||||
ou `False` par défaut (comportement historique inchangé, aucun style
|
||||
inline ajouté).
|
||||
- **Carte** (`carte`) : `<div>` composé de trois blocs enfants
|
||||
(`label`/`title`/`description`, tous échappés) — contenu pur, aucune
|
||||
couleur/forme choisie ici (voir `element_kind_labels.md`).
|
||||
|
||||
Reference in New Issue
Block a user