PanGalactic Claude Opus 4.6 commited on
Commit
1042f89
Β·
1 Parent(s): 7599ab0

Redesign landing page with split hero and fresh screenshots

Browse files

Split hero layout with conversation screenshot, sticky navbar,
section tags, stats bar, 4 screenshots (status, telemetry,
conversation, settings). Matches top competition quality.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

index.html CHANGED
@@ -9,61 +9,91 @@
9
  </head>
10
  <body>
11
 
12
- <!-- Hero -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  <section class="hero">
14
  <div class="hero-bg"></div>
15
- <div class="hero-content">
16
- <div class="hero-badge">Reachy Mini Community App</div>
17
- <h1>Hello World</h1>
18
- <p class="hero-tagline">The all-in-one dashboard that turns your Reachy Mini into an AI-powered conversational robot with real-time telemetry, 71 emotions, 19 dances, music playback, and full system monitoring.</p>
19
- <div class="hero-stats">
20
- <div class="stat">
21
- <span class="stat-number">6</span>
22
- <span class="stat-label">AI Providers</span>
23
- </div>
24
- <div class="stat">
25
- <span class="stat-number">71</span>
26
- <span class="stat-label">Emotions</span>
27
- </div>
28
- <div class="stat">
29
- <span class="stat-number">19</span>
30
- <span class="stat-label">Dances</span>
31
- </div>
32
- <div class="stat">
33
- <span class="stat-number">13</span>
34
- <span class="stat-label">AI Tools</span>
35
- </div>
36
- <div class="stat">
37
- <span class="stat-number">4</span>
38
- <span class="stat-label">WebSockets</span>
39
  </div>
40
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  </div>
42
  </section>
43
 
44
- <!-- Screenshot Showcase -->
45
- <section class="showcase">
46
  <div class="container">
47
- <div class="showcase-grid">
48
- <div class="showcase-item showcase-large">
49
- <img src="screenshots/status-tab.png" alt="System telemetry dashboard showing CPU, RAM, disk, network, WiFi, thermal charts, top processes, and hardware inventory" loading="lazy" />
50
- <div class="showcase-label">
 
 
51
  <strong>System Telemetry</strong>
52
- <span>9 live charts, top processes, hardware inventory</span>
53
  </div>
54
  </div>
55
- <div class="showcase-item">
56
- <img src="screenshots/telemetry-tab.png" alt="3D MuJoCo robot viewer with head telemetry showing roll, pitch, yaw, translation, and Stewart platform joint angles" loading="lazy" />
57
- <div class="showcase-label">
58
  <strong>3D Robot View</strong>
59
- <span>MuJoCo simulation + head pose telemetry</span>
60
  </div>
61
  </div>
62
- <div class="showcase-item">
63
- <img src="screenshots/conversation-active.png" alt="Live AI conversation showing tool calls β€” system check, dance moves, and clock β€” with model badges and transcript" loading="lazy" />
64
- <div class="showcase-label">
65
- <strong>AI Conversation</strong>
66
- <span>Live tool calls: system check, dance, clock</span>
67
  </div>
68
  </div>
69
  </div>
@@ -71,49 +101,52 @@
71
  </section>
72
 
73
  <!-- Features -->
74
- <section class="features">
75
  <div class="container">
76
- <h2 class="section-title">Everything Your Reachy Mini Needs</h2>
 
 
77
  <div class="feature-grid">
78
  <div class="feature-card accent-purple">
79
  <div class="feature-icon-wrap"><span>&#x1F4AC;</span></div>
80
  <h3>AI Conversation</h3>
81
- <p>Full voice pipeline: listen through the robot mic, transcribe with Whisper, chat with any LLM, speak the response back through TTS. Supports <strong>OpenAI, Anthropic, Groq, Gemini, DeepSeek</strong>, and <strong>ElevenLabs</strong>.</p>
82
  </div>
83
  <div class="feature-card accent-blue">
84
  <div class="feature-icon-wrap"><span>&#x1F441;</span></div>
85
  <h3>Vision (VLM)</h3>
86
- <p>Dedicated vision model selector with auto-detection of capable models per provider. Take a snapshot and the AI automatically describes what it sees. Ask "what do you see?" and Reachy looks and tells you.</p>
87
  </div>
88
  <div class="feature-card accent-green">
89
  <div class="feature-icon-wrap"><span>&#x1F3AD;</span></div>
90
  <h3>71 Emotions + 19 Dances</h3>
91
- <p>The AI uses emotions and dances expressively during conversation. Say something funny and Reachy laughs. Ask it to dance and it picks a move. From <em>amazed</em> to <em>thoughtful</em>, <em>chicken_peck</em> to <em>jackson_square</em>.</p>
92
  </div>
93
  <div class="feature-card accent-orange">
94
  <div class="feature-icon-wrap"><span>&#x1F4CA;</span></div>
95
  <h3>System Telemetry</h3>
96
- <p>9 live-updating charts: CPU (per-core), RAM (used/buffer/cache), disk, network throughput, WiFi signal, system load, fan speed, disk I/O, and temperature. Plus top processes and full hardware inventory.</p>
97
  </div>
98
  <div class="feature-card accent-cyan">
99
  <div class="feature-icon-wrap"><span>&#x1F579;</span></div>
100
  <h3>Head Control + 3D View</h3>
101
- <p>Interactive MuJoCo simulation with real-time joint visualization. Drag sliders to control head roll/pitch/yaw, X/Y/Z translation, and antenna positions. See Stewart platform actuator angles live.</p>
102
  </div>
103
  <div class="feature-card accent-pink">
104
  <div class="feature-icon-wrap"><span>&#x1F3B5;</span></div>
105
  <h3>Music + Audio</h3>
