Docfile commited on
Commit
2480afe
·
verified ·
1 Parent(s): c62db4e

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +205 -193
templates/index.html CHANGED
@@ -1,207 +1,219 @@
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>Mariam Anglais</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
- <script>
10
- tailwind.config = {
11
- theme: {
12
- extend: {
13
- colors: {
14
- primary: '#4CAF50',
15
- 'primary-dark': '#3e8e41',
16
- }
17
- }
18
- }
19
  }
20
- </script>
21
- <style>
22
- .markdown-content {
23
- width: 100%;
24
- overflow-wrap: break-word;
25
- word-wrap: break-word;
26
- word-break: break-word;
27
- hyphens: auto;
28
- }
29
-
30
- .markdown-content pre {
31
- white-space: pre-wrap;
32
- word-wrap: break-word;
33
- padding: 1rem;
34
- background-color: #f3f4f6;
35
- border-radius: 0.5rem;
36
- margin: 1rem 0;
37
- overflow-x: auto;
38
- }
39
-
40
- .markdown-content code {
41
- background-color: #f3f4f6;
42
- padding: 0.2rem 0.4rem;
43
- border-radius: 0.25rem;
44
- font-family: ui-monospace, monospace;
45
- }
46
-
47
- @keyframes fadeIn {
48
- from { opacity: 0; }
49
- to { opacity: 1; }
50
- }
51
-
52
- .animate-fade-in {
53
- animation: fadeIn 1s ease-out;
54
- }
55
- </style>
 
 
56
  </head>
57
  <body class="bg-gray-50 min-h-screen">
58
- <div class="container mx-auto px-4 py-8 max-w-6xl">
59
- <!-- Header -->
60
- <header class="text-center mb-12 animate-fade-in">
61
- <h1 class="text-5xl font-bold text-primary mb-4">
62
- ✨ Mariam Anglais ✨
63
- </h1>
64
- <p class="text-gray-600 text-lg">
65
- Bienvenue ! Téléchargez vos images, choisissez votre type d'analyse, et laissez la magie opérer.
66
- </p>
67
- </header>
68
-
69
- <!-- Main Content -->
70
- <div class="grid md:grid-cols-2 gap-8">
71
- <!-- Upload Section -->
72
- <div class="bg-white rounded-xl shadow-lg p-6">
73
- <h2 class="text-2xl font-semibold text-primary mb-4">📷 Téléchargement d'images</h2>
74
- <div
75
- class="upload-zone border-2 border-dashed border-primary rounded-lg p-8 text-center cursor-pointer hover:bg-gray-50 transition-colors"
76
- onclick="document.getElementById('image-upload').click()">
77
- <input type="file" id="image-upload" multiple accept="image/*" class="hidden">
78
- <div class="flex flex-col items-center">
79
- <svg class="h-12 w-12 text-primary mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
80
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path>
81
- </svg>
82
- <span class="text-gray-600">Cliquez ou glissez vos images ici</span>
83
- </div>
84
- </div>
85
- <div id="preview-container" class="mt-4 grid grid-cols-2 gap-4"></div>
 
 
 
 
 
 
 
 
 
 
 
86
  </div>
87
-
88
- <!-- Analysis Type Section -->
89
- <div class="bg-white rounded-xl shadow-lg p-6">
90
- <h2 class="text-2xl font-semibold text-primary mb-4">🎛️ Choix du type d'analyse</h2>
91
- <div class="space-y-4">
92
- <label class="flex items-center p-4 rounded-lg border border-gray-200 cursor-pointer hover:bg-gray-50 transition-colors">
93
- <input type="radio" name="analysis_type" value="text" class="h-4 w-4 text-primary">
94
- <span class="ml-3">🔍 Type 1: Analyse de Texte</span>
95
- </label>
96
- <label class="flex items-center p-4 rounded-lg border border-gray-200 cursor-pointer hover:bg-gray-50 transition-colors">
97
- <input type="radio" name="analysis_type" value="icon" class="h-4 w-4 text-primary">
98
- <span class="ml-3">🧠 Type 2: Document iconographique</span>
99
- </label>
100
- </div>
101
- <button id="submit-btn" class="w-full mt-6 bg-primary hover:bg-primary-dark text-white font-bold py-3 px-6 rounded-lg transition-all transform hover:-translate-y-1 hover:shadow-lg disabled:opacity-50 disabled:cursor-not-allowed">
102
- 🚀 Soumettre
103
- </button>
104
  </div>
 
 
 
 
