← back to Dw Domain Fleet
shared/render.js: universal hover-preview — stamp --card-bg on card-img inline style + ::after pseudo-element shows 3×3 tile-repeat of the same image on :hover (reveals the seamless pattern structure). One edit applies to all 44 sister sites in dw-domain-fleet/sites/ on next restart. prefers-reduced-motion guarded.
aa83057baaf48f4b0ca5dc0d139cd3bd616602c6 · 2026-05-28 10:54:51 -0700 · Steve Abrams
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Files touched
Diff
commit aa83057baaf48f4b0ca5dc0d139cd3bd616602c6
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu May 28 10:54:51 2026 -0700
shared/render.js: universal hover-preview — stamp --card-bg on card-img inline style + ::after pseudo-element shows 3×3 tile-repeat of the same image on :hover (reveals the seamless pattern structure). One edit applies to all 44 sister sites in dw-domain-fleet/sites/ on next restart. prefers-reduced-motion guarded.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
shared/render.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/shared/render.js b/shared/render.js
index 85e2e24..7883aad 100644
--- a/shared/render.js
+++ b/shared/render.js
@@ -115,7 +115,10 @@ html[data-theme=dark] .theme-toggle .icon-moon{display:inline-block}
cursor:pointer;transition:transform .2s,box-shadow .2s;display:flex;flex-direction:column}
.card:hover{transform:translateY(-3px);box-shadow:0 12px 30px rgba(0,0,0,.13)}
.card-link{display:flex;flex-direction:column;height:100%;color:inherit}
-.card-img{aspect-ratio:1/1.04;background:#eee center/cover no-repeat}
+.card-img{aspect-ratio:1/1.04;background:#eee center/cover no-repeat;position:relative;overflow:hidden}
+.card-img::after{content:"";position:absolute;inset:0;background-image:var(--card-bg,none);background-repeat:repeat;background-size:33.33% 33.33%;background-position:center;opacity:0;transition:opacity 360ms ease;pointer-events:none}
+.card:hover .card-img::after,.card-link:focus-visible .card-img::after{opacity:1}
+@media (prefers-reduced-motion: reduce){.card-img::after{transition:none}}
.card-body{padding:13px 14px 16px}
.card-title{font-family:var(--serif);font-size:16px;line-height:1.25;min-height:40px}
.card-meta{font-size:11px;color:var(--muted);letter-spacing:.04em;margin-top:6px;
@@ -252,7 +255,7 @@ function card(p) {
data-img="${esc(p.image_url)}" data-tags="${esc((p.tags||[]).slice(0,12).join(', '))}"
data-price="${esc(p.price)}">
<a class="card-link" href="${esc(href)}" aria-label="${esc(t)}">
- <div class="card-img" style="background-image:url('${esc(p.image_url)}')"></div>
+ <div class="card-img" style="background-image:url('${esc(p.image_url)}');--card-bg:url('${esc(p.image_url)}')"></div>
<div class="card-body">
<div class="card-title">${esc(t)}</div>
<div class="card-meta"><span class="dot" style="background:${hx}"></span>
← 1e6fa79 catalog: hydrate sort dropdown + density slider from localSt
·
back to Dw Domain Fleet
·
shared/render.js: reconcile prod drift — pull equalize toolb af735a7 →