UNPKG

@trap_stevo/legendarybuilderproreact-ui

Version:

The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton

84 lines (81 loc) 3.36 kB
/* Created by Hassan Steven Compton. March 7, 2024. */ function HUDScrollerObserver(document) { var hudScroller = document.querySelector('.hud-scroller'); if (hudScroller === null || hudScroller === undefined) { return function () {}; } var verticalOrientation = false; if (hudScroller.scrollHeight > hudScroller.clientHeight) { verticalOrientation = true; } var mouseDown = false; var hovered = false; var handleHUDScroll = function handleHUDScroll() { var scrollPosition = verticalOrientation ? hudScroller.scrollTop : hudScroller.scrollLeft; var maxScroll = verticalOrientation ? hudScroller.scrollHeight - hudScroller.clientHeight : hudScroller.scrollWidth - hudScroller.clientWidth; var atScrollEnd = scrollPosition === maxScroll; var red = [227, 14, 14]; var black = [0, 0, 0]; var interpolatedColor = interpolateColor(hovered && mouseDown ? [255, 31, 34] : red, hovered && mouseDown ? [69, 69, 69] : black, scrollPosition / maxScroll); var rgbColor = "rgb(".concat(interpolatedColor.join(','), ")"); hudScroller.style.setProperty('--scrollbar-thumb-color', rgbColor); if (atScrollEnd) { hudScroller.classList.add('end-scroll'); return; } hudScroller.classList.remove('end-scroll'); return; }; var handleMouseMove = function handleMouseMove(event) { var _hudScroller$getBound = hudScroller.getBoundingClientRect(), top = _hudScroller$getBound.top, bottom = _hudScroller$getBound.bottom, left = _hudScroller$getBound.left, right = _hudScroller$getBound.right; hovered = verticalOrientation && event.clientY >= top && event.clientY <= bottom || !verticalOrientation && event.clientX >= left && event.clientX <= right; handleHUDScroll(); return; }; var handleMouseLeave = function handleMouseLeave() { hudScroller.classList.remove('thumb-hovered'); return; }; var handleMouseEnter = function handleMouseEnter() { hudScroller.classList.add('thumb-hovered'); return; }; var handleMouseDown = function handleMouseDown() { mouseDown = true; handleHUDScroll(); return; }; var handleMouseUp = function handleMouseUp() { mouseDown = false; handleHUDScroll(); return; }; hudScroller.addEventListener('scroll', handleHUDScroll); hudScroller.addEventListener('mouseenter', handleMouseEnter); hudScroller.addEventListener('mouseleave', handleMouseLeave); hudScroller.addEventListener('mousemove', handleMouseMove); hudScroller.addEventListener('mousedown', handleMouseDown); hudScroller.addEventListener('mouseup', handleMouseUp); return function () { hudScroller.removeEventListener('scroll', handleHUDScroll); hudScroller.removeEventListener('mouseenter', handleMouseEnter); hudScroller.removeEventListener('mouseleave', handleMouseLeave); hudScroller.removeEventListener('mousemove', handleMouseMove); hudScroller.removeEventListener('mousedown', handleMouseDown); hudScroller.removeEventListener('mouseup', handleMouseUp); }; } function interpolateColor(color1, color2, factor) { return color1.map(function (channel, index) { var blendedChannel = Math.round(channel + factor * (color2[index] - channel)); return Math.min(255, Math.max(0, blendedChannel)); }); } export default HUDScrollerObserver;