Skip to content

Commit 1346787

Browse files
feat(v2.1): Complete UI overhaul, Spatial Hashing engine and Documentation sync
1 parent 8de9130 commit 1346787

21 files changed

Lines changed: 2194 additions & 74 deletions

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,44 @@ All notable changes to OrbitView will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
---
9+
10+
## [2.1.0] - 2025-12-29
11+
12+
### Added
13+
- **Scientific HUD:** Completely redesigned Glassmorphism interface
14+
- `GlassPanel` - Base container with backdrop blur and neon effects
15+
- `MissionControl` - Top HUD bar with live/paused status indicator
16+
- `TelemetryDeck` - Bottom panel showing real-time satellite telemetry
17+
- Neon glow effects and scan-line animations
18+
- **Time Machine:** YouTube-style draggable timeline (`TimeScrubber`)
19+
- Zustand-powered state management (`timelineStore.ts`)
20+
- Speed multiplier controls (0.1× to 3600×)
21+
- Bidirectional sync with Cesium Clock (100ms throttle)
22+
- **Physics Core:** Spatial Hashing engine for 25k+ satellite performance
23+
- 1000km³ grid cell structure in `satellite.worker.ts`
24+
- O(N²) → O(N×k) complexity reduction for link calculation
25+
- **Camera:** Velocity-vector locked "Satellite POV" mode
26+
- Quaternion-based orientation with Gram-Schmidt orthogonalization
27+
- Prograde direction following with radial "up" vector
28+
- **Export:** Full data export functionality in InfoPanel
29+
- TLE format (`.tle`)
30+
- CSV telemetry export
31+
- JSON full data export
32+
33+
### Changed
34+
- **State Management:** Migrated from React Context to Zustand for timeline control
35+
- **UI Borders:** Thinner `border-white/5` for modern glassmorphism
36+
- **Backdrop Blur:** Upgraded to `backdrop-blur-2xl`
37+
- **Shadows:** Added colored shadows (`shadow-cyan-500/5`)
38+
39+
### Fixed
40+
- **SSR Hydration:** Added `mounted` state pattern to fix clock mismatch
41+
- **Mobile UX:** Safe area insets (`env(safe-area-inset-bottom)`) for iPhone
42+
- **Bottom Sheet:** Improved handle bar styling
43+
44+
---
45+
846
## [1.0.0] - 2024-12-19
947

1048
### Added

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@
2525

2626
## ✨ Features
2727

