Features: - Complete Luftglanz drone cleaning website - AI chat assistant integrated with OpenAI API - Expert product advice for AGO Quart and Mellerud cleaning products - Formal German language support (Sie form) - Secure PHP backend for API calls - Responsive design with mobile support - Product-specific knowledge base - Safety statements from manufacturers - Multi-page integration (index, products, services, contact) Technical components: - AI chat widget (js/ai-chat.js) - Chat styling (css/components/ai-chat.css) - Backend API (ai-chat-api.php) - Product knowledge base with detailed specifications - Demo and documentation files
95 lines
3.5 KiB
JavaScript
95 lines
3.5 KiB
JavaScript
/**
|
|
* 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);
|
|
}
|
|
})();
|