@edge-base/auth-ui-react 0.1.1
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/README.md +180 -0
- package/dist/components/AuthForm.d.ts +11 -0
- package/dist/components/AuthForm.d.ts.map +1 -0
- package/dist/components/AuthForm.js +71 -0
- package/dist/components/AuthForm.js.map +1 -0
- package/dist/components/EmailOTP.d.ts +11 -0
- package/dist/components/EmailOTP.d.ts.map +1 -0
- package/dist/components/EmailOTP.js +56 -0
- package/dist/components/EmailOTP.js.map +1 -0
- package/dist/components/ForgotPassword.d.ts +9 -0
- package/dist/components/ForgotPassword.d.ts.map +1 -0
- package/dist/components/ForgotPassword.js +36 -0
- package/dist/components/ForgotPassword.js.map +1 -0
- package/dist/components/MFAChallenge.d.ts +17 -0
- package/dist/components/MFAChallenge.d.ts.map +1 -0
- package/dist/components/MFAChallenge.js +44 -0
- package/dist/components/MFAChallenge.js.map +1 -0
- package/dist/components/MagicLink.d.ts +9 -0
- package/dist/components/MagicLink.d.ts.map +1 -0
- package/dist/components/MagicLink.js +39 -0
- package/dist/components/MagicLink.js.map +1 -0
- package/dist/components/PhoneOTP.d.ts +11 -0
- package/dist/components/PhoneOTP.d.ts.map +1 -0
- package/dist/components/PhoneOTP.js +56 -0
- package/dist/components/PhoneOTP.js.map +1 -0
- package/dist/components/SignIn.d.ts +16 -0
- package/dist/components/SignIn.d.ts.map +1 -0
- package/dist/components/SignIn.js +39 -0
- package/dist/components/SignIn.js.map +1 -0
- package/dist/components/SignUp.d.ts +11 -0
- package/dist/components/SignUp.d.ts.map +1 -0
- package/dist/components/SignUp.js +43 -0
- package/dist/components/SignUp.js.map +1 -0
- package/dist/components/SocialButtons.d.ts +6 -0
- package/dist/components/SocialButtons.d.ts.map +1 -0
- package/dist/components/SocialButtons.js +39 -0
- package/dist/components/SocialButtons.js.map +1 -0
- package/dist/context.d.ts +80 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +69 -0
- package/dist/context.js.map +1 -0
- package/dist/hooks/useAuth.d.ts +11 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +34 -0
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +344 -0
- package/llms.txt +106 -0
- package/package.json +65 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* PhoneOTP — phone number OTP sign-in form.
|
|
4
|
+
*
|
|
5
|
+
* Two-step flow: 1) Enter phone → send SMS code, 2) Enter code → verify.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useCallback } from 'react';
|
|
8
|
+
import { useAuthContext } from '../context.js';
|
|
9
|
+
export function PhoneOTP({ onSuccess, onViewChange, className }) {
|
|
10
|
+
const { client, config, labels } = useAuthContext();
|
|
11
|
+
const cx = config.classPrefix;
|
|
12
|
+
const [phone, setPhone] = useState('');
|
|
13
|
+
const [code, setCode] = useState('');
|
|
14
|
+
const [step, setStep] = useState('phone');
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
const handleSendCode = useCallback(async (e) => {
|
|
18
|
+
e.preventDefault();
|
|
19
|
+
setError(null);
|
|
20
|
+
setLoading(true);
|
|
21
|
+
try {
|
|
22
|
+
await client.auth.signInWithPhone({ phone });
|
|
23
|
+
setStep('code');
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
setError(err.message || 'Failed to send SMS code');
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
setLoading(false);
|
|
30
|
+
}
|
|
31
|
+
}, [client, phone]);
|
|
32
|
+
const handleVerify = useCallback(async (e) => {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
setError(null);
|
|
35
|
+
setLoading(true);
|
|
36
|
+
try {
|
|
37
|
+
await client.auth.verifyPhone({ phone, code });
|
|
38
|
+
onSuccess?.();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
setError(err.message || 'Verification failed');
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
setLoading(false);
|
|
45
|
+
}
|
|
46
|
+
}, [client, phone, code, onSuccess]);
|
|
47
|
+
if (step === 'code') {
|
|
48
|
+
return (_jsxs("form", { className: `${cx}-form ${cx}-phone-otp ${className || ''}`.trim(), onSubmit: handleVerify, children: [_jsx("h2", { className: `${cx}-title`, children: labels.verifyCode }), _jsxs("p", { className: `${cx}-description`, children: ["Enter the code sent to ", phone] }), error && _jsx("div", { className: `${cx}-error`, children: error }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-phone-otp-code`, children: labels.code }), _jsx("input", { id: `${cx}-phone-otp-code`, className: `${cx}-input ${cx}-input-code`, type: "text", inputMode: "numeric", value: code, onChange: (e) => setCode(e.target.value), required: true, autoComplete: "one-time-code", placeholder: "000000", disabled: loading, autoFocus: true })] }), _jsx("button", { type: "submit", className: `${cx}-button ${cx}-button-primary`, disabled: loading, children: loading ? labels.loading : labels.verifyCode }), _jsx("button", { type: "button", className: `${cx}-link`, onClick: () => {
|
|
49
|
+
setStep('phone');
|
|
50
|
+
setCode('');
|
|
51
|
+
setError(null);
|
|
52
|
+
}, children: "Change phone number" })] }));
|
|
53
|
+
}
|
|
54
|
+
return (_jsxs("form", { className: `${cx}-form ${cx}-phone-otp ${className || ''}`.trim(), onSubmit: handleSendCode, children: [_jsx("h2", { className: `${cx}-title`, children: labels.sendOTP }), _jsx("p", { className: `${cx}-description`, children: "Enter your phone number to receive a sign-in code via SMS." }), error && _jsx("div", { className: `${cx}-error`, children: error }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-phone-otp-phone`, children: labels.phone }), _jsx("input", { id: `${cx}-phone-otp-phone`, className: `${cx}-input`, type: "tel", value: phone, onChange: (e) => setPhone(e.target.value), required: true, autoComplete: "tel", placeholder: "+1234567890", disabled: loading })] }), _jsx("button", { type: "submit", className: `${cx}-button ${cx}-button-primary`, disabled: loading, children: loading ? labels.loading : labels.sendOTP }), _jsx("button", { type: "button", className: `${cx}-link`, onClick: () => onViewChange?.('sign_in'), children: labels.backToSignIn })] }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=PhoneOTP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhoneOTP.js","sourceRoot":"","sources":["../../src/components/PhoneOTP.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AACH,OAAc,EAAE,QAAQ,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAY/C,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAiB;IAC5E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;IAE9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAmB,OAAO,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,CAAY,EAAE,EAAE;QACxD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,yBAAyB,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpB,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,CAAY,EAAE,EAAE;QACtD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CACL,gBACE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EACjE,QAAQ,EAAE,YAAY,aAEtB,aAAI,SAAS,EAAE,GAAG,EAAE,QAAQ,YAAG,MAAM,CAAC,UAAU,GAAM,EAEtD,aAAG,SAAS,EAAE,GAAG,EAAE,cAAc,wCACP,KAAK,IAC3B,EAEH,KAAK,IAAI,cAAK,SAAS,EAAE,GAAG,EAAE,QAAQ,YAAG,KAAK,GAAO,EAEtD,eAAK,SAAS,EAAE,GAAG,EAAE,QAAQ,aAC3B,gBAAO,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,YAC7D,MAAM,CAAC,IAAI,GACN,EACR,gBACE,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAC1B,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EACzC,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,QAAQ,QACR,YAAY,EAAC,eAAe,EAC5B,WAAW,EAAC,QAAQ,EACpB,QAAQ,EAAE,OAAO,EACjB,SAAS,SACT,IACE,EAEN,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,EAC9C,QAAQ,EAAE,OAAO,YAEhB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GACtC,EAET,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,EAAE,OAAO,EACvB,OAAO,EAAE,GAAG,EAAE;wBACZ,OAAO,CAAC,OAAO,CAAC,CAAC;wBACjB,OAAO,CAAC,EAAE,CAAC,CAAC;wBACZ,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACjB,CAAC,oCAGM,IACJ,CACR,CAAC;IACJ,CAAC;IAED,OAAO,CACL,gBACE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EACjE,QAAQ,EAAE,cAAc,aAExB,aAAI,SAAS,EAAE,GAAG,EAAE,QAAQ,YAAG,MAAM,CAAC,OAAO,GAAM,EAEnD,YAAG,SAAS,EAAE,GAAG,EAAE,cAAc,2EAE7B,EAEH,KAAK,IAAI,cAAK,SAAS,EAAE,GAAG,EAAE,QAAQ,YAAG,KAAK,GAAO,EAEtD,eAAK,SAAS,EAAE,GAAG,EAAE,QAAQ,aAC3B,gBAAO,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,YAC9D,MAAM,CAAC,KAAK,GACP,EACR,gBACE,EAAE,EAAE,GAAG,EAAE,kBAAkB,EAC3B,SAAS,EAAE,GAAG,EAAE,QAAQ,EACxB,IAAI,EAAC,KAAK,EACV,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,QACR,YAAY,EAAC,KAAK,EAClB,WAAW,EAAC,aAAa,EACzB,QAAQ,EAAE,OAAO,GACjB,IACE,EAEN,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB,EAC9C,QAAQ,EAAE,OAAO,YAEhB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GACnC,EAET,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,EAAE,OAAO,EACvB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,YAEvC,MAAM,CAAC,YAAY,GACb,IACJ,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AuthView } from '../context.js';
|
|
2
|
+
export interface SignInProps {
|
|
3
|
+
/** Called after successful sign-in */
|
|
4
|
+
onSuccess?: () => void;
|
|
5
|
+
/** Called when MFA challenge is required */
|
|
6
|
+
onMfaRequired?: (mfaTicket: string, factors: Array<{
|
|
7
|
+
id: string;
|
|
8
|
+
type: string;
|
|
9
|
+
}>) => void;
|
|
10
|
+
/** Called to switch to another view */
|
|
11
|
+
onViewChange?: (view: AuthView) => void;
|
|
12
|
+
/** Additional CSS class */
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function SignIn({ onSuccess, onMfaRequired, onViewChange, className }: SignInProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=SignIn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignIn.d.ts","sourceRoot":"","sources":["../../src/components/SignIn.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC1F,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,WAAW,2CAoGxF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SignIn — email/password sign-in form component.
|
|
4
|
+
*
|
|
5
|
+
* Headless-first: renders with CSS class hooks, no inline styles.
|
|
6
|
+
* Uses `classPrefix` from AuthProvider context (default: 'eb-auth').
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useCallback } from 'react';
|
|
9
|
+
import { useAuthContext } from '../context.js';
|
|
10
|
+
export function SignIn({ onSuccess, onMfaRequired, onViewChange, className }) {
|
|
11
|
+
const { client, config, labels } = useAuthContext();
|
|
12
|
+
const cx = config.classPrefix;
|
|
13
|
+
const [email, setEmail] = useState('');
|
|
14
|
+
const [password, setPassword] = useState('');
|
|
15
|
+
const [error, setError] = useState(null);
|
|
16
|
+
const [loading, setLoading] = useState(false);
|
|
17
|
+
const handleSubmit = useCallback(async (e) => {
|
|
18
|
+
e.preventDefault();
|
|
19
|
+
setError(null);
|
|
20
|
+
setLoading(true);
|
|
21
|
+
try {
|
|
22
|
+
const result = await client.auth.signIn({ email, password });
|
|
23
|
+
if ('mfaRequired' in result && result.mfaRequired) {
|
|
24
|
+
onMfaRequired?.(result.mfaTicket, result.factors);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
onSuccess?.();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
setError(err.message || 'Sign in failed');
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
setLoading(false);
|
|
35
|
+
}
|
|
36
|
+
}, [client, email, password, onSuccess, onMfaRequired]);
|
|
37
|
+
return (_jsxs("form", { className: `${cx}-form ${cx}-sign-in ${className || ''}`.trim(), onSubmit: handleSubmit, children: [_jsx("h2", { className: `${cx}-title`, children: labels.signIn }), error && _jsx("div", { className: `${cx}-error`, children: error }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-email`, children: labels.email }), _jsx("input", { id: `${cx}-email`, className: `${cx}-input`, type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, autoComplete: "email", disabled: loading })] }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-password`, children: labels.password }), _jsx("input", { id: `${cx}-password`, className: `${cx}-input`, type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, autoComplete: "current-password", disabled: loading })] }), config.showForgotPassword && (_jsx("button", { type: "button", className: `${cx}-link ${cx}-forgot-link`, onClick: () => onViewChange?.('forgot_password'), children: labels.forgotPassword })), _jsx("button", { type: "submit", className: `${cx}-button ${cx}-button-primary`, disabled: loading, children: loading ? labels.loading : labels.signIn }), config.showToggle && (_jsxs("p", { className: `${cx}-toggle`, children: [labels.dontHaveAccount, ' ', _jsx("button", { type: "button", className: `${cx}-link`, onClick: () => onViewChange?.('sign_up'), children: labels.signUp })] }))] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=SignIn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignIn.js","sourceRoot":"","sources":["../../src/components/SignIn.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AuthView } from '../context.js';
|
|
2
|
+
export interface SignUpProps {
|
|
3
|
+
/** Called after successful sign-up */
|
|
4
|
+
onSuccess?: () => void;
|
|
5
|
+
/** Called to switch to another view */
|
|
6
|
+
onViewChange?: (view: AuthView) => void;
|
|
7
|
+
/** Additional CSS class */
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function SignUp({ onSuccess, onViewChange, className }: SignUpProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=SignUp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignUp.d.ts","sourceRoot":"","sources":["../../src/components/SignUp.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,WAAW,2CAiIzE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SignUp — email/password registration form component.
|
|
4
|
+
*
|
|
5
|
+
* Headless-first: renders with CSS class hooks, no inline styles.
|
|
6
|
+
*/
|
|
7
|
+
import { useState, useCallback } from 'react';
|
|
8
|
+
import { useAuthContext } from '../context.js';
|
|
9
|
+
export function SignUp({ onSuccess, onViewChange, className }) {
|
|
10
|
+
const { client, config, labels } = useAuthContext();
|
|
11
|
+
const cx = config.classPrefix;
|
|
12
|
+
const [email, setEmail] = useState('');
|
|
13
|
+
const [password, setPassword] = useState('');
|
|
14
|
+
const [confirmPassword, setConfirmPassword] = useState('');
|
|
15
|
+
const [displayName, setDisplayName] = useState('');
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
const [loading, setLoading] = useState(false);
|
|
18
|
+
const handleSubmit = useCallback(async (e) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
setError(null);
|
|
21
|
+
if (password !== confirmPassword) {
|
|
22
|
+
setError('Passwords do not match');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
setLoading(true);
|
|
26
|
+
try {
|
|
27
|
+
await client.auth.signUp({
|
|
28
|
+
email,
|
|
29
|
+
password,
|
|
30
|
+
data: displayName ? { displayName } : undefined,
|
|
31
|
+
});
|
|
32
|
+
onSuccess?.();
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
setError(err.message || 'Sign up failed');
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
setLoading(false);
|
|
39
|
+
}
|
|
40
|
+
}, [client, email, password, confirmPassword, displayName, onSuccess]);
|
|
41
|
+
return (_jsxs("form", { className: `${cx}-form ${cx}-sign-up ${className || ''}`.trim(), onSubmit: handleSubmit, children: [_jsx("h2", { className: `${cx}-title`, children: labels.signUp }), error && _jsx("div", { className: `${cx}-error`, children: error }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-signup-name`, children: labels.displayName }), _jsx("input", { id: `${cx}-signup-name`, className: `${cx}-input`, type: "text", value: displayName, onChange: (e) => setDisplayName(e.target.value), autoComplete: "name", disabled: loading })] }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-signup-email`, children: labels.email }), _jsx("input", { id: `${cx}-signup-email`, className: `${cx}-input`, type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, autoComplete: "email", disabled: loading })] }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-signup-password`, children: labels.password }), _jsx("input", { id: `${cx}-signup-password`, className: `${cx}-input`, type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, autoComplete: "new-password", disabled: loading })] }), _jsxs("div", { className: `${cx}-field`, children: [_jsx("label", { className: `${cx}-label`, htmlFor: `${cx}-signup-confirm`, children: labels.confirmPassword }), _jsx("input", { id: `${cx}-signup-confirm`, className: `${cx}-input`, type: "password", value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), required: true, autoComplete: "new-password", disabled: loading })] }), _jsx("button", { type: "submit", className: `${cx}-button ${cx}-button-primary`, disabled: loading, children: loading ? labels.loading : labels.signUp }), config.showToggle && (_jsxs("p", { className: `${cx}-toggle`, children: [labels.alreadyHaveAccount, ' ', _jsx("button", { type: "button", className: `${cx}-link`, onClick: () => onViewChange?.('sign_in'), children: labels.signIn })] }))] }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=SignUp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignUp.js","sourceRoot":"","sources":["../../src/components/SignUp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SocialButtons.d.ts","sourceRoot":"","sources":["../../src/components/SocialButtons.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,kBAAkB;IACjC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,kDAiC9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SocialButtons — OAuth provider buttons.
|
|
4
|
+
*
|
|
5
|
+
* Renders a button for each configured provider.
|
|
6
|
+
* Uses signInWithOAuth which redirects the browser.
|
|
7
|
+
*/
|
|
8
|
+
import { useCallback } from 'react';
|
|
9
|
+
import { useAuthContext } from '../context.js';
|
|
10
|
+
/** Display labels for well-known OAuth providers */
|
|
11
|
+
const PROVIDER_LABELS = {
|
|
12
|
+
google: 'Google',
|
|
13
|
+
github: 'GitHub',
|
|
14
|
+
apple: 'Apple',
|
|
15
|
+
discord: 'Discord',
|
|
16
|
+
twitter: 'Twitter',
|
|
17
|
+
facebook: 'Facebook',
|
|
18
|
+
microsoft: 'Microsoft',
|
|
19
|
+
gitlab: 'GitLab',
|
|
20
|
+
bitbucket: 'Bitbucket',
|
|
21
|
+
linkedin: 'LinkedIn',
|
|
22
|
+
slack: 'Slack',
|
|
23
|
+
spotify: 'Spotify',
|
|
24
|
+
twitch: 'Twitch',
|
|
25
|
+
};
|
|
26
|
+
export function SocialButtons({ className }) {
|
|
27
|
+
const { client, config, labels } = useAuthContext();
|
|
28
|
+
const cx = config.classPrefix;
|
|
29
|
+
const providers = config.providers;
|
|
30
|
+
const handleOAuth = useCallback((provider) => {
|
|
31
|
+
client.auth.signInWithOAuth(provider, {
|
|
32
|
+
redirectUrl: config.oauthRedirectUrl,
|
|
33
|
+
});
|
|
34
|
+
}, [client, config.oauthRedirectUrl]);
|
|
35
|
+
if (!providers || providers.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
return (_jsxs("div", { className: `${cx}-social ${className || ''}`.trim(), children: [_jsx("div", { className: `${cx}-divider`, children: _jsx("span", { children: labels.orContinueWith }) }), _jsx("div", { className: `${cx}-social-buttons`, children: providers.map((provider) => (_jsx("button", { type: "button", className: `${cx}-button ${cx}-button-social ${cx}-button-${provider}`, onClick: () => handleOAuth(provider), children: PROVIDER_LABELS[provider] || provider }, provider))) })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=SocialButtons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SocialButtons.js","sourceRoot":"","sources":["../../src/components/SocialButtons.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,oDAAoD;AACpD,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAOF,MAAM,UAAU,aAAa,CAAC,EAAE,SAAS,EAAsB;IAC7D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;IAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,QAAgB,EAAE,EAAE;QACnD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;YACpC,WAAW,EAAE,MAAM,CAAC,gBAAgB;SACrC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtD,OAAO,CACL,eAAK,SAAS,EAAE,GAAG,EAAE,WAAW,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,aACtD,cAAK,SAAS,EAAE,GAAG,EAAE,UAAU,YAC7B,yBAAO,MAAM,CAAC,cAAc,GAAQ,GAChC,EAEN,cAAK,SAAS,EAAE,GAAG,EAAE,iBAAiB,YACnC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC3B,iBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,QAAQ,EAAE,EACtE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,YAEnC,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ,IALjC,QAAQ,CAMN,CACV,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthUI Context — provides EdgeBase client and configuration to all auth components.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { createClient } from '@edge-base/web';
|
|
7
|
+
* import { AuthProvider } from '@edge-base/auth-ui-react';
|
|
8
|
+
*
|
|
9
|
+
* const client = createClient('https://my-app.edgebase.fun');
|
|
10
|
+
*
|
|
11
|
+
* function App() {
|
|
12
|
+
* return (
|
|
13
|
+
* <AuthProvider client={client}>
|
|
14
|
+
* <AuthForm />
|
|
15
|
+
* </AuthProvider>
|
|
16
|
+
* );
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import React from 'react';
|
|
21
|
+
import type { ClientEdgeBase } from '@edge-base/web';
|
|
22
|
+
export interface AuthUIConfig {
|
|
23
|
+
/** OAuth providers to show (e.g., ['google', 'github', 'apple']) */
|
|
24
|
+
providers?: string[];
|
|
25
|
+
/** Default view: 'sign_in' | 'sign_up' | 'magic_link' | 'email_otp' */
|
|
26
|
+
defaultView?: AuthView;
|
|
27
|
+
/** Show "Forgot Password?" link */
|
|
28
|
+
showForgotPassword?: boolean;
|
|
29
|
+
/** Show sign-up link on sign-in form and vice versa */
|
|
30
|
+
showToggle?: boolean;
|
|
31
|
+
/** Custom redirect URL for OAuth */
|
|
32
|
+
oauthRedirectUrl?: string;
|
|
33
|
+
/** Enable magic link option */
|
|
34
|
+
magicLinkEnabled?: boolean;
|
|
35
|
+
/** Enable email OTP option */
|
|
36
|
+
emailOtpEnabled?: boolean;
|
|
37
|
+
/** Enable phone OTP option */
|
|
38
|
+
phoneOtpEnabled?: boolean;
|
|
39
|
+
/** CSS class prefix for styling (default: 'eb-auth') */
|
|
40
|
+
classPrefix?: string;
|
|
41
|
+
/** Localization overrides */
|
|
42
|
+
localization?: Partial<AuthUILabels>;
|
|
43
|
+
}
|
|
44
|
+
export type AuthView = 'sign_in' | 'sign_up' | 'magic_link' | 'email_otp' | 'phone_otp' | 'forgot_password' | 'reset_password' | 'mfa_challenge' | 'verify_email';
|
|
45
|
+
export interface AuthUILabels {
|
|
46
|
+
signIn: string;
|
|
47
|
+
signUp: string;
|
|
48
|
+
signOut: string;
|
|
49
|
+
email: string;
|
|
50
|
+
password: string;
|
|
51
|
+
confirmPassword: string;
|
|
52
|
+
forgotPassword: string;
|
|
53
|
+
resetPassword: string;
|
|
54
|
+
sendResetLink: string;
|
|
55
|
+
sendMagicLink: string;
|
|
56
|
+
sendOTP: string;
|
|
57
|
+
verifyCode: string;
|
|
58
|
+
orContinueWith: string;
|
|
59
|
+
dontHaveAccount: string;
|
|
60
|
+
alreadyHaveAccount: string;
|
|
61
|
+
phone: string;
|
|
62
|
+
code: string;
|
|
63
|
+
submit: string;
|
|
64
|
+
loading: string;
|
|
65
|
+
displayName: string;
|
|
66
|
+
backToSignIn: string;
|
|
67
|
+
}
|
|
68
|
+
export interface AuthContextValue {
|
|
69
|
+
client: ClientEdgeBase;
|
|
70
|
+
config: Required<Pick<AuthUIConfig, 'classPrefix' | 'showForgotPassword' | 'showToggle'>> & AuthUIConfig;
|
|
71
|
+
labels: AuthUILabels;
|
|
72
|
+
}
|
|
73
|
+
export interface AuthProviderProps {
|
|
74
|
+
client: ClientEdgeBase;
|
|
75
|
+
config?: AuthUIConfig;
|
|
76
|
+
children: React.ReactNode;
|
|
77
|
+
}
|
|
78
|
+
export declare function AuthProvider({ client, config, children }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
export declare function useAuthContext(): AuthContextValue;
|
|
80
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,uEAAuE;IACvE,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,mCAAmC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uDAAuD;IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACtC;AAED,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,SAAS,GACT,YAAY,GACZ,WAAW,GACX,WAAW,GACX,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,cAAc,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AA0BD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,oBAAoB,GAAG,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC;IACzG,MAAM,EAAE,YAAY,CAAC;CACtB;AAID,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoB3E;AAED,wBAAgB,cAAc,IAAI,gBAAgB,CAMjD"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* AuthUI Context — provides EdgeBase client and configuration to all auth components.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* ```tsx
|
|
7
|
+
* import { createClient } from '@edge-base/web';
|
|
8
|
+
* import { AuthProvider } from '@edge-base/auth-ui-react';
|
|
9
|
+
*
|
|
10
|
+
* const client = createClient('https://my-app.edgebase.fun');
|
|
11
|
+
*
|
|
12
|
+
* function App() {
|
|
13
|
+
* return (
|
|
14
|
+
* <AuthProvider client={client}>
|
|
15
|
+
* <AuthForm />
|
|
16
|
+
* </AuthProvider>
|
|
17
|
+
* );
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
22
|
+
const DEFAULT_LABELS = {
|
|
23
|
+
signIn: 'Sign In',
|
|
24
|
+
signUp: 'Sign Up',
|
|
25
|
+
signOut: 'Sign Out',
|
|
26
|
+
email: 'Email',
|
|
27
|
+
password: 'Password',
|
|
28
|
+
confirmPassword: 'Confirm Password',
|
|
29
|
+
forgotPassword: 'Forgot Password?',
|
|
30
|
+
resetPassword: 'Reset Password',
|
|
31
|
+
sendResetLink: 'Send Reset Link',
|
|
32
|
+
sendMagicLink: 'Send Magic Link',
|
|
33
|
+
sendOTP: 'Send Code',
|
|
34
|
+
verifyCode: 'Verify Code',
|
|
35
|
+
orContinueWith: 'Or continue with',
|
|
36
|
+
dontHaveAccount: "Don't have an account?",
|
|
37
|
+
alreadyHaveAccount: 'Already have an account?',
|
|
38
|
+
phone: 'Phone Number',
|
|
39
|
+
code: 'Verification Code',
|
|
40
|
+
submit: 'Submit',
|
|
41
|
+
loading: 'Loading...',
|
|
42
|
+
displayName: 'Display Name',
|
|
43
|
+
backToSignIn: 'Back to Sign In',
|
|
44
|
+
};
|
|
45
|
+
const AuthContext = createContext(null);
|
|
46
|
+
export function AuthProvider({ client, config, children }) {
|
|
47
|
+
const value = useMemo(() => ({
|
|
48
|
+
client,
|
|
49
|
+
config: {
|
|
50
|
+
classPrefix: 'eb-auth',
|
|
51
|
+
showForgotPassword: true,
|
|
52
|
+
showToggle: true,
|
|
53
|
+
...config,
|
|
54
|
+
},
|
|
55
|
+
labels: {
|
|
56
|
+
...DEFAULT_LABELS,
|
|
57
|
+
...config?.localization,
|
|
58
|
+
},
|
|
59
|
+
}), [client, config]);
|
|
60
|
+
return (_jsx(AuthContext.Provider, { value: value, children: children }));
|
|
61
|
+
}
|
|
62
|
+
export function useAuthContext() {
|
|
63
|
+
const ctx = useContext(AuthContext);
|
|
64
|
+
if (!ctx) {
|
|
65
|
+
throw new Error('useAuthContext must be used within an <AuthProvider>');
|
|
66
|
+
}
|
|
67
|
+
return ctx;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AA6DlE,MAAM,cAAc,GAAiB;IACnC,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,kBAAkB;IAClC,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,iBAAiB;IAChC,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,WAAW;IACpB,UAAU,EAAE,aAAa;IACzB,cAAc,EAAE,kBAAkB;IAClC,eAAe,EAAE,wBAAwB;IACzC,kBAAkB,EAAE,0BAA0B;IAC9C,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,YAAY;IACrB,WAAW,EAAE,cAAc;IAC3B,YAAY,EAAE,iBAAiB;CAChC,CAAC;AAQF,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAQjE,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAqB;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAmB,GAAG,EAAE,CAAC,CAAC;QAC7C,MAAM;QACN,MAAM,EAAE;YACN,WAAW,EAAE,SAAS;YACtB,kBAAkB,EAAE,IAAI;YACxB,UAAU,EAAE,IAAI;YAChB,GAAG,MAAM;SACV;QACD,MAAM,EAAE;YACN,GAAG,cAAc;YACjB,GAAG,MAAM,EAAE,YAAY;SACxB;KACF,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC/B,QAAQ,GACY,CACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TokenUser } from '@edge-base/web';
|
|
2
|
+
export interface UseAuthReturn {
|
|
3
|
+
/** Current authenticated user, or null */
|
|
4
|
+
user: TokenUser | null;
|
|
5
|
+
/** Whether the auth state is still loading */
|
|
6
|
+
loading: boolean;
|
|
7
|
+
/** Sign out the current user */
|
|
8
|
+
signOut: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare function useAuth(): UseAuthReturn;
|
|
11
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,OAAO,IAAI,aAAa,CA2BvC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useAuth — hook for accessing authentication state and user data.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```tsx
|
|
6
|
+
* const { user, loading, signOut } = useAuth();
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
10
|
+
import { useAuthContext } from '../context.js';
|
|
11
|
+
export function useAuth() {
|
|
12
|
+
const { client } = useAuthContext();
|
|
13
|
+
const [user, setUser] = useState(null);
|
|
14
|
+
const [loading, setLoading] = useState(true);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// Get initial user state
|
|
17
|
+
const currentUser = client.auth.currentUser;
|
|
18
|
+
setUser(currentUser);
|
|
19
|
+
setLoading(false);
|
|
20
|
+
// Subscribe to auth state changes
|
|
21
|
+
const unsubscribe = client.auth.onAuthStateChange((newUser) => {
|
|
22
|
+
setUser(newUser);
|
|
23
|
+
setLoading(false);
|
|
24
|
+
});
|
|
25
|
+
return () => {
|
|
26
|
+
unsubscribe();
|
|
27
|
+
};
|
|
28
|
+
}, [client]);
|
|
29
|
+
const signOut = useCallback(async () => {
|
|
30
|
+
await client.auth.signOut();
|
|
31
|
+
}, [client]);
|
|
32
|
+
return { user, loading, signOut };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=useAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAW/C,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAmB,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,yBAAyB;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5C,OAAO,CAAC,WAAW,CAAC,CAAC;QACrB,UAAU,CAAC,KAAK,CAAC,CAAC;QAElB,kCAAkC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;YACjB,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @edge-base/auth-ui-react — Headless React authentication UI components.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { createClient } from '@edge-base/web';
|
|
7
|
+
* import { AuthProvider, AuthForm } from '@edge-base/auth-ui-react';
|
|
8
|
+
* import '@edge-base/auth-ui-react/styles.css'; // optional default theme
|
|
9
|
+
*
|
|
10
|
+
* const client = createClient('https://my-app.edgebase.fun');
|
|
11
|
+
*
|
|
12
|
+
* function App() {
|
|
13
|
+
* return (
|
|
14
|
+
* <AuthProvider
|
|
15
|
+
* client={client}
|
|
16
|
+
* config={{
|
|
17
|
+
* providers: ['google', 'github'],
|
|
18
|
+
* magicLinkEnabled: true,
|
|
19
|
+
* }}
|
|
20
|
+
* >
|
|
21
|
+
* <AuthForm onSuccess={() => navigate('/dashboard')} />
|
|
22
|
+
* </AuthProvider>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export { AuthProvider, useAuthContext } from './context.js';
|
|
28
|
+
export type { AuthProviderProps, AuthUIConfig, AuthUILabels, AuthView, AuthContextValue } from './context.js';
|
|
29
|
+
export { useAuth } from './hooks/useAuth.js';
|
|
30
|
+
export type { UseAuthReturn } from './hooks/useAuth.js';
|
|
31
|
+
export { AuthForm } from './components/AuthForm.js';
|
|
32
|
+
export type { AuthFormProps } from './components/AuthForm.js';
|
|
33
|
+
export { SignIn } from './components/SignIn.js';
|
|
34
|
+
export type { SignInProps } from './components/SignIn.js';
|
|
35
|
+
export { SignUp } from './components/SignUp.js';
|
|
36
|
+
export type { SignUpProps } from './components/SignUp.js';
|
|
37
|
+
export { SocialButtons } from './components/SocialButtons.js';
|
|
38
|
+
export type { SocialButtonsProps } from './components/SocialButtons.js';
|
|
39
|
+
export { MFAChallenge } from './components/MFAChallenge.js';
|
|
40
|
+
export type { MFAChallengeProps } from './components/MFAChallenge.js';
|
|
41
|
+
export { ForgotPassword } from './components/ForgotPassword.js';
|
|
42
|
+
export type { ForgotPasswordProps } from './components/ForgotPassword.js';
|
|
43
|
+
export { MagicLink } from './components/MagicLink.js';
|
|
44
|
+
export type { MagicLinkProps } from './components/MagicLink.js';
|
|
45
|
+
export { EmailOTP } from './components/EmailOTP.js';
|
|
46
|
+
export type { EmailOTPProps } from './components/EmailOTP.js';
|
|
47
|
+
export { PhoneOTP } from './components/PhoneOTP.js';
|
|
48
|
+
export type { PhoneOTPProps } from './components/PhoneOTP.js';
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAG9G,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @edge-base/auth-ui-react — Headless React authentication UI components.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ```tsx
|
|
6
|
+
* import { createClient } from '@edge-base/web';
|
|
7
|
+
* import { AuthProvider, AuthForm } from '@edge-base/auth-ui-react';
|
|
8
|
+
* import '@edge-base/auth-ui-react/styles.css'; // optional default theme
|
|
9
|
+
*
|
|
10
|
+
* const client = createClient('https://my-app.edgebase.fun');
|
|
11
|
+
*
|
|
12
|
+
* function App() {
|
|
13
|
+
* return (
|
|
14
|
+
* <AuthProvider
|
|
15
|
+
* client={client}
|
|
16
|
+
* config={{
|
|
17
|
+
* providers: ['google', 'github'],
|
|
18
|
+
* magicLinkEnabled: true,
|
|
19
|
+
* }}
|
|
20
|
+
* >
|
|
21
|
+
* <AuthForm onSuccess={() => navigate('/dashboard')} />
|
|
22
|
+
* </AuthProvider>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
// Context & Provider
|
|
28
|
+
export { AuthProvider, useAuthContext } from './context.js';
|
|
29
|
+
// Hooks
|
|
30
|
+
export { useAuth } from './hooks/useAuth.js';
|
|
31
|
+
// Components
|
|
32
|
+
export { AuthForm } from './components/AuthForm.js';
|
|
33
|
+
export { SignIn } from './components/SignIn.js';
|
|
34
|
+
export { SignUp } from './components/SignUp.js';
|
|
35
|
+
export { SocialButtons } from './components/SocialButtons.js';
|
|
36
|
+
export { MFAChallenge } from './components/MFAChallenge.js';
|
|
37
|
+
export { ForgotPassword } from './components/ForgotPassword.js';
|
|
38
|
+
export { MagicLink } from './components/MagicLink.js';
|
|
39
|
+
export { EmailOTP } from './components/EmailOTP.js';
|
|
40
|
+
export { PhoneOTP } from './components/PhoneOTP.js';
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG5D,QAAQ;AACR,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC"}
|