Capitalise les notes durables produites pendant le sprint UI rework et les tickets livrés depuis. Commit séparé du code : `.ideai/memory/` est le store durable versionné, il ne doit jamais être mélangé aux commits de feature. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.1 KiB
name, description, metadata
| name | description | metadata | ||
|---|---|---|---|---|
| floatingwindow-focus-trap-mount-only | Le focus-trap de FloatingWindow ne doit dépendre que du mount ; sinon un onClose instable vole le focus à chaque frappe. |
|
Le primitif frontend/src/shared/ui/FloatingWindow.tsx a un useEffect focus-trap qui appelle (first ?? node)?.focus(). Sa dépendance doit rester [] (mount-only), et onClose doit être lu via un onCloseRef maintenu à jour.
Pourquoi : les appelants (ex. TicketDetail.requestClose) passent souvent un onClose recréé à chaque render. Si l'effet dépend de [onClose], chaque frappe dans un input contrôlé de la fenêtre → re-render → nouvelle identité onClose → l'effet se ré-arme → focus renvoyé au premier focusable → l'utilisateur ne peut taper qu'UNE lettre à la fois (bug #17, corrigé 2026-07-07).
Comment l'appliquer : ne jamais remettre onClose (ni une autre prop changeante) dans les deps de cet effet ; router les callbacks via une ref. Régression couverte par le test « #17 focus-loss bug » dans FloatingWindow.test.tsx. Voir ticket16-menus-floating-delivered-devfrontend.