visionos-monorepo 0.1.0

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 (160) hide show
  1. package/.claude/worktrees/competent-burnell-8d1330/README.md +138 -0
  2. package/.claude/worktrees/competent-burnell-8d1330/cli/package.json +35 -0
  3. package/.claude/worktrees/competent-burnell-8d1330/cli/scripts/copy-web-assets.mjs +12 -0
  4. package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/logout.ts +12 -0
  5. package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/open.ts +19 -0
  6. package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/start.ts +97 -0
  7. package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/status.ts +23 -0
  8. package/.claude/worktrees/competent-burnell-8d1330/cli/src/commands/userinfo.ts +47 -0
  9. package/.claude/worktrees/competent-burnell-8d1330/cli/src/index.ts +23 -0
  10. package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/auth.ts +84 -0
  11. package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/browser.ts +37 -0
  12. package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/localState.ts +80 -0
  13. package/.claude/worktrees/competent-burnell-8d1330/cli/src/lib/runtime.ts +203 -0
  14. package/.claude/worktrees/competent-burnell-8d1330/cli/src/runtime/index.ts +36 -0
  15. package/.claude/worktrees/competent-burnell-8d1330/cli/src/types/inquirer.d.ts +9 -0
  16. package/.claude/worktrees/competent-burnell-8d1330/cli/tsconfig.json +19 -0
  17. package/.claude/worktrees/competent-burnell-8d1330/client/index.html +15 -0
  18. package/.claude/worktrees/competent-burnell-8d1330/client/package.json +27 -0
  19. package/.claude/worktrees/competent-burnell-8d1330/client/postcss.config.cjs +7 -0
  20. package/.claude/worktrees/competent-burnell-8d1330/client/src/App.tsx +57 -0
  21. package/.claude/worktrees/competent-burnell-8d1330/client/src/components/CliAuthPage.tsx +385 -0
  22. package/.claude/worktrees/competent-burnell-8d1330/client/src/components/ManifestoPage.tsx +946 -0
  23. package/.claude/worktrees/competent-burnell-8d1330/client/src/components/TrackCard.tsx +19 -0
  24. package/.claude/worktrees/competent-burnell-8d1330/client/src/lib/api.ts +58 -0
  25. package/.claude/worktrees/competent-burnell-8d1330/client/src/main.tsx +11 -0
  26. package/.claude/worktrees/competent-burnell-8d1330/client/src/styles/index.css +33 -0
  27. package/.claude/worktrees/competent-burnell-8d1330/client/src/styles/manifesto.css +1398 -0
  28. package/.claude/worktrees/competent-burnell-8d1330/client/tailwind.config.ts +36 -0
  29. package/.claude/worktrees/competent-burnell-8d1330/client/tsconfig.json +25 -0
  30. package/.claude/worktrees/competent-burnell-8d1330/client/vite.config.ts +20 -0
  31. package/.claude/worktrees/competent-burnell-8d1330/package-lock.json +5278 -0
  32. package/.claude/worktrees/competent-burnell-8d1330/package.json +24 -0
  33. package/.claude/worktrees/competent-burnell-8d1330/server/package.json +25 -0
  34. package/.claude/worktrees/competent-burnell-8d1330/server/src/app.ts +71 -0
  35. package/.claude/worktrees/competent-burnell-8d1330/server/src/config/env.ts +14 -0
  36. package/.claude/worktrees/competent-burnell-8d1330/server/src/features/auth/sessionStore.ts +74 -0
  37. package/.claude/worktrees/competent-burnell-8d1330/server/src/index.ts +8 -0
  38. package/.claude/worktrees/competent-burnell-8d1330/server/src/routes/auth.ts +112 -0
  39. package/.claude/worktrees/competent-burnell-8d1330/server/src/routes/health.ts +14 -0
  40. package/.claude/worktrees/competent-burnell-8d1330/server/tsconfig.json +19 -0
  41. package/.claude/worktrees/competent-burnell-8d1330/shared/package.json +24 -0
  42. package/.claude/worktrees/competent-burnell-8d1330/shared/src/index.ts +91 -0
  43. package/.claude/worktrees/competent-burnell-8d1330/shared/tsconfig.json +16 -0
  44. package/.claude/worktrees/competent-burnell-8d1330/tsconfig.base.json +12 -0
  45. package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/index.html +392 -0
  46. package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/script.js +146 -0
  47. package/.claude/worktrees/competent-burnell-8d1330/visionos-manifesto/styles.css +1082 -0
  48. package/.claude/worktrees/vigilant-napier-0de76f/README.md +138 -0
  49. package/.claude/worktrees/vigilant-napier-0de76f/cli/package.json +35 -0
  50. package/.claude/worktrees/vigilant-napier-0de76f/cli/scripts/copy-web-assets.mjs +12 -0
  51. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/logout.ts +12 -0
  52. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/open.ts +19 -0
  53. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/start.ts +97 -0
  54. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/status.ts +23 -0
  55. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/commands/userinfo.ts +47 -0
  56. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/index.ts +23 -0
  57. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/auth.ts +84 -0
  58. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/browser.ts +37 -0
  59. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/localState.ts +80 -0
  60. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/lib/runtime.ts +203 -0
  61. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/runtime/index.ts +36 -0
  62. package/.claude/worktrees/vigilant-napier-0de76f/cli/src/types/inquirer.d.ts +9 -0
  63. package/.claude/worktrees/vigilant-napier-0de76f/cli/tsconfig.json +19 -0
  64. package/.claude/worktrees/vigilant-napier-0de76f/client/index.html +15 -0
  65. package/.claude/worktrees/vigilant-napier-0de76f/client/package.json +27 -0
  66. package/.claude/worktrees/vigilant-napier-0de76f/client/postcss.config.cjs +7 -0
  67. package/.claude/worktrees/vigilant-napier-0de76f/client/src/App.tsx +57 -0
  68. package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/CliAuthPage.tsx +385 -0
  69. package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/ManifestoPage.tsx +946 -0
  70. package/.claude/worktrees/vigilant-napier-0de76f/client/src/components/TrackCard.tsx +19 -0
  71. package/.claude/worktrees/vigilant-napier-0de76f/client/src/lib/api.ts +58 -0
  72. package/.claude/worktrees/vigilant-napier-0de76f/client/src/main.tsx +11 -0
  73. package/.claude/worktrees/vigilant-napier-0de76f/client/src/styles/index.css +33 -0
  74. package/.claude/worktrees/vigilant-napier-0de76f/client/src/styles/manifesto.css +1398 -0
  75. package/.claude/worktrees/vigilant-napier-0de76f/client/tailwind.config.ts +36 -0
  76. package/.claude/worktrees/vigilant-napier-0de76f/client/tsconfig.json +25 -0
  77. package/.claude/worktrees/vigilant-napier-0de76f/client/vite.config.ts +20 -0
  78. package/.claude/worktrees/vigilant-napier-0de76f/package-lock.json +5278 -0
  79. package/.claude/worktrees/vigilant-napier-0de76f/package.json +24 -0
  80. package/.claude/worktrees/vigilant-napier-0de76f/server/package.json +25 -0
  81. package/.claude/worktrees/vigilant-napier-0de76f/server/src/app.ts +71 -0
  82. package/.claude/worktrees/vigilant-napier-0de76f/server/src/config/env.ts +14 -0
  83. package/.claude/worktrees/vigilant-napier-0de76f/server/src/features/auth/sessionStore.ts +74 -0
  84. package/.claude/worktrees/vigilant-napier-0de76f/server/src/index.ts +8 -0
  85. package/.claude/worktrees/vigilant-napier-0de76f/server/src/routes/auth.ts +112 -0
  86. package/.claude/worktrees/vigilant-napier-0de76f/server/src/routes/health.ts +14 -0
  87. package/.claude/worktrees/vigilant-napier-0de76f/server/tsconfig.json +19 -0
  88. package/.claude/worktrees/vigilant-napier-0de76f/shared/package.json +24 -0
  89. package/.claude/worktrees/vigilant-napier-0de76f/shared/src/index.ts +91 -0
  90. package/.claude/worktrees/vigilant-napier-0de76f/shared/tsconfig.json +16 -0
  91. package/.claude/worktrees/vigilant-napier-0de76f/tsconfig.base.json +12 -0
  92. package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/index.html +392 -0
  93. package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/script.js +146 -0
  94. package/.claude/worktrees/vigilant-napier-0de76f/visionos-manifesto/styles.css +1082 -0
  95. package/.github/workflows/publish.yml +30 -0
  96. package/README.md +175 -0
  97. package/cli/README.md +165 -0
  98. package/cli/package.json +36 -0
  99. package/cli/scripts/copy-web-assets.mjs +12 -0
  100. package/cli/src/commands/lessons.ts +68 -0
  101. package/cli/src/commands/login.ts +46 -0
  102. package/cli/src/commands/logout.ts +12 -0
  103. package/cli/src/commands/open.ts +29 -0
  104. package/cli/src/commands/start.ts +146 -0
  105. package/cli/src/commands/status.ts +28 -0
  106. package/cli/src/commands/userinfo.ts +59 -0
  107. package/cli/src/index.ts +109 -0
  108. package/cli/src/lib/auth.ts +84 -0
  109. package/cli/src/lib/browser.ts +37 -0
  110. package/cli/src/lib/content.ts +57 -0
  111. package/cli/src/lib/lessonPrinter.ts +38 -0
  112. package/cli/src/lib/lessonRunner.ts +381 -0
  113. package/cli/src/lib/localState.ts +114 -0
  114. package/cli/src/lib/loginFlow.ts +74 -0
  115. package/cli/src/lib/progress.ts +94 -0
  116. package/cli/src/lib/runtime.ts +220 -0
  117. package/cli/src/lib/validator.ts +401 -0
  118. package/cli/src/runtime/index.ts +108 -0
  119. package/cli/src/types/inquirer.d.ts +9 -0
  120. package/cli/tsconfig.json +19 -0
  121. package/client/index.html +15 -0
  122. package/client/package.json +27 -0
  123. package/client/postcss.config.cjs +7 -0
  124. package/client/src/App.tsx +102 -0
  125. package/client/src/components/AccountPage.tsx +79 -0
  126. package/client/src/components/AuthPanel.tsx +312 -0
  127. package/client/src/components/CliAuthPage.tsx +367 -0
  128. package/client/src/components/CreatorPortal.tsx +885 -0
  129. package/client/src/components/ErrorBoundary.tsx +92 -0
  130. package/client/src/components/ManifestoPage.tsx +1126 -0
  131. package/client/src/components/TrackCard.tsx +19 -0
  132. package/client/src/lib/api.ts +215 -0
  133. package/client/src/main.tsx +14 -0
  134. package/client/src/styles/index.css +33 -0
  135. package/client/src/styles/manifesto.css +1828 -0
  136. package/client/tailwind.config.ts +36 -0
  137. package/client/tsconfig.json +25 -0
  138. package/client/vercel.json +8 -0
  139. package/client/vite.config.ts +33 -0
  140. package/package.json +27 -0
  141. package/server/package.json +26 -0
  142. package/server/src/app.ts +132 -0
  143. package/server/src/config/env.ts +135 -0
  144. package/server/src/features/accounts/accountStore.ts +359 -0
  145. package/server/src/features/accounts/contentStore.ts +264 -0
  146. package/server/src/features/accounts/password.ts +26 -0
  147. package/server/src/features/auth/sessionStore.ts +79 -0
  148. package/server/src/index.ts +8 -0
  149. package/server/src/routes/auth.ts +328 -0
  150. package/server/src/routes/content.ts +174 -0
  151. package/server/src/routes/health.ts +14 -0
  152. package/server/src/routes/progress.ts +105 -0
  153. package/server/tsconfig.json +19 -0
  154. package/shared/package.json +24 -0
  155. package/shared/src/index.ts +455 -0
  156. package/shared/tsconfig.json +16 -0
  157. package/tsconfig.base.json +12 -0
  158. package/visionos-manifesto/index.html +392 -0
  159. package/visionos-manifesto/script.js +146 -0
  160. package/visionos-manifesto/styles.css +1082 -0