106
- <p>Upload music, play through the robot speaker via GStreamer, manage your library with metadata and cover art. Selectable audio routing: robot mic or browser mic input, robot speaker or browser output.</p>
107
  </div>
108
  </div>
109
  </div>
110
  </section>
111
 
112
  <!-- AI Tools -->
113
- <section class="tools-section">
114
  <div class="container">
115
- <h2 class="section-title">13 AI-Powered Tools</h2>
116
- <p class="section-subtitle">The LLM autonomously decides when to use these tools during natural conversation</p>
 
117
  <div class="tools-grid">
118
  <div class="tool-chip"><span class="tool-icon">&#x1F60A;</span> Play emotions</div>
119
  <div class="tool-chip"><span class="tool-icon">&#x1F57A;</span> Dance moves</div>
@@ -133,11 +166,13 @@
133
  </section>
134
 
135
  <!-- AI Pipeline -->
136
- <section class="pipeline-section">
137
  <div class="container">
138
- <h2 class="section-title">AI Pipeline</h2>
 
139
  <div class="pipeline-flow">
140
  <div class="pipeline-stage">
 
141
  <div class="stage-header">STT</div>
142
  <div class="stage-body">
143
  <div class="provider-tag">OpenAI Whisper</div>
@@ -146,6 +181,7 @@
146
  </div>
147
  <div class="pipeline-arrow">&#x2192;</div>
148
  <div class="pipeline-stage">
 
149
  <div class="stage-header">LLM</div>
150
  <div class="stage-body">
151
  <div class="provider-tag">OpenAI</div>
@@ -157,6 +193,7 @@
157
  </div>
158
  <div class="pipeline-arrow">&#x2192;</div>
159
  <div class="pipeline-stage">
 
160
  <div class="stage-header">TTS</div>
161
  <div class="stage-body">
162
  <div class="provider-tag">OpenAI</div>
@@ -167,6 +204,7 @@
167
  </div>
168
  <div class="pipeline-arrow">+</div>
169
  <div class="pipeline-stage">
 
170
  <div class="stage-header">VLM</div>
171
  <div class="stage-body">
172
  <div class="provider-tag">Auto-detected</div>
@@ -181,7 +219,8 @@
181
  <!-- WebSocket Architecture -->
182
  <section class="ws-section">
183
  <div class="container">
184
- <h2 class="section-title">Real-Time WebSocket Architecture</h2>
 
185
  <p class="section-subtitle">Zero polling. Everything streams live.</p>
186
  <div class="ws-grid">
187
  <div class="ws-card">
@@ -205,9 +244,10 @@
205
  </section>
206
 
207
  <!-- Getting Started -->
208
- <section class="getting-started">
209
  <div class="container">
210
- <h2 class="section-title">Get Started in 3 Steps</h2>
 
211
  <div class="steps-row">
212
  <div class="step">
213
  <div class="step-number">1</div>
 
9
  </head>
10
  <body>
11
 
12
+ <!-- Nav -->
13
+ <nav class="nav">
14
+ <div class="nav-inner">
15
+ <div class="nav-brand">
16
+ <span class="nav-icon">&#x1F916;</span>
17
+ <span class="nav-title">Hello World</span>
18
+ </div>
19
+ <div class="nav-links">
20
+ <a href="#features">Features</a>
21
+ <a href="#screenshots">Screenshots</a>
22
+ <a href="#tools">Tools</a>
23
+ <a href="#pipeline">Pipeline</a>
24
+ <a href="#setup">Setup</a>
25
+ </div>
26
+ </div>
27
+ </nav>
28
+
29
+ <!-- Hero β€” split layout -->
30
  <section class="hero">
31
  <div class="hero-bg"></div>
32
+ <div class="hero-split">
33
+ <div class="hero-text">
34
+ <div class="hero-badge">Reachy Mini Community App</div>
35
+ <h1>The all&#8209;in&#8209;one<br>dashboard for<br><span class="hero-accent">Reachy Mini</span></h1>
36
+ <p class="hero-tagline">AI conversation with 6 providers, 71 emotions, 19 dances, real-time telemetry, MuJoCo 3D viewer, music playback, and full system monitoring.</p>
37
+ <div class="hero-chips">
38
+ <span class="chip">&#x26A1; 6 AI Providers</span>
39
+ <span class="chip">&#x1F3AD; 71 Emotions</span>
40
+ <span class="chip">&#x1F57A; 19 Dances</span>
41
+ <span class="chip">&#x1F9E0; 13 AI Tools</span>
42
+ <span class="chip">&#x1F50C; 4 WebSockets</span>
43
+ <span class="chip">&#x1F3AE; MuJoCo 3D</span>
44
+ </div>
45
+ <div class="hero-tech">
46
+ <span class="tech-tag">Python</span>
47
+ <span class="tech-tag">FastAPI</span>
48
+ <span class="tech-tag">LiteLLM</span>
49
+ <span class="tech-tag">Vanilla JS</span>
50
+ <span class="tech-tag">WebSocket</span>
51
+ <span class="tech-tag">MuJoCo</span>
 
 
 
 
52
  </div>
53
  </div>
54
+ <div class="hero-image">
55
+ <img src="screenshots/conversation-active.png" alt="Live AI conversation with tool calls β€” system check, dance, and clock β€” showing model badges and real-time transcript" />
56
+ </div>
57
+ </div>
58
+ </section>
59
+
60
+ <!-- Stats bar -->
61
+ <section class="stats-bar">
62
+ <div class="container">
63
+ <div class="stat"><span class="stat-number">6</span><span class="stat-label">AI Providers</span></div>
64
+ <div class="stat"><span class="stat-number">71</span><span class="stat-label">Emotions</span></div>
65
+ <div class="stat"><span class="stat-number">19</span><span class="stat-label">Dances</span></div>
66
+ <div class="stat"><span class="stat-number">13</span><span class="stat-label">AI Tools</span></div>
67
+ <div class="stat"><span class="stat-number">4</span><span class="stat-label">WebSockets</span></div>
68
+ <div class="stat"><span class="stat-number">9</span><span class="stat-label">Live Charts</span></div>
69
  </div>
