/** * Dynamic Star Background Generator * Creates an animated cosmic background with stars and nebulae */ (function() { document.addEventListener('DOMContentLoaded', function() { // Create canvas for star background if it doesn't exist if (!document.getElementById('stars-canvas')) { createStarCanvas(); } }); function createStarCanvas() { const canvas = document.createElement('canvas'); canvas.id = 'stars-canvas'; canvas.style.position = 'fixed'; canvas.style.top = '0'; canvas.style.left = '0'; canvas.style.width = '100%'; canvas.style.height = '100%'; canvas.style.zIndex = '-1'; canvas.style.pointerEvents = 'none'; document.body.prepend(canvas); // Make the canvas responsive canvas.width = window.innerWidth; canvas.height = window.innerHeight; // Redraw on window resize window.addEventListener('resize', function() { canvas.width = window.innerWidth; canvas.height = window.innerHeight; drawStarBackground(canvas); }); // Draw initial star background drawStarBackground(canvas); } function drawStarBackground(canvas) { const ctx = canvas.getContext('2d'); const width = canvas.width; const height = canvas.height; // Clear canvas ctx.clearRect(0, 0, width, height); // Create gradient background const bgGradient = ctx.createLinearGradient(0, 0, 0, height); bgGradient.addColorStop(0, '#070b1a'); bgGradient.addColorStop(1, '#0c1426'); ctx.fillStyle = bgGradient; ctx.fillRect(0, 0, width, height); // Draw nebulae drawNebula(ctx, width * 0.2, height * 0.3, width * 0.4, height * 0.4, '#5846f9', 0.05); drawNebula(ctx, width * 0.7, height * 0.7, width * 0.5, height * 0.5, '#00c2ff', 0.05); // Draw stars const starCount = Math.floor((width * height) / 1000); // Adaptive star count for (let i = 0; i < starCount; i++) { const x = Math.random() * width; const y = Math.random() * height; const size = Math.random() * 2; const opacity = Math.random() * 0.8 + 0.2; ctx.beginPath(); ctx.arc(x, y, size, 0, Math.PI * 2); ctx.fillStyle = `rgba(255, 255, 255, ${opacity})`; ctx.fill(); // Add glow to some stars if (Math.random() > 0.95) { ctx.beginPath(); ctx.arc(x, y, size * 4, 0, Math.PI * 2); const glowColor = Math.random() > 0.5 ? '0, 194, 255' : '88, 70, 249'; const glow = ctx.createRadialGradient(x, y, size, x, y, size * 4); glow.addColorStop(0, `rgba(${glowColor}, 0.3)`); glow.addColorStop(1, `rgba(${glowColor}, 0)`); ctx.fillStyle = glow; ctx.fill(); } } } function drawNebula(ctx, x, y, width, height, color, opacity) { const nebulaGradient = ctx.createRadialGradient(x, y, 10, x, y, Math.max(width, height)); nebulaGradient.addColorStop(0, `${color}${Math.floor(opacity * 255).toString(16).padStart(2, '0')}`); nebulaGradient.addColorStop(1, 'transparent'); ctx.fillStyle = nebulaGradient; ctx.fillRect(x - width / 2, y - height / 2, width, height); } })();