(() => { const create = () => { const defaultMessageConfig = { durationMs: 4200, position: { xPercent: 50, yPercent: 10 }, text: null, colors: null, }; const config = { gravity: 1, spawnIntervalMs: 520, autoSpawn: true, minChain: 3, palette: ["#ff595e", "#ffca3a", "#8ac926", "#1982c4", "#6a4c93"], ballRadius: 18, ballShape: "circle", link: { stiffness: 0.85, lengthScale: 1.05, // max stretch factor; slack below this damping: 0.08, lineWidth: 3, rope: true, renderType: "line", maxLengthMultiplier: 3.1, clearAnimation: { type: "pop", durationMs: 320, startScale: 1, endScale: 1.8, startOpacity: 0.95, endOpacity: 0, sizeScale: 1, }, glowEffect: { enabled: true, opacity: 0.26, baseWidth: 6, pulseWidth: 3, pulseSpeedMs: 900, shadowBlur: 18, color: null, lengthScale: 0.4, opacityBoostPerLink: 0.02, maxOpacity: 0.7, }, sparkles: { enabled: true, rate: 0.12, size: 4, lifeMs: 260, opacity: 0.9, jitter: 6, lengthRateBoost: 0.08, sizeBoost: 0.2, }, }, messages: { ...defaultMessageConfig }, goalEffects: { enabled: true, nearThreshold: 0.7, completeThreshold: 0.98, pulseSpeedMs: 900, glowStrength: 0.55, gradientBlend: true, }, }; return { defaultMessageConfig: { ...defaultMessageConfig }, config: { ...config, link: { ...config.link }, messages: { ...config.messages }, }, }; }; window.PhysilinksConfig = { create }; })();