Docfile commited on
Commit
b992777
·
verified ·
1 Parent(s): dd03160

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +151 -8
templates/index.html CHANGED
@@ -41,6 +41,89 @@
41
  border-radius: 0.25rem;
42
  font-family: ui-monospace, monospace;
43
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  @keyframes fadeIn {
45
  from { opacity: 0; }
46
  to { opacity: 1; }
@@ -48,6 +131,14 @@
48
  .animate-fade-in {
49
  animation: fadeIn 1s ease-out;
50
  }
 
 
 
 
 
 
 
 
51
  </style>
52
  </head>
53
  <body class="bg-gray-50 min-h-screen">
@@ -65,9 +156,10 @@
65
  <!-- Main Content -->
66
  <div class="grid md:grid-cols-2 gap-8">
67
  <!-- Upload Section -->
68
- <div class="bg-white rounded-xl shadow-lg p-6">
69
  <h2 class="text-2xl font-semibold text-primary mb-4">📷 Téléchargement d'images</h2>
70
  <div
 
71
  class="upload-zone border-2 border-dashed border-primary rounded-lg p-8 text-center cursor-pointer hover:bg-gray-50 transition-colors"
72
  onclick="document.getElementById('image-upload').click()">
73
  <input type="file" id="image-upload" multiple accept="image/*" class="hidden">
@@ -82,7 +174,11 @@
82
  </div>
83
 
84
  <!-- Bouton de soumission (seulement) -->
85
- <div class="bg-white rounded-xl shadow-lg p-6 flex flex-col justify-center">
 
 
 
 
86
  <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">
87
  🚀 Soumettre
88
  </button>
@@ -90,7 +186,7 @@
90
  </div>
91
 
92
  <!-- Résultats -->
93
- <div id="results" class="mt-12 bg-white rounded-xl shadow-lg p-6 hidden">
94
  <h2 class="text-2xl font-semibold text-primary mb-4">📝 Résultat de l'analyse</h2>
95
  <div id="analysis-result" class="markdown-content prose max-w-none"></div>
96
  </div>
@@ -109,12 +205,44 @@
109
  const submitBtn = document.getElementById('submit-btn');
110
  const resultsSection = document.getElementById('results');
111
  const analysisResult = document.getElementById('analysis-result');
 
112
 
113
  let uploadedFiles = [];
114
 
 
 
 
 
 
 
 
 
 
 
 
115
  imageUpload.addEventListener('change', handleFileSelect);
116
  submitBtn.addEventListener('click', handleSubmit);
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  function handleFileSelect(event) {
119
  uploadedFiles = Array.from(event.target.files);
120
  updatePreview();
@@ -126,12 +254,13 @@
126
  const preview = document.createElement('div');
127
  preview.className = 'relative';
128
  preview.innerHTML = `
129
- <img src="${URL.createObjectURL(file)}" alt="Preview" class="w-full h-32 object-cover rounded-lg">
130
- <button onclick="removeImage(${index})" class="absolute top-2 right-2 bg-red-500 text-white rounded-full p-1 hover:bg-red-600">
131
  <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
132
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
133
  </svg>
134
  </button>
 
135
  `;
136
  previewContainer.appendChild(preview);
137
  });
@@ -168,9 +297,23 @@
168
  throw new Error(data.error);
169
  }
170
 
 
 
 
 
 
 
 
 
 
171
  resultsSection.classList.remove('hidden');
172
- analysisResult.innerHTML = marked.parse(data.result);
173
- resultsSection.scrollIntoView({ behavior: 'smooth' });
 
 
 
 
 
174
  } catch (error) {
175
  alert('Erreur lors de l\'analyse: ' + error.message);
176
  } finally {
@@ -183,4 +326,4 @@
183
  });
184
  </script>
185
  </body>
186
- </html>
 
41
  border-radius: 0.25rem;
42
  font-family: ui-monospace, monospace;
43
  }
