react-confetti-burst 1.0.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/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/cjs/components.d.ts +219 -0
- package/dist/cjs/components.d.ts.map +1 -0
- package/dist/cjs/components.js +341 -0
- package/dist/cjs/components.js.map +1 -0
- package/dist/cjs/confetti-engine.d.ts +122 -0
- package/dist/cjs/confetti-engine.d.ts.map +1 -0
- package/dist/cjs/confetti-engine.js +589 -0
- package/dist/cjs/confetti-engine.js.map +1 -0
- package/dist/cjs/confetti.d.ts +50 -0
- package/dist/cjs/confetti.d.ts.map +1 -0
- package/dist/cjs/confetti.js +446 -0
- package/dist/cjs/confetti.js.map +1 -0
- package/dist/cjs/constants.d.ts +147 -0
- package/dist/cjs/constants.d.ts.map +1 -0
- package/dist/cjs/constants.js +609 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/hooks.d.ts +94 -0
- package/dist/cjs/hooks.d.ts.map +1 -0
- package/dist/cjs/hooks.js +225 -0
- package/dist/cjs/hooks.js.map +1 -0
- package/dist/cjs/index.d.ts +34 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +180 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/particle.d.ts +50 -0
- package/dist/cjs/particle.d.ts.map +1 -0
- package/dist/cjs/particle.js +475 -0
- package/dist/cjs/particle.js.map +1 -0
- package/dist/cjs/shapes.d.ts +190 -0
- package/dist/cjs/shapes.d.ts.map +1 -0
- package/dist/cjs/shapes.js +272 -0
- package/dist/cjs/shapes.js.map +1 -0
- package/dist/cjs/types.d.ts +720 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +25 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.d.ts +90 -0
- package/dist/cjs/utils.d.ts.map +1 -0
- package/dist/cjs/utils.js +330 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/components.js +334 -0
- package/dist/esm/components.js.map +1 -0
- package/dist/esm/confetti-engine.js +581 -0
- package/dist/esm/confetti-engine.js.map +1 -0
- package/dist/esm/confetti.js +443 -0
- package/dist/esm/confetti.js.map +1 -0
- package/dist/esm/constants.js +605 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/hooks.js +218 -0
- package/dist/esm/hooks.js.map +1 -0
- package/dist/esm/index.js +146 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/particle.js +465 -0
- package/dist/esm/particle.js.map +1 -0
- package/dist/esm/shapes.js +265 -0
- package/dist/esm/shapes.js.map +1 -0
- package/dist/esm/types.js +24 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.js +309 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/components.d.ts +219 -0
- package/dist/types/components.d.ts.map +1 -0
- package/dist/types/confetti-engine.d.ts +122 -0
- package/dist/types/confetti-engine.d.ts.map +1 -0
- package/dist/types/confetti.d.ts +50 -0
- package/dist/types/confetti.d.ts.map +1 -0
- package/dist/types/constants.d.ts +147 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/hooks.d.ts +94 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/particle.d.ts +50 -0
- package/dist/types/particle.d.ts.map +1 -0
- package/dist/types/shapes.d.ts +190 -0
- package/dist/types/shapes.d.ts.map +1 -0
- package/dist/types/types.d.ts +720 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils.d.ts +90 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Particle class for confetti animation
|
|
4
|
+
*
|
|
5
|
+
* Represents a single confetti particle with all physics properties
|
|
6
|
+
* and methods for updating and rendering.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.loadImage = loadImage;
|
|
10
|
+
exports.clearImageCache = clearImageCache;
|
|
11
|
+
exports.createParticle = createParticle;
|
|
12
|
+
exports.updateParticle = updateParticle;
|
|
13
|
+
exports.renderParticle = renderParticle;
|
|
14
|
+
exports.areAllParticlesInactive = areAllParticlesInactive;
|
|
15
|
+
exports.countActiveParticles = countActiveParticles;
|
|
16
|
+
exports.resetParticleIdCounter = resetParticleIdCounter;
|
|
17
|
+
const utils_1 = require("./utils");
|
|
18
|
+
const constants_1 = require("./constants");
|
|
19
|
+
/**
|
|
20
|
+
* Internal particle ID counter
|
|
21
|
+
*/
|
|
22
|
+
let particleIdCounter = 0;
|
|
23
|
+
/**
|
|
24
|
+
* Image cache for loaded images
|
|
25
|
+
*/
|
|
26
|
+
const imageCache = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Loads an image and caches it
|
|
29
|
+
*/
|
|
30
|
+
function loadImage(src) {
|
|
31
|
+
if (imageCache.has(src)) {
|
|
32
|
+
return Promise.resolve(imageCache.get(src));
|
|
33
|
+
}
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const img = new Image();
|
|
36
|
+
img.onload = () => {
|
|
37
|
+
imageCache.set(src, img);
|
|
38
|
+
resolve(img);
|
|
39
|
+
};
|
|
40
|
+
img.onerror = reject;
|
|
41
|
+
img.src = src;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Clears the image cache
|
|
46
|
+
*/
|
|
47
|
+
function clearImageCache() {
|
|
48
|
+
imageCache.clear();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a new particle state object
|
|
52
|
+
*/
|
|
53
|
+
function createParticle(x, y, angle, velocity, colors, shapes, sizeRange, opacityRange, lifespan, rotationSpeed, options) {
|
|
54
|
+
const size = (0, utils_1.randomInRange)(sizeRange[0], sizeRange[1]);
|
|
55
|
+
const opacity = (0, utils_1.randomInRange)(opacityRange[0], opacityRange[1]);
|
|
56
|
+
const colorInput = (0, utils_1.randomFromArray)(colors);
|
|
57
|
+
const color = typeof colorInput === 'string' ? (0, utils_1.parseColor)(colorInput) :
|
|
58
|
+
('type' in colorInput) ? (0, utils_1.parseColor)(colorInput.colors[0]) : colorInput;
|
|
59
|
+
// Calculate initial velocity components
|
|
60
|
+
const vx = Math.cos(angle) * velocity;
|
|
61
|
+
const vy = -Math.sin(angle) * velocity; // Negative because canvas Y is inverted
|
|
62
|
+
// Handle image particles
|
|
63
|
+
let image;
|
|
64
|
+
if (options?.images && options.images.length > 0) {
|
|
65
|
+
image = (0, utils_1.randomFromArray)(options.images);
|
|
66
|
+
}
|
|
67
|
+
const tiltRange = options?.tiltRange ?? [-15, 15];
|
|
68
|
+
const spinSpeedRange = options?.spinSpeedRange ?? [-10, 10];
|
|
69
|
+
return {
|
|
70
|
+
id: particleIdCounter++,
|
|
71
|
+
x,
|
|
72
|
+
y,
|
|
73
|
+
vx,
|
|
74
|
+
vy,
|
|
75
|
+
size,
|
|
76
|
+
originalSize: size,
|
|
77
|
+
rotation: (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI,
|
|
78
|
+
rotationSpeed: ((0, utils_1.secureRandom)() - 0.5) * 0.2 * rotationSpeed,
|
|
79
|
+
color,
|
|
80
|
+
shape: image ? 'custom' : (0, utils_1.randomFromArray)(shapes),
|
|
81
|
+
opacity,
|
|
82
|
+
originalOpacity: opacity,
|
|
83
|
+
life: lifespan,
|
|
84
|
+
maxLife: lifespan,
|
|
85
|
+
active: true,
|
|
86
|
+
image,
|
|
87
|
+
imageElement: null,
|
|
88
|
+
trail: [],
|
|
89
|
+
wobblePhase: (0, utils_1.secureRandom)() * constants_1.MATH_CONSTANTS.TWO_PI,
|
|
90
|
+
wobbleSpeed: (0, utils_1.randomInRange)(0.5, 2),
|
|
91
|
+
tilt: (0, utils_1.degToRad)((0, utils_1.randomInRange)(tiltRange[0], tiltRange[1])),
|
|
92
|
+
tiltSpeed: (0, utils_1.randomInRange)(spinSpeedRange[0], spinSpeedRange[1]) * 0.01,
|
|
93
|
+
depth: options?.depth3D ?? 0,
|
|
94
|
+
hasExploded: false,
|
|
95
|
+
data: {},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Updates a particle's physics state
|
|
100
|
+
*/
|
|
101
|
+
function updateParticle(particle, deltaTime, physics, fadeOut, scaleDown, trailConfig, canvasHeight) {
|
|
102
|
+
if (!particle.active)
|
|
103
|
+
return;
|
|
104
|
+
const dt = deltaTime / 16.67; // Normalize to 60fps
|
|
105
|
+
// Update trail (store previous position)
|
|
106
|
+
const trail = trailConfig ?? constants_1.DEFAULT_TRAIL;
|
|
107
|
+
if (trail.enabled) {
|
|
108
|
+
particle.trail.unshift({
|
|
109
|
+
x: particle.x,
|
|
110
|
+
y: particle.y,
|
|
111
|
+
opacity: particle.opacity,
|
|
112
|
+
size: particle.size,
|
|
113
|
+
});
|
|
114
|
+
const maxLength = trail.length ?? constants_1.DEFAULT_TRAIL.length;
|
|
115
|
+
if (particle.trail.length > maxLength) {
|
|
116
|
+
particle.trail.pop();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Apply gravity
|
|
120
|
+
particle.vy += physics.gravity * dt;
|
|
121
|
+
// Apply wind with variation
|
|
122
|
+
const windForce = physics.wind + (physics.windVariation * ((0, utils_1.secureRandom)() - 0.5));
|
|
123
|
+
particle.vx += windForce * dt;
|
|
124
|
+
// Apply drag
|
|
125
|
+
particle.vx *= 1 - physics.drag;
|
|
126
|
+
particle.vy *= 1 - physics.drag;
|
|
127
|
+
// Apply friction
|
|
128
|
+
particle.vx *= physics.friction;
|
|
129
|
+
particle.vy *= physics.friction;
|
|
130
|
+
// Apply velocity decay
|
|
131
|
+
particle.vx *= physics.decay;
|
|
132
|
+
particle.vy *= physics.decay;
|
|
133
|
+
// Update position
|
|
134
|
+
particle.x += particle.vx * dt;
|
|
135
|
+
particle.y += particle.vy * dt;
|
|
136
|
+
// Update rotation
|
|
137
|
+
if (physics.tumble) {
|
|
138
|
+
particle.rotation += particle.rotationSpeed * dt;
|
|
139
|
+
}
|
|
140
|
+
// Update tilt
|
|
141
|
+
particle.tilt += particle.tiltSpeed * dt;
|
|
142
|
+
// Update wobble phase for 3D effect
|
|
143
|
+
if (physics.wobble) {
|
|
144
|
+
particle.wobblePhase += physics.wobbleSpeed * 0.1 * dt;
|
|
145
|
+
}
|
|
146
|
+
// Handle floor bounce
|
|
147
|
+
if (physics.floor !== null && physics.bounce > 0 && canvasHeight) {
|
|
148
|
+
const floorY = physics.floor ?? canvasHeight;
|
|
149
|
+
if (particle.y + particle.size / 2 >= floorY) {
|
|
150
|
+
particle.y = floorY - particle.size / 2;
|
|
151
|
+
particle.vy = -particle.vy * physics.bounce;
|
|
152
|
+
// Reduce horizontal velocity on bounce
|
|
153
|
+
particle.vx *= 0.9;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Update life
|
|
157
|
+
particle.life -= deltaTime;
|
|
158
|
+
// Calculate life progress (0 = start, 1 = end)
|
|
159
|
+
const lifeProgress = 1 - (particle.life / particle.maxLife);
|
|
160
|
+
// Apply fade out
|
|
161
|
+
if (fadeOut) {
|
|
162
|
+
particle.opacity = particle.originalOpacity * (1 - lifeProgress);
|
|
163
|
+
}
|
|
164
|
+
// Apply scale down
|
|
165
|
+
if (scaleDown) {
|
|
166
|
+
particle.size = particle.originalSize * (1 - lifeProgress * 0.5);
|
|
167
|
+
}
|
|
168
|
+
// Check if particle is dead
|
|
169
|
+
if (particle.life <= 0 ||
|
|
170
|
+
particle.opacity < constants_1.PERFORMANCE.MIN_OPACITY ||
|
|
171
|
+
particle.size < constants_1.PERFORMANCE.MIN_SIZE) {
|
|
172
|
+
particle.active = false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Renders a particle to a canvas context
|
|
177
|
+
*/
|
|
178
|
+
function renderParticle(ctx, particle, options) {
|
|
179
|
+
if (!particle.active)
|
|
180
|
+
return;
|
|
181
|
+
const { x, y, size, rotation, color, shape, opacity, tilt } = particle;
|
|
182
|
+
const trail = options?.trailConfig ?? constants_1.DEFAULT_TRAIL;
|
|
183
|
+
const glow = options?.glowConfig ?? constants_1.DEFAULT_GLOW;
|
|
184
|
+
// Render trail first (behind particle)
|
|
185
|
+
if (trail.enabled && particle.trail.length > 0) {
|
|
186
|
+
renderTrail(ctx, particle, trail);
|
|
187
|
+
}
|
|
188
|
+
ctx.save();
|
|
189
|
+
// Apply glow effect
|
|
190
|
+
if (glow.enabled) {
|
|
191
|
+
ctx.shadowBlur = glow.blur ?? constants_1.DEFAULT_GLOW.blur;
|
|
192
|
+
ctx.shadowColor = glow.color ?? (0, utils_1.rgbaToString)(color);
|
|
193
|
+
}
|
|
194
|
+
ctx.translate(x, y);
|
|
195
|
+
ctx.rotate(rotation + tilt);
|
|
196
|
+
// Apply 3D wobble effect
|
|
197
|
+
if (particle.depth > 0) {
|
|
198
|
+
const wobbleScale = 1 - particle.depth * 0.3 * Math.sin(particle.wobblePhase);
|
|
199
|
+
ctx.scale(wobbleScale, 1);
|
|
200
|
+
}
|
|
201
|
+
ctx.globalAlpha = (0, utils_1.clamp)(opacity * color.a * (glow.enabled ? glow.intensity ?? 1 : 1), 0, 1);
|
|
202
|
+
ctx.fillStyle = (0, utils_1.rgbaToString)({ ...color, a: 1 });
|
|
203
|
+
// Handle image/emoji particles
|
|
204
|
+
if (particle.image && particle.image.isEmoji) {
|
|
205
|
+
renderEmoji(ctx, particle.image.src, size * (particle.image.scale ?? 1));
|
|
206
|
+
}
|
|
207
|
+
else if (particle.imageElement) {
|
|
208
|
+
renderImage(ctx, particle.imageElement, size * (particle.image?.scale ?? 1));
|
|
209
|
+
}
|
|
210
|
+
else if (shape === 'custom' && options?.customDraw) {
|
|
211
|
+
const drawContext = {
|
|
212
|
+
ctx,
|
|
213
|
+
particle,
|
|
214
|
+
progress: 1 - particle.life / particle.maxLife,
|
|
215
|
+
elapsed: options.elapsed ?? 0,
|
|
216
|
+
};
|
|
217
|
+
options.customDraw(drawContext);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
// Render based on shape
|
|
221
|
+
switch (shape) {
|
|
222
|
+
case 'square':
|
|
223
|
+
renderSquare(ctx, size);
|
|
224
|
+
break;
|
|
225
|
+
case 'circle':
|
|
226
|
+
renderCircle(ctx, size);
|
|
227
|
+
break;
|
|
228
|
+
case 'rectangle':
|
|
229
|
+
renderRectangle(ctx, size);
|
|
230
|
+
break;
|
|
231
|
+
case 'triangle':
|
|
232
|
+
renderTriangle(ctx, size);
|
|
233
|
+
break;
|
|
234
|
+
case 'star':
|
|
235
|
+
renderStar(ctx, size);
|
|
236
|
+
break;
|
|
237
|
+
case 'line':
|
|
238
|
+
renderLine(ctx, size);
|
|
239
|
+
break;
|
|
240
|
+
case 'heart':
|
|
241
|
+
renderHeart(ctx, size);
|
|
242
|
+
break;
|
|
243
|
+
case 'diamond':
|
|
244
|
+
renderDiamond(ctx, size);
|
|
245
|
+
break;
|
|
246
|
+
case 'hexagon':
|
|
247
|
+
renderHexagon(ctx, size);
|
|
248
|
+
break;
|
|
249
|
+
case 'spiral':
|
|
250
|
+
renderSpiral(ctx, size, color);
|
|
251
|
+
break;
|
|
252
|
+
case 'ribbon':
|
|
253
|
+
renderRibbon(ctx, size);
|
|
254
|
+
break;
|
|
255
|
+
default:
|
|
256
|
+
renderSquare(ctx, size);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
ctx.restore();
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Renders the trail behind a particle
|
|
263
|
+
*/
|
|
264
|
+
function renderTrail(ctx, particle, trail) {
|
|
265
|
+
const fadeFactor = trail.fade ?? constants_1.DEFAULT_TRAIL.fade;
|
|
266
|
+
const widthFactor = trail.width ?? constants_1.DEFAULT_TRAIL.width;
|
|
267
|
+
ctx.save();
|
|
268
|
+
ctx.lineCap = 'round';
|
|
269
|
+
ctx.lineJoin = 'round';
|
|
270
|
+
for (let i = 0; i < particle.trail.length - 1; i++) {
|
|
271
|
+
const current = particle.trail[i];
|
|
272
|
+
const next = particle.trail[i + 1];
|
|
273
|
+
const alpha = current.opacity * Math.pow(fadeFactor, i);
|
|
274
|
+
const lineWidth = current.size * widthFactor * Math.pow(fadeFactor, i);
|
|
275
|
+
if (alpha > 0.01 && lineWidth > 0.1) {
|
|
276
|
+
ctx.beginPath();
|
|
277
|
+
ctx.strokeStyle = (0, utils_1.rgbaToString)({ ...particle.color, a: alpha });
|
|
278
|
+
ctx.lineWidth = lineWidth;
|
|
279
|
+
ctx.moveTo(current.x, current.y);
|
|
280
|
+
ctx.lineTo(next.x, next.y);
|
|
281
|
+
ctx.stroke();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
ctx.restore();
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Renders a square particle
|
|
288
|
+
*/
|
|
289
|
+
function renderSquare(ctx, size) {
|
|
290
|
+
const halfSize = size / 2;
|
|
291
|
+
ctx.fillRect(-halfSize, -halfSize, size, size);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Renders a circle particle
|
|
295
|
+
*/
|
|
296
|
+
function renderCircle(ctx, size) {
|
|
297
|
+
ctx.beginPath();
|
|
298
|
+
ctx.arc(0, 0, size / 2, 0, constants_1.MATH_CONSTANTS.TWO_PI);
|
|
299
|
+
ctx.fill();
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Renders a rectangle particle (2:1 aspect ratio)
|
|
303
|
+
*/
|
|
304
|
+
function renderRectangle(ctx, size) {
|
|
305
|
+
const width = size;
|
|
306
|
+
const height = size / 2;
|
|
307
|
+
ctx.fillRect(-width / 2, -height / 2, width, height);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Renders a triangle particle
|
|
311
|
+
*/
|
|
312
|
+
function renderTriangle(ctx, size) {
|
|
313
|
+
const halfSize = size / 2;
|
|
314
|
+
ctx.beginPath();
|
|
315
|
+
ctx.moveTo(0, -halfSize);
|
|
316
|
+
ctx.lineTo(halfSize, halfSize);
|
|
317
|
+
ctx.lineTo(-halfSize, halfSize);
|
|
318
|
+
ctx.closePath();
|
|
319
|
+
ctx.fill();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Renders a star particle
|
|
323
|
+
*/
|
|
324
|
+
function renderStar(ctx, size) {
|
|
325
|
+
const outerRadius = size / 2;
|
|
326
|
+
const innerRadius = outerRadius * constants_1.STAR_INNER_RATIO;
|
|
327
|
+
const step = Math.PI / constants_1.STAR_POINTS;
|
|
328
|
+
ctx.beginPath();
|
|
329
|
+
for (let i = 0; i < constants_1.STAR_POINTS * 2; i++) {
|
|
330
|
+
const radius = i % 2 === 0 ? outerRadius : innerRadius;
|
|
331
|
+
const angle = i * step - constants_1.MATH_CONSTANTS.HALF_PI;
|
|
332
|
+
const x = Math.cos(angle) * radius;
|
|
333
|
+
const y = Math.sin(angle) * radius;
|
|
334
|
+
if (i === 0) {
|
|
335
|
+
ctx.moveTo(x, y);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
ctx.lineTo(x, y);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
ctx.closePath();
|
|
342
|
+
ctx.fill();
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Renders a line/streamer particle
|
|
346
|
+
*/
|
|
347
|
+
function renderLine(ctx, size) {
|
|
348
|
+
const length = size * 2;
|
|
349
|
+
const width = size / 4;
|
|
350
|
+
ctx.fillRect(-length / 2, -width / 2, length, width);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Renders a heart shape
|
|
354
|
+
*/
|
|
355
|
+
function renderHeart(ctx, size) {
|
|
356
|
+
const scale = size / 30;
|
|
357
|
+
ctx.save();
|
|
358
|
+
ctx.scale(scale, scale);
|
|
359
|
+
ctx.beginPath();
|
|
360
|
+
ctx.moveTo(0, -8);
|
|
361
|
+
ctx.bezierCurveTo(-10, -18, -25, -8, -15, 5);
|
|
362
|
+
ctx.lineTo(0, 18);
|
|
363
|
+
ctx.lineTo(15, 5);
|
|
364
|
+
ctx.bezierCurveTo(25, -8, 10, -18, 0, -8);
|
|
365
|
+
ctx.closePath();
|
|
366
|
+
ctx.fill();
|
|
367
|
+
ctx.restore();
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Renders a diamond shape
|
|
371
|
+
*/
|
|
372
|
+
function renderDiamond(ctx, size) {
|
|
373
|
+
const halfSize = size / 2;
|
|
374
|
+
ctx.beginPath();
|
|
375
|
+
ctx.moveTo(0, -halfSize);
|
|
376
|
+
ctx.lineTo(halfSize * 0.6, 0);
|
|
377
|
+
ctx.lineTo(0, halfSize);
|
|
378
|
+
ctx.lineTo(-halfSize * 0.6, 0);
|
|
379
|
+
ctx.closePath();
|
|
380
|
+
ctx.fill();
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Renders a hexagon shape
|
|
384
|
+
*/
|
|
385
|
+
function renderHexagon(ctx, size) {
|
|
386
|
+
const radius = size / 2;
|
|
387
|
+
ctx.beginPath();
|
|
388
|
+
for (let i = 0; i < 6; i++) {
|
|
389
|
+
const angle = (Math.PI / 3) * i - Math.PI / 6;
|
|
390
|
+
const x = Math.cos(angle) * radius;
|
|
391
|
+
const y = Math.sin(angle) * radius;
|
|
392
|
+
if (i === 0) {
|
|
393
|
+
ctx.moveTo(x, y);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
ctx.lineTo(x, y);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
ctx.closePath();
|
|
400
|
+
ctx.fill();
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Renders a spiral shape
|
|
404
|
+
*/
|
|
405
|
+
function renderSpiral(ctx, size, color) {
|
|
406
|
+
ctx.strokeStyle = (0, utils_1.rgbaToString)(color);
|
|
407
|
+
ctx.lineWidth = size / 8;
|
|
408
|
+
ctx.lineCap = 'round';
|
|
409
|
+
ctx.beginPath();
|
|
410
|
+
for (let i = 0; i < 22; i++) {
|
|
411
|
+
const angle = 0.35 * i;
|
|
412
|
+
const radius = (0.2 + 1.5 * angle) * (size / 20);
|
|
413
|
+
const x = radius * Math.cos(angle);
|
|
414
|
+
const y = radius * Math.sin(angle);
|
|
415
|
+
if (i === 0) {
|
|
416
|
+
ctx.moveTo(x, y);
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
ctx.lineTo(x, y);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
ctx.stroke();
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Renders a ribbon/streamer shape
|
|
426
|
+
*/
|
|
427
|
+
function renderRibbon(ctx, size) {
|
|
428
|
+
const width = size;
|
|
429
|
+
const height = size / 3;
|
|
430
|
+
const wave = size / 4;
|
|
431
|
+
ctx.beginPath();
|
|
432
|
+
ctx.moveTo(-width / 2, 0);
|
|
433
|
+
ctx.quadraticCurveTo(-width / 4, -wave, 0, 0);
|
|
434
|
+
ctx.quadraticCurveTo(width / 4, wave, width / 2, 0);
|
|
435
|
+
ctx.lineTo(width / 2, height);
|
|
436
|
+
ctx.quadraticCurveTo(width / 4, height + wave, 0, height);
|
|
437
|
+
ctx.quadraticCurveTo(-width / 4, height - wave, -width / 2, height);
|
|
438
|
+
ctx.closePath();
|
|
439
|
+
ctx.fill();
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Renders an emoji
|
|
443
|
+
*/
|
|
444
|
+
function renderEmoji(ctx, emoji, size) {
|
|
445
|
+
ctx.font = `${size}px serif`;
|
|
446
|
+
ctx.textAlign = 'center';
|
|
447
|
+
ctx.textBaseline = 'middle';
|
|
448
|
+
ctx.fillText(emoji, 0, 0);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Renders an image
|
|
452
|
+
*/
|
|
453
|
+
function renderImage(ctx, img, size) {
|
|
454
|
+
const halfSize = size / 2;
|
|
455
|
+
ctx.drawImage(img, -halfSize, -halfSize, size, size);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Checks if all particles in an array are inactive
|
|
459
|
+
*/
|
|
460
|
+
function areAllParticlesInactive(particles) {
|
|
461
|
+
return particles.every(p => !p.active);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Counts active particles
|
|
465
|
+
*/
|
|
466
|
+
function countActiveParticles(particles) {
|
|
467
|
+
return particles.filter(p => p.active).length;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Resets the particle ID counter (useful for testing)
|
|
471
|
+
*/
|
|
472
|
+
function resetParticleIdCounter() {
|
|
473
|
+
particleIdCounter = 0;
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=particle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particle.js","sourceRoot":"","sources":["../../src/particle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shape helper functions
|
|
3
|
+
*
|
|
4
|
+
* Provides canvas-confetti compatible shape creation utilities
|
|
5
|
+
* for custom SVG paths, text, and emoji shapes.
|
|
6
|
+
*
|
|
7
|
+
* @module shapes
|
|
8
|
+
*/
|
|
9
|
+
import type { PathShape, TextShape, CustomShape } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Options for creating a shape from an SVG path
|
|
12
|
+
*/
|
|
13
|
+
export interface ShapeFromPathOptions {
|
|
14
|
+
/** SVG path string (d attribute) */
|
|
15
|
+
readonly path: string;
|
|
16
|
+
/** Optional 2D transformation matrix [a, b, c, d, e, f] */
|
|
17
|
+
readonly matrix?: readonly number[];
|
|
18
|
+
/** Fill color (optional, will use particle color if not set) */
|
|
19
|
+
readonly fillColor?: string;
|
|
20
|
+
/** Stroke color (optional) */
|
|
21
|
+
readonly strokeColor?: string;
|
|
22
|
+
/** Stroke width (optional) */
|
|
23
|
+
readonly strokeWidth?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Options for creating a shape from text/emoji
|
|
27
|
+
*/
|
|
28
|
+
export interface ShapeFromTextOptions {
|
|
29
|
+
/** Text or emoji to render */
|
|
30
|
+
readonly text: string;
|
|
31
|
+
/** Scale factor for the text size. Default: 1 */
|
|
32
|
+
readonly scalar?: number;
|
|
33
|
+
/** Text color (optional, will use particle color if not set) */
|
|
34
|
+
readonly color?: string;
|
|
35
|
+
/** Font family. Default: 'serif' */
|
|
36
|
+
readonly fontFamily?: string;
|
|
37
|
+
/** Font weight. Default: 'normal' */
|
|
38
|
+
readonly fontWeight?: string | number;
|
|
39
|
+
/** Font style. Default: 'normal' */
|
|
40
|
+
readonly fontStyle?: 'normal' | 'italic' | 'oblique';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a custom shape from an SVG path string.
|
|
44
|
+
*
|
|
45
|
+
* This is compatible with canvas-confetti's shapeFromPath function.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* // Simple star shape
|
|
50
|
+
* const star = shapeFromPath({
|
|
51
|
+
* path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z'
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* // With transformation matrix
|
|
55
|
+
* const scaledStar = shapeFromPath({
|
|
56
|
+
* path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z',
|
|
57
|
+
* matrix: [2, 0, 0, 2, 0, 0] // Scale 2x
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // Usage with confetti
|
|
61
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
62
|
+
* particle: { shapes: [star, 'circle'] }
|
|
63
|
+
* });
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* @param options - Shape configuration options
|
|
67
|
+
* @returns PathShape object for use in confetti configuration
|
|
68
|
+
*/
|
|
69
|
+
export declare function shapeFromPath(options: ShapeFromPathOptions): PathShape;
|
|
70
|
+
/**
|
|
71
|
+
* Create a custom shape from text or an emoji.
|
|
72
|
+
*
|
|
73
|
+
* This is compatible with canvas-confetti's shapeFromText function.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* // Emoji confetti
|
|
78
|
+
* const heart = shapeFromText({ text: '❤️' });
|
|
79
|
+
* const party = shapeFromText({ text: '🎉', scalar: 2 });
|
|
80
|
+
*
|
|
81
|
+
* // Custom text
|
|
82
|
+
* const yay = shapeFromText({
|
|
83
|
+
* text: 'YAY',
|
|
84
|
+
* fontFamily: 'Impact',
|
|
85
|
+
* color: '#ff0000'
|
|
86
|
+
* });
|
|
87
|
+
*
|
|
88
|
+
* // Usage with confetti
|
|
89
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
90
|
+
* particle: { shapes: [heart, party, yay] }
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @param options - Text shape configuration options
|
|
95
|
+
* @returns TextShape object for use in confetti configuration
|
|
96
|
+
*/
|
|
97
|
+
export declare function shapeFromText(options: ShapeFromTextOptions): TextShape;
|
|
98
|
+
/**
|
|
99
|
+
* Create a bitmap shape from an image URL or HTMLImageElement.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const logo = await shapeFromImage({
|
|
104
|
+
* src: '/logo.png',
|
|
105
|
+
* width: 32,
|
|
106
|
+
* height: 32
|
|
107
|
+
* });
|
|
108
|
+
*
|
|
109
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
110
|
+
* particle: { shapes: [logo] }
|
|
111
|
+
* });
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* @param options - Image shape configuration options
|
|
115
|
+
* @returns Promise resolving to a custom shape
|
|
116
|
+
*/
|
|
117
|
+
export declare function shapeFromImage(options: {
|
|
118
|
+
readonly src: string | HTMLImageElement;
|
|
119
|
+
readonly width?: number;
|
|
120
|
+
readonly height?: number;
|
|
121
|
+
readonly scalar?: number;
|
|
122
|
+
}): Promise<CustomShape>;
|
|
123
|
+
/**
|
|
124
|
+
* Create multiple shapes from an array of emoji.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* const partyEmoji = shapesFromEmoji(['🎉', '🎊', '✨', '🥳']);
|
|
129
|
+
*
|
|
130
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
131
|
+
* particle: { shapes: partyEmoji }
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @param emojis - Array of emoji strings
|
|
136
|
+
* @param options - Optional common options for all emoji
|
|
137
|
+
* @returns Array of TextShape objects
|
|
138
|
+
*/
|
|
139
|
+
export declare function shapesFromEmoji(emojis: readonly string[], options?: Omit<ShapeFromTextOptions, 'text'>): TextShape[];
|
|
140
|
+
/**
|
|
141
|
+
* Common predefined path shapes
|
|
142
|
+
*/
|
|
143
|
+
export declare const pathShapes: {
|
|
144
|
+
/** Five-pointed star */
|
|
145
|
+
star: PathShape;
|
|
146
|
+
/** Heart shape */
|
|
147
|
+
heart: PathShape;
|
|
148
|
+
/** Diamond shape */
|
|
149
|
+
diamond: PathShape;
|
|
150
|
+
/** Hexagon shape */
|
|
151
|
+
hexagon: PathShape;
|
|
152
|
+
/** Triangle shape */
|
|
153
|
+
triangle: PathShape;
|
|
154
|
+
/** Plus/cross shape */
|
|
155
|
+
plus: PathShape;
|
|
156
|
+
/** Moon/crescent shape */
|
|
157
|
+
moon: PathShape;
|
|
158
|
+
/** Lightning bolt */
|
|
159
|
+
lightning: PathShape;
|
|
160
|
+
/** Spiral shape */
|
|
161
|
+
spiral: PathShape;
|
|
162
|
+
/** Ribbon/wave shape */
|
|
163
|
+
ribbon: PathShape;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Common emoji sets for quick use
|
|
167
|
+
*/
|
|
168
|
+
export declare const emojiShapes: {
|
|
169
|
+
/** Party/celebration emoji */
|
|
170
|
+
party: TextShape[];
|
|
171
|
+
/** Heart emoji */
|
|
172
|
+
hearts: TextShape[];
|
|
173
|
+
/** Star emoji */
|
|
174
|
+
stars: TextShape[];
|
|
175
|
+
/** Nature emoji */
|
|
176
|
+
nature: TextShape[];
|
|
177
|
+
/** Food emoji */
|
|
178
|
+
food: TextShape[];
|
|
179
|
+
/** Sports emoji */
|
|
180
|
+
sports: TextShape[];
|
|
181
|
+
/** Weather emoji */
|
|
182
|
+
weather: TextShape[];
|
|
183
|
+
/** Money emoji */
|
|
184
|
+
money: TextShape[];
|
|
185
|
+
/** Animals emoji */
|
|
186
|
+
animals: TextShape[];
|
|
187
|
+
/** Holiday emoji */
|
|
188
|
+
holiday: TextShape[];
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../src/shapes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gEAAgE;IAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAetE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAmBtE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,WAAW,CAAC,CAwBvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAM,GAC/C,SAAS,EAAE,CAEb;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;IACrB,wBAAwB;;IAKxB,kBAAkB;;IAKlB,oBAAoB;;IAKpB,oBAAoB;;IAKpB,qBAAqB;;IAKrB,uBAAuB;;IAKvB,0BAA0B;;IAK1B,qBAAqB;;IAKrB,mBAAmB;;IAKnB,wBAAwB;;CAIzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB,8BAA8B;;IAG9B,kBAAkB;;IAGlB,iBAAiB;;IAGjB,mBAAmB;;IAGnB,iBAAiB;;IAGjB,mBAAmB;;IAGnB,oBAAoB;;IAGpB,kBAAkB;;IAGlB,oBAAoB;;IAGpB,oBAAoB;;CAErB,CAAC"}
|