# #101 - Forge : Assistant IA partagé + plein écran (Forge & Editer) > **Statut :** 🟢 livré (en attente de vérification utilisateur) > **Version :** 2.8.0 > **Composants :** `frontend/editor-poc.html`, `frontend/js/sync.js`, > `frontend/js/viewer.js`, `frontend/js/utils.js`, `frontend/index.html`, > `frontend/style.css`, `frontend/locales/{fr,en}.json` > **Tests :** `tests/frontend/editor-inline.test.mjs` (+10) ## Contexte L'éditeur **Forge** (`frontend/editor-poc.html`, iframe même origine) embarque son propre mini-panneau « AI Panel » : un chat rudimentaire qui appelait `/api/ai/improve` **sans fournisseur ni modèle** (donc toujours le défaut serveur), sans historique, sans streaming, sans commandes `/` ni contexte `@`. L'éditeur **Editer** (CodeMirror) n'avait aucun bouton plein écran, et Forge non plus. L'utilisateur veut : 1. que le bouton « AI Panel » de Forge affiche **le même contenu** que le panneau **Assistant IA** (fournisseur/modèle, historique, skills `/`, contexte `@`) ; 2. que Forge utilise le **fournisseur et le modèle configurés** dans l'Assistant IA (actions IA, autocomplétion fantôme) ; 3. un bouton **plein écran** dans Forge **et** dans Editer. ## Conception ### 1. Forge ouvre l'Assistant IA existant (pas de duplication) `bookslm.js` est un singleton monté sur le document parent, couplé à `state`, `TabManager`, `AuthManager` et au CSS global : le porter dans l'iframe serait une duplication lourde à maintenir. Forge étant une **iframe même origine**, son bouton AI se contente de demander au parent d'ouvrir l'assistant : | Côté | Mécanisme | |---|---| | Iframe | `openAssistant()` → `parent.postMessage({ type: 'forge-open-ai' }, '*')` (`#btn-ai`, `Ctrl+J`) | | Parent (`sync.js`) | sur `forge-open-ai` : `import('./bookslm.js')` → `openForCurrentContext()` | Le mini-panneau Forge (`#ai-panel`, `sendAIChat`, suggestions) est **supprimé** : le contenu, le fournisseur/modèle, l'historique, les menus `/` et `@` sont ceux de l'assistant, sans double maintenance. ### 2. Fournisseur/modèle partagé Le sélecteur de l'assistant persiste son choix dans `localStorage['obsigate_ai_picker']` (`{provider, model}`), clé **partagée** par l'iframe (même origine). Forge la lit via `aiPickerSelection()` et l'injecte : - dans `aiCall()` (actions IA du menu `/` et de la bulle de sélection) ; - dans la **complétion fantôme** (`/api/ai/inline-complete`) — repli `ollama` si aucun fournisseur n'est sélectionné (comportement local conservé). Les noms d'endpoints erronés sont corrigés au passage : `make-longer` / `make-shorter` (au lieu de `lengthen` / `simplify`) et `target_lang` pour la traduction. ### 3. Plein écran natif - **Forge** : bouton `#btn-fullscreen` dans la barre, `document.documentElement.requestFullscreen()` (l'iframe reçoit `allow="fullscreen"` côté parent, `viewer.js`), icône basculée sur `fullscreenchange`. - **Editer** : bouton `#editor-fullscreen` dans l'en-tête ; plein écran sur le conteneur `#editor-container` (`getEditorContainer()`, fonctionne en mode modale **et** inline), styles `:fullscreen` (`width/height: 100vw/100vh`), icône/label basculés, sortie du plein écran à la fermeture (`closeEditor`) et Échap laissé au navigateur pendant le plein écran. Libellés i18n `editor.fullscreen` / `editor.exit_fullscreen` (FR + EN). ## Fichiers | Fichier | Modification | |---|---| | `frontend/editor-poc.html` | suppression du mini-panneau AI ; `openAssistant()` (postMessage) ; `aiPickerSelection()` injecté dans `aiCall`/complétion fantôme ; `AI_MAP` corrigé ; bouton + logique plein écran | | `frontend/js/sync.js` | routage `forge-open-ai` → `bookslm.openForCurrentContext()` | | `frontend/js/viewer.js` | `allow="fullscreen"` sur `#forge-iframe` | | `frontend/index.html` | bouton `#editor-fullscreen` (titre i18n) | | `frontend/js/utils.js` | `toggleEditorFullscreen` / `updateFullscreenButton` / `isEditorFullscreen` ; sortie du plein écran dans `closeEditor` | | `frontend/style.css` | `.editor-container:fullscreen` | | `frontend/locales/{fr,en}.json` | `editor.fullscreen`, `editor.exit_fullscreen` | ## Tests `tests/frontend/editor-inline.test.mjs` (+10) : suppression du mini-panneau, postMessage `forge-open-ai`, routage `sync.js`, lecture de `obsigate_ai_picker`, endpoints corrigés, complétion fantôme, boutons plein écran (Forge + Editer), `allow="fullscreen"`, CSS `:fullscreen`, clés i18n.