28+
### 🎨 v2.0 UI Revolution
29+
- 🖥️ **Cinematic HUD & Glassmorphism UI** - Sci-Fi inspired interface with backdrop blur, neon accents, and scan-line effects
30+
- ⏱️ **Time Scrubber & Replay System** - YouTube-style draggable timeline with Zustand-powered state
31+
- 🎥 **Satellite Cockpit View (POV)** - Velocity-vector locked camera with Quaternion orientation
32+
33+
### ⚡ v2.0 Performance
34+
- 🧮 **Spatial Hashing Collision Engine** - O(N) link calculation with 1000km³ grid cells
35+
- 📊 **Scientific Data Export** - TLE, CSV, and JSON format export for research
36+
37+
### 🌍 Core Features
2838
- 🌍 **Interactive 3D Globe** - Real-time visualization of 25,000+ satellites and space objects
2939
- 🔬 **Scientific Analysis** - Doppler shift, orbital decay, conjunction analysis, pass prediction
3040
- 🛰️ **Professional TLE Hub** - Multi-source fallback (Space-Track, CelesTrak, AMSAT)
@@ -66,6 +76,8 @@ Open [http://localhost:3000](http://localhost:3000) to see the app.
6676
| [Next.js 16](https://nextjs.org/) | React framework with App Router |
6777
| [CesiumJS](https://cesium.com/) + [Resium](https://resium.reearth.io/) | 3D globe visualization |
6878
| [satellite.js](https://github.com/shashwatak/satellite-js) | SGP4/SDP4 orbital propagation |
79+
| [Zustand](https://zustand-demo.pmnd.rs/) | High-performance state management |
80+
| [Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API) | Spatial Hashing physics engine |
6981
| [TailwindCSS](https://tailwindcss.com/) | Utility-first CSS |
7082
| [Framer Motion](https://www.framer.com/motion/) | Animations |
7183
| [Lucide React](https://lucide.dev/) | Icons |
@@ -205,5 +217,5 @@ You can test the latest stable version of OrbitView here:
205217
---
206218

207219
<div align="center">
208-
Made with ❤️ for space enthusiasts | Last updated: 2025-12-20
220+
Made with ❤️ for space enthusiasts | v2.1.0 | Last updated: 2025-12-29
209221
</div>

package-lock.json

Lines changed: 33 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343
"resium": "^1.19.1",
4444
"satellite.js": "^6.0.1",
4545
"sonner": "^2.0.7",
46-
"tailwind-merge": "^3.4.0"
46+
"tailwind-merge": "^3.4.0",
47+
"zustand": "^5.0.9"
4748
},
4849
"devDependencies": {
4950
"@tailwindcss/postcss": "^4",
@@ -63,4 +64,4 @@
6364
"ts-jest": "^29.4.6",
6465
"typescript": "^5"
6566
}
66-
}
67+
}

src/app/globals.css

Lines changed: 100 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,121 @@
11
@import "tailwindcss";
22

33
:root {
4-
--background: #ffffff;
5-
--foreground: #171717;
4+
--background: #020617;
5+
--foreground: #ededed;
6+
7+
/* HUD Color Palette */
8+
--hud-cyan: #06b6d4;
9+
--hud-cyan-glow: rgba(6, 182, 212, 0.4);
10+
--hud-rose: #f43f5e;
11+
--hud-rose-glow: rgba(244, 63, 94, 0.4);
12+
--hud-emerald: #10b981;
13+
--hud-purple: #a855f7;
14+
--hud-bg: #020617;
15+
--hud-panel: rgba(15, 23, 42, 0.6);
16+
17+
/* Font Variables */
18+
--font-heading: var(--font-rajdhani), 'Rajdhani', sans-serif;
19+
--font-data: var(--font-jetbrains), 'JetBrains Mono', monospace;
620
}
721

822
@theme inline {
923
--color-background: var(--background);
1024
--color-foreground: var(--foreground);
11-
--font-sans: var(--font-geist-sans);
12-
--font-mono: var(--font-geist-mono);
25+
--font-sans: var(--font-rajdhani);
26+
--font-mono: var(--font-jetbrains);
1327
}
1428

1529
@media (prefers-color-scheme: dark) {
1630
:root {
17-
--background: #0a0a0a;
31+
--background: #020617;
1832
--foreground: #ededed;
1933
}
2034
}
2135

2236
body {
23-
background: var(--background);
37+
background: var(--hud-bg);
2438
color: var(--foreground);
25-
font-family: Arial, Helvetica, sans-serif;
39+
font-family: var(--font-heading);
40+
}
41+
42+
/* HUD Typography */
43+
.font-heading {
44+
font-family: var(--font-heading);
45+
font-weight: 600;
46+
letter-spacing: 0.05em;
47+
text-transform: uppercase;
48+
}
49+
50+
.font-data {
51+
font-family: var(--font-data);
52+
font-weight: 400;
53+
letter-spacing: 0.02em;
54+
}
55+
56+
/* Neon Glow Effects */
57+
.neon-glow-cyan {
58+
box-shadow: 0 0 20px var(--hud-cyan-glow), 0 0 40px rgba(6, 182, 212, 0.2);
59+
}
60+
61+
.neon-glow-rose {
62+
box-shadow: 0 0 20px var(--hud-rose-glow), 0 0 40px rgba(244, 63, 94, 0.2);
63+
}
64+
65+
.neon-text-cyan {
66+
color: var(--hud-cyan);
67+
text-shadow: 0 0 10px var(--hud-cyan-glow), 0 0 20px var(--hud-cyan-glow);
68+
}
69+
70+
.neon-text-rose {
71+
color: var(--hud-rose);
72+
text-shadow: 0 0 10px var(--hud-rose-glow), 0 0 20px var(--hud-rose-glow);
73+
}
74+
75+
/* Scan Line Animation */
76+
@keyframes scan-line {
77+
0% {
78+
transform: translateY(-100%);
79+
}
80+
100% {
81+
transform: translateY(100%);
82+
}
83+
}
84+
85+
.animate-scan-line {
86+
animation: scan-line 3s linear infinite;
87+
}
88+
89+
/* Pulse Glow Animation */
90+
@keyframes neon-pulse {
91+
0%, 100% {
92+
opacity: 1;
93+
filter: brightness(1);
94+
}
95+
50% {
96+
opacity: 0.8;
97+
filter: brightness(1.2);
98+
}
99+
}
100+
101+
.animate-neon-pulse {
102+
animation: neon-pulse 2s ease-in-out infinite;
103+
}
104+
105+
/* Live Indicator Pulse */
106+
@keyframes live-pulse {
107+
0%, 100% {
108+
transform: scale(1);
109+
opacity: 1;
110+
}
111+
50% {
112+
transform: scale(1.2);
113+
opacity: 0.7;
114+
}
115+
}
116+
117+
.animate-live-pulse {
118+
animation: live-pulse 1.5s ease-in-out infinite;
26119
}
27120

28121
/* Custom Scrollbar */

src/app/layout.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import type { Metadata } from "next";
2-
import { Geist, Geist_Mono } from "next/font/google";
2+
import { Rajdhani, JetBrains_Mono } from "next/font/google";
33
import { LocaleProvider } from "@/hooks/useLocale";
44
import { ServiceWorkerRegistration } from "@/components/ServiceWorkerRegistration";
55
import "./globals.css";
66

7-
const geistSans = Geist({
8-
variable: "--font-geist-sans",
7+
const rajdhani = Rajdhani({
8+
variable: "--font-rajdhani",
99
subsets: ["latin"],
10+
weight: ["500", "600", "700"],
1011
});
1112

12-
const geistMono = Geist_Mono({
13-
variable: "--font-geist-mono",
13+
const jetbrainsMono = JetBrains_Mono({
14+
variable: "--font-jetbrains",
1415
subsets: ["latin"],
16+
weight: ["400", "500"],
1517
});
1618

1719
export const metadata: Metadata = {
@@ -95,7 +97,7 @@ export default function RootLayout({
9597
return (
9698
<html lang="en" suppressHydrationWarning>
9799
<body
98-
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
100+
className={`${rajdhani.variable} ${jetbrainsMono.variable} antialiased bg-slate-950`}
99101
>
100102
<LocaleProvider>
101103
<ServiceWorkerRegistration />

0 commit comments

Comments
 (0)