@@ -10,6 +10,11 @@ export interface Sparkle {
10
10
delay : number ;
11
11
}
12
12
13
+ interface ContainerSize {
14
+ width : number ;
15
+ height : number ;
16
+ }
17
+
13
18
const BUTTON_SPARKLES : Sparkle [ ] = [
14
19
{ x : 20 , y : 0 , scale : 1 , delay : 500 } ,
15
20
{ x : 15 , y : 15 , scale : 0.75 , delay : 3500 } ,
@@ -41,7 +46,7 @@ export function generateProgressSparkle(): Sparkle {
41
46
42
47
43
48
const sparkleTemplate = template ( `<svg viewBox="0 0 7 7" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em"><use href="#star-sparkle"></use></svg>` ) ;
44
- function renderSparkle ( sparkle : Sparkle , isDiv ?: boolean ) {
49
+ function renderSparkle ( sparkle : Sparkle , isDiv ?: boolean , containerSize ?: ContainerSize ) {
45
50
let element : HTMLElement ;
46
51
if ( isDiv ) {
47
52
element = document . createElement ( 'div' ) ;
@@ -51,31 +56,34 @@ function renderSparkle(sparkle: Sparkle, isDiv?: boolean) {
51
56
}
52
57
53
58
element . classList . add ( 'sparkles-sparkle' ) ;
54
- element . style . setProperty ( '--sparkle-tx' , sparkle . translateX + '%' ) ;
55
- element . style . setProperty ( '--sparkle-ty' , sparkle . translateY + '%' ) ;
59
+ element . style . setProperty ( '--sparkle-tx' , containerSize ? sparkle . translateX / 100 * containerSize . width + 'px' : sparkle . translateX + '%' ) ;
60
+ element . style . setProperty ( '--sparkle-ty' , containerSize ? sparkle . translateY / 100 * containerSize . height + 'px' : sparkle . translateY + '%' ) ;
56
61
element . style . setProperty ( '--sparkle-scale' , sparkle . scale * ( Math . random ( ) * 0.5 + 0.25 ) + '' ) ;
57
62
element . style . setProperty ( '--sparkle-rotate' , ( Math . random ( ) * 90 - 45 ) * 4 + 'deg' ) ;
58
63
element . style . transform = `scale(${ sparkle . scale } )` ;
59
- element . style . top = sparkle . y + '%' ;
60
- element . style . left = sparkle . x + '%' ;
64
+ element . style . top = containerSize ? sparkle . y / 100 * containerSize . height + 'px' : sparkle . y + '%' ;
65
+ element . style . left = containerSize ? sparkle . x / 100 * containerSize . width + 'px' : sparkle . x + '%' ;
61
66
element . style . animationDelay = '-' + sparkle . delay + 'ms' ;
62
67
return element ;
63
68
}
64
69
65
- export type SparklesProps = { isDiv ?: boolean } & ( { mode : 'button' } | { mode : 'progress' , count : number } ) ;
70
+ export type SparklesProps = {
71
+ isDiv ?: boolean ,
72
+ containerSize ?: ContainerSize
73
+ } & ( { mode : 'button' } | { mode : 'progress' , count : number } ) ;
66
74
67
75
export function Sparkles ( props : SparklesProps ) : HTMLDivElement {
68
76
const container = document . createElement ( 'div' ) ;
69
77
container . classList . add ( 'sparkles-container' ) ;
70
78
71
79
if ( props . mode === 'button' ) {
72
- container . append ( ...BUTTON_SPARKLES . map ( ( sparkle ) => renderSparkle ( sparkle , props . isDiv ) ) ) ;
80
+ container . append ( ...BUTTON_SPARKLES . map ( ( sparkle ) => renderSparkle ( sparkle , props . isDiv , props . containerSize ) ) ) ;
73
81
} else {
74
82
createEffect ( on ( ( ) => props . count , ( next , prev = 0 ) => {
75
83
const diff = next - prev ;
76
84
if ( diff > 0 ) {
77
85
for ( let i = 0 ; i < diff ; i ++ ) {
78
- container . appendChild ( renderSparkle ( generateProgressSparkle ( ) , props . isDiv ) ) ;
86
+ container . appendChild ( renderSparkle ( generateProgressSparkle ( ) , props . isDiv , props . containerSize ) ) ;
79
87
}
80
88
} else if ( diff < 0 ) {
81
89
for ( let i = 0 ; i < - diff ; i ++ ) {
0 commit comments