@asteby/metacore-auth 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +101 -0
  3. package/dist/api-client.d.ts +35 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +57 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/components/index.d.ts +4 -0
  8. package/dist/components/index.d.ts.map +1 -0
  9. package/dist/components/index.js +3 -0
  10. package/dist/components/index.js.map +1 -0
  11. package/dist/components/password-input.d.ts +7 -0
  12. package/dist/components/password-input.d.ts.map +1 -0
  13. package/dist/components/password-input.js +10 -0
  14. package/dist/components/password-input.js.map +1 -0
  15. package/dist/components/sign-out-dialog.d.ts +16 -0
  16. package/dist/components/sign-out-dialog.d.ts.map +1 -0
  17. package/dist/components/sign-out-dialog.js +20 -0
  18. package/dist/components/sign-out-dialog.js.map +1 -0
  19. package/dist/guards.d.ts +28 -0
  20. package/dist/guards.d.ts.map +1 -0
  21. package/dist/guards.js +33 -0
  22. package/dist/guards.js.map +1 -0
  23. package/dist/index.d.ts +11 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +13 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/pages/auth-layout.d.ts +14 -0
  28. package/dist/pages/auth-layout.d.ts.map +1 -0
  29. package/dist/pages/auth-layout.js +9 -0
  30. package/dist/pages/auth-layout.js.map +1 -0
  31. package/dist/pages/forgot-password.d.ts +21 -0
  32. package/dist/pages/forgot-password.d.ts.map +1 -0
  33. package/dist/pages/forgot-password.js +33 -0
  34. package/dist/pages/forgot-password.js.map +1 -0
  35. package/dist/pages/index.d.ts +11 -0
  36. package/dist/pages/index.d.ts.map +1 -0
  37. package/dist/pages/index.js +6 -0
  38. package/dist/pages/index.js.map +1 -0
  39. package/dist/pages/otp.d.ts +37 -0
  40. package/dist/pages/otp.d.ts.map +1 -0
  41. package/dist/pages/otp.js +50 -0
  42. package/dist/pages/otp.js.map +1 -0
  43. package/dist/pages/sign-in.d.ts +54 -0
  44. package/dist/pages/sign-in.d.ts.map +1 -0
  45. package/dist/pages/sign-in.js +41 -0
  46. package/dist/pages/sign-in.js.map +1 -0
  47. package/dist/pages/sign-up.d.ts +32 -0
  48. package/dist/pages/sign-up.d.ts.map +1 -0
  49. package/dist/pages/sign-up.js +54 -0
  50. package/dist/pages/sign-up.js.map +1 -0
  51. package/dist/provider.d.ts +35 -0
  52. package/dist/provider.d.ts.map +1 -0
  53. package/dist/provider.js +48 -0
  54. package/dist/provider.js.map +1 -0
  55. package/dist/store.d.ts +40 -0
  56. package/dist/store.d.ts.map +1 -0
  57. package/dist/store.js +47 -0
  58. package/dist/store.js.map +1 -0
  59. package/package.json +81 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-layout.js","sourceRoot":"","sources":["../../src/pages/auth-layout.tsx"],"names":[],"mappings":";AAUA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAmB;IACvE,OAAO,CACL,cAAK,SAAS,EAAC,6DAA6D,YAC1E,eAAK,SAAS,EAAC,gFAAgF,aAC5F,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,uCAAuC,aACnD,IAAI,IAAI,eAAM,SAAS,EAAC,MAAM,YAAE,IAAI,GAAQ,EAC5C,SAAS,IAAI,aAAI,SAAS,EAAC,qBAAqB,YAAE,SAAS,GAAM,IAC9D,CACP,EACA,QAAQ,IACL,GACF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ReactNode } from 'react';