44
+ /* Amélioration pour les paragraphes et espaces */
45
+ .markdown-content p {
46
+ margin-bottom: 1rem;
47
+ line-height: 1.7;
48
+ white-space: pre-line;
49
+ }
50
+ /* Styles pour les titres */
51
+ .markdown-content h1 {
52
+ font-size: 1.8rem;
53
+ font-weight: bold;
54
+ margin-top: 1.5rem;
55
+ margin-bottom: 1rem;
56
+ padding-bottom: 0.5rem;
57
+ border-bottom: 1px solid #e2e8f0;
58
+ color: #2d3748;
59
+ }
60
+ .markdown-content h2 {
61
+ font-size: 1.5rem;
62
+ font-weight: bold;
63
+ margin-top: 1.25rem;
64
+ margin-bottom: 0.75rem;
65
+ color: #2d3748;
66
+ }
67
+ .markdown-content h3 {
68
+ font-size: 1.25rem;
69
+ font-weight: bold;
70
+ margin-top: 1rem;
71
+ margin-bottom: 0.5rem;
72
+ color: #2d3748;
73
+ }
74
+ /* Styles pour les listes */
75
+ .markdown-content ul, .markdown-content ol {
76
+ margin-left: 1.5rem;
77
+ margin-bottom: 1rem;
78
+ padding-left: 1rem;
79
+ }
80
+ .markdown-content li {
81
+ margin-bottom: 0.5rem;
82
+ }
83
+ .markdown-content ul {
84
+ list-style-type: disc;
85
+ }
86
+ .markdown-content ol {
87
+ list-style-type: decimal;
88
+ }
89
+ /* Styles pour les citations */
90
+ .markdown-content blockquote {
91
+ border-left: 4px solid #4CAF50;
92
+ padding: 0.5rem 1rem;
93
+ margin: 1rem 0;
94
+ background-color: #f8f9fa;
95
+ font-style: italic;
96
+ color: #4a5568;
97
+ }
98
+ /* Styles pour les tableaux */
99
+ .markdown-content table {
100
+ border-collapse: collapse;
101
+ width: 100%;
102
+ margin: 1rem 0;
103
+ }
104
+ .markdown-content th,
105
+ .markdown-content td {
106
+ padding: 0.5rem;
107
+ border: 1px solid #e2e8f0;
108
+ }
109
+ .markdown-content th {
110
+ background-color: #f8f9fa;
111
+ font-weight: bold;
112
+ }
113
+ /* Styles pour les séparateurs */
114
+ .markdown-content hr {
115
+ margin: 1.5rem 0;
116
+ border: 0;
117
+ border-top: 1px solid #e2e8f0;
118
+ }
119
+ /* Style pour les liens */
120
+ .markdown-content a {
121
+ color: #4CAF50;
122
+ text-decoration: underline;
123
+ }
124
+ .markdown-content a:hover {
125
+ text-decoration: none;
126
+ }
127
  @keyframes fadeIn {
128
  from { opacity: 0; }
129
  to { opacity: 1; }
 
131
  .animate-fade-in {
132
  animation: fadeIn 1s ease-out;
133
  }
134
+ /* Style pour le conteneur des résultats */
135
+ #results {
136
+ transition: all 0.3s ease;
137
+ }
138
+ /* Ombres plus marquées pour les cartes */
139
+ .card-shadow {
140
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.1);
141
+ }
142
  </style>
143
  </head>
144
  <body class="bg-gray-50 min-h-screen">
 
156
  <!-- Main Content -->
157
  <div class="grid md:grid-cols-2 gap-8">
158
  <!-- Upload Section -->
159
+ <div class="bg-white rounded-xl shadow-lg p-6 card-shadow">
160
  <h2 class="text-2xl font-semibold text-primary mb-4">📷 Téléchargement d'images</h2>
161
  <div
162
+ id="upload-zone"
163
  class="upload-zone border-2 border-dashed border-primary rounded-lg p-8 text-center cursor-pointer hover:bg-gray-50 transition-colors"
164
  onclick="document.getElementById('image-upload').click()">
165
  <input type="file" id="image-upload" multiple accept="image/*" class="hidden">
 
174
  </div>
175
 
176
  <!-- Bouton de soumission (seulement) -->
177
+ <div class="bg-white rounded-xl shadow-lg p-6 flex flex-col justify-center card-shadow">
178
+ <h2 class="text-2xl font-semibold text-primary mb-4">🧠 Analyse Philosophique</h2>
179
+ <p class="text-gray-600 mb-6">
180
+ Cette analyse vous fournira une réflexion philosophique approfondie basée sur le(s) document(s) téléchargé(s).
181
+ </p>
182
  <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">
