Replie les blocs de série au catalogue, cycle par cycle

Le catalogue ne rangeait un livre que sous sa série directe : il n'y avait
qu'un seul niveau, donc rien à replier « à chaque niveau ». Le regroupement
devient un arbre — un cycle coiffe ses séries, comme sur /series — et chaque
nœud porte sa bascule.

Tout reste déplié par défaut ; un bloc replié annonce ce qu'il contient, et
l'état de repli appartient à l'écran, sans quoi une frappe dans la recherche
le perdrait.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-22 01:34:04 +02:00
co-authored by Claude Opus 5
parent 7d2f3dc5d9
commit e85867014c
6 changed files with 411 additions and 48 deletions
+44
View File
@@ -3320,6 +3320,50 @@ n'apparaît qu'une fois et toujours sous la même, la liste plate sans séries,
tome, et le filtre qui ne se laisse pas défaire. C'est le même parti que `FiltreLivresLocal` :
ce qui tient une règle sort du balisage.
### Les blocs se replient, et un cycle replie chacun de ses niveaux (2026-08-22)
Demandé dans la foulée : « pouvoir réduire les groupes et ne garder que le nom de la série ; si
plusieurs niveaux, permettre de réduire chaque niveau ».
⚠️ **Le catalogue ne connaissait qu'un seul niveau** : le regroupement rangeait chaque livre sous
sa série *directe*, sans jamais remonter au cycle. Il n'y avait donc pas de « chaque niveau » à
replier — c'est le regroupement lui-même qui a dû devenir un arbre, `EntreeCatalogue` portant
désormais des `SousEntrees`. Un cycle se lit maintenant au catalogue comme sur `/series`.
| Décision | Pourquoi |
|---|---|
| **Tout est déplié par défaut**, on replie ce dont on ne veut pas | Règle déjà tenue par l'arbre des séries. L'inverse obligerait à ouvrir chaque bloc pour retrouver un livre qu'on voyait très bien avant |
| Le bloc **replié annonce toujours son compte** (« 3 tomes ») | Sans lui, le compteur du haut (« 6 livres ») paraîtrait mentir |
| L'état de repli vit dans l'**écran**, pas dans les blocs | Le catalogue se relit **à chaque frappe** dans la recherche : un état porté par les composants se perdrait à chaque caractère. Vérifié — le repli survit à une recherche et à son effacement |
| Non persistant d'une visite à l'autre | Confort de lecture, pas propriété de la série — même règle que `/series` |
| Le cycle se place à la place du **premier tome de sa descendance** | Prolongement exact de la règle de placement déjà actée : l'ordre général du catalogue ne bouge pas |
| Les sous-séries suivent leur **ordre de lecture** (`Serie.Position`), les tomes le leur | Deux écrans ne doivent pas donner deux ordres |
⚠️ **Seuls les niveaux qui portent quelque chose existent.** Un cycle de cinq séries dont une
seule a un tome au catalogue ne produit pas quatre nœuds vides : on ne crée que la chaîne qui
mène aux livres présents. Un niveau vide serait une indentation qui ne se replierait sur rien —
et le titre d'une série dont on ne possède rien.
⚠️ La remontée de parenté est **bornée par le nombre de séries**, comme celle du serveur : une
boucle résiduelle en base ferait sinon tourner le regroupement sans fin. Mieux vaut un bloc rangé
un cran trop haut qu'un catalogue qui ne s'affiche plus. Un test le verrouille.
⚠️ **La bascule est un `<button>` À CÔTÉ du lien, jamais dedans** : un bouton imbriqué dans un
`<a>` n'est pas du HTML valide, et le clic partirait vers la série au lieu de replier. Le nom
reste un vrai lien vers `/series/{id}`.
⚠️ **`aria-expanded="@Deplie"` ne fait pas ce qu'on croit** : Blazor traite un booléen comme un
attribut de *présence* et rend `aria-expanded=""`, que les lecteurs d'écran ne savent pas lire.
L'état doit être écrit en toutes lettres (`@(Deplie ? "true" : "false")`). Constaté ici, mesuré
dans le navigateur — **le même défaut subsiste ailleurs** (`ArbreSerie`, le bouton « Filtrer » du
catalogue), non corrigé faute d'être dans la demande.
**Vérifié en exécution** (375 px puis 320 px) : le cycle *La Légende de Drizzt* coiffe ses deux
sous-séries, chaque niveau se replie et se déplie indépendamment, l'état d'un sous-niveau survit
au repli de son cycle, le compteur reste « 6 livres » dans tous les cas, le repli survit à une
recherche (« salvatore ») et à son effacement, le nom mène toujours à `/series/6`, aucun
débordement horizontal (`scrollWidth` = 320) et aucune erreur de console. 627 tests au vert.
**Vérifié en exécution** (320 px puis 1280 px, base de développement garnie de trois tomes et
d'un livre hors série) : blocs « L'Elfe noir » (2 tomes, dans l'ordre de **lecture** — l'inverse
de l'alphabet) et « La Trilogie des Elfes noirs » (1 tome) posés à la place de leur premier tome,