@cellarnode/auth 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/index.d.ts +5 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +6 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/input-otp-slots.d.ts +12 -0
- package/dist/react/input-otp-slots.d.ts.map +1 -0
- package/dist/react/input-otp-slots.js +24 -0
- package/dist/react/input-otp-slots.js.map +1 -0
- package/dist/react/login-form.d.ts +17 -0
- package/dist/react/login-form.d.ts.map +1 -0
- package/dist/react/login-form.js +142 -0
- package/dist/react/login-form.js.map +1 -0
- package/dist/react/register-form.d.ts +9 -0
- package/dist/react/register-form.d.ts.map +1 -0
- package/dist/react/register-form.js +52 -0
- package/dist/react/register-form.js.map +1 -0
- package/dist/react/squircle-shift.d.ts +7 -0
- package/dist/react/squircle-shift.d.ts.map +1 -0
- package/dist/react/squircle-shift.js +148 -0
- package/dist/react/squircle-shift.js.map +1 -0
- package/dist/react/unauthorized.d.ts +6 -0
- package/dist/react/unauthorized.d.ts.map +1 -0
- package/dist/react/unauthorized.js +7 -0
- package/dist/react/unauthorized.js.map +1 -0
- package/package.json +1 -1
package/dist/react/index.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export { LoginForm, type LoginFormProps } from "./login-form.js";
|
|
2
|
+
export { RegisterForm, type RegisterFormProps } from "./register-form.js";
|
|
3
|
+
export { UnauthorizedPage, type UnauthorizedPageProps, } from "./unauthorized.js";
|
|
4
|
+
export { SquircleShift, type SquircleShiftProps } from "./squircle-shift.js";
|
|
5
|
+
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator, type InputOTPProps, } from "./input-otp-slots.js";
|
|
2
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,sBAAsB,CAAC"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {};
|
|
1
|
+
"use client";
|
|
2
|
+
export { LoginForm } from "./login-form.js";
|
|
3
|
+
export { RegisterForm } from "./register-form.js";
|
|
4
|
+
export { UnauthorizedPage, } from "./unauthorized.js";
|
|
5
|
+
export { SquircleShift } from "./squircle-shift.js";
|
|
6
|
+
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator, } from "./input-otp-slots.js";
|
|
4
7
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAuB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,gBAAgB,GAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,iBAAiB,GAElB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { OTPInput } from "input-otp";
|
|
3
|
+
export type InputOTPProps = React.ComponentProps<typeof OTPInput> & {
|
|
4
|
+
containerClassName?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function InputOTP({ containerClassName, ...props }: InputOTPProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function InputOTPSlot({ index, className, ...props }: React.ComponentProps<"div"> & {
|
|
9
|
+
index: number;
|
|
10
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
export declare function InputOTPSeparator(props: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=input-otp-slots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-otp-slots.d.ts","sourceRoot":"","sources":["../../src/react/input-otp-slots.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AAItD,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,GAAG;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,2CAWvE;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ7B;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,kDAyBjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAMnE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { OTPInput, OTPInputContext } from "input-otp";
|
|
5
|
+
import { clsx } from "clsx";
|
|
6
|
+
import { MinusIcon } from "lucide-react";
|
|
7
|
+
export function InputOTP({ containerClassName, ...props }) {
|
|
8
|
+
return (_jsx(OTPInput, { "data-slot": "input-otp", containerClassName: clsx("flex items-center gap-2 has-disabled:opacity-50", containerClassName), ...props }));
|
|
9
|
+
}
|
|
10
|
+
export function InputOTPGroup({ className, ...props }) {
|
|
11
|
+
return (_jsx("div", { "data-slot": "input-otp-group", className: clsx("flex items-center", className), ...props }));
|
|
12
|
+
}
|
|
13
|
+
export function InputOTPSlot({ index, className, ...props }) {
|
|
14
|
+
const inputOTPContext = React.useContext(OTPInputContext);
|
|
15
|
+
const slot = inputOTPContext.slots[index];
|
|
16
|
+
if (!slot)
|
|
17
|
+
return null;
|
|
18
|
+
const { char, hasFakeCaret, isActive } = slot;
|
|
19
|
+
return (_jsxs("div", { "data-slot": "input-otp-slot", "data-active": isActive, className: clsx("relative flex h-12 w-10 items-center justify-center border-y border-r border-input text-sm shadow-xs transition-all first:rounded-l-md first:border-l last:rounded-r-md", isActive && "z-10 ring-[3px] ring-ring/50 border-ring", className), ...props, children: [char, hasFakeCaret && (_jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: _jsx("div", { className: "animate-caret-blink h-4 w-px bg-foreground duration-1000" }) }))] }));
|
|
20
|
+
}
|
|
21
|
+
export function InputOTPSeparator(props) {
|
|
22
|
+
return (_jsx("div", { "data-slot": "input-otp-separator", role: "separator", ...props, children: _jsx(MinusIcon, { className: "size-4" }) }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=input-otp-slots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-otp-slots.js","sourceRoot":"","sources":["../../src/react/input-otp-slots.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC,MAAM,UAAU,QAAQ,CAAC,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAiB;IACtE,OAAO,CACL,KAAC,QAAQ,iBACG,WAAW,EACrB,kBAAkB,EAAE,IAAI,CACtB,iDAAiD,EACjD,kBAAkB,CACnB,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACoB;IAC5B,OAAO,CACL,2BACY,iBAAiB,EAC3B,SAAS,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,KAC3C,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACwC;IAChD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE9C,OAAO,CACL,4BACY,gBAAgB,iBACb,QAAQ,EACrB,SAAS,EAAE,IAAI,CACb,yKAAyK,EACzK,QAAQ,IAAI,0CAA0C,EACtD,SAAS,CACV,KACG,KAAK,aAER,IAAI,EACJ,YAAY,IAAI,CACf,cAAK,SAAS,EAAC,uEAAuE,YACpF,cAAK,SAAS,EAAC,0DAA0D,GAAG,GACxE,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkC;IAClE,OAAO,CACL,2BAAe,qBAAqB,EAAC,IAAI,EAAC,WAAW,KAAK,KAAK,YAC7D,KAAC,SAAS,IAAC,SAAS,EAAC,QAAQ,GAAG,GAC5B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AuthApi, AuthStore } from "../types.js";
|
|
2
|
+
export interface LoginFormProps {
|
|
3
|
+
userType: "importer" | "producer";
|
|
4
|
+
brandName: string;
|
|
5
|
+
brandDescription?: string;
|
|
6
|
+
authApi: AuthApi;
|
|
7
|
+
authStore: AuthStore;
|
|
8
|
+
onLoginSuccess: () => void;
|
|
9
|
+
onNavigateRegister: () => void;
|
|
10
|
+
logoSrc?: string;
|
|
11
|
+
inviteMode?: boolean;
|
|
12
|
+
initialEmail?: string;
|
|
13
|
+
theme?: "light" | "dark";
|
|
14
|
+
onResendSuccess?: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function LoginForm({ userType, brandName, brandDescription, authApi, authStore, onLoginSuccess, onNavigateRegister, logoSrc, inviteMode, initialEmail, theme, onResendSuccess, }: LoginFormProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=login-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-form.d.ts","sourceRoot":"","sources":["../../src/react/login-form.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAatD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;CAC9B;AAYD,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,UAAkB,EAClB,YAAiB,EACjB,KAAe,EACf,eAAe,GAChB,EAAE,cAAc,2CAqVhB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { Suspense, useEffect, useState } from "react";
|
|
4
|
+
import { REGEXP_ONLY_DIGITS } from "input-otp";
|
|
5
|
+
import { ArrowLeft, ArrowRight, CheckCircle2, Clock3, Loader2, } from "lucide-react";
|
|
6
|
+
import { clsx } from "clsx";
|
|
7
|
+
import { AuthError } from "../types.js";
|
|
8
|
+
import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from "./input-otp-slots.js";
|
|
9
|
+
const LazySquircleShift = React.lazy(() => import("./squircle-shift.js").then((m) => ({ default: m.SquircleShift })));
|
|
10
|
+
function formatCountdown(expiresAt) {
|
|
11
|
+
if (!expiresAt)
|
|
12
|
+
return "15:00";
|
|
13
|
+
const diff = Math.max(0, new Date(expiresAt).getTime() - Date.now());
|
|
14
|
+
const minutes = String(Math.floor(diff / 60_000)).padStart(2, "0");
|
|
15
|
+
const seconds = String(Math.floor((diff % 60_000) / 1000)).padStart(2, "0");
|
|
16
|
+
return `${minutes}:${seconds}`;
|
|
17
|
+
}
|
|
18
|
+
export function LoginForm({ userType, brandName, brandDescription, authApi, authStore, onLoginSuccess, onNavigateRegister, logoSrc, inviteMode = false, initialEmail = "", theme = "light", onResendSuccess, }) {
|
|
19
|
+
const [step, setStep] = useState("email");
|
|
20
|
+
const [email, setEmail] = useState(initialEmail);
|
|
21
|
+
const [code, setCode] = useState("");
|
|
22
|
+
const [error, setError] = useState("");
|
|
23
|
+
const [showRegisterLink, setShowRegisterLink] = useState(false);
|
|
24
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
25
|
+
const [expiresAt, setExpiresAt] = useState(null);
|
|
26
|
+
const [countdown, setCountdown] = useState("15:00");
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!expiresAt)
|
|
29
|
+
return;
|
|
30
|
+
setCountdown(formatCountdown(expiresAt));
|
|
31
|
+
const interval = window.setInterval(() => {
|
|
32
|
+
setCountdown(formatCountdown(expiresAt));
|
|
33
|
+
}, 1000);
|
|
34
|
+
return () => window.clearInterval(interval);
|
|
35
|
+
}, [expiresAt]);
|
|
36
|
+
const canResend = expiresAt
|
|
37
|
+
? new Date(expiresAt).getTime() <= Date.now()
|
|
38
|
+
: false;
|
|
39
|
+
const stepIndex = step === "email" ? 0 : 1;
|
|
40
|
+
const normalizedEmail = email.trim();
|
|
41
|
+
function handleAuthError(err, fallbackMessage) {
|
|
42
|
+
if (err instanceof AuthError) {
|
|
43
|
+
setShowRegisterLink(false);
|
|
44
|
+
switch (err.code) {
|
|
45
|
+
case "USER_NOT_FOUND":
|
|
46
|
+
setError("No account found with this email.");
|
|
47
|
+
setShowRegisterLink(true);
|
|
48
|
+
break;
|
|
49
|
+
case "OTP_RATE_LIMIT":
|
|
50
|
+
setError("Too many code requests. Please wait before trying again.");
|
|
51
|
+
break;
|
|
52
|
+
case "OTP_NOT_FOUND":
|
|
53
|
+
setError("Code expired. Please request a new one.");
|
|
54
|
+
setExpiresAt(new Date(0).toISOString());
|
|
55
|
+
break;
|
|
56
|
+
case "OTP_INVALID":
|
|
57
|
+
setError(`Invalid code. ${err.remainingAttempts ?? 0} attempt(s) remaining.`);
|
|
58
|
+
break;
|
|
59
|
+
case "OTP_MAX_ATTEMPTS":
|
|
60
|
+
setError("Too many failed attempts. Please request a new code.");
|
|
61
|
+
setExpiresAt(new Date(0).toISOString());
|
|
62
|
+
break;
|
|
63
|
+
case "USER_DELETED":
|
|
64
|
+
setError("This account has been deactivated. Contact support.");
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
setError(err.message || "Something went wrong");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
setError(err instanceof Error ? err.message : fallbackMessage);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function handleEmailSubmit(e) {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
setError("");
|
|
77
|
+
setShowRegisterLink(false);
|
|
78
|
+
setIsSubmitting(true);
|
|
79
|
+
try {
|
|
80
|
+
const response = await authApi.requestOtp(normalizedEmail);
|
|
81
|
+
setExpiresAt(response.expiresAt);
|
|
82
|
+
setStep("otp");
|
|
83
|
+
setCode("");
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
handleAuthError(err, "Failed to send code");
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
setIsSubmitting(false);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function handleOtpSubmit(e) {
|
|
93
|
+
e.preventDefault();
|
|
94
|
+
setError("");
|
|
95
|
+
setShowRegisterLink(false);
|
|
96
|
+
setIsSubmitting(true);
|
|
97
|
+
try {
|
|
98
|
+
const result = await authApi.verifyOtp(normalizedEmail, code);
|
|
99
|
+
if (result.user.userType !== userType) {
|
|
100
|
+
setError(`This portal is for ${userType} accounts only.`);
|
|
101
|
+
authStore.clearAccessToken();
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
authStore.setAccessToken(result.accessToken, result.expiresIn);
|
|
105
|
+
onLoginSuccess();
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
handleAuthError(err, "Invalid code");
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
setIsSubmitting(false);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function handleResend() {
|
|
115
|
+
setError("");
|
|
116
|
+
setShowRegisterLink(false);
|
|
117
|
+
setIsSubmitting(true);
|
|
118
|
+
try {
|
|
119
|
+
const response = await authApi.requestOtp(normalizedEmail);
|
|
120
|
+
setExpiresAt(response.expiresAt);
|
|
121
|
+
setCode("");
|
|
122
|
+
onResendSuccess?.();
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
handleAuthError(err, "Failed to resend code");
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
setIsSubmitting(false);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return (_jsxs("div", { className: "grid min-h-dvh lg:grid-cols-2", children: [_jsxs("div", { className: "flex flex-col px-6 py-6 sm:px-10 sm:py-8 lg:px-14 lg:py-10", children: [_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "inline-flex items-center gap-3", children: [logoSrc ? (_jsx("img", { src: logoSrc, alt: brandName, width: 36, height: 36, className: "size-9 rounded-full" })) : (_jsx("div", { className: "flex size-9 items-center justify-center rounded-full bg-primary text-sm font-bold text-primary-foreground", children: brandName.charAt(0) })), _jsx("span", { className: "font-semibold text-foreground", children: brandName })] }), brandDescription && (_jsx("span", { className: "text-sm text-muted-foreground", children: brandDescription }))] }), _jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsxs("div", { className: "w-full max-w-sm", children: [_jsx("div", { className: "mb-8 flex items-center gap-2", children: [0, 1].map((i) => (_jsx("div", { className: clsx("size-2 rounded-full transition-colors", stepIndex >= i
|
|
132
|
+
? "bg-primary"
|
|
133
|
+
: "bg-muted-foreground/25") }, i))) }), inviteMode && step === "email" && (_jsx("div", { className: "mb-4 rounded-lg border border-primary/20 bg-primary/5 px-4 py-3 text-sm/6 text-foreground", children: "Signing in to accept your organization invitation." })), _jsx("h1", { className: "text-2xl font-semibold tracking-tight text-foreground", children: step === "email" ? "Sign in to your account" : "Check your email" }), _jsx("p", { className: "mt-2 text-sm/6 text-muted-foreground", children: step === "email"
|
|
134
|
+
? "Enter your work email to receive a one-time access code."
|
|
135
|
+
: `We sent a 6-digit code to ${normalizedEmail}.` }), _jsx("div", { className: "mt-8", children: step === "email" ? (_jsxs("form", { onSubmit: handleEmailSubmit, className: "grid gap-5", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx("label", { htmlFor: "email", className: "text-sm font-medium leading-none", children: "Email address" }), _jsx("input", { id: "email", type: "email", placeholder: "you@company.com", value: email, onChange: (event) => setEmail(event.target.value), required: true, autoFocus: true, "aria-invalid": !!error || undefined, className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50" }), error && (_jsx("p", { className: "text-sm text-destructive", children: error })), showRegisterLink && (_jsx("button", { type: "button", onClick: onNavigateRegister, className: "inline-flex items-center justify-center text-sm text-primary transition-colors hover:text-primary/80", children: "Create an account instead" }))] }), _jsxs("button", { type: "submit", className: "inline-flex h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-xs transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50", disabled: isSubmitting || !normalizedEmail, children: [isSubmitting ? (_jsx(Loader2, { className: "mr-2 size-4 animate-spin" })) : (_jsx(ArrowRight, { className: "mr-2 size-4" })), "Continue"] })] })) : (_jsxs("form", { onSubmit: handleOtpSubmit, className: "grid gap-5", children: [_jsxs("div", { className: "inline-flex w-fit items-center gap-1.5 rounded-full border border-border bg-muted/50 px-3 py-1 text-xs font-medium text-muted-foreground", children: [_jsx(Clock3, { className: "size-3" }), "Expires in ", countdown] }), _jsxs("div", { className: "grid gap-2", children: [_jsxs(InputOTP, { id: "otp", value: code, onChange: (value) => setCode(value), maxLength: 6, pattern: REGEXP_ONLY_DIGITS, autoFocus: true, "data-invalid": !!error || undefined, containerClassName: "w-full justify-center", children: [_jsxs(InputOTPGroup, { className: "gap-2.5", children: [_jsx(InputOTPSlot, { index: 0 }), _jsx(InputOTPSlot, { index: 1 }), _jsx(InputOTPSlot, { index: 2 })] }), _jsx(InputOTPSeparator, {}), _jsxs(InputOTPGroup, { className: "gap-2.5", children: [_jsx(InputOTPSlot, { index: 3 }), _jsx(InputOTPSlot, { index: 4 }), _jsx(InputOTPSlot, { index: 5 })] })] }), error && (_jsx("p", { className: "text-sm text-destructive", children: error }))] }), _jsxs("button", { type: "submit", className: "inline-flex h-11 w-full items-center justify-center gap-2 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-xs transition-colors hover:bg-primary/90 disabled:pointer-events-none disabled:opacity-50", disabled: isSubmitting || code.length !== 6, children: [isSubmitting ? (_jsx(Loader2, { className: "mr-2 size-4 animate-spin" })) : (_jsx(CheckCircle2, { className: "mr-2 size-4" })), "Verify"] }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsx("button", { type: "button", className: "text-muted-foreground transition-colors hover:text-foreground", onClick: () => {
|
|
136
|
+
setStep("email");
|
|
137
|
+
setCode("");
|
|
138
|
+
setError("");
|
|
139
|
+
setShowRegisterLink(false);
|
|
140
|
+
}, children: _jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(ArrowLeft, { className: "size-3.5" }), "Change email"] }) }), _jsx("button", { type: "button", className: "text-primary transition-colors hover:text-primary/80 disabled:text-muted-foreground/50", onClick: handleResend, disabled: isSubmitting || !canResend, children: "Resend code" })] })] })) }), _jsxs("p", { className: "mt-8 text-center text-sm text-muted-foreground", children: ["Need an account?", " ", _jsx("button", { type: "button", onClick: onNavigateRegister, className: "text-primary transition-colors hover:text-primary/80", children: "Register here" })] })] }) })] }), _jsx("div", { className: "hidden lg:block", children: _jsx(Suspense, { fallback: _jsx("div", { className: "size-full bg-muted" }), children: _jsx(LazySquircleShift, { className: "size-full", theme: theme }) }) })] }));
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=login-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-form.js","sourceRoot":"","sources":["../../src/react/login-form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AuthApi } from "../types.js";
|
|
2
|
+
export interface RegisterFormProps {
|
|
3
|
+
userType: "importer" | "producer";
|
|
4
|
+
onRegistered: () => void;
|
|
5
|
+
onNavigateLogin: () => void;
|
|
6
|
+
authApi: AuthApi;
|
|
7
|
+
}
|
|
8
|
+
export declare function RegisterForm({ userType, onRegistered, onNavigateLogin, authApi, }: RegisterFormProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=register-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-form.d.ts","sourceRoot":"","sources":["../../src/react/register-form.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,OAAO,GACR,EAAE,iBAAiB,2CAuJnB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { AuthError } from "../types.js";
|
|
5
|
+
import { Loader2 } from "lucide-react";
|
|
6
|
+
export function RegisterForm({ userType, onRegistered, onNavigateLogin, authApi, }) {
|
|
7
|
+
const [name, setName] = useState("");
|
|
8
|
+
const [email, setEmail] = useState("");
|
|
9
|
+
const [phone, setPhone] = useState("");
|
|
10
|
+
const [error, setError] = useState("");
|
|
11
|
+
const [success, setSuccess] = useState(false);
|
|
12
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
13
|
+
async function handleSubmit(e) {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
setError("");
|
|
16
|
+
setIsSubmitting(true);
|
|
17
|
+
try {
|
|
18
|
+
await authApi.register({
|
|
19
|
+
name,
|
|
20
|
+
email,
|
|
21
|
+
phone: phone || undefined,
|
|
22
|
+
userType,
|
|
23
|
+
});
|
|
24
|
+
setSuccess(true);
|
|
25
|
+
onRegistered();
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err instanceof AuthError) {
|
|
29
|
+
if (err.code === "USER_ALREADY_EXISTS") {
|
|
30
|
+
setError("An account with this email already exists. Please log in instead.");
|
|
31
|
+
}
|
|
32
|
+
else if (err.code === "USER_DELETED") {
|
|
33
|
+
setError("This account has been deactivated. Please contact support.");
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
setError(err.message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
setError(err instanceof Error ? err.message : "Registration failed");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
setIsSubmitting(false);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (success) {
|
|
48
|
+
return (_jsxs("div", { className: "rounded-xl border border-border bg-card shadow-sm", children: [_jsxs("div", { className: "p-6 text-center", children: [_jsx("h2", { className: "text-2xl font-semibold", children: "Check your email" }), _jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: ["We sent a verification link to ", email, ". After verifying, you can log in."] })] }), _jsx("div", { className: "px-6 pb-6", children: _jsx("button", { onClick: onNavigateLogin, className: "inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-xs hover:bg-primary/90 transition-colors", children: "Go to Login" }) })] }));
|
|
49
|
+
}
|
|
50
|
+
return (_jsxs("div", { className: "rounded-xl border border-border bg-card shadow-sm", children: [_jsxs("div", { className: "p-6 text-center", children: [_jsx("h2", { className: "text-2xl font-semibold", children: "Create an account" }), _jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: ["Register as ", userType === "importer" ? "an importer" : "a producer", " ", "to get started"] })] }), _jsx("div", { className: "px-6 pb-6", children: _jsxs("form", { onSubmit: handleSubmit, className: "grid gap-4", children: [_jsxs("div", { className: "grid gap-2", children: [_jsx("label", { htmlFor: "name", className: "text-sm font-medium leading-none", children: "Full name" }), _jsx("input", { id: "name", type: "text", placeholder: "Jane Doe", value: name, onChange: (e) => setName(e.target.value), required: true, autoFocus: true, className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50" })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx("label", { htmlFor: "reg-email", className: "text-sm font-medium leading-none", children: "Email" }), _jsx("input", { id: "reg-email", type: "email", placeholder: "you@company.com", value: email, onChange: (e) => setEmail(e.target.value), required: true, className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50" })] }), _jsxs("div", { className: "grid gap-2", children: [_jsx("label", { htmlFor: "phone", className: "text-sm font-medium leading-none", children: "Phone (optional)" }), _jsx("input", { id: "phone", type: "tel", placeholder: "+1 555 123 4567", value: phone, onChange: (e) => setPhone(e.target.value), className: "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-xs placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50" })] }), error && _jsx("p", { className: "text-sm text-destructive", children: error }), _jsxs("button", { type: "submit", disabled: isSubmitting, className: "inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-xs hover:bg-primary/90 transition-colors disabled:pointer-events-none disabled:opacity-50", children: [isSubmitting && (_jsx(Loader2, { className: "mr-2 size-4 animate-spin" })), "Create account"] }), _jsx("button", { type: "button", onClick: onNavigateLogin, className: "inline-flex h-10 w-full items-center justify-center rounded-md text-sm font-medium hover:bg-accent hover:text-accent-foreground transition-colors", children: "Already have an account? Log in" })] }) })] }));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=register-form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-form.js","sourceRoot":"","sources":["../../src/react/register-form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"squircle-shift.d.ts","sourceRoot":"","sources":["../../src/react/squircle-shift.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAK/C,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiMD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAoCtD,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useRef, useMemo } from "react";
|
|
4
|
+
import { Canvas, useFrame, useThree } from "@react-three/fiber";
|
|
5
|
+
import * as THREE from "three";
|
|
6
|
+
import { clsx } from "clsx";
|
|
7
|
+
const vertexShader = /* glsl */ `
|
|
8
|
+
varying vec2 vUv;
|
|
9
|
+
void main() {
|
|
10
|
+
vUv = uv;
|
|
11
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
const fragmentShader = /* glsl */ `
|
|
15
|
+
precision highp float;
|
|
16
|
+
|
|
17
|
+
uniform float u_time;
|
|
18
|
+
uniform vec2 u_resolution;
|
|
19
|
+
uniform float u_speed;
|
|
20
|
+
uniform int u_colorLayers;
|
|
21
|
+
uniform float u_gridFrequency;
|
|
22
|
+
uniform float u_gridIntensity;
|
|
23
|
+
uniform float u_waveSpeed;
|
|
24
|
+
uniform float u_waveIntensity;
|
|
25
|
+
uniform float u_spiralIntensity;
|
|
26
|
+
uniform float u_lineThickness;
|
|
27
|
+
uniform float u_falloff;
|
|
28
|
+
uniform float u_centerX;
|
|
29
|
+
uniform float u_centerY;
|
|
30
|
+
uniform vec3 u_colorTint;
|
|
31
|
+
uniform vec3 u_backgroundColor;
|
|
32
|
+
uniform float u_brightness;
|
|
33
|
+
uniform float u_phaseOffset;
|
|
34
|
+
|
|
35
|
+
varying vec2 vUv;
|
|
36
|
+
|
|
37
|
+
void main() {
|
|
38
|
+
float animTime = u_time * u_speed;
|
|
39
|
+
vec2 resolution = u_resolution;
|
|
40
|
+
|
|
41
|
+
vec3 colorAccum = vec3(0.0);
|
|
42
|
+
float dist = 0.0;
|
|
43
|
+
float depth = animTime;
|
|
44
|
+
|
|
45
|
+
for (int layer = 0; layer < 3; layer++) {
|
|
46
|
+
if (layer >= u_colorLayers) break;
|
|
47
|
+
|
|
48
|
+
vec2 normalizedPos = vUv;
|
|
49
|
+
vec2 centeredPos = vUv;
|
|
50
|
+
centeredPos.x *= resolution.x / resolution.y;
|
|
51
|
+
centeredPos -= vec2(u_centerX, u_centerY);
|
|
52
|
+
|
|
53
|
+
depth += 0.05;
|
|
54
|
+
dist = length(centeredPos);
|
|
55
|
+
|
|
56
|
+
float horizontalWave = sin(centeredPos.x * u_gridFrequency + depth);
|
|
57
|
+
float verticalWave = cos(centeredPos.y * u_gridFrequency + depth + u_phaseOffset);
|
|
58
|
+
float gridPattern = u_gridIntensity * horizontalWave * verticalWave;
|
|
59
|
+
|
|
60
|
+
float oscillation = sin(depth) + 1.0;
|
|
61
|
+
float radialPulse = abs(sin(dist * 7.0 - depth * u_waveSpeed));
|
|
62
|
+
float waveDisplacement = oscillation * radialPulse * u_waveIntensity;
|
|
63
|
+
|
|
64
|
+
normalizedPos += (centeredPos / max(dist, 0.001)) * waveDisplacement * gridPattern;
|
|
65
|
+
normalizedPos = fract(normalizedPos);
|
|
66
|
+
|
|
67
|
+
float polarAngle = atan(centeredPos.y, centeredPos.x);
|
|
68
|
+
float polarRadius = dist * 2.0;
|
|
69
|
+
vec2 spiralOffset = vec2(
|
|
70
|
+
cos(polarAngle * polarRadius - depth),
|
|
71
|
+
sin(polarAngle * polarRadius - depth)
|
|
72
|
+
) * gridPattern * u_spiralIntensity;
|
|
73
|
+
normalizedPos += spiralOffset;
|
|
74
|
+
|
|
75
|
+
vec2 gridCell = fract(normalizedPos) - 0.5;
|
|
76
|
+
float intensity = u_lineThickness / length(gridCell);
|
|
77
|
+
|
|
78
|
+
if (layer == 0) colorAccum.r = intensity;
|
|
79
|
+
else if (layer == 1) colorAccum.g = intensity;
|
|
80
|
+
else colorAccum.b = intensity;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
colorAccum = colorAccum / (dist + u_falloff);
|
|
84
|
+
colorAccum *= u_brightness;
|
|
85
|
+
vec3 tintedColor = colorAccum * u_colorTint;
|
|
86
|
+
|
|
87
|
+
float alpha = clamp(length(colorAccum) * 0.5, 0.0, 1.0);
|
|
88
|
+
vec3 finalColor = mix(u_backgroundColor, tintedColor, alpha);
|
|
89
|
+
|
|
90
|
+
gl_FragColor = vec4(finalColor, 1.0);
|
|
91
|
+
}
|
|
92
|
+
`;
|
|
93
|
+
function ShaderPlane({ speed, colorLayers, gridFrequency, gridIntensity, waveSpeed, waveIntensity, spiralIntensity, lineThickness, falloff, centerX, centerY, colorTint, backgroundColor, brightness, phaseOffset, }) {
|
|
94
|
+
const meshRef = useRef(null);
|
|
95
|
+
const materialRef = useRef(null);
|
|
96
|
+
const { viewport } = useThree();
|
|
97
|
+
const uniforms = useMemo(() => ({
|
|
98
|
+
u_time: { value: 0 },
|
|
99
|
+
u_resolution: {
|
|
100
|
+
value: new THREE.Vector2(viewport.width * 100, viewport.height * 100),
|
|
101
|
+
},
|
|
102
|
+
u_speed: { value: speed },
|
|
103
|
+
u_colorLayers: { value: colorLayers },
|
|
104
|
+
u_gridFrequency: { value: gridFrequency },
|
|
105
|
+
u_gridIntensity: { value: gridIntensity },
|
|
106
|
+
u_waveSpeed: { value: waveSpeed },
|
|
107
|
+
u_waveIntensity: { value: waveIntensity },
|
|
108
|
+
u_spiralIntensity: { value: spiralIntensity },
|
|
109
|
+
u_lineThickness: { value: lineThickness },
|
|
110
|
+
u_falloff: { value: falloff },
|
|
111
|
+
u_centerX: { value: centerX },
|
|
112
|
+
u_centerY: { value: centerY },
|
|
113
|
+
u_colorTint: { value: new THREE.Color(colorTint) },
|
|
114
|
+
u_backgroundColor: { value: new THREE.Color(backgroundColor) },
|
|
115
|
+
u_brightness: { value: brightness },
|
|
116
|
+
u_phaseOffset: { value: phaseOffset },
|
|
117
|
+
}),
|
|
118
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
|
+
[]);
|
|
120
|
+
useFrame((state) => {
|
|
121
|
+
if (materialRef.current) {
|
|
122
|
+
materialRef.current.uniforms.u_time.value = state.clock.elapsedTime;
|
|
123
|
+
materialRef.current.uniforms.u_resolution.value.set(viewport.width * 100, viewport.height * 100);
|
|
124
|
+
materialRef.current.uniforms.u_speed.value = speed;
|
|
125
|
+
materialRef.current.uniforms.u_colorLayers.value = colorLayers;
|
|
126
|
+
materialRef.current.uniforms.u_gridFrequency.value = gridFrequency;
|
|
127
|
+
materialRef.current.uniforms.u_gridIntensity.value = gridIntensity;
|
|
128
|
+
materialRef.current.uniforms.u_waveSpeed.value = waveSpeed;
|
|
129
|
+
materialRef.current.uniforms.u_waveIntensity.value = waveIntensity;
|
|
130
|
+
materialRef.current.uniforms.u_spiralIntensity.value = spiralIntensity;
|
|
131
|
+
materialRef.current.uniforms.u_lineThickness.value = lineThickness;
|
|
132
|
+
materialRef.current.uniforms.u_falloff.value = falloff;
|
|
133
|
+
materialRef.current.uniforms.u_centerX.value = centerX;
|
|
134
|
+
materialRef.current.uniforms.u_centerY.value = centerY;
|
|
135
|
+
materialRef.current.uniforms.u_colorTint.value.set(colorTint);
|
|
136
|
+
materialRef.current.uniforms.u_backgroundColor.value.set(backgroundColor);
|
|
137
|
+
materialRef.current.uniforms.u_brightness.value = brightness;
|
|
138
|
+
materialRef.current.uniforms.u_phaseOffset.value = phaseOffset;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return (_jsxs("mesh", { ref: meshRef, scale: [viewport.width, viewport.height, 1], children: [_jsx("planeGeometry", { args: [1, 1] }), _jsx("shaderMaterial", { ref: materialRef, vertexShader: vertexShader, fragmentShader: fragmentShader, uniforms: uniforms })] }));
|
|
142
|
+
}
|
|
143
|
+
export const SquircleShift = ({ theme = "light", className, }) => {
|
|
144
|
+
const bgColor = theme === "dark" ? "#101715" : "#f6f3ec";
|
|
145
|
+
return (_jsx("div", { className: clsx("relative overflow-hidden", className), style: { width: "100%", height: "100%" }, children: _jsx(Canvas, { className: "absolute inset-0 size-full", gl: { antialias: true, alpha: false }, camera: { position: [0, 0, 1], fov: 75 }, children: _jsx(ShaderPlane, { speed: 0.3, colorLayers: 3, gridFrequency: 25, gridIntensity: 1, waveSpeed: 0.2, waveIntensity: 0.1, spiralIntensity: 1, lineThickness: 0.06, falloff: 1, centerX: 1, centerY: 1, colorTint: "#365a53", backgroundColor: bgColor, brightness: 1.5, phaseOffset: 10 }) }) }));
|
|
146
|
+
};
|
|
147
|
+
SquircleShift.displayName = "SquircleShift";
|
|
148
|
+
//# sourceMappingURL=squircle-shift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"squircle-shift.js","sourceRoot":"","sources":["../../src/react/squircle-shift.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface UnauthorizedPageProps {
|
|
2
|
+
expectedRole: string;
|
|
3
|
+
onNavigateLogin: () => void;
|
|
4
|
+
}
|
|
5
|
+
export declare function UnauthorizedPage({ expectedRole, onNavigateLogin, }: UnauthorizedPageProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=unauthorized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unauthorized.d.ts","sourceRoot":"","sources":["../../src/react/unauthorized.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,eAAe,GAChB,EAAE,qBAAqB,2CAqBvB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ShieldX } from "lucide-react";
|
|
4
|
+
export function UnauthorizedPage({ expectedRole, onNavigateLogin, }) {
|
|
5
|
+
return (_jsx("div", { className: "flex min-h-dvh items-center justify-center p-4", children: _jsxs("div", { className: "mx-auto w-full max-w-md rounded-xl border border-border bg-card p-8 text-center shadow-sm", children: [_jsx("div", { className: "mx-auto mb-4 flex size-12 items-center justify-center rounded-full bg-destructive/10", children: _jsx(ShieldX, { className: "size-6 text-destructive" }) }), _jsx("h1", { className: "text-2xl font-semibold", children: "Access Denied" }), _jsxs("p", { className: "mt-2 text-sm text-muted-foreground", children: ["This dashboard is for ", expectedRole, " only. If you believe this is an error, please contact support."] }), _jsx("button", { onClick: onNavigateLogin, className: "mt-6 inline-flex h-10 w-full items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-xs hover:bg-primary/90 transition-colors", children: "Back to Login" })] }) }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=unauthorized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unauthorized.js","sourceRoot":"","sources":["../../src/react/unauthorized.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAOvC,MAAM,UAAU,gBAAgB,CAAC,EAC/B,YAAY,EACZ,eAAe,GACO;IACtB,OAAO,CACL,cAAK,SAAS,EAAC,gDAAgD,YAC7D,eAAK,SAAS,EAAC,2FAA2F,aACxG,cAAK,SAAS,EAAC,sFAAsF,YACnG,KAAC,OAAO,IAAC,SAAS,EAAC,yBAAyB,GAAG,GAC3C,EACN,aAAI,SAAS,EAAC,wBAAwB,8BAAmB,EACzD,aAAG,SAAS,EAAC,oCAAoC,uCACxB,YAAY,uEAEjC,EACJ,iBACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,iLAAiL,8BAGpL,IACL,GACF,CACP,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED