# document_engine/rendering/ Rendu HTML du document — point d'entrée unique utilisé à la fois par le canevas d'édition et par le Mode Aperçu (même fonction, voir `docs/plan/PLAN.md` — "Aperçu réel"). ## `render_document(elements: list[dict[str, Any]]) -> str` Assemble le document entier à partir de la liste à plat renvoyée par `document_engine.list_document_elements` : regroupe les éléments par `parent_id`, puis rend récursivement les éléments top-niveau dans l'ordre (une rangée rend elle-même ses propres enfants côte à côte). - **Retour** : le HTML complet du document. - **Exceptions** : aucune. ## `render_document_element(el: dict[str, Any], children_by_parent: dict[int | None, list[dict[str, Any]]]) -> str` HTML d'un seul élément — dispatch par dict (table `_RENDERERS`) selon `el["kind"]`, plutôt qu'un enchaînement de `if` (mirroir de l'esprit de `game_engine/scenes/render_scene_object.py`). `children_by_parent` est le regroupement précalculé par `render_document`, transmis pour que les rangées puissent rendre récursivement leurs enfants sans refaire le regroupement à chaque appel. - **Retour** : le HTML de cet élément (et de ses enfants s'il s'agit d'une rangée). - **Exceptions** : aucune ; un `kind` inconnu produit un bloc `docUnknown` visible plutôt qu'une levée d'exception. ### Détail des rendus par catégorie (fonctions privées, table de dispatch) - **Rangée** (`row`) : conteneur flex (`gap`/`align-items`/ `justify-content` réels depuis `attributes`), enfants rendus récursivement. - **Formes** (`rectangle`/`cercle`/`triangle`/`trait`) : `
` positionné en absolu (`x`/`y`/`width`/`height`/`rotation`/`z_index` réels) contenant un SVG (`rect`/`circle`/`polygon`/`line` selon le type). - **Texte** (`titre`/`paragraphe`) : `
` stylé selon `style` (préréglage taille/graisse/interligne) et `bold`/`italic`/`underline`/`align`/`color`. - **Image** : ``, ou un bloc placeholder si `src` est vide. - **Bouton** : `