70
  </section>
71
 
72
+ <!-- Screenshots -->
73
+ <section class="screenshots" id="screenshots">
74
  <div class="container">
75
+ <h2 class="section-tag">Screenshots</h2>
76
+ <h3 class="section-title">See It In Action</h3>
77
+ <div class="screenshot-grid">
78
+ <div class="screenshot-card screenshot-wide">
79
+ <img src="screenshots/status-tab.png" alt="System telemetry dashboard with 9 live charts" loading="lazy" />
80
+ <div class="screenshot-caption">
81
  <strong>System Telemetry</strong>
82
+ <span>9 live charts &middot; top processes &middot; hardware inventory</span>
83
  </div>
84
  </div>
85
+ <div class="screenshot-card">
86
+ <img src="screenshots/telemetry-tab.png" alt="3D MuJoCo robot viewer with head telemetry" loading="lazy" />
87
+ <div class="screenshot-caption">
88
  <strong>3D Robot View</strong>
89
+ <span>MuJoCo simulation &middot; head pose telemetry</span>
90
  </div>
91
  </div>
92
+ <div class="screenshot-card">
93
+ <img src="screenshots/conversation-settings.png" alt="AI Provider Settings showing 6 configured providers" loading="lazy" />
94
+ <div class="screenshot-caption">
95
+ <strong>AI Provider Settings</strong>
96
+ <span>6 providers &middot; STT/LLM/VLM/TTS &middot; voice selection</span>
97
  </div>
98
  </div>
99
  </div>
 
101
  </section>
102
 
103
  <!-- Features -->
104
+ <section class="features" id="features">
105
  <div class="container">
106
+ <h2 class="section-tag">Features</h2>
107
+ <h3 class="section-title">Everything Your Reachy Mini Needs</h3>
108
+ <p class="section-subtitle">One app to rule them all β€” no other community app comes close.</p>
109
  <div class="feature-grid">
110
  <div class="feature-card accent-purple">
111
  <div class="feature-icon-wrap"><span>&#x1F4AC;</span></div>
112
  <h3>AI Conversation</h3>
113
+ <p>Full voice pipeline: robot mic &#x2192; Whisper STT &#x2192; LLM chat &#x2192; TTS response. Supports <strong>OpenAI, Anthropic, Groq, Gemini, DeepSeek</strong>, and <strong>ElevenLabs</strong>.</p>
114
  </div>
115
  <div class="feature-card accent-blue">
116
  <div class="feature-icon-wrap"><span>&#x1F441;</span></div>
117
  <h3>Vision (VLM)</h3>
118
+ <p>Dedicated vision model selector with auto-detection per provider. Ask <em>"what do you see?"</em> and Reachy looks through the camera and describes the scene.</p>
119
  </div>
120
  <div class="feature-card accent-green">
121
  <div class="feature-icon-wrap"><span>&#x1F3AD;</span></div>
122
  <h3>71 Emotions + 19 Dances</h3>
123
+ <p>The AI expresses itself with emotions and dances during conversation. Say something funny and Reachy laughs. Ask it to dance and it picks a move.</p>
124
  </div>
125
  <div class="feature-card accent-orange">
126
  <div class="feature-icon-wrap"><span>&#x1F4CA;</span></div>
127
  <h3>System Telemetry</h3>
128
+ <p>9 live charts: CPU per-core, RAM breakdown, disk, network, WiFi, load, fan speed, disk I/O, temperature. Plus top processes and hardware inventory.</p>
129
  </div>
130
  <div class="feature-card accent-cyan">
131
  <div class="feature-icon-wrap"><span>&#x1F579;</span></div>
132
  <h3>Head Control + 3D View</h3>
133
+ <p>Interactive MuJoCo simulation with real-time joints. Drag sliders for roll/pitch/yaw, X/Y/Z, and antennas. Stewart platform actuator angles live.</p>
134
  </div>
135
  <div class="feature-card accent-pink">
136
  <div class="feature-icon-wrap"><span>&#x1F3B5;</span></div>
137
  <h3>Music + Audio</h3>
138
+ <p>Upload music, play via GStreamer on the robot speaker, manage your library. Selectable audio routing: robot mic or browser mic, robot or browser speaker.</p>
139
  </div>
140
  </div>
141
  </div>
142
  </section>
143
 
144
  <!-- AI Tools -->
145
+ <section class="tools-section" id="tools">
146
  <div class="container">
147
+ <h2 class="section-tag">AI Tools</h2>
148
+ <h3 class="section-title">13 Tools the LLM Calls Autonomously</h3>
149
+ <p class="section-subtitle">Natural conversation triggers actions β€” no buttons needed.</p>
150
  <div class="tools-grid">
151
  <div class="tool-chip"><span class="tool-icon">&#x1F60A;</span> Play emotions</div>
152
  <div class="tool-chip"><span class="tool-icon">&#x1F57A;</span> Dance moves</div>
 
166
  </section>
167
 
168
  <!-- AI Pipeline -->
169
+ <section class="pipeline-section" id="pipeline">
170
  <div class="container">
171
+ <h2 class="section-tag">Architecture</h2>
172
+ <h3 class="section-title">AI Pipeline</h3>
173
  <div class="pipeline-flow">
174
  <div class="pipeline-stage">
