@tsparticles/plugin-absorbers 3.0.0-alpha.1 → 3.0.0-beta.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/README.md +15 -11
- package/browser/AbsorberInstance.js +59 -61
- package/browser/Absorbers.js +3 -3
- package/browser/Options/Classes/Absorber.js +1 -1
- package/browser/Options/Classes/AbsorberSize.js +2 -2
- package/browser/index.js +7 -10
- package/cjs/AbsorberInstance.js +59 -61
- package/cjs/Absorbers.js +7 -18
- package/cjs/Options/Classes/AbsorberSize.js +2 -2
- package/cjs/index.js +6 -20
- package/esm/AbsorberInstance.js +59 -61
- package/esm/Absorbers.js +3 -3
- package/esm/Options/Classes/Absorber.js +1 -1
- package/esm/Options/Classes/AbsorberSize.js +2 -2
- package/esm/index.js +7 -10
- package/package.json +6 -5
- package/report.html +4 -4
- package/tsparticles.plugin.absorbers.js +71 -76
- package/tsparticles.plugin.absorbers.min.js +1 -1
- package/tsparticles.plugin.absorbers.min.js.LICENSE.txt +1 -8
- package/types/AbsorberInstance.d.ts +3 -4
- package/types/Absorbers.d.ts +1 -1
- package/types/Options/Classes/Absorber.d.ts +1 -2
- package/types/Options/Classes/AbsorberSize.d.ts +1 -2
- package/types/index.d.ts +2 -2
- package/umd/AbsorberInstance.js +59 -61
- package/umd/Absorbers.js +2 -2
- package/umd/Options/Classes/AbsorberSize.js +3 -3
- package/umd/index.js +6 -9
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Demo / Generator : https://particles.js.org/
|
|
5
5
|
* GitHub : https://www.github.com/matteobruni/tsparticles
|
|
6
6
|
* How to use? : Check the GitHub README
|
|
7
|
-
* v3.0.0-
|
|
7
|
+
* v3.0.0-beta.0
|
|
8
8
|
*/
|
|
9
9
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
10
10
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
@@ -91,7 +91,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
91
91
|
|
|
92
92
|
// EXPORTS
|
|
93
93
|
__webpack_require__.d(__webpack_exports__, {
|
|
94
|
-
|
|
94
|
+
loadAbsorbersPlugin: () => (/* binding */ loadAbsorbersPlugin)
|
|
95
95
|
});
|
|
96
96
|
|
|
97
97
|
// EXTERNAL MODULE: external {"commonjs":"@tsparticles/engine","commonjs2":"@tsparticles/engine","amd":"@tsparticles/engine","root":"window"}
|
|
@@ -132,7 +132,7 @@ class AbsorberSize extends engine_root_window_.ValueWithRandom {
|
|
|
132
132
|
if (data.density !== undefined) {
|
|
133
133
|
this.density = data.density;
|
|
134
134
|
}
|
|
135
|
-
if (
|
|
135
|
+
if ((0,engine_root_window_.isNumber)(data.limit)) {
|
|
136
136
|
this.limit.radius = data.limit;
|
|
137
137
|
} else {
|
|
138
138
|
this.limit.load(data.limit);
|
|
@@ -191,9 +191,62 @@ class Absorber {
|
|
|
191
191
|
|
|
192
192
|
class AbsorberInstance {
|
|
193
193
|
constructor(absorbers, container, options, position) {
|
|
194
|
-
var _a, _b, _c;
|
|
195
194
|
this.absorbers = absorbers;
|
|
196
195
|
this.container = container;
|
|
196
|
+
this._calcPosition = () => {
|
|
197
|
+
const exactPosition = (0,engine_root_window_.calcPositionOrRandomFromSizeRanged)({
|
|
198
|
+
size: this.container.canvas.size,
|
|
199
|
+
position: this.options.position
|
|
200
|
+
});
|
|
201
|
+
return engine_root_window_.Vector.create(exactPosition.x, exactPosition.y);
|
|
202
|
+
};
|
|
203
|
+
this._updateParticlePosition = (particle, v) => {
|
|
204
|
+
if (particle.destroyed) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const container = this.container,
|
|
208
|
+
canvasSize = container.canvas.size;
|
|
209
|
+
if (particle.needsNewPosition) {
|
|
210
|
+
const newPosition = (0,engine_root_window_.calcPositionOrRandomFromSize)({
|
|
211
|
+
size: canvasSize
|
|
212
|
+
});
|
|
213
|
+
particle.position.setTo(newPosition);
|
|
214
|
+
particle.velocity.setTo(particle.initialVelocity);
|
|
215
|
+
particle.absorberOrbit = undefined;
|
|
216
|
+
particle.needsNewPosition = false;
|
|
217
|
+
}
|
|
218
|
+
if (this.options.orbits) {
|
|
219
|
+
if (particle.absorberOrbit === undefined) {
|
|
220
|
+
particle.absorberOrbit = engine_root_window_.Vector.create(0, 0);
|
|
221
|
+
particle.absorberOrbit.length = (0,engine_root_window_.getDistance)(particle.getPosition(), this.position);
|
|
222
|
+
particle.absorberOrbit.angle = (0,engine_root_window_.getRandom)() * Math.PI * 2;
|
|
223
|
+
}
|
|
224
|
+
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
225
|
+
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
226
|
+
particle.absorberOrbit.length = minSize * (1 + ((0,engine_root_window_.getRandom)() * 0.2 - 0.1));
|
|
227
|
+
}
|
|
228
|
+
if (particle.absorberOrbitDirection === undefined) {
|
|
229
|
+
particle.absorberOrbitDirection = particle.velocity.x >= 0 ? "clockwise" : "counter-clockwise";
|
|
230
|
+
}
|
|
231
|
+
const orbitRadius = particle.absorberOrbit.length,
|
|
232
|
+
orbitAngle = particle.absorberOrbit.angle,
|
|
233
|
+
orbitDirection = particle.absorberOrbitDirection;
|
|
234
|
+
particle.velocity.setTo(engine_root_window_.Vector.origin);
|
|
235
|
+
const updateFunc = {
|
|
236
|
+
x: orbitDirection === "clockwise" ? Math.cos : Math.sin,
|
|
237
|
+
y: orbitDirection === "clockwise" ? Math.sin : Math.cos
|
|
238
|
+
};
|
|
239
|
+
particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
|
|
240
|
+
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
241
|
+
particle.absorberOrbit.length -= v.length;
|
|
242
|
+
particle.absorberOrbit.angle += (particle.retina.moveSpeed ?? 0) * container.retina.pixelRatio / 100 * container.retina.reduceFactor;
|
|
243
|
+
} else {
|
|
244
|
+
const addV = engine_root_window_.Vector.origin;
|
|
245
|
+
addV.length = v.length;
|
|
246
|
+
addV.angle = v.angle;
|
|
247
|
+
particle.velocity.addTo(addV);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
197
250
|
this.initialPosition = position ? engine_root_window_.Vector.create(position.x, position.y) : undefined;
|
|
198
251
|
if (options instanceof Absorber) {
|
|
199
252
|
this.options = options;
|
|
@@ -211,12 +264,12 @@ class AbsorberInstance {
|
|
|
211
264
|
radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,
|
|
212
265
|
mass: limit.mass
|
|
213
266
|
};
|
|
214
|
-
this.color = (
|
|
267
|
+
this.color = (0,engine_root_window_.rangeColorToRgb)(this.options.color) ?? {
|
|
215
268
|
b: 0,
|
|
216
269
|
g: 0,
|
|
217
270
|
r: 0
|
|
218
271
|
};
|
|
219
|
-
this.position =
|
|
272
|
+
this.position = this.initialPosition?.copy() ?? this._calcPosition();
|
|
220
273
|
}
|
|
221
274
|
attract(particle) {
|
|
222
275
|
const container = this.container,
|
|
@@ -251,13 +304,13 @@ class AbsorberInstance {
|
|
|
251
304
|
particle.destroy();
|
|
252
305
|
} else {
|
|
253
306
|
particle.needsNewPosition = true;
|
|
254
|
-
this.
|
|
307
|
+
this._updateParticlePosition(particle, v);
|
|
255
308
|
}
|
|
256
309
|
} else {
|
|
257
310
|
if (options.destroy) {
|
|
258
311
|
particle.size.value -= sizeFactor;
|
|
259
312
|
}
|
|
260
|
-
this.
|
|
313
|
+
this._updateParticlePosition(particle, v);
|
|
261
314
|
}
|
|
262
315
|
if (this.limit.radius <= 0 || this.size < this.limit.radius) {
|
|
263
316
|
this.size += sizeFactor;
|
|
@@ -266,7 +319,7 @@ class AbsorberInstance {
|
|
|
266
319
|
this.mass += sizeFactor * this.options.size.density * container.retina.reduceFactor;
|
|
267
320
|
}
|
|
268
321
|
} else {
|
|
269
|
-
this.
|
|
322
|
+
this._updateParticlePosition(particle, v);
|
|
270
323
|
}
|
|
271
324
|
}
|
|
272
325
|
draw(context) {
|
|
@@ -279,62 +332,7 @@ class AbsorberInstance {
|
|
|
279
332
|
}
|
|
280
333
|
resize() {
|
|
281
334
|
const initialPosition = this.initialPosition;
|
|
282
|
-
this.position = initialPosition && (0,engine_root_window_.isPointInside)(initialPosition, this.container.canvas.size, engine_root_window_.Vector.origin) ? initialPosition : this.
|
|
283
|
-
}
|
|
284
|
-
calcPosition() {
|
|
285
|
-
const exactPosition = (0,engine_root_window_.calcPositionOrRandomFromSizeRanged)({
|
|
286
|
-
size: this.container.canvas.size,
|
|
287
|
-
position: this.options.position
|
|
288
|
-
});
|
|
289
|
-
return engine_root_window_.Vector.create(exactPosition.x, exactPosition.y);
|
|
290
|
-
}
|
|
291
|
-
updateParticlePosition(particle, v) {
|
|
292
|
-
var _a;
|
|
293
|
-
if (particle.destroyed) {
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
const container = this.container,
|
|
297
|
-
canvasSize = container.canvas.size;
|
|
298
|
-
if (particle.needsNewPosition) {
|
|
299
|
-
const newPosition = (0,engine_root_window_.calcPositionOrRandomFromSize)({
|
|
300
|
-
size: canvasSize
|
|
301
|
-
});
|
|
302
|
-
particle.position.setTo(newPosition);
|
|
303
|
-
particle.velocity.setTo(particle.initialVelocity);
|
|
304
|
-
particle.absorberOrbit = undefined;
|
|
305
|
-
particle.needsNewPosition = false;
|
|
306
|
-
}
|
|
307
|
-
if (this.options.orbits) {
|
|
308
|
-
if (particle.absorberOrbit === undefined) {
|
|
309
|
-
particle.absorberOrbit = engine_root_window_.Vector.create(0, 0);
|
|
310
|
-
particle.absorberOrbit.length = (0,engine_root_window_.getDistance)(particle.getPosition(), this.position);
|
|
311
|
-
particle.absorberOrbit.angle = (0,engine_root_window_.getRandom)() * Math.PI * 2;
|
|
312
|
-
}
|
|
313
|
-
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
314
|
-
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
315
|
-
particle.absorberOrbit.length = minSize * (1 + ((0,engine_root_window_.getRandom)() * 0.2 - 0.1));
|
|
316
|
-
}
|
|
317
|
-
if (particle.absorberOrbitDirection === undefined) {
|
|
318
|
-
particle.absorberOrbitDirection = particle.velocity.x >= 0 ? "clockwise" : "counter-clockwise";
|
|
319
|
-
}
|
|
320
|
-
const orbitRadius = particle.absorberOrbit.length,
|
|
321
|
-
orbitAngle = particle.absorberOrbit.angle,
|
|
322
|
-
orbitDirection = particle.absorberOrbitDirection;
|
|
323
|
-
particle.velocity.setTo(engine_root_window_.Vector.origin);
|
|
324
|
-
const updateFunc = {
|
|
325
|
-
x: orbitDirection === "clockwise" ? Math.cos : Math.sin,
|
|
326
|
-
y: orbitDirection === "clockwise" ? Math.sin : Math.cos
|
|
327
|
-
};
|
|
328
|
-
particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
|
|
329
|
-
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
330
|
-
particle.absorberOrbit.length -= v.length;
|
|
331
|
-
particle.absorberOrbit.angle += ((_a = particle.retina.moveSpeed) !== null && _a !== void 0 ? _a : 0) * container.retina.pixelRatio / 100 * container.retina.reduceFactor;
|
|
332
|
-
} else {
|
|
333
|
-
const addV = engine_root_window_.Vector.origin;
|
|
334
|
-
addV.length = v.length;
|
|
335
|
-
addV.angle = v.angle;
|
|
336
|
-
particle.velocity.addTo(addV);
|
|
337
|
-
}
|
|
335
|
+
this.position = initialPosition && (0,engine_root_window_.isPointInside)(initialPosition, this.container.canvas.size, engine_root_window_.Vector.origin) ? initialPosition : this._calcPosition();
|
|
338
336
|
}
|
|
339
337
|
}
|
|
340
338
|
;// CONCATENATED MODULE: ./dist/browser/Absorbers.js
|
|
@@ -346,7 +344,7 @@ class Absorbers {
|
|
|
346
344
|
this.array = [];
|
|
347
345
|
this.absorbers = [];
|
|
348
346
|
this.interactivityAbsorbers = [];
|
|
349
|
-
container.getAbsorber = idxOrName => idxOrName === undefined ||
|
|
347
|
+
container.getAbsorber = idxOrName => idxOrName === undefined || (0,engine_root_window_.isNumber)(idxOrName) ? this.array[idxOrName || 0] : this.array.find(t => t.name === idxOrName);
|
|
350
348
|
container.addAbsorber = (options, position) => this.addAbsorber(options, position);
|
|
351
349
|
}
|
|
352
350
|
addAbsorber(options, position) {
|
|
@@ -364,7 +362,7 @@ class Absorbers {
|
|
|
364
362
|
modeAbsorbers = this.interactivityAbsorbers;
|
|
365
363
|
if (mode === "absorber") {
|
|
366
364
|
const absorbersModeOptions = (0,engine_root_window_.itemFromSingleOrMultiple)(modeAbsorbers),
|
|
367
|
-
absorbersOptions = absorbersModeOptions
|
|
365
|
+
absorbersOptions = absorbersModeOptions ?? (0,engine_root_window_.itemFromSingleOrMultiple)(absorberOptions),
|
|
368
366
|
aPosition = this.container.interactivity.mouse.clickPosition;
|
|
369
367
|
this.addAbsorber(absorbersOptions, aPosition);
|
|
370
368
|
}
|
|
@@ -411,42 +409,39 @@ class AbsorbersPlugin {
|
|
|
411
409
|
return new Absorbers(container);
|
|
412
410
|
}
|
|
413
411
|
loadOptions(options, source) {
|
|
414
|
-
var _a, _b;
|
|
415
412
|
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
416
413
|
return;
|
|
417
414
|
}
|
|
418
|
-
if (source
|
|
415
|
+
if (source?.absorbers) {
|
|
419
416
|
options.absorbers = (0,engine_root_window_.executeOnSingleOrMultiple)(source.absorbers, absorber => {
|
|
420
417
|
const tmp = new Absorber();
|
|
421
418
|
tmp.load(absorber);
|
|
422
419
|
return tmp;
|
|
423
420
|
});
|
|
424
421
|
}
|
|
425
|
-
options.interactivity.modes.absorbers = (0,engine_root_window_.executeOnSingleOrMultiple)(
|
|
422
|
+
options.interactivity.modes.absorbers = (0,engine_root_window_.executeOnSingleOrMultiple)(source?.interactivity?.modes?.absorbers, absorber => {
|
|
426
423
|
const tmp = new Absorber();
|
|
427
424
|
tmp.load(absorber);
|
|
428
425
|
return tmp;
|
|
429
426
|
});
|
|
430
427
|
}
|
|
431
428
|
needsPlugin(options) {
|
|
432
|
-
var _a, _b, _c;
|
|
433
429
|
if (!options) {
|
|
434
430
|
return false;
|
|
435
431
|
}
|
|
436
432
|
const absorbers = options.absorbers;
|
|
437
|
-
if (absorbers
|
|
433
|
+
if ((0,engine_root_window_.isArray)(absorbers)) {
|
|
438
434
|
return !!absorbers.length;
|
|
439
435
|
} else if (absorbers) {
|
|
440
436
|
return true;
|
|
441
|
-
} else if (
|
|
437
|
+
} else if (options.interactivity?.events?.onClick?.mode && (0,engine_root_window_.isInArray)("absorber", options.interactivity.events.onClick.mode)) {
|
|
442
438
|
return true;
|
|
443
439
|
}
|
|
444
440
|
return false;
|
|
445
441
|
}
|
|
446
442
|
}
|
|
447
|
-
async function loadAbsorbersPlugin(engine) {
|
|
448
|
-
|
|
449
|
-
await engine.addPlugin(plugin);
|
|
443
|
+
async function loadAbsorbersPlugin(engine, refresh = true) {
|
|
444
|
+
await engine.addPlugin(new AbsorbersPlugin(), refresh);
|
|
450
445
|
}
|
|
451
446
|
|
|
452
447
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see tsparticles.plugin.absorbers.min.js.LICENSE.txt */
|
|
2
|
-
!function(i,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],t);else{var s="object"==typeof exports?t(require("@tsparticles/engine")):t(i.window);for(var o in s)("object"==typeof exports?exports:i)[o]=s[o]}}(this,(i=>(()=>{"use strict";var t={533:t=>{t.exports=i}},s={};function o(i){var e=s[i];if(void 0!==e)return e.exports;var r=s[i]={exports:{}};return t[i](r,r.exports,o),r.exports}o.d=(i,t)=>{for(var s in t)o.o(t,s)&&!o.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:t[s]})},o.o=(i,t)=>Object.prototype.hasOwnProperty.call(i,t),o.r=i=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var e={};return(()=>{o.r(e),o.d(e,{loadAbsorbersPlugin:()=>
|
|
2
|
+
!function(i,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@tsparticles/engine"));else if("function"==typeof define&&define.amd)define(["@tsparticles/engine"],t);else{var s="object"==typeof exports?t(require("@tsparticles/engine")):t(i.window);for(var o in s)("object"==typeof exports?exports:i)[o]=s[o]}}(this,(i=>(()=>{"use strict";var t={533:t=>{t.exports=i}},s={};function o(i){var e=s[i];if(void 0!==e)return e.exports;var r=s[i]={exports:{}};return t[i](r,r.exports,o),r.exports}o.d=(i,t)=>{for(var s in t)o.o(t,s)&&!o.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:t[s]})},o.o=(i,t)=>Object.prototype.hasOwnProperty.call(i,t),o.r=i=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var e={};return(()=>{o.r(e),o.d(e,{loadAbsorbersPlugin:()=>h});var i=o(533);class t{constructor(){this.radius=0,this.mass=0}load(i){i&&(void 0!==i.mass&&(this.mass=i.mass),void 0!==i.radius&&(this.radius=i.radius))}}class s extends i.ValueWithRandom{constructor(){super(),this.density=5,this.value=50,this.limit=new t}load(t){t&&(super.load(t),void 0!==t.density&&(this.density=t.density),(0,i.isNumber)(t.limit)?this.limit.radius=t.limit:this.limit.load(t.limit))}}class r{constructor(){this.color=new i.OptionsColor,this.color.value="#000000",this.draggable=!1,this.opacity=1,this.destroy=!0,this.orbits=!1,this.size=new s}load(t){void 0!==t&&(void 0!==t.color&&(this.color=i.OptionsColor.create(this.color,t.color)),void 0!==t.draggable&&(this.draggable=t.draggable),this.name=t.name,void 0!==t.opacity&&(this.opacity=t.opacity),void 0!==t.position&&(this.position={},void 0!==t.position.x&&(this.position.x=(0,i.setRangeValue)(t.position.x)),void 0!==t.position.y&&(this.position.y=(0,i.setRangeValue)(t.position.y))),void 0!==t.size&&this.size.load(t.size),void 0!==t.destroy&&(this.destroy=t.destroy),void 0!==t.orbits&&(this.orbits=t.orbits))}}class n{constructor(t,s,o,e){this.absorbers=t,this.container=s,this._calcPosition=()=>{const t=(0,i.calcPositionOrRandomFromSizeRanged)({size:this.container.canvas.size,position:this.options.position});return i.Vector.create(t.x,t.y)},this._updateParticlePosition=(t,s)=>{if(t.destroyed)return;const o=this.container,e=o.canvas.size;if(t.needsNewPosition){const s=(0,i.calcPositionOrRandomFromSize)({size:e});t.position.setTo(s),t.velocity.setTo(t.initialVelocity),t.absorberOrbit=void 0,t.needsNewPosition=!1}if(this.options.orbits){if(void 0===t.absorberOrbit&&(t.absorberOrbit=i.Vector.create(0,0),t.absorberOrbit.length=(0,i.getDistance)(t.getPosition(),this.position),t.absorberOrbit.angle=(0,i.getRandom)()*Math.PI*2),t.absorberOrbit.length<=this.size&&!this.options.destroy){const s=Math.min(e.width,e.height);t.absorberOrbit.length=s*(.2*(0,i.getRandom)()-.1+1)}void 0===t.absorberOrbitDirection&&(t.absorberOrbitDirection=t.velocity.x>=0?"clockwise":"counter-clockwise");const r=t.absorberOrbit.length,n=t.absorberOrbit.angle,a=t.absorberOrbitDirection;t.velocity.setTo(i.Vector.origin);const c={x:"clockwise"===a?Math.cos:Math.sin,y:"clockwise"===a?Math.sin:Math.cos};t.position.x=this.position.x+r*c.x(n),t.position.y=this.position.y+r*c.y(n),t.absorberOrbit.length-=s.length,t.absorberOrbit.angle+=(t.retina.moveSpeed??0)*o.retina.pixelRatio/100*o.retina.reduceFactor}else{const o=i.Vector.origin;o.length=s.length,o.angle=s.angle,t.velocity.addTo(o)}},this.initialPosition=e?i.Vector.create(e.x,e.y):void 0,o instanceof r?this.options=o:(this.options=new r,this.options.load(o)),this.dragging=!1,this.name=this.options.name,this.opacity=this.options.opacity,this.size=(0,i.getRangeValue)(this.options.size.value)*s.retina.pixelRatio,this.mass=this.size*this.options.size.density*s.retina.reduceFactor;const n=this.options.size.limit;this.limit={radius:n.radius*s.retina.pixelRatio*s.retina.reduceFactor,mass:n.mass},this.color=(0,i.rangeColorToRgb)(this.options.color)??{b:0,g:0,r:0},this.position=this.initialPosition?.copy()??this._calcPosition()}attract(t){const s=this.container,o=this.options;if(o.draggable){const t=s.interactivity.mouse;if(t.clicking&&t.downPosition){(0,i.getDistance)(this.position,t.downPosition)<=this.size&&(this.dragging=!0)}else this.dragging=!1;this.dragging&&t.position&&(this.position.x=t.position.x,this.position.y=t.position.y)}const e=t.getPosition(),{dx:r,dy:n,distance:a}=(0,i.getDistances)(this.position,e),c=i.Vector.create(r,n);if(c.length=this.mass/Math.pow(a,2)*s.retina.reduceFactor,a<this.size+t.getRadius()){const i=.033*t.getRadius()*s.retina.pixelRatio;this.size>t.getRadius()&&a<this.size-t.getRadius()||void 0!==t.absorberOrbit&&t.absorberOrbit.length<0?o.destroy?t.destroy():(t.needsNewPosition=!0,this._updateParticlePosition(t,c)):(o.destroy&&(t.size.value-=i),this._updateParticlePosition(t,c)),(this.limit.radius<=0||this.size<this.limit.radius)&&(this.size+=i),(this.limit.mass<=0||this.mass<this.limit.mass)&&(this.mass+=i*this.options.size.density*s.retina.reduceFactor)}else this._updateParticlePosition(t,c)}draw(t){t.translate(this.position.x,this.position.y),t.beginPath(),t.arc(0,0,this.size,0,2*Math.PI,!1),t.closePath(),t.fillStyle=(0,i.getStyleFromRgb)(this.color,this.opacity),t.fill()}resize(){const t=this.initialPosition;this.position=t&&(0,i.isPointInside)(t,this.container.canvas.size,i.Vector.origin)?t:this._calcPosition()}}class a{constructor(t){this.container=t,this.array=[],this.absorbers=[],this.interactivityAbsorbers=[],t.getAbsorber=t=>void 0===t||(0,i.isNumber)(t)?this.array[t||0]:this.array.find((i=>i.name===t)),t.addAbsorber=(i,t)=>this.addAbsorber(i,t)}addAbsorber(i,t){const s=new n(this,this.container,i,t);return this.array.push(s),s}draw(i){for(const t of this.array)t.draw(i)}handleClickMode(t){const s=this.absorbers,o=this.interactivityAbsorbers;if("absorber"===t){const t=(0,i.itemFromSingleOrMultiple)(o)??(0,i.itemFromSingleOrMultiple)(s),e=this.container.interactivity.mouse.clickPosition;this.addAbsorber(t,e)}}async init(){this.absorbers=this.container.actualOptions.absorbers,this.interactivityAbsorbers=this.container.actualOptions.interactivity.modes.absorbers,(0,i.executeOnSingleOrMultiple)(this.absorbers,(i=>{this.addAbsorber(i)}))}particleUpdate(i){for(const t of this.array)if(t.attract(i),i.destroyed)break}removeAbsorber(i){const t=this.array.indexOf(i);t>=0&&this.array.splice(t,1)}resize(){for(const i of this.array)i.resize()}stop(){this.array=[]}}class c{constructor(){this.id="absorbers"}getPlugin(i){return new a(i)}loadOptions(t,s){(this.needsPlugin(t)||this.needsPlugin(s))&&(s?.absorbers&&(t.absorbers=(0,i.executeOnSingleOrMultiple)(s.absorbers,(i=>{const t=new r;return t.load(i),t}))),t.interactivity.modes.absorbers=(0,i.executeOnSingleOrMultiple)(s?.interactivity?.modes?.absorbers,(i=>{const t=new r;return t.load(i),t})))}needsPlugin(t){if(!t)return!1;const s=t.absorbers;return(0,i.isArray)(s)?!!s.length:!!s||!(!t.interactivity?.events?.onClick?.mode||!(0,i.isInArray)("absorber",t.interactivity.events.onClick.mode))}}async function h(i,t=!0){await i.addPlugin(new c,t)}})(),e})()));
|
|
@@ -1,8 +1 @@
|
|
|
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.0.0-alpha.1
|
|
8
|
-
*/
|
|
1
|
+
/*! tsParticles Absorbers Plugin v3.0.0-beta.0 by Matteo Bruni */
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { RotateDirection, Vector } from "@tsparticles/engine";
|
|
1
|
+
import { type Container, type ICoordinates, type IRgb, type Particle, type RecursivePartial, RotateDirection, Vector } from "@tsparticles/engine";
|
|
3
2
|
import type { Absorbers } from "./Absorbers";
|
|
4
3
|
import type { IAbsorber } from "./Options/Interfaces/IAbsorber";
|
|
5
4
|
import type { IAbsorberSizeLimit } from "./Options/Interfaces/IAbsorberSizeLimit";
|
|
@@ -25,7 +24,7 @@ export declare class AbsorberInstance {
|
|
|
25
24
|
attract(particle: OrbitingParticle): void;
|
|
26
25
|
draw(context: CanvasRenderingContext2D): void;
|
|
27
26
|
resize(): void;
|
|
28
|
-
private
|
|
29
|
-
private
|
|
27
|
+
private readonly _calcPosition;
|
|
28
|
+
private readonly _updateParticlePosition;
|
|
30
29
|
}
|
|
31
30
|
export {};
|
package/types/Absorbers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type IContainerPlugin, type ICoordinates, type Particle, type RecursivePartial, type SingleOrMultiple } from "@tsparticles/engine";
|
|
2
2
|
import type { Absorber } from "./Options/Classes/Absorber";
|
|
3
3
|
import type { AbsorberContainer } from "./AbsorberContainer";
|
|
4
4
|
import { AbsorberInstance } from "./AbsorberInstance";
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { OptionsColor } from "@tsparticles/engine";
|
|
1
|
+
import { type IOptionLoader, type IRangedCoordinates, OptionsColor, type RecursivePartial } from "@tsparticles/engine";
|
|
3
2
|
import { AbsorberSize } from "./AbsorberSize";
|
|
4
3
|
import type { IAbsorber } from "../Interfaces/IAbsorber";
|
|
5
4
|
export declare class Absorber implements IAbsorber, IOptionLoader<IAbsorber> {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type IOptionLoader, type RecursivePartial, ValueWithRandom } from "@tsparticles/engine";
|
|
2
2
|
import { AbsorberSizeLimit } from "./AbsorberSizeLimit";
|
|
3
3
|
import type { IAbsorberSize } from "../Interfaces/IAbsorberSize";
|
|
4
|
-
import { ValueWithRandom } from "@tsparticles/engine";
|
|
5
4
|
export declare class AbsorberSize extends ValueWithRandom implements IAbsorberSize, IOptionLoader<IAbsorberSize> {
|
|
6
5
|
density: number;
|
|
7
6
|
limit: AbsorberSizeLimit;
|
package/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export declare function loadAbsorbersPlugin(engine: Engine): Promise<void>;
|
|
1
|
+
import { type Engine } from "@tsparticles/engine";
|
|
2
|
+
export declare function loadAbsorbersPlugin(engine: Engine, refresh?: boolean): Promise<void>;
|
|
3
3
|
export * from "./AbsorberContainer";
|
|
4
4
|
export * from "./Enums/AbsorberClickMode";
|
package/umd/AbsorberInstance.js
CHANGED
|
@@ -14,9 +14,61 @@
|
|
|
14
14
|
const Absorber_1 = require("./Options/Classes/Absorber");
|
|
15
15
|
class AbsorberInstance {
|
|
16
16
|
constructor(absorbers, container, options, position) {
|
|
17
|
-
var _a, _b, _c;
|
|
18
17
|
this.absorbers = absorbers;
|
|
19
18
|
this.container = container;
|
|
19
|
+
this._calcPosition = () => {
|
|
20
|
+
const exactPosition = (0, engine_1.calcPositionOrRandomFromSizeRanged)({
|
|
21
|
+
size: this.container.canvas.size,
|
|
22
|
+
position: this.options.position,
|
|
23
|
+
});
|
|
24
|
+
return engine_1.Vector.create(exactPosition.x, exactPosition.y);
|
|
25
|
+
};
|
|
26
|
+
this._updateParticlePosition = (particle, v) => {
|
|
27
|
+
if (particle.destroyed) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const container = this.container, canvasSize = container.canvas.size;
|
|
31
|
+
if (particle.needsNewPosition) {
|
|
32
|
+
const newPosition = (0, engine_1.calcPositionOrRandomFromSize)({ size: canvasSize });
|
|
33
|
+
particle.position.setTo(newPosition);
|
|
34
|
+
particle.velocity.setTo(particle.initialVelocity);
|
|
35
|
+
particle.absorberOrbit = undefined;
|
|
36
|
+
particle.needsNewPosition = false;
|
|
37
|
+
}
|
|
38
|
+
if (this.options.orbits) {
|
|
39
|
+
if (particle.absorberOrbit === undefined) {
|
|
40
|
+
particle.absorberOrbit = engine_1.Vector.create(0, 0);
|
|
41
|
+
particle.absorberOrbit.length = (0, engine_1.getDistance)(particle.getPosition(), this.position);
|
|
42
|
+
particle.absorberOrbit.angle = (0, engine_1.getRandom)() * Math.PI * 2;
|
|
43
|
+
}
|
|
44
|
+
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
45
|
+
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
46
|
+
particle.absorberOrbit.length = minSize * (1 + ((0, engine_1.getRandom)() * 0.2 - 0.1));
|
|
47
|
+
}
|
|
48
|
+
if (particle.absorberOrbitDirection === undefined) {
|
|
49
|
+
particle.absorberOrbitDirection =
|
|
50
|
+
particle.velocity.x >= 0 ? "clockwise" : "counter-clockwise";
|
|
51
|
+
}
|
|
52
|
+
const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
|
|
53
|
+
particle.velocity.setTo(engine_1.Vector.origin);
|
|
54
|
+
const updateFunc = {
|
|
55
|
+
x: orbitDirection === "clockwise" ? Math.cos : Math.sin,
|
|
56
|
+
y: orbitDirection === "clockwise" ? Math.sin : Math.cos,
|
|
57
|
+
};
|
|
58
|
+
particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
|
|
59
|
+
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
60
|
+
particle.absorberOrbit.length -= v.length;
|
|
61
|
+
particle.absorberOrbit.angle +=
|
|
62
|
+
(((particle.retina.moveSpeed ?? 0) * container.retina.pixelRatio) / 100) *
|
|
63
|
+
container.retina.reduceFactor;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const addV = engine_1.Vector.origin;
|
|
67
|
+
addV.length = v.length;
|
|
68
|
+
addV.angle = v.angle;
|
|
69
|
+
particle.velocity.addTo(addV);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
20
72
|
this.initialPosition = position ? engine_1.Vector.create(position.x, position.y) : undefined;
|
|
21
73
|
if (options instanceof Absorber_1.Absorber) {
|
|
22
74
|
this.options = options;
|
|
@@ -35,12 +87,12 @@
|
|
|
35
87
|
radius: limit.radius * container.retina.pixelRatio * container.retina.reduceFactor,
|
|
36
88
|
mass: limit.mass,
|
|
37
89
|
};
|
|
38
|
-
this.color = (
|
|
90
|
+
this.color = (0, engine_1.rangeColorToRgb)(this.options.color) ?? {
|
|
39
91
|
b: 0,
|
|
40
92
|
g: 0,
|
|
41
93
|
r: 0,
|
|
42
94
|
};
|
|
43
|
-
this.position =
|
|
95
|
+
this.position = this.initialPosition?.copy() ?? this._calcPosition();
|
|
44
96
|
}
|
|
45
97
|
attract(particle) {
|
|
46
98
|
const container = this.container, options = this.options;
|
|
@@ -71,14 +123,14 @@
|
|
|
71
123
|
}
|
|
72
124
|
else {
|
|
73
125
|
particle.needsNewPosition = true;
|
|
74
|
-
this.
|
|
126
|
+
this._updateParticlePosition(particle, v);
|
|
75
127
|
}
|
|
76
128
|
}
|
|
77
129
|
else {
|
|
78
130
|
if (options.destroy) {
|
|
79
131
|
particle.size.value -= sizeFactor;
|
|
80
132
|
}
|
|
81
|
-
this.
|
|
133
|
+
this._updateParticlePosition(particle, v);
|
|
82
134
|
}
|
|
83
135
|
if (this.limit.radius <= 0 || this.size < this.limit.radius) {
|
|
84
136
|
this.size += sizeFactor;
|
|
@@ -88,7 +140,7 @@
|
|
|
88
140
|
}
|
|
89
141
|
}
|
|
90
142
|
else {
|
|
91
|
-
this.
|
|
143
|
+
this._updateParticlePosition(particle, v);
|
|
92
144
|
}
|
|
93
145
|
}
|
|
94
146
|
draw(context) {
|
|
@@ -104,61 +156,7 @@
|
|
|
104
156
|
this.position =
|
|
105
157
|
initialPosition && (0, engine_1.isPointInside)(initialPosition, this.container.canvas.size, engine_1.Vector.origin)
|
|
106
158
|
? initialPosition
|
|
107
|
-
: this.
|
|
108
|
-
}
|
|
109
|
-
calcPosition() {
|
|
110
|
-
const exactPosition = (0, engine_1.calcPositionOrRandomFromSizeRanged)({
|
|
111
|
-
size: this.container.canvas.size,
|
|
112
|
-
position: this.options.position,
|
|
113
|
-
});
|
|
114
|
-
return engine_1.Vector.create(exactPosition.x, exactPosition.y);
|
|
115
|
-
}
|
|
116
|
-
updateParticlePosition(particle, v) {
|
|
117
|
-
var _a;
|
|
118
|
-
if (particle.destroyed) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const container = this.container, canvasSize = container.canvas.size;
|
|
122
|
-
if (particle.needsNewPosition) {
|
|
123
|
-
const newPosition = (0, engine_1.calcPositionOrRandomFromSize)({ size: canvasSize });
|
|
124
|
-
particle.position.setTo(newPosition);
|
|
125
|
-
particle.velocity.setTo(particle.initialVelocity);
|
|
126
|
-
particle.absorberOrbit = undefined;
|
|
127
|
-
particle.needsNewPosition = false;
|
|
128
|
-
}
|
|
129
|
-
if (this.options.orbits) {
|
|
130
|
-
if (particle.absorberOrbit === undefined) {
|
|
131
|
-
particle.absorberOrbit = engine_1.Vector.create(0, 0);
|
|
132
|
-
particle.absorberOrbit.length = (0, engine_1.getDistance)(particle.getPosition(), this.position);
|
|
133
|
-
particle.absorberOrbit.angle = (0, engine_1.getRandom)() * Math.PI * 2;
|
|
134
|
-
}
|
|
135
|
-
if (particle.absorberOrbit.length <= this.size && !this.options.destroy) {
|
|
136
|
-
const minSize = Math.min(canvasSize.width, canvasSize.height);
|
|
137
|
-
particle.absorberOrbit.length = minSize * (1 + ((0, engine_1.getRandom)() * 0.2 - 0.1));
|
|
138
|
-
}
|
|
139
|
-
if (particle.absorberOrbitDirection === undefined) {
|
|
140
|
-
particle.absorberOrbitDirection =
|
|
141
|
-
particle.velocity.x >= 0 ? "clockwise" : "counter-clockwise";
|
|
142
|
-
}
|
|
143
|
-
const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, orbitDirection = particle.absorberOrbitDirection;
|
|
144
|
-
particle.velocity.setTo(engine_1.Vector.origin);
|
|
145
|
-
const updateFunc = {
|
|
146
|
-
x: orbitDirection === "clockwise" ? Math.cos : Math.sin,
|
|
147
|
-
y: orbitDirection === "clockwise" ? Math.sin : Math.cos,
|
|
148
|
-
};
|
|
149
|
-
particle.position.x = this.position.x + orbitRadius * updateFunc.x(orbitAngle);
|
|
150
|
-
particle.position.y = this.position.y + orbitRadius * updateFunc.y(orbitAngle);
|
|
151
|
-
particle.absorberOrbit.length -= v.length;
|
|
152
|
-
particle.absorberOrbit.angle +=
|
|
153
|
-
((((_a = particle.retina.moveSpeed) !== null && _a !== void 0 ? _a : 0) * container.retina.pixelRatio) / 100) *
|
|
154
|
-
container.retina.reduceFactor;
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
const addV = engine_1.Vector.origin;
|
|
158
|
-
addV.length = v.length;
|
|
159
|
-
addV.angle = v.angle;
|
|
160
|
-
particle.velocity.addTo(addV);
|
|
161
|
-
}
|
|
159
|
+
: this._calcPosition();
|
|
162
160
|
}
|
|
163
161
|
}
|
|
164
162
|
exports.AbsorberInstance = AbsorberInstance;
|
package/umd/Absorbers.js
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
this.array = [];
|
|
19
19
|
this.absorbers = [];
|
|
20
20
|
this.interactivityAbsorbers = [];
|
|
21
|
-
container.getAbsorber = (idxOrName) => idxOrName === undefined ||
|
|
21
|
+
container.getAbsorber = (idxOrName) => idxOrName === undefined || (0, engine_1.isNumber)(idxOrName)
|
|
22
22
|
? this.array[idxOrName || 0]
|
|
23
23
|
: this.array.find((t) => t.name === idxOrName);
|
|
24
24
|
container.addAbsorber = (options, position) => this.addAbsorber(options, position);
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
handleClickMode(mode) {
|
|
37
37
|
const absorberOptions = this.absorbers, modeAbsorbers = this.interactivityAbsorbers;
|
|
38
38
|
if (mode === "absorber") {
|
|
39
|
-
const absorbersModeOptions = (0, engine_1.itemFromSingleOrMultiple)(modeAbsorbers), absorbersOptions = absorbersModeOptions
|
|
39
|
+
const absorbersModeOptions = (0, engine_1.itemFromSingleOrMultiple)(modeAbsorbers), absorbersOptions = absorbersModeOptions ?? (0, engine_1.itemFromSingleOrMultiple)(absorberOptions), aPosition = this.container.interactivity.mouse.clickPosition;
|
|
40
40
|
this.addAbsorber(absorbersOptions, aPosition);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
if (v !== undefined) module.exports = v;
|
|
5
5
|
}
|
|
6
6
|
else if (typeof define === "function" && define.amd) {
|
|
7
|
-
define(["require", "exports", "
|
|
7
|
+
define(["require", "exports", "@tsparticles/engine", "./AbsorberSizeLimit"], factory);
|
|
8
8
|
}
|
|
9
9
|
})(function (require, exports) {
|
|
10
10
|
"use strict";
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.AbsorberSize = void 0;
|
|
13
|
-
const AbsorberSizeLimit_1 = require("./AbsorberSizeLimit");
|
|
14
13
|
const engine_1 = require("@tsparticles/engine");
|
|
14
|
+
const AbsorberSizeLimit_1 = require("./AbsorberSizeLimit");
|
|
15
15
|
class AbsorberSize extends engine_1.ValueWithRandom {
|
|
16
16
|
constructor() {
|
|
17
17
|
super();
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
if (data.density !== undefined) {
|
|
28
28
|
this.density = data.density;
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if ((0, engine_1.isNumber)(data.limit)) {
|
|
31
31
|
this.limit.radius = data.limit;
|
|
32
32
|
}
|
|
33
33
|
else {
|
package/umd/index.js
CHANGED
|
@@ -35,45 +35,42 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
35
35
|
return new Absorbers_1.Absorbers(container);
|
|
36
36
|
}
|
|
37
37
|
loadOptions(options, source) {
|
|
38
|
-
var _a, _b;
|
|
39
38
|
if (!this.needsPlugin(options) && !this.needsPlugin(source)) {
|
|
40
39
|
return;
|
|
41
40
|
}
|
|
42
|
-
if (source
|
|
41
|
+
if (source?.absorbers) {
|
|
43
42
|
options.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source.absorbers, (absorber) => {
|
|
44
43
|
const tmp = new Absorber_1.Absorber();
|
|
45
44
|
tmp.load(absorber);
|
|
46
45
|
return tmp;
|
|
47
46
|
});
|
|
48
47
|
}
|
|
49
|
-
options.interactivity.modes.absorbers = (0, engine_1.executeOnSingleOrMultiple)(
|
|
48
|
+
options.interactivity.modes.absorbers = (0, engine_1.executeOnSingleOrMultiple)(source?.interactivity?.modes?.absorbers, (absorber) => {
|
|
50
49
|
const tmp = new Absorber_1.Absorber();
|
|
51
50
|
tmp.load(absorber);
|
|
52
51
|
return tmp;
|
|
53
52
|
});
|
|
54
53
|
}
|
|
55
54
|
needsPlugin(options) {
|
|
56
|
-
var _a, _b, _c;
|
|
57
55
|
if (!options) {
|
|
58
56
|
return false;
|
|
59
57
|
}
|
|
60
58
|
const absorbers = options.absorbers;
|
|
61
|
-
if (
|
|
59
|
+
if ((0, engine_1.isArray)(absorbers)) {
|
|
62
60
|
return !!absorbers.length;
|
|
63
61
|
}
|
|
64
62
|
else if (absorbers) {
|
|
65
63
|
return true;
|
|
66
64
|
}
|
|
67
|
-
else if (
|
|
65
|
+
else if (options.interactivity?.events?.onClick?.mode &&
|
|
68
66
|
(0, engine_1.isInArray)("absorber", options.interactivity.events.onClick.mode)) {
|
|
69
67
|
return true;
|
|
70
68
|
}
|
|
71
69
|
return false;
|
|
72
70
|
}
|
|
73
71
|
}
|
|
74
|
-
async function loadAbsorbersPlugin(engine) {
|
|
75
|
-
|
|
76
|
-
await engine.addPlugin(plugin);
|
|
72
|
+
async function loadAbsorbersPlugin(engine, refresh = true) {
|
|
73
|
+
await engine.addPlugin(new AbsorbersPlugin(), refresh);
|
|
77
74
|
}
|
|
78
75
|
exports.loadAbsorbersPlugin = loadAbsorbersPlugin;
|
|
79
76
|
__exportStar(require("./AbsorberContainer"), exports);
|