willynabole commited on
Commit
9feaeef
·
verified ·
1 Parent(s): 45ea1f5

Génére une application mobile et web minimaliste pour la *télésurveillance des patients sous traitement anticoagulant* dénommé "INR+", avec : --- ### 🔷 **Technologies** * **Frontend** : React JS (version récente), React Router pour la navigation. * **Backend** : Java avec **Spring Boot**, REST API sécurisée. * **Base de données** : MySQL (Schéma relationnel simple). * **Sécurité** : Authentification avec JWT, rôle Patient ou Médecin. * **Style** : CSS moderne ou Tailwind pour UI simple et responsive. --- ### 🔷 **Interface d’accueil (Splash screen)** Créer une **page d’accueil initiale** avec les éléments suivants : * Logo **Patient** en bas à gauche * Logo **Médecin** en haut à droite * Logo de l’application **au centre** * Lorsqu’un logo est cliqué, rediriger vers l’écran **Connexion / Inscription**, avec sélection de rôle (`"patient"` ou `"medecin"`). --- ### 🔷 **Écrans pour le Médecin** | Fonction | | ---------------------------------- | --------------------------------------------------- | | Vue synthétique des patients suivis, alertes, stats | | Liste des patients, ajout/modification de dossiers | | Visualisation graphique de l’historique INR | | Ajout/modification d’une dose AVK | | Génération de bulletin d’analyse INR | | Vue des statistiques par patient | | Alertes critiques patients, rappels à traiter | --- ### 🔷 **Écrans pour le Patient** | Fonction | | ----------------------- | ---------------------------------------------- | | Dernière valeur INR, prochaine dose, rappels | | Formulaire d’enregistrement INR ou upload CSV | | Liste des médicaments, rappels | | Signalement (saignements, douleurs) | | Liste des rendez-vous, ajout/modif | | Alertes INR anormaux, oublis, messages système | --- ### 🔷 **Backend - API nécessaires (Spring Boot)** Créer des contrôleurs REST avec endpoints pour : * Authentification (inscription / login / JWT / rôles) * Gestion des utilisateurs * INR : Création, consultation, historique * Médicaments : prescription / rappel * Symptômes : enregistrement * Notifications : envoi / consultation * Statistiques : calcul INR moyens, alertes * Dossiers patients : CRUD * Rendez-vous : création / modification --- ### 🔷 **Base de Données MySQL – --- Génère le **squelette complet de l’application**, avec tous les dossiers et composants nécessaires, ainsi que le backend prêt à être lancé avec Spring Boot (incluant `application.properties` pour la config MySQL, Swagger, sécurité). --- Souhaites-tu aussi que je te fournisse maintenant les **diagrammes UML (cas d’utilisation, séquence, classes)** ou le **squelette de code généré avec ce prompt** ? - Follow Up Deployment

Browse files
Files changed (1) hide show
  1. index.html +447 -17
index.html CHANGED
@@ -1,20 +1,450 @@
1
  <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>My app</title>
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta charset="utf-8">
7
  <script src="https://cdn.tailwindcss.com"></script>
8
- </head>
9
- <body class="flex justify-center items-center h-screen overflow-hidden bg-white font-sans text-center px-6">
10
- <div class="w-full">
11
- <span class="text-xs rounded-full mb-2 inline-block px-2 py-1 border border-amber-500/15 bg-amber-500/15 text-amber-500">🔥 New version dropped!</span>
12
- <h1 class="text-4xl lg:text-6xl font-bold font-sans">
13
- <span class="text-2xl lg:text-4xl text-gray-400 block font-medium">I'm ready to work,</span>
14
- Ask me anything.
15
- </h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  </div>
17
- <img src="https://enzostvs-deepsite.hf.space/arrow.svg" class="absolute bottom-8 left-0 w-[100px] transform rotate-[30deg]" />
18
- <script></script>
19
- <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=willynabole/inrplus" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
20
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>INR+ - Télésurveillance Anticoagulant</title>
7
  <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://unpkg.com/lucide@latest/dist/umd/lucide.js"></script>
