// ── Paddle data ────────────────────────────────────────────── const paddles = { 'pulse-master': { accent: 'var(--col-control)', eyebrow: 'Round · Control', name: 'Pulse Master', headline: 'Surgical Precision. Total Control.', desc: 'The Pulse Master is designed for the strategist — the player who dictates the rhythm of the point. Its classic round shape provides an enormous sweet spot, giving you ultimate confidence from the baseline to the net. The advanced EVA Memory Foam core remembers the power of your last strike, adapting its density for a soft touch on delicate drops and firm response for deep lobs. Wrapped in responsive 12K carbon fiber, this racket offers incredible feel. Finished with a professional matte surface for improved grip on the ball and integrated anti-vibration technology, the Pulse Master lets you play with effortless command.', specs: [ ['Player Profile', 'Control / Intermediate to Advanced'], ['Shape', 'Classic Round'], ['Weight', '360–370 g'], ['Face', 'Premium 12K Carbon Fiber'], ['Core', 'Smart EVA Memory Foam'], ['Balance', 'Medium'], ['Surface', 'Matte'], ['Special', 'badge:Anti-Vibration System'], ], imgs: ['b0','b1','b2','b3','b4','b5','b6','b7','b8','b9'].map(n => `paddleassets/Round/${n}.png`), prev: null, next: 'kinetic-flow', }, 'kinetic-flow': { accent: 'var(--col-versatile)', eyebrow: 'Teardrop · Versatile', name: 'Kinetic Flow', headline: 'Define Your Game. Effortless Adaptability.', desc: 'For the modern, all-around player who refuses to be pigeonholed. The Kinetic Flow is your dynamic partner. Its Teardrop shape strikes the perfect balance, giving you the control to reset a rally and the explosive power to finish it. Constructed with high-tension 18K carbon fiber, this racket delivers exceptional energy transfer with every hit. The dense EVA Hard core ensures a crisp, powerful response, while the sophisticated 3D Matte surface provides unparalleled grip for advanced spin control.', specs: [ ['Player Profile', 'Versatile All-Rounder / Advanced to Pro'], ['Shape', 'Teardrop'], ['Weight', '365–375 g'], ['Face', 'Advanced 18K Carbon Fiber'], ['Core', 'Denser EVA Hard'], ['Balance', 'Medium'], ['Surface', '3D Matte'], ['Special', 'badge:Anti-Vibration System'], ], imgs: ['c0','c1','c2','c3','c4','c5','c6','c7','c8','c9'].map(n => `paddleassets/TearDrop/${n}.png`), prev: 'pulse-master', next: 'nexus-diamond', }, 'nexus-diamond': { accent: 'var(--col-power)', eyebrow: 'Diamond · Power', name: 'Nexus Diamond', headline: 'Unleash the Force. Ultimate Court Dominance.', desc: 'Engineered for the aggressive point-finisher. The Nexus Diamond is a high-performance weapon. Its Diamond shape and Medium balance put massive weight behind your overheads, converting your kinetic energy into pure, unstoppable velocity. The ultra-rigid EVA Hard core is perfectly paired with ultra-light 24K carbon fiber. The revolutionary 3D Hexagon/Soccer ball patterned surface imparts maximum kick and devastating spin on your smashes.', specs: [ ['Player Profile', 'Aggressive Attacker / Pro Level'], ['Shape', 'Diamond'], ['Weight', '365–375 g'], ['Face', 'Ultra-Rigid 24K Carbon Fiber'], ['Core', 'Maximum Density EVA Hard'], ['Balance', 'Medium'], ['Surface', '3D Hexagon & Soccer Ball'], ['Special', 'badge:Anti-Vibration System'], ], imgs: ['d0','d1','d2','d3','d4','d5','d6','d7','d8','d9'].map(n => `paddleassets/Diamond/${n}.png`), prev: 'kinetic-flow', next: 'hybrid-pulse', }, 'hybrid-pulse': { accent: 'var(--col-intuitive)', eyebrow: 'Mixed · Intuitive', name: 'Hybrid Pulse', headline: 'Intuitive Feel. Balanced Innovation.', desc: 'For the instinctive player seeking a true next-gen experience. The Hybrid Pulse features a unique, carefully tested mixed geometry that feels like a natural extension of your arm. It provides a unique balance that simplifies the game, letting you focus on your opponent, not your racket. This model is all about optimized comfort and classic feel — pairing a premium EVA core with a textured face for a unique blend of softness and grip.', specs: [ ['Player Profile', 'Intuitive Player / Entry to Advanced'], ['Shape', 'Mixed Geometry'], ['Weight', '360 ±10 g'], ['Face', 'Textured Fiber Composite'], ['Core', 'Performance EVA'], ['Balance', 'Medium'], ['Surface', 'Fine Micro-Textured Matte'], ['Special', 'badge:Anti-Vibration System'], ], imgs: ['a0','a1','a2','a3','a4','a5','a6','a7','a8','a9'].map(n => `paddleassets/Mixed/${n}.png`), prev: 'nexus-diamond', next: null, }, }; // ── Load current paddle ────────────────────────────────────── const params = new URLSearchParams(window.location.search); const key = params.get('model') || 'pulse-master'; const p = paddles[key] || paddles['pulse-master']; // Set page title document.title = `${p.name} — Nextpulse Pro`; // Breadcrumb document.getElementById('bc-name').textContent = p.name; // Accent colour on hero section document.getElementById('productHero').style.setProperty('--card-accent', p.accent); // Text content document.getElementById('pEyebrow').textContent = p.eyebrow; document.getElementById('pName').textContent = p.name; document.getElementById('pHeadline').textContent = p.headline; document.getElementById('pDesc').textContent = p.desc; // Accent bar colour document.getElementById('accentBar').style.background = `var(--card-accent)`; // Main image const mainImg = document.getElementById('mainImg'); mainImg.src = p.imgs[0]; mainImg.alt = p.name; // Thumbnails const thumbsRow = document.getElementById('thumbsRow'); p.imgs.forEach((src, i) => { const img = document.createElement('img'); img.src = src; img.alt = `${p.name} view ${i + 1}`; img.className = 'product-gallery__thumb' + (i === 0 ? ' active' : ''); img.addEventListener('click', () => { mainImg.src = src; thumbsRow.querySelectorAll('.product-gallery__thumb').forEach(t => t.classList.remove('active')); img.classList.add('active'); }); thumbsRow.appendChild(img); }); // Spec table const specTable = document.getElementById('specTable'); p.specs.forEach(([label, val]) => { const tr = document.createElement('tr'); const td1 = document.createElement('td'); const td2 = document.createElement('td'); td1.textContent = label; if (val.startsWith('badge:')) { const badge = document.createElement('span'); badge.className = 'spec-badge'; badge.textContent = val.replace('badge:', ''); td2.appendChild(badge); } else { td2.textContent = val; } tr.appendChild(td1); tr.appendChild(td2); specTable.appendChild(tr); }); // Prev / Next paddle nav const productNav = document.getElementById('productNav'); if (p.prev) { const prevPaddle = paddles[p.prev]; productNav.innerHTML += ` ${prevPaddle.name} `; } if (p.next) { const nextPaddle = paddles[p.next]; productNav.innerHTML += ` ${nextPaddle.name} `; } // Full gallery strip const galleryGrid = document.getElementById('galleryGrid'); p.imgs.forEach((src, i) => { const div = document.createElement('div'); div.className = 'gallery-strip__item'; div.innerHTML = `${p.name} ${i + 1}`; galleryGrid.appendChild(div); }); // Related paddles (other 3) const relatedGrid = document.getElementById('relatedGrid'); Object.entries(paddles) .filter(([k]) => k !== key) .forEach(([k, rp]) => { relatedGrid.innerHTML += ` `; }); // Nav const nav = document.getElementById('nav'); const burger = document.getElementById('hamburger'); const mobile = document.getElementById('mobileMenu'); window.addEventListener('scroll', () => nav.classList.toggle('scrolled', window.scrollY > 20)); burger.addEventListener('click', () => { burger.classList.toggle('open'); mobile.classList.toggle('open'); document.body.style.overflow = mobile.classList.contains('open') ? 'hidden' : ''; }); mobile.querySelectorAll('a').forEach(l => l.addEventListener('click', () => { burger.classList.remove('open'); mobile.classList.remove('open'); document.body.style.overflow = ''; })); // Reveal const io = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('visible'); io.unobserve(e.target); } }); }, { threshold: 0.08 }); document.querySelectorAll('.reveal').forEach(el => io.observe(el));