@nordsym/apiclaw 1.0.0 → 1.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 (154) hide show
  1. package/AGENTS.md +74 -0
  2. package/HEARTBEAT.md +4 -0
  3. package/IDENTITY.md +22 -0
  4. package/README.md +197 -202
  5. package/SOUL.md +36 -0
  6. package/STATUS.md +237 -0
  7. package/TOOLS.md +36 -0
  8. package/USER.md +17 -0
  9. package/{backend/convex → convex}/_generated/api.d.ts +6 -6
  10. package/convex/credits.ts +211 -0
  11. package/convex/http.ts +490 -0
  12. package/convex/providers.ts +516 -0
  13. package/convex/purchases.ts +183 -0
  14. package/convex/schema.ts +180 -0
  15. package/convex.json +3 -0
  16. package/dist/credentials.d.ts +19 -0
  17. package/dist/credentials.d.ts.map +1 -0
  18. package/dist/credentials.js +158 -0
  19. package/dist/credentials.js.map +1 -0
  20. package/dist/credits.d.ts +14 -11
  21. package/dist/credits.d.ts.map +1 -1
  22. package/dist/credits.js +151 -99
  23. package/dist/credits.js.map +1 -1
  24. package/dist/discovery.d.ts +7 -16
  25. package/dist/discovery.d.ts.map +1 -1
  26. package/dist/discovery.js +33 -40
  27. package/dist/discovery.js.map +1 -1
  28. package/dist/execute.d.ts +19 -0
  29. package/dist/execute.d.ts.map +1 -0
  30. package/dist/execute.js +285 -0
  31. package/dist/execute.js.map +1 -0
  32. package/dist/index.js +106 -30
  33. package/dist/index.js.map +1 -1
  34. package/dist/proxy.d.ts +6 -0
  35. package/dist/proxy.d.ts.map +1 -0
  36. package/dist/proxy.js +19 -0
  37. package/dist/proxy.js.map +1 -0
  38. package/dist/registry/apis.json +95362 -202
  39. package/dist/registry/apis_expanded.json +100853 -0
  40. package/dist/stripe.d.ts +68 -0
  41. package/dist/stripe.d.ts.map +1 -0
  42. package/dist/stripe.js +196 -0
  43. package/dist/stripe.js.map +1 -0
  44. package/dist/test.d.ts +3 -2
  45. package/dist/test.d.ts.map +1 -1
  46. package/dist/test.js +105 -75
  47. package/dist/test.js.map +1 -1
  48. package/dist/types.d.ts +0 -28
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/webhook.d.ts +2 -0
  51. package/dist/webhook.d.ts.map +1 -0
  52. package/dist/webhook.js +90 -0
  53. package/dist/webhook.js.map +1 -0
  54. package/landing/DESIGN.md +343 -0
  55. package/landing/package-lock.json +1190 -40
  56. package/landing/package.json +5 -2
  57. package/landing/public/android-chrome-192x192.png +0 -0
  58. package/landing/public/android-chrome-512x512.png +0 -0
  59. package/landing/public/apple-touch-icon.png +0 -0
  60. package/landing/public/demo.gif +0 -0
  61. package/landing/public/demo.mp4 +0 -0
  62. package/landing/public/favicon-16x16.png +0 -0
  63. package/landing/public/favicon-32x32.png +0 -0
  64. package/landing/public/favicon.ico +0 -0
  65. package/landing/public/favicon.svg +3 -0
  66. package/landing/public/icon.svg +47 -0
  67. package/landing/public/logo-mono.svg +37 -0
  68. package/landing/public/logo-simple.svg +45 -0
  69. package/landing/public/logo.svg +84 -0
  70. package/landing/public/og-image.png +0 -0
  71. package/landing/public/og-template.html +184 -0
  72. package/landing/public/site.webmanifest +31 -0
  73. package/landing/scripts/generate-assets.js +284 -0
  74. package/landing/scripts/generate-pngs.js +48 -0
  75. package/landing/scripts/generate-stats.js +42 -0
  76. package/landing/src/app/admin/page.tsx +348 -0
  77. package/landing/src/app/api/auth/magic-link/route.ts +73 -0
  78. package/landing/src/app/api/auth/session/route.ts +38 -0
  79. package/landing/src/app/api/auth/verify/route.ts +43 -0
  80. package/landing/src/app/api/og/route.tsx +74 -0
  81. package/landing/src/app/globals.css +439 -100
  82. package/landing/src/app/layout.tsx +37 -9
  83. package/landing/src/app/page.tsx +640 -552
  84. package/landing/src/app/providers/dashboard/login/page.tsx +176 -0
  85. package/landing/src/app/providers/dashboard/page.tsx +589 -0
  86. package/landing/src/app/providers/dashboard/verify/page.tsx +106 -0
  87. package/landing/src/app/providers/layout.tsx +14 -0
  88. package/landing/src/app/providers/page.tsx +402 -0
  89. package/landing/src/app/providers/register/page.tsx +670 -0
  90. package/landing/src/components/ProviderDashboard.tsx +794 -0
  91. package/landing/src/hooks/useDashboardData.ts +99 -0
  92. package/landing/src/lib/apis.json +116054 -0
  93. package/landing/src/lib/convex-client.ts +106 -0
  94. package/landing/src/lib/mock-data.ts +285 -0
  95. package/landing/src/lib/stats.json +6 -0
  96. package/landing/tailwind.config.ts +12 -11
  97. package/landing/tsconfig.tsbuildinfo +1 -0
  98. package/package.json +21 -20
  99. package/scripts/SYMBOT-FIX.md +238 -0
  100. package/scripts/demo-simulation.py +177 -0
  101. package/scripts/expand-more.py +502 -0
  102. package/scripts/expand-registry.py +434 -0
  103. package/scripts/history-sanitizer.ts +272 -0
  104. package/scripts/mass-scrape.py +1308 -0
  105. package/scripts/sync-and-deploy.sh +36 -0
  106. package/src/credentials.ts +177 -0
  107. package/src/credits.ts +190 -122
  108. package/src/discovery.ts +45 -58
  109. package/src/execute.ts +350 -0
  110. package/src/index.ts +113 -31
  111. package/src/proxy.ts +24 -0
  112. package/src/registry/apis.json +95362 -202
  113. package/src/registry/apis_expanded.json +100853 -0
  114. package/src/stripe.ts +243 -0
  115. package/src/test.ts +127 -89
  116. package/src/types.ts +0 -34
  117. package/src/webhook.ts +107 -0
  118. package/.github/ISSUE_TEMPLATE/add-api.yml +0 -123
  119. package/BRIEFING.md +0 -30
  120. package/backend/convex/apiKeys.ts +0 -75
  121. package/backend/convex/purchases.ts +0 -74
  122. package/backend/convex/schema.ts +0 -45
  123. package/backend/convex/transactions.ts +0 -57
  124. package/backend/convex/users.ts +0 -94
  125. package/backend/package-lock.json +0 -521
  126. package/backend/package.json +0 -15
  127. package/dist/registry/parse_apis.py +0 -146
  128. package/dist/revenuecat.d.ts +0 -61
  129. package/dist/revenuecat.d.ts.map +0 -1
  130. package/dist/revenuecat.js +0 -166
  131. package/dist/revenuecat.js.map +0 -1
  132. package/dist/webhooks/revenuecat.d.ts +0 -48
  133. package/dist/webhooks/revenuecat.d.ts.map +0 -1
  134. package/dist/webhooks/revenuecat.js +0 -119
  135. package/dist/webhooks/revenuecat.js.map +0 -1
  136. package/docs/revenuecat-setup.md +0 -89
  137. package/landing/src/app/api/keys/route.ts +0 -71
  138. package/landing/src/app/api/log/route.ts +0 -37
  139. package/landing/src/app/api/stats/route.ts +0 -37
  140. package/landing/src/app/page.tsx.bak +0 -567
  141. package/landing/src/components/AddKeyModal.tsx +0 -159
  142. package/newsletter-template.html +0 -71
  143. package/outreach/OUTREACH-SYSTEM.md +0 -211
  144. package/outreach/email-template.html +0 -179
  145. package/outreach/targets.md +0 -133
  146. package/src/registry/parse_apis.py +0 -146
  147. package/src/revenuecat.ts +0 -239
  148. package/src/webhooks/revenuecat.ts +0 -187
  149. /package/{backend/convex → convex}/README.md +0 -0
  150. /package/{backend/convex → convex}/_generated/api.js +0 -0
  151. /package/{backend/convex → convex}/_generated/dataModel.d.ts +0 -0
  152. /package/{backend/convex → convex}/_generated/server.d.ts +0 -0
  153. /package/{backend/convex → convex}/_generated/server.js +0 -0
  154. /package/{backend/convex → convex}/tsconfig.json +0 -0
