@sarthak03dot/romantic-animations 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"romantic-animations.es.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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"}
@@ -0,0 +1,10 @@
1
+ (function(m,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(m=typeof globalThis<"u"?globalThis:m||self,S(m.RomanticAnimations={}))})(this,(function(m){"use strict";const S={zIndex:0};function O(e,l={}){const i=Object.assign({},S,l),o=typeof e=="string"?document.getElementById(e):e;if(!o)throw new Error(`[romantic-animations] Container "${e}" not found in the DOM.`);const a=o.querySelector("canvas[data-ra]");a&&a.remove();const f=document.createElement("canvas");f.setAttribute("data-ra","1"),f.style.cssText=`
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100vw;
6
+ height: 100vh;
7
+ pointer-events: none;
8
+ z-index: ${i.zIndex};
9
+ `;const d=()=>{f.width=window.innerWidth,f.height=window.innerHeight};d(),o.style.position=o.style.position||"relative",o.appendChild(f);const c=new ResizeObserver(d);c.observe(o);const r=f.getContext("2d");function t(){c.disconnect(),f.remove()}return{canvas:f,ctx:r,options:i,destroy:t}}function p(e,l={}){return Object.assign({},e,l)}const v={count:.12,minSize:14,maxSize:32,minSpeed:.8,maxSpeed:2.4,colors:["#ff6b8a","#ff4d6d","#ff85a1","#ffc2d1","#ff0a54","#ff477e"],wobble:!0,glow:!0};function q(e,l,i,o,a,f=1,d=!1){e.save(),e.globalAlpha=f,d&&(e.shadowColor=a,e.shadowBlur=o*1.2),e.fillStyle=a,e.beginPath(),e.moveTo(l,i+o*.3),e.bezierCurveTo(l-o*1.1,i-o*.5,l-o*1.6,i+o*.5,l,i+o*1.4),e.bezierCurveTo(l+o*1.6,i+o*.5,l+o*1.1,i-o*.5,l,i+o*.3),e.fill(),e.restore()}function $(e,l={}){const i=p(v,l),o=e.getContext("2d"),a=[];let f=!0;function d(){const r=i.minSize+Math.random()*(i.maxSize-i.minSize);return{x:Math.random()*e.width,y:e.height+r*2,size:r,speed:i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed),color:i.colors[Math.floor(Math.random()*i.colors.length)],alpha:.7+Math.random()*.3,wobbleOffset:Math.random()*Math.PI*2,wobbleSpeed:.02+Math.random()*.03,wobbleAmount:.5+Math.random()*1.5}}function c(){if(f){o.clearRect(0,0,e.width,e.height),Math.random()<i.count&&a.push(d());for(let r=a.length-1;r>=0;r--){const t=a[r];t.y-=t.speed,t.wobbleOffset+=t.wobbleSpeed;const n=i.wobble?Math.sin(t.wobbleOffset)*t.wobbleAmount*t.size*.5:0,h=Math.min(t.alpha,t.y/(e.height*.2));if(h<=0||t.y<-t.size*3){a.splice(r,1);continue}q(o,t.x+n,t.y,t.size,t.color,Math.max(0,h),i.glow)}requestAnimationFrame(c)}}return c(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const U={minSize:6,maxSize:16,decay:.025,colors:["#ff6b8a","#ff4d6d","#ff85a1","#ffc2d1","#c9184a"],glow:!0};function H(e,l,i,o,a,f,d){e.save(),e.globalAlpha=Math.max(0,f),d&&(e.shadowColor=a,e.shadowBlur=o*2),e.fillStyle=a,e.beginPath(),e.moveTo(l,i+o*.3),e.bezierCurveTo(l-o*1.1,i-o*.5,l-o*1.6,i+o*.5,l,i+o*1.4),e.bezierCurveTo(l+o*1.6,i+o*.5,l+o*1.1,i-o*.5,l,i+o*.3),e.fill(),e.restore()}function Y(e,l={}){const i=p(U,l),o=e.getContext("2d"),a=[];let f=!0;function d(n,h){a.push({x:n,y:h,size:i.minSize+Math.random()*(i.maxSize-i.minSize),alpha:.9+Math.random()*.1,decay:i.decay*(.8+Math.random()*.4),color:i.colors[Math.floor(Math.random()*i.colors.length)],vy:-(.3+Math.random()*.6)})}const c=n=>{const h=e.getBoundingClientRect();d(n.clientX-h.left,n.clientY-h.top)},r=n=>{const h=e.getBoundingClientRect();Array.from(n.touches).forEach(s=>{d(s.clientX-h.left,s.clientY-h.top)})};window.addEventListener("mousemove",c),window.addEventListener("touchmove",r,{passive:!0});function t(){if(f){o.clearRect(0,0,e.width,e.height);for(let n=a.length-1;n>=0;n--){const h=a[n];h.y+=h.vy,H(o,h.x,h.y,h.size,h.color,h.alpha,i.glow),h.alpha-=h.decay,h.alpha<=0&&a.splice(n,1)}requestAnimationFrame(t)}}return t(),function(){f=!1,window.removeEventListener("mousemove",c),window.removeEventListener("touchmove",r),o.clearRect(0,0,e.width,e.height)}}const X={count:20,minSize:8,maxSize:20,minSpeed:2,maxSpeed:7,gravity:.08,decay:.018,colors:["#ff0a54","#ff477e","#ff7096","#ff85a1","#fbb1bd","#ff4d6d"],glow:!0,symbols:["heart"]};function j(e,l,i,o,a,f,d,c){if(e.save(),e.globalAlpha=Math.max(0,d),c&&(e.shadowColor=f,e.shadowBlur=a*2),e.fillStyle=f,l==="star"){e.beginPath();for(let r=0;r<5;r++){const t=Math.PI/2+r*2*Math.PI/5,n=t+Math.PI/5;r===0?e.moveTo(i+a*Math.cos(t),o-a*Math.sin(t)):e.lineTo(i+a*Math.cos(t),o-a*Math.sin(t)),e.lineTo(i+a*.4*Math.cos(n),o-a*.4*Math.sin(n))}e.closePath(),e.fill()}else if(l==="sparkle")for(let r=0;r<4;r++){const t=r*Math.PI/2;e.beginPath(),e.ellipse(i+Math.cos(t)*a*.5,o+Math.sin(t)*a*.5,a*.18,a*.7,t,0,Math.PI*2),e.fill()}else e.beginPath(),e.moveTo(i,o+a*.3),e.bezierCurveTo(i-a*1.1,o-a*.5,i-a*1.6,o+a*.5,i,o+a*1.4),e.bezierCurveTo(i+a*1.6,o+a*.5,i+a*1.1,o-a*.5,i,o+a*.3),e.fill();e.restore()}function _(e,l={}){const i=p(X,l),o=e.getContext("2d"),a=[];let f=!0;function d(n,h){for(let s=0;s<i.count;s++){const u=Math.random()*Math.PI*2,M=i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed);a.push({x:n,y:h,size:i.minSize+Math.random()*(i.maxSize-i.minSize),vx:Math.cos(u)*M,vy:Math.sin(u)*M,alpha:1,decay:i.decay*(.8+Math.random()*.4),color:i.colors[Math.floor(Math.random()*i.colors.length)],symbol:i.symbols[Math.floor(Math.random()*i.symbols.length)]})}}const c=n=>{const h=e.getBoundingClientRect();d(n.clientX-h.left,n.clientY-h.top)},r=n=>{const h=e.getBoundingClientRect();Array.from(n.changedTouches).forEach(s=>d(s.clientX-h.left,s.clientY-h.top))};window.addEventListener("click",c),window.addEventListener("touchend",r,{passive:!0});function t(){if(f){o.clearRect(0,0,e.width,e.height);for(let n=a.length-1;n>=0;n--){const h=a[n];h.x+=h.vx,h.y+=h.vy,h.vy+=i.gravity,h.alpha-=h.decay,j(o,h.symbol,h.x,h.y,h.size,h.color,h.alpha,i.glow),h.alpha<=0&&a.splice(n,1)}requestAnimationFrame(t)}}return t(),function(){f=!1,window.removeEventListener("click",c),window.removeEventListener("touchend",r),o.clearRect(0,0,e.width,e.height)}}const W={count:80,minSize:2,maxSize:6,speed:.5,twinkleSpeed:.04,colors:["#fff","#ffe4e8","#ffb3c1","#ff85a1","#ffd6ff","#e7c6ff"],glow:!0};function G(e,l={}){const i=p(W,l),o=e.getContext("2d"),a=[];let f=!0;function d(){return{x:Math.random()*e.width,y:Math.random()*e.height,size:i.minSize+Math.random()*(i.maxSize-i.minSize),alpha:Math.random(),alphaDir:Math.random()>.5?1:-1,twinkleSpeed:i.twinkleSpeed*(.5+Math.random()),color:i.colors[Math.floor(Math.random()*i.colors.length)],vx:(Math.random()-.5)*i.speed,vy:(Math.random()-.5)*i.speed}}for(let t=0;t<i.count;t++)a.push(d());function c(t){o.save(),o.globalAlpha=Math.max(0,Math.min(1,t.alpha)),i.glow&&(o.shadowColor=t.color,o.shadowBlur=t.size*3),o.fillStyle=t.color;const n=t.size;o.beginPath();for(let h=0;h<4;h++){const s=h*Math.PI/2;o.ellipse(t.x+Math.cos(s)*n*.35,t.y+Math.sin(s)*n*.35,n*.15,n*.7,s,0,Math.PI*2)}o.fill(),o.beginPath(),o.arc(t.x,t.y,n*.2,0,Math.PI*2),o.fill(),o.restore()}function r(){if(f){o.clearRect(0,0,e.width,e.height);for(let t=0;t<a.length;t++){const n=a[t];n.x+=n.vx,n.y+=n.vy,n.alpha+=n.alphaDir*n.twinkleSpeed,n.alpha>=1?(n.alpha=1,n.alphaDir=-1):n.alpha<=0&&(n.alpha=0,n.alphaDir=1),n.x<-10&&(n.x=e.width+10),n.x>e.width+10&&(n.x=-10),n.y<-10&&(n.y=e.height+10),n.y>e.height+10&&(n.y=-10),c(n)}requestAnimationFrame(r)}}return r(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const N={density:.15,symbols:["❤","💕","✨","💖","💗","⭐","×"],minSize:12,maxSize:28,minSpeed:1,maxSpeed:3.5,colors:["#ff6b8a","#ff4d6d","#ffc2d1","#ff85a1","#ff0a54","#a2d2ff"],opacity:.85,glow:!0};function J(e,l={}){const i=p(N,l),o=e.getContext("2d"),a=[];let f=!0;function d(){const r=i.minSize+Math.random()*(i.maxSize-i.minSize);return{x:Math.random()*e.width,y:-r*2,size:r,speed:i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed),symbol:i.symbols[Math.floor(Math.random()*i.symbols.length)],color:i.colors[Math.floor(Math.random()*i.colors.length)],alpha:.4+Math.random()*.6,angle:(Math.random()-.5)*.4,wobble:Math.random()*Math.PI*2,wobbleSpeed:.02+Math.random()*.02}}function c(){if(f){o.clearRect(0,0,e.width,e.height),Math.random()<i.density&&a.push(d());for(let r=a.length-1;r>=0;r--){const t=a[r];t.y+=t.speed,t.wobble+=t.wobbleSpeed;const n=Math.sin(t.wobble)*t.size*.3;o.save(),o.globalAlpha=t.alpha*i.opacity,o.font=`${t.size}px serif`,o.fillStyle=t.color,i.glow&&(o.shadowColor=t.color,o.shadowBlur=t.size*.8),o.translate(t.x+n,t.y),o.rotate(t.angle),o.fillText(t.symbol,0,0),o.restore(),t.y>e.height+t.size*2&&a.splice(r,1)}requestAnimationFrame(c)}}return c(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const K={density:.18,colors:["#ff6b8a","#ff4d6d","#ffd6ff","#e7c6ff","#c77dff","#48cae4","#ffe66d","#06d6a0"],minSize:6,maxSize:14,minSpeed:1.5,maxSpeed:4,gravity:.06,drag:.99,shapes:["rect","circle","ribbon"]};function Q(e,l={}){const i=p(K,l),o=e.getContext("2d"),a=[];let f=!0;function d(){const t=i.minSize+Math.random()*(i.maxSize-i.minSize),n=i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed);return{x:Math.random()*e.width,y:-t*2,w:t,h:t*(.4+Math.random()*.8),vx:(Math.random()-.5)*3,vy:n,angle:Math.random()*Math.PI*2,spin:(Math.random()-.5)*.15,color:i.colors[Math.floor(Math.random()*i.colors.length)],alpha:.8+Math.random()*.2,shape:i.shapes[Math.floor(Math.random()*i.shapes.length)]}}function c(t){o.save(),o.globalAlpha=t.alpha,o.fillStyle=t.color,o.strokeStyle=t.color,o.translate(t.x,t.y),o.rotate(t.angle),t.shape==="circle"?(o.beginPath(),o.ellipse(0,0,t.w/2,t.h/2,0,0,Math.PI*2),o.fill()):t.shape==="ribbon"?(o.beginPath(),o.moveTo(-t.w/2,0),o.quadraticCurveTo(0,-t.h,t.w/2,0),o.quadraticCurveTo(0,t.h,-t.w/2,0),o.fill()):o.fillRect(-t.w/2,-t.h/2,t.w,t.h),o.restore()}function r(){if(f){o.clearRect(0,0,e.width,e.height),Math.random()<i.density&&a.push(d());for(let t=a.length-1;t>=0;t--){const n=a[t];n.vy+=i.gravity,n.vx*=i.drag,n.vy*=i.drag,n.x+=n.vx,n.y+=n.vy,n.angle+=n.spin,c(n),n.y>e.height+20&&a.splice(t,1)}requestAnimationFrame(r)}}return r(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const V={interval:1200,trailLength:28,particleCount:80,colors:["#ff6b8a","#ff4d6d","#ffd6ff","#e7c6ff","#ffe66d","#06d6a0","#48cae4","#ffffff"],gravity:.09,decay:.014,glow:!0};function Z(e,l={}){const i=p(V,l),o=e.getContext("2d");let a=!0;const f=[],d=[];function c(){const h=e.width*(.2+Math.random()*.6),s=e.height*(.1+Math.random()*.4);s-e.height;const u=8+Math.random()*5,M=i.colors[Math.floor(Math.random()*i.colors.length)];f.push({x:h,y:e.height,vy:-Math.abs(u),targetY:s,trail:[],color:M})}function r(h,s,u){for(let M=0;M<i.particleCount;M++){const E=Math.random()*Math.PI*2,B=1+Math.random()*5;d.push({x:h,y:s,vx:Math.cos(E)*B,vy:Math.sin(E)*B,alpha:1,decay:i.decay*(.7+Math.random()*.6),size:2+Math.random()*3,color:u})}}const t=setInterval(()=>{a&&c()},i.interval);c();function n(){if(a){o.clearRect(0,0,e.width,e.height);for(let h=f.length-1;h>=0;h--){const s=f[h];s.y+=s.vy,s.trail.push({x:s.x,y:s.y}),s.trail.length>i.trailLength&&s.trail.shift();for(let u=0;u<s.trail.length;u++){const M=u/s.trail.length*.8;o.save(),o.globalAlpha=M,i.glow&&(o.shadowColor=s.color,o.shadowBlur=6),o.fillStyle=s.color,o.beginPath(),o.arc(s.trail[u].x,s.trail[u].y,2.5*(u/s.trail.length),0,Math.PI*2),o.fill(),o.restore()}s.y<=s.targetY&&(r(s.x,s.y,s.color),f.splice(h,1))}for(let h=d.length-1;h>=0;h--){const s=d[h];s.x+=s.vx,s.y+=s.vy,s.vy+=i.gravity,s.alpha-=s.decay,o.save(),o.globalAlpha=Math.max(0,s.alpha),i.glow&&(o.shadowColor=s.color,o.shadowBlur=s.size*2),o.fillStyle=s.color,o.beginPath(),o.arc(s.x,s.y,s.size,0,Math.PI*2),o.fill(),o.restore(),s.alpha<=0&&d.splice(h,1)}requestAnimationFrame(n)}}return n(),function(){a=!1,clearInterval(t),o.clearRect(0,0,e.width,e.height)}}const tt={starCount:120,speed:.4,colors:["#ffffff","#ffe4e8","#ffc2d1","#e7c6ff","#a2d2ff"],minSize:1,maxSize:3.5,twinkle:!0,connectDist:100,connectOpacity:.08};function et(e,l={}){const i=p(tt,l),o=e.getContext("2d"),a=[];let f=!0;function d(r=!1){return{x:Math.random()*e.width,y:Math.random()*e.height,size:i.minSize+Math.random()*(i.maxSize-i.minSize),alpha:.3+Math.random()*.7,alphaDir:Math.random()>.5?1:-1,twinkleSpeed:.008+Math.random()*.015,vx:(Math.random()-.5)*i.speed,vy:(Math.random()-.5)*i.speed,color:i.colors[Math.floor(Math.random()*i.colors.length)]}}for(let r=0;r<i.starCount;r++)a.push(d(!0));function c(){if(f){if(o.clearRect(0,0,e.width,e.height),i.connectDist>0)for(let r=0;r<a.length;r++)for(let t=r+1;t<a.length;t++){const n=a[r].x-a[t].x,h=a[r].y-a[t].y,s=Math.sqrt(n*n+h*h);s<i.connectDist&&(o.save(),o.globalAlpha=i.connectOpacity*(1-s/i.connectDist),o.strokeStyle="#ffffff",o.lineWidth=.5,o.beginPath(),o.moveTo(a[r].x,a[r].y),o.lineTo(a[t].x,a[t].y),o.stroke(),o.restore())}for(let r=0;r<a.length;r++){const t=a[r];t.x+=t.vx,t.y+=t.vy,i.twinkle&&(t.alpha+=t.alphaDir*t.twinkleSpeed,t.alpha>=1&&(t.alpha=1,t.alphaDir=-1),t.alpha<=.1&&(t.alpha=.1,t.alphaDir=1)),t.x<-5&&(t.x=e.width+5),t.x>e.width+5&&(t.x=-5),t.y<-5&&(t.y=e.height+5),t.y>e.height+5&&(t.y=-5),o.save(),o.globalAlpha=t.alpha,o.shadowColor=t.color,o.shadowBlur=t.size*3,o.fillStyle=t.color,o.beginPath(),o.arc(t.x,t.y,t.size,0,Math.PI*2),o.fill(),o.restore()}requestAnimationFrame(c)}}return c(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const ot={density:.05,colors:["#c77dff","#ff85a1","#ffc2d1","#48cae4","#e7c6ff","#fbb1bd"],minSize:10,maxSize:22,minSpeed:.8,maxSpeed:2.2,glow:!0};function it(e,l={}){const i=p(ot,l),o=e.getContext("2d"),a=[];let f=!0,d=0;function c(){const t=i.minSize+Math.random()*(i.maxSize-i.minSize);return{x:-t*2,y:e.height*.1+Math.random()*(e.height*.8),size:t,speed:i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed),color:i.colors[Math.floor(Math.random()*i.colors.length)],alpha:0,flapSpeed:.1+Math.random()*.15,flapOffset:Math.random()*Math.PI*2,wobbleSpeed:.01+Math.random()*.02,wobbleOffset:Math.random()*Math.PI*2}}function r(){if(f){d++,o.clearRect(0,0,e.width,e.height),Math.random()<i.density&&a.push(c());for(let t=a.length-1;t>=0;t--){const n=a[t];n.x+=n.speed,n.y+=Math.sin(d*n.wobbleSpeed+n.wobbleOffset)*1.5,n.alpha<1&&n.x<e.width/2&&(n.alpha+=.02);const h=Math.abs(Math.sin(d*n.flapSpeed+n.flapOffset));o.save(),o.globalAlpha=Math.min(1,n.alpha),o.translate(n.x,n.y),o.rotate(-.1-h*.1),i.glow&&(o.shadowColor=n.color,o.shadowBlur=n.size*1.5),o.fillStyle=n.color,o.beginPath(),o.ellipse(-n.size*.2,0,n.size*.4*h,n.size*.5,.3,0,Math.PI*2),o.fill(),o.beginPath(),o.ellipse(n.size*.3*h,-n.size*.1,n.size*.5*h,n.size*.6,-.2,0,Math.PI*2),o.fill(),o.restore(),n.x>e.width+n.size*2&&a.splice(t,1)}requestAnimationFrame(r)}}return r(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const nt={particleCount:150,minSize:1,maxSize:4,colors:["#ffd6ff","#e7c6ff","#c77dff","#ffb3c1","#ffffff"],speed:.8,glow:!0};function at(e,l={}){const i=p(nt,l),o=e.getContext("2d"),a=[];let f=!0,d=0;function c(){return{x:Math.random()*e.width,y:Math.random()*e.height,size:i.minSize+Math.random()*(i.maxSize-i.minSize),color:i.colors[Math.floor(Math.random()*i.colors.length)],angle:Math.random()*Math.PI*2,orbitRadius:20+Math.random()*80,orbitSpeed:(.01+Math.random()*.03)*(Math.random()>.5?1:-1),centerX:Math.random()*e.width,centerY:e.height+50,upwardSpeed:i.speed+Math.random()*1.5,alpha:0}}for(let t=0;t<i.particleCount;t++)a.push(c()),a[t].centerY=Math.random()*e.height,a[t].alpha=Math.random();function r(){if(f){d++,o.clearRect(0,0,e.width,e.height);for(let t=0;t<a.length;t++){const n=a[t];n.angle+=n.orbitSpeed,n.centerY-=n.upwardSpeed,n.x=n.centerX+Math.cos(n.angle)*n.orbitRadius+Math.sin(d*.01+n.angle)*30,n.y=n.centerY+Math.sin(n.angle)*(n.orbitRadius*.5),n.alpha<1&&n.centerY>0&&(n.alpha+=.01),n.y<-50&&(Object.assign(n,c()),n.centerY=e.height+50,n.centerX=Math.random()*e.width),o.save(),o.globalAlpha=n.alpha,i.glow&&(o.shadowColor=n.color,o.shadowBlur=n.size*3),o.fillStyle=n.color,o.beginPath(),o.arc(n.x,n.y,n.size,0,Math.PI*2),o.fill(),o.restore()}requestAnimationFrame(r)}}return r(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const rt={orbCount:15,minSize:50,maxSize:150,colors:["#ff4d6d","#c77dff","#48cae4","#ffe66d"],speed:.5,glow:!0};function lt(e,l={}){const i=p(rt,l),o=e.getContext("2d"),a=[];let f=!0;function d(){const r=i.minSize+Math.random()*(i.maxSize-i.minSize);return{x:Math.random()*e.width,y:Math.random()*e.height,size:r,vx:(Math.random()-.5)*i.speed,vy:(Math.random()-.5)*i.speed,color:i.colors[Math.floor(Math.random()*i.colors.length)],alpha:0}}for(let r=0;r<i.orbCount;r++){const t=d();t.alpha=Math.random()*.5+.1,a.push(t)}function c(){if(f){o.clearRect(0,0,e.width,e.height);for(let r=0;r<a.length;r++){const t=a[r];t.x+=t.vx,t.y+=t.vy,t.x<-t.size&&(t.x=e.width+t.size),t.x>e.width+t.size&&(t.x=-t.size),t.y<-t.size&&(t.y=e.height+t.size),t.y>e.height+t.size&&(t.y=-t.size),o.save(),o.globalAlpha=t.alpha,o.globalCompositeOperation="screen";const n=o.createRadialGradient(t.x,t.y,0,t.x,t.y,t.size);n.addColorStop(0,t.color),n.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=n,o.beginPath(),o.arc(t.x,t.y,t.size,0,Math.PI*2),o.fill(),o.restore()}requestAnimationFrame(c)}}return c(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const ht={density:.02,minSpeed:10,maxSpeed:25,colors:["#ffffff","#e7c6ff","#48cae4","#ffe66d"],glow:!0};function st(e,l={}){const i=p(ht,l),o=e.getContext("2d"),a=[];let f=!0;function d(){return{x:Math.random()*e.width*1.5,y:-50,length:50+Math.random()*100,thickness:1+Math.random()*2,speed:i.minSpeed+Math.random()*(i.maxSpeed-i.minSpeed),color:i.colors[Math.floor(Math.random()*i.colors.length)],angle:Math.PI/4+(Math.random()*.2-.1),opacity:1}}function c(){if(f){o.clearRect(0,0,e.width,e.height),Math.random()<i.density&&a.push(d());for(let r=a.length-1;r>=0;r--){const t=a[r],n=-Math.cos(t.angle)*t.speed,h=Math.sin(t.angle)*t.speed;t.x+=n,t.y+=h,t.opacity-=.01,o.save(),o.globalAlpha=Math.max(0,t.opacity),i.glow&&(o.shadowColor=t.color,o.shadowBlur=t.thickness*4);const s=o.createLinearGradient(t.x,t.y,t.x-n*(t.length/t.speed),t.y-h*(t.length/t.speed));s.addColorStop(0,t.color),s.addColorStop(1,"rgba(255,255,255,0)"),o.strokeStyle=s,o.lineWidth=t.thickness,o.lineCap="round",o.beginPath(),o.moveTo(t.x,t.y),o.lineTo(t.x-n*(t.length/t.speed),t.y-h*(t.length/t.speed)),o.stroke(),o.restore(),(t.opacity<=0||t.x<-100||t.y>e.height+100)&&a.splice(r,1)}requestAnimationFrame(c)}}return c(),function(){f=!1,o.clearRect(0,0,e.width,e.height)}}const w=new Map;let ft=0;function g(e,l,i={}){const{canvas:o,destroy:a}=O(e,i),f=l(o,i),d=++ft;return w.set(d,{destroy:a,stop:f}),d}function y(e){if(w.has(e)){const l=w.get(e);typeof l.stop=="function"&&l.stop(),l.destroy(),w.delete(e)}}function b(){w.forEach(e=>{typeof e.stop=="function"&&e.stop(),e.destroy()}),w.clear()}function z(e,l={}){return g(e,$,l)}function x(e,l={}){return g(e,Y,l)}function C(e,l={}){return g(e,_,l)}function A(e,l={}){return g(e,G,l)}function P(e,l={}){return g(e,J,l)}function T(e,l={}){return g(e,Q,l)}function R(e,l={}){return g(e,Z,l)}function F(e,l={}){return g(e,et,l)}function D(e,l={}){return g(e,it,l)}function I(e,l={}){return g(e,at,l)}function k(e,l={}){return g(e,lt,l)}function L(e,l={}){return g(e,st,l)}const dt={startFloatingHearts:z,startHeartTrail:x,startHeartBurst:C,startSparkles:A,startLoveRain:P,startConfetti:T,startFireworks:R,startStarField:F,startButterflies:D,startMagicDust:I,startFloatingOrbs:k,startShootingStars:L,stopAnimation:y,stopAll:b};m.default=dt,m.startButterflies=D,m.startConfetti=T,m.startFireworks=R,m.startFloatingHearts=z,m.startFloatingOrbs=k,m.startHeartBurst=C,m.startHeartTrail=x,m.startLoveRain=P,m.startMagicDust=I,m.startShootingStars=L,m.startSparkles=A,m.startStarField=F,m.stopAll=b,m.stopAnimation=y,Object.defineProperties(m,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
10
+ //# sourceMappingURL=romantic-animations.umd.js.map
@@ -0,0 +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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "name": "@sarthak03dot/romantic-animations",
3
- "version": "1.0.2",
4
- "description": "Romantic animations like hearts, sparkles, trails",
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
5
  "homepage": "https://github.com/sarthak03dot/romantic-animations#readme",
6
6
  "bugs": {
7
7
  "url": "https://github.com/sarthak03dot/romantic-animations/issues"
@@ -10,21 +10,45 @@
10
10
  "type": "git",
11
11
  "url": "git+https://github.com/sarthak03dot/romantic-animations.git"
12
12
  },
13
- "license": "ISC",
13
+ "license": "MIT",
14
14
  "keywords": [
15
15
  "romantic",
16
16
  "heart",
17
17
  "animation",
18
- "canvas"
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"
19
43
  ],
20
- "author": "Sarthak Singh",
21
- "type": "commonjs",
22
- "main": "vite.config.js",
23
44
  "scripts": {
24
- "start": "vite",
25
- "build": "vite build"
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"
26
50
  },
27
51
  "devDependencies": {
28
52
  "vite": "^7.0.2"
29
53
  }
30
- }
54
+ }
@@ -0,0 +1,92 @@
1
+ import { mergeOptions } from '../core/engine.js';
2
+
3
+ const DEFAULTS = {
4
+ density: 0.05, // Spawn probability per frame
5
+ colors: ['#c77dff', '#ff85a1', '#ffc2d1', '#48cae4', '#e7c6ff', '#fbb1bd'],
6
+ minSize: 10,
7
+ maxSize: 22,
8
+ minSpeed: 0.8,
9
+ maxSpeed: 2.2,
10
+ glow: true,
11
+ };
12
+
13
+ export function butterflies(canvas, userOptions = {}) {
14
+ const opts = mergeOptions(DEFAULTS, userOptions);
15
+ const ctx = canvas.getContext('2d');
16
+ const items = [];
17
+ let running = true;
18
+ let time = 0;
19
+
20
+ function spawn() {
21
+ const size = opts.minSize + Math.random() * (opts.maxSize - opts.minSize);
22
+ return {
23
+ x: -size * 2,
24
+ y: canvas.height * 0.1 + Math.random() * (canvas.height * 0.8),
25
+ size,
26
+ speed: opts.minSpeed + Math.random() * (opts.maxSpeed - opts.minSpeed),
27
+ color: opts.colors[Math.floor(Math.random() * opts.colors.length)],
28
+ alpha: 0,
29
+ flapSpeed: 0.1 + Math.random() * 0.15,
30
+ flapOffset: Math.random() * Math.PI * 2,
31
+ wobbleSpeed: 0.01 + Math.random() * 0.02,
32
+ wobbleOffset: Math.random() * Math.PI * 2,
33
+ };
34
+ }
35
+
36
+ function animate() {
37
+ if (!running) return;
38
+ time++;
39
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
40
+
41
+ if (Math.random() < opts.density) items.push(spawn());
42
+
43
+ for (let i = items.length - 1; i >= 0; i--) {
44
+ const b = items[i];
45
+ b.x += b.speed;
46
+ b.y += Math.sin(time * b.wobbleSpeed + b.wobbleOffset) * 1.5;
47
+
48
+ // Fade in smoothly
49
+ if (b.alpha < 1 && b.x < canvas.width / 2) b.alpha += 0.02;
50
+
51
+ // Flapping wing calculation
52
+ const wingSpread = Math.abs(Math.sin(time * b.flapSpeed + b.flapOffset));
53
+
54
+ ctx.save();
55
+ ctx.globalAlpha = Math.min(1, b.alpha);
56
+ ctx.translate(b.x, b.y);
57
+ // Slight tilt upwards
58
+ ctx.rotate(-0.1 - (wingSpread * 0.1));
59
+
60
+ if (opts.glow) {
61
+ ctx.shadowColor = b.color;
62
+ ctx.shadowBlur = b.size * 1.5;
63
+ }
64
+ ctx.fillStyle = b.color;
65
+
66
+ // Draw wings
67
+ ctx.beginPath();
68
+ // Left/back wing (narrower based on wingSpread)
69
+ ctx.ellipse(-b.size * 0.2, 0, b.size * 0.4 * wingSpread, b.size * 0.5, 0.3, 0, Math.PI * 2);
70
+ ctx.fill();
71
+
72
+ ctx.beginPath();
73
+ // Right/front wing
74
+ 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);
75
+ ctx.fill();
76
+ ctx.restore();
77
+
78
+ if (b.x > canvas.width + b.size * 2) {
79
+ items.splice(i, 1);
80
+ }
81
+ }
82
+
83
+ requestAnimationFrame(animate);
84
+ }
85
+
86
+ animate();
87
+
88
+ return function stop() {
89
+ running = false;
90
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
91
+ };
92
+ }