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,265 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* Create a custom shape from an SVG path string.
|
|
11
|
+
*
|
|
12
|
+
* This is compatible with canvas-confetti's shapeFromPath function.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // Simple star shape
|
|
17
|
+
* const star = shapeFromPath({
|
|
18
|
+
* path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z'
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // With transformation matrix
|
|
22
|
+
* const scaledStar = shapeFromPath({
|
|
23
|
+
* path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z',
|
|
24
|
+
* matrix: [2, 0, 0, 2, 0, 0] // Scale 2x
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Usage with confetti
|
|
28
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
29
|
+
* particle: { shapes: [star, 'circle'] }
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @param options - Shape configuration options
|
|
34
|
+
* @returns PathShape object for use in confetti configuration
|
|
35
|
+
*/
|
|
36
|
+
export function shapeFromPath(options) {
|
|
37
|
+
const { path, matrix, fillColor, strokeColor, strokeWidth } = options;
|
|
38
|
+
// Parse the path to extract bounds for proper scaling
|
|
39
|
+
const bounds = getPathBounds(path);
|
|
40
|
+
return {
|
|
41
|
+
type: 'path',
|
|
42
|
+
path,
|
|
43
|
+
matrix: matrix ? [...matrix] : undefined,
|
|
44
|
+
fillColor,
|
|
45
|
+
strokeColor,
|
|
46
|
+
strokeWidth,
|
|
47
|
+
bounds,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a custom shape from text or an emoji.
|
|
52
|
+
*
|
|
53
|
+
* This is compatible with canvas-confetti's shapeFromText function.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // Emoji confetti
|
|
58
|
+
* const heart = shapeFromText({ text: '❤️' });
|
|
59
|
+
* const party = shapeFromText({ text: '🎉', scalar: 2 });
|
|
60
|
+
*
|
|
61
|
+
* // Custom text
|
|
62
|
+
* const yay = shapeFromText({
|
|
63
|
+
* text: 'YAY',
|
|
64
|
+
* fontFamily: 'Impact',
|
|
65
|
+
* color: '#ff0000'
|
|
66
|
+
* });
|
|
67
|
+
*
|
|
68
|
+
* // Usage with confetti
|
|
69
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
70
|
+
* particle: { shapes: [heart, party, yay] }
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*
|
|
74
|
+
* @param options - Text shape configuration options
|
|
75
|
+
* @returns TextShape object for use in confetti configuration
|
|
76
|
+
*/
|
|
77
|
+
export function shapeFromText(options) {
|
|
78
|
+
const { text, scalar = 1, color, fontFamily = 'serif', fontWeight = 'normal', fontStyle = 'normal', } = options;
|
|
79
|
+
return {
|
|
80
|
+
type: 'text',
|
|
81
|
+
text,
|
|
82
|
+
scalar,
|
|
83
|
+
color,
|
|
84
|
+
fontFamily,
|
|
85
|
+
fontWeight: String(fontWeight),
|
|
86
|
+
fontStyle,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a bitmap shape from an image URL or HTMLImageElement.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const logo = await shapeFromImage({
|
|
95
|
+
* src: '/logo.png',
|
|
96
|
+
* width: 32,
|
|
97
|
+
* height: 32
|
|
98
|
+
* });
|
|
99
|
+
*
|
|
100
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
101
|
+
* particle: { shapes: [logo] }
|
|
102
|
+
* });
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @param options - Image shape configuration options
|
|
106
|
+
* @returns Promise resolving to a custom shape
|
|
107
|
+
*/
|
|
108
|
+
export async function shapeFromImage(options) {
|
|
109
|
+
const { src, scalar = 1 } = options;
|
|
110
|
+
// If it's already an image element, use it directly
|
|
111
|
+
if (typeof src !== 'string') {
|
|
112
|
+
return {
|
|
113
|
+
type: 'text', // Reuse text type for simplicity in renderer
|
|
114
|
+
text: '',
|
|
115
|
+
scalar,
|
|
116
|
+
// Store image reference in a custom way
|
|
117
|
+
fontFamily: `url(${src.src})`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Load the image to validate it exists
|
|
121
|
+
await loadImage(src);
|
|
122
|
+
return {
|
|
123
|
+
type: 'text',
|
|
124
|
+
text: '',
|
|
125
|
+
scalar,
|
|
126
|
+
fontFamily: `url(${src})`,
|
|
127
|
+
color: undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create multiple shapes from an array of emoji.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* const partyEmoji = shapesFromEmoji(['🎉', '🎊', '✨', '🥳']);
|
|
136
|
+
*
|
|
137
|
+
* fire({ x: 0.5, y: 0.5 }, {
|
|
138
|
+
* particle: { shapes: partyEmoji }
|
|
139
|
+
* });
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* @param emojis - Array of emoji strings
|
|
143
|
+
* @param options - Optional common options for all emoji
|
|
144
|
+
* @returns Array of TextShape objects
|
|
145
|
+
*/
|
|
146
|
+
export function shapesFromEmoji(emojis, options = {}) {
|
|
147
|
+
return emojis.map(emoji => shapeFromText({ ...options, text: emoji }));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Common predefined path shapes
|
|
151
|
+
*/
|
|
152
|
+
export const pathShapes = {
|
|
153
|
+
/** Five-pointed star */
|
|
154
|
+
star: shapeFromPath({
|
|
155
|
+
path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z',
|
|
156
|
+
}),
|
|
157
|
+
/** Heart shape */
|
|
158
|
+
heart: shapeFromPath({
|
|
159
|
+
path: 'M0,0.8 C-0.5,0.4 -1,-0.2 -1,-0.6 C-1,-1 -0.5,-1.2 0,-0.8 C0.5,-1.2 1,-1 1,-0.6 C1,-0.2 0.5,0.4 0,0.8 Z',
|
|
160
|
+
}),
|
|
161
|
+
/** Diamond shape */
|
|
162
|
+
diamond: shapeFromPath({
|
|
163
|
+
path: 'M0,-1 L0.7,0 L0,1 L-0.7,0 Z',
|
|
164
|
+
}),
|
|
165
|
+
/** Hexagon shape */
|
|
166
|
+
hexagon: shapeFromPath({
|
|
167
|
+
path: 'M0.866,-0.5 L0.866,0.5 L0,1 L-0.866,0.5 L-0.866,-0.5 L0,-1 Z',
|
|
168
|
+
}),
|
|
169
|
+
/** Triangle shape */
|
|
170
|
+
triangle: shapeFromPath({
|
|
171
|
+
path: 'M0,-1 L0.866,0.5 L-0.866,0.5 Z',
|
|
172
|
+
}),
|
|
173
|
+
/** Plus/cross shape */
|
|
174
|
+
plus: shapeFromPath({
|
|
175
|
+
path: 'M-0.25,-1 L0.25,-1 L0.25,-0.25 L1,-0.25 L1,0.25 L0.25,0.25 L0.25,1 L-0.25,1 L-0.25,0.25 L-1,0.25 L-1,-0.25 L-0.25,-0.25 Z',
|
|
176
|
+
}),
|
|
177
|
+
/** Moon/crescent shape */
|
|
178
|
+
moon: shapeFromPath({
|
|
179
|
+
path: 'M0,-1 A1,1 0 1,1 0,1 A0.6,0.6 0 1,0 0,-1 Z',
|
|
180
|
+
}),
|
|
181
|
+
/** Lightning bolt */
|
|
182
|
+
lightning: shapeFromPath({
|
|
183
|
+
path: 'M0.4,-1 L-0.2,0 L0.2,0 L-0.4,1 L0,0.2 L-0.3,0.2 L0.4,-1 Z',
|
|
184
|
+
}),
|
|
185
|
+
/** Spiral shape */
|
|
186
|
+
spiral: shapeFromPath({
|
|
187
|
+
path: 'M0,0 Q0.3,-0.3 0,-0.5 Q-0.5,-0.5 -0.5,0 Q-0.5,0.7 0,0.7 Q0.7,0.7 0.7,0 Q0.7,-0.9 0,-0.9',
|
|
188
|
+
}),
|
|
189
|
+
/** Ribbon/wave shape */
|
|
190
|
+
ribbon: shapeFromPath({
|
|
191
|
+
path: 'M-1,0 Q-0.5,-0.5 0,0 Q0.5,0.5 1,0 Q0.5,-0.3 0,0 Q-0.5,0.3 -1,0 Z',
|
|
192
|
+
}),
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Common emoji sets for quick use
|
|
196
|
+
*/
|
|
197
|
+
export const emojiShapes = {
|
|
198
|
+
/** Party/celebration emoji */
|
|
199
|
+
party: shapesFromEmoji(['🎉', '🎊', '🥳', '✨', '🎈']),
|
|
200
|
+
/** Heart emoji */
|
|
201
|
+
hearts: shapesFromEmoji(['❤️', '💕', '💖', '💗', '💝']),
|
|
202
|
+
/** Star emoji */
|
|
203
|
+
stars: shapesFromEmoji(['⭐', '🌟', '✨', '💫', '🌠']),
|
|
204
|
+
/** Nature emoji */
|
|
205
|
+
nature: shapesFromEmoji(['🌸', '🌺', '🌻', '🌼', '🌷']),
|
|
206
|
+
/** Food emoji */
|
|
207
|
+
food: shapesFromEmoji(['🍕', '🍔', '🍟', '🍩', '🧁']),
|
|
208
|
+
/** Sports emoji */
|
|
209
|
+
sports: shapesFromEmoji(['⚽', '🏀', '🏈', '⚾', '🎾']),
|
|
210
|
+
/** Weather emoji */
|
|
211
|
+
weather: shapesFromEmoji(['☀️', '⛅', '🌈', '❄️', '💨']),
|
|
212
|
+
/** Money emoji */
|
|
213
|
+
money: shapesFromEmoji(['💰', '💵', '💎', '🪙', '💳']),
|
|
214
|
+
/** Animals emoji */
|
|
215
|
+
animals: shapesFromEmoji(['🦋', '🐝', '🐞', '🦄', '🐱']),
|
|
216
|
+
/** Holiday emoji */
|
|
217
|
+
holiday: shapesFromEmoji(['🎄', '🎃', '🎅', '🐰', '🦃']),
|
|
218
|
+
};
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// Internal helper functions
|
|
221
|
+
// ============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* Parse SVG path and extract bounds for proper scaling
|
|
224
|
+
*/
|
|
225
|
+
function getPathBounds(path) {
|
|
226
|
+
// Simple bounds extraction - this is a basic implementation
|
|
227
|
+
// A full implementation would parse all path commands
|
|
228
|
+
const numbers = path.match(/-?\d*\.?\d+/g);
|
|
229
|
+
if (!numbers || numbers.length < 2) {
|
|
230
|
+
return { minX: -1, minY: -1, maxX: 1, maxY: 1 };
|
|
231
|
+
}
|
|
232
|
+
let minX = Infinity;
|
|
233
|
+
let minY = Infinity;
|
|
234
|
+
let maxX = -Infinity;
|
|
235
|
+
let maxY = -Infinity;
|
|
236
|
+
// Assume alternating x,y pairs (simplified)
|
|
237
|
+
for (let i = 0; i < numbers.length - 1; i += 2) {
|
|
238
|
+
const x = parseFloat(numbers[i]);
|
|
239
|
+
const y = parseFloat(numbers[i + 1]);
|
|
240
|
+
if (!isNaN(x) && !isNaN(y)) {
|
|
241
|
+
minX = Math.min(minX, x);
|
|
242
|
+
minY = Math.min(minY, y);
|
|
243
|
+
maxX = Math.max(maxX, x);
|
|
244
|
+
maxY = Math.max(maxY, y);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Handle case where we couldn't parse valid bounds
|
|
248
|
+
if (!isFinite(minX)) {
|
|
249
|
+
return { minX: -1, minY: -1, maxX: 1, maxY: 1 };
|
|
250
|
+
}
|
|
251
|
+
return { minX, minY, maxX, maxY };
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Load an image and return a promise
|
|
255
|
+
*/
|
|
256
|
+
function loadImage(src) {
|
|
257
|
+
return new Promise((resolve, reject) => {
|
|
258
|
+
const img = new Image();
|
|
259
|
+
img.crossOrigin = 'anonymous';
|
|
260
|
+
img.onload = () => resolve(img);
|
|
261
|
+
img.onerror = () => reject(new Error(`Failed to load image: ${src}`));
|
|
262
|
+
img.src = src;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=shapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/shapes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for react-confetti-burst
|
|
3
|
+
*
|
|
4
|
+
* This module provides comprehensive TypeScript definitions for all
|
|
5
|
+
* configuration options, particle properties, and animation states.
|
|
6
|
+
*
|
|
7
|
+
* Features beyond react-confetti AND canvas-confetti:
|
|
8
|
+
* - Directional bursts with custom angles
|
|
9
|
+
* - Multiple effect modes (burst, continuous, firework, snow, cannon)
|
|
10
|
+
* - Custom draw functions with full context
|
|
11
|
+
* - Emoji and image particle support
|
|
12
|
+
* - Trails and glow effects
|
|
13
|
+
* - Preset configurations
|
|
14
|
+
* - Auto-resize support
|
|
15
|
+
* - Frame rate control
|
|
16
|
+
* - Spawn area configuration
|
|
17
|
+
* - SVG path shapes (shapeFromPath)
|
|
18
|
+
* - Text/emoji shapes (shapeFromText)
|
|
19
|
+
* - Web Worker rendering (useWorker)
|
|
20
|
+
* - Reduced motion accessibility
|
|
21
|
+
* - Custom canvas support
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for react-confetti-burst
|
|
3
|
+
*
|
|
4
|
+
* Pure utility functions with no side effects.
|
|
5
|
+
* All functions are optimized for performance in animation loops.
|
|
6
|
+
*/
|
|
7
|
+
import { DEFAULT_CONFIG, DEFAULT_PARTICLE, DEFAULT_PHYSICS, DEFAULT_DIRECTION, DIRECTION_ANGLES, MATH_CONSTANTS, TRANSPARENT_COLOR, } from './constants';
|
|
8
|
+
/**
|
|
9
|
+
* Generates a cryptographically secure random number between 0 and 1
|
|
10
|
+
* Falls back to Math.random() if crypto is not available
|
|
11
|
+
*/
|
|
12
|
+
export function secureRandom() {
|
|
13
|
+
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
|
14
|
+
const array = new Uint32Array(1);
|
|
15
|
+
crypto.getRandomValues(array);
|
|
16
|
+
return array[0] / (0xFFFFFFFF + 1);
|
|
17
|
+
}
|
|
18
|
+
return Math.random();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generates a random number within a range
|
|
22
|
+
*/
|
|
23
|
+
export function randomInRange(min, max) {
|
|
24
|
+
return min + secureRandom() * (max - min);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generates a random integer within a range (inclusive)
|
|
28
|
+
*/
|
|
29
|
+
export function randomInt(min, max) {
|
|
30
|
+
return Math.floor(randomInRange(min, max + 1));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Picks a random element from an array
|
|
34
|
+
*/
|
|
35
|
+
export function randomFromArray(array) {
|
|
36
|
+
if (array.length === 0) {
|
|
37
|
+
throw new Error('Cannot pick from empty array');
|
|
38
|
+
}
|
|
39
|
+
return array[Math.floor(secureRandom() * array.length)];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Clamps a value between min and max
|
|
43
|
+
*/
|
|
44
|
+
export function clamp(value, min, max) {
|
|
45
|
+
return Math.min(Math.max(value, min), max);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Linear interpolation between two values
|
|
49
|
+
*/
|
|
50
|
+
export function lerp(start, end, t) {
|
|
51
|
+
return start + (end - start) * clamp(t, 0, 1);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Converts degrees to radians
|
|
55
|
+
*/
|
|
56
|
+
export function degToRad(degrees) {
|
|
57
|
+
return degrees * MATH_CONSTANTS.DEG_TO_RAD;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Converts radians to degrees
|
|
61
|
+
*/
|
|
62
|
+
export function radToDeg(radians) {
|
|
63
|
+
return radians * MATH_CONSTANTS.RAD_TO_DEG;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parses a color string to RGBA object
|
|
67
|
+
* Supports: hex (#RGB, #RGBA, #RRGGBB, #RRGGBBAA), rgb(), rgba(), named colors
|
|
68
|
+
*/
|
|
69
|
+
export function parseColor(color) {
|
|
70
|
+
// Already in RGBA format
|
|
71
|
+
if (typeof color === 'object' && 'r' in color) {
|
|
72
|
+
return {
|
|
73
|
+
r: clamp(Math.round(color.r), 0, 255),
|
|
74
|
+
g: clamp(Math.round(color.g), 0, 255),
|
|
75
|
+
b: clamp(Math.round(color.b), 0, 255),
|
|
76
|
+
a: clamp(color.a, 0, 1),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// GradientColor - extract first color
|
|
80
|
+
if (typeof color === 'object' && 'type' in color) {
|
|
81
|
+
return parseColor(color.colors[0]);
|
|
82
|
+
}
|
|
83
|
+
const colorStr = color.trim().toLowerCase();
|
|
84
|
+
// Hex colors
|
|
85
|
+
if (colorStr.startsWith('#')) {
|
|
86
|
+
return parseHexColor(colorStr);
|
|
87
|
+
}
|
|
88
|
+
// RGB/RGBA colors
|
|
89
|
+
if (colorStr.startsWith('rgb')) {
|
|
90
|
+
return parseRgbColor(colorStr);
|
|
91
|
+
}
|
|
92
|
+
// Named colors - use canvas to parse
|
|
93
|
+
return parseNamedColor(colorStr);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parses hex color strings
|
|
97
|
+
*/
|
|
98
|
+
function parseHexColor(hex) {
|
|
99
|
+
const cleanHex = hex.slice(1);
|
|
100
|
+
let r, g, b, a = 1;
|
|
101
|
+
switch (cleanHex.length) {
|
|
102
|
+
case 3: // #RGB
|
|
103
|
+
r = parseInt(cleanHex[0] + cleanHex[0], 16);
|
|
104
|
+
g = parseInt(cleanHex[1] + cleanHex[1], 16);
|
|
105
|
+
b = parseInt(cleanHex[2] + cleanHex[2], 16);
|
|
106
|
+
break;
|
|
107
|
+
case 4: // #RGBA
|
|
108
|
+
r = parseInt(cleanHex[0] + cleanHex[0], 16);
|
|
109
|
+
g = parseInt(cleanHex[1] + cleanHex[1], 16);
|
|
110
|
+
b = parseInt(cleanHex[2] + cleanHex[2], 16);
|
|
111
|
+
a = parseInt(cleanHex[3] + cleanHex[3], 16) / 255;
|
|
112
|
+
break;
|
|
113
|
+
case 6: // #RRGGBB
|
|
114
|
+
r = parseInt(cleanHex.slice(0, 2), 16);
|
|
115
|
+
g = parseInt(cleanHex.slice(2, 4), 16);
|
|
116
|
+
b = parseInt(cleanHex.slice(4, 6), 16);
|
|
117
|
+
break;
|
|
118
|
+
case 8: // #RRGGBBAA
|
|
119
|
+
r = parseInt(cleanHex.slice(0, 2), 16);
|
|
120
|
+
g = parseInt(cleanHex.slice(2, 4), 16);
|
|
121
|
+
b = parseInt(cleanHex.slice(4, 6), 16);
|
|
122
|
+
a = parseInt(cleanHex.slice(6, 8), 16) / 255;
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
return TRANSPARENT_COLOR;
|
|
126
|
+
}
|
|
127
|
+
if (isNaN(r) || isNaN(g) || isNaN(b) || isNaN(a)) {
|
|
128
|
+
return TRANSPARENT_COLOR;
|
|
129
|
+
}
|
|
130
|
+
return { r, g, b, a };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parses rgb() and rgba() color strings
|
|
134
|
+
*/
|
|
135
|
+
function parseRgbColor(rgb) {
|
|
136
|
+
const match = rgb.match(/rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+))?\s*\)/);
|
|
137
|
+
if (!match) {
|
|
138
|
+
return TRANSPARENT_COLOR;
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
r: clamp(parseInt(match[1], 10), 0, 255),
|
|
142
|
+
g: clamp(parseInt(match[2], 10), 0, 255),
|
|
143
|
+
b: clamp(parseInt(match[3], 10), 0, 255),
|
|
144
|
+
a: match[4] !== undefined ? clamp(parseFloat(match[4]), 0, 1) : 1,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Parses named colors using a canvas context
|
|
149
|
+
*/
|
|
150
|
+
function parseNamedColor(name) {
|
|
151
|
+
// Common named colors fallback for SSR
|
|
152
|
+
const namedColors = {
|
|
153
|
+
red: { r: 255, g: 0, b: 0, a: 1 },
|
|
154
|
+
green: { r: 0, g: 128, b: 0, a: 1 },
|
|
155
|
+
blue: { r: 0, g: 0, b: 255, a: 1 },
|
|
156
|
+
white: { r: 255, g: 255, b: 255, a: 1 },
|
|
157
|
+
black: { r: 0, g: 0, b: 0, a: 1 },
|
|
158
|
+
yellow: { r: 255, g: 255, b: 0, a: 1 },
|
|
159
|
+
cyan: { r: 0, g: 255, b: 255, a: 1 },
|
|
160
|
+
magenta: { r: 255, g: 0, b: 255, a: 1 },
|
|
161
|
+
orange: { r: 255, g: 165, b: 0, a: 1 },
|
|
162
|
+
purple: { r: 128, g: 0, b: 128, a: 1 },
|
|
163
|
+
pink: { r: 255, g: 192, b: 203, a: 1 },
|
|
164
|
+
};
|
|
165
|
+
if (namedColors[name]) {
|
|
166
|
+
return namedColors[name];
|
|
167
|
+
}
|
|
168
|
+
// Use canvas for other named colors (browser only)
|
|
169
|
+
if (typeof document !== 'undefined') {
|
|
170
|
+
try {
|
|
171
|
+
const canvas = document.createElement('canvas');
|
|
172
|
+
canvas.width = 1;
|
|
173
|
+
canvas.height = 1;
|
|
174
|
+
const ctx = canvas.getContext('2d');
|
|
175
|
+
if (ctx) {
|
|
176
|
+
ctx.fillStyle = name;
|
|
177
|
+
ctx.fillRect(0, 0, 1, 1);
|
|
178
|
+
const data = ctx.getImageData(0, 0, 1, 1).data;
|
|
179
|
+
return { r: data[0], g: data[1], b: data[2], a: data[3] / 255 };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Canvas not available
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return TRANSPARENT_COLOR;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Converts RGBA color to CSS string
|
|
190
|
+
*/
|
|
191
|
+
export function rgbaToString(color) {
|
|
192
|
+
return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Gets the direction angle in radians for a burst direction
|
|
196
|
+
*/
|
|
197
|
+
export function getDirectionAngle(direction, customAngle) {
|
|
198
|
+
if (direction === 'custom' && customAngle !== undefined) {
|
|
199
|
+
return degToRad(customAngle);
|
|
200
|
+
}
|
|
201
|
+
if (direction === 'radial') {
|
|
202
|
+
// Random angle for radial burst
|
|
203
|
+
return secureRandom() * MATH_CONSTANTS.TWO_PI;
|
|
204
|
+
}
|
|
205
|
+
const angle = DIRECTION_ANGLES[direction];
|
|
206
|
+
return degToRad(angle ?? 90);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Calculates the center point of an element
|
|
210
|
+
*/
|
|
211
|
+
export function getElementCenter(element) {
|
|
212
|
+
const rect = element.getBoundingClientRect();
|
|
213
|
+
return {
|
|
214
|
+
x: rect.left + rect.width / 2,
|
|
215
|
+
y: rect.top + rect.height / 2,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Deep merges configuration objects
|
|
220
|
+
*/
|
|
221
|
+
export function mergeConfig(options) {
|
|
222
|
+
if (!options) {
|
|
223
|
+
return DEFAULT_CONFIG;
|
|
224
|
+
}
|
|
225
|
+
const particle = {
|
|
226
|
+
...DEFAULT_PARTICLE,
|
|
227
|
+
...options.particle,
|
|
228
|
+
};
|
|
229
|
+
const physics = {
|
|
230
|
+
...DEFAULT_PHYSICS,
|
|
231
|
+
...options.physics,
|
|
232
|
+
};
|
|
233
|
+
const direction = {
|
|
234
|
+
...DEFAULT_DIRECTION,
|
|
235
|
+
...options.direction,
|
|
236
|
+
};
|
|
237
|
+
return {
|
|
238
|
+
particleCount: options.particleCount ?? DEFAULT_CONFIG.particleCount,
|
|
239
|
+
particle,
|
|
240
|
+
physics,
|
|
241
|
+
direction,
|
|
242
|
+
mode: options.mode ?? DEFAULT_CONFIG.mode,
|
|
243
|
+
spawnArea: options.spawnArea ? { type: 'rect', x: 0, y: 0, ...options.spawnArea } : undefined,
|
|
244
|
+
continuous: options.continuous,
|
|
245
|
+
firework: options.firework,
|
|
246
|
+
canvas: options.canvas,
|
|
247
|
+
easing: options.easing ?? DEFAULT_CONFIG.easing,
|
|
248
|
+
zIndex: options.zIndex ?? DEFAULT_CONFIG.zIndex,
|
|
249
|
+
autoCleanup: options.autoCleanup ?? DEFAULT_CONFIG.autoCleanup,
|
|
250
|
+
scalar: options.scalar ?? DEFAULT_CONFIG.scalar,
|
|
251
|
+
drift: options.drift ?? DEFAULT_CONFIG.drift,
|
|
252
|
+
flat: options.flat ?? DEFAULT_CONFIG.flat,
|
|
253
|
+
onStart: options.onStart,
|
|
254
|
+
onComplete: options.onComplete,
|
|
255
|
+
onFrame: options.onFrame,
|
|
256
|
+
onParticleCreate: options.onParticleCreate,
|
|
257
|
+
onParticleDeath: options.onParticleDeath,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Checks if the code is running in a browser environment
|
|
262
|
+
*/
|
|
263
|
+
export function isBrowser() {
|
|
264
|
+
return typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Gets the device pixel ratio, capped for performance
|
|
268
|
+
*/
|
|
269
|
+
export function getDevicePixelRatio(maxDpr = 2) {
|
|
270
|
+
if (!isBrowser())
|
|
271
|
+
return 1;
|
|
272
|
+
return Math.min(window.devicePixelRatio || 1, maxDpr);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Creates a deferred promise for async control
|
|
276
|
+
*/
|
|
277
|
+
export function createDeferred() {
|
|
278
|
+
let resolve;
|
|
279
|
+
let reject;
|
|
280
|
+
const promise = new Promise((res, rej) => {
|
|
281
|
+
resolve = res;
|
|
282
|
+
reject = rej;
|
|
283
|
+
});
|
|
284
|
+
return { promise, resolve, reject };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Validates that a value is within a valid range
|
|
288
|
+
*/
|
|
289
|
+
export function validateRange(value, min, max, name) {
|
|
290
|
+
if (value < min || value > max) {
|
|
291
|
+
throw new RangeError(`${name} must be between ${min} and ${max}, got ${value}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Calculates distance between two points
|
|
296
|
+
*/
|
|
297
|
+
export function distance(p1, p2) {
|
|
298
|
+
const dx = p2.x - p1.x;
|
|
299
|
+
const dy = p2.y - p1.y;
|
|
300
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Normalizes an angle to be between 0 and 2π
|
|
304
|
+
*/
|
|
305
|
+
export function normalizeAngle(angle) {
|
|
306
|
+
const twoPi = MATH_CONSTANTS.TWO_PI;
|
|
307
|
+
return ((angle % twoPi) + twoPi) % twoPi;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
|