@dupecom/botcha-cloudflare 0.20.2 → 0.23.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 (88) hide show
  1. package/README.md +74 -9
  2. package/dist/agent-auth.d.ts +129 -0
  3. package/dist/agent-auth.d.ts.map +1 -0
  4. package/dist/agent-auth.js +210 -0
  5. package/dist/agents.d.ts +10 -0
  6. package/dist/agents.d.ts.map +1 -1
  7. package/dist/agents.js +51 -1
  8. package/dist/app-gate.d.ts +6 -0
  9. package/dist/app-gate.d.ts.map +1 -0
  10. package/dist/app-gate.js +69 -0
  11. package/dist/apps.d.ts +13 -4
  12. package/dist/apps.d.ts.map +1 -1
  13. package/dist/apps.js +30 -4
  14. package/dist/dashboard/account.d.ts +63 -0
  15. package/dist/dashboard/account.d.ts.map +1 -0
  16. package/dist/dashboard/account.js +488 -0
  17. package/dist/dashboard/api.js +15 -68
  18. package/dist/dashboard/auth.d.ts.map +1 -1
  19. package/dist/dashboard/auth.js +14 -14
  20. package/dist/dashboard/docs.d.ts.map +1 -1
  21. package/dist/dashboard/docs.js +146 -3
  22. package/dist/dashboard/layout.d.ts.map +1 -1
  23. package/dist/dashboard/layout.js +2 -2
  24. package/dist/dashboard/mcp-setup.d.ts +15 -0
  25. package/dist/dashboard/mcp-setup.d.ts.map +1 -0
  26. package/dist/dashboard/mcp-setup.js +391 -0
  27. package/dist/dashboard/showcase.d.ts +6 -10
  28. package/dist/dashboard/showcase.d.ts.map +1 -1
  29. package/dist/dashboard/showcase.js +67 -991
  30. package/dist/dashboard/whitepaper.d.ts.map +1 -1
  31. package/dist/dashboard/whitepaper.js +42 -4
  32. package/dist/index.d.ts +5 -0
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +660 -83
  35. package/dist/mcp.d.ts +20 -0
  36. package/dist/mcp.d.ts.map +1 -0
  37. package/dist/mcp.js +1290 -0
  38. package/dist/oauth-agent.d.ts +130 -0
  39. package/dist/oauth-agent.d.ts.map +1 -0
  40. package/dist/oauth-agent.js +194 -0
  41. package/dist/static.d.ts +781 -5
  42. package/dist/static.d.ts.map +1 -1
  43. package/dist/static.js +790 -111
  44. package/dist/tap-a2a-routes.d.ts +355 -0
  45. package/dist/tap-a2a-routes.d.ts.map +1 -0
  46. package/dist/tap-a2a-routes.js +475 -0
  47. package/dist/tap-a2a.d.ts +199 -0
  48. package/dist/tap-a2a.d.ts.map +1 -0
  49. package/dist/tap-a2a.js +502 -0
  50. package/dist/tap-agents.d.ts +15 -0
  51. package/dist/tap-agents.d.ts.map +1 -1
  52. package/dist/tap-agents.js +31 -1
  53. package/dist/tap-ans-routes.d.ts +302 -0
  54. package/dist/tap-ans-routes.d.ts.map +1 -0
  55. package/dist/tap-ans-routes.js +535 -0
  56. package/dist/tap-ans.d.ts +241 -0
  57. package/dist/tap-ans.d.ts.map +1 -0
  58. package/dist/tap-ans.js +481 -0
  59. package/dist/tap-delegation-routes.d.ts.map +1 -1
  60. package/dist/tap-delegation-routes.js +11 -0
  61. package/dist/tap-did.d.ts +140 -0
  62. package/dist/tap-did.d.ts.map +1 -0
  63. package/dist/tap-did.js +262 -0
  64. package/dist/tap-oidca-routes.d.ts +383 -0
  65. package/dist/tap-oidca-routes.d.ts.map +1 -0
  66. package/dist/tap-oidca-routes.js +597 -0
  67. package/dist/tap-oidca.d.ts +288 -0
  68. package/dist/tap-oidca.d.ts.map +1 -0
  69. package/dist/tap-oidca.js +461 -0
  70. package/dist/tap-routes.d.ts +24 -8
  71. package/dist/tap-routes.d.ts.map +1 -1
  72. package/dist/tap-routes.js +169 -23
  73. package/dist/tap-vc-routes.d.ts +358 -0
  74. package/dist/tap-vc-routes.d.ts.map +1 -0
  75. package/dist/tap-vc-routes.js +367 -0
  76. package/dist/tap-vc.d.ts +125 -0
  77. package/dist/tap-vc.d.ts.map +1 -0
  78. package/dist/tap-vc.js +245 -0
  79. package/dist/tap-x402-routes.d.ts +89 -0
  80. package/dist/tap-x402-routes.d.ts.map +1 -0
  81. package/dist/tap-x402-routes.js +579 -0
  82. package/dist/tap-x402.d.ts +222 -0
  83. package/dist/tap-x402.d.ts.map +1 -0
  84. package/dist/tap-x402.js +546 -0
  85. package/dist/webhooks.d.ts +99 -0
  86. package/dist/webhooks.d.ts.map +1 -0
  87. package/dist/webhooks.js +642 -0
  88. package/package.json +3 -1
