5.3 KiB
5.3 KiB
#91 — Assistant IA — Zone de discussion façon Notion : post ancré en haut, fournisseur/modèle discret & barre d'actions
Statut : ✅ Livré Effort : 0,5-1 jour | Impact : 🟡 Références : Roadmap · BooksLM #76 · Assistant UX #80 · Changelog
- Description : Refonte de la présentation de la fenêtre de résultats de
l'assistant IA (
frontend/js/bookslm.js,frontend/style.css) sur le modèle de l'assistant Notion :- Ancrage en haut : après l'envoi, le post de l'utilisateur est amené tout en
haut de la zone visible (
scrollIntoView({ block: 'start' })+scroll-margin-top) ; la réponse se diffuse en dessous, lisible sans défilement. Plus de scroll-into-bottom ni d'astuceorder: -1. - Fil Notion-style : messages en ordre chronologique ; post utilisateur =
bulle arrondie alignée à droite (max 80 %) ; réponse assistant = texte pleine
largeur sans bulle de fond ; les appels d'outils du mode agent se replient
dans un bloc discret « N étapes » (
<details>). - Fournisseur & modèle discrets : libellé au-dessus de chaque réponse,
issu du SSE réel du backend (
provider/model). - Barre d'actions au survol : sous chaque bloc non vide, « Copier » (utilisateur et assistant) ; sous une réponse, « Ajouter » qui insère le texte dans le document ouvert dans l'éditeur Forge (aucun bouton factice).
- Ancrage en haut : après l'envoi, le post de l'utilisateur est amené tout en
haut de la zone visible (
A. Positionnement automatique (ancre en haut) — ✅ livré
- A1.
_renderMessages({ anchor: true })appelé à l'envoi du message, à l'ouverture d'un contexte, au rechargement d'une session et à la reprise après confirmation agent : cible = dernier.bookslm-msg.user,scrollIntoViewfluideblock: 'start', repli calculscrollTop += deltasi indisponible. - A2. Re-rendus de streaming : la position de scroll est préservée
(plus de
scrollTop = scrollHeight) — la réponse s'allonge sous la question sans jamais déplacer la vue. - A3. Marge supérieure :
scroll-margin-top: 14pxsur.bookslm-msgpour que le post ne colle pas au bord. - 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).
B. Fil chronologique Notion-style — ✅ livré
- B1. Ordre naturel (user puis assistant, empilés,
gap: 24px). - B2. Utilisateur : bulle
--surface2alignée à droite,max-width: 80%, coins arrondis 18px. - B3. Assistant :
width: 100%, pas de fond ni de padding de bulle — le markdown occupe toute la largeur (titres, listes, code, sources inchangés). - B4. Mode agent :
_renderToolActivity()→<details class="bookslm-tool-trace">avec<summary>« N étapes » (i18nai.steps_count) ; les lignes d'outils restent accessibles en déroulant le bloc.
C. Fournisseur & modèle discrets — ✅ livré
- C1.
_streamResponse()capturedata.provider/data.modeldu flux SSE (déjà émis par/chatet/agent) sur le message assistant. - C2.
.bookslm-msg-metaau-dessus du bloc assistant : « fournisseur · modèle » (persisté avec la session, visible au rechargement).
D. Barre d'actions — ✅ livré
- D1.
_appendActionBar()sous chaque bloc non vide : bouton Copier pour les deux rôles ; bouton Ajouter pour l'assistant uniquement. - D2. Copier : texte brut du message (
navigator.clipboard, repliexecCommand) + toastbookslm.copied. - D3. Ajouter (
_insertIntoEditor) : insertion du texte à la position de fin de sélection dansstate.editorView(Forge) ; toastbookslm.insertedoubookslm.insert_no_editorsi aucun éditeur ouvert. - D4. Révélation au survol / focus clavier (
.bookslm-msg:hover,:focus-within) — icônes Lucidecopy/corner-down-left.
E. Tests & documentation — ✅ livré
- E1.
tests/frontend/ai.test.mjs: ordre chronologique, ancragescrollIntoView block:start, tag provider/modèle, barre d'actions par rôle, copie du texte brut, insertion éditeur (mockstate.editorView), bloc repliable des étapes, absence de barre pour contenu vide. - E2. i18n FR/EN :
bookslm.copied,bookslm.insert,bookslm.insert_hint,bookslm.inserted,bookslm.insert_no_editor,ai.steps_count. - E3. CHANGELOG + Roadmap ;
SW_VERSIONbump (cache bust).
F. Points d'attention
- Le tag fournisseur provient du backend réel (SSE), donc correct même avec la sélection « par défaut » du fournisseur.
- Le streaming appelle
_renderMessages()à chaque chunk : l'ancre est posée une seule fois à l'envoi, les re-rendus préservent ensuite le scroll — pas de sauts. - L'ancien épinglage flex
order: -1(première itération de #91) est remplacé : l'ordre est redevenu chronologique, l'ancrage est fait par défilement explicite. - Les pouces haut/bas Notion ne sont pas repris : aucun signal n'existe côté backend ; « Ajouter » (insertion éditeur réelle) les remplace utilement.