From d3ff1950b85971216d0a85ddfcbe0f6dbcc3f5ab Mon Sep 17 00:00:00 2001 From: Pixel Date: Sun, 15 Mar 2026 09:48:53 +0100 Subject: [PATCH] feat: Replace static text with dynamic Gate component --- app/components/Gate.tsx | 63 +++++++++++++++++++++++++++++++++++++++++ app/page.tsx | 19 ++----------- 2 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 app/components/Gate.tsx diff --git a/app/components/Gate.tsx b/app/components/Gate.tsx new file mode 100644 index 0000000..e9cfa75 --- /dev/null +++ b/app/components/Gate.tsx @@ -0,0 +1,63 @@ +"use client"; + +import React, { useRef, useMemo } from 'react'; +import { Canvas, useFrame } from '@react-three/fiber'; +import * as THREE from 'three'; + +function ParticleRing() { + const pointsRef = useRef(null); + const particleCount = 500; + + const positions = useMemo(() => { + const pos = new Float32Array(particleCount * 3); + const radius = 2.5; + for (let i = 0; i < particleCount; i++) { + const theta = Math.random() * Math.PI * 2; + const r = radius + (Math.random() - 0.5) * 0.5; + pos[i * 3] = Math.cos(theta) * r; + pos[i * 3 + 1] = (Math.random() - 0.5) * 0.5; + pos[i * 3 + 2] = Math.sin(theta) * r; + } + return pos; + }, []); + + useFrame((_, delta) => { + if (pointsRef.current) { + pointsRef.current.rotation.y += delta * 0.15; + pointsRef.current.rotation.x += delta * 0.05; + } + }); + + return ( + + + + + + + ); +} + +export default function Gate() { + return ( +
+ + + +
+ ); +} diff --git a/app/page.tsx b/app/page.tsx index 6a3a504..d675a1d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -29,18 +29,7 @@ function ParticleField() { ); } -// Runic Status Display (vereinfacht) -function RunicStatus() { - return ( -
-

Pixel

-

Architektin der FaeBits-Anderswelt

-
- ⚡ Status: Online -
-
- ); -} +import Gate from './components/Gate'; export default function Home() { return ( @@ -50,13 +39,11 @@ export default function Home() { - - -
-

Warte auf den ersten Schritt ins Tor...

+
+
);