UNPKG

@tsparticles/interaction-external-bounce

Version:

tsParticles bounce external interaction

53 lines (52 loc) 2.2 kB
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() { } }