@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.
@@ -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,qBAiFvE"}
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"}
@@ -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" })] })] }) }) }), _jsxs("p", { class: "text-muted", style: "font-size: 0.75rem; text-align: center; line-height: 1.8; margin-bottom: 1.5rem;", children: ["Your agent solves a challenge, gets a code, and gives you a link.", _jsx("br", {}), "Click it. You're in the dashboard."] }), _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 } })] }));
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,CAyI/D,CAAC;AAyBF,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CA8F3E,CAAC"}
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/login", class: "text-muted", style: "font-size: 0.6875rem; text-decoration: underline; text-underline-offset: 3px;", children: "Already have an account? Log in" }), _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: {
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 } }), _jsxs("div", { class: "landing-footer", children: [_jsxs("span", { children: ["v", version] }), _jsx("span", { class: "landing-footer-sep", children: "\u00B7" }), _jsx("a", { href: "/openapi.json", children: "API" }), _jsx("span", { class: "landing-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/dupe-com/botcha", children: "GitHub" }), _jsx("span", { class: "landing-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/i8ramin", children: "@i8ramin" })] })] }));
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/login", 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)
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 } }), _jsxs("div", { class: "landing-footer", children: [_jsxs("span", { children: ["v", version] }), _jsx("span", { class: "landing-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://botcha.ai", children: "botcha.ai" }), _jsx("span", { class: "landing-footer-sep", children: "\u00B7" }), _jsx("a", { href: "https://github.com/i8ramin", children: "@i8ramin" })] })] }));
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,CAmCrF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAoDpE,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"}
@@ -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" })] }), _jsx("body", { children: _jsx("div", { class: "login-container", children: _jsx("div", { class: "login-box", children: children }) }) })] }));
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 } })] }), _jsx("body", { children: _jsx("div", { class: "login-container", children: _jsx("div", { class: "landing-box", children: children }) }) })] }));
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"}