svelte-confetti-explosion 0.3.0 → 0.4.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.
@@ -4,22 +4,11 @@ const ROTATION_SPEED_MAX = 800; // maximum possible duration of single particle
4
4
  const CRAZY_PARTICLES_FREQUENCY = 0.1; // 0-1 frequency of crazy curvy unpredictable particles
5
5
  const CRAZY_PARTICLE_CRAZINESS = 0.3; // 0-1 how crazy these crazy particles are
6
6
  const BEZIER_MEDIAN = 0.5; // utility for mid-point bezier curves, to ensure smooth motion paths
7
- const FORCE = 0.5; // 0-1 roughly the vertical force at which particles initially explode
8
- const SIZE = 12; // max height for particle rectangles, diameter for particle circles
9
- const FLOOR_HEIGHT = 800; // pixels the particles will fall from initial explosion point
10
- const FLOOR_WIDTH = 1600; // horizontal spread of particles in pixels
11
- const PARTICLE_COUNT = 150;
12
- const DURATION = 3500;
13
- const COLORS = ['#FFC700', '#F00', '#2E3191', '#41BBC7'];
14
7
  const abs = Math.abs, random = Math.random, mathRound = Math.round, max = Math.max;
15
- const createParticles = (count, colors) => {
16
- const increment = 360 / count;
17
- return Array.from({ length: count }, (_, i) => ({
18
- color: colors[i % colors.length],
19
- degree: i * increment,
20
- }));
21
- };
22
- const waitFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
8
+ const createParticles = (count, colors) => Array.from({ length: count }, (_, i) => ({
9
+ color: colors[i % colors.length],
10
+ degree: (i * 360) / count,
11
+ }));
23
12
  // From here: https://stackoverflow.com/a/11832950
24
13
  const round = (num, precision = 2) => mathRound((num + Number.EPSILON) * 10 ** precision) / 10 ** precision;
25
14
  const mapRange = (value, x1, y1, x2, y2) => ((value - x1) * (y2 - x2)) / (y1 - x1) + x2;
@@ -50,19 +39,14 @@ const validate = (particleCount, duration, colors, particleSize, force, stageHei
50
39
  !assertPositiveInteger(particleSize, 'particleSize') ||
51
40
  !assertPositiveInteger(force, 'force') ||
52
41
  !assertPositiveInteger(stageHeight, 'floorHeight') ||
53
- !assertPositiveInteger(stageWidth, 'floorWidth')) {
42
+ !assertPositiveInteger(stageWidth, 'floorWidth'))
54
43
  return false;
55
- }
56
- if (!isUndefined(particlesShape) &&
57
- !['mix', 'circles', 'rectangles'].includes(particlesShape)) {
44
+ if (!isUndefined(particlesShape) && !['mix', 'circles', 'rectangles'].includes(particlesShape))
58
45
  return error('particlesShape should be either "mix" or "circles" or "rectangle"');
59
- }
60
- if (!isUndefined(colors) && !Array.isArray(colors)) {
46
+ if (!isUndefined(colors) && !Array.isArray(colors))
61
47
  return error('colors must be an array of strings');
62
- }
63
- if (force > 1) {
48
+ if (force > 1)
64
49
  return error('force must be within 0 and 1');
65
- }
66
50
  return true;
67
51
  };
68
52
  </script>
