✦ Verified product
F-One SWING V5
EUR 957.99
Wing Size
Billy.be
Verified independent store
→
Catch and releaseRenowned for its lightness and maneuverability, the SWING excels in waves and freefly, delivering exceptional performance in complete control and evenness. Thanks
to its completely reworked design and reduced wingspan, this fifth SWING perfectly balances stability, ease of use, comfort, control and smooth power delivery. New design and reduced wingspan for lightness, maneuverability, and excellent planing start Sweep Control Panel for ideal trailing edge tension control Stability and comfort in all situations Controlled speed and acceleration for an accessible performance and intuitive ride Excellent freefly Optimized strap position for compatibility of a single Boom with several sizes and models in the entire wing range .progress-container { display: flex; justify-content: space-between; background-color: #f9f9f9; padding: 40px 25px 60px 25px; } .progress-ring { width: 150px; height: 150px; position: relative; text-align: center; } .progress-ring circle { fill: transparent; stroke: #ff6800; stroke-width: 15; transform: rotate(-90deg); transform-origin: 50% 50%; transition: stroke-dashoffset 0.5s; } .progress-ring .ring-background { fill: transparent; stroke: #ccc; stroke-width: 15; transform: rotate(-90deg); transform-origin: 50% 50%; } .progress-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; } .progress-title { font-size: 20px; color: black; margin-top: 10px; } @media (max-width: 768px) { .progress-container { flex-direction: column; align-items: center; } .progress-ring { margin-bottom: 50px; } } PERFORMANCE Freestyle 0% Surf 0% Freefly 0% Speed 0% document.addEventListener("DOMContentLoaded", function() { function animateProgress(ringId, from, to, duration) { const ring = document.querySelector(`#ring${ringId} .ring`); const text = document.getElementById(`progress${ringId}`); const title = document.querySelector(`#ring${ringId} .progress-title`); const circumference = 2 * Math.PI * 65; // Hardcoding the radius as 65 for this example const increment = (to - from) / (duration * 60); let current = from; function update() { if ((increment > 0 && current < to) || (increment < 0 && current > to)) { const offset = circumference - (current / 100) * circumference; ring.style.strokeDasharray = `${circumference} ${circumference}`; ring.style.strokeDashoffset = offset; text.textContent = `${Math.round(current)}%`; current += increment; requestAnimationFrame(update); } else { const offset = circumference - (to / 100) * circumference; ring.style.strokeDashoffset = offset; text.textContent = `${to}%`; } } update(); } function handleIntersection(entries, observer) { entries.forEach((entry) => { if (entry.isIntersecting) { const ringId = entry.target.id.replace('ring', ''); const from = 0; const to = parseInt(entry.target.getAttribute('data-progress'), 10); animateProgress(ringId, from, to, 2); observer.unobserve(entry.target); } }); } const rings = document.querySelectorAll('.progress-ring'); const observer = new IntersectionObserver(handleIntersection, { root: null, rootMargin: '0px', threshold: 0.2 // Adjust this threshold as needed }); rings.forEach((ring) => { observer.observe(ring); }); });