remove SPA scripts
This commit is contained in:
		@@ -131,66 +131,6 @@ import Layout from '../layouts/Layout.astro';
 | 
			
		||||
    const randomFact = funFacts[Math.floor(Math.random() * funFacts.length)];
 | 
			
		||||
    funFactElement.textContent = randomFact;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Handle SPA transitions for 404 page
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all internal links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links, external links, or already processed
 | 
			
		||||
      if (
 | 
			
		||||
        link.getAttribute('href').includes('#') ||
 | 
			
		||||
        link.getAttribute('target') === '_blank' ||
 | 
			
		||||
        link.hasAttribute('data-spa-handled')
 | 
			
		||||
      ) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Re-initialize back button after SPA navigation
 | 
			
		||||
    const backButton = document.getElementById('back-button');
 | 
			
		||||
    if (backButton) {
 | 
			
		||||
      backButton.addEventListener('click', () => {
 | 
			
		||||
        window.history.back();
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
 
 | 
			
		||||
@@ -475,104 +475,3 @@ const skills = await directus.request(
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  // Handle SPA transitions for about page
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all internal links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links, external links, or already processed
 | 
			
		||||
      if (
 | 
			
		||||
        link.getAttribute('href').includes('#') ||
 | 
			
		||||
        link.getAttribute('target') === '_blank' ||
 | 
			
		||||
        link.hasAttribute('data-spa-handled')
 | 
			
		||||
      ) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Initialize animations for about page
 | 
			
		||||
    function animateAboutContent() {
 | 
			
		||||
      // Animate hero section elements
 | 
			
		||||
      const heroElements = document.querySelectorAll('h1, .order-2 p, .social-links-container');
 | 
			
		||||
      heroElements.forEach((el, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            el.classList.add('animate-reveal');
 | 
			
		||||
          },
 | 
			
		||||
          100 + index * 150
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Animate profile image
 | 
			
		||||
      const profileImage = document.querySelector('.aspect-square');
 | 
			
		||||
      if (profileImage) {
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
          profileImage.classList.add('animate-reveal');
 | 
			
		||||
        }, 200);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Animate skill bars with staggered delay
 | 
			
		||||
      const skillBars = document.querySelectorAll('.skill-bar');
 | 
			
		||||
      skillBars.forEach((bar, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            bar.classList.add('animate-skill');
 | 
			
		||||
          },
 | 
			
		||||
          500 + index * 100
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Animate sections with staggered delay
 | 
			
		||||
      const sections = document.querySelectorAll('section');
 | 
			
		||||
      sections.forEach((section, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            section.classList.add('animate-reveal');
 | 
			
		||||
          },
 | 
			
		||||
          300 + index * 200
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Run animations
 | 
			
		||||
    animateAboutContent();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -183,50 +183,10 @@ const { post, nextPost, prevPost } = Astro.props;
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Handle SPA transitions for blog post navigation
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle prev/next navigation links
 | 
			
		||||
    document.querySelectorAll('a[href^="/blog/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links or already processed
 | 
			
		||||
      if (link.getAttribute('href').includes('#') || link.hasAttribute('data-spa-handled')) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Main initialization function
 | 
			
		||||
  function initializeBlogPost() {
 | 
			
		||||
    // Initialize remaining components
 | 
			
		||||
    initializeCodeCopyButtons();
 | 
			
		||||
    setupSPATransitions();
 | 
			
		||||
 | 
			
		||||
    // Scroll to hash if present in URL
 | 
			
		||||
    if (window.location.hash) {
 | 
			
		||||
@@ -244,9 +204,6 @@ const { post, nextPost, prevPost } = Astro.props;
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', initializeBlogPost);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', initializeBlogPost);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
 
 | 
			
		||||
@@ -382,57 +382,4 @@ const allTags = [...new Set(sortedPosts.flatMap((post) => post.tags || []))];
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // SPA transition handling
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all blog post links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/blog/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links or already processed
 | 
			
		||||
      if (link.getAttribute('href').includes('#') || link.hasAttribute('data-spa-handled')) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Handle year anchor links specially
 | 
			
		||||
    document.querySelectorAll('a[href^="#year-"]').forEach((anchor) => {
 | 
			
		||||
      anchor.setAttribute('data-spa-internal', 'true');
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
@@ -477,58 +477,6 @@ const allTags = [...new Set(posts.flatMap((post) => post.tags || []))].slice(0,
 | 
			
		||||
      animateContent();
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // SPA transition handling for homepage
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all internal links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links, external links, or already processed
 | 
			
		||||
      if (
 | 
			
		||||
        link.getAttribute('href').includes('#') ||
 | 
			
		||||
        link.getAttribute('target') === '_blank' ||
 | 
			
		||||
        link.hasAttribute('data-spa-handled')
 | 
			
		||||
      ) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
@@ -586,6 +534,4 @@ const allTags = [...new Set(posts.flatMap((post) => post.tags || []))].slice(0,
 | 
			
		||||
    opacity: 1 !important;
 | 
			
		||||
    transform: translateY(0) !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Rest of your existing styles... */
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -423,98 +423,3 @@ const relatedTags = [
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  // Handle SPA transitions for tag pages
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all internal links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links, external links, or already processed
 | 
			
		||||
      if (
 | 
			
		||||
        link.getAttribute('href').includes('#') ||
 | 
			
		||||
        link.getAttribute('target') === '_blank' ||
 | 
			
		||||
        link.hasAttribute('data-spa-handled')
 | 
			
		||||
      ) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Initialize animations for tag page
 | 
			
		||||
    function animateTagContent() {
 | 
			
		||||
      // Animate header elements
 | 
			
		||||
      const headerElements = document.querySelectorAll('h1, .tag-icon, .tag-description');
 | 
			
		||||
      headerElements.forEach((el, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            el.classList.add('animate-reveal');
 | 
			
		||||
          },
 | 
			
		||||
          100 + index * 150
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Animate posts with staggered delay
 | 
			
		||||
      const articles = document.querySelectorAll('article');
 | 
			
		||||
      articles.forEach((article, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            article.classList.add('animate-reveal');
 | 
			
		||||
          },
 | 
			
		||||
          400 + index * 100
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // Animate related tags
 | 
			
		||||
      const relatedTags = document.querySelectorAll('.related-tags a');
 | 
			
		||||
      relatedTags.forEach((tag, index) => {
 | 
			
		||||
        setTimeout(
 | 
			
		||||
          () => {
 | 
			
		||||
            tag.classList.add('animate-reveal');
 | 
			
		||||
          },
 | 
			
		||||
          600 + index * 50
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Run animations
 | 
			
		||||
    animateTagContent();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<!-- Add this at the end of your page -->
 | 
			
		||||
 
 | 
			
		||||
@@ -628,87 +628,3 @@ const sortedTags = [...tagObjects].sort((a, b) => b.count - a.count);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  // Handle SPA transitions for tags index page
 | 
			
		||||
  function setupSPATransitions() {
 | 
			
		||||
    // Handle all internal links for SPA transitions
 | 
			
		||||
    document.querySelectorAll('a[href^="/"]').forEach((link) => {
 | 
			
		||||
      // Skip links that are anchor links, external links, or already processed
 | 
			
		||||
      if (
 | 
			
		||||
        link.getAttribute('href').includes('#') ||
 | 
			
		||||
        link.getAttribute('target') === '_blank' ||
 | 
			
		||||
        link.hasAttribute('data-spa-handled')
 | 
			
		||||
      ) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Mark as handled to avoid duplicate listeners
 | 
			
		||||
      link.setAttribute('data-spa-handled', 'true');
 | 
			
		||||
 | 
			
		||||
      link.addEventListener('click', (e) => {
 | 
			
		||||
        // Don't handle if modifier keys are pressed (for opening in new tab, etc.)
 | 
			
		||||
        if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        const targetHref = link.getAttribute('href');
 | 
			
		||||
 | 
			
		||||
        // Trigger page transition animation
 | 
			
		||||
        const pageTransition = document.getElementById('page-transition');
 | 
			
		||||
        if (pageTransition) {
 | 
			
		||||
          pageTransition.classList.remove('opacity-0');
 | 
			
		||||
          pageTransition.classList.add('opacity-100');
 | 
			
		||||
 | 
			
		||||
          // Navigate after transition effect
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            window.location.href = targetHref;
 | 
			
		||||
          }, 300);
 | 
			
		||||
        } else {
 | 
			
		||||
          // Fallback if transition element doesn't exist
 | 
			
		||||
          window.location.href = targetHref;
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Add hover effect for tag cards on touch devices
 | 
			
		||||
    const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
 | 
			
		||||
 | 
			
		||||
    if (isTouchDevice) {
 | 
			
		||||
      const tagCards = document.querySelectorAll('.tag-cloud a');
 | 
			
		||||
 | 
			
		||||
      tagCards.forEach((card) => {
 | 
			
		||||
        card.addEventListener('touchstart', () => {
 | 
			
		||||
          card.classList.add('is-touched');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        card.addEventListener('touchend', () => {
 | 
			
		||||
          setTimeout(() => {
 | 
			
		||||
            card.classList.remove('is-touched');
 | 
			
		||||
          }, 300);
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Animate tag cards with staggered delay
 | 
			
		||||
    const tagCards = document.querySelectorAll('.tag-cloud a');
 | 
			
		||||
    tagCards.forEach((card, index) => {
 | 
			
		||||
      setTimeout(
 | 
			
		||||
        () => {
 | 
			
		||||
          card.classList.add('animate-reveal');
 | 
			
		||||
        },
 | 
			
		||||
        100 + index * 50
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Initialize on first load
 | 
			
		||||
  document.addEventListener('DOMContentLoaded', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // Re-initialize when content changes via Astro's view transitions
 | 
			
		||||
  document.addEventListener('astro:page-load', setupSPATransitions);
 | 
			
		||||
 | 
			
		||||
  // For compatibility with custom transition system
 | 
			
		||||
  document.addEventListener('page-transition-complete', setupSPATransitions);
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user