@@ -0,0 +1,391 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "hono/jsx/jsx-runtime";
2
+ import { DASHBOARD_CSS } from './styles';
3
+ import { GlobalFooter, OGMeta } from './layout';
4
+ // ============ CSS ============
5
+ const MCP_CSS = `
6
+ .mcp-page {
7
+ max-width: 860px;
8
+ margin: 0 auto;
9
+ padding: 3rem 2rem 4rem;
10
+ }
11
+
12
+ /* ---- Header ---- */
13
+ .mcp-header {
14
+ text-align: center;
15
+ margin-bottom: 3rem;
16
+ padding-bottom: 2rem;
17
+ border-bottom: 1px solid var(--border);
18
+ }
19
+
20
+ .mcp-badge {
21
+ display: inline-block;
22
+ font-size: 0.625rem;
23
+ font-weight: 700;
24
+ letter-spacing: 0.15em;
25
+ text-transform: uppercase;
26
+ padding: 0.3rem 0.875rem;
27
+ border: 1px solid var(--border);
28
+ color: var(--text-muted);
29
+ margin-bottom: 1.5rem;
30
+ }
31
+
32
+ .mcp-title {
33
+ font-size: 2rem;
34
+ font-weight: 700;
35
+ line-height: 1.15;
36
+ margin: 0 0 0.75rem;
37
+ color: var(--text);
38
+ }
39
+
40
+ .mcp-subtitle {
41
+ font-size: 0.875rem;
42
+ color: var(--text-muted);
43
+ line-height: 1.6;
44
+ margin: 0 auto 1.5rem;
45
+ max-width: 560px;
46
+ }
47
+
48
+ /* ---- One-liner hero ---- */
49
+ .mcp-oneliner {
50
+ margin: 0 auto 2.5rem;
51
+ max-width: 680px;
52
+ }
53
+
54
+ .mcp-oneliner-label {
55
+ font-size: 0.6875rem;
56
+ font-weight: 700;
57
+ letter-spacing: 0.1em;
58
+ text-transform: uppercase;
59
+ color: var(--text-muted);
60
+ margin-bottom: 0.5rem;
61
+ }
62
+
63
+ .mcp-oneliner-box {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: 0;
67
+ border: 1px solid var(--accent);
68
+ background: var(--bg-raised);
69
+ }
70
+
71
+ .mcp-oneliner-code {
72
+ flex: 1;
73
+ padding: 0.875rem 1rem;
74
+ font-family: var(--font);
75
+ font-size: 0.875rem;
76
+ color: var(--green);
77
+ overflow-x: auto;
78
+ white-space: nowrap;
79
+ }
80
+
81
+ .mcp-copy-btn {
82
+ padding: 0.875rem 1rem;
83
+ border: none;
84
+ border-left: 1px solid var(--accent);
85
+ background: var(--accent);
86
+ color: #fff;
87
+ font-family: var(--font);
88
+ font-size: 0.6875rem;
89
+ font-weight: 700;
90
+ letter-spacing: 0.08em;
91
+ text-transform: uppercase;
92
+ cursor: pointer;
93
+ white-space: nowrap;
94
+ transition: opacity 0.1s;
95
+ }
96
+
97
+ .mcp-copy-btn:hover { opacity: 0.75; }
98
+ .mcp-copy-btn.copied { background: var(--green); border-color: var(--green); }
99
+
100
+ /* ---- Tool tabs ---- */
101
+ .mcp-tabs {
102
+ display: flex;
103
+ flex-wrap: wrap;
104
+ gap: 0;
105
+ border: 1px solid var(--border);
106
+ border-bottom: none;
107
+ margin-bottom: 0;
108
+ }
109
+
110
+ .mcp-tab {
111
+ padding: 0.625rem 1rem;
112
+ font-family: var(--font);
113
+ font-size: 0.6875rem;
114
+ font-weight: 700;
115
+ letter-spacing: 0.08em;
116
+ text-transform: uppercase;
117
+ cursor: pointer;
118
+ border: none;
119
+ border-right: 1px solid var(--border);
120
+ border-bottom: 1px solid var(--border);
121
+ background: var(--bg-raised);
122
+ color: var(--text-muted);
123
+ transition: background 0.1s, color 0.1s;
124
+ }
125
+
126
+ .mcp-tab:last-child { border-right: none; }
127
+
128
+ .mcp-tab.active {
129
+ background: var(--bg);
130
+ color: var(--text);
131
+ border-bottom-color: var(--bg);
132
+ }
133
+
134
+ .mcp-tab:hover:not(.active) {
135
+ color: var(--text);
136
+ background: var(--bg);
137
+ }
138
+
139
+ /* ---- Tool panels ---- */
140
+ .mcp-panels {
141
+ border: 1px solid var(--border);
142
+ margin-bottom: 2.5rem;
143
+ }
144
+
145
+ .mcp-panel {
146
+ display: none;
147
+ padding: 1.5rem;
148
+ }
149
+
150
+ .mcp-panel.active { display: block; }
151
+
152
+ .mcp-panel-title {
153
+ font-size: 0.75rem;
154
+ font-weight: 700;
155
+ letter-spacing: 0.06em;
156
+ text-transform: uppercase;
157
+ color: var(--text-muted);
158
+ margin-bottom: 0.5rem;
159
+ }
160
+
161
+ .mcp-panel-desc {
162
+ font-size: 0.8125rem;
163
+ color: var(--text-muted);
164
+ line-height: 1.6;
165
+ margin-bottom: 1.25rem;
166
+ }
167
+
168
+ .mcp-panel-desc a {
169
+ color: var(--text-muted);
170
+ }
171
+
172
+ .mcp-snippet-wrap {
173
+ position: relative;
174
+ margin-bottom: 1rem;
175
+ }
176
+
177
+ .mcp-snippet-label {
178
+ font-size: 0.625rem;
179
+ font-weight: 700;
180
+ letter-spacing: 0.1em;
181
+ text-transform: uppercase;
182
+ color: var(--text-dim);
183
+ margin-bottom: 0.375rem;
184
+ }
185
+
186
+ .mcp-snippet {
187
+ background: var(--bg-raised);
188
+ border: 1px solid var(--border);
189
+ padding: 1rem 1.25rem;
190
+ font-size: 0.8125rem;
191
+ color: var(--text);
192
+ white-space: pre;
193
+ overflow-x: auto;
194
+ line-height: 1.5;
195
+ font-family: var(--font);
196
+ }
197
+
198
+ .mcp-snippet-footer {
199
+ display: flex;
200
+ justify-content: flex-end;
201
+ margin-top: 0.5rem;
202
+ }
203
+
204
+ .mcp-snippet-copy {
205
+ padding: 0.3rem 0.75rem;
206
+ border: 1px solid var(--border);
207
+ background: var(--bg);
208
+ color: var(--text-muted);
209
+ font-family: var(--font);
210
+ font-size: 0.625rem;
211
+ font-weight: 700;
212
+ letter-spacing: 0.08em;
213
+ text-transform: uppercase;
214
+ cursor: pointer;
215
+ transition: border-color 0.1s, color 0.1s;
216
+ }
217
+
218
+ .mcp-snippet-copy:hover { border-color: var(--accent); color: var(--text); }
219
+ .mcp-snippet-copy.copied { border-color: var(--green); color: var(--green); }
220
+
221
+ .mcp-config-path {
222
+ font-size: 0.6875rem;
223
+ color: var(--text-dim);
224
+ margin-top: 0.375rem;
225
+ margin-bottom: 1rem;
226
+ }
227
+
228
+ .mcp-config-path code {
229
+ color: var(--text-muted);
230
+ font-size: 0.6875rem;
231
+ }
232
+
233
+ /* ---- Info strip ---- */
234
+ .mcp-info {
235
+ border: 1px solid var(--border);
236
+ padding: 1.25rem 1.5rem;
237
+ margin-bottom: 2rem;
238
+ display: grid;
239
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
240
+ gap: 1rem;
241
+ }
242
+
243
+ .mcp-info-item {}
244
+
245
+ .mcp-info-label {
246
+ font-size: 0.625rem;
247
+ font-weight: 700;
248
+ letter-spacing: 0.1em;
249
+ text-transform: uppercase;
250
+ color: var(--text-dim);
251
+ margin-bottom: 0.25rem;
252
+ }
253
+
254
+ .mcp-info-value {
255
+ font-size: 0.8125rem;
256
+ color: var(--text);
257
+ }
258
+
259
+ .mcp-info-value a { color: var(--text); }
260
+
261
+ /* ---- Tools table ---- */
262
+ .mcp-tools-title {
263
+ font-size: 0.75rem;
264
+ font-weight: 700;
265
+ letter-spacing: 0.1em;
266
+ text-transform: uppercase;
267
+ color: var(--text-muted);
268
+ margin-bottom: 0.75rem;
269
+ margin-top: 2rem;
270
+ }
271
+
272
+ .mcp-tools-grid {
273
+ display: grid;
274
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
275
+ gap: 0.5rem;
276
+ margin-bottom: 2rem;
277
+ }
278
+
279
+ .mcp-tool-card {
280
+ border: 1px solid var(--border);
281
+ padding: 0.875rem 1rem;
282
+ }
283
+
284
+ .mcp-tool-name {
285
+ font-size: 0.75rem;
286
+ font-weight: 700;
287
+ color: var(--text);
288
+ margin-bottom: 0.25rem;
289
+ }
290
+
291
+ .mcp-tool-name code {
292
+ font-size: 0.6875rem;
293
+ color: var(--green);
294
+ }
295
+
296
+ .mcp-tool-desc {
297
+ font-size: 0.75rem;
298
+ color: var(--text-muted);
299
+ line-height: 1.5;
300
+ }
301
+
302
+ @media (max-width: 600px) {
303
+ .mcp-title { font-size: 1.5rem; }
304
+ .mcp-oneliner-code { font-size: 0.75rem; }
305
+ .mcp-tab { padding: 0.5rem 0.625rem; font-size: 0.5625rem; }
306
+ }
307
+ `;
308
+ // ============ SNIPPET CONTENT ============
309
+ const SNIPPETS = {
310
+ claudeCode: {
311
+ cli: `claude mcp add --transport http botcha https://botcha.ai/mcp`,
312
+ json: `{
313
+ "mcpServers": {
314
+ "botcha": {
315
+ "type": "http",
316
+ "url": "https://botcha.ai/mcp"
317
+ }
318
+ }
319
+ }`,
320
+ },
321
+ claudeDesktop: `{
322
+ "mcpServers": {
323
+ "botcha": {
324
+ "type": "http",
325
+ "url": "https://botcha.ai/mcp"
326
+ }
327
+ }
328
+ }`,
329
+ opencode: `{
330
+ "$schema": "https://opencode.ai/config.json",
331
+ "mcp": {
332
+ "botcha": {
333
+ "type": "remote",
334
+ "url": "https://botcha.ai/mcp",
335
+ "enabled": true
336
+ }
337
+ }
338
+ }`,
339
+ cursor: `{
340
+ "mcpServers": {
341
+ "botcha": {
342
+ "url": "https://botcha.ai/mcp"
343
+ }
344
+ }
345
+ }`,
346
+ windsurf: `{
347
+ "mcpServers": {
348
+ "botcha": {
349
+ "serverUrl": "https://botcha.ai/mcp"
350
+ }
351
+ }
352
+ }`,
353
+ generic: `{
354
+ "mcpServers": {
355
+ "botcha": {
356
+ "type": "http",
357
+ "url": "https://botcha.ai/mcp"
358
+ }
359
+ }
360
+ }`,
361
+ };
362
+ // ============ COMPONENT ============
363
+ export const MCPSetupPage = ({ version = '0.22.0' }) => {
364
+ 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.0" }), _jsx("title", { children: "BOTCHA MCP Server \u2014 Add to Your AI Agent" }), _jsx(OGMeta, { title: "BOTCHA MCP Server", description: "Add BOTCHA to Claude Code, Claude Desktop, OpenCode, Cursor, or Windsurf in one command. Read-only documentation server \u2014 no auth required.", url: "https://botcha.ai/mcp" }), _jsx("style", { dangerouslySetInnerHTML: { __html: DASHBOARD_CSS + MCP_CSS } })] }), _jsxs("body", { children: [_jsxs("main", { class: "mcp-page", children: [_jsxs("header", { class: "mcp-header", children: [_jsx("div", { class: "mcp-badge", children: "MCP Server" }), _jsx("h1", { class: "mcp-title", children: "Add BOTCHA to your agent" }), _jsxs("p", { class: "mcp-subtitle", children: ["BOTCHA exposes its full API reference as an", ' ', _jsx("a", { href: "https://modelcontextprotocol.io/specification/2025-03-26", target: "_blank", rel: "noopener", children: "MCP (2025-03-26)" }), ' ', "server. Ask it anything about BOTCHA features, endpoints, or get code examples. No authentication required."] })] }), _jsxs("div", { class: "mcp-oneliner", children: [_jsx("div", { class: "mcp-oneliner-label", children: "Fastest way \u2014 Claude Code CLI" }), _jsxs("div", { class: "mcp-oneliner-box", children: [_jsx("div", { class: "mcp-oneliner-code", id: "oneliner-text", children: SNIPPETS.claudeCode.cli }), _jsx("button", { class: "mcp-copy-btn", id: "oneliner-copy", onclick: "copyText('oneliner-text', 'oneliner-copy')", children: "Copy" })] })] }), _jsxs("div", { class: "mcp-info", children: [_jsxs("div", { class: "mcp-info-item", children: [_jsx("div", { class: "mcp-info-label", children: "Endpoint" }), _jsx("div", { class: "mcp-info-value", children: _jsx("a", { href: "/mcp", children: "https://botcha.ai/mcp" }) })] }), _jsxs("div", { class: "mcp-info-item", children: [_jsx("div", { class: "mcp-info-label", children: "Transport" }), _jsx("div", { class: "mcp-info-value", children: "Streamable HTTP" })] }), _jsxs("div", { class: "mcp-info-item", children: [_jsx("div", { class: "mcp-info-label", children: "Auth" }), _jsx("div", { class: "mcp-info-value", children: "None \u2014 read-only docs server" })] }), _jsxs("div", { class: "mcp-info-item", children: [_jsx("div", { class: "mcp-info-label", children: "Discovery" }), _jsx("div", { class: "mcp-info-value", children: _jsx("a", { href: "/.well-known/mcp.json", children: "/.well-known/mcp.json" }) })] })] }), _jsxs("div", { class: "mcp-tabs", id: "mcp-tabs", role: "tablist", children: [_jsx("button", { class: "mcp-tab active", onclick: "switchTab('claude-code')", role: "tab", children: "Claude Code" }), _jsx("button", { class: "mcp-tab", onclick: "switchTab('claude-desktop')", role: "tab", children: "Claude Desktop" }), _jsx("button", { class: "mcp-tab", onclick: "switchTab('opencode')", role: "tab", children: "OpenCode" }), _jsx("button", { class: "mcp-tab", onclick: "switchTab('cursor')", role: "tab", children: "Cursor" }), _jsx("button", { class: "mcp-tab", onclick: "switchTab('windsurf')", role: "tab", children: "Windsurf" }), _jsx("button", { class: "mcp-tab", onclick: "switchTab('generic')", role: "tab", children: ".mcp.json" })] }), _jsxs("div", { class: "mcp-panels", children: [_jsxs("div", { class: "mcp-panel active", id: "panel-claude-code", children: [_jsx("div", { class: "mcp-panel-title", children: "Claude Code" }), _jsxs("p", { class: "mcp-panel-desc", children: ["Run this command once \u2014 it adds BOTCHA to your user-scoped MCP config (", _jsx("code", { children: "~/.claude.json" }), "). Available across all your projects."] }), _jsx("div", { class: "mcp-snippet-label", children: "Terminal" }), _jsx("div", { class: "mcp-snippet", id: "cc-cli", children: SNIPPETS.claudeCode.cli }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('cc-cli', this)", children: "Copy" }) }), _jsxs("p", { class: "mcp-panel-desc", style: "margin-top: 1.25rem;", children: ["Or share with your team by checking a ", _jsx("code", { children: ".mcp.json" }), " file into your project root:"] }), _jsx("div", { class: "mcp-snippet-label", children: ".mcp.json (project root)" }), _jsx("div", { class: "mcp-snippet", id: "cc-json", children: SNIPPETS.claudeCode.json }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('cc-json', this)", children: "Copy" }) })] }), _jsxs("div", { class: "mcp-panel", id: "panel-claude-desktop", children: [_jsx("div", { class: "mcp-panel-title", children: "Claude Desktop" }), _jsx("p", { class: "mcp-panel-desc", children: "Add to your Claude Desktop config file, then restart the app." }), _jsxs("div", { class: "mcp-config-path", children: ["macOS: ", _jsx("code", { children: "~/Library/Application Support/Claude/claude_desktop_config.json" }), _jsx("br", {}), "Windows: ", _jsx("code", { children: "%APPDATA%\\Claude\\claude_desktop_config.json" })] }), _jsx("div", { class: "mcp-snippet-label", children: "claude_desktop_config.json" }), _jsx("div", { class: "mcp-snippet", id: "cd-json", children: SNIPPETS.claudeDesktop }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('cd-json', this)", children: "Copy" }) })] }), _jsxs("div", { class: "mcp-panel", id: "panel-opencode", children: [_jsx("div", { class: "mcp-panel-title", children: "OpenCode" }), _jsxs("p", { class: "mcp-panel-desc", children: ["Add to your", ' ', _jsx("a", { href: "https://opencode.ai/docs/mcp-servers/", target: "_blank", rel: "noopener", children: "OpenCode config" }), ". Global config is at ", _jsx("code", { children: "~/.config/opencode/config.json" }), ", or create ", _jsx("code", { children: "opencode.json" }), " in your project root for per-project config."] }), _jsx("div", { class: "mcp-snippet-label", children: "opencode.json / ~/.config/opencode/config.json" }), _jsx("div", { class: "mcp-snippet", id: "oc-json", children: SNIPPETS.opencode }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('oc-json', this)", children: "Copy" }) })] }), _jsxs("div", { class: "mcp-panel", id: "panel-cursor", children: [_jsx("div", { class: "mcp-panel-title", children: "Cursor" }), _jsxs("p", { class: "mcp-panel-desc", children: ["Add to your Cursor MCP config. Project-level: ", _jsx("code", { children: ".cursor/mcp.json" }), ". Global: ", _jsx("code", { children: "~/.cursor/mcp.json" }), ". Or use ", _jsx("strong", { children: "Cursor Settings \u2192 MCP" }), " to add a remote server."] }), _jsx("div", { class: "mcp-snippet-label", children: ".cursor/mcp.json" }), _jsx("div", { class: "mcp-snippet", id: "cursor-json", children: SNIPPETS.cursor }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('cursor-json', this)", children: "Copy" }) })] }), _jsxs("div", { class: "mcp-panel", id: "panel-windsurf", children: [_jsx("div", { class: "mcp-panel-title", children: "Windsurf (Cascade)" }), _jsxs("p", { class: "mcp-panel-desc", children: ["Add to ", _jsx("code", { children: "~/.codeium/windsurf/mcp_config.json" }), ". Windsurf uses ", _jsx("code", { children: "serverUrl" }), " for remote HTTP MCP servers. You can also add it via ", _jsx("strong", { children: "MCP Marketplace \u2192 Add custom" }), " in the Cascade panel."] }), _jsx("div", { class: "mcp-snippet-label", children: "~/.codeium/windsurf/mcp_config.json" }), _jsx("div", { class: "mcp-snippet", id: "ws-json", children: SNIPPETS.windsurf }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('ws-json', this)", children: "Copy" }) })] }), _jsxs("div", { class: "mcp-panel", id: "panel-generic", children: [_jsx("div", { class: "mcp-panel-title", children: "Generic .mcp.json" }), _jsxs("p", { class: "mcp-panel-desc", children: ["Standard MCP 2025-03-26 config compatible with any Streamable HTTP client. Drop this into your project's ", _jsx("code", { children: ".mcp.json" }), " or your agent's config directory."] }), _jsx("div", { class: "mcp-snippet-label", children: ".mcp.json" }), _jsx("div", { class: "mcp-snippet", id: "gen-json", children: SNIPPETS.generic }), _jsx("div", { class: "mcp-snippet-footer", children: _jsx("button", { class: "mcp-snippet-copy", onclick: "copyText('gen-json', this)", children: "Copy" }) })] })] }), _jsx("div", { class: "mcp-tools-title", children: "Available Tools" }), _jsxs("div", { class: "mcp-tools-grid", children: [_jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "list_features" }) }), _jsx("div", { class: "mcp-tool-desc", children: "List all 17 BOTCHA features with category and summary" })] }), _jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "get_feature" }) }), _jsx("div", { class: "mcp-tool-desc", children: "Full detail on a feature \u2014 endpoints, spec links, usage notes" })] }), _jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "search_docs" }) }), _jsx("div", { class: "mcp-tool-desc", children: "Keyword search across all features and endpoint descriptions" })] }), _jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "list_endpoints" }) }), _jsx("div", { class: "mcp-tool-desc", children: "All 25+ API endpoints grouped by category" })] }), _jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "get_endpoint" }) }), _jsx("div", { class: "mcp-tool-desc", children: "Auth, params, request/response shape for one endpoint" })] }), _jsxs("div", { class: "mcp-tool-card", children: [_jsx("div", { class: "mcp-tool-name", children: _jsx("code", { children: "get_example" }) }), _jsx("div", { class: "mcp-tool-desc", children: "Code example in TypeScript, Python, or curl" })] })] }), _jsxs("p", { style: "font-size: 0.75rem; color: var(--text-dim); text-align: center;", children: [_jsx("a", { href: "/docs#mcp", children: "Full docs" }), ' · ', _jsx("a", { href: "/.well-known/mcp.json", children: "Discovery JSON" }), ' · ', _jsx("a", { href: "/openapi.json", children: "OpenAPI" }), ' · ', _jsx("a", { href: "/ai.txt", children: "ai.txt" }), ' · ', _jsx("a", { href: "https://github.com/dupe-com/botcha", target: "_blank", rel: "noopener", children: "GitHub" })] })] }), _jsx(GlobalFooter, {}), _jsx("script", { dangerouslySetInnerHTML: { __html: `
365
+ function switchTab(id) {
366
+ document.querySelectorAll('.mcp-tab').forEach(function(t, i) {
367
+ var panels = ['claude-code','claude-desktop','opencode','cursor','windsurf','generic'];
368
+ t.classList.toggle('active', panels[i] === id);
369
+ });
370
+ document.querySelectorAll('.mcp-panel').forEach(function(p) {
371
+ p.classList.toggle('active', p.id === 'panel-' + id);
372
+ });
373
+ }
374
+
375
+ function copyText(sourceId, btn) {
376
+ var el = document.getElementById(sourceId);
377
+ var text = el ? el.textContent : '';
378
+ navigator.clipboard.writeText(text.trim()).then(function() {
379
+ var b = typeof btn === 'string' ? document.getElementById(btn) : btn;
380
+ if (!b) return;
381
+ var orig = b.textContent;
382
+ b.textContent = 'Copied!';
383
+ b.classList.add('copied');
384
+ setTimeout(function() {
385
+ b.textContent = orig;
386
+ b.classList.remove('copied');
387
+ }, 1800);
388
+ });
389
+ }
390
+ ` } })] })] }));
391
+ };
@@ -1,20 +1,16 @@
1
1
  /**
2
- * BOTCHA Showcase Page
2
+ * BOTCHA Homepage
3
3
  *
4
- * Visual explainer at /showcase shows what BOTCHA is, how it works,
5
- * where it fits in the agent infrastructure stack, and lets visitors
6
- * solve a live challenge.
4
+ * Served at GET / for HTML (browser) requests.
7
5
  *
8
- * Sections:
9
- * 1. Hero side-by-side CAPTCHA vs BOTCHA comparison
10
- * 2. Protocol Stack MCP / A2A / TAP positioning
11
- * 3. Terminal Demo — animated CLI walkthrough
12
- * 4. Live Demo — interactive challenge solver
6
+ * Deliberately minimal — this site is for agents.
7
+ * Humans should point their agent at botcha.ai; the agent
8
+ * auto-discovers everything via ai.txt, OpenAPI, and MCP.
13
9
  */
14
10
  import type { FC } from 'hono/jsx';
15
- export declare const SHOWCASE_CSS = "\n /* ============ Showcase layout ============ */\n .showcase-page {\n max-width: 100%;\n overflow-x: hidden;\n }\n\n .showcase-divider {\n max-width: 800px;\n margin: 0 auto;\n border: none;\n border-top: 1px solid var(--border);\n }\n\n /* ============ Section 1: TAP Announcement Hero ============ */\n .showcase-tap-hero {\n max-width: 800px;\n margin: 0 auto;\n padding: 4rem 2rem 3rem;\n text-align: center;\n }\n\n .showcase-tap-hero-badge {\n display: inline-block;\n font-size: 0.625rem;\n font-weight: 700;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n padding: 0.3rem 0.875rem;\n background: var(--green);\n color: #fff;\n margin-bottom: 1.5rem;\n }\n\n .showcase-tap-hero-title {\n font-size: 2.5rem;\n font-weight: 700;\n line-height: 1.1;\n margin: 0 0 1.25rem;\n color: var(--text);\n }\n\n .showcase-tap-links {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-wrap: wrap;\n gap: 0.375rem;\n margin-bottom: 1.5rem;\n }\n\n .showcase-tap-link {\n font-size: 0.6875rem;\n color: var(--text-muted);\n text-decoration: underline;\n text-underline-offset: 3px;\n transition: color 0.15s;\n }\n\n .showcase-tap-link:hover {\n color: var(--green);\n opacity: 1;\n }\n\n .showcase-tap-links-sep {\n color: var(--text-dim);\n font-size: 0.625rem;\n }\n\n .showcase-tap-hero-subtitle {\n font-size: 0.9375rem;\n line-height: 1.7;\n color: var(--text-muted);\n max-width: 600px;\n margin: 0 auto 2.5rem;\n }\n\n .showcase-tap-hero-features {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 1.5rem;\n text-align: left;\n }\n\n .showcase-tap-feature {\n padding: 1.25rem;\n border: 1px solid var(--border);\n background: var(--bg);\n }\n\n .showcase-tap-feature-title {\n font-size: 0.8125rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-tap-feature-desc {\n font-size: 0.75rem;\n line-height: 1.6;\n color: var(--text-muted);\n }\n\n /* ============ CAPTCHA vs BOTCHA Comparison ============ */\n .showcase-hero {\n max-width: 1100px;\n margin: 0 auto;\n padding: 4rem 2rem 2rem;\n }\n\n .showcase-hero-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 2rem;\n margin-bottom: 3rem;\n }\n\n .showcase-hero-column {\n border: 2px solid var(--border);\n padding: 2rem;\n background: var(--bg);\n }\n\n .showcase-hero-column.old-world {\n border-color: var(--red);\n }\n\n .showcase-hero-column.new-world {\n border-color: var(--green);\n }\n\n .showcase-hero-label {\n font-size: 0.6875rem;\n font-weight: 700;\n letter-spacing: 0.15em;\n text-transform: uppercase;\n margin-bottom: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-hero-title {\n font-size: 2rem;\n font-weight: 700;\n margin-bottom: 1.25rem;\n line-height: 1;\n }\n\n .showcase-hero-title.strikethrough {\n text-decoration: line-through;\n color: var(--red);\n }\n\n .showcase-hero-title.active {\n color: var(--green);\n }\n\n .showcase-hero-visual {\n font-family: var(--font);\n font-size: 0.6875rem;\n line-height: 1.3;\n margin: 1.25rem 0;\n padding: 1rem;\n background: #fafafa;\n border: 1px solid var(--border);\n white-space: pre;\n overflow-x: auto;\n }\n\n .showcase-hero-visual.old-world {\n color: var(--red);\n border-color: var(--red);\n background: #fff5f5;\n }\n\n .showcase-hero-visual.new-world {\n color: var(--green);\n border-color: var(--green);\n background: #f5fff7;\n }\n\n .showcase-hero-subtitle {\n font-size: 0.875rem;\n margin-bottom: 1rem;\n line-height: 1.5;\n color: var(--text);\n }\n\n .showcase-hero-features {\n list-style: none;\n padding: 0;\n margin: 0;\n font-size: 0.75rem;\n color: var(--text-muted);\n }\n\n .showcase-hero-features li {\n padding: 0.25rem 0;\n }\n\n .showcase-hero-features li::before {\n content: \"\\2192 \";\n color: var(--text-dim);\n }\n\n .showcase-hero-tagline {\n text-align: center;\n padding: 2rem 2rem 0;\n }\n\n .showcase-hero-tagline-main {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-hero-tagline-sub {\n font-size: 0.875rem;\n color: var(--text-muted);\n }\n\n /* ============ Section 2: Protocol Stack ============ */\n .showcase-protocol-stack {\n max-width: 800px;\n margin: 0 auto;\n padding: 4rem 2rem;\n }\n\n .showcase-protocol-stack h2 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n }\n\n .showcase-protocol-stack .subtitle {\n color: var(--text-muted);\n font-size: 0.875rem;\n margin-bottom: 2.5rem;\n }\n\n .showcase-stack-diagram {\n position: relative;\n margin: 0 0 2rem 0;\n }\n\n .showcase-stack-layer {\n border: 2px solid var(--border);\n background: var(--bg);\n padding: 1.25rem 1.5rem;\n position: relative;\n }\n\n .showcase-stack-layer + .showcase-stack-layer {\n margin-top: -2px;\n }\n\n .showcase-stack-layer-highlight {\n border: 3px solid var(--accent);\n background: var(--bg-raised);\n z-index: 1;\n }\n\n .showcase-stack-layer-number {\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--text-dim);\n margin-bottom: 0.375rem;\n }\n\n .showcase-stack-layer-highlight .showcase-stack-layer-number {\n color: var(--green);\n }\n\n .showcase-stack-layer-title {\n font-size: 1.125rem;\n font-weight: 700;\n margin-bottom: 0.25rem;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .showcase-stack-layer-subtitle {\n font-size: 0.8125rem;\n color: var(--text-muted);\n margin-bottom: 0.375rem;\n }\n\n .showcase-stack-layer-features {\n font-size: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-you-are-here {\n display: inline-block;\n background: var(--green);\n color: white;\n font-size: 0.5625rem;\n font-weight: 700;\n padding: 0.2rem 0.5rem;\n letter-spacing: 0.05em;\n }\n\n .showcase-buzzword-badges {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-bottom: 2rem;\n }\n\n .showcase-badge {\n display: inline-block;\n font-size: 0.6875rem;\n padding: 0.3rem 0.625rem;\n border: 1px solid var(--border);\n background: var(--bg);\n color: var(--text-muted);\n white-space: nowrap;\n }\n\n .showcase-protocol-explanation {\n font-size: 0.8125rem;\n line-height: 1.7;\n color: var(--text-muted);\n }\n\n /* ============ Section 3: Terminal Demo ============ */\n .showcase-terminal-section {\n max-width: 1100px;\n margin: 0 auto;\n padding: 4rem 2rem;\n }\n\n .showcase-terminal-header {\n text-align: center;\n margin-bottom: 2.5rem;\n }\n\n .showcase-terminal-title {\n font-size: 1.5rem;\n font-weight: 700;\n margin: 0 0 0.5rem 0;\n color: var(--text);\n }\n\n .showcase-terminal-subtitle {\n font-size: 0.875rem;\n color: var(--text-muted);\n margin: 0;\n line-height: 1.5;\n }\n\n .showcase-terminal-container {\n max-width: 640px;\n margin: 0 auto;\n }\n\n .showcase-terminal-window {\n background: #0d0d0d;\n border: 1px solid var(--border);\n overflow: hidden;\n }\n\n .showcase-terminal-chrome {\n background: #1a1a1a;\n padding: 0.75rem 1rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n border-bottom: 1px solid #333;\n }\n\n .showcase-terminal-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n }\n\n .showcase-terminal-dot--red { background: #ff5f56; }\n .showcase-terminal-dot--yellow { background: #ffbd2e; }\n .showcase-terminal-dot--green { background: #27c93f; }\n\n .showcase-terminal-title-text {\n font-size: 0.6875rem;\n color: #888;\n margin-left: 0.5rem;\n }\n\n .showcase-terminal-content {\n padding: 1.5rem;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: #f0f0f0;\n height: 460px;\n overflow-y: hidden;\n font-family: var(--font);\n }\n\n .showcase-terminal-line {\n margin-bottom: 0.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .showcase-terminal-prompt { color: #888; }\n .showcase-terminal-command { color: #f0f0f0; }\n .showcase-terminal-flag { color: #9a9aff; }\n .showcase-terminal-success { color: #4ade80; }\n .showcase-terminal-label { color: #888; }\n .showcase-terminal-value { color: #fff; }\n\n .showcase-terminal-cursor {\n display: inline-block;\n background: #f0f0f0;\n animation: showcase-cursor-blink 1s step-end infinite;\n }\n\n @keyframes showcase-cursor-blink {\n 0%, 50% { opacity: 1; }\n 51%, 100% { opacity: 0; }\n }\n\n .showcase-terminal-replay-container {\n text-align: center;\n margin-top: 1.5rem;\n }\n\n .showcase-terminal-replay-btn {\n background: var(--bg);\n border: 1px solid var(--border);\n padding: 0.5rem 1rem;\n font-family: var(--font);\n font-size: 0.75rem;\n color: var(--text-muted);\n cursor: pointer;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .showcase-terminal-replay-btn:hover {\n border-color: var(--accent);\n color: var(--text);\n }\n\n /* ============ Section 4: Live Demo ============ */\n .showcase-livedemo {\n padding: 4rem 2rem;\n background: var(--bg-raised);\n border-top: 2px solid var(--border);\n border-bottom: 2px solid var(--border);\n }\n\n .showcase-livedemo-container {\n max-width: 700px;\n margin: 0 auto;\n text-align: center;\n }\n\n .showcase-livedemo-title {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n color: var(--text);\n }\n\n .showcase-livedemo-subtitle {\n font-size: 0.875rem;\n color: var(--text-muted);\n margin-bottom: 2.5rem;\n line-height: 1.6;\n }\n\n .showcase-livedemo-button {\n display: inline-block;\n padding: 1rem 2rem;\n font-size: 0.875rem;\n font-weight: 700;\n font-family: var(--font);\n color: #fff;\n background: var(--accent);\n border: 2px solid var(--accent);\n cursor: pointer;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n box-shadow: 4px 4px 0 var(--border-bright);\n transition: all 0.15s;\n margin-bottom: 1.5rem;\n }\n\n .showcase-livedemo-button:hover:not(:disabled) {\n transform: translate(-2px, -2px);\n box-shadow: 6px 6px 0 var(--border-bright);\n opacity: 1;\n }\n\n .showcase-livedemo-button:active:not(:disabled) {\n transform: translate(2px, 2px);\n box-shadow: 2px 2px 0 var(--border-bright);\n }\n\n .showcase-livedemo-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .showcase-livedemo-result {\n margin-top: 2rem;\n padding: 1.5rem;\n background: var(--bg);\n border: 2px solid var(--border);\n box-shadow: 4px 4px 0 var(--border-bright);\n text-align: left;\n font-size: 0.8125rem;\n line-height: 1.8;\n }\n\n .showcase-livedemo-result-line {\n opacity: 0;\n animation: showcase-livedemo-fadein 0.3s ease forwards;\n margin-bottom: 0.375rem;\n }\n\n .showcase-livedemo-result-line:nth-child(1) { animation-delay: 0ms; }\n .showcase-livedemo-result-line:nth-child(2) { animation-delay: 100ms; }\n .showcase-livedemo-result-line:nth-child(3) { animation-delay: 200ms; }\n .showcase-livedemo-result-line:nth-child(4) { animation-delay: 300ms; }\n .showcase-livedemo-result-line:nth-child(5) { animation-delay: 400ms; }\n .showcase-livedemo-result-line:nth-child(6) { animation-delay: 500ms; }\n .showcase-livedemo-result-line:nth-child(7) { animation-delay: 600ms; }\n\n @keyframes showcase-livedemo-fadein {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .showcase-livedemo-label {\n color: var(--text-dim);\n font-weight: 600;\n }\n\n .showcase-livedemo-value {\n color: var(--text);\n }\n\n .showcase-livedemo-time-fast {\n color: var(--green);\n font-weight: 700;\n }\n\n .showcase-livedemo-time-slow {\n color: var(--red);\n font-weight: 700;\n }\n\n .showcase-livedemo-status-success {\n color: var(--green);\n font-weight: 700;\n font-size: 1rem;\n }\n\n .showcase-livedemo-status-error {\n color: var(--red);\n font-weight: 700;\n }\n\n .showcase-livedemo-token {\n font-family: var(--font);\n color: var(--text-muted);\n word-break: break-all;\n font-size: 0.75rem;\n }\n\n .showcase-livedemo-counter {\n margin-top: 1rem;\n font-size: 0.75rem;\n color: var(--text-dim);\n }\n\n .showcase-livedemo-error {\n margin-top: 1.5rem;\n padding: 1rem;\n background: var(--bg);\n border: 2px solid var(--red);\n color: var(--red);\n text-align: left;\n font-size: 0.8125rem;\n }\n\n /* ============ Showcase footer ============ */\n .showcase-footer {\n max-width: 800px;\n margin: 0 auto;\n padding: 3rem 2rem 4rem;\n text-align: center;\n }\n\n .showcase-footer-cta {\n font-size: 1rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: var(--text);\n }\n\n .showcase-footer-steps {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n max-width: 420px;\n margin: 0 auto 2rem;\n text-align: left;\n }\n\n .showcase-footer-step {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 0.8125rem;\n padding: 0.625rem 1rem;\n background: var(--bg-raised);\n border: 1px solid var(--border);\n }\n\n .showcase-footer-step-number {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.375rem;\n height: 1.375rem;\n font-size: 0.6875rem;\n font-weight: 700;\n border: 1px solid var(--border-bright);\n color: var(--text-muted);\n flex-shrink: 0;\n }\n\n .showcase-footer-step code {\n color: var(--text);\n }\n\n .showcase-agent-prompt {\n max-width: 520px;\n margin: 2rem auto 2.5rem;\n text-align: center;\n }\n\n .showcase-agent-prompt-label {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n color: var(--text-dim);\n margin-bottom: 0.75rem;\n }\n\n .showcase-agent-prompt-card {\n display: block;\n width: 100%;\n padding: 1.25rem;\n border: 1px solid var(--border);\n background: var(--bg);\n cursor: pointer;\n font-family: var(--font);\n text-align: left;\n transition: border-color 0.15s;\n }\n\n .showcase-agent-prompt-card:hover {\n border-color: var(--accent);\n }\n\n .showcase-agent-prompt-card code {\n display: block;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--text);\n line-height: 1.5;\n background: none;\n border: none;\n padding: 0;\n text-transform: none;\n letter-spacing: normal;\n }\n\n .showcase-agent-prompt-copy {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n margin-top: 0.75rem;\n font-size: 0.625rem;\n font-weight: 500;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.1em;\n transition: color 0.2s;\n }\n\n .showcase-agent-prompt-copy span {\n display: flex;\n }\n\n .showcase-footer-links {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.5rem;\n margin-bottom: 2rem;\n }\n\n .showcase-footer-link {\n font-size: 0.6875rem;\n color: var(--text);\n text-decoration: none;\n padding: 0.25rem 0.625rem;\n border: 1px solid var(--border-bright);\n transition: border-color 0.15s;\n }\n\n .showcase-footer-link:hover {\n border-color: var(--accent);\n opacity: 1;\n }\n\n .showcase-footer-meta {\n font-size: 0.6875rem;\n color: var(--text-dim);\n }\n\n .showcase-footer-meta a {\n color: var(--text-muted);\n text-decoration: none;\n }\n\n .showcase-footer-sep {\n margin: 0 0.375rem;\n }\n\n /* ============ Responsive ============ */\n @media (max-width: 768px) {\n .showcase-tap-hero { padding: 3rem 1rem 2rem; }\n .showcase-tap-hero-title { font-size: 1.75rem; }\n .showcase-tap-hero-features {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .showcase-hero { padding: 2rem 1rem 1rem; }\n .showcase-hero-grid {\n grid-template-columns: 1fr;\n gap: 1.5rem;\n }\n .showcase-hero-column { padding: 1.5rem; }\n .showcase-hero-title { font-size: 1.5rem; }\n .showcase-hero-visual { font-size: 0.5625rem; }\n .showcase-hero-tagline-main { font-size: 1.25rem; }\n\n .showcase-protocol-stack { padding: 3rem 1rem; }\n .showcase-stack-layer-title {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.375rem;\n font-size: 1rem;\n }\n\n .showcase-terminal-section { padding: 3rem 1rem; }\n .showcase-terminal-content { padding: 1rem; font-size: 0.75rem; height: 420px; }\n\n .showcase-livedemo { padding: 3rem 1rem; }\n\n .showcase-footer { padding: 2rem 1rem 3rem; }\n }\n\n @media (max-width: 480px) {\n .showcase-hero-visual { font-size: 0.5rem; padding: 0.75rem; }\n .showcase-hero-tagline-main { font-size: 1rem; }\n }\n";
16
11
  export declare const ShowcasePage: FC<{
17
12
  version: string;
18
13
  error?: string;
14
+ baseUrl?: string;
19
15
  }>;
20
16
  //# sourceMappingURL=showcase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/dashboard/showcase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAMnC,eAAO,MAAM,YAAY,+kiBAywBxB,CAAC;AAiRF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAgQhE,CAAC"}
1
+ {"version":3,"file":"showcase.d.ts","sourceRoot":"","sources":["../../src/dashboard/showcase.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAqHnC,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAmFlF,CAAC"}