| <!DOCTYPE html> |
| <html lang="fr"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Assistant IA Dynamique</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| @keyframes pulse { |
| 0%, 100% { opacity: 1; } |
| 50% { opacity: 0.5; } |
| } |
| .typing-indicator { |
| display: flex; |
| align-items: center; |
| } |
| .typing-dot { |
| width: 8px; |
| height: 8px; |
| background-color: #4f46e5; |
| border-radius: 50%; |
| margin: 0 2px; |
| animation: pulse 1.5s infinite ease-in-out; |
| } |
| .typing-dot:nth-child(2) { |
| animation-delay: 0.2s; |
| } |
| .typing-dot:nth-child(3) { |
| animation-delay: 0.4s; |
| } |
| |
| |
| @keyframes messageIn { |
| from { |
| transform: translateY(10px); |
| opacity: 0; |
| } |
| to { |
| transform: translateY(0); |
| opacity: 1; |
| } |
| } |
| .message { |
| animation: messageIn 0.3s ease-out; |
| } |
| |
| |
| :root { |
| --primary-bg: #f3f4f6; |
| --secondary-bg: #ffffff; |
| --primary-text: #111827; |
| --secondary-text: #6b7280; |
| --accent-color: #4f46e5; |
| } |
| [data-theme="dark"] { |
| --primary-bg: #1f2937; |
| --secondary-bg: #111827; |
| --primary-text: #f9fafb; |
| --secondary-text: #d1d5db; |
| --accent-color: #818cf8; |
| } |
| [data-theme="blue"] { |
| --primary-bg: #e0f2fe; |
| --secondary-bg: #ffffff; |
| --primary-text: #0c4a6e; |
| --secondary-text: #0369a1; |
| --accent-color: #0284c7; |
| } |
| |
| body { |
| background-color: var(--primary-bg); |
| color: var(--primary-text); |
| transition: background-color 0.3s, color 0.3s; |
| } |
| .card { |
| background-color: var(--secondary-bg); |
| transition: background-color 0.3s; |
| } |
| .text-secondary { |
| color: var(--secondary-text); |
| transition: color 0.3s; |
| } |
| .btn-primary { |
| background-color: var(--accent-color); |
| transition: background-color 0.3s; |
| } |
| |
| |
| * { |
| transition: background-color 0.3s ease, color 0.3s ease; |
| } |
| |
| |
| @media (max-width: 640px) { |
| .chat-container { |
| height: calc(100vh - 160px) !important; |
| } |
| .input-container { |
| flex-direction: column; |
| } |
| .input-container button { |
| width: 100%; |
| margin-top: 0.5rem; |
| margin-left: 0 !important; |
| } |
| } |
| </style> |
| </head> |
| <body class="min-h-screen flex flex-col"> |
| |
| <header class="bg-indigo-600 text-white p-4 shadow-md flex justify-between items-center"> |
| <div class="flex items-center space-x-3"> |
| <i class="fas fa-robot text-2xl"></i> |
| <h1 class="text-xl font-bold">Assistant IA</h1> |
| <div class="flex items-center space-x-1 ml-2"> |
| <div class="w-2 h-2 rounded-full bg-green-400"></div> |
| <span class="text-xs">En ligne</span> |
| </div> |
| </div> |
| <div class="flex items-center space-x-4"> |
| <button id="theme-toggle" class="p-2 rounded-full hover:bg-indigo-500 transition"> |
| <i class="fas fa-moon"></i> |
| </button> |
| <div class="relative"> |
| <button id="settings-btn" class="p-2 rounded-full hover:bg-indigo-500 transition"> |
| <i class="fas fa-cog"></i> |
| </button> |
| <div id="settings-menu" class="hidden absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg py-1 z-10"> |
| <div class="px-4 py-2 border-b border-gray-200"> |
| <p class="text-sm font-medium text-gray-700">Thèmes</p> |
| </div> |
| <button data-theme="light" class="theme-option w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center"> |
| <i class="fas fa-sun mr-2 text-yellow-500"></i> Clair |
| </button> |
| <button data-theme="dark" class="theme-option w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center"> |
| <i class="fas fa-moon mr-2 text-indigo-500"></i> Sombre |
| </button> |
| <button data-theme="blue" class="theme-option w-full text-left px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 flex items-center"> |
| <i class="fas fa-palette mr-2 text-blue-500"></i> Bleu |
| </button> |
| </div> |
| </div> |
| </div> |
| </header> |
|
|
| |
| <main class="flex-grow container mx-auto p-4 flex flex-col md:flex-row gap-6 max-w-6xl"> |
| |
| <div class="w-full md:w-1/4 card p-6 rounded-lg shadow-md hidden md:block"> |
| <div class="text-center mb-4"> |
| <div class="w-20 h-20 bg-indigo-100 rounded-full flex items-center justify-center mx-auto mb-3"> |
| <i class="fas fa-robot text-3xl text-indigo-600"></i> |
| </div> |
| <h3 class="font-bold text-lg">Assistant Virtuel</h3> |
| <p class="text-secondary text-sm">Version 2.0.1</p> |
| </div> |
| |
| <div class="space-y-4"> |
| <div> |
| <h4 class="font-semibold flex items-center"> |
| <i class="fas fa-bolt text-yellow-500 mr-2"></i> |
| Fonctionnalités |
| </h4> |
| <ul class="mt-2 space-y-2 text-sm text-secondary"> |
| <li class="flex items-center"> |
| <i class="fas fa-check-circle text-green-500 mr-2 text-xs"></i> |
| Réponses intelligentes |
| </li> |
| <li class="flex items-center"> |
| <i class="fas fa-check-circle text-green-500 mr-2 text-xs"></i> |
| Multilingue |
| </li> |
| <li class="flex items-center"> |
| <i class="fas fa-check-circle text-green-500 mr-2 text-xs"></i> |
| Apprentissage continu |
| </li> |
| </ul> |
| </div> |
| |
| <div> |
| <h4 class="font-semibold flex items-center"> |
| <i class="fas fa-chart-line text-blue-500 mr-2"></i> |
| Statistiques |
| </h4> |
| <div class="mt-2 grid grid-cols-2 gap-3"> |
| <div class="text-center p-2 bg-gray-100 rounded"> |
| <p class="text-xs text-secondary">Messages</p> |
| <p class="font-bold" id="message-count">0</p> |
| </div> |
| <div class="text-center p-2 bg-gray-100 rounded"> |
| <p class="text-xs text-secondary">Utilisateurs</p> |
| <p class="font-bold">1</p> |
| </div> |
| </div> |
| </div> |
| |
| <div> |
| <h4 class="font-semibold flex items-center"> |
| <i class="fas fa-terminal text-purple-500 mr-2"></i> |
| API Status |
| </h4> |
| <div class="mt-2 flex items-center space-x-2"> |
| <div id="api-status-indicator" class="w-3 h-3 rounded-full bg-green-500"></div> |
| <span class="text-sm text-secondary">Connecté</span> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="w-full md:w-3/4 card rounded-lg shadow-md flex flex-col h-[70vh]"> |
| |
| <div class="border-b border-gray-200 p-4 flex items-center justify-between"> |
| <div class="flex items-center space-x-3"> |
| <div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center"> |
| <i class="fas fa-user-headset text-indigo-600"></i> |
| </div> |
| <h3 class="font-bold">Conversation</h3> |
| </div> |
| <button id="clear-chat" class="text-red-500 hover:text-red-700 text-sm flex items-center"> |
| <i class="fas fa-trash-alt mr-1"></i> |
| <span class="hidden md:inline">Effacer</span> |
| </button> |
| </div> |
| |
| |
| <div id="chat-container" class="flex-grow overflow-y-auto p-4 space-y-4"> |
| |
| <div class="message p-4 bg-indigo-50 rounded-lg max-w-[80%] md:max-w-[70%] self-start"> |
| <div class="flex items-start space-x-3"> |
| <div class="w-8 h-8 bg-indigo-200 rounded-full flex-shrink-0 flex items-center justify-center"> |
| <i class="fas fa-robot text-indigo-700 text-sm"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-indigo-800">Assistant IA</p> |
| <p class="text-secondary text-sm mt-1"> |
| Bonjour ! Je suis votre assistant virtuel. Posez-moi des questions ou demandez-moi de l'aide pour n'importe quel sujet. Comment puis-je vous aider aujourd'hui ? |
| </p> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="border-t border-gray-200 p-4"> |
| <div id="input-container" class="input-container flex"> |
| <input |
| type="text" |
| id="user-input" |
| placeholder="Écrivez votre message..." |
| class="flex-grow p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-transparent" |
| autocomplete="off" |
| > |
| <button |
| id="send-btn" |
| class="ml-2 px-6 py-3 bg-indigo-600 text-white rounded-lg hover:bg-indigo-700 transition flex items-center justify-center" |
| > |
| <i class="fas fa-paper-plane mr-2"></i> |
| <span class="hidden md:inline">Envoyer</span> |
| </button> |
| </div> |
| <div id="suggestions" class="mt-2 flex flex-wrap gap-2 hidden"> |
| <small class="text-secondary">Suggestions :</small> |
| <button class="suggestion-btn text-xs bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full"> |
| Quel est ton rôle ? |
| </button> |
| <button class="suggestion-btn text-xs bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full"> |
| Peux-tu m'aider ? |
| </button> |
| <button class="suggestion-btn text-xs bg-gray-100 hover:bg-gray-200 px-3 py-1 rounded-full"> |
| Comment fonctionnes-tu ? |
| </button> |
| </div> |
| </div> |
| </div> |
| </main> |
|
|
| |
| <footer class="bg-gray-50 p-4 text-center text-secondary text-sm"> |
| <p>© 2023 Assistant IA Dynamique. Tous droits réservés.</p> |
| </footer> |
|
|
| <script> |
| document.addEventListener('DOMContentLoaded', function() { |
| |
| const chatContainer = document.getElementById('chat-container'); |
| const userInput = document.getElementById('user-input'); |
| const sendBtn = document.getElementById('send-btn'); |
| const clearChatBtn = document.getElementById('clear-chat'); |
| const messageCount = document.getElementById('message-count'); |
| const themeToggle = document.getElementById('theme-toggle'); |
| const settingsBtn = document.getElementById('settings-btn'); |
| const settingsMenu = document.getElementById('settings-menu'); |
| const themeOptions = document.querySelectorAll('.theme-option'); |
| const suggestions = document.getElementById('suggestions'); |
| const suggestionBtns = document.querySelectorAll('.suggestion-btn'); |
| |
| let messageCounter = 0; |
| let currentTheme = 'light'; |
| |
| |
| if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { |
| setTheme('dark'); |
| } |
| |
| |
| themeToggle.addEventListener('click', () => { |
| const newTheme = currentTheme === 'light' ? 'dark' : 'light'; |
| setTheme(newTheme); |
| }); |
| |
| themeOptions.forEach(option => { |
| option.addEventListener('click', () => { |
| const theme = option.getAttribute('data-theme'); |
| setTheme(theme); |
| settingsMenu.classList.add('hidden'); |
| }); |
| }); |
| |
| function setTheme(theme) { |
| currentTheme = theme; |
| document.documentElement.setAttribute('data-theme', theme); |
| |
| |
| const icon = theme === 'dark' ? 'fa-sun' : 'fa-moon'; |
| themeToggle.innerHTML = `<i class="fas ${icon}"></i>`; |
| |
| |
| const header = document.querySelector('header'); |
| if (theme === 'dark') { |
| header.classList.remove('bg-indigo-600'); |
| header.classList.add('bg-gray-800'); |
| } else { |
| header.classList.remove('bg-gray-800'); |
| header.classList.add('bg-indigo-600'); |
| } |
| |
| |
| localStorage.setItem('theme', theme); |
| } |
| |
| |
| settingsBtn.addEventListener('click', () => { |
| settingsMenu.classList.toggle('hidden'); |
| }); |
| |
| |
| document.addEventListener('click', (e) => { |
| if (!settingsBtn.contains(e.target) && !settingsMenu.contains(e.target)) { |
| settingsMenu.classList.add('hidden'); |
| } |
| }); |
| |
| |
| sendBtn.addEventListener('click', sendMessage); |
| |
| |
| userInput.addEventListener('keypress', function(e) { |
| if (e.key === 'Enter') { |
| sendMessage(); |
| } |
| }); |
| |
| |
| userInput.addEventListener('focus', () => { |
| suggestions.classList.remove('hidden'); |
| }); |
| |
| userInput.addEventListener('blur', () => { |
| |
| setTimeout(() => { |
| suggestions.classList.add('hidden'); |
| }, 200); |
| }); |
| |
| |
| suggestionBtns.forEach(btn => { |
| btn.addEventListener('click', () => { |
| userInput.value = btn.textContent.trim(); |
| userInput.focus(); |
| }); |
| }); |
| |
| |
| clearChatBtn.addEventListener('click', clearChat); |
| |
| |
| setInterval(() => { |
| const apiStatus = document.getElementById('api-status-indicator'); |
| |
| if (Math.random() < 0.05) { |
| apiStatus.classList.remove('bg-green-500'); |
| apiStatus.classList.add('bg-red-500'); |
| setTimeout(() => { |
| apiStatus.classList.remove('bg-red-500'); |
| apiStatus.classList.add('bg-green-500'); |
| }, 2000); |
| } |
| }, 10000); |
| |
| |
| function sendMessage() { |
| const message = userInput.value.trim(); |
| if (message === '') return; |
| |
| |
| addUserMessage(message); |
| |
| |
| userInput.value = ''; |
| |
| |
| showTypingIndicator(); |
| |
| |
| setTimeout(() => { |
| removeTypingIndicator(); |
| const response = getAIResponse(message); |
| addAIMessage(response); |
| |
| |
| messageCounter += 2; |
| messageCount.textContent = messageCounter; |
| |
| |
| chatContainer.scrollTop = chatContainer.scrollHeight; |
| }, 1000 + Math.random() * 2000); |
| } |
| |
| |
| function addUserMessage(message) { |
| const messageElement = document.createElement('div'); |
| messageElement.className = 'message p-4 bg-indigo-100 rounded-lg max-w-[80%] md:max-w-[70%] self-end ml-auto'; |
| messageElement.innerHTML = ` |
| <div class="flex items-start space-x-3"> |
| <div class="w-8 h-8 bg-indigo-300 rounded-full flex-shrink-0 flex items-center justify-center"> |
| <i class="fas fa-user text-indigo-800 text-sm"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-indigo-800">Vous</p> |
| <p class="text-secondary text-sm mt-1">${message}</p> |
| </div> |
| </div> |
| `; |
| chatContainer.appendChild(messageElement); |
| chatContainer.scrollTop = chatContainer.scrollHeight; |
| } |
| |
| |
| function addAIMessage(message) { |
| const messageElement = document.createElement('div'); |
| messageElement.className = 'message p-4 bg-indigo-50 rounded-lg max-w-[80%] md:max-w-[70%] self-start'; |
| messageElement.innerHTML = ` |
| <div class="flex items-start space-x-3"> |
| <div class="w-8 h-8 bg-indigo-200 rounded-full flex-shrink-0 flex items-center justify-center"> |
| <i class="fas fa-robot text-indigo-700 text-sm"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-indigo-800">Assistant IA</p> |
| <p class="text-secondary text-sm mt-1">${message}</p> |
| </div> |
| </div> |
| `; |
| chatContainer.appendChild(messageElement); |
| chatContainer.scrollTop = chatContainer.scrollHeight; |
| } |
| |
| |
| function showTypingIndicator() { |
| const typingElement = document.createElement('div'); |
| typingElement.className = 'message p-4 bg-indigo-50 rounded-lg max-w-[80%] md:max-w-[70%] self-start typing-indicator-message'; |
| typingElement.innerHTML = ` |
| <div class="flex items-start space-x-3"> |
| <div class="w-8 h-8 bg-indigo-200 rounded-full flex-shrink-0 flex items-center justify-center"> |
| <i class="fas fa-robot text-indigo-700 text-sm"></i> |
| </div> |
| <div class="typing-indicator"> |
| <div class="typing-dot"></div> |
| <div class="typing-dot"></div> |
| <div class="typing-dot"></div> |
| </div> |
| </div> |
| `; |
| chatContainer.appendChild(typingElement); |
| chatContainer.scrollTop = chatContainer.scrollHeight; |
| } |
| |
| |
| function removeTypingIndicator() { |
| const typingElement = chatContainer.querySelector('.typing-indicator-message'); |
| if (typingElement) { |
| typingElement.remove(); |
| } |
| } |
| |
| |
| function clearChat() { |
| chatContainer.innerHTML = ''; |
| messageCounter = 0; |
| messageCount.textContent = '0'; |
| |
| |
| addAIMessage('Bonjour ! Je suis votre assistant virtuel. Posez-moi des questions ou demandez-moi de l\'aide pour n\'importe quel sujet. Comment puis-je vous aider aujourd\'hui ?'); |
| messageCounter = 1; |
| messageCount.textContent = '1'; |
| } |
| |
| |
| function getAIResponse(userMessage) { |
| const lowerMessage = userMessage.toLowerCase(); |
| |
| |
| if (lowerMessage.includes('bonjour') || lowerMessage.includes('salut')) { |
| return 'Bonjour ! Comment puis-je vous aider aujourd\'hui ?'; |
| } else if (lowerMessage.includes('merci')) { |
| return 'Je vous en prie ! N\'hésitez pas si vous avez d\'autres questions.'; |
| } else if (lowerMessage.includes('qui es-tu') || lowerMessage.includes('ton rôle')) { |
| return 'Je suis un assistant virtuel intelligent conçu pour répondre à vos questions et vous aider avec diverses tâches.'; |
| } else if (lowerMessage.includes('aide') || lowerMessage.includes('assistance')) { |
| return 'Bien sûr, je peux vous aider. Pouvez-vous préciser votre demande ?'; |
| } else if (lowerMessage.includes('temps') || lowerMessage.includes('météo')) { |
| return 'Je ne peux pas vérifier la météo en temps réel, mais je peux vous donner des conseils généraux selon la saison.'; |
| } else if (lowerMessage.includes('blague') || lowerMessage.includes('rire')) { |
| const jokes = [ |
| 'Pourquoi les livres ont-ils toujours chaud ? Parce qu\'ils ont une couverture !', |
| 'Que dit une mère à son fils geek quand le dîner est servi ? Alt Tab !', |
| 'Comment appelle-t-on un magicien qui a perdu ses pouvoirs ? Un magicien-diable !' |
| ]; |
| return jokes[Math.floor(Math.random() * jokes.length)]; |
| } else if (lowerMessage.includes('date') || lowerMessage.includes('heure')) { |
| const now = new Date(); |
| return `Nous sommes le ${now.toLocaleDateString('fr-FR')} et il est ${now.toLocaleTimeString('fr-FR', {hour: '2-digit', minute:'2-digit'})}.`; |
| } else { |
| |
| const randomResponses = [ |
| 'Je comprends. Pouvez-vous développer votre question ?', |
| 'C\'est une question intéressante. Voici ce que je peux vous dire à ce sujet...', |
| 'Je vais traiter votre demande et vous fournir la meilleure réponse possible.', |
| 'Merci pour votre question. Pourriez-vous me donner plus de détails ?', |
| 'J\'ai bien noté votre demande. Je vais y répondre dès que possible.' |
| ]; |
| return randomResponses[Math.floor(Math.random() * randomResponses.length)]; |
| } |
| } |
| |
| |
| messageCount.textContent = '1'; |
| }); |
| </script> |
| <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=zogbe/hht" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |