Files
donutbrowser/src/lib/confetti.ts
T
2026-07-18 11:42:07 +04:00

46 lines
1.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import confetti from "canvas-confetti";
/**
* Donut-sprinkle confetti: small rounded bars tinted with the active theme's
* chart colors. Used for celebration moments (e.g. a successful profile
* import). Callers must skip it under prefers-reduced-motion.
*/
// A 12×6 capsule — reads as a donut sprinkle at small scale.
const SPRINKLE_PATH = "M3 0 h6 a3 3 0 0 1 0 6 h-6 a3 3 0 0 1 0 -6 z";
function themeChartColors(): string[] {
const styles = getComputedStyle(document.documentElement);
const colors = [1, 2, 3, 4, 5]
.map((i) => styles.getPropertyValue(`--chart-${i}`).trim())
.filter(Boolean);
return colors.length > 0 ? colors : ["#888888"];
}
export function fireSprinkleConfetti(): void {
const sprinkle = confetti.shapeFromPath({ path: SPRINKLE_PATH });
const colors = themeChartColors();
const fire = (particleCount: number, opts: confetti.Options = {}) => {
void confetti({
particleCount,
spread: 75,
startVelocity: 42,
scalar: 0.9,
ticks: 130,
shapes: [sprinkle],
colors,
origin: { y: 0.65 },
...opts,
});
};
fire(70);
window.setTimeout(() => {
fire(45, { angle: 60, origin: { x: 0.2, y: 0.7 } });
}, 180);
window.setTimeout(() => {
fire(45, { angle: 120, origin: { x: 0.8, y: 0.7 } });
}, 360);
}