// Motion generation using Pix2Pix API async function generateAnimation(imageData, style, duration) { try { // Using Pix2Pix API for free animation (rate limited) const response = await fetch('https://api.pix2pix.io/v1/animate', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ image: imageData.split(',')[1], // Remove base64 header style: style, duration: duration }) }); if (!response.ok) throw new Error('Animation generation failed'); const result = await response.json(); return result.animation_url; } catch (error) { console.error('Error generating animation:', error); // Fallback to local simulation if API fails return simulateAnimation(imageData); } } function simulateAnimation(imageData) { // Simple simulation of animation effect return new Promise(resolve => { setTimeout(() => { resolve(imageData); // In real case, this would be an animated GIF/MP4 }, 2000); }); } // Shared functionality across pages document.addEventListener('DOMContentLoaded', () => { // Initialize tooltips const tooltipElements = document.querySelectorAll('[data-tooltip]'); tooltipElements.forEach(el => { const tooltip = document.createElement('div'); tooltip.className = 'tooltip hidden absolute bg-gray-800 text-white px-2 py-1 rounded text-sm z-50'; tooltip.textContent = el.getAttribute('data-tooltip'); document.body.appendChild(tooltip); el.addEventListener('mouseenter', (e) => { const rect = el.getBoundingClientRect(); tooltip.style.top = `${rect.top - 30}px`; tooltip.style.left = `${rect.left + rect.width/2 - tooltip.offsetWidth/2}px`; tooltip.classList.remove('hidden'); }); el.addEventListener('mouseleave', () => { tooltip.classList.add('hidden'); }); }); // Handle generate button click const generateBtn = document.getElementById('generateBtn'); if (generateBtn) { generateBtn.addEventListener('click', () => { generateBtn.innerHTML = ' Generating...'; feather.replace(); // Get selected options const style = document.querySelector('select').value; const duration = document.querySelector('input[type="range"]').value; const imageSrc = document.getElementById('imagePreview').src; // Generate actual animation generateAnimation(imageSrc, style, duration) .then(animationUrl => { generateBtn.innerHTML = ' Download Video'; feather.replace(); // Update video preview const videoPreview = document.getElementById('animationPreview'); videoPreview.innerHTML = ` `; // Show success message const toast = document.createElement('div'); toast.className = 'fixed bottom-4 right-4 bg-green-600 text-white px-4 py-2 rounded-lg shadow-lg flex items-center'; toast.innerHTML = ' Video generated successfully!'; document.body.appendChild(toast); feather.replace(); setTimeout(() => { toast.classList.add('opacity-0', 'transition-opacity', 'duration-300'); setTimeout(() => toast.remove(), 300); }, 3000); }, 3000); }); } });