/** * UI Enhancements for the Swiper App * Adds improved visual feedback and animations */ // Add swipe decision indicators function addSwipeDecisionIndicators() { const swipeContainer = document.querySelector('.swipe-container'); // Only proceed if swipe container exists (not on history page) if (!swipeContainer) return; // Create decision indicators for each direction const directions = ['left', 'right', 'up', 'down']; const icons = ['fa-trash', 'fa-folder-plus', 'fa-star', 'fa-clock']; directions.forEach((direction, index) => { const indicator = document.createElement('div'); indicator.className = `swipe-decision decision-${direction}`; indicator.innerHTML = ``; swipeContainer.appendChild(indicator); }); } // Enhance loading indicator function enhanceLoadingIndicator() { const loadingIndicator = document.querySelector('.loading-indicator'); if (loadingIndicator) { loadingIndicator.innerHTML = `
Loading next image...
`; } } // Add hover effects to direction arrows function enhanceDirectionArrows() { const arrows = document.querySelectorAll('.direction-arrow'); // Only proceed if direction arrows exist if (arrows.length === 0) return; arrows.forEach(arrow => { arrow.addEventListener('mouseenter', function() { this.style.transform = this.classList.contains('arrow-left') || this.classList.contains('arrow-right') ? `translateY(-50%) scale(1.2)` : `translateX(-50%) scale(1.2)`; this.style.boxShadow = '0 10px 25px rgba(0, 0, 0, 0.2)'; }); arrow.addEventListener('mouseleave', function() { this.style.transform = this.classList.contains('arrow-left') || this.classList.contains('arrow-right') ? `translateY(-50%) scale(1)` : `translateX(-50%) scale(1)`; this.style.boxShadow = '0 5px 15px rgba(0, 0, 0, 0.1)'; }); }); } // Show swipe decision indicator function showSwipeDecision(direction) { const indicator = document.querySelector(`.decision-${direction}`); if (!indicator) return; indicator.classList.add('visible'); setTimeout(() => { indicator.classList.remove('visible'); }, 800); } // Enhance the performSwipe function function enhancePerformSwipe() { // Store the original performSwipe function const originalPerformSwipe = window.performSwipe; // Only proceed if performSwipe exists (main page only) if (typeof originalPerformSwipe === 'function') { // Override with enhanced version window.performSwipe = function(direction) { // Show the decision indicator showSwipeDecision(direction); // Call the original function return originalPerformSwipe(direction); }; } } // Add card tilt effect based on mouse position function addCardTiltEffect() { const card = document.getElementById('current-card'); const container = document.querySelector('.swipe-container'); if (!card || !container) return; container.addEventListener('mousemove', e => { if (window.innerWidth < 992) return; // Skip on mobile // Only apply when not dragging if (window.state && window.state.isDragging) return; const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; // Calculate rotation based on mouse position const centerX = rect.width / 2; const centerY = rect.height / 2; const rotateY = ((x - centerX) / centerX) * 5; // Max 5 degrees const rotateX = ((centerY - y) / centerY) * 5; // Max 5 degrees // Apply the transform card.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; }); container.addEventListener('mouseleave', () => { // Reset transform when mouse leaves card.style.transform = ''; }); } // Add pulse effect to action buttons function addButtonPulseEffect() { const buttons = document.querySelectorAll('.action-btn'); buttons.forEach(button => { button.addEventListener('mouseenter', function() { this.classList.add('pulse'); }); button.addEventListener('mouseleave', function() { this.classList.remove('pulse'); }); }); // Add the pulse animation to CSS const style = document.createElement('style'); style.textContent = ` @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.05); } 100% { transform: scale(1); } } .action-btn.pulse { animation: pulse 1s infinite; } `; document.head.appendChild(style); } // Enhance the history page items function enhanceHistoryItems() { if (!window.location.pathname.includes('history')) return; // Add hover effect to selection items const items = document.querySelectorAll('.selection-item'); items.forEach(item => { // Add image zoom effect on hover const img = item.querySelector('img'); if (img) { img.style.transition = 'transform 0.3s ease'; item.addEventListener('mouseenter', () => { img.style.transform = 'scale(1.1)'; }); item.addEventListener('mouseleave', () => { img.style.transform = ''; }); } }); } // Initialize all UI enhancements function initUIEnhancements() { // Add a small delay to ensure DOM is fully loaded setTimeout(() => { addSwipeDecisionIndicators(); enhanceLoadingIndicator(); enhanceDirectionArrows(); enhancePerformSwipe(); addCardTiltEffect(); addButtonPulseEffect(); enhanceHistoryItems(); console.log('UI enhancements initialized'); }, 500); } // Run when DOM is loaded document.addEventListener('DOMContentLoaded', initUIEnhancements); // Export functions for potential use in other modules export { showSwipeDecision, addSwipeDecisionIndicators, enhanceLoadingIndicator };