00
Y.00
00
X.00
00
SERGI PEGUERA
22.00
Industrial Design
08870 Sitges / 08025 Barcelona
33:00
IG
T
M
©2026 Sergi Peguera. All rights reserved.
Design by Júlia Blanco & Lluis Domingo.
X.00
00
Y.00
00
list.forEach(url => { const img = document.createElement('img'); img.src = url; img.loading = 'lazy'; img.draggable = false; el.appendChild(img); }); } const trackH = document.getElementById('track-h'); const trackV = document.getElementById('track-v'); if (!trackH || !trackV) return; const state = { h: { el: trackH, pos: 0, axis: 'x', dir: -1 }, v: { el: trackV, pos: 0, axis: 'y', dir: -1 }, }; let scrollBoost = 0; let lastScrollY = window.scrollY; window.addEventListener('scroll', () => { const delta = window.scrollY - lastScrollY; lastScrollY = window.scrollY; scrollBoost = delta * SCROLL_SENS; }, { passive: true }); window.addEventListener('wheel', (e) => { scrollBoost = e.deltaY * SCROLL_SENS * 0.15; }, { passive: true }); // ── SUPORT TÀCTIL (MÒBIL) ──────────────────────────────── let lastTouchY = 0; window.addEventListener('touchstart', (e) => { lastTouchY = e.touches[0].clientY; }, { passive: true }); window.addEventListener('touchmove', (e) => { const currentY = e.touches[0].clientY; const delta = lastTouchY - currentY; lastTouchY = currentY; scrollBoost = delta * SCROLL_SENS * 0.6; }, { passive: true }); function tick() { scrollBoost *= DECAY; if (Math.abs(scrollBoost) < 0.005) scrollBoost = 0; const speed = BASE_SPEED + scrollBoost; Object.values(state).forEach(c => { c.pos += speed * c.dir; const total = c.axis === 'x' ? c.el.scrollWidth : c.el.scrollHeight; const segment = total / 3; if (c.dir === -1 && Math.abs(c.pos) >= segment) c.pos = 0; if (c.dir === 1 && c.pos >= segment) c.pos = 0; c.el.style.transform = c.axis === 'x' ? `translateX(${c.pos}px)` : `translateY(${c.pos}px)`; }); requestAnimationFrame(tick); } async function loadFromArena() { try { const res = await fetch( `https://api.are.na/v2/channels/${ARENA_SLUG}/contents?per=100&sort=position&direction=desc` ); const data = await res.json(); const IMAGES = data.contents .filter(block => block.class === 'Image' && block.image) .map(block => block.image.original.url); if (IMAGES.length === 0) { console.warn('Are.na: no s\'han trobat imatges al canal'); return; } const shuffled = shuffle(IMAGES); const imagesH = shuffled.filter((_, i) => i % 2 === 0); const imagesV = shuffled.filter((_, i) => i % 2 !== 0); fillTrack(trackH, imagesH); fillTrack(trackV, imagesV); requestAnimationFrame(tick); } catch (err) { console.error('Are.na API error:', err); } } loadFromArena(); })();