@tsparticles/plugin-absorbers 3.0.3 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/142.min.js +2 -0
- package/142.min.js.LICENSE.txt +1 -0
- package/28.min.js +2 -0
- package/28.min.js.LICENSE.txt +1 -0
- package/327.min.js +2 -0
- package/327.min.js.LICENSE.txt +1 -0
- package/browser/AbsorberInstance.js +19 -14
- package/browser/Absorbers.js +19 -13
- package/browser/AbsorbersPlugin.js +45 -0
- package/browser/index.js +1 -45
- package/cjs/AbsorberInstance.js +18 -13
- package/cjs/Absorbers.js +42 -13
- package/cjs/AbsorbersPlugin.js +72 -0
- package/cjs/index.js +13 -45
- package/dist_browser_AbsorberInstance_js.js +30 -0
- package/dist_browser_AbsorbersPlugin_js.js +60 -0
- package/dist_browser_Absorbers_js.js +30 -0
- package/esm/AbsorberInstance.js +19 -14
- package/esm/Absorbers.js +19 -13
- package/esm/AbsorbersPlugin.js +45 -0
- package/esm/index.js +1 -45
- package/package.json +2 -2
- package/report.html +3 -3
- package/tsparticles.plugin.absorbers.js +241 -368
- package/tsparticles.plugin.absorbers.min.js +1 -1
- package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +1 -1
- package/types/AbsorberContainer.d.ts +1 -1
- package/types/AbsorberInstance.d.ts +1 -1
- package/types/Absorbers.d.ts +3 -3
- package/types/AbsorbersPlugin.d.ts +11 -0
- package/umd/AbsorberInstance.js +18 -13
- package/umd/Absorbers.js +44 -14
- package/umd/AbsorbersPlugin.js +83 -0
- package/umd/index.js +15 -46
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Author : Matteo Bruni
|
|
3
|
+
* MIT license: https://opensource.org/licenses/MIT
|
|
4
|
+
* Demo / Generator : https://particles.js.org/
|
|
5
|
+
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
|
+
* How to use? : Check the GitHub README
|
|
7
|
+
* v3.2.0
|
|
8
|
+
*/
|
|
9
|
+
"use strict";
|
|
10
|
+
/*
|
|
11
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
12
|
+
* This devtool is neither made for production nor for readable output files.
|
|
13
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
14
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
15
|
+
* or disable the default devtool with "devtool: false".
|
|
16
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
17
|
+
*/
|
|
18
|
+
(this["webpackChunk_tsparticles_plugin_absorbers"] = this["webpackChunk_tsparticles_plugin_absorbers"] || []).push([["dist_browser_AbsorberInstance_js"],{
|
|
19
|
+
|
|
20
|
+
/***/ "./dist/browser/AbsorberInstance.js":
|
|
21
|
+
/*!******************************************!*\
|
|
22
|
+
!*** ./dist/browser/AbsorberInstance.js ***!
|
|
23
|
+
\******************************************/
|
|
24
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
25
|
+
|
|
26
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberInstance: () => (/* binding */ AbsorberInstance)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nconst squareExp = 2,\n absorbFactor = 0.033,\n minOrbitLength = 0,\n minRadius = 0,\n minMass = 0,\n origin = {\n x: 0,\n y: 0\n },\n minAngle = 0,\n double = 2,\n maxAngle = Math.PI * double,\n minVelocity = 0;\nclass AbsorberInstance {\n constructor(absorbers, container, options, position) {\n this.absorbers = absorbers;\n this.container = container;\n this._calcPosition = () => {\n const exactPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSizeRanged)({\n size: this.container.canvas.size,\n position: this.options.position\n });\n return _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(exactPosition.x, exactPosition.y);\n };\n this._updateParticlePosition = (particle, v) => {\n if (particle.destroyed) {\n return;\n }\n const container = this.container,\n canvasSize = container.canvas.size;\n if (particle.needsNewPosition) {\n const newPosition = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.calcPositionOrRandomFromSize)({\n size: canvasSize\n });\n particle.position.setTo(newPosition);\n particle.velocity.setTo(particle.initialVelocity);\n particle.absorberOrbit = undefined;\n particle.needsNewPosition = false;\n }\n if (this.options.orbits) {\n if (particle.absorberOrbit === undefined) {\n particle.absorberOrbit = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin;\n particle.absorberOrbit.length = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(particle.getPosition(), this.position);\n particle.absorberOrbit.angle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * maxAngle;\n }\n if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {\n const minSize = Math.min(canvasSize.width, canvasSize.height),\n offset = 1,\n randomOffset = 0.1,\n randomFactor = 0.2;\n particle.absorberOrbit.length = minSize * (offset + ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRandom)() * randomFactor - randomOffset));\n }\n if (particle.absorberOrbitDirection === undefined) {\n particle.absorberOrbitDirection = particle.velocity.x >= minVelocity ? \"clockwise\" : \"counter-clockwise\";\n }\n const orbitRadius = particle.absorberOrbit.length,\n orbitAngle = particle.absorberOrbit.angle,\n orbitDirection = particle.absorberOrbitDirection;\n particle.velocity.setTo(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin);\n const updateFunc = {\n x: orbitDirection === \"clockwise\" ? Math.cos : Math.sin,\n y: orbitDirection === \"clockwise\" ? Math.sin : Math.cos\n };\n particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);\n particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);\n particle.absorberOrbit.length -= v.length;\n particle.absorberOrbit.angle += (particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio / _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.percentDenominator * container.retina.reduceFactor;\n } else {\n const addV = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin;\n addV.length = v.length;\n addV.angle = v.angle;\n particle.velocity.addTo(addV);\n }\n };\n this.initialPosition = position ? _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(position.x, position.y) : undefined;\n if (options instanceof _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber) {\n this.options = options;\n } else {\n this.options = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n this.options.load(options);\n }\n this.dragging = false;\n this.name = this.options.name;\n this.opacity = this.options.opacity;\n this.size = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getRangeValue)(this.options.size.value) * container.retina.pixelRatio;\n this.mass = this.size * this.options.size.density * container.retina.reduceFactor;\n const limit = this.options.size.limit;\n this.limit = {\n radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,\n mass: limit.mass\n };\n this.color = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.rangeColorToRgb)(this.options.color) ?? {\n b: 0,\n g: 0,\n r: 0\n };\n this.position = this.initialPosition?.copy() ?? this._calcPosition();\n }\n attract(particle) {\n const container = this.container,\n options = this.options;\n if (options.draggable) {\n const mouse = container.interactivity.mouse;\n if (mouse.clicking && mouse.downPosition) {\n const mouseDist = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistance)(this.position, mouse.downPosition);\n if (mouseDist <= this.size) {\n this.dragging = true;\n }\n } else {\n this.dragging = false;\n }\n if (this.dragging && mouse.position) {\n this.position.x = mouse.position.x;\n this.position.y = mouse.position.y;\n }\n }\n const pos = particle.getPosition(),\n {\n dx,\n dy,\n distance\n } = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getDistances)(this.position, pos),\n v = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.create(dx, dy);\n v.length = this.mass / Math.pow(distance, squareExp) * container.retina.reduceFactor;\n if (distance < this.size + particle.getRadius()) {\n const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio;\n if (this.size > particle.getRadius() && distance < this.size - particle.getRadius() || particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength) {\n if (options.destroy) {\n particle.destroy();\n } else {\n particle.needsNewPosition = true;\n this._updateParticlePosition(particle, v);\n }\n } else {\n if (options.destroy) {\n particle.size.value -= sizeFactor;\n }\n this._updateParticlePosition(particle, v);\n }\n if (this.limit.radius <= minRadius || this.size < this.limit.radius) {\n this.size += sizeFactor;\n }\n if (this.limit.mass <= minMass || this.mass < this.limit.mass) {\n this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;\n }\n } else {\n this._updateParticlePosition(particle, v);\n }\n }\n async draw(context) {\n context.translate(this.position.x, this.position.y);\n context.beginPath();\n context.arc(origin.x, origin.y, this.size, minAngle, maxAngle, false);\n context.closePath();\n context.fillStyle = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.getStyleFromRgb)(this.color, this.opacity);\n context.fill();\n await Promise.resolve();\n }\n resize() {\n const initialPosition = this.initialPosition;\n this.position = initialPosition && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isPointInside)(initialPosition, this.container.canvas.size, _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.Vector.origin) ? initialPosition : this._calcPosition();\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorberInstance.js?");
|
|
27
|
+
|
|
28
|
+
/***/ })
|
|
29
|
+
|
|
30
|
+
}]);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Author : Matteo Bruni
|
|
3
|
+
* MIT license: https://opensource.org/licenses/MIT
|
|
4
|
+
* Demo / Generator : https://particles.js.org/
|
|
5
|
+
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
|
+
* How to use? : Check the GitHub README
|
|
7
|
+
* v3.2.0
|
|
8
|
+
*/
|
|
9
|
+
"use strict";
|
|
10
|
+
/*
|
|
11
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
12
|
+
* This devtool is neither made for production nor for readable output files.
|
|
13
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
14
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
15
|
+
* or disable the default devtool with "devtool: false".
|
|
16
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
17
|
+
*/
|
|
18
|
+
(this["webpackChunk_tsparticles_plugin_absorbers"] = this["webpackChunk_tsparticles_plugin_absorbers"] || []).push([["dist_browser_AbsorbersPlugin_js"],{
|
|
19
|
+
|
|
20
|
+
/***/ "./dist/browser/AbsorbersPlugin.js":
|
|
21
|
+
/*!*****************************************!*\
|
|
22
|
+
!*** ./dist/browser/AbsorbersPlugin.js ***!
|
|
23
|
+
\*****************************************/
|
|
24
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
25
|
+
|
|
26
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorbersPlugin: () => (/* binding */ AbsorbersPlugin)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Options/Classes/Absorber.js */ \"./dist/browser/Options/Classes/Absorber.js\");\n\n\nclass AbsorbersPlugin {\n constructor() {\n this.id = \"absorbers\";\n }\n async getPlugin(container) {\n const {\n Absorbers\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_Absorbers_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./Absorbers.js */ \"./dist/browser/Absorbers.js\"));\n return new Absorbers(container);\n }\n loadOptions(options, source) {\n if (!this.needsPlugin(options) && !this.needsPlugin(source)) {\n return;\n }\n if (source?.absorbers) {\n options.absorbers = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(source.absorbers, absorber => {\n const tmp = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n tmp.load(absorber);\n return tmp;\n });\n }\n options.interactivity.modes.absorbers = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(source?.interactivity?.modes?.absorbers, absorber => {\n const tmp = new _Options_Classes_Absorber_js__WEBPACK_IMPORTED_MODULE_1__.Absorber();\n tmp.load(absorber);\n return tmp;\n });\n }\n needsPlugin(options) {\n if (!options) {\n return false;\n }\n const absorbers = options.absorbers;\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isArray)(absorbers)) {\n return !!absorbers.length;\n } else if (absorbers) {\n return true;\n } else if (options.interactivity?.events?.onClick?.mode && (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isInArray)(\"absorber\", options.interactivity.events.onClick.mode)) {\n return true;\n }\n return false;\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/AbsorbersPlugin.js?");
|
|
27
|
+
|
|
28
|
+
/***/ }),
|
|
29
|
+
|
|
30
|
+
/***/ "./dist/browser/Options/Classes/Absorber.js":
|
|
31
|
+
/*!**************************************************!*\
|
|
32
|
+
!*** ./dist/browser/Options/Classes/Absorber.js ***!
|
|
33
|
+
\**************************************************/
|
|
34
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
35
|
+
|
|
36
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorber: () => (/* binding */ Absorber)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSize.js */ \"./dist/browser/Options/Classes/AbsorberSize.js\");\n\n\nclass Absorber {\n constructor() {\n this.color = new _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor();\n this.color.value = \"#000000\";\n this.draggable = false;\n this.opacity = 1;\n this.destroy = true;\n this.orbits = false;\n this.size = new _AbsorberSize_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSize();\n }\n load(data) {\n if (data === undefined) {\n return;\n }\n if (data.color !== undefined) {\n this.color = _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.OptionsColor.create(this.color, data.color);\n }\n if (data.draggable !== undefined) {\n this.draggable = data.draggable;\n }\n this.name = data.name;\n if (data.opacity !== undefined) {\n this.opacity = data.opacity;\n }\n if (data.position !== undefined) {\n this.position = {};\n if (data.position.x !== undefined) {\n this.position.x = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.x);\n }\n if (data.position.y !== undefined) {\n this.position.y = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.setRangeValue)(data.position.y);\n }\n }\n if (data.size !== undefined) {\n this.size.load(data.size);\n }\n if (data.destroy !== undefined) {\n this.destroy = data.destroy;\n }\n if (data.orbits !== undefined) {\n this.orbits = data.orbits;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/Absorber.js?");
|
|
37
|
+
|
|
38
|
+
/***/ }),
|
|
39
|
+
|
|
40
|
+
/***/ "./dist/browser/Options/Classes/AbsorberSize.js":
|
|
41
|
+
/*!******************************************************!*\
|
|
42
|
+
!*** ./dist/browser/Options/Classes/AbsorberSize.js ***!
|
|
43
|
+
\******************************************************/
|
|
44
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
45
|
+
|
|
46
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSize: () => (/* binding */ AbsorberSize)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AbsorberSizeLimit.js */ \"./dist/browser/Options/Classes/AbsorberSizeLimit.js\");\n\n\nclass AbsorberSize extends _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.ValueWithRandom {\n constructor() {\n super();\n this.density = 5;\n this.value = 50;\n this.limit = new _AbsorberSizeLimit_js__WEBPACK_IMPORTED_MODULE_1__.AbsorberSizeLimit();\n }\n load(data) {\n if (!data) {\n return;\n }\n super.load(data);\n if (data.density !== undefined) {\n this.density = data.density;\n }\n if ((0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(data.limit)) {\n this.limit.radius = data.limit;\n } else {\n this.limit.load(data.limit);\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSize.js?");
|
|
47
|
+
|
|
48
|
+
/***/ }),
|
|
49
|
+
|
|
50
|
+
/***/ "./dist/browser/Options/Classes/AbsorberSizeLimit.js":
|
|
51
|
+
/*!***********************************************************!*\
|
|
52
|
+
!*** ./dist/browser/Options/Classes/AbsorberSizeLimit.js ***!
|
|
53
|
+
\***********************************************************/
|
|
54
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
55
|
+
|
|
56
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbsorberSizeLimit: () => (/* binding */ AbsorberSizeLimit)\n/* harmony export */ });\nclass AbsorberSizeLimit {\n constructor() {\n this.radius = 0;\n this.mass = 0;\n }\n load(data) {\n if (!data) {\n return;\n }\n if (data.mass !== undefined) {\n this.mass = data.mass;\n }\n if (data.radius !== undefined) {\n this.radius = data.radius;\n }\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Options/Classes/AbsorberSizeLimit.js?");
|
|
57
|
+
|
|
58
|
+
/***/ })
|
|
59
|
+
|
|
60
|
+
}]);
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Author : Matteo Bruni
|
|
3
|
+
* MIT license: https://opensource.org/licenses/MIT
|
|
4
|
+
* Demo / Generator : https://particles.js.org/
|
|
5
|
+
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
|
+
* How to use? : Check the GitHub README
|
|
7
|
+
* v3.2.0
|
|
8
|
+
*/
|
|
9
|
+
"use strict";
|
|
10
|
+
/*
|
|
11
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
12
|
+
* This devtool is neither made for production nor for readable output files.
|
|
13
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
14
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
15
|
+
* or disable the default devtool with "devtool: false".
|
|
16
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
17
|
+
*/
|
|
18
|
+
(this["webpackChunk_tsparticles_plugin_absorbers"] = this["webpackChunk_tsparticles_plugin_absorbers"] || []).push([["dist_browser_Absorbers_js"],{
|
|
19
|
+
|
|
20
|
+
/***/ "./dist/browser/Absorbers.js":
|
|
21
|
+
/*!***********************************!*\
|
|
22
|
+
!*** ./dist/browser/Absorbers.js ***!
|
|
23
|
+
\***********************************/
|
|
24
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
25
|
+
|
|
26
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Absorbers: () => (/* binding */ Absorbers)\n/* harmony export */ });\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tsparticles/engine */ \"@tsparticles/engine\");\n/* harmony import */ var _tsparticles_engine__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__);\n\nconst defaultIndex = 0;\nclass Absorbers {\n constructor(container) {\n this.container = container;\n this.array = [];\n this.absorbers = [];\n this.interactivityAbsorbers = [];\n container.getAbsorber = idxOrName => idxOrName === undefined || (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.isNumber)(idxOrName) ? this.array[idxOrName ?? defaultIndex] : this.array.find(t => t.name === idxOrName);\n container.addAbsorber = async (options, position) => this.addAbsorber(options, position);\n }\n async addAbsorber(options, position) {\n const {\n AbsorberInstance\n } = await __webpack_require__.e(/*! import() */ \"dist_browser_AbsorberInstance_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./AbsorberInstance.js */ \"./dist/browser/AbsorberInstance.js\")),\n absorber = new AbsorberInstance(this, this.container, options, position);\n this.array.push(absorber);\n return absorber;\n }\n async draw(context) {\n for (const absorber of this.array) {\n await absorber.draw(context);\n }\n }\n handleClickMode(mode) {\n const absorberOptions = this.absorbers,\n modeAbsorbers = this.interactivityAbsorbers;\n if (mode === \"absorber\") {\n const absorbersModeOptions = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.itemFromSingleOrMultiple)(modeAbsorbers),\n absorbersOptions = absorbersModeOptions ?? (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.itemFromSingleOrMultiple)(absorberOptions),\n aPosition = this.container.interactivity.mouse.clickPosition;\n void this.addAbsorber(absorbersOptions, aPosition);\n }\n }\n async init() {\n this.absorbers = this.container.actualOptions.absorbers;\n this.interactivityAbsorbers = this.container.actualOptions.interactivity.modes.absorbers;\n const promises = (0,_tsparticles_engine__WEBPACK_IMPORTED_MODULE_0__.executeOnSingleOrMultiple)(this.absorbers, async absorber => {\n await this.addAbsorber(absorber);\n });\n if (promises instanceof Array) {\n await Promise.all(promises);\n } else {\n await promises;\n }\n }\n particleUpdate(particle) {\n for (const absorber of this.array) {\n absorber.attract(particle);\n if (particle.destroyed) {\n break;\n }\n }\n }\n removeAbsorber(absorber) {\n const index = this.array.indexOf(absorber),\n deleteCount = 1;\n if (index >= defaultIndex) {\n this.array.splice(index, deleteCount);\n }\n }\n resize() {\n for (const absorber of this.array) {\n absorber.resize();\n }\n }\n stop() {\n this.array = [];\n }\n}\n\n//# sourceURL=webpack://@tsparticles/plugin-absorbers/./dist/browser/Absorbers.js?");
|
|
27
|
+
|
|
28
|
+
/***/ })
|
|
29
|
+
|
|
30
|
+
}]);
|
package/esm/AbsorberInstance.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, rangeColorToRgb, } from "@tsparticles/engine";
|
|
1
|
+
import { Vector, calcPositionOrRandomFromSize, calcPositionOrRandomFromSizeRanged, getDistance, getDistances, getRandom, getRangeValue, getStyleFromRgb, isPointInside, percentDenominator, rangeColorToRgb, } from "@tsparticles/engine";
|
|
2
2
|
import { Absorber } from "./Options/Classes/Absorber.js";
|
|
3
|
+
const squareExp = 2, absorbFactor = 0.033, minOrbitLength = 0, minRadius = 0, minMass = 0, origin = {
|
|
4
|
+
x: 0,
|
|
5
|
+
y: 0,
|
|
6
|
+
}, minAngle = 0, double = 2, maxAngle = Math.PI * double, minVelocity = 0;
|
|
3
7
|
export class AbsorberInstance {
|
|
4
8
|
constructor(absorbers, container, options, position) {
|
|
5
9
|
this.absorbers = absorbers;
|
|
@@ -25,17 +29,17 @@ export class AbsorberInstance {
|
|
|
25
29
|
}
|
|
26
30
|
if (this.options.orbits) {
|
|
27
31
|
if (particle.absorberOrbit === undefined) {
|
|
28
|
-
particle.absorberOrbit = Vector.
|
|
32
|
+
particle.absorberOrbit = Vector.origin;
|
|
29
33
|
particle.absorberOrbit.length = getDistance(particle.getPosition(), this.position);
|
|
30
|
-
particle.absorberOrbit.angle = getRandom() *
|
|
34
|
+
particle.absorberOrbit.angle = getRandom() * maxAngle;
|
|
31
35
|
}
|
|
32
36
|
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
33
|
-
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
34
|
-
particle.absorberOrbit.length = minSize * (
|
|
37
|
+
const minSize = Math.min(canvasSize.width, canvasSize.height), offset = 1, randomOffset = 0.1, randomFactor = 0.2;
|
|
38
|
+
particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset));
|
|
35
39
|
}
|
|
36
40
|
if (particle.absorberOrbitDirection === undefined) {
|
|
37
41
|
particle.absorberOrbitDirection =
|
|
38
|
-
particle.velocity.x >=
|
|
42
|
+
particle.velocity.x >= minVelocity ? "clockwise" : "counter-clockwise";
|
|
39
43
|
}
|
|
40
44
|
const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
|
|
41
45
|
particle.velocity.setTo(Vector.origin);
|
|
@@ -47,7 +51,7 @@ export class AbsorberInstance {
|
|
|
47
51
|
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
48
52
|
particle.absorberOrbit.length -= v.length;
|
|
49
53
|
particle.absorberOrbit.angle +=
|
|
50
|
-
(((particle.retina.moveSpeed ??
|
|
54
|
+
(((particle.retina.moveSpeed ?? minVelocity) * container.retina.pixelRatio) / percentDenominator) *
|
|
51
55
|
container.retina.reduceFactor;
|
|
52
56
|
}
|
|
53
57
|
else {
|
|
@@ -101,11 +105,11 @@ export class AbsorberInstance {
|
|
|
101
105
|
}
|
|
102
106
|
}
|
|
103
107
|
const pos = particle.getPosition(), { dx, dy, distance } = getDistances(this.position, pos), v = Vector.create(dx, dy);
|
|
104
|
-
v.length = (this.mass / Math.pow(distance,
|
|
108
|
+
v.length = (this.mass / Math.pow(distance, squareExp)) * container.retina.reduceFactor;
|
|
105
109
|
if (distance < this.size + particle.getRadius()) {
|
|
106
|
-
const sizeFactor = particle.getRadius() *
|
|
110
|
+
const sizeFactor = particle.getRadius() * absorbFactor * container.retina.pixelRatio;
|
|
107
111
|
if ((this.size > particle.getRadius() && distance < this.size - particle.getRadius()) ||
|
|
108
|
-
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length <
|
|
112
|
+
(particle.absorberOrbit !== undefined && particle.absorberOrbit.length < minOrbitLength)) {
|
|
109
113
|
if (options.destroy) {
|
|
110
114
|
particle.destroy();
|
|
111
115
|
}
|
|
@@ -120,10 +124,10 @@ export class AbsorberInstance {
|
|
|
120
124
|
}
|
|
121
125
|
this._updateParticlePosition(particle, v);
|
|
122
126
|
}
|
|
123
|
-
if (this.limit.radius <=
|
|
127
|
+
if (this.limit.radius <= minRadius || this.size < this.limit.radius) {
|
|
124
128
|
this.size += sizeFactor;
|
|
125
129
|
}
|
|
126
|
-
if (this.limit.mass <=
|
|
130
|
+
if (this.limit.mass <= minMass || this.mass < this.limit.mass) {
|
|
127
131
|
this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;
|
|
128
132
|
}
|
|
129
133
|
}
|
|
@@ -131,13 +135,14 @@ export class AbsorberInstance {
|
|
|
131
135
|
this._updateParticlePosition(particle, v);
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
|
-
draw(context) {
|
|
138
|
+
async draw(context) {
|
|
135
139
|
context.translate(this.position.x, this.position.y);
|
|
136
140
|
context.beginPath();
|
|
137
|
-
context.arc(
|
|
141
|
+
context.arc(origin.x, origin.y, this.size, minAngle, maxAngle, false);
|
|
138
142
|
context.closePath();
|
|
139
143
|
context.fillStyle = getStyleFromRgb(this.color, this.opacity);
|
|
140
144
|
context.fill();
|
|
145
|
+
await Promise.resolve();
|
|
141
146
|
}
|
|
142
147
|
resize() {
|
|
143
148
|
const initialPosition = this.initialPosition;
|
package/esm/Absorbers.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { executeOnSingleOrMultiple, isNumber, itemFromSingleOrMultiple, } from "@tsparticles/engine";
|
|
2
|
-
|
|
2
|
+
const defaultIndex = 0;
|
|
3
3
|
export class Absorbers {
|
|
4
4
|
constructor(container) {
|
|
5
5
|
this.container = container;
|
|
@@ -7,33 +7,39 @@ export class Absorbers {
|
|
|
7
7
|
this.absorbers = [];
|
|
8
8
|
this.interactivityAbsorbers = [];
|
|
9
9
|
container.getAbsorber = (idxOrName) => idxOrName === undefined || isNumber(idxOrName)
|
|
10
|
-
? this.array[idxOrName
|
|
10
|
+
? this.array[idxOrName ?? defaultIndex]
|
|
11
11
|
: this.array.find((t) => t.name === idxOrName);
|
|
12
|
-
container.addAbsorber = (options, position) => this.addAbsorber(options, position);
|
|
12
|
+
container.addAbsorber = async (options, position) => this.addAbsorber(options, position);
|
|
13
13
|
}
|
|
14
|
-
addAbsorber(options, position) {
|
|
15
|
-
const absorber = new AbsorberInstance(this, this.container, options, position);
|
|
14
|
+
async addAbsorber(options, position) {
|
|
15
|
+
const { AbsorberInstance } = await import("./AbsorberInstance.js"), absorber = new AbsorberInstance(this, this.container, options, position);
|
|
16
16
|
this.array.push(absorber);
|
|
17
17
|
return absorber;
|
|
18
18
|
}
|
|
19
|
-
draw(context) {
|
|
19
|
+
async draw(context) {
|
|
20
20
|
for (const absorber of this.array) {
|
|
21
|
-
absorber.draw(context);
|
|
21
|
+
await absorber.draw(context);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
handleClickMode(mode) {
|
|
25
25
|
const absorberOptions = this.absorbers, modeAbsorbers = this.interactivityAbsorbers;
|
|
26
26
|
if (mode === "absorber") {
|
|
27
27
|
const absorbersModeOptions = itemFromSingleOrMultiple(modeAbsorbers), absorbersOptions = absorbersModeOptions ?? itemFromSingleOrMultiple(absorberOptions), aPosition = this.container.interactivity.mouse.clickPosition;
|
|
28
|
-
this.addAbsorber(absorbersOptions, aPosition);
|
|
28
|
+
void this.addAbsorber(absorbersOptions, aPosition);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
async init() {
|
|
32
32
|
this.absorbers = this.container.actualOptions.absorbers;
|
|
33
33
|
this.interactivityAbsorbers = this.container.actualOptions.interactivity.modes.absorbers;
|
|
34
|
-
executeOnSingleOrMultiple(this.absorbers, (absorber) => {
|
|
35
|
-
this.addAbsorber(absorber);
|
|
34
|
+
const promises = executeOnSingleOrMultiple(this.absorbers, async (absorber) => {
|
|
35
|
+
await this.addAbsorber(absorber);
|
|
36
36
|
});
|
|
37
|
+
if (promises instanceof Array) {
|
|
38
|
+
await Promise.all(promises);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
await promises;
|
|
42
|
+
}
|
|
37
43
|
}
|
|
38
44
|
particleUpdate(particle) {
|
|
39
45
|
for (const absorber of this.array) {
|
|
@@ -44,9 +50,9 @@ export class Absorbers {
|
|
|
44
50
|
}
|
|
45
51
|
}
|
|
46
52
|
removeAbsorber(absorber) {
|
|
47
|
-
const index = this.array.indexOf(absorber);
|
|
48
|
-
if (index >=
|
|
49
|
-
this.array.splice(index,
|
|
53
|
+
const index = this.array.indexOf(absorber), deleteCount = 1;
|
|
54
|
+
if (index >= defaultIndex) {
|
|
55
|
+
this.array.splice(index, deleteCount);
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
resize() {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { executeOnSingleOrMultiple, isArray, isInArray, } from "@tsparticles/engine";
|
|
2
|
+
import { Absorber } from "./Options/Classes/Absorber.js";
|
|
3
|
+
export class AbsorbersPlugin {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.id = "absorbers";
|
|
6
|
+
}
|
|
7
|
+
async getPlugin(container) {
|
|
8
|
+
const { Absorbers } = await import("./Absorbers.js");
|
|
9
|
+
return new Absorbers(container);
|
|
10
|
+
}
|
|
11
|
+
loadOptions(options, source) {
|
|
12
|
+
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (source?.absorbers) {
|
|
16
|
+
options.absorbers = executeOnSingleOrMultiple(source.absorbers, (absorber) => {
|
|
17
|
+
const tmp = new Absorber();
|
|
18
|
+
tmp.load(absorber);
|
|
19
|
+
return tmp;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
options.interactivity.modes.absorbers = executeOnSingleOrMultiple(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
23
|
+
const tmp = new Absorber();
|
|
24
|
+
tmp.load(absorber);
|
|
25
|
+
return tmp;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
needsPlugin(options) {
|
|
29
|
+
if (!options) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const absorbers = options.absorbers;
|
|
33
|
+
if (isArray(absorbers)) {
|
|
34
|
+
return !!absorbers.length;
|
|
35
|
+
}
|
|
36
|
+
else if (absorbers) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
else if (options.interactivity?.events?.onClick?.mode &&
|
|
40
|
+
isInArray("absorber", options.interactivity.events.onClick.mode)) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
package/esm/index.js
CHANGED
|
@@ -1,49 +1,5 @@
|
|
|
1
|
-
import { executeOnSingleOrMultiple, isArray, isInArray, } from "@tsparticles/engine";
|
|
2
|
-
import { Absorber } from "./Options/Classes/Absorber.js";
|
|
3
|
-
import { Absorbers } from "./Absorbers.js";
|
|
4
|
-
class AbsorbersPlugin {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.id = "absorbers";
|
|
7
|
-
}
|
|
8
|
-
getPlugin(container) {
|
|
9
|
-
return new Absorbers(container);
|
|
10
|
-
}
|
|
11
|
-
loadOptions(options, source) {
|
|
12
|
-
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
if (source?.absorbers) {
|
|
16
|
-
options.absorbers = executeOnSingleOrMultiple(source.absorbers, (absorber) => {
|
|
17
|
-
const tmp = new Absorber();
|
|
18
|
-
tmp.load(absorber);
|
|
19
|
-
return tmp;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
options.interactivity.modes.absorbers = executeOnSingleOrMultiple(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
23
|
-
const tmp = new Absorber();
|
|
24
|
-
tmp.load(absorber);
|
|
25
|
-
return tmp;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
needsPlugin(options) {
|
|
29
|
-
if (!options) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const absorbers = options.absorbers;
|
|
33
|
-
if (isArray(absorbers)) {
|
|
34
|
-
return !!absorbers.length;
|
|
35
|
-
}
|
|
36
|
-
else if (absorbers) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
else if (options.interactivity?.events?.onClick?.mode &&
|
|
40
|
-
isInArray("absorber", options.interactivity.events.onClick.mode)) {
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
1
|
export async function loadAbsorbersPlugin(engine, refresh = true) {
|
|
2
|
+
const { AbsorbersPlugin } = await import("./AbsorbersPlugin.js");
|
|
47
3
|
await engine.addPlugin(new AbsorbersPlugin(), refresh);
|
|
48
4
|
}
|
|
49
5
|
export * from "./AbsorberContainer.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tsparticles/plugin-absorbers",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "tsParticles absorbers plugin",
|
|
5
5
|
"homepage": "https://particles.js.org",
|
|
6
6
|
"repository": {
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"./package.json": "./package.json"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
|
-
"@tsparticles/engine": "^3.0
|
|
89
|
+
"@tsparticles/engine": "^3.2.0"
|
|
90
90
|
},
|
|
91
91
|
"publishConfig": {
|
|
92
92
|
"access": "public"
|
package/report.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8"/>
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
6
|
-
<title>@tsparticles/plugin-absorbers [
|
|
6
|
+
<title>@tsparticles/plugin-absorbers [31 Jan 2024 at 02:06]</title>
|
|
7
7
|
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
|
|
8
8
|
|
|
9
9
|
<script>
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
<body>
|
|
32
32
|
<div id="app"></div>
|
|
33
33
|
<script>
|
|
34
|
-
window.chartData = [
|
|
35
|
-
window.entrypoints = ["tsparticles.plugin.absorbers
|
|
34
|
+
window.chartData = [];
|
|
35
|
+
window.entrypoints = ["tsparticles.plugin.absorbers.min"];
|
|
36
36
|
window.defaultSizes = "parsed";
|
|
37
37
|
</script>
|
|
38
38
|
</body>
|