175
+ <div class="stage-icon">&#x1F3A4;</div>
176
  <div class="stage-header">STT</div>
177
  <div class="stage-body">
178
  <div class="provider-tag">OpenAI Whisper</div>
 
181
  </div>
182
  <div class="pipeline-arrow">&#x2192;</div>
183
  <div class="pipeline-stage">
184
+ <div class="stage-icon">&#x1F9E0;</div>
185
  <div class="stage-header">LLM</div>
186
  <div class="stage-body">
187
  <div class="provider-tag">OpenAI</div>
 
193
  </div>
194
  <div class="pipeline-arrow">&#x2192;</div>
195
  <div class="pipeline-stage">
196
+ <div class="stage-icon">&#x1F50A;</div>
197
  <div class="stage-header">TTS</div>
198
  <div class="stage-body">
199
  <div class="provider-tag">OpenAI</div>
 
204
  </div>
205
  <div class="pipeline-arrow">+</div>
206
  <div class="pipeline-stage">
207
+ <div class="stage-icon">&#x1F441;</div>
208
  <div class="stage-header">VLM</div>
209
  <div class="stage-body">
210
  <div class="provider-tag">Auto-detected</div>
 
219
  <!-- WebSocket Architecture -->
220
  <section class="ws-section">
221
  <div class="container">
222
+ <h2 class="section-tag">Real-Time</h2>
223
+ <h3 class="section-title">WebSocket Architecture</h3>
224
  <p class="section-subtitle">Zero polling. Everything streams live.</p>
225
  <div class="ws-grid">
226
  <div class="ws-card">
 
244
  </section>
245
 
246
  <!-- Getting Started -->
247
+ <section class="getting-started" id="setup">
248
  <div class="container">
249
+ <h2 class="section-tag">Get Started</h2>
250
+ <h3 class="section-title">Up and Running in 3 Steps</h3>
251
  <div class="steps-row">
252
  <div class="step">
253
  <div class="step-number">1</div>
screenshots/conversation-active.png CHANGED

Git LFS Details

  • SHA256: a0bd5668679e6a4eac35215f90af6dec270f2fe63da328ef2a57f4d190327e09
  • Pointer size: 131 Bytes
  • Size of remote file: 124 kB

Git LFS Details

  • SHA256: 9735e5e40fa3ed3a50970c6bdef992076d8e4e3dd34590ecad1c4621687548b5
  • Pointer size: 131 Bytes
  • Size of remote file: 129 kB
screenshots/conversation-settings.png CHANGED

Git LFS Details

  • SHA256: 334841ae2b648e32e141e22b8d5b507de313c64e3989d9ee084c166ed784c6d2
  • Pointer size: 131 Bytes
  • Size of remote file: 154 kB

Git LFS Details

  • SHA256: 4af126611f73afff3cce72b8484e093469eeaf81a789844ac559bafacc41c4c6
  • Pointer size: 130 Bytes
  • Size of remote file: 79.7 kB
screenshots/status-tab.png CHANGED

Git LFS Details

  • SHA256: 16b7f478ea3e9015a56f3ae6d9bc170660a84fd565d03ef60574ff0bf124d7d3
  • Pointer size: 131 Bytes
  • Size of remote file: 138 kB

Git LFS Details

  • SHA256: 704adc2b1a7d549f501608f54d35c9eebcc14629be382f17cb82455f7e59f16f
  • Pointer size: 131 Bytes
  • Size of remote file: 107 kB
screenshots/telemetry-tab.png CHANGED

Git LFS Details

  • SHA256: 8394a91e78a2fe9d21d5bcdb445ce96a30f7d6b3443218c02f3acce1129b1a0c
  • Pointer size: 131 Bytes
  • Size of remote file: 165 kB

Git LFS Details

  • SHA256: 927877e6c23334bf3c498598c337a76624e07333ec69b07b75ae1766ac0c9598
  • Pointer size: 131 Bytes
  • Size of remote file: 141 kB
style.css CHANGED
@@ -3,12 +3,13 @@
3
  * { margin: 0; padding: 0; box-sizing: border-box; }
4
 
