# Slidia v2 — Étape 3 : la refonte visuelle

**Date :** 2026-08-01
**Branche :** `slidia_v2`
**Dépend de :** les étapes 1, 2a et 2b, livrées
**Statut :** design à valider

---

## 1. Ce que le propriétaire a demandé

C'est la demande d'origine du chantier, formulée avant tout le reste :

> Je veux réussir à uniformiser les designs et les fonctionnements entre Slidia, Moodia et Scormia. Actuellement Scormia et Moodia sont bien designés, cependant pour Slidia il est trop différent du reste. […] Je cherche une uniformisation du design pour que les utilisateurs ne soient pas perdus.

Avec des consignes précises :

- **Scormia : on ne touche à rien.** C'est la référence.
- **Moodia : on ajoute la barre de recherche**, comme Scormia.
- **Slidia :** on garde la recherche, on ajoute un filtre par masque, on retire les catégories et la bascule grille/liste, et on refond l'accueil pour le simplifier.
- Un endroit pour gérer les masques, puisque les deux autres outils n'en ont pas.
- Un écran de création à trois choix, identique en structure à celui de Moodia et Scormia, aux couleurs de Slidia.
- Des **composants partagés**, pour que les filtres soient « plus ou moins similaires selon l'outil » — chacun ayant ses besoins.

Les cinq composants ont été livrés à l'étape 1. **Aucun n'a encore de consommateur en production.** Cette étape est celle qui les met au travail.

---

## 2. Portée

### Dans la portée

- Refonte de l'accueil Slidia : suppression du hero, des tuiles d'actions rapides, des catégories, de l'épinglage et de la bascule grille/liste ; adoption des composants partagés ; passage en filtrage et pagination serveur.
- Page `/slidia/new` à trois choix, puis `/slidia/configure/{method}` qui remplace le wizard.
- Barre de recherche pour Moodia.
- Adoption des cinq composants partagés par Slidia et Moodia.
- Suppression du code devenu mort côté Slidia.
- Les deux reports de l'étape 2b : la discontinuité du nombre de slides visé, et le brief ignoré en présence d'un document.

### Hors portée

- **Scormia n'est pas modifié.** Ni son contrôleur, ni son repository, ni ses templates, ni ses contrôleurs Stimulus.
- L'éditeur de présentation, le mode présentateur et l'export PPTX.
- Le partage public : ses routes, sa modale et son contrôleur Stimulus restent tels quels. Voir §7, le contrat qu'il impose.

---

## 3. L'accueil Slidia

### Ce qui disparaît

| Élément | Pourquoi |
|---|---|
| Le hero « magazine » (93 lignes) | Ni Moodia ni Scormia n'en ont. C'est la principale source de dépaysement. |
| Les trois tuiles d'actions rapides | Le bouton « Créer » de l'en-tête et le bouton « Mes masques » suffisent. |
| Les catégories | Décision du propriétaire : entité, table, API et interface supprimées. |
| L'épinglage | Décision du propriétaire. Ni Moodia ni Scormia ne l'ont, et il rend la pagination incohérente. |
| La bascule grille / liste | Décision du propriétaire. Une seule présentation : la grille, comme les deux autres outils. |
| Les statistiques calculées en Twig | Elles bouclent sur la collection complète, ce qui interdit la pagination. |

### Ce qui arrive

La page adopte la structure exacte de Scormia, en trois blocs :

1. **`tool-header`** — pastille produit, titre, description, coût médian en tokens, et deux boutons : « Mes masques » en secondaire, « Créer une présentation » en principal. C'est le bloc `actions` du composant qui permet ces deux boutons.
2. **`tool-toolbar`** — onglets de filtre à gauche, recherche à droite. Le bloc `leading` accueille en plus le filtre par masque, qui est la spécificité de Slidia. C'est précisément l'usage pour lequel les deux zones du composant sont indépendantes.
3. **La grille** — `grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6 lg:gap-8`, la même que les deux autres outils, puis la pagination `variant: 'moodia'` et le message « aucun résultat » quand une recherche ne donne rien.

### Les filtres

