tech-sales-assistant / index.html
michalkichal's picture
add some gradients to the background, redo the TechSales AI element, use liquid glass design for the whole app - Follow Up Deployment
4d1c3bf verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liquid Glass AI Chat</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">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
dark: '#0f172a',
darker: '#020617',
primary: '#3b82f6',
neon: '#00f5d4',
neonPink: '#f72585',
glass: 'rgba(255, 255, 255, 0.05)'
},
boxShadow: {
'neon': '0 0 10px #00f5d4, 0 0 20px #00f5d4',
'neon-pink': '0 0 10px #f72585, 0 0 20px #f72585',
'neon-blue': '0 0 10px #3b82f6, 0 0 20px #3b82f6'
},
backdropBlur: {
'glass': '12px'
}
}
}
}
</script>
<style>
@keyframes typing {
from { width: 0 }
to { width: 100% }
}
@keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: #00f5d4 }
}
.typing-animation {
overflow: hidden;
border-right: .15em solid #00f5d4;
white-space: nowrap;
animation:
typing 3.5s steps(40, end),
blink-caret .75s step-end infinite;
}
.glass-effect {
background: rgba(15, 23, 42, 0.7);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.message-glass {
background: rgba(15, 23, 42, 0.4);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
.gallery-item {
transition: all 0.3s ease;
}
.gallery-item:hover {
transform: scale(1.05);
box-shadow: 0 0 15px rgba(0, 245, 212, 0.5);
}
.fade-in {
animation: fadeIn 0.5s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
</style>
</head>
<body class="bg-gradient-to-br from-darker via-[#0c1120] to-[#020617] text-gray-200 min-h-screen flex flex-col">
<div class="container mx-auto px-4 py-8 flex-1 flex flex-col max-w-4xl">
<div class="relative glass-effect rounded-2xl p-6 mb-6 overflow-hidden">
<div class="absolute inset-0 bg-gradient-to-r from-primary/10 via-neon/5 to-primary/10 opacity-60"></div>
<div class="relative z-10">
<h1 class="text-4xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-neon via-primary to-neon mb-2 tracking-tighter">TECH SALES AI</h1>
<p class="text-gray-300/80 font-light tracking-wider">YOUR PERSONAL TECHNICAL SALES ASSISTANT</p>
</div>
</div>
<div id="chat-container" class="flex-1 glass-effect rounded-2xl p-4 overflow-y-auto mb-4 relative" style="height: 60vh; scroll-behavior: smooth;">
<div class="absolute inset-0 bg-gradient-to-b from-primary/5 to-transparent opacity-30 pointer-events-none"></div>
<div id="chat-messages" class="space-y-4">
<!-- Messages will appear here -->
</div>
</div>
<div class="glass-effect rounded-2xl p-4 relative overflow-hidden">
<div class="absolute inset-0 bg-gradient-to-r from-primary/10 to-neon/5 opacity-30"></div>
<div class="flex space-x-2">
<input
id="user-input"
type="text"
placeholder="Ask about our products..."
class="flex-1 bg-dark/70 border border-gray-700 rounded-xl px-4 py-3 focus:outline-none focus:ring-2 focus:ring-neon focus:border-transparent text-white"
disabled
>
<button
id="send-btn"
class="bg-gradient-to-r from-primary to-neon text-white px-6 py-3 rounded-xl font-medium hover:shadow-neon transition-all disabled:opacity-50"
disabled
>
<i class="fas fa-paper-plane"></i>
</button>
</div>
</div>
</div>
<button
id="play-conversation"
class="fixed bottom-6 right-6 bg-gradient-to-r from-neonPink/90 to-primary/90 text-white w-14 h-14 rounded-full flex items-center justify-center shadow-neon-pink hover:shadow-neon-blue transition-all z-10 backdrop-blur-sm border border-white/10 hover:scale-110"
title="Play conversation"
>
<i class="fas fa-play text-xl"></i>
</button>
<script>
// Conversation script
const conversation = [
{
sender: 'ai',
text: 'Hello! I\'m your TechSales AI assistant. How can I help you today?',
delay: 1000
},
{
sender: 'user',
text: 'Hi! I\'m looking for a high-performance gaming laptop. Can you recommend something?',
delay: 2000
},
{
sender: 'ai',
text: 'Certainly! Based on your interest in gaming, I\'d recommend our Quantum X9 Pro. It features an Intel i9-13900HX processor, RTX 4090 GPU, 32GB DDR5 RAM, and a 240Hz QHD display. Would you like more details?',
delay: 3000
},
{
sender: 'user',
text: 'That sounds great, but my budget is around $2000. Do you have options in that range?',
delay: 2500
},
{
sender: 'ai',
text: 'Understood! For $2000, I\'d suggest the Quantum X7. It has an i7-13700H, RTX 4070, 16GB RAM, and 165Hz FHD display. Nearly identical build quality with slightly scaled-back specs to hit that price point.',
delay: 3500
},
{
sender: 'user',
text: 'How does the X7 compare to the Alienware m16?',
delay: 2200
},
{
sender: 'ai',
text: 'Great question! The Quantum X7 offers better cooling (our liquid metal thermal system keeps temps 10-15°C lower), 20% better battery life, and our signature mechanical keyboard. The m16 has slightly better speakers and more RGB lighting zones. Performance is nearly identical.',
delay: 4000
},
{
sender: 'user',
text: 'Can you show me some pictures of the X7?',
delay: 1800
},
{
sender: 'ai',
text: 'gallery:quantum_x7',
delay: 2000
},
{
sender: 'user',
text: 'What about the ports? I need Thunderbolt 4 and HDMI 2.1',
delay: 2300
},
{
sender: 'ai',
text: 'The X7 has:\n- 2x Thunderbolt 4 (USB-C)\n- HDMI 2.1\n- 3x USB-A 3.2 Gen2\n- SD card reader\n- Ethernet\n- 3.5mm combo jack\nAll ports are on the rear for clean cable management.',
delay: 3500
},
{
sender: 'user',
text: 'Perfect! What about warranty options?',
delay: 2000
},
{
sender: 'ai',
text: 'Standard warranty is 2 years parts/labor. We offer:\n1. Basic: +1 year ($99)\n2. Premium: +2 years with accidental damage coverage ($199)\n3. Ultimate: +3 years with on-site service ($299)\nAll extend the battery coverage which normally is 1 year.',
delay: 4000
},
{
sender: 'user',
text: 'Thanks! I think I\'ll go with the X7 with Premium warranty.',
delay: 2500
},
{
sender: 'ai',
text: 'Excellent choice! Your total comes to $2,199. Would you like to proceed to checkout or need any final details?',
delay: 3000
}
];
// Gallery images
const galleries = {
quantum_x7: [
{ url: 'https://images.unsplash.com/photo-1593642632823-8f785ba67e45?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80', alt: 'Quantum X7 front view' },
{ url: 'https://images.unsplash.com/photo-1629131726692-1accd0df53e0?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80', alt: 'Quantum X7 keyboard' },
{ url: 'https://images.unsplash.com/photo-1629131726692-1accd0df53e0?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80', alt: 'Quantum X7 ports' },
{ url: 'https://images.unsplash.com/photo-1593642632823-8f785ba67e45?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80', alt: 'Quantum X7 side view' },
{ url: 'https://images.unsplash.com/photo-1629131726692-1accd0df53e0?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80', alt: 'Quantum X7 display' }
]
};
// DOM elements
const chatMessages = document.getElementById('chat-messages');
const chatContainer = document.getElementById('chat-container');
const userInput = document.getElementById('user-input');
const sendBtn = document.getElementById('send-btn');
const playBtn = document.getElementById('play-conversation');
// State
let isPlaying = false;
let currentMessageIndex = 0;
// Functions
function addMessage(sender, text, isTyping = false) {
const messageDiv = document.createElement('div');
messageDiv.className = `flex ${sender === 'user' ? 'justify-end' : 'justify-start'} fade-in`;
const messageBubble = document.createElement('div');
messageBubble.className = `message-glass rounded-2xl px-4 py-3 max-w-xs md:max-w-md lg:max-w-lg ${
sender === 'user'
? 'bg-gradient-to-r from-primary/30 to-primary/10 border border-primary/20 shadow-neon-blue'
: 'bg-gradient-to-r from-dark/70 to-dark/50 border border-gray-700'
}`;
if (isTyping) {
messageBubble.innerHTML = `
<div class="flex space-x-2 items-center">
<div class="w-2 h-2 rounded-full bg-neon animate-pulse"></div>
<div class="w-2 h-2 rounded-full bg-neon animate-pulse delay-100"></div>
<div class="w-2 h-2 rounded-full bg-neon animate-pulse delay-200"></div>
</div>
`;
} else {
if (text.includes('\n')) {
messageBubble.innerHTML = text.split('\n').map(line => `<p class="mb-1 last:mb-0">${line}</p>`).join('');
} else {
messageBubble.textContent = text;
}
}
messageDiv.appendChild(messageBubble);
chatMessages.appendChild(messageDiv);
// Scroll to bottom with smooth behavior
setTimeout(() => {
chatContainer.scrollTo({
top: chatMessages.scrollHeight,
behavior: 'smooth'
});
}, 10);
return messageBubble;
}
function simulateTyping(text, element, delay, callback) {
element.textContent = text;
// Scroll to bottom with smooth behavior
setTimeout(() => {
chatContainer.scrollTo({
top: chatMessages.scrollHeight,
behavior: 'smooth'
});
}, 10);
if (callback) callback();
}
function showGallery(galleryId) {
const gallery = galleries[galleryId];
if (!gallery) return;
const messageDiv = document.createElement('div');
messageDiv.className = 'flex justify-start fade-in';
const galleryBubble = document.createElement('div');
galleryBubble.className = 'message-glass rounded-2xl px-4 py-3 max-w-xs md:max-w-md lg:max-w-lg bg-gradient-to-r from-dark/70 to-dark/50 border border-gray-700';
const galleryGrid = document.createElement('div');
galleryGrid.className = 'grid grid-cols-2 gap-2';
gallery.forEach(img => {
const imgDiv = document.createElement('div');
imgDiv.className = 'gallery-item rounded-lg overflow-hidden';
imgDiv.innerHTML = `
<img src="${img.url}" alt="${img.alt}" class="w-full h-auto object-cover">
<p class="text-xs text-gray-400 mt-1">${img.alt}</p>
`;
galleryGrid.appendChild(imgDiv);
});
galleryBubble.appendChild(galleryGrid);
messageDiv.appendChild(galleryBubble);
chatMessages.appendChild(messageDiv);
// Scroll to bottom with smooth behavior
setTimeout(() => {
chatMessages.scrollTo({
top: chatMessages.scrollHeight,
behavior: 'smooth'
});
}, 10);
}
function playNextMessage() {
if (currentMessageIndex >= conversation.length) {
isPlaying = false;
playBtn.innerHTML = '<i class="fas fa-redo"></i>';
return;
}
const message = conversation[currentMessageIndex];
if (message.sender === 'user') {
// Simulate user typing in input
userInput.disabled = false;
sendBtn.disabled = false;
let typedSoFar = '';
const typingInterval = setInterval(() => {
if (typedSoFar.length < message.text.length) {
typedSoFar = message.text.substring(0, typedSoFar.length + 1);
userInput.value = typedSoFar;
} else {
clearInterval(typingInterval);
// Add to chat and clear input
addMessage('user', message.text);
userInput.value = '';
userInput.disabled = true;
sendBtn.disabled = true;
// Process next message after delay
setTimeout(playNextMessage, 1000);
currentMessageIndex++;
}
}, 50);
} else {
// AI response
if (message.text.startsWith('gallery:')) {
const galleryId = message.text.split(':')[1];
setTimeout(() => {
showGallery(galleryId);
setTimeout(playNextMessage, 1000);
currentMessageIndex++;
}, message.delay);
} else {
const typingBubble = addMessage('ai', '', true);
setTimeout(() => {
typingBubble.classList.remove('flex', 'space-x-2', 'items-center');
typingBubble.classList.add('whitespace-pre-wrap');
simulateTyping(message.text, typingBubble, 0, () => {
setTimeout(playNextMessage, 1000);
});
currentMessageIndex++;
}, message.delay);
}
}
}
function playConversation() {
if (isPlaying) return;
isPlaying = true;
currentMessageIndex = 0;
chatMessages.innerHTML = '';
playBtn.innerHTML = '<i class="fas fa-pause"></i>';
playNextMessage();
}
// Event listeners
playBtn.addEventListener('click', playConversation);
// Initial state
userInput.disabled = true;
sendBtn.disabled = true;
</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=michalkichal/tech-sales-assistant" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>