@@ -79,7 +63,7 @@ const validate = (particleCount, duration, colors, particleSize, force, stageHei
79
63
  * <ConfettiExplosion particleCount={200} />
80
64
  * ```
81
65
  */
82
- export let particleCount = PARTICLE_COUNT;
66
+ export let particleCount = 150;
83
67
  /**
84
68
  * Size of the confetti particles in pixels
85
69
  *
@@ -91,7 +75,7 @@ export let particleCount = PARTICLE_COUNT;
91
75
  * <ConfettiExplosion particleSize={20} />
92
76
  * ```
93
77
  */
94
- export let particleSize = SIZE;
78
+ export let particleSize = 12;
95
79
  /**
96
80
  * Duration of the animation in milliseconds
97
81
  *
@@ -103,7 +87,7 @@ export let particleSize = SIZE;
103
87
  * <ConfettiExplosion duration={5000} />
104
88
  * ```
105
89
  */
106
- export let duration = DURATION;
90
+ export let duration = 3500;
107
91
  /**
108
92
  * Shape of particles to use. Can be `mix`, `circles` or `rectangles`
109
93
  *
@@ -138,7 +122,7 @@ export let particlesShape = 'mix';
138
122
  * <ConfettiExplosion colors={['var(--yellow)', 'var(--red)', '#2E3191', '#41BBC7']} />
139
123
  * ```
140
124
  */
141
- export let colors = COLORS;
125
+ export let colors = ['#FFC700', '#FF0000', '#2E3191', '#41BBC7'];
142
126
  /**
143
127
  * Force of the confetti particles. Between 0 and 1. 0 is no force, 1 is maximum force.
144
128
  *
@@ -150,7 +134,7 @@ export let colors = COLORS;
150
134
  * <ConfettiExplosion force={0.8} />
151
135
  * ```
152
136
  */
153
- export let force = FORCE;
137
+ export let force = 0.5;
154
138
  /**
155
139
  * Height of the stage in pixels. Confetti will only fall within this height.
156
140
  *
@@ -162,7 +146,7 @@ export let force = FORCE;
162
146
  * <ConfettiExplosion floorHeight={500} />
163
147
  * ```
164
148
  */
165
- export let stageHeight = FLOOR_HEIGHT;
149
+ export let stageHeight = 800;
166
150
  /**
167
151
  * Width of the stage in pixels. Confetti will only fall within this width.
168
152
  *
@@ -174,7 +158,7 @@ export let stageHeight = FLOOR_HEIGHT;
174
158
  * <ConfettiExplosion floorWidth={1000} />
175
159
  * ```
176
160
  */
177
- export let stageWidth = FLOOR_WIDTH;
161
+ export let stageWidth = 1600;
178
162
  /**
179
163
  * Whether or not destroy all confetti nodes after the `duration` period has passed. By default it destroys all nodes, to preserve memory.
180
164
  *
@@ -190,12 +174,7 @@ export let shouldDestroyAfterDone = true;
190
174
  let isVisible = true;
191
175
  $: particles = createParticles(particleCount, colors);
192
176
  $: isValid = validate(particleCount, duration, colors, particleSize, force, stageHeight, stageWidth, particlesShape);
193
- onMount(async () => {
194
- await waitFor(duration);
195
- if (shouldDestroyAfterDone) {
196
- isVisible = false;
197
- }
198
- });
177
+ onMount(() => setTimeout(() => shouldDestroyAfterDone && (isVisible = false), duration));
199
178
  function confettiStyles(node, degree) {
200
179
  // Crazy calculations for generating styles
201
180
  const rotationTransform = mathRound(random() * (POSSIBLE_ROTATION_TRANSFORMS - 1));
@@ -268,8 +247,7 @@ function confettiStyles(node, degree) {
268
247
  }
269
248
  .particle div {
270
249
  position: absolute;
271
- top: 0;
272
- left: 0;
250
+ inset: 0;
273
251
  animation: y-axis var(--duration-chaos) forwards cubic-bezier(var(--y1), var(--y2), var(--y3), var(--y4));
274
252
  width: var(--width);
275
253
  height: var(--height);
package/README.md CHANGED
@@ -6,7 +6,7 @@ Let's party 🎊🎊 with Svelte! svelte-confetti-explosion allows you to show a
6
6
 
7
7
  ## Features
8
8
 
9
- - 🤏 Tiny - 2KB min+br.
9
+ - 🤏 Tiny - 1.95KB min+br.
10
10
  - 🐇 Simple - Quite simple to use, and effectively no-config required!
11
11
  - 🧙‍♀️ Elegant - Use a Svelte component rather than setting things up in `onMount` hook.
12
12
  - 🗃️ Highly customizable - Offers tons of options that you can modify to get different behaviors.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-confetti-explosion",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Confetti explosion in Svelte 🎉🎊",
5
5
  "author": "Puru Vijay",
6
6
  "license": "MIT",