svelte-confetti-explosion 0.0.6 → 0.2.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/ConfettiExplosion.svelte +40 -11
- package/ConfettiExplosion.svelte.d.ts +22 -0
- package/LICENSE +21 -0
- package/README.md +52 -13
- package/package.json +24 -16
package/ConfettiExplosion.svelte
CHANGED
@@ -57,7 +57,7 @@ const isUndefined = (value) => typeof value === 'undefined';
|
|
57
57
|
const error = (message) => {
|
58
58
|
console.error(message);
|
59
59
|
};
|
60
|
-
function validate(particleCount, duration, colors, particleSize, force,
|
60
|
+
function validate(particleCount, duration, colors, particleSize, force, stageHeight, stageWidth, particlesShape) {
|
61
61
|
const isSafeInteger = Number.isSafeInteger;
|
62
62
|
if (!isUndefined(particleCount) && isSafeInteger(particleCount) && particleCount < 0) {
|
63
63
|
error('particleCount must be a positive integer');
|
@@ -67,6 +67,11 @@ function validate(particleCount, duration, colors, particleSize, force, floorHei
|
|
67
67
|
error('duration must be a positive integer');
|
68
68
|
return false;
|
69
69
|
}
|
70
|
+
if (!isUndefined(particlesShape) &&
|
71
|
+
!['mix', 'circles', 'rectangles'].includes(particlesShape)) {
|
72
|
+
error('particlesShape should be either "mix" or "circles" or "rectangle"');
|
73
|
+
return false;
|
74
|
+
}
|
70
75
|
if (!isUndefined(colors) && !Array.isArray(colors)) {
|
71
76
|
error('colors must be an array of strings');
|
72
77
|
return false;
|
@@ -79,17 +84,17 @@ function validate(particleCount, duration, colors, particleSize, force, floorHei
|
|
79
84
|
error('force must be a positive integer and should be within 0 and 1');
|
80
85
|
return false;
|
81
86
|
}
|
82
|
-
if (!isUndefined(
|
83
|
-
typeof
|
84
|
-
isSafeInteger(
|
85
|
-
|
87
|
+
if (!isUndefined(stageHeight) &&
|
88
|
+
typeof stageHeight === 'number' &&
|
89
|
+
isSafeInteger(stageHeight) &&
|
90
|
+
stageHeight < 0) {
|
86
91
|
error('floorHeight must be a positive integer');
|
87
92
|
return false;
|
88
93
|
}
|
89
|
-
if (!isUndefined(
|
90
|
-
typeof
|
91
|
-
isSafeInteger(
|
92
|
-
|
94
|
+
if (!isUndefined(stageWidth) &&
|
95
|
+
typeof stageWidth === 'number' &&
|
96
|
+
isSafeInteger(stageWidth) &&
|
97
|
+
stageWidth < 0) {
|
93
98
|
error('floorWidth must be a positive integer');
|
94
99
|
return false;
|
95
100
|
}
|
@@ -134,6 +139,28 @@ export let particleSize = SIZE;
|
|
134
139
|
* ```
|
135
140
|
*/
|
136
141
|
export let duration = DURATION;
|
142
|
+
/**
|
143
|
+
* Shape of particles to use. Can be `mix`, `circles` or `rectangles`
|
144
|
+
*
|
145
|
+
* `mix` will use both circles and rectangles
|
146
|
+
* `circles` will use only circles
|
147
|
+
* `rectangles` will use only rectangles
|
148
|
+
*
|
149
|
+
* @default 'mix'
|
150
|
+
*
|
151
|
+
* @example
|
152
|
+
*
|
153
|
+
* ```svelte
|
154
|
+
* <ConfettiExplosion particlesShape='circles' />
|
155
|
+
* ```
|
156
|
+
*
|
157
|
+
* @example
|
158
|
+
*
|
159
|
+
* ```svelte
|
160
|
+
* <ConfettiExplosion particlesShape='rectangles' />
|
161
|
+
* ```
|
162
|
+
*/
|
163
|
+
export let particlesShape = 'mix';
|
137
164
|
/**
|
138
165
|
* Colors to use for the confetti particles. Pass string array of colors. Can use hex colors, named colors,
|
139
166
|
* CSS Variables, literally anything valid in plain CSS.
|
@@ -201,7 +228,7 @@ $: particles = createParticles(particleCount, colors);
|
|
201
228
|
$: particleCount > 300 &&
|
202
229
|
console.log("[SVELTE-CONFETTI-EXPLOSION] That's a lot of confetti, you sure about that? A lesser number" +
|
203
230
|
' like 200 will still give off the party vibes while still not bricking the device 😉');
|
204
|
-
$: isValid = validate(particleCount, duration, colors, particleSize, force, stageHeight, stageWidth);
|
231
|
+
$: isValid = validate(particleCount, duration, colors, particleSize, force, stageHeight, stageWidth, particlesShape);
|
205
232
|
onMount(async () => {
|
206
233
|
await waitFor(duration);
|
207
234
|
if (shouldDestroyAfterDone) {
|
@@ -216,7 +243,8 @@ function confettiStyles(node, { degree }) {
|
|
216
243
|
const rotationIndex = Math.round(Math.random() * (rotationTransforms.length - 1));
|
217
244
|
const durationChaos = duration - Math.round(Math.random() * 1000);
|
218
245
|
const shouldBeCrazy = Math.random() < CRAZY_PARTICLES_FREQUENCY;
|
219
|
-
const isCircle =
|
246
|
+
const isCircle = particlesShape !== 'rectangles' &&
|
247
|
+
(particlesShape === 'circles' || shouldBeCircle(rotationIndex));
|
220
248
|
// x-axis disturbance, roughly the distance the particle will initially deviate from its target
|
221
249
|
const x1 = shouldBeCrazy ? round(Math.random() * CRAZY_PARTICLE_CRAZINESS, 2) : 0;
|
222
250
|
const x2 = x1 * -1;
|
@@ -281,6 +309,7 @@ function confettiStyles(node, { degree }) {
|
|
281
309
|
height: 0;
|
282
310
|
overflow: visible;
|
283
311
|
position: relative;
|
312
|
+
transform: translate3d(var(--x, 0), var(--y, 0), 0);
|
284
313
|
z-index: 1200;
|
285
314
|
}
|
286
315
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
2
|
+
declare type ParticleShape = 'mix' | 'circles' | 'rectangles';
|
2
3
|
declare const __propDef: {
|
3
4
|
props: {
|
4
5
|
/**
|
@@ -34,6 +35,27 @@ declare const __propDef: {
|
|
34
35
|
* <ConfettiExplosion duration={5000} />
|
35
36
|
* ```
|
36
37
|
*/ duration?: number;
|
38
|
+
/**
|
39
|
+
* Shape of particles to use. Can be `mix`, `circles` or `rectangles`
|
40
|
+
*
|
41
|
+
* `mix` will use both circles and rectangles
|
42
|
+
* `circles` will use only circles
|
43
|
+
* `rectangles` will use only rectangles
|
44
|
+
*
|
45
|
+
* @default 'mix'
|
46
|
+
*
|
47
|
+
* @example
|
48
|
+
*
|
49
|
+
* ```svelte
|
50
|
+
* <ConfettiExplosion particlesShape='circles' />
|
51
|
+
* ```
|
52
|
+
*
|
53
|
+
* @example
|
54
|
+
*
|
55
|
+
* ```svelte
|
56
|
+
* <ConfettiExplosion particlesShape='rectangles' />
|
57
|
+
* ```
|
58
|
+
*/ particlesShape?: ParticleShape;
|
37
59
|
/**
|
38
60
|
* Colors to use for the confetti particles. Pass string array of colors. Can use hex colors, named colors,
|
39
61
|
* CSS Variables, literally anything valid in plain CSS.
|
package/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2021 Puru Vijay
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
@@ -14,7 +14,7 @@ Let's party 🎊🎊 with Svelte! svelte-confetti-explosion allows you to show a
|
|
14
14
|
|
15
15
|
[Try it in Svelte REPL](https://svelte.dev/repl/4e41a080739a4427a1f2c98b7f5d4b24?version=3.44.2)
|
16
16
|
|
17
|
-
|
17
|
+
## Installing
|
18
18
|
|
19
19
|
```bash
|
20
20
|
# pnpm
|
@@ -27,7 +27,7 @@ npm install svelte-confetti-explosion
|
|
27
27
|
yarn add svelte-confetti-explosion
|
28
28
|
```
|
29
29
|
|
30
|
-
|
30
|
+
## Usage
|
31
31
|
|
32
32
|
Basic usage:
|
33
33
|
|
@@ -45,11 +45,11 @@ Customizing behavior with options:
|
|
45
45
|
<ConfettiExplosion particleCount={200} force={0.3} />
|
46
46
|
```
|
47
47
|
|
48
|
-
|
48
|
+
## Props
|
49
49
|
|
50
50
|
There's tons of options available for this package. All of them are already documented within the code itself, so you'll never have to leave the code editor.
|
51
51
|
|
52
|
-
|
52
|
+
### particleCount
|
53
53
|
|
54
54
|
Number of confetti particles to create.
|
55
55
|
|
@@ -63,7 +63,7 @@ Number of confetti particles to create.
|
|
63
63
|
<ConfettiExplosion particleCount={200} />
|
64
64
|
```
|
65
65
|
|
66
|
-
|
66
|
+
### particleSize
|
67
67
|
|
68
68
|
Size of the confetti particles in pixels
|
69
69
|
|
@@ -77,7 +77,7 @@ Size of the confetti particles in pixels
|
|
77
77
|
<ConfettiExplosion particleSize={20} />
|
78
78
|
```
|
79
79
|
|
80
|
-
|
80
|
+
### duration
|
81
81
|
|
82
82
|
Duration of the animation in milliseconds
|
83
83
|
|
@@ -91,7 +91,7 @@ Duration of the animation in milliseconds
|
|
91
91
|
<ConfettiExplosion duration={5000} />
|
92
92
|
```
|
93
93
|
|
94
|
-
|
94
|
+
### colors
|
95
95
|
|
96
96
|
Colors to use for the confetti particles. Pass string array of colors. Can use hex colors, named colors, CSS Variables, literally anything valid in plain CSS.
|
97
97
|
|
@@ -105,7 +105,25 @@ Colors to use for the confetti particles. Pass string array of colors. Can use h
|
|
105
105
|
<ConfettiExplosion colors={['var(--yellow)', 'var(--red)', '#2E3191', '#41BBC7']} />
|
106
106
|
```
|
107
107
|
|
108
|
-
|
108
|
+
### particlesShape
|
109
|
+
|
110
|
+
Shape of particles to use. Can be `mix`, `circles` or `rectangles`
|
111
|
+
|
112
|
+
`mix` will use both circles and rectangles
|
113
|
+
`circles` will use only circles
|
114
|
+
`rectangles` will use only rectangles
|
115
|
+
|
116
|
+
**type:** `'mix' | 'circles' | 'rectangles'`
|
117
|
+
|
118
|
+
**Default value:** `'mix'`
|
119
|
+
|
120
|
+
**Example:**
|
121
|
+
|
122
|
+
```svelte
|
123
|
+
<ConfettiExplosion particlesShape="circles" />
|
124
|
+
```
|
125
|
+
|
126
|
+
### force
|
109
127
|
|
110
128
|
Force of the confetti particles. Between 0 and 1. 0 is no force, 1 is maximum force. Will error out if you pass a value outside of this range.
|
111
129
|
|
@@ -119,7 +137,7 @@ Force of the confetti particles. Between 0 and 1. 0 is no force, 1 is maximum fo
|
|
119
137
|
<ConfettiExplosion force={0.3} />
|
120
138
|
```
|
121
139
|
|
122
|
-
|
140
|
+
### stageHeight
|
123
141
|
|
124
142
|
Height of the stage in pixels. Confetti will only fall within this height.
|
125
143
|
|
@@ -133,7 +151,7 @@ Height of the stage in pixels. Confetti will only fall within this height.
|
|
133
151
|
<ConfettiExplosion stageHeight={500} />
|
134
152
|
```
|
135
153
|
|
136
|
-
|
154
|
+
### stageWidth
|
137
155
|
|
138
156
|
Width of the stage in pixels. Confetti will only fall within this width.
|
139
157
|
|
@@ -147,7 +165,7 @@ Width of the stage in pixels. Confetti will only fall within this width.
|
|
147
165
|
<ConfettiExplosion stageWidth={500} />
|
148
166
|
```
|
149
167
|
|
150
|
-
|
168
|
+
### shouldDestroyAfterDone
|
151
169
|
|
152
170
|
Whether or not destroy all confetti nodes after the `duration` period has passed. By default it destroys all nodes, to free up memory.
|
153
171
|
|
@@ -161,12 +179,33 @@ Whether or not destroy all confetti nodes after the `duration` period has passed
|
|
161
179
|
<ConfettiExplosion shouldDestroyAfterDone={false} />
|
162
180
|
```
|
163
181
|
|
164
|
-
|
182
|
+
## Style Props
|
183
|
+
|
184
|
+
You can specify two style props on the component: `--x` and `--y`. These will shift the confetti particles on the x and y axis. by how much you specify, These can be in `px`, `em`, `rem`, `vh`, `vw`, literally any valid CSS unit.
|
185
|
+
|
186
|
+
**USAGE:**
|
187
|
+
|
188
|
+
```svelte
|
189
|
+
<ConfettiExplosion --x="10px" --y="10px" />
|
190
|
+
```
|
191
|
+
|
192
|
+
## Examples
|
193
|
+
|
194
|
+
[Basic Example](https://svelte.dev/repl/4e41a080739a4427a1f2c98b7f5d4b24?version=3.44.2)
|
195
|
+
|
196
|
+
[Confetti where mouse click](https://svelte.dev/repl/dbe0ab06c34f4f25aa6f948fdd1982c7?version=3.44.2)
|
197
|
+
|
198
|
+
## Performance
|
165
199
|
|
166
200
|
This library functions by creating 2 DOM nodes for every single confetti. By default, if the `particlesCount` is set to 150, it will create 300 nodes. This is a lot of nodes. For most devices, these many nodes are not a big issue, but I recommend checking your target devices' performance if you choose to go with a higher number, like 400 or 500.
|
167
201
|
|
168
202
|
Also, after the specified `duration`, all the confetti DOM nodes will be destroyed. This is to free up memory. If you wish to keep them around, set `shouldDestroyAfterDone` to `false`.
|
169
203
|
|
170
|
-
|
204
|
+
## License
|
171
205
|
|
172
206
|
MIT License
|
207
|
+
© [Puru Vijay](https://twitter.com/puruvjdev)
|
208
|
+
|
209
|
+
```
|
210
|
+
|
211
|
+
```
|
package/package.json
CHANGED
@@ -1,23 +1,31 @@
|
|
1
1
|
{
|
2
2
|
"name": "svelte-confetti-explosion",
|
3
|
-
"version": "0.0
|
4
|
-
"
|
5
|
-
"
|
6
|
-
|
7
|
-
|
8
|
-
"
|
9
|
-
"sass": "^1.43.4",
|
10
|
-
"svelte": "^3.44.2",
|
11
|
-
"svelte-check": "^2.2.10",
|
12
|
-
"svelte-preprocess": "^4.9.8",
|
13
|
-
"svelte2tsx": "^0.4.10",
|
14
|
-
"tslib": "^2.3.1",
|
15
|
-
"typescript": "^4.5.2"
|
3
|
+
"version": "0.2.0",
|
4
|
+
"description": "Confetti explosion in Svelte 🎉🎊",
|
5
|
+
"author": "Puru Vijay",
|
6
|
+
"license": "MIT",
|
7
|
+
"bugs": {
|
8
|
+
"url": "https://github.com/PuruVJ/svelte-confetti-explosion/issues"
|
16
9
|
},
|
17
|
-
"
|
18
|
-
"
|
19
|
-
"
|
10
|
+
"sideEffects": false,
|
11
|
+
"repository": {
|
12
|
+
"type": "git",
|
13
|
+
"url": "git+https://github.com/PuruVJ/svelte-confetti-explosion.git"
|
20
14
|
},
|
15
|
+
"svelte": "index.js",
|
16
|
+
"keywords": [
|
17
|
+
"confetti",
|
18
|
+
"party",
|
19
|
+
"fun",
|
20
|
+
"badass",
|
21
|
+
"badassery",
|
22
|
+
"svelte",
|
23
|
+
"sveltekit",
|
24
|
+
"small",
|
25
|
+
"tiny",
|
26
|
+
"performant"
|
27
|
+
],
|
28
|
+
"type": "module",
|
21
29
|
"exports": {
|
22
30
|
"./package.json": "./package.json",
|
23
31
|
"./ConfettiExplosion.svelte": "./ConfettiExplosion.svelte",
|