voicechat / templates /index.html
Gopikanth123's picture
test
88c034b
raw
history blame
15.1 kB
<!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="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';
voiceBtn.addEventListener('click', () => recognition.start());
recognition.addEventListener('result', (e) => {
const transcript = e.results[0][0].transcript;
addMessage('user-message', transcript);
sendUserMessage(transcript);
});
// 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);
});
</script>
</body>
</html>