"""Catalogue des types d'éléments du support de formation (voir docs/plan/PLAN.md §1.2/§3.2) — bibliothèque groupée par catégorie visuelle (panneau gauche de l'éditeur), libellés d'affichage, et attributs par défaut posés à la création de chaque type.""" from typing import Any from .association_config import DEFAULT_ASSOCIATION_CONFIG from .memory_config import DEFAULT_MEMORY_CONFIG from .mots_config import DEFAULT_MOTS_CONFIG from .quiz_config import DEFAULT_QUIZ_CONFIG from .scenario_config import DEFAULT_SCENARIO_CONFIG CONTENT_KINDS = ("titre", "paragraphe", "image", "bouton", "liste_puces", "liste_numerotee") MINIGAME_KINDS = ("quiz", "association", "memory", "mots", "scenario", "zones") # "row" n'apparaît jamais dans la bibliothèque (créé implicitement par le # moteur de layout au dépôt d'un élément à côté d'un autre) — absent de # ELEMENT_LIBRARY, présent dans ELEMENT_KIND_LABELS pour l'affichage/debug. ELEMENT_LIBRARY: dict[str, dict[str, Any]] = { "contenu": {"label": "Contenu", "kinds": list(CONTENT_KINDS)}, "minigames": {"label": "Mini-jeux", "kinds": list(MINIGAME_KINDS)}, } ELEMENT_KIND_LABELS: dict[str, str] = { "row": "Rangée", "titre": "Titre", "paragraphe": "Paragraphe", "image": "Image", "bouton": "Bouton", "liste_puces": "Liste à puces", "liste_numerotee": "Liste numérotée", "quiz": "Quiz", "association": "Association", "memory": "Memory", "mots": "Mots mêlés", "scenario": "Scénario", "zones": "Zones à risque", } _TEXT_DEFAULTS = { "bold": False, "italic": False, "underline": False, "align": "left", "color": "var(--forge-text)", } def element_default_attributes(kind: str) -> dict[str, Any]: """Attributs posés à la création d'un élément de ce type — cf. docs/plan/PLAN.md §3.3/§3.4/§3.5 pour la liste des propriétés éditables par panneau, ici juste leur valeur de départ.""" if kind == "titre": return {"content": "Nouveau titre", "style": "titre1", **_TEXT_DEFAULTS} if kind == "paragraphe": return {"content": "Nouveau paragraphe de texte.", "style": "paragraphe", **_TEXT_DEFAULTS} if kind == "image": return {"src": "", "alt": ""} if kind == "bouton": return {"label": "Bouton", "target": ""} if kind in ("liste_puces", "liste_numerotee"): # Une seule et même structure d'attributs pour les deux kinds — # "ordonnée ou non" se lit directement sur le kind au moment du # rendu (voir render_document_element._render_list), jamais un # attribut "ordered" redondant à tenir synchronisé avec le kind. return {"items": ["Premier élément", "Deuxième élément"]} if kind == "row": return {"gap": 16, "align": "stretch", "justify": "flex-start"} if kind == "quiz": # Copie de "questions" (liste, jamais un simple dict(...) qui la # partagerait par référence avec DEFAULT_QUIZ_CONFIG) : aucun appelant # ne la mute en place aujourd'hui, mais la copier ici coûte rien et # évite d'ancrer cette hypothèse fragile pour la suite. return {**DEFAULT_QUIZ_CONFIG, "questions": list(DEFAULT_QUIZ_CONFIG["questions"])} if kind == "association": # Même raison de copie que "quiz" ci-dessus (voir association_config.py). return {**DEFAULT_ASSOCIATION_CONFIG, "pairs": list(DEFAULT_ASSOCIATION_CONFIG["pairs"])} if kind == "memory": # Même raison de copie que "quiz"/"association" ci-dessus (voir memory_config.py). return {**DEFAULT_MEMORY_CONFIG, "cards": list(DEFAULT_MEMORY_CONFIG["cards"])} if kind == "mots": # Même raison de copie que "quiz"/"association"/"memory" ci-dessus (voir mots_config.py). return {**DEFAULT_MOTS_CONFIG, "words": list(DEFAULT_MOTS_CONFIG["words"])} if kind == "scenario": # Même raison de copie que ci-dessus (voir scenario_config.py). return {**DEFAULT_SCENARIO_CONFIG, "scenarios": list(DEFAULT_SCENARIO_CONFIG["scenarios"])} if kind in MINIGAME_KINDS: # Panneau Propriétés minimal (voir PLAN.md §3.5, dernier # paragraphe : "état par défaut en attendant sa spécification") — # décision actée : cœur complet + mini-jeux en emplacement # réservé (mots/scenario/zones), formulaires de contenu dédiés = # chantier séparé. return {"theme_color": "#ff5f2e"} return {}