@tsparticles/interaction-external-bounce
Version:
tsParticles bounce external interaction
53 lines (52 loc) • 2.2 kB
JavaScript
import { ExternalInteractorBase, isDivModeEnabled, mouseMoveEvent, } from "@tsparticles/plugin-interactivity";
import { isInArray, loadOptionProperty } from "@tsparticles/engine";
import { divBounce, mouseBounce } from "./Utils.js";
import { Bounce } from "./Options/Classes/Bounce.js";
const bounceMode = "bounce";
export class Bouncer extends ExternalInteractorBase {
#maxDistance;
constructor(container) {
super(container);
this.#maxDistance = 0;
}
get maxDistance() {
return this.#maxDistance;
}
clear() {
}
init() {
const container = this.container, bounce = container.actualOptions.interactivity?.modes.bounce;
if (!bounce) {
return;
}
this.#maxDistance = bounce.distance;
container.retina.bounceModeDistance = bounce.distance * container.retina.pixelRatio;
}
interact(interactivityData) {
const container = this.container, options = container.actualOptions, events = options.interactivity?.events, mouseMoveStatus = interactivityData.status === mouseMoveEvent;
if (!events) {
return;
}
const hoverEnabled = events.onHover.enable, hoverMode = events.onHover.mode, divs = events.onDiv;
if (mouseMoveStatus && hoverEnabled && isInArray(bounceMode, hoverMode)) {
mouseBounce(this.container, interactivityData, p => this.isEnabled(interactivityData, p));
}
else {
divBounce(this.container, divs, bounceMode, p => this.isEnabled(interactivityData, p));
}
}
isEnabled(interactivityData, particle) {
const container = this.container, options = container.actualOptions, mouse = interactivityData.mouse, events = (particle?.interactivity ?? options.interactivity)?.events;
if (!events) {
return false;
}
const divs = events.onDiv;
return ((!!mouse.position && events.onHover.enable && isInArray(bounceMode, events.onHover.mode)) ||
isDivModeEnabled(bounceMode, divs));
}
loadModeOptions(options, ...sources) {
loadOptionProperty(options, "bounce", Bounce, ...sources);
}
reset() {
}
}