fix: sélection multi-blocs fonctionnelle (Ctrl+C/X, drag souris, clic droit) + identité visuelle (v7.69.0)
Trois bugs d'éditeur, chacun avec sa cause racine prouvée par trace
d'événements — le mécanisme Clipboard livré en v7.68 était inutilisable.
1) Ctrl+C / Ctrl+X multi-blocs ne faisaient RIEN.
Cause : le navigateur ne sait pas sérialiser une sélection qui traverse
deux `contenteditable` (chaque bloc en a un). `getSelection().toString()`
renvoie `""` et Chromium n'émet AUCUN événement `copy` — les handlers
`ct.addEventListener('copy')` n'étaient donc jamais atteints.
→ le raccourci est intercepté au keydown (capture sur document, garde
`closest('#_blocksCt')` pour ne pas voler Ctrl+C ailleurs) et le markdown
est écrit dans le presse-papier par nos soins. Sélection mono-bloc =
comportement natif inchangé.
2) Glisser la souris d'un bloc à l'autre ne sélectionnait qu'un bloc.
Cause : `mouseup` (on reconstruit la plage) → `click` → `focusin` → le
navigateur efface la sélection. La plage était reconstruite puis détruite
dans la foulée.
→ la plage reconstruite est mise en attente (`_mdSelRange`) et restaurée
au tour de boucle suivant si le focus l'a effectivement effacée. Chaque
nouveau geste (mousedown) remet l'attente à zéro, donc un clic pour
placer le curseur reste normal.
3) Le clic droit effaçait le surlignage.
Cause : `.bm-search` prenait le focus 10 ms après l'ouverture du menu.
→ le menu ne vole plus le focus quand un texte est sélectionné. Les
actions Clipboard utilisaient déjà la sélection figée à l'ouverture
(`d._clipSt`) ; le `preventDefault` du clic droit est remonté sur
`mousedown` (sur `contextmenu` il arrive trop tard).
Identité visuelle (bannière + logo du projet ajoutés à la racine) :
- assets optimisés servis : `static/img/banner.webp` 22,5 Ko (l'original
fait 1,6 Mo) + JPEG de secours, `logo.webp` 5,3 Ko + `logo-512.jpg` ;
originaux conservés dans `assets/` pour régénération.
- icônes PWA régénérées à partir du vrai logo (72 → 512 px, marge
maskable sur 192/512) + apple-touch-icon.
- landing : logo dans la barre de navigation, bannière en <picture>
(WebP + JPEG) avec dimensions déclarées (pas de décalage de mise en page).
- `og:image`, `twitter:card` et `meta description` ajoutés sur la landing
ET dans base.html — la landing a son propre <head>.
Tests : `tests/test_v769_selection_persistence.py` (19 statiques) +
`e2e/v769_selection_persistence.spec.js` (5, vrais gestes : drag souris,
Ctrl+C/Ctrl+X au clavier, clic droit). `e2e/v768_columns_clipboard.spec.js`
corrigé : les gestes simulés (`execCommand`, plage fabriquée en evaluate)
sont remplacés par de vrais gestes, et le token statique obsolète
`si>=ei)return null;` aligné sur la garde `isCollapsed` réelle.
pytest 1413 passed / 0 failed · ruff OK · OpenAPI 526 chemins / 7.69.0
This commit is contained in:
@@ -1,5 +1,53 @@
|
||||
# Changelog - FlowDeck
|
||||
|
||||
## v7.69.0 (2026-10-08) — La sélection multi-blocs fonctionne enfin (+ identité visuelle)
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Ctrl+C / Ctrl+X multi-blocs ne faisaient RIEN** — cause racine : le navigateur
|
||||
ne sait pas sérialiser une sélection qui traverse deux `contenteditable` (chaque
|
||||
bloc en a un). Résultat : `getSelection().toString()` renvoie `""` et Chromium
|
||||
**n'émet aucun événement `copy`** — nos handlers `ct.addEventListener('copy')`
|
||||
n'étaient donc jamais atteints, et le raccourci mourait en silence.
|
||||
→ le raccourci est maintenant intercepté au `keydown` (capture sur `document`,
|
||||
garde `closest('#_blocksCt')` pour ne pas voler Ctrl+C ailleurs) : on écrit le
|
||||
markdown dans le presse-papier nous-mêmes. La sélection mono-bloc reste native.
|
||||
- `Ctrl+X` supprime les blocs traversés en conservant la tête du premier et la
|
||||
queue du dernier.
|
||||
- **Glisser la souris d'un bloc à l'autre sélectionnait un seul bloc** — cause
|
||||
racine : la séquence complète est `mouseup` (on reconstruit la plage) → `click`
|
||||
→ `focusin` → **le navigateur efface la sélection**. La plage était donc
|
||||
reconstruite puis détruite dans la foulée. → la plage reconstruite est mise en
|
||||
attente (`_mdSelRange`) et restaurée au tour de boucle suivant, si le focus
|
||||
l'a effectivement effacée. Un nouveau geste (mousedown) remet l'attente à zéro,
|
||||
donc un clic pour placer le curseur reste normal.
|
||||
- **Le clic droit effaçait le surlignage** — la recherche du menu prenait le
|
||||
focus 10 ms après son ouverture, ce qui détruisait la sélection. → on ne vole
|
||||
plus le focus quand un texte est sélectionné. (Les actions Clipboard utilisaient
|
||||
déjà la sélection figée à l'ouverture du menu : `d._clipSt`.)
|
||||
- Le `preventDefault` du clic droit est bien sur `mousedown` (sur `contextmenu`
|
||||
il arrive trop tard — le curseur a déjà déplacé la sélection).
|
||||
|
||||
### Added
|
||||
|
||||
- **Identité visuelle** : la bannière et le logo du projet sont intégrés.
|
||||
- assets optimisés : `static/img/banner.webp` **22,5 Ko** (l'original fait
|
||||
1,6 Mo) + `banner.jpg` de secours, `logo.webp` **5,3 Ko** + `logo-512.jpg` ;
|
||||
originaux conservés dans `assets/` pour régénération.
|
||||
- icônes PWA régénérées à partir du vrai logo (72 → 512 px, marge maskable
|
||||
sur 192/512) + `apple-touch-icon`.
|
||||
- landing : logo dans la barre de navigation, bannière en `<picture>`
|
||||
(WebP + JPEG) avec dimensions déclarées pour éviter tout décalage de mise en
|
||||
page ; `og:image`, `twitter:card` et `meta description` ajoutés au `<head>`.
|
||||
|
||||
### Tests
|
||||
|
||||
- `tests/test_v769_selection_persistence.py` (19 tests statiques) +
|
||||
`e2e/v769_selection_persistence.spec.js` (5 tests, **vrais gestes** : glisser
|
||||
de souris, `Ctrl+C`/`Ctrl+X` au clavier, clic droit).
|
||||
- `e2e/v768_columns_clipboard.spec.js` : les gestes simulés (`execCommand`,
|
||||
plage fabriquée en `evaluate`) sont remplacés par de vrais gestes.
|
||||
|
||||
## v7.68.0 (2026-10-08) — Colonnes rendues, tables IA, copier/couper/coller multi-blocs
|
||||
|
||||
### Fixed
|
||||
|
||||
Reference in New Issue
Block a user