(Math.abs(distance) < 1) {
elem.scrollLeft = targetScrollLeft;
animationFrameId = null;
return;
}
const newScrollLeft = currentScrollLeft + distance * 0.1;
if (newScrollLeft >= 0 && newScrollLeft <= (elem.scrollWidth - elem.clientWidth)) {
elem.scrollLeft = newScrollLeft;
}
animationFrameId = requestAnimationFrame(smoothScrollStep);
};
const handleWheelScroll = (event) => {
if (!isElementCenteredInViewport(elem)) {
return;
}
const visibleWidth = elem.offsetWidth;
const maxScrollLeft = elem.scrollWidth - visibleWidth;
if (maxScrollLeft <= 0) {
return;
}
const delta = event.deltaY > 0 ? 1 : -1;
const nextPosition = elem.scrollLeft + delta * Math.max(20, Math.round(visibleWidth / 10));
const atLeftBoundary = elem.scrollLeft <= 0.5 && delta < 0;
const atRightBoundary = elem.scrollLeft + 20 >= (maxScrollLeft - 0.5) && delta > 0;
event.preventDefault();
targetScrollLeft = Math.min(Math.max(0, nextPosition), maxScrollLeft);
if (!animationFrameId) {
animationFrameId = requestAnimationFrame(smoothScrollStep);
}
};
const arrowSelector = arrowBlocks[index];
setTimeout(() => {
const forwardButtons = document.querySelectorAll(arrowSelector + ' .scrollfwd');
const backButtons = document.querySelectorAll(arrowSelector + ' .scrollback');
forwardButtons.forEach((button) => {
button.style.userSelect = 'none';
button.style.cursor = 'pointer';
button.addEventListener('click', () => {
const newScrollLeft = Math.min(elem.scrollLeft + shift, elem.scrollWidth - elem.clientWidth);
elem.scrollTo({ left: newScrollLeft, behavior: 'smooth' });
});
});
backButtons.forEach((button) => {
button.style.userSelect = 'none';
button.style.cursor = 'pointer';
button.addEventListener('click', () => {
const newScrollLeft = Math.max(0, elem.scrollLeft - shift);
elem.scrollTo({ left: newScrollLeft, behavior: 'smooth' });
});
});
}, 500);
});
});