JS snippet

// View Transitions API (Chrome 111+)
async function navigateTo(url) {
  if (!document.startViewTransition) {
    window.location.href = url;
    return;
  }

  document.startViewTransition(async () => {
    const response = await fetch(url);
    const html = await response.text();
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, 'text/html');
    document.body.innerHTML = doc.body.innerHTML;
    window.history.pushState({}, '', url);
  });
}

/* CSS */
/* ::view-transition-old(root) { animation: fadeOut 0.2s ease; }
   ::view-transition-new(root) { animation: fadeIn  0.2s ease; } */