@andoniaina/react-modal 1.1.1 → 1.1.3
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/README.md +39 -97
- package/dist/react-modal.css +1 -0
- package/package.json +6 -3
- package/dist/react-hrnet-modal.css +0 -1
package/README.md
CHANGED
|
@@ -1,107 +1,49 @@
|
|
|
1
1
|
# @andoniaina/react-modal
|
|
2
2
|
|
|
3
|
-
Un composant **Modal React
|
|
3
|
+
Un composant **Modal React simple, léger et accessible**, prêt à l’emploi, avec gestion du scroll, fermeture par clic extérieur et touche ESC.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Idéal pour afficher des messages de succès, d’erreur ou des confirmations dans vos applications React.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
npm install @andoniaina/react-modal
|
|
11
|
-
|
|
12
|
-
🧩 Problématique initiale
|
|
13
|
-
Limites de la solution jQuery
|
|
14
|
-
|
|
15
|
-
Manipulation directe du DOM
|
|
16
|
-
|
|
17
|
-
Couplage fort entre HTML et JavaScript
|
|
18
|
-
|
|
19
|
-
Difficulté de maintenance à grande échelle
|
|
20
|
-
|
|
21
|
-
Dépendance à une librairie externe (jQuery)
|
|
22
|
-
|
|
23
|
-
Intégration complexe dans une application React
|
|
24
|
-
|
|
25
|
-
👉 Dans une application React, l’utilisation de jQuery va à l’encontre du Virtual DOM et des bonnes pratiques React.
|
|
26
|
-
|
|
27
|
-
🔄 Solution mise en place
|
|
28
|
-
|
|
29
|
-
Le plugin jquery-modal a été remplacé par un composant React contrôlé par l’état (state), respectant :
|
|
30
|
-
|
|
31
|
-
le flux de données unidirectionnel
|
|
32
|
-
|
|
33
|
-
la logique déclarative de React
|
|
9
|
+
## ✨ Fonctionnalités
|
|
34
10
|
|
|
35
|
-
|
|
11
|
+
- ✅ Modal contrôlée (`isOpen`)
|
|
12
|
+
- ✅ Fermeture par clic sur l’overlay
|
|
13
|
+
- ✅ Fermeture avec la touche **ESC**
|
|
14
|
+
- ✅ Blocage du scroll en arrière-plan
|
|
15
|
+
- ✅ Styles CSS inclus
|
|
16
|
+
- ✅ Types de modal (`success`, `error`)
|
|
17
|
+
- ✅ Accessible (`role="dialog"`, `aria-modal`)
|
|
36
18
|
|
|
37
|
-
|
|
38
|
-
Fonctionnalité jquery-modal React Modal
|
|
39
|
-
Ouverture / fermeture Attribut HTML + JS State React
|
|
40
|
-
Overlay Oui Oui
|
|
41
|
-
Fermeture par ESC Oui Oui
|
|
42
|
-
Fermeture par clic Oui Oui
|
|
43
|
-
Animation jQuery CSS
|
|
44
|
-
Événements jQuery events Props & callbacks
|
|
45
|
-
Accessibilité Limitée aria-modal, role="dialog"
|
|
46
|
-
Dépendance externe jQuery Aucune
|
|
19
|
+
---
|
|
47
20
|
|
|
48
|
-
|
|
49
|
-
Approche jQuery (impérative)
|
|
50
|
-
<a href="#modal" rel="modal:open">Open</a>
|
|
21
|
+
## 📦 Installation
|
|
51
22
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
- Le DOM est modifié directement
|
|
55
|
-
- Le comportement dépend de sélecteurs
|
|
56
|
-
- La logique est dispersée
|
|
57
|
-
|
|
58
|
-
Approche React (déclarative)
|
|
59
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
60
|
-
|
|
61
|
-
<Modal isOpen={isOpen} onClose={() => setIsOpen(false)}>
|
|
62
|
-
Contenu du modal
|
|
63
|
-
</Modal>
|
|
64
|
-
|
|
65
|
-
- L’UI dépend de l’état
|
|
66
|
-
- La logique est centralisée
|
|
67
|
-
- Le composant est réutilisable
|
|
68
|
-
|
|
69
|
-
🔁 Correspondance des API
|
|
70
|
-
jquery-modal Implémentation React
|
|
71
|
-
rel="modal:open" <ModalTrigger />
|
|
72
|
-
$.modal.close() setIsOpen(false)
|
|
73
|
-
escapeClose closeOnEsc
|
|
74
|
-
clickClose closeOnOverlayClick
|
|
75
|
-
fadeDuration animationDuration
|
|
76
|
-
modal:open onAfterOpen
|
|
77
|
-
modal:close onAfterClose
|
|
78
|
-
|
|
79
|
-
🧱 Architecture du composant
|
|
80
|
-
src/
|
|
81
|
-
├── components/
|
|
82
|
-
│ ├── Modal/
|
|
83
|
-
│ │ ├── Modal.jsx
|
|
84
|
-
│ │ └── Modal.css
|
|
85
|
-
│ └── ModalTrigger.jsx
|
|
86
|
-
├── App.jsx
|
|
87
|
-
|
|
88
|
-
- Modal.jsx : gestion de l’ouverture, fermeture et événements
|
|
89
|
-
- Modal.css : styles et animations
|
|
90
|
-
- ModalTrigger.jsx : remplacement du déclenchement jQuery
|
|
91
|
-
|
|
92
|
-
♿ Accessibilité
|
|
93
|
-
Le composant React respecte les bonnes pratiques d’accessibilité :
|
|
94
|
-
* role="dialog"
|
|
95
|
-
* aria-modal="true"
|
|
96
|
-
* Fermeture via la touche Escape
|
|
97
|
-
* Blocage du scroll du body lors de l’ouverture
|
|
98
|
-
|
|
99
|
-
Ces éléments améliorent l’expérience utilisateur par rapport à la version jQuery.
|
|
100
|
-
|
|
101
|
-
✅ Bénéfices de la migration
|
|
23
|
+
```bash
|
|
24
|
+
npm install @andoniaina/react-modal
|
|
102
25
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
26
|
+
## Utilisation basique
|
|
27
|
+
import { useState } from "react";
|
|
28
|
+
import { Modal } from "@andoniaina/react-modal";
|
|
29
|
+
|
|
30
|
+
function App() {
|
|
31
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<>
|
|
35
|
+
<button onClick={() => setIsOpen(true)}>
|
|
36
|
+
Ouvrir la modal
|
|
37
|
+
</button>
|
|
38
|
+
|
|
39
|
+
<Modal
|
|
40
|
+
isOpen={isOpen}
|
|
41
|
+
onClose={() => setIsOpen(false)}
|
|
42
|
+
type="success"
|
|
43
|
+
message="L’opération a été effectuée avec succès !"
|
|
44
|
+
/>
|
|
45
|
+
</>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default App;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.modal-overlay{position:fixed;inset:0;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1001}.modal{background:#fff;padding:1.5rem;border-radius:8px;min-width:300px;text-align:center;animation:fadeIn .2s ease-in-out}.modal.success{border-left:6px solid #2ecc71}.modal.error{border-left:6px solid #e74c3c}.modal button{margin-top:1rem;padding:.5rem 1rem;cursor:pointer}@keyframes fadeIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andoniaina/react-modal",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Reusable, accessible and customizable React modal component",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
"files": [
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
|
+
"sideEffects": [
|
|
12
|
+
"*.css"
|
|
13
|
+
],
|
|
11
14
|
"exports": {
|
|
12
15
|
".": {
|
|
13
16
|
"import": "./dist/index.es.js",
|
|
@@ -51,8 +54,8 @@
|
|
|
51
54
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
52
55
|
"eslint-plugin-react-refresh": "^0.4.24",
|
|
53
56
|
"globals": "^16.5.0",
|
|
54
|
-
"vite": "^7.2.4",
|
|
55
57
|
"react": ">=18",
|
|
56
|
-
"react-dom": ">=18"
|
|
58
|
+
"react-dom": ">=18",
|
|
59
|
+
"vite": "^7.2.4"
|
|
57
60
|
}
|
|
58
61
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.modal-overlay{position:fixed;inset:0;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:999}.modal{background:#fff;padding:1.5rem;border-radius:8px;min-width:300px;text-align:center;animation:fadeIn .2s ease-in-out}.modal.success{border-left:6px solid #2ecc71}.modal.error{border-left:6px solid #e74c3c}.modal button{margin-top:1rem;padding:.5rem 1rem;cursor:pointer}@keyframes fadeIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}
|