abudi / index.html
henboff's picture
Adicione uma animação de mensagem sendo enviadas em massa - Initial Deployment
0d988a6 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WhatsBlast Pro - Mass Messaging System</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>
.particles {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
overflow: hidden;
}
.particle {
position: absolute;
background: rgba(255, 255, 255, 0.5);
border-radius: 50%;
animation: float-up 15s linear infinite;
}
@keyframes float-up {
0% {
transform: translateY(100vh) scale(0);
opacity: 0;
}
10% {
opacity: 1;
}
90% {
opacity: 1;
}
100% {
transform: translateY(-10vh) scale(1);
opacity: 0;
}
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@keyframes gradientFlow {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
@keyframes reveal {
0% { opacity: 0; transform: scale(0.8); }
100% { opacity: 1; transform: scale(1); }
}
@keyframes typing {
from { width: 0 }
to { width: 100% }
}
@keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: #4ade80 }
}
.gradient-bg {
background: linear-gradient(-45deg, #1e3a8a, #3b82f6, #10b981, #06b6d4);
background-size: 400% 400%;
animation: gradientFlow 15s ease infinite;
}
.typing-animation {
overflow: hidden;
border-right: .15em solid #4ade80;
white-space: nowrap;
letter-spacing: .15em;
animation:
typing 3.5s steps(40, end),
blink-caret .75s step-end infinite;
}
.message-bubble {
position: relative;
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border-radius: 1.5rem;
padding: 1rem;
margin: 0.5rem;
max-width: 70%;
animation: float 3s ease-in-out infinite;
}
.message-bubble::after {
content: '';
position: absolute;
bottom: -10px;
left: 20px;
border-width: 10px 10px 0;
border-style: solid;
border-color: rgba(255, 255, 255, 0.1) transparent;
}
.reveal-item {
opacity: 0;
animation: reveal 0.5s ease-out forwards;
}
.delay-1 { animation-delay: 1s; }
.delay-2 { animation-delay: 2s; }
.delay-3 { animation-delay: 3s; }
.delay-4 { animation-delay: 4s; }
.delay-5 { animation-delay: 5s; }
.delay-6 { animation-delay: 6s; }
.delay-7 { animation-delay: 7s; }
.delay-8 { animation-delay: 8s; }
.delay-9 { animation-delay: 9s; }
.delay-10 { animation-delay: 10s; }
.glow {
box-shadow: 0 0 15px rgba(59, 130, 246, 0.7);
}
.glow:hover {
box-shadow: 0 0 25px rgba(59, 130, 246, 0.9);
}
.input-highlight {
transition: all 0.3s ease;
border-bottom: 2px solid rgba(255, 255, 255, 0.3);
}
.input-highlight:focus {
border-bottom: 2px solid #3b82f6;
}
/* Mass sending animation styles */
.message-item {
background: rgba(255, 255, 255, 0.05);
border-radius: 0.5rem;
padding: 0.75rem 1rem;
font-family: monospace;
display: flex;
justify-content: space-between;
align-items: center;
transition: all 0.3s ease;
}
.message-item.success {
border-left: 4px solid #10B981;
background: rgba(16, 185, 129, 0.1);
}
.message-item.error {
border-left: 4px solid #EF4444;
background: rgba(239, 68, 68, 0.1);
}
.message-item.pending {
border-left: 4px solid #3B82F6;
background: rgba(59, 130, 246, 0.1);
}
.status-icon {
font-size: 0.9rem;
margin-left: 0.5rem;
}
.success .status-icon {
color: #10B981;
}
.error .status-icon {
color: #EF4444;
}
.pending .status-icon {
color: #3B82F6;
animation: pulse 1.5s infinite;
}
</style>
</head>
<body class="gradient-bg min-h-screen flex items-center justify-center p-4 text-white overflow-hidden">
<div class="particles" id="particles"></div>
<!-- Loading Animation -->
<div id="loading-screen" class="fixed inset-0 flex flex-col items-center justify-center bg-black bg-opacity-90 z-50 transition-opacity duration-1000">
<div class="flex space-x-4 mb-8 relative">
<div class="w-16 h-16 bg-blue-500 rounded-full animate-pulse delay-1 shadow-lg shadow-blue-500/50" style="animation-delay: 0.2s"></div>
<div class="w-16 h-16 bg-green-500 rounded-full animate-pulse delay-2 shadow-lg shadow-green-500/50" style="animation-delay: 0.4s"></div>
<div class="w-16 h-16 bg-cyan-500 rounded-full animate-pulse delay-3 shadow-lg shadow-cyan-500/50" style="animation-delay: 0.6s"></div>
<div class="absolute -bottom-6 left-0 right-0 text-center text-sm text-gray-300 reveal-item delay-3">
Inicializando sistema...
</div>
</div>
<h1 class="text-4xl md:text-5xl font-bold mb-4 typing-animation">WhatsBlast Pro</h1>
<div class="w-full max-w-md mt-8 space-y-4">
<div class="message-bubble delay-4">
<p class="typing-text" data-text="Iniciando conexão segura..."></p>
</div>
<div class="message-bubble delay-5 ml-auto" style="animation-delay: 2s">
<p class="typing-text" data-text="Carregando módulos de campanha..."></p>
</div>
<div class="message-bubble delay-6">
<p class="typing-text" data-text="Preparando interface de disparos em massa..."></p>
</div>
</div>
<div class="w-full max-w-md mt-8 h-2 bg-gray-700 rounded-full overflow-hidden">
<div id="progress-bar" class="h-full bg-gradient-to-r from-blue-500 to-green-500 transition-all duration-10000" style="width: 0%"></div>
</div>
</div>
<!-- Main Login Form -->
<div id="login-container" class="hidden opacity-0 w-full max-w-md backdrop-filter backdrop-blur-lg bg-white bg-opacity-10 rounded-2xl shadow-2xl overflow-hidden border border-white border-opacity-20 transform transition-all duration-1000">
<div class="p-8">
<div class="flex justify-center mb-8">
<div class="relative">
<div class="w-24 h-24 bg-green-500 rounded-full flex items-center justify-center text-4xl">
<i class="fab fa-whatsapp"></i>
</div>
<div class="absolute -bottom-2 -right-2 w-8 h-8 bg-blue-500 rounded-full flex items-center justify-center">
<i class="fas fa-bolt text-white text-sm"></i>
</div>
</div>
</div>
<h2 class="text-3xl font-bold text-center mb-2 reveal-item delay-7">Bem-vindo de Volta</h2>
<p class="text-center text-gray-300 mb-8 reveal-item delay-7">Acesse seu painel de disparos em massa</p>
<form class="space-y-6">
<div class="reveal-item delay-8">
<label class="block text-sm font-medium mb-2">E-mail</label>
<div class="relative">
<input type="email" class="w-full bg-white bg-opacity-10 input-highlight rounded-lg py-3 px-4 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all duration-300" placeholder="seu@email.com">
<div class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none">
<i class="fas fa-envelope text-gray-400"></i>
</div>
</div>
</div>
<div class="reveal-item delay-9">
<label class="block text-sm font-medium mb-2">Senha</label>
<div class="relative">
<input type="password" class="w-full bg-white bg-opacity-10 input-highlight rounded-lg py-3 px-4 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all duration-300" placeholder="••••••••">
<div class="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none">
<i class="fas fa-lock text-gray-400"></i>
</div>
</div>
</div>
<div class="flex items-center justify-between reveal-item delay-9">
<div class="flex items-center">
<input id="remember-me" type="checkbox" class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
<label for="remember-me" class="ml-2 block text-sm">Lembrar-me</label>
</div>
<a href="#" class="text-sm text-blue-300 hover:text-blue-200 transition-colors">Esqueceu a senha?</a>
</div>
<button type="submit" class="w-full bg-gradient-to-r from-blue-500 to-green-500 hover:from-blue-600 hover:to-green-600 text-white font-bold py-3 px-4 rounded-lg transition-all duration-300 transform hover:scale-[1.02] glow hover:shadow-lg hover:shadow-blue-500/30 active:scale-95 reveal-item delay-10 relative overflow-hidden group">
<span class="absolute inset-0 bg-white opacity-0 group-hover:opacity-10 transition-opacity duration-300"></span>
<span class="flex items-center justify-center">
<i class="fas fa-sign-in-alt mr-2"></i> Entrar
</span>
</button>
</form>
<div class="mt-6 text-center text-sm reveal-item delay-10">
<p>Não tem uma conta? <a href="#" class="text-blue-300 hover:text-blue-200 font-medium transition-colors">Cadastre-se</a></p>
</div>
</div>
<div class="bg-black bg-opacity-20 p-4 text-center text-xs text-gray-400">
<p class="reveal-item delay-10">Conexão segura <i class="fas fa-lock"></i> | Criptografia ponta-a-ponta</p>
</div>
</div>
<!-- Mass Message Sending Animation -->
<div id="mass-sending-animation" class="hidden fixed inset-0 flex items-center justify-center bg-black bg-opacity-80 z-50">
<div class="w-full max-w-2xl bg-gray-900 bg-opacity-90 rounded-xl p-8 shadow-2xl border border-gray-700">
<div class="flex justify-between items-center mb-6">
<h3 class="text-xl font-bold text-white">Enviando Mensagens em Massa</h3>
<div class="flex items-center space-x-2">
<span id="sent-count" class="font-mono text-green-400">0</span>
<span class="text-gray-400">/</span>
<span id="total-count" class="font-mono text-white">100</span>
</div>
</div>
<div class="h-2 bg-gray-700 rounded-full mb-6 overflow-hidden">
<div id="sending-progress" class="h-full bg-gradient-to-r from-blue-500 to-green-500" style="width: 0%"></div>
</div>
<div class="space-y-4 max-h-96 overflow-y-auto pr-2">
<!-- Messages will be added here dynamically -->
</div>
<div class="mt-6 flex justify-end">
<button id="cancel-sending" class="px-4 py-2 bg-red-500 hover:bg-red-600 rounded-lg text-white font-medium transition-colors">
Cancelar Envio
</button>
</div>
</div>
</div>
<script>
function createParticles() {
const container = document.getElementById('particles');
const particleCount = 30;
for (let i = 0; i < particleCount; i++) {
const particle = document.createElement('div');
particle.classList.add('particle');
// Random properties
const size = Math.random() * 5 + 2;
const posX = Math.random() * 100;
const delay = Math.random() * 15;
const duration = 10 + Math.random() * 20;
particle.style.width = `${size}px`;
particle.style.height = `${size}px`;
particle.style.left = `${posX}%`;
particle.style.animationDelay = `${delay}s`;
particle.style.animationDuration = `${duration}s`;
container.appendChild(particle);
}
}
document.addEventListener('DOMContentLoaded', function() {
createParticles();
// Animate progress bar
const progressBar = document.getElementById('progress-bar');
progressBar.style.width = '100%';
// After 10 seconds, hide loading screen and show login form
setTimeout(() => {
const loadingScreen = document.getElementById('loading-screen');
const loginContainer = document.getElementById('login-container');
loadingScreen.style.opacity = '0';
loginContainer.classList.remove('hidden');
setTimeout(() => {
loadingScreen.style.display = 'none';
loginContainer.style.opacity = '1';
}, 1000);
}, 10000); // 10 seconds
// Typing effect for loading messages
const typingTexts = document.querySelectorAll('.typing-text');
typingTexts.forEach((el, index) => {
setTimeout(() => {
const text = el.getAttribute('data-text');
let i = 0;
const typing = setInterval(() => {
if (i < text.length) {
el.textContent += text.charAt(i);
i++;
} else {
clearInterval(typing);
}
}, 50);
}, 1000 + (index * 2000));
});
});
// Mass sending animation functions
function showMassSendingAnimation(total) {
const container = document.getElementById('mass-sending-animation');
const messageList = container.querySelector('.space-y-4');
const totalCount = document.getElementById('total-count');
const cancelBtn = document.getElementById('cancel-sending');
// Reset container
messageList.innerHTML = '';
document.getElementById('sending-progress').style.width = '0%';
document.getElementById('sent-count').textContent = '0';
totalCount.textContent = total;
// Create initial message items
for (let i = 0; i < total; i++) {
const item = document.createElement('div');
item.className = 'message-item pending';
item.innerHTML = `
<span>+55 9XXXX-XXXX</span>
<span class="status-icon"><i class="fas fa-circle-notch fa-spin"></i></span>
`;
messageList.appendChild(item);
}
// Show container
container.classList.remove('hidden');
// Start fake sending simulation
let sent = 0;
const interval = setInterval(() => {
if (sent >= total) {
clearInterval(interval);
return;
}
// Randomly decide if this message will succeed or fail
const isSuccess = Math.random() > 0.1;
// Update message status
const items = messageList.querySelectorAll('.message-item');
const currentItem = items[sent];
currentItem.classList.remove('pending');
currentItem.classList.add(isSuccess ? 'success' : 'error');
currentItem.querySelector('.status-icon').innerHTML =
isSuccess ? '<i class="fas fa-check"></i>' : '<i class="fas fa-times"></i>';
// Update counters
sent++;
document.getElementById('sent-count').textContent = sent;
document.getElementById('sending-progress').style.width = `${(sent / total) * 100}%`;
}, 200); // Send one every 200ms
// Cancel button handler
cancelBtn.onclick = () => {
clearInterval(interval);
container.classList.add('hidden');
};
}
// Example usage (you would call this when actually sending messages):
// showMassSendingAnimation(50);
</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=henboff/abudi" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>