9
+ <style>
10
+ @keyframes fadeIn {
11
+ from { opacity: 0; transform: translateY(20px); }
12
+ to { opacity: 1; transform: translateY(0); }
13
+ }
14
+ .fade-in {
15
+ animation: fadeIn 0.6s ease-out;
16
+ }
17
+ .logo-hover {
18
+ transition: all 0.3s ease;
19
+ }
20
+ .logo-hover:hover {
21
+ transform: scale(1.1);
22
+ filter: drop-shadow(0 4px 20px rgba(59, 130, 246, 0.5));
23
+ }
24
+ .role-card {
25
+ backdrop-filter: blur(10px);
26
+ transition: all 0.3s ease;
27
+ }
28
+ .role-card:hover {
29
+ transform: translateY(-5px);
30
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
31
+ }
32
+ </style>
33
+ </head>
34
+ <body class="bg-gradient-to-br from-blue-50 to-indigo-100 min-h-screen">
35
+ <!-- Splash Screen -->
36
+ <div id="splashScreen" class="min-h-screen flex items-center justify-center relative overflow-hidden">
37
+ <!-- Background Pattern -->
38
+ <div class="absolute inset-0 opacity-10">
39
+ <div class="absolute top-10 left-10 w-32 h-32 bg-blue-500 rounded-full"></div>
40
+ <div class="absolute bottom-20 right-20 w-48 h-48 bg-indigo-500 rounded-full"></div>
41
+ <div class="absolute top-1/2 left-1/3 w-24 h-24 bg-purple-500 rounded-full"></div>
42
+ </div>
43
+
44
+ <!-- Main Logo -->
45
+ <div class="text-center z-10">
46
+ <div class="logo-hover cursor-pointer inline-block">
47
+ <div class="w-32 h-32 bg-gradient-to-br from-blue-500 to-indigo-600 rounded-full flex items-center justify-center mb-4 shadow-2xl">
48
+ <i data-lucide="heart-pulse" class="w-16 h-16 text-white"></i>
49
+ </div>
50
+ <h1 class="text-4xl font-bold text-gray-800 mb-2">INR+</h1>
51
+ <p class="text-gray-600">Télésurveillance des patients sous anticoagulant</p>
52
+ </div>
53
+ </div>
54
+
55
+ <!-- Role Selection -->
56
+ <div class="absolute bottom-8 left-8">
57
+ <button onclick="selectRole('patient')" class="role-card bg-white/80 p-6 rounded-2xl shadow-lg cursor-pointer">
58
+ <div class="text-center">
59
+ <div class="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-3">
60
+ <i data-lucide="user" class="w-8 h-8 text-green-600"></i>
61
+ </div>
62
+ <h3 class="font-semibold text-gray-800">Patient</h3>
63
+ <p class="text-sm text-gray-600 mt-1">Accéder à mes données</p>
64
+ </div>
65
+ </button>
66
+ </div>
67
+
68
+ <div class="absolute top-8 right-8">
69
+ <button onclick="selectRole('medecin')" class="role-card bg-white/80 p-6 rounded-2xl shadow-lg cursor-pointer">
70
+ <div class="text-center">
71
+ <div class="w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-3">
72
+ <i data-lucide="stethoscope" class="w-8 h-8 text-red-600"></i>
73
+ </div>
74
+ <h3 class="font-semibold text-gray-800">Médecin</h3>
75
+ <p class="text-sm text-gray-600 mt-1">Gérer mes patients</p>
76
+ </div>
77
+ </button>
78
+ </div>
79
  </div>
