@minicode-dev/chat 0.1.3 → 0.1.5

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/CHANGELOG.md CHANGED
@@ -14,6 +14,9 @@ All notable changes to `@minicode-dev/chat` (owner: Minicode, project: LIRA).
14
14
 
15
15
  ### Changed
16
16
 
17
+ - Incoming effects autoplay by default in visible conversations, with a 5-second cooldown and no window-focus requirement.
18
+ - New incoming effects can replace an active animation; confetti now fills the panel with 220 responsive particles.
19
+
17
20
  - Effects respect mute, reduced motion, cooldowns and manual replay; old messages and duplicates do not autoplay.
18
21
  - Standalone development and release documentation. Host applications must update their served sound assets.
19
22
 
package/README.md CHANGED
@@ -222,16 +222,16 @@ or use the existing `setChatAssetsBaseUrl` sound asset configuration. Copying th
222
222
  Open the **Efectos y zumbidos** button in the composer and click an effect to send it
223
223
  and play its animation. Each compact row shows sending/sent feedback; sound and automatic
224
224
  playback are controlled by two switches. Received
225
- effects appear as cards with manual replay; automatic playback is opt-in.
225
+ effects appear as cards with manual replay; new received effects play automatically by default in the visible conversation.
226
226
 
227
227
  ```jsx
228
228
  const config = {
229
229
  effects: {
230
230
  enabled: true,
231
- autoPlay: false,
231
+ autoPlay: true,
232
232
  sound: true,
233
233
  volume: 0.35,
234
- cooldownMs: 30000,
234
+ cooldownMs: 5000,
235
235
  maxAgeMs: 10000,
236
236
  allowGroups: false,
237
237
  onPreferencesChange: (patch) => console.log('Save user preferences', patch),
@@ -247,13 +247,13 @@ alongside the versioned payload. Set `effects: false` to disable the feature.
247
247
  Audio requires browser permission to play after a user gesture and respects the chat's
248
248
  mute control. Effects stop when closed or when leaving the conversation; motion reduction
249
249
  uses a static alternative. History, duplicates and reconnection baselines do not trigger
250
- automatic playback. Automatic effects require a visible, focused conversation. Same-origin
250
+ automatic playback. Automatic effects require a visible conversation in a visible tab. Same-origin
251
251
  tab deduplication is best effort. Receiving clients use a cooldown and ignore stale events.
252
252
  The server should enforce its own authorization and rate limits; browser controls alone
253
253
  cannot prevent abusive clients.
254
254
 
255
255
  In the demo, **Nuevas funciones** lets you simulate effects from Ana and configure playback.
256
- The demo permits effects in groups and shortens the cooldown to 1.5 seconds. None of these
256
+ The demo permits effects in groups and uses the same 5-second cooldown. None of these
257
257
  features requires a paid audio API. Sharing full songs and managing a production emoji
258
258
  upload service are outside this implementation.
259
259
 
@@ -281,3 +281,14 @@ proposal; the nudge and confetti WAVs are the original sources of the approved r
281
281
  them separately. Generated files live in `demo/audio-samples/`, are ignored by Git and
282
282
  excluded from npm. Source generators are in `demo/audio-lab/`; see
283
283
  [AUDIO_EFFECTS.md](AUDIO_EFFECTS.md) in the source repository for the arrangement and limitations.
284
+
285
+ ### Fun chat defaults
286
+
287
+ New incoming effects automatically animate in the visible conversation by default;
288
+ manual replay is still available. The default cooldown is 5 seconds. Window focus is
289
+ not required, but hidden tabs and old messages do not replay effects. A new permitted
290
+ effect can replace the animation currently playing. Confetti fills the panel with
291
+ 220 colored particles and scales to its height. Reduced-motion preferences remain respected.
292
+ Browsers can still block sound before the recipient interacts with the site; the visual
293
+ effect does not depend on successful audio playback. Both participants must use an updated
294
+ package, and explicitly saved `autoPlay: false` settings still disable automatic playback.
Binary file
Binary file
@@ -0,0 +1,367 @@
1
+ import { AdditiveBlending as e, AmbientLight as t, BoxGeometry as n, BufferAttribute as r, BufferGeometry as i, CanvasTexture as a, CatmullRomCurve3 as o, Color as s, ConeGeometry as c, CylinderGeometry as l, DirectionalLight as u, DoubleSide as d, DynamicDrawUsage as f, ExtrudeGeometry as p, InstancedMesh as m, Mesh as ee, MeshLambertMaterial as te, MeshStandardMaterial as ne, Object3D as h, PerspectiveCamera as re, PlaneGeometry as ie, PointLight as g, Points as ae, PointsMaterial as oe, Scene as se, Shape as _, SphereGeometry as v, TorusGeometry as ce, TubeGeometry as y, Vector3 as b, WebGLRenderer as x } from "three";
2
+ // src/effects/confetti/confettiScene3d.js
3
+ var S = [
4
+ "#ff4d8d",
5
+ "#ffd23f",
6
+ "#3ddc97",
7
+ "#4cc9f0",
8
+ "#9b5de5",
9
+ "#ff7b29",
10
+ "#f15bb5",
11
+ "#ffffff"
12
+ ].map((e) => new s(e)), C = 12, w = (e, t) => e + Math.random() * (t - e), T = (e) => e[Math.floor(Math.random() * e.length)], E = () => typeof matchMedia == "function" && matchMedia("(pointer: coarse)").matches || (navigator.hardwareConcurrency || 8) <= 4;
13
+ function le(e = 64) {
14
+ let t = document.createElement("canvas");
15
+ t.width = e, t.height = e;
16
+ let n = t.getContext("2d"), r = n.createRadialGradient(e / 2, e / 2, 0, e / 2, e / 2, e / 2);
17
+ return r.addColorStop(0, "rgba(255,255,255,1)"), r.addColorStop(.35, "rgba(255,255,255,.6)"), r.addColorStop(1, "rgba(255,255,255,0)"), n.fillStyle = r, n.fillRect(0, 0, e, e), new a(t);
18
+ }
19
+ function ue() {
20
+ let e = new _();
21
+ for (let t = 0; t < 10; t += 1) {
22
+ let n = t % 2 ? .14 : .32, r = t / 10 * Math.PI * 2 + Math.PI / 2, i = Math.cos(r) * n, a = Math.sin(r) * n;
23
+ t ? e.lineTo(i, a) : e.moveTo(i, a);
24
+ }
25
+ let t = new p(e, {
26
+ depth: .08,
27
+ bevelEnabled: !0,
28
+ bevelThickness: .03,
29
+ bevelSize: .02,
30
+ bevelSegments: 1
31
+ });
32
+ return t.center(), t;
33
+ }
34
+ function de(e) {
35
+ let t = [], n = w(2.5, 4);
36
+ for (let e = 0; e <= 24; e += 1) {
37
+ let r = e / 24, i = r * n * Math.PI * 2;
38
+ t.push(new b(Math.cos(i) * .18, r * 2.2 - 1.1, Math.sin(i) * .18));
39
+ }
40
+ return new y(new o(t), e ? 60 : 110, .022, e ? 3 : 4, !1);
41
+ }
42
+ function D(e, t, n, r) {
43
+ let i = new h(), a = t.map(({ geometry: t, material: r, tinted: a }) => {
44
+ let o = new m(t, r, n);
45
+ if (o.instanceMatrix.setUsage(f), o.frustumCulled = !1, a) {
46
+ for (let e = 0; e < n; e += 1) o.setColorAt(e, S[0]);
47
+ o.instanceColor.setUsage(f);
48
+ }
49
+ i.scale.setScalar(0), i.updateMatrix();
50
+ for (let e = 0; e < n; e += 1) o.setMatrixAt(e, i.matrix);
51
+ return e.add(o), {
52
+ mesh: o,
53
+ tinted: a
54
+ };
55
+ }), o = Array.from({ length: n }, () => ({
56
+ alive: !1,
57
+ pos: new b(),
58
+ vel: new b(),
59
+ rot: new b(),
60
+ spin: new b(),
61
+ size: 1,
62
+ life: 0,
63
+ phase: 0
64
+ })), s = 0;
65
+ return {
66
+ spawn(e, t, i = 1, c = w(4, 6)) {
67
+ let l = s;
68
+ s = (s + 1) % n;
69
+ let u = o[l];
70
+ u.alive = !0, u.pos.copy(e), u.vel.copy(t), u.rot.set(w(0, 6.3), w(0, 6.3), w(0, 6.3)), u.spin.set(w(-1, 1), w(-1, 1), w(-1, 1)).multiplyScalar(r.spin), u.size = i, u.life = c, u.phase = w(0, 6.3);
71
+ let d = T(S);
72
+ a.forEach(({ mesh: e, tinted: t }) => {
73
+ t && (e.setColorAt(l, d), e.instanceColor.needsUpdate = !0);
74
+ });
75
+ },
76
+ update(e, t, s) {
77
+ let c = Math.max(0, 1 - r.drag * e);
78
+ for (let l = 0; l < n; l += 1) {
79
+ let n = o[l];
80
+ if (!n.alive) continue;
81
+ n.life -= e, n.vel.y += r.gravity * e, n.vel.multiplyScalar(c), n.pos.addScaledVector(n.vel, e), r.sway && (n.pos.x += Math.sin(t * r.swayRate + n.phase) * r.sway * e), n.rot.addScaledVector(n.spin, e);
82
+ let u = n.pos.y < -s.halfHeight - 2 || n.pos.y > s.halfHeight + 3;
83
+ (n.life <= 0 || u) && (n.alive = !1);
84
+ let d = n.alive ? n.size * Math.min(1, n.life / .4) : 0;
85
+ i.position.copy(n.pos), i.rotation.set(n.rot.x, n.rot.y, n.rot.z), i.scale.setScalar(d), i.updateMatrix();
86
+ for (let e = 0; e < a.length; e += 1) a[e].mesh.setMatrixAt(l, i.matrix);
87
+ }
88
+ a.forEach(({ mesh: e }) => {
89
+ e.instanceMatrix.needsUpdate = !0;
90
+ });
91
+ }
92
+ };
93
+ }
94
+ function O(e) {
95
+ let t = E(), n = new x({
96
+ canvas: e,
97
+ alpha: !0,
98
+ antialias: !t,
99
+ powerPreference: "high-performance"
100
+ });
101
+ try {
102
+ return k(n, t);
103
+ } catch (e) {
104
+ throw n.dispose(), n.forceContextLoss?.(), e;
105
+ }
106
+ }
107
+ function k(a, o) {
108
+ a.setPixelRatio(Math.min(o ? 1.5 : 2, window.devicePixelRatio || 1)), a.setClearColor(0, 0);
109
+ let s = new se(), f = new re(50, 1, .1, 80);
110
+ f.position.set(0, 0, C);
111
+ let p = {
112
+ halfWidth: 6,
113
+ halfHeight: 5.6
114
+ }, m = o ? .5 : 1, h = new u(16777215, 1.1 * m);
115
+ h.position.set(2, 4, 6);
116
+ let _ = new g(16736168, 1.4 * m, 30, 1.5), y = new g(5032432, 1.4 * m, 30, 1.5), x = new g(16773570, 0, 40, 1.4);
117
+ x.position.set(0, .5, 4), s.add(new t(16777215, .55 * m), h, _, y, x);
118
+ let E = (e, t = {}) => o ? new te(e) : new ne({
119
+ roughness: .35,
120
+ metalness: .2,
121
+ ...e,
122
+ ...t
123
+ }), O = (e) => E({ color: 16777215 }, e), k = E({
124
+ color: 16764746,
125
+ emissive: 4861184
126
+ }, {
127
+ metalness: .75,
128
+ roughness: .25
129
+ }), A = o ? .5 : 1, j = D(s, [{
130
+ geometry: new ie(.14, .22),
131
+ material: E({
132
+ color: 16777215,
133
+ side: d
134
+ }, {
135
+ metalness: .35,
136
+ roughness: .4
137
+ }),
138
+ tinted: !0
139
+ }], Math.round(2400 * A), {
140
+ gravity: -3.2,
141
+ drag: 2.2,
142
+ spin: 9,
143
+ sway: .7,
144
+ swayRate: 3
145
+ }), M = {
146
+ gravity: -5.5,
147
+ drag: .5,
148
+ spin: 4
149
+ }, fe = D(s, [{
150
+ geometry: ue(),
151
+ material: O({
152
+ metalness: .6,
153
+ roughness: .25
154
+ }),
155
+ tinted: !0
156
+ }], Math.round(70 * A), M), pe = D(s, [{
157
+ geometry: new ce(.2, .07, o ? 8 : 12, o ? 18 : 28),
158
+ material: O({
159
+ metalness: .55,
160
+ roughness: .3
161
+ }),
162
+ tinted: !0
163
+ }], Math.round(50 * A), M), me = D(s, [
164
+ {
165
+ geometry: new n(.38, .38, .38),
166
+ material: O(),
167
+ tinted: !0
168
+ },
169
+ {
170
+ geometry: new n(.4, .4, .08),
171
+ material: k
172
+ },
173
+ {
174
+ geometry: new n(.08, .4, .4),
175
+ material: k
176
+ }
177
+ ], Math.round(50 * A), M), he = new v(.07, 10, 8).translate(0, .27, 0), ge = D(s, [{
178
+ geometry: new c(.2, .5, o ? 12 : 20),
179
+ material: O(),
180
+ tinted: !0
181
+ }, {
182
+ geometry: he,
183
+ material: O()
184
+ }], Math.round(50 * A), M), N = D(s, [
185
+ {
186
+ geometry: new v(.32, o ? 14 : 24, o ? 12 : 18).scale(1, 1.18, 1),
187
+ material: O({
188
+ roughness: .15,
189
+ metalness: .1
190
+ }),
191
+ tinted: !0
192
+ },
193
+ {
194
+ geometry: new c(.06, .08, 8).translate(0, -.41, 0),
195
+ material: O(),
196
+ tinted: !0
197
+ },
198
+ {
199
+ geometry: new l(.006, .006, 1.1, 4).translate(0, -1, 0),
200
+ material: O()
201
+ }
202
+ ], Math.round(24 * A), {
203
+ gravity: .9,
204
+ drag: 1.2,
205
+ spin: .4,
206
+ sway: .5,
207
+ swayRate: 1.4
208
+ }), P = [
209
+ fe,
210
+ pe,
211
+ me,
212
+ ge
213
+ ], F = Array.from({ length: 3 }, () => de(o)), I = S.map((e) => E({
214
+ color: e,
215
+ side: d
216
+ }, { metalness: .3 })), L = Array.from({ length: o ? 8 : 16 }, () => {
217
+ let e = new ee(F[0], I[0]);
218
+ return e.visible = !1, s.add(e), {
219
+ mesh: e,
220
+ vel: new b(),
221
+ spin: new b(),
222
+ life: 0
223
+ };
224
+ }), R = 0, z = le(), B = o ? 260 : 600, V = new Float32Array(B * 3), H = new Float32Array(B * 3), U = new Float32Array(B * 3), W = new Float32Array(B), G = new i();
225
+ G.setAttribute("position", new r(V, 3)), G.setAttribute("color", new r(H, 3));
226
+ let K = new ae(G, new oe({
227
+ size: o ? .22 : .18,
228
+ map: z,
229
+ vertexColors: !0,
230
+ transparent: !0,
231
+ blending: e,
232
+ depthWrite: !1
233
+ }));
234
+ K.frustumCulled = !1, s.add(K);
235
+ let q = 0, J = 0, Y = 0, X = 0, Z = (e, t, n) => new b(e + w(-n, n), t + w(-n, n), w(-n, n) * .8).normalize(), Q = (e, t, n, { paperCount: r = 0, objectCount: i = 0, streamerCount: a = 0, spread: o = .35, speed: s = 11 }) => {
236
+ for (let i = 0; i < r * A; i += 1) j.spawn(e, Z(t, n, o).multiplyScalar(s * w(.5, 1.25)), w(.8, 1.3), w(4, 6.5));
237
+ for (let r = 0; r < i * A; r += 1) T(P).spawn(e, Z(t, n, o).multiplyScalar(s * w(.55, 1)), w(1.1, 1.8));
238
+ for (let r = 0; r < a; r += 1) ve(e, Z(t, n, o).multiplyScalar(s * w(.4, .75)));
239
+ }, _e = (e, { paperCount: t, objectCount: n = 0, streamerCount: r = 0, speed: i }) => {
240
+ for (let n = 0; n < t * A; n += 1) j.spawn(e, new b(w(-1, 1), w(-.6, 1.2), w(-1, 1)).normalize().multiplyScalar(i * w(.3, 1)), w(.8, 1.3), w(3.5, 6));
241
+ for (let t = 0; t < n * A; t += 1) T(P).spawn(e, new b(w(-1, 1), w(-.3, 1.2), w(-.6, .6)).normalize().multiplyScalar(i * w(.4, .8)), w(1.2, 2));
242
+ for (let t = 0; t < r; t += 1) ve(e, new b(w(-1, 1), w(0, 1), w(-.5, .5)).normalize().multiplyScalar(i * .5));
243
+ };
244
+ function ve(e, t) {
245
+ let n = L[R];
246
+ R = (R + 1) % L.length, n.mesh.geometry = T(F), n.mesh.material = T(I), n.mesh.position.copy(e), n.mesh.rotation.set(w(0, 6.3), w(0, 6.3), w(0, 6.3)), n.mesh.scale.setScalar(w(.7, 1.1)), n.mesh.visible = !0, n.vel.copy(t), n.spin.set(w(-2, 2), w(-3, 3), w(-2, 2)), n.life = w(3.5, 5.5);
247
+ }
248
+ let $ = (e, t, n, r = 0) => {
249
+ for (let i = 0; i < t * A; i += 1) {
250
+ let t = q;
251
+ q = (q + 1) % B;
252
+ let i = w(0, Math.PI * 2), a = r ? w(2.5, 5) : w(0, .4), o = [
253
+ e.x + Math.cos(i) * a,
254
+ e.y + Math.sin(i) * a * .7,
255
+ e.z + w(-1, 1)
256
+ ];
257
+ V.set(o, t * 3);
258
+ let s = r ? [
259
+ -Math.sin(i) * r - Math.cos(i) * 1.4,
260
+ Math.cos(i) * r * .7 - Math.sin(i) * 1.4,
261
+ 0
262
+ ] : [
263
+ w(-1, 1) * n,
264
+ w(-.4, 1) * n,
265
+ w(-1, 1) * n
266
+ ];
267
+ U.set(s, t * 3), W[t] = w(1.2, 2.6);
268
+ }
269
+ }, ye = {
270
+ cannons(e) {
271
+ let { halfWidth: t, halfHeight: n } = p;
272
+ Q(new b(-t * .95, -n * .95, 0), .45, 1, {
273
+ paperCount: 420 * e,
274
+ objectCount: 12,
275
+ streamerCount: 2
276
+ }), Q(new b(t * .95, -n * .95, 0), -.45, 1, {
277
+ paperCount: 420 * e,
278
+ objectCount: 12,
279
+ streamerCount: 2
280
+ }), $(new b(0, -n * .6, 0), 80, 3);
281
+ },
282
+ left(e) {
283
+ Q(new b(-p.halfWidth, -p.halfHeight * .4, .5), 1, .85, {
284
+ paperCount: 450 * e,
285
+ objectCount: 14,
286
+ streamerCount: 3,
287
+ speed: 12
288
+ });
289
+ },
290
+ right(e) {
291
+ Q(new b(p.halfWidth, -p.halfHeight * .4, .5), -1, .85, {
292
+ paperCount: 450 * e,
293
+ objectCount: 14,
294
+ streamerCount: 3,
295
+ speed: 12
296
+ });
297
+ },
298
+ rain(e) {
299
+ for (let t = 0; t < 520 * e * A; t += 1) j.spawn(new b(w(-p.halfWidth, p.halfWidth), p.halfHeight + w(.2, 2), w(-2, 2)), new b(w(-.5, .5), w(-2, 0), 0), w(.8, 1.3), w(4, 6));
300
+ for (let e = 0; e < 14 * A; e += 1) T(P).spawn(new b(w(-p.halfWidth, p.halfWidth) * .8, p.halfHeight + .5, w(-1, 1)), new b(0, w(-2, 0), 0), w(1.2, 1.9));
301
+ $(new b(0, p.halfHeight * .5, 0), 120, 2);
302
+ },
303
+ balloons(e) {
304
+ for (let e = 0; e < 14 * A; e += 1) N.spawn(new b(w(-p.halfWidth, p.halfWidth) * .85, -p.halfHeight - w(.5, 2.5), w(-2, 1)), new b(0, w(1.2, 2.4), 0), w(.85, 1.3), 8);
305
+ Q(new b(0, -p.halfHeight, 0), 0, 1, {
306
+ paperCount: 300 * e,
307
+ objectCount: 10,
308
+ spread: .6
309
+ });
310
+ },
311
+ sky(e) {
312
+ let t = new b(w(-.4, .4) * p.halfWidth, p.halfHeight * .45, 0);
313
+ _e(t, {
314
+ paperCount: 600 * e,
315
+ objectCount: 16,
316
+ streamerCount: 2,
317
+ speed: 7
318
+ }), $(t, 160, 4);
319
+ },
320
+ swirl() {
321
+ $(new b(0, .3, 0), 260, 0, 3.2);
322
+ },
323
+ finale() {
324
+ let e = new b(0, .3, 0);
325
+ _e(e, {
326
+ paperCount: 1500,
327
+ objectCount: 80,
328
+ streamerCount: 10,
329
+ speed: 14
330
+ }), $(e, 320, 7);
331
+ for (let e = 0; e < 8 * A; e += 1) N.spawn(new b(w(-p.halfWidth, p.halfWidth) * .8, -p.halfHeight - w(.5, 2), w(-1.5, 1)), new b(0, w(2, 3.2), 0), w(.9, 1.3), 5);
332
+ X = .7;
333
+ }
334
+ };
335
+ return {
336
+ burst(e, t = 1) {
337
+ ye[e]?.(t), Y = Math.max(Y, e === "finale" ? 1 : t * .5);
338
+ },
339
+ render(e) {
340
+ J += e, Y = Math.max(0, Y - e * 2.5), X = Math.max(0, X - e * 1.8), x.intensity = Y * 6 * m, _.position.set(Math.cos(J * .7) * 6, Math.sin(J * .9) * 3, 4), y.position.set(Math.cos(J * .7 + Math.PI) * 6, Math.sin(J * 1.1 + 1) * 3, 4), j.update(e, J, p), P.forEach((t) => t.update(e, J, p)), N.update(e, J, p), L.forEach((t) => {
341
+ t.mesh.visible && (t.life -= e, t.vel.y -= 2.2 * e, t.vel.multiplyScalar(Math.max(0, 1 - 1.5 * e)), t.mesh.position.addScaledVector(t.vel, e), t.mesh.rotation.x += t.spin.x * e, t.mesh.rotation.y += t.spin.y * e, t.mesh.rotation.z += t.spin.z * e, t.life <= 0 && (t.mesh.visible = !1));
342
+ });
343
+ for (let t = 0; t < B; t += 1) {
344
+ let n = t * 3;
345
+ if (W[t] <= 0) {
346
+ H[n] = 0, H[n + 1] = 0, H[n + 2] = 0;
347
+ continue;
348
+ }
349
+ W[t] -= e, U[n + 1] -= .8 * e, V[n] += U[n] * e, V[n + 1] += U[n + 1] * e, V[n + 2] += U[n + 2] * e;
350
+ let r = Math.min(1, W[t]) * (.35 + Math.random() * .65);
351
+ H[n] = r, H[n + 1] = r * .88, H[n + 2] = r * .6;
352
+ }
353
+ G.attributes.position.needsUpdate = !0, G.attributes.color.needsUpdate = !0, f.position.x = (Math.random() - .5) * X * .3, f.position.y = (Math.random() - .5) * X * .3, a.render(s, f);
354
+ },
355
+ resize(e, t) {
356
+ a.setSize(e, t, !1), f.aspect = e / t, f.fov = f.aspect < 1 ? Math.min(85, 50 / Math.max(f.aspect, .55) * .8) : 50, f.updateProjectionMatrix(), p.halfHeight = Math.tan(f.fov * Math.PI / 360) * C, p.halfWidth = p.halfHeight * f.aspect;
357
+ },
358
+ dispose() {
359
+ s.traverse((e) => {
360
+ e.isInstancedMesh && e.dispose(), e.geometry?.dispose(), e.material && [].concat(e.material).forEach((e) => e.dispose());
361
+ }), F.forEach((e) => e.dispose()), I.forEach((e) => e.dispose()), z.dispose(), a.dispose(), a.forceContextLoss?.();
362
+ }
363
+ };
364
+ }
365
+ export { O as createConfettiScene };
366
+
367
+ //# sourceMappingURL=confettiScene3d-WooGwo25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confettiScene3d-WooGwo25.js","names":["PALETTE","Color","hex","DISTANCE","rand","min","max","pick","items","isLowPower","softDot","canvas","size","ctx","gradient","CanvasTexture","starGeometry","shape","Shape","i","radius","angle","x","y","geometry","ExtrudeGeometry","streamerGeometry","points","turns","t","Vector3","TubeGeometry","CatmullRomCurve3","lowPower","createPool","dummy","Object3D","meshes","parts","mesh","InstancedMesh","material","count","DynamicDrawUsage","tinted","scene","bodies","cursor","index","body","position","velocity","physics","life","color","drag","dt","time","outside","bounds","scale","m","createConfettiScene","renderer","WebGLRenderer","buildScene","error","Scene","camera","PerspectiveCamera","light","key","DirectionalLight","pink","PointLight","cyan","flash","AmbientLight","MeshLambertMaterial","options","MeshStandardMaterial","standard","white","gold","paper","PlaneGeometry","DoubleSide","rigid","stars","rings","TorusGeometry","gifts","BoxGeometry","pom","SphereGeometry","hats","ConeGeometry","balloons","CylinderGeometry","objects","streamerGeometries","streamerMaterials","streamers","Mesh","streamerCursor","dot","GLITTER","glitterPositions","glitterColors","glitterVelocity","glitterLife","glitterGeometry","BufferGeometry","BufferAttribute","glitter","Points","PointsMaterial","AdditiveBlending","glitterCursor","flashLevel","shake","direction","spread","cannon","paperCount","origin","speed","objectCount","streamerCount","shell","spawnStreamer","streamer","sparkle","n","swirl","bursts","w","h","power","kind","pool","p","twinkle","width","height","child","entry"],"sources":["../../src/effects/confetti/confettiScene3d.js"],"sourcesContent":["// Three.js party for the Confeti effect. Loaded lazily; `three` is an optional peer, so\n// ConfettiEffect falls back to the CSS confetti when this module or WebGL is unavailable.\n// Every body kind is one InstancedMesh per part, so thousands of pieces cost a few draw calls.\nimport {\n AdditiveBlending, AmbientLight, BoxGeometry, BufferAttribute, BufferGeometry, CanvasTexture, CatmullRomCurve3, Color,\n ConeGeometry, CylinderGeometry, DirectionalLight, DoubleSide, DynamicDrawUsage, ExtrudeGeometry, InstancedMesh, Mesh,\n MeshLambertMaterial, MeshStandardMaterial, Object3D, PerspectiveCamera, PlaneGeometry, PointLight, Points, PointsMaterial,\n Scene, Shape, SphereGeometry, TorusGeometry, TubeGeometry, Vector3, WebGLRenderer,\n} from 'three';\n\nconst PALETTE = ['#ff4d8d', '#ffd23f', '#3ddc97', '#4cc9f0', '#9b5de5', '#ff7b29', '#f15bb5', '#ffffff'].map((hex) => new Color(hex));\nconst DISTANCE = 12;\nconst rand = (min, max) => min + Math.random() * (max - min);\nconst pick = (items) => items[Math.floor(Math.random() * items.length)];\n\n// Phones and low-core devices get smaller pools, Lambert shading, no MSAA and a lower pixel ratio.\nconst isLowPower = () => (typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches)\n || (navigator.hardwareConcurrency || 8) <= 4;\n\nfunction softDot(size = 64) {\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n const gradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2);\n gradient.addColorStop(0, 'rgba(255,255,255,1)');\n gradient.addColorStop(0.35, 'rgba(255,255,255,.6)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n return new CanvasTexture(canvas);\n}\n\nfunction starGeometry() {\n const shape = new Shape();\n for (let i = 0; i < 10; i += 1) {\n const radius = i % 2 ? 0.14 : 0.32;\n const angle = (i / 10) * Math.PI * 2 + Math.PI / 2;\n const x = Math.cos(angle) * radius;\n const y = Math.sin(angle) * radius;\n if (i) shape.lineTo(x, y); else shape.moveTo(x, y);\n }\n const geometry = new ExtrudeGeometry(shape, { depth: 0.08, bevelEnabled: true, bevelThickness: 0.03, bevelSize: 0.02, bevelSegments: 1 });\n geometry.center();\n return geometry;\n}\n\n// Curly ribbon: a loose helix that tumbles as one rigid streamer.\nfunction streamerGeometry(lowPower) {\n const points = [];\n const turns = rand(2.5, 4);\n for (let i = 0; i <= 24; i += 1) {\n const t = i / 24;\n const angle = t * turns * Math.PI * 2;\n points.push(new Vector3(Math.cos(angle) * 0.18, t * 2.2 - 1.1, Math.sin(angle) * 0.18));\n }\n return new TubeGeometry(new CatmullRomCurve3(points), lowPower ? 60 : 110, 0.022, lowPower ? 3 : 4, false);\n}\n\n/**\n * A ring buffer of rigid bodies drawn by one InstancedMesh per part.\n * `tinted` parts take each body's palette color; the others keep their material color.\n */\nfunction createPool(scene, parts, count, physics) {\n const dummy = new Object3D();\n const meshes = parts.map(({ geometry, material, tinted }) => {\n const mesh = new InstancedMesh(geometry, material, count);\n mesh.instanceMatrix.setUsage(DynamicDrawUsage);\n mesh.frustumCulled = false;\n if (tinted) {\n for (let i = 0; i < count; i += 1) mesh.setColorAt(i, PALETTE[0]);\n mesh.instanceColor.setUsage(DynamicDrawUsage);\n }\n dummy.scale.setScalar(0);\n dummy.updateMatrix();\n for (let i = 0; i < count; i += 1) mesh.setMatrixAt(i, dummy.matrix);\n scene.add(mesh);\n return { mesh, tinted };\n });\n const bodies = Array.from({ length: count }, () => ({\n alive: false, pos: new Vector3(), vel: new Vector3(), rot: new Vector3(), spin: new Vector3(), size: 1, life: 0, phase: 0,\n }));\n let cursor = 0;\n return {\n spawn(position, velocity, size = 1, life = rand(4, 6)) {\n const index = cursor;\n cursor = (cursor + 1) % count;\n const body = bodies[index];\n body.alive = true;\n body.pos.copy(position);\n body.vel.copy(velocity);\n body.rot.set(rand(0, 6.3), rand(0, 6.3), rand(0, 6.3));\n body.spin.set(rand(-1, 1), rand(-1, 1), rand(-1, 1)).multiplyScalar(physics.spin);\n body.size = size;\n body.life = life;\n body.phase = rand(0, 6.3);\n const color = pick(PALETTE);\n meshes.forEach(({ mesh, tinted }) => {\n if (!tinted) return;\n mesh.setColorAt(index, color);\n mesh.instanceColor.needsUpdate = true;\n });\n },\n update(dt, time, bounds) {\n const drag = Math.max(0, 1 - physics.drag * dt);\n for (let i = 0; i < count; i += 1) {\n const body = bodies[i];\n if (!body.alive) continue;\n body.life -= dt;\n body.vel.y += physics.gravity * dt;\n body.vel.multiplyScalar(drag);\n body.pos.addScaledVector(body.vel, dt);\n // Paper and balloons sway as they drift; rigid objects only tumble.\n if (physics.sway) body.pos.x += Math.sin(time * physics.swayRate + body.phase) * physics.sway * dt;\n body.rot.addScaledVector(body.spin, dt);\n const outside = body.pos.y < -bounds.halfHeight - 2 || body.pos.y > bounds.halfHeight + 3;\n if (body.life <= 0 || outside) body.alive = false;\n // Shrink out over the last 0.4 s instead of popping.\n const scale = body.alive ? body.size * Math.min(1, body.life / 0.4) : 0;\n dummy.position.copy(body.pos);\n dummy.rotation.set(body.rot.x, body.rot.y, body.rot.z);\n dummy.scale.setScalar(scale);\n dummy.updateMatrix();\n for (let m = 0; m < meshes.length; m += 1) meshes[m].mesh.setMatrixAt(i, dummy.matrix);\n }\n meshes.forEach(({ mesh }) => { mesh.instanceMatrix.needsUpdate = true; });\n },\n };\n}\n\nexport function createConfettiScene(canvas) {\n const lowPower = isLowPower();\n const renderer = new WebGLRenderer({ canvas, alpha: true, antialias: !lowPower, powerPreference: 'high-performance' });\n // A failed setup must not keep the GL context alive.\n try {\n return buildScene(renderer, lowPower);\n } catch (error) {\n renderer.dispose();\n renderer.forceContextLoss?.();\n throw error;\n }\n}\n\nfunction buildScene(renderer, lowPower) {\n renderer.setPixelRatio(Math.min(lowPower ? 1.5 : 2, window.devicePixelRatio || 1));\n renderer.setClearColor(0x000000, 0);\n const scene = new Scene();\n const camera = new PerspectiveCamera(50, 1, 0.1, 80);\n camera.position.set(0, 0, DISTANCE);\n const bounds = { halfWidth: 6, halfHeight: 5.6 };\n\n // Lambert reflects more than the standard material, so its rig is dimmed to keep colors saturated.\n const light = lowPower ? 0.5 : 1;\n const key = new DirectionalLight(0xffffff, 1.1 * light);\n key.position.set(2, 4, 6);\n const pink = new PointLight(0xff5fa8, 1.4 * light, 30, 1.5);\n const cyan = new PointLight(0x4cc9f0, 1.4 * light, 30, 1.5);\n const flash = new PointLight(0xfff1c2, 0, 40, 1.4);\n flash.position.set(0, 0.5, 4);\n scene.add(new AmbientLight(0xffffff, 0.55 * light), key, pink, cyan, flash);\n\n const material = (options, standard = {}) => (lowPower\n ? new MeshLambertMaterial(options)\n : new MeshStandardMaterial({ roughness: 0.35, metalness: 0.2, ...options, ...standard }));\n const white = (standard) => material({ color: 0xffffff }, standard);\n const gold = material({ color: 0xffcf4a, emissive: 0x4a2d00 }, { metalness: 0.75, roughness: 0.25 });\n\n const scale = lowPower ? 0.5 : 1;\n const paper = createPool(scene, [{ geometry: new PlaneGeometry(0.14, 0.22), material: material({ color: 0xffffff, side: DoubleSide }, { metalness: 0.35, roughness: 0.4 }), tinted: true }],\n Math.round(2400 * scale), { gravity: -3.2, drag: 2.2, spin: 9, sway: 0.7, swayRate: 3 });\n const rigid = { gravity: -5.5, drag: 0.5, spin: 4 };\n const stars = createPool(scene, [{ geometry: starGeometry(), material: white({ metalness: 0.6, roughness: 0.25 }), tinted: true }], Math.round(70 * scale), rigid);\n const ringGeometry = new TorusGeometry(0.2, 0.07, lowPower ? 8 : 12, lowPower ? 18 : 28);\n const rings = createPool(scene, [{ geometry: ringGeometry, material: white({ metalness: 0.55, roughness: 0.3 }), tinted: true }], Math.round(50 * scale), rigid);\n const gifts = createPool(scene, [\n { geometry: new BoxGeometry(0.38, 0.38, 0.38), material: white(), tinted: true },\n { geometry: new BoxGeometry(0.4, 0.4, 0.08), material: gold },\n { geometry: new BoxGeometry(0.08, 0.4, 0.4), material: gold },\n ], Math.round(50 * scale), rigid);\n const pom = new SphereGeometry(0.07, 10, 8).translate(0, 0.27, 0);\n const hats = createPool(scene, [\n { geometry: new ConeGeometry(0.2, 0.5, lowPower ? 12 : 20), material: white(), tinted: true },\n { geometry: pom, material: white() },\n ], Math.round(50 * scale), rigid);\n const balloonBody = new SphereGeometry(0.32, lowPower ? 14 : 24, lowPower ? 12 : 18).scale(1, 1.18, 1);\n const balloons = createPool(scene, [\n { geometry: balloonBody, material: white({ roughness: 0.15, metalness: 0.1 }), tinted: true },\n { geometry: new ConeGeometry(0.06, 0.08, 8).translate(0, -0.41, 0), material: white(), tinted: true },\n { geometry: new CylinderGeometry(0.006, 0.006, 1.1, 4).translate(0, -1, 0), material: white() },\n ], Math.round(24 * scale), { gravity: 0.9, drag: 1.2, spin: 0.4, sway: 0.5, swayRate: 1.4 });\n const objects = [stars, rings, gifts, hats];\n\n const streamerGeometries = Array.from({ length: 3 }, () => streamerGeometry(lowPower));\n const streamerMaterials = PALETTE.map((color) => material({ color, side: DoubleSide }, { metalness: 0.3 }));\n const streamers = Array.from({ length: lowPower ? 8 : 16 }, () => {\n const mesh = new Mesh(streamerGeometries[0], streamerMaterials[0]);\n mesh.visible = false;\n scene.add(mesh);\n return { mesh, vel: new Vector3(), spin: new Vector3(), life: 0 };\n });\n let streamerCursor = 0;\n\n const dot = softDot();\n const GLITTER = lowPower ? 260 : 600;\n const glitterPositions = new Float32Array(GLITTER * 3);\n const glitterColors = new Float32Array(GLITTER * 3);\n const glitterVelocity = new Float32Array(GLITTER * 3);\n const glitterLife = new Float32Array(GLITTER);\n const glitterGeometry = new BufferGeometry();\n glitterGeometry.setAttribute('position', new BufferAttribute(glitterPositions, 3));\n glitterGeometry.setAttribute('color', new BufferAttribute(glitterColors, 3));\n const glitter = new Points(glitterGeometry, new PointsMaterial({ size: lowPower ? 0.22 : 0.18, map: dot, vertexColors: true, transparent: true, blending: AdditiveBlending, depthWrite: false }));\n glitter.frustumCulled = false;\n scene.add(glitter);\n let glitterCursor = 0;\n\n let time = 0;\n let flashLevel = 0;\n let shake = 0;\n\n const direction = (x, y, spread) => new Vector3(x + rand(-spread, spread), y + rand(-spread, spread), rand(-spread, spread) * 0.8).normalize();\n // A cone of pieces from `origin`; every kind gets its own share and speed.\n const cannon = (origin, x, y, { paperCount = 0, objectCount = 0, streamerCount = 0, spread = 0.35, speed = 11 }) => {\n for (let i = 0; i < paperCount * scale; i += 1) paper.spawn(origin, direction(x, y, spread).multiplyScalar(speed * rand(0.5, 1.25)), rand(0.8, 1.3), rand(4, 6.5));\n for (let i = 0; i < objectCount * scale; i += 1) pick(objects).spawn(origin, direction(x, y, spread).multiplyScalar(speed * rand(0.55, 1)), rand(1.1, 1.8));\n for (let i = 0; i < streamerCount; i += 1) spawnStreamer(origin, direction(x, y, spread).multiplyScalar(speed * rand(0.4, 0.75)));\n };\n // A sphere of pieces, like a firework shell.\n const shell = (origin, { paperCount, objectCount = 0, streamerCount = 0, speed }) => {\n for (let i = 0; i < paperCount * scale; i += 1) paper.spawn(origin, new Vector3(rand(-1, 1), rand(-0.6, 1.2), rand(-1, 1)).normalize().multiplyScalar(speed * rand(0.3, 1)), rand(0.8, 1.3), rand(3.5, 6));\n for (let i = 0; i < objectCount * scale; i += 1) pick(objects).spawn(origin, new Vector3(rand(-1, 1), rand(-0.3, 1.2), rand(-0.6, 0.6)).normalize().multiplyScalar(speed * rand(0.4, 0.8)), rand(1.2, 2));\n for (let i = 0; i < streamerCount; i += 1) spawnStreamer(origin, new Vector3(rand(-1, 1), rand(0, 1), rand(-0.5, 0.5)).normalize().multiplyScalar(speed * 0.5));\n };\n function spawnStreamer(origin, velocity) {\n const streamer = streamers[streamerCursor];\n streamerCursor = (streamerCursor + 1) % streamers.length;\n streamer.mesh.geometry = pick(streamerGeometries);\n streamer.mesh.material = pick(streamerMaterials);\n streamer.mesh.position.copy(origin);\n streamer.mesh.rotation.set(rand(0, 6.3), rand(0, 6.3), rand(0, 6.3));\n streamer.mesh.scale.setScalar(rand(0.7, 1.1));\n streamer.mesh.visible = true;\n streamer.vel.copy(velocity);\n streamer.spin.set(rand(-2, 2), rand(-3, 3), rand(-2, 2));\n streamer.life = rand(3.5, 5.5);\n }\n const sparkle = (origin, count, speed, swirl = 0) => {\n for (let n = 0; n < count * scale; n += 1) {\n const i = glitterCursor;\n glitterCursor = (glitterCursor + 1) % GLITTER;\n const angle = rand(0, Math.PI * 2);\n const radius = swirl ? rand(2.5, 5) : rand(0, 0.4);\n const position = [origin.x + Math.cos(angle) * radius, origin.y + Math.sin(angle) * radius * 0.7, origin.z + rand(-1, 1)];\n glitterPositions.set(position, i * 3);\n // Swirling glitter orbits inward to charge up the final blast.\n const velocity = swirl\n ? [-Math.sin(angle) * swirl - Math.cos(angle) * 1.4, Math.cos(angle) * swirl * 0.7 - Math.sin(angle) * 1.4, 0]\n : [rand(-1, 1) * speed, rand(-0.4, 1) * speed, rand(-1, 1) * speed];\n glitterVelocity.set(velocity, i * 3);\n glitterLife[i] = rand(1.2, 2.6);\n }\n };\n\n const bursts = {\n cannons(power) {\n const { halfWidth: w, halfHeight: h } = bounds;\n cannon(new Vector3(-w * 0.95, -h * 0.95, 0), 0.45, 1, { paperCount: 420 * power, objectCount: 12, streamerCount: 2 });\n cannon(new Vector3(w * 0.95, -h * 0.95, 0), -0.45, 1, { paperCount: 420 * power, objectCount: 12, streamerCount: 2 });\n sparkle(new Vector3(0, -h * 0.6, 0), 80, 3);\n },\n left(power) {\n cannon(new Vector3(-bounds.halfWidth, -bounds.halfHeight * 0.4, 0.5), 1, 0.85, { paperCount: 450 * power, objectCount: 14, streamerCount: 3, speed: 12 });\n },\n right(power) {\n cannon(new Vector3(bounds.halfWidth, -bounds.halfHeight * 0.4, 0.5), -1, 0.85, { paperCount: 450 * power, objectCount: 14, streamerCount: 3, speed: 12 });\n },\n rain(power) {\n for (let i = 0; i < 520 * power * scale; i += 1) {\n paper.spawn(new Vector3(rand(-bounds.halfWidth, bounds.halfWidth), bounds.halfHeight + rand(0.2, 2), rand(-2, 2)), new Vector3(rand(-0.5, 0.5), rand(-2, 0), 0), rand(0.8, 1.3), rand(4, 6));\n }\n for (let i = 0; i < 14 * scale; i += 1) pick(objects).spawn(new Vector3(rand(-bounds.halfWidth, bounds.halfWidth) * 0.8, bounds.halfHeight + 0.5, rand(-1, 1)), new Vector3(0, rand(-2, 0), 0), rand(1.2, 1.9));\n sparkle(new Vector3(0, bounds.halfHeight * 0.5, 0), 120, 2);\n },\n balloons(power) {\n for (let i = 0; i < 14 * scale; i += 1) {\n balloons.spawn(new Vector3(rand(-bounds.halfWidth, bounds.halfWidth) * 0.85, -bounds.halfHeight - rand(0.5, 2.5), rand(-2, 1)), new Vector3(0, rand(1.2, 2.4), 0), rand(0.85, 1.3), 8);\n }\n cannon(new Vector3(0, -bounds.halfHeight, 0), 0, 1, { paperCount: 300 * power, objectCount: 10, spread: 0.6 });\n },\n sky(power) {\n const origin = new Vector3(rand(-0.4, 0.4) * bounds.halfWidth, bounds.halfHeight * 0.45, 0);\n shell(origin, { paperCount: 600 * power, objectCount: 16, streamerCount: 2, speed: 7 });\n sparkle(origin, 160, 4);\n },\n swirl() {\n sparkle(new Vector3(0, 0.3, 0), 260, 0, 3.2);\n },\n finale() {\n const origin = new Vector3(0, 0.3, 0);\n shell(origin, { paperCount: 1500, objectCount: 80, streamerCount: 10, speed: 14 });\n sparkle(origin, 320, 7);\n for (let i = 0; i < 8 * scale; i += 1) {\n balloons.spawn(new Vector3(rand(-bounds.halfWidth, bounds.halfWidth) * 0.8, -bounds.halfHeight - rand(0.5, 2), rand(-1.5, 1)), new Vector3(0, rand(2, 3.2), 0), rand(0.9, 1.3), 5);\n }\n shake = 0.7;\n },\n };\n\n return {\n burst(kind, power = 1) {\n bursts[kind]?.(power);\n flashLevel = Math.max(flashLevel, kind === 'finale' ? 1 : power * 0.5);\n },\n render(dt) {\n time += dt;\n flashLevel = Math.max(0, flashLevel - dt * 2.5);\n shake = Math.max(0, shake - dt * 1.8);\n flash.intensity = flashLevel * 6 * light;\n pink.position.set(Math.cos(time * 0.7) * 6, Math.sin(time * 0.9) * 3, 4);\n cyan.position.set(Math.cos(time * 0.7 + Math.PI) * 6, Math.sin(time * 1.1 + 1) * 3, 4);\n\n paper.update(dt, time, bounds);\n objects.forEach((pool) => pool.update(dt, time, bounds));\n balloons.update(dt, time, bounds);\n streamers.forEach((streamer) => {\n if (!streamer.mesh.visible) return;\n streamer.life -= dt;\n streamer.vel.y -= 2.2 * dt;\n streamer.vel.multiplyScalar(Math.max(0, 1 - 1.5 * dt));\n streamer.mesh.position.addScaledVector(streamer.vel, dt);\n streamer.mesh.rotation.x += streamer.spin.x * dt;\n streamer.mesh.rotation.y += streamer.spin.y * dt;\n streamer.mesh.rotation.z += streamer.spin.z * dt;\n if (streamer.life <= 0) streamer.mesh.visible = false;\n });\n\n for (let i = 0; i < GLITTER; i += 1) {\n const p = i * 3;\n if (glitterLife[i] <= 0) { glitterColors[p] = 0; glitterColors[p + 1] = 0; glitterColors[p + 2] = 0; continue; }\n glitterLife[i] -= dt;\n glitterVelocity[p + 1] -= 0.8 * dt;\n glitterPositions[p] += glitterVelocity[p] * dt;\n glitterPositions[p + 1] += glitterVelocity[p + 1] * dt;\n glitterPositions[p + 2] += glitterVelocity[p + 2] * dt;\n // Random twinkle in warm gold-white.\n const twinkle = Math.min(1, glitterLife[i]) * (0.35 + Math.random() * 0.65);\n glitterColors[p] = twinkle;\n glitterColors[p + 1] = twinkle * 0.88;\n glitterColors[p + 2] = twinkle * 0.6;\n }\n glitterGeometry.attributes.position.needsUpdate = true;\n glitterGeometry.attributes.color.needsUpdate = true;\n\n camera.position.x = (Math.random() - 0.5) * shake * 0.3;\n camera.position.y = (Math.random() - 0.5) * shake * 0.3;\n renderer.render(scene, camera);\n },\n resize(width, height) {\n renderer.setSize(width, height, false);\n camera.aspect = width / height;\n // Portrait chat windows widen the lens so cannons at the edges stay on screen.\n camera.fov = camera.aspect < 1 ? Math.min(85, (50 / Math.max(camera.aspect, 0.55)) * 0.8) : 50;\n camera.updateProjectionMatrix();\n bounds.halfHeight = Math.tan((camera.fov * Math.PI) / 360) * DISTANCE;\n bounds.halfWidth = bounds.halfHeight * camera.aspect;\n },\n dispose() {\n scene.traverse((child) => {\n // InstancedMesh owns the instanceMatrix/instanceColor GPU buffers.\n if (child.isInstancedMesh) child.dispose();\n child.geometry?.dispose();\n if (child.material) [].concat(child.material).forEach((entry) => entry.dispose());\n });\n streamerGeometries.forEach((geometry) => geometry.dispose());\n streamerMaterials.forEach((entry) => entry.dispose());\n dot.dispose();\n renderer.dispose();\n renderer.forceContextLoss?.();\n },\n };\n}\n"],"mappings":"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"}