@@ -0,0 +1,392 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>VisionOS — The Terminal Learning Manifesto</title>
7
+ <meta name="description" content="VisionOS is a CLI-first learning platform. Master Git, Linux, React CLI, and OS commands through guided terminal practice — not reading." />
8
+ <meta name="theme-color" content="#E0DFD5" />
9
+ <link rel="stylesheet" href="styles.css" />
10
+ </head>
11
+ <body>
12
+
13
+ <!-- ════════════════════════════════════════════════════════════════
14
+ Monitor Bezel Frame
15
+ ════════════════════════════════════════════════════════════ -->
16
+ <div class="monitor-bezel">
17
+ <div class="monitor-screen">
18
+
19
+ <!-- ── STICKY HEADER ─────────────────────────────────────── -->
20
+ <header class="site-header" id="header">
21
+ <div class="header-left">
22
+ <span class="header-brand">VisionOS</span>
23
+ <span class="header-meta">v0.1.0 — CLI-First Learning</span>
24
+ </div>
25
+ <nav class="header-nav">
26
+ <a href="#tracks">Tracks</a>
27
+ <a href="#commands">Commands</a>
28
+ <a href="https://github.com" target="_blank" rel="noopener">GitHub <span class="arrow">↗</span></a>
29
+ </nav>
30
+ </header>
31
+
32
+ <!-- ── HERO ──────────────────────────────────────────────── -->
33
+ <section class="section section--hero" id="hero">
34
+
35
+ <div class="hero-content">
36
+ <p class="text-label reveal">Once upon a time, we typed a command</p>
37
+
38
+ <div style="margin-top: 24px; overflow: hidden;">
39
+ <span class="scanline-text reveal delay-1">TERMINAL.</span>
40
+ </div>
41
+
42
+ <p class="text-hero-lead reveal delay-3" style="margin-top: 32px;">
43
+ The command line was the first interface.<br/>
44
+ It's time we <em>learned</em> it properly.
45
+ </p>
46
+ </div>
47
+
48
+ <div class="hero-prompt-container reveal delay-4">
49
+ <div class="hero-prompt">
50
+ <span>▸</span>
51
+ <span class="hero-prompt-key">enter</span>
52
+ <span>to continue</span>
53
+ </div>
54
+ </div>
55
+
56
+ <!-- Scroll Indicator -->
57
+ <div class="scroll-indicator">
58
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round">
59
+ <rect x="7" y="2" width="10" height="16" rx="5" />
60
+ <line x1="12" y1="6" x2="12" y2="9" />
61
+ </svg>
62
+ <span class="arrow">↓</span>
63
+ </div>
64
+ </section>
65
+
66
+ <!-- ── SCANLINE DIVIDER ──────────────────────────────────── -->
67
+ <div class="scanline-divider scanline-divider--both"></div>
68
+
69
+ <!-- ── NARRATIVE 1 — THE ORIGIN ──────────────────────────── -->
70
+ <section class="section" id="origin">
71
+ <div class="split-layout split-layout--text-left split-layout--center">
72
+
73
+ <div class="reveal-left">
74
+ <p class="text-narrative">
75
+ The command line was the original interface.
76
+ </p>
77
+ <p class="text-narrative text-narrative--muted" style="margin-top: 16px;">
78
+ Raw, powerful, unfiltered. Before every GUI, before every app — there was a blinking cursor and an empty prompt.
79
+ </p>
80
+ </div>
81
+
82
+ <div class="figure reveal-right delay-2">
83
+ <div class="terminal-window">
84
+ <div class="terminal-titlebar">
85
+ <span class="terminal-dot terminal-dot--red"></span>
86
+ <span class="terminal-dot terminal-dot--yellow"></span>
87
+ <span class="terminal-dot terminal-dot--green"></span>
88
+ </div>
89
+ <div class="terminal-body">
90
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">whoami</span></span>
91
+ <span class="terminal-line"><span class="output">learner</span></span>
92
+ <span class="terminal-line">&nbsp;</span>
93
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">echo "hello, terminal"</span></span>
94
+ <span class="terminal-line"><span class="success">hello, terminal</span></span>
95
+ <span class="terminal-line">&nbsp;</span>
96
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">█</span></span>
97
+ </div>
98
+ </div>
99
+ <div class="figure-caption" style="margin-top: 20px;">
100
+ <span class="figure-label">Fig 1</span>
101
+ <span class="figure-desc">The terminal — where computing began. A blinking cursor, infinite possibility.</span>
102
+ </div>
103
+ </div>
104
+
105
+ </div>
106
+ </section>
107
+
108
+ <!-- ── TRANSITION — GIANT TEXT ────────────────────────────── -->
109
+ <section class="section" style="padding: var(--space-xxl) 0;">
110
+ <div class="scanline-divider scanline-divider--fade-bottom" style="height: 60px; margin-bottom: 32px;"></div>
111
+
112
+ <div class="scanline-band reveal-scale">
113
+ <span class="scanline-text" style="text-align: center; display: block;">PRACTICE</span>
114
+ </div>
115
+
116
+ <div class="scanline-divider scanline-divider--fade-top" style="height: 60px; margin-top: 32px;"></div>
117
+
118
+ <div style="text-align: center; padding: 0 60px; margin-top: var(--space-lg);">
119
+ <p class="text-narrative reveal" style="max-width: 600px; margin: 0 auto;">
120
+ Now, we believe it's time for a future where the terminal becomes your classroom.
121
+ </p>
122
+ </div>
123
+ </section>
124
+
125
+ <!-- ── MEET VISIONOS ─────────────────────────────────────── -->
126
+ <section class="section" id="about">
127
+ <div class="reveal">
128
+ <p class="text-label">Introducing</p>
129
+ <h2 class="text-section-title" style="margin-top: 8px;">Meet VisionOS</h2>
130
+ <p class="text-section-subtitle" style="margin-top: 4px;">A CLI-first learning platform.</p>
131
+ </div>
132
+
133
+ <div style="margin-top: var(--space-lg);">
134
+ <div class="split-layout split-layout--text-left split-layout--center">
135
+ <div class="reveal-left delay-1">
136
+ <p class="text-narrative">
137
+ We believe the best way to learn terminal commands is by doing — not reading.
138
+ </p>
139
+ <p class="text-body" style="margin-top: 20px;">
140
+ VisionOS is a guided, interactive learning environment that lives right inside your terminal. Install it, pick a track, and start typing real commands — with real-time validation, progress tracking, and structured lessons.
141
+ </p>
142
+ </div>
143
+ <div class="figure reveal-right delay-2">
144
+ <div class="terminal-window">
145
+ <div class="terminal-titlebar">
146
+ <span class="terminal-dot terminal-dot--red"></span>
147
+ <span class="terminal-dot terminal-dot--yellow"></span>
148
+ <span class="terminal-dot terminal-dot--green"></span>
149
+ </div>
150
+ <div class="terminal-body">
151
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">npm install -g visionos-cli</span></span>
152
+ <span class="terminal-line"><span class="output">+ visionos-cli@0.1.0 installed</span></span>
153
+ <span class="terminal-line">&nbsp;</span>
154
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">visionos start</span></span>
155
+ <span class="terminal-line"><span class="success"> ✓ VisionOS runtime started</span></span>
156
+ <span class="terminal-line"><span class="success"> ✓ Server running at 127.0.0.1:4000</span></span>
157
+ <span class="terminal-line"><span class="output"> → Opening dashboard...</span></span>
158
+ </div>
159
+ </div>
160
+ <div class="figure-caption" style="margin-top: 20px;">
161
+ <span class="figure-label">Fig 3</span>
162
+ <span class="figure-desc">Two commands. That's all it takes to enter a guided terminal classroom.</span>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </section>
168
+
169
+ <!-- ── SCANLINE DIVIDER ──────────────────────────────────── -->
170
+ <div class="scanline-divider scanline-divider--both" style="height: 60px;"></div>
171
+
172
+ <!-- ── HOW IT WORKS ──────────────────────────────────────── -->
173
+ <section class="section" id="how">
174
+ <div class="reveal">
175
+ <p class="text-label">How it works</p>
176
+ <h2 class="text-section-title" style="margin-top: 8px;">Three steps to mastery</h2>
177
+ </div>
178
+
179
+ <div class="steps-grid">
180
+ <div class="step-card reveal delay-1">
181
+ <span class="step-number">01 —</span>
182
+ <h3 class="step-title">Install</h3>
183
+ <p class="step-desc">Install VisionOS globally with a single npm command. No config, no fuss.</p>
184
+ <code class="step-code">npm i -g visionos-cli</code>
185
+ </div>
186
+
187
+ <div class="step-card reveal delay-2">
188
+ <span class="step-number">02 —</span>
189
+ <h3 class="step-title">Start</h3>
190
+ <p class="step-desc">Launch the runtime. VisionOS spins up a local server and opens your dashboard.</p>
191
+ <code class="step-code">visionos start</code>
192
+ </div>
193
+
194
+ <div class="step-card reveal delay-3">
195
+ <span class="step-number">03 —</span>
196
+ <h3 class="step-title">Learn</h3>
197
+ <p class="step-desc">Pick a learning track, follow guided lessons, and practice real commands with instant feedback.</p>
198
+ <code class="step-code">visionos open</code>
199
+ </div>
200
+ </div>
201
+ </section>
202
+
203
+ <!-- ── LEARNING TRACKS ───────────────────────────────────── -->
204
+ <section class="section" id="tracks">
205
+ <div class="reveal">
206
+ <p class="text-label">Learning Tracks</p>
207
+ <h2 class="text-section-title" style="margin-top: 8px;">Pick your path</h2>
208
+ <p class="text-body" style="margin-top: 12px;">
209
+ Four structured tracks, each with guided lessons that build on each other. Start from basics, reach mastery.
210
+ </p>
211
+ </div>
212
+
213
+ <div class="tracks-grid">
214
+ <div class="track-card reveal delay-1">
215
+ <div class="track-card-icon">G</div>
216
+ <h3 class="track-card-title">Git</h3>
217
+ <p class="track-card-desc">Master version control from init to rebase. Branches, merges, conflicts — hands-on.</p>
218
+ </div>
219
+
220
+ <div class="track-card reveal delay-2">
221
+ <div class="track-card-icon">L</div>
222
+ <h3 class="track-card-title">Linux</h3>
223
+ <p class="track-card-desc">Navigate the filesystem, manage processes, and write shell scripts with confidence.</p>
224
+ </div>
225
+
226
+ <div class="track-card reveal delay-3">
227
+ <div class="track-card-icon">R</div>
228
+ <h3 class="track-card-title">React CLI</h3>
229
+ <p class="track-card-desc">Scaffold, configure, and manage React projects entirely from the command line.</p>
230
+ </div>
231
+
232
+ <div class="track-card reveal delay-4">
233
+ <div class="track-card-icon">OS</div>
234
+ <h3 class="track-card-title">OS Commands</h3>
235
+ <p class="track-card-desc">System info, disk management, networking — learn the commands that power your machine.</p>
236
+ </div>
237
+ </div>
238
+ </section>
239
+
240
+ <!-- ── SCANLINE DIVIDER ──────────────────────────────────── -->
241
+ <div class="scanline-divider scanline-divider--both" style="height: 60px;"></div>
242
+
243
+ <!-- ── CLI COMMANDS REFERENCE ─────────────────────────────── -->
244
+ <section class="section" id="commands">
245
+ <div class="split-layout split-layout--text-left">
246
+
247
+ <div>
248
+ <div class="reveal">
249
+ <p class="text-label">CLI Reference</p>
250
+ <h2 class="text-section-title" style="margin-top: 8px;">Built for<br/>the terminal</h2>
251
+ <p class="text-body" style="margin-top: 16px;">
252
+ Every interaction happens through clean, memorable commands. No GUI required.
253
+ </p>
254
+ </div>
255
+
256
+ <div class="commands-list reveal delay-1" style="margin-top: 32px;">
257
+ <div class="command-row">
258
+ <span class="command-name">visionos start</span>
259
+ <span class="command-desc">Start the local runtime & dashboard server</span>
260
+ </div>
261
+ <div class="command-row">
262
+ <span class="command-name">visionos open</span>
263
+ <span class="command-desc">Open the learning dashboard in your browser</span>
264
+ </div>
265
+ <div class="command-row">
266
+ <span class="command-name">visionos userinfo</span>
267
+ <span class="command-desc">Display your profile & learning progress</span>
268
+ </div>
269
+ <div class="command-row">
270
+ <span class="command-name">visionos status</span>
271
+ <span class="command-desc">Check if the runtime server is running</span>
272
+ </div>
273
+ <div class="command-row">
274
+ <span class="command-name">visionos logout</span>
275
+ <span class="command-desc">Sign out and clear session data</span>
276
+ </div>
277
+ </div>
278
+ </div>
279
+
280
+ <div class="reveal-right delay-2" style="display: flex; align-items: center; justify-content: center;">
281
+ <div class="access-card">
282
+ <div class="access-card-stripe"></div>
283
+ <div class="access-card-content">
284
+ <div>
285
+ <span class="access-card-label">Terminal Access Card</span>
286
+ <span class="access-card-value">VisionOS <span style="color: var(--accent-teal);">CLI</span></span>
287
+ </div>
288
+ <div class="access-card-row">
289
+ <div class="access-card-field">
290
+ <span class="access-card-label">Version</span>
291
+ <span class="access-card-value access-card-mono">0.1.0</span>
292
+ </div>
293
+ <div class="access-card-field">
294
+ <span class="access-card-label">Runtime</span>
295
+ <span class="access-card-value access-card-mono">Node.js</span>
296
+ </div>
297
+ </div>
298
+ <div class="access-card-row">
299
+ <div class="access-card-field">
300
+ <span class="access-card-label">Port</span>
301
+ <span class="access-card-value access-card-mono">4000</span>
302
+ </div>
303
+ <div class="access-card-field">
304
+ <span class="access-card-label">Tracks</span>
305
+ <span class="access-card-value access-card-mono">4</span>
306
+ </div>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ </div>
313
+ </section>
314
+
315
+ <!-- ── CTA — START YOUR JOURNEY ──────────────────────────── -->
316
+ <section class="section" style="padding-bottom: var(--space-xxl);" id="cta">
317
+
318
+ <div class="scanline-band reveal-scale" style="margin-bottom: var(--space-xl);">
319
+ <span class="scanline-text" style="text-align: center; display: block; font-size: clamp(3rem, 8vw, 7rem);">BEGIN.</span>
320
+ </div>
321
+
322
+ <div class="split-layout split-layout--text-left split-layout--center">
323
+ <div class="reveal-left">
324
+ <p class="text-label">Get Started</p>
325
+ <h2 class="text-section-title" style="margin-top: 8px;">Start your<br/>terminal journey</h2>
326
+ <p class="text-body" style="margin-top: 16px;">
327
+ One command to install. One command to learn. The terminal awaits.
328
+ </p>
329
+
330
+ <div
331
+ class="copy-command"
332
+ data-copy="npm install -g visionos-cli"
333
+ role="button"
334
+ tabindex="0"
335
+ aria-label="Copy install command"
336
+ >
337
+ <span style="opacity: 0.4;">$</span>
338
+ <span>npm install -g visionos-cli</span>
339
+ <span class="copy-icon">
340
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
341
+ <rect x="9" y="9" width="13" height="13" rx="2"/>
342
+ <path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/>
343
+ </svg>
344
+ </span>
345
+ <span class="copied-tooltip">Copied!</span>
346
+ </div>
347
+
348
+ <p class="text-label" style="margin-top: 20px;">Then run <strong style="color: var(--ink); font-weight: 700;">visionos start</strong></p>
349
+ </div>
350
+
351
+ <div class="reveal-right delay-2" style="display: flex; align-items: center; justify-content: center;">
352
+ <div class="terminal-window" style="width: 100%; max-width: 400px;">
353
+ <div class="terminal-titlebar">
354
+ <span class="terminal-dot terminal-dot--red"></span>
355
+ <span class="terminal-dot terminal-dot--yellow"></span>
356
+ <span class="terminal-dot terminal-dot--green"></span>
357
+ </div>
358
+ <div class="terminal-body">
359
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">npm i -g visionos-cli</span></span>
360
+ <span class="terminal-line"><span class="success">✓ installed globally</span></span>
361
+ <span class="terminal-line">&nbsp;</span>
362
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">visionos start</span></span>
363
+ <span class="terminal-line"><span class="success">✓ Runtime active</span></span>
364
+ <span class="terminal-line"><span class="output"> Dashboard → http://127.0.0.1:4000</span></span>
365
+ <span class="terminal-line"><span class="prompt">~$</span> <span class="command">█</span></span>
366
+ </div>
367
+ </div>
368
+ </div>
369
+ </div>
370
+ </section>
371
+
372
+ <!-- ── FOOTER ────────────────────────────────────────────── -->
373
+ <footer class="site-footer">
374
+ <div class="header-left">
375
+ <span class="header-brand">VisionOS</span>
376
+ <span class="header-meta">© 2025 · CLI-First Learning</span>
377
+ </div>
378
+ <nav class="header-nav">
379
+ <a href="#hero">Top ↑</a>
380
+ <a href="https://github.com" target="_blank" rel="noopener">GitHub <span class="arrow">↗</span></a>
381
+ </nav>
382
+ </footer>
383
+
384
+ </div><!-- .monitor-screen -->
385
+ <div class="bezel-notch">
386
+ <div class="bezel-notch-inner"></div>
387
+ </div>
388
+ </div><!-- .monitor-bezel -->
389
+
390
+ <script src="script.js"></script>
391
+ </body>
392
+ </html>
@@ -0,0 +1,146 @@
1
+ /* ================================================================
2
+ VisionOS Manifesto — Scroll Animations & Interactions
3
+ ================================================================ */
4
+
5
+ document.addEventListener('DOMContentLoaded', () => {
6
+ // ── Scroll Reveal Animations ──────────────────────────────────
7
+ const revealElements = document.querySelectorAll('.reveal, .reveal-left, .reveal-right, .reveal-scale');
8
+
9
+ const revealObserver = new IntersectionObserver(
10
+ (entries) => {
11
+ entries.forEach((entry) => {
12
+ if (entry.isIntersecting) {
13
+ entry.target.classList.add('visible');
14
+ // Once revealed, stop observing for performance
15
+ revealObserver.unobserve(entry.target);
16
+ }
17
+ });
18
+ },
19
+ {
20
+ threshold: 0.15,
21
+ rootMargin: '0px 0px -60px 0px',
22
+ }
23
+ );
24
+
25
+ revealElements.forEach((el) => revealObserver.observe(el));
26
+
27
+ // ── Terminal Line Animation Re-trigger ────────────────────────
28
+ const terminalWindows = document.querySelectorAll('.terminal-window');
29
+
30
+ const terminalObserver = new IntersectionObserver(
31
+ (entries) => {
32
+ entries.forEach((entry) => {
33
+ if (entry.isIntersecting) {
34
+ const lines = entry.target.querySelectorAll('.terminal-line');
35
+ lines.forEach((line) => {
36
+ line.style.animation = 'none';
37
+ // Force reflow
38
+ void line.offsetHeight;
39
+ line.style.animation = '';
40
+ });
41
+ terminalObserver.unobserve(entry.target);
42
+ }
43
+ });
44
+ },
45
+ { threshold: 0.3 }
46
+ );
47
+
48
+ terminalWindows.forEach((el) => terminalObserver.observe(el));
49
+
50
+ // ── Copy to Clipboard ─────────────────────────────────────────
51
+ const copyButtons = document.querySelectorAll('[data-copy]');
52
+
53
+ copyButtons.forEach((btn) => {
54
+ btn.addEventListener('click', () => {
55
+ const textToCopy = btn.getAttribute('data-copy');
56
+
57
+ navigator.clipboard.writeText(textToCopy).then(() => {
58
+ btn.classList.add('copied');
59
+ setTimeout(() => btn.classList.remove('copied'), 1800);
60
+ }).catch(() => {
61
+ // Fallback for older browsers
62
+ const textarea = document.createElement('textarea');
63
+ textarea.value = textToCopy;
64
+ textarea.style.position = 'fixed';
65
+ textarea.style.opacity = '0';
66
+ document.body.appendChild(textarea);
67
+ textarea.select();
68
+ try {
69
+ document.execCommand('copy');
70
+ btn.classList.add('copied');
71
+ setTimeout(() => btn.classList.remove('copied'), 1800);
72
+ } catch (e) {
73
+ console.error('Copy failed', e);
74
+ }
75
+ document.body.removeChild(textarea);
76
+ });
77
+ });
78
+ });
79
+
80
+ // ── Scroll Indicator Fade ─────────────────────────────────────
81
+ const scrollIndicator = document.querySelector('.scroll-indicator');
82
+
83
+ if (scrollIndicator) {
84
+ let hasScrolled = false;
85
+
86
+ const handleScroll = () => {
87
+ if (!hasScrolled && window.scrollY > 100) {
88
+ hasScrolled = true;
89
+ scrollIndicator.style.transition = 'opacity 0.5s ease';
90
+ scrollIndicator.style.opacity = '0';
91
+ setTimeout(() => {
92
+ scrollIndicator.style.display = 'none';
93
+ }, 500);
94
+ window.removeEventListener('scroll', handleScroll);
95
+ }
96
+ };
97
+
98
+ window.addEventListener('scroll', handleScroll, { passive: true });
99
+ }
100
+
101
+ // ── Smooth Scroll for Anchor Links ────────────────────────────
102
+ document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
103
+ anchor.addEventListener('click', (e) => {
104
+ e.preventDefault();
105
+ const target = document.querySelector(anchor.getAttribute('href'));
106
+ if (target) {
107
+ target.scrollIntoView({ behavior: 'smooth', block: 'start' });
108
+ }
109
+ });
110
+ });
111
+
112
+ // ── Header Background on Scroll ───────────────────────────────
113
+ const header = document.querySelector('.site-header');
114
+
115
+ if (header) {
116
+ const updateHeaderBg = () => {
117
+ if (window.scrollY > 50) {
118
+ header.style.background = 'rgba(224, 223, 213, 0.95)';
119
+ header.style.borderBottomColor = 'rgba(0,0,0,0.08)';
120
+ } else {
121
+ header.style.background = 'rgba(224, 223, 213, 0.85)';
122
+ header.style.borderBottomColor = 'rgba(0,0,0,0.04)';
123
+ }
124
+ };
125
+
126
+ window.addEventListener('scroll', updateHeaderBg, { passive: true });
127
+ updateHeaderBg();
128
+ }
129
+
130
+ // ── Parallax Scanline Bands ───────────────────────────────────
131
+ const scanlineBands = document.querySelectorAll('.scanline-divider');
132
+
133
+ if (scanlineBands.length > 0) {
134
+ const handleParallax = () => {
135
+ const scrollY = window.scrollY;
136
+ scanlineBands.forEach((band) => {
137
+ const rect = band.getBoundingClientRect();
138
+ const centerOffset = rect.top + rect.height / 2 - window.innerHeight / 2;
139
+ const parallaxShift = centerOffset * 0.05;
140
+ band.style.backgroundPositionY = `${parallaxShift}px`;
141
+ });
142
+ };
143
+
144
+ window.addEventListener('scroll', handleParallax, { passive: true });
145
+ }
146
+ });