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,1082 @@
1
+ /* ================================================================
2
+ VisionOS Manifesto — Mainframe-Inspired Design System
3
+ ================================================================ */
4
+
5
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap');
6
+
7
+ /* ── Tokens ────────────────────────────────────────────────────── */
8
+ :root {
9
+ --bg-beige: #E0DFD5;
10
+ --bg-beige-light: #E8E7DF;
11
+ --bg-beige-dark: #D4D3CB;
12
+ --ink: #0A0A0A;
13
+ --ink-soft: #3A3A3A;
14
+ --ink-muted: #6B6B6B;
15
+ --ink-faint: #9A9A9A;
16
+ --accent-teal: #0e7490;
17
+ --accent-red: #E05A3A;
18
+ --accent-green: #2D8A56;
19
+ --white: #FAFAF8;
20
+ --bezel-outer: #A8A8A0;
21
+ --bezel-inner: #C5C4BC;
22
+ --bezel-highlight: #D8D7CF;
23
+
24
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
25
+ --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', monospace;
26
+
27
+ --space-xs: 0.5rem;
28
+ --space-sm: 1rem;
29
+ --space-md: 2rem;
30
+ --space-lg: 4rem;
31
+ --space-xl: 6rem;
32
+ --space-xxl: 10rem;
33
+
34
+ --radius-sm: 4px;
35
+ --radius-md: 8px;
36
+ --radius-lg: 16px;
37
+
38
+ --transition-base: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
39
+ --transition-spring: 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
40
+ }
41
+
42
+ /* ── Reset & Base ──────────────────────────────────────────────── */
43
+ *, *::before, *::after {
44
+ margin: 0;
45
+ padding: 0;
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ html {
50
+ scroll-behavior: smooth;
51
+ -webkit-font-smoothing: antialiased;
52
+ -moz-osx-font-smoothing: grayscale;
53
+ text-rendering: optimizeLegibility;
54
+ font-size: 16px;
55
+ }
56
+
57
+ body {
58
+ font-family: var(--font-sans);
59
+ color: var(--ink);
60
+ background: var(--bezel-outer);
61
+ overflow-x: hidden;
62
+ line-height: 1.6;
63
+ }
64
+
65
+ a {
66
+ color: inherit;
67
+ text-decoration: none;
68
+ }
69
+
70
+ img {
71
+ max-width: 100%;
72
+ display: block;
73
+ }
74
+
75
+ /* ── Monitor Bezel Frame ───────────────────────────────────────── */
76
+ .monitor-bezel {
77
+ position: relative;
78
+ margin: 12px;
79
+ min-height: calc(100vh - 24px);
80
+ background: linear-gradient(180deg, var(--bezel-inner) 0%, var(--bezel-outer) 100%);
81
+ border-radius: 20px;
82
+ padding: 14px;
83
+ box-shadow:
84
+ inset 0 2px 4px rgba(255,255,255,0.3),
85
+ inset 0 -2px 4px rgba(0,0,0,0.15),
86
+ 0 8px 32px rgba(0,0,0,0.2),
87
+ 0 2px 8px rgba(0,0,0,0.1);
88
+ }
89
+
90
+ .monitor-screen {
91
+ position: relative;
92
+ background: var(--bg-beige);
93
+ border-radius: 10px;
94
+ min-height: calc(100vh - 48px);
95
+ overflow: hidden;
96
+ box-shadow:
97
+ inset 0 1px 3px rgba(0,0,0,0.08),
98
+ 0 1px 2px rgba(255,255,255,0.4);
99
+ }
100
+
101
+ /* Subtle CRT scan-line overlay */
102
+ .monitor-screen::before {
103
+ content: '';
104
+ position: fixed;
105
+ top: 0;
106
+ left: 0;
107
+ right: 0;
108
+ bottom: 0;
109
+ background: repeating-linear-gradient(
110
+ 0deg,
111
+ transparent,
112
+ transparent 2px,
113
+ rgba(0, 0, 0, 0.008) 2px,
114
+ rgba(0, 0, 0, 0.008) 4px
115
+ );
116
+ pointer-events: none;
117
+ z-index: 100;
118
+ }
119
+
120
+ /* Bottom bezel notch (like Mainframe) */
121
+ .bezel-notch {
122
+ display: flex;
123
+ justify-content: center;
124
+ padding: 8px 0 4px;
125
+ }
126
+
127
+ .bezel-notch-inner {
128
+ width: 36px;
129
+ height: 4px;
130
+ background: var(--bezel-outer);
131
+ border-radius: 2px;
132
+ box-shadow: inset 0 1px 1px rgba(0,0,0,0.15);
133
+ }
134
+
135
+ /* ── Sticky Header ─────────────────────────────────────────────── */
136
+ .site-header {
137
+ position: sticky;
138
+ top: 0;
139
+ z-index: 50;
140
+ display: flex;
141
+ align-items: center;
142
+ justify-content: space-between;
143
+ padding: 20px 40px;
144
+ background: rgba(224, 223, 213, 0.85);
145
+ backdrop-filter: blur(12px);
146
+ -webkit-backdrop-filter: blur(12px);
147
+ border-bottom: 1px solid rgba(0,0,0,0.04);
148
+ }
149
+
150
+ .header-left {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 32px;
154
+ }
155
+
156
+ .header-brand {
157
+ font-weight: 700;
158
+ font-size: 0.85rem;
159
+ letter-spacing: 0.02em;
160
+ }
161
+
162
+ .header-meta {
163
+ font-size: 0.7rem;
164
+ color: var(--ink-muted);
165
+ line-height: 1.4;
166
+ }
167
+
168
+ .header-nav {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 24px;
172
+ }
173
+
174
+ .header-nav a {
175
+ font-size: 0.82rem;
176
+ font-weight: 500;
177
+ color: var(--ink);
178
+ transition: color var(--transition-base);
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 3px;
182
+ }
183
+
184
+ .header-nav a:hover {
185
+ color: var(--accent-teal);
186
+ }
187
+
188
+ .header-nav .arrow {
189
+ font-size: 0.75rem;
190
+ opacity: 0.6;
191
+ }
192
+
193
+ /* ── Section Containers ────────────────────────────────────────── */
194
+ .section {
195
+ padding: var(--space-xxl) 60px;
196
+ position: relative;
197
+ }
198
+
199
+ .section--hero {
200
+ min-height: 85vh;
201
+ display: flex;
202
+ flex-direction: column;
203
+ justify-content: flex-end;
204
+ padding-bottom: var(--space-lg);
205
+ }
206
+
207
+ .section--narrow {
208
+ max-width: 900px;
209
+ margin: 0 auto;
210
+ }
211
+
212
+ .section--full {
213
+ padding-left: 60px;
214
+ padding-right: 60px;
215
+ }
216
+
217
+ /* ── Scan-Line Typography ──────────────────────────────────────── */
218
+ .scanline-text {
219
+ position: relative;
220
+ font-size: clamp(5rem, 14vw, 12rem);
221
+ font-weight: 900;
222
+ line-height: 0.85;
223
+ letter-spacing: -0.03em;
224
+ color: var(--ink);
225
+ overflow: hidden;
226
+ display: inline-block;
227
+ }
228
+
229
+ .scanline-text::after {
230
+ content: '';
231
+ position: absolute;
232
+ top: 0;
233
+ left: -5%;
234
+ right: -5%;
235
+ bottom: 0;
236
+ background: repeating-linear-gradient(
237
+ 0deg,
238
+ transparent,
239
+ transparent 3px,
240
+ var(--bg-beige) 3px,
241
+ var(--bg-beige) 5.5px
242
+ );
243
+ pointer-events: none;
244
+ }
245
+
246
+ .scanline-text--teal::after {
247
+ background: repeating-linear-gradient(
248
+ 0deg,
249
+ transparent,
250
+ transparent 3px,
251
+ var(--bg-beige) 3px,
252
+ var(--bg-beige) 5.5px
253
+ );
254
+ }
255
+
256
+ /* Full-width scan-line band */
257
+ .scanline-band {
258
+ width: 100%;
259
+ position: relative;
260
+ overflow: hidden;
261
+ padding: 10px 0;
262
+ }
263
+
264
+ .scanline-band .scanline-text {
265
+ width: 100%;
266
+ display: block;
267
+ text-align: center;
268
+ }
269
+
270
+ .scanline-divider {
271
+ width: 100%;
272
+ height: 120px;
273
+ background: repeating-linear-gradient(
274
+ 0deg,
275
+ var(--ink),
276
+ var(--ink) 2px,
277
+ var(--bg-beige) 2px,
278
+ var(--bg-beige) 6px
279
+ );
280
+ position: relative;
281
+ }
282
+
283
+ .scanline-divider--fade-top {
284
+ mask-image: linear-gradient(to bottom, transparent 0%, black 30%, black 100%);
285
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 30%, black 100%);
286
+ }
287
+
288
+ .scanline-divider--fade-bottom {
289
+ mask-image: linear-gradient(to bottom, black 0%, black 70%, transparent 100%);
290
+ -webkit-mask-image: linear-gradient(to bottom, black 0%, black 70%, transparent 100%);
291
+ }
292
+
293
+ .scanline-divider--both {
294
+ mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);
295
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 20%, black 80%, transparent 100%);
296
+ }
297
+
298
+ /* ── Typography ────────────────────────────────────────────────── */
299
+ .text-hero-lead {
300
+ font-size: clamp(1.5rem, 3vw, 2.2rem);
301
+ font-weight: 500;
302
+ line-height: 1.3;
303
+ color: var(--ink);
304
+ max-width: 700px;
305
+ }
306
+
307
+ .text-narrative {
308
+ font-size: clamp(1.25rem, 2.2vw, 1.65rem);
309
+ font-weight: 600;
310
+ line-height: 1.55;
311
+ color: var(--ink);
312
+ max-width: 580px;
313
+ }
314
+
315
+ .text-narrative--muted {
316
+ color: var(--ink-muted);
317
+ }
318
+
319
+ .text-body {
320
+ font-size: 1rem;
321
+ line-height: 1.7;
322
+ color: var(--ink-soft);
323
+ max-width: 540px;
324
+ }
325
+
326
+ .text-label {
327
+ font-size: 0.7rem;
328
+ font-weight: 500;
329
+ letter-spacing: 0.02em;
330
+ color: var(--ink-muted);
331
+ text-transform: lowercase;
332
+ }
333
+
334
+ .text-section-title {
335
+ font-size: clamp(2.5rem, 5vw, 4rem);
336
+ font-weight: 900;
337
+ line-height: 1.1;
338
+ letter-spacing: -0.03em;
339
+ }
340
+
341
+ .text-section-subtitle {
342
+ font-size: clamp(2rem, 4vw, 3.2rem);
343
+ font-weight: 400;
344
+ line-height: 1.2;
345
+ color: var(--ink-muted);
346
+ }
347
+
348
+ /* ── Hero-Specific ─────────────────────────────────────────────── */
349
+ .hero-content {
350
+ padding: 0 60px;
351
+ }
352
+
353
+ .hero-prompt {
354
+ display: flex;
355
+ align-items: center;
356
+ gap: 10px;
357
+ margin-top: var(--space-md);
358
+ font-size: 0.9rem;
359
+ color: var(--ink-soft);
360
+ }
361
+
362
+ .hero-prompt-key {
363
+ display: inline-flex;
364
+ align-items: center;
365
+ padding: 4px 12px;
366
+ background: var(--white);
367
+ border: 1px solid rgba(0,0,0,0.1);
368
+ border-radius: var(--radius-sm);
369
+ font-family: var(--font-mono);
370
+ font-size: 0.78rem;
371
+ font-weight: 500;
372
+ box-shadow: 0 1px 2px rgba(0,0,0,0.06);
373
+ justify-content: flex-end;
374
+ }
375
+
376
+ .hero-prompt-container {
377
+ display: flex;
378
+ justify-content: flex-end;
379
+ padding-right: 60px;
380
+ }
381
+
382
+ /* ── Scroll Indicator ──────────────────────────────────────────── */
383
+ .scroll-indicator {
384
+ display: flex;
385
+ flex-direction: column;
386
+ align-items: center;
387
+ gap: 2px;
388
+ margin: var(--space-xl) auto var(--space-md);
389
+ opacity: 0.6;
390
+ animation: scrollBounce 2s ease-in-out infinite;
391
+ }
392
+
393
+ .scroll-indicator svg {
394
+ width: 24px;
395
+ height: 24px;
396
+ }
397
+
398
+ .scroll-indicator .arrow {
399
+ font-size: 0.7rem;
400
+ line-height: 1;
401
+ }
402
+
403
+ @keyframes scrollBounce {
404
+ 0%, 100% { transform: translateY(0); opacity: 0.6; }
405
+ 50% { transform: translateY(6px); opacity: 1; }
406
+ }
407
+
408
+ /* ── Figure / Annotation ───────────────────────────────────────── */
409
+ .figure {
410
+ position: relative;
411
+ }
412
+
413
+ .figure-caption {
414
+ display: flex;
415
+ gap: 24px;
416
+ align-items: flex-start;
417
+ margin-top: 16px;
418
+ }
419
+
420
+ .figure-label {
421
+ font-size: 0.75rem;
422
+ font-weight: 500;
423
+ color: var(--ink-muted);
424
+ white-space: nowrap;
425
+ min-width: 36px;
426
+ }
427
+
428
+ .figure-desc {
429
+ font-size: 0.75rem;
430
+ color: var(--ink-muted);
431
+ line-height: 1.5;
432
+ max-width: 260px;
433
+ }
434
+
435
+ /* ── Terminal Illustration ─────────────────────────────────────── */
436
+ .terminal-window {
437
+ background: #1A1A1A;
438
+ border-radius: var(--radius-md);
439
+ overflow: hidden;
440
+ box-shadow: 0 4px 24px rgba(0,0,0,0.15);
441
+ border: 1px solid rgba(255,255,255,0.06);
442
+ }
443
+
444
+ .terminal-titlebar {
445
+ display: flex;
446
+ align-items: center;
447
+ gap: 8px;
448
+ padding: 12px 16px;
449
+ background: #252525;
450
+ border-bottom: 1px solid rgba(255,255,255,0.05);
451
+ }
452
+
453
+ .terminal-dot {
454
+ width: 10px;
455
+ height: 10px;
456
+ border-radius: 50%;
457
+ }
458
+
459
+ .terminal-dot--red { background: #FF5F56; }
460
+ .terminal-dot--yellow { background: #FFBD2E; }
461
+ .terminal-dot--green { background: #27C93F; }
462
+
463
+ .terminal-body {
464
+ padding: 20px;
465
+ font-family: var(--font-mono);
466
+ font-size: 0.82rem;
467
+ line-height: 1.8;
468
+ color: #D4D4D4;
469
+ min-height: 180px;
470
+ }
471
+
472
+ .terminal-line {
473
+ display: block;
474
+ opacity: 0;
475
+ animation: terminalType 0.3s ease forwards;
476
+ }
477
+
478
+ .terminal-line .prompt {
479
+ color: var(--accent-teal);
480
+ font-weight: 600;
481
+ }
482
+
483
+ .terminal-line .command {
484
+ color: #E8E8E8;
485
+ }
486
+
487
+ .terminal-line .output {
488
+ color: #888;
489
+ }
490
+
491
+ .terminal-line .success {
492
+ color: var(--accent-green);
493
+ }
494
+
495
+ /* Staggered terminal line animations */
496
+ .terminal-line:nth-child(1) { animation-delay: 0.2s; }
497
+ .terminal-line:nth-child(2) { animation-delay: 0.6s; }
498
+ .terminal-line:nth-child(3) { animation-delay: 1.0s; }
499
+ .terminal-line:nth-child(4) { animation-delay: 1.4s; }
500
+ .terminal-line:nth-child(5) { animation-delay: 1.8s; }
501
+ .terminal-line:nth-child(6) { animation-delay: 2.2s; }
502
+ .terminal-line:nth-child(7) { animation-delay: 2.6s; }
503
+
504
+ @keyframes terminalType {
505
+ from { opacity: 0; transform: translateY(4px); }
506
+ to { opacity: 1; transform: translateY(0); }
507
+ }
508
+
509
+ /* ── Asymmetric 2-Column Layout ────────────────────────────────── */
510
+ .split-layout {
511
+ display: grid;
512
+ grid-template-columns: 1fr 1fr;
513
+ gap: var(--space-lg);
514
+ align-items: start;
515
+ }
516
+
517
+ .split-layout--text-left {
518
+ grid-template-columns: 0.55fr 0.45fr;
519
+ }
520
+
521
+ .split-layout--text-right {
522
+ grid-template-columns: 0.45fr 0.55fr;
523
+ }
524
+
525
+ .split-layout--center {
526
+ align-items: center;
527
+ }
528
+
529
+ /* ── Chaos Grid (Fragmented Learning Visualization) ────────────── */
530
+ .chaos-grid {
531
+ display: grid;
532
+ grid-template-columns: repeat(4, 1fr);
533
+ grid-template-rows: repeat(3, 1fr);
534
+ gap: 10px;
535
+ max-width: 420px;
536
+ }
537
+
538
+ .chaos-item {
539
+ position: relative;
540
+ aspect-ratio: 1;
541
+ border-radius: 18px;
542
+ overflow: hidden;
543
+ background: radial-gradient(circle at 30% 30%, #444 0%, #1a1a1a 100%);
544
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
545
+ }
546
+
547
+ .chaos-item--dithered {
548
+ background:
549
+ radial-gradient(circle at 40% 40%, #555 0%, #111 100%);
550
+ position: relative;
551
+ }
552
+
553
+ .chaos-item--dithered::after {
554
+ content: '';
555
+ position: absolute;
556
+ inset: 0;
557
+ background-image: url("data:image/svg+xml,%3Csvg width='4' height='4' viewBox='0 0 4 4' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='1' height='1' fill='%23888' opacity='0.4'/%3E%3Crect x='2' y='2' width='1' height='1' fill='%23888' opacity='0.4'/%3E%3C/svg%3E");
558
+ background-size: 4px 4px;
559
+ }
560
+
561
+ .chaos-badge {
562
+ position: absolute;
563
+ top: -6px;
564
+ right: -6px;
565
+ width: 28px;
566
+ height: 28px;
567
+ border-radius: 50%;
568
+ background: var(--accent-red);
569
+ color: var(--white);
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ font-size: 0.6rem;
574
+ font-weight: 700;
575
+ z-index: 2;
576
+ box-shadow: 0 2px 6px rgba(224, 90, 58, 0.4);
577
+ }
578
+
579
+ /* ── Access Card ───────────────────────────────────────────────── */
580
+ .access-card {
581
+ background: var(--bg-beige-light);
582
+ border-radius: var(--radius-lg);
583
+ padding: 32px;
584
+ position: relative;
585
+ overflow: hidden;
586
+ border: 1px solid rgba(0,0,0,0.06);
587
+ box-shadow: 0 4px 20px rgba(0,0,0,0.08);
588
+ max-width: 420px;
589
+ }
590
+
591
+ .access-card-stripe {
592
+ position: absolute;
593
+ left: 0;
594
+ top: 0;
595
+ bottom: 0;
596
+ width: 48px;
597
+ background: repeating-linear-gradient(
598
+ 0deg,
599
+ var(--ink),
600
+ var(--ink) 2px,
601
+ var(--bg-beige-light) 2px,
602
+ var(--bg-beige-light) 5px
603
+ );
604
+ }
605
+
606
+ .access-card-content {
607
+ margin-left: 64px;
608
+ }
609
+
610
+ .access-card-label {
611
+ font-size: 0.65rem;
612
+ color: var(--ink-muted);
613
+ text-transform: uppercase;
614
+ letter-spacing: 0.05em;
615
+ margin-bottom: 4px;
616
+ }
617
+
618
+ .access-card-value {
619
+ font-size: 1.1rem;
620
+ font-weight: 700;
621
+ color: var(--ink);
622
+ }
623
+
624
+ .access-card-row {
625
+ display: flex;
626
+ gap: 32px;
627
+ margin-top: 24px;
628
+ }
629
+
630
+ .access-card-field {
631
+ flex: 1;
632
+ }
633
+
634
+ .access-card-mono {
635
+ font-family: var(--font-mono);
636
+ font-weight: 600;
637
+ }
638
+
639
+ /* ── CTA Section ───────────────────────────────────────────────── */
640
+ .cta-input-group {
641
+ display: flex;
642
+ align-items: stretch;
643
+ gap: 0;
644
+ margin-top: var(--space-md);
645
+ max-width: 440px;
646
+ }
647
+
648
+ .cta-input {
649
+ flex: 1;
650
+ padding: 14px 20px;
651
+ border: 1px solid rgba(0,0,0,0.12);
652
+ border-right: none;
653
+ border-radius: var(--radius-md) 0 0 var(--radius-md);
654
+ background: var(--white);
655
+ font-family: var(--font-mono);
656
+ font-size: 0.85rem;
657
+ color: var(--ink);
658
+ outline: none;
659
+ transition: border-color var(--transition-base);
660
+ }
661
+
662
+ .cta-input:focus {
663
+ border-color: var(--accent-teal);
664
+ }
665
+
666
+ .cta-input::placeholder {
667
+ color: var(--ink-faint);
668
+ }
669
+
670
+ .cta-button {
671
+ display: flex;
672
+ align-items: center;
673
+ justify-content: center;
674
+ padding: 14px 18px;
675
+ background: var(--ink);
676
+ border: 1px solid var(--ink);
677
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
678
+ color: var(--white);
679
+ cursor: pointer;
680
+ transition: all var(--transition-base);
681
+ font-size: 1.1rem;
682
+ }
683
+
684
+ .cta-button:hover {
685
+ background: var(--accent-teal);
686
+ border-color: var(--accent-teal);
687
+ }
688
+
689
+ .cta-button svg {
690
+ width: 20px;
691
+ height: 20px;
692
+ }
693
+
694
+ /* Copy Command Block */
695
+ .copy-command {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: 12px;
699
+ padding: 16px 20px;
700
+ background: var(--white);
701
+ border: 1px solid rgba(0,0,0,0.1);
702
+ border-radius: var(--radius-md);
703
+ font-family: var(--font-mono);
704
+ font-size: 0.88rem;
705
+ color: var(--ink);
706
+ cursor: pointer;
707
+ transition: all var(--transition-base);
708
+ max-width: 440px;
709
+ margin-top: var(--space-md);
710
+ position: relative;
711
+ }
712
+
713
+ .copy-command:hover {
714
+ border-color: var(--accent-teal);
715
+ box-shadow: 0 2px 12px rgba(14, 116, 144, 0.1);
716
+ }
717
+
718
+ .copy-command .copy-icon {
719
+ margin-left: auto;
720
+ opacity: 0.4;
721
+ transition: opacity var(--transition-base);
722
+ flex-shrink: 0;
723
+ }
724
+
725
+ .copy-command:hover .copy-icon {
726
+ opacity: 1;
727
+ }
728
+
729
+ .copy-command .copied-tooltip {
730
+ position: absolute;
731
+ top: -32px;
732
+ right: 0;
733
+ background: var(--ink);
734
+ color: var(--white);
735
+ padding: 4px 10px;
736
+ border-radius: var(--radius-sm);
737
+ font-size: 0.72rem;
738
+ opacity: 0;
739
+ transform: translateY(4px);
740
+ transition: all 0.2s ease;
741
+ pointer-events: none;
742
+ }
743
+
744
+ .copy-command.copied .copied-tooltip {
745
+ opacity: 1;
746
+ transform: translateY(0);
747
+ }
748
+
749
+ /* ── Steps / How It Works ──────────────────────────────────────── */
750
+ .steps-grid {
751
+ display: grid;
752
+ grid-template-columns: repeat(3, 1fr);
753
+ gap: var(--space-md);
754
+ margin-top: var(--space-lg);
755
+ }
756
+
757
+ .step-card {
758
+ padding: 32px;
759
+ border-radius: var(--radius-lg);
760
+ background: var(--bg-beige-light);
761
+ border: 1px solid rgba(0,0,0,0.04);
762
+ transition: transform var(--transition-base), box-shadow var(--transition-base);
763
+ }
764
+
765
+ .step-card:hover {
766
+ transform: translateY(-4px);
767
+ box-shadow: 0 8px 32px rgba(0,0,0,0.08);
768
+ }
769
+
770
+ .step-number {
771
+ font-family: var(--font-mono);
772
+ font-size: 0.7rem;
773
+ font-weight: 600;
774
+ color: var(--accent-teal);
775
+ margin-bottom: 16px;
776
+ letter-spacing: 0.05em;
777
+ }
778
+
779
+ .step-title {
780
+ font-size: 1.3rem;
781
+ font-weight: 800;
782
+ margin-bottom: 12px;
783
+ letter-spacing: -0.01em;
784
+ }
785
+
786
+ .step-desc {
787
+ font-size: 0.88rem;
788
+ color: var(--ink-soft);
789
+ line-height: 1.6;
790
+ }
791
+
792
+ .step-code {
793
+ display: inline-block;
794
+ margin-top: 12px;
795
+ padding: 8px 14px;
796
+ background: var(--ink);
797
+ color: var(--accent-green);
798
+ border-radius: var(--radius-sm);
799
+ font-family: var(--font-mono);
800
+ font-size: 0.78rem;
801
+ font-weight: 500;
802
+ }
803
+
804
+ /* ── Track Cards ───────────────────────────────────────────────── */
805
+ .tracks-grid {
806
+ display: grid;
807
+ grid-template-columns: repeat(4, 1fr);
808
+ gap: 16px;
809
+ margin-top: var(--space-lg);
810
+ }
811
+
812
+ .track-card {
813
+ padding: 28px 24px;
814
+ background: var(--bg-beige-light);
815
+ border-radius: var(--radius-lg);
816
+ border: 1px solid rgba(0,0,0,0.04);
817
+ transition: all var(--transition-base);
818
+ position: relative;
819
+ overflow: hidden;
820
+ }
821
+
822
+ .track-card::before {
823
+ content: '';
824
+ position: absolute;
825
+ top: 0;
826
+ left: 0;
827
+ right: 0;
828
+ height: 3px;
829
+ background: var(--accent-teal);
830
+ transform: scaleX(0);
831
+ transform-origin: left;
832
+ transition: transform 0.4s ease;
833
+ }
834
+
835
+ .track-card:hover::before {
836
+ transform: scaleX(1);
837
+ }
838
+
839
+ .track-card:hover {
840
+ transform: translateY(-4px);
841
+ box-shadow: 0 8px 32px rgba(0,0,0,0.08);
842
+ }
843
+
844
+ .track-card-icon {
845
+ width: 40px;
846
+ height: 40px;
847
+ border-radius: 10px;
848
+ background: var(--ink);
849
+ display: flex;
850
+ align-items: center;
851
+ justify-content: center;
852
+ color: var(--white);
853
+ font-family: var(--font-mono);
854
+ font-size: 0.85rem;
855
+ font-weight: 700;
856
+ margin-bottom: 16px;
857
+ }
858
+
859
+ .track-card-title {
860
+ font-size: 1.15rem;
861
+ font-weight: 800;
862
+ margin-bottom: 8px;
863
+ letter-spacing: -0.01em;
864
+ }
865
+
866
+ .track-card-desc {
867
+ font-size: 0.82rem;
868
+ color: var(--ink-muted);
869
+ line-height: 1.55;
870
+ }
871
+
872
+ /* ── CLI Commands Reference ────────────────────────────────────── */
873
+ .commands-list {
874
+ display: flex;
875
+ flex-direction: column;
876
+ gap: 1px;
877
+ background: rgba(0,0,0,0.06);
878
+ border-radius: var(--radius-md);
879
+ overflow: hidden;
880
+ margin-top: var(--space-md);
881
+ }
882
+
883
+ .command-row {
884
+ display: grid;
885
+ grid-template-columns: 220px 1fr;
886
+ gap: var(--space-md);
887
+ padding: 16px 24px;
888
+ background: var(--bg-beige-light);
889
+ transition: background var(--transition-base);
890
+ }
891
+
892
+ .command-row:hover {
893
+ background: var(--bg-beige);
894
+ }
895
+
896
+ .command-name {
897
+ font-family: var(--font-mono);
898
+ font-size: 0.82rem;
899
+ font-weight: 600;
900
+ color: var(--accent-teal);
901
+ }
902
+
903
+ .command-desc {
904
+ font-size: 0.85rem;
905
+ color: var(--ink-soft);
906
+ }
907
+
908
+ /* ── Footer ────────────────────────────────────────────────────── */
909
+ .site-footer {
910
+ display: flex;
911
+ align-items: center;
912
+ justify-content: space-between;
913
+ padding: 24px 40px;
914
+ border-top: 1px solid rgba(0,0,0,0.06);
915
+ }
916
+
917
+ /* ── Scroll Animations (reveal on scroll) ──────────────────────── */
918
+ .reveal {
919
+ opacity: 0;
920
+ transform: translateY(40px);
921
+ transition: opacity 0.8s ease, transform 0.8s ease;
922
+ }
923
+
924
+ .reveal.visible {
925
+ opacity: 1;
926
+ transform: translateY(0);
927
+ }
928
+
929
+ .reveal-left {
930
+ opacity: 0;
931
+ transform: translateX(-40px);
932
+ transition: opacity 0.8s ease, transform 0.8s ease;
933
+ }
934
+
935
+ .reveal-left.visible {
936
+ opacity: 1;
937
+ transform: translateX(0);
938
+ }
939
+
940
+ .reveal-right {
941
+ opacity: 0;
942
+ transform: translateX(40px);
943
+ transition: opacity 0.8s ease, transform 0.8s ease;
944
+ }
945
+
946
+ .reveal-right.visible {
947
+ opacity: 1;
948
+ transform: translateX(0);
949
+ }
950
+
951
+ .reveal-scale {
952
+ opacity: 0;
953
+ transform: scale(0.95);
954
+ transition: opacity 0.8s ease, transform 0.8s ease;
955
+ }
956
+
957
+ .reveal-scale.visible {
958
+ opacity: 1;
959
+ transform: scale(1);
960
+ }
961
+
962
+ /* Staggered delays */
963
+ .delay-1 { transition-delay: 0.1s; }
964
+ .delay-2 { transition-delay: 0.2s; }
965
+ .delay-3 { transition-delay: 0.3s; }
966
+ .delay-4 { transition-delay: 0.4s; }
967
+ .delay-5 { transition-delay: 0.5s; }
968
+
969
+ /* ── Responsive ────────────────────────────────────────────────── */
970
+ @media (max-width: 1024px) {
971
+ .section {
972
+ padding: var(--space-xl) 40px;
973
+ }
974
+
975
+ .hero-content {
976
+ padding: 0 40px;
977
+ }
978
+
979
+ .hero-prompt-container {
980
+ padding-right: 40px;
981
+ }
982
+
983
+ .split-layout,
984
+ .split-layout--text-left,
985
+ .split-layout--text-right {
986
+ grid-template-columns: 1fr;
987
+ gap: var(--space-lg);
988
+ }
989
+
990
+ .tracks-grid {
991
+ grid-template-columns: repeat(2, 1fr);
992
+ }
993
+
994
+ .steps-grid {
995
+ grid-template-columns: 1fr;
996
+ gap: var(--space-sm);
997
+ }
998
+
999
+ .chaos-grid {
1000
+ max-width: 320px;
1001
+ margin: 0 auto;
1002
+ }
1003
+ }
1004
+
1005
+ @media (max-width: 640px) {
1006
+ .monitor-bezel {
1007
+ margin: 6px;
1008
+ padding: 8px;
1009
+ border-radius: 12px;
1010
+ }
1011
+
1012
+ .monitor-screen {
1013
+ border-radius: 6px;
1014
+ }
1015
+
1016
+ .section {
1017
+ padding: var(--space-lg) 20px;
1018
+ }
1019
+
1020
+ .section--hero {
1021
+ min-height: 70vh;
1022
+ }
1023
+
1024
+ .hero-content {
1025
+ padding: 0 20px;
1026
+ }
1027
+
1028
+ .hero-prompt-container {
1029
+ padding-right: 20px;
1030
+ }
1031
+
1032
+ .site-header {
1033
+ padding: 16px 20px;
1034
+ flex-wrap: wrap;
1035
+ gap: 12px;
1036
+ }
1037
+
1038
+ .header-nav {
1039
+ gap: 16px;
1040
+ }
1041
+
1042
+ .scanline-text {
1043
+ font-size: clamp(3rem, 18vw, 6rem);
1044
+ }
1045
+
1046
+ .tracks-grid {
1047
+ grid-template-columns: 1fr;
1048
+ }
1049
+
1050
+ .command-row {
1051
+ grid-template-columns: 1fr;
1052
+ gap: 6px;
1053
+ }
1054
+
1055
+ .cta-input-group {
1056
+ flex-direction: column;
1057
+ }
1058
+
1059
+ .cta-input {
1060
+ border-right: 1px solid rgba(0,0,0,0.12);
1061
+ border-radius: var(--radius-md);
1062
+ }
1063
+
1064
+ .cta-button {
1065
+ border-radius: var(--radius-md);
1066
+ }
1067
+
1068
+ .access-card {
1069
+ max-width: 100%;
1070
+ }
1071
+
1072
+ .access-card-row {
1073
+ flex-direction: column;
1074
+ gap: 16px;
1075
+ }
1076
+
1077
+ .site-footer {
1078
+ flex-direction: column;
1079
+ gap: 16px;
1080
+ text-align: center;
1081
+ }
1082
+ }