CarbonO2 commited on
Commit
dfafa4e
·
verified ·
1 Parent(s): d53256d

Upload pages/index.js with huggingface_hub

Browse files
Files changed (1) hide show
  1. pages/index.js +212 -0
pages/index.js ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useRef, useEffect } from 'react';
2
+ import { Canvas } from '@react-three/fiber';
3
+ import { OrbitControls, Stars } from '@react-three/drei';
4
+ import * as THREE from 'three';
5
+ import Navbar from '../components/Navbar';
6
+ import PlanetInfo from '../components/PlanetInfo';
7
+ import StarField from '../components/StarField';
8
+ import Sun from '../components/Sun';
9
+ import Planet from '../components/Planet';
10
+
11
+ export default function SolarSystem() {
12
+ const [selectedPlanet, setSelectedPlanet] = useState(null);
13
+ const [speed, setSpeed] = useState(1);
14
+ const [cameraDistance, setCameraDistance] = useState(100);
15
+ const [viewMode, setViewMode] = useState('solar-system');
16
+ const [planetData, setPlanetData] = useState(null);
17
+
18
+ // Planet data configuration
19
+ const planets = [
20
+ {
21
+ name: "Mercury",
22
+ size: 2,
23
+ distance: 30,
24
+ speed: 0.04,
25
+ color: "#A5A5A5",
26
+ texture: null,
27
+ onClick: () => handlePlanetClick("mercury")
28
+ },
29
+ {
30
+ name: "Venus",
31
+ size: 3.5,
32
+ distance: 45,
33
+ speed: 0.03,
34
+ color: "#E3BB76",
35
+ texture: null,
36
+ onClick: () => handlePlanetClick("venus")
37
+ },
38
+ {
39
+ name: "Earth",
40
+ size: 3.6,
41
+ distance: 60,
42
+ speed: 0.02,
43
+ color: "#22A6B3",
44
+ texture: null,
45
+ onClick: () => handlePlanetClick("earth")
46
+ },
47
+ {
48
+ name: "Mars",
49
+ size: 2.8,
50
+ distance: 75,
51
+ speed: 0.018,
52
+ color: "#FF6B6B",
53
+ texture: null,
54
+ onClick: () => handlePlanetClick("mars")
55
+ },
56
+ {
57
+ name: "Jupiter",
58
+ size: 10,
59
+ distance: 100,
60
+ speed: 0.012,
61
+ color: "#DDA15E",
62
+ texture: null,
63
+ onClick: () => handlePlanetClick("jupiter")
64
+ },
65
+ {
66
+ name: "Saturn",
67
+ size: 8.5,
68
+ distance: 130,
69
+ speed: 0.01,
70
+ color: "#BC8F5F",
71
+ texture: null,
72
+ hasRings: true,
73
+ onClick: () => handlePlanetClick("saturn")
74
+ },
75
+ {
76
+ name: "Uranus",
77
+ size: 6,
78
+ distance: 160,
79
+ speed: 0.008,
80
+ color: "#7ED6DF",
81
+ texture: null,
82
+ onClick: () => handlePlanetClick("uranus")
83
+ },
84
+ {
85
+ name: "Neptune",
86
+ size: 5.8,
87
+ distance: 190,
88
+ speed: 0.006,
89
+ color: "#219EBD",
90
+ texture: null,
91
+ onClick: () => handlePlanetClick("neptune")
92
+ }
93
+ ];
94
+
95
+ const handlePlanetClick = (planetName) => {
96
+ setSelectedPlanet(planetName);
97
+ // Update camera position for better view
98
+ setCameraDistance(40);
99
+ };
100
+
101
+ const handleClosePlanetInfo = () => {
102
+ setSelectedPlanet(null);
103
+ setCameraDistance(100);
104
+ };
105
+
106
+ return (
107
+ <div className="min-h-screen bg-black text-white font-sans overflow-hidden">
108
+ {/* Navbar */}
109
+ <Navbar
110
+ setView={setViewMode}
111
+ speed={speed}
112
+ setSpeed={setSpeed}
113
+ />
114
+
115
+ {/* 3D Canvas */}
116
+ <div className="h-screen w-full relative">
117
+ <Canvas camera={{ position: [0, 80, 100], fov: 60 }}>
118
+ {/* Lights */}
119
+ <ambientLight intensity={0.2} />
120
+ <pointLight position={[100, 100, 50]} intensity={1} color="#FFFFFF" />
121
+
122
+ {/* Controls */}
123
+ <OrbitControls
124
+ enablePan={false}
125
+ minDistance={20}
126
+ maxDistance={500}
127
+ rotateSpeed={0.5}
128
+ zoomSpeed={0.8}
129
+ dampingFactor={0.1}
130
+ />
131
+
132
+ {/* Starfield */}
133
+ <StarField count={2000} />
134
+
135
+ {/* Sun */}
136
+ <Sun
137
+ onClick={() => handlePlanetClick('sun')}
138
+ />
139
+
140
+ {/* Planets */}
141
+ {planets.map((planet) => (
142
+ <Planet
143
+ key={planet.name}
144
+ name={planet.name}
145
+ size={planet.size}
146
+ distance={planet.distance}
147
+ speed={planet.speed * speed}
148
+ color={planet.color}
149
+ texture={planet.texture}
150
+ onClick={planet.onClick}
151
+ hasRings={planet.hasRings}
152
+ />
153
+ ))}
154
+
155
+ {/* Orbit lines for clarity */}
156
+ <group>
157
+ {planets.map((planet, i) => (
158
+ <mesh key={`orbit-${i}`} rotation={[-Math.PI / 2, 0, 0]}>
159
+ <ringGeometry args={[planet.distance - 0.2, planet.distance + 0.2, 64]} />
160
+ <meshBasicMaterial color="#FFFFFF" transparent opacity={0.05} />
161
+ </mesh>
162
+ ))}
163
+ </group>
164
+ </Canvas>
165
+
166
+ {/* Planet Info Modal */}
167
+ {selectedPlanet && (
168
+ <PlanetInfo
169
+ planet={selectedPlanet}
170
+ onClose={handleClosePlanetInfo}
171
+ />
172
+ )}
173
+
174
+ {/* Info Panel */}
175
+ <div className="absolute bottom-6 left-6 right-6 md:left-10 md:right-auto md:w-80 bg-black/60 backdrop-blur-md rounded-xl border border-white/10 p-6 z-10">
176
+ <h2 className="text-xl font-bold mb-3 bg-gradient-to-r from-cyan-400 to-purple-500 bg-clip-text text-transparent">
177
+ Interactive Solar System
178
+ </h2>
179
+ <p className="text-gray-300 mb-4 text-sm">
180
+ Click on any planet to learn more about it. Use your mouse to rotate, zoom, and explore the solar system.
181
+ </p>
182
+ <div className="space-y-2 text-xs text-gray-400">
183
+ <div className="flex items-center gap-2">
184
+ <div className="w-3 h-3 rounded-full bg-yellow-400 shadow-[0_0_8px_rgba(253,224,71,0.8)]"></div>
185
+ <span>Click the Sun or planets to explore</span>
186
+ </div>
187
+ <div className="flex items-center gap-2">
188
+ <div className="w-3 h-3 rounded-full bg-blue-500"></div>
189
+ <span>Earth is our home planet</span>
190
+ </div>
191
+ <div className="flex items-center gap-2">
192
+ <div className="w-3 h-3 rounded-full bg-red-500"></div>
193
+ <span>Mars - the Red Planet</span>
194
+ </div>
195
+ </div>
196
+ </div>
197
+
198
+ {/* Footer Attribution */}
199
+ <div className="absolute bottom-4 right-4 z-10">
200
+ <a
201
+ href="https://huggingface.co/spaces/akhaliq/anycoder"
202
+ target="_blank"
203
+ rel="noopener noreferrer"
204
+ className="text-xs text-gray-500 hover:text-gray-300 transition-colors"
205
+ >
206
+ Built with anycoder
207
+ </a>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ );
212
+ }