- Catalogage rapide (douchette, code-barres)

- Cataloguer en rafale — nouvel écran /ajout/rafale : on scanne une pile de livres à la suite dans une zone de texte, chaque code est traité (BnF puis OpenLibrary), les doublons connus sont passés automatiquement. La collecte marche même hors-ligne. Le compte rendu liste maintenant les livres créés, en lien vers leur fiche, et reste consultable en revenant sur l'écran même après une rafale entièrement réussie. Le catalogue reconnaît un ISBN dans sa barre de recherche (13 ou 10 chiffres, avec ou sans tirets) : scanner un livre en main ouvre directement sa fiche s'il n'y en a qu'un. Un bouton « Scanner » l'alimente, actif hors-ligne.
- Ajouter un tome à une série accepte aussi un ISBN dans le champ manuel : le catalogue est cherché d'abord (rattachement direct si un seul exemplaire), sinon la BnF prend le relais.
Séries et sagas
- Numéro de tome distinct de la position de lecture : on peut indiquer « c'est le tome 7 » même si on ne possède pas les six premiers ; l'ordre de lecture reste un réglage séparé (utile pour les préquelles).
- Tri par numéro en plus du tri par ordre de lecture quand des tomes en portent un.
- Panneau « Ajouter » regroupé et repliable sur la fiche d'une série (manuellement / en rafale / depuis le catalogue / depuis les envies), au lieu de quatre formulaires ouverts en permanence.
- Filtre catalogue « sans couverture » pour repérer les livres à illustrer.
Le catalogue groupe les tomes d'une même série sous un bloc repliable, avec un décompte plus clair (affichés / possédés / total).
- Corrections directes sur la fiche
- Effacer un prêt saisi par erreur (bouton ✕ sur chaque ligne, avec confirmation), sans passer par « rendre ».
- Corriger une couverture manquante ou cassée en cliquant dessus : le champ d'adresse s'ouvre focalisé, Entrée enregistre. Étendu aux numéros de revue dans la dernière modification.
- Les thèmes déjà utilisés dans la bibliothèque sont proposés à la frappe.
- La recherche d'un livre à rattacher montre des suggestions dès le focus, sans attendre de taper.

