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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +303 -0
  3. package/dist/cjs/components.d.ts +219 -0
  4. package/dist/cjs/components.d.ts.map +1 -0
  5. package/dist/cjs/components.js +341 -0
  6. package/dist/cjs/components.js.map +1 -0
  7. package/dist/cjs/confetti-engine.d.ts +122 -0
  8. package/dist/cjs/confetti-engine.d.ts.map +1 -0
  9. package/dist/cjs/confetti-engine.js +589 -0
  10. package/dist/cjs/confetti-engine.js.map +1 -0
  11. package/dist/cjs/confetti.d.ts +50 -0
  12. package/dist/cjs/confetti.d.ts.map +1 -0
  13. package/dist/cjs/confetti.js +446 -0
  14. package/dist/cjs/confetti.js.map +1 -0
  15. package/dist/cjs/constants.d.ts +147 -0
  16. package/dist/cjs/constants.d.ts.map +1 -0
  17. package/dist/cjs/constants.js +609 -0
  18. package/dist/cjs/constants.js.map +1 -0
  19. package/dist/cjs/hooks.d.ts +94 -0
  20. package/dist/cjs/hooks.d.ts.map +1 -0
  21. package/dist/cjs/hooks.js +225 -0
  22. package/dist/cjs/hooks.js.map +1 -0
  23. package/dist/cjs/index.d.ts +34 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/index.js +180 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/particle.d.ts +50 -0
  28. package/dist/cjs/particle.d.ts.map +1 -0
  29. package/dist/cjs/particle.js +475 -0
  30. package/dist/cjs/particle.js.map +1 -0
  31. package/dist/cjs/shapes.d.ts +190 -0
  32. package/dist/cjs/shapes.d.ts.map +1 -0
  33. package/dist/cjs/shapes.js +272 -0
  34. package/dist/cjs/shapes.js.map +1 -0
  35. package/dist/cjs/types.d.ts +720 -0
  36. package/dist/cjs/types.d.ts.map +1 -0
  37. package/dist/cjs/types.js +25 -0
  38. package/dist/cjs/types.js.map +1 -0
  39. package/dist/cjs/utils.d.ts +90 -0
  40. package/dist/cjs/utils.d.ts.map +1 -0
  41. package/dist/cjs/utils.js +330 -0
  42. package/dist/cjs/utils.js.map +1 -0
  43. package/dist/esm/components.js +334 -0
  44. package/dist/esm/components.js.map +1 -0
  45. package/dist/esm/confetti-engine.js +581 -0
  46. package/dist/esm/confetti-engine.js.map +1 -0
  47. package/dist/esm/confetti.js +443 -0
  48. package/dist/esm/confetti.js.map +1 -0
  49. package/dist/esm/constants.js +605 -0
  50. package/dist/esm/constants.js.map +1 -0
  51. package/dist/esm/hooks.js +218 -0
  52. package/dist/esm/hooks.js.map +1 -0
  53. package/dist/esm/index.js +146 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/particle.js +465 -0
  56. package/dist/esm/particle.js.map +1 -0
  57. package/dist/esm/shapes.js +265 -0
  58. package/dist/esm/shapes.js.map +1 -0
  59. package/dist/esm/types.js +24 -0
  60. package/dist/esm/types.js.map +1 -0
  61. package/dist/esm/utils.js +309 -0
  62. package/dist/esm/utils.js.map +1 -0
  63. package/dist/types/components.d.ts +219 -0
  64. package/dist/types/components.d.ts.map +1 -0
  65. package/dist/types/confetti-engine.d.ts +122 -0
  66. package/dist/types/confetti-engine.d.ts.map +1 -0
  67. package/dist/types/confetti.d.ts +50 -0
  68. package/dist/types/confetti.d.ts.map +1 -0
  69. package/dist/types/constants.d.ts +147 -0
  70. package/dist/types/constants.d.ts.map +1 -0
  71. package/dist/types/hooks.d.ts +94 -0
  72. package/dist/types/hooks.d.ts.map +1 -0
  73. package/dist/types/index.d.ts +34 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/particle.d.ts +50 -0
  76. package/dist/types/particle.d.ts.map +1 -0
  77. package/dist/types/shapes.d.ts +190 -0
  78. package/dist/types/shapes.d.ts.map +1 -0
  79. package/dist/types/types.d.ts +720 -0
  80. package/dist/types/types.d.ts.map +1 -0
  81. package/dist/types/utils.d.ts +90 -0
  82. package/dist/types/utils.d.ts.map +1 -0
  83. 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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"}