gabby-sprugs-ai-agent / index.html
privateuserh's picture
Add 2 files
068319f verified
<!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;
}
/* Animation for mic indicator */
@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>
<!-- Full screen video background -->
<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>
<!-- Avatar video display -->
<div class="avatar">
<div class="avatar-placeholder">
<i class="fas fa-user-circle"></i>
</div>
<!-- <video class="avatar-video" autoplay playsinline></video> -->
</div>
</div>
<!-- Chat Window -->
<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>
<!-- Microphone Control Window -->
<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>
<!-- Tips Window -->
<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>
<!-- Floating Control Buttons -->
<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>
// DOM elements
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');
// Toggle windows
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');
// Toggle mic active state
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');
});
// Close buttons
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');
});
// Simulate mic activity with random bars animation
function animateMicBars() {
micBars.forEach(bar => {
const height = Math.floor(Math.random() * 80) + 10;
bar.style.height = `${height}px`;
// Change color based on height
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();
}
});
// Chat input functionality
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) {
// Add user message
const userMessage = document.createElement('div');
userMessage.className = 'message user-message';
userMessage.textContent = messageText;
chatMessages.appendChild(userMessage);
// Clear input
chatInput.value = '';
// Scroll to bottom
chatMessages.scrollTop = chatMessages.scrollHeight;
// Simulate bot response after delay
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>