feat(mobile): ruban d'edition style Obsidian + correctifs mobile (#83, BUG-017 a BUG-020)
CI / lint (push) Successful in 1m13s
CI / security (push) Successful in 47s
CI / test (push) Successful in 2m41s
CI / build (push) Successful in 43s
CI / e2e (push) Successful in 11m14s

- #83: ruban horizontal defilable ancre au-dessus du clavier, commandes
  etendues (titres, barre, surligne, code bloc, citation, listes, cases,
  wikilinks, tags, pieces jointes, undo/redo, colle, police) et
  personnalisation persistee via l'icone engrenage
- BUG-017: cartes du tableau de bord compressibles (min-width:0)
- BUG-018: en-tete editeur mobile compact, boutons Annuler/Sauvegarder
  accessibles, barre IA plus tactile
- BUG-019: ancrage du ruban via visualViewport (--kb-offset)
- BUG-020: suppression de la double barre de defilement

Tests: mobile-editor 35/35, ai 50/50, 9 suites JSDOM, validate-imports,
pytest 961 passed / 6 skipped, ruff + mypy 0.
This commit is contained in:
2026-09-13 11:49:45 -04:00
parent 162a5b4acc
commit 520059d866
11 changed files with 841 additions and 126 deletions
+30
View File
@@ -54,6 +54,16 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### Ajouté
- **#83 Barre d'outils d'édition mobile — ruban style Obsidian Android** — la barre de mise en
forme flottante est remplacée par un **ruban horizontal défilable** ancré juste au-dessus du
clavier virtuel : fond anthracite aux coins arrondis, insertion/enrobage au curseur ou sur la
sélection. Commandes : annuler/refaire, `[[ ]]` (lien interne), fichiers/modèles, tag `#`,
pièce jointe, H1–H6, gras, italique, barré (`~~`), surligné (`==`), code en ligne/bloc, citation,
lien externe, listes à puces/numérotées, case à cocher, indenter/désindenter, coller, A−/A+.
Une icône **⚙** ouvre un panneau de personnalisation (ajouter / retirer / réordonner, persistance
`localStorage`). i18n FR/EN. Helpers purs exportés (`formatChange`, `normalizeRibbonCommands`,
`moveRibbonCommand`). Tests JSDOM `tests/frontend/mobile-editor.test.mjs` (+13) et E2E mobile.
- **#82 Assistant IA — menu `@` instantané** — nouvel endpoint `GET /api/vault/{vault}/paths`
(liste plate et plafonnée de l'index des chemins). Le frontend la récupère **une fois par vault**
(préchargée à l'ouverture du panneau) puis filtre **côté client** pendant la frappe : l'affichage
@@ -291,6 +301,26 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
### Corrigé
- **BUG-017 — Accueil mobile : tuiles « Favoris » / « Récents » mal dimensionnées** — les cartes
de tableau de bord débordaient horizontalement à cause d'un titre/chemin `nowrap` : ajout de
`min-width: 0` et `overflow: hidden` sur `.dashboard-card` (et ses en-têtes/pieds) pour que la
grille mobile (1 colonne) respecte la largeur du viewport. Les tuiles « Partagés » étaient déjà
conformes.
- **BUG-018 — Éditeur mobile : boutons « Annuler » / « Sauvegarder » inaccessibles** — l'en-tête
cumulait marque, titre, nom de fichier et actions, poussant les boutons hors écran. Sur mobile,
les éléments secondaires (marque, séparateur, espaceur, présence) sont masqués, les champs
titre/nom de fichier deviennent compressibles (`flex`, `min-width: 0`) et le libellé « Saved »
est masqué (le point d'état reste). La barre d'outils IA reçoit des cibles tactiles plus grandes.
- **BUG-019 — Éditeur mobile : barre d'outils masquée par le clavier** — le ruban est désormais
ancré via `window.visualViewport` (`--kb-offset`) pour rester juste au-dessus du clavier, quel
que soit le défilement, et le scroller CodeMirror reçoit un `padding-bottom` pour ne pas cacher
le curseur.
- **BUG-020 — Éditeur mobile : double barre de défilement** — `.editor-body` passe en
`overflow: hidden` + colonne flex ; seul le scroller CodeMirror défile.
- **BUG-016 — Mobile : le bouton « mode lecture » recouvre le bouton d'envoi de l'assistant** —
le bouton flottant `📖` (`#me-reading-btn`, `z-index: 890`) passait au-dessus du panneau
assistant plein écran sur mobile (`z-index: 100`) et masquait le bouton d'envoi `✈️`. Il