constructor({
        xOffset = 0,
        yOffset = 0,
        lastXDelta = 0,
        lastYDelta = 0,

        shouldWatch = true,

        onScroll = () => {},
    } = {}) {
        this.xOffset = xOffset;
        this.yOffset = yOffset;
        this.lastXDelta = lastXDelta;
        this.lastYDelta = lastYDelta;
        this.shouldWatch = shouldWatch;

        this.onScroll = onScroll;

        // keep a ref to our scroll event
        this.handler = this.scroll.bind(this, true);
        if(this.shouldWatch) {
            window.addEventListener("scroll", this.handler, {
                passive: true
            });
        }
    }
Here we create a ScrollManager class object
 This keeps track of our scroll position, scroll deltas and triggers an onScroll callback
 Could either listen to the native scroll event or be hooked to any scroll (natural or virtual) scroll event

 params:
 @xOffset (float): scroll along X axis
 @yOffset (float): scroll along Y axis
 @lastXDelta (float): last scroll delta along X axis
 @lastYDelta (float): last scroll delta along Y axis

 @shouldWatch (bool): if the scroll manager should listen to the scroll event or not. Default to true.

 @onScroll (function): callback to execute each time the scroll values changed

 returns:
 @this: our ScrollManager class object
*