@sarthak03dot/romantic-animations 1.2.0 → 1.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"romantic-animations.umd.js","sources":["../src/core/engine.js","../src/animations/floatingHearts.js","../src/animations/heartTrail.js","../src/animations/heartBurst.js","../src/animations/sparkles.js","../src/animations/loveRain.js","../src/animations/confetti.js","../src/animations/fireworks.js","../src/animations/starField.js","../src/animations/butterfly.js","../src/animations/magicDust.js","../src/animations/floatingOrbs.js","../src/animations/shootingStars.js","../src/index.js"],"sourcesContent":["/**\n * romantic-animations — core engine\n * Handles canvas creation, sizing, resize observation, and cleanup.\n */\n\nconst DEFAULT_OPTIONS = {\n zIndex: 0,\n};\n\n/**\n * Initialises a canvas inside the given container element.\n *\n * @param {string|HTMLElement} containerIdOrEl – element id OR element reference\n * @param {object} userOptions – optional overrides\n * @returns {{ canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D,\n * options: object, destroy: Function }}\n */\nexport function initCanvas(containerIdOrEl, userOptions = {}) {\n const options = Object.assign({}, DEFAULT_OPTIONS, userOptions);\n\n const container =\n typeof containerIdOrEl === 'string'\n ? document.getElementById(containerIdOrEl)\n : containerIdOrEl;\n\n if (!container) {\n throw new Error(\n `[romantic-animations] Container \"${containerIdOrEl}\" not found in the DOM.`\n );\n }\n\n // Remove any pre-existing canvas we created (clean slate when re-triggering)\n const old = container.querySelector('canvas[data-ra]');\n if (old) old.remove();\n\n const canvas = document.createElement('canvas');\n canvas.setAttribute('data-ra', '1');\n canvas.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n pointer-events: none;\n z-index: ${options.zIndex};\n `;\n\n const resize = () => {\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n };\n resize();\n\n container.style.position = container.style.position || 'relative';\n container.appendChild(canvas);\n\n // Keep canvas sized to container\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n\n const ctx = canvas.getContext('2d');\n\n /** Tear-down helper – call the returned destroy() to stop & clean up */\n function destroy() {\n ro.disconnect();\n canvas.remove();\n }\n\n return { canvas, ctx, options, destroy };\n}\n\n/**\n * Merge user options with animation-specific defaults.\n */\nexport function mergeOptions(defaults, userOptions = {}) {\n return Object.assign({}, defaults, userOptions);\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n count: 0.12, // hearts spawned per frame (probability)\n minSize: 14,\n maxSize: 32,\n minSpeed: 0.8,\n maxSpeed: 2.4,\n colors: ['#ff6b8a', '#ff4d6d', '#ff85a1', '#ffc2d1', '#ff0a54', '#ff477e'],\n wobble: true, // horizontal sine drift\n glow: true,\n};\n\n/**\n * Draw a proper heart shape centred at (cx, cy) with given radius.\n */\nfunction drawHeartShape(ctx, cx, cy, r, color, alpha = 1, glow = false) {\n ctx.save();\n ctx.globalAlpha = alpha;\n if (glow) {\n ctx.shadowColor = color;\n ctx.shadowBlur = r * 1.2;\n }\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(cx, cy + r * 0.3);\n // left lobe\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\n // right lobe\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\n ctx.fill();\n ctx.restore();\n}\n\nexport function floatingHearts(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const hearts = [];\n let running = true;\n let frame = 0;\n\n function createHeart() {\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\n return {\n x: Math.random() * canvas.width,\n y: canvas.height + size * 2,\n size,\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n alpha: 0.7 + Math.random() * 0.3,\n wobbleOffset: Math.random() * Math.PI * 2,\n wobbleSpeed: 0.02 + Math.random() * 0.03,\n wobbleAmount: 0.5 + Math.random() * 1.5,\n };\n }\n\n function animate() {\n if (!running) return;\n frame++;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (Math.random() < opts.count) hearts.push(createHeart());\n\n for (let i = hearts.length - 1; i >= 0; i--) {\n const h = hearts[i];\n h.y -= h.speed;\n h.wobbleOffset += h.wobbleSpeed;\n const xOffset = opts.wobble ? Math.sin(h.wobbleOffset) * h.wobbleAmount * h.size * 0.5 : 0;\n\n // Fade out near top\n const fadeAlpha = Math.min(h.alpha, h.y / (canvas.height * 0.2));\n if (fadeAlpha <= 0 || h.y < -h.size * 3) {\n hearts.splice(i, 1);\n continue;\n }\n\n drawHeartShape(ctx, h.x + xOffset, h.y, h.size, h.color, Math.max(0, fadeAlpha), opts.glow);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n minSize: 6,\n maxSize: 16,\n decay: 0.025,\n colors: ['#ff6b8a', '#ff4d6d', '#ff85a1', '#ffc2d1', '#c9184a'],\n glow: true,\n};\n\nfunction drawHeart(ctx, cx, cy, r, color, alpha, glow) {\n ctx.save();\n ctx.globalAlpha = Math.max(0, alpha);\n if (glow) {\n ctx.shadowColor = color;\n ctx.shadowBlur = r * 2;\n }\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(cx, cy + r * 0.3);\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\n ctx.fill();\n ctx.restore();\n}\n\nexport function heartTrail(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const hearts = [];\n let running = true;\n\n function addHeart(x, y) {\n hearts.push({\n x,\n y,\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\n alpha: 0.9 + Math.random() * 0.1,\n decay: opts.decay * (0.8 + Math.random() * 0.4),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n vy: -(0.3 + Math.random() * 0.6), // drift upward\n });\n }\n\n // Mouse support\n const onMouseMove = (e) => {\n const rect = canvas.getBoundingClientRect();\n addHeart(e.clientX - rect.left, e.clientY - rect.top);\n };\n\n // Touch support\n const onTouchMove = (e) => {\n const rect = canvas.getBoundingClientRect();\n Array.from(e.touches).forEach((t) => {\n addHeart(t.clientX - rect.left, t.clientY - rect.top);\n });\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('touchmove', onTouchMove, { passive: true });\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = hearts.length - 1; i >= 0; i--) {\n const h = hearts[i];\n h.y += h.vy;\n drawHeart(ctx, h.x, h.y, h.size, h.color, h.alpha, opts.glow);\n h.alpha -= h.decay;\n if (h.alpha <= 0) hearts.splice(i, 1);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('touchmove', onTouchMove);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n count: 20, // hearts per burst\n minSize: 8,\n maxSize: 20,\n minSpeed: 2,\n maxSpeed: 7,\n gravity: 0.08,\n decay: 0.018,\n colors: ['#ff0a54', '#ff477e', '#ff7096', '#ff85a1', '#fbb1bd', '#ff4d6d'],\n glow: true,\n symbols: ['heart'], // 'heart' | 'star' | 'sparkle'\n};\n\nfunction drawSymbol(ctx, type, cx, cy, r, color, alpha, glow) {\n ctx.save();\n ctx.globalAlpha = Math.max(0, alpha);\n if (glow) { ctx.shadowColor = color; ctx.shadowBlur = r * 2; }\n ctx.fillStyle = color;\n\n if (type === 'star') {\n // 5-point star\n ctx.beginPath();\n for (let i = 0; i < 5; i++) {\n const outer = (Math.PI / 2) + (i * 2 * Math.PI) / 5;\n const inner = outer + Math.PI / 5;\n if (i === 0) ctx.moveTo(cx + r * Math.cos(outer), cy - r * Math.sin(outer));\n else ctx.lineTo(cx + r * Math.cos(outer), cy - r * Math.sin(outer));\n ctx.lineTo(cx + (r * 0.4) * Math.cos(inner), cy - (r * 0.4) * Math.sin(inner));\n }\n ctx.closePath();\n ctx.fill();\n } else if (type === 'sparkle') {\n // 4-point sparkle\n for (let i = 0; i < 4; i++) {\n const a = (i * Math.PI) / 2;\n ctx.beginPath();\n ctx.ellipse(cx + Math.cos(a) * r * 0.5, cy + Math.sin(a) * r * 0.5, r * 0.18, r * 0.7, a, 0, Math.PI * 2);\n ctx.fill();\n }\n } else {\n // heart\n ctx.beginPath();\n ctx.moveTo(cx, cy + r * 0.3);\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\n ctx.fill();\n }\n ctx.restore();\n}\n\nexport function heartBurst(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const particles = [];\n let running = true;\n\n function spawnBurst(x, y) {\n for (let i = 0; i < opts.count; i++) {\n const angle = Math.random() * Math.PI * 2;\n const speed = opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed);\n particles.push({\n x, y,\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n alpha: 1,\n decay: opts.decay * (0.8 + Math.random() * 0.4),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n symbol: opts.symbols[Math.floor(Math.random() * opts.symbols.length)],\n });\n }\n }\n\n const onClick = (e) => {\n const rect = canvas.getBoundingClientRect();\n spawnBurst(e.clientX - rect.left, e.clientY - rect.top);\n };\n const onTouch = (e) => {\n const rect = canvas.getBoundingClientRect();\n Array.from(e.changedTouches).forEach((t) => spawnBurst(t.clientX - rect.left, t.clientY - rect.top));\n };\n\n window.addEventListener('click', onClick);\n window.addEventListener('touchend', onTouch, { passive: true });\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = particles.length - 1; i >= 0; i--) {\n const p = particles[i];\n p.x += p.vx;\n p.y += p.vy;\n p.vy += opts.gravity; // gravity\n p.alpha -= p.decay;\n drawSymbol(ctx, p.symbol, p.x, p.y, p.size, p.color, p.alpha, opts.glow);\n if (p.alpha <= 0) particles.splice(i, 1);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n window.removeEventListener('click', onClick);\n window.removeEventListener('touchend', onTouch);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n count: 80, // number of sparkles alive at once\n minSize: 2,\n maxSize: 6,\n speed: 0.5,\n twinkleSpeed: 0.04,\n colors: ['#fff', '#ffe4e8', '#ffb3c1', '#ff85a1', '#ffd6ff', '#e7c6ff'],\n glow: true,\n};\n\nexport function sparkles(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const stars = [];\n let running = true;\n\n function createStar() {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\n alpha: Math.random(),\n alphaDir: Math.random() > 0.5 ? 1 : -1,\n twinkleSpeed: opts.twinkleSpeed * (0.5 + Math.random()),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n vx: (Math.random() - 0.5) * opts.speed,\n vy: (Math.random() - 0.5) * opts.speed,\n };\n }\n\n // Populate initial stars\n for (let i = 0; i < opts.count; i++) stars.push(createStar());\n\n function drawStar(s) {\n ctx.save();\n ctx.globalAlpha = Math.max(0, Math.min(1, s.alpha));\n if (opts.glow) { ctx.shadowColor = s.color; ctx.shadowBlur = s.size * 3; }\n ctx.fillStyle = s.color;\n\n // Cross / sparkle shape\n const r = s.size;\n ctx.beginPath();\n for (let i = 0; i < 4; i++) {\n const a = (i * Math.PI) / 2;\n ctx.ellipse(\n s.x + Math.cos(a) * r * 0.35,\n s.y + Math.sin(a) * r * 0.35,\n r * 0.15, r * 0.7, a, 0, Math.PI * 2\n );\n }\n ctx.fill();\n\n // Tiny centre dot\n ctx.beginPath();\n ctx.arc(s.x, s.y, r * 0.2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = 0; i < stars.length; i++) {\n const s = stars[i];\n s.x += s.vx;\n s.y += s.vy;\n s.alpha += s.alphaDir * s.twinkleSpeed;\n\n if (s.alpha >= 1) { s.alpha = 1; s.alphaDir = -1; }\n else if (s.alpha <= 0) { s.alpha = 0; s.alphaDir = 1; }\n\n // Wrap edges\n if (s.x < -10) s.x = canvas.width + 10;\n if (s.x > canvas.width + 10) s.x = -10;\n if (s.y < -10) s.y = canvas.height + 10;\n if (s.y > canvas.height + 10) s.y = -10;\n\n drawStar(s);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n density: 0.15, // probability of a new drop per frame\n symbols: ['❤', '💕', '✨', '💖', '💗', '⭐', '×'],\n minSize: 12,\n maxSize: 28,\n minSpeed: 1,\n maxSpeed: 3.5,\n colors: ['#ff6b8a', '#ff4d6d', '#ffc2d1', '#ff85a1', '#ff0a54', '#a2d2ff'],\n opacity: 0.85,\n glow: true,\n};\n\nexport function loveRain(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const drops = [];\n let running = true;\n\n function createDrop() {\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\n return {\n x: Math.random() * canvas.width,\n y: -size * 2,\n size,\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\n symbol: opts.symbols[Math.floor(Math.random() * opts.symbols.length)],\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n alpha: 0.4 + Math.random() * 0.6,\n angle: (Math.random() - 0.5) * 0.4, // slight tilt\n wobble: Math.random() * Math.PI * 2,\n wobbleSpeed: 0.02 + Math.random() * 0.02,\n };\n }\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (Math.random() < opts.density) drops.push(createDrop());\n\n for (let i = drops.length - 1; i >= 0; i--) {\n const d = drops[i];\n d.y += d.speed;\n d.wobble += d.wobbleSpeed;\n const xOff = Math.sin(d.wobble) * d.size * 0.3;\n\n ctx.save();\n ctx.globalAlpha = d.alpha * opts.opacity;\n ctx.font = `${d.size}px serif`;\n ctx.fillStyle = d.color;\n if (opts.glow) { ctx.shadowColor = d.color; ctx.shadowBlur = d.size * 0.8; }\n ctx.translate(d.x + xOff, d.y);\n ctx.rotate(d.angle);\n ctx.fillText(d.symbol, 0, 0);\n ctx.restore();\n\n if (d.y > canvas.height + d.size * 2) drops.splice(i, 1);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n density: 0.18,\n colors: ['#ff6b8a','#ff4d6d','#ffd6ff','#e7c6ff','#c77dff','#48cae4','#ffe66d','#06d6a0'],\n minSize: 6,\n maxSize: 14,\n minSpeed: 1.5,\n maxSpeed: 4,\n gravity: 0.06,\n drag: 0.99,\n shapes: ['rect', 'circle', 'ribbon'],\n};\n\nexport function confetti(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const pieces = [];\n let running = true;\n\n function createPiece() {\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\n const speed = opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed);\n return {\n x: Math.random() * canvas.width,\n y: -size * 2,\n w: size,\n h: size * (0.4 + Math.random() * 0.8),\n vx: (Math.random() - 0.5) * 3,\n vy: speed,\n angle: Math.random() * Math.PI * 2,\n spin: (Math.random() - 0.5) * 0.15,\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n alpha: 0.8 + Math.random() * 0.2,\n shape: opts.shapes[Math.floor(Math.random() * opts.shapes.length)],\n };\n }\n\n function drawPiece(p) {\n ctx.save();\n ctx.globalAlpha = p.alpha;\n ctx.fillStyle = p.color;\n ctx.strokeStyle = p.color;\n ctx.translate(p.x, p.y);\n ctx.rotate(p.angle);\n\n if (p.shape === 'circle') {\n ctx.beginPath();\n ctx.ellipse(0, 0, p.w / 2, p.h / 2, 0, 0, Math.PI * 2);\n ctx.fill();\n } else if (p.shape === 'ribbon') {\n ctx.beginPath();\n ctx.moveTo(-p.w / 2, 0);\n ctx.quadraticCurveTo(0, -p.h, p.w / 2, 0);\n ctx.quadraticCurveTo(0, p.h, -p.w / 2, 0);\n ctx.fill();\n } else {\n ctx.fillRect(-p.w / 2, -p.h / 2, p.w, p.h);\n }\n ctx.restore();\n }\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (Math.random() < opts.density) pieces.push(createPiece());\n\n for (let i = pieces.length - 1; i >= 0; i--) {\n const p = pieces[i];\n p.vy += opts.gravity;\n p.vx *= opts.drag;\n p.vy *= opts.drag;\n p.x += p.vx;\n p.y += p.vy;\n p.angle += p.spin;\n\n drawPiece(p);\n\n if (p.y > canvas.height + 20) pieces.splice(i, 1);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n interval: 1200, // ms between auto-launches\n trailLength: 28,\n particleCount: 80,\n colors: ['#ff6b8a','#ff4d6d','#ffd6ff','#e7c6ff','#ffe66d','#06d6a0','#48cae4','#ffffff'],\n gravity: 0.09,\n decay: 0.014,\n glow: true,\n};\n\nexport function fireworks(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n let running = true;\n\n const rockets = []; // { x, y, vx, vy, trail[], color }\n const particles = []; // burst particles\n\n function launchRocket() {\n const x = canvas.width * (0.2 + Math.random() * 0.6);\n const targetY = canvas.height * (0.1 + Math.random() * 0.4);\n const dy = targetY - canvas.height;\n const speed = 8 + Math.random() * 5;\n const color = opts.colors[Math.floor(Math.random() * opts.colors.length)];\n rockets.push({ x, y: canvas.height, vy: -Math.abs(speed), targetY, trail: [], color });\n }\n\n function burst(x, y, color) {\n for (let i = 0; i < opts.particleCount; i++) {\n const angle = Math.random() * Math.PI * 2;\n const speed = 1 + Math.random() * 5;\n particles.push({\n x, y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n alpha: 1,\n decay: opts.decay * (0.7 + Math.random() * 0.6),\n size: 2 + Math.random() * 3,\n color,\n });\n }\n }\n\n // Auto-launch interval\n const iv = setInterval(() => { if (running) launchRocket(); }, opts.interval);\n launchRocket(); // fire one immediately\n\n function animate() {\n if (!running) return;\n\n // Clear canvas instead of using a solid fill to keep background transparent\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw rockets\n for (let i = rockets.length - 1; i >= 0; i--) {\n const r = rockets[i];\n r.y += r.vy;\n r.trail.push({ x: r.x, y: r.y });\n if (r.trail.length > opts.trailLength) r.trail.shift();\n\n // Draw trail\n for (let t = 0; t < r.trail.length; t++) {\n const alpha = (t / r.trail.length) * 0.8;\n ctx.save();\n ctx.globalAlpha = alpha;\n if (opts.glow) { ctx.shadowColor = r.color; ctx.shadowBlur = 6; }\n ctx.fillStyle = r.color;\n ctx.beginPath();\n ctx.arc(r.trail[t].x, r.trail[t].y, 2.5 * (t / r.trail.length), 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n if (r.y <= r.targetY) {\n burst(r.x, r.y, r.color);\n rockets.splice(i, 1);\n }\n }\n\n // Draw burst particles\n for (let i = particles.length - 1; i >= 0; i--) {\n const p = particles[i];\n p.x += p.vx;\n p.y += p.vy;\n p.vy += opts.gravity;\n p.alpha -= p.decay;\n\n ctx.save();\n ctx.globalAlpha = Math.max(0, p.alpha);\n if (opts.glow) { ctx.shadowColor = p.color; ctx.shadowBlur = p.size * 2; }\n ctx.fillStyle = p.color;\n ctx.beginPath();\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n if (p.alpha <= 0) particles.splice(i, 1);\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n clearInterval(iv);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n starCount: 120,\n speed: 0.4,\n colors: ['#ffffff', '#ffe4e8', '#ffc2d1', '#e7c6ff', '#a2d2ff'],\n minSize: 1,\n maxSize: 3.5,\n twinkle: true,\n connectDist: 100, // draw faint lines between close stars\n connectOpacity: 0.08,\n};\n\nexport function starField(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const stars = [];\n let running = true;\n\n function createStar(randomY = false) {\n return {\n x: Math.random() * canvas.width,\n y: randomY ? Math.random() * canvas.height : Math.random() * canvas.height,\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\n alpha: 0.3 + Math.random() * 0.7,\n alphaDir: Math.random() > 0.5 ? 1 : -1,\n twinkleSpeed: 0.008 + Math.random() * 0.015,\n vx: (Math.random() - 0.5) * opts.speed,\n vy: (Math.random() - 0.5) * opts.speed,\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n };\n }\n\n for (let i = 0; i < opts.starCount; i++) stars.push(createStar(true));\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw connections\n if (opts.connectDist > 0) {\n for (let i = 0; i < stars.length; i++) {\n for (let j = i + 1; j < stars.length; j++) {\n const dx = stars[i].x - stars[j].x;\n const dy = stars[i].y - stars[j].y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < opts.connectDist) {\n ctx.save();\n ctx.globalAlpha = opts.connectOpacity * (1 - dist / opts.connectDist);\n ctx.strokeStyle = '#ffffff';\n ctx.lineWidth = 0.5;\n ctx.beginPath();\n ctx.moveTo(stars[i].x, stars[i].y);\n ctx.lineTo(stars[j].x, stars[j].y);\n ctx.stroke();\n ctx.restore();\n }\n }\n }\n }\n\n // Draw stars\n for (let i = 0; i < stars.length; i++) {\n const s = stars[i];\n s.x += s.vx;\n s.y += s.vy;\n\n if (opts.twinkle) {\n s.alpha += s.alphaDir * s.twinkleSpeed;\n if (s.alpha >= 1) { s.alpha = 1; s.alphaDir = -1; }\n if (s.alpha <= 0.1) { s.alpha = 0.1; s.alphaDir = 1; }\n }\n\n // Wrap\n if (s.x < -5) s.x = canvas.width + 5;\n if (s.x > canvas.width + 5) s.x = -5;\n if (s.y < -5) s.y = canvas.height + 5;\n if (s.y > canvas.height + 5) s.y = -5;\n\n ctx.save();\n ctx.globalAlpha = s.alpha;\n ctx.shadowColor = s.color;\n ctx.shadowBlur = s.size * 3;\n ctx.fillStyle = s.color;\n ctx.beginPath();\n ctx.arc(s.x, s.y, s.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n density: 0.05, // Spawn probability per frame\n colors: ['#c77dff', '#ff85a1', '#ffc2d1', '#48cae4', '#e7c6ff', '#fbb1bd'],\n minSize: 10,\n maxSize: 22,\n minSpeed: 0.8,\n maxSpeed: 2.2,\n glow: true,\n};\n\nexport function butterflies(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const items = [];\n let running = true;\n let time = 0;\n\n function spawn() {\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\n return {\n x: -size * 2,\n y: canvas.height * 0.1 + Math.random() * (canvas.height * 0.8),\n size,\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n alpha: 0,\n flapSpeed: 0.1 + Math.random() * 0.15,\n flapOffset: Math.random() * Math.PI * 2,\n wobbleSpeed: 0.01 + Math.random() * 0.02,\n wobbleOffset: Math.random() * Math.PI * 2,\n };\n }\n\n function animate() {\n if (!running) return;\n time++;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (Math.random() < opts.density) items.push(spawn());\n\n for (let i = items.length - 1; i >= 0; i--) {\n const b = items[i];\n b.x += b.speed;\n b.y += Math.sin(time * b.wobbleSpeed + b.wobbleOffset) * 1.5;\n \n // Fade in smoothly\n if (b.alpha < 1 && b.x < canvas.width / 2) b.alpha += 0.02;\n \n // Flapping wing calculation\n const wingSpread = Math.abs(Math.sin(time * b.flapSpeed + b.flapOffset));\n\n ctx.save();\n ctx.globalAlpha = Math.min(1, b.alpha);\n ctx.translate(b.x, b.y);\n // Slight tilt upwards\n ctx.rotate(-0.1 - (wingSpread * 0.1));\n \n if (opts.glow) {\n ctx.shadowColor = b.color;\n ctx.shadowBlur = b.size * 1.5;\n }\n ctx.fillStyle = b.color;\n \n // Draw wings\n ctx.beginPath();\n // Left/back wing (narrower based on wingSpread)\n ctx.ellipse(-b.size * 0.2, 0, b.size * 0.4 * wingSpread, b.size * 0.5, 0.3, 0, Math.PI * 2);\n ctx.fill();\n \n ctx.beginPath();\n // Right/front wing\n ctx.ellipse(b.size * 0.3 * wingSpread, -b.size * 0.1, b.size * 0.5 * wingSpread, b.size * 0.6, -0.2, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n if (b.x > canvas.width + b.size * 2) {\n items.splice(i, 1);\n }\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n particleCount: 150,\n minSize: 1,\n maxSize: 4,\n colors: ['#ffd6ff', '#e7c6ff', '#c77dff', '#ffb3c1', '#ffffff'],\n speed: 0.8,\n glow: true,\n};\n\nexport function magicDust(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const dusts = [];\n let running = true;\n let time = 0;\n\n function createDust() {\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n angle: Math.random() * Math.PI * 2,\n orbitRadius: 20 + Math.random() * 80,\n orbitSpeed: (0.01 + Math.random() * 0.03) * (Math.random() > 0.5 ? 1 : -1),\n centerX: Math.random() * canvas.width,\n centerY: canvas.height + 50, // Start below and move up\n upwardSpeed: opts.speed + Math.random() * 1.5,\n alpha: 0,\n };\n }\n\n for (let i = 0; i < opts.particleCount; i++) {\n dusts.push(createDust());\n // Scatter initial positions so they aren't all at the bottom\n dusts[i].centerY = Math.random() * canvas.height;\n dusts[i].alpha = Math.random();\n }\n\n function animate() {\n if (!running) return;\n time++;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = 0; i < dusts.length; i++) {\n const d = dusts[i];\n d.angle += d.orbitSpeed;\n d.centerY -= d.upwardSpeed;\n\n // Swirling calculation\n d.x = d.centerX + Math.cos(d.angle) * d.orbitRadius + Math.sin(time * 0.01 + d.angle) * 30;\n d.y = d.centerY + Math.sin(d.angle) * (d.orbitRadius * 0.5);\n\n if (d.alpha < 1 && d.centerY > 0) d.alpha += 0.01;\n\n // Reset when they reach top\n if (d.y < -50) {\n Object.assign(d, createDust());\n d.centerY = canvas.height + 50;\n d.centerX = Math.random() * canvas.width;\n }\n\n ctx.save();\n ctx.globalAlpha = d.alpha;\n if (opts.glow) {\n ctx.shadowColor = d.color;\n ctx.shadowBlur = d.size * 3;\n }\n ctx.fillStyle = d.color;\n ctx.beginPath();\n ctx.arc(d.x, d.y, d.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n orbCount: 15,\n minSize: 50,\n maxSize: 150,\n colors: ['#ff4d6d', '#c77dff', '#48cae4', '#ffe66d'],\n speed: 0.5,\n glow: true,\n};\n\nexport function floatingOrbs(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const orbs = [];\n let running = true;\n\n function createOrb() {\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\n return {\n x: Math.random() * canvas.width,\n y: Math.random() * canvas.height,\n size,\n vx: (Math.random() - 0.5) * opts.speed,\n vy: (Math.random() - 0.5) * opts.speed,\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n alpha: 0,\n };\n }\n\n for (let i = 0; i < opts.orbCount; i++) {\n const orb = createOrb();\n orb.alpha = Math.random() * 0.5 + 0.1;\n orbs.push(orb);\n }\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = 0; i < orbs.length; i++) {\n const b = orbs[i];\n b.x += b.vx;\n b.y += b.vy;\n\n // Bounce off walls\n if (b.x < -b.size) b.x = canvas.width + b.size;\n if (b.x > canvas.width + b.size) b.x = -b.size;\n if (b.y < -b.size) b.y = canvas.height + b.size;\n if (b.y > canvas.height + b.size) b.y = -b.size;\n\n ctx.save();\n ctx.globalAlpha = b.alpha;\n ctx.globalCompositeOperation = 'screen';\n \n const gradient = ctx.createRadialGradient(b.x, b.y, 0, b.x, b.y, b.size);\n gradient.addColorStop(0, b.color);\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\n \n ctx.fillStyle = gradient;\n ctx.beginPath();\n ctx.arc(b.x, b.y, b.size, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","import { mergeOptions } from '../core/engine.js';\n\nconst DEFAULTS = {\n density: 0.02,\n minSpeed: 10,\n maxSpeed: 25,\n colors: ['#ffffff', '#e7c6ff', '#48cae4', '#ffe66d'],\n glow: true,\n};\n\nexport function shootingStars(canvas, userOptions = {}) {\n const opts = mergeOptions(DEFAULTS, userOptions);\n const ctx = canvas.getContext('2d');\n const stars = [];\n let running = true;\n\n function createStar() {\n return {\n x: Math.random() * canvas.width * 1.5,\n y: -50,\n length: 50 + Math.random() * 100,\n thickness: 1 + Math.random() * 2,\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\n angle: (Math.PI / 4) + (Math.random() * 0.2 - 0.1), // Roughly 45 degrees\n opacity: 1,\n };\n }\n\n function animate() {\n if (!running) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n if (Math.random() < opts.density) {\n stars.push(createStar());\n }\n\n for (let i = stars.length - 1; i >= 0; i--) {\n const s = stars[i];\n const vx = -Math.cos(s.angle) * s.speed;\n const vy = Math.sin(s.angle) * s.speed;\n \n s.x += vx;\n s.y += vy;\n s.opacity -= 0.01;\n\n ctx.save();\n ctx.globalAlpha = Math.max(0, s.opacity);\n if (opts.glow) {\n ctx.shadowColor = s.color;\n ctx.shadowBlur = s.thickness * 4;\n }\n \n const grad = ctx.createLinearGradient(s.x, s.y, s.x - vx * (s.length / s.speed), s.y - vy * (s.length / s.speed));\n grad.addColorStop(0, s.color);\n grad.addColorStop(1, 'rgba(255,255,255,0)');\n \n ctx.strokeStyle = grad;\n ctx.lineWidth = s.thickness;\n ctx.lineCap = 'round';\n \n ctx.beginPath();\n ctx.moveTo(s.x, s.y);\n ctx.lineTo(s.x - vx * (s.length / s.speed), s.y - vy * (s.length / s.speed));\n ctx.stroke();\n ctx.restore();\n\n if (s.opacity <= 0 || s.x < -100 || s.y > canvas.height + 100) {\n stars.splice(i, 1);\n }\n }\n\n requestAnimationFrame(animate);\n }\n\n animate();\n\n return function stop() {\n running = false;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n };\n}\n","/**\n * romantic-animations v2.0.0\n * ───────────────────────────────────────────────────────\n * A rich collection of canvas-based romantic & celebratory\n * animations for the web.\n *\n * Usage (ESM):\n * import { startFloatingHearts, stopAll } from '@sarthak03dot/romantic-animations';\n * startFloatingHearts('my-container');\n *\n * Usage (UMD / CDN):\n * <script src=\"...romantic-animations.umd.js\"></script>\n * <script>\n * RomanticAnimations.startFloatingHearts('my-container');\n * </script>\n * ───────────────────────────────────────────────────────\n */\n\nimport { initCanvas } from './core/engine.js';\nimport { floatingHearts } from './animations/floatingHearts.js';\nimport { heartTrail } from './animations/heartTrail.js';\nimport { heartBurst } from './animations/heartBurst.js';\nimport { sparkles } from './animations/sparkles.js';\nimport { loveRain } from './animations/loveRain.js';\nimport { confetti } from './animations/confetti.js';\nimport { fireworks } from './animations/fireworks.js';\nimport { starField } from './animations/starField.js';\nimport { butterflies } from './animations/butterfly.js';\nimport { magicDust } from './animations/magicDust.js';\nimport { floatingOrbs } from './animations/floatingOrbs.js';\nimport { shootingStars } from './animations/shootingStars.js';\n\n// Track active sessions so stopAll() can clean up everything\nconst _sessions = new Map(); // containerId → { destroy, stop }\nlet _sessionId = 0;\n\n/**\n * Internal helper — boots a canvas and starts an animation fn.\n * Returns a numeric session id that can be passed to stopAnimation().\n *\n * @param {string|HTMLElement} containerId\n * @param {Function} animFn – the animation factory\n * @param {object} options – user options forwarded to the animation\n * @returns {number} session id\n */\nfunction _run(containerId, animFn, options = {}) {\n const { canvas, destroy } = initCanvas(containerId, options);\n const stop = animFn(canvas, options);\n const id = ++_sessionId;\n _sessions.set(id, { destroy, stop });\n return id;\n}\n\n/**\n * Stop a single animation by its session id.\n * @param {number} id – returned by a start* call\n */\nexport function stopAnimation(id) {\n if (_sessions.has(id)) {\n const s = _sessions.get(id);\n if (typeof s.stop === 'function') s.stop();\n s.destroy();\n _sessions.delete(id);\n }\n}\n\n/**\n * Stop every running animation and clean up all canvases.\n */\nexport function stopAll() {\n _sessions.forEach((s) => {\n if (typeof s.stop === 'function') s.stop();\n s.destroy();\n });\n _sessions.clear();\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Floating hearts rising from the bottom.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.count=0.12] – spawn probability per frame (0–1)\n * @param {number} [options.minSize=14]\n * @param {number} [options.maxSize=32]\n * @param {number} [options.minSpeed=0.8]\n * @param {number} [options.maxSpeed=2.4]\n * @param {string[]} [options.colors]\n * @param {boolean} [options.wobble=true] – sine-wave horizontal drift\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startFloatingHearts(containerId, options = {}) {\n return _run(containerId, floatingHearts, options);\n}\n\n/**\n * Heart trail that follows the cursor / touch.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.minSize=6]\n * @param {number} [options.maxSize=16]\n * @param {number} [options.decay=0.025]\n * @param {string[]} [options.colors]\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startHeartTrail(containerId, options = {}) {\n return _run(containerId, heartTrail, options);\n}\n\n/**\n * Heart burst on click / tap.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.count=20] – particles per burst\n * @param {string[]} [options.symbols] – 'heart' | 'star' | 'sparkle'\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startHeartBurst(containerId, options = {}) {\n return _run(containerId, heartBurst, options);\n}\n\n/**\n * Twinkling sparkle stars.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.count=80]\n * @param {number} [options.speed=0.5]\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startSparkles(containerId, options = {}) {\n return _run(containerId, sparkles, options);\n}\n\n/**\n * Rain of love emojis / symbols drifting downward.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.density=0.15]\n * @param {string[]} [options.symbols] – array of strings / emoji\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startLoveRain(containerId, options = {}) {\n return _run(containerId, loveRain, options);\n}\n\n/**\n * Colourful confetti raining down.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.density=0.18]\n * @param {string[]} [options.colors]\n * @param {string[]} [options.shapes] – 'rect' | 'circle' | 'ribbon'\n * @returns {number} session id\n */\nexport function startConfetti(containerId, options = {}) {\n return _run(containerId, confetti, options);\n}\n\n/**\n * Fireworks that auto-launch on an interval.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.interval=1200] – ms between launches\n * @param {number} [options.particleCount=80]\n * @param {boolean} [options.glow=true]\n * @returns {number} session id\n */\nexport function startFireworks(containerId, options = {}) {\n return _run(containerId, fireworks, options);\n}\n\n/**\n * Drifting star field with optional constellation lines.\n * @param {string|HTMLElement} containerId\n * @param {object} [options]\n * @param {number} [options.starCount=120]\n * @param {number} [options.speed=0.4]\n * @param {boolean} [options.twinkle=true]\n * @param {number} [options.connectDist=100] – set to 0 to disable lines\n * @returns {number} session id\n */\nexport function startStarField(containerId, options = {}) {\n return _run(containerId, starField, options);\n}\n\nexport function startButterflies(containerId, options = {}) {\n return _run(containerId, butterflies, options);\n}\n\nexport function startMagicDust(containerId, options = {}) {\n return _run(containerId, magicDust, options);\n}\n\nexport function startFloatingOrbs(containerId, options = {}) {\n return _run(containerId, floatingOrbs, options);\n}\n\nexport function startShootingStars(containerId, options = {}) {\n return _run(containerId, shootingStars, options);\n}\n\n// ─── Default export (convenient for UMD / CDN namespace) ──────────────────────\nexport default {\n startFloatingHearts,\n startHeartTrail,\n startHeartBurst,\n startSparkles,\n startLoveRain,\n startConfetti,\n startFireworks,\n startStarField,\n startButterflies,\n startMagicDust,\n startFloatingOrbs,\n startShootingStars,\n stopAnimation,\n stopAll,\n};\n"],"names":["DEFAULT_OPTIONS","initCanvas","containerIdOrEl","userOptions","options","container","old","canvas","resize","ro","ctx","destroy","mergeOptions","defaults","DEFAULTS","drawHeartShape","cx","cy","r","color","alpha","glow","floatingHearts","opts","hearts","running","createHeart","size","animate","i","h","xOffset","fadeAlpha","drawHeart","heartTrail","addHeart","x","y","onMouseMove","e","rect","onTouchMove","t","drawSymbol","type","outer","inner","a","heartBurst","particles","spawnBurst","angle","speed","onClick","onTouch","p","sparkles","stars","createStar","drawStar","s","loveRain","drops","createDrop","d","xOff","confetti","pieces","createPiece","drawPiece","fireworks","rockets","launchRocket","targetY","burst","iv","starField","randomY","j","dx","dy","dist","butterflies","items","time","spawn","b","wingSpread","magicDust","dusts","createDust","floatingOrbs","orbs","createOrb","orb","gradient","shootingStars","vx","vy","grad","_sessions","_sessionId","_run","containerId","animFn","stop","id","stopAnimation","stopAll","startFloatingHearts","startHeartTrail","startHeartBurst","startSparkles","startLoveRain","startConfetti","startFireworks","startStarField","startButterflies","startMagicDust","startFloatingOrbs","startShootingStars","index"],"mappings":"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"}
1
+ {"version":3,"file":"romantic-animations.umd.js","sources":["../src/core/engine.js","../src/animations/floatingHearts.js","../src/animations/heartTrail.js","../src/animations/heartBurst.js","../src/animations/sparkles.js","../src/animations/loveRain.js","../src/animations/confetti.js","../src/animations/fireworks.js","../src/animations/starField.js","../src/animations/butterfly.js","../src/animations/magicDust.js","../src/animations/floatingOrbs.js","../src/animations/shootingStars.js","../src/index.js"],"sourcesContent":["/**\r\n * romantic-animations — core engine\r\n * Handles canvas creation, sizing, resize observation, and cleanup.\r\n */\r\n\r\nconst DEFAULT_OPTIONS = {\r\n zIndex: 0,\r\n};\r\n\r\n/**\r\n * Initialises a canvas inside the given container element.\r\n *\r\n * @param {string|HTMLElement} containerIdOrEl – element id OR element reference\r\n * @param {object} userOptions – optional overrides\r\n * @returns {{ canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D,\r\n * options: object, destroy: Function }}\r\n */\r\nexport function initCanvas(containerIdOrEl, userOptions = {}) {\r\n const options = Object.assign({}, DEFAULT_OPTIONS, userOptions);\r\n\r\n const container =\r\n typeof containerIdOrEl === 'string'\r\n ? document.getElementById(containerIdOrEl)\r\n : containerIdOrEl;\r\n\r\n if (!container) {\r\n throw new Error(\r\n `[romantic-animations] Container \"${containerIdOrEl}\" not found in the DOM.`\r\n );\r\n }\r\n\r\n // Remove any pre-existing canvas we created (clean slate when re-triggering)\r\n const old = container.querySelector('canvas[data-ra]');\r\n if (old) old.remove();\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.setAttribute('data-ra', '1');\r\n canvas.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100vw;\r\n height: 100vh;\r\n pointer-events: none;\r\n z-index: ${options.zIndex};\r\n `;\r\n\r\n const resize = () => {\r\n canvas.width = window.innerWidth;\r\n canvas.height = window.innerHeight;\r\n };\r\n resize();\r\n\r\n container.style.position = container.style.position || 'relative';\r\n container.appendChild(canvas);\r\n\r\n // Keep canvas sized to container\r\n const ro = new ResizeObserver(resize);\r\n ro.observe(container);\r\n\r\n const ctx = canvas.getContext('2d');\r\n\r\n /** Tear-down helper – call the returned destroy() to stop & clean up */\r\n function destroy() {\r\n ro.disconnect();\r\n canvas.remove();\r\n }\r\n\r\n return { canvas, ctx, options, destroy };\r\n}\r\n\r\n/**\r\n * Merge user options with animation-specific defaults.\r\n */\r\nexport function mergeOptions(defaults, userOptions = {}) {\r\n return Object.assign({}, defaults, userOptions);\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n count: 0.12, // hearts spawned per frame (probability)\r\n minSize: 14,\r\n maxSize: 32,\r\n minSpeed: 0.8,\r\n maxSpeed: 2.4,\r\n colors: ['#ff6b8a', '#ff4d6d', '#ff85a1', '#ffc2d1', '#ff0a54', '#ff477e'],\r\n wobble: true, // horizontal sine drift\r\n glow: true,\r\n};\r\n\r\n/**\r\n * Draw a proper heart shape centred at (cx, cy) with given radius.\r\n */\r\nfunction drawHeartShape(ctx, cx, cy, r, color, alpha = 1, glow = false) {\r\n ctx.save();\r\n ctx.globalAlpha = alpha;\r\n if (glow) {\r\n ctx.shadowColor = color;\r\n ctx.shadowBlur = r * 1.2;\r\n }\r\n ctx.fillStyle = color;\r\n ctx.beginPath();\r\n ctx.moveTo(cx, cy + r * 0.3);\r\n // left lobe\r\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\r\n // right lobe\r\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nexport function floatingHearts(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const hearts = [];\r\n let running = true;\r\n let frame = 0;\r\n\r\n function createHeart() {\r\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: canvas.height + size * 2,\r\n size,\r\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n alpha: 0.7 + Math.random() * 0.3,\r\n wobbleOffset: Math.random() * Math.PI * 2,\r\n wobbleSpeed: 0.02 + Math.random() * 0.03,\r\n wobbleAmount: 0.5 + Math.random() * 1.5,\r\n };\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n frame++;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (Math.random() < opts.count) hearts.push(createHeart());\r\n\r\n for (let i = hearts.length - 1; i >= 0; i--) {\r\n const h = hearts[i];\r\n h.y -= h.speed;\r\n h.wobbleOffset += h.wobbleSpeed;\r\n const xOffset = opts.wobble ? Math.sin(h.wobbleOffset) * h.wobbleAmount * h.size * 0.5 : 0;\r\n\r\n // Fade out near top\r\n const fadeAlpha = Math.min(h.alpha, h.y / (canvas.height * 0.2));\r\n if (fadeAlpha <= 0 || h.y < -h.size * 3) {\r\n hearts.splice(i, 1);\r\n continue;\r\n }\r\n\r\n drawHeartShape(ctx, h.x + xOffset, h.y, h.size, h.color, Math.max(0, fadeAlpha), opts.glow);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n minSize: 6,\r\n maxSize: 16,\r\n decay: 0.025,\r\n colors: ['#ff6b8a', '#ff4d6d', '#ff85a1', '#ffc2d1', '#c9184a'],\r\n glow: true,\r\n};\r\n\r\nfunction drawHeart(ctx, cx, cy, r, color, alpha, glow) {\r\n ctx.save();\r\n ctx.globalAlpha = Math.max(0, alpha);\r\n if (glow) {\r\n ctx.shadowColor = color;\r\n ctx.shadowBlur = r * 2;\r\n }\r\n ctx.fillStyle = color;\r\n ctx.beginPath();\r\n ctx.moveTo(cx, cy + r * 0.3);\r\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\r\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\r\n ctx.fill();\r\n ctx.restore();\r\n}\r\n\r\nexport function heartTrail(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const hearts = [];\r\n let running = true;\r\n\r\n function addHeart(x, y) {\r\n hearts.push({\r\n x,\r\n y,\r\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\r\n alpha: 0.9 + Math.random() * 0.1,\r\n decay: opts.decay * (0.8 + Math.random() * 0.4),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n vy: -(0.3 + Math.random() * 0.6), // drift upward\r\n });\r\n }\r\n\r\n // Mouse support\r\n const onMouseMove = (e) => {\r\n const rect = canvas.getBoundingClientRect();\r\n addHeart(e.clientX - rect.left, e.clientY - rect.top);\r\n };\r\n\r\n // Touch support\r\n const onTouchMove = (e) => {\r\n const rect = canvas.getBoundingClientRect();\r\n Array.from(e.touches).forEach((t) => {\r\n addHeart(t.clientX - rect.left, t.clientY - rect.top);\r\n });\r\n };\r\n\r\n window.addEventListener('mousemove', onMouseMove);\r\n window.addEventListener('touchmove', onTouchMove, { passive: true });\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = hearts.length - 1; i >= 0; i--) {\r\n const h = hearts[i];\r\n h.y += h.vy;\r\n drawHeart(ctx, h.x, h.y, h.size, h.color, h.alpha, opts.glow);\r\n h.alpha -= h.decay;\r\n if (h.alpha <= 0) hearts.splice(i, 1);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n window.removeEventListener('mousemove', onMouseMove);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n count: 20, // hearts per burst\r\n minSize: 8,\r\n maxSize: 20,\r\n minSpeed: 2,\r\n maxSpeed: 7,\r\n gravity: 0.08,\r\n decay: 0.018,\r\n colors: ['#ff0a54', '#ff477e', '#ff7096', '#ff85a1', '#fbb1bd', '#ff4d6d'],\r\n glow: true,\r\n symbols: ['heart'], // 'heart' | 'star' | 'sparkle'\r\n};\r\n\r\nfunction drawSymbol(ctx, type, cx, cy, r, color, alpha, glow) {\r\n ctx.save();\r\n ctx.globalAlpha = Math.max(0, alpha);\r\n if (glow) { ctx.shadowColor = color; ctx.shadowBlur = r * 2; }\r\n ctx.fillStyle = color;\r\n\r\n if (type === 'star') {\r\n // 5-point star\r\n ctx.beginPath();\r\n for (let i = 0; i < 5; i++) {\r\n const outer = (Math.PI / 2) + (i * 2 * Math.PI) / 5;\r\n const inner = outer + Math.PI / 5;\r\n if (i === 0) ctx.moveTo(cx + r * Math.cos(outer), cy - r * Math.sin(outer));\r\n else ctx.lineTo(cx + r * Math.cos(outer), cy - r * Math.sin(outer));\r\n ctx.lineTo(cx + (r * 0.4) * Math.cos(inner), cy - (r * 0.4) * Math.sin(inner));\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n } else if (type === 'sparkle') {\r\n // 4-point sparkle\r\n for (let i = 0; i < 4; i++) {\r\n const a = (i * Math.PI) / 2;\r\n ctx.beginPath();\r\n ctx.ellipse(cx + Math.cos(a) * r * 0.5, cy + Math.sin(a) * r * 0.5, r * 0.18, r * 0.7, a, 0, Math.PI * 2);\r\n ctx.fill();\r\n }\r\n } else {\r\n // heart\r\n ctx.beginPath();\r\n ctx.moveTo(cx, cy + r * 0.3);\r\n ctx.bezierCurveTo(cx - r * 1.1, cy - r * 0.5, cx - r * 1.6, cy + r * 0.5, cx, cy + r * 1.4);\r\n ctx.bezierCurveTo(cx + r * 1.6, cy + r * 0.5, cx + r * 1.1, cy - r * 0.5, cx, cy + r * 0.3);\r\n ctx.fill();\r\n }\r\n ctx.restore();\r\n}\r\n\r\nexport function heartBurst(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const particles = [];\r\n let running = true;\r\n\r\n function spawnBurst(x, y) {\r\n for (let i = 0; i < opts.count; i++) {\r\n const angle = Math.random() * Math.PI * 2;\r\n const speed = opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed);\r\n particles.push({\r\n x, y,\r\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\r\n vx: Math.cos(angle) * speed,\r\n vy: Math.sin(angle) * speed,\r\n alpha: 1,\r\n decay: opts.decay * (0.8 + Math.random() * 0.4),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n symbol: opts.symbols[Math.floor(Math.random() * opts.symbols.length)],\r\n });\r\n }\r\n }\r\n\r\n const onClick = (e) => {\r\n const rect = canvas.getBoundingClientRect();\r\n spawnBurst(e.clientX - rect.left, e.clientY - rect.top);\r\n };\r\n const onTouch = (e) => {\r\n const rect = canvas.getBoundingClientRect();\r\n Array.from(e.changedTouches).forEach((t) => spawnBurst(t.clientX - rect.left, t.clientY - rect.top));\r\n };\r\n\r\n window.addEventListener('click', onClick);\r\n window.addEventListener('touchend', onTouch, { passive: true });\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = particles.length - 1; i >= 0; i--) {\r\n const p = particles[i];\r\n p.x += p.vx;\r\n p.y += p.vy;\r\n p.vy += opts.gravity; // gravity\r\n p.alpha -= p.decay;\r\n drawSymbol(ctx, p.symbol, p.x, p.y, p.size, p.color, p.alpha, opts.glow);\r\n if (p.alpha <= 0) particles.splice(i, 1);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n window.removeEventListener('click', onClick);\r\n window.removeEventListener('touchend', onTouch);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n count: 80, // number of sparkles alive at once\r\n minSize: 2,\r\n maxSize: 6,\r\n speed: 0.5,\r\n twinkleSpeed: 0.04,\r\n colors: ['#fff', '#ffe4e8', '#ffb3c1', '#ff85a1', '#ffd6ff', '#e7c6ff'],\r\n glow: true,\r\n};\r\n\r\nexport function sparkles(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const stars = [];\r\n let running = true;\r\n\r\n function createStar() {\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: Math.random() * canvas.height,\r\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\r\n alpha: Math.random(),\r\n alphaDir: Math.random() > 0.5 ? 1 : -1,\r\n twinkleSpeed: opts.twinkleSpeed * (0.5 + Math.random()),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n vx: (Math.random() - 0.5) * opts.speed,\r\n vy: (Math.random() - 0.5) * opts.speed,\r\n };\r\n }\r\n\r\n // Populate initial stars\r\n for (let i = 0; i < opts.count; i++) stars.push(createStar());\r\n\r\n function drawStar(s) {\r\n ctx.save();\r\n ctx.globalAlpha = Math.max(0, Math.min(1, s.alpha));\r\n if (opts.glow) { ctx.shadowColor = s.color; ctx.shadowBlur = s.size * 3; }\r\n ctx.fillStyle = s.color;\r\n\r\n // Cross / sparkle shape\r\n const r = s.size;\r\n ctx.beginPath();\r\n for (let i = 0; i < 4; i++) {\r\n const a = (i * Math.PI) / 2;\r\n ctx.ellipse(\r\n s.x + Math.cos(a) * r * 0.35,\r\n s.y + Math.sin(a) * r * 0.35,\r\n r * 0.15, r * 0.7, a, 0, Math.PI * 2\r\n );\r\n }\r\n ctx.fill();\r\n\r\n // Tiny centre dot\r\n ctx.beginPath();\r\n ctx.arc(s.x, s.y, r * 0.2, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = 0; i < stars.length; i++) {\r\n const s = stars[i];\r\n s.x += s.vx;\r\n s.y += s.vy;\r\n s.alpha += s.alphaDir * s.twinkleSpeed;\r\n\r\n if (s.alpha >= 1) { s.alpha = 1; s.alphaDir = -1; }\r\n else if (s.alpha <= 0) { s.alpha = 0; s.alphaDir = 1; }\r\n\r\n // Wrap edges\r\n if (s.x < -10) s.x = canvas.width + 10;\r\n if (s.x > canvas.width + 10) s.x = -10;\r\n if (s.y < -10) s.y = canvas.height + 10;\r\n if (s.y > canvas.height + 10) s.y = -10;\r\n\r\n drawStar(s);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n density: 0.15, // probability of a new drop per frame\r\n symbols: ['❤', '💕', '✨', '💖', '💗', '⭐', '×'],\r\n minSize: 12,\r\n maxSize: 28,\r\n minSpeed: 1,\r\n maxSpeed: 3.5,\r\n colors: ['#ff6b8a', '#ff4d6d', '#ffc2d1', '#ff85a1', '#ff0a54', '#a2d2ff'],\r\n opacity: 0.85,\r\n glow: true,\r\n};\r\n\r\nexport function loveRain(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const drops = [];\r\n let running = true;\r\n\r\n function createDrop() {\r\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: -size * 2,\r\n size,\r\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\r\n symbol: opts.symbols[Math.floor(Math.random() * opts.symbols.length)],\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n alpha: 0.4 + Math.random() * 0.6,\r\n angle: (Math.random() - 0.5) * 0.4, // slight tilt\r\n wobble: Math.random() * Math.PI * 2,\r\n wobbleSpeed: 0.02 + Math.random() * 0.02,\r\n };\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (Math.random() < opts.density) drops.push(createDrop());\r\n\r\n for (let i = drops.length - 1; i >= 0; i--) {\r\n const d = drops[i];\r\n d.y += d.speed;\r\n d.wobble += d.wobbleSpeed;\r\n const xOff = Math.sin(d.wobble) * d.size * 0.3;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = d.alpha * opts.opacity;\r\n ctx.font = `${d.size}px serif`;\r\n ctx.fillStyle = d.color;\r\n if (opts.glow) { ctx.shadowColor = d.color; ctx.shadowBlur = d.size * 0.8; }\r\n ctx.translate(d.x + xOff, d.y);\r\n ctx.rotate(d.angle);\r\n ctx.fillText(d.symbol, 0, 0);\r\n ctx.restore();\r\n\r\n if (d.y > canvas.height + d.size * 2) drops.splice(i, 1);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n density: 0.18,\r\n colors: ['#ff6b8a','#ff4d6d','#ffd6ff','#e7c6ff','#c77dff','#48cae4','#ffe66d','#06d6a0'],\r\n minSize: 6,\r\n maxSize: 14,\r\n minSpeed: 1.5,\r\n maxSpeed: 4,\r\n gravity: 0.06,\r\n drag: 0.99,\r\n shapes: ['rect', 'circle', 'ribbon'],\r\n};\r\n\r\nexport function confetti(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const pieces = [];\r\n let running = true;\r\n\r\n function createPiece() {\r\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\r\n const speed = opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed);\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: -size * 2,\r\n w: size,\r\n h: size * (0.4 + Math.random() * 0.8),\r\n vx: (Math.random() - 0.5) * 3,\r\n vy: speed,\r\n angle: Math.random() * Math.PI * 2,\r\n spin: (Math.random() - 0.5) * 0.15,\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n alpha: 0.8 + Math.random() * 0.2,\r\n shape: opts.shapes[Math.floor(Math.random() * opts.shapes.length)],\r\n };\r\n }\r\n\r\n function drawPiece(p) {\r\n ctx.save();\r\n ctx.globalAlpha = p.alpha;\r\n ctx.fillStyle = p.color;\r\n ctx.strokeStyle = p.color;\r\n ctx.translate(p.x, p.y);\r\n ctx.rotate(p.angle);\r\n\r\n if (p.shape === 'circle') {\r\n ctx.beginPath();\r\n ctx.ellipse(0, 0, p.w / 2, p.h / 2, 0, 0, Math.PI * 2);\r\n ctx.fill();\r\n } else if (p.shape === 'ribbon') {\r\n ctx.beginPath();\r\n ctx.moveTo(-p.w / 2, 0);\r\n ctx.quadraticCurveTo(0, -p.h, p.w / 2, 0);\r\n ctx.quadraticCurveTo(0, p.h, -p.w / 2, 0);\r\n ctx.fill();\r\n } else {\r\n ctx.fillRect(-p.w / 2, -p.h / 2, p.w, p.h);\r\n }\r\n ctx.restore();\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (Math.random() < opts.density) pieces.push(createPiece());\r\n\r\n for (let i = pieces.length - 1; i >= 0; i--) {\r\n const p = pieces[i];\r\n p.vy += opts.gravity;\r\n p.vx *= opts.drag;\r\n p.vy *= opts.drag;\r\n p.x += p.vx;\r\n p.y += p.vy;\r\n p.angle += p.spin;\r\n\r\n drawPiece(p);\r\n\r\n if (p.y > canvas.height + 20) pieces.splice(i, 1);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n interval: 1200, // ms between auto-launches\r\n trailLength: 28,\r\n particleCount: 80,\r\n colors: ['#ff6b8a','#ff4d6d','#ffd6ff','#e7c6ff','#ffe66d','#06d6a0','#48cae4','#ffffff'],\r\n gravity: 0.09,\r\n decay: 0.014,\r\n glow: true,\r\n};\r\n\r\nexport function fireworks(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n let running = true;\r\n\r\n const rockets = []; // { x, y, vx, vy, trail[], color }\r\n const particles = []; // burst particles\r\n\r\n function launchRocket() {\r\n const x = canvas.width * (0.2 + Math.random() * 0.6);\r\n const targetY = canvas.height * (0.1 + Math.random() * 0.4);\r\n const dy = targetY - canvas.height;\r\n const speed = 8 + Math.random() * 5;\r\n const color = opts.colors[Math.floor(Math.random() * opts.colors.length)];\r\n rockets.push({ x, y: canvas.height, vy: -Math.abs(speed), targetY, trail: [], color });\r\n }\r\n\r\n function burst(x, y, color) {\r\n for (let i = 0; i < opts.particleCount; i++) {\r\n const angle = Math.random() * Math.PI * 2;\r\n const speed = 1 + Math.random() * 5;\r\n particles.push({\r\n x, y,\r\n vx: Math.cos(angle) * speed,\r\n vy: Math.sin(angle) * speed,\r\n alpha: 1,\r\n decay: opts.decay * (0.7 + Math.random() * 0.6),\r\n size: 2 + Math.random() * 3,\r\n color,\r\n });\r\n }\r\n }\r\n\r\n // Auto-launch interval\r\n const iv = setInterval(() => { if (running) launchRocket(); }, opts.interval);\r\n launchRocket(); // fire one immediately\r\n\r\n function animate() {\r\n if (!running) return;\r\n\r\n // Clear canvas instead of using a solid fill to keep background transparent\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Draw rockets\r\n for (let i = rockets.length - 1; i >= 0; i--) {\r\n const r = rockets[i];\r\n r.y += r.vy;\r\n r.trail.push({ x: r.x, y: r.y });\r\n if (r.trail.length > opts.trailLength) r.trail.shift();\r\n\r\n // Draw trail\r\n for (let t = 0; t < r.trail.length; t++) {\r\n const alpha = (t / r.trail.length) * 0.8;\r\n ctx.save();\r\n ctx.globalAlpha = alpha;\r\n if (opts.glow) { ctx.shadowColor = r.color; ctx.shadowBlur = 6; }\r\n ctx.fillStyle = r.color;\r\n ctx.beginPath();\r\n ctx.arc(r.trail[t].x, r.trail[t].y, 2.5 * (t / r.trail.length), 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n if (r.y <= r.targetY) {\r\n burst(r.x, r.y, r.color);\r\n rockets.splice(i, 1);\r\n }\r\n }\r\n\r\n // Draw burst particles\r\n for (let i = particles.length - 1; i >= 0; i--) {\r\n const p = particles[i];\r\n p.x += p.vx;\r\n p.y += p.vy;\r\n p.vy += opts.gravity;\r\n p.alpha -= p.decay;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = Math.max(0, p.alpha);\r\n if (opts.glow) { ctx.shadowColor = p.color; ctx.shadowBlur = p.size * 2; }\r\n ctx.fillStyle = p.color;\r\n ctx.beginPath();\r\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n\r\n if (p.alpha <= 0) particles.splice(i, 1);\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n clearInterval(iv);\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n starCount: 120,\r\n speed: 0.4,\r\n colors: ['#ffffff', '#ffe4e8', '#ffc2d1', '#e7c6ff', '#a2d2ff'],\r\n minSize: 1,\r\n maxSize: 3.5,\r\n twinkle: true,\r\n connectDist: 100, // draw faint lines between close stars\r\n connectOpacity: 0.08,\r\n};\r\n\r\nexport function starField(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const stars = [];\r\n let running = true;\r\n\r\n function createStar(randomY = false) {\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: randomY ? Math.random() * canvas.height : Math.random() * canvas.height,\r\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\r\n alpha: 0.3 + Math.random() * 0.7,\r\n alphaDir: Math.random() > 0.5 ? 1 : -1,\r\n twinkleSpeed: 0.008 + Math.random() * 0.015,\r\n vx: (Math.random() - 0.5) * opts.speed,\r\n vy: (Math.random() - 0.5) * opts.speed,\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n };\r\n }\r\n\r\n for (let i = 0; i < opts.starCount; i++) stars.push(createStar(true));\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Draw connections\r\n if (opts.connectDist > 0) {\r\n for (let i = 0; i < stars.length; i++) {\r\n for (let j = i + 1; j < stars.length; j++) {\r\n const dx = stars[i].x - stars[j].x;\r\n const dy = stars[i].y - stars[j].y;\r\n const dist = Math.sqrt(dx * dx + dy * dy);\r\n if (dist < opts.connectDist) {\r\n ctx.save();\r\n ctx.globalAlpha = opts.connectOpacity * (1 - dist / opts.connectDist);\r\n ctx.strokeStyle = '#ffffff';\r\n ctx.lineWidth = 0.5;\r\n ctx.beginPath();\r\n ctx.moveTo(stars[i].x, stars[i].y);\r\n ctx.lineTo(stars[j].x, stars[j].y);\r\n ctx.stroke();\r\n ctx.restore();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Draw stars\r\n for (let i = 0; i < stars.length; i++) {\r\n const s = stars[i];\r\n s.x += s.vx;\r\n s.y += s.vy;\r\n\r\n if (opts.twinkle) {\r\n s.alpha += s.alphaDir * s.twinkleSpeed;\r\n if (s.alpha >= 1) { s.alpha = 1; s.alphaDir = -1; }\r\n if (s.alpha <= 0.1) { s.alpha = 0.1; s.alphaDir = 1; }\r\n }\r\n\r\n // Wrap\r\n if (s.x < -5) s.x = canvas.width + 5;\r\n if (s.x > canvas.width + 5) s.x = -5;\r\n if (s.y < -5) s.y = canvas.height + 5;\r\n if (s.y > canvas.height + 5) s.y = -5;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = s.alpha;\r\n ctx.shadowColor = s.color;\r\n ctx.shadowBlur = s.size * 3;\r\n ctx.fillStyle = s.color;\r\n ctx.beginPath();\r\n ctx.arc(s.x, s.y, s.size, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n density: 0.05, // Spawn probability per frame\r\n colors: ['#c77dff', '#ff85a1', '#ffc2d1', '#48cae4', '#e7c6ff', '#fbb1bd'],\r\n minSize: 10,\r\n maxSize: 22,\r\n minSpeed: 0.8,\r\n maxSpeed: 2.2,\r\n glow: true,\r\n};\r\n\r\nexport function butterflies(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const items = [];\r\n let running = true;\r\n let time = 0;\r\n\r\n function spawn() {\r\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\r\n return {\r\n x: -size * 2,\r\n y: canvas.height * 0.1 + Math.random() * (canvas.height * 0.8),\r\n size,\r\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n alpha: 0,\r\n flapSpeed: 0.1 + Math.random() * 0.15,\r\n flapOffset: Math.random() * Math.PI * 2,\r\n wobbleSpeed: 0.01 + Math.random() * 0.02,\r\n wobbleOffset: Math.random() * Math.PI * 2,\r\n };\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n time++;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (Math.random() < opts.density) items.push(spawn());\r\n\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const b = items[i];\r\n b.x += b.speed;\r\n b.y += Math.sin(time * b.wobbleSpeed + b.wobbleOffset) * 1.5;\r\n \r\n // Fade in smoothly\r\n if (b.alpha < 1 && b.x < canvas.width / 2) b.alpha += 0.02;\r\n \r\n // Flapping wing calculation\r\n const wingSpread = Math.abs(Math.sin(time * b.flapSpeed + b.flapOffset));\r\n\r\n ctx.save();\r\n ctx.globalAlpha = Math.min(1, b.alpha);\r\n ctx.translate(b.x, b.y);\r\n // Slight tilt upwards\r\n ctx.rotate(-0.1 - (wingSpread * 0.1));\r\n \r\n if (opts.glow) {\r\n ctx.shadowColor = b.color;\r\n ctx.shadowBlur = b.size * 1.5;\r\n }\r\n ctx.fillStyle = b.color;\r\n \r\n // Draw wings\r\n ctx.beginPath();\r\n // Left/back wing (narrower based on wingSpread)\r\n ctx.ellipse(-b.size * 0.2, 0, b.size * 0.4 * wingSpread, b.size * 0.5, 0.3, 0, Math.PI * 2);\r\n ctx.fill();\r\n \r\n ctx.beginPath();\r\n // Right/front wing\r\n ctx.ellipse(b.size * 0.3 * wingSpread, -b.size * 0.1, b.size * 0.5 * wingSpread, b.size * 0.6, -0.2, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n\r\n if (b.x > canvas.width + b.size * 2) {\r\n items.splice(i, 1);\r\n }\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n particleCount: 150,\r\n minSize: 1,\r\n maxSize: 4,\r\n colors: ['#ffd6ff', '#e7c6ff', '#c77dff', '#ffb3c1', '#ffffff'],\r\n speed: 0.8,\r\n glow: true,\r\n};\r\n\r\nexport function magicDust(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const dusts = [];\r\n let running = true;\r\n let time = 0;\r\n\r\n function createDust() {\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: Math.random() * canvas.height,\r\n size: opts.minSize + Math.random() * (opts.maxSize - opts.minSize),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n angle: Math.random() * Math.PI * 2,\r\n orbitRadius: 20 + Math.random() * 80,\r\n orbitSpeed: (0.01 + Math.random() * 0.03) * (Math.random() > 0.5 ? 1 : -1),\r\n centerX: Math.random() * canvas.width,\r\n centerY: canvas.height + 50, // Start below and move up\r\n upwardSpeed: opts.speed + Math.random() * 1.5,\r\n alpha: 0,\r\n };\r\n }\r\n\r\n for (let i = 0; i < opts.particleCount; i++) {\r\n dusts.push(createDust());\r\n // Scatter initial positions so they aren't all at the bottom\r\n dusts[i].centerY = Math.random() * canvas.height;\r\n dusts[i].alpha = Math.random();\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n time++;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = 0; i < dusts.length; i++) {\r\n const d = dusts[i];\r\n d.angle += d.orbitSpeed;\r\n d.centerY -= d.upwardSpeed;\r\n\r\n // Swirling calculation\r\n d.x = d.centerX + Math.cos(d.angle) * d.orbitRadius + Math.sin(time * 0.01 + d.angle) * 30;\r\n d.y = d.centerY + Math.sin(d.angle) * (d.orbitRadius * 0.5);\r\n\r\n if (d.alpha < 1 && d.centerY > 0) d.alpha += 0.01;\r\n\r\n // Reset when they reach top\r\n if (d.y < -50) {\r\n Object.assign(d, createDust());\r\n d.centerY = canvas.height + 50;\r\n d.centerX = Math.random() * canvas.width;\r\n }\r\n\r\n ctx.save();\r\n ctx.globalAlpha = d.alpha;\r\n if (opts.glow) {\r\n ctx.shadowColor = d.color;\r\n ctx.shadowBlur = d.size * 3;\r\n }\r\n ctx.fillStyle = d.color;\r\n ctx.beginPath();\r\n ctx.arc(d.x, d.y, d.size, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n orbCount: 15,\r\n minSize: 50,\r\n maxSize: 150,\r\n colors: ['#ff4d6d', '#c77dff', '#48cae4', '#ffe66d'],\r\n speed: 0.5,\r\n glow: true,\r\n};\r\n\r\nexport function floatingOrbs(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const orbs = [];\r\n let running = true;\r\n\r\n function createOrb() {\r\n const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);\r\n return {\r\n x: Math.random() * canvas.width,\r\n y: Math.random() * canvas.height,\r\n size,\r\n vx: (Math.random() - 0.5) * opts.speed,\r\n vy: (Math.random() - 0.5) * opts.speed,\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n alpha: 0,\r\n };\r\n }\r\n\r\n for (let i = 0; i < opts.orbCount; i++) {\r\n const orb = createOrb();\r\n orb.alpha = Math.random() * 0.5 + 0.1;\r\n orbs.push(orb);\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n for (let i = 0; i < orbs.length; i++) {\r\n const b = orbs[i];\r\n b.x += b.vx;\r\n b.y += b.vy;\r\n\r\n // Bounce off walls\r\n if (b.x < -b.size) b.x = canvas.width + b.size;\r\n if (b.x > canvas.width + b.size) b.x = -b.size;\r\n if (b.y < -b.size) b.y = canvas.height + b.size;\r\n if (b.y > canvas.height + b.size) b.y = -b.size;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = b.alpha;\r\n ctx.globalCompositeOperation = 'screen';\r\n \r\n const gradient = ctx.createRadialGradient(b.x, b.y, 0, b.x, b.y, b.size);\r\n gradient.addColorStop(0, b.color);\r\n gradient.addColorStop(1, 'rgba(0,0,0,0)');\r\n \r\n ctx.fillStyle = gradient;\r\n ctx.beginPath();\r\n ctx.arc(b.x, b.y, b.size, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.restore();\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","import { mergeOptions } from '../core/engine.js';\r\n\r\nconst DEFAULTS = {\r\n density: 0.02,\r\n minSpeed: 10,\r\n maxSpeed: 25,\r\n colors: ['#ffffff', '#e7c6ff', '#48cae4', '#ffe66d'],\r\n glow: true,\r\n};\r\n\r\nexport function shootingStars(canvas, userOptions = {}) {\r\n const opts = mergeOptions(DEFAULTS, userOptions);\r\n const ctx = canvas.getContext('2d');\r\n const stars = [];\r\n let running = true;\r\n\r\n function createStar() {\r\n return {\r\n x: Math.random() * canvas.width * 1.5,\r\n y: -50,\r\n length: 50 + Math.random() * 100,\r\n thickness: 1 + Math.random() * 2,\r\n speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),\r\n color: opts.colors[Math.floor(Math.random() * opts.colors.length)],\r\n angle: (Math.PI / 4) + (Math.random() * 0.2 - 0.1), // Roughly 45 degrees\r\n opacity: 1,\r\n };\r\n }\r\n\r\n function animate() {\r\n if (!running) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (Math.random() < opts.density) {\r\n stars.push(createStar());\r\n }\r\n\r\n for (let i = stars.length - 1; i >= 0; i--) {\r\n const s = stars[i];\r\n const vx = -Math.cos(s.angle) * s.speed;\r\n const vy = Math.sin(s.angle) * s.speed;\r\n \r\n s.x += vx;\r\n s.y += vy;\r\n s.opacity -= 0.01;\r\n\r\n ctx.save();\r\n ctx.globalAlpha = Math.max(0, s.opacity);\r\n if (opts.glow) {\r\n ctx.shadowColor = s.color;\r\n ctx.shadowBlur = s.thickness * 4;\r\n }\r\n \r\n const grad = ctx.createLinearGradient(s.x, s.y, s.x - vx * (s.length / s.speed), s.y - vy * (s.length / s.speed));\r\n grad.addColorStop(0, s.color);\r\n grad.addColorStop(1, 'rgba(255,255,255,0)');\r\n \r\n ctx.strokeStyle = grad;\r\n ctx.lineWidth = s.thickness;\r\n ctx.lineCap = 'round';\r\n \r\n ctx.beginPath();\r\n ctx.moveTo(s.x, s.y);\r\n ctx.lineTo(s.x - vx * (s.length / s.speed), s.y - vy * (s.length / s.speed));\r\n ctx.stroke();\r\n ctx.restore();\r\n\r\n if (s.opacity <= 0 || s.x < -100 || s.y > canvas.height + 100) {\r\n stars.splice(i, 1);\r\n }\r\n }\r\n\r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animate();\r\n\r\n return function stop() {\r\n running = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n };\r\n}\r\n","/**\r\n * romantic-animations v2.0.0\r\n * ───────────────────────────────────────────────────────\r\n * A rich collection of canvas-based romantic & celebratory\r\n * animations for the web.\r\n *\r\n * Usage (ESM):\r\n * import { startFloatingHearts, stopAll } from '@sarthak03dot/romantic-animations';\r\n * startFloatingHearts('my-container');\r\n *\r\n * Usage (UMD / CDN):\r\n * <script src=\"...romantic-animations.umd.js\"></script>\r\n * <script>\r\n * RomanticAnimations.startFloatingHearts('my-container');\r\n * </script>\r\n * ───────────────────────────────────────────────────────\r\n */\r\n\r\nimport { initCanvas } from './core/engine.js';\r\nimport { floatingHearts } from './animations/floatingHearts.js';\r\nimport { heartTrail } from './animations/heartTrail.js';\r\nimport { heartBurst } from './animations/heartBurst.js';\r\nimport { sparkles } from './animations/sparkles.js';\r\nimport { loveRain } from './animations/loveRain.js';\r\nimport { confetti } from './animations/confetti.js';\r\nimport { fireworks } from './animations/fireworks.js';\r\nimport { starField } from './animations/starField.js';\r\nimport { butterflies } from './animations/butterfly.js';\r\nimport { magicDust } from './animations/magicDust.js';\r\nimport { floatingOrbs } from './animations/floatingOrbs.js';\r\nimport { shootingStars } from './animations/shootingStars.js';\r\n\r\n// Track active sessions so stopAll() can clean up everything\r\nconst _sessions = new Map(); // containerId → { destroy, stop }\r\nlet _sessionId = 0;\r\n\r\n/**\r\n * Internal helper — boots a canvas and starts an animation fn.\r\n * Returns a numeric session id that can be passed to stopAnimation().\r\n *\r\n * @param {string|HTMLElement} containerId\r\n * @param {Function} animFn – the animation factory\r\n * @param {object} options – user options forwarded to the animation\r\n * @returns {number} session id\r\n */\r\nfunction _run(containerId, animFn, options = {}) {\r\n const { canvas, destroy } = initCanvas(containerId, options);\r\n const stop = animFn(canvas, options);\r\n const id = ++_sessionId;\r\n _sessions.set(id, { destroy, stop });\r\n return id;\r\n}\r\n\r\n/**\r\n * Stop a single animation by its session id.\r\n * @param {number} id – returned by a start* call\r\n */\r\nexport function stopAnimation(id) {\r\n if (_sessions.has(id)) {\r\n const s = _sessions.get(id);\r\n if (typeof s.stop === 'function') s.stop();\r\n s.destroy();\r\n _sessions.delete(id);\r\n }\r\n}\r\n\r\n/**\r\n * Stop every running animation and clean up all canvases.\r\n */\r\nexport function stopAll() {\r\n _sessions.forEach((s) => {\r\n if (typeof s.stop === 'function') s.stop();\r\n s.destroy();\r\n });\r\n _sessions.clear();\r\n}\r\n\r\n// ─── Public API ───────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Floating hearts rising from the bottom.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.count=0.12] – spawn probability per frame (0–1)\r\n * @param {number} [options.minSize=14]\r\n * @param {number} [options.maxSize=32]\r\n * @param {number} [options.minSpeed=0.8]\r\n * @param {number} [options.maxSpeed=2.4]\r\n * @param {string[]} [options.colors]\r\n * @param {boolean} [options.wobble=true] – sine-wave horizontal drift\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startFloatingHearts(containerId, options = {}) {\r\n return _run(containerId, floatingHearts, options);\r\n}\r\n\r\n/**\r\n * Heart trail that follows the cursor / touch.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.minSize=6]\r\n * @param {number} [options.maxSize=16]\r\n * @param {number} [options.decay=0.025]\r\n * @param {string[]} [options.colors]\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startHeartTrail(containerId, options = {}) {\r\n return _run(containerId, heartTrail, options);\r\n}\r\n\r\n/**\r\n * Heart burst on click / tap.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.count=20] – particles per burst\r\n * @param {string[]} [options.symbols] – 'heart' | 'star' | 'sparkle'\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startHeartBurst(containerId, options = {}) {\r\n return _run(containerId, heartBurst, options);\r\n}\r\n\r\n/**\r\n * Twinkling sparkle stars.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.count=80]\r\n * @param {number} [options.speed=0.5]\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startSparkles(containerId, options = {}) {\r\n return _run(containerId, sparkles, options);\r\n}\r\n\r\n/**\r\n * Rain of love emojis / symbols drifting downward.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.density=0.15]\r\n * @param {string[]} [options.symbols] – array of strings / emoji\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startLoveRain(containerId, options = {}) {\r\n return _run(containerId, loveRain, options);\r\n}\r\n\r\n/**\r\n * Colourful confetti raining down.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.density=0.18]\r\n * @param {string[]} [options.colors]\r\n * @param {string[]} [options.shapes] – 'rect' | 'circle' | 'ribbon'\r\n * @returns {number} session id\r\n */\r\nexport function startConfetti(containerId, options = {}) {\r\n return _run(containerId, confetti, options);\r\n}\r\n\r\n/**\r\n * Fireworks that auto-launch on an interval.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.interval=1200] – ms between launches\r\n * @param {number} [options.particleCount=80]\r\n * @param {boolean} [options.glow=true]\r\n * @returns {number} session id\r\n */\r\nexport function startFireworks(containerId, options = {}) {\r\n return _run(containerId, fireworks, options);\r\n}\r\n\r\n/**\r\n * Drifting star field with optional constellation lines.\r\n * @param {string|HTMLElement} containerId\r\n * @param {object} [options]\r\n * @param {number} [options.starCount=120]\r\n * @param {number} [options.speed=0.4]\r\n * @param {boolean} [options.twinkle=true]\r\n * @param {number} [options.connectDist=100] – set to 0 to disable lines\r\n * @returns {number} session id\r\n */\r\nexport function startStarField(containerId, options = {}) {\r\n return _run(containerId, starField, options);\r\n}\r\n\r\nexport function startButterflies(containerId, options = {}) {\r\n return _run(containerId, butterflies, options);\r\n}\r\n\r\nexport function startMagicDust(containerId, options = {}) {\r\n return _run(containerId, magicDust, options);\r\n}\r\n\r\nexport function startFloatingOrbs(containerId, options = {}) {\r\n return _run(containerId, floatingOrbs, options);\r\n}\r\n\r\nexport function startShootingStars(containerId, options = {}) {\r\n return _run(containerId, shootingStars, options);\r\n}\r\n\r\n// ─── Default export (convenient for UMD / CDN namespace) ──────────────────────\r\nexport default {\r\n startFloatingHearts,\r\n startHeartTrail,\r\n startHeartBurst,\r\n startSparkles,\r\n startLoveRain,\r\n startConfetti,\r\n startFireworks,\r\n startStarField,\r\n startButterflies,\r\n startMagicDust,\r\n startFloatingOrbs,\r\n startShootingStars,\r\n stopAnimation,\r\n stopAll,\r\n};\r\n"],"names":["DEFAULT_OPTIONS","initCanvas","containerIdOrEl","userOptions","options","container","old","canvas","resize","ro","ctx","destroy","mergeOptions","defaults","DEFAULTS","drawHeartShape","cx","cy","r","color","alpha","glow","floatingHearts","opts","hearts","running","createHeart","size","animate","i","h","xOffset","fadeAlpha","drawHeart","heartTrail","addHeart","x","y","onMouseMove","e","rect","onTouchMove","t","drawSymbol","type","outer","inner","a","heartBurst","particles","spawnBurst","angle","speed","onClick","onTouch","p","sparkles","stars","createStar","drawStar","s","loveRain","drops","createDrop","d","xOff","confetti","pieces","createPiece","drawPiece","fireworks","rockets","launchRocket","targetY","burst","iv","starField","randomY","j","dx","dy","dist","butterflies","items","time","spawn","b","wingSpread","magicDust","dusts","createDust","floatingOrbs","orbs","createOrb","orb","gradient","shootingStars","vx","vy","grad","_sessions","_sessionId","_run","containerId","animFn","stop","id","stopAnimation","stopAll","startFloatingHearts","startHeartTrail","startHeartBurst","startSparkles","startLoveRain","startConfetti","startFireworks","startStarField","startButterflies","startMagicDust","startFloatingOrbs","startShootingStars","index"],"mappings":"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"}
package/package.json CHANGED
@@ -1,54 +1,54 @@
1
- {
2
- "name": "@sarthak03dot/romantic-animations",
3
- "version": "1.2.0",
4
- "description": "Romantic & celebratory canvas animations — hearts, sparkles, fireworks, confetti, star fields and more. Zero dependencies.",
5
- "homepage": "https://github.com/sarthak03dot/romantic-animations#readme",
6
- "bugs": {
7
- "url": "https://github.com/sarthak03dot/romantic-animations/issues"
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/sarthak03dot/romantic-animations.git"
12
- },
13
- "license": "MIT",
14
- "keywords": [
15
- "romantic",
16
- "heart",
17
- "animation",
18
- "canvas",
19
- "sparkles",
20
- "confetti",
21
- "fireworks",
22
- "love",
23
- "valentine",
24
- "particle",
25
- "effects",
26
- "zero-dependency"
27
- ],
28
- "author": "Sarthak Singh <sarthak03december@gmail.com>",
29
- "type": "module",
30
- "types": "./dist/index.d.ts",
31
- "main": "dist/romantic-animations.umd.js",
32
- "module": "dist/romantic-animations.es.js",
33
- "exports": {
34
- ".": {
35
- "import": "./dist/romantic-animations.es.js",
36
- "require": "./dist/romantic-animations.umd.js"
37
- }
38
- },
39
- "files": [
40
- "dist",
41
- "src",
42
- "README.md"
43
- ],
44
- "scripts": {
45
- "dev": "vite",
46
- "build": "vite build",
47
- "build:demo": "vite build --config vite.demo.config.js",
48
- "preview": "vite preview",
49
- "prepublishOnly": "npm run build"
50
- },
51
- "devDependencies": {
52
- "vite": "^7.0.2"
53
- }
1
+ {
2
+ "name": "@sarthak03dot/romantic-animations",
3
+ "version": "1.2.1",
4
+ "description": "Romantic & celebratory canvas animations — hearts, sparkles, fireworks, confetti, star fields and more. Zero dependencies.",
5
+ "homepage": "https://github.com/sarthak03dot/romantic-animations#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/sarthak03dot/romantic-animations/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/sarthak03dot/romantic-animations.git"
12
+ },
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "romantic",
16
+ "heart",
17
+ "animation",
18
+ "canvas",
19
+ "sparkles",
20
+ "confetti",
21
+ "fireworks",
22
+ "love",
23
+ "valentine",
24
+ "particle",
25
+ "effects",
26
+ "zero-dependency"
27
+ ],
28
+ "author": "Sarthak Singh <sarthak03december@gmail.com>",
29
+ "type": "module",
30
+ "types": "./dist/index.d.ts",
31
+ "main": "dist/romantic-animations.umd.js",
32
+ "module": "dist/romantic-animations.es.js",
33
+ "exports": {
34
+ ".": {
35
+ "import": "./dist/romantic-animations.es.js",
36
+ "require": "./dist/romantic-animations.umd.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "src",
42
+ "README.md"
43
+ ],
44
+ "scripts": {
45
+ "dev": "vite",
46
+ "build": "vite build",
47
+ "build:demo": "vite build --config vite.demo.config.js",
48
+ "preview": "vite preview",
49
+ "prepublishOnly": "npm run build"
50
+ },
51
+ "devDependencies": {
52
+ "vite": "^7.0.2"
53
+ }
54
54
  }