{# Carte d'un module Scormia (bibliothèque) — même langage visuel que les cartes de cours du dashboard Moodia (pill de type, titre 2 lignes, stats inline, rangée méta, footer daté), avec les données Scormia : parties/écrans, quiz, score de réussite, accent du module. Requiert : module. #} {# Stats dérivées des écrans et blocs du module. #} {% set ecrans = module.screens|length %} {% set parties = module.screens|filter(s => s.nodeType == 'chapter')|length %} {% set quiz = module.screens|reduce((c, s) => c + (s.blocks|filter(b => b.type == 'quiz')|length), 0) %} {# Couleur identité de l'outil Scormia (indigo) — pour la conso tokens ; indépendante de l'accent du module (var(--acc)) qui, lui, peut varier par thème. #} {% set scormiaColor = (tool_color_details['scormia'] ?? {}).primary ?? '#1E40AF' %} {# Métriques de la rangée de tags en tête de carte (type + « Partagé »). Ces deux tags sont une PAIRE : ils doivent partager leurs métriques littéralement et ne se distinguer que par la couleur. D'où une seule chaîne, utilisée par les deux — les recopier serait se condamner à les voir diverger au prochain ajustement, ce qui est exactement ce qui était arrivé. Et non l'atome badge : sa table de tailles (h-6 px-2.5 text-xs font-medium) est calibrée pour d'autres contextes, et il n'expose ni casse ni interlettrage. Lui passer ces métriques en `class` reviendrait à parier sur l'ordre des utilitaires Tailwind dans la feuille compilée pour trancher les conflits. Retoucher l'atome est exclu : il sert partout dans l'application. (Motif déjà employé dans templates/slidia/index.html.twig : triggerBase, optBase.) #} {% set cardTagBase = 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-[11px] font-semibold uppercase tracking-wide' %} {# Le dataset de partage est porté par la RACINE de carte, comme côté Slidia (_presentation_card.html.twig) : shared--share-link#writeBack y écrit les trois valeurs après chaque succès serveur, et y LIT l'état d'avant écriture pour dire aux listes si le partage a réellement changé. Sans rendu initial, cette lecture vaut `undefined` au premier passage — la première révocation après chargement de page passerait alors pour un non-changement, laissant une carte fantôme sous l'onglet « Partagés » et un compteur faux. Les trois attributs vont ensemble : n'en poser qu'un laisserait le dataset à moitié initialisé et le même piège au suivant. #}
{{ parties }} partie{{ parties > 1 ? 's' }} · {{ ecrans }} écran{{ ecrans > 1 ? 's' }}
{# Metadata row #}