@fayz-ai/plugin-auth 0.10.2 → 0.11.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/dist/components/forms.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +132 -38
- package/dist/index.js.map +1 -1
- package/dist/views/pages.d.ts.map +1 -1
- package/dist/views/verify-email.d.ts +15 -0
- package/dist/views/verify-email.d.ts.map +1 -0
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/components/forms.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/components/forms.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAmCjD,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAC7C,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnE;AAED,wBAAgB,YAAY,CAAC,EAAE,SAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,iBAAiB,qBA0BhH;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACjD,qEAAqE;IACrE,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAClD;yCACqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAiB,EACjB,aAAa,GACd,EAAE,cAAc,qBAuDhB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,eAAe,qBAsDxD;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC;kEAC8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,MAAM,EACN,aAAa,EACb,YAAiB,EACjB,aAAa,EACb,UAAkC,EAClC,WAAiE,EACjE,YAA8C,EAC9C,SAA0F,EAC1F,SAAsD,GACvD,EAAE,uBAAuB,qBAiDzB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,qBA4CtE"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { createAuthPlugin, createAuthRuntime, resolveAuthAdapter, } from './lib/runtime';
|
|
2
2
|
export { AuthGate, LoginPage, AuthCallbackPage, ResetPasswordPage, } from './views/pages';
|
|
3
3
|
export type { AuthCallbackPageProps, AuthGateProps, LoginPageProps, ResetPasswordPageProps, } from './views/pages';
|
|
4
|
+
export { VerifyEmailNotice } from './views/verify-email';
|
|
5
|
+
export type { VerifyEmailNoticeProps } from './views/verify-email';
|
|
4
6
|
export { SetPasswordPage, usePasswordSetupGate } from './views/set-password';
|
|
5
7
|
export type { SetPasswordPageProps, SetPasswordReason, PasswordSetupGate } from './views/set-password';
|
|
6
8
|
export { AmbassadorBubbles } from './components/AmbassadorBubbles';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC5E,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC5E,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,YAAY,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAC5E,OAAO,EACL,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createSupabaseAuthAdapter, createMockAuthAdapter, useAuth, readAuthUrlIntent, clearAuthUrlTokens, decidePasswordSetup } from '@fayz-ai/auth';
|
|
2
2
|
export { AuthProvider, clearAuthUrlTokens, createMockAuthAdapter, createSupabaseAuthAdapter, readAuthUrlIntent, useAuth, useAuthStore } from '@fayz-ai/auth';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
+
import { tl, useTranslation } from '@fayz-ai/core';
|
|
4
5
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
|
-
import {
|
|
6
|
+
import { MailCheck } from 'lucide-react';
|
|
6
7
|
|
|
7
8
|
// src/lib/runtime.ts
|
|
8
9
|
function absoluteUrl(path) {
|
|
@@ -139,7 +140,7 @@ function LoginForm({
|
|
|
139
140
|
}
|
|
140
141
|
return /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
141
142
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
142
|
-
/* @__PURE__ */ jsx("span", { children: "Email" }),
|
|
143
|
+
/* @__PURE__ */ jsx("span", { children: tl("Email", "E-mail") }),
|
|
143
144
|
/* @__PURE__ */ jsx(
|
|
144
145
|
"input",
|
|
145
146
|
{
|
|
@@ -157,12 +158,12 @@ function LoginForm({
|
|
|
157
158
|
)
|
|
158
159
|
] }),
|
|
159
160
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
160
|
-
/* @__PURE__ */ jsx("span", { children: "Password" }),
|
|
161
|
+
/* @__PURE__ */ jsx("span", { children: tl("Password", "Senha") }),
|
|
161
162
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "password", autoComplete: "current-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
162
163
|
] }),
|
|
163
|
-
onForgotPassword && /* @__PURE__ */ jsx("div", { className: "-mt-1 flex justify-end", children: /* @__PURE__ */ jsx("button", { type: "button", className: buttonClass("ghost"), onClick: onForgotPassword, children: "Forgot password?" }) }),
|
|
164
|
+
onForgotPassword && /* @__PURE__ */ jsx("div", { className: "-mt-1 flex justify-end", children: /* @__PURE__ */ jsx("button", { type: "button", className: buttonClass("ghost"), onClick: onForgotPassword, children: tl("Forgot password?", "Esqueceu a senha?") }) }),
|
|
164
165
|
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: error.message }),
|
|
165
|
-
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Signing in..." : "Sign in" }),
|
|
166
|
+
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? tl("Signing in...", "Entrando...") : tl("Sign in", "Entrar") }),
|
|
166
167
|
showOAuth && /* @__PURE__ */ jsx(OAuthButtons, { providers: oauthProviders, disabled, comingSoon: oauthComingSoon })
|
|
167
168
|
] });
|
|
168
169
|
}
|
|
@@ -179,11 +180,11 @@ function SignupForm({ onSuccess }) {
|
|
|
179
180
|
event.preventDefault();
|
|
180
181
|
setLocalError(null);
|
|
181
182
|
if (password.length < 8) {
|
|
182
|
-
setLocalError("Password must be at least 8 characters.");
|
|
183
|
+
setLocalError(tl("Password must be at least 8 characters.", "A senha precisa ter pelo menos 8 caracteres."));
|
|
183
184
|
return;
|
|
184
185
|
}
|
|
185
186
|
if (password !== confirmPassword) {
|
|
186
|
-
setLocalError("Passwords do not match.");
|
|
187
|
+
setLocalError(tl("Passwords do not match.", "As senhas n\xE3o conferem."));
|
|
187
188
|
return;
|
|
188
189
|
}
|
|
189
190
|
setBusy(true);
|
|
@@ -196,23 +197,23 @@ function SignupForm({ onSuccess }) {
|
|
|
196
197
|
}
|
|
197
198
|
return /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
198
199
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
199
|
-
/* @__PURE__ */ jsx("span", { children: "Full name" }),
|
|
200
|
+
/* @__PURE__ */ jsx("span", { children: tl("Full name", "Nome completo") }),
|
|
200
201
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), required: true, value: fullName, onChange: (e) => setFullName(e.target.value), disabled })
|
|
201
202
|
] }),
|
|
202
203
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
203
|
-
/* @__PURE__ */ jsx("span", { children: "Email" }),
|
|
204
|
+
/* @__PURE__ */ jsx("span", { children: tl("Email", "E-mail") }),
|
|
204
205
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "email", autoComplete: "username", required: true, value: email, onChange: (e) => setEmail(e.target.value), disabled })
|
|
205
206
|
] }),
|
|
206
207
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
207
|
-
/* @__PURE__ */ jsx("span", { children: "Password" }),
|
|
208
|
+
/* @__PURE__ */ jsx("span", { children: tl("Password", "Senha") }),
|
|
208
209
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
209
210
|
] }),
|
|
210
211
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
211
|
-
/* @__PURE__ */ jsx("span", { children: "Confirm password" }),
|
|
212
|
+
/* @__PURE__ */ jsx("span", { children: tl("Confirm password", "Confirme a senha") }),
|
|
212
213
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled })
|
|
213
214
|
] }),
|
|
214
215
|
(localError || error) && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: localError ?? error?.message }),
|
|
215
|
-
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Creating account..." : "Create account" })
|
|
216
|
+
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? tl("Creating account...", "Criando conta...") : tl("Create account", "Criar conta") })
|
|
216
217
|
] });
|
|
217
218
|
}
|
|
218
219
|
function ForgotPasswordForm({
|
|
@@ -221,11 +222,11 @@ function ForgotPasswordForm({
|
|
|
221
222
|
onBackToLogin,
|
|
222
223
|
initialEmail = "",
|
|
223
224
|
onEmailChange,
|
|
224
|
-
emailLabel = "Email",
|
|
225
|
-
submitLabel = "Send reset link",
|
|
226
|
-
sendingLabel = "Sending...",
|
|
227
|
-
sentLabel = "Password reset instructions sent.",
|
|
228
|
-
backLabel = "Back to login"
|
|
225
|
+
emailLabel = tl("Email", "E-mail"),
|
|
226
|
+
submitLabel = tl("Send reset link", "Enviar link de redefini\xE7\xE3o"),
|
|
227
|
+
sendingLabel = tl("Sending...", "Enviando..."),
|
|
228
|
+
sentLabel = tl("Password reset instructions sent.", "Instru\xE7\xF5es de redefini\xE7\xE3o enviadas."),
|
|
229
|
+
backLabel = tl("Back to login", "Voltar para o login")
|
|
229
230
|
}) {
|
|
230
231
|
const { resetPassword, error, isLoading } = useAuth();
|
|
231
232
|
const [email, setEmail] = React.useState(initialEmail);
|
|
@@ -280,11 +281,11 @@ function ResetPasswordForm({ onSuccess }) {
|
|
|
280
281
|
event.preventDefault();
|
|
281
282
|
setLocalError(null);
|
|
282
283
|
if (password.length < 8) {
|
|
283
|
-
setLocalError("Password must be at least 8 characters.");
|
|
284
|
+
setLocalError(tl("Password must be at least 8 characters.", "A senha precisa ter pelo menos 8 caracteres."));
|
|
284
285
|
return;
|
|
285
286
|
}
|
|
286
287
|
if (password !== confirmPassword) {
|
|
287
|
-
setLocalError("Passwords do not match.");
|
|
288
|
+
setLocalError(tl("Passwords do not match.", "As senhas n\xE3o conferem."));
|
|
288
289
|
return;
|
|
289
290
|
}
|
|
290
291
|
setBusy(true);
|
|
@@ -297,15 +298,15 @@ function ResetPasswordForm({ onSuccess }) {
|
|
|
297
298
|
}
|
|
298
299
|
return /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "space-y-4", children: [
|
|
299
300
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
300
|
-
/* @__PURE__ */ jsx("span", { children: "New password" }),
|
|
301
|
+
/* @__PURE__ */ jsx("span", { children: tl("New password", "Nova senha") }),
|
|
301
302
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: password, onChange: (e) => setPassword(e.target.value), disabled })
|
|
302
303
|
] }),
|
|
303
304
|
/* @__PURE__ */ jsxs("label", { className: "block space-y-1.5 text-sm font-medium", children: [
|
|
304
|
-
/* @__PURE__ */ jsx("span", { children: "Confirm password" }),
|
|
305
|
+
/* @__PURE__ */ jsx("span", { children: tl("Confirm password", "Confirme a senha") }),
|
|
305
306
|
/* @__PURE__ */ jsx("input", { className: fieldClass(), type: "password", autoComplete: "new-password", required: true, value: confirmPassword, onChange: (e) => setConfirmPassword(e.target.value), disabled })
|
|
306
307
|
] }),
|
|
307
308
|
(localError || error) && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: localError ?? error?.message }),
|
|
308
|
-
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? "Saving..." : "Update password" })
|
|
309
|
+
/* @__PURE__ */ jsx("button", { className: buttonClass(), type: "submit", disabled, children: disabled ? tl("Saving...", "Salvando...") : tl("Update password", "Atualizar senha") })
|
|
309
310
|
] });
|
|
310
311
|
}
|
|
311
312
|
var MIN_LENGTH = 8;
|
|
@@ -456,6 +457,86 @@ function SetPasswordPage({
|
|
|
456
457
|
] })
|
|
457
458
|
] }) });
|
|
458
459
|
}
|
|
460
|
+
var RESEND_COOLDOWN_SECONDS = 60;
|
|
461
|
+
function VerifyEmailNotice({ email, onUseAnotherEmail }) {
|
|
462
|
+
const { resendConfirmation, clearPendingVerification, error } = useAuth();
|
|
463
|
+
const [cooldown, setCooldown] = React.useState(0);
|
|
464
|
+
const [sent, setSent] = React.useState(false);
|
|
465
|
+
const [busy, setBusy] = React.useState(false);
|
|
466
|
+
const [unsupported, setUnsupported] = React.useState(false);
|
|
467
|
+
React.useEffect(() => {
|
|
468
|
+
if (cooldown <= 0) return;
|
|
469
|
+
const timer = setTimeout(() => setCooldown((s) => s - 1), 1e3);
|
|
470
|
+
return () => clearTimeout(timer);
|
|
471
|
+
}, [cooldown]);
|
|
472
|
+
const resend = async () => {
|
|
473
|
+
setBusy(true);
|
|
474
|
+
setSent(false);
|
|
475
|
+
try {
|
|
476
|
+
const ok = await resendConfirmation(email);
|
|
477
|
+
if (!ok) {
|
|
478
|
+
setUnsupported(true);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
setSent(true);
|
|
482
|
+
setCooldown(RESEND_COOLDOWN_SECONDS);
|
|
483
|
+
} catch {
|
|
484
|
+
} finally {
|
|
485
|
+
setBusy(false);
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6 text-center", children: [
|
|
489
|
+
/* @__PURE__ */ jsx("div", { className: "mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(MailCheck, { className: "h-6 w-6 text-primary" }) }),
|
|
490
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
491
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-foreground", children: tl("Check your email", "Verifique seu e-mail") }),
|
|
492
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm leading-relaxed text-muted-foreground", children: [
|
|
493
|
+
tl("We sent a confirmation link to", "Enviamos um link de confirma\xE7\xE3o para"),
|
|
494
|
+
" ",
|
|
495
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-foreground", children: email }),
|
|
496
|
+
".",
|
|
497
|
+
" ",
|
|
498
|
+
tl(
|
|
499
|
+
"Open it to finish creating your account.",
|
|
500
|
+
"Abra o link para terminar de criar sua conta."
|
|
501
|
+
)
|
|
502
|
+
] }),
|
|
503
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tl(
|
|
504
|
+
"Not there? It may have landed in spam or promotions.",
|
|
505
|
+
"N\xE3o chegou? Pode ter ca\xEDdo no spam ou em promo\xE7\xF5es."
|
|
506
|
+
) })
|
|
507
|
+
] }),
|
|
508
|
+
sent && /* @__PURE__ */ jsx("p", { className: "text-sm text-emerald-600", children: tl("Link sent again.", "Link reenviado.") }),
|
|
509
|
+
unsupported && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: tl(
|
|
510
|
+
"Resending is not available here \u2014 try signing up again in a moment.",
|
|
511
|
+
"O reenvio n\xE3o est\xE1 dispon\xEDvel aqui \u2014 tente cadastrar de novo em instantes."
|
|
512
|
+
) }),
|
|
513
|
+
error && /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: error.message }),
|
|
514
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
515
|
+
/* @__PURE__ */ jsx(
|
|
516
|
+
"button",
|
|
517
|
+
{
|
|
518
|
+
type: "button",
|
|
519
|
+
onClick: () => void resend(),
|
|
520
|
+
disabled: busy || cooldown > 0,
|
|
521
|
+
className: "inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
|
|
522
|
+
children: cooldown > 0 ? tl(`Resend in ${cooldown}s`, `Reenviar em ${cooldown}s`) : busy ? tl("Sending...", "Enviando...") : tl("Resend the link", "Reenviar o link")
|
|
523
|
+
}
|
|
524
|
+
),
|
|
525
|
+
/* @__PURE__ */ jsx(
|
|
526
|
+
"button",
|
|
527
|
+
{
|
|
528
|
+
type: "button",
|
|
529
|
+
onClick: () => {
|
|
530
|
+
clearPendingVerification();
|
|
531
|
+
onUseAnotherEmail?.();
|
|
532
|
+
},
|
|
533
|
+
className: "text-sm font-medium text-primary hover:underline",
|
|
534
|
+
children: tl("Use a different email", "Usar outro e-mail")
|
|
535
|
+
}
|
|
536
|
+
)
|
|
537
|
+
] })
|
|
538
|
+
] });
|
|
539
|
+
}
|
|
459
540
|
var FLOAT_STYLES = `
|
|
460
541
|
@keyframes fayz-amb-drift {
|
|
461
542
|
0%, 100% { transform: translateY(0); }
|
|
@@ -510,9 +591,13 @@ function LoginPage({
|
|
|
510
591
|
}) {
|
|
511
592
|
const [view, setView] = React.useState("login");
|
|
512
593
|
const [email, setEmail] = React.useState("");
|
|
594
|
+
const pendingVerification = useAuth().pendingVerification;
|
|
513
595
|
const brandLogo = loginLogo ?? logo;
|
|
514
|
-
const heading = view === "login" ? "Welcome back" : view === "signup" ? "Create account" : "Reset password";
|
|
515
|
-
const subtitle = view === "login" ? "Enter your credentials to continue" : view === "signup" ? "Create your account to get started"
|
|
596
|
+
const heading = view === "login" ? tl("Welcome back", "Bem-vindo de volta") : view === "signup" ? tl("Create account", "Criar conta") : tl("Reset password", "Redefinir senha");
|
|
597
|
+
const subtitle = view === "login" ? tl("Enter your credentials to continue", "Entre com seus dados para continuar") : view === "signup" ? tl("Create your account to get started", "Crie sua conta para come\xE7ar") : tl(
|
|
598
|
+
"Enter your email and we will send reset instructions",
|
|
599
|
+
"Informe seu e-mail e enviaremos as instru\xE7\xF5es"
|
|
600
|
+
);
|
|
516
601
|
const form = view === "login" ? /* @__PURE__ */ jsx(
|
|
517
602
|
LoginForm,
|
|
518
603
|
{
|
|
@@ -534,16 +619,23 @@ function LoginPage({
|
|
|
534
619
|
}
|
|
535
620
|
);
|
|
536
621
|
const switcher = view === "login" ? /* @__PURE__ */ jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
|
|
537
|
-
"Do not have an account?",
|
|
622
|
+
tl("Do not have an account?", "Ainda n\xE3o tem conta?"),
|
|
538
623
|
" ",
|
|
539
|
-
/* @__PURE__ */ jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("signup"), children: "Sign up" })
|
|
624
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("signup"), children: tl("Sign up", "Cadastre-se") })
|
|
540
625
|
] }) : /* @__PURE__ */ jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [
|
|
541
|
-
view === "signup" ? "Already have an account?" : "Remembered your password?",
|
|
626
|
+
view === "signup" ? tl("Already have an account?", "J\xE1 tem uma conta?") : tl("Remembered your password?", "Lembrou a senha?"),
|
|
542
627
|
" ",
|
|
543
|
-
/* @__PURE__ */ jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("login"), children: "Sign in" })
|
|
628
|
+
/* @__PURE__ */ jsx("button", { type: "button", className: "font-medium text-primary hover:underline", onClick: () => setView("login"), children: tl("Sign in", "Entrar") })
|
|
544
629
|
] });
|
|
630
|
+
const panel = pendingVerification ? /* @__PURE__ */ jsx(
|
|
631
|
+
VerifyEmailNotice,
|
|
632
|
+
{
|
|
633
|
+
email: pendingVerification.email,
|
|
634
|
+
onUseAnotherEmail: () => setView("signup")
|
|
635
|
+
}
|
|
636
|
+
) : null;
|
|
545
637
|
if (layout === "centered") {
|
|
546
|
-
return /* @__PURE__ */ jsx("div", { className: "flex min-h-screen items-center justify-center bg-sidebar p-4", children: /* @__PURE__ */
|
|
638
|
+
return /* @__PURE__ */ jsx("div", { className: "flex min-h-screen items-center justify-center bg-sidebar p-4", children: /* @__PURE__ */ jsx("div", { className: "w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10", children: panel ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
547
639
|
/* @__PURE__ */ jsxs("div", { className: "mb-8 text-center", children: [
|
|
548
640
|
brandLogo && /* @__PURE__ */ jsx("div", { className: "mb-4 flex justify-center", children: brandLogo }),
|
|
549
641
|
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-foreground", children: heading }),
|
|
@@ -553,7 +645,7 @@ function LoginPage({
|
|
|
553
645
|
form,
|
|
554
646
|
switcher
|
|
555
647
|
] })
|
|
556
|
-
] }) });
|
|
648
|
+
] }) }) });
|
|
557
649
|
}
|
|
558
650
|
return /* @__PURE__ */ jsxs("div", { className: "flex min-h-screen bg-sidebar", children: [
|
|
559
651
|
/* @__PURE__ */ jsxs("div", { className: "relative hidden w-1/2 overflow-hidden lg:block", children: [
|
|
@@ -567,13 +659,15 @@ function LoginPage({
|
|
|
567
659
|
] }),
|
|
568
660
|
/* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-col lg:p-3 lg:pl-3", children: /* @__PURE__ */ jsx("div", { className: "flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16", children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-sm", children: [
|
|
569
661
|
brandLogo && /* @__PURE__ */ jsx("div", { className: "mb-8", children: brandLogo }),
|
|
570
|
-
/* @__PURE__ */ jsxs(
|
|
571
|
-
/* @__PURE__ */
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
662
|
+
panel ?? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
663
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-8", children: [
|
|
664
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold text-foreground", children: heading }),
|
|
665
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: subtitle })
|
|
666
|
+
] }),
|
|
667
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
668
|
+
form,
|
|
669
|
+
switcher
|
|
670
|
+
] })
|
|
577
671
|
] })
|
|
578
672
|
] }) }) })
|
|
579
673
|
] });
|
|
@@ -613,6 +707,6 @@ function ResetPasswordPage({ onSuccess }) {
|
|
|
613
707
|
return /* @__PURE__ */ jsx(SetPasswordPage, { reason: "recovery", onSuccess });
|
|
614
708
|
}
|
|
615
709
|
|
|
616
|
-
export { AmbassadorBubbles, AuthCallbackPage, AuthGate, ForgotPasswordForm, LoginForm, LoginPage, OAuthButtons, ResetPasswordForm, ResetPasswordPage, SetPasswordPage, SignupForm, createAuthPlugin, createAuthRuntime, resolveAuthAdapter, usePasswordSetupGate };
|
|
710
|
+
export { AmbassadorBubbles, AuthCallbackPage, AuthGate, ForgotPasswordForm, LoginForm, LoginPage, OAuthButtons, ResetPasswordForm, ResetPasswordPage, SetPasswordPage, SignupForm, VerifyEmailNotice, createAuthPlugin, createAuthRuntime, resolveAuthAdapter, usePasswordSetupGate };
|
|
617
711
|
//# sourceMappingURL=index.js.map
|
|
618
712
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/runtime.ts","../src/components/forms.tsx","../src/views/set-password.tsx","../src/components/AmbassadorBubbles.tsx","../src/views/pages.tsx"],"names":["fieldClass","buttonClass","React2","useAuth","jsx","jsxs","React3","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import type { AuthAdapter } from '@fayz-ai/core'\nimport { createMockAuthAdapter, createSupabaseAuthAdapter } from '@fayz-ai/auth'\nimport type { AuthPluginOptions, ResolvedAuthPlugin } from '../types'\n\nfunction absoluteUrl(path: string): string | undefined {\n if (typeof window === 'undefined') return undefined\n if (/^https?:\\/\\//.test(path)) return path\n return `${window.location.origin}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nexport function resolveAuthAdapter(options: AuthPluginOptions = {}): AuthAdapter {\n const configured = options.adapter ?? options.provider\n if (configured && typeof configured === 'object') return configured\n\n const provider = configured ?? (options.supabase?.url ? 'supabase' : 'mock')\n if (provider === 'supabase') {\n const url = options.supabase?.url\n const anonKey = options.supabase?.anonKey\n if (!url || !anonKey) {\n throw new Error('plugin-auth provider=\"supabase\" requires supabase.url and supabase.anonKey.')\n }\n return createSupabaseAuthAdapter({\n supabaseUrl: url,\n supabaseAnonKey: anonKey,\n supabaseClient: options.supabase?.client,\n callbackUrl: options.supabase?.callbackUrl ?? absoluteUrl(options.routes?.callback ?? '/auth/callback'),\n // Only when the host asked for a specific URL. Left undefined, the adapter\n // points recovery at the app root, which needs no route and no extra entry\n // in Supabase's redirect allow-list.\n resetPasswordUrl:\n options.supabase?.resetPasswordUrl ??\n (options.routes?.resetPassword ? absoluteUrl(options.routes.resetPassword) : undefined),\n })\n }\n\n return createMockAuthAdapter()\n}\n\nexport function createAuthRuntime(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return {\n kind: 'auth',\n adapter: resolveAuthAdapter(options),\n requireAuth: options.requireAuth ?? true,\n layout: options.layout ?? 'split',\n logo: options.logo,\n tagline: options.tagline,\n description: options.description,\n loginAmbassadors: options.loginAmbassadors,\n loginAmbassadorsLabel: options.loginAmbassadorsLabel,\n oauth: {\n enabled: options.oauth?.enabled ?? false,\n providers: options.oauth?.providers ?? ['google'],\n // Disabled until the grant is wired; an app that has it working passes [].\n comingSoon: options.oauth?.comingSoon ?? ['google'],\n },\n routes: {\n login: options.routes?.login ?? '/login',\n callback: options.routes?.callback ?? '/auth/callback',\n // The app root — recovery links are recognised by their own params, not by\n // the path they land on. See resetPassword() in the Supabase adapter.\n resetPassword: options.routes?.resetPassword ?? '/',\n afterSignIn: options.routes?.afterSignIn ?? '/',\n },\n }\n}\n\nexport function createAuthPlugin(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return createAuthRuntime(options)\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport type { AuthProvider } from '@fayz-ai/core'\n\nfunction providerLabel(provider: string): string {\n return provider.charAt(0).toUpperCase() + provider.slice(1)\n}\n\nfunction fieldClass() {\n return 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n}\n\nfunction buttonClass(variant: 'primary' | 'outline' | 'ghost' = 'primary') {\n if (variant === 'outline') {\n return 'inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50'\n }\n if (variant === 'ghost') return 'text-sm font-medium text-primary hover:underline'\n return 'inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50'\n}\n\n/** Google's own mark. A grey glyph next to \"Continuar com Google\" reads as a\n * placeholder, and their brand rules ask for this one. */\nfunction GoogleMark({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n )\n}\n\nconst PROVIDER_MARKS: Partial<Record<Exclude<AuthProvider, 'email'>, React.FC<{ className?: string }>>> = {\n google: GoogleMark,\n}\n\nexport interface OAuthButtonsProps {\n providers?: Exclude<AuthProvider, 'email'>[]\n disabled?: boolean\n /**\n * Providers that are on screen but cannot sign anybody in yet.\n *\n * Shown rather than hidden because the app declares them and the merchant asks\n * for them — but a button that opens a broken consent screen is worse than one\n * that says it is not ready. Enabling later is removing the id from this list.\n */\n comingSoon?: Exclude<AuthProvider, 'email'>[]\n onProviderClick?: (provider: AuthProvider) => void | Promise<void>\n}\n\nexport function OAuthButtons({ providers = ['google'], disabled, comingSoon, onProviderClick }: OAuthButtonsProps) {\n const { signInWithOAuth } = useAuth()\n return (\n <div className=\"space-y-2\">\n {providers.map((provider) => {\n const soon = comingSoon?.includes(provider) ?? false\n const Mark = PROVIDER_MARKS[provider]\n return (\n <button\n key={provider}\n type=\"button\"\n className={`${buttonClass('outline')} gap-2`}\n disabled={disabled || soon}\n title={soon ? 'Ainda não disponível' : undefined}\n onClick={() => {\n if (soon) return\n void (onProviderClick ? onProviderClick(provider) : signInWithOAuth(provider))\n }}\n >\n {Mark && <Mark className=\"h-4 w-4 shrink-0\" />}\n Continuar com {providerLabel(provider)}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport interface LoginFormProps {\n onSuccess?: () => void\n onForgotPassword?: () => void\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n /** Providers rendered as \"em breve\" — declared but not wired yet. */\n oauthComingSoon?: Exclude<AuthProvider, 'email'>[]\n /** Seeds the field, so switching between login and recovery never asks for the\n * e-mail the user already typed. */\n initialEmail?: string\n onEmailChange?: (email: string) => void\n}\n\nexport function LoginForm({\n onSuccess,\n onForgotPassword,\n showOAuth,\n oauthProviders,\n oauthComingSoon,\n initialEmail = '',\n onEmailChange,\n}: LoginFormProps) {\n const { signIn, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState(initialEmail)\n const [password, setPassword] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await signIn(email, password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Email</span>\n <input\n className={fieldClass()}\n type=\"email\"\n autoComplete=\"username\"\n required\n value={email}\n onChange={(e) => {\n setEmail(e.target.value)\n onEmailChange?.(e.target.value)\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"current-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n {onForgotPassword && (\n <div className=\"-mt-1 flex justify-end\">\n <button type=\"button\" className={buttonClass('ghost')} onClick={onForgotPassword}>\n Forgot password?\n </button>\n </div>\n )}\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Signing in...' : 'Sign in'}\n </button>\n {showOAuth && (\n <OAuthButtons providers={oauthProviders} disabled={disabled} comingSoon={oauthComingSoon} />\n )}\n </form>\n )\n}\n\nexport interface SignupFormProps {\n onSuccess?: () => void\n}\n\nexport function SignupForm({ onSuccess }: SignupFormProps) {\n const { signUp, error, isLoading } = useAuth()\n const [fullName, setFullName] = React.useState('')\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError('Password must be at least 8 characters.')\n return\n }\n if (password !== confirmPassword) {\n setLocalError('Passwords do not match.')\n return\n }\n setBusy(true)\n try {\n await signUp(email, password, fullName)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Full name</span>\n <input className={fieldClass()} required value={fullName} onChange={(e) => setFullName(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Email</span>\n <input className={fieldClass()} type=\"email\" autoComplete=\"username\" required value={email} onChange={(e) => setEmail(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Confirm password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Creating account...' : 'Create account'}\n </button>\n </form>\n )\n}\n\nexport interface ForgotPasswordFormProps {\n redirectTo?: string\n onSent?: (email: string) => void\n onBackToLogin?: () => void\n /** Pre-filled with whatever the user already typed on the login form. */\n initialEmail?: string\n onEmailChange?: (email: string) => void\n /** Copy overrides — the set-password screen reuses this form to hand out a\n * fresh link, where \"Send reset link\" is the wrong label. */\n emailLabel?: string\n submitLabel?: string\n sendingLabel?: string\n sentLabel?: string\n backLabel?: string\n}\n\nexport function ForgotPasswordForm({\n redirectTo,\n onSent,\n onBackToLogin,\n initialEmail = '',\n onEmailChange,\n emailLabel = 'Email',\n submitLabel = 'Send reset link',\n sendingLabel = 'Sending...',\n sentLabel = 'Password reset instructions sent.',\n backLabel = 'Back to login',\n}: ForgotPasswordFormProps) {\n const { resetPassword, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState(initialEmail)\n const [sent, setSent] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await resetPassword(email, { redirectTo })\n setSent(true)\n onSent?.(email)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{emailLabel}</span>\n <input\n className={fieldClass()}\n type=\"email\"\n autoComplete=\"username\"\n required\n autoFocus={!email}\n value={email}\n onChange={(e) => {\n setEmail(e.target.value)\n onEmailChange?.(e.target.value)\n }}\n disabled={disabled}\n />\n </label>\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n {sent && <p className=\"text-sm text-emerald-600\">{sentLabel}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? sendingLabel : submitLabel}\n </button>\n {onBackToLogin && (\n <button type=\"button\" className={buttonClass('ghost')} onClick={onBackToLogin}>\n {backLabel}\n </button>\n )}\n </form>\n )\n}\n\nexport interface ResetPasswordFormProps {\n onSuccess?: () => void\n}\n\nexport function ResetPasswordForm({ onSuccess }: ResetPasswordFormProps) {\n const { updatePassword, error, isLoading } = useAuth()\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError('Password must be at least 8 characters.')\n return\n }\n if (password !== confirmPassword) {\n setLocalError('Passwords do not match.')\n return\n }\n setBusy(true)\n try {\n await updatePassword(password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>New password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>Confirm password</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? 'Saving...' : 'Update password'}\n </button>\n </form>\n )\n}\n","import * as React from 'react'\nimport { useAuth, readAuthUrlIntent, clearAuthUrlTokens, decidePasswordSetup } from '@fayz-ai/auth'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ForgotPasswordForm } from '../components/forms'\n\n// ---------------------------------------------------------------------------\n// Set-password surface — the one screen behind two flows:\n//\n// • recovery — the user clicked \"forgot password\" and came back on a recovery\n// link. GoTrue already signed them in from the link, so all that is missing\n// is `updateUser({ password })`. Without this screen they land straight in\n// the app (or on the login form) and are never asked, which is exactly the\n// \"the link does nothing\" bug.\n//\n// • invite — the user was added to an organisation. The invite is a magic link,\n// so the account exists with NO password: unless they choose one here, every\n// future sign-in needs another e-mail.\n//\n// Mounted by the shell above its auth gate, driven by usePasswordSetupGate().\n// ---------------------------------------------------------------------------\n\nexport type SetPasswordReason = 'recovery' | 'invite'\n\nconst MIN_LENGTH = 8\n\nfunction fieldClass() {\n return 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n}\n\nfunction buttonClass() {\n return 'inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50'\n}\n\nfunction useTr() {\n const t = useTranslation()\n return React.useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>) => {\n const value = t(key, params)\n return !value || value === key ? fallback : value\n },\n [t],\n )\n}\n\nexport interface PasswordSetupGate {\n /** null when nothing is pending and the shell should render normally. */\n reason: SetPasswordReason | null\n /** The link is dead (already used / expired) — offer a fresh one instead. */\n expired: boolean\n /** Still resolving the session the link carries. */\n checking: boolean\n /** Called by the screen once the password is set (or the user gives up). */\n complete: () => void\n}\n\n/**\n * Decides whether the user owes us a password before they see the app.\n *\n * The URL intent is read from a snapshot taken at module load: supabase-js wipes\n * the token fragment as soon as it initialises, so the reason the user is here is\n * gone by the time React renders.\n */\nexport function usePasswordSetupGate(): PasswordSetupGate {\n const { user, isLoading, isAuthenticated } = useAuth()\n const [done, setDone] = React.useState(false)\n const intent = React.useMemo(() => readAuthUrlIntent(), [])\n\n const complete = React.useCallback(() => {\n clearAuthUrlTokens()\n setDone(true)\n }, [])\n\n if (done) return { reason: null, expired: false, checking: false, complete }\n\n const decision = decidePasswordSetup({\n intent,\n isLoading,\n isAuthenticated,\n mustSetPassword: user?.mustSetPassword,\n })\n return { ...decision, complete }\n}\n\nexport interface SetPasswordPageProps {\n reason: SetPasswordReason\n appName?: string\n logo?: React.ReactNode\n /** Show the \"ask for a new link\" form instead of the password fields. */\n expired?: boolean\n /** Waiting on the link's session — renders a quiet placeholder. */\n checking?: boolean\n onSuccess?: () => void\n}\n\nexport function SetPasswordPage({\n reason,\n appName = 'App',\n logo,\n expired,\n checking,\n onSuccess,\n}: SetPasswordPageProps) {\n const tr = useTr()\n const { user, updatePassword, signOut, error, isLoading } = useAuth()\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n const invite = reason === 'invite'\n const title = invite\n ? tr('auth.setPassword.welcomeTitle', `Welcome to ${appName}`, { appName })\n : tr('auth.setPassword.recoveryTitle', 'Choose a new password')\n const subtitle = invite\n ? tr('auth.setPassword.welcomeSubtitle', 'Choose a password to finish setting up your access.')\n : tr('auth.setPassword.recoverySubtitle', 'Set a new password to get back into your account.')\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < MIN_LENGTH) {\n setLocalError(tr('auth.setPassword.tooShort', `Password must be at least ${MIN_LENGTH} characters.`))\n return\n }\n if (password !== confirmPassword) {\n setLocalError(tr('auth.setPassword.mismatch', 'Passwords do not match.'))\n return\n }\n setBusy(true)\n try {\n await updatePassword(password)\n onSuccess?.()\n } catch {\n // useAuth already surfaced it; keep the user on the form.\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n {logo && <div className=\"mb-6 flex justify-center\">{logo}</div>}\n {checking ? (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">\n {tr('auth.setPassword.checking', 'Checking your link...')}\n </p>\n ) : expired ? (\n <>\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-foreground\">\n {tr('auth.setPassword.expiredTitle', 'This link has expired')}\n </h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tr(\n 'auth.setPassword.expiredSubtitle',\n 'Reset links can only be used once. Enter your e-mail and we will send a new one.',\n )}\n </p>\n </div>\n <ForgotPasswordForm\n initialEmail={user?.email}\n submitLabel={tr('auth.setPassword.sendNewLink', 'Send new link')}\n sendingLabel={tr('auth.setPassword.sending', 'Sending...')}\n sentLabel={tr('auth.setPassword.sent', 'Check your inbox — a new link is on the way.')}\n emailLabel={tr('auth.setPassword.email', 'E-mail')}\n backLabel={tr('auth.setPassword.backToLogin', 'Back to sign in')}\n onBackToLogin={onSuccess}\n />\n </>\n ) : (\n <>\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-foreground\">{title}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tr('auth.setPassword.newPassword', 'New password')}</span>\n <input\n className={fieldClass()}\n type=\"password\"\n autoComplete=\"new-password\"\n autoFocus\n required\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={disabled}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tr('auth.setPassword.confirmPassword', 'Confirm password')}</span>\n <input\n className={fieldClass()}\n type=\"password\"\n autoComplete=\"new-password\"\n required\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n disabled={disabled}\n />\n </label>\n {(localError || error) && (\n <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>\n )}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled\n ? tr('auth.setPassword.saving', 'Saving...')\n : tr('auth.setPassword.submit', 'Save password')}\n </button>\n </form>\n {/* An invitee who does not want to continue needs a way out that does\n not leave them stuck on this screen with a live session. */}\n <button\n type=\"button\"\n className=\"mt-4 w-full text-center text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => {\n void signOut().finally(() => onSuccess?.())\n }}\n >\n {tr('auth.setPassword.backToLogin', 'Back to sign in')}\n </button>\n </>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { LoginAmbassador } from '../types'\n\n/**\n * Social-proof \"ambassador\" strip for the split-login brand panel. Restores\n * (modernized) the old login avatar cluster: a short row of small, softly\n * overlapping circular portraits sitting just above the tagline, optionally\n * followed by a microtext label (\"+2 mil profissionais\").\n *\n * Small (40px), subtle, no flashy motion — a very gentle idle float only, which\n * fully disables under prefers-reduced-motion. Degrades to nothing when no\n * usable images are supplied, so it is always safe to render. Purely\n * presentational — never touches the auth flow.\n */\n\nconst FLOAT_STYLES = `\n@keyframes fayz-amb-drift {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-2px); }\n}\n@media (prefers-reduced-motion: reduce) {\n .fayz-amb-avatar { animation: none !important; }\n}\n`\n\nexport interface AmbassadorBubblesProps {\n ambassadors?: LoginAmbassador[]\n /** Optional social-proof caption shown beside the avatars, e.g. \"+2 mil profissionais\". */\n label?: string\n}\n\nexport function AmbassadorBubbles({ ambassadors, label }: AmbassadorBubblesProps) {\n const items = (ambassadors ?? []).filter((a) => a && typeof a.image === 'string' && a.image.trim() !== '')\n if (items.length === 0) return null\n const shown = items.slice(0, 5)\n\n return (\n <div className=\"flex items-center gap-3\">\n <style>{FLOAT_STYLES}</style>\n <div className=\"flex -space-x-2\">\n {shown.map((ambassador, index) => (\n <div\n key={`${ambassador.name}-${index}`}\n title={ambassador.role ? `${ambassador.name} · ${ambassador.role}` : ambassador.name}\n className=\"fayz-amb-avatar relative h-10 w-10 shrink-0 overflow-hidden rounded-full border-2 border-sidebar bg-sidebar-accent shadow-md ring-1 ring-sidebar-foreground/10 transition-transform duration-200 hover:z-10 hover:scale-110\"\n style={{ animation: `fayz-amb-drift 4s ease-in-out ${index * 0.4}s infinite` }}\n >\n <img\n src={ambassador.image}\n alt={ambassador.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n ))}\n </div>\n {label ? <p className=\"text-xs font-medium text-sidebar-foreground/80\">{label}</p> : null}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport type { AuthProvider } from '@fayz-ai/core'\nimport { ForgotPasswordForm, LoginForm, SignupForm } from '../components/forms'\nimport { SetPasswordPage } from './set-password'\nimport { AmbassadorBubbles } from '../components/AmbassadorBubbles'\nimport type { AuthFormView, AuthLayout, LoginAmbassador } from '../types'\n\nexport interface LoginPageProps {\n appName?: string\n logo?: React.ReactNode\n loginLogo?: React.ReactNode\n layout?: AuthLayout\n tagline?: string\n description?: string\n /** Product ambassadors shown as a small social-proof avatar strip above the\n * tagline on the split-layout brand panel. Renders nothing when empty/imageless. */\n loginAmbassadors?: LoginAmbassador[]\n /** Optional microtext beside the ambassador strip, e.g. \"+2 mil profissionais\". */\n loginAmbassadorsLabel?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n /** Providers shown as \"em breve\" — declared but not wired yet. */\n oauthComingSoon?: Exclude<AuthProvider, 'email'>[]\n resetPasswordUrl?: string\n onSuccess?: () => void\n}\n\nexport function LoginPage({\n appName = 'App',\n logo,\n loginLogo,\n layout = 'split',\n tagline,\n description,\n loginAmbassadors,\n loginAmbassadorsLabel,\n showOAuth,\n oauthProviders,\n oauthComingSoon,\n resetPasswordUrl,\n onSuccess,\n}: LoginPageProps) {\n const [view, setView] = React.useState<AuthFormView>('login')\n // Lifted out of the forms so switching view carries the e-mail across: someone\n // who typed it and then remembered they forgot the password should not have to\n // type it again (and back on the login form it is still there).\n const [email, setEmail] = React.useState('')\n const brandLogo = loginLogo ?? logo\n const heading = view === 'login' ? 'Welcome back' : view === 'signup' ? 'Create account' : 'Reset password'\n const subtitle =\n view === 'login'\n ? 'Enter your credentials to continue'\n : view === 'signup'\n ? 'Create your account to get started'\n : 'Enter your email and we will send reset instructions'\n const form =\n view === 'login' ? (\n <LoginForm\n onSuccess={onSuccess}\n onForgotPassword={() => setView('recovery')}\n showOAuth={showOAuth}\n oauthProviders={oauthProviders}\n oauthComingSoon={oauthComingSoon}\n initialEmail={email}\n onEmailChange={setEmail}\n />\n ) : view === 'signup' ? (\n <SignupForm onSuccess={onSuccess} />\n ) : (\n <ForgotPasswordForm\n redirectTo={resetPasswordUrl}\n onBackToLogin={() => setView('login')}\n initialEmail={email}\n onEmailChange={setEmail}\n />\n )\n const switcher =\n view === 'login' ? (\n <p className=\"text-center text-sm text-muted-foreground\">\n Do not have an account?{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('signup')}>\n Sign up\n </button>\n </p>\n ) : (\n <p className=\"text-center text-sm text-muted-foreground\">\n {view === 'signup' ? 'Already have an account?' : 'Remembered your password?'}{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('login')}>\n Sign in\n </button>\n </p>\n )\n\n if (layout === 'centered') {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n <div className=\"mb-8 text-center\">\n {brandLogo && <div className=\"mb-4 flex justify-center\">{brandLogo}</div>}\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex min-h-screen bg-sidebar\">\n <div className=\"relative hidden w-1/2 overflow-hidden lg:block\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80\" />\n <div className=\"relative z-20 flex h-full flex-col justify-end p-12\">\n <div className=\"space-y-4\">\n <AmbassadorBubbles ambassadors={loginAmbassadors} label={loginAmbassadorsLabel} />\n <p className=\"text-sm font-medium text-sidebar-muted\">{appName}</p>\n <h2 className=\"text-3xl font-bold text-sidebar-foreground\">{tagline ?? `Welcome to ${appName}`}</h2>\n {description && <p className=\"max-w-md text-sm leading-relaxed text-sidebar-muted\">{description}</p>}\n </div>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col lg:p-3 lg:pl-3\">\n <div className=\"flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16\">\n <div className=\"mx-auto w-full max-w-sm\">\n {brandLogo && <div className=\"mb-8\">{brandLogo}</div>}\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface AuthGateProps extends LoginPageProps {\n requireAuth?: boolean\n loadingFallback?: React.ReactNode\n children: React.ReactNode\n}\n\nexport function AuthGate({ requireAuth = true, loadingFallback, children, ...loginProps }: AuthGateProps) {\n const { isAuthenticated, isLoading } = useAuth()\n if (!requireAuth || isAuthenticated) return <>{children}</>\n if (isLoading) {\n return (\n <>\n {loadingFallback ?? (\n <div className=\"flex min-h-screen items-center justify-center bg-background\">\n <span className=\"text-sm text-muted-foreground\">Loading...</span>\n </div>\n )}\n </>\n )\n }\n return <LoginPage {...loginProps} />\n}\n\nexport interface AuthCallbackPageProps {\n onSuccess?: () => void\n onError?: (error: Error) => void\n}\n\nexport function AuthCallbackPage({ onSuccess, onError }: AuthCallbackPageProps) {\n const { handleCallback } = useAuth()\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n handleCallback(typeof window === 'undefined' ? undefined : window.location.href)\n .then(() => {\n if (!cancelled) onSuccess?.()\n })\n .catch((err: unknown) => {\n const errorObject = err instanceof Error ? err : new Error(String(err))\n if (!cancelled) {\n setError(errorObject.message)\n onError?.(errorObject)\n }\n })\n return () => {\n cancelled = true\n }\n }, [handleCallback, onError, onSuccess])\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-6 text-center\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">{error ? 'Authentication failed' : 'Completing sign in...'}</h1>\n {error && <p className=\"mt-2 text-sm text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n\nexport interface ResetPasswordPageProps {\n onSuccess?: () => void\n}\n\n/** Kept for apps that route `/auth/reset-password` themselves. The shell no\n * longer needs a route: SetPasswordPage is mounted by usePasswordSetupGate. */\nexport function ResetPasswordPage({ onSuccess }: ResetPasswordPageProps) {\n return <SetPasswordPage reason=\"recovery\" onSuccess={onSuccess} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/runtime.ts","../src/components/forms.tsx","../src/views/set-password.tsx","../src/views/verify-email.tsx","../src/components/AmbassadorBubbles.tsx","../src/views/pages.tsx"],"names":["fieldClass","buttonClass","React2","useAuth","jsx","jsxs","React3","tl","React4","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import type { AuthAdapter } from '@fayz-ai/core'\nimport { createMockAuthAdapter, createSupabaseAuthAdapter } from '@fayz-ai/auth'\nimport type { AuthPluginOptions, ResolvedAuthPlugin } from '../types'\n\nfunction absoluteUrl(path: string): string | undefined {\n if (typeof window === 'undefined') return undefined\n if (/^https?:\\/\\//.test(path)) return path\n return `${window.location.origin}${path.startsWith('/') ? path : `/${path}`}`\n}\n\nexport function resolveAuthAdapter(options: AuthPluginOptions = {}): AuthAdapter {\n const configured = options.adapter ?? options.provider\n if (configured && typeof configured === 'object') return configured\n\n const provider = configured ?? (options.supabase?.url ? 'supabase' : 'mock')\n if (provider === 'supabase') {\n const url = options.supabase?.url\n const anonKey = options.supabase?.anonKey\n if (!url || !anonKey) {\n throw new Error('plugin-auth provider=\"supabase\" requires supabase.url and supabase.anonKey.')\n }\n return createSupabaseAuthAdapter({\n supabaseUrl: url,\n supabaseAnonKey: anonKey,\n supabaseClient: options.supabase?.client,\n callbackUrl: options.supabase?.callbackUrl ?? absoluteUrl(options.routes?.callback ?? '/auth/callback'),\n // Only when the host asked for a specific URL. Left undefined, the adapter\n // points recovery at the app root, which needs no route and no extra entry\n // in Supabase's redirect allow-list.\n resetPasswordUrl:\n options.supabase?.resetPasswordUrl ??\n (options.routes?.resetPassword ? absoluteUrl(options.routes.resetPassword) : undefined),\n })\n }\n\n return createMockAuthAdapter()\n}\n\nexport function createAuthRuntime(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return {\n kind: 'auth',\n adapter: resolveAuthAdapter(options),\n requireAuth: options.requireAuth ?? true,\n layout: options.layout ?? 'split',\n logo: options.logo,\n tagline: options.tagline,\n description: options.description,\n loginAmbassadors: options.loginAmbassadors,\n loginAmbassadorsLabel: options.loginAmbassadorsLabel,\n oauth: {\n enabled: options.oauth?.enabled ?? false,\n providers: options.oauth?.providers ?? ['google'],\n // Disabled until the grant is wired; an app that has it working passes [].\n comingSoon: options.oauth?.comingSoon ?? ['google'],\n },\n routes: {\n login: options.routes?.login ?? '/login',\n callback: options.routes?.callback ?? '/auth/callback',\n // The app root — recovery links are recognised by their own params, not by\n // the path they land on. See resetPassword() in the Supabase adapter.\n resetPassword: options.routes?.resetPassword ?? '/',\n afterSignIn: options.routes?.afterSignIn ?? '/',\n },\n }\n}\n\nexport function createAuthPlugin(options: AuthPluginOptions = {}): ResolvedAuthPlugin {\n return createAuthRuntime(options)\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport { tl } from '@fayz-ai/core'\nimport type { AuthProvider } from '@fayz-ai/core'\n\nfunction providerLabel(provider: string): string {\n return provider.charAt(0).toUpperCase() + provider.slice(1)\n}\n\nfunction fieldClass() {\n return 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n}\n\nfunction buttonClass(variant: 'primary' | 'outline' | 'ghost' = 'primary') {\n if (variant === 'outline') {\n return 'inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50'\n }\n if (variant === 'ghost') return 'text-sm font-medium text-primary hover:underline'\n return 'inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50'\n}\n\n/** Google's own mark. A grey glyph next to \"Continuar com Google\" reads as a\n * placeholder, and their brand rules ask for this one. */\nfunction GoogleMark({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n )\n}\n\nconst PROVIDER_MARKS: Partial<Record<Exclude<AuthProvider, 'email'>, React.FC<{ className?: string }>>> = {\n google: GoogleMark,\n}\n\nexport interface OAuthButtonsProps {\n providers?: Exclude<AuthProvider, 'email'>[]\n disabled?: boolean\n /**\n * Providers that are on screen but cannot sign anybody in yet.\n *\n * Shown rather than hidden because the app declares them and the merchant asks\n * for them — but a button that opens a broken consent screen is worse than one\n * that says it is not ready. Enabling later is removing the id from this list.\n */\n comingSoon?: Exclude<AuthProvider, 'email'>[]\n onProviderClick?: (provider: AuthProvider) => void | Promise<void>\n}\n\nexport function OAuthButtons({ providers = ['google'], disabled, comingSoon, onProviderClick }: OAuthButtonsProps) {\n const { signInWithOAuth } = useAuth()\n return (\n <div className=\"space-y-2\">\n {providers.map((provider) => {\n const soon = comingSoon?.includes(provider) ?? false\n const Mark = PROVIDER_MARKS[provider]\n return (\n <button\n key={provider}\n type=\"button\"\n className={`${buttonClass('outline')} gap-2`}\n disabled={disabled || soon}\n title={soon ? 'Ainda não disponível' : undefined}\n onClick={() => {\n if (soon) return\n void (onProviderClick ? onProviderClick(provider) : signInWithOAuth(provider))\n }}\n >\n {Mark && <Mark className=\"h-4 w-4 shrink-0\" />}\n Continuar com {providerLabel(provider)}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport interface LoginFormProps {\n onSuccess?: () => void\n onForgotPassword?: () => void\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n /** Providers rendered as \"em breve\" — declared but not wired yet. */\n oauthComingSoon?: Exclude<AuthProvider, 'email'>[]\n /** Seeds the field, so switching between login and recovery never asks for the\n * e-mail the user already typed. */\n initialEmail?: string\n onEmailChange?: (email: string) => void\n}\n\nexport function LoginForm({\n onSuccess,\n onForgotPassword,\n showOAuth,\n oauthProviders,\n oauthComingSoon,\n initialEmail = '',\n onEmailChange,\n}: LoginFormProps) {\n const { signIn, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState(initialEmail)\n const [password, setPassword] = React.useState('')\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await signIn(email, password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Email', 'E-mail')}</span>\n <input\n className={fieldClass()}\n type=\"email\"\n autoComplete=\"username\"\n required\n value={email}\n onChange={(e) => {\n setEmail(e.target.value)\n onEmailChange?.(e.target.value)\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Password', 'Senha')}</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"current-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n {onForgotPassword && (\n <div className=\"-mt-1 flex justify-end\">\n <button type=\"button\" className={buttonClass('ghost')} onClick={onForgotPassword}>\n {tl('Forgot password?', 'Esqueceu a senha?')}\n </button>\n </div>\n )}\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? tl('Signing in...', 'Entrando...') : tl('Sign in', 'Entrar')}\n </button>\n {showOAuth && (\n <OAuthButtons providers={oauthProviders} disabled={disabled} comingSoon={oauthComingSoon} />\n )}\n </form>\n )\n}\n\nexport interface SignupFormProps {\n onSuccess?: () => void\n}\n\nexport function SignupForm({ onSuccess }: SignupFormProps) {\n const { signUp, error, isLoading } = useAuth()\n const [fullName, setFullName] = React.useState('')\n const [email, setEmail] = React.useState('')\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError(tl('Password must be at least 8 characters.', 'A senha precisa ter pelo menos 8 caracteres.'))\n return\n }\n if (password !== confirmPassword) {\n setLocalError(tl('Passwords do not match.', 'As senhas não conferem.'))\n return\n }\n setBusy(true)\n try {\n await signUp(email, password, fullName)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Full name', 'Nome completo')}</span>\n <input className={fieldClass()} required value={fullName} onChange={(e) => setFullName(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Email', 'E-mail')}</span>\n <input className={fieldClass()} type=\"email\" autoComplete=\"username\" required value={email} onChange={(e) => setEmail(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Password', 'Senha')}</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Confirm password', 'Confirme a senha')}</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? tl('Creating account...', 'Criando conta...') : tl('Create account', 'Criar conta')}\n </button>\n </form>\n )\n}\n\nexport interface ForgotPasswordFormProps {\n redirectTo?: string\n onSent?: (email: string) => void\n onBackToLogin?: () => void\n /** Pre-filled with whatever the user already typed on the login form. */\n initialEmail?: string\n onEmailChange?: (email: string) => void\n /** Copy overrides — the set-password screen reuses this form to hand out a\n * fresh link, where \"Send reset link\" is the wrong label. */\n emailLabel?: string\n submitLabel?: string\n sendingLabel?: string\n sentLabel?: string\n backLabel?: string\n}\n\nexport function ForgotPasswordForm({\n redirectTo,\n onSent,\n onBackToLogin,\n initialEmail = '',\n onEmailChange,\n emailLabel = tl('Email', 'E-mail'),\n submitLabel = tl('Send reset link', 'Enviar link de redefinição'),\n sendingLabel = tl('Sending...', 'Enviando...'),\n sentLabel = tl('Password reset instructions sent.', 'Instruções de redefinição enviadas.'),\n backLabel = tl('Back to login', 'Voltar para o login'),\n}: ForgotPasswordFormProps) {\n const { resetPassword, error, isLoading } = useAuth()\n const [email, setEmail] = React.useState(initialEmail)\n const [sent, setSent] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setBusy(true)\n try {\n await resetPassword(email, { redirectTo })\n setSent(true)\n onSent?.(email)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{emailLabel}</span>\n <input\n className={fieldClass()}\n type=\"email\"\n autoComplete=\"username\"\n required\n autoFocus={!email}\n value={email}\n onChange={(e) => {\n setEmail(e.target.value)\n onEmailChange?.(e.target.value)\n }}\n disabled={disabled}\n />\n </label>\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n {sent && <p className=\"text-sm text-emerald-600\">{sentLabel}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? sendingLabel : submitLabel}\n </button>\n {onBackToLogin && (\n <button type=\"button\" className={buttonClass('ghost')} onClick={onBackToLogin}>\n {backLabel}\n </button>\n )}\n </form>\n )\n}\n\nexport interface ResetPasswordFormProps {\n onSuccess?: () => void\n}\n\nexport function ResetPasswordForm({ onSuccess }: ResetPasswordFormProps) {\n const { updatePassword, error, isLoading } = useAuth()\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < 8) {\n setLocalError(tl('Password must be at least 8 characters.', 'A senha precisa ter pelo menos 8 caracteres.'))\n return\n }\n if (password !== confirmPassword) {\n setLocalError(tl('Passwords do not match.', 'As senhas não conferem.'))\n return\n }\n setBusy(true)\n try {\n await updatePassword(password)\n onSuccess?.()\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('New password', 'Nova senha')}</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={password} onChange={(e) => setPassword(e.target.value)} disabled={disabled} />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tl('Confirm password', 'Confirme a senha')}</span>\n <input className={fieldClass()} type=\"password\" autoComplete=\"new-password\" required value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} disabled={disabled} />\n </label>\n {(localError || error) && <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled ? tl('Saving...', 'Salvando...') : tl('Update password', 'Atualizar senha')}\n </button>\n </form>\n )\n}\n","import * as React from 'react'\nimport { useAuth, readAuthUrlIntent, clearAuthUrlTokens, decidePasswordSetup } from '@fayz-ai/auth'\nimport { useTranslation } from '@fayz-ai/core'\nimport { ForgotPasswordForm } from '../components/forms'\n\n// ---------------------------------------------------------------------------\n// Set-password surface — the one screen behind two flows:\n//\n// • recovery — the user clicked \"forgot password\" and came back on a recovery\n// link. GoTrue already signed them in from the link, so all that is missing\n// is `updateUser({ password })`. Without this screen they land straight in\n// the app (or on the login form) and are never asked, which is exactly the\n// \"the link does nothing\" bug.\n//\n// • invite — the user was added to an organisation. The invite is a magic link,\n// so the account exists with NO password: unless they choose one here, every\n// future sign-in needs another e-mail.\n//\n// Mounted by the shell above its auth gate, driven by usePasswordSetupGate().\n// ---------------------------------------------------------------------------\n\nexport type SetPasswordReason = 'recovery' | 'invite'\n\nconst MIN_LENGTH = 8\n\nfunction fieldClass() {\n return 'h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50'\n}\n\nfunction buttonClass() {\n return 'inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50'\n}\n\nfunction useTr() {\n const t = useTranslation()\n return React.useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>) => {\n const value = t(key, params)\n return !value || value === key ? fallback : value\n },\n [t],\n )\n}\n\nexport interface PasswordSetupGate {\n /** null when nothing is pending and the shell should render normally. */\n reason: SetPasswordReason | null\n /** The link is dead (already used / expired) — offer a fresh one instead. */\n expired: boolean\n /** Still resolving the session the link carries. */\n checking: boolean\n /** Called by the screen once the password is set (or the user gives up). */\n complete: () => void\n}\n\n/**\n * Decides whether the user owes us a password before they see the app.\n *\n * The URL intent is read from a snapshot taken at module load: supabase-js wipes\n * the token fragment as soon as it initialises, so the reason the user is here is\n * gone by the time React renders.\n */\nexport function usePasswordSetupGate(): PasswordSetupGate {\n const { user, isLoading, isAuthenticated } = useAuth()\n const [done, setDone] = React.useState(false)\n const intent = React.useMemo(() => readAuthUrlIntent(), [])\n\n const complete = React.useCallback(() => {\n clearAuthUrlTokens()\n setDone(true)\n }, [])\n\n if (done) return { reason: null, expired: false, checking: false, complete }\n\n const decision = decidePasswordSetup({\n intent,\n isLoading,\n isAuthenticated,\n mustSetPassword: user?.mustSetPassword,\n })\n return { ...decision, complete }\n}\n\nexport interface SetPasswordPageProps {\n reason: SetPasswordReason\n appName?: string\n logo?: React.ReactNode\n /** Show the \"ask for a new link\" form instead of the password fields. */\n expired?: boolean\n /** Waiting on the link's session — renders a quiet placeholder. */\n checking?: boolean\n onSuccess?: () => void\n}\n\nexport function SetPasswordPage({\n reason,\n appName = 'App',\n logo,\n expired,\n checking,\n onSuccess,\n}: SetPasswordPageProps) {\n const tr = useTr()\n const { user, updatePassword, signOut, error, isLoading } = useAuth()\n const [password, setPassword] = React.useState('')\n const [confirmPassword, setConfirmPassword] = React.useState('')\n const [localError, setLocalError] = React.useState<string | null>(null)\n const [busy, setBusy] = React.useState(false)\n const disabled = busy || isLoading\n\n const invite = reason === 'invite'\n const title = invite\n ? tr('auth.setPassword.welcomeTitle', `Welcome to ${appName}`, { appName })\n : tr('auth.setPassword.recoveryTitle', 'Choose a new password')\n const subtitle = invite\n ? tr('auth.setPassword.welcomeSubtitle', 'Choose a password to finish setting up your access.')\n : tr('auth.setPassword.recoverySubtitle', 'Set a new password to get back into your account.')\n\n async function submit(event: React.FormEvent) {\n event.preventDefault()\n setLocalError(null)\n if (password.length < MIN_LENGTH) {\n setLocalError(tr('auth.setPassword.tooShort', `Password must be at least ${MIN_LENGTH} characters.`))\n return\n }\n if (password !== confirmPassword) {\n setLocalError(tr('auth.setPassword.mismatch', 'Passwords do not match.'))\n return\n }\n setBusy(true)\n try {\n await updatePassword(password)\n onSuccess?.()\n } catch {\n // useAuth already surfaced it; keep the user on the form.\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n {logo && <div className=\"mb-6 flex justify-center\">{logo}</div>}\n {checking ? (\n <p className=\"py-6 text-center text-sm text-muted-foreground\">\n {tr('auth.setPassword.checking', 'Checking your link...')}\n </p>\n ) : expired ? (\n <>\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-foreground\">\n {tr('auth.setPassword.expiredTitle', 'This link has expired')}\n </h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tr(\n 'auth.setPassword.expiredSubtitle',\n 'Reset links can only be used once. Enter your e-mail and we will send a new one.',\n )}\n </p>\n </div>\n <ForgotPasswordForm\n initialEmail={user?.email}\n submitLabel={tr('auth.setPassword.sendNewLink', 'Send new link')}\n sendingLabel={tr('auth.setPassword.sending', 'Sending...')}\n sentLabel={tr('auth.setPassword.sent', 'Check your inbox — a new link is on the way.')}\n emailLabel={tr('auth.setPassword.email', 'E-mail')}\n backLabel={tr('auth.setPassword.backToLogin', 'Back to sign in')}\n onBackToLogin={onSuccess}\n />\n </>\n ) : (\n <>\n <div className=\"mb-6\">\n <h1 className=\"text-2xl font-bold text-foreground\">{title}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <form onSubmit={submit} className=\"space-y-4\">\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tr('auth.setPassword.newPassword', 'New password')}</span>\n <input\n className={fieldClass()}\n type=\"password\"\n autoComplete=\"new-password\"\n autoFocus\n required\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={disabled}\n />\n </label>\n <label className=\"block space-y-1.5 text-sm font-medium\">\n <span>{tr('auth.setPassword.confirmPassword', 'Confirm password')}</span>\n <input\n className={fieldClass()}\n type=\"password\"\n autoComplete=\"new-password\"\n required\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n disabled={disabled}\n />\n </label>\n {(localError || error) && (\n <p className=\"text-sm text-destructive\">{localError ?? error?.message}</p>\n )}\n <button className={buttonClass()} type=\"submit\" disabled={disabled}>\n {disabled\n ? tr('auth.setPassword.saving', 'Saving...')\n : tr('auth.setPassword.submit', 'Save password')}\n </button>\n </form>\n {/* An invitee who does not want to continue needs a way out that does\n not leave them stuck on this screen with a live session. */}\n <button\n type=\"button\"\n className=\"mt-4 w-full text-center text-sm text-muted-foreground hover:text-foreground\"\n onClick={() => {\n void signOut().finally(() => onSuccess?.())\n }}\n >\n {tr('auth.setPassword.backToLogin', 'Back to sign in')}\n </button>\n </>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { MailCheck } from 'lucide-react'\nimport { useAuth } from '@fayz-ai/auth'\nimport { tl } from '@fayz-ai/core'\n\n/** How long before the resend button is offered again. */\nconst RESEND_COOLDOWN_SECONDS = 60\n\nexport interface VerifyEmailNoticeProps {\n email: string\n /** Back to the sign-up form with the pending account abandoned. */\n onUseAnotherEmail?: () => void\n}\n\n/**\n * \"We sent you a link.\"\n *\n * The screen that has to exist for a confirm-email project: sign-up succeeds,\n * but the account has no session until the link is clicked. Without it the flow\n * ended on a form that appeared to do nothing.\n */\nexport function VerifyEmailNotice({ email, onUseAnotherEmail }: VerifyEmailNoticeProps) {\n const { resendConfirmation, clearPendingVerification, error } = useAuth()\n const [cooldown, setCooldown] = React.useState(0)\n const [sent, setSent] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const [unsupported, setUnsupported] = React.useState(false)\n\n React.useEffect(() => {\n if (cooldown <= 0) return\n const timer = setTimeout(() => setCooldown((s) => s - 1), 1000)\n return () => clearTimeout(timer)\n }, [cooldown])\n\n const resend = async () => {\n setBusy(true)\n setSent(false)\n try {\n const ok = await resendConfirmation(email)\n if (!ok) { setUnsupported(true); return }\n setSent(true)\n setCooldown(RESEND_COOLDOWN_SECONDS)\n } catch {\n // The message is already in the auth store's `error` and rendered below.\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className=\"space-y-6 text-center\">\n <div className=\"mx-auto flex h-12 w-12 items-center justify-center rounded-full bg-primary/10\">\n <MailCheck className=\"h-6 w-6 text-primary\" />\n </div>\n <div className=\"space-y-2\">\n <h1 className=\"text-2xl font-bold text-foreground\">\n {tl('Check your email', 'Verifique seu e-mail')}\n </h1>\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n {tl('We sent a confirmation link to', 'Enviamos um link de confirmação para')}{' '}\n <span className=\"font-medium text-foreground\">{email}</span>.{' '}\n {tl(\n 'Open it to finish creating your account.',\n 'Abra o link para terminar de criar sua conta.',\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {tl(\n 'Not there? It may have landed in spam or promotions.',\n 'Não chegou? Pode ter caído no spam ou em promoções.',\n )}\n </p>\n </div>\n\n {sent && (\n <p className=\"text-sm text-emerald-600\">{tl('Link sent again.', 'Link reenviado.')}</p>\n )}\n {unsupported && (\n <p className=\"text-sm text-muted-foreground\">\n {tl(\n 'Resending is not available here — try signing up again in a moment.',\n 'O reenvio não está disponível aqui — tente cadastrar de novo em instantes.',\n )}\n </p>\n )}\n {error && <p className=\"text-sm text-destructive\">{error.message}</p>}\n\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => void resend()}\n disabled={busy || cooldown > 0}\n className=\"inline-flex h-10 w-full items-center justify-center rounded-md border border-input bg-background px-4 text-sm font-medium transition-colors hover:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n {cooldown > 0\n ? tl(`Resend in ${cooldown}s`, `Reenviar em ${cooldown}s`)\n : busy\n ? tl('Sending...', 'Enviando...')\n : tl('Resend the link', 'Reenviar o link')}\n </button>\n <button\n type=\"button\"\n onClick={() => { clearPendingVerification(); onUseAnotherEmail?.() }}\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n {tl('Use a different email', 'Usar outro e-mail')}\n </button>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport type { LoginAmbassador } from '../types'\n\n/**\n * Social-proof \"ambassador\" strip for the split-login brand panel. Restores\n * (modernized) the old login avatar cluster: a short row of small, softly\n * overlapping circular portraits sitting just above the tagline, optionally\n * followed by a microtext label (\"+2 mil profissionais\").\n *\n * Small (40px), subtle, no flashy motion — a very gentle idle float only, which\n * fully disables under prefers-reduced-motion. Degrades to nothing when no\n * usable images are supplied, so it is always safe to render. Purely\n * presentational — never touches the auth flow.\n */\n\nconst FLOAT_STYLES = `\n@keyframes fayz-amb-drift {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-2px); }\n}\n@media (prefers-reduced-motion: reduce) {\n .fayz-amb-avatar { animation: none !important; }\n}\n`\n\nexport interface AmbassadorBubblesProps {\n ambassadors?: LoginAmbassador[]\n /** Optional social-proof caption shown beside the avatars, e.g. \"+2 mil profissionais\". */\n label?: string\n}\n\nexport function AmbassadorBubbles({ ambassadors, label }: AmbassadorBubblesProps) {\n const items = (ambassadors ?? []).filter((a) => a && typeof a.image === 'string' && a.image.trim() !== '')\n if (items.length === 0) return null\n const shown = items.slice(0, 5)\n\n return (\n <div className=\"flex items-center gap-3\">\n <style>{FLOAT_STYLES}</style>\n <div className=\"flex -space-x-2\">\n {shown.map((ambassador, index) => (\n <div\n key={`${ambassador.name}-${index}`}\n title={ambassador.role ? `${ambassador.name} · ${ambassador.role}` : ambassador.name}\n className=\"fayz-amb-avatar relative h-10 w-10 shrink-0 overflow-hidden rounded-full border-2 border-sidebar bg-sidebar-accent shadow-md ring-1 ring-sidebar-foreground/10 transition-transform duration-200 hover:z-10 hover:scale-110\"\n style={{ animation: `fayz-amb-drift 4s ease-in-out ${index * 0.4}s infinite` }}\n >\n <img\n src={ambassador.image}\n alt={ambassador.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n ))}\n </div>\n {label ? <p className=\"text-xs font-medium text-sidebar-foreground/80\">{label}</p> : null}\n </div>\n )\n}\n","import * as React from 'react'\nimport { useAuth } from '@fayz-ai/auth'\nimport type { AuthProvider } from '@fayz-ai/core'\nimport { tl } from '@fayz-ai/core'\nimport { ForgotPasswordForm, LoginForm, SignupForm } from '../components/forms'\nimport { SetPasswordPage } from './set-password'\nimport { VerifyEmailNotice } from './verify-email'\nimport { AmbassadorBubbles } from '../components/AmbassadorBubbles'\nimport type { AuthFormView, AuthLayout, LoginAmbassador } from '../types'\n\nexport interface LoginPageProps {\n appName?: string\n logo?: React.ReactNode\n loginLogo?: React.ReactNode\n layout?: AuthLayout\n tagline?: string\n description?: string\n /** Product ambassadors shown as a small social-proof avatar strip above the\n * tagline on the split-layout brand panel. Renders nothing when empty/imageless. */\n loginAmbassadors?: LoginAmbassador[]\n /** Optional microtext beside the ambassador strip, e.g. \"+2 mil profissionais\". */\n loginAmbassadorsLabel?: string\n showOAuth?: boolean\n oauthProviders?: Exclude<AuthProvider, 'email'>[]\n /** Providers shown as \"em breve\" — declared but not wired yet. */\n oauthComingSoon?: Exclude<AuthProvider, 'email'>[]\n resetPasswordUrl?: string\n onSuccess?: () => void\n}\n\nexport function LoginPage({\n appName = 'App',\n logo,\n loginLogo,\n layout = 'split',\n tagline,\n description,\n loginAmbassadors,\n loginAmbassadorsLabel,\n showOAuth,\n oauthProviders,\n oauthComingSoon,\n resetPasswordUrl,\n onSuccess,\n}: LoginPageProps) {\n const [view, setView] = React.useState<AuthFormView>('login')\n // Lifted out of the forms so switching view carries the e-mail across: someone\n // who typed it and then remembered they forgot the password should not have to\n // type it again (and back on the login form it is still there).\n const [email, setEmail] = React.useState('')\n // A sign-up that produced no session is waiting on a confirmation link, and\n // the notice replaces the whole panel until the link is clicked or abandoned.\n const pendingVerification = useAuth().pendingVerification\n const brandLogo = loginLogo ?? logo\n const heading =\n view === 'login'\n ? tl('Welcome back', 'Bem-vindo de volta')\n : view === 'signup'\n ? tl('Create account', 'Criar conta')\n : tl('Reset password', 'Redefinir senha')\n const subtitle =\n view === 'login'\n ? tl('Enter your credentials to continue', 'Entre com seus dados para continuar')\n : view === 'signup'\n ? tl('Create your account to get started', 'Crie sua conta para começar')\n : tl(\n 'Enter your email and we will send reset instructions',\n 'Informe seu e-mail e enviaremos as instruções',\n )\n const form =\n view === 'login' ? (\n <LoginForm\n onSuccess={onSuccess}\n onForgotPassword={() => setView('recovery')}\n showOAuth={showOAuth}\n oauthProviders={oauthProviders}\n oauthComingSoon={oauthComingSoon}\n initialEmail={email}\n onEmailChange={setEmail}\n />\n ) : view === 'signup' ? (\n <SignupForm onSuccess={onSuccess} />\n ) : (\n <ForgotPasswordForm\n redirectTo={resetPasswordUrl}\n onBackToLogin={() => setView('login')}\n initialEmail={email}\n onEmailChange={setEmail}\n />\n )\n const switcher =\n view === 'login' ? (\n <p className=\"text-center text-sm text-muted-foreground\">\n {tl('Do not have an account?', 'Ainda não tem conta?')}{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('signup')}>\n {tl('Sign up', 'Cadastre-se')}\n </button>\n </p>\n ) : (\n <p className=\"text-center text-sm text-muted-foreground\">\n {view === 'signup'\n ? tl('Already have an account?', 'Já tem uma conta?')\n : tl('Remembered your password?', 'Lembrou a senha?')}{' '}\n <button type=\"button\" className=\"font-medium text-primary hover:underline\" onClick={() => setView('login')}>\n {tl('Sign in', 'Entrar')}\n </button>\n </p>\n )\n\n // The notice owns the panel: heading, form and switcher would all be talking\n // about a step the user has already finished.\n const panel = pendingVerification ? (\n <VerifyEmailNotice\n email={pendingVerification.email}\n onUseAnotherEmail={() => setView('signup')}\n />\n ) : null\n\n if (layout === 'centered') {\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-sidebar p-4\">\n <div className=\"w-full max-w-md rounded-2xl border border-border/50 bg-card p-8 shadow-2xl sm:p-10\">\n {panel ?? (\n <>\n <div className=\"mb-8 text-center\">\n {brandLogo && <div className=\"mb-4 flex justify-center\">{brandLogo}</div>}\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </>\n )}\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex min-h-screen bg-sidebar\">\n <div className=\"relative hidden w-1/2 overflow-hidden lg:block\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-sidebar-accent/50 via-transparent to-sidebar/80\" />\n <div className=\"relative z-20 flex h-full flex-col justify-end p-12\">\n <div className=\"space-y-4\">\n <AmbassadorBubbles ambassadors={loginAmbassadors} label={loginAmbassadorsLabel} />\n <p className=\"text-sm font-medium text-sidebar-muted\">{appName}</p>\n <h2 className=\"text-3xl font-bold text-sidebar-foreground\">{tagline ?? `Welcome to ${appName}`}</h2>\n {description && <p className=\"max-w-md text-sm leading-relaxed text-sidebar-muted\">{description}</p>}\n </div>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col lg:p-3 lg:pl-3\">\n <div className=\"flex flex-1 flex-col justify-center bg-background px-6 py-12 lg:rounded-[1.25rem] lg:px-16\">\n <div className=\"mx-auto w-full max-w-sm\">\n {brandLogo && <div className=\"mb-8\">{brandLogo}</div>}\n {panel ?? (\n <>\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-bold text-foreground\">{heading}</h1>\n <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <div className=\"space-y-6\">\n {form}\n {switcher}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface AuthGateProps extends LoginPageProps {\n requireAuth?: boolean\n loadingFallback?: React.ReactNode\n children: React.ReactNode\n}\n\nexport function AuthGate({ requireAuth = true, loadingFallback, children, ...loginProps }: AuthGateProps) {\n const { isAuthenticated, isLoading } = useAuth()\n if (!requireAuth || isAuthenticated) return <>{children}</>\n if (isLoading) {\n return (\n <>\n {loadingFallback ?? (\n <div className=\"flex min-h-screen items-center justify-center bg-background\">\n <span className=\"text-sm text-muted-foreground\">Loading...</span>\n </div>\n )}\n </>\n )\n }\n return <LoginPage {...loginProps} />\n}\n\nexport interface AuthCallbackPageProps {\n onSuccess?: () => void\n onError?: (error: Error) => void\n}\n\nexport function AuthCallbackPage({ onSuccess, onError }: AuthCallbackPageProps) {\n const { handleCallback } = useAuth()\n const [error, setError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n handleCallback(typeof window === 'undefined' ? undefined : window.location.href)\n .then(() => {\n if (!cancelled) onSuccess?.()\n })\n .catch((err: unknown) => {\n const errorObject = err instanceof Error ? err : new Error(String(err))\n if (!cancelled) {\n setError(errorObject.message)\n onError?.(errorObject)\n }\n })\n return () => {\n cancelled = true\n }\n }, [handleCallback, onError, onSuccess])\n\n return (\n <div className=\"flex min-h-screen items-center justify-center bg-background p-6 text-center\">\n <div>\n <h1 className=\"text-xl font-semibold text-foreground\">{error ? 'Authentication failed' : 'Completing sign in...'}</h1>\n {error && <p className=\"mt-2 text-sm text-destructive\">{error}</p>}\n </div>\n </div>\n )\n}\n\nexport interface ResetPasswordPageProps {\n onSuccess?: () => void\n}\n\n/** Kept for apps that route `/auth/reset-password` themselves. The shell no\n * longer needs a route: SetPasswordPage is mounted by usePasswordSetupGate. */\nexport function ResetPasswordPage({ onSuccess }: ResetPasswordPageProps) {\n return <SetPasswordPage reason=\"recovery\" onSuccess={onSuccess} />\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/views/pages.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/views/pages.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAMjD,OAAO,KAAK,EAAgB,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAEzE,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;yFACqF;IACrF,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAA;IACpC,mFAAmF;IACnF,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IACjD,kEAAkE;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAA;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,wBAAgB,SAAS,CAAC,EACxB,OAAe,EACf,IAAI,EACJ,SAAS,EACT,MAAgB,EAChB,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,SAAS,GACV,EAAE,cAAc,qBAkIhB;AAED,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,wBAAgB,QAAQ,CAAC,EAAE,WAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,EAAE,aAAa,qBAevG;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,qBAAqB,qBA8B7E;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;gFACgF;AAChF,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,sBAAsB,qBAEtE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface VerifyEmailNoticeProps {
|
|
3
|
+
email: string;
|
|
4
|
+
/** Back to the sign-up form with the pending account abandoned. */
|
|
5
|
+
onUseAnotherEmail?: () => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* "We sent you a link."
|
|
9
|
+
*
|
|
10
|
+
* The screen that has to exist for a confirm-email project: sign-up succeeds,
|
|
11
|
+
* but the account has no session until the link is clicked. Without it the flow
|
|
12
|
+
* ended on a form that appeared to do nothing.
|
|
13
|
+
*/
|
|
14
|
+
export declare function VerifyEmailNotice({ email, onUseAnotherEmail }: VerifyEmailNoticeProps): React.JSX.Element;
|
|
15
|
+
//# sourceMappingURL=verify-email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["../../src/views/verify-email.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,sBAAsB,qBAyFrF"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"fayz": {
|
|
4
4
|
"status": "preview"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.11.1",
|
|
7
7
|
"description": "Fayz SDK — reusable auth runtime and UI integration plugin",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"sideEffects": false,
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@radix-ui/react-dialog": "^1.1.0",
|
|
33
|
-
"@fayz-ai/auth": "^0.
|
|
34
|
-
"@fayz-ai/core": "^0.
|
|
35
|
-
"@fayz-ai/ui": "^0.
|
|
33
|
+
"@fayz-ai/auth": "^0.16.0",
|
|
34
|
+
"@fayz-ai/core": "^0.16.0",
|
|
35
|
+
"@fayz-ai/ui": "^0.16.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/react": "^18.3.0",
|