// ========== SKELETON LOADING PLACEHOLDERS ========== (function () { function createSkeletonCard() { const card = document.createElement('div'); card.className = 'skeleton-card'; card.innerHTML = '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
'; return card; } function showSkeletons(count) { const grid = document.getElementById('cards'); if (!grid || grid.querySelector('.card')) return; // Don't show if real cards exist count = count || 6; for (let i = 0; i < count; i++) { const sk = createSkeletonCard(); grid.appendChild(sk); // Stagger fade-in setTimeout(function () { sk.classList.add('loaded'); }, i * 60); } } function hideSkeletons() { const grid = document.getElementById('cards'); if (!grid) return; var skeletons = grid.querySelectorAll('.skeleton-card'); if (!skeletons.length) return; skeletons.forEach(function (sk, i) { setTimeout(function () { sk.style.opacity = '0'; sk.style.transform = 'translateY(-10px)'; }, i * 25); }); // Remove after animation setTimeout(function () { skeletons.forEach(function (sk) { if (sk.parentNode) sk.remove(); }); }, skeletons.length * 25 + 300); } window.SkeletonLoader = { show: showSkeletons, hide: hideSkeletons }; })();