UNPKG

tsparticles

Version:

Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.

53 lines (52 loc) 2.62 kB
import { Constants, ExternalInteractorBase } from "../../../Core"; import { getDistance, getLinkColor, getLinkRandomColor, isInArray } from "../../../Utils"; /** * Particle grab manager * @category Interactions */ export class Grabber extends ExternalInteractorBase { constructor(container) { super(container); } isEnabled() { const container = this.container, mouse = container.interactivity.mouse, events = container.actualOptions.interactivity.events; return events.onHover.enable && !!mouse.position && isInArray("grab" /* grab */, events.onHover.mode); } reset() { // do nothing } async interact() { var _a; const container = this.container, options = container.actualOptions, interactivity = options.interactivity; if (interactivity.events.onHover.enable && container.interactivity.status === Constants.mouseMoveEvent) { const mousePos = container.interactivity.mouse.position; if (!mousePos) { return; } const distance = container.retina.grabModeDistance, query = container.particles.quadTree.queryCircle(mousePos, distance); for (const particle of query) { /* draw a line between the cursor and the particle if the distance between them is under the config distance */ const pos = particle.getPosition(), pointDistance = getDistance(pos, mousePos); if (pointDistance <= distance) { const grabLineOptions = interactivity.modes.grab.links, lineOpacity = grabLineOptions.opacity, opacityLine = lineOpacity - (pointDistance * lineOpacity) / distance; if (opacityLine <= 0) { continue; } const optColor = (_a = grabLineOptions.color) !== null && _a !== void 0 ? _a : particle.options.links.color; if (!container.particles.grabLineColor) { const linksOptions = options.interactivity.modes.grab.links; container.particles.grabLineColor = getLinkRandomColor(optColor, linksOptions.blink, linksOptions.consent); } const colorLine = getLinkColor(particle, undefined, container.particles.grabLineColor); if (!colorLine) { return; } container.canvas.drawGrabLine(particle, colorLine, opacityLine, mousePos); } } } } }