UNPKG

@adoratorio/hades

Version:

A smooth scrollbar based on Hermes, scroll down 'till hell

83 lines 2.75 kB
class StartStop { _still = false; _prev = { x: 0, y: 0 }; _prevTs = 0; context = null; options; startNeedEmission = true; stopNeedEmission = false; name = 'StartStop'; constructor(options) { const defaults = { scrollNode: window, emitGlobal: false, callbacks: { start: () => { }, stop: () => { }, }, precision: 2, mobileDelay: 500, }; this.options = { ...defaults, ...options }; } register(context) { this.context = context; } render(context) { if (window.matchMedia('(pointer: fine)').matches) { const vX = parseFloat(context.velocity.x.toFixed(this.options.precision)); const vY = parseFloat(context.velocity.y.toFixed(this.options.precision)); this.check(vX, vY); } else { const ts = Date.now(); const delta = ts - this._prevTs; if (!window.matchMedia('(pointer: fine)').matches) { const propX = this.options.scrollNode === window ? 'scrollX' : 'scrollLeft'; const propY = this.options.scrollNode === window ? 'scrollY' : 'scrollTop'; const vX = this.options.scrollNode[propX] - this._prev.x; const vY = this.options.scrollNode[propY] - this._prev.y; if (delta > this.options.mobileDelay) { this._prevTs = ts; this.check(vX, vY); } this._prev = { x: this.options.scrollNode[propX], y: this.options.scrollNode[propY], }; } } } check(x, y) { if (x === 0 && y === 0) { this._still = true; if (this.stopNeedEmission) { this.options.callbacks.stop(this); this.emitStillChange('stop'); this.stopNeedEmission = false; this.startNeedEmission = true; } } else { this._still = false; if (this.startNeedEmission) { this.options.callbacks.start(this); this.emitStillChange('start'); this.startNeedEmission = false; this.stopNeedEmission = true; } } } emitStillChange(type) { if (this.options.emitGlobal) { const eventInit = {}; const customEvent = new CustomEvent(`hades-${type}`, eventInit); window.dispatchEvent(customEvent); } } get still() { return this._still; } } export default StartStop; //# sourceMappingURL=index.js.map