5
  :root {
6
- --bg-dark: #0f0d1a;
7
- --bg-card: #1a1726;
8
- --bg-card-hover: #221e30;
 
9
  --accent: #7c5cfc;
10
  --accent-light: #a78bfa;
11
- --accent-glow: rgba(124, 92, 252, 0.3);
12
  --text: #e2e0ea;
13
  --text-muted: #9490a6;
14
  --text-dim: #6b6681;
@@ -30,16 +31,61 @@ body {
30
  min-height: 100vh;
31
  }
32
 
33
- .container { max-width: 1140px; margin: 0 auto; padding: 0 1.5rem; }
34
 
35
- /* ── Hero ──────────────────────────────── */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  .hero {
38
  position: relative;
39
- padding: 5rem 1.5rem 3rem;
40
- text-align: center;
41
  overflow: hidden;
42
- background: radial-gradient(ellipse at 50% 0%, rgba(124, 92, 252, 0.25) 0%, transparent 60%),
 
43
  var(--bg-dark);
44
  }
45
 
@@ -47,71 +93,139 @@ body {
47
  position: absolute;
48
  inset: 0;
49
  background: repeating-linear-gradient(
50
- 0deg,
51
- transparent,
52
- transparent 60px,
53
- rgba(124, 92, 252, 0.04) 60px,
54
- rgba(124, 92, 252, 0.04) 61px
55
  ),
56
  repeating-linear-gradient(
57
- 90deg,
58
- transparent,
59
- transparent 60px,
60
- rgba(124, 92, 252, 0.04) 60px,
61
- rgba(124, 92, 252, 0.04) 61px
62
  );
63
  }
64
 
65
- .hero-content { position: relative; z-index: 1; max-width: 800px; margin: 0 auto; }
 
 
 
 
 
 
 
 
 
66
 
67
  .hero-badge {
68
  display: inline-block;
69
  background: rgba(124, 92, 252, 0.15);
70
  border: 1px solid rgba(124, 92, 252, 0.3);
71
  color: var(--accent-light);
72
- padding: 0.35rem 1rem;
73
  border-radius: 50px;
74
- font-size: 0.8rem;
75
  font-weight: 600;
76
- letter-spacing: 0.03em;
77
- margin-bottom: 1.5rem;
78
  text-transform: uppercase;
79
  }
80
 
81
  .hero h1 {
82
- font-size: 3.5rem;
83
  font-weight: 800;
84
- line-height: 1.1;
85
  margin-bottom: 1rem;
86
- background: linear-gradient(135deg, #fff 0%, var(--accent-light) 100%);
 
 
 
 
87
  background-clip: text;
88
  -webkit-background-clip: text;
89
  -webkit-text-fill-color: transparent;
90
  }
91
 
92
  .hero-tagline {
93
- font-size: 1.15rem;
94
  color: var(--text-muted);
95
- max-width: 650px;
96
- margin: 0 auto 2.5rem;
97
  line-height: 1.7;
98
  }
99
 
100
- .hero-stats {
101
  display: flex;
102
- justify-content: center;
103
- gap: 2rem;
104
  flex-wrap: wrap;
 
 
105
  }
106
 
107
- .stat {
108
- text-align: center;
109
- min-width: 80px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  }
111
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  .stat-number {
113
  display: block;
114
- font-size: 2.2rem;
115
  font-weight: 800;
116
  color: #fff;
117
  line-height: 1.2;
@@ -119,90 +233,97 @@ body {
119
 
120
  .stat-label {
121
  display: block;
122
- font-size: 0.75rem;
123
  color: var(--text-dim);
124
  text-transform: uppercase;
125
  letter-spacing: 0.08em;
126
  font-weight: 600;
127
  }
128
 
129
- /* ── Screenshot Showcase ──────────────── */
130
 
131
- .showcase {
132
- padding: 3rem 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
134
 
135
- .showcase-grid {
 
 
 
 
 
 
 
 
 
 
 
136
  display: grid;
137
  grid-template-columns: 1fr 1fr;
138
- gap: 1rem;
 
139
  }
140
 
141
- .showcase-item {
142
  position: relative;
143
  border-radius: var(--radius);
144
  overflow: hidden;
145
  border: 1px solid rgba(124, 92, 252, 0.15);
146
- transition: transform 0.3s, border-color 0.3s;
 
147
  }
148
 
149
- .showcase-item:hover {
150
- transform: translateY(-3px);
151
  border-color: rgba(124, 92, 252, 0.4);
 
152
  }
153
 
154
- .showcase-large {
155
- grid-column: 1 / -1;
156
- }
157
 
158
- .showcase-item img {
159
  width: 100%;
160
  height: auto;
161
  display: block;
162
  }
163
 
164
- .showcase-label {
 
 
165
  position: absolute;
166
  bottom: 0;
167
  left: 0;
168
  right: 0;
169
- padding: 1rem 1.25rem;
170
- background: linear-gradient(transparent, rgba(15, 13, 26, 0.95));
171
  }
172
 
173
- .showcase-label strong {
174
  display: block;
175
  font-size: 0.95rem;
176
  color: #fff;
177
  }
178
 
179
- .showcase-label span {
180
  font-size: 0.8rem;
181
  color: var(--text-muted);
182
  }
183
 
184
- /* ── Section Titles ───────────────────── */
185
-
186
- .section-title {
187
- font-size: 1.8rem;
188
- font-weight: 700;
189
- text-align: center;
190
- margin-bottom: 0.5rem;
191
- color: #fff;
192
- }
193
-
194
- .section-subtitle {
195
- text-align: center;
196
- color: var(--text-muted);
197
- font-size: 0.95rem;
198
- margin-bottom: 2rem;
199
- }
200
-
201
  /* ── Features ─────────────────────────── */
202
 
203
- .features { padding: 3rem 0; }
204
-
205
- .features .section-title { margin-bottom: 2rem; }
206
 
207
  .feature-grid {
208
  display: grid;
@@ -239,7 +360,6 @@ body {
239
  justify-content: center;
240
  font-size: 1.5rem;
241
  margin-bottom: 1rem;
242
- background: rgba(124, 92, 252, 0.1);
243
  }
244
 
245
  .accent-purple .feature-icon-wrap { background: rgba(168, 85, 247, 0.12); }
@@ -261,20 +381,12 @@ body {
261
  line-height: 1.6;
262
  }
263
 
264
- .feature-card p strong {
265
- color: var(--text);
266
- }
267
-
268
- .feature-card p em {
269
- color: var(--accent-light);
270
- font-style: normal;
271
- }
272
 
273
- /* ── Tools Section ────────────────────── */
274
 
275
- .tools-section {
276
- padding: 3rem 0;
277
- }
278
 
279
  .tools-grid {
280
  display: flex;
@@ -303,11 +415,9 @@ body {
303
 
304
  .tool-icon { font-size: 1rem; }
305
 
306
- /* ── Pipeline Section ─────────────────── */
307
 
308
- .pipeline-section {
309
- padding: 3rem 0;
310
- }
311
 
312
  .pipeline-flow {
313
  display: flex;
@@ -315,7 +425,7 @@ body {
315
  justify-content: center;
316
  gap: 0.75rem;
317
  flex-wrap: wrap;
318
- margin-bottom: 1.5rem;
319
  }
320
 
321
  .pipeline-stage {
@@ -326,6 +436,12 @@ body {
326
  min-width: 150px;
327
  flex: 1;
328
  max-width: 220px;
 
 
 
 
 
 
329
  }
330
 
331
  .stage-header {
@@ -363,15 +479,11 @@ body {
363
  color: var(--text-dim);
364
  }
365
 
366
- .pipeline-note strong {
367
- color: var(--accent-light);
368
- }
369
 
370
- /* ── WebSocket Section ────────────────── */
371
 
372
- .ws-section {
373
- padding: 3rem 0;
374
- }
375
 
376
  .ws-grid {
377
  display: grid;
@@ -404,14 +516,13 @@ body {
404
 
405
  /* ── Getting Started ──────────────────── */
406
 
407
- .getting-started {
408
- padding: 3rem 0 4rem;
409
- }
410
 
411
  .steps-row {
412
  display: grid;
413
  grid-template-columns: repeat(3, 1fr);
414
  gap: 1.5rem;
 
415
  }
416
 
417
  .step {
@@ -466,46 +577,34 @@ body {
466
  border-top: 1px solid rgba(255, 255, 255, 0.05);
467
  }
468
 
469
- .footer p {
470
- color: var(--text-dim);
471
- font-size: 0.85rem;
472
- }
473
-
474
  .footer strong { color: var(--text); }
475
-
476
- .footer a {
477
- color: var(--accent-light);
478
- text-decoration: none;
479
- }
480
-
481
  .footer a:hover { text-decoration: underline; }
482
-
483
- .footer-sub {
484
- margin-top: 0.5rem;
485
- font-size: 0.75rem;
486
- color: var(--text-dim);
487
- opacity: 0.6;
488
- }
489
 
490
  /* ── Responsive ───────────────────────── */
491
 
492
- @media (max-width: 768px) {
493
- .hero { padding: 3rem 1rem 2rem; }
494
  .hero h1 { font-size: 2.2rem; }
495
- .hero-stats { gap: 1rem; }
496
- .stat-number { font-size: 1.6rem; }
497
- .showcase-grid { grid-template-columns: 1fr; }
498
- .showcase-large { grid-column: auto; }
499
- .feature-grid { grid-template-columns: 1fr; }
500
  .ws-grid { grid-template-columns: repeat(2, 1fr); }
501
  .steps-row { grid-template-columns: 1fr; }
502
- .pipeline-flow { flex-direction: column; align-items: center; }
503
- .pipeline-arrow { transform: rotate(90deg); }
504
- .pipeline-stage { max-width: 100%; }
505
  }
506
 
507
- @media (max-width: 480px) {
 
508
  .hero h1 { font-size: 1.8rem; }
509
- .hero-tagline { font-size: 1rem; }
 
 
 
 
510
  .ws-grid { grid-template-columns: 1fr; }
 
 
 
511
  }
 
3
  * { margin: 0; padding: 0; box-sizing: border-box; }
4
 
5
  :root {
6
+ --bg-dark: #0a0a0f;
7
+ --bg-card: #14141f;
8
+ --bg-card-hover: #1c1c2e;
9
+ --bg-surface: #111118;
10
  --accent: #7c5cfc;
11
  --accent-light: #a78bfa;
12
+ --accent-glow: rgba(124, 92, 252, 0.25);
13
  --text: #e2e0ea;
14
  --text-muted: #9490a6;
15
  --text-dim: #6b6681;
 
31
  min-height: 100vh;
32
  }
33
 
34
+ .container { max-width: 1200px; margin: 0 auto; padding: 0 1.5rem; }
35
 
36
+ /* ── Nav ─────────────────────────────── */
37
+
38
+ .nav {
39
+ position: sticky;
40
+ top: 0;
41
+ z-index: 100;
42
+ background: rgba(10, 10, 15, 0.85);
43
+ backdrop-filter: blur(12px);
44
+ border-bottom: 1px solid rgba(124, 92, 252, 0.1);
45
+ padding: 0.75rem 1.5rem;
46
+ }
47
+
48
+ .nav-inner {
49
+ max-width: 1200px;
50
+ margin: 0 auto;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: space-between;
54
+ }
55
+
56
+ .nav-brand {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 0.5rem;
60
+ font-weight: 700;
61
+ font-size: 1.1rem;
62
+ }
63
+
64
+ .nav-icon { font-size: 1.4rem; }
65
+
66
+ .nav-links {
67
+ display: flex;
68
+ gap: 1.5rem;
69
+ }
70
+
71
+ .nav-links a {
72
+ color: var(--text-muted);
73
+ text-decoration: none;
74
+ font-size: 0.88rem;
75
+ font-weight: 500;
76
+ transition: color 0.2s;
77
+ }
78
+
79
+ .nav-links a:hover { color: var(--accent-light); }
80
+
81
+ /* ── Hero (split layout) ────────────── */
82
 
83
  .hero {
84
  position: relative;
85
+ padding: 4rem 1.5rem 2rem;
 
86
  overflow: hidden;
87
+ background: radial-gradient(ellipse at 30% 20%, rgba(124, 92, 252, 0.2) 0%, transparent 50%),
88
+ radial-gradient(ellipse at 70% 80%, rgba(59, 130, 246, 0.08) 0%, transparent 50%),
89
  var(--bg-dark);
90
  }
91
 
 
93
  position: absolute;
94
  inset: 0;
95
  background: repeating-linear-gradient(
96
+ 0deg, transparent, transparent 60px,
97
+ rgba(124, 92, 252, 0.03) 60px, rgba(124, 92, 252, 0.03) 61px
 
 
 
98
  ),
99
  repeating-linear-gradient(
100
+ 90deg, transparent, transparent 60px,
101
+ rgba(124, 92, 252, 0.03) 60px, rgba(124, 92, 252, 0.03) 61px
 
 
 
102
  );
103
  }
104
 
105
+ .hero-split {
106
+ position: relative;
107
+ z-index: 1;
108
+ max-width: 1200px;
109
+ margin: 0 auto;
110
+ display: grid;
111
+ grid-template-columns: 1fr 1.1fr;
112
+ gap: 3rem;
113
+ align-items: center;
114
+ }
115
 
116
  .hero-badge {
117
  display: inline-block;
118
  background: rgba(124, 92, 252, 0.15);
119
  border: 1px solid rgba(124, 92, 252, 0.3);
120
  color: var(--accent-light);
121
+ padding: 0.3rem 0.9rem;
122
  border-radius: 50px;
123
+ font-size: 0.75rem;
124
  font-weight: 600;
125
+ letter-spacing: 0.04em;
126
+ margin-bottom: 1.25rem;
127
  text-transform: uppercase;
128
  }
129
 
130
  .hero h1 {
131
+ font-size: 2.8rem;
132
  font-weight: 800;
133
+ line-height: 1.15;
134
  margin-bottom: 1rem;
135
+ color: #fff;
136
+ }
137
+
138
+ .hero-accent {
139
+ background: linear-gradient(135deg, var(--accent-light) 0%, var(--cyan) 100%);
140
  background-clip: text;
141
  -webkit-background-clip: text;
142
  -webkit-text-fill-color: transparent;
143
  }
144
 
145
  .hero-tagline {
146
+ font-size: 1.05rem;
147
  color: var(--text-muted);
148
+ max-width: 520px;
149
+ margin-bottom: 1.5rem;
150
  line-height: 1.7;
151
  }
152
 
153
+ .hero-chips {
154
  display: flex;
 
 
155
  flex-wrap: wrap;
156
+ gap: 0.5rem;
157
+ margin-bottom: 1.25rem;
158
  }
159
 
160
+ .chip {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ gap: 0.3rem;
164
+ background: rgba(255, 255, 255, 0.06);
165
+ border: 1px solid rgba(255, 255, 255, 0.08);
166
+ border-radius: 50px;
167
+ padding: 0.3rem 0.75rem;
168
+ font-size: 0.78rem;
169
+ color: var(--text);
170
+ white-space: nowrap;
171
+ }
172
+
173
+ .hero-tech {
174
+ display: flex;
175
+ flex-wrap: wrap;
176
+ gap: 0.4rem;
177
+ }
178
+
179
+ .tech-tag {
180
+ background: rgba(124, 92, 252, 0.12);
181
+ border: 1px solid rgba(124, 92, 252, 0.25);
182
+ color: var(--accent-light);
183
+ padding: 0.2rem 0.6rem;
184
+ border-radius: 4px;
185
+ font-size: 0.72rem;
186
+ font-weight: 600;
187
+ font-family: "SF Mono", "Fira Code", "Consolas", monospace;
188
+ }
189
+
190
+ .hero-image {
191
+ position: relative;
192
  }
193
 
194
+ .hero-image img {
195
+ width: 100%;
196
+ border-radius: var(--radius);
197
+ border: 1px solid rgba(124, 92, 252, 0.2);
198
+ box-shadow:
199
+ 0 4px 30px rgba(124, 92, 252, 0.15),
200
+ 0 0 80px rgba(124, 92, 252, 0.08);
201
+ transition: transform 0.3s;
202
+ }
203
+
204
+ .hero-image img:hover {
205
+ transform: scale(1.02);
206
+ }
207
+
208
+ /* ── Stats bar ───────────────────────── */
209
+
210
+ .stats-bar {
211
+ background: var(--bg-surface);
212
+ border-top: 1px solid rgba(124, 92, 252, 0.1);
213
+ border-bottom: 1px solid rgba(124, 92, 252, 0.1);
214
+ padding: 1.5rem 0;
215
+ }
216
+
217
+ .stats-bar .container {
218
+ display: flex;
219
+ justify-content: center;
220
+ gap: 3rem;
221
+ flex-wrap: wrap;
222
+ }
223
+
224
+ .stat { text-align: center; min-width: 70px; }
225
+
226
  .stat-number {
227
  display: block;
228
+ font-size: 2rem;
229
  font-weight: 800;
230
  color: #fff;
231
  line-height: 1.2;
 
233
 
234
  .stat-label {
235
  display: block;
236
+ font-size: 0.7rem;
237
  color: var(--text-dim);
238
  text-transform: uppercase;
239
  letter-spacing: 0.08em;
240
  font-weight: 600;
241
  }
242
 
243
+ /* ── Section headings ────────────────── */
244
 
245
+ .section-tag {
246
+ font-size: 0.75rem;
247
+ font-weight: 700;
248
+ text-transform: uppercase;
249
+ letter-spacing: 0.1em;
250
+ color: var(--accent-light);
251
+ text-align: center;
252
+ margin-bottom: 0.4rem;
253
+ }
254
+
255
+ .section-title {
256
+ font-size: 2rem;
257
+ font-weight: 700;
258
+ text-align: center;
259
+ margin-bottom: 0.5rem;
260
+ color: #fff;
261
  }
262
 
263
+ .section-subtitle {
264
+ text-align: center;
265
+ color: var(--text-muted);
266
+ font-size: 0.95rem;
267
+ margin-bottom: 2.5rem;
268
+ }
269
+
270
+ /* ── Screenshots ─────────────────────── */
271
+
272
+ .screenshots { padding: 4rem 0; }
273
+
274
+ .screenshot-grid {
275
  display: grid;
276
  grid-template-columns: 1fr 1fr;
277
+ gap: 1.25rem;
278
+ margin-top: 1.5rem;
279
  }
280
 
281
+ .screenshot-card {
282
  position: relative;
283
  border-radius: var(--radius);
284
  overflow: hidden;
285
  border: 1px solid rgba(124, 92, 252, 0.15);
286
+ transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s;
287
+ background: var(--bg-card);
288
  }
289
 
290
+ .screenshot-card:hover {
291
+ transform: translateY(-4px);
292
  border-color: rgba(124, 92, 252, 0.4);
293
+ box-shadow: 0 8px 40px rgba(124, 92, 252, 0.12);
294
  }
295
 
296
+ .screenshot-wide { grid-column: 1 / -1; }
 
 
297
 
298
+ .screenshot-card img {
299
  width: 100%;
300
  height: auto;
301
  display: block;
302
  }
303
 
304
+ .screenshot-caption {
305
+ padding: 1rem 1.25rem;
306
+ background: linear-gradient(transparent, rgba(10, 10, 15, 0.95));
307
  position: absolute;
308
  bottom: 0;
309
  left: 0;
310
  right: 0;
 
 
311
  }
312
 
313
+ .screenshot-caption strong {
314
  display: block;
315
  font-size: 0.95rem;
316
  color: #fff;
317
  }
318
 
319
+ .screenshot-caption span {
320
  font-size: 0.8rem;
321
  color: var(--text-muted);
322
  }
323
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
324
  /* ── Features ─────────────────────────── */
325
 
326
+ .features { padding: 4rem 0; }
 
 
327
 
328
  .feature-grid {
329
  display: grid;
 
360
  justify-content: center;
361
  font-size: 1.5rem;
362
  margin-bottom: 1rem;
 
363
  }
364
 
365
  .accent-purple .feature-icon-wrap { background: rgba(168, 85, 247, 0.12); }
 
381
  line-height: 1.6;
382
  }
383
 
384
+ .feature-card p strong { color: var(--text); }
385
+ .feature-card p em { color: var(--accent-light); font-style: normal; }
 
 
 
 
 
 
386
 
387
+ /* ── Tools ────────────────────────────── */
388
 
389
+ .tools-section { padding: 4rem 0; }
 
 
390
 
391
  .tools-grid {
392
  display: flex;
 
415
 
416
  .tool-icon { font-size: 1rem; }
417
 
418
+ /* ── Pipeline ─────────────────────────── */
419
 
420
+ .pipeline-section { padding: 4rem 0; }
 
 
421
 
422
  .pipeline-flow {
423
  display: flex;
 
425
  justify-content: center;
426
  gap: 0.75rem;
427
  flex-wrap: wrap;
428
+ margin: 1.5rem 0;
429
  }
430
 
431
  .pipeline-stage {
 
436
  min-width: 150px;
437
  flex: 1;
438
  max-width: 220px;
439
+ text-align: center;
440
+ }
441
+
442
+ .stage-icon {
443
+ font-size: 1.5rem;
444
+ margin-bottom: 0.4rem;
445
  }
446
 
447
  .stage-header {
 
479
  color: var(--text-dim);
480
  }
481
 
482
+ .pipeline-note strong { color: var(--accent-light); }
 
 
483
 
484
+ /* ── WebSocket ────────────────────────── */
485
 
486
+ .ws-section { padding: 4rem 0; }
 
 
487
 
488
  .ws-grid {
489
  display: grid;
 
516
 
517
  /* ── Getting Started ──────────────────── */
518
 
519
+ .getting-started { padding: 4rem 0 5rem; }
 
 
520
 
521
  .steps-row {
522
  display: grid;
523
  grid-template-columns: repeat(3, 1fr);
524
  gap: 1.5rem;
525
+ margin-top: 1rem;
526
  }
527
 
528
  .step {
 
577
  border-top: 1px solid rgba(255, 255, 255, 0.05);
578
  }
579
 
580
+ .footer p { color: var(--text-dim); font-size: 0.85rem; }
 
 
 
 
581
  .footer strong { color: var(--text); }
582
+ .footer a { color: var(--accent-light); text-decoration: none; }
 
 
 
 
 
583
  .footer a:hover { text-decoration: underline; }
584
+ .footer-sub { margin-top: 0.5rem; font-size: 0.75rem; opacity: 0.6; }
 
 
 
 
 
 
585
 
586
  /* ── Responsive ───────────────────────── */
587
 
588
+ @media (max-width: 900px) {
589
+ .hero-split { grid-template-columns: 1fr; gap: 2rem; }
590
  .hero h1 { font-size: 2.2rem; }
591
+ .hero-image { order: -1; }
592
+ .feature-grid { grid-template-columns: 1fr 1fr; }
 
 
 
593
  .ws-grid { grid-template-columns: repeat(2, 1fr); }
594
  .steps-row { grid-template-columns: 1fr; }
595
+ .nav-links { display: none; }
 
 
596
  }
597
 
598
+ @media (max-width: 600px) {
599
+ .hero { padding: 2rem 1rem 1.5rem; }
600
  .hero h1 { font-size: 1.8rem; }
601
+ .stats-bar .container { gap: 1.5rem; }
602
+ .stat-number { font-size: 1.5rem; }
603
+ .screenshot-grid { grid-template-columns: 1fr; }
604
+ .screenshot-wide { grid-column: auto; }
605
+ .feature-grid { grid-template-columns: 1fr; }
606
  .ws-grid { grid-template-columns: 1fr; }
607
+ .pipeline-flow { flex-direction: column; align-items: center; }
608
+ .pipeline-arrow { transform: rotate(90deg); }
609
+ .pipeline-stage { max-width: 100%; }
610
  }