<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Advanced Chatbot UI</title> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet"> <style> :root { --primary-color: #007bff; /* Default blue */ --bot-message-bg: #f0f2f5; /* Light Gray */ --user-message-bg: #007bff; /* User Blue */ --user-message-text: #fff; /* User Message White */ --accent-color: #6a0dad; /* Default Purple */ --background-color: #fff; /* Default Background White */ --shadow-color: rgba(0, 0, 0, 0.2); /* Default Shadow */ --input-bg: #f0f2f5; /* Default Input Background */ --input-border: #ccc; /* Default Input Border */ } /* Themes */ .theme-calm-azure { --background-color: #E3F2FD; --bot-message-bg: #BBDEFB; --user-message-bg: #2196F3; --user-message-text: #FFFFFF; --input-bg: #FFFFFF; --input-border: #BDBDBD; --accent-color: #1976D2; } .theme-elegant-charcoal { --background-color: #263238; --bot-message-bg: #37474F; --user-message-bg: #FF5722; --user-message-text: #FFFFFF; --input-bg: #455A64; --input-border: #CFD8DC; --accent-color: #FF9800; } .theme-fresh-greenery { --background-color: #E8F5E9; --bot-message-bg: #C8E6C9; --user-message-bg: #4CAF50; --user-message-text: #FFFFFF; --input-bg: #FFFFFF; --input-border: #A5D6A7; --accent-color: #388E3C; } .theme-soft-lavender { --background-color: #F3E5F5; --bot-message-bg: #E1BEE7; --user-message-bg: #9C27B0; --user-message-text: #FFFFFF; --input-bg: #FFFFFF; --input-border: #D1C4E9; --accent-color: #7B1FA2; } .theme-bright-summer { --background-color: #FFEB3B; --bot-message-bg: #FFF9C4; --user-message-bg: #F44336; --user-message-text: #FFFFFF; --input-bg: #FFFFFF; --input-border: #FBC02D; --accent-color: #C62828; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Roboto', sans-serif; background-color: var(--background-color); transition: background 0.5s ease; overflow: hidden; /* Prevent scroll on body */ } .container { display: flex; flex-direction: column; height: 100vh; width: 100%; overflow: hidden; /* Prevent scroll on container */ } /* Header */ .header { background: var(--accent-color); color: #fff; font-size: 1.5rem; font-weight: 700; text-align: center; padding: 20px; box-shadow: 0 4px 8px var(--shadow-color); position: relative; z-index: 1000; } /* Chatbox */ .chat-box { flex: 1; display: flex; flex-direction: column; overflow-y: auto; padding: 20px; background: linear-gradient(to bottom right, #f5f7fa, #c3cfe2); border-radius: 10px; margin: 20px; box-shadow: 0 4px 8px var(--shadow-color); position: relative; z-index: 10; } .message { max-width: 75%; padding: 12px 18px; border-radius: 20px; box-shadow: 0 3px 6px var(--shadow-color); margin-bottom: 10px; opacity: 0; animation: fadeIn 0.3s forwards; /* Changed to forwards for delay effect */ } .user-message { align-self: flex-end; background: var(--user-message-bg); color: var(--user-message-text); border-radius: 15px 20px 20px 20px; animation: slideInRight 0.5s forwards; /* Sliding effect on user message */ } .bot-message { align-self: flex-start; background: var(--bot-message-bg); color: #333; border-radius: 20px 15px 20px 20px; animation: slideInLeft 0.5s forwards; /* Sliding effect on bot message */ } /* Footer */ .footer { background: #ffffff; padding: 15px; display: flex; justify-content: center; align-items: center; box-shadow: 0 -4px 8px var(--shadow-color); position: relative; z-index: 1000; } .footer input[type="text"] { width: 75%; padding: 15px; border: 1px solid var(--input-border); border-radius: 20px; margin-right: 10px; box-shadow: 0 2px 4px var(--shadow-color); transition: border 0.3s, box-shadow 0.3s; /* Added shadow transition */ background-color: var(--input-bg); outline: none; } .footer input[type="text"]:focus { border-color: var(--accent-color); box-shadow: 0 0 10px var(--accent-color); } button { background: var(--accent-color); color: #fff; border: none; padding: 10px 20px; border-radius: 20px; font-size: 1rem; cursor: pointer; box-shadow: 0 4px 10px var(--shadow-color); transition: background 0.3s ease, transform 0.2s ease, box-shadow 0.2s ease; } button:hover { background: #4b0082; transform: scale(1.05); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); /* Shadow effect on hover */ } /* Settings */ .settings { display: flex; justify-content: space-between; align-items: center; padding: 10px; background: #f0f2f5; box-shadow: 0 2px 5px var(--shadow-color); position: relative; z-index: 1000; } .color-picker, .theme-toggle { display: flex; align-items: center; position:relative; } .color-circle { width: 20px; height: 20px; border-radius: 50%; margin: 0 5px; cursor: pointer; box-shadow: 0 2px 5px var(--shadow-color); transition: transform 0.3s; /* Adding circle hover effect */ } .color-circle:hover { transform: scale(1.2); /* Scale up on hover */ } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideInRight { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } } @keyframes slideInLeft { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: translateX(0); } } /* Background animation */ @keyframes backgroundAnimate { 0% { background-color: rgba(255, 255, 255, 0.05); } 50% { background-color: rgba(255, 255, 255, 0.1); } 100% { background-color: rgba(255, 255, 255, 0.05); } } /* VFX related styles */ .vfx { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; animation: backgroundAnimate 5s infinite; /* Continuously animate background */ z-index: 0; /* Background layer */ } </style> </head> <body> <div class="vfx"></div> <!-- Background effects --> <div class="container"> <!-- Settings --> <div class="settings"> <div class="theme-toggle"> <label for="theme-select">Select Theme:</label> <select id="theme-select"> <option value="default">Default</option> <option value="calm-azure">Calm Azure</option> <option value="elegant-charcoal">Elegant Charcoal</option> <option value="fresh-greenery">Fresh Greenery</option> <option value="soft-lavender">Soft Lavender</option> <option value="bright-summer">Bright Summer</option> </select> </div> <div class="language-toggle"> <label for="language-select">Select Language:</label> <select id="language-select"> <option value="en">English</option> <option value="es">Spanish</option> <option value="fr">French</option> <option value="de">German</option> <option value="hi">Hindi</option> <option value="zh">Chinese</option> <option value="ar">Arabic</option> </select> </div> <div class="color-picker"> <label>Accent Color:</label> <div class="color-circle" style="background-color: #6a0dad;" onclick="changeColor('#6a0dad')"></div> <div class="color-circle" style="background-color: #ff4500;" onclick="changeColor('#ff4500')"></div> <div class="color-circle" style="background-color: #007bff;" onclick="changeColor('#007bff')"></div> <div class="color-circle" style="background-color: #28a745;" onclick="changeColor('#28a745')"></div> </div> </div> <!-- Header --> <div class="header">Advanced Chatbot UI</div> <!-- Chatbox --> <div class="chat-box" id="chat-box"></div> <!-- Footer --> <div class="footer"> <input type="text" id="user-input" placeholder="Type your message..." /> <button id="send-btn">Send</button> <button id="voice-btn">🎤 Start Voice Input</button> </div> </div> <script> const chatBox = document.getElementById('chat-box'); const voiceBtn = document.getElementById('voice-btn'); const sendBtn = document.getElementById('send-btn'); const userInput = document.getElementById('user-input'); const themeSelect = document.getElementById('theme-select'); // Add message to chatbox with visual effects function addMessage(sender, text) { const msgDiv = document.createElement('div'); msgDiv.classList.add('message', sender); msgDiv.textContent = text; chatBox.appendChild(msgDiv); chatBox.scrollTop = chatBox.scrollHeight; } // Speech Recognition Setup const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); recognition.lang = 'en-US'; recognition.maxResults = 10; recognition.interimResults = true; voiceBtn.addEventListener('click', () => recognition.start()); recognition.addEventListener('result', (e) => { const transcript = e.results[0][0].transcript; addMessage('user-message', transcript); sendUserMessage(transcript); }); recognition.addEventListener('noresult', () => { addMessage('user-message', 'No speech detected'); sendUserMessage('No speech detected'); }); recognition.addEventListener('nomatch', () => { addMessage('user-message', 'No speech detected'); sendUserMessage('No speech detected'); }); recognition.addEventListener('error', (e) => { if(e.error == 'no-speech') { addMessage('user-message', 'No speech detected'); sendUserMessage('No speech detected'); } }); // Function to change the accent color function changeColor(color) { document.documentElement.style.setProperty('--accent-color', color); } // Function to change the theme function changeTheme(theme) { document.documentElement.classList.remove('theme-calm-azure', 'theme-elegant-charcoal', 'theme-fresh-greenery', 'theme-soft-lavender', 'theme-bright-summer'); if (theme !== 'default') { document.documentElement.classList.add('theme-' + theme); } } // Send user input to backend (placeholder URL) function sendUserMessage(message) { fetch('/chat', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ message: message }), }) .then(response => response.json()) .then(data => { const botResponse = data.response; addMessage('bot-message', botResponse); speakResponse(botResponse); }) .catch(error => { console.error("Error:", error); addMessage('bot-message', "Sorry, I couldn't process that."); }); } // Text-to-Speech Function function speakResponse(text) { const utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'en-US'; window.speechSynthesis.speak(utterance); } // Event listeners for buttons sendBtn.addEventListener('click', () => { const message = userInput.value.trim(); if (message) { addMessage('user-message', message); sendUserMessage(message); userInput.value = ''; // Clear input field after sending } }); // Handle pressing 'Enter' key for sending messages userInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { sendBtn.click(); // Trigger button click } }); // Update theme when selected from dropdown themeSelect.addEventListener('change', (e) => { changeTheme(e.target.value); }); recognition.addEventListener('error', (event) => { console.error("Speech recognition error", event); }); // Event listener for language selection document.getElementById("language-select").addEventListener("change", function () { const selectedLanguage = this.value; // Example: Display a message when the language is changed console.log(`Language selected: ${selectedLanguage}`); // Logic to change chatbot responses based on the selected language // You can call an API to fetch translations or configure response logic here. // For example: updateBotLanguage(selectedLanguage); }); // Function to handle language-specific logic function updateBotLanguage(language) { // Placeholder function for your chatbot's language integration alert(`Chatbot will now respond in: ${language.toUpperCase()}`); // Integrate language translations for bot messages here. } </script> </body> </html>