105
  </div>
 
 
 
 
 
106
 
107
- <!-- Results Section -->
108
- <div id="results" class="mt-12 bg-white rounded-xl shadow-lg p-6 hidden">
109
- <h2 class="text-2xl font-semibold text-primary mb-4">📝 Résultat de l'analyse</h2>
110
- <div id="analysis-result" class="markdown-content prose max-w-none"></div>
111
- </div>
112
-
113
- <!-- Footer -->
114
- <footer class="mt-12 text-center text-gray-600">
115
- <hr class="my-4">
116
- <p>© 2025 Mariam AI - Tous droits réservés.</p>
117
- </footer>
118
  </div>
119
 
120
- <script>
121
- document.addEventListener('DOMContentLoaded', () => {
122
- const imageUpload = document.getElementById('image-upload');
123
- const previewContainer = document.getElementById('preview-container');
124
- const submitBtn = document.getElementById('submit-btn');
125
- const resultsSection = document.getElementById('results');
126
- const analysisResult = document.getElementById('analysis-result');
127
-
128
- let uploadedFiles = [];
129
-
130
- imageUpload.addEventListener('change', handleFileSelect);
131
- submitBtn.addEventListener('click', handleSubmit);
132
-
133
- function handleFileSelect(event) {
134
- uploadedFiles = Array.from(event.target.files);
135
- updatePreview();
136
- }
137
-
138
- function updatePreview() {
139
- previewContainer.innerHTML = '';
140
- uploadedFiles.forEach((file, index) => {
141
- const preview = document.createElement('div');
142
- preview.className = 'relative';
143
- preview.innerHTML = `
144
- <img src="${URL.createObjectURL(file)}" alt="Preview" class="w-full h-32 object-cover rounded-lg">
145
- <button onclick="removeImage(${index})" class="absolute top-2 right-2 bg-red-500 text-white rounded-full p-1 hover:bg-red-600">
146
- <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
147
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
148
- </svg>
149
- </button>
150
- `;
151
- previewContainer.appendChild(preview);
152
- });
153
- submitBtn.disabled = uploadedFiles.length === 0;
154
- }
155
-
156
- function removeImage(index) {
157
- uploadedFiles.splice(index, 1);
158
- updatePreview();
159
- }
160
-
161
- async function handleSubmit() {
162
- if (uploadedFiles.length === 0) {
163
- alert('Veuillez sélectionner au moins une image.');
164
- return;
165
- }
166
-
167
- const analysisType = document.querySelector('input[name="analysis_type"]:checked')?.value;
168
- if (!analysisType) {
169
- alert('Veuillez sélectionner un type d\'analyse.');
170
- return;
171
- }
172
-
173
- const formData = new FormData();
174
- formData.append('analysis_type', analysisType);
175
- uploadedFiles.forEach(file => formData.append('images', file));
176
-
177
- submitBtn.disabled = true;
178
- submitBtn.innerHTML = '<span class="animate-pulse">Analyse en cours...</span>';
179
-
180
- try {
181
- const response = await fetch('/analyze', {
182
- method: 'POST',
183
- body: formData
184
- });
185
-
186
- const data = await response.json();
187
-
188
- if (data.error) {
189
- throw new Error(data.error);
190
- }
191
-
192
- resultsSection.classList.remove('hidden');
193
- analysisResult.innerHTML = marked.parse(data.result);
194
- resultsSection.scrollIntoView({ behavior: 'smooth' });
195
- } catch (error) {
196
- alert('Erreur lors de l\'analyse: ' + error.message);
197
- } finally {
198
- submitBtn.disabled = false;
199
- submitBtn.innerHTML = '🚀 Soumettre';
200
- }
201
- }
202
-
203
- window.removeImage = removeImage;
204
  });
