@ascendkit/nextjs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/client/hooks.d.ts +109 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +372 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/provider.d.ts +66 -0
- package/dist/client/provider.d.ts.map +1 -0
- package/dist/client/provider.js +284 -0
- package/dist/client/use-analytics.d.ts +27 -0
- package/dist/client/use-analytics.d.ts.map +1 -0
- package/dist/client/use-analytics.js +133 -0
- package/dist/components/auth-card.d.ts +20 -0
- package/dist/components/auth-card.d.ts.map +1 -0
- package/dist/components/auth-card.js +128 -0
- package/dist/components/auth-modal.d.ts +9 -0
- package/dist/components/auth-modal.d.ts.map +1 -0
- package/dist/components/auth-modal.js +110 -0
- package/dist/components/branding-badge.d.ts +2 -0
- package/dist/components/branding-badge.d.ts.map +1 -0
- package/dist/components/branding-badge.js +9 -0
- package/dist/components/email-verification.d.ts +2 -0
- package/dist/components/email-verification.d.ts.map +1 -0
- package/dist/components/email-verification.js +48 -0
- package/dist/components/forgot-password.d.ts +6 -0
- package/dist/components/forgot-password.d.ts.map +1 -0
- package/dist/components/forgot-password.js +37 -0
- package/dist/components/index.d.ts +13 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +12 -0
- package/dist/components/login.d.ts +9 -0
- package/dist/components/login.d.ts.map +1 -0
- package/dist/components/login.js +48 -0
- package/dist/components/reset-password.d.ts +6 -0
- package/dist/components/reset-password.d.ts.map +1 -0
- package/dist/components/reset-password.js +47 -0
- package/dist/components/sign-in-button.d.ts +19 -0
- package/dist/components/sign-in-button.d.ts.map +1 -0
- package/dist/components/sign-in-button.js +27 -0
- package/dist/components/sign-up-button.d.ts +19 -0
- package/dist/components/sign-up-button.d.ts.map +1 -0
- package/dist/components/sign-up-button.js +27 -0
- package/dist/components/signup.d.ts +9 -0
- package/dist/components/signup.d.ts.map +1 -0
- package/dist/components/signup.js +60 -0
- package/dist/components/social-button.d.ts +8 -0
- package/dist/components/social-button.d.ts.map +1 -0
- package/dist/components/social-button.js +10 -0
- package/dist/components/user-button.d.ts +11 -0
- package/dist/components/user-button.d.ts.map +1 -0
- package/dist/components/user-button.js +14 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/server/access-token.d.ts +39 -0
- package/dist/server/access-token.d.ts.map +1 -0
- package/dist/server/access-token.js +74 -0
- package/dist/server/adapter.d.ts +6 -0
- package/dist/server/adapter.d.ts.map +1 -0
- package/dist/server/adapter.js +57 -0
- package/dist/server/analytics.d.ts +61 -0
- package/dist/server/analytics.d.ts.map +1 -0
- package/dist/server/analytics.js +117 -0
- package/dist/server/ascendkit-auth.d.ts +122 -0
- package/dist/server/ascendkit-auth.d.ts.map +1 -0
- package/dist/server/ascendkit-auth.js +146 -0
- package/dist/server/auth-runtime.d.ts +12 -0
- package/dist/server/auth-runtime.d.ts.map +1 -0
- package/dist/server/auth-runtime.js +123 -0
- package/dist/server/config-fetcher.d.ts +22 -0
- package/dist/server/config-fetcher.d.ts.map +1 -0
- package/dist/server/config-fetcher.js +26 -0
- package/dist/server/email-sender.d.ts +29 -0
- package/dist/server/email-sender.d.ts.map +1 -0
- package/dist/server/email-sender.js +58 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/oauth-proxy-plugin.d.ts +10 -0
- package/dist/server/oauth-proxy-plugin.d.ts.map +1 -0
- package/dist/server/oauth-proxy-plugin.js +156 -0
- package/dist/server/social-providers.d.ts +12 -0
- package/dist/server/social-providers.d.ts.map +1 -0
- package/dist/server/social-providers.js +15 -0
- package/dist/server/webhooks.d.ts +43 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +83 -0
- package/dist/shared/http-client.d.ts +17 -0
- package/dist/shared/http-client.d.ts.map +1 -0
- package/dist/shared/http-client.js +52 -0
- package/dist/shared/types.d.ts +49 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { useAscendKitContext } from "../client/provider";
|
|
5
|
+
import { AscendKitAuthCard } from "./auth-card";
|
|
6
|
+
/**
|
|
7
|
+
* Global auth modal rendered automatically by AscendKitProvider.
|
|
8
|
+
*
|
|
9
|
+
* Centered viewport overlay with backdrop, auto-closes on auth success.
|
|
10
|
+
* Supports dark mode via Tailwind `class="dark"` on <html> and
|
|
11
|
+
* `prefers-color-scheme` media query.
|
|
12
|
+
*/
|
|
13
|
+
export function AuthModal() {
|
|
14
|
+
const { modal } = useAscendKitContext();
|
|
15
|
+
const dialogRef = useRef(null);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const dialog = dialogRef.current;
|
|
18
|
+
if (!dialog)
|
|
19
|
+
return;
|
|
20
|
+
if (modal.isOpen && !dialog.open) {
|
|
21
|
+
dialog.showModal();
|
|
22
|
+
}
|
|
23
|
+
else if (!modal.isOpen && dialog.open) {
|
|
24
|
+
dialog.close();
|
|
25
|
+
}
|
|
26
|
+
}, [modal.isOpen]);
|
|
27
|
+
// Close on backdrop click
|
|
28
|
+
function handleClick(e) {
|
|
29
|
+
const dialog = dialogRef.current;
|
|
30
|
+
if (!dialog)
|
|
31
|
+
return;
|
|
32
|
+
const rect = dialog.getBoundingClientRect();
|
|
33
|
+
if (e.clientX < rect.left ||
|
|
34
|
+
e.clientX > rect.right ||
|
|
35
|
+
e.clientY < rect.top ||
|
|
36
|
+
e.clientY > rect.bottom) {
|
|
37
|
+
modal.close();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Sync close from Escape key (browser native)
|
|
41
|
+
function handleClose() {
|
|
42
|
+
modal.close();
|
|
43
|
+
}
|
|
44
|
+
const view = modal.view === "sign-up" ? "SIGN_UP" : "SIGN_IN";
|
|
45
|
+
return (_jsxs("dialog", { ref: dialogRef, onClick: handleClick, onClose: handleClose, className: "ak-auth-modal", "aria-label": modal.view === "sign-up" ? "Sign up" : "Sign in", children: [_jsxs("div", { className: "ak-auth-modal-content", children: [_jsx("button", { type: "button", onClick: () => modal.close(), className: "ak-auth-modal-close", "aria-label": "Close", children: "\u2715" }), _jsx(AscendKitAuthCard, { view: view })] }), _jsx("style", { children: `
|
|
46
|
+
.ak-auth-modal {
|
|
47
|
+
position: fixed;
|
|
48
|
+
top: 50%;
|
|
49
|
+
left: 50%;
|
|
50
|
+
transform: translate(-50%, -50%);
|
|
51
|
+
margin: 0;
|
|
52
|
+
border: none;
|
|
53
|
+
border-radius: 12px;
|
|
54
|
+
padding: 0;
|
|
55
|
+
max-width: 420px;
|
|
56
|
+
width: 90vw;
|
|
57
|
+
max-height: 90vh;
|
|
58
|
+
overflow-y: auto;
|
|
59
|
+
background: var(--ak-modal-bg, #fff);
|
|
60
|
+
color: var(--ak-modal-color, #1a1a1a);
|
|
61
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
62
|
+
z-index: 9999;
|
|
63
|
+
}
|
|
64
|
+
.ak-auth-modal::backdrop {
|
|
65
|
+
background: rgba(0, 0, 0, 0.5);
|
|
66
|
+
backdrop-filter: blur(4px);
|
|
67
|
+
-webkit-backdrop-filter: blur(4px);
|
|
68
|
+
}
|
|
69
|
+
.ak-auth-modal-content {
|
|
70
|
+
position: relative;
|
|
71
|
+
padding: 32px 24px 24px;
|
|
72
|
+
}
|
|
73
|
+
.ak-auth-modal-close {
|
|
74
|
+
position: absolute;
|
|
75
|
+
top: 12px;
|
|
76
|
+
right: 12px;
|
|
77
|
+
background: none;
|
|
78
|
+
border: none;
|
|
79
|
+
font-size: 18px;
|
|
80
|
+
cursor: pointer;
|
|
81
|
+
color: var(--ak-modal-muted, #888);
|
|
82
|
+
line-height: 1;
|
|
83
|
+
padding: 4px 8px;
|
|
84
|
+
border-radius: 4px;
|
|
85
|
+
}
|
|
86
|
+
.ak-auth-modal-close:hover {
|
|
87
|
+
color: var(--ak-modal-color, #1a1a1a);
|
|
88
|
+
background: var(--ak-modal-hover-bg, rgba(0, 0, 0, 0.05));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Dark mode: Tailwind class-based (html.dark) */
|
|
92
|
+
:root.dark .ak-auth-modal,
|
|
93
|
+
html.dark .ak-auth-modal {
|
|
94
|
+
--ak-modal-bg: #0a0a0a;
|
|
95
|
+
--ak-modal-color: #f5f5f5;
|
|
96
|
+
--ak-modal-muted: #888;
|
|
97
|
+
--ak-modal-hover-bg: rgba(255, 255, 255, 0.1);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Dark mode: system preference fallback */
|
|
101
|
+
@media (prefers-color-scheme: dark) {
|
|
102
|
+
.ak-auth-modal:not(.ak-light) {
|
|
103
|
+
--ak-modal-bg: #0a0a0a;
|
|
104
|
+
--ak-modal-color: #f5f5f5;
|
|
105
|
+
--ak-modal-muted: #888;
|
|
106
|
+
--ak-modal-hover-bg: rgba(255, 255, 255, 0.1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
` })] }));
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding-badge.d.ts","sourceRoot":"","sources":["../../src/components/branding-badge.tsx"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,mDAiB5B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useAscendKitContext } from "../client/provider";
|
|
4
|
+
export function BrandingBadge() {
|
|
5
|
+
const { branding } = useAscendKitContext();
|
|
6
|
+
if (!branding.showBadge)
|
|
7
|
+
return null;
|
|
8
|
+
return (_jsx("div", { className: "mt-3 text-center text-xs text-muted-foreground", children: _jsxs("a", { href: "https://ascendkit.dev?ref=auth", target: "_blank", rel: "noopener noreferrer", className: "hover:underline", children: ["Powered by ", _jsx("strong", { children: "AscendKit" })] }) }));
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-verification.d.ts","sourceRoot":"","sources":["../../src/components/email-verification.tsx"],"names":[],"mappings":"AAWA,wBAAgB,iBAAiB,4CAuDhC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { useSearchParams } from "next/navigation";
|
|
5
|
+
import { useAscendKitContext } from "../client/provider";
|
|
6
|
+
export function EmailVerification() {
|
|
7
|
+
const searchParams = useSearchParams();
|
|
8
|
+
const token = useMemo(() => searchParams.get("token"), [searchParams]);
|
|
9
|
+
const { apiUrl, publicKey } = useAscendKitContext();
|
|
10
|
+
const [status, setStatus] = useState("loading");
|
|
11
|
+
const [message, setMessage] = useState("Verifying your email...");
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
let cancelled = false;
|
|
14
|
+
async function run() {
|
|
15
|
+
if (!token) {
|
|
16
|
+
setStatus("error");
|
|
17
|
+
setMessage("Missing verification token.");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetch(`${apiUrl}/api/auth/verify-email`, {
|
|
22
|
+
method: "POST",
|
|
23
|
+
headers: { "Content-Type": "application/json" },
|
|
24
|
+
body: JSON.stringify({ publicKey, token }),
|
|
25
|
+
});
|
|
26
|
+
const json = await res.json().catch(() => ({}));
|
|
27
|
+
if (!res.ok || !json.data?.ok) {
|
|
28
|
+
throw new Error(json.detail || json.error || "Verification failed.");
|
|
29
|
+
}
|
|
30
|
+
if (!cancelled) {
|
|
31
|
+
setStatus("success");
|
|
32
|
+
setMessage("Email verified. You can now continue.");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (!cancelled) {
|
|
37
|
+
setStatus("error");
|
|
38
|
+
setMessage(err instanceof Error ? err.message : "Verification failed.");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
void run();
|
|
43
|
+
return () => {
|
|
44
|
+
cancelled = true;
|
|
45
|
+
};
|
|
46
|
+
}, [apiUrl, publicKey, token]);
|
|
47
|
+
return (_jsx("div", { className: "ak-auth", children: _jsxs("div", { className: "ak-form", children: [status === "loading" && _jsx("div", { className: "ak-muted", children: message }), status === "success" && _jsx("div", { className: "ak-success", children: message }), status === "error" && _jsx("div", { className: "ak-error", children: message })] }) }));
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password.d.ts","sourceRoot":"","sources":["../../src/components/forgot-password.tsx"],"names":[],"mappings":"AAKA,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CAqDhE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useAscendKitContext } from "../client/provider";
|
|
5
|
+
export function ForgotPassword({ onSuccess }) {
|
|
6
|
+
const { apiUrl, publicKey } = useAscendKitContext();
|
|
7
|
+
const [email, setEmail] = useState("");
|
|
8
|
+
const [loading, setLoading] = useState(false);
|
|
9
|
+
const [message, setMessage] = useState(null);
|
|
10
|
+
const [error, setError] = useState(null);
|
|
11
|
+
async function handleSubmit(e) {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
setLoading(true);
|
|
14
|
+
setError(null);
|
|
15
|
+
setMessage(null);
|
|
16
|
+
try {
|
|
17
|
+
const res = await fetch(`${apiUrl}/api/auth/forgot-password`, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: { "Content-Type": "application/json" },
|
|
20
|
+
body: JSON.stringify({ publicKey, email }),
|
|
21
|
+
});
|
|
22
|
+
const json = await res.json().catch(() => ({}));
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(json.detail || json.error || "Failed to request password reset.");
|
|
25
|
+
}
|
|
26
|
+
setMessage("If an account exists for that email, a reset link has been sent.");
|
|
27
|
+
onSuccess?.();
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
setError(err instanceof Error ? err.message : "Failed to request password reset.");
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
setLoading(false);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return (_jsx("div", { className: "ak-auth", children: _jsxs("form", { onSubmit: handleSubmit, className: "ak-form", children: [error && _jsx("div", { className: "ak-error", children: error }), message && _jsx("div", { className: "ak-success", children: message }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-forgot-email", children: "Email" }), _jsx("input", { id: "ak-forgot-email", name: "email", type: "email", required: true, value: email, onChange: (e) => setEmail(e.target.value) })] }), _jsx("button", { type: "submit", disabled: loading, className: "ak-button", children: loading ? "Sending..." : "Send reset link" })] }) }));
|
|
37
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { Login } from "./login";
|
|
2
|
+
export { SignUp } from "./signup";
|
|
3
|
+
export { EmailVerification } from "./email-verification";
|
|
4
|
+
export { ForgotPassword } from "./forgot-password";
|
|
5
|
+
export { ResetPassword } from "./reset-password";
|
|
6
|
+
export { SocialButton } from "./social-button";
|
|
7
|
+
export { AscendKitAuthCard } from "./auth-card";
|
|
8
|
+
export { AuthModal } from "./auth-modal";
|
|
9
|
+
export { SignInButton } from "./sign-in-button";
|
|
10
|
+
export { SignUpButton } from "./sign-up-button";
|
|
11
|
+
export { AscendKitUserButton } from "./user-button";
|
|
12
|
+
export { BrandingBadge } from "./branding-badge";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { Login } from "./login";
|
|
2
|
+
export { SignUp } from "./signup";
|
|
3
|
+
export { EmailVerification } from "./email-verification";
|
|
4
|
+
export { ForgotPassword } from "./forgot-password";
|
|
5
|
+
export { ResetPassword } from "./reset-password";
|
|
6
|
+
export { SocialButton } from "./social-button";
|
|
7
|
+
export { AscendKitAuthCard } from "./auth-card";
|
|
8
|
+
export { AuthModal } from "./auth-modal";
|
|
9
|
+
export { SignInButton } from "./sign-in-button";
|
|
10
|
+
export { SignUpButton } from "./sign-up-button";
|
|
11
|
+
export { AscendKitUserButton } from "./user-button";
|
|
12
|
+
export { BrandingBadge } from "./branding-badge";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface LoginProps {
|
|
2
|
+
onSuccess?: () => void;
|
|
3
|
+
onError?: (error: string) => void;
|
|
4
|
+
/** Redirect URL after social login completes. */
|
|
5
|
+
callbackURL?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function Login({ onSuccess, onError, callbackURL }: LoginProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/components/login.tsx"],"names":[],"mappings":"AAMA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,UAAU,2CA4EpE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { useAscendKitContext } from "../client/provider";
|
|
5
|
+
import { SocialButton } from "./social-button";
|
|
6
|
+
export function Login({ onSuccess, onError, callbackURL }) {
|
|
7
|
+
const { authClient, enabledProviders, refreshSettings } = useAscendKitContext();
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const [loading, setLoading] = useState(false);
|
|
10
|
+
const socialProviders = enabledProviders.filter((p) => p !== "credentials");
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
void refreshSettings();
|
|
13
|
+
}, [refreshSettings]);
|
|
14
|
+
async function handleSubmit(e) {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
setError(null);
|
|
17
|
+
setLoading(true);
|
|
18
|
+
const form = new FormData(e.currentTarget);
|
|
19
|
+
const email = form.get("email");
|
|
20
|
+
const password = form.get("password");
|
|
21
|
+
try {
|
|
22
|
+
const { error: err } = await authClient.signIn.email({ email, password });
|
|
23
|
+
if (err) {
|
|
24
|
+
const raw = err.message || "Invalid email or password";
|
|
25
|
+
let msg = raw;
|
|
26
|
+
const lower = raw.toLowerCase();
|
|
27
|
+
if (lower.includes("pending approval") || lower.includes("waitlist")) {
|
|
28
|
+
msg = "Your account is pending approval.";
|
|
29
|
+
}
|
|
30
|
+
else if (lower.includes("rejected")) {
|
|
31
|
+
msg = "Your account application was not approved.";
|
|
32
|
+
}
|
|
33
|
+
setError(msg);
|
|
34
|
+
onError?.(msg);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
onSuccess?.();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
setError("Something went wrong. Please try again.");
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
setLoading(false);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return (_jsxs("div", { className: "ak-auth", children: [_jsxs("form", { onSubmit: handleSubmit, className: "ak-form", children: [error && _jsx("div", { className: "ak-error", children: error }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-login-email", children: "Email" }), _jsx("input", { id: "ak-login-email", name: "email", type: "email", required: true })] }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-login-password", children: "Password" }), _jsx("input", { id: "ak-login-password", name: "password", type: "password", required: true })] }), _jsx("button", { type: "submit", disabled: loading, className: "ak-button", children: loading ? "Logging in..." : "Log in" })] }), socialProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "ak-divider", children: "or" }), _jsx("div", { className: "ak-social-buttons", children: socialProviders.map((provider) => (_jsx(SocialButton, { provider: provider, callbackURL: callbackURL }, provider))) })] }))] }));
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["../../src/components/reset-password.tsx"],"names":[],"mappings":"AAMA,UAAU,kBAAkB;IAC1B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CA2E9D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { useSearchParams } from "next/navigation";
|
|
5
|
+
import { useAscendKitContext } from "../client/provider";
|
|
6
|
+
export function ResetPassword({ onSuccess }) {
|
|
7
|
+
const searchParams = useSearchParams();
|
|
8
|
+
const token = useMemo(() => searchParams.get("token"), [searchParams]);
|
|
9
|
+
const { apiUrl, publicKey } = useAscendKitContext();
|
|
10
|
+
const [newPassword, setNewPassword] = useState("");
|
|
11
|
+
const [confirmPassword, setConfirmPassword] = useState("");
|
|
12
|
+
const [loading, setLoading] = useState(false);
|
|
13
|
+
const [message, setMessage] = useState(null);
|
|
14
|
+
const [error, setError] = useState(null);
|
|
15
|
+
async function handleSubmit(e) {
|
|
16
|
+
e.preventDefault();
|
|
17
|
+
setLoading(true);
|
|
18
|
+
setError(null);
|
|
19
|
+
setMessage(null);
|
|
20
|
+
try {
|
|
21
|
+
if (!token) {
|
|
22
|
+
throw new Error("Missing reset token.");
|
|
23
|
+
}
|
|
24
|
+
if (newPassword !== confirmPassword) {
|
|
25
|
+
throw new Error("Passwords do not match.");
|
|
26
|
+
}
|
|
27
|
+
const res = await fetch(`${apiUrl}/api/auth/reset-password`, {
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: { "Content-Type": "application/json" },
|
|
30
|
+
body: JSON.stringify({ publicKey, token, newPassword }),
|
|
31
|
+
});
|
|
32
|
+
const json = await res.json().catch(() => ({}));
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
throw new Error(json.detail || json.error || "Failed to reset password.");
|
|
35
|
+
}
|
|
36
|
+
setMessage("Password reset successfully. You can now sign in.");
|
|
37
|
+
onSuccess?.();
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
setError(err instanceof Error ? err.message : "Failed to reset password.");
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
setLoading(false);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return (_jsx("div", { className: "ak-auth", children: _jsxs("form", { onSubmit: handleSubmit, className: "ak-form", children: [error && _jsx("div", { className: "ak-error", children: error }), message && _jsx("div", { className: "ak-success", children: message }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-reset-password", children: "New password" }), _jsx("input", { id: "ak-reset-password", name: "newPassword", type: "password", minLength: 8, required: true, value: newPassword, onChange: (e) => setNewPassword(e.target.value) })] }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-reset-confirm", children: "Confirm password" }), _jsx("input", { id: "ak-reset-confirm", name: "confirmPassword", type: "password", minLength: 8, required: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value) })] }), _jsx("button", { type: "submit", disabled: loading, className: "ak-button", children: loading ? "Resetting..." : "Reset password" })] }) }));
|
|
47
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface SignInButtonProps {
|
|
2
|
+
/** "modal" opens the auth modal, "redirect" navigates to the sign-in page. */
|
|
3
|
+
mode?: "modal" | "redirect";
|
|
4
|
+
/** Custom redirect path for "redirect" mode (default: "/auth/sign-in"). */
|
|
5
|
+
redirectUrl?: string;
|
|
6
|
+
children?: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Button that opens the sign-in modal or redirects to the sign-in page.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <SignInButton />
|
|
14
|
+
* <SignInButton mode="modal">Log in</SignInButton>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function SignInButton({ mode, redirectUrl, children, }: SignInButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=sign-in-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-in-button.d.ts","sourceRoot":"","sources":["../../src/components/sign-in-button.tsx"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAc,EACd,WAA6B,EAC7B,QAAQ,GACT,EAAE,iBAAiB,2CAwBnB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useAscendKitContext } from "../client/provider";
|
|
4
|
+
/**
|
|
5
|
+
* Button that opens the sign-in modal or redirects to the sign-in page.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <SignInButton />
|
|
10
|
+
* <SignInButton mode="modal">Log in</SignInButton>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function SignInButton({ mode = "modal", redirectUrl = "/auth/sign-in", children, }) {
|
|
14
|
+
const { modal } = useAscendKitContext();
|
|
15
|
+
function handleClick() {
|
|
16
|
+
if (mode === "modal") {
|
|
17
|
+
modal.open("sign-in");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
window.location.href = redirectUrl;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (children) {
|
|
24
|
+
return (_jsx("span", { onClick: handleClick, style: { cursor: "pointer" }, children: children }));
|
|
25
|
+
}
|
|
26
|
+
return (_jsx("button", { type: "button", onClick: handleClick, className: "ak-sign-in-button", children: "Sign in" }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface SignUpButtonProps {
|
|
2
|
+
/** "modal" opens the auth modal, "redirect" navigates to the sign-up page. */
|
|
3
|
+
mode?: "modal" | "redirect";
|
|
4
|
+
/** Custom redirect path for "redirect" mode (default: "/auth/sign-up"). */
|
|
5
|
+
redirectUrl?: string;
|
|
6
|
+
children?: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Button that opens the sign-up modal or redirects to the sign-up page.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```tsx
|
|
13
|
+
* <SignUpButton />
|
|
14
|
+
* <SignUpButton mode="modal">Create account</SignUpButton>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function SignUpButton({ mode, redirectUrl, children, }: SignUpButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=sign-up-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-up-button.d.ts","sourceRoot":"","sources":["../../src/components/sign-up-button.tsx"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAc,EACd,WAA6B,EAC7B,QAAQ,GACT,EAAE,iBAAiB,2CAwBnB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useAscendKitContext } from "../client/provider";
|
|
4
|
+
/**
|
|
5
|
+
* Button that opens the sign-up modal or redirects to the sign-up page.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <SignUpButton />
|
|
10
|
+
* <SignUpButton mode="modal">Create account</SignUpButton>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export function SignUpButton({ mode = "modal", redirectUrl = "/auth/sign-up", children, }) {
|
|
14
|
+
const { modal } = useAscendKitContext();
|
|
15
|
+
function handleClick() {
|
|
16
|
+
if (mode === "modal") {
|
|
17
|
+
modal.open("sign-up");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
window.location.href = redirectUrl;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (children) {
|
|
24
|
+
return (_jsx("span", { onClick: handleClick, style: { cursor: "pointer" }, children: children }));
|
|
25
|
+
}
|
|
26
|
+
return (_jsx("button", { type: "button", onClick: handleClick, className: "ak-sign-up-button", children: "Sign up" }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface SignUpProps {
|
|
2
|
+
onSuccess?: () => void;
|
|
3
|
+
onError?: (error: string) => void;
|
|
4
|
+
/** Redirect URL after social login completes. */
|
|
5
|
+
callbackURL?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function SignUp({ onSuccess, onError, callbackURL }: SignUpProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=signup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/components/signup.tsx"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,WAAW,2CA6GtE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { useAscendKitContext } from "../client/provider";
|
|
5
|
+
import { SocialButton } from "./social-button";
|
|
6
|
+
export function SignUp({ onSuccess, onError, callbackURL }) {
|
|
7
|
+
const { authClient, enabledProviders, refreshSettings } = useAscendKitContext();
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const [loading, setLoading] = useState(false);
|
|
10
|
+
const socialProviders = enabledProviders.filter((p) => p !== "credentials");
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
void refreshSettings();
|
|
13
|
+
}, [refreshSettings]);
|
|
14
|
+
async function handleSubmit(e) {
|
|
15
|
+
e.preventDefault();
|
|
16
|
+
setError(null);
|
|
17
|
+
setLoading(true);
|
|
18
|
+
const form = new FormData(e.currentTarget);
|
|
19
|
+
const name = form.get("name");
|
|
20
|
+
const email = form.get("email");
|
|
21
|
+
const password = form.get("password");
|
|
22
|
+
const confirmPassword = form.get("confirmPassword");
|
|
23
|
+
if (password !== confirmPassword) {
|
|
24
|
+
setError("Passwords do not match");
|
|
25
|
+
setLoading(false);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
// Better Auth auto-signs in after signup (autoSignIn defaults to true)
|
|
30
|
+
const { error: err } = await authClient.signUp.email({
|
|
31
|
+
name,
|
|
32
|
+
email,
|
|
33
|
+
password,
|
|
34
|
+
});
|
|
35
|
+
if (err) {
|
|
36
|
+
const raw = err.message || "Signup failed";
|
|
37
|
+
let msg = raw;
|
|
38
|
+
const lower = raw.toLowerCase();
|
|
39
|
+
if (lower.includes("pending approval") || lower.includes("waitlist")) {
|
|
40
|
+
msg = "You are on the waitlist. We will notify you when your account is approved.";
|
|
41
|
+
}
|
|
42
|
+
else if (lower.includes("rejected")) {
|
|
43
|
+
msg = "Your account application was not approved.";
|
|
44
|
+
}
|
|
45
|
+
setError(msg);
|
|
46
|
+
onError?.(msg);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
onSuccess?.();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
setError("Something went wrong. Please try again.");
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
setLoading(false);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return (_jsxs("div", { className: "ak-auth", children: [_jsxs("form", { onSubmit: handleSubmit, className: "ak-form", children: [error && _jsx("div", { className: "ak-error", children: error }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-name", children: "Name" }), _jsx("input", { id: "ak-name", name: "name", type: "text", required: true })] }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-email", children: "Email" }), _jsx("input", { id: "ak-email", name: "email", type: "email", required: true })] }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-password", children: "Password" }), _jsx("input", { id: "ak-password", name: "password", type: "password", minLength: 8, required: true })] }), _jsxs("div", { className: "ak-field", children: [_jsx("label", { htmlFor: "ak-confirm", children: "Confirm password" }), _jsx("input", { id: "ak-confirm", name: "confirmPassword", type: "password", minLength: 8, required: true })] }), _jsx("button", { type: "submit", disabled: loading, className: "ak-button", children: loading ? "Creating account..." : "Sign up" })] }), socialProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "ak-divider", children: "or" }), _jsx("div", { className: "ak-social-buttons", children: socialProviders.map((provider) => (_jsx(SocialButton, { provider: provider, callbackURL: callbackURL }, provider))) })] }))] }));
|
|
60
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface SocialButtonProps {
|
|
2
|
+
provider: string;
|
|
3
|
+
label?: string;
|
|
4
|
+
callbackURL?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function SocialButton({ provider, label, callbackURL }: SocialButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=social-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-button.d.ts","sourceRoot":"","sources":["../../src/components/social-button.tsx"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,iBAAiB,2CAgB/E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useAscendKitContext } from "../client/provider";
|
|
4
|
+
export function SocialButton({ provider, label, callbackURL }) {
|
|
5
|
+
const { authClient } = useAscendKitContext();
|
|
6
|
+
function handleClick() {
|
|
7
|
+
authClient.signIn.social({ provider, callbackURL });
|
|
8
|
+
}
|
|
9
|
+
return (_jsx("button", { type: "button", onClick: handleClick, className: `ak-social-button ak-social-${provider}`, children: label || `Continue with ${provider.charAt(0).toUpperCase() + provider.slice(1)}` }));
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type UserButtonProps } from "@daveyplate/better-auth-ui";
|
|
2
|
+
/**
|
|
3
|
+
* User avatar dropdown with sign-out, powered by Better Auth UI.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ```tsx
|
|
7
|
+
* <AscendKitUserButton />
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare function AscendKitUserButton(props: UserButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=user-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-button.d.ts","sourceRoot":"","sources":["../../src/components/user-button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE9E;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,2CAEzD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { UserButton } from "@daveyplate/better-auth-ui";
|
|
4
|
+
/**
|
|
5
|
+
* User avatar dropdown with sign-out, powered by Better Auth UI.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* <AscendKitUserButton />
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export function AscendKitUserButton(props) {
|
|
13
|
+
return _jsx(UserButton, { ...props, disableDefaultLinks: true });
|
|
14
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AscendKitAuth, createAscendKitAuthRuntime, createAscendKitAdapter, createAccessTokenHandler, Analytics, } from "./server";
|
|
2
|
+
export type { AscendKitAuthOptions, AscendKitSession, AscendKitUser, BrandingConfig } from "./shared/types";
|
|
3
|
+
export { AscendKitProvider, useAscendKitContext, useAscendKit, useAuthModal, useAccessToken, useSessions, useUser, useAnalytics, verifyEmail } from "./client";
|
|
4
|
+
export { Login, SignUp, EmailVerification, ForgotPassword, ResetPassword, SocialButton, AscendKitAuthCard, AuthModal, SignInButton, SignUpButton, AscendKitUserButton, BrandingBadge, } from "./components";
|
|
5
|
+
export { SignedIn, SignedOut, AuthLoading } from "@daveyplate/better-auth-ui";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|