Trois mécanismes, tous **côté serveur** :

- **Onglets** : « Toutes » et « Partagées ». Le second vient du travail de partage public, déjà en place côté Scormia — Slidia s'aligne.
- **Filtre par masque** : une liste déroulante dans le bloc `leading`, à côté des onglets. Trois familles d'entrées : tous les masques, un par masque de l'utilisateur, et « Sans masque ».
- **Recherche** : la molécule `search-input`, pilotée par le contrôleur Stimulus partagé `shared--library-search`.

**Ce point est structurant.** Slidia filtre aujourd'hui à 100 % côté client : le serveur rend toutes les présentations, le JavaScript masque et affiche. Moodia et Scormia filtrent côté serveur. Conserver deux sémantiques sur la même barre serait exactement le dépaysement que cette étape combat. Slidia bascule donc en serveur, avec la pagination SQL déjà livrée à l'étape 1 et jamais branchée.

Comme chez Scormia, les compteurs d'onglets restent absolus — indépendants de la recherche en cours. Un compteur qui suivrait la recherche afficherait « Toutes 0 » sur une recherche infructueuse, ce qui déroute.

### La carte

Slidia adopte `entity-card`, la coque partagée. Cela implique deux abandons :

- **Le thumbnail décoratif** — la pile de trois slides factices — disparaît. Ni Moodia ni Scormia n'ont de vignette, et les maquettes de référence n'en montrent pas.
- **Les variantes du mode liste** (neuf blocs `[.sd-list_&]:`) disparaissent avec la bascule.

Ce que la carte conserve : le titre, le nombre de slides et la date, la puce du masque, la consommation en tokens et en énergie, le menu contextuel, et **le tag « Partagé »** apporté par le travail de partage.

---

## 4. La création en trois choix

`/slidia/new` rend `choice-page` avec trois cartes :

| Carte | Description | Cible |
|---|---|---|
| Importer un document | Slidia analyse votre PDF et en tire la structure | `/slidia/configure/pdf` |
| Générer avec l'IA | Décrivez votre sujet, Slidia compose la présentation | `/slidia/configure/prompt` |
| Rédiger manuellement | Construisez slide par slide, sans assistance | Création directe, 0 token |

C'est le pattern de Scormia — trois liens vers une page dédiée — plutôt que celui de Moodia, qui bascule entre trois vues d'une même page. Plus simple, et déjà éprouvé.

### L'écran de configuration

`/slidia/configure/{method}` remplace le wizard en trois étapes et l'interface provisoire greffée à l'étape 2b. Il porte, sur un seul écran :

- le titre de la présentation ;
- le choix du masque ;
- selon la méthode, le dépôt du document ou la saisie du brief ;
- le bandeau de structure détectée avec son interrupteur, quand il y a lieu ;
- le profil de génération, **« Standard » ou « Approfondi »**, exposé pour la première fois — le champ existe en base depuis l'étape 2a et n'a jamais eu d'interface.

Le mode « Rédiger manuellement » ne passe pas par cet écran : il crée une présentation vide et ouvre l'éditeur, sans consommer de tokens.

### Le contrat à ne pas rompre

L'interface provisoire poste `sourceHash` et `fidelityMode` vers `app_slidia_create_submit`, et appelle `POST /api/slidia/document` qui renvoie `{hash, sectionCount, charCount, hasStructure}`. Le nouvel écran doit honorer le même contrat — c'est du back livré et testé.

---

## 5. La gestion des masques

Le propriétaire a choisi la modale, simplifiée. Elle reste donc ouverte depuis un bouton secondaire de l'en-tête, mais réécrite avec les composants partagés.

La modale actuelle occupe 196 lignes de Twig et environ 46 % du contrôleur Stimulus de la page. La refonte doit la ramener à l'essentiel : liste des masques, aperçu, import, renommage, suppression, exclusion de mises en page. Ce qui relève de la mise en scène — l'aperçu « livret », les onglets mobiles, la bande de navigation — est à réévaluer au regard de son coût.

---

## 6. Moodia et le report de l'étape 2b

