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,272 @@
1
+ "use strict";
2
+ /**
3
+ * Shape helper functions
4
+ *
5
+ * Provides canvas-confetti compatible shape creation utilities
6
+ * for custom SVG paths, text, and emoji shapes.
7
+ *
8
+ * @module shapes
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.emojiShapes = exports.pathShapes = void 0;
12
+ exports.shapeFromPath = shapeFromPath;
13
+ exports.shapeFromText = shapeFromText;
14
+ exports.shapeFromImage = shapeFromImage;
15
+ exports.shapesFromEmoji = shapesFromEmoji;
16
+ /**
17
+ * Create a custom shape from an SVG path string.
18
+ *
19
+ * This is compatible with canvas-confetti's shapeFromPath function.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // Simple star shape
24
+ * const star = shapeFromPath({
25
+ * path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z'
26
+ * });
27
+ *
28
+ * // With transformation matrix
29
+ * const scaledStar = shapeFromPath({
30
+ * path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z',
31
+ * matrix: [2, 0, 0, 2, 0, 0] // Scale 2x
32
+ * });
33
+ *
34
+ * // Usage with confetti
35
+ * fire({ x: 0.5, y: 0.5 }, {
36
+ * particle: { shapes: [star, 'circle'] }
37
+ * });
38
+ * ```
39
+ *
40
+ * @param options - Shape configuration options
41
+ * @returns PathShape object for use in confetti configuration
42
+ */
43
+ function shapeFromPath(options) {
44
+ const { path, matrix, fillColor, strokeColor, strokeWidth } = options;
45
+ // Parse the path to extract bounds for proper scaling
46
+ const bounds = getPathBounds(path);
47
+ return {
48
+ type: 'path',
49
+ path,
50
+ matrix: matrix ? [...matrix] : undefined,
51
+ fillColor,
52
+ strokeColor,
53
+ strokeWidth,
54
+ bounds,
55
+ };
56
+ }
57
+ /**
58
+ * Create a custom shape from text or an emoji.
59
+ *
60
+ * This is compatible with canvas-confetti's shapeFromText function.
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * // Emoji confetti
65
+ * const heart = shapeFromText({ text: '❤️' });
66
+ * const party = shapeFromText({ text: '🎉', scalar: 2 });
67
+ *
68
+ * // Custom text
69
+ * const yay = shapeFromText({
70
+ * text: 'YAY',
71
+ * fontFamily: 'Impact',
72
+ * color: '#ff0000'
73
+ * });
74
+ *
75
+ * // Usage with confetti
76
+ * fire({ x: 0.5, y: 0.5 }, {
77
+ * particle: { shapes: [heart, party, yay] }
78
+ * });
79
+ * ```
80
+ *
81
+ * @param options - Text shape configuration options
82
+ * @returns TextShape object for use in confetti configuration
83
+ */
84
+ function shapeFromText(options) {
85
+ const { text, scalar = 1, color, fontFamily = 'serif', fontWeight = 'normal', fontStyle = 'normal', } = options;
86
+ return {
87
+ type: 'text',
88
+ text,
89
+ scalar,
90
+ color,
91
+ fontFamily,
92
+ fontWeight: String(fontWeight),
93
+ fontStyle,
94
+ };
95
+ }
96
+ /**
97
+ * Create a bitmap shape from an image URL or HTMLImageElement.
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * const logo = await shapeFromImage({
102
+ * src: '/logo.png',
103
+ * width: 32,
104
+ * height: 32
105
+ * });
106
+ *
107
+ * fire({ x: 0.5, y: 0.5 }, {
108
+ * particle: { shapes: [logo] }
109
+ * });
110
+ * ```
111
+ *
112
+ * @param options - Image shape configuration options
113
+ * @returns Promise resolving to a custom shape
114
+ */
115
+ async function shapeFromImage(options) {
116
+ const { src, scalar = 1 } = options;
117
+ // If it's already an image element, use it directly
118
+ if (typeof src !== 'string') {
119
+ return {
120
+ type: 'text', // Reuse text type for simplicity in renderer
121
+ text: '',
122
+ scalar,
123
+ // Store image reference in a custom way
124
+ fontFamily: `url(${src.src})`,
125
+ };
126
+ }
127
+ // Load the image to validate it exists
128
+ await loadImage(src);
129
+ return {
130
+ type: 'text',
131
+ text: '',
132
+ scalar,
133
+ fontFamily: `url(${src})`,
134
+ color: undefined,
135
+ };
136
+ }
137
+ /**
138
+ * Create multiple shapes from an array of emoji.
139
+ *
140
+ * @example
141
+ * ```typescript
142
+ * const partyEmoji = shapesFromEmoji(['🎉', '🎊', '✨', '🥳']);
143
+ *
144
+ * fire({ x: 0.5, y: 0.5 }, {
145
+ * particle: { shapes: partyEmoji }
146
+ * });
147
+ * ```
148
+ *
149
+ * @param emojis - Array of emoji strings
150
+ * @param options - Optional common options for all emoji
151
+ * @returns Array of TextShape objects
152
+ */
153
+ function shapesFromEmoji(emojis, options = {}) {
154
+ return emojis.map(emoji => shapeFromText({ ...options, text: emoji }));
155
+ }
156
+ /**
157
+ * Common predefined path shapes
158
+ */
159
+ exports.pathShapes = {
160
+ /** Five-pointed star */
161
+ star: shapeFromPath({
162
+ path: 'M0,-1 L0.588,0.809 L-0.951,-0.309 L0.951,-0.309 L-0.588,0.809 Z',
163
+ }),
164
+ /** Heart shape */
165
+ heart: shapeFromPath({
166
+ 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',
167
+ }),
168
+ /** Diamond shape */
169
+ diamond: shapeFromPath({
170
+ path: 'M0,-1 L0.7,0 L0,1 L-0.7,0 Z',
171
+ }),
172
+ /** Hexagon shape */
173
+ hexagon: shapeFromPath({
174
+ path: 'M0.866,-0.5 L0.866,0.5 L0,1 L-0.866,0.5 L-0.866,-0.5 L0,-1 Z',
175
+ }),
176
+ /** Triangle shape */
177
+ triangle: shapeFromPath({
178
+ path: 'M0,-1 L0.866,0.5 L-0.866,0.5 Z',
179
+ }),
180
+ /** Plus/cross shape */
181
+ plus: shapeFromPath({
182
+ 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',
183
+ }),
184
+ /** Moon/crescent shape */
185
+ moon: shapeFromPath({
186
+ path: 'M0,-1 A1,1 0 1,1 0,1 A0.6,0.6 0 1,0 0,-1 Z',
187
+ }),
188
+ /** Lightning bolt */
189
+ lightning: shapeFromPath({
190
+ 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',
191
+ }),
192
+ /** Spiral shape */
193
+ spiral: shapeFromPath({
194
+ 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',
195
+ }),
196
+ /** Ribbon/wave shape */
197
+ ribbon: shapeFromPath({
198
+ 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',
199
+ }),
200
+ };
201
+ /**
202
+ * Common emoji sets for quick use
203
+ */
204
+ exports.emojiShapes = {
205
+ /** Party/celebration emoji */
206
+ party: shapesFromEmoji(['🎉', '🎊', '🥳', '✨', '🎈']),
207
+ /** Heart emoji */
208
+ hearts: shapesFromEmoji(['❤️', '💕', '💖', '💗', '💝']),
209
+ /** Star emoji */
210
+ stars: shapesFromEmoji(['⭐', '🌟', '✨', '💫', '🌠']),
211
+ /** Nature emoji */
212
+ nature: shapesFromEmoji(['🌸', '🌺', '🌻', '🌼', '🌷']),
213
+ /** Food emoji */
214
+ food: shapesFromEmoji(['🍕', '🍔', '🍟', '🍩', '🧁']),
215
+ /** Sports emoji */
216
+ sports: shapesFromEmoji(['⚽', '🏀', '🏈', '⚾', '🎾']),
217
+ /** Weather emoji */
218
+ weather: shapesFromEmoji(['☀️', '⛅', '🌈', '❄️', '💨']),
219
+ /** Money emoji */
220
+ money: shapesFromEmoji(['💰', '💵', '💎', '🪙', '💳']),
221
+ /** Animals emoji */
222
+ animals: shapesFromEmoji(['🦋', '🐝', '🐞', '🦄', '🐱']),
223
+ /** Holiday emoji */
224
+ holiday: shapesFromEmoji(['🎄', '🎃', '🎅', '🐰', '🦃']),
225
+ };
226
+ // ============================================================================
227
+ // Internal helper functions
228
+ // ============================================================================
229
+ /**
230
+ * Parse SVG path and extract bounds for proper scaling
231
+ */
232
+ function getPathBounds(path) {
233
+ // Simple bounds extraction - this is a basic implementation
234
+ // A full implementation would parse all path commands
235
+ const numbers = path.match(/-?\d*\.?\d+/g);
236
+ if (!numbers || numbers.length < 2) {
237
+ return { minX: -1, minY: -1, maxX: 1, maxY: 1 };
238
+ }
239
+ let minX = Infinity;
240
+ let minY = Infinity;
241
+ let maxX = -Infinity;
242
+ let maxY = -Infinity;
243
+ // Assume alternating x,y pairs (simplified)
244
+ for (let i = 0; i < numbers.length - 1; i += 2) {
245
+ const x = parseFloat(numbers[i]);
246
+ const y = parseFloat(numbers[i + 1]);
247
+ if (!isNaN(x) && !isNaN(y)) {
248
+ minX = Math.min(minX, x);
249
+ minY = Math.min(minY, y);
250
+ maxX = Math.max(maxX, x);
251
+ maxY = Math.max(maxY, y);
252
+ }
253
+ }
254
+ // Handle case where we couldn't parse valid bounds
255
+ if (!isFinite(minX)) {
256
+ return { minX: -1, minY: -1, maxX: 1, maxY: 1 };
257
+ }
258
+ return { minX, minY, maxX, maxY };
259
+ }
260
+ /**
261
+ * Load an image and return a promise
262
+ */
263
+ function loadImage(src) {
264
+ return new Promise((resolve, reject) => {
265
+ const img = new Image();
266
+ img.crossOrigin = 'anonymous';
267
+ img.onload = () => resolve(img);
268
+ img.onerror = () => reject(new Error(`Failed to load image: ${src}`));
269
+ img.src = src;
270
+ });
271
+ }
272
+ //# sourceMappingURL=shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../src/shapes.ts"],"names":[],"mappings":"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"}