|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Gabby Sprugs | Virtual Assistant</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> |
|
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); |
|
|
|
body { |
|
font-family: 'Poppins', sans-serif; |
|
margin: 0; |
|
padding: 0; |
|
overflow: hidden; |
|
background-color: #000; |
|
} |
|
|
|
.video-container { |
|
position: relative; |
|
width: 100vw; |
|
height: 100vh; |
|
overflow: hidden; |
|
} |
|
|
|
.video-overlay { |
|
position: absolute; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
background: rgba(0,0,0,0.3); |
|
} |
|
|
|
.chat-window, .mic-window, .tips-window { |
|
position: absolute; |
|
bottom: 100px; |
|
right: 30px; |
|
width: 350px; |
|
background: rgba(255,255,255,0.95); |
|
border-radius: 15px; |
|
box-shadow: 0 10px 30px rgba(0,0,0,0.2); |
|
transition: all 0.3s ease; |
|
z-index: 100; |
|
} |
|
|
|
.chat-window.hidden, .mic-window.hidden, .tips-window.hidden { |
|
transform: translateY(100px); |
|
opacity: 0; |
|
pointer-events: none; |
|
} |
|
|
|
.control-buttons { |
|
position: fixed; |
|
bottom: 30px; |
|
right: 30px; |
|
display: flex; |
|
gap: 15px; |
|
z-index: 100; |
|
} |
|
|
|
.control-button { |
|
width: 60px; |
|
height: 60px; |
|
border-radius: 50%; |
|
background: linear-gradient(135deg, #4f46e5, #8b5cf6); |
|
color: white; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
font-size: 20px; |
|
cursor: pointer; |
|
box-shadow: 0 5px 15px rgba(79, 70, 229, 0.4); |
|
transition: all 0.2s ease; |
|
} |
|
|
|
.control-button:hover { |
|
transform: translateY(-3px); |
|
box-shadow: 0 8px 20px rgba(79, 70, 229, 0.6); |
|
} |
|
|
|
.control-button.active { |
|
background: linear-gradient(135deg, #8b5cf6, #4f46e5); |
|
transform: translateY(-3px); |
|
} |
|
|
|
.window-header { |
|
padding: 15px; |
|
border-bottom: 1px solid #eee; |
|
display: flex; |
|
justify-content: space-between; |
|
align-items: center; |
|
} |
|
|
|
.window-title { |
|
font-weight: 600; |
|
color: #333; |
|
} |
|
|
|
.window-close { |
|
color: #666; |
|
cursor: pointer; |
|
font-size: 18px; |
|
transition: all 0.2s ease; |
|
} |
|
|
|
.window-close:hover { |
|
color: #4f46e5; |
|
} |
|
|
|
.window-body { |
|
padding: 15px; |
|
max-height: 400px; |
|
overflow-y: auto; |
|
} |
|
|
|
.chat-messages { |
|
display: flex; |
|
flex-direction: column; |
|
gap: 10px; |
|
} |
|
|
|
.message { |
|
max-width: 80%; |
|
padding: 10px 15px; |
|
border-radius: 15px; |
|
font-size: 14px; |
|
line-height: 1.5; |
|
} |
|
|
|
.user-message { |
|
align-self: flex-end; |
|
background: #4f46e5; |
|
color: white; |
|
border-bottom-right-radius: 0; |
|
} |
|
|
|
.bot-message { |
|
align-self: flex-start; |
|
background: #f1f1f1; |
|
color: #333; |
|
border-bottom-left-radius: 0; |
|
} |
|
|
|
.chat-input { |
|
display: flex; |
|
padding: 15px; |
|
border-top: 1px solid #eee; |
|
} |
|
|
|
.chat-input input { |
|
flex: 1; |
|
padding: 10px 15px; |
|
border: 1px solid #ddd; |
|
border-radius: 25px; |
|
outline: none; |
|
font-size: 14px; |
|
} |
|
|
|
.chat-input button { |
|
margin-left: 10px; |
|
padding: 10px 15px; |
|
background: #4f46e5; |
|
color: white; |
|
border: none; |
|
border-radius: 25px; |
|
cursor: pointer; |
|
} |
|
|
|
.avatar { |
|
position: absolute; |
|
top: 50%; |
|
left: 50%; |
|
transform: translate(-50%, -50%); |
|
width: 80vmin; |
|
height: 80vmin; |
|
border-radius: 50%; |
|
overflow: hidden; |
|
box-shadow: 0 0 100px rgba(79, 70, 229, 0.6); |
|
background: #1a1a1a; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
z-index: 10; |
|
} |
|
|
|
.avatar-video { |
|
width: 100%; |
|
height: 100%; |
|
object-fit: cover; |
|
} |
|
|
|
.avatar-placeholder { |
|
color: #4f46e5; |
|
font-size: 20vmin; |
|
} |
|
|
|
|
|
@keyframes pulse { |
|
0% { transform: scale(1); opacity: 1; } |
|
50% { transform: scale(1.1); opacity: 0.7; } |
|
100% { transform: scale(1); opacity: 1; } |
|
} |
|
|
|
.mic-active { |
|
animation: pulse 1.5s infinite; |
|
background: linear-gradient(135deg, #ef4444, #f97316); |
|
} |
|
|
|
.tips-content { |
|
font-size: 14px; |
|
line-height: 1.6; |
|
color: #555; |
|
} |
|
|
|
.tip-item { |
|
margin-bottom: 15px; |
|
} |
|
|
|
.tip-title { |
|
font-weight: 600; |
|
color: #4f46e5; |
|
margin-bottom: 5px; |
|
} |
|
|
|
.mic-indicators { |
|
display: flex; |
|
flex-direction: column; |
|
gap: 15px; |
|
align-items: center; |
|
} |
|
|
|
.mic-visualizer { |
|
width: 100%; |
|
height: 100px; |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
gap: 5px; |
|
} |
|
|
|
.mic-bar { |
|
width: 6px; |
|
height: 20px; |
|
background: #ddd; |
|
border-radius: 3px; |
|
transition: all 0.1s ease; |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
|
|
<div class="video-container"> |
|
<video autoplay loop muted playsinline class="w-full h-full object-cover"> |
|
<source src="https://assets.mixkit.co/videos/preview/mixkit-purple-pink-and-blue-light-abstract-1632-large.mp4" type="video/mp4"> |
|
</video> |
|
<div class="video-overlay"></div> |
|
|
|
|
|
<div class="avatar"> |
|
<div class="avatar-placeholder"> |
|
<i class="fas fa-user-circle"></i> |
|
</div> |
|
|
|
</div> |
|
</div> |
|
|
|
|
|
<div class="chat-window hidden"> |
|
<div class="window-header"> |
|
<div class="window-title">Chat with Gabby</div> |
|
<div class="window-close chat-close"><i class="fas fa-times"></i></div> |
|
</div> |
|
<div class="window-body"> |
|
<div class="chat-messages"> |
|
<div class="message bot-message"> |
|
Hi there! I'm Gabby Sprugs. How can I help you today? |
|
</div> |
|
</div> |
|
</div> |
|
<div class="chat-input"> |
|
<input type="text" placeholder="Type your message..."> |
|
<button><i class="fas fa-paper-plane"></i></button> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="mic-window hidden"> |
|
<div class="window-header"> |
|
<div class="window-title">Microphone Controls</div> |
|
<div class="window-close mic-close"><i class="fas fa-times"></i></div> |
|
</div> |
|
<div class="window-body"> |
|
<div class="mic-indicators"> |
|
<div class="mic-visualizer"> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
<div class="mic-bar"></div> |
|
</div> |
|
<div class="text-lg font-medium text-gray-700">Speak now...</div> |
|
<div class="text-sm text-gray-500">Gabby is listening for your requests</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="tips-window hidden"> |
|
<div class="window-header"> |
|
<div class="window-title">Tips & Suggestions</div> |
|
<div class="window-close tips-close"><i class="fas fa-times"></i></div> |
|
</div> |
|
<div class="window-body"> |
|
<div class="tips-content"> |
|
<div class="tip-item"> |
|
<div class="tip-title">Try saying:</div> |
|
<div>"Tell me about your content creation services"</div> |
|
</div> |
|
<div class="tip-item"> |
|
<div class="tip-title">Need help?</div> |
|
<div>"How can you help me with my social media?"</div> |
|
</div> |
|
<div class="tip-item"> |
|
<div class="tip-title">Quick access</div> |
|
<div>"Show me your portfolio" or "Let's talk about pricing"</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="control-buttons"> |
|
<div class="control-button mic-button" title="Microphone"> |
|
<i class="fas fa-microphone"></i> |
|
</div> |
|
<div class="control-button chat-button" title="Chat"> |
|
<i class="fas fa-comment-dots"></i> |
|
</div> |
|
<div class="control-button tips-button" title="Tips"> |
|
<i class="fas fa-lightbulb"></i> |
|
</div> |
|
</div> |
|
|
|
<script> |
|
|
|
const chatWindow = document.querySelector('.chat-window'); |
|
const micWindow = document.querySelector('.mic-window'); |
|
const tipsWindow = document.querySelector('.tips-window'); |
|
const chatButton = document.querySelector('.chat-button'); |
|
const micButton = document.querySelector('.mic-button'); |
|
const tipsButton = document.querySelector('.tips-button'); |
|
const chatClose = document.querySelector('.chat-close'); |
|
const micClose = document.querySelector('.mic-close'); |
|
const tipsClose = document.querySelector('.tips-close'); |
|
const micBars = document.querySelectorAll('.mic-bar'); |
|
|
|
|
|
chatButton.addEventListener('click', () => { |
|
chatWindow.classList.toggle('hidden'); |
|
micWindow.classList.add('hidden'); |
|
tipsWindow.classList.add('hidden'); |
|
chatButton.classList.toggle('active'); |
|
micButton.classList.remove('active'); |
|
tipsButton.classList.remove('active'); |
|
}); |
|
|
|
micButton.addEventListener('click', () => { |
|
micWindow.classList.toggle('hidden'); |
|
chatWindow.classList.add('hidden'); |
|
tipsWindow.classList.add('hidden'); |
|
micButton.classList.toggle('active'); |
|
chatButton.classList.remove('active'); |
|
tipsButton.classList.remove('active'); |
|
|
|
|
|
micButton.classList.toggle('mic-active'); |
|
}); |
|
|
|
tipsButton.addEventListener('click', () => { |
|
tipsWindow.classList.toggle('hidden'); |
|
chatWindow.classList.add('hidden'); |
|
micWindow.classList.add('hidden'); |
|
tipsButton.classList.toggle('active'); |
|
chatButton.classList.remove('active'); |
|
micButton.classList.remove('active'); |
|
}); |
|
|
|
|
|
chatClose.addEventListener('click', () => { |
|
chatWindow.classList.add('hidden'); |
|
chatButton.classList.remove('active'); |
|
}); |
|
|
|
micClose.addEventListener('click', () => { |
|
micWindow.classList.add('hidden'); |
|
micButton.classList.remove('active'); |
|
micButton.classList.remove('mic-active'); |
|
}); |
|
|
|
tipsClose.addEventListener('click', () => { |
|
tipsWindow.classList.add('hidden'); |
|
tipsButton.classList.remove('active'); |
|
}); |
|
|
|
|
|
function animateMicBars() { |
|
micBars.forEach(bar => { |
|
const height = Math.floor(Math.random() * 80) + 10; |
|
bar.style.height = `${height}px`; |
|
|
|
|
|
if (height > 60) { |
|
bar.style.background = '#ef4444'; |
|
} else if (height > 40) { |
|
bar.style.background = '#f97316'; |
|
} else if (height > 20) { |
|
bar.style.background = '#4f46e5'; |
|
} else { |
|
bar.style.background = '#ddd'; |
|
} |
|
}); |
|
|
|
if (!micWindow.classList.contains('hidden') && micButton.classList.contains('mic-active')) { |
|
requestAnimationFrame(animateMicBars); |
|
} |
|
} |
|
|
|
micButton.addEventListener('click', () => { |
|
if (!micWindow.classList.contains('hidden') && micButton.classList.contains('mic-active')) { |
|
animateMicBars(); |
|
} |
|
}); |
|
|
|
|
|
const chatInput = document.querySelector('.chat-input input'); |
|
const chatSend = document.querySelector('.chat-input button'); |
|
const chatMessages = document.querySelector('.chat-messages'); |
|
|
|
chatSend.addEventListener('click', sendMessage); |
|
chatInput.addEventListener('keypress', (e) => { |
|
if (e.key === 'Enter') { |
|
sendMessage(); |
|
} |
|
}); |
|
|
|
function sendMessage() { |
|
const messageText = chatInput.value.trim(); |
|
if (messageText) { |
|
|
|
const userMessage = document.createElement('div'); |
|
userMessage.className = 'message user-message'; |
|
userMessage.textContent = messageText; |
|
chatMessages.appendChild(userMessage); |
|
|
|
|
|
chatInput.value = ''; |
|
|
|
|
|
chatMessages.scrollTop = chatMessages.scrollHeight; |
|
|
|
|
|
setTimeout(() => { |
|
const botResponses = [ |
|
"Thanks for your message! How can I assist you further?", |
|
"I'd be happy to help with that. Could you tell me more details?", |
|
"That's an interesting question! Let me think about that for a moment.", |
|
"I specialize in digital content creation. Would you like to discuss your project?", |
|
"Here's what I can suggest based on your request..." |
|
]; |
|
const randomResponse = botResponses[Math.floor(Math.random() * botResponses.length)]; |
|
|
|
const botMessage = document.createElement('div'); |
|
botMessage.className = 'message bot-message'; |
|
botMessage.textContent = randomResponse; |
|
chatMessages.appendChild(botMessage); |
|
|
|
chatMessages.scrollTop = chatMessages.scrollHeight; |
|
}, 1000 + Math.random() * 2000); |
|
} |
|
} |
|
</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=privateuserh/gabby-sprugs-ai-agent" style="color: #fff;text-decoration: underline;" target="_blank" >🧬 Remix</a></p></body> |
|
</html> |