205
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  </body>
207
- </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>Mariam Anglais</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
+ <script>
10
+ tailwind.config = {
11
+ theme: {
12
+ extend: {
13
+ colors: {
14
+ primary: '#4CAF50',
15
+ 'primary-dark': '#3e8e41',
16
+ }
 
 
17
  }
18
+ }
19
+ }
20
+ </script>
21
+ <style>
22
+ .markdown-content {
23
+ width: 100%;
24
+ overflow-wrap: break-word;
25
+ word-wrap: break-word;
26
+ word-break: break-word;
27
+ hyphens: auto;
28
+ }
29
+
30
+ .markdown-content pre {
31
+ white-space: pre-wrap;
32
+ word-wrap: break-word;
33
+ padding: 1rem;
34
+ background-color: #f3f4f6;
35
+ border-radius: 0.5rem;
36
+ margin: 1rem 0;
37
+ overflow-x: auto;
38
+ }
39
+
40
+ .markdown-content code {
41
+ background-color: #f3f4f6;
42
+ padding: 0.2rem 0.4rem;
43
+ border-radius: 0.25rem;
44
+ font-family: ui-monospace, monospace;
45
+ }
46
+
47
+ @keyframes fadeIn {
48
+ from { opacity: 0; }
49
+ to { opacity: 1; }
50
+ }
51
+
52
+ .animate-fade-in {
53
+ animation: fadeIn 1s ease-out;
54
+ }
55
+ </style>
56
  </head>
57
  <body class="bg-gray-50 min-h-screen">
58
+ <div class="container mx-auto px-4 py-8 max-w-6xl">
59
+ <!-- Header -->
60
+ <header class="text-center mb-12 animate-fade-in">
61
+ <h1 class="text-5xl font-bold text-primary mb-4">
62
+ ✨ Mariam Anglais ✨
63
+ </h1>
64
+ <p class="text-gray-600 text-lg">
65
+ Bienvenue ! Téléchargez vos images, choisissez votre type d'analyse, et laissez la magie opérer.
66
+ </p>
67
+ </header>
68
+
69
+ <!-- Main Content -->
70
+ <div class="grid md:grid-cols-2 gap-8">
71
+ <!-- Upload Section -->
72
+ <div class="bg-white rounded-xl shadow-lg p-6">
73
+ <h2 class="text-2xl font-semibold text-primary mb-4">📷 Téléchargement d'images</h2>
74
+ <div
75
+ class="upload-zone border-2 border-dashed border-primary rounded-lg p-8 text-center cursor-pointer hover:bg-gray-50 transition-colors"
76
+ onclick="document.getElementById('image-upload').click()">
77
+ <input type="file" id="image-upload" multiple accept="image/*" class="hidden">
78
+ <div class="flex flex-col items-center">
79
+ <svg class="h-12 w-12 text-primary mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
80
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path>
81
+ </svg>
82
+ <span class="text-gray-600">Cliquez ou glissez vos images ici</span>
83
+ </div>
84
+ </div>
85
+ <div id="preview-container" class="mt-4 grid grid-cols-2 gap-4"></div>
86
+ </div>
87
+
88
+ <!-- Analysis Type Section -->
89
+ <div class="bg-white rounded-xl shadow-lg p-6">
90
+ <h2 class="text-2xl font-semibold text-primary mb-4">🎛️ Choix du type d'analyse</h2>
91
+ <div class="space-y-4">
92
+ <!-- Option Analyse de Texte -->
93
+ <label class="flex flex-col p-4 rounded-lg border border-gray-200 cursor-pointer hover:bg-gray-50 transition-colors">
94
+ <div class="flex items-center">
95
+ <input type="radio" name="analysis_type" value="text" class="h-4 w-4 text-primary">
96
+ <span class="ml-3 font-medium">🔍 Analyse de Texte</span>
97
  </div>
98
+ <p class="text-gray-500 text-sm ml-7 mt-1">
99
+ Il s'agit ici de l'analyse de texte avec (INTRODUCTION, SUMMARY, COMMENTARY, EVALUATION).
100
+ </p>
101
+ </label>
102
+ <!-- Option Document iconographique -->
103
+ <label class="flex flex-col p-4 rounded-lg border border-gray-200 cursor-pointer hover:bg-gray-50 transition-colors">
104
+ <div class="flex items-center">
105
+ <input type="radio" name="analysis_type" value="icon" class="h-4 w-4 text-primary">
106
+ <span class="ml-3 font-medium">🧠 Document iconographique</span>
 
 
 
 
 
 
 
 
107
  </div>
108
+ <p class="text-gray-500 text-sm ml-7 mt-1">
109
+ Il s'agit ici du document iconographique.
110
+ </p>
111
+ </label>
112
  </div>