@@ -2,129 +2,194 @@
2
2
  @tailwind components;
3
3
  @tailwind utilities;
4
4
 
5
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap');
5
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap');
6
+
7
+ :root {
8
+ --background: #ffffff;
9
+ --foreground: #0a0a0a;
10
+ --surface: #f5f5f5;
11
+ --surface-elevated: #ffffff;
12
+ --border: #e5e5e5;
13
+ --border-subtle: #f0f0f0;
14
+ --text-primary: #0a0a0a;
15
+ --text-secondary: #525252;
16
+ --text-muted: #737373;
17
+ --accent: #ef4444;
18
+ --accent-glow: rgba(239, 68, 68, 0.4);
19
+ }
20
+
21
+ .dark {
22
+ --background: #0a0a0a;
23
+ --foreground: #fafafa;
24
+ --surface: #141414;
25
+ --surface-elevated: #1a1a1a;
26
+ --border: #262626;
27
+ --border-subtle: #1f1f1f;
28
+ --text-primary: #fafafa;
29
+ --text-secondary: #a3a3a3;
30
+ --text-muted: #737373;
31
+ --accent: #ef4444;
32
+ --accent-glow: rgba(239, 68, 68, 0.3);
33
+ }
6
34
 
7
35
  html {
8
36
  scroll-behavior: smooth;
9
37
  }
