diff --git a/MaBibli.Client/Composants/FormulaireLivre.razor b/MaBibli.Client/Composants/FormulaireLivre.razor index a2904cc..49b2b33 100644 --- a/MaBibli.Client/Composants/FormulaireLivre.razor +++ b/MaBibli.Client/Composants/FormulaireLivre.razor @@ -18,6 +18,45 @@ placeholder="Titre du livre" autocomplete="off" /> + @* + ⚠️ L'ORDRE DES CHAMPS EST UNE DÉCISION (lot Q, 2026-08-21), pas une mise en page. + + Type de document, puis thèmes, puis auteurs, puis rôles : c'est l'ordre dans lequel on + regarde un livre qu'on tient en main, et surtout le type COMMANDE LA SUITE de la saisie — + les rôles ne se posent que là. Relégué en bas, il obligeait à descendre tout le formulaire + pour dire « c'est une BD », c'est-à-dire après avoir saisi ce qui en dépend. + + ⚠️ Remonter le champ le rend visible ; le PRÉREMPLIR écrirait quelque chose de faux. Le + défaut reste « non précisé », qui ne prétend rien (décision actée) — c'est aussi ce qui + rend l'étiquette honnête dans les listes : elle ne s'affiche que si un type a été choisi. + *@ +
+ + Type (facultatif) + +
+ @foreach (var type in Types) + { + + } +
+
+ + + @* Un seul champ, plusieurs auteurs : le point-virgule les sépare. La virgule est déjà prise par la forme bibliographique « Zola, Émile », qu'on doit pouvoir taper telle quelle. @@ -63,29 +102,6 @@ } - - - - - - @* Le format n'est plus affiché dans les listes que pour les ebooks : un livre y est donc physique par défaut. Cette valeur DOIT rester présélectionnée ici, sinon on créerait @@ -109,26 +125,17 @@ - @* - ⚠️ Le défaut est « non précisé », PAS « roman » : on ne remplit pas une case à la place - de l'utilisateur. C'est aussi ce qui rend l'étiquette honnête dans les listes — elle ne - s'affiche que lorsqu'un type a été choisi. - *@ -
- - Type (facultatif) - -
- @foreach (var type in Types) - { - - } -
-
+ + +
diff --git a/MaBibli.Client/Layout/MainLayout.razor b/MaBibli.Client/Layout/MainLayout.razor index a702646..a3ce45b 100644 --- a/MaBibli.Client/Layout/MainLayout.razor +++ b/MaBibli.Client/Layout/MainLayout.razor @@ -3,7 +3,6 @@ @inject ServiceLivresApi Api @inject EtatReseau Reseau @inject NavigationManager Navigation -@inject IJSRuntime JS @* Mise en page pensée mobile d'abord : un bandeau, une colonne, rien à gauche. @@ -18,12 +17,18 @@ exotique : sans la moindre feuille de style, il reste une suite de liens lisibles les uns sous les autres, au lieu d'une rangée écrasée. *@ +@* + ⚠️ Bandeau et menu sont dans un MÊME conteneur collant, et ce n'est pas cosmétique : sur PC + la rangée du menu doit rester atteignable au défilement (lot R), et deux éléments collants + superposés obligeraient à écrire en dur la hauteur du bandeau dans le `top` du second. +*@ +
@* Le déplacement entre écrans était jugé « foireux » : d'un écran profond (bibliographie, fiche de tome, ajout d'envie) il fallait deviner quel onglet ramenait en arrière. Un retour explicite, au même endroit sur tous les écrans, répond à la question sans obliger à connaître l'arborescence. *@ - @@ -55,7 +60,7 @@ } - +
+ } + Catalogue Auteurs Séries @@ -77,6 +100,7 @@ Prêts Envies + @if (!Reseau.EnLigne) { @@ -106,6 +130,11 @@ /// Menu déployé (téléphone). Sur PC la rangée est visible en permanence. private bool _menuOuvert; + /// Le calque du menu doit prendre le focus au prochain rendu — sinon pas d'Échap. + private bool _menuAFocaliser; + + private ElementReference _menu; + protected override async Task OnInitializedAsync() { Reseau.Change += SurChangementReseau; @@ -194,19 +223,52 @@ } /// - /// Revient à l'écran précédent, en repliant le menu au passage. + /// Remonte d'un cran dans l'arborescence des écrans, en repliant le menu au passage. /// /// - /// Le retour passe par l'historique du navigateur, pas par une destination calculée : - /// c'est le seul moyen de ramener là d'où l'on vient réellement, un même écran étant - /// atteignable par plusieurs chemins (une fiche livre s'ouvre depuis le catalogue, une - /// bibliographie, une série ou une recherche). Le repli sur le catalogue quand la pile est - /// vide est traité en JavaScript, history.length n'ayant pas d'équivalent côté C#. + /// ⚠️ Renverse la décision du 2026-08-20 (« le retour passe par l'historique du + /// navigateur, jamais par une destination calculée »). L'historique remonte aussi les + /// allers-retours — filtre, ordre, édition — et l'on cliquait cinq fois sans quitter le même + /// écran. La parenté est désormais explicite et testable : voir + /// , qui porte aussi le garde-fou « ne jamais sortir de + /// l'application » que history.length tenait mal dans une PWA standalone. /// - private async Task RetourAsync() + private void Retour() { - _menuOuvert = false; - await JS.InvokeVoidAsync("mabibliRetour"); + FermerMenu(); + Navigation.NavigateTo(RemonteeRoutes.Parent(Navigation.ToBaseRelativePath(Navigation.Uri))); + } + + private void BasculerMenu() + { + _menuOuvert = !_menuOuvert; + + // Le focus n'est demandé qu'à l'ouverture : c'est lui qui rend Échap opérant sur un + // calque, et il n'y a rien à focaliser une fois le menu refermé. + _menuAFocaliser = _menuOuvert; + } + + /// + /// Referme le menu. Posé sur le calque lui-même : un clic hors des liens ferme, et un clic + /// SUR un lien ferme aussi — la navigation qui suit s'en chargerait de toute façon. + /// + private void FermerMenu() => _menuOuvert = false; + + private void SurToucheMenu(KeyboardEventArgs e) + { + if (e.Key is "Escape" or "Esc") + { + FermerMenu(); + } + } + + protected override async Task OnAfterRenderAsync(bool premierRendu) + { + if (_menuAFocaliser) + { + _menuAFocaliser = false; + await _menu.FocusAsync(); + } } public void Dispose() diff --git a/MaBibli.Client/Layout/MainLayout.razor.css b/MaBibli.Client/Layout/MainLayout.razor.css index 98cf50a..829e9ed 100644 --- a/MaBibli.Client/Layout/MainLayout.razor.css +++ b/MaBibli.Client/Layout/MainLayout.razor.css @@ -1,7 +1,6 @@ +/* ⚠️ Ce n'est plus le bandeau qui colle en haut, mais le conteneur `.entete` qui le réunit au + menu (feuille globale, lot R) : les deux doivent rester solidaires au défilement. */ .bandeau { - position: sticky; - top: 0; - z-index: 10; display: flex; align-items: center; gap: 0.5rem; diff --git a/MaBibli.Client/Pages/Revues.razor b/MaBibli.Client/Pages/Revues.razor index 8691b2a..8180339 100644 --- a/MaBibli.Client/Pages/Revues.razor +++ b/MaBibli.Client/Pages/Revues.razor @@ -1,6 +1,7 @@ @page "/revues" @inject ServiceLivresApi Api @inject EtatReseau Reseau +@inject NavigationManager Navigation @implements IDisposable MaBibli — revues @@ -29,8 +30,20 @@ else