@dupecom/botcha-cloudflare 0.13.1 → 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 +4 -4
- 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 +23 -39
- 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 +5 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAMvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjD,KAAK,QAAQ,GAAG;IACd,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,KAAK,SAAS,GAAG;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAIF;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc5F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQhE;AAID;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAmChG,CAAC;AAIF;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;oEA2CpF;AAgDD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;;oEAwBjF;AAID;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;oEAEjF;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;;oEA4B9E;AAID;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,qBA2E5E;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAqB9E;AAID;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAyBnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAGpE;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFA2BxE;AA4BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/dashboard/auth.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAMvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAKjD,KAAK,QAAQ,GAAG;IACd,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAGF,KAAK,SAAS,GAAG;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAIF;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc5F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQhE;AAID;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,CAmChG,CAAC;AAIF;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;oEA2CpF;AAgDD;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;;oEAwBjF;AAID;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;oEAEjF;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;;;;;;;;;;;oEA4B9E;AAID;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,qBA2E5E;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAqB9E;AAID;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAyBnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFAGpE;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,gFA2BxE;AA4BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,qBAgFvE"}
|
package/dist/dashboard/auth.js
CHANGED
|
@@ -393,5 +393,5 @@ export async function renderLoginPage(c) {
|
|
|
393
393
|
██████╔╝██║ ██║ ██║ ██║ ███████║███████║
|
|
394
394
|
██╔══██╗██║ ██║ ██║ ██║ ██╔══██║██╔══██║
|
|
395
395
|
██████╔╝╚██████╔╝ ██║ ╚██████╗██║ ██║██║ ██║
|
|
396
|
-
╚═════╝ ╚═════╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝` }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 2rem;", children: ['>', "_\u00A0dashboard login"] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin-bottom: 0.625rem;", children: "Paste this into your AI agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "dash-prompt-btn", onclick: "copyDashPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "dash-prompt", style: "font-size: 0.9375rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: DASHBOARD_PROMPT }), _jsxs("span", { id: "dash-copy-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "dash-copy-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON_SVG } }), _jsx("span", { id: "dash-copy-text", children: "Click to copy" })] })] }) }) }),
|
|
396
|
+
╚═════╝ ╚═════╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝` }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 2rem;", children: ['>', "_\u00A0dashboard login"] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin-bottom: 0.625rem;", children: "Paste this into your AI agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "dash-prompt-btn", onclick: "copyDashPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "dash-prompt", style: "font-size: 0.9375rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: DASHBOARD_PROMPT }), _jsxs("span", { id: "dash-copy-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "dash-copy-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON_SVG } }), _jsx("span", { id: "dash-copy-text", children: "Click to copy" })] })] }) }) }), _jsx("p", { class: "text-muted", style: "font-size: 0.75rem; text-align: center; line-height: 1.8; margin-bottom: 1.5rem; padding: 0 2rem;", children: "Your agent solves a challenge, gets a code, and gives you a link." }), _jsx(Divider, { text: "returning user?" }), _jsx("form", { method: "post", action: "/dashboard/email-login", children: _jsxs(Card, { title: "Email Login", children: [error === 'email_missing' && (_jsx("div", { class: "error-message", children: errorMap[error] })), _jsx("p", { class: "text-muted mb-2", style: "font-size: 0.75rem;", children: "Enter the email you used when creating your app. We'll send a login code to your inbox." }), _jsxs("div", { class: "form-group", children: [_jsx("label", { for: "email", children: "Email" }), _jsx("input", { type: "email", id: "email", name: "email", placeholder: "you@example.com", required: true, autocomplete: "email" })] }), _jsxs("button", { type: "submit", children: ["Email Me a Code ", '>'] })] }) }), _jsx("script", { dangerouslySetInnerHTML: { __html: LOGIN_COPY_SCRIPT } })] }));
|
|
397
397
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"landing.d.ts","sourceRoot":"","sources":["../../src/dashboard/landing.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAsCnC,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"landing.d.ts","sourceRoot":"","sources":["../../src/dashboard/landing.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAsCnC,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA+H/D,CAAC;AAyBF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAsF3E,CAAC"}
|
|
@@ -31,7 +31,7 @@ function copyPrompt() {
|
|
|
31
31
|
`;
|
|
32
32
|
// ============ UNVERIFIED LANDING PAGE ============
|
|
33
33
|
export const LandingPage = ({ version, error }) => {
|
|
34
|
-
return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0prove you're a bot"] }), _jsx("p", { class: "landing-tagline", children: "This site is for AI agents. Bring yours." }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 2rem 0 0.625rem;", children: "Paste this into your AI agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "prompt-btn", onclick: "copyPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "agent-prompt", style: "font-size: 1.125rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: AGENT_PROMPT }), _jsxs("span", { id: "copy-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "copy-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "copy-text", children: "Click to copy" })] })] }) }) }), _jsx("div", { style: "text-align: center; margin: 1.5rem 0;", children: _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; line-height: 2;", children: ["Your agent solves a challenge to prove it's a bot.", _jsx("br", {}), "It gives you a link back. Click it. You're in."] }) }), error && (_jsx("div", { style: "text-align: center; margin-bottom: 0.5rem;", children: _jsx("p", { style: "color: var(--red); font-size: 0.75rem;", children: error }) })), _jsxs("div", { style: "text-align: center; margin-top: 1.5rem; display: flex; flex-direction: column; align-items: center; gap: 0.625rem;", children: [_jsx("a", { href: "/dashboard
|
|
34
|
+
return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0prove you're a bot"] }), _jsx("p", { class: "landing-tagline", children: "This site is for AI agents. Bring yours." }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 2rem 0 0.625rem;", children: "Paste this into your AI agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "prompt-btn", onclick: "copyPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "agent-prompt", style: "font-size: 1.125rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: AGENT_PROMPT }), _jsxs("span", { id: "copy-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "copy-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "copy-text", children: "Click to copy" })] })] }) }) }), _jsx("div", { style: "text-align: center; margin: 1.5rem 0;", children: _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; line-height: 2;", children: ["Your agent solves a challenge to prove it's a bot.", _jsx("br", {}), "It gives you a link back. Click it. You're in."] }) }), error && (_jsx("div", { style: "text-align: center; margin-bottom: 0.5rem;", children: _jsx("p", { style: "color: var(--red); font-size: 0.75rem;", children: error }) })), _jsxs("div", { style: "text-align: center; margin-top: 1.5rem; display: flex; flex-direction: column; align-items: center; gap: 0.625rem;", children: [_jsx("a", { href: "/dashboard", class: "text-muted", style: "font-size: 0.6875rem; text-decoration: underline; text-underline-offset: 3px;", children: "Already have an account? Go to dashboard" }), _jsxs("details", { style: "margin: 0;", children: [_jsx("summary", { class: "text-muted", style: "font-size: 0.6875rem; cursor: pointer; text-align: center; list-style: none; text-decoration: underline; text-underline-offset: 3px;", children: "Have a code?" }), _jsx("form", { method: "post", action: "/gate", style: "margin-top: 0.75rem;", children: _jsxs("div", { style: "display: flex; gap: 0;", children: [_jsx("input", { id: "code", name: "code", type: "text", placeholder: "BOTCHA-XXXXXX", required: true, autocomplete: "off", spellcheck: false, maxlength: 13, style: "flex: 1; font-size: 0.875rem; font-family: var(--font); font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; padding: 0.625rem; text-align: center; border: 1px solid var(--border); border-radius: 0; background: var(--bg); color: var(--text);" }), _jsxs("button", { type: "submit", style: "padding: 0.625rem 1rem; font-family: var(--font); font-size: 0.8125rem; font-weight: 600; background: var(--accent); color: #fff; border: 1px solid var(--accent); border-left: none; border-radius: 0; cursor: pointer; white-space: nowrap;", children: ["Go ", '>'] })] }) })] })] }), _jsx("script", { type: "application/botcha+json", id: "botcha-challenge", dangerouslySetInnerHTML: {
|
|
35
35
|
__html: JSON.stringify({
|
|
36
36
|
version: '1.0',
|
|
37
37
|
type: 'inline-challenge',
|
|
@@ -52,7 +52,7 @@ export const LandingPage = ({ version, error }) => {
|
|
|
52
52
|
header_to_include: 'X-Botcha-Landing-Token',
|
|
53
53
|
},
|
|
54
54
|
}, null, 2),
|
|
55
|
-
} }), _jsx("script", { dangerouslySetInnerHTML: { __html: COPY_SCRIPT } })
|
|
55
|
+
} }), _jsx("script", { dangerouslySetInnerHTML: { __html: COPY_SCRIPT } })] }));
|
|
56
56
|
};
|
|
57
57
|
// ============ VERIFIED LANDING PAGE ============
|
|
58
58
|
const ONBOARD_PROMPT = `Run: curl -s https://botcha.ai -H 'Accept: application/json' — then follow the instructions to verify yourself, create an app for me, and get me into the dashboard. Ask me for my email address when you need it.`;
|
|
@@ -75,11 +75,11 @@ function copyOnboardPrompt() {
|
|
|
75
75
|
}
|
|
76
76
|
`;
|
|
77
77
|
export const VerifiedLandingPage = ({ version, solveTime }) => {
|
|
78
|
-
return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0verified"] }), _jsxs("p", { class: "landing-tagline", style: "color: var(--green);", children: ["Your agent proved it's a bot", solveTime ? ` in ${solveTime}ms` : '', ". Welcome."] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 2rem 0 0.625rem;", children: "Set up your account \u2014 paste this to your agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "onboard-btn", onclick: "copyOnboardPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "onboard-prompt", style: "font-size: 1rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: ONBOARD_PROMPT }), _jsxs("span", { id: "onboard-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "onboard-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "onboard-text", children: "Click to copy" })] })] }) }) }), _jsx("div", { style: "text-align: center; margin: 1.5rem 0;", children: _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; line-height: 2;", children: ["Your agent will ask for your email, create your app,", _jsx("br", {}), "and give you a link to your dashboard. You just click it."] }) }), _jsx("div", { style: "text-align: center; margin-bottom: 1.5rem;", children: _jsx("a", { href: "/dashboard
|
|
78
|
+
return (_jsxs(LandingLayout, { version: version, children: [_jsx("a", { href: "/", class: "ascii-logo", children: BOTCHA_ASCII }), _jsxs("p", { class: "text-muted", style: "text-align: center; font-size: 0.75rem; margin: -1rem 0 0.5rem;", children: ['>', "_\u00A0verified"] }), _jsxs("p", { class: "landing-tagline", style: "color: var(--green);", children: ["Your agent proved it's a bot", solveTime ? ` in ${solveTime}ms` : '', ". Welcome."] }), _jsx("p", { class: "text-muted", style: "font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; text-align: center; margin: 2rem 0 0.625rem;", children: "Set up your account \u2014 paste this to your agent" }), _jsx("div", { class: "card", style: "margin-bottom: 1.5rem;", children: _jsx("div", { class: "card-body", children: _jsxs("button", { id: "onboard-btn", onclick: "copyOnboardPrompt()", type: "button", class: "card-inner", style: "display: block; width: 100%; padding: 1.5rem; border: none; border-radius: 0; cursor: pointer; font-family: var(--font); text-align: left; text-transform: none; letter-spacing: normal; box-shadow: none; transition: background 0.2s;", children: [_jsx("code", { id: "onboard-prompt", style: "font-size: 1rem; font-weight: 700; color: var(--accent); line-height: 1.5; display: block; background: none; border: none; padding: 0;", children: ONBOARD_PROMPT }), _jsxs("span", { id: "onboard-label", style: "display: flex; align-items: center; gap: 0.375rem; margin-top: 1rem; font-size: 0.6875rem; font-weight: 500; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.1em; transition: color 0.2s;", children: [_jsx("span", { id: "onboard-icon", style: "display: flex; transition: color 0.2s;", dangerouslySetInnerHTML: { __html: COPY_ICON } }), _jsx("span", { id: "onboard-text", children: "Click to copy" })] })] }) }) }), _jsx("div", { style: "text-align: center; margin: 1.5rem 0;", children: _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; line-height: 2;", children: ["Your agent will ask for your email, create your app,", _jsx("br", {}), "and give you a link to your dashboard. You just click it."] }) }), _jsx("div", { style: "text-align: center; margin-bottom: 1.5rem;", children: _jsx("a", { href: "/dashboard", style: "font-size: 0.75rem; color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px;", children: "Already have an account? Go to dashboard" }) }), _jsxs(Card, { title: "For developers", children: [_jsx("p", { class: "text-muted", style: "font-size: 0.8125rem; line-height: 1.7; margin-bottom: 0.75rem;", children: "Protect your own APIs so only verified AI agents can access them:" }), _jsx("pre", { children: _jsx("code", { children: `# Client SDK (for your agent)
|
|
79
79
|
npm install @dupecom/botcha # TypeScript
|
|
80
80
|
pip install botcha # Python
|
|
81
81
|
|
|
82
82
|
# Server SDK (protect your APIs)
|
|
83
83
|
npm install @botcha/verify # Express/Hono
|
|
84
|
-
pip install botcha-verify # FastAPI/Django` }) }), _jsxs("div", { class: "landing-links", style: "margin-top: 1rem;", children: [_jsx("a", { href: "/openapi.json", class: "landing-link", children: "OpenAPI" }), _jsx("a", { href: "/ai.txt", class: "landing-link", children: "ai.txt" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", class: "landing-link", children: "GitHub" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", class: "landing-link", children: "npm" }), _jsx("a", { href: "https://pypi.org/project/botcha/", class: "landing-link", children: "PyPI" })] })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: VERIFIED_COPY_SCRIPT } })
|
|
84
|
+
pip install botcha-verify # FastAPI/Django` }) }), _jsxs("div", { class: "landing-links", style: "margin-top: 1rem;", children: [_jsx("a", { href: "/openapi.json", class: "landing-link", children: "OpenAPI" }), _jsx("a", { href: "/ai.txt", class: "landing-link", children: "ai.txt" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", class: "landing-link", children: "GitHub" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", class: "landing-link", children: "npm" }), _jsx("a", { href: "https://pypi.org/project/botcha/", class: "landing-link", children: "PyPI" })] })] }), _jsx("script", { dangerouslySetInnerHTML: { __html: VERIFIED_COPY_SCRIPT } })] }));
|
|
85
85
|
};
|
|
@@ -23,6 +23,13 @@ export declare const Card: FC<PropsWithChildren<{
|
|
|
23
23
|
badge?: string;
|
|
24
24
|
class?: string;
|
|
25
25
|
}>>;
|
|
26
|
+
/**
|
|
27
|
+
* Global footer used on every page.
|
|
28
|
+
* Dashboard button + text links + copyright.
|
|
29
|
+
*/
|
|
30
|
+
export declare const GlobalFooter: FC<{
|
|
31
|
+
version?: string;
|
|
32
|
+
}>;
|
|
26
33
|
/**
|
|
27
34
|
* Divider with centered text, used between sections on auth pages.
|
|
28
35
|
*/
|
|
@@ -36,6 +43,7 @@ export declare const Divider: FC<{
|
|
|
36
43
|
export declare const DashboardLayout: FC<PropsWithChildren<{
|
|
37
44
|
title?: string;
|
|
38
45
|
appId?: string;
|
|
46
|
+
version?: string;
|
|
39
47
|
}>>;
|
|
40
48
|
/**
|
|
41
49
|
* Login/auth layout without navigation
|
|
@@ -43,6 +51,7 @@ export declare const DashboardLayout: FC<PropsWithChildren<{
|
|
|
43
51
|
*/
|
|
44
52
|
export declare const LoginLayout: FC<PropsWithChildren<{
|
|
45
53
|
title?: string;
|
|
54
|
+
version?: string;
|
|
46
55
|
}>>;
|
|
47
56
|
/**
|
|
48
57
|
* Landing page layout — wider than LoginLayout, includes SEO meta tags.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/dashboard/layout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAExC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/dashboard/layout.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAKtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzF,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CA+BjD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAExC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoCvG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBnF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDpE,CAAC"}
|
package/dist/dashboard/layout.js
CHANGED
|
@@ -18,6 +18,15 @@ import { DASHBOARD_CSS } from './styles';
|
|
|
18
18
|
export const Card = ({ children, title, badge, class: className, }) => {
|
|
19
19
|
return (_jsxs("div", { class: `card${className ? ` ${className}` : ''}`, children: [_jsx("div", { class: "card-header", children: _jsxs("h3", { children: [_jsx("span", { class: "card-title", children: title }), badge && _jsx("span", { class: "badge-inline", children: badge })] }) }), _jsx("div", { class: "card-body", children: _jsx("div", { class: "card-inner", children: children }) })] }));
|
|
20
20
|
};
|
|
21
|
+
// ============ GLOBAL FOOTER ============
|
|
22
|
+
/**
|
|
23
|
+
* Global footer used on every page.
|
|
24
|
+
* Dashboard button + text links + copyright.
|
|
25
|
+
*/
|
|
26
|
+
export const GlobalFooter = ({ version = '0.15.0' }) => {
|
|
27
|
+
const year = new Date().getFullYear();
|
|
28
|
+
return (_jsx("footer", { class: "global-footer", children: _jsxs("div", { class: "global-footer-inner", children: [_jsx("a", { href: "/dashboard", class: "global-footer-dashboard", children: "Dashboard" }), _jsxs("div", { class: "global-footer-links", children: [_jsxs("span", { children: ["v", version] }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://botcha.ai", children: "botcha.ai" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/openapi.json", children: "OpenAPI" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/ai.txt", children: "ai.txt" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", children: "GitHub" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://www.npmjs.com/package/@dupecom/botcha", children: "npm" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://pypi.org/project/botcha/", children: "PyPI" })] }), _jsxs("div", { class: "global-footer-legal", children: ["\u00A9 ", year, " ", _jsx("a", { href: "https://dupe.com", children: "Dupe.com" }), _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), "Free and open source", _jsx("span", { class: "global-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/i8ramin", children: "@i8ramin" })] })] }) }));
|
|
29
|
+
};
|
|
21
30
|
/**
|
|
22
31
|
* Divider with centered text, used between sections on auth pages.
|
|
23
32
|
*/
|
|
@@ -26,15 +35,15 @@ export const Divider = ({ text }) => (_jsx("div", { class: "divider", children:
|
|
|
26
35
|
* Main dashboard layout with navigation
|
|
27
36
|
* Used for authenticated dashboard pages
|
|
28
37
|
*/
|
|
29
|
-
export const DashboardLayout = ({ children, title, appId }) => {
|
|
30
|
-
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: title || 'BOTCHA Dashboard' }), _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: DASHBOARD_CSS } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("nav", { class: "dashboard-nav", children: _jsxs("div", { class: "nav-container", children: [_jsx("a", { href: "/dashboard", class: "nav-logo", children: "BOTCHA" }), appId && (_jsxs(_Fragment, { children: [_jsx("span", { class: "nav-app-id", children: appId }), _jsx("a", { href: "/dashboard/logout", class: "nav-link", children: "Logout" })] }))] }) }), _jsx("main", { class: "dashboard-main", children: children })] })] }));
|
|
38
|
+
export const DashboardLayout = ({ children, title, appId, version }) => {
|
|
39
|
+
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: title || 'BOTCHA Dashboard' }), _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: DASHBOARD_CSS } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("nav", { class: "dashboard-nav", children: _jsxs("div", { class: "nav-container", children: [_jsx("a", { href: "/dashboard", class: "nav-logo", children: "BOTCHA" }), appId && (_jsxs(_Fragment, { children: [_jsx("span", { class: "nav-app-id", children: appId }), _jsx("a", { href: "/dashboard/logout", class: "nav-link", children: "Logout" })] }))] }) }), _jsx("main", { class: "dashboard-main", children: children }), _jsx(GlobalFooter, { version: version })] })] }));
|
|
31
40
|
};
|
|
32
41
|
/**
|
|
33
42
|
* Login/auth layout without navigation
|
|
34
43
|
* Used for login, signup, and other auth pages
|
|
35
44
|
*/
|
|
36
|
-
export const LoginLayout = ({ children, title }) => {
|
|
37
|
-
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: title || 'BOTCHA Login' }), _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: DASHBOARD_CSS } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }),
|
|
45
|
+
export const LoginLayout = ({ children, title, version }) => {
|
|
46
|
+
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: title || 'BOTCHA Login' }), _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: DASHBOARD_CSS } }), _jsx("script", { src: "https://unpkg.com/htmx.org@2.0.4" })] }), _jsxs("body", { children: [_jsx("div", { class: "login-container", children: _jsx("div", { class: "login-box", children: children }) }), _jsx(GlobalFooter, { version: version })] })] }));
|
|
38
47
|
};
|
|
39
48
|
/**
|
|
40
49
|
* Landing page layout — wider than LoginLayout, includes SEO meta tags.
|
|
@@ -51,5 +60,5 @@ export const LandingLayout = ({ children, version }) => {
|
|
|
51
60
|
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
52
61
|
operatingSystem: 'Any',
|
|
53
62
|
softwareVersion: version,
|
|
54
|
-
}) } }), _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: DASHBOARD_CSS } })] }),
|
|
63
|
+
}) } }), _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: DASHBOARD_CSS } })] }), _jsxs("body", { children: [_jsx("div", { class: "login-container", children: _jsx("div", { class: "landing-box", children: children }) }), _jsx(GlobalFooter, { version: version })] })] }));
|
|
55
64
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BOTCHA Showcase Page
|
|
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.
|
|
7
|
+
*
|
|
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
|
|
13
|
+
*/
|
|
14
|
+
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
|
+
export declare const ShowcasePage: FC<{
|
|
17
|
+
version: string;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=showcase.d.ts.map
|
|
@@ -0,0 +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;AAKnC,eAAO,MAAM,YAAY,+kiBAywBxB,CAAC;AAiRF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CA6PhD,CAAC"}
|