113
+ <button id="submit-btn" class="w-full mt-6 bg-primary hover:bg-primary-dark text-white font-bold py-3 px-6 rounded-lg transition-all transform hover:-translate-y-1 hover:shadow-lg disabled:opacity-50 disabled:cursor-not-allowed">
114
+ 🚀 Soumettre
115
+ </button>
116
+ </div>
117
+ </div>
118
 
119
+ <!-- Results Section -->
120
+ <div id="results" class="mt-12 bg-white rounded-xl shadow-lg p-6 hidden animate-fade-in">
121
+ <h2 class="text-2xl font-semibold text-primary mb-4">📝 Résultat de l'analyse</h2>
122
+ <div id="analysis-result" class="markdown-content prose max-w-none"></div>
 
 
 
 
 
 
 
123
  </div>
124
 
125
+ <!-- Footer -->
126
+ <footer class="mt-12 text-center text-gray-600">
127
+ <hr class="my-4">
128
+ <p>© 2025 Mariam AI - Tous droits réservés.</p>
129
+ </footer>
130
+ </div>
131
+
132
+ <script>
133
+ document.addEventListener('DOMContentLoaded', () => {
134
+ const imageUpload = document.getElementById('image-upload');
135
+ const previewContainer = document.getElementById('preview-container');
136
+ const submitBtn = document.getElementById('submit-btn');
137
+ const resultsSection = document.getElementById('results');
138
+ const analysisResult = document.getElementById('analysis-result');
139
+
140
+ let uploadedFiles = [];
141
+
142
+ imageUpload.addEventListener('change', handleFileSelect);
143
+ submitBtn.addEventListener('click', handleSubmit);
144
+
145
+ function handleFileSelect(event) {
146
+ uploadedFiles = Array.from(event.target.files);
147
+ updatePreview();
148
+ }
149
+
150
+ function updatePreview() {
151
+ previewContainer.innerHTML = '';
152
+ uploadedFiles.forEach((file, index) => {
153
+ const preview = document.createElement('div');
154
+ preview.className = 'relative';
155
+ preview.innerHTML = `
156
+ <img src="${URL.createObjectURL(file)}" alt="Preview" class="w-full h-32 object-cover rounded-lg">
157
+ <button onclick="removeImage(${index})" class="absolute top-2 right-2 bg-red-500 text-white rounded-full p-1 hover:bg-red-600">
158
+ <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
159
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
160
+ </svg>
161
+ </button>
162
+ `;
163
+ previewContainer.appendChild(preview);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  });
165
+ submitBtn.disabled = uploadedFiles.length === 0;
166
+ }
167
+
168
+ function removeImage(index) {
169
+ uploadedFiles.splice(index, 1);
170
+ updatePreview();
171
+ }
172
+
173
+ async function handleSubmit() {
174
+ if (uploadedFiles.length === 0) {
175
+ alert('Veuillez sélectionner au moins une image.');
176
+ return;
177
+ }
178
+
179
+ const analysisType = document.querySelector('input[name="analysis_type"]:checked')?.value;
180
+ if (!analysisType) {
181
+ alert('Veuillez sélectionner un type d\'analyse.');
182
+ return;
183
+ }
184
+
185
+ const formData = new FormData();
186
+ formData.append('analysis_type', analysisType);
187
+ uploadedFiles.forEach(file => formData.append('images', file));
188
+
189
+ submitBtn.disabled = true;
190
+ submitBtn.innerHTML = '<span class="animate-pulse">Analyse en cours...</span>';
191
+
192
+ try {
193
+ const response = await fetch('/analyze', {
194
+ method: 'POST',
195
+ body: formData
196
+ });
197
+
198
+ const data = await response.json();
199
+
200
+ if (data.error) {
201
+ throw new Error(data.error);
202
+ }
203
+
204
+ resultsSection.classList.remove('hidden');
205
+ analysisResult.innerHTML = marked.parse(data.result);
206
+ resultsSection.scrollIntoView({ behavior: 'smooth' });
207
+ } catch (error) {
208
+ alert('Erreur lors de l\'analyse: ' + error.message);
209
+ } finally {
210
+ submitBtn.disabled = false;
211
+ submitBtn.innerHTML = '🚀 Soumettre';
212
+ }
213
+ }
214
+
215
+ window.removeImage = removeImage;
216
+ });
217
+ </script>
218
  </body>
219
+ </html>