- Visuel : un rendu manquant après une écriture asynchrone dans le formulaire de livre, une bascule de rôle cassée, des débordements à 320 px, et le style d'un bouton-lien qui restait souligné.
This commit is contained in:
mathieu
2026-09-09 00:05:26 +02:00
parent bb071c3db9
commit 42dec0dbd1
43 changed files with 4154 additions and 189 deletions
+198 -1
View File
@@ -251,7 +251,15 @@ body {
margin-bottom: 0.5rem;
}
/* ⚠️ Écrit pour des <button> À L'ORIGINE, et un segment peut être un LIEN (« En rafale », qui
mène à l'écran de rafale) : sans les trois lignes de mise en forme ci-dessous, il gardait sa
couleur de lien, son soulignement et son texte collé en haut. Même famille de défaut que les
NavLink du lot H — un style pensé pour une balise, appliqué à une autre. */
.segment {
display: inline-flex;
align-items: center;
justify-content: center;
text-decoration: none;
flex: 1 1 auto;
min-height: 2.5rem;
padding: 0.4rem 0.7rem;
@@ -263,6 +271,11 @@ body {
cursor: pointer;
}
.segment:disabled {
opacity: 0.55;
cursor: default;
}
.segment-actif {
background: var(--mb-accent);
border-color: var(--mb-accent);
@@ -447,7 +460,7 @@ body {
gap: 0.4rem;
min-width: 0;
padding: 0.35rem 0;
color: var(--mb-texte);
color: var(--mb-accent);
text-decoration: none;
font-weight: 600;
}
@@ -634,12 +647,50 @@ body {
border-bottom: 1px solid var(--mb-bord);
}
/* Emprunteur, dates et croix sur UNE ligne : la croix appartient à ce prêt-là. */
.historique-ligne {
display: flex;
align-items: center;
gap: 0.5rem;
}
.historique-qui {
flex: 1 1 auto;
min-width: 0;
}
.historique-dates {
display: block;
color: var(--mb-texte-doux);
font-size: 0.85rem;
}
/* Effacer une ligne de prêt saisie par erreur. Discrète au repos — c'est une correction, pas
un geste courant — mais avec une cible tactile entière : 2,75 rem, comme la croix du calque
des couvertures. */
.bouton-croix {
min-width: 2.25rem;
min-height: 2.25rem;
border: 0;
border-radius: 999px;
background: transparent;
color: var(--mb-texte-doux);
font-size: 0.95rem;
line-height: 1;
cursor: pointer;
}
.bouton-croix:hover:not(:disabled),
.bouton-croix:focus-visible {
background: var(--mb-fond-doux);
color: var(--mb-danger);
}
.bouton-croix:disabled {
opacity: 0.5;
cursor: default;
}
/* Bouton d'action au sein d'une carte : il ne doit pas peser autant qu'un bouton de page,
tout en gardant une cible tactile utilisable. */
.bouton-compact {
@@ -700,6 +751,11 @@ body {
cursor: default;
}
/* Image cassée, ou absente : le clic ne promet plus un agrandissement — il ouvre l'adresse. */
.couverture-declencheur.declencheur-correction {
cursor: pointer;
}
.calque-couverture {
position: fixed;
inset: 0;
@@ -1175,12 +1231,36 @@ body {
align-items: baseline;
justify-content: space-between;
gap: 0.75rem;
flex-wrap: wrap;
}
.entete-page .titre-page {
margin-bottom: 0.5rem;
}
/* Panneau « Ajouter un tome » d'une série : déplié sur place sous l'en-tête, comme les filtres
du catalogue. Encadré, pour qu'on voie où il commence et où il finit. */
.panneau-ajout {
margin-bottom: 1rem;
padding: 0.75rem;
border: 1px solid var(--mb-bord);
border-radius: 8px;
background: var(--mb-fond-doux);
}
.panneau-ajout .titre-section {
margin-top: 0;
}
/* Les deux boutons de l'en-tête du catalogue — régler la liste, et y ajouter. Ils
s'enroulent plutôt que de pousser le titre hors de l'écran à 320 px. */
.entete-page-actions {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
flex: 0 0 auto;
}
/* --- Liste d'envies : ordre choisi --- */
/* Colonne de déplacement à gauche de chaque envie. Les flèches sont larges à dessein :
@@ -1205,6 +1285,18 @@ body {
font-variant-numeric: tabular-nums;
}
/* Le NUMÉRO du tome, à distinguer du rang de lecture — deux natures de valeur qui
partagent la même colonne. Sans ce repère, « 4 » se lit indifféremment « quatrième
à lire » ou « tome 4 », et les deux diffèrent dès qu'une préquelle est en jeu. */
.rang-tome {
color: var(--mb-accent);
font-weight: 600;
background: var(--mb-fond-doux);
border-radius: 0.25rem;
padding: 0.1rem 0.3rem;
white-space: nowrap;
}
/* La carte saisie s'efface pendant le glissé : sans ce repère, on ne sait plus laquelle
on déplace une fois le curseur loin de son point de départ. */
.carte-glissee {
@@ -1737,3 +1829,108 @@ body {
flex: 0 0 auto;
white-space: nowrap;
}
/* Vocabulaire déjà employé, proposé sous un champ de liste (les thèmes). Même aspect que les
segments : ce sont des valeurs qu'on choisit, pas des actions. */
.suggestions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
margin-bottom: 0.5rem;
}
/* ---------------------------------------------------------------------------
Catalogage en rafale (lot AB)
--------------------------------------------------------------------------- */
/* La douchette tape « Entrée » après chaque lecture : dans un textarea, cela fait un saut de
ligne, et la rafale se collecte donc toute seule. Monospace pour que des chiffres alignés
se relisent, et `resize: vertical` parce qu'on ne sait pas d'avance combien de livres. */
.zone-codes {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.9rem;
line-height: 1.5;
resize: vertical;
min-height: 8rem;
}
.case-a-cocher {
display: flex;
align-items: center;
gap: 0.5rem;
margin: 0.75rem 0;
cursor: pointer;
}
/* Barre d'avancement. ⚠️ `role="progressbar"` porte l'information pour les lecteurs d'écran ;
ceci n'en est que la peinture, d'où l'absence de texte à l'intérieur. */
.avancement {
height: 0.5rem;
background: var(--mb-fond-doux);
border-radius: 0.25rem;
overflow: hidden;
margin: 0.75rem 0 0.5rem;
}
.avancement-barre {
height: 100%;
background: var(--mb-accent);
transition: width 0.2s ease;
}
@media (prefers-reduced-motion: reduce) {
.avancement-barre { transition: none; }
}
.bilan {
list-style: none;
padding: 0;
margin: 0.5rem 0 1rem;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.liste-residus {
list-style: none;
padding: 0;
margin: 0.5rem 0 1rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.carte-residu {
border: 1px solid var(--mb-bord);
border-radius: 0.4rem;
padding: 0.75rem;
display: flex;
flex-direction: column;
gap: 0.4rem;
}
/* ⚠️ `min-width: 0` sur l'enfant élastique — la leçon du lot M, qui se repose à chaque étage
d'une cascade de flex : sans lui, un ISBN à tirets pousse l'étiquette hors d'un écran de
320 px, et c'est toute la page qui défile. */
.residu-tete {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
flex-wrap: wrap;
}
.residu-tete .code-isbn {
min-width: 0;
}
.encart-reprise {
border: 1px solid var(--mb-bord);
border-left: 3px solid var(--mb-accent);
border-radius: 0.4rem;
padding: 0.85rem 1rem;
margin-bottom: 1rem;
display: flex;
flex-direction: column;
gap: 0.6rem;
}