@jxrstudios/jxr 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/bin/jxr.js +6 -0
  2. package/dist/index.d.ts +43 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +57 -2
  5. package/dist/jxr-server-manager.d.ts.map +1 -1
  6. package/package.json +1 -1
  7. package/src/jxr-server-manager.ts +57 -1
  8. package/zzz_react_template/App.tsx +43 -156
  9. package/zzz_react_template/components/ErrorBoundary.tsx +62 -0
  10. package/zzz_react_template/components/ManusDialog.tsx +85 -0
  11. package/zzz_react_template/components/Map.tsx +155 -0
  12. package/zzz_react_template/components/jxr/CodeEditor.tsx +313 -0
  13. package/zzz_react_template/components/jxr/FileExplorer.tsx +230 -0
  14. package/zzz_react_template/components/jxr/IDEShell.tsx +159 -0
  15. package/zzz_react_template/components/jxr/LandingPage.tsx +414 -0
  16. package/zzz_react_template/components/jxr/LivePreview.tsx +169 -0
  17. package/zzz_react_template/components/jxr/PerformanceDashboard.tsx +379 -0
  18. package/zzz_react_template/components/jxr/TopBar.tsx +149 -0
  19. package/zzz_react_template/components/ui/accordion.tsx +64 -0
  20. package/zzz_react_template/components/ui/alert-dialog.tsx +155 -0
  21. package/zzz_react_template/components/ui/alert.tsx +66 -0
  22. package/zzz_react_template/components/ui/aspect-ratio.tsx +9 -0
  23. package/zzz_react_template/components/ui/avatar.tsx +51 -0
  24. package/zzz_react_template/components/ui/badge.tsx +46 -0
  25. package/zzz_react_template/components/ui/breadcrumb.tsx +109 -0
  26. package/zzz_react_template/components/ui/button-group.tsx +83 -0
  27. package/zzz_react_template/components/ui/button.tsx +60 -0
  28. package/zzz_react_template/components/ui/calendar.tsx +211 -0
  29. package/zzz_react_template/components/ui/card.tsx +92 -0
  30. package/zzz_react_template/components/ui/carousel.tsx +239 -0
  31. package/zzz_react_template/components/ui/chart.tsx +355 -0
  32. package/zzz_react_template/components/ui/checkbox.tsx +30 -0
  33. package/zzz_react_template/components/ui/collapsible.tsx +31 -0
  34. package/zzz_react_template/components/ui/command.tsx +184 -0
  35. package/zzz_react_template/components/ui/context-menu.tsx +250 -0
  36. package/zzz_react_template/components/ui/dialog.tsx +209 -0
  37. package/zzz_react_template/components/ui/drawer.tsx +133 -0
  38. package/zzz_react_template/components/ui/dropdown-menu.tsx +255 -0
  39. package/zzz_react_template/components/ui/empty.tsx +104 -0
  40. package/zzz_react_template/components/ui/field.tsx +242 -0
  41. package/zzz_react_template/components/ui/form.tsx +168 -0
  42. package/zzz_react_template/components/ui/hover-card.tsx +42 -0
  43. package/zzz_react_template/components/ui/input-group.tsx +168 -0
  44. package/zzz_react_template/components/ui/input-otp.tsx +75 -0
  45. package/zzz_react_template/components/ui/input.tsx +70 -0
  46. package/zzz_react_template/components/ui/item.tsx +193 -0
  47. package/zzz_react_template/components/ui/kbd.tsx +28 -0
  48. package/zzz_react_template/components/ui/label.tsx +22 -0
  49. package/zzz_react_template/components/ui/menubar.tsx +274 -0
  50. package/zzz_react_template/components/ui/navigation-menu.tsx +168 -0
  51. package/zzz_react_template/components/ui/pagination.tsx +127 -0
  52. package/zzz_react_template/components/ui/popover.tsx +46 -0
  53. package/zzz_react_template/components/ui/progress.tsx +29 -0
  54. package/zzz_react_template/components/ui/radio-group.tsx +43 -0
  55. package/zzz_react_template/components/ui/resizable.tsx +54 -0
  56. package/zzz_react_template/components/ui/scroll-area.tsx +56 -0
  57. package/zzz_react_template/components/ui/select.tsx +185 -0
  58. package/zzz_react_template/components/ui/separator.tsx +26 -0
  59. package/zzz_react_template/components/ui/sheet.tsx +139 -0
  60. package/zzz_react_template/components/ui/sidebar.tsx +734 -0
  61. package/zzz_react_template/components/ui/skeleton.tsx +13 -0
  62. package/zzz_react_template/components/ui/slider.tsx +61 -0
  63. package/zzz_react_template/components/ui/sonner.tsx +23 -0
  64. package/zzz_react_template/components/ui/spinner.tsx +16 -0
  65. package/zzz_react_template/components/ui/switch.tsx +29 -0
  66. package/zzz_react_template/components/ui/table.tsx +114 -0
  67. package/zzz_react_template/components/ui/tabs.tsx +64 -0
  68. package/zzz_react_template/components/ui/textarea.tsx +67 -0
  69. package/zzz_react_template/components/ui/toggle-group.tsx +73 -0
  70. package/zzz_react_template/components/ui/toggle.tsx +45 -0
  71. package/zzz_react_template/components/ui/tooltip.tsx +59 -0
  72. package/zzz_react_template/const.ts +17 -0
  73. package/zzz_react_template/contexts/JXRContext.tsx +264 -0
  74. package/zzz_react_template/contexts/ThemeContext.tsx +64 -0
  75. package/zzz_react_template/hooks/useComposition.ts +81 -0
  76. package/zzz_react_template/hooks/useMobile.tsx +21 -0
  77. package/zzz_react_template/hooks/usePersistFn.ts +20 -0
  78. package/zzz_react_template/index.css +518 -11
  79. package/zzz_react_template/lib/jxr-runtime/index.ts +201 -0
  80. package/zzz_react_template/lib/jxr-runtime/module-resolver.ts +520 -0
  81. package/zzz_react_template/lib/jxr-runtime/moq-transport.ts +267 -0
  82. package/zzz_react_template/lib/jxr-runtime/web-crypto.ts +279 -0
  83. package/zzz_react_template/lib/jxr-runtime/worker-pool.ts +321 -0
  84. package/zzz_react_template/lib/utils.ts +6 -0
  85. package/zzz_react_template/main.tsx +4 -9
  86. package/zzz_react_template/pages/Docs.tsx +955 -0
  87. package/zzz_react_template/pages/Home.tsx +1080 -0
  88. package/zzz_react_template/pages/NotFound.tsx +105 -0
  89. package/zzz_react_template/tsconfig.json +24 -0
