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,334 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * React components for confetti animations
4
+ *
5
+ * Provides declarative components for easy integration of confetti
6
+ * effects into React applications.
7
+ */
8
+ import { useEffect, useRef, useCallback, forwardRef, useImperativeHandle, } from 'react';
9
+ import { useConfetti } from './hooks';
10
+ /**
11
+ * Declarative confetti component that fires when active prop changes
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const [celebrate, setCelebrate] = useState(false);
16
+ *
17
+ * return (
18
+ * <>
19
+ * <ConfettiBurst
20
+ * active={celebrate}
21
+ * origin={{ x: 500, y: 300 }}
22
+ * onComplete={() => setCelebrate(false)}
23
+ * />
24
+ * <button onClick={() => setCelebrate(true)}>
25
+ * Celebrate!
26
+ * </button>
27
+ * </>
28
+ * );
29
+ * ```
30
+ */
31
+ export function ConfettiBurst({ active, origin, triggerRef, options, onComplete, }) {
32
+ const { fire, fireFromElement } = useConfetti();
33
+ const hasFired = useRef(false);
34
+ useEffect(() => {
35
+ if (active && !hasFired.current) {
36
+ hasFired.current = true;
37
+ let handle = null;
38
+ if (triggerRef?.current) {
39
+ handle = fireFromElement(triggerRef.current, options);
40
+ }
41
+ else if (origin) {
42
+ handle = fire(origin, options);
43
+ }
44
+ if (handle) {
45
+ handle.promise.then(() => {
46
+ onComplete?.();
47
+ });
48
+ }
49
+ }
50
+ }, [active, origin, triggerRef, options, fire, fireFromElement, onComplete]);
51
+ // Reset when active becomes false
52
+ useEffect(() => {
53
+ if (!active) {
54
+ hasFired.current = false;
55
+ }
56
+ }, [active]);
57
+ return null;
58
+ }
59
+ /**
60
+ * Invisible trigger component that fires confetti from its position
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * const triggerRef = useRef<ConfettiTriggerHandle>(null);
65
+ *
66
+ * return (
67
+ * <div style={{ position: 'relative' }}>
68
+ * <ConfettiTrigger ref={triggerRef} options={{ particleCount: 100 }} />
69
+ * <button onClick={() => triggerRef.current?.fire()}>
70
+ * Fire!
71
+ * </button>
72
+ * </div>
73
+ * );
74
+ * ```
75
+ */
76
+ export const ConfettiTrigger = forwardRef(({ options, style }, ref) => {
77
+ const containerRef = useRef(null);
78
+ const { fireFromElement } = useConfetti();
79
+ useImperativeHandle(ref, () => ({
80
+ fire: () => fireFromElement(containerRef.current, options),
81
+ }));
82
+ return (_jsx("div", { ref: containerRef, style: {
83
+ position: 'absolute',
84
+ width: 1,
85
+ height: 1,
86
+ pointerEvents: 'none',
87
+ ...style,
88
+ }, "aria-hidden": "true" }));
89
+ });
90
+ ConfettiTrigger.displayName = 'ConfettiTrigger';
91
+ /**
92
+ * Button component that automatically fires confetti on click
93
+ *
94
+ * @example
95
+ * ```tsx
96
+ * <ConfettiButton
97
+ * confettiOptions={{
98
+ * particleCount: 30,
99
+ * direction: { direction: 'up' }
100
+ * }}
101
+ * >
102
+ * Submit
103
+ * </ConfettiButton>
104
+ * ```
105
+ */
106
+ export const ConfettiButton = forwardRef(({ children, confettiOptions, fireOnClick = true, onClick, ...buttonProps }, forwardedRef) => {
107
+ const internalRef = useRef(null);
108
+ const { fireFromElement } = useConfetti();
109
+ // Combine refs
110
+ const setRef = useCallback((node) => {
111
+ internalRef.current = node;
112
+ if (typeof forwardedRef === 'function') {
113
+ forwardedRef(node);
114
+ }
115
+ else if (forwardedRef) {
116
+ forwardedRef.current = node;
117
+ }
118
+ }, [forwardedRef]);
119
+ const handleClick = useCallback((event) => {
120
+ if (fireOnClick && internalRef.current) {
121
+ fireFromElement(internalRef.current, confettiOptions);
122
+ }
123
+ onClick?.(event);
124
+ }, [fireOnClick, fireFromElement, confettiOptions, onClick]);
125
+ return (_jsx("button", { ref: setRef, onClick: handleClick, ...buttonProps, children: children }));
126
+ });
127
+ ConfettiButton.displayName = 'ConfettiButton';
128
+ /**
129
+ * Component that fires confetti when mounted
130
+ *
131
+ * @example
132
+ * ```tsx
133
+ * // Fire confetti when a success page loads
134
+ * function SuccessPage() {
135
+ * return (
136
+ * <div>
137
+ * <ConfettiOnMount
138
+ * origin={{ x: window.innerWidth / 2, y: window.innerHeight / 3 }}
139
+ * options={{ particleCount: 100 }}
140
+ * />
141
+ * <h1>Success!</h1>
142
+ * </div>
143
+ * );
144
+ * }
145
+ * ```
146
+ */
147
+ export function ConfettiOnMount({ origin, options, onComplete, delay = 0, }) {
148
+ const { fire } = useConfetti();
149
+ const hasFired = useRef(false);
150
+ useEffect(() => {
151
+ if (hasFired.current)
152
+ return;
153
+ hasFired.current = true;
154
+ const burstOrigin = origin ?? {
155
+ x: typeof window !== 'undefined' ? window.innerWidth / 2 : 0,
156
+ y: typeof window !== 'undefined' ? window.innerHeight / 2 : 0,
157
+ };
158
+ const timeoutId = setTimeout(() => {
159
+ const handle = fire(burstOrigin, options);
160
+ handle.promise.then(() => onComplete?.());
161
+ }, delay);
162
+ return () => clearTimeout(timeoutId);
163
+ }, [fire, origin, options, onComplete, delay]);
164
+ return null;
165
+ }
166
+ /**
167
+ * Positioned cannon component for directional confetti bursts
168
+ *
169
+ * @example
170
+ * ```tsx
171
+ * <ConfettiCannon
172
+ * left="10%"
173
+ * top="80%"
174
+ * angle={60}
175
+ * fire={shouldFire}
176
+ * options={{ particleCount: 50 }}
177
+ * />
178
+ * ```
179
+ */
180
+ export function ConfettiCannon({ left = 0, top = 0, angle = 90, options, fire: shouldFire = false, onComplete, }) {
181
+ const { fire } = useConfetti();
182
+ const hasFired = useRef(false);
183
+ useEffect(() => {
184
+ if (!shouldFire || hasFired.current)
185
+ return;
186
+ if (typeof window === 'undefined')
187
+ return;
188
+ hasFired.current = true;
189
+ // Calculate position
190
+ const x = typeof left === 'string' && left.endsWith('%')
191
+ ? (parseFloat(left) / 100) * window.innerWidth
192
+ : typeof left === 'number'
193
+ ? left
194
+ : parseFloat(left) || 0;
195
+ const y = typeof top === 'string' && top.endsWith('%')
196
+ ? (parseFloat(top) / 100) * window.innerHeight
197
+ : typeof top === 'number'
198
+ ? top
199
+ : parseFloat(top) || 0;
200
+ const handle = fire({ x, y }, {
201
+ ...options,
202
+ direction: {
203
+ ...options?.direction,
204
+ direction: 'custom',
205
+ angle,
206
+ },
207
+ });
208
+ handle.promise.then(() => onComplete?.());
209
+ }, [shouldFire, left, top, angle, options, fire, onComplete]);
210
+ // Reset when fire becomes false
211
+ useEffect(() => {
212
+ if (!shouldFire) {
213
+ hasFired.current = false;
214
+ }
215
+ }, [shouldFire]);
216
+ return null;
217
+ }
218
+ export function Confetti({ width, height, numberOfPieces = 200, confettiSource, initialVelocityX, initialVelocityY, recycle = true, run = true, gravity = 0.3, wind = 0, opacity = 1, drawShape, tweenDuration = 100, colors, onConfettiComplete, frameRate,
219
+ // style and className are for API compatibility but not used in canvas
220
+ }) {
221
+ const { fire } = useConfetti();
222
+ const handleRef = useRef(null);
223
+ const hasStarted = useRef(false);
224
+ useEffect(() => {
225
+ if (!run) {
226
+ if (handleRef.current) {
227
+ handleRef.current.stop();
228
+ handleRef.current = null;
229
+ }
230
+ hasStarted.current = false;
231
+ return;
232
+ }
233
+ if (hasStarted.current)
234
+ return;
235
+ hasStarted.current = true;
236
+ // Calculate spawn area
237
+ const spawnArea = confettiSource
238
+ ? {
239
+ type: 'rect',
240
+ x: confettiSource.x,
241
+ y: confettiSource.y,
242
+ w: confettiSource.w ?? window.innerWidth,
243
+ h: confettiSource.h ?? 10,
244
+ }
245
+ : {
246
+ type: 'rect',
247
+ x: 0,
248
+ y: 0,
249
+ w: width ?? window.innerWidth,
250
+ h: 10,
251
+ };
252
+ // Convert velocity props
253
+ const velX = typeof initialVelocityX === 'number'
254
+ ? [initialVelocityX * 0.5, initialVelocityX * 1.5]
255
+ : initialVelocityX
256
+ ? [initialVelocityX.min, initialVelocityX.max]
257
+ : [4, 10];
258
+ const velY = typeof initialVelocityY === 'number'
259
+ ? [initialVelocityY * 0.5, initialVelocityY * 1.5]
260
+ : initialVelocityY
261
+ ? [initialVelocityY.min, initialVelocityY.max]
262
+ : [10, 30];
263
+ // Start the continuous confetti
264
+ const centerX = (width ?? window.innerWidth) / 2;
265
+ const centerY = 0;
266
+ handleRef.current = fire({ x: centerX, y: centerY }, {
267
+ particleCount: numberOfPieces,
268
+ particle: {
269
+ colors: colors ?? ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#00ffff'],
270
+ opacity: [opacity * 0.8, opacity],
271
+ shapes: ['square', 'circle', 'rectangle'],
272
+ drawShape,
273
+ },
274
+ physics: {
275
+ gravity: gravity * 10, // Scale to match react-confetti
276
+ wind: wind * 5,
277
+ windVariation: velX[1] - velX[0], // Use horizontal velocity as wind variation
278
+ },
279
+ direction: {
280
+ velocity: velY,
281
+ },
282
+ mode: 'continuous',
283
+ spawnArea,
284
+ continuous: {
285
+ recycle,
286
+ numberOfPieces,
287
+ spawnRate: 30,
288
+ run,
289
+ tweenDuration,
290
+ },
291
+ canvas: {
292
+ width,
293
+ height,
294
+ frameRate,
295
+ autoResize: !width && !height,
296
+ },
297
+ onComplete: onConfettiComplete,
298
+ });
299
+ return () => {
300
+ if (handleRef.current) {
301
+ handleRef.current.stop();
302
+ handleRef.current = null;
303
+ }
304
+ };
305
+ }, [
306
+ run,
307
+ width,
308
+ height,
309
+ numberOfPieces,
310
+ confettiSource,
311
+ initialVelocityX,
312
+ initialVelocityY,
313
+ recycle,
314
+ gravity,
315
+ wind,
316
+ opacity,
317
+ drawShape,
318
+ tweenDuration,
319
+ colors,
320
+ onConfettiComplete,
321
+ frameRate,
322
+ fire,
323
+ ]);
324
+ // Handle recycle changes
325
+ useEffect(() => {
326
+ if (handleRef.current && !recycle) {
327
+ // Stop recycling - animation will end naturally
328
+ // This is handled in the engine
329
+ }
330
+ }, [recycle]);
331
+ return null;
332
+ }
333
+ Confetti.displayName = 'Confetti';
334
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/components.tsx"],"names":[],"mappings":"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"}