**La recherche Moodia** est le plus petit morceau de cette étape : le contrôleur est prêt depuis l'étape 1 — il lit `?q=`, pagine en SQL et transmet déjà `search` au template avec un commentaire annonçant cette étape. Il ne manque que le markup, et trois précautions :

1. propager le paramètre de recherche sur les liens d'onglets **et** sur la pagination, sans quoi un clic perd la recherche ;
2. ajouter un message « aucun résultat », qui n'existe pas côté Moodia ;
3. utiliser le contrôleur Stimulus partagé plutôt que celui de Scormia.

**Les deux reports de l'étape 2b**, qui touchent exactement les surfaces refondues ici :

- **La discontinuité du nombre de slides.** Un document de 49 000 caractères vise 60 slides ; un de 60 000, dix à vingt — parce que le plan reçoit le texte intégral dans un cas et le sommaire dans l'autre, et que le nombre visé se calcule sur ce qu'il reçoit. Le plus gros document donne la plus courte présentation. Le nombre visé doit se calculer sur le volume réel du document, transmis explicitement.
- **Le brief ignoré en présence d'un document.** Aujourd'hui l'interface présente les deux champs sans rien dire, et le brief est silencieusement écarté. Le nouvel écran de configuration doit trancher : soit le brief devient une consigne de cadrage transmise en plus des sections, soit le champ est visiblement désactivé dès qu'un document est déposé.

---

## 7. Le contrat du partage public — à ne rompre sous aucun prétexte

Le travail de partage public a été fusionné deux fois dans cette branche. Il impose six points de contrat DOM que la refonte peut casser **en silence** :

1. la classe `sdl-pres-card` sur le conteneur de carte ;
2. les attributs `data-uuid`, `data-shared`, `data-share-download`, `data-share-url` ;
3. l'élément du tag « Partagé » **toujours rendu**, masqué par style en ligne — le rendre conditionnellement en Twig casserait l'activation à chaud ;
4. la recopie du jeu de données dans l'ouverture du menu contextuel, volontairement en attributs bruts et non en paramètres Stimulus ;
5. la réinitialisation du partage lors d'une duplication ;
6. l'unicité de la modale de partage sur la page.

La raison de fond : le bouton « Partager » vit dans un menu contextuel global, jamais descendant d'une carte. Le contrôleur de partage retrouve donc la carte par un sélecteur global sur la classe et l'identifiant.

**Un degré de liberté** : la modale est résolue par sélecteur global, elle peut donc être déplacée hors du contrôleur de liste sans rien casser.

---

## 8. Le nettoyage

La refonte supprime beaucoup. Ce qui doit partir :

- **Les catégories** : entité, repository, relation, trois routes d'API, modale, filtre — et une migration qui supprime la table.
- **L'épinglage** : champ, route de bascule, sections, entrée de menu — même migration.
- **La bascule grille / liste** : les deux actions, le stockage local, les neuf variantes de la carte, les classes CSS associées.
- **Le code déjà mort**, identifié lors du relevé : l'action `setFilter` et le target `filterChip`, les targets `colorPreviewBtn`, `librarySelectedLabel`, `uploadIcon`, `libraryTitleInput`, et l'action `nextFromStep2Skip` du wizard.
- **Le wizard** et ses trois greffes provisoires, remplacés par l'écran de configuration.

Le contrôleur Stimulus de la liste fait aujourd'hui 1 594 lignes. Après retrait des catégories, de la bascule, de l'épinglage et du filtrage client, il devrait tomber sous les 800.

---

## 9. Ce qui doit rester vrai à la fin

- **Scormia n'a pas changé d'un octet.**
- Le format persisté de `slidesData` est inchangé, et les présentations existantes s'ouvrent normalement.
- Le partage public fonctionne : activation, révocation, tag à chaud, duplication.
- Les trois outils présentent le même en-tête, la même barre, la même grille et la même pagination — aux couleurs de chacun.
- Slidia filtre et pagine côté serveur, comme ses voisins.
- Aucune régression sur les 2 261 tests unitaires et 534 tests fonctionnels.
