60 lines
991 B
TypeScript
60 lines
991 B
TypeScript
|
import { confetti } from 'https://esm.sh/@tsparticles/confetti@3.0.3'
|
||
|
import { IS_BROWSER } from '$fresh/runtime.ts'
|
||
|
|
||
|
let fireworks: HTMLAudioElement | null
|
||
|
if (IS_BROWSER) {
|
||
|
fireworks = new Audio('/fireworks.mp3')
|
||
|
}
|
||
|
|
||
|
export function excitement() {
|
||
|
if (IS_BROWSER) {
|
||
|
const count = 200,
|
||
|
defaults = {
|
||
|
origin: { y: 0.7 },
|
||
|
}
|
||
|
|
||
|
if (fireworks) fireworks.play()
|
||
|
|
||
|
// deno-lint-ignore no-inner-declarations
|
||
|
function fire(particleRatio: number, opts: {
|
||
|
spread?: number
|
||
|
startVelocity?: number
|
||
|
decay?: number
|
||
|
scalar?: number
|
||
|
}) {
|
||
|
confetti(
|
||
|
Object.assign({}, defaults, opts, {
|
||
|
particleCount: Math.floor(count * particleRatio),
|
||
|
}),
|
||
|
)
|
||
|
}
|
||
|
|
||
|
fire(0.25, {
|
||
|
spread: 26,
|
||
|
startVelocity: 55,
|
||
|
})
|
||
|
|
||
|
fire(0.2, {
|
||
|
spread: 60,
|
||
|
})
|
||
|
|
||
|
fire(0.35, {
|
||
|
spread: 100,
|
||
|
decay: 0.91,
|
||
|
scalar: 0.8,
|
||
|
})
|
||
|
|
||
|
fire(0.1, {
|
||
|
spread: 120,
|
||
|
startVelocity: 25,
|
||
|
decay: 0.92,
|
||
|
scalar: 1.2,
|
||
|
})
|
||
|
|
||
|
fire(0.1, {
|
||
|
spread: 120,
|
||
|
startVelocity: 45,
|
||
|
})
|
||
|
}
|
||
|
}
|