• fix: sélection multi-blocs fonctionnelle (Ctrl+C/X, drag souris, clic droit) + identité visuelle (v7.69.0)
    FlowDeck CI / lint (push) Successful in 1m34s
    FlowDeck CI / test (push) Failing after 17m31s
    FlowDeck CI / docker (push) Skipped

    bruno released this 2026-10-08 17:27:14 -04:00 | 31 commits to main since this release

    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
      (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

    Downloads