80
+
81
+ <!-- Auth Screen -->
82
+ <div id="authScreen" class="hidden min-h-screen flex items-center justify-center p-4">
83
+ <div class="max-w-md w-full">
84
+ <div class="bg-white rounded-2xl shadow-xl p-8 fade-in">
85
+ <div class="text-center mb-8">
86
+ <div class="w-20 h-20 bg-gradient-to-br from-blue-500 to-indigo-600 rounded-full flex items-center justify-center mx-auto mb-4">
87
+ <i data-lucide="heart-pulse" class="w-10 h-10 text-white"></i>
88
+ </div>
89
+ <h2 class="text-2xl font-bold text-gray-800">INR+</h2>
90
+ <p class="text-gray-600 mt-2" id="authSubtitle">Connexion</p>
91
+ </div>
92
+
93
+ <!-- Toggle Auth Mode -->
94
+ <div class="flex mb-6 bg-gray-100 rounded-lg p-1">
95
+ <button id="loginBtn" onclick="toggleAuthMode('login')"
96
+ class="flex-1 py-2 rounded-md text-sm font-medium transition">
97
+ Connexion
98
+ </button>
99
+ <button id="registerBtn" onclick="toggleAuthMode('register')"
100
+ class="flex-1 py-2 rounded-md text-sm font-medium transition">
101
+ Inscription
102
+ </button>
103
+ </div>
104
+
105
+ <!-- Forms -->
106
+ <form id="loginForm" class="space-y-4">
107
+ <input type="hidden" id="role" name="role" value="">
108
+ <div>
109
+ <label class="block text-sm font-medium text-gray-700 mb-1">Email</label>
110
+ <input type="email" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
111
+ </div>
112
+ <div>
113
+ <label class="block text-sm font-medium text-gray-700 mb-1">Mot de passe</label>
114
+ <input type="password" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
115
+ </div>
116
+ <button type="submit" class="w-full bg-gradient-to-r from-blue-500 to-indigo-600 text-white py-2 rounded-lg font-medium hover:from-blue-600 hover:to-indigo-700 transition">
117
+ Se connecter
118
+ </button>
119
+ </form>
120
+
121
+ <form id="registerForm" class="hidden space-y-4">
122
+ <input type="hidden" id="regRole" name="role" value="">
123
+ <div>
124
+ <label class="block text-sm font-medium text-gray-700 mb-1">Nom</label>
125
+ <input type="text" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
126
+ </div>
127
+ <div>
128
+ <label class="block text-sm font-medium text-gray-700 mb-1">Email</label>
129
+ <input type="email" required class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
130
+ </div>
131
+ <div>
132
+ <label class="block text-sm font-medium text-gray-700 mb-1">Mot de passe</label>
133
+ <input type="password" required minlength="6" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
134
+ </div>
135
+ <div id="medecinFields" class="hidden space-y-4">
136
+ <div>
137
+ <label class="block text-sm font-medium text-gray-700 mb-1">Numéro RPPS</label>
138
+ <input type="text" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
139
+ </div>
140
+ <div>
141
+ <label class="block text-sm font-medium text-gray-700 mb-1">Spécialité</label>
142
+ <select class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500">
143
+ <option>Cardiologie</option>
144
+ <option>Hématologie</option>
145
+ <option>Médecine générale</option>
146
+ </select>
147
+ </div>
148
+ </div>
149
+ <button type="submit" class="w-full bg-gradient-to-r from-green-500 to-emerald-600 text-white py-2 rounded-lg font-medium hover:from-green-600 hover:to-emerald-700 transition">
150
+ S'inscrire
151
+ </button>
152
+ </form>
153
+ </div>
154
+ </div>
155
+ </div>
156
+
157
+ <!-- Patient Dashboard -->
158
+ <div id="patientDashboard" class="hidden min-h-screen bg-gray-50">
159
+ <!-- Header -->
160
+ <header class="bg-white shadow-sm border-b">
161
+ <div class="max-w-7xl mx-auto px-4 py-4 flex items-center justify-between">
162
+ <div class="flex items-center space-x-3">
163
+ <div class="w-10 h-10 bg-gradient-to-br from-blue-500 to-indigo-600 rounded-lg flex items-center justify-center">
164
+ <i data-lucide="heart-pulse" class="w-6 h-6 text-white"></i>
165
+ </div>
166
+ <h1 class="text-xl font-bold text-gray-800">INR+ Patient</h1>
167
+ </div>
168
+ <button onclick="logout()" class="text-gray-600 hover:text-gray-800">
169
+ <i data-lucide="log-out" class="w-6 h-6"></i>
170
+ </button>
171
+ </div>
172
+ </header>
173
+
174
+ <!-- Main Content -->
175
+ <main class="max-w-7xl mx-auto px-4 py-8">
176
+ <!-- Quick Stats -->
177
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
178
+ <div class="bg-white rounded-xl shadow-sm p-6">
179
+ <div class="flex items-center justify-between">
180
+ <div>
181
+ <p class="text-sm text-gray-600">Dernière INR</p>
182
+ <p class="text-2xl font-bold text-gray-800">2.5</p>
183
+ </div>
184
+ <div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center">
185
+ <i data-lucide="activity" class="w-6 h-6 text-green-600"></i>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ <div class="bg-white rounded-xl shadow-sm p-6">
190
+ <div class="flex items-center justify-between">
191
+ <div>
192
+ <p class="text-sm text-gray-600">Prochaine dose</p>
193
+ <p class="text-2xl font-bold text-gray-800">5mg</p>
194
+ </div>
195
+ <div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
196
+ <i data-lucide="pill" class="w-6 h-6 text-blue-600"></i>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ <div class="bg-white rounded-xl shadow-sm p-6">
201
+ <div class="flex items-center justify-between">
202
+ <div>
203
+ <p class="text-sm text-gray-600">Prochain RDV</p>
204
+ <p class="text-2xl font-bold text-gray-800">15/12</p>
205
+ </div>
206
+ <div class="w-12 h-12 bg-purple-100 rounded-lg flex items-center justify-center">
207
+ <i data-lucide="calendar" class="w-6 h-6 text-purple-600"></i>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <!-- Actions -->
214
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
215
+ <div class="bg-white rounded-xl shadow-sm p-6">
216
+ <h3 class="text-lg font-semibold text-gray-800 mb-4">Actions rapides</h3>
217
+ <div class="space-y-3">
218
+ <button onclick="showModal('inrModal')" class="w-full text-left px-4 py-3 bg-blue-50 rounded-lg hover:bg-blue-100 transition flex items-center space-x-3">
219
+ <i data-lucide="plus" class="w-5 h-5 text-blue-600"></i>
220
+ <span class="text-gray-700">Enregistrer une nouvelle INR</span>
221
+ </button>
222
+ <button onclick="showModal('symptomModal')" class="w-full text-left px-4 py-3 bg-red-50 rounded-lg hover:bg-red-100 transition flex items-center space-x-3">
223
+ <i data-lucide="alert-triangle" class="w-5 h-5 text-red-600"></i>
224
+ <span class="text-gray-700">Signaler des symptômes</span>
225
+ </button>
226
+ <button onclick="showModal('appointmentModal')" class="w-full text-left px-4 py-3 bg-purple-50 rounded-lg hover:bg-purple-100 transition flex items-center space-x-3">
227
+ <i data-lucide="calendar-plus" class="w-5 h-5 text-purple-600"></i>
228
+ <span class="text-gray-700">Prendre rendez-vous</span>
229
+ </button>
230
+ </div>
231
+ </div>
232
+
233
+ <div class="bg-white rounded-xl shadow-sm p-6">
234
+ <h3 class="text-lg font-semibold text-gray-800 mb-4">Médicaments</h3>
235
+ <div class="space-y-3">
236
+ <div class="flex items-center justify-between">
237
+ <div>
238
+ <p class="font-medium text-gray-800">Warfarin 5mg</p>
239
+ <p class="text-sm text-gray-600">1 comprimé / jour</p>
240
+ </div>
241
+ <label class="relative inline-flex items-center cursor-pointer">
242
+ <input type="checkbox" checked class="sr-only peer">
243
+ <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-green-600"></div>
244
+ </label>
245
+ </div>
246
+ </div>
247
+ </div>
248
+ </div>
249
+ </main>
250
+ </div>
251
+
252
+ <!-- Médecin Dashboard -->
253
+ <div id="medecinDashboard" class="hidden min-h-screen bg-gray-50">
254
+ <!-- Header -->
255
+ <header class="bg-white shadow-sm border-b">
256
+ <div class="max-w-7xl mx-auto px-4 py-4 flex items-center justify-between">
257
+ <div class="flex items-center space-x-3">
258
+ <div class="w-10 h-10 bg-gradient-to-br from-blue-500 to-indigo-600 rounded-lg flex items-center justify-center">
259
+ <i data-lucide="heart-pulse" class="w-6 h-6 text-white"></i>
260
+ </div>
261
+ <h1 class="text-xl font-bold text-gray-800">INR+ Médecin</h1>
262
+ </div>
263
+ <button onclick="logout()" class="text-gray-600 hover:text-gray-800">
264
+ <i data-lucide="log-out" class="w-6 h-6"></i>
265
+ </button>
266
+ </div>
267
+ </header>
268
+
269
+ <!-- Main Content -->
270
+ <main class="max-w-7xl mx-auto px-4 py-8">
271
+ <!-- Stats -->
272
+ <div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
273
+ <div class="bg-white rounded-xl shadow-sm p-6">
274
+ <p class="text-sm text-gray-600">Patients actifs</p>
275
+ <p class="text-2xl font-bold text-gray-800">24</p>
276
+ </div>
277
+ <div class="bg-white rounded-xl shadow-sm p-6">
278
+ <p class="text-sm text-gray-600">Alertes en attente</p>
279
+ <p class="text-2xl font-bold text-red-600">3</p>
280
+ </div>
281
+ <div class="bg-white rounded-xl shadow-sm p-6">
282
+ <p class="text-sm text-gray-600">Contrôles cette semaine</p>
283
+ <p class="text-2xl font-bold text-gray-800">12</p>
284
+ </div>
285
+ <div class="bg-white rounded-xl shadow-sm p-6">
286
+ <p class="text-sm text-gray-600">RDV à venir</p>
287
+ <p class="text-2xl font-bold text-gray-800">8</p>
288
+ </div>
289
+ </div>
290
+
291
+ <!-- Patient List -->
292
+ <div class="bg-white rounded-xl shadow-sm">
293
+ <div class="p-6 border-b">
294
+ <h3 class="text-lg font-semibold text-gray-800">Mes patients</h3>
295
+ </div>
296
+ <div class="overflow-x-auto">
297
+ <table class="w-full">
298
+ <thead class="bg-gray-50">
299
+ <tr>
300
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Patient</th>
301
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Dernière INR</th>
302
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Date</th>
303
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Statut</th>
304
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">Actions</th>
305
+ </tr>
306
+ </thead>
307
+ <tbody class="divide-y divide-gray-200">
308
+ <tr>
309
+ <td class="px-6 py-4">
310
+ <div>
311
+ <p class="font-medium text-gray-800">Jean Dupont</p>
312
+ <p class="text-sm text-gray-600">jean.dupont@email.com</p>
313
+ </div>
314
+ </td>
315
+ <td class="px-6 py-4">
316
+ <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
317
+ 2.5
318
+ </span>
319
+ </td>
320
+ <td class="px-6 py-4 text-sm text-gray-600">Aujourd'hui</td>
321
+ <td class="px-6 py-4">
322
+ <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
323
+ Stable
324
+ </span>
325
+ </td>
326
+ <td class="px-6 py-4">
327
+ <button class="text-blue-600 hover:text-blue-800">
328
+ <i data-lucide="eye" class="w-4 h-4"></i>
329
+ </button>
330
+ </td>
331
+ </tr>
332
+ </tbody>
333
+ </table>
334
+ </div>
335
+ </div>
336
+ </main>
337
+ </div>
338
+
339
+ <!-- Modals -->
340
+ <div id="inrModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50">
341
+ <div class="bg-white rounded-xl max-w-md w-full p-6">
342
+ <h3 class="text-lg font-semibold text-gray-800 mb-4">Enregistrer une INR</h3>
343
+ <form class="space-y-4">
344
+ <div>
345
+ <label class="block text-sm font-medium text-gray-700 mb-1">Valeur INR</label>
346
+ <input type="number" step="0.1" required class="w-full px-4 py-2 border border-gray-300 rounded-lg">
347
+ </div>
348
+ <div>
349
+ <label class="block text-sm font-medium text-gray-700 mb-1">Date</label>
350
+ <input type="date" required class="w-full px-4 py-2 border border-gray-300 rounded-lg">
351
+ </div>
352
+ <div class="flex space-x-3">
353
+ <button type="button" onclick="hideModal('inrModal')" class="flex-1 px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-50">Annuler</button>
354
+ <button type="submit" class="flex-1 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">Enregistrer</button>
355
+ </div>
356
+ </form>
357
+ </div>
358
+ </div>
359
+
360
+ <script>
361
+ // Initialize Lucide icons
362
+ lucide.createIcons();
363
+
364
+ // Global state
365
+ let currentRole = null;
366
+
367
+ // Navigation functions
368
+ function selectRole(role) {
369
+ currentRole = role;
370
+ document.getElementById('splashScreen').classList.add('hidden');
371
+ document.getElementById('authScreen').classList.remove('hidden');
372
+ document.getElementById('role').value = role;
373
+ document.getElementById('regRole').value = role;
374
+
375
+ if (role === 'medecin') {
376
+ document.getElementById('medecinFields').classList.remove('hidden');
377
+ document.getElementById('authSubtitle').textContent = 'Connexion Médecin';
378
+ } else {
379
+ document.getElementById('authSubtitle').textContent = 'Connexion Patient';
380
+ }
381
+ }
382
+
383
+ function toggleAuthMode(mode) {
384
+ const loginBtn = document.getElementById('loginBtn');
385
+ const registerBtn = document.getElementById('registerBtn');
386
+ const loginForm = document.getElementById('loginForm');
387
+ const registerForm = document.getElementById('registerForm');
388
+
389
+ if (mode === 'login') {
390
+ loginBtn.className = 'flex-1 py-2 rounded-md text-sm font-medium bg-white shadow-sm';
391
+ registerBtn.className = 'flex-1 py-2 rounded-md text-sm font-medium text-gray-500';
392
+ loginForm.classList.remove('hidden');
393
+ registerForm.classList.add('hidden');
394
+ } else {
395
+ loginBtn.className = 'flex-1 py-2 rounded-md text-sm font-medium text-gray-500';
396
+ registerBtn.className = 'flex-1 py-2 rounded-md text-sm font-medium bg-white shadow-sm';
397
+ loginForm.classList.add('hidden');
398
+ registerForm.classList.remove('hidden');
399
+ }
400
+ }
401
+
402
+ // Form submissions
403
+ document.getElementById('loginForm').addEventListener('submit', (e) => {
404
+ e.preventDefault();
405
+ if (currentRole === 'patient') {
406
+ document.getElementById('authScreen').classList.add('hidden');
407
+ document.getElementById('patientDashboard').classList.remove('hidden');
408
+ } else {
409
+ document.getElementById('authScreen').classList.add('hidden');
410
+ document.getElementById('medecinDashboard').classList.remove('hidden');
411
+ }
412
+ });
413
+
414
+ document.getElementById('registerForm').addEventListener('submit', (e) => {
415
+ e.preventDefault();
416
+ if (currentRole === 'patient') {
417
+ document.getElementById('authScreen').classList.add('hidden');
418
+ document.getElementById('patientDashboard').classList.remove('hidden');
419
+ } else {
420
+ document.getElementById('authScreen').classList.add('hidden');
421
+ document.getElementById('medecinDashboard').classList.remove('hidden');
422
+ }
423
+ });
424
+
425
+ // Modal functions
426
+ function showModal(modalId) {
427
+ document.getElementById(modalId).classList.remove('hidden');
428
+ }
429
+
430
+ function hideModal(modalId) {
431
+ document.getElementById(modalId).classList.add('hidden');
432
+ }
433
+
434
+ // Logout
435
+ function logout() {
436
+ document.getElementById('patientDashboard').classList.add('hidden');
437
+ document.getElementById('medecinDashboard').classList.add('hidden');
438
+ document.getElementById('splashScreen').classList.remove('hidden');
439
+ currentRole = null;
440
+ }
441
+
442
+ // Close modals on outside click
443
+ window.addEventListener('click', (e) => {
444
+ if (e.target.classList.contains('fixed') && e.target.classList.contains('bg-opacity-50')) {
445
+ e.target.classList.add('hidden');
446
+ }
447
+ });
448
+ </script>
449
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=willynabole/inrplus" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
450
+ </html>