@@ -0,0 +1,1080 @@
1
+ /**
2
+ * JXR.js — Marketing Homepage
3
+ * Brand: LavaFlow Streams design language
4
+ * Pure black · Saturated orange #ea580c · Neon green #22c55e · Inter font
5
+ * Powered by JXR Studios × DamascusAI
6
+ */
7
+
8
+ import { useState, useEffect, useRef } from 'react';
9
+ import { Link } from 'wouter';
10
+ import { motion, useInView } from 'framer-motion';
11
+ import {
12
+ Zap, Terminal, Shield, Cpu, ArrowRight, GitBranch,
13
+ Package, Globe, ChevronRight, Star, Code2,
14
+ RefreshCw, Lock, Activity, ExternalLink, Copy, Check,
15
+ } from 'lucide-react';
16
+
17
+ // ─── Animated counter ─────────────────────────────────────────────────────────
18
+
19
+ function Counter({ value, suffix = '' }: { value: number; suffix?: string }) {
20
+ const [count, setCount] = useState(0);
21
+ const ref = useRef<HTMLSpanElement>(null);
22
+ const inView = useInView(ref, { once: true });
23
+
24
+ useEffect(() => {
25
+ if (!inView) return;
26
+ const steps = 60;
27
+ const increment = value / steps;
28
+ let current = 0;
29
+ const timer = setInterval(() => {
30
+ current = Math.min(current + increment, value);
31
+ setCount(Math.floor(current));
32
+ if (current >= value) clearInterval(timer);
33
+ }, 1200 / steps);
34
+ return () => clearInterval(timer);
35
+ }, [inView, value]);
36
+
37
+ return <span ref={ref}>{count.toLocaleString()}{suffix}</span>;
38
+ }
39
+
40
+ // ─── Copy button ──────────────────────────────────────────────────────────────
41
+
42
+ function CopyButton({ text }: { text: string }) {
43
+ const [copied, setCopied] = useState(false);
44
+ const copy = async () => {
45
+ await navigator.clipboard.writeText(text);
46
+ setCopied(true);
47
+ setTimeout(() => setCopied(false), 2000);
48
+ };
49
+ return (
50
+ <button
51
+ onClick={copy}
52
+ className="absolute top-3 right-3 p-1.5 rounded transition-all"
53
+ style={{ color: '#4b5563', background: 'rgba(255,255,255,0.04)', border: '1px solid rgba(255,255,255,0.06)' }}
54
+ title="Copy"
55
+ >
56
+ {copied ? <Check size={13} style={{ color: '#22c55e' }} /> : <Copy size={13} />}
57
+ </button>
58
+ );
59
+ }
60
+
61
+ // ─── Navigation ───────────────────────────────────────────────────────────────
62
+
63
+ function Nav() {
64
+ const [scrolled, setScrolled] = useState(false);
65
+ useEffect(() => {
66
+ const h = () => setScrolled(window.scrollY > 20);
67
+ window.addEventListener('scroll', h);
68
+ return () => window.removeEventListener('scroll', h);
69
+ }, []);
70
+
71
+ return (
72
+ <nav
73
+ className="fixed top-0 left-0 right-0 z-50 transition-all duration-200"
74
+ style={{
75
+ background: scrolled ? 'rgba(10,10,10,0.95)' : 'transparent',
76
+ backdropFilter: scrolled ? 'blur(12px)' : 'none',
77
+ borderBottom: scrolled ? '1px solid rgba(255,255,255,0.06)' : 'none',
78
+ }}
79
+ >
80
+ <div className="container flex items-center justify-between h-14">
81
+ {/* Logo — matches LavaFlow orange square + wordmark */}
82
+ <Link href="/" className="flex items-center gap-2 no-underline">
83
+ <div
84
+ className="w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0"
85
+ style={{ background: '#ea580c' }}
86
+ >
87
+ <Zap size={15} color="#ffffff" strokeWidth={2.5} />
88
+ </div>
89
+ <span className="font-bold text-base text-white tracking-tight" style={{ fontFamily: 'Inter' }}>
90
+ JXR.js
91
+ </span>
92
+ </Link>
93
+
94
+ {/* Nav links */}
95
+ <div className="hidden md:flex items-center gap-6">
96
+ {[
97
+ { label: 'Docs', href: '/docs' },
98
+ { label: 'GitHub', href: 'https://github.com/jxrstudios/jxr', ext: true },
99
+ { label: 'Discord', href: 'https://discord.gg/jxr', ext: true },
100
+ ].map((l) => (
101
+ <a
102
+ key={l.label}
103
+ href={l.href}
104
+ target={l.ext ? '_blank' : undefined}
105
+ rel={l.ext ? 'noopener noreferrer' : undefined}
106
+ className="flex items-center gap-1 text-sm font-medium no-underline transition-colors"
107
+ style={{ color: '#9ca3af' }}
108
+ onMouseEnter={e => (e.currentTarget.style.color = '#ffffff')}
109
+ onMouseLeave={e => (e.currentTarget.style.color = '#9ca3af')}
110
+ >
111
+ {l.label}
112
+ {l.ext && <ExternalLink size={11} />}
113
+ </a>
114
+ ))}
115
+ </div>
116
+
117
+ {/* Right actions */}
118
+ <div className="flex items-center gap-2">
119
+ <div className="badge-lava hidden sm:flex items-center gap-1.5">
120
+ <span className="pulse-dot" style={{ width: '6px', height: '6px' }} />
121
+ v1.0.0-edge
122
+ </div>
123
+ <a
124
+ href="https://github.com/jxrstudios/jxr"
125
+ target="_blank"
126
+ rel="noopener noreferrer"
127
+ className="btn-ghost text-sm py-1.5 px-3 no-underline"
128
+ >
129
+ <Star size={13} />
130
+ Star
131
+ </a>
132
+ </div>
133
+ </div>
134
+ </nav>
135
+ );
136
+ }
137
+
138
+ // ─── Hero ─────────────────────────────────────────────────────────────────────
139
+
140
+ function Hero() {
141
+ return (
142
+ <section
143
+ className="relative min-h-screen flex items-center overflow-hidden"
144
+ style={{ paddingTop: '80px', background: '#0a0a0a' }}
145
+ >
146
+ {/* Warm radial glow — exact LavaFlow pattern */}
147
+ <div
148
+ className="absolute inset-0 pointer-events-none"
149
+ style={{
150
+ background: 'radial-gradient(ellipse 70% 55% at 50% 40%, rgba(120,40,10,0.38) 0%, transparent 70%)',
151
+ }}
152
+ />
153
+
154
+ <div className="container relative z-10">
155
+ {/* Badge */}
156
+ <motion.div
157
+ initial={{ opacity: 0, y: 16 }}
158
+ animate={{ opacity: 1, y: 0 }}
159
+ transition={{ duration: 0.4 }}
160
+ className="mb-8"
161
+ >
162
+ <div
163
+ className="inline-flex items-center gap-2 px-3 py-1.5 rounded-full text-sm"
164
+ style={{
165
+ background: 'rgba(234,88,12,0.1)',
166
+ border: '1px solid rgba(234,88,12,0.25)',
167
+ color: '#f97316',
168
+ fontFamily: 'JetBrains Mono',
169
+ fontSize: '0.75rem',
170
+ }}
171
+ >
172
+ <Zap size={12} />
173
+ JXR Runtime — Powered by JXR Studios × DamascusAI
174
+ </div>
175
+ </motion.div>
176
+
177
+ {/* Headline — exact LavaFlow pattern: white + orange */}
178
+ <motion.h1
179
+ initial={{ opacity: 0, y: 24 }}
180
+ animate={{ opacity: 1, y: 0 }}
181
+ transition={{ duration: 0.5, delay: 0.08 }}
182
+ className="mb-6"
183
+ style={{
184
+ fontFamily: 'Inter',
185
+ fontWeight: 900,
186
+ fontSize: 'clamp(2.8rem, 6vw, 5.5rem)',
187
+ lineHeight: 1.05,
188
+ letterSpacing: '-0.02em',
189
+ }}
190
+ >
191
+ <span style={{ color: '#ffffff' }}>The edge framework</span>
192
+ <br />
193
+ <span style={{ color: '#f97316' }}>that outperforms everything.</span>
194
+ </motion.h1>
195
+
196
+ {/* Subheadline */}
197
+ <motion.p
198
+ initial={{ opacity: 0, y: 16 }}
199
+ animate={{ opacity: 1, y: 0 }}
200
+ transition={{ duration: 0.5, delay: 0.16 }}
201
+ className="mb-10 max-w-xl"
202
+ style={{ color: '#9ca3af', fontSize: '1.05rem', lineHeight: 1.65 }}
203
+ >
204
+ React Native + React build framework with MoQ transport, Web Crypto, and Worker pools.
205
+ Use it in <strong style={{ color: '#d1d5db' }}>VSCode, Warp, Cursor</strong> — any IDE.
206
+ AI agents migrate your project from Next.js, Vite, or Bun in seconds via MCP.
207
+ </motion.p>
208
+
209
+ {/* Stat pills — exact LavaFlow pattern */}
210
+ <motion.div
211
+ initial={{ opacity: 0, y: 16 }}
212
+ animate={{ opacity: 1, y: 0 }}
213
+ transition={{ duration: 0.5, delay: 0.22 }}
214
+ className="flex flex-wrap gap-2 mb-10"
215
+ >
216
+ {[
217
+ { icon: <Zap size={13} />, label: 'cold start', value: '< 2ms' },
218
+ { icon: <Globe size={13} />, label: 'edge nodes', value: '300+' },
219
+ { icon: <Shield size={13} />, label: 'auth', value: 'Web Crypto' },
220
+ { icon: <Activity size={13} />, label: 'transport', value: 'MoQ' },
221
+ { icon: <Cpu size={13} />, label: 'workers', value: 'native' },
222
+ ].map((s) => (
223
+ <div key={s.label} className="stat-pill">
224
+ <span className="pill-icon">{s.icon}</span>
225
+ {s.label} <strong>{s.value}</strong>
226
+ </div>
227
+ ))}
228
+ </motion.div>
229
+
230
+ {/* CTA row */}
231
+ <motion.div
232
+ initial={{ opacity: 0, y: 16 }}
233
+ animate={{ opacity: 1, y: 0 }}
234
+ transition={{ duration: 0.5, delay: 0.3 }}
235
+ className="flex flex-wrap gap-3"
236
+ >
237
+ <Link href="/docs" className="btn-lava no-underline">
238
+ Get started →
239
+ </Link>
240
+ <a
241
+ href="https://github.com/jxrstudios/jxr"
242
+ target="_blank"
243
+ rel="noopener noreferrer"
244
+ className="btn-ghost no-underline"
245
+ >
246
+ <GitBranch size={15} />
247
+ View on GitHub
248
+ </a>
249
+ </motion.div>
250
+ </div>
251
+
252
+ {/* Bottom fade */}
253
+ <div
254
+ className="absolute bottom-0 left-0 right-0 h-32 pointer-events-none"
255
+ style={{ background: 'linear-gradient(to bottom, transparent, #0a0a0a)' }}
256
+ />
257
+ </section>
258
+ );
259
+ }
260
+
261
+ // ─── Architecture diagram — matches LavaFlow "LIVE ARCHITECTURE" card ─────────
262
+
263
+ function ArchDiagram() {
264
+ const nodes = [
265
+ { id: 'app', icon: <Code2 size={16} />, name: 'Your App', sub: 'React / RN', active: false },
266
+ { id: 'sdk', icon: <Package size={16} />, name: 'JXR SDK', sub: 'MoQ + Crypto', active: false },
267
+ { id: 'worker', icon: <Zap size={16} />, name: 'Worker Pool', sub: 'Edge runtime', active: true },
268
+ { id: 'build', icon: <RefreshCw size={16} />, name: 'Build Engine', sub: 'esbuild + JXR', active: false },
269
+ { id: 'edge', icon: <Globe size={16} />, name: 'Edge Deploy', sub: 'CF / Deno / Node', active: false },
270
+ ];
271
+
272
+ return (
273
+ <div className="arch-card">
274
+ <div className="arch-header">
275
+ <div className="arch-live-label">
276
+ <span className="live-dot" />
277
+ LIVE ARCHITECTURE
278
+ </div>
279
+ <div style={{ fontFamily: 'JetBrains Mono', fontSize: '0.68rem', color: '#4b5563' }}>
280
+ p99 &lt;2ms · workers ↑
281
+ </div>
282
+ </div>
283
+
284
+ <div className="p-5">
285
+ <div className="flex items-center gap-2 overflow-x-auto pb-2">
286
+ {nodes.map((node, i) => (
287
+ <div key={node.id} className="flex items-center gap-2 flex-shrink-0">
288
+ <div className={`arch-node ${node.active ? 'active' : ''}`}>
289
+ <div className="arch-node-icon">{node.icon}</div>
290
+ <div className="arch-node-name">{node.name}</div>
291
+ <div className="arch-node-sub">{node.sub}</div>
292
+ </div>
293
+ {i < nodes.length - 1 && <div className="arch-connector" style={{ width: '40px' }} />}
294
+ </div>
295
+ ))}
296
+ </div>
297
+ </div>
298
+
299
+ <div className="arch-progress">
300
+ <div className="arch-progress-bar" />
301
+ </div>
302
+ </div>
303
+ );
304
+ }
305
+
306
+ // ─── Install section ──────────────────────────────────────────────────────────
307
+
308
+ function InstallSection() {
309
+ return (
310
+ <section className="py-20" style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}>
311
+ <div className="container">
312
+ <div className="grid lg:grid-cols-2 gap-8 items-start">
313
+ {/* Terminal: provision */}
314
+ <div>
315
+ <div className="section-label">PROVISION IN SECONDS</div>
316
+ <div className="terminal-chrome">
317
+ <div className="terminal-header">
318
+ <div className="terminal-dot" style={{ background: '#ff5f57' }} />
319
+ <div className="terminal-dot" style={{ background: '#febc2e' }} />
320
+ <div className="terminal-dot" style={{ background: '#28c840' }} />
321
+ <span className="terminal-label">terminal</span>
322
+ </div>
323
+ <div className="terminal-body">
324
+ <div><span className="terminal-prompt">$ </span><span className="terminal-cmd">npm install -g @jxrstudios/jxr</span></div>
325
+ <div><span className="terminal-out">Installing JXR.js...</span></div>
326
+ <div><span className="terminal-out">Worker pool pre-warmed (8 threads)</span></div>
327
+ <div><span className="terminal-out">MoQ transport initialized</span></div>
328
+ <div><span className="terminal-out">Web Crypto engine ready</span></div>
329
+ <div><span className="terminal-dim">Ready in 1.4s</span></div>
330
+ <div className="mt-2">
331
+ <span className="terminal-prompt">$ </span>
332
+ <span className="terminal-cmd">jxr init my-app</span>
333
+ </div>
334
+ <div><span className="terminal-out">✓ Scaffolded react-web project</span></div>
335
+ <div><span className="terminal-out">✓ Generated jxr.config.ts</span></div>
336
+ <div><span className="terminal-dim">→ Run: </span><span className="terminal-orange">jxr dev</span><span className="cursor-blink" /></div>
337
+ </div>
338
+ </div>
339
+ </div>
340
+
341
+ {/* Code: connect instantly */}
342
+ <div>
343
+ <div className="section-label">CONNECT INSTANTLY</div>
344
+ <div className="terminal-chrome">
345
+ <div className="terminal-header">
346
+ <div className="terminal-dot" style={{ background: '#ff5f57' }} />
347
+ <div className="terminal-dot" style={{ background: '#febc2e' }} />
348
+ <div className="terminal-dot" style={{ background: '#28c840' }} />
349
+ <span className="terminal-label" style={{ marginLeft: 'auto' }}>jxr.config.ts</span>
350
+ </div>
351
+ <div className="terminal-body relative">
352
+ <CopyButton text={`import { defineConfig } from '@jxrstudios/core'
353
+
354
+ export default defineConfig({
355
+ name: 'my-app',
356
+ platform: 'web',
357
+
358
+ workers: { size: 8, enablePriority: true },
359
+ moq: { enabled: true },
360
+ crypto: { enabled: true, signing: true },
361
+
362
+ devServer: { port: 3000, hmr: true },
363
+ })`} />
364
+ <pre style={{ margin: 0, fontSize: '0.8rem', lineHeight: 1.75, color: '#d1d5db' }}>{`import { defineConfig } from `}<span style={{ color: '#f97316' }}>'@jxrstudios/core'</span>{`
365
+
366
+ export default defineConfig({
367
+ name: `}<span style={{ color: '#f97316' }}>'my-app'</span>{`,
368
+ platform: `}<span style={{ color: '#f97316' }}>'web'</span>{`,
369
+
370
+ workers: { size: `}<span style={{ color: '#22c55e' }}>8</span>{`, enablePriority: `}<span style={{ color: '#22c55e' }}>true</span>{` },
371
+ moq: { enabled: `}<span style={{ color: '#22c55e' }}>true</span>{` },
372
+ crypto: { enabled: `}<span style={{ color: '#22c55e' }}>true</span>{`, signing: `}<span style={{ color: '#22c55e' }}>true</span>{` },
373
+
374
+ devServer: { port: `}<span style={{ color: '#22c55e' }}>3000</span>{`, hmr: `}<span style={{ color: '#22c55e' }}>true</span>{` },
375
+ })`}</pre>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ </div>
380
+
381
+ {/* Arch diagram below */}
382
+ <div className="mt-10">
383
+ <ArchDiagram />
384
+ </div>
385
+
386
+ {/* Compatible with */}
387
+ <div className="mt-8 flex flex-wrap items-center gap-3 justify-center">
388
+ {['VSCode', 'Warp', 'Cursor', 'iTerm', 'Windows Terminal', 'Neovim'].map((ide) => (
389
+ <div
390
+ key={ide}
391
+ className="px-3 py-1.5 rounded-full text-sm font-medium"
392
+ style={{ background: '#111111', border: '1px solid rgba(255,255,255,0.07)', color: '#9ca3af' }}
393
+ >
394
+ {ide}
395
+ </div>
396
+ ))}
397
+ <span style={{ color: '#4b5563', fontSize: '0.85rem' }}>+ any terminal</span>
398
+ </div>
399
+ </div>
400
+ </section>
401
+ );
402
+ }
403
+
404
+ // ─── Features grid ────────────────────────────────────────────────────────────
405
+
406
+ const FEATURES = [
407
+ {
408
+ icon: Cpu,
409
+ color: '#ea580c',
410
+ title: 'Worker Pool Engine',
411
+ description: 'Pre-warmed worker_threads fleet scales to hardware concurrency. Priority queue with backpressure. Parallel JSX transforms, crypto ops, and module resolution — all off the main thread.',
412
+ snippet: `workers: {
413
+ size: 8,
414
+ enablePriority: true,
415
+ maxQueueSize: 1000,
416
+ }`,
417
+ },
418
+ {
419
+ icon: Activity,
420
+ color: '#22c55e',
421
+ title: 'MoQ Transport Layer',
422
+ description: 'Full Media over QUIC protocol semantics for sub-RTT module streaming. Track/object/subscription model. Hot module updates stream to the browser before the file is even saved.',
423
+ snippet: `moq: {
424
+ enabled: true,
425
+ relayUrl: 'wss://relay.jxr.dev',
426
+ trackPriority: 'high',
427
+ }`,
428
+ },
429
+ {
430
+ icon: Lock,
431
+ color: '#ea580c',
432
+ title: 'Web Crypto Engine',
433
+ description: 'AES-GCM-256 module caching, ECDSA P-256 manifest signing, HKDF key derivation. Pure SubtleCrypto — zero native dependencies. Every build output is cryptographically signed.',
434
+ snippet: `crypto: {
435
+ enabled: true,
436
+ algorithm: 'AES-GCM',
437
+ signing: true,
438
+ keyDerivation: 'HKDF',
439
+ }`,
440
+ },
441
+ {
442
+ icon: RefreshCw,
443
+ color: '#22c55e',
444
+ title: 'Zero-Build Dev Mode',
445
+ description: 'TypeScript stripping + JSX transform happen in a Worker — no esbuild daemon, no Babel config. The dev server serves modules directly from the virtual FS with cryptographic integrity.',
446
+ snippet: `devServer: {
447
+ port: 3000,
448
+ hmr: true,
449
+ // No build step needed
450
+ // Modules served from VFS
451
+ }`,
452
+ },
453
+ {
454
+ icon: GitBranch,
455
+ color: '#ea580c',
456
+ title: 'Migration Engine',
457
+ description: 'One command migrates from Next.js, Vite, Bun, CRA, Expo, Remix, or Nuxt. AST-level import rewrites, config translation, and a detailed migration notes file — with full backup.',
458
+ snippet: `# Migrate from Next.js
459
+ $ jxr migrate --from nextjs
460
+
461
+ # Auto-detect source
462
+ $ jxr migrate --dry-run`,
463
+ },
464
+ {
465
+ icon: Package,
466
+ color: '#22c55e',
467
+ title: 'MCP Server',
468
+ description: '14 AI-callable tools via the Model Context Protocol. Claude, Cursor, Copilot, and any MCP-compatible agent can init, build, migrate, deploy, and introspect JXR projects autonomously.',
469
+ snippet: `// .cursor/mcp.json
470
+ {
471
+ "mcpServers": {
472
+ "jxrstudios": {
473
+ "command": "npx",
474
+ "args": ["-y", "@jxrstudios/mcp"]
475
+ }
476
+ }
477
+ }`,
478
+ },
479
+ ];
480
+
481
+ function Features() {
482
+ return (
483
+ <section className="py-24" style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}>
484
+ <div className="container">
485
+ <div className="mb-14">
486
+ <div className="section-label">CORE ARCHITECTURE</div>
487
+ <h2
488
+ style={{
489
+ fontFamily: 'Inter',
490
+ fontWeight: 900,
491
+ fontSize: 'clamp(2rem, 4vw, 3.2rem)',
492
+ lineHeight: 1.1,
493
+ letterSpacing: '-0.02em',
494
+ color: '#ffffff',
495
+ marginBottom: '0.75rem',
496
+ }}
497
+ >
498
+ Engineered in layers.<br />
499
+ <span style={{ color: '#f97316' }}>Precision at every level.</span>
500
+ </h2>
501
+ <p style={{ color: '#6b7280', maxWidth: '520px', lineHeight: 1.65 }}>
502
+ JXR is not a wrapper. It is a ground-up reimagining of how React projects are built, served, and deployed at the edge.
503
+ </p>
504
+ </div>
505
+
506
+ <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4">
507
+ {FEATURES.map((feat, i) => {
508
+ const Icon = feat.icon;
509
+ return (
510
+ <motion.div
511
+ key={feat.title}
512
+ initial={{ opacity: 0, y: 24 }}
513
+ whileInView={{ opacity: 1, y: 0 }}
514
+ viewport={{ once: true }}
515
+ transition={{ delay: i * 0.07 }}
516
+ className="jxr-card flex flex-col gap-4"
517
+ >
518
+ <div
519
+ className="w-9 h-9 rounded-lg flex items-center justify-center flex-shrink-0"
520
+ style={{
521
+ background: `${feat.color}18`,
522
+ border: `1px solid ${feat.color}30`,
523
+ }}
524
+ >
525
+ <Icon size={17} style={{ color: feat.color }} />
526
+ </div>
527
+ <div>
528
+ <h3 style={{ fontFamily: 'Inter', fontWeight: 700, fontSize: '0.95rem', color: '#ffffff', marginBottom: '0.5rem' }}>
529
+ {feat.title}
530
+ </h3>
531
+ <p style={{ fontSize: '0.83rem', color: '#6b7280', lineHeight: 1.65, marginBottom: '1rem' }}>
532
+ {feat.description}
533
+ </p>
534
+ </div>
535
+ <div className="code-block text-xs mt-auto whitespace-pre" style={{ fontSize: '0.75rem' }}>
536
+ {feat.snippet}
537
+ </div>
538
+ </motion.div>
539
+ );
540
+ })}
541
+ </div>
542
+ </div>
543
+ </section>
544
+ );
545
+ }
546
+
547
+ // ─── Stats bar ────────────────────────────────────────────────────────────────
548
+
549
+ function StatsBar() {
550
+ const stats = [
551
+ { value: 12, suffix: 'x', label: 'faster cold start vs Next.js' },
552
+ { value: 8, suffix: '', label: 'worker threads pre-warmed' },
553
+ { value: 7, suffix: '', label: 'frameworks supported for migration' },
554
+ { value: 14, suffix: '', label: 'MCP tools for AI agents' },
555
+ ];
556
+
557
+ return (
558
+ <section className="py-14" style={{ borderTop: '1px solid rgba(255,255,255,0.06)', borderBottom: '1px solid rgba(255,255,255,0.06)' }}>
559
+ <div className="container">
560
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8">
561
+ {stats.map((s, i) => (
562
+ <motion.div
563
+ key={s.label}
564
+ initial={{ opacity: 0, y: 16 }}
565
+ whileInView={{ opacity: 1, y: 0 }}
566
+ viewport={{ once: true }}
567
+ transition={{ delay: i * 0.08 }}
568
+ className="text-center"
569
+ >
570
+ <div
571
+ style={{
572
+ fontFamily: 'Inter',
573
+ fontWeight: 900,
574
+ fontSize: '2.8rem',
575
+ lineHeight: 1,
576
+ color: '#f97316',
577
+ marginBottom: '0.4rem',
578
+ letterSpacing: '-0.02em',
579
+ }}
580
+ >
581
+ <Counter value={s.value} suffix={s.suffix} />
582
+ </div>
583
+ <div style={{ fontSize: '0.78rem', color: '#4b5563', lineHeight: 1.4 }}>{s.label}</div>
584
+ </motion.div>
585
+ ))}
586
+ </div>
587
+ </div>
588
+ </section>
589
+ );
590
+ }
591
+
592
+ // ─── Migration section ────────────────────────────────────────────────────────
593
+
594
+ const FRAMEWORKS = [
595
+ { name: 'Next.js', icon: '▲' },
596
+ { name: 'Vite', icon: '⚡' },
597
+ { name: 'Bun', icon: '🥟' },
598
+ { name: 'CRA', icon: '⚛' },
599
+ { name: 'Expo', icon: '📱' },
600
+ { name: 'Remix', icon: '💿' },
601
+ { name: 'Nuxt', icon: '🟢' },
602
+ ];
603
+
604
+ function MigrationSection() {
605
+ return (
606
+ <section className="py-24" style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}>
607
+ <div className="container">
608
+ <div className="grid lg:grid-cols-2 gap-14 items-start">
609
+ {/* Left */}
610
+ <div>
611
+ <div className="section-label">MIGRATION ENGINE</div>
612
+ <h2
613
+ style={{
614
+ fontFamily: 'Inter',
615
+ fontWeight: 900,
616
+ fontSize: 'clamp(2rem, 4vw, 3rem)',
617
+ lineHeight: 1.1,
618
+ letterSpacing: '-0.02em',
619
+ color: '#ffffff',
620
+ marginBottom: '1rem',
621
+ }}
622
+ >
623
+ Migrate from any framework.<br />
624
+ <span style={{ color: '#f97316' }}>In one command.</span>
625
+ </h2>
626
+ <p style={{ color: '#6b7280', marginBottom: '1.5rem', lineHeight: 1.65 }}>
627
+ The JXR migration engine performs AST-level import rewrites, config translation,
628
+ and dependency updates. It creates a full backup before touching anything.
629
+ AI agents can trigger migrations autonomously via the MCP server.
630
+ </p>
631
+ <div className="flex flex-wrap gap-2 mb-8">
632
+ {FRAMEWORKS.map((fw) => (
633
+ <div
634
+ key={fw.name}
635
+ className="flex items-center gap-2 px-3 py-1.5 rounded-full text-sm font-medium"
636
+ style={{ background: '#111111', border: '1px solid rgba(255,255,255,0.08)', color: '#9ca3af' }}
637
+ >
638
+ <span>{fw.icon}</span>
639
+ {fw.name}
640
+ </div>
641
+ ))}
642
+ </div>
643
+ <Link href="/docs" className="btn-lava no-underline inline-flex">
644
+ Migration guide <ChevronRight size={15} />
645
+ </Link>
646
+ </div>
647
+
648
+ {/* Right — terminal */}
649
+ <div className="terminal-chrome">
650
+ <div className="terminal-header">
651
+ <div className="terminal-dot" style={{ background: '#ff5f57' }} />
652
+ <div className="terminal-dot" style={{ background: '#febc2e' }} />
653
+ <div className="terminal-dot" style={{ background: '#28c840' }} />
654
+ <span className="terminal-label">jxr migrate</span>
655
+ </div>
656
+ <div className="terminal-body">
657
+ <div><span className="terminal-prompt">$ </span><span className="terminal-cmd">jxr migrate</span></div>
658
+ <div className="mt-1" style={{ color: '#374151' }}>╔══════════════════════════════╗</div>
659
+ <div style={{ color: '#374151' }}>║ JXR Migration Engine v1.0 ║</div>
660
+ <div style={{ color: '#374151' }}>╚══════════════════════════════╝</div>
661
+ <div className="mt-1">
662
+ <span style={{ color: '#9ca3af' }}>→ Detected framework: </span>
663
+ <span style={{ color: '#ffffff', fontWeight: 700 }}>nextjs</span>
664
+ </div>
665
+ <div>
666
+ <span style={{ color: '#9ca3af' }}>→ Creating backup...</span>
667
+ <span className="terminal-out"> ✓</span>
668
+ </div>
669
+ {[
670
+ 'Installing JXR deps',
671
+ 'Generating jxr.config.ts',
672
+ 'Rewriting imports (AST)',
673
+ 'Converting API routes',
674
+ 'Updating package.json',
675
+ ].map((step, i) => (
676
+ <div key={step}>
677
+ <span style={{ color: '#374151' }}>[{i + 1}/5] </span>
678
+ <span style={{ color: '#9ca3af' }}>{step}</span>
679
+ <span className="terminal-out"> ✓</span>
680
+ </div>
681
+ ))}
682
+ <div className="mt-2">
683
+ <span className="terminal-out">✓ </span>
684
+ <span style={{ color: '#ffffff', fontWeight: 700 }}>Migration complete!</span>
685
+ </div>
686
+ <div>
687
+ <span style={{ color: '#9ca3af' }}>→ Run: </span>
688
+ <span className="terminal-orange">jxr dev</span>
689
+ <span className="cursor-blink" />
690
+ </div>
691
+ </div>
692
+ </div>
693
+ </div>
694
+ </div>
695
+ </section>
696
+ );
697
+ }
698
+
699
+ // ─── MCP section ──────────────────────────────────────────────────────────────
700
+
701
+ const MCP_TOOLS = [
702
+ { name: 'jxr_init', desc: 'Scaffold a new JXR project' },
703
+ { name: 'jxr_dev', desc: 'Start dev server with HMR' },
704
+ { name: 'jxr_build', desc: 'Production build with manifest' },
705
+ { name: 'jxr_migrate', desc: 'Migrate from any framework' },
706
+ { name: 'jxr_deploy', desc: 'Deploy to Cloudflare/Deno/Node' },
707
+ { name: 'jxr_detect_framework', desc: 'Auto-detect source framework' },
708
+ { name: 'jxr_read_config', desc: 'Read jxr.config.ts' },
709
+ { name: 'jxr_write_config', desc: 'Update project config' },
710
+ { name: 'jxr_list_files', desc: 'List project file tree' },
711
+ { name: 'jxr_read_file', desc: 'Read any project file' },
712
+ { name: 'jxr_write_file', desc: 'Write or create files' },
713
+ { name: 'jxr_add_plugin', desc: 'Add JXR plugin' },
714
+ { name: 'jxr_run_command', desc: 'Run shell command in project' },
715
+ { name: 'jxr_info', desc: 'Get full project info' },
716
+ ];
717
+
718
+ function MCPSection() {
719
+ return (
720
+ <section className="py-24" style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}>
721
+ <div className="container">
722
+ <div className="grid lg:grid-cols-2 gap-14 items-start">
723
+ {/* Left */}
724
+ <div>
725
+ <div className="section-label">MCP SERVER</div>
726
+ <h2
727
+ style={{
728
+ fontFamily: 'Inter',
729
+ fontWeight: 900,
730
+ fontSize: 'clamp(2rem, 4vw, 3rem)',
731
+ lineHeight: 1.1,
732
+ letterSpacing: '-0.02em',
733
+ color: '#ffffff',
734
+ marginBottom: '1rem',
735
+ }}
736
+ >
737
+ AI agents run your<br />
738
+ <span style={{ color: '#f97316' }}>entire workflow.</span>
739
+ </h2>
740
+ <p style={{ color: '#6b7280', marginBottom: '1.5rem', lineHeight: 1.65 }}>
741
+ The JXR MCP server exposes 14 tools over the Model Context Protocol.
742
+ Claude, Cursor, Copilot, and any MCP-compatible agent can initialize projects,
743
+ run builds, migrate codebases, and deploy to the edge — without leaving the chat.
744
+ </p>
745
+
746
+ <div className="space-y-1">
747
+ {MCP_TOOLS.map((tool, i) => (
748
+ <motion.div
749
+ key={tool.name}
750
+ initial={{ opacity: 0, x: -10 }}
751
+ whileInView={{ opacity: 1, x: 0 }}
752
+ viewport={{ once: true }}
753
+ transition={{ delay: i * 0.025 }}
754
+ className="flex items-center gap-3 px-3 py-2 rounded-lg"
755
+ style={{ background: '#111111', border: '1px solid rgba(255,255,255,0.05)' }}
756
+ >
757
+ <Code2 size={11} style={{ color: '#22c55e', flexShrink: 0 }} />
758
+ <span style={{ fontFamily: 'JetBrains Mono', fontSize: '0.75rem', color: '#22c55e' }}>{tool.name}</span>
759
+ <span style={{ fontSize: '0.75rem', color: '#4b5563', marginLeft: 'auto' }}>{tool.desc}</span>
760
+ </motion.div>
761
+ ))}
762
+ </div>
763
+ </div>
764
+
765
+ {/* Right */}
766
+ <div className="flex flex-col gap-5">
767
+ <div>
768
+ <p style={{ fontSize: '0.82rem', color: '#6b7280', marginBottom: '0.75rem', fontFamily: 'JetBrains Mono' }}>
769
+ Add to Claude Desktop / Cursor / any MCP client:
770
+ </p>
771
+ <div className="terminal-chrome">
772
+ <div className="terminal-header">
773
+ <div className="terminal-dot" style={{ background: '#ff5f57' }} />
774
+ <div className="terminal-dot" style={{ background: '#febc2e' }} />
775
+ <div className="terminal-dot" style={{ background: '#28c840' }} />
776
+ <span className="terminal-label">mcp.json</span>
777
+ </div>
778
+ <div className="terminal-body relative">
779
+ <CopyButton text={`{
780
+ "mcpServers": {
781
+ "jxrstudios": {
782
+ "command": "npx",
783
+ "args": ["-y", "@jxrstudios/mcp"]
784
+ }
785
+ }
786
+ }`} />
787
+ <pre style={{ margin: 0, fontSize: '0.8rem', lineHeight: 1.75, color: '#d1d5db' }}>{`{
788
+ `}<span style={{ color: '#9ca3af' }}>"mcpServers"</span>{`: {
789
+ `}<span style={{ color: '#9ca3af' }}>"jxr"</span>{`: {
790
+ `}<span style={{ color: '#9ca3af' }}>"command"</span>{`: `}<span style={{ color: '#f97316' }}>"npx"</span>{`,
791
+ `}<span style={{ color: '#9ca3af' }}>"args"</span>{`: [`}<span style={{ color: '#f97316' }}>"-y"</span>{`, `}<span style={{ color: '#f97316' }}>"@jxrstudios/mcp"</span>{`]
792
+ }
793
+ }
794
+ }`}</pre>
795
+ </div>
796
+ </div>
797
+ </div>
798
+
799
+ {/* Compatible agents */}
800
+ <div className="jxr-card">
801
+ <p style={{ fontSize: '0.78rem', color: '#4b5563', fontFamily: 'JetBrains Mono', marginBottom: '0.75rem', letterSpacing: '0.1em', textTransform: 'uppercase' }}>
802
+ Compatible agents
803
+ </p>
804
+ <div className="flex flex-wrap gap-2">
805
+ {['Claude Desktop', 'Cursor', 'GitHub Copilot', 'Cline', 'Continue.dev', 'Zed AI', 'Any MCP client'].map((a) => (
806
+ <div
807
+ key={a}
808
+ className="px-2.5 py-1 rounded text-xs font-medium"
809
+ style={{ background: '#1a1a1a', border: '1px solid rgba(255,255,255,0.07)', color: '#9ca3af' }}
810
+ >
811
+ {a}
812
+ </div>
813
+ ))}
814
+ </div>
815
+ </div>
816
+ </div>
817
+ </div>
818
+ </div>
819
+ </section>
820
+ );
821
+ }
822
+
823
+ // ─── CLI section ──────────────────────────────────────────────────────────────
824
+
825
+ const CLI_COMMANDS = [
826
+ { cmd: 'jxr init my-app', desc: 'Scaffold a new project (react-web, react-native, expo, cloudflare)' },
827
+ { cmd: 'jxr dev', desc: 'Start dev server with HMR + MoQ streaming' },
828
+ { cmd: 'jxr build', desc: 'Production build with crypto-signed manifest' },
829
+ { cmd: 'jxr migrate --from nextjs', desc: 'Migrate from Next.js, Vite, Bun, CRA, Expo, Remix, Nuxt' },
830
+ { cmd: 'jxr deploy --target cloudflare', desc: 'Deploy to Cloudflare Workers, Deno Deploy, or Node.js' },
831
+ { cmd: 'jxr add tailwind', desc: 'Add a JXR plugin or integration' },
832
+ { cmd: 'jxr info', desc: 'Print environment and project information' },
833
+ ];
834
+
835
+ function CLISection() {
836
+ const [active, setActive] = useState(0);
837
+
838
+ return (
839
+ <section className="py-24" style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}>
840
+ <div className="container">
841
+ <div className="mb-12">
842
+ <div className="section-label">CLI REFERENCE</div>
843
+ <h2
844
+ style={{
845
+ fontFamily: 'Inter',
846
+ fontWeight: 900,
847
+ fontSize: 'clamp(2rem, 4vw, 3rem)',
848
+ lineHeight: 1.1,
849
+ letterSpacing: '-0.02em',
850
+ color: '#ffffff',
851
+ marginBottom: '0.75rem',
852
+ }}
853
+ >
854
+ One CLI. <span style={{ color: '#f97316' }}>Every IDE.</span>
855
+ </h2>
856
+ <p style={{ color: '#6b7280', maxWidth: '480px', lineHeight: 1.65 }}>
857
+ Install JXR globally and use it in VSCode, Warp, Cursor, iTerm, Windows Terminal — wherever you work.
858
+ </p>
859
+ </div>
860
+
861
+ <div className="max-w-2xl">
862
+ {/* Install */}
863
+ <div className="terminal-chrome mb-5">
864
+ <div className="terminal-header">
865
+ <div className="terminal-dot" style={{ background: '#ff5f57' }} />
866
+ <div className="terminal-dot" style={{ background: '#febc2e' }} />
867
+ <div className="terminal-dot" style={{ background: '#28c840' }} />
868
+ <span className="terminal-label">install</span>
869
+ </div>
870
+ <div className="terminal-body relative">
871
+ <CopyButton text="npm install -g @jxrstudios/jxr" />
872
+ <div><span className="terminal-dim"># Install JXR globally</span></div>
873
+ <div><span className="terminal-prompt">$ </span><span className="terminal-cmd">npm install -g @jxrstudios/jxr</span></div>
874
+ <div className="mt-1"><span className="terminal-dim"># Or with pnpm / yarn / bun</span></div>
875
+ <div><span className="terminal-prompt">$ </span><span className="terminal-cmd">pnpm add -g @jxrstudios/jxr</span></div>
876
+ </div>
877
+ </div>
878
+
879
+ {/* Commands */}
880
+ <div className="space-y-1.5">
881
+ {CLI_COMMANDS.map((item, i) => (
882
+ <motion.div
883
+ key={item.cmd}
884
+ initial={{ opacity: 0, x: -16 }}
885
+ whileInView={{ opacity: 1, x: 0 }}
886
+ viewport={{ once: true }}
887
+ transition={{ delay: i * 0.05 }}
888
+ className="flex items-start gap-3 p-3.5 rounded-lg cursor-pointer transition-all"
889
+ style={{
890
+ background: active === i ? 'rgba(234,88,12,0.07)' : '#111111',
891
+ border: `1px solid ${active === i ? 'rgba(234,88,12,0.25)' : 'rgba(255,255,255,0.05)'}`,
892
+ }}
893
+ onClick={() => setActive(i)}
894
+ >
895
+ <Terminal size={13} style={{ color: '#ea580c', marginTop: '2px', flexShrink: 0 }} />
896
+ <div className="flex-1 min-w-0">
897
+ <div style={{ fontFamily: 'JetBrains Mono', fontSize: '0.82rem', color: '#e5e7eb', marginBottom: '2px' }}>{item.cmd}</div>
898
+ <div style={{ fontSize: '0.78rem', color: '#4b5563' }}>{item.desc}</div>
899
+ </div>
900
+ <ChevronRight size={13} style={{ color: '#374151', flexShrink: 0 }} />
901
+ </motion.div>
902
+ ))}
903
+ </div>
904
+ </div>
905
+ </div>
906
+ </section>
907
+ );
908
+ }
909
+
910
+ // ─── CTA ──────────────────────────────────────────────────────────────────────
911
+
912
+ function CTA() {
913
+ return (
914
+ <section
915
+ className="py-28 relative overflow-hidden"
916
+ style={{ borderTop: '1px solid rgba(255,255,255,0.06)' }}
917
+ >
918
+ {/* Warm glow */}
919
+ <div
920
+ className="absolute inset-0 pointer-events-none"
921
+ style={{ background: 'radial-gradient(ellipse 60% 50% at 50% 50%, rgba(120,40,10,0.25) 0%, transparent 70%)' }}
922
+ />
923
+
924
+ <div className="container relative z-10 text-center">
925
+ <motion.div
926
+ initial={{ opacity: 0, y: 24 }}
927
+ whileInView={{ opacity: 1, y: 0 }}
928
+ viewport={{ once: true }}
929
+ >
930
+ <div className="section-label justify-center" style={{ justifyContent: 'center' }}>GET STARTED</div>
931
+ <h2
932
+ style={{
933
+ fontFamily: 'Inter',
934
+ fontWeight: 900,
935
+ fontSize: 'clamp(2.5rem, 5vw, 4.5rem)',
936
+ lineHeight: 1.05,
937
+ letterSpacing: '-0.02em',
938
+ color: '#ffffff',
939
+ marginBottom: '1rem',
940
+ }}
941
+ >
942
+ Start building<br />
943
+ <span style={{ color: '#f97316' }}>at the edge.</span>
944
+ </h2>
945
+ <p style={{ color: '#6b7280', maxWidth: '460px', margin: '0 auto 2.5rem', lineHeight: 1.65 }}>
946
+ Powered by <strong style={{ color: '#f97316' }}>JXR Studios</strong> × <strong style={{ color: '#22c55e' }}>DamascusAI</strong>.
947
+ The edge OS runtime for developers who take their game to the next level.
948
+ </p>
949
+
950
+ <div className="flex flex-wrap justify-center gap-3">
951
+ <Link href="/docs" className="btn-lava no-underline" style={{ fontSize: '1rem', padding: '0.85rem 2rem' }}>
952
+ Get started →
953
+ </Link>
954
+ <a
955
+ href="https://github.com/jxrstudios/jxr"
956
+ target="_blank"
957
+ rel="noopener noreferrer"
958
+ className="btn-ghost no-underline"
959
+ style={{ fontSize: '1rem', padding: '0.85rem 2rem' }}
960
+ >
961
+ <Star size={15} />
962
+ Star on GitHub
963
+ </a>
964
+ </div>
965
+
966
+ <p style={{ color: '#374151', fontSize: '0.82rem', marginTop: '1.25rem' }}>
967
+ Free tier available. No credit card required.
968
+ </p>
969
+ </motion.div>
970
+ </div>
971
+ </section>
972
+ );
973
+ }
974
+
975
+ // ─── Footer ───────────────────────────────────────────────────────────────────
976
+
977
+ function Footer() {
978
+ return (
979
+ <footer style={{ borderTop: '1px solid rgba(255,255,255,0.06)', background: '#0d0d0d' }}>
980
+ <div className="container py-12">
981
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8 mb-10">
982
+ <div className="col-span-2 md:col-span-1">
983
+ <div className="flex items-center gap-2 mb-4">
984
+ <div className="w-7 h-7 rounded-lg flex items-center justify-center" style={{ background: '#ea580c' }}>
985
+ <Zap size={13} color="#ffffff" strokeWidth={2.5} />
986
+ </div>
987
+ <span style={{ fontFamily: 'Inter', fontWeight: 700, color: '#ffffff' }}>JXR.js</span>
988
+ </div>
989
+ <p style={{ fontSize: '0.8rem', color: '#4b5563', lineHeight: 1.6 }}>
990
+ Edge OS Runtime Framework.<br />
991
+ JXR Studios × DamascusAI
992
+ </p>
993
+ </div>
994
+
995
+ {[
996
+ {
997
+ title: 'Framework',
998
+ links: [
999
+ { label: 'Documentation', href: '/docs' },
1000
+ { label: 'CLI Reference', href: '/docs' },
1001
+ { label: 'MCP Server', href: '/docs' },
1002
+ { label: 'Migration Guide', href: '/docs' },
1003
+ ],
1004
+ },
1005
+ {
1006
+ title: 'Packages',
1007
+ links: [
1008
+ { label: 'jxr (CLI)', href: '#' },
1009
+ { label: '@jxrstudios/core', href: '#' },
1010
+ { label: '@jxrstudios/runtime', href: '#' },
1011
+ { label: '@jxrstudios/mcp', href: '#' },
1012
+ ],
1013
+ },
1014
+ {
1015
+ title: 'Community',
1016
+ links: [
1017
+ { label: 'GitHub', href: 'https://github.com/jxrstudios/jxr' },
1018
+ { label: 'Discord', href: 'https://discord.gg/jxr' },
1019
+ { label: 'Twitter / X', href: 'https://twitter.com/jxrstudios' },
1020
+ { label: 'DamascusAI', href: 'https://damascusai.com' },
1021
+ ],
1022
+ },
1023
+ ].map((col) => (
1024
+ <div key={col.title}>
1025
+ <h4 style={{ fontSize: '0.7rem', fontWeight: 700, color: '#4b5563', textTransform: 'uppercase', letterSpacing: '0.12em', marginBottom: '0.75rem' }}>
1026
+ {col.title}
1027
+ </h4>
1028
+ <ul style={{ listStyle: 'none', padding: 0, margin: 0, display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
1029
+ {col.links.map((link) => (
1030
+ <li key={link.label}>
1031
+ <a
1032
+ href={link.href}
1033
+ style={{ fontSize: '0.85rem', color: '#4b5563', textDecoration: 'none', transition: 'color 0.15s' }}
1034
+ onMouseEnter={e => (e.currentTarget.style.color = '#ea580c')}
1035
+ onMouseLeave={e => (e.currentTarget.style.color = '#4b5563')}
1036
+ >
1037
+ {link.label}
1038
+ </a>
1039
+ </li>
1040
+ ))}
1041
+ </ul>
1042
+ </div>
1043
+ ))}
1044
+ </div>
1045
+
1046
+ <div className="lava-divider mb-6" />
1047
+
1048
+ <div className="flex flex-col md:flex-row items-center justify-between gap-4">
1049
+ <p style={{ fontSize: '0.78rem', color: '#374151' }}>
1050
+ © 2026 JXR Studios · Powered by Cloudflare Edge
1051
+ </p>
1052
+ <div className="flex items-center gap-2">
1053
+ <div className="badge-lava">JXR Studios</div>
1054
+ <span style={{ color: '#374151', fontSize: '0.75rem' }}>×</span>
1055
+ <div className="badge-green">DamascusAI</div>
1056
+ </div>
1057
+ </div>
1058
+ </div>
1059
+ </footer>
1060
+ );
1061
+ }
1062
+
1063
+ // ─── Page ─────────────────────────────────────────────────────────────────────
1064
+
1065
+ export default function Home() {
1066
+ return (
1067
+ <div style={{ background: '#0a0a0a', minHeight: '100vh' }}>
1068
+ <Nav />
1069
+ <Hero />
1070
+ <InstallSection />
1071
+ <StatsBar />
1072
+ <Features />
1073
+ <MigrationSection />
1074
+ <MCPSection />
1075
+ <CLISection />
1076
+ <CTA />
1077
+ <Footer />
1078
+ </div>
1079
+ );
1080
+ }