From 1b166292a9d11f99e3df86c5ad79ac0197524038 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 22 Feb 2026 13:04:38 +0000 Subject: [PATCH] run demo --- assets/css/custom.css | 345 ++++++++---------------------------------- assets/js/game.js | 222 +++++++++++++++++++++++++++ index.php | 183 +++++++++------------- 3 files changed, 354 insertions(+), 396 deletions(-) create mode 100644 assets/js/game.js diff --git a/assets/css/custom.css b/assets/css/custom.css index 50e0502..04a9044 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,302 +1,77 @@ -body { - background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab); - background-size: 400% 400%; - animation: gradient 15s ease infinite; - color: #212529; - font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - font-size: 14px; - margin: 0; - min-height: 100vh; +:root { + --primary: #39FF14; + --bg: #050505; + --text: #ffffff; } -.main-wrapper { - display: flex; - align-items: center; - justify-content: center; - min-height: 100vh; - width: 100%; - padding: 20px; - box-sizing: border-box; - position: relative; - z-index: 1; +body, html, #root { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + background-color: var(--bg); + font-family: 'Inter', system-ui, -apple-system, sans-serif; + color: var(--text); } -@keyframes gradient { - 0% { - background-position: 0% 50%; - } - 50% { - background-position: 100% 50%; - } - 100% { - background-position: 0% 50%; - } +#ui-layer { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 40px; + box-sizing: border-box; + z-index: 10; } -.chat-container { - width: 100%; - max-width: 600px; - background: rgba(255, 255, 255, 0.85); - border: 1px solid rgba(255, 255, 255, 0.3); - border-radius: 20px; - display: flex; - flex-direction: column; - height: 85vh; - box-shadow: 0 20px 40px rgba(0,0,0,0.2); - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - overflow: hidden; +.speed-indicator { + display: flex; + flex-direction: column; + gap: 8px; + width: 200px; } -.chat-header { - padding: 1.5rem; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - background: rgba(255, 255, 255, 0.5); - font-weight: 700; - font-size: 1.1rem; - display: flex; - justify-content: space-between; - align-items: center; +.speed-label { + font-size: 12px; + text-transform: uppercase; + letter-spacing: 2px; + opacity: 0.6; } -.chat-messages { - flex: 1; - overflow-y: auto; - padding: 1.5rem; - display: flex; - flex-direction: column; - gap: 1.25rem; +.speed-bar-container { + height: 4px; + background: rgba(255, 255, 255, 0.1); + border-radius: 2px; + overflow: hidden; } -/* Custom Scrollbar */ -::-webkit-scrollbar { - width: 6px; +.speed-bar { + height: 100%; + background: var(--primary); + width: 0%; + transition: width 0.1s ease-out; + box-shadow: 0 0 10px var(--primary); } -::-webkit-scrollbar-track { - background: transparent; +.instructions { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + opacity: 0.4; + font-weight: 300; + letter-spacing: 1px; + pointer-events: none; + transition: opacity 1s ease; } -::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.3); - border-radius: 10px; +.instructions.hidden { + opacity: 0; } - -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); -} - -.message { - max-width: 85%; - padding: 0.85rem 1.1rem; - border-radius: 16px; - line-height: 1.5; - font-size: 0.95rem; - box-shadow: 0 4px 15px rgba(0,0,0,0.05); - animation: fadeIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); -} - -@keyframes fadeIn { - from { opacity: 0; transform: translateY(20px) scale(0.95); } - to { opacity: 1; transform: translateY(0) scale(1); } -} - -.message.visitor { - align-self: flex-end; - background: linear-gradient(135deg, #212529 0%, #343a40 100%); - color: #fff; - border-bottom-right-radius: 4px; -} - -.message.bot { - align-self: flex-start; - background: #ffffff; - color: #212529; - border-bottom-left-radius: 4px; -} - -.chat-input-area { - padding: 1.25rem; - background: rgba(255, 255, 255, 0.5); - border-top: 1px solid rgba(0, 0, 0, 0.05); -} - -.chat-input-area form { - display: flex; - gap: 0.75rem; -} - -.chat-input-area input { - flex: 1; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 12px; - padding: 0.75rem 1rem; - outline: none; - background: rgba(255, 255, 255, 0.9); - transition: all 0.3s ease; -} - -.chat-input-area input:focus { - border-color: #23a6d5; - box-shadow: 0 0 0 3px rgba(35, 166, 213, 0.2); -} - -.chat-input-area button { - background: #212529; - color: #fff; - border: none; - padding: 0.75rem 1.5rem; - border-radius: 12px; - cursor: pointer; - font-weight: 600; - transition: all 0.3s ease; -} - -.chat-input-area button:hover { - background: #000; - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0,0,0,0.2); -} - -/* Background Animations */ -.bg-animations { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 0; - overflow: hidden; - pointer-events: none; -} - -.blob { - position: absolute; - width: 500px; - height: 500px; - background: rgba(255, 255, 255, 0.2); - border-radius: 50%; - filter: blur(80px); - animation: move 20s infinite alternate cubic-bezier(0.45, 0, 0.55, 1); -} - -.blob-1 { - top: -10%; - left: -10%; - background: rgba(238, 119, 82, 0.4); -} - -.blob-2 { - bottom: -10%; - right: -10%; - background: rgba(35, 166, 213, 0.4); - animation-delay: -7s; - width: 600px; - height: 600px; -} - -.blob-3 { - top: 40%; - left: 30%; - background: rgba(231, 60, 126, 0.3); - animation-delay: -14s; - width: 450px; - height: 450px; -} - -@keyframes move { - 0% { transform: translate(0, 0) rotate(0deg) scale(1); } - 33% { transform: translate(150px, 100px) rotate(120deg) scale(1.1); } - 66% { transform: translate(-50px, 200px) rotate(240deg) scale(0.9); } - 100% { transform: translate(0, 0) rotate(360deg) scale(1); } -} - -.admin-link { - font-size: 14px; - color: #fff; - text-decoration: none; - background: rgba(0, 0, 0, 0.2); - padding: 0.5rem 1rem; - border-radius: 8px; - transition: all 0.3s ease; -} - -.admin-link:hover { - background: rgba(0, 0, 0, 0.4); - text-decoration: none; -} - -/* Admin Styles */ -.admin-container { - max-width: 900px; - margin: 3rem auto; - padding: 2.5rem; - background: rgba(255, 255, 255, 0.85); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border-radius: 24px; - box-shadow: 0 20px 50px rgba(0,0,0,0.15); - border: 1px solid rgba(255, 255, 255, 0.4); - position: relative; - z-index: 1; -} - -.admin-container h1 { - margin-top: 0; - color: #212529; - font-weight: 800; -} - -.table { - width: 100%; - border-collapse: separate; - border-spacing: 0 8px; - margin-top: 1.5rem; -} - -.table th { - background: transparent; - border: none; - padding: 1rem; - color: #6c757d; - font-weight: 600; - text-transform: uppercase; - font-size: 0.75rem; - letter-spacing: 1px; -} - -.table td { - background: #fff; - padding: 1rem; - border: none; -} - -.table tr td:first-child { border-radius: 12px 0 0 12px; } -.table tr td:last-child { border-radius: 0 12px 12px 0; } - -.form-group { - margin-bottom: 1.25rem; -} - -.form-group label { - display: block; - margin-bottom: 0.5rem; - font-weight: 600; - font-size: 0.9rem; -} - -.form-control { - width: 100%; - padding: 0.75rem 1rem; - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 12px; - background: #fff; - transition: all 0.3s ease; - box-sizing: border-box; -} - -.form-control:focus { - outline: none; - border-color: #23a6d5; - box-shadow: 0 0 0 3px rgba(35, 166, 213, 0.1); -} \ No newline at end of file diff --git a/assets/js/game.js b/assets/js/game.js new file mode 100644 index 0000000..14a7689 --- /dev/null +++ b/assets/js/game.js @@ -0,0 +1,222 @@ +import React, { useState, useEffect, useRef, useMemo, Suspense } from 'https://esm.sh/react'; +import ReactDOM from 'https://esm.sh/react-dom/client'; +import * as THREE from 'https://esm.sh/three'; +import { Canvas, useFrame, useThree } from 'https://esm.sh/@react-three/fiber'; +import { useGLTF, useAnimations, PerspectiveCamera, Environment, Stars, Float } from 'https://esm.sh/@react-three/drei'; + +const MODEL_URL = 'https://raw.githubusercontent.com/mrdoob/three.js/master/examples/models/gltf/Horse.glb'; + +function Animal({ velocity }) { + const group = useRef(); + const { scene, animations } = useGLTF(MODEL_URL); + const { actions } = useAnimations(animations, group); + + useEffect(() => { + // Horse model usually has an animation named 'run' or the first one is the run loop + const animationName = animations[0]?.name; + if (actions[animationName]) { + actions[animationName].play(); + } + return () => actions[animationName]?.stop(); + }, [actions, animations]); + + useFrame((state, delta) => { + const animationName = animations[0]?.name; + if (actions[animationName]) { + const animScale = 0.2 + (velocity * 3.5); + actions[animationName].setEffectiveTimeScale(animScale); + } + + if (group.current) { + group.current.rotation.z = THREE.MathUtils.lerp(group.current.rotation.z, (velocity * 0.1), 0.1); + group.current.position.y = Math.sin(state.clock.elapsedTime * 15 * velocity) * 0.1 * velocity; + } + }); + + return ( + + + + ); +} + +function InfiniteGround({ velocity }) { + const meshRef = useRef(); + const texture = useMemo(() => { + const canvas = document.createElement('canvas'); + canvas.width = 512; + canvas.height = 512; + const ctx = canvas.getContext('2d'); + ctx.fillStyle = '#050505'; + ctx.fillRect(0, 0, 512, 512); + ctx.strokeStyle = '#39FF1444'; + ctx.lineWidth = 1; + ctx.strokeRect(0, 0, 512, 512); + const tex = new THREE.CanvasTexture(canvas); + tex.wrapS = tex.wrapT = THREE.RepeatWrapping; + tex.repeat.set(100, 100); + return tex; + }, []); + + useFrame((state, delta) => { + const speed = velocity * 25 * delta; + meshRef.current.material.map.offset.y += speed; + }); + + return ( + + + + + ); +} + +function Trees({ velocity }) { + const count = 40; + const trees = useMemo(() => { + const arr = []; + for (let i = 0; i < count; i++) { + arr.push({ + id: i, + position: [ + (Math.random() - 0.5) * 60 + (Math.random() > 0.5 ? 15 : -15), + 0, + -Math.random() * 200 + ], + scale: 0.5 + Math.random() * 2 + }); + } + return arr; + }, []); + + const groupRef = useRef(); + + useFrame((state, delta) => { + const speed = velocity * 25 * delta; + groupRef.current.children.forEach((child) => { + child.position.z += speed; + if (child.position.z > 20) { + child.position.z = -180; + } + }); + }); + + return ( + + {trees.map((tree) => ( + + + + + + + + + + + ))} + + ); +} + +function GameScene({ velocity }) { + return ( + <> + + + + + + + + + + + + + + + + + + + ); +} + +function GameBridge({ onUpdate, onStart }) { + const targetVelocity = useRef(0); + const velocity = useRef(0); + + useEffect(() => { + const handleScroll = (e) => { + onStart(); + // Increased sensitivity for better feel + const delta = Math.abs(e.deltaY) * 0.008; + targetVelocity.current = Math.min(targetVelocity.current + delta, 1); + }; + window.addEventListener('wheel', handleScroll, { passive: true }); + return () => window.removeEventListener('wheel', handleScroll); + }, [onStart]); + + useFrame((state, delta) => { + // Deceleration + targetVelocity.current = Math.max(targetVelocity.current - (0.4 * delta), 0); + // Smooth lerp + velocity.current = THREE.MathUtils.lerp(velocity.current, targetVelocity.current, 0.1); + onUpdate(velocity.current); + + // Speed-based effects + state.camera.fov = 50 + (velocity.current * 25); + state.camera.updateProjectionMatrix(); + + if (velocity.current > 0.4) { + state.camera.position.x = (Math.random() - 0.5) * 0.08 * velocity.current; + state.camera.position.y = 2 + (Math.random() - 0.5) * 0.08 * velocity.current; + state.camera.position.z = 6 + (Math.random() - 0.5) * 0.04 * velocity.current; + } else { + state.camera.position.x = THREE.MathUtils.lerp(state.camera.position.x, 0, 0.1); + state.camera.position.y = THREE.MathUtils.lerp(state.camera.position.y, 2, 0.1); + state.camera.position.z = THREE.MathUtils.lerp(state.camera.position.z, 6, 0.1); + } + }); + + return null; +} + +function App() { + const [velocity, setVelocity] = useState(0); + const [showInstructions, setShowInstructions] = useState(true); + + const onFrameUpdate = (v) => setVelocity(v); + + return ( +
+ + + setShowInstructions(false)} /> + + +
+
+
Velocity
+
+
+
+
+
+ +
+ SCROLL TO RUN +
+
+ ); +} + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render(); \ No newline at end of file diff --git a/index.php b/index.php index 7205f3d..c3f3196 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,111 @@ - New Style - + <?= htmlspecialchars($projectName) ?> - - - + - - - - + + -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

-
-
-
- Page updated: (UTC) -
+
+
+
LOADING 3D ENGINE
+
+ +
+ + + + + + - + \ No newline at end of file