10
38
 
11
39
  body {
12
- background: #0d0d0d;
13
- color: #ffffff;
40
+ background: var(--background);
41
+ color: var(--text-primary);
14
42
  font-feature-settings: "cv11", "ss01";
15
- transition: background-color 0.3s, color 0.3s;
43
+ -webkit-font-smoothing: antialiased;
16
44
  }
17
45
 
18
- /* Light mode */
19
- html.light body {
20
- background: #f8f9fa;
21
- color: #1a1a1a;
46
+ /* Selection color */
47
+ ::selection {
48
+ background: var(--accent);
49
+ color: white;
22
50
  }
23
51
 
24
- html.light .bg-background\/90 {
25
- background: rgba(248, 249, 250, 0.9) !important;
52
+ /* Heading styles */
53
+ h1, h2, h3 {
54
+ letter-spacing: -0.03em;
26
55
  }
27
56
 
28
- html.light .bg-surface-elevated,
29
- html.light .bg-surface {
30
- background: #ffffff !important;
57
+ /* Section labels */
58
+ .section-label {
59
+ font-size: 0.75rem;
60
+ font-weight: 600;
61
+ letter-spacing: 0.15em;
62
+ text-transform: uppercase;
63
+ color: var(--accent);
31
64
  }
32
65
 
33
- html.light .border-border,
34
- html.light .border-border-subtle {
35
- border-color: #e5e5e5 !important;
66
+ /* Hero gradient animation */
67
+ @keyframes gradient {
68
+ 0%, 100% { background-position: 0% 50%; }
69
+ 50% { background-position: 100% 50%; }
36
70
  }
37
71
 
38
- html.light .text-text-muted {
39
- color: #737373 !important;
72
+ @keyframes shimmer {
73
+ 0% { background-position: -200% 0; }
74
+ 100% { background-position: 200% 0; }
40
75
  }
41
76
 
42
- html.light .text-text-secondary {
43
- color: #525252 !important;
77
+ @keyframes float {
78
+ 0%, 100% { transform: translateY(0px); }
79
+ 50% { transform: translateY(-10px); }
44
80
  }
45
81
 
46
- html.light .text-text-primary,
47
- html.light .text-white {
48
- color: #1a1a1a !important;
82
+ @keyframes pulse-glow {
83
+ 0%, 100% {
84
+ box-shadow: 0 0 40px var(--accent-glow), 0 0 80px var(--accent-glow);
85
+ }
86
+ 50% {
87
+ box-shadow: 0 0 60px var(--accent-glow), 0 0 120px var(--accent-glow);
88
+ }
49
89
  }
50
90
 
51
- html.light .terminal,
52
- html.light .code-block {
53
- background: #f1f1f1 !important;
91
+ @keyframes typing {
92
+ from { width: 0; }
93
+ to { width: 100%; }
54
94
  }
55
95
 
56
- html.light .terminal-header {
57
- background: #e5e5e5 !important;
96
+ @keyframes blink {
97
+ 0%, 50% { opacity: 1; }
98
+ 51%, 100% { opacity: 0; }
58
99
  }
59
100
 
60
- html.light .testimonial-card {
61
- background: #ffffff !important;
101
+ @keyframes fadeInUp {
102
+ from {
103
+ opacity: 0;
104
+ transform: translateY(20px);
105
+ }
106
+ to {
107
+ opacity: 1;
108
+ transform: translateY(0);
109
+ }
62
110
  }
63
111
 
64
- /* Heading styles */
65
- h1, h2, h3 {
66
- letter-spacing: -0.03em;
112
+ @keyframes scaleIn {
113
+ from {
114
+ opacity: 0;
115
+ transform: scale(0.95);
116
+ }
117
+ to {
118
+ opacity: 1;
119
+ transform: scale(1);
120
+ }
67
121
  }
68
122
 
69
- /* Section labels */
70
- .section-label {
71
- font-size: 0.75rem;
72
- font-weight: 600;
73
- letter-spacing: 0.15em;
74
- text-transform: uppercase;
75
- color: #ef4444;
123
+ @keyframes slideInRight {
124
+ from {
125
+ opacity: 0;
126
+ transform: translateX(-20px);
127
+ }
128
+ to {
129
+ opacity: 1;
130
+ transform: translateX(0);
131
+ }
76
132
  }
77
133
 
78
- @keyframes gradient {
79
- 0%, 100% { background-position: 0% 50%; }
80
- 50% { background-position: 100% 50%; }
134
+ .gradient-text {
135
+ background: linear-gradient(135deg, #ef4444 0%, #f87171 25%, #fca5a5 50%, #f87171 75%, #ef4444 100%);
136
+ background-size: 300% 300%;
137
+ animation: gradient 6s ease infinite;
138
+ -webkit-background-clip: text;
139
+ -webkit-text-fill-color: transparent;
140
+ background-clip: text;
81
141
  }
82
142
 
83
- .gradient-text {
84
- background: linear-gradient(135deg, #ef4444 0%, #f87171 50%, #fca5a5 100%);
85
- background-size: 200% 200%;
86
- animation: gradient 5s ease infinite;
143
+ .gradient-text-static {
144
+ background: linear-gradient(135deg, #ef4444 0%, #f87171 50%, #dc2626 100%);
87
145
  -webkit-background-clip: text;
88
146
  -webkit-text-fill-color: transparent;
89
147
  background-clip: text;
90
148
  }
91
149
 
150
+ /* Glow effects */
92
151
  .glow {
93
- box-shadow: 0 0 80px rgba(34, 197, 94, 0.2);
152
+ box-shadow: 0 0 60px var(--accent-glow), 0 0 100px rgba(239, 68, 68, 0.1);
94
153
  }
95
154
 
96
155
  .glow-subtle {
97
- box-shadow: 0 0 40px rgba(34, 197, 94, 0.1);
156
+ box-shadow: 0 0 40px rgba(239, 68, 68, 0.1);
98
157
  }
99
158
 
159
+ .glow-pulse {
160
+ animation: pulse-glow 3s ease-in-out infinite;
161
+ }
162
+
163
+ /* Card hover effects */
100
164
  .card-hover {
101
165
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
102
166
  }
103
167
 
104
168
  .card-hover:hover {
105
169
  transform: translateY(-4px);
106
- border-color: rgba(34, 197, 94, 0.3);
107
- box-shadow: 0 12px 40px rgba(34, 197, 94, 0.1);
170
+ border-color: rgba(239, 68, 68, 0.4);
171
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1), 0 0 40px rgba(239, 68, 68, 0.1);
108
172
  }
109
173
 
110
174
  .code-block {
111
- background: linear-gradient(135deg, #0f0f0f 0%, #141414 100%);
112
- border: 1px solid #2a2a2a;
175
+ background: var(--surface);
176
+ border: 1px solid var(--border);
113
177
  }
114
178
 
115
- /* Terminal styling */
179
+ /* Terminal styling - enhanced */
116
180
  .terminal {
117
- background: #0f0f0f;
118
- border: 1px solid #2a2a2a;
119
- border-radius: 12px;
181
+ background: #0d0d0d;
182
+ border: 1px solid #262626;
183
+ border-radius: 16px;
120
184
  overflow: hidden;
121
185
  }
122
186
 
123
187
  .terminal-header {
124
188
  display: flex;
125
- gap: 6px;
126
- padding: 12px 16px;
127
- border-bottom: 1px solid #222;
189
+ align-items: center;
190
+ gap: 8px;
191
+ padding: 14px 18px;
192
+ border-bottom: 1px solid #262626;
128
193
  background: #141414;
129
194
  }
130
195
 
@@ -136,67 +201,141 @@ h1, h2, h3 {
136
201
 
137
202
  .terminal-dot-red { background: #ff5f57; }
138
203
  .terminal-dot-yellow { background: #febc2e; }
139
- .terminal-dot-green { background: #ef4444; }
204
+ .terminal-dot-green { background: #28c840; }
205
+
206
+ .terminal-title {
207
+ margin-left: auto;
208
+ font-size: 12px;
209
+ color: #525252;
210
+ font-family: 'JetBrains Mono', monospace;
211
+ }
140
212
 
141
213
  .terminal-body {
142
- padding: 20px;
214
+ padding: 24px;
143
215
  font-family: 'JetBrains Mono', monospace;
144
216
  font-size: 14px;
145
- line-height: 1.6;
217
+ line-height: 1.7;
218
+ min-height: 200px;
146
219
  }
147
220
 
148
221
  .terminal-prompt {
149
222
  color: #ef4444;
223
+ user-select: none;
150
224
  }
151
225
 
152
226
  .terminal-command {
153
- color: #ffffff;
227
+ color: #f5f5f5;
154
228
  }
155
229
 
156
230
  .terminal-output {
157
231
  color: #737373;
158
232
  }
159
233
 
234
+ .terminal-success {
235
+ color: #22c55e;
236
+ }
237
+
238
+ .terminal-accent {
239
+ color: #ef4444;
240
+ }
241
+
242
+ /* Typing cursor */
243
+ .typing-cursor {
244
+ display: inline-block;
245
+ width: 10px;
246
+ height: 20px;
247
+ background: #ef4444;
248
+ margin-left: 2px;
249
+ animation: blink 1s step-end infinite;
250
+ vertical-align: middle;
251
+ }
252
+
160
253
  /* Testimonial card */
161
254
  .testimonial-card {
162
- background: #1a1a1a;
163
- border: 1px solid #2a2a2a;
255
+ background: var(--surface);
256
+ border: 1px solid var(--border);
164
257
  transition: all 0.3s ease;
165
258
  }
166
259
 
167
260
  .testimonial-card:hover {
168
- border-color: rgba(34, 197, 94, 0.3);
261
+ border-color: var(--accent);
262
+ transform: translateY(-2px);
263
+ }
264
+
265
+ /* Stats card */
266
+ .stat-card {
267
+ background: linear-gradient(135deg, var(--surface) 0%, var(--surface-elevated) 100%);
268
+ border: 1px solid var(--border);
269
+ border-radius: 16px;
270
+ padding: 24px;
271
+ text-align: center;
272
+ transition: all 0.3s ease;
273
+ }
274
+
275
+ .stat-card:hover {
276
+ border-color: var(--accent);
277
+ transform: scale(1.02);
278
+ }
279
+
280
+ .stat-number {
281
+ font-size: 2.5rem;
282
+ font-weight: 800;
283
+ background: linear-gradient(135deg, var(--accent) 0%, #f87171 100%);
284
+ -webkit-background-clip: text;
285
+ -webkit-text-fill-color: transparent;
286
+ background-clip: text;
287
+ line-height: 1.2;
288
+ }
289
+
290
+ .stat-label {
291
+ color: var(--text-muted);
292
+ font-size: 0.875rem;
293
+ font-weight: 500;
294
+ margin-top: 4px;
169
295
  }
170
296
 
171
297
  /* Input styling */
172
298
  input[type="email"] {
173
- background: #141414;
174
- border: 1px solid #2a2a2a;
299
+ background: var(--surface-elevated);
300
+ border: 1px solid var(--border);
175
301
  transition: all 0.2s ease;
176
302
  }
177
303
 
178
304
  input[type="email"]:focus {
179
305
  outline: none;
180
- border-color: #ef4444;
181
- box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.1);
306
+ border-color: var(--accent);
307
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
182
308
  }
183
309
 
184
310
  input[type="email"]::placeholder {
185
- color: #525252;
311
+ color: var(--text-muted);
186
312
  }
187
313
 
188
314
  /* Badge styling */
189
315
  .badge {
190
316
  display: inline-flex;
191
317
  align-items: center;
192
- gap: 6px;
193
- padding: 4px 12px;
194
- font-size: 12px;
195
- font-weight: 500;
318
+ gap: 8px;
319
+ padding: 6px 14px;
320
+ font-size: 13px;
321
+ font-weight: 600;
196
322
  border-radius: 9999px;
197
- background: rgba(34, 197, 94, 0.1);
198
- border: 1px solid rgba(34, 197, 94, 0.2);
199
- color: #ef4444;
323
+ background: rgba(239, 68, 68, 0.1);
324
+ border: 1px solid rgba(239, 68, 68, 0.2);
325
+ color: var(--accent);
326
+ }
327
+
328
+ .badge-live {
329
+ position: relative;
330
+ }
331
+
332
+ .badge-live::before {
333
+ content: '';
334
+ width: 6px;
335
+ height: 6px;
336
+ border-radius: 50%;
337
+ background: #22c55e;
338
+ animation: pulse-glow 2s ease-in-out infinite;
200
339
  }
201
340
 
202
341
  /* Integration badges */
@@ -204,58 +343,258 @@ input[type="email"]::placeholder {
204
343
  display: inline-flex;
205
344
  align-items: center;
206
345
  gap: 8px;
207
- padding: 8px 16px;
208
- font-size: 13px;
346
+ padding: 10px 18px;
347
+ font-size: 14px;
209
348
  font-weight: 500;
210
- border-radius: 8px;
211
- background: #1a1a1a;
212
- border: 1px solid #2a2a2a;
213
- color: #a3a3a3;
349
+ border-radius: 10px;
350
+ background: var(--surface);
351
+ border: 1px solid var(--border);
352
+ color: var(--text-secondary);
214
353
  transition: all 0.2s ease;
215
354
  }
216
355
 
217
356
  .integration-badge:hover {
218
- border-color: rgba(34, 197, 94, 0.3);
219
- color: #ffffff;
357
+ border-color: var(--accent);
358
+ color: var(--text-primary);
359
+ transform: translateY(-2px);
220
360
  }
221
361
 
222
362
  /* Button base */
223
363
  .btn-primary {
224
364
  display: inline-flex;
225
365
  align-items: center;
226
- gap: 8px;
227
- padding: 12px 24px;
366
+ justify-content: center;
367
+ gap: 10px;
368
+ padding: 14px 28px;
228
369
  font-weight: 600;
370
+ font-size: 15px;
229
371
  border-radius: 12px;
230
- background: #ef4444;
231
- color: #0d0d0d;
372
+ background: var(--accent);
373
+ color: white;
232
374
  transition: all 0.2s ease;
375
+ border: none;
376
+ cursor: pointer;
233
377
  }
234
378
 
235
379
  .btn-primary:hover {
236
380
  background: #dc2626;
237
- transform: translateY(-1px);
381
+ transform: translateY(-2px);
382
+ box-shadow: 0 10px 40px rgba(239, 68, 68, 0.3);
383
+ }
384
+
385
+ .btn-primary:active {
386
+ transform: translateY(0);
238
387
  }
239
388
 
240
389
  .btn-secondary {
241
390
  display: inline-flex;
242
391
  align-items: center;
243
- gap: 8px;
244
- padding: 12px 24px;
245
- font-weight: 500;
392
+ justify-content: center;
393
+ gap: 10px;
394
+ padding: 14px 28px;
395
+ font-weight: 600;
396
+ font-size: 15px;
246
397
  border-radius: 12px;
247
- background: #1a1a1a;
248
- border: 1px solid #2a2a2a;
249
- color: #ffffff;
398
+ background: var(--surface);
399
+ border: 1px solid var(--border);
400
+ color: var(--text-primary);
250
401
  transition: all 0.2s ease;
402
+ cursor: pointer;
251
403
  }
252
404
 
253
405
  .btn-secondary:hover {
254
- border-color: rgba(34, 197, 94, 0.5);
406
+ border-color: var(--accent);
407
+ background: var(--surface-elevated);
408
+ transform: translateY(-2px);
409
+ }
410
+
411
+ .btn-secondary:active {
412
+ transform: translateY(0);
413
+ }
414
+
415
+ .btn-ghost {
416
+ display: inline-flex;
417
+ align-items: center;
418
+ gap: 8px;
419
+ padding: 10px 16px;
420
+ font-weight: 500;
421
+ font-size: 14px;
422
+ border-radius: 10px;
423
+ background: transparent;
424
+ color: var(--text-secondary);
425
+ transition: all 0.2s ease;
426
+ border: none;
427
+ cursor: pointer;
428
+ }
429
+
430
+ .btn-ghost:hover {
431
+ color: var(--accent);
432
+ background: rgba(239, 68, 68, 0.05);
255
433
  }
256
434
 
257
435
  /* Divider */
258
436
  .divider {
259
437
  height: 1px;
260
- background: linear-gradient(90deg, transparent, #2a2a2a, transparent);
438
+ background: linear-gradient(90deg, transparent, var(--border), transparent);
439
+ margin: 0 auto;
440
+ max-width: 80%;
441
+ }
442
+
443
+ /* Step indicator */
444
+ .step-indicator {
445
+ width: 48px;
446
+ height: 48px;
447
+ border-radius: 50%;
448
+ background: linear-gradient(135deg, var(--accent) 0%, #f87171 100%);
449
+ color: white;
450
+ font-weight: 700;
451
+ font-size: 1.25rem;
452
+ display: flex;
453
+ align-items: center;
454
+ justify-content: center;
455
+ box-shadow: 0 4px 20px rgba(239, 68, 68, 0.3);
456
+ }
457
+
458
+ /* Feature card - for agents/providers */
459
+ .feature-card {
460
+ background: linear-gradient(135deg, var(--surface) 0%, var(--surface-elevated) 100%);
461
+ border: 1px solid var(--border);
462
+ border-radius: 20px;
463
+ padding: 32px;
464
+ transition: all 0.3s ease;
465
+ }
466
+
467
+ .feature-card:hover {
468
+ border-color: var(--accent);
469
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);
470
+ }
471
+
472
+ /* Code preview */
473
+ .code-preview {
474
+ background: linear-gradient(180deg, #141414 0%, #0d0d0d 100%);
475
+ border: 1px solid rgba(239, 68, 68, 0.3);
476
+ border-radius: 14px;
477
+ overflow: hidden;
478
+ font-family: 'JetBrains Mono', monospace;
479
+ font-size: 13px;
480
+ box-shadow:
481
+ 0 0 40px rgba(239, 68, 68, 0.25),
482
+ 0 0 80px rgba(239, 68, 68, 0.1),
483
+ 0 8px 32px rgba(0, 0, 0, 0.5),
484
+ inset 0 1px 0 rgba(255, 255, 255, 0.05);
485
+ transition: all 0.3s ease;
486
+ }
487
+
488
+ .code-preview:hover {
489
+ border-color: rgba(239, 68, 68, 0.5);
490
+ transform: translateY(-4px);
491
+ box-shadow:
492
+ 0 0 60px rgba(239, 68, 68, 0.35),
493
+ 0 0 100px rgba(239, 68, 68, 0.15),
494
+ 0 16px 48px rgba(0, 0, 0, 0.6),
495
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
496
+ }
497
+
498
+ .code-preview-header {
499
+ padding: 10px 16px;
500
+ background: #141414;
501
+ border-bottom: 1px solid #262626;
502
+ color: #737373;
503
+ font-size: 12px;
504
+ }
505
+
506
+ .code-preview-body {
507
+ padding: 16px;
508
+ overflow-x: auto;
509
+ }
510
+
511
+ .code-preview pre {
512
+ margin: 0;
513
+ color: #e5e5e5;
514
+ }
515
+
516
+ .code-comment { color: #6b7280; }
517
+ .code-string { color: #fbbf24; }
518
+ .code-keyword { color: #f472b6; }
519
+ .code-function { color: #60a5fa; }
520
+ .code-property { color: #34d399; }
521
+
522
+ /* Logo animation */
523
+ .logo-float {
524
+ animation: float 4s ease-in-out infinite;
525
+ }
526
+
527
+ /* Gradient border */
528
+ .gradient-border {
529
+ position: relative;
530
+ background: var(--surface-elevated);
531
+ border-radius: 16px;
532
+ }
533
+
534
+ .gradient-border::before {
535
+ content: '';
536
+ position: absolute;
537
+ inset: 0;
538
+ padding: 1px;
539
+ border-radius: 16px;
540
+ background: linear-gradient(135deg, var(--accent), transparent, var(--accent));
541
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
542
+ -webkit-mask-composite: xor;
543
+ mask-composite: exclude;
544
+ pointer-events: none;
545
+ }
546
+
547
+ /* Animated background grid */
548
+ .bg-grid {
549
+ background-image:
550
+ linear-gradient(rgba(239, 68, 68, 0.03) 1px, transparent 1px),
551
+ linear-gradient(90deg, rgba(239, 68, 68, 0.03) 1px, transparent 1px);
552
+ background-size: 60px 60px;
553
+ }
554
+
555
+ /* Hero background glow */
556
+ .hero-glow {
557
+ position: absolute;
558
+ top: -200px;
559
+ left: 50%;
560
+ transform: translateX(-50%);
561
+ width: 800px;
562
+ height: 800px;
563
+ background: radial-gradient(circle, rgba(239, 68, 68, 0.15) 0%, transparent 70%);
564
+ pointer-events: none;
565
+ z-index: 0;
566
+ }
567
+
568
+ /* Scrollbar styling */
569
+ ::-webkit-scrollbar {
570
+ width: 8px;
571
+ height: 8px;
572
+ }
573
+
574
+ ::-webkit-scrollbar-track {
575
+ background: var(--surface);
576
+ }
577
+
578
+ ::-webkit-scrollbar-thumb {
579
+ background: var(--border);
580
+ border-radius: 4px;
581
+ }
582
+
583
+ ::-webkit-scrollbar-thumb:hover {
584
+ background: var(--text-muted);
585
+ }
586
+
587
+ /* Responsive */
588
+ @media (max-width: 768px) {
589
+ .terminal-body {
590
+ font-size: 12px;
591
+ padding: 16px;
592
+ }
593
+
594
+ .stat-number {
595
+ font-size: 1.5rem;
596
+ }
597
+ .stat-card {
598
+ padding: 16px;
599
+ }
261
600
  }