fix(assistant): #91 question positionnee au bord haut de la fenetre (padding dynamique, overflow-anchor, passe de correction)
CI / lint (push) Successful in 1m27s
CI / security (push) Successful in 1m0s
CI / test (push) Successful in 3m23s
CI / build (push) Successful in 51s
CI / e2e (push) Successful in 10m56s

This commit is contained in:
2026-09-15 20:29:01 -04:00
parent 1ed0d52619
commit daf9ff3b2d
6 changed files with 130 additions and 24 deletions
+19 -7
View File
@@ -27,13 +27,25 @@
confirmation agent : cible = dernier `.bookslm-msg.user`, `scrollIntoView`
`block: 'start'` (instantané à l'envoi, fluide à l'ouverture d'une session),
repli calcul `scrollTop += delta` si indisponible.
- [x] **A2.** Re-rendus de streaming : tant que la réponse arrive (`_isLoading`) et
que l'utilisateur n'a pas touché à la molette (flag `_pinnedTurn`, libéré sur
`wheel`/`touchmove`), chaque frame re-ancre instantanément la question en haut —
la réponse s'allonge sous la question sans jamais déplacer la vue. Hors
streaming, la position de scroll est préservée (plus de `scrollTop = scrollHeight`).
- [x] **A3.** Marge supérieure : `scroll-margin-top: 14px` sur `.bookslm-msg`
pour que le post ne colle pas au bord.
- [x] **A2.** Re-rendus de streaming : tant que l'ancre est active (flag
`_pinnedTurn` posé à l'envoi, libéré sur `wheel`/`touchmove`/`mousedown`), chaque
re-rendu — frames de streaming **et** rendu final — ré-ancre instantanément la
question en haut ; la réponse s'allonge sous la question sans jamais déplacer la
vue. Hors épinglage, la position de scroll est préservée (plus de
`scrollTop = scrollHeight`).
- [x] **A3.** Question **au bord** : plus de `scroll-margin-top` (le moindre écart
laissait visible la fin de la réponse précédente au-dessus du post) ; le post
s'aligne exactement sur le haut de la zone de défilement.
- [x] **A3bis.** **Remplissage dynamique** : une réponse courte ne remplit pas la
fenêtre — le navigateur bloquait alors le défilement et la question restait à
mi-hauteur. Le `padding-bottom` du fil est augmenté de la place manquante
(`target - max`) tant que l'ancre est active, puis retiré au dé-épinglage ; si
le fil tient entièrement dans la fenêtre, aucun remplissage n'est ajouté.
- [x] **A3ter.** **Anti-dérive** : `overflow-anchor: none` sur `.bookslm-messages`
(Chrome ré-ancrait le défilement à chaque reconstruction du fil — un token =
un re-rendu — laissant un décalage constant de ~33 px) et passe de correction
après `scrollIntoView` : la géométrie mesurée (`getBoundingClientRect`) fait foi,
pas la demande de défilement. Vérifié en live : 5 questions, 0 décalage.
- [x] **A4.** Seule la zone du fil défile : `.bookslm-messages { flex: 1; overflow-y: auto }`
(en-tête, toolbar, statut et barre de saisie fixes — structure déjà en place).