@zevra/ui 0.39.0 → 0.39.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DECISIONS.md +39 -0
- package/dist/overlays.d.ts.map +1 -1
- package/dist/overlays.js +14 -2
- package/dist/overlays.js.map +1 -1
- package/package.json +1 -1
- package/react/overlays.tsx +15 -2
package/DECISIONS.md
CHANGED
|
@@ -1781,3 +1781,42 @@ de toute façon inerte, le CSS du paquet étant hors couche).
|
|
|
1781
1781
|
même raison : les actions ne sortent jamais de l'écran. Le corps n'a
|
|
1782
1782
|
pas de marge intérieure imposée (`corps="nu"`) quand il porte un
|
|
1783
1783
|
document qui doit aller bord à bord.
|
|
1784
|
+
|
|
1785
|
+
---
|
|
1786
|
+
|
|
1787
|
+
## Un enrobage ne reprend le focus qu'à l'ouverture (30/09/2026, 0.39.1)
|
|
1788
|
+
|
|
1789
|
+
`useOverlay` gardait `onClose` dans les dépendances de son effet. Or l'effet
|
|
1790
|
+
ne fait pas que poser Échap : il mémorise le nœud qui avait le focus, verrouille
|
|
1791
|
+
le défilement et **donne le focus au premier élément du panneau**. Rejouer cet
|
|
1792
|
+
effet, ce n'est donc pas « re-souscrire », c'est **rouvrir** l'enrobage.
|
|
1793
|
+
|
|
1794
|
+
Et il se rejouait tout le temps. `onClose` est presque toujours une fonction
|
|
1795
|
+
anonyme (`onClose={() => setPiece(null)}`) : une nouvelle identité à chaque
|
|
1796
|
+
rendu du parent. Tout ce qui fait rendre la page derrière ramenait donc le
|
|
1797
|
+
curseur sur le premier bouton du panneau.
|
|
1798
|
+
|
|
1799
|
+
Le symptôme était invisible tant qu'un enrobage ne portait que des boutons.
|
|
1800
|
+
Il est devenu bloquant avec un champ qui s'enregistre tout seul : dans Tésope,
|
|
1801
|
+
la note d'une pièce s'écrit dans un `Volet` et s'enregistre 600 ms après la
|
|
1802
|
+
frappe ; l'enregistrement rafraîchissait la liste derrière, la page rendait,
|
|
1803
|
+
et le curseur sautait hors du champ toutes les deux secondes. Impossible
|
|
1804
|
+
d'écrire une phrase. L'app avait déjà contourné le même défaut de son côté
|
|
1805
|
+
pour la modale, en fabriquant une fonction stable : un contournement par
|
|
1806
|
+
appelant, alors que le paquet peut le régler une fois.
|
|
1807
|
+
|
|
1808
|
+
**Ce qui est arbitré.**
|
|
1809
|
+
|
|
1810
|
+
- **L'effet ne dépend que de l'ÉTAT** (`ouvert`, `panneau`, `verrouille`), pas
|
|
1811
|
+
du rappel. `onClose` vit dans un `ref` mis à jour à chaque rendu : Échap
|
|
1812
|
+
appelle toujours la dernière fonction connue, sans que sa nouveauté ne
|
|
1813
|
+
compte pour une réouverture.
|
|
1814
|
+
- **Aucune contrainte nouvelle sur l'appelant.** L'alternative aurait été
|
|
1815
|
+
d'exiger un rappel stable (`useCallback`) de chaque app. C'est demander à
|
|
1816
|
+
douze appelants de se souvenir d'une règle que le paquet connaît, et le
|
|
1817
|
+
défaut est silencieux quand ils l'oublient : le composant s'affiche, mal.
|
|
1818
|
+
- **Le focus initial reste**, et il reste au bon moment : à l'ouverture. C'est
|
|
1819
|
+
lui qui rend un enrobage utilisable au clavier ; ce qui était faux, ce
|
|
1820
|
+
n'était pas de le poser, c'était de le reposer.
|
|
1821
|
+
|
|
1822
|
+
Vaut pour `Modal`, `Drawer` et `Volet`, qui passent tous par ce hook.
|
package/dist/overlays.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../react/overlays.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGjE,KAAK,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC,CAAA;AAK5D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;gBACY;IACZ,OAAO,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACvC;oEACgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;;YAGY;AACZ,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAiB,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../react/overlays.tsx"],"names":[],"mappings":"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"}
|
package/dist/overlays.js
CHANGED
|
@@ -21,6 +21,18 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }) {
|
|
|
21
21
|
// à la fermeture. Sans cela, le focus repart au début du document et un
|
|
22
22
|
// utilisateur au clavier perd sa place dans la page.
|
|
23
23
|
const origine = useRef(null);
|
|
24
|
+
// ⚠️ `onClose` NE FIGURE PAS dans les dépendances de l'effet, et ce n'est pas
|
|
25
|
+
// un oubli. L'effet ne se contente pas d'écouter Échap : il mémorise le
|
|
26
|
+
// nœud focalisé, verrouille le défilement et donne le focus au premier
|
|
27
|
+
// élément du panneau. Le rejouer, ce n'est donc pas re-souscrire, c'est
|
|
28
|
+
// ROUVRIR l'enrobage. Or `onClose` est presque toujours une fonction
|
|
29
|
+
// anonyme, recréée à chaque rendu du parent : le focus repartait sur le
|
|
30
|
+
// premier bouton du panneau à chaque rendu de la page derrière, et un champ
|
|
31
|
+
// qui s'enregistre tout seul devenait impossible à remplir (la note d'une
|
|
32
|
+
// pièce dans Tésope, 30/09/2026). L'effet lit ici la dernière fonction
|
|
33
|
+
// connue ; ses dépendances ne portent que l'état.
|
|
34
|
+
const fermer = useRef(onClose);
|
|
35
|
+
fermer.current = onClose;
|
|
24
36
|
useEffect(() => {
|
|
25
37
|
if (!ouvert)
|
|
26
38
|
return;
|
|
@@ -42,7 +54,7 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }) {
|
|
|
42
54
|
function onKey(e) {
|
|
43
55
|
if (e.key === 'Escape') {
|
|
44
56
|
e.stopPropagation();
|
|
45
|
-
|
|
57
|
+
fermer.current();
|
|
46
58
|
return;
|
|
47
59
|
}
|
|
48
60
|
if (e.key !== 'Tab' || !cible)
|
|
@@ -70,7 +82,7 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }) {
|
|
|
70
82
|
docu.body.style.overflow = overflowPrecedent;
|
|
71
83
|
origine.current?.focus?.();
|
|
72
84
|
};
|
|
73
|
-
}, [ouvert,
|
|
85
|
+
}, [ouvert, panneau, verrouille]);
|
|
74
86
|
}
|
|
75
87
|
/* ─── Voile ────────────────────────────────────────────────────────── */
|
|
76
88
|
/** Toujours l'encre de charte diluée, jamais un noir pur : la page est
|
package/dist/overlays.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlays.js","sourceRoot":"","sources":["../react/overlays.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,oEAAoE;AACpE,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,iEAAiE;AACjE,EAAE;AACF,kFAAkF;AAClF,0EAA0E;AAC1E,iFAAiF;AAEjF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEtD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAI5B,MAAM,UAAU,GACd,sIAAsI,CAAA;AAaxI;;;YAGY;AACZ,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,EAAqB;IAC3F,2EAA2E;IAC3E,wEAAwE;IACxE,qDAAqD;IACrD,MAAM,OAAO,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAA;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,CAAA;QAC9B,0EAA0E;QAC1E,2EAA2E;QAC3E,wEAAwE;QACxE,oEAAoE;QACpE,8DAA8D;QAC9D,MAAM,IAAI,GAAG,KAAK,EAAE,aAAa,IAAI,QAAQ,CAAA;QAC7C,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,aAAmC,CAAA;QAE1D,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;QACtE,IAAI,UAAU;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAEnD,MAAM,OAAO,GAAG,KAAK,EAAE,aAAa,CAAc,UAAU,CAAC,CAAA;QAC7D,OAAO,EAAE,KAAK,EAAE,CAAA;QAEhB,SAAS,KAAK,CAAC,CAAgB;YAC7B,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,CAAC,CAAC,eAAe,EAAE,CAAA;gBACnB,OAAO,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"overlays.js","sourceRoot":"","sources":["../react/overlays.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/react/overlays.tsx
CHANGED
|
@@ -40,6 +40,19 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }: UseO
|
|
|
40
40
|
// utilisateur au clavier perd sa place dans la page.
|
|
41
41
|
const origine = useRef<HTMLElement | null>(null)
|
|
42
42
|
|
|
43
|
+
// ⚠️ `onClose` NE FIGURE PAS dans les dépendances de l'effet, et ce n'est pas
|
|
44
|
+
// un oubli. L'effet ne se contente pas d'écouter Échap : il mémorise le
|
|
45
|
+
// nœud focalisé, verrouille le défilement et donne le focus au premier
|
|
46
|
+
// élément du panneau. Le rejouer, ce n'est donc pas re-souscrire, c'est
|
|
47
|
+
// ROUVRIR l'enrobage. Or `onClose` est presque toujours une fonction
|
|
48
|
+
// anonyme, recréée à chaque rendu du parent : le focus repartait sur le
|
|
49
|
+
// premier bouton du panneau à chaque rendu de la page derrière, et un champ
|
|
50
|
+
// qui s'enregistre tout seul devenait impossible à remplir (la note d'une
|
|
51
|
+
// pièce dans Tésope, 30/09/2026). L'effet lit ici la dernière fonction
|
|
52
|
+
// connue ; ses dépendances ne portent que l'état.
|
|
53
|
+
const fermer = useRef(onClose)
|
|
54
|
+
fermer.current = onClose
|
|
55
|
+
|
|
43
56
|
useEffect(() => {
|
|
44
57
|
if (!ouvert) return
|
|
45
58
|
const cible = panneau?.current
|
|
@@ -62,7 +75,7 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }: UseO
|
|
|
62
75
|
function onKey(e: KeyboardEvent) {
|
|
63
76
|
if (e.key === 'Escape') {
|
|
64
77
|
e.stopPropagation()
|
|
65
|
-
|
|
78
|
+
fermer.current()
|
|
66
79
|
return
|
|
67
80
|
}
|
|
68
81
|
if (e.key !== 'Tab' || !cible) return
|
|
@@ -89,7 +102,7 @@ export function useOverlay({ ouvert, onClose, panneau, verrouille = true }: UseO
|
|
|
89
102
|
if (overflowPrecedent !== null) docu.body.style.overflow = overflowPrecedent
|
|
90
103
|
origine.current?.focus?.()
|
|
91
104
|
}
|
|
92
|
-
}, [ouvert,
|
|
105
|
+
}, [ouvert, panneau, verrouille])
|
|
93
106
|
}
|
|
94
107
|
|
|
95
108
|
/* ─── Voile ────────────────────────────────────────────────────────── */
|