diff --git a/public/logo.png b/public/logo.png index 9014853..af0314a 100644 Binary files a/public/logo.png and b/public/logo.png differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3c5b57c..7db9358 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -15,7 +15,11 @@ export default function RootLayout({ }>) { return ( - {children} + + +
{children}
+
+ ); } diff --git a/src/components/Background.tsx b/src/components/Background.tsx index 56234b4..3294dd2 100644 --- a/src/components/Background.tsx +++ b/src/components/Background.tsx @@ -1,4 +1,4 @@ -'use client'; +"use client"; import React, { useEffect, useRef, useState } from "react"; @@ -7,183 +7,76 @@ export default function Background({ }: Readonly<{ children: React.ReactNode; }>) { - const canvasRef = useRef(null); - const animationRef = useRef(0); - const particlesRef = useRef([]); - const [dimensions, setDimensions] = useState<{ width: number; height: number }>({ - width: 0, - height: 0, - }); - - // Particle configuration - const config = { - particleCount: 400, - maxDistance: 120, - particleSpeed: 0.5, - particleSize: 2, - lineOpacity: 0.6, - particleOpacity: 0.8, - colors: { - particles: "#f5304c", // blue-400 - connections: "#f5304c", // blue-500 - }, - }; - - // Particle class - class Particle { - x: number; - y: number; - vx: number; - vy: number; - size: number; - - constructor(width: number, height: number) { - this.x = Math.random() * width; - this.y = Math.random() * height; - this.vx = (Math.random() - 0.5) * config.particleSpeed; - this.vy = (Math.random() - 0.5) * config.particleSpeed; - this.size = config.particleSize + Math.random() * 2; - } - - update(width: number, height: number) { - this.x += this.vx; - this.y += this.vy; - - // Bounce off edges - if (this.x < 0 || this.x > width) { - this.vx = -this.vx; - this.x = Math.max(0, Math.min(width, this.x)); - } - if (this.y < 0 || this.y > height) { - this.vy = -this.vy; - this.y = Math.max(0, Math.min(height, this.y)); - } - } - - draw(ctx: CanvasRenderingContext2D) { - ctx.beginPath(); - ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); - ctx.fillStyle = `${config.colors.particles}${Math.round( - config.particleOpacity * 255 - ) - .toString(16) - .padStart(2, "0")}`; - ctx.fill(); - } - } - - // Initialize particles - const initParticles = (width: number, height: number) => { - particlesRef.current = []; - for (let i = 0; i < config.particleCount; i++) { - particlesRef.current.push(new Particle(width, height)); - } - }; - - // Draw connections between nearby particles - const drawConnections = (ctx: CanvasRenderingContext2D, particles: Particle[]) => { - for (let i = 0; i < particles.length; i++) { - for (let j = i + 1; j < particles.length; j++) { - const dx = particles[i].x - particles[j].x; - const dy = particles[i].y - particles[j].y; - const distance = Math.sqrt(dx * dx + dy * dy); - - if (distance < config.maxDistance) { - const opacity = 1 - distance / config.maxDistance; - ctx.beginPath(); - ctx.moveTo(particles[i].x, particles[i].y); - ctx.lineTo(particles[j].x, particles[j].y); - ctx.strokeStyle = `${config.colors.connections}${Math.round( - opacity * config.lineOpacity * 255 - ) - .toString(16) - .padStart(2, "0")}`; - ctx.lineWidth = 1; - ctx.stroke(); - } - } - } - }; - - // Animation loop - const animate = () => { - const canvas = canvasRef.current; - if (!canvas) return; - - const ctx = canvas.getContext("2d"); - if (!ctx) return; - - const { width, height } = dimensions; - - // Clear canvas - ctx.clearRect(0, 0, width, height); - - // Update and draw particles - particlesRef.current.forEach((particle) => { - particle.update(width, height); - particle.draw(ctx); - }); - - // Draw connections - drawConnections(ctx, particlesRef.current); - - animationRef.current = requestAnimationFrame(animate); - }; - - // Handle window resize - const handleResize = () => { - const canvas = canvasRef.current; - if (!canvas || !canvas.parentElement) return; - - const rect = canvas.parentElement.getBoundingClientRect(); - const width = rect.width; - const height = rect.height; - - const dpr = window.devicePixelRatio || 1; - canvas.width = width * dpr; - canvas.height = height * dpr; - canvas.style.width = `${width}px`; - canvas.style.height = `${height}px`; - - const ctx = canvas.getContext("2d"); - if (ctx) { - ctx.setTransform(1, 0, 0, 1, 0, 0); // reset scaling before re-scaling - ctx.scale(dpr, dpr); - } - - setDimensions({ width, height }); - }; + const [pos, setPos] = useState({ x: 100, y: 100 }); + const [vel, setVel] = useState({ x: 1, y: 1 }); + const dvdRef = useRef(null); useEffect(() => { - handleResize(); - window.addEventListener("resize", handleResize); + let frame: number; + let x = pos.x; + let y = pos.y; + let vx = vel.x; + let vy = vel.y; - return () => { - window.removeEventListener("resize", handleResize); - if (animationRef.current) { - cancelAnimationFrame(animationRef.current); - } + const speed = 0.8; + const size = 120; + + // helper for collision detection + const detectCollision = ( + nextX: number, + nextY: number, + w: number, + h: number + ) => { + let collidedX = false; + let collidedY = false; + + // Left or Right wall + if (nextX <= 0 || nextX + size >= w) collidedX = true; + + // Top or Bottom wall + if (nextY <= 0 || nextY + size >= h) collidedY = true; + + return { collidedX, collidedY }; }; + + const animate = () => { + const w = window.innerWidth; + const h = window.innerHeight; + + const nextX = x + vx * speed; + const nextY = y + vy * speed; + + const { collidedX, collidedY } = detectCollision(nextX, nextY, w, h); + + if (collidedX) vx *= -1; + if (collidedY) vy *= -1; + + x += vx * speed; + y += vy * speed; + + setPos({ x, y }); + setVel({ x: vx, y: vy }); + + frame = requestAnimationFrame(animate); + }; + + frame = requestAnimationFrame(animate); + return () => cancelAnimationFrame(frame); }, []); - useEffect(() => { - if (dimensions.width && dimensions.height) { - initParticles(dimensions.width, dimensions.height); - animate(); - } - - return () => { - if (animationRef.current) { - cancelAnimationFrame(animationRef.current); - } - }; - }, [dimensions]); - return (
- - - {children} + Logo +
{children}
); -}; +}