2
+ import { z } from 'zod';
3
+ declare const formSchema: z.ZodObject<{
4
+ email: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export type ForgotPasswordValues = z.infer<typeof formSchema>;
7
+ export interface ForgotPasswordPageProps {
8
+ brandName?: string;
9
+ logo?: ReactNode;
10
+ showcase?: ReactNode;
11
+ title?: string;
12
+ subtitle?: string;
13
+ submitLabel?: string;
14
+ onSubmit: (values: ForgotPasswordValues) => Promise<void> | void;
15
+ headerSlot?: ReactNode;
16
+ footerSlot?: ReactNode;
17
+ className?: string;
18
+ }
19
+ export declare function ForgotPasswordPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, headerSlot, footerSlot, className, }: ForgotPasswordPageProps): import("react/jsx-runtime").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=forgot-password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgot-password.d.ts","sourceRoot":"","sources":["../../src/pages/forgot-password.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAgBvB,QAAA,MAAM,UAAU;;iBAKd,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAE7D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAChE,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAA0B,EAC1B,QAAqD,EACrD,WAAyB,EACzB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,uBAAuB,2CAmFzB"}
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { z } from 'zod';
4
+ import { useForm } from 'react-hook-form';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { ArrowRight, Loader2 } from 'lucide-react';
7
+ import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
8
+ import { cn } from '@asteby/metacore-ui/lib';
9
+ const formSchema = z.object({
10
+ email: z
11
+ .string()
12
+ .min(1, 'Por favor, ingresa tu correo electrónico')
13
+ .email('Correo electrónico inválido'),
14
+ });
15
+ export function ForgotPasswordPage({ brandName, logo, showcase, title = 'Recuperar acceso', subtitle = 'Te enviaremos instrucciones a tu correo.', submitLabel = 'Continuar', onSubmit, headerSlot, footerSlot, className, }) {
16
+ const [isLoading, setIsLoading] = useState(false);
17
+ const form = useForm({
18
+ resolver: zodResolver(formSchema),
19
+ defaultValues: { email: '' },
20
+ });
21
+ async function handleSubmit(data) {
22
+ setIsLoading(true);
23
+ try {
24
+ await onSubmit(data);
25
+ form.reset();
26
+ }
27
+ finally {
28
+ setIsLoading(false);
29
+ }
30
+ }
31
+ return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-1/2 flex flex-col bg-background', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-20 max-w-lg mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-20 max-w-lg mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('grid gap-2', className), children: [_jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { children: "Correo electr\u00F3nico" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'name@example.com', ...field }) }), _jsx(FormMessage, {})] })) }), _jsxs(Button, { className: 'mt-2', disabled: isLoading, children: [submitLabel, isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : _jsx(ArrowRight, {})] }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-1/2 bg-gradient-to-br from-primary/5 via-primary/10 to-primary/5 flex-col items-center pt-12 relative overflow-hidden', children: showcase }))] }));
32
+ }
33
+ //# sourceMappingURL=forgot-password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgot-password.js","sourceRoot":"","sources":["../../src/pages/forgot-password.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { AuthLayout } from './auth-layout';
2
+ export type { AuthLayoutProps } from './auth-layout';
3
+ export { SignInPage } from './sign-in';
4
+ export type { SignInPageProps, SignInValues } from './sign-in';
5
+ export { SignUpPage } from './sign-up';
6
+ export type { SignUpPageProps, SignUpValues } from './sign-up';
7
+ export { ForgotPasswordPage } from './forgot-password';
8
+ export type { ForgotPasswordPageProps, ForgotPasswordValues } from './forgot-password';
9
+ export { OtpPage } from './otp';
10
+ export type { OtpPageProps, OtpValues } from './otp';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { AuthLayout } from './auth-layout';
2
+ export { SignInPage } from './sign-in';
3
+ export { SignUpPage } from './sign-up';
4
+ export { ForgotPasswordPage } from './forgot-password';
5
+ export { OtpPage } from './otp';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA"}
@@ -0,0 +1,37 @@
1
+ import type { ReactNode } from 'react';
2
+ export type OtpValues = {
3
+ otp: string;
4
+ };
5
+ export interface OtpPageProps {
6
+ /** Brand display name. */
7
+ brandName?: string;
8
+ /** Logo slot. */
9
+ logo?: ReactNode;
10
+ /** Heading. */
11
+ title?: string;
12
+ /** Subtitle (e.g. "Revisa tu correo"). */
13
+ subtitle?: string;
14
+ /** OTP length. Default 6. */
15
+ length?: number;
16
+ /** Submit-button label. */
17
+ submitLabel?: string;
18
+ /** Resend-button label. */
19
+ resendLabel?: string;
20
+ /** OTP field label. */
21
+ otpLabel?: string;
22
+ /** Submit handler. */
23
+ onSubmit: (values: OtpValues) => Promise<void> | void;
24
+ /** Optional resend handler. Hides the resend UI when omitted. */
25
+ onResend?: () => Promise<void> | void;
26
+ /** Slot rendered above the form (e.g. contextual text). */
27
+ headerSlot?: ReactNode;
28
+ /** Slot rendered below the submit button. */
29
+ footerSlot?: ReactNode;
30
+ /** Extra className on the form. */
31
+ className?: string;
32
+ }
33
+ /**
34
+ * Generic, brand-less one-time-code verification page.
35
+ */
36
+ export declare function OtpPage({ brandName, logo, title, subtitle, length, submitLabel, resendLabel, otpLabel, onSubmit, onResend, headerSlot, footerSlot, className, }: OtpPageProps): import("react/jsx-runtime").JSX.Element;
37
+ //# sourceMappingURL=otp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otp.d.ts","sourceRoot":"","sources":["../../src/pages/otp.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AA4BtC,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB;IACjB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sBAAsB;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrD,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACrC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,IAAI,EACJ,KAAgC,EAChC,QAAQ,EACR,MAAU,EACV,WAAyB,EACzB,WAA+B,EAC/B,QAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,YAAY,2CA+Fd"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { z } from 'zod';
4
+ import { useForm } from 'react-hook-form';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { Loader2 } from 'lucide-react';
7
+ import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, InputOTP, InputOTPGroup, InputOTPSlot, } from '@asteby/metacore-ui/primitives';
8
+ import { cn } from '@asteby/metacore-ui/lib';
9
+ function buildSchema(length) {
10
+ return z.object({
11
+ otp: z
12
+ .string()
13
+ .min(length, `Por favor, ingresa el código de ${length} dígitos.`)
14
+ .max(length, `Por favor, ingresa el código de ${length} dígitos.`),
15
+ });
16
+ }
17
+ /**
18
+ * Generic, brand-less one-time-code verification page.
19
+ */
20
+ export function OtpPage({ brandName, logo, title = 'Código de verificación', subtitle, length = 6, submitLabel = 'Verificar', resendLabel = 'Reenviar código', otpLabel = 'Código', onSubmit, onResend, headerSlot, footerSlot, className, }) {
21
+ const [isLoading, setIsLoading] = useState(false);
22
+ const [isResending, setIsResending] = useState(false);
23
+ const schema = buildSchema(length);
24
+ const form = useForm({
25
+ resolver: zodResolver(schema),
26
+ defaultValues: { otp: '' },
27
+ });
28
+ async function handleSubmit(data) {
29
+ setIsLoading(true);
30
+ try {
31
+ await onSubmit(data);
32
+ }
33
+ finally {
34
+ setIsLoading(false);
35
+ }
36
+ }
37
+ async function handleResend() {
38
+ if (!onResend)
39
+ return;
40
+ setIsResending(true);
41
+ try {
42
+ await onResend();
43
+ }
44
+ finally {
45
+ setIsResending(false);
46
+ }
47
+ }
48
+ return (_jsx("div", { className: 'h-svh flex overflow-hidden', children: _jsxs("div", { className: 'w-full flex flex-col bg-background', children: [(logo || brandName) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 max-w-md mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle })), headerSlot] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-4', className), children: [_jsx(FormField, { control: form.control, name: 'otp', render: ({ field }) => (_jsxs(FormItem, { className: 'flex flex-col items-center', children: [_jsx(FormLabel, { className: 'sr-only', children: otpLabel }), _jsx(FormControl, { children: _jsx(InputOTP, { maxLength: length, ...field, children: _jsx(InputOTPGroup, { children: Array.from({ length }).map((_, i) => (_jsx(InputOTPSlot, { index: i }, i))) }) }) }), _jsx(FormMessage, {})] })) }), _jsx(Button, { className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), onResend && (_jsx(Button, { type: 'button', variant: 'ghost', className: 'w-full', disabled: isResending, onClick: handleResend, children: isResending ? _jsx(Loader2, { className: 'animate-spin' }) : resendLabel })), footerSlot] }) })] })] }) }));
49
+ }
50
+ //# sourceMappingURL=otp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otp.js","sourceRoot":"","sources":["../../src/pages/otp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { ReactNode } from 'react';
2
+ import { z } from 'zod';
3
+ declare const formSchema: z.ZodObject<{
4
+ email: z.ZodString;
5
+ password: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export type SignInValues = z.infer<typeof formSchema>;
8
+ export interface SignInPageProps {
9
+ /** Brand display name (e.g. `"Ops"`). No default — caller owns branding. */
10
+ brandName?: string;
11
+ /** Logo slot (any React node). */
12
+ logo?: ReactNode;
13
+ /**
14
+ * Showcase slot rendered on the right-hand side on lg+ viewports. Typically a
15
+ * marketing panel (module grid, hero illustration, etc.). If omitted, only
16
+ * the form column is rendered.
17
+ */
18
+ showcase?: ReactNode;
19
+ /** Form heading. */
20
+ title?: string;
21
+ /** Form subtitle. */
22
+ subtitle?: string;
23
+ /** Submit-button label when idle. */
24
+ submitLabel?: string;
25
+ /**
26
+ * Submit handler. Receive `{ email, password }` + an optional `redirectTo`
27
+ * value passed through by the app. Resolve to signal success; reject to let
28
+ * the form surface an error.
29
+ */
30
+ onSubmit: (values: SignInValues & {
31
+ redirectTo?: string;
32
+ }) => Promise<void> | void;
33
+ /** Optional upstream redirect target (from a route search param). */
34
+ redirectTo?: string;
35
+ /** Slot for extra links (e.g. "Forgot password?", "Sign up"). */
36
+ headerSlot?: ReactNode;
37
+ /** Slot rendered below the submit button (e.g. terms copy, OAuth buttons). */
38
+ footerSlot?: ReactNode;
39
+ /** Forgot-password link shown above the password input. */
40
+ forgotPasswordSlot?: ReactNode;
41
+ /** Email-field label. */
42
+ emailLabel?: string;
43
+ /** Password-field label. */
44
+ passwordLabel?: string;
45
+ /** Extra className on the form element. */
46
+ className?: string;
47
+ }
48
+ /**
49
+ * Generic, brand-less sign-in page. Owns the form + client validation, delegates
50
+ * the network call to `onSubmit`.
51
+ */
52
+ export declare function SignInPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, redirectTo, headerSlot, footerSlot, forgotPasswordSlot, emailLabel, passwordLabel, className, }: SignInPageProps): import("react/jsx-runtime").JSX.Element;
53
+ export {};
54
+ //# sourceMappingURL=sign-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in.d.ts","sourceRoot":"","sources":["../../src/pages/sign-in.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB,QAAA,MAAM,UAAU;;;iBASd,CAAA;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAClF,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,SAAS,CAAA;IAC9B,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAwB,EACxB,QAAQ,EACR,WAAsB,EACtB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,UAAiC,EACjC,aAA4B,EAC5B,SAAS,GACV,EAAE,eAAe,2CA2GjB"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { z } from 'zod';
4
+ import { useForm } from 'react-hook-form';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { Loader2 } from 'lucide-react';
7
+ import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
8
+ import { cn } from '@asteby/metacore-ui/lib';
9
+ import { PasswordInput } from '../components/password-input';
10
+ const formSchema = z.object({
11
+ email: z
12
+ .string()
13
+ .min(1, 'Por favor, ingresa tu correo electrónico')
14
+ .email('Correo electrónico inválido'),
15
+ password: z
16
+ .string()
17
+ .min(1, 'Por favor, ingresa tu contraseña')
18
+ .min(7, 'La contraseña debe tener al menos 7 caracteres'),
19
+ });
20
+ /**
21
+ * Generic, brand-less sign-in page. Owns the form + client validation, delegates
22
+ * the network call to `onSubmit`.
23
+ */
24
+ export function SignInPage({ brandName, logo, showcase, title = 'Iniciar sesión', subtitle, submitLabel = 'Entrar', onSubmit, redirectTo, headerSlot, footerSlot, forgotPasswordSlot, emailLabel = 'Correo electrónico', passwordLabel = 'Contraseña', className, }) {
25
+ const [isLoading, setIsLoading] = useState(false);
26
+ const form = useForm({
27
+ resolver: zodResolver(formSchema),
28
+ defaultValues: { email: '', password: '' },
29
+ });
30
+ async function handleSubmit(data) {
31
+ setIsLoading(true);
32
+ try {
33
+ await onSubmit({ ...data, redirectTo });
34
+ }
35
+ finally {
36
+ setIsLoading(false);
37
+ }
38
+ }
39
+ return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-[45%] flex flex-col bg-background', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h1", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-3', className), children: [_jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: emailLabel }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'tu@email.com', autoComplete: 'email', className: 'h-10', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'password', render: ({ field }) => (_jsxs(FormItem, { className: 'relative', children: [_jsxs("div", { className: 'flex items-center justify-between', children: [_jsx(FormLabel, { className: 'text-xs', children: passwordLabel }), forgotPasswordSlot] }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', autoComplete: 'current-password', className: 'h-10', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(Button, { className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-[55%] bg-muted/50 dark:bg-muted/20 flex-col justify-center relative overflow-hidden', children: showcase }))] }));
40
+ }
41
+ //# sourceMappingURL=sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../src/pages/sign-in.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EACL,MAAM,EACN,IAAI,EACJ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,KAAK,GACN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;SAClD,KAAK,CAAC,6BAA6B,CAAC;IACvC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,kCAAkC,CAAC;SAC1C,GAAG,CAAC,CAAC,EAAE,gDAAgD,CAAC;CAC5D,CAAC,CAAA;AA2CF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,gBAAgB,EACxB,QAAQ,EACR,WAAW,GAAG,QAAQ,EACtB,QAAQ,EACR,UAAU,EACV,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,UAAU,GAAG,oBAAoB,EACjC,aAAa,GAAG,YAAY,EAC5B,SAAS,GACO;IAChB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAe;QACjC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC;QACjC,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC3C,CAAC,CAAA;IAEF,KAAK,UAAU,YAAY,CAAC,IAAkB;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;QACzC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4BAA4B,aACzC,eAAK,SAAS,EAAC,+CAA+C,aAC3D,CAAC,IAAI,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,CACpC,cAAK,SAAS,EAAC,0DAA0D,YACvE,eAAK,SAAS,EAAC,wCAAwC,aACpD,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,gCAAgC,aAC5C,IAAI,EACJ,SAAS,IAAI,eAAM,SAAS,EAAC,uBAAuB,YAAE,SAAS,GAAQ,IACpE,CACP,EACA,UAAU,IAAI,CACb,8BACE,eAAM,SAAS,EAAC,0BAA0B,kBAAS,EACnD,cAAK,SAAS,EAAC,+BAA+B,YAAE,UAAU,GAAO,IAChE,CACJ,IACG,GACF,CACP,EAED,eAAK,SAAS,EAAC,oFAAoF,aACjG,eAAK,SAAS,EAAC,+BAA+B,aAC5C,aAAI,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAM,EAC7D,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,oCAAoC,YAAE,QAAQ,GAAK,CACjE,IACG,EAEN,KAAC,IAAI,OAAK,IAAI,YACZ,gBACE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EACzC,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,aAErC,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,OAAO,EACZ,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,eACP,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,YAAE,UAAU,GAAa,EACvD,KAAC,WAAW,cACV,KAAC,KAAK,IACJ,WAAW,EAAC,cAAc,EAC1B,YAAY,EAAC,OAAO,EACpB,SAAS,EAAC,MAAM,KACZ,KAAK,GACT,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,SAAS,IACR,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAC,UAAU,EACf,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACrB,MAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,aAC5B,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,YAAE,aAAa,GAAa,EACzD,kBAAkB,IACf,EACN,KAAC,WAAW,cACV,KAAC,aAAa,IACZ,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,kBAAkB,EAC/B,SAAS,EAAC,MAAM,KACZ,KAAK,GACT,GACU,EACd,KAAC,WAAW,KAAG,IACN,CACZ,GACD,EACF,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,EAAC,QAAQ,EAAE,SAAS,YAChD,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,SAAS,EAAC,cAAc,GAAG,CAAC,CAAC,CAAC,WAAW,GACxD,EACR,UAAU,IACN,GACF,IACH,IACF,EAEL,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,yGAAyG,YACrH,QAAQ,GACL,CACP,IACG,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from 'react';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Single-step sign-up schema. Apps that need a multi-step wizard (e.g. Ops'
5
+ * account → organization → complete flow) should compose their own stepper
6
+ * using these building blocks — the kit ships a sensible default.
7
+ *
8
+ * TODO(compose): extract the Ops multi-step wizard into `SignUpWizard` once we
9
+ * have a second app that needs it. For now keep the interface simple.
10
+ */
11
+ declare const formSchema: z.ZodObject<{
12
+ name: z.ZodString;
13
+ email: z.ZodString;
14
+ password: z.ZodString;
15
+ confirmPassword: z.ZodString;
16
+ }, z.core.$strip>;
17
+ export type SignUpValues = z.infer<typeof formSchema>;
18
+ export interface SignUpPageProps {
19
+ brandName?: string;
20
+ logo?: ReactNode;
21
+ showcase?: ReactNode;
22
+ title?: string;
23
+ subtitle?: string;
24
+ submitLabel?: string;
25
+ onSubmit: (values: SignUpValues) => Promise<void> | void;
26
+ headerSlot?: ReactNode;
27
+ footerSlot?: ReactNode;
28
+ className?: string;
29
+ }
30
+ export declare function SignUpPage({ brandName, logo, showcase, title, subtitle, submitLabel, onSubmit, headerSlot, footerSlot, className, }: SignUpPageProps): import("react/jsx-runtime").JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=sign-up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-up.d.ts","sourceRoot":"","sources":["../../src/pages/sign-up.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAiBvB;;;;;;;GAOG;AACH,QAAA,MAAM,UAAU;;;;;iBAaZ,CAAA;AAEJ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACxD,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,KAAwB,EACxB,QAAQ,EACR,WAA4B,EAC5B,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,GACV,EAAE,eAAe,2CAyIjB"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { z } from 'zod';
4
+ import { useForm } from 'react-hook-form';
5
+ import { zodResolver } from '@hookform/resolvers/zod';
6
+ import { Loader2 } from 'lucide-react';
7
+ import { Button, Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, } from '@asteby/metacore-ui/primitives';
8
+ import { cn } from '@asteby/metacore-ui/lib';
9
+ import { PasswordInput } from '../components/password-input';
10
+ /**
11
+ * Single-step sign-up schema. Apps that need a multi-step wizard (e.g. Ops'
12
+ * account → organization → complete flow) should compose their own stepper
13
+ * using these building blocks — the kit ships a sensible default.
14
+ *
15
+ * TODO(compose): extract the Ops multi-step wizard into `SignUpWizard` once we
16
+ * have a second app that needs it. For now keep the interface simple.
17
+ */
18
+ const formSchema = z
19
+ .object({
20
+ name: z.string().min(1, 'Ingresa tu nombre completo'),
21
+ email: z.string().email('Ingresa un correo válido'),
22
+ password: z
23
+ .string()
24
+ .min(1, 'Ingresa una contraseña')
25
+ .min(7, 'Mínimo 7 caracteres'),
26
+ confirmPassword: z.string().min(1, 'Confirma tu contraseña'),
27
+ })
28
+ .refine((data) => data.password === data.confirmPassword, {
29
+ message: 'Las contraseñas no coinciden',
30
+ path: ['confirmPassword'],
31
+ });
32
+ export function SignUpPage({ brandName, logo, showcase, title = 'Crea tu cuenta', subtitle, submitLabel = 'Crear cuenta', onSubmit, headerSlot, footerSlot, className, }) {
33
+ const [isLoading, setIsLoading] = useState(false);
34
+ const form = useForm({
35
+ resolver: zodResolver(formSchema),
36
+ defaultValues: {
37
+ name: '',
38
+ email: '',
39
+ password: '',
40
+ confirmPassword: '',
41
+ },
42
+ });
43
+ async function handleSubmit(data) {
44
+ setIsLoading(true);
45
+ try {
46
+ await onSubmit(data);
47
+ }
48
+ finally {
49
+ setIsLoading(false);
50
+ }
51
+ }
52
+ return (_jsxs("div", { className: 'h-svh flex overflow-hidden', children: [_jsxs("div", { className: 'w-full lg:w-[45%] flex flex-col', children: [(logo || brandName || headerSlot) && (_jsx("div", { className: 'px-6 pt-8 pb-4 lg:px-12 xl:px-16 max-w-md mx-auto w-full', children: _jsxs("div", { className: 'flex items-center justify-center gap-3', children: [(logo || brandName) && (_jsxs("div", { className: 'inline-flex items-center gap-2', children: [logo, brandName && _jsx("span", { className: 'text-lg font-semibold', children: brandName })] })), headerSlot && (_jsxs(_Fragment, { children: [_jsx("span", { className: 'text-muted-foreground/50', children: "|" }), _jsx("div", { className: 'text-sm text-muted-foreground', children: headerSlot })] }))] }) })), _jsxs("div", { className: 'flex-1 flex flex-col justify-center px-6 lg:px-12 xl:px-16 max-w-md mx-auto w-full overflow-y-auto', children: [_jsxs("div", { className: 'mb-8 text-center lg:text-left', children: [_jsx("h2", { className: 'text-2xl font-bold tracking-tight', children: title }), subtitle && (_jsx("p", { className: 'text-muted-foreground text-sm mt-1', children: subtitle }))] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(handleSubmit), className: cn('space-y-3', className), children: [_jsx(FormField, { control: form.control, name: 'name', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Nombre completo" }), _jsx(FormControl, { children: _jsx(Input, { placeholder: 'Mar\u00EDa Garc\u00EDa', className: 'h-9', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'email', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Correo electr\u00F3nico" }), _jsx(FormControl, { children: _jsx(Input, { type: 'email', placeholder: 'maria@empresa.com', className: 'h-9', ...field }) }), _jsx(FormMessage, {})] })) }), _jsxs("div", { className: 'grid grid-cols-2 gap-3', children: [_jsx(FormField, { control: form.control, name: 'password', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Contrase\u00F1a" }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', ...field }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: 'confirmPassword', render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: 'text-xs', children: "Confirmar" }), _jsx(FormControl, { children: _jsx(PasswordInput, { placeholder: '********', ...field }) }), _jsx(FormMessage, {})] })) })] }), _jsx(Button, { type: 'submit', className: 'w-full h-10', disabled: isLoading, children: isLoading ? _jsx(Loader2, { className: 'animate-spin' }) : submitLabel }), footerSlot] }) })] })] }), showcase && (_jsx("div", { className: 'hidden lg:flex lg:w-[55%] bg-muted/50 dark:bg-muted/20 flex-col justify-center relative overflow-hidden', children: showcase }))] }));
53
+ }
54
+ //# sourceMappingURL=sign-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-up.js","sourceRoot":"","sources":["../../src/pages/sign-up.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ReactNode } from 'react';
2
+ interface User {
3
+ name: string;
4
+ email: string;
5
+ role: string;
6
+ avatar: string;
7
+ }
8
+ interface AuthContextType {
9
+ user: User | null;
10
+ login: (email: string, role: string) => void;
11
+ logout: () => void;
12
+ isAuthenticated: boolean;
13
+ }
14
+ export interface AuthProviderProps {
15
+ children: ReactNode;
16
+ /**
17
+ * localStorage key used to persist the lightweight user object.
18
+ * Default: `saas_user`
19
+ */
20
+ storageKey?: string;
21
+ /**
22
+ * Path to navigate to on `logout()`. Default: `/sign-in`.
23
+ */
24
+ signInPath?: string;
25
+ /**
26
+ * Default avatar URL injected into the lightweight user returned by
27
+ * `login(email, role)`. Apps can override per-use by calling
28
+ * `useAuthStore().setUser()` directly with the full user payload.
29
+ */
30
+ defaultAvatar?: string;
31
+ }
32
+ export declare function AuthProvider({ children, storageKey, signInPath, defaultAvatar, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function useAuth(): AuthContextType;
34
+ export {};
35
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;CACzB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAwB,EACxB,UAAuB,EACvB,aAAkB,GACnB,EAAE,iBAAiB,2CA0CnB;AAED,wBAAgB,OAAO,oBAMtB"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useState } from 'react';
3
+ import { useNavigate } from '@tanstack/react-router';
4
+ const AuthContext = createContext(undefined);
5
+ export function AuthProvider({ children, storageKey = 'saas_user', signInPath = '/sign-in', defaultAvatar = '', }) {
6
+ const navigate = useNavigate();
7
+ const [user, setUser] = useState(null);
8
+ // Load user from localStorage on mount (simple persistence)
9
+ useEffect(() => {
10
+ const storedUser = localStorage.getItem(storageKey);
11
+ if (storedUser) {
12
+ try {
13
+ setUser(JSON.parse(storedUser));
14
+ }
15
+ catch (e) {
16
+ console.error('Failed to parse user from storage', e);
17
+ }
18
+ }
19
+ }, [storageKey]);
20
+ const login = (email, role) => {
21
+ const emailLocal = email.split('@')[0] ?? email;
22
+ const newUser = {
23
+ name: emailLocal,
24
+ email,
25
+ role,
26
+ avatar: defaultAvatar,
27
+ };
28
+ setUser(newUser);
29
+ localStorage.setItem(storageKey, JSON.stringify(newUser));
30
+ };
31
+ const logout = () => {
32
+ setUser(null);
33
+ localStorage.removeItem(storageKey);
34
+ localStorage.removeItem('auth-storage');
35
+ // Note: host app is expected to have `signInPath` in its route tree; cast to any
36
+ // so we don't require callers to register a literal type here.
37
+ navigate({ to: signInPath });
38
+ };
39
+ return (_jsx(AuthContext.Provider, { value: { user, login, logout, isAuthenticated: !!user }, children: children }));
40
+ }
41
+ export function useAuth() {
42
+ const context = useContext(AuthContext);
43
+ if (context === undefined) {
44
+ throw new Error('useAuth must be used within an AuthProvider');
45
+ }
46
+ return context;
47
+ }
48
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAgBpD,MAAM,WAAW,GAAG,aAAa,CAA8B,SAAS,CAAC,CAAA;AAqBzE,MAAM,UAAU,YAAY,CAAC,EAC3B,QAAQ,EACR,UAAU,GAAG,WAAW,EACxB,UAAU,GAAG,UAAU,EACvB,aAAa,GAAG,EAAE,GACA;IAClB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAA;IAEnD,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACnD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAS,CAAC,CAAA;YACzC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAA;QAC/C,MAAM,OAAO,GAAS;YACpB,IAAI,EAAE,UAAU;YAChB,KAAK;YACL,IAAI;YACJ,MAAM,EAAE,aAAa;SACtB,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,CAAA;QAChB,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAA;QACb,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;QACnC,YAAY,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QACvC,iFAAiF;QACjF,+DAA+D;QAC/D,QAAQ,CAAC,EAAE,EAAE,EAAE,UAAmB,EAAE,CAAC,CAAA;IACvC,CAAC,CAAA;IAED,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,YAC1E,QAAQ,GACY,CACxB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface AuthUser {
2
+ id: string;
3
+ email: string;
4
+ name: string;
5
+ role: string;
6
+ avatar?: string;
7
+ organization_id?: string;
8
+ organization_name?: string;
9
+ organization_logo?: string;
10
+ plan_slug?: string;
11
+ plan_name?: string;
12
+ subscription_status?: 'trialing' | 'active' | 'past_due' | 'canceled' | 'unpaid';
13
+ current_period_end?: string;
14
+ is_subscription_active?: boolean;
15
+ currency_code?: string;
16
+ timezone?: string;
17
+ checkout_mode?: 'integrated' | 'cashier';
18
+ fulfillment_mode?: 'auto' | 'warehouse';
19
+ tax_rate?: number;
20
+ tax_included?: boolean;
21
+ ticket_width?: number;
22
+ print_copies?: number;
23
+ auto_print?: boolean;
24
+ }
25
+ export interface AuthState {
26
+ auth: {
27
+ user: AuthUser | null;
28
+ setUser: (user: AuthUser | null) => void;
29
+ accessToken: string;
30
+ setAccessToken: (accessToken: string) => void;
31
+ resetAccessToken: () => void;
32
+ reset: () => void;
33
+ };
34
+ }
35
+ export declare const useAuthStore: import("zustand").UseBoundStore<import("zustand").StoreApi<AuthState>>;
36
+ export declare const AUTH_STORAGE_KEYS: {
37
+ readonly ACCESS_TOKEN: "auth_token";
38
+ readonly USER_STORAGE: "auth_user";
39
+ };
40
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAA;IAChF,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACxC,gBAAgB,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAA;QACrB,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;QACxC,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;QAC7C,gBAAgB,EAAE,MAAM,IAAI,CAAA;QAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;KAClB,CAAA;CACF;AAED,eAAO,MAAM,YAAY,wEA4CvB,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;CAGpB,CAAA"}
package/dist/store.js ADDED
@@ -0,0 +1,47 @@
1
+ import { create } from 'zustand';
2
+ const ACCESS_TOKEN = 'auth_token';
3
+ const USER_STORAGE = 'auth_user';
4
+ export const useAuthStore = create()((set) => {
5
+ const token = typeof localStorage !== 'undefined'
6
+ ? localStorage.getItem(ACCESS_TOKEN) || ''
7
+ : '';
8
+ const storedUser = typeof localStorage !== 'undefined' ? localStorage.getItem(USER_STORAGE) : null;
9
+ const initialUser = storedUser ? JSON.parse(storedUser) : null;
10
+ return {
11
+ auth: {
12
+ user: initialUser,
13
+ setUser: (user) => set((state) => {
14
+ if (user) {
15
+ localStorage.setItem(USER_STORAGE, JSON.stringify(user));
16
+ }
17
+ else {
18
+ localStorage.removeItem(USER_STORAGE);
19
+ }
20
+ return { ...state, auth: { ...state.auth, user } };
21
+ }),
22
+ accessToken: token,
23
+ setAccessToken: (accessToken) => set((state) => {
24
+ localStorage.setItem(ACCESS_TOKEN, accessToken);
25
+ return { ...state, auth: { ...state.auth, accessToken } };
26
+ }),
27
+ resetAccessToken: () => set((state) => {
28
+ localStorage.removeItem(ACCESS_TOKEN);
29
+ localStorage.removeItem(USER_STORAGE);
30
+ return { ...state, auth: { ...state.auth, accessToken: '', user: null } };
31
+ }),
32
+ reset: () => set((state) => {
33
+ localStorage.removeItem(ACCESS_TOKEN);
34
+ localStorage.removeItem(USER_STORAGE);
35
+ return {
36
+ ...state,
37
+ auth: { ...state.auth, user: null, accessToken: '' },
38
+ };
39
+ }),
40
+ },
41
+ };
42
+ });
43
+ export const AUTH_STORAGE_KEYS = {
44
+ ACCESS_TOKEN,
45
+ USER_STORAGE,
46
+ };
47
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,MAAM,YAAY,GAAG,YAAY,CAAA;AACjC,MAAM,YAAY,GAAG,WAAW,CAAA;AAuChC,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,EAAa,CAAC,CAAC,GAAG,EAAE,EAAE;IACtD,MAAM,KAAK,GACT,OAAO,YAAY,KAAK,WAAW;QACjC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1C,CAAC,CAAC,EAAE,CAAA;IACR,MAAM,UAAU,GACd,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACjF,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAc,CAAC,CAAC,CAAC,IAAI,CAAA;IAE5E,OAAO;QACL,IAAI,EAAE;YACJ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,IAAI,IAAI,EAAE,CAAC;oBACT,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC1D,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACvC,CAAC;gBACD,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;YACpD,CAAC,CAAC;YACJ,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;gBAC/C,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAA;YAC3D,CAAC,CAAC;YACJ,gBAAgB,EAAE,GAAG,EAAE,CACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAA;YAC3E,CAAC,CAAC;YACJ,KAAK,EAAE,GAAG,EAAE,CACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,YAAY,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;gBACrC,OAAO;oBACL,GAAG,KAAK;oBACR,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;iBACrD,CAAA;YACH,CAAC,CAAC;SACL;KACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY;IACZ,YAAY;CACJ,CAAA"}