[object Object]

← back to Wallco Ai

feat(/designs): prefetch /design/:id on card hover with 80ms debounce; honors save-data + 2g + prefers-reduced-data so we don't burn metered cellular; click feels instant

6601949dd045dfc60137ac10696215eec53f46ec · 2026-05-14 12:02:24 -0700 · SteveStudio2

Files touched

Diff

commit 6601949dd045dfc60137ac10696215eec53f46ec
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Thu May 14 12:02:24 2026 -0700

    feat(/designs): prefetch /design/:id on card hover with 80ms debounce; honors save-data + 2g + prefers-reduced-data so we don't burn metered cellular; click feels instant
---
 server.js | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/server.js b/server.js
index 5d204f4..3b05795 100644
--- a/server.js
+++ b/server.js
@@ -3910,6 +3910,37 @@ ${cat === 'mural-scenic' ? `
     onScroll();
   })();
   </script>
+
+  <!-- Prefetch /design/:id on card hover so the click feels instant.
+       Debounced 80ms — quick mouse-moves across the grid don't fire dozens.
+       Honors save-data + 2g connections + prefers-reduced-data (skip prefetch
+       on metered/slow networks). -->
+  <script>
+  (function(){
+    var conn = navigator.connection || {};
+    if (conn.saveData || /(^|\b)(slow-)?2g\b/.test(conn.effectiveType || '')) return;
+    var grid = document.getElementById('catalog-grid');
+    if (!grid) return;
+    var done = new Set();
+    var t = null;
+    function prefetch(href){
+      if (done.has(href)) return;
+      done.add(href);
+      var link = document.createElement('link');
+      link.rel = 'prefetch';
+      link.href = href;
+      link.as = 'document';
+      document.head.appendChild(link);
+    }
+    grid.addEventListener('mouseover', function(e){
+      var a = e.target.closest && e.target.closest('a.card-link');
+      if (!a || !a.href) return;
+      clearTimeout(t);
+      t = setTimeout(function(){ prefetch(a.href); }, 80);
+    }, { passive: true });
+    grid.addEventListener('mouseout', function(){ clearTimeout(t); }, { passive: true });
+  })();
+  </script>
 </section>
 </main>
 ${FOOTER}

← 508fcbe feat(/designs): proper empty-state when filter combo returns  ·  back to Wallco Ai  ·  feat(/design/:id): add BreadcrumbList JSON-LD alongside exis dba51ee →