Docfile commited on
Commit
92f5ebe
·
verified ·
1 Parent(s): e8e81cb

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +119 -60
templates/index.html CHANGED
@@ -4,66 +4,116 @@
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Générateur de contenu avec Gemini et RDKit</title>
7
- <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js" async></script>
8
- <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
  <script src="https://cdn.tailwindcss.com"></script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  </head>
11
- <body class="bg-gray-100 text-gray-900">
12
- <div class="container mx-auto p-6">
13
- <h1 class="text-3xl font-bold mb-4">Générateur de contenu avec Gemini et RDKit</h1>
14
- <form method="POST" enctype="multipart/form-data" onsubmit="showLoader()">
15
- <div class="mb-4">
16
- <label for="image" class="block text-sm font-medium text-gray-700">Image :</label>
17
- <input type="file" name="image" id="image" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
18
- </div>
19
- <div class="mb-4">
20
- <label for="text_input" class="block text-sm font-medium text-gray-700">Texte (Markdown ou LaTeX) :</label>
21
- <textarea name="text_input" id="text_input" rows="5" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="Écrivez ici en Markdown ou LaTeX..."></textarea>
22
- </div>
23
- <button type="submit" class="bg-indigo-600 text-white px-4 py-2 rounded hover:bg-indigo-700">Générer</button>
24
- </form>
25
 
26
- <div class="loader mt-6 hidden" id="loader">
27
- <svg class="animate-spin h-8 w-8 text-indigo-600 mx-auto" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
28
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
29
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8v8H4z"></path>
30
- </svg>
31
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
- {% if generated_content %}
34
- <div class="mt-8 grid md:grid-cols-3 gap-6">
35
- <!-- Contenu généré -->
36
- <div class="md:col-span-2 bg-white shadow-md rounded-md p-6">
37
- <h2 class="text-2xl font-semibold mb-4">Contenu généré :</h2>
38
- <div id="renderedContent" class="prose max-w-none"></div>
39
- <script>
40
- document.getElementById('renderedContent').innerHTML = marked(`{{ generated_content | safe }}`);
41
- MathJax.typesetPromise();
42
- </script>
 
 
43
  </div>
44
 
45
- <!-- Structures chimiques -->
46
- <div class="bg-white shadow-md rounded-md p-6">
47
- <h2 class="text-2xl font-semibold mb-4">Structures chimiques :</h2>
48
- <div class="space-y-4">
49
- {% for image_path in image_paths %}
50
- <div class="relative group">
51
- <img src="{{ image_path }}" alt="Structure Chimique" class="w-full h-auto rounded-md border border-gray-200 transform transition duration-200 group-hover:scale-105">
52
- <button onclick="toggleZoomModal('{{ image_path }}')" class="absolute top-2 right-2 bg-gray-900 text-white text-xs px-2 py-1 rounded">Zoom</button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  </div>
54
- {% endfor %}
55
  </div>
56
  </div>
57
- </div>
58
 
59
- <!-- Modal pour zoom -->
60
- <div id="zoomModal" class="fixed inset-0 bg-black bg-opacity-75 hidden z-50 flex items-center justify-center">
61
- <div class="relative">
62
- <img id="zoomedImage" src="" class="max-w-full max-h-screen rounded shadow-lg">
63
- <button onclick="closeZoomModal()" class="absolute top-2 right-2 bg-gray-900 text-white text-lg px-3 py-1 rounded">&times;</button>
 
 
 
 
 
 
 
 
 
 
64
  </div>
65
  </div>
66
- {% endif %}
67
  </div>
68
 
69
  <script>
@@ -71,25 +121,34 @@
71
  document.getElementById('loader').classList.remove('hidden');
72
  }
73
 
74
- function toggleZoomModal(imagePath) {
75
- const modal = document.getElementById('zoomModal');
76
- const zoomedImage = document.getElementById('zoomedImage');
77
- zoomedImage.src = imagePath;
78
  modal.classList.remove('hidden');
 
79
  }
80
 
81
- function closeZoomModal() {
82
- const modal = document.getElementById('zoomModal');
83
- modal.classList.add('hidden');
84
  }
85
 
86
- // Fermer le modal en cliquant à l'extérieur de l'image
87
- window.addEventListener('click', function(event) {
88
- const modal = document.getElementById('zoomModal');
89
- if (event.target === modal) {
90
- modal.classList.add('hidden');
91
  }
92
  });
 
 
 
 
 
 
 
 
 
93
  </script>
94
  </body>
95
  </html>
 
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Générateur de contenu avec Gemini et RDKit</title>
 
 
7
  <script src="https://cdn.tailwindcss.com"></script>
8
+ <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>
9
+ <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css">
11
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/marked.min.js"></script>
12
+ <style>
13
+ @keyframes spin {
14
+ to { transform: rotate(360deg); }
15
+ }
16
+ .zoom-transition {
17
+ transition: transform 0.3s ease-in-out;
18
+ }
19
+ .modal-backdrop {
20
+ background-color: rgba(0, 0, 0, 0.75);
21
+ backdrop-filter: blur(5px);
22
+ }
23
+ </style>
24
  </head>
