Hadiil commited on
Commit
58b65d0
·
verified ·
1 Parent(s): fc99321

Update static/styles.css

Browse files
Files changed (1) hide show
  1. static/styles.css +170 -222
static/styles.css CHANGED
@@ -1,223 +1,171 @@
1
-
2
- x: Math.random() * canvas.width,
3
- document.addEventListener('DOMContentLoaded', () => {
4
- // Animation des étoiles (si vous utilisez un canvas)
5
- const canvas = document.querySelector('canvas.stars');
6
- if (canvas) {
7
- const ctx = canvas.getContext('2d');
8
- canvas.width = window.innerWidth;
9
- canvas.height = window.innerHeight;
10
-
11
- // Fond bleu nuit vibrant
12
- ctx.fillStyle = '#2A3F9D';
13
- ctx.fillRect(0, 0, canvas.width, canvas.height);
14
-
15
- // Étoiles
16
- const stars = [];
17
- for (let i = 0; i < 100; i++) {
18
- stars.push({
19
- x: Math.random() * canvas.width,
20
- y: Math.random() * canvas.height,
21
- radius: Math.random() * 2,
22
- opacity: Math.random() * 0.5 + 0.5
23
- });
24
- }
25
-
26
- function animate() {
27
- ctx.fillStyle = '#2A3F9D'; // Bleu nuit vibrant
28
- ctx.fillRect(0, 0, canvas.width, canvas.height);
29
- ctx.fillStyle = '#E6E6FA'; // Blanc doux pour étoiles
30
- stars.forEach(star => {
31
- ctx.beginPath();
32
- ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);
33
- ctx.globalAlpha = star.opacity;
34
- ctx.fill();
35
- star.opacity += (Math.random() - 0.5) * 0.02;
36
- if (star.opacity < 0.3) star.opacity = 0.3;
37
- if (star.opacity > 1) star.opacity = 1;
38
- });
39
- requestAnimationFrame(animate);
40
- }
41
- animate();
42
-
43
- // Ajuster le canvas en cas de redimensionnement
44
- window.addEventListener('resize', () => {
45
- canvas.width = window.innerWidth;
46
- canvas.height = window.innerHeight;
47
- ctx.fillStyle = '#2A3F9D';
48
- ctx.fillRect(0, 0, canvas.width, canvas.height);
49
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
51
-
52
- // Gestion des modals
53
- const openModal = (modalId) => {
54
- const modal = document.getElementById(modalId);
55
- modal.classList.remove('hidden');
56
- document.querySelectorAll('.function-box').forEach(box => {
57
- if (box.dataset.modal !== modalId) box.classList.add('shadowed');
58
- });
59
- };
60
-
61
- const closeModal = (modal) => {
62
- modal.classList.add('hidden');
63
- modal.querySelectorAll('form').forEach(form => form.reset());
64
- modal.querySelectorAll('.response-card').forEach(card => {
65
- card.classList.add('hidden');
66
- card.innerHTML = '';
67
- });
68
- modal.querySelectorAll('.file-preview').forEach(preview => {
69
- preview.classList.add('hidden');
70
- preview.innerHTML = '';
71
- });
72
- modal.querySelectorAll('.drop-area p').forEach(p => {
73
- p.textContent = 'Drop File Here or Click to Choose';
74
- });
75
- if (modal.id === 'chatbot-modal') {
76
- document.getElementById('chatbot-conversation').innerHTML = '';
77
- }
78
- document.querySelectorAll('.function-box').forEach(box => box.classList.remove('shadowed'));
79
- };
80
-
81
- // Ouvrir les modals
82
- document.querySelectorAll('.function-box').forEach(box => {
83
- box.addEventListener('click', () => openModal(box.dataset.modal));
84
- });
85
-
86
- // Fermer les modals
87
- document.querySelectorAll('.close-modal').forEach(btn => {
88
- btn.addEventListener('click', () => closeModal(btn.closest('.modal')));
89
- });
90
-
91
- // Gestion des onglets
92
- document.querySelectorAll('.tab-btn').forEach(btn => {
93
- btn.addEventListener('click', () => {
94
- const modal = btn.closest('.modal');
95
- modal.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
96
- btn.classList.add('active');
97
- modal.querySelectorAll('.tab-content').forEach(content => {
98
- content.classList.add('hidden');
99
- if (content.dataset.tab === btn.dataset.tab) content.classList.remove('hidden');
100
- });
101
- });
102
- });
103
-
104
- // Gestion du drag-and-drop
105
- window.handleDrop = (event, dropArea) => {
106
- event.preventDefault();
107
- const fileInput = dropArea.querySelector('input[type="file"]');
108
- const preview = dropArea.querySelector('.file-preview');
109
- const files = event.dataTransfer.files;
110
- if (files.length > 0) {
111
- fileInput.files = files;
112
- dropArea.querySelector('p').textContent = `Selected: ${files[0].name}`;
113
- if (files[0].type.startsWith('image/')) {
114
- const reader = new FileReader();
115
- reader.onload = () => {
116
- preview.innerHTML = `<img src="${reader.result}" alt="Preview" class="w-24 h-24 object-cover rounded mt-2">`;
117
- preview.classList.remove('hidden');
118
- };
119
- reader.readAsDataURL(files[0]);
120
- } else {
121
- preview.innerHTML = `<p class="text-gray-600">${files[0].name}</p>`;
122
- preview.classList.remove('hidden');
123
- }
124
- }
125
- };
126
-
127
- // Notifications toast
128
- const showToast = (message, type = 'success') => {
129
- const toast = document.createElement('div');
130
- toast.className = `fixed bottom-4 right-4 p-4 rounded text-white ${type === 'success' ? 'bg-green-500' : 'bg-red-500'}`;
131
- toast.textContent = message;
132
- document.body.appendChild(toast);
133
- setTimeout(() => toast.remove(), 3000);
134
- };
135
-
136
- // Soumission des formulaires
137
- const forms = {
138
- 'summarize-form': { endpoint: '/process', intent: 'summarize' },
139
- 'summarize-file-form': { endpoint: '/process', intent: 'summarize' },
140
- 'translate-text-form': { endpoint: '/process', intent: 'translate' },
141
- 'translate-file-form': { endpoint: '/process', intent: 'file-translate' },
142
- 'chatbot-form': { endpoint: '/chat', intent: 'chat' },
143
- 'image-caption-form': { endpoint: '/process', intent: 'image-to-text' },
144
- 'visual-qa-form': { endpoint: '/process', intent: 'visual-qa' }
145
- };
146
-
147
- Object.keys(forms).forEach(formId => {
148
- const form = document.getElementById(formId);
149
- form.addEventListener('submit', async e => {
150
- e.preventDefault();
151
- const spinner = form.querySelector('.loading-spinner');
152
- const responseCard = form.querySelector('.response-card') || form.nextElementSibling;
153
- spinner.classList.remove('hidden');
154
- responseCard.classList.add('hidden');
155
- responseCard.innerHTML = '';
156
-
157
- const formData = new FormData(form);
158
- if (formId === 'summarize-form') {
159
- formData.append('text', form.querySelector('input[type="text"]').value);
160
- } else if (formId === 'summarize-file-form' || formId === 'translate-file-form' || formId === 'image-caption-form' || formId === 'visual-qa-form') {
161
- const file = form.querySelector('input[type="file"]').files[0];
162
- if (!file) {
163
- responseCard.innerHTML = `<p class="text-red-500">Please select a file.</p>`;
164
- responseCard.classList.remove('hidden');
165
- spinner.classList.add('hidden');
166
- showToast('Please select a file.', 'error');
167
- return;
168
- }
169
- formData.append('file', file);
170
- } else if (formId === 'translate-text-form') {
171
- const text = form.querySelector('input[type="text"]').value;
172
- const lang = form.querySelector('select[name="language"]').value;
173
- formData.append('text', `Translate to ${lang}: ${text}`);
174
- } else if (formId === 'visual-qa-form') {
175
- formData.append('text', form.querySelector('input[type="text"]').value);
176
- } else if (formId === 'chatbot-form') {
177
- const message = form.querySelector('input[name="message"]').value.trim();
178
- if (!message) {
179
- spinner.classList.add('hidden');
180
- showToast('Please enter a message.', 'error');
181
- return;
182
- }
183
- formData.append('message', message);
184
- const conversation = document.getElementById('chatbot-conversation');
185
- conversation.innerHTML += `<p class="user-message">You: ${message}</p>`;
186
- conversation.scrollTop = conversation.scrollHeight;
187
- }
188
-
189
- try {
190
- const response = await fetch(forms[formId].endpoint, {
191
- method: 'POST',
192
- body: formData
193
- });
194
- const data = await response.json();
195
- spinner.classList.add('hidden');
196
- if (response.ok) {
197
- responseCard.innerHTML = `<p>${data.response}</p>`;
198
- if (data.additional_data) {
199
- Object.entries(data.additional_data).forEach(([key, value]) => {
200
- responseCard.innerHTML += `<p><strong>${key.replace('_', ' ').replace(/\b\w/g, char => char.toUpperCase())}:</strong> ${value}</p>`;
201
- });
202
- }
203
- responseCard.classList.remove('hidden');
204
- showToast('Action completed successfully!', 'success');
205
- if (formId === 'chatbot-form') {
206
- const conversation = document.getElementById('chatbot-conversation');
207
- conversation.innerHTML += `<p class="bot-message">Assistant: ${data.response}</p>`;
208
- conversation.scrollTop = conversation.scrollHeight;
209
- }
210
- } else {
211
- responseCard.innerHTML = `<p class="text-red-500">Error: ${data.detail}</p>`;
212
- responseCard.classList.remove('hidden');
213
- showToast('An error occurred.', 'error');
214
- }
215
- } catch (error) {
216
- spinner.classList.add('hidden');
217
- responseCard.innerHTML = `<p class="text-red-500">Error: ${error.message}</p>`;
218
- responseCard.classList.remove('hidden');
219
- showToast('An error occurred.', 'error');
220
- }
221
- });
222
- });
223
- });
 
1
+ /* Importer une police élégante pour le style pro et mignon */
2
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap');
3
+
4
+ body {
5
+ font-family: 'Inter', sans-serif;
6
+ background: #2A3F9D; /* Bleu nuit vibrant pour le fond */
7
+ color: #333333; /* Texte sombre pour contraste sur boîtes claires */
8
+ margin: 0;
9
+ overflow-x: hidden;
10
+ }
11
+
12
+ /* Animation des étoiles (si vous utilisez une classe .stars) */
13
+ .stars {
14
+ position: fixed;
15
+ top: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ background: transparent;
20
+ z-index: -1;
21
+ overflow: hidden;
22
+ }
23
+
24
+ .stars::before, .stars::after {
25
+ content: '';
26
+ position: absolute;
27
+ width: 2px;
28
+ height: 2px;
29
+ background: #E6E6FA; /* Blanc doux pour les étoiles */
30
+ box-shadow: 0 0 8px rgba(230, 230, 250, 0.8); /* Lueur vibrante */
31
+ animation: twinkle 5s infinite linear;
32
+ }
33
+
34
+ .stars::before { top: 20%; left: 30%; }
35
+ .stars::after { top: 60%; left: 70%; }
36
+
37
+ @keyframes twinkle {
38
+ 0%, 100% { opacity: 0.4; transform: scale(1); }
39
+ 50% { opacity: 1; transform: scale(1.3); }
40
+ }
41
+
42
+ /* Boîtes principales */
43
+ .function-box {
44
+ background: #FFF5F8; /* Blanc cassé rosé, clair et assorti */
45
+ border-radius: 12px;
46
+ border: 1px solid rgba(255, 153, 204, 0.2); /* Bordure rose pastel */
47
+ padding: 20px;
48
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
49
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
50
+ }
51
+
52
+ .function-box:hover {
53
+ transform: translateY(-5px);
54
+ box-shadow: 0 8px 20px rgba(255, 153, 204, 0.4); /* Rose pastel pour survol */
55
+ }
56
+
57
+ /* Modal */
58
+ .modal {
59
+ background: rgba(0, 0, 0, 0.2); /* Fond semi-transparent léger */
60
+ }
61
+
62
+ .modal-content {
63
+ background: #FFF5F8; /* Blanc cassé rosé pour modals */
64
+ border-radius: 12px;
65
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
66
+ padding: 24px;
67
+ }
68
+
69
+ /* Boutons de tabulation */
70
+ .tab-btn {
71
+ background: #E6E6FA; /* Violet clair pour contraste */
72
+ color: #333333;
73
+ border-radius: 8px;
74
+ transition: all 0.3s ease;
75
+ }
76
+
77
+ .tab-btn.active {
78
+ background: linear-gradient(45deg, #FF99CC, #99CCFF); /* Rose pastel et bleu clair */
79
+ color: #FFFFFF;
80
+ }
81
+
82
+ .tab-btn:hover {
83
+ background: #D6CCFF; /* Violet plus clair au survol */
84
+ }
85
+
86
+ /* Boutons cosmiques */
87
+ .cosmic-btn {
88
+ background: linear-gradient(45deg, #FF99CC, #99CCFF); /* Rose pastel et bleu clair */
89
+ color: #FFFFFF;
90
+ border-radius: 8px;
91
+ border: none;
92
+ transition: transform 0.2s ease;
93
+ }
94
+
95
+ .cosmic-btn:hover {
96
+ transform: scale(1.05);
97
+ box-shadow: 0 4px 12px rgba(255, 153, 204, 0.4);
98
+ }
99
+
100
+ /* Zone de réponse */
101
+ .response-card {
102
+ background: #E6E6FA; /* Violet clair */
103
+ border-radius: 8px;
104
+ color: #333333;
105
+ }
106
+
107
+ /* Conversation du chatbot */
108
+ .chatbot-conversation {
109
+ background: #E6E6FA; /* Violet clair */
110
+ border-radius: 8px;
111
+ }
112
+
113
+ .chatbot-conversation .user-message {
114
+ color: #FF99CC; /* Rose pastel */
115
+ }
116
+
117
+ .chatbot-conversation .bot-message {
118
+ color: #99CCFF; /* Bleu clair */
119
+ }
120
+
121
+ /* Barre d'entrée */
122
+ .input-bar {
123
+ background: #E6E6FA; /* Violet clair */
124
+ border-radius: 8px;
125
+ }
126
+
127
+ .input-bar input {
128
+ color: #333333;
129
+ background: transparent;
130
+ }
131
+
132
+ /* Zone de drop */
133
+ .drop-area {
134
+ border: 2px dashed #99CCFF; /* Bleu clair */
135
+ background: #E6E6FA; /* Violet clair */
136
+ border-radius: 8px;
137
+ }
138
+
139
+ .drop-area:hover {
140
+ background: #D6CCFF; /* Violet plus clair */
141
+ }
142
+
143
+ .drop-area p {
144
+ color: #333333;
145
+ }
146
+
147
+ /* Spinner de chargement */
148
+ .loading-spinner {
149
+ color: #333333;
150
+ }
151
+
152
+ /* Accessibilité */
153
+ .cosmic-btn:focus, .tab-btn:focus, .function-box:focus {
154
+ outline: 2px solid #FF99CC; /* Rose pastel */
155
+ outline-offset: 2px;
156
+ }
157
+
158
+ /* Responsivité */
159
+ @media (max-width: 768px) {
160
+ .modal-content {
161
+ width: 95%;
162
  }
163
+ .input-bar {
164
+ flex-direction: column;
165
+ align-items: stretch;
166
+ }
167
+ .cosmic-btn {
168
+ margin-top: 10px;
169
+ margin-left: 0;
170
+ }
171
+ }