183
  🚀 Soumettre
184
  </button>
 
186
  </div>
187
 
188
  <!-- Résultats -->
189
+ <div id="results" class="mt-12 bg-white rounded-xl shadow-lg p-6 hidden animate-fade-in card-shadow">
190
  <h2 class="text-2xl font-semibold text-primary mb-4">📝 Résultat de l'analyse</h2>
191
  <div id="analysis-result" class="markdown-content prose max-w-none"></div>
192
  </div>
 
205
  const submitBtn = document.getElementById('submit-btn');
206
  const resultsSection = document.getElementById('results');
207
  const analysisResult = document.getElementById('analysis-result');
208
+ const uploadZone = document.getElementById('upload-zone');
209
 
210
  let uploadedFiles = [];
211
 
212
+ // Configuration de marked pour mieux gérer les espaces et retours à la ligne
213
+ marked.setOptions({
214
+ breaks: true, // Convertit les retours à la ligne en <br>
215
+ gfm: true, // GitHub Flavored Markdown
216
+ headerIds: true, // Ajoute des IDs aux en-têtes
217
+ mangle: false, // Pas de mangling des caractères spéciaux
218
+ smartLists: true, // Meilleur rendu des listes
219
+ smartypants: true, // Transforme les quotes, tirets etc.
220
+ xhtml: true // Utilise la syntaxe XHTML
221
+ });
222
+
223
  imageUpload.addEventListener('change', handleFileSelect);
224
  submitBtn.addEventListener('click', handleSubmit);
225
 
226
+ // Support pour le drag and drop
227
+ uploadZone.addEventListener('dragover', (e) => {
228
+ e.preventDefault();
229
+ uploadZone.classList.add('bg-gray-50');
230
+ });
231
+
232
+ uploadZone.addEventListener('dragleave', () => {
233
+ uploadZone.classList.remove('bg-gray-50');
234
+ });
235
+
236
+ uploadZone.addEventListener('drop', (e) => {
237
+ e.preventDefault();
238
+ uploadZone.classList.remove('bg-gray-50');
239
+ const files = Array.from(e.dataTransfer.files).filter(file => file.type.startsWith('image/'));
240
+ if (files.length > 0) {
241
+ uploadedFiles = files;
242
+ updatePreview();
243
+ }
244
+ });
245
+
246
  function handleFileSelect(event) {
247
  uploadedFiles = Array.from(event.target.files);
248
  updatePreview();
 
254
  const preview = document.createElement('div');
255
  preview.className = 'relative';
256
  preview.innerHTML = `
257
+ <img src="${URL.createObjectURL(file)}" alt="Preview" class="w-full h-32 object-cover rounded-lg shadow-md">
258
+ <button onclick="removeImage(${index})" class="absolute top-2 right-2 bg-red-500 text-white rounded-full p-1 hover:bg-red-600 shadow-sm transition-all transform hover:scale-110">
259
  <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
260
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
261
  </svg>
262
  </button>
263
+ <div class="mt-1 text-sm text-gray-600 truncate">${file.name}</div>
264
  `;
265
  previewContainer.appendChild(preview);
266
  });
 
297
  throw new Error(data.error);
298
  }
299
 
300
+ // Préparation des données Markdown pour un meilleur rendu
301
+ let markdownContent = data.result;
302
+
303
+ // Assurer que les doubles retours à la ligne sont bien rendus
304
+ markdownContent = markdownContent.replace(/\n\n/g, '\n&nbsp;\n');
305
+
306
+ // Préserver les espaces multiples
307
+ markdownContent = markdownContent.replace(/ +/g, match => '&nbsp;'.repeat(match.length));
308
+
309
  resultsSection.classList.remove('hidden');
310
+ analysisResult.innerHTML = marked.parse(markdownContent);
311
+
312
+ // Animation douce pour le scroll
313
+ resultsSection.scrollIntoView({
314
+ behavior: 'smooth',
315
+ block: 'start'
316
+ });
317
  } catch (error) {
318
  alert('Erreur lors de l\'analyse: ' + error.message);
319
  } finally {
 
326
  });
327
  </script>
328
  </body>
329
+ </html>