25
+ <body class="bg-gray-50">
26
+ <div class="min-h-screen p-4 md:p-8">
27
+ <div class="max-w-7xl mx-auto">
28
+ <h1 class="text-3xl md:text-4xl font-bold text-gray-800 mb-8">
29
+ Générateur de contenu avec Gemini et RDKit
30
+ </h1>
 
 
 
 
 
 
 
 
31
 
32
+ <form method="POST" enctype="multipart/form-data" onsubmit="showLoader()"
33
+ class="bg-white rounded-lg shadow-lg p-6 mb-8">
34
+ <div class="space-y-6">
35
+ <div>
36
+ <label for="image" class="block text-sm font-medium text-gray-700 mb-2">
37
+ Image
38
+ </label>
39
+ <input type="file" name="image" id="image"
40
+ class="block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4
41
+ file:rounded-md file:border-0 file:text-sm file:font-semibold
42
+ file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100">
43
+ </div>
44
+
45
+ <div>
46
+ <label for="text_input" class="block text-sm font-medium text-gray-700 mb-2">
47
+ Texte (supporte Markdown et LaTeX)
48
+ </label>
49
+ <textarea name="text_input" id="text_input" rows="4"
50
+ class="mt-1 block w-full rounded-md border-gray-300 shadow-sm
51
+ focus:border-blue-500 focus:ring-blue-500"></textarea>
52
+ </div>
53
 
54
+ <button type="submit"
55
+ class="w-full md:w-auto px-6 py-3 bg-blue-600 text-white font-medium
56
+ rounded-lg hover:bg-blue-700 focus:outline-none focus:ring-2
57
+ focus:ring-blue-500 focus:ring-offset-2 transition-colors">
58
+ Générer
59
+ </button>
60
+ </div>
61
+ </form>
62
+
63
+ <div id="loader" class="hidden">
64
+ <div class="w-10 h-10 border-4 border-blue-500 border-t-transparent rounded-full
65
+ mx-auto animate-spin"></div>
66
  </div>
67
 
68
+ {% if generated_content %}
69
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
70
+ <div class="md:col-span-2">
71
+ <h2 class="text-xl font-semibold text-gray-800 mb-4">Contenu généré</h2>
72
+ <div class="bg-white rounded-lg shadow-lg p-6 prose max-w-none">
73
+ {{ generated_content | safe }}
74
+ </div>
75
+ </div>
76
+
77
+ <div>
78
+ <h2 class="text-xl font-semibold text-gray-800 mb-4">Structures chimiques</h2>
79
+ <div class="space-y-4">
80
+ {% for image_path in image_paths %}
81
+ <div class="relative bg-white rounded-lg shadow-lg p-4">
82
+ <img src="{{ image_path }}" alt="Structure Chimique"
83
+ class="w-full h-auto rounded zoom-transition cursor-pointer"
84
+ onclick="openModal(this.src)">
85
+ <button onclick="openModal('{{ image_path }}')"
86
+ class="absolute top-2 right-2 bg-white/90 p-2 rounded-full shadow
87
+ hover:bg-gray-100 transition-colors">
88
+ <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
89
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
90
+ d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
91
+ </svg>
92
+ </button>
93
+ </div>
94
+ {% endfor %}
95
  </div>
 
96
  </div>
97
  </div>
98
+ {% endif %}
99
 
100
+ <!-- Modal -->
101
+ <div id="imageModal"
102
+ class="fixed inset-0 hidden modal-backdrop z-50 flex items-center justify-center p-4">
103
+ <div class="relative max-w-4xl w-full">
104
+ <button onclick="closeModal()"
105
+ class="absolute -top-12 right-0 text-white hover:text-gray-300
106
+ transition-colors">
107
+ <svg class="w-8 h-8" fill="none" stroke="currentColor" viewBox="0 0 24 24">
108
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
109
+ d="M6 18L18 6M6 6l12 12" />
110
+ </svg>
111
+ </button>
112
+ <img id="modalImage" src="" alt="Image zoomée"
113
+ class="w-full h-auto rounded-lg">
114
+ </div>
115
  </div>
116
  </div>
 
117
  </div>
118
 
119
  <script>
 
121
  document.getElementById('loader').classList.remove('hidden');
122
  }
123
 
124
+ function openModal(imageSrc) {
125
+ const modal = document.getElementById('imageModal');
126
+ const modalImage = document.getElementById('modalImage');
127
+ modalImage.src = imageSrc;
128
  modal.classList.remove('hidden');
129
+ document.body.style.overflow = 'hidden';
130
  }
131
 
132
+ function closeModal() {
133
+ document.getElementById('imageModal').classList.add('hidden');
134
+ document.body.style.overflow = 'auto';
135
  }
136
 
137
+ // Fermer le modal en cliquant en dehors de l'image
138
+ document.getElementById('imageModal').addEventListener('click', function(e) {
139
+ if (e.target === this) {
140
+ closeModal();
 
141
  }
142
  });
143
+
144
+ // Support pour Markdown et LaTeX
145
+ document.addEventListener('DOMContentLoaded', function() {
146
+ marked.setOptions({
147
+ breaks: true,
148
+ gfm: true,
149
+ math: true
150
+ });
151
+ });
152
  </script>
153
  </body>
154
  </html>