@adoratorio/hades
Version:
A smooth scrollbar based on Hermes, scroll down 'till hell
83 lines • 2.75 kB
JavaScript
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