UNPKG

@tsparticles/interaction-external-attract

Version:

tsParticles attract external interaction

82 lines (81 loc) 3.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Attractor = void 0; const engine_1 = require("@tsparticles/engine"); const Utils_js_1 = require("./Utils.js"); const Attract_js_1 = require("./Options/Classes/Attract.js"); const attractMode = "attract"; class Attractor extends engine_1.ExternalInteractorBase { constructor(engine, container) { super(container); this._engine = engine; if (!container.attract) { container.attract = { particles: [] }; } this.handleClickMode = (mode) => { const options = this.container.actualOptions, attract = options.interactivity.modes.attract; if (!attract || mode !== attractMode) { return; } if (!container.attract) { container.attract = { particles: [] }; } container.attract.clicking = true; container.attract.count = 0; for (const particle of container.attract.particles) { if (!this.isEnabled(particle)) { continue; } particle.velocity.setTo(particle.initialVelocity); } container.attract.particles = []; container.attract.finish = false; setTimeout(() => { if (container.destroyed) { return; } if (!container.attract) { container.attract = { particles: [] }; } container.attract.clicking = false; }, attract.duration * engine_1.millisecondsToSeconds); }; } clear() { } init() { const container = this.container, attract = container.actualOptions.interactivity.modes.attract; if (!attract) { return; } container.retina.attractModeDistance = attract.distance * container.retina.pixelRatio; } interact() { const container = this.container, options = container.actualOptions, mouseMoveStatus = container.interactivity.status === engine_1.mouseMoveEvent, events = options.interactivity.events, { enable: hoverEnabled, mode: hoverMode } = events.onHover, { enable: clickEnabled, mode: clickMode } = events.onClick; if (mouseMoveStatus && hoverEnabled && (0, engine_1.isInArray)(attractMode, hoverMode)) { (0, Utils_js_1.hoverAttract)(this._engine, this.container, p => this.isEnabled(p)); } else if (clickEnabled && (0, engine_1.isInArray)(attractMode, clickMode)) { (0, Utils_js_1.clickAttract)(this._engine, this.container, p => this.isEnabled(p)); } } isEnabled(particle) { const container = this.container, options = container.actualOptions, mouse = container.interactivity.mouse, events = (particle?.interactivity ?? options.interactivity).events; if ((!mouse.position || !events.onHover.enable) && (!mouse.clickPosition || !events.onClick.enable)) { return false; } const hoverMode = events.onHover.mode, clickMode = events.onClick.mode; return (0, engine_1.isInArray)(attractMode, hoverMode) || (0, engine_1.isInArray)(attractMode, clickMode); } loadModeOptions(options, ...sources) { if (!options.attract) { options.attract = new Attract_js_1.Attract(); } for (const source of sources) { options.attract.load(source?.attract); } } reset() { } } exports.Attractor = Attractor;