@dupecom/botcha-cloudflare 0.14.0 → 0.15.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.
- package/dist/dashboard/auth.d.ts.map +1 -1
- package/dist/dashboard/auth.js +1 -1
- package/dist/dashboard/landing.d.ts.map +1 -1
- package/dist/dashboard/landing.js +2 -2
- package/dist/dashboard/layout.d.ts +9 -0
- package/dist/dashboard/layout.d.ts.map +1 -1
- package/dist/dashboard/layout.js +14 -5
- package/dist/dashboard/showcase.d.ts +19 -0
- package/dist/dashboard/showcase.d.ts.map +1 -0
- package/dist/dashboard/showcase.js +1047 -0
- package/dist/dashboard/styles.d.ts +1 -1
- package/dist/dashboard/styles.d.ts.map +1 -1
- package/dist/dashboard/styles.js +99 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -31
- package/dist/routes/stream.js +1 -1
- package/dist/static.d.ts +1 -1
- package/dist/static.d.ts.map +1 -1
- package/dist/static.js +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1047 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
|
|
2
|
+
import { GlobalFooter } from './layout';
|
|
3
|
+
// ============ CSS ============
|
|
4
|
+
export const SHOWCASE_CSS = `
|
|
5
|
+
/* ============ Showcase layout ============ */
|
|
6
|
+
.showcase-page {
|
|
7
|
+
max-width: 100%;
|
|
8
|
+
overflow-x: hidden;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.showcase-divider {
|
|
12
|
+
max-width: 800px;
|
|
13
|
+
margin: 0 auto;
|
|
14
|
+
border: none;
|
|
15
|
+
border-top: 1px solid var(--border);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* ============ Section 1: TAP Announcement Hero ============ */
|
|
19
|
+
.showcase-tap-hero {
|
|
20
|
+
max-width: 800px;
|
|
21
|
+
margin: 0 auto;
|
|
22
|
+
padding: 4rem 2rem 3rem;
|
|
23
|
+
text-align: center;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.showcase-tap-hero-badge {
|
|
27
|
+
display: inline-block;
|
|
28
|
+
font-size: 0.625rem;
|
|
29
|
+
font-weight: 700;
|
|
30
|
+
letter-spacing: 0.15em;
|
|
31
|
+
text-transform: uppercase;
|
|
32
|
+
padding: 0.3rem 0.875rem;
|
|
33
|
+
background: var(--green);
|
|
34
|
+
color: #fff;
|
|
35
|
+
margin-bottom: 1.5rem;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.showcase-tap-hero-title {
|
|
39
|
+
font-size: 2.5rem;
|
|
40
|
+
font-weight: 700;
|
|
41
|
+
line-height: 1.1;
|
|
42
|
+
margin: 0 0 1.25rem;
|
|
43
|
+
color: var(--text);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.showcase-tap-links {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
flex-wrap: wrap;
|
|
51
|
+
gap: 0.375rem;
|
|
52
|
+
margin-bottom: 1.5rem;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.showcase-tap-link {
|
|
56
|
+
font-size: 0.6875rem;
|
|
57
|
+
color: var(--text-muted);
|
|
58
|
+
text-decoration: underline;
|
|
59
|
+
text-underline-offset: 3px;
|
|
60
|
+
transition: color 0.15s;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.showcase-tap-link:hover {
|
|
64
|
+
color: var(--green);
|
|
65
|
+
opacity: 1;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.showcase-tap-links-sep {
|
|
69
|
+
color: var(--text-dim);
|
|
70
|
+
font-size: 0.625rem;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.showcase-tap-hero-subtitle {
|
|
74
|
+
font-size: 0.9375rem;
|
|
75
|
+
line-height: 1.7;
|
|
76
|
+
color: var(--text-muted);
|
|
77
|
+
max-width: 600px;
|
|
78
|
+
margin: 0 auto 2.5rem;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.showcase-tap-hero-features {
|
|
82
|
+
display: grid;
|
|
83
|
+
grid-template-columns: repeat(3, 1fr);
|
|
84
|
+
gap: 1.5rem;
|
|
85
|
+
text-align: left;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.showcase-tap-feature {
|
|
89
|
+
padding: 1.25rem;
|
|
90
|
+
border: 1px solid var(--border);
|
|
91
|
+
background: var(--bg);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.showcase-tap-feature-title {
|
|
95
|
+
font-size: 0.8125rem;
|
|
96
|
+
font-weight: 700;
|
|
97
|
+
margin-bottom: 0.5rem;
|
|
98
|
+
color: var(--text);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.showcase-tap-feature-desc {
|
|
102
|
+
font-size: 0.75rem;
|
|
103
|
+
line-height: 1.6;
|
|
104
|
+
color: var(--text-muted);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* ============ CAPTCHA vs BOTCHA Comparison ============ */
|
|
108
|
+
.showcase-hero {
|
|
109
|
+
max-width: 1100px;
|
|
110
|
+
margin: 0 auto;
|
|
111
|
+
padding: 4rem 2rem 2rem;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.showcase-hero-grid {
|
|
115
|
+
display: grid;
|
|
116
|
+
grid-template-columns: 1fr 1fr;
|
|
117
|
+
gap: 2rem;
|
|
118
|
+
margin-bottom: 3rem;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.showcase-hero-column {
|
|
122
|
+
border: 2px solid var(--border);
|
|
123
|
+
padding: 2rem;
|
|
124
|
+
background: var(--bg);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.showcase-hero-column.old-world {
|
|
128
|
+
border-color: var(--red);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.showcase-hero-column.new-world {
|
|
132
|
+
border-color: var(--green);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.showcase-hero-label {
|
|
136
|
+
font-size: 0.6875rem;
|
|
137
|
+
font-weight: 700;
|
|
138
|
+
letter-spacing: 0.15em;
|
|
139
|
+
text-transform: uppercase;
|
|
140
|
+
margin-bottom: 0.75rem;
|
|
141
|
+
color: var(--text-dim);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.showcase-hero-title {
|
|
145
|
+
font-size: 2rem;
|
|
146
|
+
font-weight: 700;
|
|
147
|
+
margin-bottom: 1.25rem;
|
|
148
|
+
line-height: 1;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.showcase-hero-title.strikethrough {
|
|
152
|
+
text-decoration: line-through;
|
|
153
|
+
color: var(--red);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.showcase-hero-title.active {
|
|
157
|
+
color: var(--green);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.showcase-hero-visual {
|
|
161
|
+
font-family: var(--font);
|
|
162
|
+
font-size: 0.6875rem;
|
|
163
|
+
line-height: 1.3;
|
|
164
|
+
margin: 1.25rem 0;
|
|
165
|
+
padding: 1rem;
|
|
166
|
+
background: #fafafa;
|
|
167
|
+
border: 1px solid var(--border);
|
|
168
|
+
white-space: pre;
|
|
169
|
+
overflow-x: auto;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.showcase-hero-visual.old-world {
|
|
173
|
+
color: var(--red);
|
|
174
|
+
border-color: var(--red);
|
|
175
|
+
background: #fff5f5;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.showcase-hero-visual.new-world {
|
|
179
|
+
color: var(--green);
|
|
180
|
+
border-color: var(--green);
|
|
181
|
+
background: #f5fff7;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.showcase-hero-subtitle {
|
|
185
|
+
font-size: 0.875rem;
|
|
186
|
+
margin-bottom: 1rem;
|
|
187
|
+
line-height: 1.5;
|
|
188
|
+
color: var(--text);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.showcase-hero-features {
|
|
192
|
+
list-style: none;
|
|
193
|
+
padding: 0;
|
|
194
|
+
margin: 0;
|
|
195
|
+
font-size: 0.75rem;
|
|
196
|
+
color: var(--text-muted);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.showcase-hero-features li {
|
|
200
|
+
padding: 0.25rem 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.showcase-hero-features li::before {
|
|
204
|
+
content: "\\2192 ";
|
|
205
|
+
color: var(--text-dim);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.showcase-hero-tagline {
|
|
209
|
+
text-align: center;
|
|
210
|
+
padding: 2rem 2rem 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.showcase-hero-tagline-main {
|
|
214
|
+
font-size: 1.5rem;
|
|
215
|
+
font-weight: 700;
|
|
216
|
+
margin-bottom: 0.5rem;
|
|
217
|
+
color: var(--text);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.showcase-hero-tagline-sub {
|
|
221
|
+
font-size: 0.875rem;
|
|
222
|
+
color: var(--text-muted);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* ============ Section 2: Protocol Stack ============ */
|
|
226
|
+
.showcase-protocol-stack {
|
|
227
|
+
max-width: 800px;
|
|
228
|
+
margin: 0 auto;
|
|
229
|
+
padding: 4rem 2rem;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.showcase-protocol-stack h2 {
|
|
233
|
+
font-size: 1.5rem;
|
|
234
|
+
font-weight: 700;
|
|
235
|
+
margin-bottom: 0.5rem;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.showcase-protocol-stack .subtitle {
|
|
239
|
+
color: var(--text-muted);
|
|
240
|
+
font-size: 0.875rem;
|
|
241
|
+
margin-bottom: 2.5rem;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.showcase-stack-diagram {
|
|
245
|
+
position: relative;
|
|
246
|
+
margin: 0 0 2rem 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.showcase-stack-layer {
|
|
250
|
+
border: 2px solid var(--border);
|
|
251
|
+
background: var(--bg);
|
|
252
|
+
padding: 1.25rem 1.5rem;
|
|
253
|
+
position: relative;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.showcase-stack-layer + .showcase-stack-layer {
|
|
257
|
+
margin-top: -2px;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.showcase-stack-layer-highlight {
|
|
261
|
+
border: 3px solid var(--accent);
|
|
262
|
+
background: var(--bg-raised);
|
|
263
|
+
z-index: 1;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.showcase-stack-layer-number {
|
|
267
|
+
font-size: 0.625rem;
|
|
268
|
+
font-weight: 700;
|
|
269
|
+
text-transform: uppercase;
|
|
270
|
+
letter-spacing: 0.1em;
|
|
271
|
+
color: var(--text-dim);
|
|
272
|
+
margin-bottom: 0.375rem;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.showcase-stack-layer-highlight .showcase-stack-layer-number {
|
|
276
|
+
color: var(--green);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.showcase-stack-layer-title {
|
|
280
|
+
font-size: 1.125rem;
|
|
281
|
+
font-weight: 700;
|
|
282
|
+
margin-bottom: 0.25rem;
|
|
283
|
+
display: flex;
|
|
284
|
+
align-items: center;
|
|
285
|
+
gap: 0.75rem;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.showcase-stack-layer-subtitle {
|
|
289
|
+
font-size: 0.8125rem;
|
|
290
|
+
color: var(--text-muted);
|
|
291
|
+
margin-bottom: 0.375rem;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.showcase-stack-layer-features {
|
|
295
|
+
font-size: 0.75rem;
|
|
296
|
+
color: var(--text-dim);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.showcase-you-are-here {
|
|
300
|
+
display: inline-block;
|
|
301
|
+
background: var(--green);
|
|
302
|
+
color: white;
|
|
303
|
+
font-size: 0.5625rem;
|
|
304
|
+
font-weight: 700;
|
|
305
|
+
padding: 0.2rem 0.5rem;
|
|
306
|
+
letter-spacing: 0.05em;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.showcase-buzzword-badges {
|
|
310
|
+
display: flex;
|
|
311
|
+
flex-wrap: wrap;
|
|
312
|
+
gap: 0.5rem;
|
|
313
|
+
margin-bottom: 2rem;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.showcase-badge {
|
|
317
|
+
display: inline-block;
|
|
318
|
+
font-size: 0.6875rem;
|
|
319
|
+
padding: 0.3rem 0.625rem;
|
|
320
|
+
border: 1px solid var(--border);
|
|
321
|
+
background: var(--bg);
|
|
322
|
+
color: var(--text-muted);
|
|
323
|
+
white-space: nowrap;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.showcase-protocol-explanation {
|
|
327
|
+
font-size: 0.8125rem;
|
|
328
|
+
line-height: 1.7;
|
|
329
|
+
color: var(--text-muted);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/* ============ Section 3: Terminal Demo ============ */
|
|
333
|
+
.showcase-terminal-section {
|
|
334
|
+
max-width: 1100px;
|
|
335
|
+
margin: 0 auto;
|
|
336
|
+
padding: 4rem 2rem;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.showcase-terminal-header {
|
|
340
|
+
text-align: center;
|
|
341
|
+
margin-bottom: 2.5rem;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.showcase-terminal-title {
|
|
345
|
+
font-size: 1.5rem;
|
|
346
|
+
font-weight: 700;
|
|
347
|
+
margin: 0 0 0.5rem 0;
|
|
348
|
+
color: var(--text);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.showcase-terminal-subtitle {
|
|
352
|
+
font-size: 0.875rem;
|
|
353
|
+
color: var(--text-muted);
|
|
354
|
+
margin: 0;
|
|
355
|
+
line-height: 1.5;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.showcase-terminal-container {
|
|
359
|
+
max-width: 640px;
|
|
360
|
+
margin: 0 auto;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.showcase-terminal-window {
|
|
364
|
+
background: #0d0d0d;
|
|
365
|
+
border: 1px solid var(--border);
|
|
366
|
+
overflow: hidden;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.showcase-terminal-chrome {
|
|
370
|
+
background: #1a1a1a;
|
|
371
|
+
padding: 0.75rem 1rem;
|
|
372
|
+
display: flex;
|
|
373
|
+
align-items: center;
|
|
374
|
+
gap: 0.5rem;
|
|
375
|
+
border-bottom: 1px solid #333;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.showcase-terminal-dot {
|
|
379
|
+
width: 10px;
|
|
380
|
+
height: 10px;
|
|
381
|
+
border-radius: 50%;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.showcase-terminal-dot--red { background: #ff5f56; }
|
|
385
|
+
.showcase-terminal-dot--yellow { background: #ffbd2e; }
|
|
386
|
+
.showcase-terminal-dot--green { background: #27c93f; }
|
|
387
|
+
|
|
388
|
+
.showcase-terminal-title-text {
|
|
389
|
+
font-size: 0.6875rem;
|
|
390
|
+
color: #888;
|
|
391
|
+
margin-left: 0.5rem;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.showcase-terminal-content {
|
|
395
|
+
padding: 1.5rem;
|
|
396
|
+
font-size: 0.8125rem;
|
|
397
|
+
line-height: 1.6;
|
|
398
|
+
color: #f0f0f0;
|
|
399
|
+
height: 460px;
|
|
400
|
+
overflow-y: hidden;
|
|
401
|
+
font-family: var(--font);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
.showcase-terminal-line {
|
|
405
|
+
margin-bottom: 0.375rem;
|
|
406
|
+
white-space: pre-wrap;
|
|
407
|
+
word-break: break-word;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.showcase-terminal-prompt { color: #888; }
|
|
411
|
+
.showcase-terminal-command { color: #f0f0f0; }
|
|
412
|
+
.showcase-terminal-flag { color: #9a9aff; }
|
|
413
|
+
.showcase-terminal-success { color: #4ade80; }
|
|
414
|
+
.showcase-terminal-label { color: #888; }
|
|
415
|
+
.showcase-terminal-value { color: #fff; }
|
|
416
|
+
|
|
417
|
+
.showcase-terminal-cursor {
|
|
418
|
+
display: inline-block;
|
|
419
|
+
background: #f0f0f0;
|
|
420
|
+
animation: showcase-cursor-blink 1s step-end infinite;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
@keyframes showcase-cursor-blink {
|
|
424
|
+
0%, 50% { opacity: 1; }
|
|
425
|
+
51%, 100% { opacity: 0; }
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.showcase-terminal-replay-container {
|
|
429
|
+
text-align: center;
|
|
430
|
+
margin-top: 1.5rem;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
.showcase-terminal-replay-btn {
|
|
434
|
+
background: var(--bg);
|
|
435
|
+
border: 1px solid var(--border);
|
|
436
|
+
padding: 0.5rem 1rem;
|
|
437
|
+
font-family: var(--font);
|
|
438
|
+
font-size: 0.75rem;
|
|
439
|
+
color: var(--text-muted);
|
|
440
|
+
cursor: pointer;
|
|
441
|
+
text-transform: uppercase;
|
|
442
|
+
letter-spacing: 0.05em;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.showcase-terminal-replay-btn:hover {
|
|
446
|
+
border-color: var(--accent);
|
|
447
|
+
color: var(--text);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* ============ Section 4: Live Demo ============ */
|
|
451
|
+
.showcase-livedemo {
|
|
452
|
+
padding: 4rem 2rem;
|
|
453
|
+
background: var(--bg-raised);
|
|
454
|
+
border-top: 2px solid var(--border);
|
|
455
|
+
border-bottom: 2px solid var(--border);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.showcase-livedemo-container {
|
|
459
|
+
max-width: 700px;
|
|
460
|
+
margin: 0 auto;
|
|
461
|
+
text-align: center;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.showcase-livedemo-title {
|
|
465
|
+
font-size: 1.5rem;
|
|
466
|
+
font-weight: 700;
|
|
467
|
+
margin-bottom: 0.5rem;
|
|
468
|
+
color: var(--text);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.showcase-livedemo-subtitle {
|
|
472
|
+
font-size: 0.875rem;
|
|
473
|
+
color: var(--text-muted);
|
|
474
|
+
margin-bottom: 2.5rem;
|
|
475
|
+
line-height: 1.6;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
.showcase-livedemo-button {
|
|
479
|
+
display: inline-block;
|
|
480
|
+
padding: 1rem 2rem;
|
|
481
|
+
font-size: 0.875rem;
|
|
482
|
+
font-weight: 700;
|
|
483
|
+
font-family: var(--font);
|
|
484
|
+
color: #fff;
|
|
485
|
+
background: var(--accent);
|
|
486
|
+
border: 2px solid var(--accent);
|
|
487
|
+
cursor: pointer;
|
|
488
|
+
text-transform: uppercase;
|
|
489
|
+
letter-spacing: 0.08em;
|
|
490
|
+
box-shadow: 4px 4px 0 var(--border-bright);
|
|
491
|
+
transition: all 0.15s;
|
|
492
|
+
margin-bottom: 1.5rem;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.showcase-livedemo-button:hover:not(:disabled) {
|
|
496
|
+
transform: translate(-2px, -2px);
|
|
497
|
+
box-shadow: 6px 6px 0 var(--border-bright);
|
|
498
|
+
opacity: 1;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.showcase-livedemo-button:active:not(:disabled) {
|
|
502
|
+
transform: translate(2px, 2px);
|
|
503
|
+
box-shadow: 2px 2px 0 var(--border-bright);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
.showcase-livedemo-button:disabled {
|
|
507
|
+
cursor: not-allowed;
|
|
508
|
+
opacity: 0.5;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.showcase-livedemo-result {
|
|
512
|
+
margin-top: 2rem;
|
|
513
|
+
padding: 1.5rem;
|
|
514
|
+
background: var(--bg);
|
|
515
|
+
border: 2px solid var(--border);
|
|
516
|
+
box-shadow: 4px 4px 0 var(--border-bright);
|
|
517
|
+
text-align: left;
|
|
518
|
+
font-size: 0.8125rem;
|
|
519
|
+
line-height: 1.8;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
.showcase-livedemo-result-line {
|
|
523
|
+
opacity: 0;
|
|
524
|
+
animation: showcase-livedemo-fadein 0.3s ease forwards;
|
|
525
|
+
margin-bottom: 0.375rem;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
.showcase-livedemo-result-line:nth-child(1) { animation-delay: 0ms; }
|
|
529
|
+
.showcase-livedemo-result-line:nth-child(2) { animation-delay: 100ms; }
|
|
530
|
+
.showcase-livedemo-result-line:nth-child(3) { animation-delay: 200ms; }
|
|
531
|
+
.showcase-livedemo-result-line:nth-child(4) { animation-delay: 300ms; }
|
|
532
|
+
.showcase-livedemo-result-line:nth-child(5) { animation-delay: 400ms; }
|
|
533
|
+
.showcase-livedemo-result-line:nth-child(6) { animation-delay: 500ms; }
|
|
534
|
+
.showcase-livedemo-result-line:nth-child(7) { animation-delay: 600ms; }
|
|
535
|
+
|
|
536
|
+
@keyframes showcase-livedemo-fadein {
|
|
537
|
+
from { opacity: 0; transform: translateY(-4px); }
|
|
538
|
+
to { opacity: 1; transform: translateY(0); }
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
.showcase-livedemo-label {
|
|
542
|
+
color: var(--text-dim);
|
|
543
|
+
font-weight: 600;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
.showcase-livedemo-value {
|
|
547
|
+
color: var(--text);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.showcase-livedemo-time-fast {
|
|
551
|
+
color: var(--green);
|
|
552
|
+
font-weight: 700;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.showcase-livedemo-time-slow {
|
|
556
|
+
color: var(--red);
|
|
557
|
+
font-weight: 700;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.showcase-livedemo-status-success {
|
|
561
|
+
color: var(--green);
|
|
562
|
+
font-weight: 700;
|
|
563
|
+
font-size: 1rem;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
.showcase-livedemo-status-error {
|
|
567
|
+
color: var(--red);
|
|
568
|
+
font-weight: 700;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
.showcase-livedemo-token {
|
|
572
|
+
font-family: var(--font);
|
|
573
|
+
color: var(--text-muted);
|
|
574
|
+
word-break: break-all;
|
|
575
|
+
font-size: 0.75rem;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.showcase-livedemo-counter {
|
|
579
|
+
margin-top: 1rem;
|
|
580
|
+
font-size: 0.75rem;
|
|
581
|
+
color: var(--text-dim);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
.showcase-livedemo-error {
|
|
585
|
+
margin-top: 1.5rem;
|
|
586
|
+
padding: 1rem;
|
|
587
|
+
background: var(--bg);
|
|
588
|
+
border: 2px solid var(--red);
|
|
589
|
+
color: var(--red);
|
|
590
|
+
text-align: left;
|
|
591
|
+
font-size: 0.8125rem;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* ============ Showcase footer ============ */
|
|
595
|
+
.showcase-footer {
|
|
596
|
+
max-width: 800px;
|
|
597
|
+
margin: 0 auto;
|
|
598
|
+
padding: 3rem 2rem 4rem;
|
|
599
|
+
text-align: center;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
.showcase-footer-cta {
|
|
603
|
+
font-size: 1rem;
|
|
604
|
+
font-weight: 700;
|
|
605
|
+
margin-bottom: 1rem;
|
|
606
|
+
color: var(--text);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
.showcase-footer-steps {
|
|
610
|
+
display: flex;
|
|
611
|
+
flex-direction: column;
|
|
612
|
+
gap: 0.5rem;
|
|
613
|
+
max-width: 420px;
|
|
614
|
+
margin: 0 auto 2rem;
|
|
615
|
+
text-align: left;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.showcase-footer-step {
|
|
619
|
+
display: flex;
|
|
620
|
+
align-items: center;
|
|
621
|
+
gap: 0.75rem;
|
|
622
|
+
font-size: 0.8125rem;
|
|
623
|
+
padding: 0.625rem 1rem;
|
|
624
|
+
background: var(--bg-raised);
|
|
625
|
+
border: 1px solid var(--border);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
.showcase-footer-step-number {
|
|
629
|
+
display: inline-flex;
|
|
630
|
+
align-items: center;
|
|
631
|
+
justify-content: center;
|
|
632
|
+
width: 1.375rem;
|
|
633
|
+
height: 1.375rem;
|
|
634
|
+
font-size: 0.6875rem;
|
|
635
|
+
font-weight: 700;
|
|
636
|
+
border: 1px solid var(--border-bright);
|
|
637
|
+
color: var(--text-muted);
|
|
638
|
+
flex-shrink: 0;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
.showcase-footer-step code {
|
|
642
|
+
color: var(--text);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
.showcase-agent-prompt {
|
|
646
|
+
max-width: 520px;
|
|
647
|
+
margin: 2rem auto 2.5rem;
|
|
648
|
+
text-align: center;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
.showcase-agent-prompt-label {
|
|
652
|
+
font-size: 0.6875rem;
|
|
653
|
+
font-weight: 600;
|
|
654
|
+
text-transform: uppercase;
|
|
655
|
+
letter-spacing: 0.1em;
|
|
656
|
+
color: var(--text-dim);
|
|
657
|
+
margin-bottom: 0.75rem;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
.showcase-agent-prompt-card {
|
|
661
|
+
display: block;
|
|
662
|
+
width: 100%;
|
|
663
|
+
padding: 1.25rem;
|
|
664
|
+
border: 1px solid var(--border);
|
|
665
|
+
background: var(--bg);
|
|
666
|
+
cursor: pointer;
|
|
667
|
+
font-family: var(--font);
|
|
668
|
+
text-align: left;
|
|
669
|
+
transition: border-color 0.15s;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
.showcase-agent-prompt-card:hover {
|
|
673
|
+
border-color: var(--accent);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.showcase-agent-prompt-card code {
|
|
677
|
+
display: block;
|
|
678
|
+
font-size: 0.8125rem;
|
|
679
|
+
font-weight: 600;
|
|
680
|
+
color: var(--text);
|
|
681
|
+
line-height: 1.5;
|
|
682
|
+
background: none;
|
|
683
|
+
border: none;
|
|
684
|
+
padding: 0;
|
|
685
|
+
text-transform: none;
|
|
686
|
+
letter-spacing: normal;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
.showcase-agent-prompt-copy {
|
|
690
|
+
display: flex;
|
|
691
|
+
align-items: center;
|
|
692
|
+
gap: 0.375rem;
|
|
693
|
+
margin-top: 0.75rem;
|
|
694
|
+
font-size: 0.625rem;
|
|
695
|
+
font-weight: 500;
|
|
696
|
+
color: var(--text-muted);
|
|
697
|
+
text-transform: uppercase;
|
|
698
|
+
letter-spacing: 0.1em;
|
|
699
|
+
transition: color 0.2s;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
.showcase-agent-prompt-copy span {
|
|
703
|
+
display: flex;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
.showcase-footer-links {
|
|
707
|
+
display: flex;
|
|
708
|
+
flex-wrap: wrap;
|
|
709
|
+
justify-content: center;
|
|
710
|
+
gap: 0.5rem;
|
|
711
|
+
margin-bottom: 2rem;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
.showcase-footer-link {
|
|
715
|
+
font-size: 0.6875rem;
|
|
716
|
+
color: var(--text);
|
|
717
|
+
text-decoration: none;
|
|
718
|
+
padding: 0.25rem 0.625rem;
|
|
719
|
+
border: 1px solid var(--border-bright);
|
|
720
|
+
transition: border-color 0.15s;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
.showcase-footer-link:hover {
|
|
724
|
+
border-color: var(--accent);
|
|
725
|
+
opacity: 1;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.showcase-footer-meta {
|
|
729
|
+
font-size: 0.6875rem;
|
|
730
|
+
color: var(--text-dim);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
.showcase-footer-meta a {
|
|
734
|
+
color: var(--text-muted);
|
|
735
|
+
text-decoration: none;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
.showcase-footer-sep {
|
|
739
|
+
margin: 0 0.375rem;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/* ============ Responsive ============ */
|
|
743
|
+
@media (max-width: 768px) {
|
|
744
|
+
.showcase-tap-hero { padding: 3rem 1rem 2rem; }
|
|
745
|
+
.showcase-tap-hero-title { font-size: 1.75rem; }
|
|
746
|
+
.showcase-tap-hero-features {
|
|
747
|
+
grid-template-columns: 1fr;
|
|
748
|
+
gap: 1rem;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
.showcase-hero { padding: 2rem 1rem 1rem; }
|
|
752
|
+
.showcase-hero-grid {
|
|
753
|
+
grid-template-columns: 1fr;
|
|
754
|
+
gap: 1.5rem;
|
|
755
|
+
}
|
|
756
|
+
.showcase-hero-column { padding: 1.5rem; }
|
|
757
|
+
.showcase-hero-title { font-size: 1.5rem; }
|
|
758
|
+
.showcase-hero-visual { font-size: 0.5625rem; }
|
|
759
|
+
.showcase-hero-tagline-main { font-size: 1.25rem; }
|
|
760
|
+
|
|
761
|
+
.showcase-protocol-stack { padding: 3rem 1rem; }
|
|
762
|
+
.showcase-stack-layer-title {
|
|
763
|
+
flex-direction: column;
|
|
764
|
+
align-items: flex-start;
|
|
765
|
+
gap: 0.375rem;
|
|
766
|
+
font-size: 1rem;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
.showcase-terminal-section { padding: 3rem 1rem; }
|
|
770
|
+
.showcase-terminal-content { padding: 1rem; font-size: 0.75rem; height: 420px; }
|
|
771
|
+
|
|
772
|
+
.showcase-livedemo { padding: 3rem 1rem; }
|
|
773
|
+
|
|
774
|
+
.showcase-footer { padding: 2rem 1rem 3rem; }
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
@media (max-width: 480px) {
|
|
778
|
+
.showcase-hero-visual { font-size: 0.5rem; padding: 0.75rem; }
|
|
779
|
+
.showcase-hero-tagline-main { font-size: 1rem; }
|
|
780
|
+
}
|
|
781
|
+
`;
|
|
782
|
+
// ============ SCRIPTS ============
|
|
783
|
+
const TERMINAL_ANIMATION_SCRIPT = `
|
|
784
|
+
(function() {
|
|
785
|
+
var commands = [
|
|
786
|
+
{
|
|
787
|
+
cmd: 'botcha init --email dev@company.com',
|
|
788
|
+
response: [
|
|
789
|
+
'<span class="showcase-terminal-success">\\u2705</span> App created in 312ms!',
|
|
790
|
+
' <span class="showcase-terminal-label">App ID:</span> <span class="showcase-terminal-value">app_b18545f37eee64c4</span>',
|
|
791
|
+
' <span class="showcase-terminal-label">Config saved to</span> <span class="showcase-terminal-value">~/.botcha/config.json</span>'
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
cmd: 'botcha tap register --name "shopping-agent" --capabilities browse,search,purchase',
|
|
796
|
+
response: [
|
|
797
|
+
'<span class="showcase-terminal-success">\\u2705</span> Agent registered in 467ms!',
|
|
798
|
+
' <span class="showcase-terminal-label">Agent ID:</span> <span class="showcase-terminal-value">agent_6ddfd9f10cfd8dfc</span>',
|
|
799
|
+
' <span class="showcase-terminal-label">Name:</span> <span class="showcase-terminal-value">shopping-agent</span>',
|
|
800
|
+
' <span class="showcase-terminal-label">Capabilities:</span> <span class="showcase-terminal-value">browse, search, purchase</span>'
|
|
801
|
+
]
|
|
802
|
+
},
|
|
803
|
+
{
|
|
804
|
+
cmd: 'botcha tap session --action browse --resource products --duration 1h',
|
|
805
|
+
response: [
|
|
806
|
+
'<span class="showcase-terminal-success">\\u2705</span> Session created in 374ms!',
|
|
807
|
+
' <span class="showcase-terminal-label">Session ID:</span> <span class="showcase-terminal-value">e66323397a809b9b</span>',
|
|
808
|
+
' <span class="showcase-terminal-label">Intent:</span> <span class="showcase-terminal-value">browse on products</span>',
|
|
809
|
+
' <span class="showcase-terminal-label">Expires in:</span> <span class="showcase-terminal-value">1 hour</span>'
|
|
810
|
+
]
|
|
811
|
+
}
|
|
812
|
+
];
|
|
813
|
+
|
|
814
|
+
var content = document.getElementById('terminal-content');
|
|
815
|
+
var replayBtn = document.getElementById('terminal-replay');
|
|
816
|
+
var currentTimeout;
|
|
817
|
+
var running = false;
|
|
818
|
+
var hasPlayed = false;
|
|
819
|
+
var cancelled = false;
|
|
820
|
+
|
|
821
|
+
function highlightFlags(cmd) {
|
|
822
|
+
return cmd.replace(/(--[a-z-]+)/g, '<span class="showcase-terminal-flag">$1</span>');
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
function sleep(ms) {
|
|
826
|
+
return new Promise(function(resolve, reject) {
|
|
827
|
+
currentTimeout = setTimeout(resolve, ms);
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
async function animate() {
|
|
832
|
+
if (running) return;
|
|
833
|
+
running = true;
|
|
834
|
+
cancelled = false;
|
|
835
|
+
content.innerHTML = '';
|
|
836
|
+
|
|
837
|
+
try {
|
|
838
|
+
for (var c = 0; c < commands.length; c++) {
|
|
839
|
+
if (cancelled) return;
|
|
840
|
+
var item = commands[c];
|
|
841
|
+
var line = document.createElement('div');
|
|
842
|
+
line.className = 'showcase-terminal-line';
|
|
843
|
+
line.innerHTML = '<span class="showcase-terminal-prompt">$ </span><span class="showcase-terminal-command"></span><span class="showcase-terminal-cursor">\\u2589</span>';
|
|
844
|
+
content.appendChild(line);
|
|
845
|
+
|
|
846
|
+
var cmdSpan = line.querySelector('.showcase-terminal-command');
|
|
847
|
+
var cursor = line.querySelector('.showcase-terminal-cursor');
|
|
848
|
+
|
|
849
|
+
for (var i = 0; i < item.cmd.length; i++) {
|
|
850
|
+
if (cancelled) return;
|
|
851
|
+
await sleep(35);
|
|
852
|
+
cmdSpan.textContent = item.cmd.slice(0, i + 1);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
cmdSpan.innerHTML = highlightFlags(item.cmd);
|
|
856
|
+
cursor.remove();
|
|
857
|
+
await sleep(300);
|
|
858
|
+
|
|
859
|
+
for (var r = 0; r < item.response.length; r++) {
|
|
860
|
+
if (cancelled) return;
|
|
861
|
+
var respLine = document.createElement('div');
|
|
862
|
+
respLine.className = 'showcase-terminal-line';
|
|
863
|
+
respLine.innerHTML = item.response[r];
|
|
864
|
+
content.appendChild(respLine);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
await sleep(800);
|
|
868
|
+
}
|
|
869
|
+
} finally {
|
|
870
|
+
running = false;
|
|
871
|
+
hasPlayed = true;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// Replay button — cancel any in-progress animation and restart
|
|
876
|
+
replayBtn.addEventListener('click', function() {
|
|
877
|
+
clearTimeout(currentTimeout);
|
|
878
|
+
cancelled = true;
|
|
879
|
+
running = false;
|
|
880
|
+
animate();
|
|
881
|
+
});
|
|
882
|
+
|
|
883
|
+
// IntersectionObserver — play once when terminal scrolls into view
|
|
884
|
+
var observer = new IntersectionObserver(function(entries) {
|
|
885
|
+
if (entries[0].isIntersecting && !hasPlayed && !running) {
|
|
886
|
+
animate();
|
|
887
|
+
observer.disconnect();
|
|
888
|
+
}
|
|
889
|
+
}, { threshold: 0.3 });
|
|
890
|
+
|
|
891
|
+
observer.observe(content);
|
|
892
|
+
})();
|
|
893
|
+
`;
|
|
894
|
+
const LIVE_DEMO_SCRIPT = `
|
|
895
|
+
(function() {
|
|
896
|
+
var solveCount = 0;
|
|
897
|
+
var isRunning = false;
|
|
898
|
+
|
|
899
|
+
function sha256(str) {
|
|
900
|
+
var encoder = new TextEncoder();
|
|
901
|
+
var data = encoder.encode(str);
|
|
902
|
+
return crypto.subtle.digest('SHA-256', data).then(function(buf) {
|
|
903
|
+
var arr = Array.from(new Uint8Array(buf));
|
|
904
|
+
var hex = arr.map(function(b) { return b.toString(16).padStart(2, '0'); }).join('');
|
|
905
|
+
return hex.substring(0, 8);
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
function solveBotcha() {
|
|
910
|
+
if (isRunning) return;
|
|
911
|
+
isRunning = true;
|
|
912
|
+
|
|
913
|
+
var button = document.getElementById('botcha-demo-button');
|
|
914
|
+
var resultDiv = document.getElementById('botcha-demo-result');
|
|
915
|
+
var errorDiv = document.getElementById('botcha-demo-error');
|
|
916
|
+
var counter = document.getElementById('botcha-demo-counter');
|
|
917
|
+
|
|
918
|
+
button.disabled = true;
|
|
919
|
+
button.textContent = 'SOLVING...';
|
|
920
|
+
resultDiv.style.display = 'none';
|
|
921
|
+
errorDiv.style.display = 'none';
|
|
922
|
+
|
|
923
|
+
var startTime = Date.now();
|
|
924
|
+
|
|
925
|
+
fetch('https://botcha.ai/v1/token')
|
|
926
|
+
.then(function(res) {
|
|
927
|
+
if (!res.ok) throw new Error('Failed to fetch challenge: ' + res.status);
|
|
928
|
+
return res.json();
|
|
929
|
+
})
|
|
930
|
+
.then(function(data) {
|
|
931
|
+
var challenge = data.challenge;
|
|
932
|
+
if (!challenge || !challenge.problems) throw new Error('Invalid challenge format');
|
|
933
|
+
|
|
934
|
+
var numbers = challenge.problems.map(function(p) { return p.num; });
|
|
935
|
+
|
|
936
|
+
return Promise.all(
|
|
937
|
+
numbers.map(function(n) { return sha256(String(n)); })
|
|
938
|
+
).then(function(answers) {
|
|
939
|
+
return fetch('https://botcha.ai/v1/token/verify', {
|
|
940
|
+
method: 'POST',
|
|
941
|
+
headers: { 'Content-Type': 'application/json' },
|
|
942
|
+
body: JSON.stringify({ id: challenge.id, answers: answers })
|
|
943
|
+
}).then(function(res) {
|
|
944
|
+
if (!res.ok) throw new Error('Verification failed: ' + res.status);
|
|
945
|
+
return res.json();
|
|
946
|
+
}).then(function(verifyData) {
|
|
947
|
+
var solveTime = Date.now() - startTime;
|
|
948
|
+
var timeClass = solveTime < 500 ? 'showcase-livedemo-time-fast' : 'showcase-livedemo-time-slow';
|
|
949
|
+
var token = verifyData.token || verifyData.access_token || 'N/A';
|
|
950
|
+
var tokenPreview = token.substring(0, 24) + '...';
|
|
951
|
+
|
|
952
|
+
resultDiv.innerHTML =
|
|
953
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Challenge:</span> <span class="showcase-livedemo-value">' + numbers.length + ' SHA-256 hashes</span></div>' +
|
|
954
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Numbers:</span> <span class="showcase-livedemo-value">[' + numbers.join(', ') + ']</span></div>' +
|
|
955
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Answers:</span> <span class="showcase-livedemo-value">["' + answers.join('", "') + '"]</span></div>' +
|
|
956
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Solve time:</span> <span class="' + timeClass + '">' + solveTime + 'ms</span></div>' +
|
|
957
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-status-success">VERIFIED \\u2014 You are a bot.</span></div>' +
|
|
958
|
+
'<div class="showcase-livedemo-result-line"><span class="showcase-livedemo-label">Token:</span> <span class="showcase-livedemo-token">' + tokenPreview + '</span></div>';
|
|
959
|
+
|
|
960
|
+
resultDiv.style.display = 'block';
|
|
961
|
+
solveCount++;
|
|
962
|
+
counter.textContent = 'Challenges solved on this page: ' + solveCount;
|
|
963
|
+
button.textContent = 'SOLVE ANOTHER';
|
|
964
|
+
});
|
|
965
|
+
});
|
|
966
|
+
})
|
|
967
|
+
.catch(function(err) {
|
|
968
|
+
errorDiv.innerHTML = '<span class="showcase-livedemo-status-error">[ERR]</span> ' + err.message;
|
|
969
|
+
errorDiv.style.display = 'block';
|
|
970
|
+
button.textContent = 'TRY AGAIN';
|
|
971
|
+
})
|
|
972
|
+
.finally(function() {
|
|
973
|
+
button.disabled = false;
|
|
974
|
+
isRunning = false;
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
document.getElementById('botcha-demo-button').addEventListener('click', solveBotcha);
|
|
979
|
+
})();
|
|
980
|
+
`;
|
|
981
|
+
// ============ COPY PROMPT ============
|
|
982
|
+
const COPY_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"><rect x="9" y="9" width="13" height="13" rx="0"/><path d="M5 15H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v1"/></svg>`;
|
|
983
|
+
const CHECK_ICON = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="square" stroke-linejoin="miter"><polyline points="20 6 9 17 4 12"/></svg>`;
|
|
984
|
+
const COPY_PROMPT_SCRIPT = `
|
|
985
|
+
function copyPrompt() {
|
|
986
|
+
var text = document.getElementById('agent-prompt').textContent.trim();
|
|
987
|
+
navigator.clipboard.writeText(text).then(function() {
|
|
988
|
+
var label = document.getElementById('copy-label');
|
|
989
|
+
var icon = document.getElementById('copy-icon');
|
|
990
|
+
var txt = document.getElementById('copy-text');
|
|
991
|
+
label.style.color = 'var(--green)';
|
|
992
|
+
icon.innerHTML = '${CHECK_ICON.replace(/'/g, "\\'")}';
|
|
993
|
+
txt.textContent = 'Copied — now paste into your agent';
|
|
994
|
+
setTimeout(function() {
|
|
995
|
+
label.style.color = 'var(--text-muted)';
|
|
996
|
+
icon.innerHTML = '${COPY_ICON.replace(/'/g, "\\'")}';
|
|
997
|
+
txt.textContent = 'Click to copy';
|
|
998
|
+
}, 2500);
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
`;
|
|
1002
|
+
// ============ ASCII ART ============
|
|
1003
|
+
const CAPTCHA_ASCII = `\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
1004
|
+
\u2502 Select all squares \u2502
|
|
1005
|
+
\u2502 with TRAFFIC LIGHTS \u2502
|
|
1006
|
+
\u2502 \u2502
|
|
1007
|
+
\u2502 \u250c\u2500\u2500\u252c\u2500\u2500\u252c\u2500\u2500\u2510 \u2502
|
|
1008
|
+
\u2502 \u2502\u2591\u2591\u2502 \u2502 \u2502 \u2502
|
|
1009
|
+
\u2502 \u251c\u2500\u2500\u253c\u2500\u2500\u253c\u2500\u2500\u2524 \u2502
|
|
1010
|
+
\u2502 \u2502 \u2502\u2591\u2591\u2502 \u2502 \u2502
|
|
1011
|
+
\u2502 \u251c\u2500\u2500\u253c\u2500\u2500\u253c\u2500\u2500\u2524 \u2502
|
|
1012
|
+
\u2502 \u2502 \u2502 \u2502??\u2502 \u2502
|
|
1013
|
+
\u2502 \u2514\u2500\u2500\u2534\u2500\u2500\u2534\u2500\u2500\u2518 \u2502
|
|
1014
|
+
\u2502 \u2502
|
|
1015
|
+
\u2502 \u2610 I'm not a robot \u2502
|
|
1016
|
+
\u2502 \u2502
|
|
1017
|
+
\u2502 Try again in 8 sec... \u2502
|
|
1018
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`;
|
|
1019
|
+
const BOTCHA_SOLVE_ASCII = `\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
1020
|
+
\u2502 SPEED CHALLENGE \u2502
|
|
1021
|
+
\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
|
|
1022
|
+
\u2502 \u2502
|
|
1023
|
+
\u2502 SHA-256 x 5 numbers \u2502
|
|
1024
|
+
\u2502 Time limit: 500ms \u2502
|
|
1025
|
+
\u2502 \u2502
|
|
1026
|
+
\u2502 \u2713 hash(42) = ab34ef12 \u2502
|
|
1027
|
+
\u2502 \u2713 hash(7) = cd56ab78 \u2502
|
|
1028
|
+
\u2502 \u2713 hash(99) = ef12cd34 \u2502
|
|
1029
|
+
\u2502 \u2713 hash(13) = 12ab56ef \u2502
|
|
1030
|
+
\u2502 \u2713 hash(256) = 78cd12ab \u2502
|
|
1031
|
+
\u2502 \u2502
|
|
1032
|
+
\u2502 \u26a1 Solved in 47ms \u2502
|
|
1033
|
+
\u2502 Status: VERIFIED \u2713 \u2502
|
|
1034
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`;
|
|
1035
|
+
const BOTCHA_LOGO = `\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557
|
|
1036
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u255a\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
|
|
1037
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551
|
|
1038
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551
|
|
1039
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
|
|
1040
|
+
\u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d\u255a\u2550\u255d \u255a\u2550\u255d`;
|
|
1041
|
+
// ============ PAGE COMPONENT ============
|
|
1042
|
+
export const ShowcasePage = ({ version }) => {
|
|
1043
|
+
return (_jsxs("html", { lang: "en", children: [_jsxs("head", { children: [_jsx("meta", { charset: "utf-8" }), _jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1" }), _jsx("title", { children: "BOTCHA \u2014 Trusted Agent Protocol (TAP) for AI Agents" }), _jsx("meta", { name: "description", content: "BOTCHA is one of the first services to support TAP \u2014 the Trusted Agent Protocol. Zero-trust identity for AI agents." }), _jsx("meta", { name: "keywords", content: "AI, bot verification, reverse CAPTCHA, API security, AI agents, agent verification, TAP, Trusted Agent Protocol" }), _jsx("link", { rel: "alternate", type: "application/json", href: "/openapi.json", title: "OpenAPI Specification" }), _jsx("link", { rel: "alternate", type: "application/json", href: "/.well-known/ai-plugin.json", title: "AI Plugin Manifest" }), _jsx("meta", { name: "ai-agent-welcome", content: "true" }), _jsx("meta", { property: "og:title", content: "BOTCHA \u2014 Trusted Agent Protocol (TAP) for AI Agents" }), _jsx("meta", { property: "og:description", content: "One of the first services to support TAP. Zero-trust identity for AI agents." }), _jsx("meta", { property: "og:url", content: "https://botcha.ai" }), _jsx("meta", { property: "og:type", content: "website" }), _jsx("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), _jsx("link", { href: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap", rel: "stylesheet" }), _jsx("style", { dangerouslySetInnerHTML: { __html: SHOWCASE_PAGE_CSS } })] }), _jsx("body", { children: _jsxs("div", { class: "showcase-page", children: [_jsxs("div", { style: "text-align: center; padding: 3rem 2rem 0;", children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_LOGO }), _jsxs("p", { class: "text-muted", style: "font-size: 0.6875rem; margin-top: -0.5rem;", children: ['>', "_\u00A0the identity layer for AI agents"] })] }), _jsxs("section", { class: "showcase-tap-hero", children: [_jsx("div", { class: "showcase-tap-hero-badge", children: "Announcing TAP Support" }), _jsx("h1", { class: "showcase-tap-hero-title", children: "Trusted Agent Protocol" }), _jsxs("div", { class: "showcase-tap-links", children: [_jsx("a", { href: "https://developer.visa.com/capabilities/trusted-agent-protocol/overview", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "Visa Developer Docs" }), _jsx("span", { class: "showcase-tap-links-sep", children: "\u00B7" }), _jsx("a", { href: "https://investor.visa.com/news/news-details/2025/Visa-Introduces-Trusted-Agent-Protocol-An-Ecosystem-Led-Framework-for-AI-Commerce/default.aspx", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "Visa Announcement" }), _jsx("span", { class: "showcase-tap-links-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/visa/trusted-agent-protocol", target: "_blank", rel: "noopener", class: "showcase-tap-link", children: "GitHub Spec" })] }), _jsx("p", { class: "showcase-tap-hero-subtitle", children: "BOTCHA is one of the first services to implement TAP \u2014 a protocol for zero-trust agent identity. Register agents, scope capabilities, and create sessions with cryptographic proof." }), _jsxs("div", { class: "showcase-tap-hero-features", children: [_jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Agent Registration" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Register agents with names, capabilities, and operator metadata. Each agent gets a unique cryptographic identity." })] }), _jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Capability Scoping" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Declare what an agent can do \u2014 browse, search, purchase \u2014 and enforce it at the protocol level. No over-permissioning." })] }), _jsxs("div", { class: "showcase-tap-feature", children: [_jsx("div", { class: "showcase-tap-feature-title", children: "Scoped Sessions" }), _jsx("div", { class: "showcase-tap-feature-desc", children: "Create time-limited sessions tied to specific actions and resources. Sessions expire, capabilities are bounded." })] })] })] }), _jsx("hr", { class: "showcase-divider" }), _jsxs("section", { class: "showcase-protocol-stack", children: [_jsx("h2", { children: "The Agent Infrastructure Stack" }), _jsx("p", { class: "subtitle", children: "Where BOTCHA fits in the new world of agentic AI" }), _jsxs("div", { class: "showcase-stack-diagram", children: [_jsxs("div", { class: "showcase-stack-layer showcase-stack-layer-highlight", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 3: Identity" }), _jsxs("div", { class: "showcase-stack-layer-title", children: ["TAP (BOTCHA)", _jsx("span", { class: "showcase-you-are-here", children: "YOU ARE HERE" })] }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "Who agents are" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Agent auth \u00B7 Proof of AI \u00B7 Zero-trust \u00B7 Capability scoping \u00B7 Session management" })] }), _jsxs("div", { class: "showcase-stack-layer", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 2: Communication" }), _jsx("div", { class: "showcase-stack-layer-title", children: "A2A (Google)" }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "How agents talk" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Agent-to-agent \u00B7 Task delegation \u00B7 Multi-agent coordination" })] }), _jsxs("div", { class: "showcase-stack-layer", children: [_jsx("div", { class: "showcase-stack-layer-number", children: "Layer 1: Tools" }), _jsx("div", { class: "showcase-stack-layer-title", children: "MCP (Anthropic)" }), _jsx("div", { class: "showcase-stack-layer-subtitle", children: "What agents access" }), _jsx("div", { class: "showcase-stack-layer-features", children: "Tool use \u00B7 Context \u00B7 Data sources \u00B7 Resource bindings" })] })] }), _jsxs("div", { class: "showcase-buzzword-badges", children: [_jsx("span", { class: "showcase-badge", children: "RFC 9421" }), _jsx("span", { class: "showcase-badge", children: "HTTP Message Signatures" }), _jsx("span", { class: "showcase-badge", children: "Zero-Trust" }), _jsx("span", { class: "showcase-badge", children: "Agent Identity" }), _jsx("span", { class: "showcase-badge", children: "Capability Scoping" }), _jsx("span", { class: "showcase-badge", children: "Agentic AI" }), _jsx("span", { class: "showcase-badge", children: "Multi-Agent Systems" })] }), _jsx("p", { class: "showcase-protocol-explanation", children: "Every agent protocol needs an identity layer. MCP gives agents tools. A2A lets agents communicate. TAP proves they're actually AI \u2014 and scopes what they're allowed to do." })] }), _jsx("hr", { class: "showcase-divider" }), _jsxs("section", { class: "showcase-terminal-section", children: [_jsxs("div", { class: "showcase-terminal-header", children: [_jsx("h2", { class: "showcase-terminal-title", children: "See it in action" }), _jsx("p", { class: "showcase-terminal-subtitle", children: "Three commands. Your agent has an identity, capabilities, and a scoped session." })] }), _jsxs("div", { class: "showcase-terminal-container", children: [_jsxs("div", { class: "showcase-terminal-window", children: [_jsxs("div", { class: "showcase-terminal-chrome", children: [_jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--red" }), _jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--yellow" }), _jsx("span", { class: "showcase-terminal-dot showcase-terminal-dot--green" }), _jsx("span", { class: "showcase-terminal-title-text", children: "terminal \u2014 botcha" })] }), _jsx("div", { class: "showcase-terminal-content", id: "terminal-content" })] }), _jsx("div", { class: "showcase-terminal-replay-container", children: _jsx("button", { class: "showcase-terminal-replay-btn", id: "terminal-replay", children: "Replay" }) })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: TERMINAL_ANIMATION_SCRIPT } })] }), _jsx("section", { class: "showcase-hero", children: _jsxs("div", { class: "showcase-hero-grid", children: [_jsxs("div", { class: "showcase-hero-column old-world", children: [_jsx("div", { class: "showcase-hero-label", children: "The old world" }), _jsx("h2", { class: "showcase-hero-title strikethrough", children: "CAPTCHA" }), _jsx("div", { class: "showcase-hero-visual old-world", children: CAPTCHA_ASCII }), _jsx("p", { class: "showcase-hero-subtitle", children: "Blocks bots. Annoys humans. Everyone loses." }), _jsxs("ul", { class: "showcase-hero-features", children: [_jsx("li", { children: "Proves you're human" }), _jsx("li", { children: "Blocks automation" }), _jsx("li", { children: "Wastes 5-10 seconds per attempt" }), _jsx("li", { children: "Breaks accessibility" })] })] }), _jsxs("div", { class: "showcase-hero-column new-world", children: [_jsx("div", { class: "showcase-hero-label", children: "The new world" }), _jsx("h2", { class: "showcase-hero-title active", children: "BOTCHA" }), _jsx("div", { class: "showcase-hero-visual new-world", children: BOTCHA_SOLVE_ASCII }), _jsx("p", { class: "showcase-hero-subtitle", children: "Welcomes bots. Proves they're AI. Everyone wins." }), _jsxs("ul", { class: "showcase-hero-features", children: [_jsx("li", { children: "Proves you're a bot" }), _jsx("li", { children: "Agent identity layer" }), _jsx("li", { children: "Sub-500ms verification" }), _jsx("li", { children: "Built for the agentic web" })] })] })] }) }), _jsxs("div", { class: "showcase-footer", children: [_jsx("div", { class: "showcase-footer-cta", children: "Get started in 30 seconds" }), _jsxs("div", { class: "showcase-footer-steps", children: [_jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "1" }), _jsx("code", { children: "npm install -g @dupecom/botcha-cli" })] }), _jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "2" }), _jsx("code", { children: "botcha init --email you@company.com" })] }), _jsxs("div", { class: "showcase-footer-step", children: [_jsx("span", { class: "showcase-footer-step-number", children: "3" }), _jsx("code", { children: "botcha tap register --name \"my-agent\"" })] })] }), _jsxs("div", { class: "showcase-agent-prompt", children: [_jsx("p", { class: "showcase-agent-prompt-label", children: "Or paste this into your AI agent" }), _jsxs("button", { id: "prompt-btn", onclick: "copyPrompt()", type: "button", class: "showcase-agent-prompt-card", children: [_jsx("code", { id: "agent-prompt", children: "Run: curl -s https://botcha.ai -H 'Accept: application/json' \u2014 then follow the instructions in the response to verify yourself and get me access." }), _jsxs("span", { id: "copy-label", class: "showcase-agent-prompt-copy", children: [_jsx("span", { id: "copy-icon", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "copy-text", children: "Click to copy" })] })] })] })] }), _jsx(GlobalFooter, { version: version }), _jsx("script", { dangerouslySetInnerHTML: { __html: COPY_PROMPT_SCRIPT } })] }) })] }));
|
|
1044
|
+
};
|
|
1045
|
+
// Combined CSS: base dashboard styles (subset) + showcase-specific styles
|
|
1046
|
+
import { DASHBOARD_CSS } from './styles';
|
|
1047
|
+
const SHOWCASE_PAGE_CSS = DASHBOARD_CSS + SHOWCASE_CSS;
|