@tsparticles/plugin-motion
Version:
tsParticles motion sickness plugin
70 lines (69 loc) • 2.75 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "@tsparticles/engine"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MotionInstance = void 0;
const engine_1 = require("@tsparticles/engine");
const defaultFactor = 1, defaultReduce = 1, disableReduce = 0, identity = 1;
class MotionInstance {
constructor(container, engine) {
this._handleMotionChange = mediaQuery => {
const container = this._container, motion = container.actualOptions.motion;
if (!motion) {
return;
}
if (mediaQuery.matches) {
if (motion.disable) {
container.retina.reduceFactor = disableReduce;
}
else {
container.retina.reduceFactor = motion.reduce.value ? identity / motion.reduce.factor : defaultFactor;
}
}
else {
container.retina.reduceFactor = defaultReduce;
}
};
this._container = container;
this._engine = engine;
}
async init() {
const container = this._container, options = container.actualOptions.motion;
if (!(options && (options.disable || options.reduce.value))) {
container.retina.reduceFactor = 1;
return;
}
const mediaQuery = (0, engine_1.safeMatchMedia)("(prefers-reduced-motion: reduce)");
if (!mediaQuery) {
container.retina.reduceFactor = defaultFactor;
return;
}
this._handleMotionChange(mediaQuery);
const handleChange = () => {
void (async () => {
this._handleMotionChange(mediaQuery);
try {
await container.refresh();
}
catch {
}
})();
};
if (mediaQuery.addEventListener !== undefined) {
mediaQuery.addEventListener("change", handleChange);
}
else if (mediaQuery.addListener !== undefined) {
mediaQuery.addListener(handleChange);
}
await Promise.resolve();
}
}
exports.MotionInstance = MotionInstance;
});