diff --git a/src/index.html b/src/index.html index e4069c8..841b105 100644 --- a/src/index.html +++ b/src/index.html @@ -23230,16 +23230,63 @@ // reads as a deck at a glance. function renderDeckPreviewDOM(container, payload, opts = {}) { const slides = payload?.deck?.slides || []; - const first = slides[0]; - const composed = first - ? composeSlideForDeck(first, payload?.deck?.theme) - : { slide: { width: 1920, height: 1080, background: '#ffffff' }, layers: [] }; - renderCustomArtPreviewDOM(container, composed, opts); - if (!container.style.position) container.style.position = 'relative'; - const badge = document.createElement('div'); - badge.className = 'deckCountBadge'; - badge.textContent = slides.length === 1 ? '1 slide' : `${slides.length} slides`; - container.appendChild(badge); + const compact = !!opts.compact; + + // Compact thumbnails (feed cards, profile grid, etc.) keep the + // old single-slide-1 + badge render — pagination would be too + // fiddly at small size. Single-slide decks also use the simple + // path since there's nothing to page through. + if (compact || slides.length <= 1) { + const first = slides[0]; + const composed = first + ? composeSlideForDeck(first, payload?.deck?.theme) + : { slide: { width: 1920, height: 1080, background: '#ffffff' }, layers: [] }; + renderCustomArtPreviewDOM(container, composed, opts); + if (!container.style.position) container.style.position = 'relative'; + const badge = document.createElement('div'); + badge.className = 'deckCountBadge'; + badge.textContent = slides.length === 1 ? '1 slide' : `${slides.length} slides`; + container.appendChild(badge); + return; + } + + // Multi-slide deck in the preview pane → paginated viewer so the + // user (creator or buyer) can flip through every slide in the + // unlocked deck. Mirrors the locked-premium pager UX. + container.style.position = container.style.position || 'relative'; + const stage = document.createElement('div'); + stage.style.cssText = 'width:100%;display:flex;justify-content:center'; + const bar = document.createElement('div'); + bar.style.cssText = 'display:flex;align-items:center;justify-content:center;gap:10px;font-size:.9rem;color:var(--ink);padding:6px 0'; + const prev = document.createElement('button'); + prev.type = 'button'; + prev.textContent = '‹ Prev'; + prev.style.cssText = 'padding:4px 12px;cursor:pointer'; + const counter = document.createElement('span'); + counter.style.cssText = 'min-width:10em;text-align:center;font-variant-numeric:tabular-nums'; + const next = document.createElement('button'); + next.type = 'button'; + next.textContent = 'Next ›'; + next.style.cssText = 'padding:4px 12px;cursor:pointer'; + bar.append(prev, counter, next); + container.append(stage, bar); + let idx = 0; + function renderSlide() { + stage.innerHTML = ''; + const entry = slides[idx]; + const composed = composeSlideForDeck(entry, payload?.deck?.theme); + renderCustomArtPreviewDOM(stage, composed, { compact: false }); + counter.textContent = `Slide ${idx + 1} of ${slides.length}`; + } + prev.addEventListener('click', () => { + idx = (idx - 1 + slides.length) % slides.length; + renderSlide(); + }); + next.addEventListener('click', () => { + idx = (idx + 1) % slides.length; + renderSlide(); + }); + renderSlide(); } // Preview a standalone pixel-art design — the grid rendered crisp.