@retinalabsllc/zairusjs 5.1.70 → 5.1.85
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/index.d.mts +4 -291
- package/dist/index.d.ts +4 -291
- package/dist/index.js +374 -2007
- package/dist/index.mjs +358 -2012
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -32,8 +32,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
32
32
|
var index_exports = {};
|
|
33
33
|
__export(index_exports, {
|
|
34
34
|
AppBento2: () => AppBento2,
|
|
35
|
-
Banner: () => Banner,
|
|
36
|
-
CardLogo: () => CardLogo,
|
|
37
35
|
ConsultantShowcase: () => ConsultantShowcase,
|
|
38
36
|
ContentGridBlock: () => ContentGridBlock,
|
|
39
37
|
Faq: () => Faq,
|
|
@@ -53,21 +51,11 @@ __export(index_exports, {
|
|
|
53
51
|
MedicalFeatureStatsBlock: () => MedicalFeatureStatsBlock,
|
|
54
52
|
NumberInput: () => NumberInput,
|
|
55
53
|
PageSpinner: () => PageSpinner,
|
|
56
|
-
PipleAuth: () => PipleAuth,
|
|
57
54
|
PlatformFeatures: () => PlatformFeatures,
|
|
58
55
|
PortfolioHero: () => PortfolioHero,
|
|
59
|
-
Stagger: () => Stagger,
|
|
60
56
|
TextInput: () => TextInput,
|
|
61
57
|
ThreeDActionButton: () => ThreeDActionButton,
|
|
62
|
-
ThreeDButton: () => ThreeDButton
|
|
63
|
-
UniversalErrorView: () => UniversalErrorView,
|
|
64
|
-
UniversalHomeView: () => UniversalHomeView,
|
|
65
|
-
UniversalOrganizationPage: () => UniversalOrganizationPage,
|
|
66
|
-
UniversalProfileSettings: () => UniversalProfileSettings,
|
|
67
|
-
UniversalSidebar: () => UniversalSidebar,
|
|
68
|
-
UniversalTransactionPage: () => UniversalTransactionPage,
|
|
69
|
-
UniversalWalletPage: () => UniversalWalletPage,
|
|
70
|
-
ZairusAuth: () => ZairusAuth
|
|
58
|
+
ThreeDButton: () => ThreeDButton
|
|
71
59
|
});
|
|
72
60
|
module.exports = __toCommonJS(index_exports);
|
|
73
61
|
|
|
@@ -92,6 +80,7 @@ var Faq = ({
|
|
|
92
80
|
}
|
|
93
81
|
},
|
|
94
82
|
{ threshold: 0.1 }
|
|
83
|
+
// Triggers when 10% of the title is visible
|
|
95
84
|
);
|
|
96
85
|
if (titleRef.current) {
|
|
97
86
|
observer.observe(titleRef.current);
|
|
@@ -101,11 +90,11 @@ var Faq = ({
|
|
|
101
90
|
const toggleFaq = (index) => {
|
|
102
91
|
setActiveFaq(activeFaq === index ? null : index);
|
|
103
92
|
};
|
|
104
|
-
return /* @__PURE__ */ import_react.default.createElement("div", { className: "py-24 w-full flex justify-center px-4 md:px-8 z-10 relative
|
|
93
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "py-24 w-full flex justify-center px-4 md:px-8 z-10 relative" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-10 max-w-4xl w-full" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col items-center w-full" }, title && /* @__PURE__ */ import_react.default.createElement(
|
|
105
94
|
"h2",
|
|
106
95
|
{
|
|
107
96
|
ref: titleRef,
|
|
108
|
-
className: `text-3xl
|
|
97
|
+
className: `text-3xl text-black tracking-tight leading-[1.15] ${isAnimating ? "" : ""}`,
|
|
109
98
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
110
99
|
},
|
|
111
100
|
"FAQ"
|
|
@@ -113,10 +102,10 @@ var Faq = ({
|
|
|
113
102
|
const isOpen = activeFaq === index;
|
|
114
103
|
const getShadowStyle = () => {
|
|
115
104
|
if (isOpen) return `
|
|
116
|
-
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.
|
|
117
|
-
inset 0 -3px 0 0 rgba(0, 0, 0, 0.
|
|
118
|
-
0 4px 0 0 #
|
|
119
|
-
0 12px 24px rgba(0, 0, 0, 0.
|
|
105
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.2),
|
|
106
|
+
inset 0 -3px 0 0 rgba(0, 0, 0, 0.3),
|
|
107
|
+
0 4px 0 0 #0c0c0c,
|
|
108
|
+
0 12px 24px rgba(0, 0, 0, 0.1)
|
|
120
109
|
`;
|
|
121
110
|
return "none";
|
|
122
111
|
};
|
|
@@ -124,7 +113,7 @@ var Faq = ({
|
|
|
124
113
|
"div",
|
|
125
114
|
{
|
|
126
115
|
key: index,
|
|
127
|
-
className: `relative transition-all duration-500 rounded-4xl overflow-hidden
|
|
116
|
+
className: `relative transition-all duration-500 rounded-4xl overflow-hidden ${isOpen ? "bg-black border-transparent" : "border border-neutral-200 hover:border-neutral-300"}`,
|
|
128
117
|
style: { boxShadow: getShadowStyle() }
|
|
129
118
|
},
|
|
130
119
|
isOpen && /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
|
|
@@ -143,19 +132,19 @@ var Faq = ({
|
|
|
143
132
|
/* @__PURE__ */ import_react.default.createElement(
|
|
144
133
|
"span",
|
|
145
134
|
{
|
|
146
|
-
className: `text-[15px] transition-colors duration-300 flex items-center gap-2 ${isOpen ? "text-white" : "text-
|
|
135
|
+
className: `text-[15px] transition-colors duration-300 flex items-center gap-2 ${isOpen ? "text-white" : "text-black"}`
|
|
147
136
|
},
|
|
148
|
-
/* @__PURE__ */ import_react.default.createElement("span", { className: "text-neutral-
|
|
137
|
+
/* @__PURE__ */ import_react.default.createElement("span", { className: isOpen ? "text-neutral-400" : "text-neutral-400" }, index + 1, "."),
|
|
149
138
|
faq.question
|
|
150
139
|
),
|
|
151
|
-
/* @__PURE__ */ import_react.default.createElement("div", { className: `shrink-0 transition-colors duration-300 ${isOpen ? "text-white" : "text-
|
|
140
|
+
/* @__PURE__ */ import_react.default.createElement("div", { className: `shrink-0 transition-colors duration-300 ${isOpen ? "text-white" : "text-black group-hover:text-black/70"}` }, isOpen ? /* @__PURE__ */ import_react.default.createElement("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M8 12h8", strokeLinecap: "round" })) : /* @__PURE__ */ import_react.default.createElement("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }, /* @__PURE__ */ import_react.default.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ import_react.default.createElement("path", { d: "M12 8v8M8 12h8", strokeLinecap: "round" })))
|
|
152
141
|
),
|
|
153
142
|
/* @__PURE__ */ import_react.default.createElement(
|
|
154
143
|
"div",
|
|
155
144
|
{
|
|
156
145
|
className: `relative z-20 grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"}`
|
|
157
146
|
},
|
|
158
|
-
/* @__PURE__ */ import_react.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react.default.createElement("p", { className: `text-[14px] leading-relaxed px-6 pb-6 pt-0 pr-12 transition-colors duration-300 ${isOpen ? "text-neutral-
|
|
147
|
+
/* @__PURE__ */ import_react.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react.default.createElement("p", { className: `text-[14px] leading-relaxed px-6 pb-6 pt-0 pr-12 transition-colors duration-300 ${isOpen ? "text-neutral-300" : "text-transparent"}` }, faq.answer))
|
|
159
148
|
)
|
|
160
149
|
);
|
|
161
150
|
}))));
|
|
@@ -170,23 +159,31 @@ var ThreeDButton = ({
|
|
|
170
159
|
className = "",
|
|
171
160
|
onClick
|
|
172
161
|
}) => {
|
|
173
|
-
const
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
162
|
+
const baseShadow = `
|
|
163
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.3),
|
|
164
|
+
inset 0 -2px 0 0 rgba(0, 0, 0, 0.5),
|
|
165
|
+
0 3px 0 0 #0c0c0c,
|
|
166
|
+
0 6px 10px rgba(0, 0, 0, 0.3)
|
|
167
|
+
`;
|
|
168
|
+
const hoverShadow = `
|
|
169
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.35),
|
|
170
|
+
inset 0 -2px 0 0 rgba(0, 0, 0, 0.5),
|
|
171
|
+
0 4px 0 0 #0c0c0c,
|
|
172
|
+
0 8px 12px rgba(0, 0, 0, 0.35)
|
|
173
|
+
`;
|
|
174
|
+
const activeShadow = `
|
|
175
|
+
inset 0 1px 0 0 rgba(255, 255, 255, 0.1),
|
|
176
|
+
inset 0 -1px 0 0 rgba(0, 0, 0, 0.5),
|
|
177
|
+
0 1px 0 0 #0c0c0c,
|
|
178
|
+
0 2px 4px rgba(0, 0, 0, 0.2)
|
|
179
|
+
`;
|
|
177
180
|
return /* @__PURE__ */ import_react2.default.createElement(
|
|
178
181
|
import_link.default,
|
|
179
182
|
{
|
|
180
183
|
href,
|
|
181
184
|
onClick,
|
|
182
|
-
className: `relative inline-flex items-center justify-center py-2.5 px-8 rounded-full
|
|
183
|
-
style: {
|
|
184
|
-
backgroundImage: silverBg,
|
|
185
|
-
backgroundSize: "cover",
|
|
186
|
-
backgroundPosition: "center right",
|
|
187
|
-
boxShadow: baseShadow,
|
|
188
|
-
textShadow: "0 1px 1px rgba(255,255,255,0.6)"
|
|
189
|
-
},
|
|
185
|
+
className: `relative inline-flex items-center justify-center py-2.5 px-8 rounded-full bg-neutral-950 text-white text-xs transition-all duration-150 select-none group ${className}`,
|
|
186
|
+
style: { boxShadow: baseShadow },
|
|
190
187
|
onMouseEnter: (e) => {
|
|
191
188
|
e.currentTarget.style.boxShadow = hoverShadow;
|
|
192
189
|
e.currentTarget.style.transform = "translateY(-1px)";
|
|
@@ -203,8 +200,8 @@ var ThreeDButton = ({
|
|
|
203
200
|
e.currentTarget.style.transform = "translateY(-1px)";
|
|
204
201
|
}
|
|
205
202
|
},
|
|
206
|
-
/* @__PURE__ */ import_react2.default.createElement("span", { className: "absolute inset-0 bg-linear-to-
|
|
207
|
-
/* @__PURE__ */ import_react2.default.createElement("span", { className: "relative z-10 pt-1 tracking-wide text-
|
|
203
|
+
/* @__PURE__ */ import_react2.default.createElement("span", { className: "absolute inset-0 rounded-full bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none" }),
|
|
204
|
+
/* @__PURE__ */ import_react2.default.createElement("span", { className: "relative z-10 pt-1 tracking-wide text-white/95 group-hover:text-white transition-colors duration-150 flex items-center justify-center leading-none" }, children)
|
|
208
205
|
);
|
|
209
206
|
};
|
|
210
207
|
|
|
@@ -222,11 +219,29 @@ var ThreeDActionButton = ({
|
|
|
222
219
|
ariaLabel
|
|
223
220
|
}) => {
|
|
224
221
|
const isInteractionDisabled = disabled || isLoading;
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
222
|
+
const baseShadow = `
|
|
223
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.3),
|
|
224
|
+
inset 0 -2px 0 0 rgba(0, 0, 0, 0.5),
|
|
225
|
+
0 3px 0 0 #0c0c0c,
|
|
226
|
+
0 6px 10px rgba(0, 0, 0, 0.3)
|
|
227
|
+
`;
|
|
228
|
+
const hoverShadow = `
|
|
229
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.35),
|
|
230
|
+
inset 0 -2px 0 0 rgba(0, 0, 0, 0.5),
|
|
231
|
+
0 4px 0 0 #0c0c0c,
|
|
232
|
+
0 8px 12px rgba(0, 0, 0, 0.35)
|
|
233
|
+
`;
|
|
234
|
+
const activeShadow = `
|
|
235
|
+
inset 0 1px 0 0 rgba(255, 255, 255, 0.1),
|
|
236
|
+
inset 0 -1px 0 0 rgba(0, 0, 0, 0.5),
|
|
237
|
+
0 1px 0 0 #0c0c0c,
|
|
238
|
+
0 2px 4px rgba(0, 0, 0, 0.2)
|
|
239
|
+
`;
|
|
240
|
+
const disabledShadow = `
|
|
241
|
+
inset 0 1px 0 0 rgba(255, 255, 255, 0.15),
|
|
242
|
+
inset 0 -1px 0 0 rgba(0, 0, 0, 0.3),
|
|
243
|
+
0 1px 0 0 #1c1c1c
|
|
244
|
+
`;
|
|
230
245
|
return /* @__PURE__ */ import_react3.default.createElement(
|
|
231
246
|
"button",
|
|
232
247
|
{
|
|
@@ -236,18 +251,12 @@ var ThreeDActionButton = ({
|
|
|
236
251
|
"aria-label": ariaLabel,
|
|
237
252
|
className: `
|
|
238
253
|
relative inline-flex items-center justify-center py-2.5 px-8 rounded-full
|
|
239
|
-
|
|
240
|
-
transition-all duration-150 select-none group outline-none
|
|
241
|
-
${isInteractionDisabled ? "opacity-
|
|
254
|
+
bg-neutral-950 text-white text-xs tracking-widest
|
|
255
|
+
transition-all duration-150 select-none group outline-none
|
|
256
|
+
${isInteractionDisabled ? "opacity-50 cursor-not-allowed" : "active:translate-y-0.5"}
|
|
242
257
|
${className}
|
|
243
258
|
`,
|
|
244
|
-
style: {
|
|
245
|
-
backgroundImage: silverBg,
|
|
246
|
-
backgroundSize: "cover",
|
|
247
|
-
backgroundPosition: "center right",
|
|
248
|
-
boxShadow: isInteractionDisabled ? disabledShadow : baseShadow,
|
|
249
|
-
textShadow: "0 1px 1px rgba(255,255,255,0.6)"
|
|
250
|
-
},
|
|
259
|
+
style: { boxShadow: isInteractionDisabled ? disabledShadow : baseShadow },
|
|
251
260
|
onMouseEnter: (e) => {
|
|
252
261
|
if (isInteractionDisabled) return;
|
|
253
262
|
e.currentTarget.style.boxShadow = hoverShadow;
|
|
@@ -268,536 +277,27 @@ var ThreeDActionButton = ({
|
|
|
268
277
|
e.currentTarget.style.transform = "translateY(-1px)";
|
|
269
278
|
}
|
|
270
279
|
},
|
|
271
|
-
/* @__PURE__ */ import_react3.default.createElement("span", { className: "absolute inset-0 bg-linear-to-
|
|
272
|
-
/* @__PURE__ */ import_react3.default.createElement("span", { className: "relative z-10 flex items-center justify-center gap-2 leading-none
|
|
280
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "absolute inset-0 rounded-full bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none" }),
|
|
281
|
+
/* @__PURE__ */ import_react3.default.createElement("span", { className: "relative z-10 flex items-center justify-center gap-2 leading-none" }, isLoading ? /* @__PURE__ */ import_react3.default.createElement(import_react4.HugeiconsIcon, { icon: import_core_free_icons.Loading03Icon, size: 16, className: "animate-spin text-white" }) : children)
|
|
273
282
|
);
|
|
274
283
|
};
|
|
275
284
|
|
|
276
|
-
// src/components/ZairusAuth.tsx
|
|
277
|
-
var import_react5 = __toESM(require("react"));
|
|
278
|
-
var import_navigation = require("next/navigation");
|
|
279
|
-
var import_react_hot_toast = __toESM(require("react-hot-toast"));
|
|
280
|
-
var import_react_google_recaptcha_v3 = require("react-google-recaptcha-v3");
|
|
281
|
-
var InputSpinner = () => /* @__PURE__ */ import_react5.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-500", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react5.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react5.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
282
|
-
function AuthFormInner({
|
|
283
|
-
companyName,
|
|
284
|
-
workspaceLabel = "Workspace",
|
|
285
|
-
termsUrl = "https://retinalabs.company/terms-of-service",
|
|
286
|
-
privacyUrl = "https://retinalabs.company/privacy-policy",
|
|
287
|
-
requireNames = true,
|
|
288
|
-
requireOrganization = true,
|
|
289
|
-
useRecaptcha = false,
|
|
290
|
-
defaultRedirectPath = "/app",
|
|
291
|
-
onAuthRequest,
|
|
292
|
-
onVerifyOtp
|
|
293
|
-
}) {
|
|
294
|
-
const searchParams = (0, import_navigation.useSearchParams)();
|
|
295
|
-
const redirectUrl = searchParams.get("redirect") || defaultRedirectPath;
|
|
296
|
-
const captchaContext = useRecaptcha ? (0, import_react_google_recaptcha_v3.useGoogleReCaptcha)() : null;
|
|
297
|
-
const [mode, setMode] = (0, import_react5.useState)("LOGIN");
|
|
298
|
-
const [step, setStep] = (0, import_react5.useState)("INPUT");
|
|
299
|
-
const getInitialSignupStep = () => {
|
|
300
|
-
if (requireNames) return "NAME";
|
|
301
|
-
if (requireOrganization) return "ORGANIZATION";
|
|
302
|
-
return "EMAIL_ID";
|
|
303
|
-
};
|
|
304
|
-
const [signupStep, setSignupStep] = (0, import_react5.useState)(getInitialSignupStep());
|
|
305
|
-
const [isSubmitting, setIsSubmitting] = (0, import_react5.useState)(false);
|
|
306
|
-
const [countdown, setCountdown] = (0, import_react5.useState)(0);
|
|
307
|
-
const [emailId, setEmailId] = (0, import_react5.useState)("");
|
|
308
|
-
const [firstName, setFirstName] = (0, import_react5.useState)("");
|
|
309
|
-
const [lastName, setLastName] = (0, import_react5.useState)("");
|
|
310
|
-
const [orgName, setOrgName] = (0, import_react5.useState)("");
|
|
311
|
-
const [agreedToTerms, setAgreedToTerms] = (0, import_react5.useState)(false);
|
|
312
|
-
const [otp, setOtp] = (0, import_react5.useState)(["", "", "", "", "", ""]);
|
|
313
|
-
const inputRefs = (0, import_react5.useRef)([]);
|
|
314
|
-
const cleanAlpha = (val) => val.replace(/[^a-zA-Z\s-]/g, "");
|
|
315
|
-
const cleanOrgName = (val) => val.replace(/[^a-zA-Z0-9\s]/g, "").substring(0, 50);
|
|
316
|
-
const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
|
|
317
|
-
(0, import_react5.useEffect)(() => {
|
|
318
|
-
if (countdown > 0) {
|
|
319
|
-
const timer = setTimeout(() => setCountdown(countdown - 1), 1e3);
|
|
320
|
-
return () => clearTimeout(timer);
|
|
321
|
-
}
|
|
322
|
-
}, [countdown]);
|
|
323
|
-
const handleOtpChange = (index, value) => {
|
|
324
|
-
const cleanValue = value.replace(/[^0-9]/g, "");
|
|
325
|
-
if (!cleanValue && value !== "") return;
|
|
326
|
-
const newOtp = [...otp];
|
|
327
|
-
newOtp[index] = cleanValue.slice(-1);
|
|
328
|
-
setOtp(newOtp);
|
|
329
|
-
if (cleanValue && index < 5) {
|
|
330
|
-
inputRefs.current[index + 1]?.focus();
|
|
331
|
-
}
|
|
332
|
-
};
|
|
333
|
-
const handlePaste = (e) => {
|
|
334
|
-
e.preventDefault();
|
|
335
|
-
const pastedData = e.clipboardData.getData("text/plain");
|
|
336
|
-
const numbersOnly = pastedData.replace(/[^0-9]/g, "");
|
|
337
|
-
if (!numbersOnly) return;
|
|
338
|
-
const newOtp = [...otp];
|
|
339
|
-
const length = Math.min(numbersOnly.length, 6);
|
|
340
|
-
for (let i = 0; i < length; i++) {
|
|
341
|
-
newOtp[i] = numbersOnly[i];
|
|
342
|
-
}
|
|
343
|
-
setOtp(newOtp);
|
|
344
|
-
if (length < 6) {
|
|
345
|
-
inputRefs.current[length]?.focus();
|
|
346
|
-
} else {
|
|
347
|
-
inputRefs.current[5]?.focus();
|
|
348
|
-
verifyOtpCode(newOtp.join(""));
|
|
349
|
-
}
|
|
350
|
-
};
|
|
351
|
-
const handleAuthRequestSubmit = async (e) => {
|
|
352
|
-
if (e) e.preventDefault();
|
|
353
|
-
if (mode === "SIGNUP" && !agreedToTerms) {
|
|
354
|
-
import_react_hot_toast.default.error("You must agree to the Terms and Privacy Policy.");
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
if (isSubmitting || countdown > 0) return;
|
|
358
|
-
setIsSubmitting(true);
|
|
359
|
-
try {
|
|
360
|
-
let recaptchaToken = void 0;
|
|
361
|
-
if (useRecaptcha && captchaContext?.executeRecaptcha) {
|
|
362
|
-
recaptchaToken = await captchaContext.executeRecaptcha("auth_request");
|
|
363
|
-
}
|
|
364
|
-
const res = await onAuthRequest({
|
|
365
|
-
email: emailId,
|
|
366
|
-
firstName: mode === "SIGNUP" && requireNames ? firstName : void 0,
|
|
367
|
-
lastName: mode === "SIGNUP" && requireNames ? lastName : void 0,
|
|
368
|
-
organizationName: mode === "SIGNUP" && requireOrganization ? orgName : void 0,
|
|
369
|
-
mode,
|
|
370
|
-
recaptchaToken
|
|
371
|
-
});
|
|
372
|
-
if (res.success) {
|
|
373
|
-
import_react_hot_toast.default.success("Verification code sent");
|
|
374
|
-
setStep("OTP");
|
|
375
|
-
setCountdown(60);
|
|
376
|
-
} else {
|
|
377
|
-
import_react_hot_toast.default.error(res.error || "Authentication failed.");
|
|
378
|
-
}
|
|
379
|
-
} catch {
|
|
380
|
-
import_react_hot_toast.default.error("Service unavailable. Try again later.");
|
|
381
|
-
} finally {
|
|
382
|
-
setIsSubmitting(false);
|
|
383
|
-
}
|
|
384
|
-
};
|
|
385
|
-
const verifyOtpCode = async (codeToVerify) => {
|
|
386
|
-
if (codeToVerify.length !== 6 || isSubmitting) return;
|
|
387
|
-
setIsSubmitting(true);
|
|
388
|
-
try {
|
|
389
|
-
const res = await onVerifyOtp({ email: emailId, code: codeToVerify });
|
|
390
|
-
if (res.success) {
|
|
391
|
-
window.location.href = res.redirect || redirectUrl;
|
|
392
|
-
} else {
|
|
393
|
-
import_react_hot_toast.default.error(res.error || "Invalid code.");
|
|
394
|
-
setOtp(["", "", "", "", "", ""]);
|
|
395
|
-
inputRefs.current[0]?.focus();
|
|
396
|
-
}
|
|
397
|
-
} catch {
|
|
398
|
-
import_react_hot_toast.default.error("Verification failed.");
|
|
399
|
-
} finally {
|
|
400
|
-
setIsSubmitting(false);
|
|
401
|
-
}
|
|
402
|
-
};
|
|
403
|
-
const handleNextSignupStep = () => {
|
|
404
|
-
if (signupStep === "NAME") {
|
|
405
|
-
if (requireOrganization) setSignupStep("ORGANIZATION");
|
|
406
|
-
else setSignupStep("EMAIL_ID");
|
|
407
|
-
} else if (signupStep === "ORGANIZATION") {
|
|
408
|
-
setSignupStep("EMAIL_ID");
|
|
409
|
-
}
|
|
410
|
-
};
|
|
411
|
-
const isContinueDisabled = () => {
|
|
412
|
-
if (isSubmitting) return true;
|
|
413
|
-
if (mode === "LOGIN") return emailId.length < 3;
|
|
414
|
-
if (mode === "SIGNUP") {
|
|
415
|
-
if (signupStep === "NAME") return firstName.trim() === "" || lastName.trim() === "";
|
|
416
|
-
if (signupStep === "ORGANIZATION") return orgName.trim().length < 3;
|
|
417
|
-
if (signupStep === "EMAIL_ID") return emailId.length < 3 || !agreedToTerms;
|
|
418
|
-
}
|
|
419
|
-
return false;
|
|
420
|
-
};
|
|
421
|
-
return /* @__PURE__ */ import_react5.default.createElement("div", { className: "w-full max-w-md mx-auto flex flex-col items-center gap-4 relative z-10 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "w-full bg-neutral-900 border border-neutral-800 rounded-2xl overflow-hidden shadow-2xl" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "p-8 md:p-12" }, step === "INPUT" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mb-12 text-center mt-2" }, /* @__PURE__ */ import_react5.default.createElement("h2", { className: "text-xl text-white mb-2 tracking-tight " }, mode === "LOGIN" ? `${companyName} ${workspaceLabel}` : "Create Account"), /* @__PURE__ */ import_react5.default.createElement("div", { className: "text-[13px] text-neutral-400" }, mode === "LOGIN" ? /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, "Don't have an account? ", /* @__PURE__ */ import_react5.default.createElement("button", { type: "button", onClick: () => {
|
|
422
|
-
setMode("SIGNUP");
|
|
423
|
-
setSignupStep(getInitialSignupStep());
|
|
424
|
-
}, className: "text-white hover:text-neutral-300 transition-colors ml-1 " }, "Sign up")) : /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, "Already have an account? ", /* @__PURE__ */ import_react5.default.createElement("button", { type: "button", onClick: () => setMode("LOGIN"), className: "text-white hover:text-neutral-300 transition-colors ml-1 " }, "Log in")))), /* @__PURE__ */ import_react5.default.createElement("form", { className: "space-y-6", autoComplete: "off", onSubmit: (e) => {
|
|
425
|
-
e.preventDefault();
|
|
426
|
-
if (mode === "SIGNUP" && signupStep === "NAME") handleNextSignupStep();
|
|
427
|
-
else if (mode === "SIGNUP" && signupStep === "ORGANIZATION") handleNextSignupStep();
|
|
428
|
-
else handleAuthRequestSubmit();
|
|
429
|
-
} }, mode === "SIGNUP" && signupStep === "NAME" && requireNames && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react5.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "First Name"), /* @__PURE__ */ import_react5.default.createElement(
|
|
430
|
-
"input",
|
|
431
|
-
{
|
|
432
|
-
type: "text",
|
|
433
|
-
value: firstName,
|
|
434
|
-
onChange: (e) => setFirstName(cleanAlpha(e.target.value)),
|
|
435
|
-
required: true,
|
|
436
|
-
autoFocus: true,
|
|
437
|
-
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
438
|
-
placeholder: "First name"
|
|
439
|
-
}
|
|
440
|
-
)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react5.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Last Name"), /* @__PURE__ */ import_react5.default.createElement(
|
|
441
|
-
"input",
|
|
442
|
-
{
|
|
443
|
-
type: "text",
|
|
444
|
-
value: lastName,
|
|
445
|
-
onChange: (e) => setLastName(cleanAlpha(e.target.value)),
|
|
446
|
-
required: true,
|
|
447
|
-
className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
448
|
-
placeholder: "Last name"
|
|
449
|
-
}
|
|
450
|
-
))), mode === "SIGNUP" && signupStep === "ORGANIZATION" && requireOrganization && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react5.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Organization Name"), /* @__PURE__ */ import_react5.default.createElement(
|
|
451
|
-
"input",
|
|
452
|
-
{
|
|
453
|
-
type: "text",
|
|
454
|
-
value: orgName,
|
|
455
|
-
onChange: (e) => setOrgName(cleanOrgName(e.target.value)),
|
|
456
|
-
required: true,
|
|
457
|
-
autoFocus: true,
|
|
458
|
-
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
459
|
-
placeholder: "Acme Corporation"
|
|
460
|
-
}
|
|
461
|
-
))), (mode === "LOGIN" || mode === "SIGNUP" && signupStep === "EMAIL_ID") && /* @__PURE__ */ import_react5.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react5.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Retina ID"), /* @__PURE__ */ import_react5.default.createElement(
|
|
462
|
-
"input",
|
|
463
|
-
{
|
|
464
|
-
type: "email",
|
|
465
|
-
value: emailId,
|
|
466
|
-
onChange: (e) => setEmailId(cleanEmailId(e.target.value)),
|
|
467
|
-
required: true,
|
|
468
|
-
autoFocus: true,
|
|
469
|
-
className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
470
|
-
placeholder: "name@company.com"
|
|
471
|
-
}
|
|
472
|
-
)), mode === "SIGNUP" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex items-start gap-3 mt-4" }, /* @__PURE__ */ import_react5.default.createElement(
|
|
473
|
-
"input",
|
|
474
|
-
{
|
|
475
|
-
type: "checkbox",
|
|
476
|
-
id: "zairus-terms",
|
|
477
|
-
checked: agreedToTerms,
|
|
478
|
-
onChange: (e) => setAgreedToTerms(e.target.checked),
|
|
479
|
-
className: "mt-0.5 w-4 h-4 bg-neutral-800 border-neutral-700 rounded text-white focus:ring-white cursor-pointer",
|
|
480
|
-
required: true
|
|
481
|
-
}
|
|
482
|
-
), /* @__PURE__ */ import_react5.default.createElement("label", { htmlFor: "zairus-terms", className: "text-[11px] text-neutral-400 cursor-pointer leading-snug" }, "I agree to ", companyName, "'s ", /* @__PURE__ */ import_react5.default.createElement("a", { href: termsUrl, target: "_blank", rel: "noreferrer", className: "text-white hover:text-neutral-300 " }, "Terms of Service"), " and ", /* @__PURE__ */ import_react5.default.createElement("a", { href: privacyUrl, target: "_blank", rel: "noreferrer", className: "text-white hover:text-neutral-300 " }, "Privacy Policy"), "."))), /* @__PURE__ */ import_react5.default.createElement(
|
|
483
|
-
ThreeDActionButton,
|
|
484
|
-
{
|
|
485
|
-
type: "submit",
|
|
486
|
-
disabled: isContinueDisabled(),
|
|
487
|
-
isLoading: isSubmitting,
|
|
488
|
-
className: "w-full mt-10"
|
|
489
|
-
},
|
|
490
|
-
"Continue"
|
|
491
|
-
))), step === "OTP" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "text-center mb-10 mt-2" }, /* @__PURE__ */ import_react5.default.createElement("h2", { className: "text-xl text-white mb-2 tracking-tight" }, "Security Check"), /* @__PURE__ */ import_react5.default.createElement("p", { className: "text-[13px] text-neutral-400" }, "Enter the code sent to ", /* @__PURE__ */ import_react5.default.createElement("br", null), /* @__PURE__ */ import_react5.default.createElement("span", { className: "text-white" }, emailId))), /* @__PURE__ */ import_react5.default.createElement("form", { className: "space-y-10", autoComplete: "off", onSubmit: (e) => {
|
|
492
|
-
e.preventDefault();
|
|
493
|
-
verifyOtpCode(otp.join(""));
|
|
494
|
-
} }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex justify-between gap-2", onPaste: handlePaste }, otp.map((digit, index) => /* @__PURE__ */ import_react5.default.createElement(
|
|
495
|
-
"input",
|
|
496
|
-
{
|
|
497
|
-
key: index,
|
|
498
|
-
ref: (el) => {
|
|
499
|
-
inputRefs.current[index] = el;
|
|
500
|
-
},
|
|
501
|
-
type: "text",
|
|
502
|
-
inputMode: "numeric",
|
|
503
|
-
maxLength: 1,
|
|
504
|
-
value: digit,
|
|
505
|
-
onChange: (e) => handleOtpChange(index, e.target.value),
|
|
506
|
-
className: "w-8 h-8 text-center text-lg bg-transparent border-b-2 border-neutral-800 text-white outline-none focus:border-white transition-all duration-300"
|
|
507
|
-
}
|
|
508
|
-
))), /* @__PURE__ */ import_react5.default.createElement(
|
|
509
|
-
ThreeDActionButton,
|
|
510
|
-
{
|
|
511
|
-
type: "submit",
|
|
512
|
-
disabled: otp.join("").length < 6,
|
|
513
|
-
isLoading: isSubmitting,
|
|
514
|
-
className: "w-full"
|
|
515
|
-
},
|
|
516
|
-
"Verify Code"
|
|
517
|
-
))))), /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col items-center gap-1.5 animate-in slide-in-from-bottom-3 duration-500 delay-100 mt-4" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex items-center gap-2.5 px-3 py-1.5 bg-neutral-900 border border-neutral-800 rounded-full" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "w-5 h-5 bg-neutral-800 rounded-full flex items-center justify-center shrink-0 overflow-hidden relative" }, /* @__PURE__ */ import_react5.default.createElement(
|
|
518
|
-
"img",
|
|
519
|
-
{
|
|
520
|
-
src: "https://retinalabs.company/assets/images/retina.avif",
|
|
521
|
-
alt: "Retina Labs Logo",
|
|
522
|
-
className: "w-full h-full object-cover rounded-full",
|
|
523
|
-
onError: (e) => {
|
|
524
|
-
e.currentTarget.style.display = "none";
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
)), /* @__PURE__ */ import_react5.default.createElement("span", { className: "text-[11px] text-neutral-300 tracking-tight pr-1" }, "Retina Labs Company")), /* @__PURE__ */ import_react5.default.createElement("span", { className: "text-[8px] text-neutral-500 tracking-[0.25em]" }, "RC - 9235780")));
|
|
528
|
-
}
|
|
529
|
-
var ZairusAuth = (props) => {
|
|
530
|
-
if (props.useRecaptcha && props.recaptchaSiteKey) {
|
|
531
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_react_google_recaptcha_v3.GoogleReCaptchaProvider, { reCaptchaKey: props.recaptchaSiteKey }, /* @__PURE__ */ import_react5.default.createElement(import_react5.Suspense, { fallback: /* @__PURE__ */ import_react5.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react5.default.createElement(InputSpinner, null)) }, /* @__PURE__ */ import_react5.default.createElement(AuthFormInner, { ...props })));
|
|
532
|
-
}
|
|
533
|
-
return /* @__PURE__ */ import_react5.default.createElement(import_react5.Suspense, { fallback: /* @__PURE__ */ import_react5.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react5.default.createElement(InputSpinner, null)) }, /* @__PURE__ */ import_react5.default.createElement(AuthFormInner, { ...props }));
|
|
534
|
-
};
|
|
535
|
-
|
|
536
|
-
// src/components/PipleAuth.tsx
|
|
537
|
-
var import_react6 = __toESM(require("react"));
|
|
538
|
-
var import_navigation2 = require("next/navigation");
|
|
539
|
-
var import_react_hot_toast2 = __toESM(require("react-hot-toast"));
|
|
540
|
-
var import_react_google_recaptcha_v32 = require("react-google-recaptcha-v3");
|
|
541
|
-
var InputSpinner2 = () => /* @__PURE__ */ import_react6.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-500", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react6.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react6.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
542
|
-
function AuthFormInner2({
|
|
543
|
-
companyName,
|
|
544
|
-
workspaceLabel = "Workspace",
|
|
545
|
-
termsUrl = "https://aeona.finance/terms-of-service",
|
|
546
|
-
privacyUrl = "https://aeona.finance/privacy-policy",
|
|
547
|
-
requireNames = true,
|
|
548
|
-
requireOrganization = true,
|
|
549
|
-
useRecaptcha = false,
|
|
550
|
-
defaultRedirectPath = "/app",
|
|
551
|
-
onAuthRequest,
|
|
552
|
-
onVerifyOtp
|
|
553
|
-
}) {
|
|
554
|
-
const searchParams = (0, import_navigation2.useSearchParams)();
|
|
555
|
-
const redirectUrl = searchParams.get("redirect") || defaultRedirectPath;
|
|
556
|
-
const captchaContext = useRecaptcha ? (0, import_react_google_recaptcha_v32.useGoogleReCaptcha)() : null;
|
|
557
|
-
const [mode, setMode] = (0, import_react6.useState)("LOGIN");
|
|
558
|
-
const [step, setStep] = (0, import_react6.useState)("INPUT");
|
|
559
|
-
const getInitialSignupStep = () => {
|
|
560
|
-
if (requireNames) return "NAME";
|
|
561
|
-
if (requireOrganization) return "ORGANIZATION";
|
|
562
|
-
return "EMAIL_ID";
|
|
563
|
-
};
|
|
564
|
-
const [signupStep, setSignupStep] = (0, import_react6.useState)(getInitialSignupStep());
|
|
565
|
-
const [isSubmitting, setIsSubmitting] = (0, import_react6.useState)(false);
|
|
566
|
-
const [countdown, setCountdown] = (0, import_react6.useState)(0);
|
|
567
|
-
const [emailId, setEmailId] = (0, import_react6.useState)("");
|
|
568
|
-
const [firstName, setFirstName] = (0, import_react6.useState)("");
|
|
569
|
-
const [lastName, setLastName] = (0, import_react6.useState)("");
|
|
570
|
-
const [orgName, setOrgName] = (0, import_react6.useState)("");
|
|
571
|
-
const [agreedToTerms, setAgreedToTerms] = (0, import_react6.useState)(false);
|
|
572
|
-
const [otp, setOtp] = (0, import_react6.useState)(["", "", "", "", "", ""]);
|
|
573
|
-
const inputRefs = (0, import_react6.useRef)([]);
|
|
574
|
-
const cleanAlpha = (val) => val.replace(/[^a-zA-Z\s-]/g, "");
|
|
575
|
-
const cleanOrgName = (val) => val.replace(/[^a-zA-Z0-9\s]/g, "").substring(0, 50);
|
|
576
|
-
const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
|
|
577
|
-
(0, import_react6.useEffect)(() => {
|
|
578
|
-
if (countdown > 0) {
|
|
579
|
-
const timer = setTimeout(() => setCountdown(countdown - 1), 1e3);
|
|
580
|
-
return () => clearTimeout(timer);
|
|
581
|
-
}
|
|
582
|
-
}, [countdown]);
|
|
583
|
-
const handleOtpChange = (index, value) => {
|
|
584
|
-
const cleanValue = value.replace(/[^0-9]/g, "");
|
|
585
|
-
if (!cleanValue && value !== "") return;
|
|
586
|
-
const newOtp = [...otp];
|
|
587
|
-
newOtp[index] = cleanValue.slice(-1);
|
|
588
|
-
setOtp(newOtp);
|
|
589
|
-
if (cleanValue && index < 5) {
|
|
590
|
-
inputRefs.current[index + 1]?.focus();
|
|
591
|
-
}
|
|
592
|
-
};
|
|
593
|
-
const handlePaste = (e) => {
|
|
594
|
-
e.preventDefault();
|
|
595
|
-
const pastedData = e.clipboardData.getData("text/plain");
|
|
596
|
-
const numbersOnly = pastedData.replace(/[^0-9]/g, "");
|
|
597
|
-
if (!numbersOnly) return;
|
|
598
|
-
const newOtp = [...otp];
|
|
599
|
-
const length = Math.min(numbersOnly.length, 6);
|
|
600
|
-
for (let i = 0; i < length; i++) {
|
|
601
|
-
newOtp[i] = numbersOnly[i];
|
|
602
|
-
}
|
|
603
|
-
setOtp(newOtp);
|
|
604
|
-
if (length < 6) {
|
|
605
|
-
inputRefs.current[length]?.focus();
|
|
606
|
-
} else {
|
|
607
|
-
inputRefs.current[5]?.focus();
|
|
608
|
-
verifyOtpCode(newOtp.join(""));
|
|
609
|
-
}
|
|
610
|
-
};
|
|
611
|
-
const handleAuthRequestSubmit = async (e) => {
|
|
612
|
-
if (e) e.preventDefault();
|
|
613
|
-
if (mode === "SIGNUP" && !agreedToTerms) {
|
|
614
|
-
import_react_hot_toast2.default.error("You must agree to the Terms and Privacy Policy.");
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
if (isSubmitting || countdown > 0) return;
|
|
618
|
-
setIsSubmitting(true);
|
|
619
|
-
try {
|
|
620
|
-
let recaptchaToken = void 0;
|
|
621
|
-
if (useRecaptcha && captchaContext?.executeRecaptcha) {
|
|
622
|
-
recaptchaToken = await captchaContext.executeRecaptcha("auth_request");
|
|
623
|
-
}
|
|
624
|
-
const res = await onAuthRequest({
|
|
625
|
-
email: emailId,
|
|
626
|
-
firstName: mode === "SIGNUP" && requireNames ? firstName : void 0,
|
|
627
|
-
lastName: mode === "SIGNUP" && requireNames ? lastName : void 0,
|
|
628
|
-
organizationName: mode === "SIGNUP" && requireOrganization ? orgName : void 0,
|
|
629
|
-
mode,
|
|
630
|
-
recaptchaToken
|
|
631
|
-
});
|
|
632
|
-
if (res.success) {
|
|
633
|
-
import_react_hot_toast2.default.success("Verification code sent");
|
|
634
|
-
setStep("OTP");
|
|
635
|
-
setCountdown(60);
|
|
636
|
-
} else {
|
|
637
|
-
import_react_hot_toast2.default.error(res.error || "Authentication failed.");
|
|
638
|
-
}
|
|
639
|
-
} catch {
|
|
640
|
-
import_react_hot_toast2.default.error("Service unavailable. Try again later.");
|
|
641
|
-
} finally {
|
|
642
|
-
setIsSubmitting(false);
|
|
643
|
-
}
|
|
644
|
-
};
|
|
645
|
-
const verifyOtpCode = async (codeToVerify) => {
|
|
646
|
-
if (codeToVerify.length !== 6 || isSubmitting) return;
|
|
647
|
-
setIsSubmitting(true);
|
|
648
|
-
try {
|
|
649
|
-
const res = await onVerifyOtp({ email: emailId, code: codeToVerify });
|
|
650
|
-
if (res.success) {
|
|
651
|
-
window.location.href = res.redirect || redirectUrl;
|
|
652
|
-
} else {
|
|
653
|
-
import_react_hot_toast2.default.error(res.error || "Invalid code.");
|
|
654
|
-
setOtp(["", "", "", "", "", ""]);
|
|
655
|
-
inputRefs.current[0]?.focus();
|
|
656
|
-
}
|
|
657
|
-
} catch {
|
|
658
|
-
import_react_hot_toast2.default.error("Verification failed.");
|
|
659
|
-
} finally {
|
|
660
|
-
setIsSubmitting(false);
|
|
661
|
-
}
|
|
662
|
-
};
|
|
663
|
-
const handleNextSignupStep = () => {
|
|
664
|
-
if (signupStep === "NAME") {
|
|
665
|
-
if (requireOrganization) setSignupStep("ORGANIZATION");
|
|
666
|
-
else setSignupStep("EMAIL_ID");
|
|
667
|
-
} else if (signupStep === "ORGANIZATION") {
|
|
668
|
-
setSignupStep("EMAIL_ID");
|
|
669
|
-
}
|
|
670
|
-
};
|
|
671
|
-
const isContinueDisabled = () => {
|
|
672
|
-
if (isSubmitting) return true;
|
|
673
|
-
if (mode === "LOGIN") return emailId.length < 3;
|
|
674
|
-
if (mode === "SIGNUP") {
|
|
675
|
-
if (signupStep === "NAME") return firstName.trim() === "" || lastName.trim() === "";
|
|
676
|
-
if (signupStep === "ORGANIZATION") return orgName.trim().length < 3;
|
|
677
|
-
if (signupStep === "EMAIL_ID") return emailId.length < 3 || !agreedToTerms;
|
|
678
|
-
}
|
|
679
|
-
return false;
|
|
680
|
-
};
|
|
681
|
-
return /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full max-w-md mx-auto flex flex-col items-center gap-4 relative z-10 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full bg-neutral-900 rounded-2xl overflow-hidden shadow-2xl" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "p-8 md:p-12" }, step === "INPUT" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "mb-12 text-center mt-2" }, /* @__PURE__ */ import_react6.default.createElement("h2", { className: "text-xl text-white mb-2 tracking-tight " }, mode === "LOGIN" ? `${companyName} ${workspaceLabel}` : "Create Account"), /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-[13px] text-neutral-400" }, mode === "LOGIN" ? /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, "Don't have an account? ", /* @__PURE__ */ import_react6.default.createElement("button", { type: "button", onClick: () => {
|
|
682
|
-
setMode("SIGNUP");
|
|
683
|
-
setSignupStep(getInitialSignupStep());
|
|
684
|
-
}, className: "text-white hover:text-neutral-300 transition-colors ml-1 " }, "Sign up")) : /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, "Already have an account? ", /* @__PURE__ */ import_react6.default.createElement("button", { type: "button", onClick: () => setMode("LOGIN"), className: "text-white hover:text-neutral-300 transition-colors ml-1 " }, "Log in")))), /* @__PURE__ */ import_react6.default.createElement("form", { className: "space-y-6", autoComplete: "off", onSubmit: (e) => {
|
|
685
|
-
e.preventDefault();
|
|
686
|
-
if (mode === "SIGNUP" && signupStep === "NAME") handleNextSignupStep();
|
|
687
|
-
else if (mode === "SIGNUP" && signupStep === "ORGANIZATION") handleNextSignupStep();
|
|
688
|
-
else handleAuthRequestSubmit();
|
|
689
|
-
} }, mode === "SIGNUP" && signupStep === "NAME" && requireNames && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "First Name"), /* @__PURE__ */ import_react6.default.createElement(
|
|
690
|
-
"input",
|
|
691
|
-
{
|
|
692
|
-
type: "text",
|
|
693
|
-
value: firstName,
|
|
694
|
-
onChange: (e) => setFirstName(cleanAlpha(e.target.value)),
|
|
695
|
-
required: true,
|
|
696
|
-
autoFocus: true,
|
|
697
|
-
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
698
|
-
placeholder: "First name"
|
|
699
|
-
}
|
|
700
|
-
)), /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Last Name"), /* @__PURE__ */ import_react6.default.createElement(
|
|
701
|
-
"input",
|
|
702
|
-
{
|
|
703
|
-
type: "text",
|
|
704
|
-
value: lastName,
|
|
705
|
-
onChange: (e) => setLastName(cleanAlpha(e.target.value)),
|
|
706
|
-
required: true,
|
|
707
|
-
className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
708
|
-
placeholder: "Last name"
|
|
709
|
-
}
|
|
710
|
-
))), mode === "SIGNUP" && signupStep === "ORGANIZATION" && requireOrganization && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Organization Name"), /* @__PURE__ */ import_react6.default.createElement(
|
|
711
|
-
"input",
|
|
712
|
-
{
|
|
713
|
-
type: "text",
|
|
714
|
-
value: orgName,
|
|
715
|
-
onChange: (e) => setOrgName(cleanOrgName(e.target.value)),
|
|
716
|
-
required: true,
|
|
717
|
-
autoFocus: true,
|
|
718
|
-
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
719
|
-
placeholder: "Acme Corporation"
|
|
720
|
-
}
|
|
721
|
-
))), (mode === "LOGIN" || mode === "SIGNUP" && signupStep === "EMAIL_ID") && /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Email ID"), /* @__PURE__ */ import_react6.default.createElement(
|
|
722
|
-
"input",
|
|
723
|
-
{
|
|
724
|
-
type: "email",
|
|
725
|
-
value: emailId,
|
|
726
|
-
onChange: (e) => setEmailId(cleanEmailId(e.target.value)),
|
|
727
|
-
required: true,
|
|
728
|
-
autoFocus: true,
|
|
729
|
-
className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-800 text-white outline-none focus:border-white transition-all duration-300",
|
|
730
|
-
placeholder: "name@company.com"
|
|
731
|
-
}
|
|
732
|
-
)), mode === "SIGNUP" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex items-start gap-3 mt-4" }, /* @__PURE__ */ import_react6.default.createElement(
|
|
733
|
-
"input",
|
|
734
|
-
{
|
|
735
|
-
type: "checkbox",
|
|
736
|
-
id: "zairus-terms",
|
|
737
|
-
checked: agreedToTerms,
|
|
738
|
-
onChange: (e) => setAgreedToTerms(e.target.checked),
|
|
739
|
-
className: "mt-0.5 w-4 h-4 bg-neutral-800 border-neutral-700 rounded text-white focus:ring-white cursor-pointer",
|
|
740
|
-
required: true
|
|
741
|
-
}
|
|
742
|
-
), /* @__PURE__ */ import_react6.default.createElement("label", { htmlFor: "zairus-terms", className: "text-[11px] text-neutral-400 cursor-pointer leading-snug" }, "I agree to ", companyName, "'s ", /* @__PURE__ */ import_react6.default.createElement("a", { href: termsUrl, target: "_blank", rel: "noreferrer", className: "text-white hover:text-neutral-300 " }, "Terms of Service"), " and ", /* @__PURE__ */ import_react6.default.createElement("a", { href: privacyUrl, target: "_blank", rel: "noreferrer", className: "text-white hover:text-neutral-300 " }, "Privacy Policy"), "."))), /* @__PURE__ */ import_react6.default.createElement(
|
|
743
|
-
ThreeDActionButton,
|
|
744
|
-
{
|
|
745
|
-
type: "submit",
|
|
746
|
-
disabled: isContinueDisabled(),
|
|
747
|
-
isLoading: isSubmitting,
|
|
748
|
-
className: "w-full mt-10"
|
|
749
|
-
},
|
|
750
|
-
"Continue"
|
|
751
|
-
))), step === "OTP" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-center mb-10 mt-2" }, /* @__PURE__ */ import_react6.default.createElement("h2", { className: "text-xl text-white mb-2 tracking-tight" }, "Security Check"), /* @__PURE__ */ import_react6.default.createElement("p", { className: "text-[13px] text-neutral-400" }, "Enter the code sent to ", /* @__PURE__ */ import_react6.default.createElement("br", null), /* @__PURE__ */ import_react6.default.createElement("span", { className: "text-white" }, emailId))), /* @__PURE__ */ import_react6.default.createElement("form", { className: "space-y-10", autoComplete: "off", onSubmit: (e) => {
|
|
752
|
-
e.preventDefault();
|
|
753
|
-
verifyOtpCode(otp.join(""));
|
|
754
|
-
} }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex justify-between gap-2", onPaste: handlePaste }, otp.map((digit, index) => /* @__PURE__ */ import_react6.default.createElement(
|
|
755
|
-
"input",
|
|
756
|
-
{
|
|
757
|
-
key: index,
|
|
758
|
-
ref: (el) => {
|
|
759
|
-
inputRefs.current[index] = el;
|
|
760
|
-
},
|
|
761
|
-
type: "text",
|
|
762
|
-
inputMode: "numeric",
|
|
763
|
-
maxLength: 1,
|
|
764
|
-
value: digit,
|
|
765
|
-
onChange: (e) => handleOtpChange(index, e.target.value),
|
|
766
|
-
className: "w-8 h-8 text-center text-lg bg-transparent border-b-2 border-neutral-800 text-white outline-none focus:border-white transition-all duration-300"
|
|
767
|
-
}
|
|
768
|
-
))), /* @__PURE__ */ import_react6.default.createElement(
|
|
769
|
-
ThreeDActionButton,
|
|
770
|
-
{
|
|
771
|
-
type: "submit",
|
|
772
|
-
disabled: otp.join("").length < 6,
|
|
773
|
-
isLoading: isSubmitting,
|
|
774
|
-
className: "w-full"
|
|
775
|
-
},
|
|
776
|
-
"Verify Code"
|
|
777
|
-
))))));
|
|
778
|
-
}
|
|
779
|
-
var PipleAuth = (props) => {
|
|
780
|
-
if (props.useRecaptcha && props.recaptchaSiteKey) {
|
|
781
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react_google_recaptcha_v32.GoogleReCaptchaProvider, { reCaptchaKey: props.recaptchaSiteKey }, /* @__PURE__ */ import_react6.default.createElement(import_react6.Suspense, { fallback: /* @__PURE__ */ import_react6.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react6.default.createElement(InputSpinner2, null)) }, /* @__PURE__ */ import_react6.default.createElement(AuthFormInner2, { ...props })));
|
|
782
|
-
}
|
|
783
|
-
return /* @__PURE__ */ import_react6.default.createElement(import_react6.Suspense, { fallback: /* @__PURE__ */ import_react6.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react6.default.createElement(InputSpinner2, null)) }, /* @__PURE__ */ import_react6.default.createElement(AuthFormInner2, { ...props }));
|
|
784
|
-
};
|
|
785
|
-
|
|
786
285
|
// src/components/Header.tsx
|
|
787
|
-
var
|
|
286
|
+
var import_react5 = __toESM(require("react"));
|
|
788
287
|
var import_link2 = __toESM(require("next/link"));
|
|
789
288
|
var import_image = __toESM(require("next/image"));
|
|
790
|
-
var
|
|
289
|
+
var import_navigation = require("next/navigation");
|
|
791
290
|
var NavLink = ({
|
|
792
291
|
href,
|
|
793
292
|
children,
|
|
794
|
-
className = ""
|
|
293
|
+
className = "",
|
|
294
|
+
isDarkTheme
|
|
795
295
|
}) => {
|
|
796
|
-
const pathname = (0,
|
|
296
|
+
const pathname = (0, import_navigation.usePathname)();
|
|
797
297
|
const isActive = pathname === href;
|
|
798
|
-
const activeClass = "text-white";
|
|
799
|
-
const inactiveClass = "text-neutral-400 hover:text-white";
|
|
800
|
-
return /* @__PURE__ */
|
|
298
|
+
const activeClass = isDarkTheme ? "text-white" : "text-neutral-900 font-medium";
|
|
299
|
+
const inactiveClass = isDarkTheme ? "text-neutral-400 hover:text-white" : "text-neutral-500 hover:text-neutral-900";
|
|
300
|
+
return /* @__PURE__ */ import_react5.default.createElement(
|
|
801
301
|
import_link2.default,
|
|
802
302
|
{
|
|
803
303
|
href,
|
|
@@ -816,33 +316,77 @@ var Header = ({
|
|
|
816
316
|
hideHeaderText = false,
|
|
817
317
|
compact = false
|
|
818
318
|
}) => {
|
|
319
|
+
const headerRef = (0, import_react5.useRef)(null);
|
|
320
|
+
const [isDarkTheme, setIsDarkTheme] = (0, import_react5.useState)(true);
|
|
321
|
+
(0, import_react5.useEffect)(() => {
|
|
322
|
+
const checkBackgroundLuminance = () => {
|
|
323
|
+
if (!headerRef.current) return;
|
|
324
|
+
const rect = headerRef.current.getBoundingClientRect();
|
|
325
|
+
const x = rect.left + rect.width / 2;
|
|
326
|
+
const y = rect.top + rect.height / 2;
|
|
327
|
+
const elementsAtPoint = document.elementsFromPoint(x, y);
|
|
328
|
+
let foundDarkBackground = true;
|
|
329
|
+
for (const el of elementsAtPoint) {
|
|
330
|
+
if (headerRef.current.contains(el)) continue;
|
|
331
|
+
const style = window.getComputedStyle(el);
|
|
332
|
+
const bg = style.backgroundColor;
|
|
333
|
+
if (bg && bg !== "rgba(0, 0, 0, 0)" && bg !== "transparent") {
|
|
334
|
+
const rgbMatch = bg.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
|
|
335
|
+
if (rgbMatch) {
|
|
336
|
+
const r = parseInt(rgbMatch[1], 10);
|
|
337
|
+
const g = parseInt(rgbMatch[2], 10);
|
|
338
|
+
const b = parseInt(rgbMatch[3], 10);
|
|
339
|
+
const brightness = Math.round((r * 299 + g * 587 + b * 114) / 1e3);
|
|
340
|
+
foundDarkBackground = brightness < 128;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
setIsDarkTheme(foundDarkBackground);
|
|
346
|
+
};
|
|
347
|
+
checkBackgroundLuminance();
|
|
348
|
+
window.addEventListener("scroll", checkBackgroundLuminance, { passive: true });
|
|
349
|
+
window.addEventListener("resize", checkBackgroundLuminance, { passive: true });
|
|
350
|
+
return () => {
|
|
351
|
+
window.removeEventListener("scroll", checkBackgroundLuminance);
|
|
352
|
+
window.removeEventListener("resize", checkBackgroundLuminance);
|
|
353
|
+
};
|
|
354
|
+
}, []);
|
|
819
355
|
const headerLayoutWidth = compact ? "w-fit mx-auto gap-8 md:gap-16" : "w-full justify-between";
|
|
820
356
|
const hasBrandSection = showLogo || !hideHeaderText;
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
},
|
|
838
|
-
|
|
839
|
-
|
|
357
|
+
const headerBgClass = isDarkTheme ? "bg-black/40" : "bg-white/40";
|
|
358
|
+
const brandTitleClass = isDarkTheme ? "text-white" : "text-neutral-900";
|
|
359
|
+
const brandSubtitleClass = isDarkTheme ? "text-neutral-400" : "text-neutral-600";
|
|
360
|
+
const shouldInvertLogo = isDarkTheme ? invert : !invert;
|
|
361
|
+
return (
|
|
362
|
+
// Upgraded to 'fixed' so the smart scroll detection actually follows the user down the page
|
|
363
|
+
/* @__PURE__ */ import_react5.default.createElement("div", { className: "fixed inset-x-0 top-0 w-full z-50 pointer-events-none px-4 pt-4 sm:pt-6" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "max-w-5xl mx-auto w-full pointer-events-auto flex justify-center", ref: headerRef }, /* @__PURE__ */ import_react5.default.createElement("header", { className: `${headerLayoutWidth} ${headerBgClass} backdrop-blur-md rounded-full py-2 px-6 flex items-center transition-all duration-300` }, hasBrandSection && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex items-center shrink-0" }, /* @__PURE__ */ import_react5.default.createElement(import_link2.default, { href: "/", className: "flex items-center gap-3 transition-opacity hover:opacity-70 outline-none" }, showLogo && /* @__PURE__ */ import_react5.default.createElement(
|
|
364
|
+
import_image.default,
|
|
365
|
+
{
|
|
366
|
+
src: logoSrc,
|
|
367
|
+
alt: `${companyName} Logo`,
|
|
368
|
+
width: 40,
|
|
369
|
+
height: 40,
|
|
370
|
+
className: `object-contain w-8 h-auto transition-all duration-300 ${shouldInvertLogo ? "invert" : ""}`,
|
|
371
|
+
priority: true
|
|
372
|
+
}
|
|
373
|
+
), !hideHeaderText && /* @__PURE__ */ import_react5.default.createElement("div", { className: "flex flex-col justify-center transition-colors duration-300" }, /* @__PURE__ */ import_react5.default.createElement("span", { className: `text-[11px] leading-none tracking-wide mb-1 ${brandTitleClass}` }, companyName), subtitle && /* @__PURE__ */ import_react5.default.createElement("span", { className: `text-[9px] tracking-widest leading-none ${brandSubtitleClass}` }, subtitle)))), /* @__PURE__ */ import_react5.default.createElement("nav", { className: "flex items-center gap-1 md:gap-2 shrink-0" }, links.map((link, index) => /* @__PURE__ */ import_react5.default.createElement(
|
|
374
|
+
NavLink,
|
|
375
|
+
{
|
|
376
|
+
key: index,
|
|
377
|
+
href: link.href,
|
|
378
|
+
isDarkTheme,
|
|
379
|
+
className: link.hideOnMobile ? "hidden sm:inline-flex" : ""
|
|
380
|
+
},
|
|
381
|
+
link.label
|
|
382
|
+
))))))
|
|
383
|
+
);
|
|
840
384
|
};
|
|
841
385
|
|
|
842
386
|
// src/components/Footer.tsx
|
|
843
|
-
var
|
|
387
|
+
var import_react6 = __toESM(require("react"));
|
|
844
388
|
var import_link3 = __toESM(require("next/link"));
|
|
845
|
-
var
|
|
389
|
+
var import_react7 = require("@hugeicons/react");
|
|
846
390
|
var Footer = ({
|
|
847
391
|
description,
|
|
848
392
|
columns,
|
|
@@ -850,46 +394,46 @@ var Footer = ({
|
|
|
850
394
|
copyrightText,
|
|
851
395
|
topSection
|
|
852
396
|
}) => {
|
|
853
|
-
const [openCol, setOpenCol] = (0,
|
|
397
|
+
const [openCol, setOpenCol] = (0, import_react6.useState)(null);
|
|
854
398
|
const toggleColumn = (idx) => {
|
|
855
399
|
setOpenCol(openCol === idx ? null : idx);
|
|
856
400
|
};
|
|
857
|
-
return /* @__PURE__ */
|
|
401
|
+
return /* @__PURE__ */ import_react6.default.createElement("div", { className: "" }, topSection && topSection, /* @__PURE__ */ import_react6.default.createElement("footer", { className: "relative px-6 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "relative w-full max-w-7xl mx-auto z-20 flex flex-col" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "relative py-12 md:py-16" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start gap-12 lg:gap-16 mb-12 text-left" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full lg:max-w-sm flex flex-col items-start justify-between shrink-0" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex items-center gap-4 mb-4" }, /* @__PURE__ */ import_react6.default.createElement("img", { src: "https://retinalabs.company/assets/images/ndpr.avif", alt: "NDPR", className: "w-28 h-auto object-contain filter grayscale opacity-80" }), /* @__PURE__ */ import_react6.default.createElement("img", { src: "https://retinalabs.company/assets/images/gdpr.avif", alt: "GDPR", className: "w-12 h-12 object-contain filter grayscale opacity-80" })), /* @__PURE__ */ import_react6.default.createElement("div", null, /* @__PURE__ */ import_react6.default.createElement("p", { className: "text-[11px] text-neutral-600 leading-relaxed pr-4" }, description))), /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full lg:flex-1 lg:max-w-2xl" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "hidden md:grid grid-cols-2 gap-x-16 lg:gap-x-24 gap-y-12" }, columns.map((col, idx) => /* @__PURE__ */ import_react6.default.createElement("div", { key: idx, className: "flex flex-col" }, /* @__PURE__ */ import_react6.default.createElement("h4", { className: "text-[11px] tracking-[0.2em] text-black mb-6 " }, col.title), /* @__PURE__ */ import_react6.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react6.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react6.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors block truncate" }, link.label) : /* @__PURE__ */ import_react6.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors block truncate" }, link.label))))))), /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col md:hidden w-full border-t border-neutral-100 mt-4" }, columns.map((col, idx) => {
|
|
858
402
|
const isOpen = openCol === idx;
|
|
859
|
-
return /* @__PURE__ */
|
|
403
|
+
return /* @__PURE__ */ import_react6.default.createElement("div", { key: idx, className: "border-b border-neutral-100" }, /* @__PURE__ */ import_react6.default.createElement(
|
|
860
404
|
"button",
|
|
861
405
|
{
|
|
862
406
|
onClick: () => toggleColumn(idx),
|
|
863
407
|
className: "w-full flex items-center justify-between py-5 text-left outline-none"
|
|
864
408
|
},
|
|
865
|
-
/* @__PURE__ */
|
|
866
|
-
/* @__PURE__ */
|
|
409
|
+
/* @__PURE__ */ import_react6.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-black " }, col.title),
|
|
410
|
+
/* @__PURE__ */ import_react6.default.createElement(
|
|
867
411
|
"svg",
|
|
868
412
|
{
|
|
869
|
-
className: `w-4 h-4 text-neutral-
|
|
413
|
+
className: `w-4 h-4 text-neutral-400 transition-transform duration-300 ${isOpen ? "rotate-180" : ""}`,
|
|
870
414
|
fill: "none",
|
|
871
415
|
viewBox: "0 0 24 24",
|
|
872
416
|
stroke: "currentColor"
|
|
873
417
|
},
|
|
874
|
-
/* @__PURE__ */
|
|
418
|
+
/* @__PURE__ */ import_react6.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M19 9l-7 7-7-7" })
|
|
875
419
|
)
|
|
876
|
-
), /* @__PURE__ */
|
|
877
|
-
})))), /* @__PURE__ */
|
|
420
|
+
), /* @__PURE__ */ import_react6.default.createElement("div", { className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] pb-6 opacity-100" : "grid-rows-[0fr] opacity-0"}` }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react6.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500 pt-2" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react6.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react6.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors" }, link.label) : /* @__PURE__ */ import_react6.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors" }, link.label)))))));
|
|
421
|
+
})))), /* @__PURE__ */ import_react6.default.createElement("div", { className: "pt-8 mt-4 flex flex-col-reverse md:flex-row justify-between items-start md:items-center gap-6 relative z-20" }, /* @__PURE__ */ import_react6.default.createElement("p", { className: "text-[11px] text-neutral-400 tracking-widest text-left" }, copyrightText), socialLinks && socialLinks.length > 0 && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex items-center gap-6" }, socialLinks.map((social, idx) => /* @__PURE__ */ import_react6.default.createElement(
|
|
878
422
|
"a",
|
|
879
423
|
{
|
|
880
424
|
key: idx,
|
|
881
425
|
href: social.href,
|
|
882
426
|
target: "_blank",
|
|
883
427
|
rel: "noopener noreferrer",
|
|
884
|
-
className: "text-neutral-
|
|
428
|
+
className: "text-neutral-400 hover:text-black transition-colors",
|
|
885
429
|
"aria-label": social.name
|
|
886
430
|
},
|
|
887
|
-
/* @__PURE__ */
|
|
431
|
+
/* @__PURE__ */ import_react6.default.createElement(import_react7.HugeiconsIcon, { icon: social.icon, size: 20 })
|
|
888
432
|
))))))));
|
|
889
433
|
};
|
|
890
434
|
|
|
891
435
|
// src/components/HeroSection.tsx
|
|
892
|
-
var
|
|
436
|
+
var import_react8 = __toESM(require("react"));
|
|
893
437
|
var import_link4 = __toESM(require("next/link"));
|
|
894
438
|
var import_image2 = __toESM(require("next/image"));
|
|
895
439
|
var HeroSection = ({
|
|
@@ -910,9 +454,9 @@ var HeroSection = ({
|
|
|
910
454
|
bgVideoSrc,
|
|
911
455
|
bgImageSrc
|
|
912
456
|
}) => {
|
|
913
|
-
const [isAnimating, setIsAnimating] = (0,
|
|
914
|
-
const titleRef = (0,
|
|
915
|
-
(0,
|
|
457
|
+
const [isAnimating, setIsAnimating] = (0, import_react8.useState)(false);
|
|
458
|
+
const titleRef = (0, import_react8.useRef)(null);
|
|
459
|
+
(0, import_react8.useEffect)(() => {
|
|
916
460
|
const observer = new IntersectionObserver(
|
|
917
461
|
([entry]) => {
|
|
918
462
|
if (entry.isIntersecting) {
|
|
@@ -930,7 +474,7 @@ var HeroSection = ({
|
|
|
930
474
|
}
|
|
931
475
|
return () => observer.disconnect();
|
|
932
476
|
}, []);
|
|
933
|
-
return /* @__PURE__ */
|
|
477
|
+
return /* @__PURE__ */ import_react8.default.createElement("section", { className: "relative min-h-[85vh] pt-40 sm:pt-48 pb-20 flex flex-col items-center justify-center overflow-hidden w-full bg-neutral-100" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "absolute inset-0 w-full h-full z-0 overflow-hidden" }, bgVideoSrc ? /* @__PURE__ */ import_react8.default.createElement(
|
|
934
478
|
"video",
|
|
935
479
|
{
|
|
936
480
|
src: bgVideoSrc,
|
|
@@ -939,62 +483,62 @@ var HeroSection = ({
|
|
|
939
483
|
loop: true,
|
|
940
484
|
muted: true,
|
|
941
485
|
playsInline: true,
|
|
942
|
-
className: "absolute inset-0 w-full h-full object-cover z-0"
|
|
486
|
+
className: "absolute inset-0 w-full h-full object-cover z-0 opacity-80"
|
|
943
487
|
}
|
|
944
|
-
) : bgImageSrc ? /* @__PURE__ */
|
|
488
|
+
) : bgImageSrc ? /* @__PURE__ */ import_react8.default.createElement(
|
|
945
489
|
import_image2.default,
|
|
946
490
|
{
|
|
947
491
|
src: bgImageSrc,
|
|
948
492
|
alt: "Hero Background",
|
|
949
493
|
fill: true,
|
|
950
494
|
priority: true,
|
|
951
|
-
className: "object-cover z-0"
|
|
495
|
+
className: "object-cover z-0 opacity-80"
|
|
952
496
|
}
|
|
953
|
-
) : null, /* @__PURE__ */
|
|
497
|
+
) : null, /* @__PURE__ */ import_react8.default.createElement(
|
|
954
498
|
"div",
|
|
955
499
|
{
|
|
956
500
|
className: "absolute inset-0 z-10 opacity-30 mix-blend-overlay pointer-events-none",
|
|
957
501
|
style: {
|
|
958
|
-
backgroundImage: `linear-gradient(110deg, rgba(255,255,255,0.
|
|
502
|
+
backgroundImage: `linear-gradient(110deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0.2) 35%, rgba(0,0,0,0.05) 60%, rgba(255,255,255,0.6) 80%, rgba(0,0,0,0.1) 100%), url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc2MDAnIGhlaWdodD0nODAnPjxmaWx0ZXIgaWQ9J2JydXNoZWQnIHg9JzAlJyB5PScwJScgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJSc+PGZlVHVyYnVsZW5jZSB0eXBlPSdmcmFjdGFsTm9pc2UnIGJhc2VGcmVxdWVuY3k9JzAuMDA1IDAuOCcgbnVtT2N0YXZlcz0nNCcgc2VlZD0nNScgcmVzdWx0PSdub2lzZScvPjxmZUNvbG9yTWF0cml4IHR5cGU9J3NhdHVyYXRlJyB2YWx1ZXM9JzAnIHJlc3VsdD0nbW9ubycvPjxmZUNvbXBvbmVudFRyYW5zZmVyIHJlc3VsdD0nYWRqdXN0ZWQnPjxmZUZ1bmNSIHR5cGU9J2xpbmVhcicgc2xvcGU9JzAuNCcgaW50ZXJjZXB0PScwLjMnLz48ZmVGdW5jRyB0eXBlPSdsaW5lYXInIHNsb3BlPScwLjQnIGludGVyY2VwdD0nMC4zJy8+PGZlRnVuY0IgdHlwZT0nbGluZWFyJyBzbG9wZT0nMC40JyBpbnRlcmNlcHQ9JzAuMycvPjxmZUZ1bmNBIHR5cGU9J2xpbmVhcicgc2xvcGU9JzAuMTUnIGludGVyY2VwdD0nMCcvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj48L2ZpbHRlcj48cmVjdCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBmaWxsPScjZDFkNWRiJy8+PHJlY3Qgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgZmlsdGVyPSd1cmwoI2JydXNoZWQpJyBvcGFjaXR5PScwLjgnLz48L3N2Zz4=")`,
|
|
959
503
|
backgroundSize: "cover",
|
|
960
504
|
backgroundPosition: "center"
|
|
961
505
|
}
|
|
962
506
|
}
|
|
963
|
-
), /* @__PURE__ */
|
|
507
|
+
), /* @__PURE__ */ import_react8.default.createElement("div", { className: "absolute inset-0 z-10" }), /* @__PURE__ */ import_react8.default.createElement(
|
|
964
508
|
"div",
|
|
965
509
|
{
|
|
966
510
|
className: "absolute inset-0 w-full h-full pointer-events-none z-10 opacity-10",
|
|
967
511
|
style: {
|
|
968
|
-
backgroundImage: "radial-gradient(circle at center, rgba(
|
|
512
|
+
backgroundImage: "radial-gradient(circle at center, rgba(0,0,0,0.15) 1px, transparent 1px)",
|
|
969
513
|
backgroundSize: "32px 32px"
|
|
970
514
|
}
|
|
971
515
|
}
|
|
972
|
-
), /* @__PURE__ */
|
|
516
|
+
), /* @__PURE__ */ import_react8.default.createElement(
|
|
973
517
|
"div",
|
|
974
518
|
{
|
|
975
|
-
className: "absolute inset-0 w-full h-full pointer-events-none z-10 opacity-[0.
|
|
519
|
+
className: "absolute inset-0 w-full h-full pointer-events-none z-10 opacity-[0.05] mix-blend-overlay",
|
|
976
520
|
style: {
|
|
977
521
|
backgroundImage: `url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E")`
|
|
978
522
|
}
|
|
979
523
|
}
|
|
980
|
-
), /* @__PURE__ */
|
|
524
|
+
), /* @__PURE__ */ import_react8.default.createElement("div", { className: "absolute inset-x-0 bottom-0 h-40 bg-linear-to-t from-neutral-100 to-transparent z-10 pointer-events-none" })), /* @__PURE__ */ import_react8.default.createElement("div", { className: "relative max-w-5xl mx-auto px-4 sm:px-6 w-full flex flex-col items-center text-center z-20" }, /* @__PURE__ */ import_react8.default.createElement(
|
|
981
525
|
"h1",
|
|
982
526
|
{
|
|
983
527
|
ref: titleRef,
|
|
984
|
-
className: `text-4xl sm:text-5xl lg:text-7xl font-light mb-6 text-white tracking-tight leading-[1.05] max-w-4xl
|
|
528
|
+
className: `text-4xl sm:text-5xl lg:text-7xl font-light mb-6 text-white tracking-tight leading-[1.05] max-w-4xl`,
|
|
985
529
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
986
530
|
},
|
|
987
531
|
titlePrefix,
|
|
988
532
|
" ",
|
|
989
|
-
/* @__PURE__ */
|
|
990
|
-
), subtitle && /* @__PURE__ */
|
|
533
|
+
/* @__PURE__ */ import_react8.default.createElement("span", { className: "font-medium gradient-text" }, highlightText)
|
|
534
|
+
), subtitle && /* @__PURE__ */ import_react8.default.createElement("p", { className: "text-[14px] md:text-[16px] text-neutral-600 max-w-xl mx-auto mb-10 font-light leading-relaxed" }, subtitle), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col sm:flex-row gap-4 justify-center items-center w-full px-2 sm:px-0 mx-auto mb-16" }, ctaText && ctaHref && /* @__PURE__ */ import_react8.default.createElement("div", { className: "w-full sm:w-60 flex justify-center *:w-full" }, /* @__PURE__ */ import_react8.default.createElement(ThreeDButton, { href: ctaHref }, ctaText)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */ import_react8.default.createElement(
|
|
991
535
|
import_link4.default,
|
|
992
536
|
{
|
|
993
537
|
href: secondaryCtaHref,
|
|
994
|
-
className: "w-full sm:w-60 inline-flex font-medium items-center justify-center text-[11px] tracking-widest rounded-full px-8 py-3
|
|
538
|
+
className: "w-full sm:w-60 inline-flex font-medium items-center justify-center text-[11px] tracking-widest rounded-full px-8 py-3 bg-black/60 backdrop-blur-md text-center text-white text-xs hover:bg-black/80 outline-none transition-all"
|
|
995
539
|
},
|
|
996
540
|
secondaryCtaText
|
|
997
|
-
)), showApps && appLogos && appLogos.length > 0 && /* @__PURE__ */
|
|
541
|
+
)), showApps && appLogos && appLogos.length > 0 && /* @__PURE__ */ import_react8.default.createElement("div", { className: "w-full flex flex-col items-center mt-4" }, appsText && /* @__PURE__ */ import_react8.default.createElement("p", { className: "text-[9px] tracking-[0.2em] text-neutral-500 mb-5 " }, appsText), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-wrap justify-center items-center gap-6 opacity-90" }, appLogos.map((logo, idx) => /* @__PURE__ */ import_react8.default.createElement("div", { key: idx, className: "relative h-6 w-6 sm:h-8 sm:w-8 flex items-center justify-center cursor-default" }, /* @__PURE__ */ import_react8.default.createElement(
|
|
998
542
|
import_image2.default,
|
|
999
543
|
{
|
|
1000
544
|
src: logo.src,
|
|
@@ -1007,12 +551,12 @@ var HeroSection = ({
|
|
|
1007
551
|
};
|
|
1008
552
|
|
|
1009
553
|
// src/components/AppBento2.tsx
|
|
1010
|
-
var
|
|
1011
|
-
var
|
|
554
|
+
var import_react9 = __toESM(require("react"));
|
|
555
|
+
var import_react10 = require("@hugeicons/react");
|
|
1012
556
|
var AppBento2 = ({ tagline, headline, features }) => {
|
|
1013
|
-
const [isAnimating, setIsAnimating] = (0,
|
|
1014
|
-
const titleRef = (0,
|
|
1015
|
-
(0,
|
|
557
|
+
const [isAnimating, setIsAnimating] = (0, import_react9.useState)(false);
|
|
558
|
+
const titleRef = (0, import_react9.useRef)(null);
|
|
559
|
+
(0, import_react9.useEffect)(() => {
|
|
1016
560
|
const observer = new IntersectionObserver(
|
|
1017
561
|
([entry]) => {
|
|
1018
562
|
if (entry.isIntersecting) {
|
|
@@ -1030,66 +574,66 @@ var AppBento2 = ({ tagline, headline, features }) => {
|
|
|
1030
574
|
}
|
|
1031
575
|
return () => observer.disconnect();
|
|
1032
576
|
}, []);
|
|
1033
|
-
return /* @__PURE__ */
|
|
577
|
+
return /* @__PURE__ */ import_react9.default.createElement("div", { className: "w-full py-16" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "w-full flex justify-center px-4" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "relative overflow-hidden mb-12 text-left" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react9.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4 " }, tagline), /* @__PURE__ */ import_react9.default.createElement(
|
|
1034
578
|
"h2",
|
|
1035
579
|
{
|
|
1036
580
|
ref: titleRef,
|
|
1037
|
-
className: `text-3xl
|
|
581
|
+
className: ` text-3xl tracking-tight text-black leading-[1.1] ${isAnimating ? "" : ""}`,
|
|
1038
582
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
1039
583
|
},
|
|
1040
584
|
headline
|
|
1041
|
-
))), /* @__PURE__ */
|
|
1042
|
-
const
|
|
1043
|
-
const
|
|
1044
|
-
const
|
|
585
|
+
))), /* @__PURE__ */ import_react9.default.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-6" }, features.map((f, i) => {
|
|
586
|
+
const isWhite = i === 0;
|
|
587
|
+
const isBlack = i === 1;
|
|
588
|
+
const isNeutral = i === 2;
|
|
1045
589
|
const getBgStyle = () => {
|
|
1046
|
-
if (
|
|
1047
|
-
if (
|
|
1048
|
-
if (
|
|
1049
|
-
return "bg-neutral-
|
|
590
|
+
if (isWhite) return "bg-white";
|
|
591
|
+
if (isBlack) return "bg-black";
|
|
592
|
+
if (isNeutral) return "bg-neutral-200";
|
|
593
|
+
return "bg-neutral-200";
|
|
1050
594
|
};
|
|
1051
595
|
const getShadowStyle = () => {
|
|
1052
|
-
if (
|
|
1053
|
-
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.
|
|
1054
|
-
inset 0 -3px 0 0 rgba(0, 0, 0, 0.
|
|
1055
|
-
0 4px 0 0 #
|
|
1056
|
-
0 12px 24px rgba(0, 0, 0, 0.
|
|
596
|
+
if (isBlack) return `
|
|
597
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.2),
|
|
598
|
+
inset 0 -3px 0 0 rgba(0, 0, 0, 0.3),
|
|
599
|
+
0 4px 0 0 #0c0c0c,
|
|
600
|
+
0 12px 24px rgba(0, 0, 0, 0.1)
|
|
1057
601
|
`;
|
|
1058
602
|
return "none";
|
|
1059
603
|
};
|
|
1060
|
-
const textColor = "text-white";
|
|
1061
|
-
const subTextColor = "text-neutral-
|
|
1062
|
-
const labelColor = "text-neutral-500";
|
|
1063
|
-
return /* @__PURE__ */
|
|
604
|
+
const textColor = isBlack ? "text-white" : "text-black";
|
|
605
|
+
const subTextColor = isBlack ? "text-neutral-300" : "text-neutral-600";
|
|
606
|
+
const labelColor = isBlack ? "text-neutral-400" : "text-neutral-500";
|
|
607
|
+
return /* @__PURE__ */ import_react9.default.createElement(
|
|
1064
608
|
"div",
|
|
1065
609
|
{
|
|
1066
610
|
key: i,
|
|
1067
611
|
className: `relative rounded-2xl overflow-hidden p-8 flex flex-col min-h-75 transition-all duration-500 group text-left ${getBgStyle()} ${f.size}`,
|
|
1068
612
|
style: { boxShadow: getShadowStyle() }
|
|
1069
613
|
},
|
|
1070
|
-
/* @__PURE__ */
|
|
614
|
+
/* @__PURE__ */ import_react9.default.createElement(
|
|
1071
615
|
"div",
|
|
1072
616
|
{
|
|
1073
617
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
1074
618
|
style: { backgroundImage: `url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E")` }
|
|
1075
619
|
}
|
|
1076
620
|
),
|
|
1077
|
-
|
|
1078
|
-
/* @__PURE__ */
|
|
1079
|
-
/* @__PURE__ */
|
|
621
|
+
isBlack && /* @__PURE__ */ import_react9.default.createElement("span", { className: "absolute inset-0 rounded-2xl bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none z-10" }),
|
|
622
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { className: "absolute inset-0 overflow-hidden pointer-events-none z-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: `absolute -bottom-8 -right-8 transform group-hover:scale-110 transition-transform duration-700 ease-out ${isBlack ? "text-white/5" : "text-black/5"}` }, /* @__PURE__ */ import_react9.default.createElement(import_react10.HugeiconsIcon, { icon: f.icon, size: 180 }))),
|
|
623
|
+
/* @__PURE__ */ import_react9.default.createElement("div", { className: "relative z-10 w-full h-full flex flex-col pointer-events-auto" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "flex items-center justify-between mb-8" }, /* @__PURE__ */ import_react9.default.createElement("span", { className: `text-[9px] tracking-widest ${labelColor}` }, f.label), /* @__PURE__ */ import_react9.default.createElement("div", { className: `p-2 rounded-full transition-colors ${isBlack ? "bg-white/10" : "bg-white/50 backdrop-blur-sm"}` }, /* @__PURE__ */ import_react9.default.createElement(import_react10.HugeiconsIcon, { icon: f.icon, size: 20, className: textColor }))), /* @__PURE__ */ import_react9.default.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ import_react9.default.createElement("h3", { className: `text-xl mb-2 tracking-tight ${textColor}` }, f.title), /* @__PURE__ */ import_react9.default.createElement("p", { className: `text-[13px] leading-relaxed max-w-sm ${subTextColor}` }, f.desc)))
|
|
1080
624
|
);
|
|
1081
625
|
})))));
|
|
1082
626
|
};
|
|
1083
627
|
|
|
1084
628
|
// src/components/FeatureScroll.tsx
|
|
1085
|
-
var
|
|
629
|
+
var import_react11 = __toESM(require("react"));
|
|
1086
630
|
var import_image3 = __toESM(require("next/image"));
|
|
1087
|
-
var
|
|
631
|
+
var import_react12 = require("@hugeicons/react");
|
|
1088
632
|
var import_core_free_icons2 = require("@hugeicons/core-free-icons");
|
|
1089
633
|
var FeatureCard = ({ feature, bgImage }) => {
|
|
1090
|
-
const [isBgLoading, setIsBgLoading] = (0,
|
|
1091
|
-
const [isFgLoading, setIsFgLoading] = (0,
|
|
1092
|
-
return /* @__PURE__ */
|
|
634
|
+
const [isBgLoading, setIsBgLoading] = (0, import_react11.useState)(true);
|
|
635
|
+
const [isFgLoading, setIsFgLoading] = (0, import_react11.useState)(!!feature.image);
|
|
636
|
+
return /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col shrink-0 w-[90vw] sm:w-150 snap-center md:snap-start group cursor-grab active:cursor-grabbing" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "relative w-full aspect-16/10 bg-neutral-100 rounded-2xl overflow-hidden mb-6 flex items-center justify-center" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
1093
637
|
import_image3.default,
|
|
1094
638
|
{
|
|
1095
639
|
src: bgImage,
|
|
@@ -1102,7 +646,7 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
1102
646
|
${isBgLoading ? "blur-xl scale-110" : "blur-0 scale-100"}
|
|
1103
647
|
`
|
|
1104
648
|
}
|
|
1105
|
-
), /* @__PURE__ */
|
|
649
|
+
), /* @__PURE__ */ import_react11.default.createElement(
|
|
1106
650
|
"div",
|
|
1107
651
|
{
|
|
1108
652
|
className: "absolute inset-0 w-full h-full pointer-events-none z-0 opacity-[0.25] mix-blend-overlay",
|
|
@@ -1110,7 +654,7 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
1110
654
|
backgroundImage: `url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E")`
|
|
1111
655
|
}
|
|
1112
656
|
}
|
|
1113
|
-
), isFgLoading && feature.image && /* @__PURE__ */
|
|
657
|
+
), isFgLoading && feature.image && /* @__PURE__ */ import_react11.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-50/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ import_react11.default.createElement(import_react12.HugeiconsIcon, { icon: import_core_free_icons2.Loading03Icon, size: 32, className: "animate-spin text-neutral-400" })), feature.image && /* @__PURE__ */ import_react11.default.createElement("div", { className: "absolute -bottom-6 -right-6 w-[85%] h-[85%] z-10 transition-transform duration-700 ease-out group-hover:-translate-x-2 group-hover:-translate-y-2" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
1114
658
|
import_image3.default,
|
|
1115
659
|
{
|
|
1116
660
|
src: feature.image,
|
|
@@ -1119,16 +663,16 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
1119
663
|
sizes: "(max-width: 768px) 90vw, 600px",
|
|
1120
664
|
onLoad: () => setIsFgLoading(false),
|
|
1121
665
|
className: `
|
|
1122
|
-
object-cover object-top-left rounded-tl-2xl shadow-[-12px_-12px_30px_rgba(0,0,0,0.
|
|
666
|
+
object-cover object-top-left rounded-tl-2xl shadow-[-12px_-12px_30px_rgba(0,0,0,0.06)] transition-all duration-700 ease-out
|
|
1123
667
|
${isFgLoading ? "opacity-0 blur-xl" : "opacity-100 blur-0"}
|
|
1124
668
|
`
|
|
1125
669
|
}
|
|
1126
|
-
))), /* @__PURE__ */
|
|
670
|
+
))), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col text-left pr-4" }, /* @__PURE__ */ import_react11.default.createElement("h3", { className: " text-xl tracking-tight text-black mb-2" }, feature.title), /* @__PURE__ */ import_react11.default.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 max-w-[90%]" }, feature.desc)));
|
|
1127
671
|
};
|
|
1128
672
|
var FeatureScroll = ({ tagline, headline, features }) => {
|
|
1129
|
-
const scrollRef = (0,
|
|
1130
|
-
const [canScrollLeft, setCanScrollLeft] = (0,
|
|
1131
|
-
const [canScrollRight, setCanScrollRight] = (0,
|
|
673
|
+
const scrollRef = (0, import_react11.useRef)(null);
|
|
674
|
+
const [canScrollLeft, setCanScrollLeft] = (0, import_react11.useState)(false);
|
|
675
|
+
const [canScrollRight, setCanScrollRight] = (0, import_react11.useState)(true);
|
|
1132
676
|
const checkScroll = () => {
|
|
1133
677
|
if (scrollRef.current) {
|
|
1134
678
|
const { scrollLeft, scrollWidth, clientWidth } = scrollRef.current;
|
|
@@ -1136,7 +680,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
1136
680
|
setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 2);
|
|
1137
681
|
}
|
|
1138
682
|
};
|
|
1139
|
-
(0,
|
|
683
|
+
(0, import_react11.useEffect)(() => {
|
|
1140
684
|
checkScroll();
|
|
1141
685
|
window.addEventListener("resize", checkScroll);
|
|
1142
686
|
return () => window.removeEventListener("resize", checkScroll);
|
|
@@ -1152,74 +696,74 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
1152
696
|
"https://retinalabs.company/assets/images/bg_6.avif",
|
|
1153
697
|
"https://retinalabs.company/assets/images/bg_1.avif"
|
|
1154
698
|
];
|
|
1155
|
-
return /* @__PURE__ */
|
|
699
|
+
return /* @__PURE__ */ import_react11.default.createElement("section", { className: "py-24 w-full flex justify-center relative z-10 overflow-hidden" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex flex-col md:flex-row md:items-end justify-between gap-6 mb-12" }, /* @__PURE__ */ import_react11.default.createElement("div", { className: "relative z-10 text-left" }, /* @__PURE__ */ import_react11.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ import_react11.default.createElement("h2", { className: " text-3xl tracking-tight text-black leading-[1.05]" }, headline)), /* @__PURE__ */ import_react11.default.createElement("div", { className: "hidden md:flex items-center gap-3" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
1156
700
|
"button",
|
|
1157
701
|
{
|
|
1158
702
|
onClick: () => scroll("left"),
|
|
1159
703
|
disabled: !canScrollLeft,
|
|
1160
|
-
className: "p-4 border border-neutral-
|
|
704
|
+
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:hover:border-neutral-200 disabled:hover:text-neutral-500 disabled:cursor-not-allowed transition-all outline-none",
|
|
1161
705
|
"aria-label": "Previous feature"
|
|
1162
706
|
},
|
|
1163
|
-
/* @__PURE__ */
|
|
1164
|
-
), /* @__PURE__ */
|
|
707
|
+
/* @__PURE__ */ import_react11.default.createElement(import_react12.HugeiconsIcon, { icon: import_core_free_icons2.ArrowLeft01Icon, size: 20 })
|
|
708
|
+
), /* @__PURE__ */ import_react11.default.createElement(
|
|
1165
709
|
"button",
|
|
1166
710
|
{
|
|
1167
711
|
onClick: () => scroll("right"),
|
|
1168
712
|
disabled: !canScrollRight,
|
|
1169
|
-
className: "p-4 border border-neutral-
|
|
713
|
+
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:hover:border-neutral-200 disabled:hover:text-neutral-500 disabled:cursor-not-allowed transition-all outline-none",
|
|
1170
714
|
"aria-label": "Next feature"
|
|
1171
715
|
},
|
|
1172
|
-
/* @__PURE__ */
|
|
1173
|
-
))), /* @__PURE__ */
|
|
716
|
+
/* @__PURE__ */ import_react11.default.createElement(import_react12.HugeiconsIcon, { icon: import_core_free_icons2.ArrowRight01Icon, size: 20 })
|
|
717
|
+
))), /* @__PURE__ */ import_react11.default.createElement(
|
|
1174
718
|
"div",
|
|
1175
719
|
{
|
|
1176
720
|
ref: scrollRef,
|
|
1177
721
|
onScroll: checkScroll,
|
|
1178
722
|
className: "flex gap-6 overflow-x-auto snap-x snap-mandatory [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] scrollbar-none pb-8 -mx-4 px-4 md:mx-0 md:px-0"
|
|
1179
723
|
},
|
|
1180
|
-
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */
|
|
1181
|
-
), /* @__PURE__ */
|
|
724
|
+
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */ import_react11.default.createElement(FeatureCard, { key: idx, feature, bgImage: bgImages[idx] }))
|
|
725
|
+
), /* @__PURE__ */ import_react11.default.createElement("div", { className: "flex md:hidden items-center justify-center gap-4 mt-2" }, /* @__PURE__ */ import_react11.default.createElement(
|
|
1182
726
|
"button",
|
|
1183
727
|
{
|
|
1184
728
|
onClick: () => scroll("left"),
|
|
1185
729
|
disabled: !canScrollLeft,
|
|
1186
|
-
className: "p-4 border border-neutral-
|
|
730
|
+
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 transition-all outline-none"
|
|
1187
731
|
},
|
|
1188
|
-
/* @__PURE__ */
|
|
1189
|
-
), /* @__PURE__ */
|
|
732
|
+
/* @__PURE__ */ import_react11.default.createElement(import_react12.HugeiconsIcon, { icon: import_core_free_icons2.ArrowLeft01Icon, size: 20 })
|
|
733
|
+
), /* @__PURE__ */ import_react11.default.createElement(
|
|
1190
734
|
"button",
|
|
1191
735
|
{
|
|
1192
736
|
onClick: () => scroll("right"),
|
|
1193
737
|
disabled: !canScrollRight,
|
|
1194
|
-
className: "p-4 border border-neutral-
|
|
738
|
+
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 transition-all outline-none"
|
|
1195
739
|
},
|
|
1196
|
-
/* @__PURE__ */
|
|
740
|
+
/* @__PURE__ */ import_react11.default.createElement(import_react12.HugeiconsIcon, { icon: import_core_free_icons2.ArrowRight01Icon, size: 20 })
|
|
1197
741
|
))));
|
|
1198
742
|
};
|
|
1199
743
|
|
|
1200
744
|
// src/components/PlatformFeatures.tsx
|
|
1201
|
-
var
|
|
1202
|
-
var
|
|
745
|
+
var import_react13 = __toESM(require("react"));
|
|
746
|
+
var import_react14 = require("@hugeicons/react");
|
|
1203
747
|
var PlatformFeatures = ({
|
|
1204
748
|
tagline,
|
|
1205
749
|
headline,
|
|
1206
750
|
description,
|
|
1207
751
|
features
|
|
1208
752
|
}) => {
|
|
1209
|
-
return /* @__PURE__ */
|
|
753
|
+
return /* @__PURE__ */ import_react13.default.createElement("section", { className: "w-full flex justify-center mb-15 relative z-10" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col items-start mb-16 relative z-10" }, /* @__PURE__ */ import_react13.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ import_react13.default.createElement("h2", { className: "text-3xl tracking-tight text-black leading-[1.05] mb-6" }, headline), /* @__PURE__ */ import_react13.default.createElement("p", { className: "text-[15px] leading-[1.8] text-neutral-600 max-w-2xl" }, description)), /* @__PURE__ */ import_react13.default.createElement("div", { className: "w-full h-px bg-neutral-100 mb-16", "aria-hidden": "true" }), /* @__PURE__ */ import_react13.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-8 gap-y-12" }, features.map((feature, idx) => /* @__PURE__ */ import_react13.default.createElement(
|
|
1210
754
|
"div",
|
|
1211
755
|
{
|
|
1212
756
|
key: idx,
|
|
1213
757
|
className: "flex flex-col group animate-in fade-in slide-in-from-bottom-4 duration-700 fill-mode-both",
|
|
1214
758
|
style: { animationDelay: feature.delay || "0ms" }
|
|
1215
759
|
},
|
|
1216
|
-
/* @__PURE__ */
|
|
1217
|
-
/* @__PURE__ */
|
|
760
|
+
/* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-row items-center gap-4 mb-4" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "w-14 h-14 shrink-0 rounded-xl border border-neutral-200 flex items-center justify-center text-neutral-600 transition-colors duration-300" }, /* @__PURE__ */ import_react13.default.createElement(import_react14.HugeiconsIcon, { icon: feature.icon, size: 24 })), /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col justify-center" }, /* @__PURE__ */ import_react13.default.createElement("span", { className: "text-[11px] tracking-widest text-neutral-400 mb-0.5" }, feature.label || "CAPABILITY"), /* @__PURE__ */ import_react13.default.createElement("h3", { className: "text-xl tracking-tight text-black" }, feature.title))),
|
|
761
|
+
/* @__PURE__ */ import_react13.default.createElement("div", null, /* @__PURE__ */ import_react13.default.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 pr-4" }, feature.desc))
|
|
1218
762
|
)))));
|
|
1219
763
|
};
|
|
1220
764
|
|
|
1221
765
|
// src/components/ManagedDocument.tsx
|
|
1222
|
-
var
|
|
766
|
+
var import_react15 = __toESM(require("react"));
|
|
1223
767
|
var ManagedDocument = ({
|
|
1224
768
|
tagline,
|
|
1225
769
|
title,
|
|
@@ -1227,9 +771,9 @@ var ManagedDocument = ({
|
|
|
1227
771
|
contactText,
|
|
1228
772
|
contactEmail
|
|
1229
773
|
}) => {
|
|
1230
|
-
const [isAnimating, setIsAnimating] = (0,
|
|
1231
|
-
const titleRef = (0,
|
|
1232
|
-
(0,
|
|
774
|
+
const [isAnimating, setIsAnimating] = (0, import_react15.useState)(false);
|
|
775
|
+
const titleRef = (0, import_react15.useRef)(null);
|
|
776
|
+
(0, import_react15.useEffect)(() => {
|
|
1233
777
|
const observer = new IntersectionObserver(
|
|
1234
778
|
([entry]) => {
|
|
1235
779
|
if (entry.isIntersecting) {
|
|
@@ -1249,19 +793,19 @@ var ManagedDocument = ({
|
|
|
1249
793
|
}, []);
|
|
1250
794
|
return (
|
|
1251
795
|
// Outer layout wrapper (takes up available space, adds padding)
|
|
1252
|
-
/* @__PURE__ */
|
|
796
|
+
/* @__PURE__ */ import_react15.default.createElement("div", { className: "grow pt-28 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react15.default.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ import_react15.default.createElement(
|
|
1253
797
|
"h1",
|
|
1254
798
|
{
|
|
1255
799
|
ref: titleRef,
|
|
1256
|
-
className: `text-3xl mt-4 text-
|
|
800
|
+
className: ` text-3xl mt-4 text-black tracking-tight text-left ${isAnimating ? "" : ""}`,
|
|
1257
801
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
1258
802
|
},
|
|
1259
803
|
title
|
|
1260
|
-
)), sections.map((section, index) => /* @__PURE__ */
|
|
804
|
+
)), sections.map((section, index) => /* @__PURE__ */ import_react15.default.createElement("div", { key: index, className: "relative px-5 md:px-12 py-8 md:py-10" }, section.heading && /* @__PURE__ */ import_react15.default.createElement("p", { className: " text-[11px] tracking-[0.2em] text-black mb-4 text-left " }, section.heading), section.paragraphs && section.paragraphs.length > 0 && /* @__PURE__ */ import_react15.default.createElement("div", { className: "text-[14px] leading-[1.8] text-neutral-700 space-y-4 text-left font-light" }, section.paragraphs.map((text, pIndex) => /* @__PURE__ */ import_react15.default.createElement("p", { key: pIndex }, text))), section.quote && /* @__PURE__ */ import_react15.default.createElement("div", { className: `border-neutral-100 border rounded-xl p-6 ${section.paragraphs && section.paragraphs.length > 0 ? "mt-6" : ""}` }, /* @__PURE__ */ import_react15.default.createElement("p", { className: "text-neutral-900 text-[14px] md:text-[14px] leading-relaxed" }, '"', section.quote, '"')))), (contactText || contactEmail) && /* @__PURE__ */ import_react15.default.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10 pb-12 md:pb-14" }, /* @__PURE__ */ import_react15.default.createElement("p", { className: "text-[11px] text-neutral-600 text-left" }, contactText, contactEmail && /* @__PURE__ */ import_react15.default.createElement(
|
|
1261
805
|
"a",
|
|
1262
806
|
{
|
|
1263
807
|
href: `mailto:${contactEmail}`,
|
|
1264
|
-
className: "text-
|
|
808
|
+
className: "text-black decoration-black decoration-2 underline-offset-4 ml-1 transition-colors"
|
|
1265
809
|
},
|
|
1266
810
|
contactEmail
|
|
1267
811
|
))))))
|
|
@@ -1269,18 +813,18 @@ var ManagedDocument = ({
|
|
|
1269
813
|
};
|
|
1270
814
|
|
|
1271
815
|
// src/components/ManagedContactBlock.tsx
|
|
1272
|
-
var
|
|
1273
|
-
var
|
|
816
|
+
var import_react16 = __toESM(require("react"));
|
|
817
|
+
var import_react17 = require("@hugeicons/react");
|
|
1274
818
|
var SecureEmail = ({ user, domain, className }) => {
|
|
1275
|
-
const [isMounted, setIsMounted] = (0,
|
|
1276
|
-
(0,
|
|
819
|
+
const [isMounted, setIsMounted] = (0, import_react16.useState)(false);
|
|
820
|
+
(0, import_react16.useEffect)(() => {
|
|
1277
821
|
setIsMounted(true);
|
|
1278
822
|
}, []);
|
|
1279
823
|
if (!isMounted) {
|
|
1280
|
-
return /* @__PURE__ */
|
|
824
|
+
return /* @__PURE__ */ import_react16.default.createElement("span", { className, style: { opacity: 0 } }, "Loading");
|
|
1281
825
|
}
|
|
1282
826
|
const email = `${user}@${domain}`;
|
|
1283
|
-
return /* @__PURE__ */
|
|
827
|
+
return /* @__PURE__ */ import_react16.default.createElement("a", { href: `mailto:${email}`, className }, email);
|
|
1284
828
|
};
|
|
1285
829
|
var ManagedContactBlock = ({
|
|
1286
830
|
tagline,
|
|
@@ -1289,7 +833,7 @@ var ManagedContactBlock = ({
|
|
|
1289
833
|
emails,
|
|
1290
834
|
socials
|
|
1291
835
|
}) => {
|
|
1292
|
-
return /* @__PURE__ */
|
|
836
|
+
return /* @__PURE__ */ import_react16.default.createElement("div", { className: "grow pt-28 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
1293
837
|
"div",
|
|
1294
838
|
{
|
|
1295
839
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -1298,51 +842,51 @@ var ManagedContactBlock = ({
|
|
|
1298
842
|
backgroundRepeat: "repeat"
|
|
1299
843
|
}
|
|
1300
844
|
}
|
|
1301
|
-
), /* @__PURE__ */
|
|
845
|
+
), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative px-8 md:px-12 py-10" }, tagline && /* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ import_react16.default.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), /* @__PURE__ */ import_react16.default.createElement("div", { className: "relative px-8 md:px-12 py-8 pb-14" }, /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-wrap gap-12 lg:gap-16 w-full" }, company && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Contact Details"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-3 text-[13px] text-neutral-600 leading-[1.8]" }, company.name && /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-black" }, company.name), company.lines && company.lines.map((line, idx) => /* @__PURE__ */ import_react16.default.createElement("p", { key: idx }, line)), company.phone && /* @__PURE__ */ import_react16.default.createElement("p", { className: "pt-2" }, /* @__PURE__ */ import_react16.default.createElement(
|
|
1302
846
|
"a",
|
|
1303
847
|
{
|
|
1304
848
|
href: `tel:${company.phone.replace(/\s+/g, "")}`,
|
|
1305
|
-
className: "transition-colors hover:text-
|
|
849
|
+
className: "transition-colors hover:text-black"
|
|
1306
850
|
},
|
|
1307
851
|
company.phone
|
|
1308
|
-
)))), emails && emails.length > 0 && /* @__PURE__ */
|
|
852
|
+
)))), emails && emails.length > 0 && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Email Directory"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "space-y-6 text-[13px]" }, emails.map((email, idx) => /* @__PURE__ */ import_react16.default.createElement("div", { key: idx }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[11px] tracking-[0.2em] mb-1.5 text-neutral-500 " }, email.label), /* @__PURE__ */ import_react16.default.createElement(
|
|
1309
853
|
SecureEmail,
|
|
1310
854
|
{
|
|
1311
855
|
user: email.user,
|
|
1312
856
|
domain: email.domain,
|
|
1313
|
-
className: "text-neutral-
|
|
857
|
+
className: "text-neutral-600 transition-colors hover:text-black"
|
|
1314
858
|
}
|
|
1315
|
-
))))), socials && socials.length > 0 && /* @__PURE__ */
|
|
859
|
+
))))), socials && socials.length > 0 && /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ import_react16.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Find Us Online"), /* @__PURE__ */ import_react16.default.createElement("div", { className: "flex flex-col space-y-5 pt-1" }, socials.map((social, idx) => /* @__PURE__ */ import_react16.default.createElement(
|
|
1316
860
|
"a",
|
|
1317
861
|
{
|
|
1318
862
|
key: idx,
|
|
1319
863
|
href: social.href,
|
|
1320
864
|
target: "_blank",
|
|
1321
865
|
rel: "noopener noreferrer",
|
|
1322
|
-
className: "flex items-center gap-3 transition-colors group text-neutral-
|
|
866
|
+
className: "flex items-center gap-3 transition-colors group text-neutral-600 hover:text-black",
|
|
1323
867
|
"aria-label": social.label
|
|
1324
868
|
},
|
|
1325
|
-
/* @__PURE__ */
|
|
1326
|
-
/* @__PURE__ */
|
|
869
|
+
/* @__PURE__ */ import_react16.default.createElement(import_react17.HugeiconsIcon, { icon: social.icon, size: 18 }),
|
|
870
|
+
/* @__PURE__ */ import_react16.default.createElement("span", { className: "text-[13px]" }, social.label)
|
|
1327
871
|
)))))))));
|
|
1328
872
|
};
|
|
1329
873
|
|
|
1330
874
|
// src/components/ManagedPricingBlock.tsx
|
|
1331
|
-
var
|
|
875
|
+
var import_react18 = __toESM(require("react"));
|
|
1332
876
|
var import_link5 = __toESM(require("next/link"));
|
|
1333
877
|
var import_image4 = __toESM(require("next/image"));
|
|
1334
|
-
var CheckIcon = ({ className = "" }) => /* @__PURE__ */
|
|
1335
|
-
var CrossIcon = ({ className = "" }) => /* @__PURE__ */
|
|
878
|
+
var CheckIcon = ({ className = "" }) => /* @__PURE__ */ import_react18.default.createElement("svg", { viewBox: "0 0 24 24", fill: "none", className: `w-4 h-4 shrink-0 ${className}`, xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ import_react18.default.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "black" }), /* @__PURE__ */ import_react18.default.createElement("path", { d: "M8 12L11 15L16 9", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
879
|
+
var CrossIcon = ({ className = "" }) => /* @__PURE__ */ import_react18.default.createElement("svg", { viewBox: "0 0 24 24", fill: "none", className: `w-4 h-4 shrink-0 ${className}`, xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ import_react18.default.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "#F5F5F5" }), /* @__PURE__ */ import_react18.default.createElement("path", { d: "M15 9L9 15M9 9l6 6", stroke: "#D4D4D4", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
1336
880
|
var ManagedPricingBlock = ({
|
|
1337
881
|
tagline,
|
|
1338
882
|
title,
|
|
1339
883
|
plans = [],
|
|
1340
884
|
tabs
|
|
1341
885
|
}) => {
|
|
1342
|
-
const [isAnimating, setIsAnimating] = (0,
|
|
1343
|
-
const [activeTabIndex, setActiveTabIndex] = (0,
|
|
1344
|
-
const titleRef = (0,
|
|
1345
|
-
(0,
|
|
886
|
+
const [isAnimating, setIsAnimating] = (0, import_react18.useState)(false);
|
|
887
|
+
const [activeTabIndex, setActiveTabIndex] = (0, import_react18.useState)(0);
|
|
888
|
+
const titleRef = (0, import_react18.useRef)(null);
|
|
889
|
+
(0, import_react18.useEffect)(() => {
|
|
1346
890
|
const observer = new IntersectionObserver(
|
|
1347
891
|
([entry]) => {
|
|
1348
892
|
if (entry.isIntersecting) {
|
|
@@ -1362,79 +906,79 @@ var ManagedPricingBlock = ({
|
|
|
1362
906
|
}, []);
|
|
1363
907
|
const hasTabs = tabs && tabs.length > 0;
|
|
1364
908
|
const currentPlans = hasTabs ? tabs[activeTabIndex].plans : plans;
|
|
1365
|
-
return /* @__PURE__ */
|
|
909
|
+
return /* @__PURE__ */ import_react18.default.createElement("div", { className: "grow pt-10 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "w-full max-w-5xl mx-auto flex flex-col items-center" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "w-full flex flex-col items-center text-center mb-10 sm:mb-12" }, tagline && /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-[9px] tracking-[0.4em] text-black block " }, tagline), /* @__PURE__ */ import_react18.default.createElement(
|
|
1366
910
|
"h1",
|
|
1367
911
|
{
|
|
1368
912
|
ref: titleRef,
|
|
1369
|
-
className: `text-2xl sm:text-3xl mt-3 text-
|
|
913
|
+
className: `text-2xl sm:text-3xl mt-3 text-black tracking-tight ${isAnimating ? "" : ""}`,
|
|
1370
914
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
1371
915
|
},
|
|
1372
916
|
title
|
|
1373
|
-
)), hasTabs && /* @__PURE__ */
|
|
917
|
+
)), hasTabs && /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center justify-center mb-8 sm:mb-10 w-full animate-in fade-in duration-300 px-2" }, /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center bg-white rounded-full p-1 sm:p-1.5 max-w-full overflow-x-auto custom-scrollbar" }, tabs.map((tab, idx) => {
|
|
1374
918
|
const isActive = activeTabIndex === idx;
|
|
1375
|
-
return /* @__PURE__ */
|
|
919
|
+
return /* @__PURE__ */ import_react18.default.createElement(
|
|
1376
920
|
"button",
|
|
1377
921
|
{
|
|
1378
922
|
key: idx,
|
|
1379
923
|
onClick: () => setActiveTabIndex(idx),
|
|
1380
|
-
className: `px-4 sm:px-6 py-1.5 sm:py-2 rounded-full text-[11px] sm:text-xs transition-all duration-200 outline-none whitespace-nowrap shrink-0 ${isActive ? "bg-neutral-
|
|
924
|
+
className: `px-4 sm:px-6 py-1.5 sm:py-2 rounded-full text-[11px] sm:text-xs transition-all duration-200 outline-none whitespace-nowrap shrink-0 ${isActive ? "bg-neutral-50 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50/50 "}`
|
|
1381
925
|
},
|
|
1382
926
|
tab.label
|
|
1383
927
|
);
|
|
1384
|
-
}))), /* @__PURE__ */
|
|
928
|
+
}))), /* @__PURE__ */ import_react18.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5 w-full max-w-3xl animate-in slide-in-from-bottom-2 fade-in duration-500" }, currentPlans.map((plan, planIdx) => /* @__PURE__ */ import_react18.default.createElement(
|
|
1385
929
|
"div",
|
|
1386
930
|
{
|
|
1387
931
|
key: `${activeTabIndex}-${planIdx}`,
|
|
1388
|
-
className: `bg-
|
|
932
|
+
className: `bg-white rounded-3xl p-6 flex flex-col relative overflow-hidden transition-all duration-300 ${plan.isPremium ? "" : ""}`
|
|
1389
933
|
},
|
|
1390
|
-
/* @__PURE__ */
|
|
934
|
+
/* @__PURE__ */ import_react18.default.createElement("div", { className: "mb-6" }, /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-black text-base block mb-1" }, plan.name), /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ import_react18.default.createElement("h3", { className: "text-3xl font-light text-black" }, plan.price), plan.period && /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-xs text-neutral-500" }, plan.period)), /* @__PURE__ */ import_react18.default.createElement("p", { className: "text-xs text-neutral-500 mt-2 min-h-8" }, plan.description), plan.showApps && plan.appLogos && plan.appLogos.length > 0 && /* @__PURE__ */ import_react18.default.createElement("div", { className: "flex items-center gap-2 mt-4" }, plan.appLogos.map((logo, logoIdx) => /* @__PURE__ */ import_react18.default.createElement(
|
|
1391
935
|
"div",
|
|
1392
936
|
{
|
|
1393
937
|
key: logoIdx,
|
|
1394
938
|
className: "relative w-5 h-5 overflow-hidden flex items-center justify-center shrink-0"
|
|
1395
939
|
},
|
|
1396
|
-
/* @__PURE__ */
|
|
940
|
+
/* @__PURE__ */ import_react18.default.createElement(
|
|
1397
941
|
import_image4.default,
|
|
1398
942
|
{
|
|
1399
943
|
src: logo.src,
|
|
1400
944
|
alt: logo.alt,
|
|
1401
945
|
width: 16,
|
|
1402
946
|
height: 16,
|
|
1403
|
-
className: "object-contain
|
|
947
|
+
className: "object-contain"
|
|
1404
948
|
}
|
|
1405
949
|
)
|
|
1406
950
|
)))),
|
|
1407
|
-
plan.isPremium ? /* @__PURE__ */
|
|
951
|
+
plan.isPremium ? /* @__PURE__ */ import_react18.default.createElement(ThreeDButton, { href: plan.ctaHref, className: "mb-6 w-full" }, plan.ctaText) : /* @__PURE__ */ import_react18.default.createElement(
|
|
1408
952
|
import_link5.default,
|
|
1409
953
|
{
|
|
1410
954
|
href: plan.ctaHref,
|
|
1411
|
-
className: "w-full py-2
|
|
955
|
+
className: "w-full py-2 px-5 rounded-full border border-neutral-100 text-center text-black text-xs hover:bg-neutral-50 transition-colors mb-6 outline-none block"
|
|
1412
956
|
},
|
|
1413
957
|
plan.ctaText
|
|
1414
958
|
),
|
|
1415
|
-
/* @__PURE__ */
|
|
959
|
+
/* @__PURE__ */ import_react18.default.createElement("div", { className: "flex flex-col gap-3" }, plan.features.map((feature, featureIdx) => {
|
|
1416
960
|
const isAvailable = feature.value !== false;
|
|
1417
961
|
const valueText = typeof feature.value === "string" ? feature.value : "";
|
|
1418
|
-
return /* @__PURE__ */
|
|
962
|
+
return /* @__PURE__ */ import_react18.default.createElement("div", { key: featureIdx, className: "flex items-center gap-2.5 min-w-0" }, isAvailable ? /* @__PURE__ */ import_react18.default.createElement(CheckIcon, null) : /* @__PURE__ */ import_react18.default.createElement(CrossIcon, null), /* @__PURE__ */ import_react18.default.createElement("span", { className: `text-xs truncate ${isAvailable ? "text-neutral-800" : "text-neutral-400"}` }, feature.name, valueText && /* @__PURE__ */ import_react18.default.createElement("span", { className: "text-neutral-500 ml-1" }, "(", valueText, ")")));
|
|
1419
963
|
}))
|
|
1420
964
|
)))));
|
|
1421
965
|
};
|
|
1422
966
|
|
|
1423
967
|
// src/components/ManagedBoardBlock.tsx
|
|
1424
|
-
var
|
|
968
|
+
var import_react19 = __toESM(require("react"));
|
|
1425
969
|
var import_image5 = __toESM(require("next/image"));
|
|
1426
|
-
var
|
|
970
|
+
var import_react20 = require("@hugeicons/react");
|
|
1427
971
|
var import_core_free_icons3 = require("@hugeicons/core-free-icons");
|
|
1428
|
-
var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */
|
|
972
|
+
var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */ import_react19.default.createElement(
|
|
1429
973
|
"a",
|
|
1430
974
|
{
|
|
1431
975
|
href,
|
|
1432
976
|
target: "_blank",
|
|
1433
977
|
rel: "noopener noreferrer",
|
|
1434
|
-
className: "text-neutral-
|
|
978
|
+
className: "text-neutral-400 hover:text-black transition-colors",
|
|
1435
979
|
"aria-label": `${name} on ${label}`
|
|
1436
980
|
},
|
|
1437
|
-
/* @__PURE__ */
|
|
981
|
+
/* @__PURE__ */ import_react19.default.createElement(import_react20.HugeiconsIcon, { icon, size: 16 })
|
|
1438
982
|
);
|
|
1439
983
|
var ManagedBoardBlock = ({
|
|
1440
984
|
tagline,
|
|
@@ -1443,7 +987,7 @@ var ManagedBoardBlock = ({
|
|
|
1443
987
|
contactText,
|
|
1444
988
|
contactEmail
|
|
1445
989
|
}) => {
|
|
1446
|
-
return /* @__PURE__ */
|
|
990
|
+
return /* @__PURE__ */ import_react19.default.createElement("div", { className: "grow pt-28 pb-20 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative w-full mx-auto overflow-hidden max-w-7xl" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
1447
991
|
"div",
|
|
1448
992
|
{
|
|
1449
993
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -1452,7 +996,7 @@ var ManagedBoardBlock = ({
|
|
|
1452
996
|
backgroundRepeat: "repeat"
|
|
1453
997
|
}
|
|
1454
998
|
}
|
|
1455
|
-
), /* @__PURE__ */
|
|
999
|
+
), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ import_react19.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ import_react19.default.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative px-5 md:px-12 py-4 md:py-8" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5 md:gap-8" }, members.map((member, idx) => /* @__PURE__ */ import_react19.default.createElement("div", { key: idx, className: "relative p-6 md:p-8 rounded-2xl bg-white flex flex-col transition-all group" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex items-start space-x-4 md:space-x-5 mb-5 md:mb-6" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative w-14 h-14 md:w-16 md:h-16 shrink-0 bg-white overflow-hidden rounded-xl" }, /* @__PURE__ */ import_react19.default.createElement(
|
|
1456
1000
|
import_image5.default,
|
|
1457
1001
|
{
|
|
1458
1002
|
src: member.imageSrc,
|
|
@@ -1461,7 +1005,7 @@ var ManagedBoardBlock = ({
|
|
|
1461
1005
|
sizes: "(max-width: 768px) 56px, 64px",
|
|
1462
1006
|
className: "object-cover grayscale opacity-100 transition-opacity"
|
|
1463
1007
|
}
|
|
1464
|
-
)), /* @__PURE__ */
|
|
1008
|
+
)), /* @__PURE__ */ import_react19.default.createElement("div", { className: "pt-1" }, /* @__PURE__ */ import_react19.default.createElement("h3", { className: " text-[14px] md:text-[15px] text-black tracking-tight" }, member.name), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-500 mt-1.5 " }, member.title))), /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 text-left grow mb-8" }, member.bio), /* @__PURE__ */ import_react19.default.createElement("div", { className: "space-y-6 mt-auto" }, /* @__PURE__ */ import_react19.default.createElement("div", { className: "w-full *:w-full" }, /* @__PURE__ */ import_react19.default.createElement(ThreeDButton, { href: member.website }, "Visit Website")), /* @__PURE__ */ import_react19.default.createElement("div", { className: "flex space-x-4 pt-5" }, member.twitterHandle && member.twitterHandle.length > 0 && /* @__PURE__ */ import_react19.default.createElement(
|
|
1465
1009
|
MemberSocialLink,
|
|
1466
1010
|
{
|
|
1467
1011
|
href: `https://x.com/${member.twitterHandle}`,
|
|
@@ -1469,7 +1013,7 @@ var ManagedBoardBlock = ({
|
|
|
1469
1013
|
label: "X",
|
|
1470
1014
|
name: member.name
|
|
1471
1015
|
}
|
|
1472
|
-
), member.linkedinHandle && member.linkedinHandle.length > 0 && /* @__PURE__ */
|
|
1016
|
+
), member.linkedinHandle && member.linkedinHandle.length > 0 && /* @__PURE__ */ import_react19.default.createElement(
|
|
1473
1017
|
MemberSocialLink,
|
|
1474
1018
|
{
|
|
1475
1019
|
href: member.linkedinHandle,
|
|
@@ -1477,39 +1021,29 @@ var ManagedBoardBlock = ({
|
|
|
1477
1021
|
label: "LinkedIn",
|
|
1478
1022
|
name: member.name
|
|
1479
1023
|
}
|
|
1480
|
-
))))))), (contactText || contactEmail) && /* @__PURE__ */
|
|
1024
|
+
))))))), (contactText || contactEmail) && /* @__PURE__ */ import_react19.default.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10 pb-12 md:pb-14" }, /* @__PURE__ */ import_react19.default.createElement("p", { className: "text-[11px] text-neutral-600 text-left" }, contactText, contactEmail && /* @__PURE__ */ import_react19.default.createElement("a", { href: `mailto:${contactEmail}`, className: "text-black decoration-black decoration-2 underline-offset-4 ml-1 transition-colors" }, contactEmail))))));
|
|
1481
1025
|
};
|
|
1482
1026
|
|
|
1483
1027
|
// src/components/ManagedNotFoundBlock.tsx
|
|
1484
|
-
var
|
|
1485
|
-
var import_link6 = __toESM(require("next/link"));
|
|
1028
|
+
var import_react21 = __toESM(require("react"));
|
|
1486
1029
|
var ManagedNotFoundBlock = ({
|
|
1487
1030
|
title = "404 - Page Not Found",
|
|
1488
|
-
description = "The page you are looking for does not exist or has been moved."
|
|
1489
|
-
backLinkText = "Go back to Homepage",
|
|
1490
|
-
backLinkHref = "/"
|
|
1031
|
+
description = "The page you are looking for does not exist or has been moved."
|
|
1491
1032
|
}) => {
|
|
1492
|
-
return /* @__PURE__ */
|
|
1033
|
+
return /* @__PURE__ */ import_react21.default.createElement("main", { className: "min-h-screen flex items-center justify-center relative z-20 bg-transparent" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "p-6 w-full max-w-md mx-auto text-center" }, /* @__PURE__ */ import_react21.default.createElement("div", { className: "mb-8 flex justify-center" }, /* @__PURE__ */ import_react21.default.createElement(
|
|
1493
1034
|
"svg",
|
|
1494
1035
|
{
|
|
1495
1036
|
xmlns: "http://www.w3.org/2000/svg",
|
|
1496
1037
|
viewBox: "0 0 24 24",
|
|
1497
|
-
className: "w-12 h-12 fill-neutral-
|
|
1038
|
+
className: "w-12 h-12 fill-neutral-100"
|
|
1498
1039
|
},
|
|
1499
|
-
/* @__PURE__ */
|
|
1500
|
-
)), /* @__PURE__ */
|
|
1501
|
-
import_link6.default,
|
|
1502
|
-
{
|
|
1503
|
-
href: backLinkHref,
|
|
1504
|
-
className: "inline-flex items-center justify-center px-8 py-2.5 border border-neutral-800 text-white transition-colors rounded-full text-[11px] tracking-widest outline-none"
|
|
1505
|
-
},
|
|
1506
|
-
backLinkText
|
|
1507
|
-
)));
|
|
1040
|
+
/* @__PURE__ */ import_react21.default.createElement("path", { fillRule: "evenodd", d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z", clipRule: "evenodd" })
|
|
1041
|
+
)), /* @__PURE__ */ import_react21.default.createElement("h1", { className: " text-xl md:text-3xl text-black tracking-tight mb-4" }, title), /* @__PURE__ */ import_react21.default.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 mb-12" }, description)));
|
|
1508
1042
|
};
|
|
1509
1043
|
|
|
1510
1044
|
// src/components/PageSpinner.tsx
|
|
1511
|
-
var
|
|
1512
|
-
var
|
|
1045
|
+
var import_react22 = __toESM(require("react"));
|
|
1046
|
+
var import_react23 = require("@hugeicons/react");
|
|
1513
1047
|
var import_core_free_icons4 = require("@hugeicons/core-free-icons");
|
|
1514
1048
|
var PageSpinner = ({
|
|
1515
1049
|
className = "",
|
|
@@ -1518,23 +1052,23 @@ var PageSpinner = ({
|
|
|
1518
1052
|
}) => {
|
|
1519
1053
|
return (
|
|
1520
1054
|
// z-[100] ensures it sits above absolute headers and modals
|
|
1521
|
-
/* @__PURE__ */
|
|
1522
|
-
|
|
1055
|
+
/* @__PURE__ */ import_react22.default.createElement("div", { className: `fixed inset-0 z-100 flex flex-col items-center justify-center w-full h-full pointer-events-none ${className}` }, /* @__PURE__ */ import_react22.default.createElement(
|
|
1056
|
+
import_react23.HugeiconsIcon,
|
|
1523
1057
|
{
|
|
1524
1058
|
icon: import_core_free_icons4.Loading03Icon,
|
|
1525
1059
|
size,
|
|
1526
|
-
className: `animate-spin
|
|
1060
|
+
className: `animate-spin mb-4 ${iconClassName}`
|
|
1527
1061
|
}
|
|
1528
1062
|
))
|
|
1529
1063
|
);
|
|
1530
1064
|
};
|
|
1531
1065
|
|
|
1532
1066
|
// src/components/ManagedToaster.tsx
|
|
1533
|
-
var
|
|
1534
|
-
var
|
|
1067
|
+
var import_react24 = __toESM(require("react"));
|
|
1068
|
+
var import_react_hot_toast = require("react-hot-toast");
|
|
1535
1069
|
var ManagedToaster = () => {
|
|
1536
|
-
return /* @__PURE__ */
|
|
1537
|
-
|
|
1070
|
+
return /* @__PURE__ */ import_react24.default.createElement(
|
|
1071
|
+
import_react_hot_toast.Toaster,
|
|
1538
1072
|
{
|
|
1539
1073
|
position: "top-right",
|
|
1540
1074
|
toastOptions: {
|
|
@@ -1565,7 +1099,7 @@ var ManagedToaster = () => {
|
|
|
1565
1099
|
};
|
|
1566
1100
|
|
|
1567
1101
|
// src/components/ManagedNewsletterSplitBlock.tsx
|
|
1568
|
-
var
|
|
1102
|
+
var import_react25 = __toESM(require("react"));
|
|
1569
1103
|
var import_image6 = __toESM(require("next/image"));
|
|
1570
1104
|
var ManagedNewsletterSplitBlock = ({
|
|
1571
1105
|
tagline,
|
|
@@ -1579,7 +1113,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
1579
1113
|
ctaHref = "/contact-us",
|
|
1580
1114
|
children
|
|
1581
1115
|
}) => {
|
|
1582
|
-
return /* @__PURE__ */
|
|
1116
|
+
return /* @__PURE__ */ import_react25.default.createElement("div", { className: "grow flex flex-col md:flex-row relative w-full pt-32 md:pt-0" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "hidden md:block md:w-1/2 relative min-h-screen overflow-hidden" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
1583
1117
|
import_image6.default,
|
|
1584
1118
|
{
|
|
1585
1119
|
src: imageSrc,
|
|
@@ -1589,23 +1123,23 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
1589
1123
|
className: "object-cover object-top grayscale opacity-60",
|
|
1590
1124
|
quality: 100
|
|
1591
1125
|
}
|
|
1592
|
-
), /* @__PURE__ */
|
|
1126
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1593
1127
|
"div",
|
|
1594
1128
|
{
|
|
1595
1129
|
className: "absolute inset-0 z-10 pointer-events-none",
|
|
1596
1130
|
style: {
|
|
1597
|
-
background: "linear-gradient(to right, rgba(
|
|
1131
|
+
background: "linear-gradient(to right, rgba(255,255,255,0) 30%, #ffffff 100%)"
|
|
1598
1132
|
}
|
|
1599
1133
|
}
|
|
1600
|
-
), /* @__PURE__ */
|
|
1134
|
+
), /* @__PURE__ */ import_react25.default.createElement(
|
|
1601
1135
|
"div",
|
|
1602
1136
|
{
|
|
1603
1137
|
className: "absolute inset-x-0 bottom-0 h-40 z-10 pointer-events-none",
|
|
1604
1138
|
style: {
|
|
1605
|
-
background: "linear-gradient(to bottom, rgba(
|
|
1139
|
+
background: "linear-gradient(to bottom, rgba(255,255,255,0) 0%, #ffffff 100%)"
|
|
1606
1140
|
}
|
|
1607
1141
|
}
|
|
1608
|
-
)), /* @__PURE__ */
|
|
1142
|
+
)), /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-full md:w-1/2 flex mt-22 flex-col items-center justify-center p-4 md:p-12 relative z-20" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "relative w-full max-w-lg p-8 md:p-12 text-center md:text-left transition-all duration-700 ease-out" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
1609
1143
|
"div",
|
|
1610
1144
|
{
|
|
1611
1145
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -1614,18 +1148,18 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
1614
1148
|
backgroundRepeat: "repeat"
|
|
1615
1149
|
}
|
|
1616
1150
|
}
|
|
1617
|
-
), /* @__PURE__ */
|
|
1151
|
+
), /* @__PURE__ */ import_react25.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "mb-10 border-b border-neutral-100 pb-8 text-center md:text-left" }, tagline && /* @__PURE__ */ import_react25.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 " }, tagline), /* @__PURE__ */ import_react25.default.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight mb-4" }, title), subtitle && /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-500 " }, subtitle)), /* @__PURE__ */ import_react25.default.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 mb-10 text-center md:text-left" }, description), children && /* @__PURE__ */ import_react25.default.createElement("div", { className: "mb-8 text-left" }, children), /* @__PURE__ */ import_react25.default.createElement("div", { className: "text-center md:text-left mt-10 space-y-6" }, dividerText && /* @__PURE__ */ import_react25.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react25.default.createElement("div", { className: "grow h-px bg-neutral-100" }), /* @__PURE__ */ import_react25.default.createElement("span", { className: "shrink mx-4 text-[11px] tracking-[0.2em] text-neutral-400 " }, dividerText), /* @__PURE__ */ import_react25.default.createElement("div", { className: "grow h-px bg-neutral-100" })), ctaText && ctaHref && /* @__PURE__ */ import_react25.default.createElement("div", { className: "w-full *:w-full" }, /* @__PURE__ */ import_react25.default.createElement(
|
|
1618
1152
|
ThreeDButton,
|
|
1619
1153
|
{
|
|
1620
1154
|
href: ctaHref,
|
|
1621
|
-
className: "py-
|
|
1155
|
+
className: "py-3 tracking-widest text-[11px]"
|
|
1622
1156
|
},
|
|
1623
1157
|
ctaText
|
|
1624
1158
|
)))))));
|
|
1625
1159
|
};
|
|
1626
1160
|
|
|
1627
1161
|
// src/components/ReusableInputs.tsx
|
|
1628
|
-
var
|
|
1162
|
+
var import_react26 = __toESM(require("react"));
|
|
1629
1163
|
var TextInput = ({
|
|
1630
1164
|
label,
|
|
1631
1165
|
value,
|
|
@@ -1636,7 +1170,7 @@ var TextInput = ({
|
|
|
1636
1170
|
readOnly,
|
|
1637
1171
|
type = "text",
|
|
1638
1172
|
onClick
|
|
1639
|
-
}) => /* @__PURE__ */
|
|
1173
|
+
}) => /* @__PURE__ */ import_react26.default.createElement("div", { className: "space-y-2 flex-1 w-full", onClick }, label && /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ import_react26.default.createElement(
|
|
1640
1174
|
"input",
|
|
1641
1175
|
{
|
|
1642
1176
|
type,
|
|
@@ -1647,7 +1181,7 @@ var TextInput = ({
|
|
|
1647
1181
|
readOnly,
|
|
1648
1182
|
autoComplete: "off",
|
|
1649
1183
|
spellCheck: "false",
|
|
1650
|
-
className: `w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-
|
|
1184
|
+
className: `w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-100 text-black transition-all outline-none focus:border-black disabled:opacity-50 ${readOnly ? "cursor-pointer" : ""}`
|
|
1651
1185
|
}
|
|
1652
1186
|
));
|
|
1653
1187
|
var NumberInput = ({
|
|
@@ -1657,7 +1191,7 @@ var NumberInput = ({
|
|
|
1657
1191
|
placeholder,
|
|
1658
1192
|
maxLength,
|
|
1659
1193
|
disabled
|
|
1660
|
-
}) => /* @__PURE__ */
|
|
1194
|
+
}) => /* @__PURE__ */ import_react26.default.createElement("div", { className: "space-y-2 flex-1 w-full" }, label && /* @__PURE__ */ import_react26.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ import_react26.default.createElement(
|
|
1661
1195
|
"input",
|
|
1662
1196
|
{
|
|
1663
1197
|
type: "text",
|
|
@@ -1670,19 +1204,19 @@ var NumberInput = ({
|
|
|
1670
1204
|
disabled,
|
|
1671
1205
|
autoComplete: "off",
|
|
1672
1206
|
spellCheck: "false",
|
|
1673
|
-
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-
|
|
1207
|
+
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-100 text-black transition-all outline-none focus:border-black disabled:opacity-50"
|
|
1674
1208
|
}
|
|
1675
1209
|
));
|
|
1676
1210
|
|
|
1677
1211
|
// src/components/PortfolioHero.tsx
|
|
1678
|
-
var
|
|
1679
|
-
var
|
|
1212
|
+
var import_react27 = __toESM(require("react"));
|
|
1213
|
+
var import_link6 = __toESM(require("next/link"));
|
|
1680
1214
|
var import_image7 = __toESM(require("next/image"));
|
|
1681
|
-
var
|
|
1215
|
+
var import_react28 = require("@hugeicons/react");
|
|
1682
1216
|
var import_core_free_icons5 = require("@hugeicons/core-free-icons");
|
|
1683
1217
|
var useScrollAnimation = () => {
|
|
1684
|
-
const elementRef = (0,
|
|
1685
|
-
(0,
|
|
1218
|
+
const elementRef = (0, import_react27.useRef)(null);
|
|
1219
|
+
(0, import_react27.useEffect)(() => {
|
|
1686
1220
|
const el = elementRef.current;
|
|
1687
1221
|
if (!el) return;
|
|
1688
1222
|
const observer = new IntersectionObserver(
|
|
@@ -1718,13 +1252,13 @@ var PortfolioHero = ({
|
|
|
1718
1252
|
secondaryCtaHref
|
|
1719
1253
|
}) => {
|
|
1720
1254
|
const heroContentRef = useScrollAnimation();
|
|
1721
|
-
return /* @__PURE__ */
|
|
1255
|
+
return /* @__PURE__ */ import_react27.default.createElement("section", { className: "pt-44 md:pt-52 pb-16 px-6 md:px-12 flex flex-col relative overflow-hidden z-10 w-full" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
1722
1256
|
"div",
|
|
1723
1257
|
{
|
|
1724
1258
|
ref: heroContentRef,
|
|
1725
1259
|
className: "w-full opacity-0 translate-y-5 transition-all duration-1000 ease-out relative z-10"
|
|
1726
1260
|
},
|
|
1727
|
-
/* @__PURE__ */
|
|
1261
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-5 sm:gap-8 mb-10" }, /* @__PURE__ */ import_react27.default.createElement("div", { className: "relative w-20 h-20 sm:w-32 sm:h-32 rounded-full overflow-hidden border border-neutral-100 shrink-0 shadow-sm" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
1728
1262
|
import_image7.default,
|
|
1729
1263
|
{
|
|
1730
1264
|
src: imageSrc,
|
|
@@ -1735,40 +1269,40 @@ var PortfolioHero = ({
|
|
|
1735
1269
|
sizes: "(max-width: 640px) 80px, 128px",
|
|
1736
1270
|
quality: 100
|
|
1737
1271
|
}
|
|
1738
|
-
)), /* @__PURE__ */
|
|
1272
|
+
)), /* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col text-left" }, /* @__PURE__ */ import_react27.default.createElement("h1", { className: " text-3xl sm:text-5xl lg:text-6xl tracking-tight text-black leading-none mb-3" }, name), socialLabel && /* @__PURE__ */ import_react27.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 " }, socialLabel), socialLinkText && socialLinkHref && /* @__PURE__ */ import_react27.default.createElement(
|
|
1739
1273
|
"a",
|
|
1740
1274
|
{
|
|
1741
1275
|
href: socialLinkHref,
|
|
1742
1276
|
target: "_blank",
|
|
1743
1277
|
rel: "noopener noreferrer",
|
|
1744
|
-
className: "text-[11px] md:text-[14px] text-
|
|
1278
|
+
className: "text-[11px] md:text-[14px] text-black hover:text-neutral-500 transition-colors mt-1 underline underline-offset-4 decoration-neutral-300"
|
|
1745
1279
|
},
|
|
1746
1280
|
socialLinkText
|
|
1747
1281
|
))),
|
|
1748
|
-
/* @__PURE__ */
|
|
1749
|
-
/* @__PURE__ */
|
|
1282
|
+
/* @__PURE__ */ import_react27.default.createElement("p", { className: "text-[13px] leading-[1.8] max-w-4xl mb-12 text-neutral-600" }, bio),
|
|
1283
|
+
/* @__PURE__ */ import_react27.default.createElement("div", { className: "flex flex-col sm:flex-row gap-4 w-full sm:w-auto" }, primaryCtaText && primaryCtaHref && /* @__PURE__ */ import_react27.default.createElement("div", { className: "w-full sm:w-auto *:w-full" }, /* @__PURE__ */ import_react27.default.createElement(
|
|
1750
1284
|
ThreeDButton,
|
|
1751
1285
|
{
|
|
1752
1286
|
href: primaryCtaHref,
|
|
1753
|
-
className: "py-
|
|
1287
|
+
className: "py-3 tracking-widest text-[11px]"
|
|
1754
1288
|
},
|
|
1755
1289
|
primaryCtaText
|
|
1756
|
-
)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */
|
|
1757
|
-
|
|
1290
|
+
)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */ import_react27.default.createElement(
|
|
1291
|
+
import_link6.default,
|
|
1758
1292
|
{
|
|
1759
1293
|
href: secondaryCtaHref,
|
|
1760
|
-
className: "w-full sm:w-auto inline-flex items-center justify-center gap-3 text-[11px] tracking-[0.2em]
|
|
1294
|
+
className: "w-full sm:w-auto inline-flex items-center justify-center gap-3 text-[11px] tracking-[0.2em] rounded-full px-8 py-3.5 bg-neutral-200 transition-colors text-black hover:bg-neutral-200 outline-none"
|
|
1761
1295
|
},
|
|
1762
1296
|
secondaryCtaText,
|
|
1763
|
-
/* @__PURE__ */
|
|
1297
|
+
/* @__PURE__ */ import_react27.default.createElement(import_react28.HugeiconsIcon, { icon: import_core_free_icons5.ArrowRight01Icon, size: 16 })
|
|
1764
1298
|
))
|
|
1765
1299
|
));
|
|
1766
1300
|
};
|
|
1767
1301
|
|
|
1768
1302
|
// src/components/GifFeatureCard.tsx
|
|
1769
|
-
var
|
|
1303
|
+
var import_react29 = __toESM(require("react"));
|
|
1770
1304
|
var import_image8 = __toESM(require("next/image"));
|
|
1771
|
-
var
|
|
1305
|
+
var import_react30 = require("@hugeicons/react");
|
|
1772
1306
|
var import_core_free_icons6 = require("@hugeicons/core-free-icons");
|
|
1773
1307
|
var GifFeatureCard = ({
|
|
1774
1308
|
gifSrc,
|
|
@@ -1777,20 +1311,20 @@ var GifFeatureCard = ({
|
|
|
1777
1311
|
alt = "Feature animation",
|
|
1778
1312
|
className = "aspect-video"
|
|
1779
1313
|
}) => {
|
|
1780
|
-
const [isLoading, setIsLoading] = (0,
|
|
1781
|
-
return /* @__PURE__ */
|
|
1782
|
-
|
|
1314
|
+
const [isLoading, setIsLoading] = (0, import_react29.useState)(true);
|
|
1315
|
+
return /* @__PURE__ */ import_react29.default.createElement("div", { className: `relative w-full bg-black overflow-hidden shadow-2xl ${className}` }, isLoading && /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-black" }, /* @__PURE__ */ import_react29.default.createElement(
|
|
1316
|
+
import_react30.HugeiconsIcon,
|
|
1783
1317
|
{
|
|
1784
1318
|
icon: import_core_free_icons6.Loading03Icon,
|
|
1785
1319
|
size: 32,
|
|
1786
1320
|
className: "animate-spin text-white"
|
|
1787
1321
|
}
|
|
1788
|
-
)), /* @__PURE__ */
|
|
1322
|
+
)), /* @__PURE__ */ import_react29.default.createElement(
|
|
1789
1323
|
"div",
|
|
1790
1324
|
{
|
|
1791
1325
|
className: `absolute inset-0 z-0 transition-all duration-1000 ease-out ${isLoading ? "scale-105 blur-2xl opacity-0" : "scale-100 blur-0 opacity-100"}`
|
|
1792
1326
|
},
|
|
1793
|
-
/* @__PURE__ */
|
|
1327
|
+
/* @__PURE__ */ import_react29.default.createElement(
|
|
1794
1328
|
import_image8.default,
|
|
1795
1329
|
{
|
|
1796
1330
|
src: gifSrc,
|
|
@@ -1801,1171 +1335,16 @@ var GifFeatureCard = ({
|
|
|
1801
1335
|
className: "object-cover object-center pointer-events-none"
|
|
1802
1336
|
}
|
|
1803
1337
|
)
|
|
1804
|
-
), /* @__PURE__ */
|
|
1338
|
+
), /* @__PURE__ */ import_react29.default.createElement(
|
|
1805
1339
|
"div",
|
|
1806
1340
|
{
|
|
1807
1341
|
className: "absolute inset-x-0 bottom-0 h-1/2 sm:h-2/3 bg-linear-to-t from-black/95 via-black/40 to-transparent z-10 pointer-events-none transition-opacity duration-700"
|
|
1808
1342
|
}
|
|
1809
|
-
), /* @__PURE__ */
|
|
1810
|
-
};
|
|
1811
|
-
|
|
1812
|
-
// src/components/UniversalSidebar.tsx
|
|
1813
|
-
var import_react33 = __toESM(require("react"));
|
|
1814
|
-
var import_link8 = __toESM(require("next/link"));
|
|
1815
|
-
var import_react_hot_toast4 = __toESM(require("react-hot-toast"));
|
|
1816
|
-
var import_react34 = require("@hugeicons/react");
|
|
1817
|
-
var import_core_free_icons7 = require("@hugeicons/core-free-icons");
|
|
1818
|
-
var ButtonSpinner = () => /* @__PURE__ */ import_react33.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-500", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react33.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react33.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1819
|
-
var formatNotifDate = (d) => {
|
|
1820
|
-
const date = new Date(d);
|
|
1821
|
-
return date.toLocaleDateString("en-US", { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" });
|
|
1822
|
-
};
|
|
1823
|
-
var UniversalSidebar = ({
|
|
1824
|
-
navItems,
|
|
1825
|
-
currentPath,
|
|
1826
|
-
isMobileOpen,
|
|
1827
|
-
closeMobile,
|
|
1828
|
-
openMobile,
|
|
1829
|
-
onNavClick,
|
|
1830
|
-
userName = "Profile",
|
|
1831
|
-
userTag,
|
|
1832
|
-
userInitials = "U",
|
|
1833
|
-
web3Address,
|
|
1834
|
-
web3Avatar,
|
|
1835
|
-
notifications,
|
|
1836
|
-
unreadNotificationsCount = 0,
|
|
1837
|
-
notificationPage = 1,
|
|
1838
|
-
notificationTotalPages = 1,
|
|
1839
|
-
onNotificationPageChange,
|
|
1840
|
-
onNotificationClick,
|
|
1841
|
-
showBackButton = false,
|
|
1842
|
-
backUrl = "/app",
|
|
1843
|
-
showLogoutAction = false,
|
|
1844
|
-
onLogout,
|
|
1845
|
-
showInterceptDialog = false,
|
|
1846
|
-
onCancelIntercept,
|
|
1847
|
-
onConfirmIntercept,
|
|
1848
|
-
interceptTitle = "Discard Changes",
|
|
1849
|
-
interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
|
|
1850
|
-
}) => {
|
|
1851
|
-
const [isCollapsed, setIsCollapsed] = (0, import_react33.useState)(false);
|
|
1852
|
-
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react33.useState)(false);
|
|
1853
|
-
const [isLoggingOut, setIsLoggingOut] = (0, import_react33.useState)(false);
|
|
1854
|
-
const [showNotifDialog, setShowNotifDialog] = (0, import_react33.useState)(false);
|
|
1855
|
-
const [selectedNotif, setSelectedNotif] = (0, import_react33.useState)(null);
|
|
1856
|
-
(0, import_react33.useEffect)(() => {
|
|
1857
|
-
if (isMobileOpen) {
|
|
1858
|
-
closeMobile();
|
|
1859
|
-
}
|
|
1860
|
-
}, [currentPath]);
|
|
1861
|
-
const hasActiveMatch = navItems.some(
|
|
1862
|
-
(item) => item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`)
|
|
1863
|
-
);
|
|
1864
|
-
const handleLogoutInitiation = async () => {
|
|
1865
|
-
if (isLoggingOut || !onLogout) return;
|
|
1866
|
-
setIsLoggingOut(true);
|
|
1867
|
-
try {
|
|
1868
|
-
await onLogout();
|
|
1869
|
-
} catch (error) {
|
|
1870
|
-
setIsLoggingOut(false);
|
|
1871
|
-
setShowLogoutDialog(false);
|
|
1872
|
-
}
|
|
1873
|
-
};
|
|
1874
|
-
const handleCopyWallet = () => {
|
|
1875
|
-
if (web3Address) {
|
|
1876
|
-
navigator.clipboard.writeText(web3Address);
|
|
1877
|
-
import_react_hot_toast4.default.success("Address copied");
|
|
1878
|
-
}
|
|
1879
|
-
};
|
|
1880
|
-
const HeaderActions = () => /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex items-center gap-2 pointer-events-auto" }, web3Address && /* @__PURE__ */ import_react33.default.createElement(
|
|
1881
|
-
"div",
|
|
1882
|
-
{
|
|
1883
|
-
onClick: handleCopyWallet,
|
|
1884
|
-
className: "flex items-center gap-2 bg-neutral-900 rounded-full p-1 pr-3 cursor-pointer transition-colors",
|
|
1885
|
-
title: "Copy Address"
|
|
1886
|
-
},
|
|
1887
|
-
web3Avatar ? /* @__PURE__ */ import_react33.default.createElement("img", { src: web3Avatar, alt: "Avatar", className: "w-6 h-6 rounded-full bg-neutral-800 object-cover shrink-0" }) : /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-6 h-6 rounded-full bg-neutral-800 flex items-center justify-center text-[9px] text-white shrink-0" }, userInitials.substring(0, 2)),
|
|
1888
|
-
/* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[11px] text-white truncate max-w-20 sm:max-w-37.5" }, web3Address)
|
|
1889
|
-
), notifications !== void 0 && /* @__PURE__ */ import_react33.default.createElement(
|
|
1890
|
-
"button",
|
|
1891
|
-
{
|
|
1892
|
-
onClick: () => {
|
|
1893
|
-
setShowNotifDialog(true);
|
|
1894
|
-
setSelectedNotif(null);
|
|
1895
|
-
},
|
|
1896
|
-
className: "relative w-8 h-8 shrink-0 bg-neutral-900 rounded-full flex items-center justify-center text-neutral-400 hover:text-white transition-all duration-300 outline-none"
|
|
1897
|
-
},
|
|
1898
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.Notification01Icon, size: 14 }),
|
|
1899
|
-
unreadNotificationsCount > 0 && /* @__PURE__ */ import_react33.default.createElement("span", { className: "absolute top-2 right-2.5 w-2 h-2 bg-blue-500 rounded-full border border-neutral-900" })
|
|
1900
|
-
), showBackButton && /* @__PURE__ */ import_react33.default.createElement(
|
|
1901
|
-
import_link8.default,
|
|
1902
|
-
{
|
|
1903
|
-
href: backUrl,
|
|
1904
|
-
className: "w-10 h-10 shrink-0 bg-neutral-900 rounded-full flex items-center justify-center text-neutral-400 hover:text-white transition-all duration-300 outline-none",
|
|
1905
|
-
"aria-label": "Go Back"
|
|
1906
|
-
},
|
|
1907
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.ArrowLeft01Icon, size: 18 })
|
|
1908
|
-
));
|
|
1909
|
-
return /* @__PURE__ */ import_react33.default.createElement(import_react33.default.Fragment, null, /* @__PURE__ */ import_react33.default.createElement("div", { className: "md:hidden fixed top-0 left-0 w-full h-16 bg-black/50 backdrop-blur-md z-40 flex items-center justify-between px-4 " }, /* @__PURE__ */ import_react33.default.createElement(
|
|
1910
|
-
"button",
|
|
1911
|
-
{
|
|
1912
|
-
onClick: openMobile,
|
|
1913
|
-
className: `w-10 h-10 bg-neutral-900 rounded-full flex items-center justify-center text-white transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
|
|
1914
|
-
"aria-label": "Open Menu"
|
|
1915
|
-
},
|
|
1916
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.SidebarLeft01Icon, size: 18 })
|
|
1917
|
-
), /* @__PURE__ */ import_react33.default.createElement(HeaderActions, null)), /* @__PURE__ */ import_react33.default.createElement("div", { className: "hidden md:flex fixed top-0 right-0 w-full backdrop-blur-sm justify-end px-8 pt-6 pb-4 bg-transparent z-40 pointer-events-none" }, /* @__PURE__ */ import_react33.default.createElement(HeaderActions, null)), /* @__PURE__ */ import_react33.default.createElement(
|
|
1918
|
-
"div",
|
|
1919
|
-
{
|
|
1920
|
-
className: `fixed inset-0 bg-black/60 shadow-2xl transition-opacity duration-300 md:hidden z-90 ${isMobileOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
|
|
1921
|
-
onClick: closeMobile
|
|
1922
|
-
}
|
|
1923
|
-
), /* @__PURE__ */ import_react33.default.createElement(
|
|
1924
|
-
"aside",
|
|
1925
|
-
{
|
|
1926
|
-
className: `
|
|
1927
|
-
fixed md:relative rounded-2xl top-4 md:top-0 md:my-4 left-4 md:left-0 md:ml-4 h-[calc(100dvh-2rem)] bg-neutral-900
|
|
1928
|
-
transition-all duration-300 ease-in-out shrink-0 flex flex-col z-100 md:z-50
|
|
1929
|
-
${isMobileOpen ? "translate-x-0" : "translate-x-[-120%] md:translate-x-0"}
|
|
1930
|
-
${isCollapsed ? "md:w-16 w-64" : "w-64"}
|
|
1931
|
-
`
|
|
1932
|
-
},
|
|
1933
|
-
/* @__PURE__ */ import_react33.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center min-h-18" : "justify-between"}` }, /* @__PURE__ */ import_react33.default.createElement("div", { className: `flex items-center gap-3 text-left ${!isCollapsed || isMobileOpen ? "w-full" : ""}` }, /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-9 h-9 border border-neutral-700 rounded-full flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react33.default.createElement("h3", { className: "text-[10px] text-white tracking-wider" }, userInitials.substring(0, 2))), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex flex-col justify-center min-w-0 pr-2 flex-1" }, /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[13px] text-white leading-none truncate tracking-wide mb-1" }, userName), userTag && /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none " }, userTag))), /* @__PURE__ */ import_react33.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
1934
|
-
"button",
|
|
1935
|
-
{
|
|
1936
|
-
onClick: closeMobile,
|
|
1937
|
-
className: "text-neutral-500 hover:text-white transition-colors outline-none",
|
|
1938
|
-
"aria-label": "Close Menu"
|
|
1939
|
-
},
|
|
1940
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.CancelCircleIcon, size: 20 })
|
|
1941
|
-
))),
|
|
1942
|
-
/* @__PURE__ */ import_react33.default.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar mt-2" }, navItems.map((item, index) => {
|
|
1943
|
-
const isExactOrSubMatch = item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
|
|
1944
|
-
const isCurrentRoute = isExactOrSubMatch || !hasActiveMatch && index === 0;
|
|
1945
|
-
return /* @__PURE__ */ import_react33.default.createElement(
|
|
1946
|
-
import_link8.default,
|
|
1947
|
-
{
|
|
1948
|
-
key: item.name,
|
|
1949
|
-
href: item.path,
|
|
1950
|
-
onClick: (e) => onNavClick ? onNavClick(e, item.path) : void 0,
|
|
1951
|
-
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group shrink-0 ${isCurrentRoute ? "bg-neutral-800 text-white" : "text-neutral-400 hover:text-white /50"}`,
|
|
1952
|
-
title: isCollapsed && !isMobileOpen ? item.name : void 0
|
|
1953
|
-
},
|
|
1954
|
-
/* @__PURE__ */ import_react33.default.createElement(
|
|
1955
|
-
import_react34.HugeiconsIcon,
|
|
1956
|
-
{
|
|
1957
|
-
icon: item.icon,
|
|
1958
|
-
size: 18,
|
|
1959
|
-
className: `shrink-0 transition-colors ${isCurrentRoute ? "text-white" : "text-neutral-500 group-hover:text-white"}`
|
|
1960
|
-
}
|
|
1961
|
-
),
|
|
1962
|
-
(!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-xs tracking-wide truncate" }, item.name)
|
|
1963
|
-
);
|
|
1964
|
-
})),
|
|
1965
|
-
/* @__PURE__ */ import_react33.default.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2" }, showLogoutAction && /* @__PURE__ */ import_react33.default.createElement("div", { className: `flex gap-2 px-1 pb-2 ${isCollapsed && !isMobileOpen ? "flex-col items-center" : "items-center"}` }, /* @__PURE__ */ import_react33.default.createElement(
|
|
1966
|
-
"button",
|
|
1967
|
-
{
|
|
1968
|
-
onClick: () => setShowLogoutDialog(true),
|
|
1969
|
-
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-800 flex items-center justify-center text-neutral-400 hover:text-white transition-all outline-none",
|
|
1970
|
-
title: "Secure Logout"
|
|
1971
|
-
},
|
|
1972
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.LogoutCircle02Icon, size: 16 })
|
|
1973
|
-
)), /* @__PURE__ */ import_react33.default.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
1974
|
-
"button",
|
|
1975
|
-
{
|
|
1976
|
-
onClick: () => setIsCollapsed(!isCollapsed),
|
|
1977
|
-
className: "flex items-center justify-center md:justify-start gap-3 w-full p-2.5 rounded-full text-neutral-400 hover:text-white transition-colors outline-none"
|
|
1978
|
-
},
|
|
1979
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-500" }),
|
|
1980
|
-
!isCollapsed && /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-xs " }, "Collapse")
|
|
1981
|
-
)))
|
|
1982
|
-
), showNotifDialog && /* @__PURE__ */ import_react33.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react33.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: () => setShowNotifDialog(false) }), /* @__PURE__ */ import_react33.default.createElement("div", { className: "relative w-full max-w-sm bg-neutral-900 0 rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 h-[80vh] max-h-[80vh]" }, /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, selectedNotif ? /* @__PURE__ */ import_react33.default.createElement("button", { onClick: () => setSelectedNotif(null), className: "text-neutral-500 hover:text-white transition-colors outline-none flex items-center gap-2 text-[11px] tracking-widest " }, /* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.ArrowLeft01Icon, size: 14 }), " Back") : /* @__PURE__ */ import_react33.default.createElement("h3", { className: "text-[15px] text-white tracking-tight " }, "Notifications"), /* @__PURE__ */ import_react33.default.createElement("button", { onClick: () => setShowNotifDialog(false), className: "text-neutral-500 hover:text-white transition-colors outline-none" }, /* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2" }, selectedNotif ? /* @__PURE__ */ import_react33.default.createElement("div", { className: "p-4 text-left" }, /* @__PURE__ */ import_react33.default.createElement("h4", { className: "text-[14px] text-white mb-1" }, selectedNotif.title), /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[10px] text-neutral-500 tracking-widest mb-4 block" }, formatNotifDate(selectedNotif.createdAt)), /* @__PURE__ */ import_react33.default.createElement("p", { className: "text-[12px] text-neutral-400 leading-relaxed whitespace-pre-wrap" }, selectedNotif.message)) : /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex flex-col " }, notifications?.length === 0 ? /* @__PURE__ */ import_react33.default.createElement("div", { className: "p-8 text-center text-xs text-neutral-500" }, "You have no notifications.") : notifications?.map((notif) => /* @__PURE__ */ import_react33.default.createElement(
|
|
1983
|
-
"div",
|
|
1984
|
-
{
|
|
1985
|
-
key: notif.id,
|
|
1986
|
-
onClick: () => {
|
|
1987
|
-
setSelectedNotif(notif);
|
|
1988
|
-
onNotificationClick?.(notif);
|
|
1989
|
-
},
|
|
1990
|
-
className: "p-3 flex items-start gap-3 cursor-pointer transition-colors"
|
|
1991
|
-
},
|
|
1992
|
-
/* @__PURE__ */ import_react33.default.createElement("div", { className: "mt-1.5 shrink-0" }, !notif.isRead ? /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-1.5 h-1.5 bg-blue-500 rounded-full" }) : /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-1.5 h-1.5 bg-transparent" })),
|
|
1993
|
-
/* @__PURE__ */ import_react33.default.createElement("div", { className: "flex-1 min-w-0 text-left" }, /* @__PURE__ */ import_react33.default.createElement("h5", { className: `text-[12px] truncate ${notif.isRead ? "text-neutral-400" : "text-white"}` }, notif.title), /* @__PURE__ */ import_react33.default.createElement("p", { className: "text-[11px] text-neutral-500 truncate mt-0.5" }, notif.message), /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[9px] text-neutral-600 tracking-widest mt-2 block" }, formatNotifDate(notif.createdAt)))
|
|
1994
|
-
)))), !selectedNotif && /* @__PURE__ */ import_react33.default.createElement("div", { className: "p-4 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react33.default.createElement("span", { className: "text-[10px] text-neutral-500 tracking-widest " }, "Page ", notificationPage, " of ", notificationTotalPages === 0 ? 1 : notificationTotalPages), /* @__PURE__ */ import_react33.default.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
1995
|
-
"button",
|
|
1996
|
-
{
|
|
1997
|
-
disabled: notificationPage <= 1,
|
|
1998
|
-
onClick: () => onNotificationPageChange?.(notificationPage - 1),
|
|
1999
|
-
className: "w-7 h-7 flex items-center justify-center rounded-full border border-neutral-700 text-neutral-400 disabled:opacity-30 outline-none hover:text-white transition-colors"
|
|
2000
|
-
},
|
|
2001
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.ArrowLeft01Icon, size: 12 })
|
|
2002
|
-
), /* @__PURE__ */ import_react33.default.createElement(
|
|
2003
|
-
"button",
|
|
2004
|
-
{
|
|
2005
|
-
disabled: notificationPage >= notificationTotalPages || notificationTotalPages === 0,
|
|
2006
|
-
onClick: () => onNotificationPageChange?.(notificationPage + 1),
|
|
2007
|
-
className: "w-7 h-7 flex items-center justify-center rounded-full border border-neutral-700 text-neutral-400 disabled:opacity-30 outline-none hover:text-white transition-colors"
|
|
2008
|
-
},
|
|
2009
|
-
/* @__PURE__ */ import_react33.default.createElement(import_react34.HugeiconsIcon, { icon: import_core_free_icons7.ArrowRight01Icon, size: 12 })
|
|
2010
|
-
))))), showLogoutDialog && showLogoutAction && /* @__PURE__ */ import_react33.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
2011
|
-
"div",
|
|
2012
|
-
{
|
|
2013
|
-
className: "absolute inset-0 bg-black/60",
|
|
2014
|
-
onClick: () => !isLoggingOut && setShowLogoutDialog(false)
|
|
2015
|
-
}
|
|
2016
|
-
), /* @__PURE__ */ import_react33.default.createElement("div", { className: "relative w-72 bg-neutral-900 rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react33.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react33.default.createElement("h3", { className: "text-[17px] text-white tracking-tight mb-1" }, "Secure Logout"), /* @__PURE__ */ import_react33.default.createElement("p", { className: "text-[11px] text-neutral-400 leading-snug mt-2" }, "Are you sure you want to log out? You will need to authenticate to return.")), /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-full flex " }, /* @__PURE__ */ import_react33.default.createElement(
|
|
2017
|
-
"button",
|
|
2018
|
-
{
|
|
2019
|
-
onClick: () => setShowLogoutDialog(false),
|
|
2020
|
-
disabled: isLoggingOut,
|
|
2021
|
-
className: "flex-1 py-3 text-[13px] text-neutral-400 hover:text-white transition-colors disabled:opacity-50 outline-none"
|
|
2022
|
-
},
|
|
2023
|
-
"Cancel"
|
|
2024
|
-
), /* @__PURE__ */ import_react33.default.createElement(
|
|
2025
|
-
"button",
|
|
2026
|
-
{
|
|
2027
|
-
onClick: handleLogoutInitiation,
|
|
2028
|
-
disabled: isLoggingOut,
|
|
2029
|
-
className: "flex-1 py-3 text-[13px] text-red-400 hover:text-red-300 transition-colors disabled:opacity-50 flex justify-center items-center outline-none"
|
|
2030
|
-
},
|
|
2031
|
-
isLoggingOut ? /* @__PURE__ */ import_react33.default.createElement(ButtonSpinner, null) : "Log Out"
|
|
2032
|
-
)))), showInterceptDialog && /* @__PURE__ */ import_react33.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
2033
|
-
"div",
|
|
2034
|
-
{
|
|
2035
|
-
className: "absolute inset-0 bg-black/60",
|
|
2036
|
-
onClick: onCancelIntercept
|
|
2037
|
-
}
|
|
2038
|
-
), /* @__PURE__ */ import_react33.default.createElement("div", { className: "relative w-72 bg-neutral-900 rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react33.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react33.default.createElement("h3", { className: "text-[17px] text-white tracking-tight mb-1" }, interceptTitle), /* @__PURE__ */ import_react33.default.createElement("p", { className: "text-[11px] text-neutral-400 leading-snug mt-2" }, interceptMessage)), /* @__PURE__ */ import_react33.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react33.default.createElement(
|
|
2039
|
-
"button",
|
|
2040
|
-
{
|
|
2041
|
-
onClick: onCancelIntercept,
|
|
2042
|
-
className: "flex-1 py-3 text-[13px] text-neutral-400 hover:text-white transition-colors outline-none"
|
|
2043
|
-
},
|
|
2044
|
-
"Cancel"
|
|
2045
|
-
), /* @__PURE__ */ import_react33.default.createElement(
|
|
2046
|
-
"button",
|
|
2047
|
-
{
|
|
2048
|
-
onClick: onConfirmIntercept,
|
|
2049
|
-
className: "flex-1 py-3 text-[13px] text-white transition-colors flex justify-center items-center outline-none"
|
|
2050
|
-
},
|
|
2051
|
-
"Leave"
|
|
2052
|
-
)))));
|
|
2053
|
-
};
|
|
2054
|
-
|
|
2055
|
-
// src/components/UniversalOrganizationPage.tsx
|
|
2056
|
-
var import_react37 = __toESM(require("react"));
|
|
2057
|
-
var import_react_hot_toast5 = __toESM(require("react-hot-toast"));
|
|
2058
|
-
|
|
2059
|
-
// src/components/Banner.tsx
|
|
2060
|
-
var import_react35 = __toESM(require("react"));
|
|
2061
|
-
var import_react36 = require("@hugeicons/react");
|
|
2062
|
-
var import_core_free_icons8 = require("@hugeicons/core-free-icons");
|
|
2063
|
-
var Banner = ({
|
|
2064
|
-
title,
|
|
2065
|
-
message,
|
|
2066
|
-
type,
|
|
2067
|
-
icon,
|
|
2068
|
-
isDismissible = true,
|
|
2069
|
-
onDismiss,
|
|
2070
|
-
action
|
|
2071
|
-
}) => {
|
|
2072
|
-
const [isVisible, setIsVisible] = (0, import_react35.useState)(true);
|
|
2073
|
-
if (!isVisible) return null;
|
|
2074
|
-
const handleDismiss = () => {
|
|
2075
|
-
setIsVisible(false);
|
|
2076
|
-
if (onDismiss) onDismiss();
|
|
2077
|
-
};
|
|
2078
|
-
const config = {
|
|
2079
|
-
success: {
|
|
2080
|
-
bg: "bg-emerald-50",
|
|
2081
|
-
iconColor: "text-emerald-600",
|
|
2082
|
-
titleColor: "text-emerald-900",
|
|
2083
|
-
msgColor: "text-emerald-700",
|
|
2084
|
-
defaultIcon: import_core_free_icons8.CheckmarkBadge01Icon,
|
|
2085
|
-
closeHover: "hover:bg-emerald-100 text-emerald-500"
|
|
2086
|
-
},
|
|
2087
|
-
warning: {
|
|
2088
|
-
bg: "bg-amber-50",
|
|
2089
|
-
iconColor: "text-amber-600",
|
|
2090
|
-
titleColor: "text-amber-900",
|
|
2091
|
-
msgColor: "text-amber-700",
|
|
2092
|
-
defaultIcon: import_core_free_icons8.InformationCircleIcon,
|
|
2093
|
-
closeHover: "hover:bg-amber-100 text-amber-500"
|
|
2094
|
-
},
|
|
2095
|
-
alert: {
|
|
2096
|
-
bg: "bg-red-50",
|
|
2097
|
-
iconColor: "text-red-600",
|
|
2098
|
-
titleColor: "text-red-900",
|
|
2099
|
-
msgColor: "text-red-700",
|
|
2100
|
-
defaultIcon: import_core_free_icons8.Alert02Icon,
|
|
2101
|
-
closeHover: "hover:bg-red-100 text-red-500"
|
|
2102
|
-
}
|
|
2103
|
-
};
|
|
2104
|
-
const currentConfig = config[type];
|
|
2105
|
-
const IconToUse = icon || currentConfig.defaultIcon;
|
|
2106
|
-
return /* @__PURE__ */ import_react35.default.createElement("div", { className: `relative w-full rounded-2xl p-4 flex items-start gap-4 transition-all duration-300 animate-in fade-in slide-in-from-top-2 ${currentConfig.bg}` }, /* @__PURE__ */ import_react35.default.createElement("div", { className: "flex-1 flex flex-col min-w-0" }, /* @__PURE__ */ import_react35.default.createElement("h4", { className: `text-sm tracking-tight mb-1 ${currentConfig.titleColor}` }, title), /* @__PURE__ */ import_react35.default.createElement("p", { className: `text-xs leading-relaxed ${currentConfig.msgColor}` }, message), action && /* @__PURE__ */ import_react35.default.createElement("div", { className: "mt-3" }, action)), isDismissible && /* @__PURE__ */ import_react35.default.createElement(
|
|
2107
|
-
"button",
|
|
2108
|
-
{
|
|
2109
|
-
onClick: handleDismiss,
|
|
2110
|
-
className: `absolute top-3 right-3 p-1.5 rounded-full transition-colors outline-none shrink-0 ${currentConfig.closeHover}`,
|
|
2111
|
-
"aria-label": "Dismiss banner"
|
|
2112
|
-
},
|
|
2113
|
-
/* @__PURE__ */ import_react35.default.createElement(import_react36.HugeiconsIcon, { icon: import_core_free_icons8.Cancel01Icon, size: 16 })
|
|
2114
|
-
));
|
|
2115
|
-
};
|
|
2116
|
-
|
|
2117
|
-
// src/components/UniversalOrganizationPage.tsx
|
|
2118
|
-
var import_react38 = require("@hugeicons/react");
|
|
2119
|
-
var import_core_free_icons9 = require("@hugeicons/core-free-icons");
|
|
2120
|
-
var InputSpinner3 = () => /* @__PURE__ */ import_react37.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-500", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react37.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react37.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
2121
|
-
var UniversalOrganizationPage = ({
|
|
2122
|
-
initialOrgName,
|
|
2123
|
-
initialSlug,
|
|
2124
|
-
initialUsername,
|
|
2125
|
-
orgId,
|
|
2126
|
-
isReadOnly = false,
|
|
2127
|
-
slugPrefixUrl = ".aeona.eth",
|
|
2128
|
-
bannerProps,
|
|
2129
|
-
onSaveConfiguration,
|
|
2130
|
-
onCheckSlugAvailability
|
|
2131
|
-
}) => {
|
|
2132
|
-
const resolvedInitialUsername = initialUsername || initialSlug;
|
|
2133
|
-
const [web3Name, setWeb3Name] = (0, import_react37.useState)(initialOrgName);
|
|
2134
|
-
const [username, setUsername] = (0, import_react37.useState)(resolvedInitialUsername);
|
|
2135
|
-
const [slug, setSlug] = (0, import_react37.useState)(initialSlug);
|
|
2136
|
-
const [isCheckingSlug, setIsCheckingSlug] = (0, import_react37.useState)(false);
|
|
2137
|
-
const [slugAvailable, setSlugAvailable] = (0, import_react37.useState)(null);
|
|
2138
|
-
const [isSubmitting, setIsSubmitting] = (0, import_react37.useState)(false);
|
|
2139
|
-
(0, import_react37.useEffect)(() => {
|
|
2140
|
-
setWeb3Name(initialOrgName || "");
|
|
2141
|
-
setSlug(initialSlug || "");
|
|
2142
|
-
setUsername(initialUsername || initialSlug || "");
|
|
2143
|
-
}, [initialOrgName, initialSlug, initialUsername]);
|
|
2144
|
-
const handleWeb3NameChange = (val) => {
|
|
2145
|
-
setWeb3Name(val.replace(/[^a-zA-Z0-9\s-]/g, "").substring(0, 50));
|
|
2146
|
-
};
|
|
2147
|
-
const handleUsernameChange = (val) => {
|
|
2148
|
-
setUsername(val.toLowerCase().replace(/[^a-z0-9-]/g, "").substring(0, 30));
|
|
2149
|
-
};
|
|
2150
|
-
const handleSlugChange = (val) => {
|
|
2151
|
-
setSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
|
|
2152
|
-
};
|
|
2153
|
-
(0, import_react37.useEffect)(() => {
|
|
2154
|
-
if (!slug || slug === initialSlug) {
|
|
2155
|
-
setSlugAvailable(null);
|
|
2156
|
-
setIsCheckingSlug(false);
|
|
2157
|
-
return;
|
|
2158
|
-
}
|
|
2159
|
-
if (slug.length < 3) {
|
|
2160
|
-
setSlugAvailable(false);
|
|
2161
|
-
setIsCheckingSlug(false);
|
|
2162
|
-
return;
|
|
2163
|
-
}
|
|
2164
|
-
setIsCheckingSlug(true);
|
|
2165
|
-
setSlugAvailable(null);
|
|
2166
|
-
const checkTimer = setTimeout(async () => {
|
|
2167
|
-
try {
|
|
2168
|
-
const res = await onCheckSlugAvailability(slug);
|
|
2169
|
-
setSlugAvailable(res.available);
|
|
2170
|
-
} catch (error) {
|
|
2171
|
-
setSlugAvailable(null);
|
|
2172
|
-
} finally {
|
|
2173
|
-
setIsCheckingSlug(false);
|
|
2174
|
-
}
|
|
2175
|
-
}, 1500);
|
|
2176
|
-
return () => clearTimeout(checkTimer);
|
|
2177
|
-
}, [slug, initialSlug, onCheckSlugAvailability]);
|
|
2178
|
-
const handleSave = async (e) => {
|
|
2179
|
-
e.preventDefault();
|
|
2180
|
-
if (isSubmitting || isCheckingSlug || isReadOnly) return;
|
|
2181
|
-
if (slug !== initialSlug && slugAvailable === false) {
|
|
2182
|
-
import_react_hot_toast5.default.error("Please select an available profile address handles.");
|
|
2183
|
-
return;
|
|
2184
|
-
}
|
|
2185
|
-
setIsSubmitting(true);
|
|
2186
|
-
try {
|
|
2187
|
-
const payload = {
|
|
2188
|
-
organizationId: orgId,
|
|
2189
|
-
organizationName: web3Name !== initialOrgName ? web3Name : void 0,
|
|
2190
|
-
slug: slug !== initialSlug ? slug : void 0,
|
|
2191
|
-
username: username !== resolvedInitialUsername ? username : void 0
|
|
2192
|
-
};
|
|
2193
|
-
const responseData = await onSaveConfiguration(payload);
|
|
2194
|
-
if (responseData.success) {
|
|
2195
|
-
import_react_hot_toast5.default.success("Web3 profile identity updated successfully.");
|
|
2196
|
-
setTimeout(() => window.location.reload(), 1e3);
|
|
2197
|
-
} else {
|
|
2198
|
-
import_react_hot_toast5.default.error(responseData.error || "Failed to update your identity profile.");
|
|
2199
|
-
setIsSubmitting(false);
|
|
2200
|
-
}
|
|
2201
|
-
} catch (error) {
|
|
2202
|
-
import_react_hot_toast5.default.error("Service unavailable. Try again later.");
|
|
2203
|
-
setIsSubmitting(false);
|
|
2204
|
-
}
|
|
2205
|
-
};
|
|
2206
|
-
const hasChanges = web3Name !== initialOrgName || slug !== initialSlug || username !== resolvedInitialUsername;
|
|
2207
|
-
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || web3Name.length < 3 || slug.length < 3 || username.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
2208
|
-
return /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl rounded-2xl p-6 bg-neutral-900 fade-in duration-300" }, /* @__PURE__ */ import_react37.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react37.default.createElement("div", null, /* @__PURE__ */ import_react37.default.createElement("h1", { className: "text-white text-xl mb-1 tracking-tight" }, "Public Profile"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-xs text-neutral-400" }, "Manage your financial payment handle identifiers and global public cryptographic signature identity details.")), isReadOnly && /* @__PURE__ */ import_react37.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-800 text-neutral-400 rounded-full shrink-0" }, /* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CircleLock02Icon, size: 18, className: "text-current" }))), bannerProps && /* @__PURE__ */ import_react37.default.createElement(Banner, { ...bannerProps }), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react37.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
2209
|
-
TextInput,
|
|
2210
|
-
{
|
|
2211
|
-
label: "Display Name",
|
|
2212
|
-
value: web3Name,
|
|
2213
|
-
onChange: handleWeb3NameChange,
|
|
2214
|
-
disabled: isReadOnly || isSubmitting,
|
|
2215
|
-
placeholder: "Sovereign User",
|
|
2216
|
-
maxLength: 50
|
|
2217
|
-
}
|
|
2218
|
-
), /* @__PURE__ */ import_react37.default.createElement(
|
|
2219
|
-
TextInput,
|
|
2220
|
-
{
|
|
2221
|
-
label: "Digital Identity",
|
|
2222
|
-
value: username,
|
|
2223
|
-
onChange: handleUsernameChange,
|
|
2224
|
-
disabled: isReadOnly || isSubmitting,
|
|
2225
|
-
placeholder: "sovereignuser",
|
|
2226
|
-
maxLength: 30
|
|
2227
|
-
}
|
|
2228
|
-
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "space-y-2 relative w-full" }, /* @__PURE__ */ import_react37.default.createElement("label", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block" }, "Wallet Username"), /* @__PURE__ */ import_react37.default.createElement("div", { className: "flex items-center relative w-full border-b border-neutral-800 focus-within:border-white transition-all" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
2229
|
-
"input",
|
|
2230
|
-
{
|
|
2231
|
-
type: "text",
|
|
2232
|
-
value: slug,
|
|
2233
|
-
disabled: isReadOnly || isSubmitting,
|
|
2234
|
-
onChange: (e) => handleSlugChange(e.target.value),
|
|
2235
|
-
spellCheck: "false",
|
|
2236
|
-
autoComplete: "off",
|
|
2237
|
-
className: "w-full px-2 py-3 text-sm bg-transparent text-white outline-none disabled:opacity-50 disabled:cursor-not-allowed",
|
|
2238
|
-
placeholder: "sovereign-user-handle"
|
|
2239
|
-
}
|
|
2240
|
-
), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-neutral-500 text-sm py-3 pr-8 shrink-0 whitespace-nowrap" }, slugPrefixUrl), /* @__PURE__ */ import_react37.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react37.default.createElement(InputSpinner3, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react37.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-900/50" }, /* @__PURE__ */ import_react37.default.createElement("svg", { className: "w-2 h-2 text-red-500", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react37.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" }))), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react37.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-900/50" }, /* @__PURE__ */ import_react37.default.createElement("svg", { className: "w-2 h-2 text-green-500", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react37.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 10-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z" })))))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
2241
|
-
ThreeDActionButton,
|
|
2242
|
-
{
|
|
2243
|
-
type: "submit",
|
|
2244
|
-
disabled: isSaveDisabled,
|
|
2245
|
-
isLoading: isSubmitting,
|
|
2246
|
-
className: "min-w-32"
|
|
2247
|
-
},
|
|
2248
|
-
"Save Changes"
|
|
2249
|
-
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react37.default.createElement(
|
|
2250
|
-
"button",
|
|
2251
|
-
{
|
|
2252
|
-
type: "button",
|
|
2253
|
-
onClick: () => {
|
|
2254
|
-
setWeb3Name(initialOrgName);
|
|
2255
|
-
setSlug(initialSlug);
|
|
2256
|
-
setUsername(resolvedInitialUsername);
|
|
2257
|
-
},
|
|
2258
|
-
className: "text-[11px] tracking-widest text-neutral-500 hover:text-white transition-colors outline-none"
|
|
2259
|
-
},
|
|
2260
|
-
"Cancel"
|
|
2261
|
-
)))));
|
|
2262
|
-
};
|
|
2263
|
-
|
|
2264
|
-
// src/components/UniversalProfileSettings.tsx
|
|
2265
|
-
var import_react39 = __toESM(require("react"));
|
|
2266
|
-
var import_react_hot_toast6 = __toESM(require("react-hot-toast"));
|
|
2267
|
-
var import_react40 = require("@hugeicons/react");
|
|
2268
|
-
var import_core_free_icons10 = require("@hugeicons/core-free-icons");
|
|
2269
|
-
var UniversalProfileSettings = ({
|
|
2270
|
-
initialFirstName,
|
|
2271
|
-
initialLastName,
|
|
2272
|
-
email,
|
|
2273
|
-
accountStatus = "GOOD",
|
|
2274
|
-
memberSince,
|
|
2275
|
-
isReadOnly = false,
|
|
2276
|
-
bannerProps,
|
|
2277
|
-
hasPin = false,
|
|
2278
|
-
isPinLoading = false,
|
|
2279
|
-
onSavePin,
|
|
2280
|
-
onSaveProfile
|
|
2281
|
-
}) => {
|
|
2282
|
-
const [firstName, setFirstName] = (0, import_react39.useState)(initialFirstName);
|
|
2283
|
-
const [lastName, setLastName] = (0, import_react39.useState)(initialLastName);
|
|
2284
|
-
const [isSubmitting, setIsSubmitting] = (0, import_react39.useState)(false);
|
|
2285
|
-
const [isPinModalOpen, setIsPinModalOpen] = (0, import_react39.useState)(false);
|
|
2286
|
-
const [oldPin, setOldPin] = (0, import_react39.useState)("");
|
|
2287
|
-
const [newPin, setNewPin] = (0, import_react39.useState)("");
|
|
2288
|
-
const [confirmPin, setConfirmPin] = (0, import_react39.useState)("");
|
|
2289
|
-
const [isPinSubmitting, setIsPinSubmitting] = (0, import_react39.useState)(false);
|
|
2290
|
-
(0, import_react39.useEffect)(() => {
|
|
2291
|
-
setFirstName(initialFirstName || "");
|
|
2292
|
-
setLastName(initialLastName || "");
|
|
2293
|
-
}, [initialFirstName, initialLastName]);
|
|
2294
|
-
const handleFirstNameChange = (val) => {
|
|
2295
|
-
setFirstName(val.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50));
|
|
2296
|
-
};
|
|
2297
|
-
const handleLastNameChange = (val) => {
|
|
2298
|
-
setLastName(val.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50));
|
|
2299
|
-
};
|
|
2300
|
-
const handleSave = async (e) => {
|
|
2301
|
-
e.preventDefault();
|
|
2302
|
-
if (isSubmitting || isReadOnly) return;
|
|
2303
|
-
setIsSubmitting(true);
|
|
2304
|
-
try {
|
|
2305
|
-
const res = await onSaveProfile({ firstName, lastName });
|
|
2306
|
-
if (res.success) {
|
|
2307
|
-
import_react_hot_toast6.default.success("Profile updated successfully.");
|
|
2308
|
-
setTimeout(() => window.location.reload(), 1e3);
|
|
2309
|
-
} else {
|
|
2310
|
-
import_react_hot_toast6.default.error(res.error || "Uh oh! Something went wrong.");
|
|
2311
|
-
setIsSubmitting(false);
|
|
2312
|
-
}
|
|
2313
|
-
} catch (error) {
|
|
2314
|
-
import_react_hot_toast6.default.error("Uh oh! Something went wrong.");
|
|
2315
|
-
setIsSubmitting(false);
|
|
2316
|
-
}
|
|
2317
|
-
};
|
|
2318
|
-
const closePinModal = () => {
|
|
2319
|
-
if (isPinSubmitting) return;
|
|
2320
|
-
setIsPinModalOpen(false);
|
|
2321
|
-
setOldPin("");
|
|
2322
|
-
setNewPin("");
|
|
2323
|
-
setConfirmPin("");
|
|
2324
|
-
};
|
|
2325
|
-
const handlePinInput = (val, setter) => {
|
|
2326
|
-
setter(val.replace(/\D/g, "").substring(0, 4));
|
|
2327
|
-
};
|
|
2328
|
-
const handlePinSubmit = async (e) => {
|
|
2329
|
-
e.preventDefault();
|
|
2330
|
-
if (!onSavePin) return;
|
|
2331
|
-
if (hasPin && oldPin.length !== 4) return import_react_hot_toast6.default.error("Old PIN must be exactly 4 digits.");
|
|
2332
|
-
if (newPin.length !== 4) return import_react_hot_toast6.default.error("New PIN must be exactly 4 digits.");
|
|
2333
|
-
if (newPin !== confirmPin) return import_react_hot_toast6.default.error("New PINs do not match.");
|
|
2334
|
-
setIsPinSubmitting(true);
|
|
2335
|
-
try {
|
|
2336
|
-
const action = hasPin ? "change_pin" : "create_pin";
|
|
2337
|
-
const res = await onSavePin({
|
|
2338
|
-
action,
|
|
2339
|
-
oldPin: hasPin ? oldPin : void 0,
|
|
2340
|
-
newPin
|
|
2341
|
-
});
|
|
2342
|
-
if (res.success) {
|
|
2343
|
-
import_react_hot_toast6.default.success(res.message || "PIN updated successfully.");
|
|
2344
|
-
closePinModal();
|
|
2345
|
-
} else {
|
|
2346
|
-
import_react_hot_toast6.default.error(res.error || "Failed to update PIN.");
|
|
2347
|
-
}
|
|
2348
|
-
} catch (error) {
|
|
2349
|
-
import_react_hot_toast6.default.error("Uh oh! Something went wrong.");
|
|
2350
|
-
} finally {
|
|
2351
|
-
setIsPinSubmitting(false);
|
|
2352
|
-
}
|
|
2353
|
-
};
|
|
2354
|
-
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
2355
|
-
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
2356
|
-
return /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-neutral-900 gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react39.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react39.default.createElement("h1", { className: "text-white text-xl mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ import_react39.default.createElement("p", { className: "text-xs text-neutral-400 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ import_react39.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-800 text-neutral-400 rounded-full shrink-0" }, /* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.CircleLock02Icon, size: 18, className: "text-current" }))), bannerProps && /* @__PURE__ */ import_react39.default.createElement(Banner, { ...bannerProps }), /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react39.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
2357
|
-
TextInput,
|
|
2358
|
-
{
|
|
2359
|
-
label: "First Name",
|
|
2360
|
-
value: firstName,
|
|
2361
|
-
onChange: handleFirstNameChange,
|
|
2362
|
-
disabled: isReadOnly || isSubmitting,
|
|
2363
|
-
placeholder: "System"
|
|
2364
|
-
}
|
|
2365
|
-
)), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
2366
|
-
TextInput,
|
|
2367
|
-
{
|
|
2368
|
-
label: "Last Name",
|
|
2369
|
-
value: lastName,
|
|
2370
|
-
onChange: handleLastNameChange,
|
|
2371
|
-
disabled: isReadOnly || isSubmitting,
|
|
2372
|
-
placeholder: "Admin"
|
|
2373
|
-
}
|
|
2374
|
-
))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
2375
|
-
TextInput,
|
|
2376
|
-
{
|
|
2377
|
-
label: "Email ID",
|
|
2378
|
-
value: email,
|
|
2379
|
-
onChange: () => {
|
|
2380
|
-
},
|
|
2381
|
-
disabled: true
|
|
2382
|
-
}
|
|
2383
|
-
), /* @__PURE__ */ import_react39.default.createElement("p", { className: "text-[11px] text-neutral-500 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block truncate" }, "Account Status"), /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-xs text-white block truncate" }, accountStatus)), /* @__PURE__ */ import_react39.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[11px] text-neutral-500 tracking-[0.2em] block truncate" }, "Member Since"), /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-xs text-white block truncate" }, memberSince ? new Date(memberSince).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric" }) : "N/A")), /* @__PURE__ */ import_react39.default.createElement("div", { className: "min-w-0 pl-4" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
2384
|
-
"button",
|
|
2385
|
-
{
|
|
2386
|
-
type: "button",
|
|
2387
|
-
onClick: () => setIsPinModalOpen(true),
|
|
2388
|
-
"aria-label": "PIN Settings",
|
|
2389
|
-
className: "w-9 h-9 flex items-center justify-center border border-neutral-700 rounded-full text-white transition-colors outline-none"
|
|
2390
|
-
},
|
|
2391
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.LockKeyIcon, size: 17, className: "text-white" })
|
|
2392
|
-
))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col-reverse sm:flex-row items-center gap-3 sm:gap-4 w-full sm:w-auto shrink-0" }, hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react39.default.createElement(
|
|
2393
|
-
"button",
|
|
2394
|
-
{
|
|
2395
|
-
type: "button",
|
|
2396
|
-
onClick: () => {
|
|
2397
|
-
setFirstName(initialFirstName);
|
|
2398
|
-
setLastName(initialLastName);
|
|
2399
|
-
},
|
|
2400
|
-
className: "text-[11px] tracking-widest text-neutral-500 hover:text-white transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
2401
|
-
},
|
|
2402
|
-
"Cancel"
|
|
2403
|
-
), /* @__PURE__ */ import_react39.default.createElement(
|
|
2404
|
-
ThreeDActionButton,
|
|
2405
|
-
{
|
|
2406
|
-
type: "submit",
|
|
2407
|
-
disabled: isSaveDisabled,
|
|
2408
|
-
isLoading: isSubmitting,
|
|
2409
|
-
className: "min-w-32 w-full sm:w-auto"
|
|
2410
|
-
},
|
|
2411
|
-
"Save Changes"
|
|
2412
|
-
))))), isPinModalOpen && /* @__PURE__ */ import_react39.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: closePinModal }), /* @__PURE__ */ import_react39.default.createElement("div", { className: "relative w-full max-w-sm bg-neutral-900 rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ import_react39.default.createElement("h3", { className: "text-[15px] text-white tracking-tight" }, hasPin ? "Change PIN" : "Create PIN"), /* @__PURE__ */ import_react39.default.createElement("button", { onClick: closePinModal, disabled: isPinSubmitting, className: "text-neutral-500 hover:text-white transition-colors outline-none disabled:opacity-50" }, /* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "p-6" }, isPinLoading ? /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col items-center justify-center py-10" }, /* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.Loading03Icon, size: 28, className: "animate-spin text-neutral-500 mb-4" })) : /* @__PURE__ */ import_react39.default.createElement("form", { onSubmit: handlePinSubmit, className: "flex flex-col gap-6" }, hasPin && /* @__PURE__ */ import_react39.default.createElement(
|
|
2413
|
-
TextInput,
|
|
2414
|
-
{
|
|
2415
|
-
type: "password",
|
|
2416
|
-
label: "Old PIN",
|
|
2417
|
-
maxLength: 4,
|
|
2418
|
-
disabled: isPinSubmitting,
|
|
2419
|
-
value: oldPin,
|
|
2420
|
-
onChange: (val) => handlePinInput(val, setOldPin),
|
|
2421
|
-
placeholder: "\u2022\u2022\u2022\u2022"
|
|
2422
|
-
}
|
|
2423
|
-
), /* @__PURE__ */ import_react39.default.createElement(
|
|
2424
|
-
TextInput,
|
|
2425
|
-
{
|
|
2426
|
-
type: "password",
|
|
2427
|
-
label: hasPin ? "New PIN" : "Enter 4-Digit PIN",
|
|
2428
|
-
maxLength: 4,
|
|
2429
|
-
disabled: isPinSubmitting,
|
|
2430
|
-
value: newPin,
|
|
2431
|
-
onChange: (val) => handlePinInput(val, setNewPin),
|
|
2432
|
-
placeholder: "\u2022\u2022\u2022\u2022"
|
|
2433
|
-
}
|
|
2434
|
-
), /* @__PURE__ */ import_react39.default.createElement(
|
|
2435
|
-
TextInput,
|
|
2436
|
-
{
|
|
2437
|
-
type: "password",
|
|
2438
|
-
label: "Retype New PIN",
|
|
2439
|
-
maxLength: 4,
|
|
2440
|
-
disabled: isPinSubmitting,
|
|
2441
|
-
value: confirmPin,
|
|
2442
|
-
onChange: (val) => handlePinInput(val, setConfirmPin),
|
|
2443
|
-
placeholder: "\u2022\u2022\u2022\u2022"
|
|
2444
|
-
}
|
|
2445
|
-
), /* @__PURE__ */ import_react39.default.createElement("div", { className: "pt-2" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
2446
|
-
ThreeDActionButton,
|
|
2447
|
-
{
|
|
2448
|
-
type: "submit",
|
|
2449
|
-
disabled: isPinSubmitting || newPin.length !== 4 || confirmPin.length !== 4 || hasPin && oldPin.length !== 4,
|
|
2450
|
-
isLoading: isPinSubmitting,
|
|
2451
|
-
className: "w-full py-3"
|
|
2452
|
-
},
|
|
2453
|
-
hasPin ? "Update PIN" : "Set PIN"
|
|
2454
|
-
)))))));
|
|
2455
|
-
};
|
|
2456
|
-
|
|
2457
|
-
// src/components/UniversalErrorView.tsx
|
|
2458
|
-
var import_react41 = __toESM(require("react"));
|
|
2459
|
-
var import_react42 = require("@hugeicons/react");
|
|
2460
|
-
var import_core_free_icons11 = require("@hugeicons/core-free-icons");
|
|
2461
|
-
var UniversalErrorView = ({
|
|
2462
|
-
isBooting,
|
|
2463
|
-
isLoading,
|
|
2464
|
-
activeData,
|
|
2465
|
-
activeError,
|
|
2466
|
-
envName,
|
|
2467
|
-
onRetry,
|
|
2468
|
-
returnUrl = "/app",
|
|
2469
|
-
returnLabel = "Return to Workspace"
|
|
2470
|
-
}) => {
|
|
2471
|
-
if (isBooting || isLoading && !activeData) {
|
|
2472
|
-
return /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center justify-center h-screen w-full bg-black" }, /* @__PURE__ */ import_react41.default.createElement(PageSpinner, null));
|
|
2473
|
-
}
|
|
2474
|
-
if (!isLoading && (!activeData || activeError)) {
|
|
2475
|
-
const errorString = typeof activeError === "string" ? activeError : JSON.stringify(activeError || "");
|
|
2476
|
-
const errorMsg = errorString.toLowerCase();
|
|
2477
|
-
const isPermissionError = errorMsg.includes("forbidden") || errorMsg.includes("unauthorized") || errorMsg.includes("permission");
|
|
2478
|
-
const isNetworkError = errorMsg.includes("network") || errorMsg.includes("connection") || errorMsg.includes("fetch");
|
|
2479
|
-
const isNotFoundError = errorMsg.includes("not found") || errorMsg.includes("404") || errorMsg.includes("does not exist") || !activeData && !isPermissionError && !isNetworkError;
|
|
2480
|
-
const apiMessage = typeof activeError === "string" && activeError.trim() !== "" ? activeError : null;
|
|
2481
|
-
let title = "Oops Connection Error";
|
|
2482
|
-
let description = apiMessage || `We could not load your request. Please check your connection and try again.`;
|
|
2483
|
-
let IconComponent = import_core_free_icons11.ConfusedIcon;
|
|
2484
|
-
if (isNotFoundError) {
|
|
2485
|
-
title = "Oops its not your fault";
|
|
2486
|
-
description = apiMessage || `We could not reach the ${envName} you just loaded. Our team has been notified.`;
|
|
2487
|
-
} else if (isPermissionError) {
|
|
2488
|
-
title = "Access Restricted";
|
|
2489
|
-
description = apiMessage || `You have insufficient permissions to view this ${envName}. Please contact your administrator.`;
|
|
2490
|
-
}
|
|
2491
|
-
return /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 bg-black animate-in fade-in duration-500" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: IconComponent, size: 48, className: "text-neutral-600" })), /* @__PURE__ */ import_react41.default.createElement("h2", { className: "text-lg text-white tracking-tight" }, title), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-xs mt-2 mb-8 text-neutral-400 max-w-sm text-center leading-relaxed" }, description), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full justify-center sm:w-auto" }, isNotFoundError || isPermissionError ? /* @__PURE__ */ import_react41.default.createElement(
|
|
2492
|
-
"button",
|
|
2493
|
-
{
|
|
2494
|
-
onClick: () => window.location.href = returnUrl,
|
|
2495
|
-
className: "px-6 py-2 text-white border border-neutral-700 rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none"
|
|
2496
|
-
},
|
|
2497
|
-
returnLabel
|
|
2498
|
-
) : (
|
|
2499
|
-
// Soft errors (Network timeouts) allow them to retry or optionally retreat
|
|
2500
|
-
/* @__PURE__ */ import_react41.default.createElement(import_react41.default.Fragment, null, envName.toLowerCase().includes("application") && /* @__PURE__ */ import_react41.default.createElement(
|
|
2501
|
-
"button",
|
|
2502
|
-
{
|
|
2503
|
-
onClick: () => window.location.href = returnUrl,
|
|
2504
|
-
className: "px-6 py-2 bg-transparent border border-neutral-700 text-neutral-400 hover:text-white rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none"
|
|
2505
|
-
},
|
|
2506
|
-
"Back Home"
|
|
2507
|
-
), /* @__PURE__ */ import_react41.default.createElement(
|
|
2508
|
-
"button",
|
|
2509
|
-
{
|
|
2510
|
-
onClick: onRetry,
|
|
2511
|
-
className: "px-6 py-2 bg-white text-black rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none capitalize"
|
|
2512
|
-
},
|
|
2513
|
-
"Refresh ",
|
|
2514
|
-
envName
|
|
2515
|
-
))
|
|
2516
|
-
)));
|
|
2517
|
-
}
|
|
2518
|
-
return null;
|
|
2519
|
-
};
|
|
2520
|
-
|
|
2521
|
-
// src/components/UniversalTransactionPage.tsx
|
|
2522
|
-
var import_react43 = __toESM(require("react"));
|
|
2523
|
-
var import_react44 = require("@hugeicons/react");
|
|
2524
|
-
var import_react_hot_toast7 = __toESM(require("react-hot-toast"));
|
|
2525
|
-
var import_core_free_icons12 = require("@hugeicons/core-free-icons");
|
|
2526
|
-
var PageSpinner2 = () => /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.Loading03Icon, size: 32, className: "animate-spin mb-4 text-white" }));
|
|
2527
|
-
var formatDate = (dateInput) => {
|
|
2528
|
-
const d = new Date(dateInput);
|
|
2529
|
-
const day = d.getDate();
|
|
2530
|
-
const month = d.toLocaleString("en-US", { month: "short" });
|
|
2531
|
-
const year = d.getFullYear();
|
|
2532
|
-
return `${day} ${month} ${year}`;
|
|
2533
|
-
};
|
|
2534
|
-
var formatTime = (dateInput) => {
|
|
2535
|
-
return new Date(dateInput).toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit" });
|
|
2536
|
-
};
|
|
2537
|
-
var truncateAddress = (address) => {
|
|
2538
|
-
if (!address || address.length < 12) return address;
|
|
2539
|
-
return `${address.substring(0, 6)}...${address.substring(address.length - 4)}`;
|
|
2540
|
-
};
|
|
2541
|
-
var UniversalTransactionPage = ({
|
|
2542
|
-
headerTitle,
|
|
2543
|
-
headerDescription,
|
|
2544
|
-
hideControls = false,
|
|
2545
|
-
hideBalanceAmounts = false,
|
|
2546
|
-
hidePagination = false,
|
|
2547
|
-
transactions,
|
|
2548
|
-
isLoading,
|
|
2549
|
-
currentPage,
|
|
2550
|
-
totalPages,
|
|
2551
|
-
onPageChange,
|
|
2552
|
-
searchQuery,
|
|
2553
|
-
onSearchChange,
|
|
2554
|
-
activeDirectionFilter,
|
|
2555
|
-
onDirectionFilterChange,
|
|
2556
|
-
activeTypeFilter,
|
|
2557
|
-
onTypeFilterChange,
|
|
2558
|
-
onReportTransaction,
|
|
2559
|
-
onGenerateReceipt
|
|
2560
|
-
}) => {
|
|
2561
|
-
const [selectedTransaction, setSelectedTransaction] = (0, import_react43.useState)(null);
|
|
2562
|
-
const [isGeneratingReceipt, setIsGeneratingReceipt] = (0, import_react43.useState)(false);
|
|
2563
|
-
const [localSearchQuery, setLocalSearchQuery] = (0, import_react43.useState)(searchQuery);
|
|
2564
|
-
const [isTyping, setIsTyping] = (0, import_react43.useState)(false);
|
|
2565
|
-
const [isDirectionModalOpen, setIsDirectionModalOpen] = (0, import_react43.useState)(false);
|
|
2566
|
-
const [isTypeModalOpen, setIsTypeModalOpen] = (0, import_react43.useState)(false);
|
|
2567
|
-
const directionDropdownRef = (0, import_react43.useRef)(null);
|
|
2568
|
-
const typeDropdownRef = (0, import_react43.useRef)(null);
|
|
2569
|
-
(0, import_react43.useEffect)(() => {
|
|
2570
|
-
function handleClickOutside(event) {
|
|
2571
|
-
if (directionDropdownRef.current && !directionDropdownRef.current.contains(event.target)) {
|
|
2572
|
-
setIsDirectionModalOpen(false);
|
|
2573
|
-
}
|
|
2574
|
-
if (typeDropdownRef.current && !typeDropdownRef.current.contains(event.target)) {
|
|
2575
|
-
setIsTypeModalOpen(false);
|
|
2576
|
-
}
|
|
2577
|
-
}
|
|
2578
|
-
document.addEventListener("mousedown", handleClickOutside);
|
|
2579
|
-
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
2580
|
-
}, []);
|
|
2581
|
-
(0, import_react43.useEffect)(() => {
|
|
2582
|
-
setIsTyping(true);
|
|
2583
|
-
const handler = setTimeout(() => {
|
|
2584
|
-
onSearchChange(localSearchQuery);
|
|
2585
|
-
setIsTyping(false);
|
|
2586
|
-
}, 600);
|
|
2587
|
-
return () => clearTimeout(handler);
|
|
2588
|
-
}, [localSearchQuery, onSearchChange]);
|
|
2589
|
-
(0, import_react43.useEffect)(() => {
|
|
2590
|
-
if (searchQuery === "" && localSearchQuery !== "") {
|
|
2591
|
-
setLocalSearchQuery("");
|
|
2592
|
-
}
|
|
2593
|
-
}, [searchQuery]);
|
|
2594
|
-
const getDisplayName = (tx) => {
|
|
2595
|
-
if (tx.metadata?.merchantName) return tx.metadata.merchantName;
|
|
2596
|
-
if (tx.metadata?.description) return tx.metadata.description;
|
|
2597
|
-
return tx.type === "CARD_TRANSACTION" ? "Card Transaction" : "Wallet Transaction";
|
|
2598
|
-
};
|
|
2599
|
-
const handleGenerateReceipt = async () => {
|
|
2600
|
-
if (!onGenerateReceipt || !selectedTransaction) return;
|
|
2601
|
-
setIsGeneratingReceipt(true);
|
|
2602
|
-
try {
|
|
2603
|
-
await onGenerateReceipt(selectedTransaction);
|
|
2604
|
-
import_react_hot_toast7.default.success("Receipt generated successfully.");
|
|
2605
|
-
} catch (error) {
|
|
2606
|
-
import_react_hot_toast7.default.error("Failed to generate receipt.");
|
|
2607
|
-
} finally {
|
|
2608
|
-
setIsGeneratingReceipt(false);
|
|
2609
|
-
}
|
|
2610
|
-
};
|
|
2611
|
-
const isListLoading = isLoading || isTyping;
|
|
2612
|
-
return /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col gap-6 animate-in max-w-5xl fade-in duration-300" }, !hideControls && /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 w-full" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "relative w-full sm:w-96" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.Search01Icon, size: 16, className: "text-neutral-500" })), /* @__PURE__ */ import_react43.default.createElement(
|
|
2613
|
-
"input",
|
|
2614
|
-
{
|
|
2615
|
-
type: "text",
|
|
2616
|
-
placeholder: "Search reference or amount...",
|
|
2617
|
-
value: localSearchQuery,
|
|
2618
|
-
onChange: (e) => setLocalSearchQuery(e.target.value),
|
|
2619
|
-
className: "w-full pl-10 pr-4 py-2 border border-neutral-800 rounded-full text-[13px] text-white placeholder-neutral-500 outline-none transition-colors focus:border-neutral-600"
|
|
2620
|
-
}
|
|
2621
|
-
)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-3 w-full sm:w-auto overflow-x-auto pb-1 sm:pb-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2622
|
-
"button",
|
|
2623
|
-
{
|
|
2624
|
-
onClick: () => setIsDirectionModalOpen(true),
|
|
2625
|
-
className: "flex items-center gap-2 whitespace-nowrap border border-neutral-800 px-5 py-2 rounded-full text-[12px] text-neutral-400 hover:text-white transition-colors outline-none"
|
|
2626
|
-
},
|
|
2627
|
-
/* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.SearchList02Icon, size: 12 }),
|
|
2628
|
-
activeDirectionFilter === "ALL" ? "Payment Type" : activeDirectionFilter
|
|
2629
|
-
), /* @__PURE__ */ import_react43.default.createElement(
|
|
2630
|
-
"button",
|
|
2631
|
-
{
|
|
2632
|
-
onClick: () => setIsTypeModalOpen(true),
|
|
2633
|
-
className: "flex items-center gap-2 whitespace-nowrap border border-neutral-800 px-5 py-2 rounded-full text-[12px] text-neutral-400 hover:text-white transition-colors outline-none"
|
|
2634
|
-
},
|
|
2635
|
-
/* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.ListSettingIcon, size: 14 }),
|
|
2636
|
-
activeTypeFilter === "ALL" ? "All Transactions" : activeTypeFilter.replace("_", " ")
|
|
2637
|
-
))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-neutral-900 w-full" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("h1", { className: "text-white text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-xs text-neutral-400" }, headerDescription))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full overflow-hidden" }, isListLoading ? /* @__PURE__ */ import_react43.default.createElement(PageSpinner2, null) : /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("div", null, transactions.length === 0 ? /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No transactions found") : transactions.map((tx) => /* @__PURE__ */ import_react43.default.createElement(
|
|
2638
|
-
"div",
|
|
2639
|
-
{
|
|
2640
|
-
key: tx.id,
|
|
2641
|
-
onClick: () => setSelectedTransaction(tx),
|
|
2642
|
-
className: "flex items-center justify-between py-4 /50 transition-colors cursor-pointer group min-w-0 px-2 -mx-2 rounded-xl"
|
|
2643
|
-
},
|
|
2644
|
-
/* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: `w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-700 text-white` }, /* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: tx.direction === "CREDIT" ? import_core_free_icons12.ArrowDownRight01Icon : import_core_free_icons12.ArrowUpRight01Icon, size: 18 })), /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-1" }, /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-[13px] text-white truncate" }, getDisplayName(tx)), /* @__PURE__ */ import_react43.default.createElement("p", { className: `text-[13px] text-neutral-400 truncate transition-all duration-300 ${hideBalanceAmounts ? "blur-sm opacity-40 select-none" : ""}` }, tx.direction === "CREDIT" ? "+" : "-", tx.amount, " ", tx.currency))),
|
|
2645
|
-
/* @__PURE__ */ import_react43.default.createElement("div", { className: "shrink-0 flex flex-col items-end gap-1 text-right" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] text-neutral-500" }, formatDate(tx.createdAt)), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] text-neutral-500 capitalize" }, tx.direction.toLowerCase()))
|
|
2646
|
-
))), !hidePagination && /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center justify-between pt-6 mt-2" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] text-neutral-500 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages === 0 ? 1 : totalPages), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2647
|
-
"button",
|
|
2648
|
-
{
|
|
2649
|
-
onClick: () => onPageChange(currentPage - 1),
|
|
2650
|
-
disabled: currentPage <= 1 || isListLoading,
|
|
2651
|
-
className: "p-2 border border-neutral-800 rounded-full text-neutral-500 hover:text-white hover:border-neutral-600 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2652
|
-
},
|
|
2653
|
-
/* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.ArrowLeft01Icon, size: 14 })
|
|
2654
|
-
), /* @__PURE__ */ import_react43.default.createElement(
|
|
2655
|
-
"button",
|
|
2656
|
-
{
|
|
2657
|
-
onClick: () => onPageChange(currentPage + 1),
|
|
2658
|
-
disabled: currentPage >= totalPages || isListLoading || totalPages === 0,
|
|
2659
|
-
className: "p-2 border border-neutral-800 rounded-full text-neutral-500 hover:text-white hover:border-neutral-600 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2660
|
-
},
|
|
2661
|
-
/* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.ArrowRight01Icon, size: 14 })
|
|
2662
|
-
)))))), selectedTransaction && /* @__PURE__ */ import_react43.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: () => setSelectedTransaction(null) }), /* @__PURE__ */ import_react43.default.createElement("div", { className: "relative w-full max-w-sm bg-neutral-900 rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 max-h-[90vh]" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0" }, /* @__PURE__ */ import_react43.default.createElement("h3", { className: "text-[15px] text-white tracking-tight" }, "Details"), /* @__PURE__ */ import_react43.default.createElement("button", { onClick: () => setSelectedTransaction(null), className: "text-neutral-500 hover:text-white transition-colors outline-none" }, /* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: import_core_free_icons12.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col items-center justify-center mb-4" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: `w-12 h-12 rounded-full flex items-center justify-center mb-4 bg-neutral-700 text-white` }, /* @__PURE__ */ import_react43.default.createElement(import_react44.HugeiconsIcon, { icon: selectedTransaction.direction === "CREDIT" ? import_core_free_icons12.ArrowDownRight01Icon : import_core_free_icons12.ArrowUpRight01Icon, size: 20 })), /* @__PURE__ */ import_react43.default.createElement("h2", { className: `text-2xl text-white mb-2 transition-all duration-300 ${hideBalanceAmounts ? "blur-[6px] opacity-40 select-none" : ""}` }, selectedTransaction.direction === "CREDIT" ? "+" : "-", selectedTransaction.amount, " ", selectedTransaction.currency), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[9px] tracking-widest text-neutral-400 px-4 py-1.5 rounded-full border border-neutral-800" }, selectedTransaction.status)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "grid grid-cols-1 gap-y-8 gap-x-4 mb-10 mt-6" }, /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Reference ID"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[13px] text-white break-all" }, selectedTransaction.reference)), /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Date & Time"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[13px] text-white" }, formatDate(selectedTransaction.createdAt), " at ", formatTime(selectedTransaction.createdAt))), /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Transaction Type"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[13px] text-white capitalize" }, selectedTransaction.type.replace("_", " ").toLowerCase())), /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Flow Direction"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[13px] text-white capitalize" }, selectedTransaction.direction.toLowerCase())), selectedTransaction.metadata?.fromAddress && selectedTransaction.metadata?.toAddress && /* @__PURE__ */ import_react43.default.createElement("div", null, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Transfer Route"), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-2 text-[13px] text-white" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "truncate" }, truncateAddress(String(selectedTransaction.metadata.fromAddress))), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-neutral-500" }, "\u2192"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "truncate" }, truncateAddress(String(selectedTransaction.metadata.toAddress))))), selectedTransaction.metadata && Object.entries(selectedTransaction.metadata).map(([key, value]) => {
|
|
2663
|
-
if (key === "fromAddress" || key === "toAddress") return null;
|
|
2664
|
-
if (value === null || value === void 0 || typeof value === "object") return null;
|
|
2665
|
-
const formattedKey = key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase());
|
|
2666
|
-
return /* @__PURE__ */ import_react43.default.createElement("div", { key }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, formattedKey), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[13px] text-white break-all" }, String(value)));
|
|
2667
|
-
})), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2668
|
-
ThreeDActionButton,
|
|
2669
|
-
{
|
|
2670
|
-
onClick: handleGenerateReceipt,
|
|
2671
|
-
isLoading: isGeneratingReceipt,
|
|
2672
|
-
className: "w-full py-3 text-[14px]"
|
|
2673
|
-
},
|
|
2674
|
-
"Generate Receipt"
|
|
2675
|
-
), /* @__PURE__ */ import_react43.default.createElement(
|
|
2676
|
-
"button",
|
|
2677
|
-
{
|
|
2678
|
-
onClick: () => onReportTransaction && onReportTransaction(selectedTransaction),
|
|
2679
|
-
className: "w-full flex items-center font-medium justify-center py-2.5 rounded-full border border-neutral-700 text-white transition-colors outline-none text-[13px] tracking-wide mt-2"
|
|
2680
|
-
},
|
|
2681
|
-
"Report Transaction"
|
|
2682
|
-
), selectedTransaction.type === "WALLET_TRANSACTION" && /* @__PURE__ */ import_react43.default.createElement(
|
|
2683
|
-
"a",
|
|
2684
|
-
{
|
|
2685
|
-
href: `https://basescan.org/tx/${selectedTransaction.reference}`,
|
|
2686
|
-
target: "_blank",
|
|
2687
|
-
rel: "noopener noreferrer",
|
|
2688
|
-
className: "w-full flex items-center font-medium justify-center py-2.5 rounded-full border border-neutral-700 text-white transition-colors outline-none text-[13px] tracking-wide mt-2"
|
|
2689
|
-
},
|
|
2690
|
-
"View in block explorer"
|
|
2691
|
-
))))), isDirectionModalOpen && /* @__PURE__ */ import_react43.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: () => setIsDirectionModalOpen(false) }), /* @__PURE__ */ import_react43.default.createElement("div", { ref: directionDropdownRef, className: "relative w-72 bg-neutral-900 shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react43.default.createElement("h3", { className: "text-[14px] text-white tracking-tight" }, "Payment Type")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, ["ALL", "CREDIT", "DEBIT"].map((option) => /* @__PURE__ */ import_react43.default.createElement(
|
|
2692
|
-
"button",
|
|
2693
|
-
{
|
|
2694
|
-
key: option,
|
|
2695
|
-
onClick: () => {
|
|
2696
|
-
onDirectionFilterChange(option);
|
|
2697
|
-
setIsDirectionModalOpen(false);
|
|
2698
|
-
},
|
|
2699
|
-
className: `text-left px-4 py-3 text-[11px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeDirectionFilter === option ? "bg-neutral-800 text-white" : "text-neutral-400 hover:text-white"}`
|
|
2700
|
-
},
|
|
2701
|
-
/* @__PURE__ */ import_react43.default.createElement("span", { className: "truncate pr-2" }, option.charAt(0).toUpperCase() + option.slice(1).toLowerCase())
|
|
2702
|
-
))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2703
|
-
"button",
|
|
2704
|
-
{
|
|
2705
|
-
onClick: () => setIsDirectionModalOpen(false),
|
|
2706
|
-
className: "w-full py-3 text-[13px] text-neutral-500 hover:text-white transition-colors outline-none"
|
|
2707
|
-
},
|
|
2708
|
-
"Cancel"
|
|
2709
|
-
)))), isTypeModalOpen && /* @__PURE__ */ import_react43.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: () => setIsTypeModalOpen(false) }), /* @__PURE__ */ import_react43.default.createElement("div", { ref: typeDropdownRef, className: "relative w-72 bg-neutral-900 shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react43.default.createElement("h3", { className: "text-[14px] text-white tracking-tight" }, "Transactions Type")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, [
|
|
2710
|
-
{ label: "All Transactions", value: "ALL" },
|
|
2711
|
-
{ label: "Wallet Transactions", value: "WALLET_TRANSACTION" },
|
|
2712
|
-
{ label: "Card Transactions", value: "CARD_TRANSACTION" }
|
|
2713
|
-
].map((option) => /* @__PURE__ */ import_react43.default.createElement(
|
|
2714
|
-
"button",
|
|
2715
|
-
{
|
|
2716
|
-
key: option.value,
|
|
2717
|
-
onClick: () => {
|
|
2718
|
-
onTypeFilterChange(option.value);
|
|
2719
|
-
setIsTypeModalOpen(false);
|
|
2720
|
-
},
|
|
2721
|
-
className: `text-left px-4 py-3 text-[11px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeTypeFilter === option.value ? "bg-neutral-800 text-white" : "text-neutral-400 hover:text-white"}`
|
|
2722
|
-
},
|
|
2723
|
-
/* @__PURE__ */ import_react43.default.createElement("span", { className: "truncate pr-2" }, option.label.charAt(0).toUpperCase() + option.label.slice(1).toLowerCase())
|
|
2724
|
-
))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2725
|
-
"button",
|
|
2726
|
-
{
|
|
2727
|
-
onClick: () => setIsTypeModalOpen(false),
|
|
2728
|
-
className: "w-full py-3 text-[13px] text-neutral-500 hover:text-white transition-colors outline-none"
|
|
2729
|
-
},
|
|
2730
|
-
"Cancel"
|
|
2731
|
-
)))));
|
|
2732
|
-
};
|
|
2733
|
-
|
|
2734
|
-
// src/components/UniversalHomeView.tsx
|
|
2735
|
-
var import_react45 = __toESM(require("react"));
|
|
2736
|
-
var import_react46 = require("@hugeicons/react");
|
|
2737
|
-
var import_core_free_icons13 = require("@hugeicons/core-free-icons");
|
|
2738
|
-
var UniversalHomeView = ({
|
|
2739
|
-
balanceLabel = "Your Balance",
|
|
2740
|
-
balanceAmount,
|
|
2741
|
-
balanceCurrency = "$",
|
|
2742
|
-
primaryAction,
|
|
2743
|
-
secondaryAction,
|
|
2744
|
-
quickActionsTitle = "Quick Actions",
|
|
2745
|
-
quickActions = [],
|
|
2746
|
-
transactionsProps
|
|
2747
|
-
}) => {
|
|
2748
|
-
const [displayAmount, setDisplayAmount] = (0, import_react45.useState)("0.00");
|
|
2749
|
-
const [isBalanceHidden, setIsBalanceHidden] = (0, import_react45.useState)(false);
|
|
2750
|
-
(0, import_react45.useEffect)(() => {
|
|
2751
|
-
const target = parseFloat(balanceAmount.replace(/,/g, ""));
|
|
2752
|
-
if (isNaN(target)) {
|
|
2753
|
-
setDisplayAmount(balanceAmount);
|
|
2754
|
-
return;
|
|
2755
|
-
}
|
|
2756
|
-
let startTimestamp = null;
|
|
2757
|
-
const duration = 1e3;
|
|
2758
|
-
const step = (timestamp) => {
|
|
2759
|
-
if (!startTimestamp) startTimestamp = timestamp;
|
|
2760
|
-
const progress = Math.min((timestamp - startTimestamp) / duration, 1);
|
|
2761
|
-
const easeProgress = progress === 1 ? 1 : 1 - Math.pow(2, -10 * progress);
|
|
2762
|
-
const currentCount = easeProgress * target;
|
|
2763
|
-
setDisplayAmount(currentCount.toLocaleString("en-US", {
|
|
2764
|
-
minimumFractionDigits: 2,
|
|
2765
|
-
maximumFractionDigits: 2
|
|
2766
|
-
}));
|
|
2767
|
-
if (progress < 1) {
|
|
2768
|
-
requestAnimationFrame(step);
|
|
2769
|
-
} else {
|
|
2770
|
-
setDisplayAmount(target.toLocaleString("en-US", {
|
|
2771
|
-
minimumFractionDigits: 2,
|
|
2772
|
-
maximumFractionDigits: 2
|
|
2773
|
-
}));
|
|
2774
|
-
}
|
|
2775
|
-
};
|
|
2776
|
-
requestAnimationFrame(step);
|
|
2777
|
-
}, [balanceAmount]);
|
|
2778
|
-
const [intPart, decPart] = displayAmount.includes(".") ? displayAmount.split(".") : [displayAmount, "00"];
|
|
2779
|
-
const silverBg = `linear-gradient(110deg, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0) 35%, rgba(0,0,0,0.1) 60%, rgba(255,255,255,0.6) 80%, rgba(0,0,0,0.2) 100%), url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSc2MDAnIGhlaWdodD0nODAnPjxmaWx0ZXIgaWQ9J2JydXNoZWQnIHg9JzAlJyB5PScwJScgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJSc+PGZlVHVyYnVsZW5jZSB0eXBlPSdmcmFjdGFsTm9pc2UnIGJhc2VGcmVxdWVuY3k9JzAuMDA1IDAuOCcgbnVtT2N0YXZlcz0nNCcgc2VlZD0nNScgcmVzdWx0PSdub2lzZScvPjxmZUNvbG9yTWF0cml4IHR5cGU9J3NhdHVyYXRlJyB2YWx1ZXM9JzAnIHJlc3VsdD0nbW9ubycvPjxmZUNvbXBvbmVudFRyYW5zZmVyIHJlc3VsdD0nYWRqdXN0ZWQnPjxmZUZ1bmNSIHR5cGU9J2xpbmVhcicgc2xvcGU9JzAuNCcgaW50ZXJjZXB0PScwLjMnLz48ZmVGdW5jRyB0eXBlPSdsaW5lYXInIHNsb3BlPScwLjQnIGludGVyY2VwdD0nMC4zJy8+PGZlRnVuY0IgdHlwZT0nbGluZWFyJyBzbG9wZT0nMC40JyBpbnRlcmNlcHQ9JzAuMycvPjxmZUZ1bmNBIHR5cGU9J2xpbmVhcicgc2xvcGU9JzAuMTUnIGludGVyY2VwdD0nMCcvPjwvZmVDb21wb25lbnRUcmFuc2Zlcj48L2ZpbHRlcj48cmVjdCB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBmaWxsPScjZDFkNWRiJy8+PHJlY3Qgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgZmlsdGVyPSd1cmwoI2JydXNoZWQpJyBvcGFjaXR5PScwLjgnLz48L3N2Zz4=")`;
|
|
2780
|
-
const silverShadowBase = "inset 0 1px 2px rgba(255,255,255,1), inset 0 -2px 3px rgba(0,0,0,0.3), 0 4px 10px rgba(0,0,0,0.5)";
|
|
2781
|
-
const silverShadowHover = "inset 0 1px 2px rgba(255,255,255,1), inset 0 -2px 3px rgba(0,0,0,0.3), 0 6px 14px rgba(0,0,0,0.7)";
|
|
2782
|
-
const silverShadowActive = "inset 0 2px 4px rgba(0,0,0,0.4), inset 0 -1px 2px rgba(255,255,255,0.5), 0 2px 4px rgba(0,0,0,0.3)";
|
|
2783
|
-
return /* @__PURE__ */ import_react45.default.createElement("div", { className: "w-full max-w-5xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react45.default.createElement("div", { className: "relative flex items-start justify-between w-full pt-4 pb-8" }, /* @__PURE__ */ import_react45.default.createElement("div", { className: "flex flex-col items-start text-left z-10 w-full" }, /* @__PURE__ */ import_react45.default.createElement("div", { className: "flex items-center gap-2 mb-1.5" }, /* @__PURE__ */ import_react45.default.createElement("span", { className: "text-[12px] sm:text-[13px] text-neutral-400" }, balanceLabel), /* @__PURE__ */ import_react45.default.createElement(
|
|
2784
|
-
"button",
|
|
2785
|
-
{
|
|
2786
|
-
onClick: () => setIsBalanceHidden(!isBalanceHidden),
|
|
2787
|
-
className: "text-neutral-500 hover:text-white transition-colors outline-none"
|
|
2788
|
-
},
|
|
2789
|
-
/* @__PURE__ */ import_react45.default.createElement(import_react46.HugeiconsIcon, { icon: isBalanceHidden ? import_core_free_icons13.ViewIcon : import_core_free_icons13.ViewOffSlashIcon, size: 14 })
|
|
2790
|
-
)), /* @__PURE__ */ import_react45.default.createElement("h1", { className: `text-3xl sm:text-4xl md:text-5xl text-white tracking-tight mb-5 tabular-nums flex items-baseline transition-all duration-300 ${isBalanceHidden ? "blur-sm opacity-40 select-none" : ""}` }, /* @__PURE__ */ import_react45.default.createElement("span", { className: "text-xl sm:text-2xl text-neutral-500 mr-1" }, balanceCurrency), intPart, /* @__PURE__ */ import_react45.default.createElement("span", { className: "text-xl sm:text-2xl text-neutral-500" }, ".", decPart)), /* @__PURE__ */ import_react45.default.createElement("div", { className: "flex items-center gap-3" }, primaryAction && /* @__PURE__ */ import_react45.default.createElement(
|
|
2791
|
-
"button",
|
|
2792
|
-
{
|
|
2793
|
-
onClick: primaryAction.onClick,
|
|
2794
|
-
className: "relative inline-flex items-center justify-center gap-1.5 px-8 py-2 rounded-full text-black transition-all duration-150 select-none outline-none overflow-hidden active:translate-y-0.5",
|
|
2795
|
-
style: {
|
|
2796
|
-
backgroundImage: silverBg,
|
|
2797
|
-
backgroundSize: "cover",
|
|
2798
|
-
backgroundPosition: "center",
|
|
2799
|
-
boxShadow: silverShadowBase,
|
|
2800
|
-
textShadow: "0 1px 1px rgba(255,255,255,0.6)"
|
|
2801
|
-
},
|
|
2802
|
-
onMouseEnter: (e) => {
|
|
2803
|
-
e.currentTarget.style.boxShadow = silverShadowHover;
|
|
2804
|
-
e.currentTarget.style.transform = "translateY(-1px)";
|
|
2805
|
-
},
|
|
2806
|
-
onMouseLeave: (e) => {
|
|
2807
|
-
e.currentTarget.style.boxShadow = silverShadowBase;
|
|
2808
|
-
e.currentTarget.style.transform = "translateY(0px)";
|
|
2809
|
-
},
|
|
2810
|
-
onMouseDown: (e) => {
|
|
2811
|
-
e.currentTarget.style.boxShadow = silverShadowActive;
|
|
2812
|
-
e.currentTarget.style.transform = "translateY(2px)";
|
|
2813
|
-
},
|
|
2814
|
-
onMouseUp: (e) => {
|
|
2815
|
-
e.currentTarget.style.transform = "translateY(-1px)";
|
|
2816
|
-
}
|
|
2817
|
-
},
|
|
2818
|
-
/* @__PURE__ */ import_react45.default.createElement("span", { className: "absolute inset-0 bg-linear-to-r from-white/30 to-transparent pointer-events-none" }),
|
|
2819
|
-
/* @__PURE__ */ import_react45.default.createElement("span", { className: "relative z-10 flex items-center gap-1.5 leading-none text-[13px] tracking-wide font-medium drop-shadow-[0_1px_1px_rgba(255,255,255,0.8)]" }, primaryAction.label, primaryAction.icon && /* @__PURE__ */ import_react45.default.createElement(import_react46.HugeiconsIcon, { icon: primaryAction.icon, size: 16 }))
|
|
2820
|
-
), secondaryAction && /* @__PURE__ */ import_react45.default.createElement(
|
|
2821
|
-
"button",
|
|
2822
|
-
{
|
|
2823
|
-
onClick: secondaryAction.onClick,
|
|
2824
|
-
className: "flex items-center gap-1.5 px-8 py-2 rounded-full border border-neutral-800 text-white transition-colors outline-none"
|
|
2825
|
-
},
|
|
2826
|
-
/* @__PURE__ */ import_react45.default.createElement("span", { className: "text-[13px] tracking-wide" }, secondaryAction.label),
|
|
2827
|
-
secondaryAction.icon && /* @__PURE__ */ import_react45.default.createElement(import_react46.HugeiconsIcon, { icon: secondaryAction.icon, size: 16 })
|
|
2828
|
-
)))), quickActions && quickActions.length > 0 && /* @__PURE__ */ import_react45.default.createElement("div", { className: "w-full mb-8 z-10" }, /* @__PURE__ */ import_react45.default.createElement("h3", { className: "text-xl text-white mb-4 px-1 tracking-tight" }, quickActionsTitle), /* @__PURE__ */ import_react45.default.createElement("div", { className: "grid grid-cols-4 gap-2 sm:gap-3 w-full" }, quickActions.slice(0, 4).map((action) => /* @__PURE__ */ import_react45.default.createElement(
|
|
2829
|
-
"button",
|
|
2830
|
-
{
|
|
2831
|
-
key: action.id,
|
|
2832
|
-
onClick: action.onClick,
|
|
2833
|
-
className: `w-full h-23.75 sm:h-28.75 rounded-2xl border border-neutral-800 p-2.5 sm:p-3 flex flex-col justify-between items-start cursor-pointer active:scale-[0.98] transition-all outline-none`
|
|
2834
|
-
},
|
|
2835
|
-
/* @__PURE__ */ import_react45.default.createElement("div", { className: `w-7 h-7 sm:w-9 sm:h-9 rounded-full flex items-center justify-center border border-neutral-800 text-white}` }, /* @__PURE__ */ import_react45.default.createElement("div", { className: "scale-75 sm:scale-100 text-white flex items-center justify-center" }, /* @__PURE__ */ import_react45.default.createElement(import_react46.HugeiconsIcon, { icon: action.icon, size: 18 }))),
|
|
2836
|
-
/* @__PURE__ */ import_react45.default.createElement("span", { className: "text-[10px] sm:text-[12px] text-neutral-300 text-left leading-[1.2] whitespace-pre-line mt-1" }, action.label)
|
|
2837
|
-
)))), /* @__PURE__ */ import_react45.default.createElement("div", { className: "w-full" }, /* @__PURE__ */ import_react45.default.createElement(
|
|
2838
|
-
UniversalTransactionPage,
|
|
2839
|
-
{
|
|
2840
|
-
...transactionsProps,
|
|
2841
|
-
hideControls: true,
|
|
2842
|
-
hideBalanceAmounts: isBalanceHidden,
|
|
2843
|
-
hidePagination: true
|
|
2844
|
-
}
|
|
2845
|
-
)));
|
|
2846
|
-
};
|
|
2847
|
-
|
|
2848
|
-
// src/components/UniversalWalletPage.tsx
|
|
2849
|
-
var import_react47 = __toESM(require("react"));
|
|
2850
|
-
var import_react48 = require("@hugeicons/react");
|
|
2851
|
-
var import_core_free_icons14 = require("@hugeicons/core-free-icons");
|
|
2852
|
-
var PageSpinner3 = () => /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react47.default.createElement(import_react48.HugeiconsIcon, { icon: import_core_free_icons14.Loading03Icon, size: 32, className: "animate-spin mb-4 text-white" }));
|
|
2853
|
-
var WalletLogo = ({ src, alt, sizeClass = "w-10 h-10" }) => {
|
|
2854
|
-
const [isLoaded, setIsLoaded] = (0, import_react47.useState)(false);
|
|
2855
|
-
return /* @__PURE__ */ import_react47.default.createElement("div", { className: `relative shrink-0 rounded-full bg-black flex items-center justify-center overflow-hidden ${sizeClass}` }, !isLoaded && /* @__PURE__ */ import_react47.default.createElement(import_react48.HugeiconsIcon, { icon: import_core_free_icons14.Loading03Icon, size: 16, className: "animate-spin text-neutral-600 absolute" }), /* @__PURE__ */ import_react47.default.createElement(
|
|
2856
|
-
"img",
|
|
2857
|
-
{
|
|
2858
|
-
src,
|
|
2859
|
-
alt,
|
|
2860
|
-
onLoad: () => setIsLoaded(true),
|
|
2861
|
-
className: `w-full h-full object-cover transition-opacity duration-300 ${isLoaded ? "opacity-100" : "opacity-0"}`
|
|
2862
|
-
}
|
|
2863
|
-
));
|
|
2864
|
-
};
|
|
2865
|
-
var UniversalWalletPage = ({
|
|
2866
|
-
headerTitle,
|
|
2867
|
-
headerDescription,
|
|
2868
|
-
hideControls = false,
|
|
2869
|
-
hideBalanceAmounts = false,
|
|
2870
|
-
isGeneratingStatement = false,
|
|
2871
|
-
wallets,
|
|
2872
|
-
isLoading = false,
|
|
2873
|
-
renderQrCode,
|
|
2874
|
-
onDownloadPayId,
|
|
2875
|
-
onCopyAddress
|
|
2876
|
-
}) => {
|
|
2877
|
-
const [selectedWallet, setSelectedWallet] = (0, import_react47.useState)(null);
|
|
2878
|
-
const [localSearchQuery, setLocalSearchQuery] = (0, import_react47.useState)("");
|
|
2879
|
-
const [showToast, setShowToast] = (0, import_react47.useState)(false);
|
|
2880
|
-
const filteredWallets = wallets.filter((wallet) => {
|
|
2881
|
-
const q = localSearchQuery.toLowerCase();
|
|
2882
|
-
return wallet.name.toLowerCase().includes(q) || wallet.currency.toLowerCase().includes(q) || wallet.network.toLowerCase().includes(q);
|
|
2883
|
-
});
|
|
2884
|
-
const handleCopy = (wallet) => {
|
|
2885
|
-
if (onCopyAddress) onCopyAddress(wallet);
|
|
2886
|
-
if (typeof navigator !== "undefined" && navigator.clipboard) {
|
|
2887
|
-
navigator.clipboard.writeText(wallet.address).catch(() => {
|
|
2888
|
-
});
|
|
2889
|
-
}
|
|
2890
|
-
setShowToast(true);
|
|
2891
|
-
setTimeout(() => setShowToast(false), 2500);
|
|
2892
|
-
};
|
|
2893
|
-
return /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col gap-6 animate-in max-w-5xl fade-in duration-300" }, !hideControls && /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 w-full" }, /* @__PURE__ */ import_react47.default.createElement("div", { className: "relative w-full sm:w-96" }, /* @__PURE__ */ import_react47.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react47.default.createElement(import_react48.HugeiconsIcon, { icon: import_core_free_icons14.Search01Icon, size: 16, className: "text-neutral-500" })), /* @__PURE__ */ import_react47.default.createElement(
|
|
2894
|
-
"input",
|
|
2895
|
-
{
|
|
2896
|
-
type: "text",
|
|
2897
|
-
placeholder: "Search wallets by name or network...",
|
|
2898
|
-
value: localSearchQuery,
|
|
2899
|
-
onChange: (e) => setLocalSearchQuery(e.target.value),
|
|
2900
|
-
className: "w-full pl-10 pr-4 py-2 border border-neutral-800 rounded-full text-[13px] text-white placeholder-neutral-500 outline-none transition-colors focus:border-neutral-600"
|
|
2901
|
-
}
|
|
2902
|
-
))), /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-neutral-900 w-full" }, /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ import_react47.default.createElement("div", null, /* @__PURE__ */ import_react47.default.createElement("h1", { className: "text-white text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ import_react47.default.createElement("p", { className: "text-xs text-neutral-400" }, headerDescription))), /* @__PURE__ */ import_react47.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react47.default.createElement(PageSpinner3, null) : /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react47.default.createElement("div", null, filteredWallets.length === 0 ? /* @__PURE__ */ import_react47.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No wallets found") : filteredWallets.map((wallet) => /* @__PURE__ */ import_react47.default.createElement(
|
|
2903
|
-
"div",
|
|
2904
|
-
{
|
|
2905
|
-
key: wallet.id,
|
|
2906
|
-
onClick: () => setSelectedWallet(wallet),
|
|
2907
|
-
className: "flex items-center justify-between py-4 /50 transition-colors cursor-pointer group min-w-0 px-2 -mx-2 rounded-xl"
|
|
2908
|
-
},
|
|
2909
|
-
/* @__PURE__ */ import_react47.default.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react47.default.createElement(WalletLogo, { src: wallet.logoSrc, alt: wallet.name }), /* @__PURE__ */ import_react47.default.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-1" }, /* @__PURE__ */ import_react47.default.createElement("p", { className: "text-[13px] text-white truncate font-medium" }, wallet.name), /* @__PURE__ */ import_react47.default.createElement("p", { className: `text-[13px] text-neutral-400 truncate transition-all duration-300 ${hideBalanceAmounts ? "blur-sm opacity-40 select-none" : ""}` }, wallet.balance, " ", wallet.currency))),
|
|
2910
|
-
/* @__PURE__ */ import_react47.default.createElement("div", { className: "shrink-0 flex flex-col items-end gap-1 text-right" }, /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[10px] tracking-wide text-neutral-400 bg-neutral-800 px-2.5 py-1 rounded-full " }, wallet.network))
|
|
2911
|
-
)))))), selectedWallet && /* @__PURE__ */ import_react47.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react47.default.createElement("div", { className: "absolute inset-0 bg-black/60", onClick: () => {
|
|
2912
|
-
setSelectedWallet(null);
|
|
2913
|
-
setShowToast(false);
|
|
2914
|
-
} }), /* @__PURE__ */ import_react47.default.createElement("div", { className: "relative w-full max-w-sm bg-neutral-900 rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 max-h-[90vh]" }, showToast && /* @__PURE__ */ import_react47.default.createElement("div", { className: "absolute top-4 left-1/2 -translate-x-1/2 z-50 bg-neutral-800 text-white px-5 py-2.5 rounded-full text-[12px] font-medium tracking-wide shadow-xl animate-in slide-in-from-top-4 fade-in duration-200 pointer-events-none whitespace-nowrap" }, "Address copied to clipboard"), /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0" }, /* @__PURE__ */ import_react47.default.createElement("h3", { className: "text-[15px] text-white tracking-tight" }, "Wallet Details"), /* @__PURE__ */ import_react47.default.createElement("button", { onClick: () => {
|
|
2915
|
-
setSelectedWallet(null);
|
|
2916
|
-
setShowToast(false);
|
|
2917
|
-
}, className: "text-neutral-500 hover:text-white transition-colors outline-none" }, /* @__PURE__ */ import_react47.default.createElement(import_react48.HugeiconsIcon, { icon: import_core_free_icons14.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 pt-2" }, /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col items-center justify-center mb-6" }, /* @__PURE__ */ import_react47.default.createElement(WalletLogo, { src: selectedWallet.logoSrc, alt: selectedWallet.name, sizeClass: "w-14 h-14 mb-4" }), /* @__PURE__ */ import_react47.default.createElement("h2", { className: `text-2xl text-white mb-2 transition-all duration-300 font-medium ${hideBalanceAmounts ? "blur-[6px] opacity-40 select-none" : ""}` }, selectedWallet.balance, " ", selectedWallet.currency), /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[9px] tracking-widest text-neutral-400 px-4 py-1.5 rounded-full border border-neutral-800 uppercase mt-1" }, selectedWallet.network, " NETWORK")), renderQrCode && /* @__PURE__ */ import_react47.default.createElement("div", { className: "w-full flex justify-center mb-6" }, renderQrCode(selectedWallet)), /* @__PURE__ */ import_react47.default.createElement("div", { className: "grid grid-cols-1 gap-y-6 gap-x-4 mb-10" }, /* @__PURE__ */ import_react47.default.createElement("div", null, /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Wallet Address"), /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[13px] text-white break-all font-medium" }, selectedWallet.address)), /* @__PURE__ */ import_react47.default.createElement("div", null, /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 block mb-2" }, "Wallet Name"), /* @__PURE__ */ import_react47.default.createElement("span", { className: "text-[13px] text-white" }, selectedWallet.name))), /* @__PURE__ */ import_react47.default.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ import_react47.default.createElement(
|
|
2918
|
-
ThreeDActionButton,
|
|
2919
|
-
{
|
|
2920
|
-
onClick: () => onDownloadPayId && onDownloadPayId(selectedWallet),
|
|
2921
|
-
isLoading: isGeneratingStatement,
|
|
2922
|
-
className: "w-full py-3 text-[13px]"
|
|
2923
|
-
},
|
|
2924
|
-
"Generate Statement"
|
|
2925
|
-
), /* @__PURE__ */ import_react47.default.createElement(
|
|
2926
|
-
"button",
|
|
2927
|
-
{
|
|
2928
|
-
onClick: () => handleCopy(selectedWallet),
|
|
2929
|
-
className: "w-full flex font-medium items-center justify-center py-2.5 rounded-full border border-neutral-700 text-white outline-none text-[13px] tracking-wide"
|
|
2930
|
-
},
|
|
2931
|
-
"Copy Wallet Address"
|
|
2932
|
-
))))));
|
|
2933
|
-
};
|
|
2934
|
-
|
|
2935
|
-
// src/components/CardLogo.tsx
|
|
2936
|
-
var import_react49 = __toESM(require("react"));
|
|
2937
|
-
var CardLogo = ({ network, className = "" }) => {
|
|
2938
|
-
if (network === "MASTERCARD") {
|
|
2939
|
-
return /* @__PURE__ */ import_react49.default.createElement("svg", { className, fill: "currentColor", viewBox: "0 0 32 32", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ import_react49.default.createElement("title", null, "Mastercard"), /* @__PURE__ */ import_react49.default.createElement("path", { d: "M16 8.73c-0.12 0.094-0.236 0.187-0.349 0.288-1.955 1.705-3.184 4.2-3.184 6.982s1.228 5.277 3.172 6.973l0.011 0.009c0.112 0.1 0.231 0.197 0.349 0.29 0.12-0.092 0.236-0.19 0.349-0.29 1.955-1.705 3.183-4.2 3.183-6.982s-1.228-5.277-3.172-6.973l-0.011-0.009c-0.112-0.1-0.23-0.195-0.349-0.288zM21.721 6.745c-0.005 0-0.011-0-0.018-0-1.903 0-3.67 0.577-5.138 1.566l0.033-0.021c0.075 0.059 0.143 0.121 0.205 0.186l0.001 0.001c2.116 1.836 3.446 4.528 3.446 7.531 0 2.996-1.323 5.682-3.417 7.507l-0.012 0.010c-0.072 0.061-0.15 0.122-0.226 0.182 1.441 0.97 3.216 1.549 5.125 1.549 5.112 0 9.256-4.144 9.256-9.256s-4.143-9.255-9.255-9.256h-0zM15.18 23.526c0.072 0.061 0.15 0.122 0.226 0.182-1.44 0.969-3.214 1.547-5.123 1.547-5.112 0-9.255-4.144-9.255-9.255s4.144-9.255 9.255-9.255c1.907 0 3.68 0.577 5.153 1.566l-0.033-0.021c-0.075 0.059-0.143 0.121-0.205 0.186l-0.001 0.001c-2.116 1.836-3.446 4.528-3.446 7.531 0 2.996 1.323 5.682 3.417 7.507l0.012 0.010z" }));
|
|
2940
|
-
}
|
|
2941
|
-
if (network === "VERVE") {
|
|
2942
|
-
return /* @__PURE__ */ import_react49.default.createElement("div", { className: `font-bold italic flex items-center justify-center tracking-widest ${className}`, style: { fontFamily: "sans-serif" } }, "Verve");
|
|
2943
|
-
}
|
|
2944
|
-
return /* @__PURE__ */ import_react49.default.createElement("svg", { className, fill: "currentColor", viewBox: "0 0 32 32", xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ import_react49.default.createElement("title", null, "Visa"), /* @__PURE__ */ import_react49.default.createElement("path", { d: "M15.854 11.329l-2.003 9.367h-2.424l2.006-9.367zM26.051 17.377l1.275-3.518 0.735 3.518zM28.754 20.696h2.242l-1.956-9.367h-2.069c-0.003-0-0.007-0-0.010-0-0.459 0-0.853 0.281-1.019 0.68l-0.003 0.007-3.635 8.68h2.544l0.506-1.4h3.109zM22.429 17.638c0.010-2.473-3.419-2.609-3.395-3.714 0.008-0.336 0.327-0.694 1.027-0.785 0.13-0.013 0.28-0.021 0.432-0.021 0.711 0 1.385 0.162 1.985 0.452l-0.027-0.012 0.425-1.987c-0.673-0.261-1.452-0.413-2.266-0.416h-0.001c-2.396 0-4.081 1.275-4.096 3.098-0.015 1.348 1.203 2.099 2.122 2.549 0.945 0.459 1.262 0.754 1.257 1.163-0.006 0.63-0.752 0.906-1.45 0.917-0.032 0.001-0.071 0.001-0.109 0.001-0.871 0-1.691-0.219-2.407-0.606l0.027 0.013-0.439 2.052c0.786 0.315 1.697 0.497 2.651 0.497 0.015 0 0.030-0 0.045-0h-0.002c2.546 0 4.211-1.257 4.22-3.204zM12.391 11.329l-3.926 9.367h-2.562l-1.932-7.477c-0.037-0.364-0.26-0.668-0.57-0.82l-0.006-0.003c-0.688-0.338-1.488-0.613-2.325-0.786l-0.066-0.011 0.058-0.271h4.124c0 0 0.001 0 0.001 0 0.562 0 1.028 0.411 1.115 0.948l0.001 0.006 1.021 5.421 2.522-6.376z" }));
|
|
2945
|
-
};
|
|
2946
|
-
|
|
2947
|
-
// src/components/Stagger.tsx
|
|
2948
|
-
var import_react50 = __toESM(require("react"));
|
|
2949
|
-
var import_react51 = require("@hugeicons/react");
|
|
2950
|
-
var import_core_free_icons15 = require("@hugeicons/core-free-icons");
|
|
2951
|
-
var Stagger = ({ steps, currentStep }) => {
|
|
2952
|
-
const getIconForStep = (stepName) => {
|
|
2953
|
-
const lowerName = stepName.toLowerCase();
|
|
2954
|
-
if (lowerName.includes("document")) return import_core_free_icons15.Upload01Icon;
|
|
2955
|
-
if (lowerName.includes("review")) return import_core_free_icons15.FileSyncIcon;
|
|
2956
|
-
if (lowerName.includes("submit")) return import_core_free_icons15.CloudUploadIcon;
|
|
2957
|
-
return import_core_free_icons15.Briefcase02Icon;
|
|
2958
|
-
};
|
|
2959
|
-
return /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-full flex items-center justify-between relative z-0" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 w-full h-px bg-neutral-100 -z-10" }), /* @__PURE__ */ import_react50.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 h-px bg-emerald-500 -z-10 transition-all duration-500", style: { width: `${currentStep / (steps.length - 1) * 100}%` } }), steps.map((step, idx) => {
|
|
2960
|
-
const isActive = idx === currentStep;
|
|
2961
|
-
const isPassed = idx < currentStep;
|
|
2962
|
-
const colorClass = isPassed ? "bg-emerald-500 text-white" : isActive ? "bg-neutral-100 text-neutral-500" : "bg-neutral-100 text-neutral-500";
|
|
2963
|
-
return /* @__PURE__ */ import_react50.default.createElement("div", { key: step, className: `w-6 h-6 rounded-full flex items-center justify-center transition-colors duration-300 ${colorClass}` }, /* @__PURE__ */ import_react50.default.createElement(import_react51.HugeiconsIcon, { icon: getIconForStep(step), size: 11 }));
|
|
2964
|
-
}));
|
|
1343
|
+
), /* @__PURE__ */ import_react29.default.createElement("div", { className: "absolute inset-x-0 bottom-0 p-6 sm:p-8 z-30 flex flex-col justify-end text-left pointer-events-none" }, title && /* @__PURE__ */ import_react29.default.createElement("h3", { className: " text-xl sm:text-2xl md:text-3xl text-white tracking-tight mb-2 sm:mb-3 drop-shadow-md" }, title), subtitle && /* @__PURE__ */ import_react29.default.createElement("p", { className: "text-[13px] sm:text-[15px] leading-relaxed text-neutral-300 max-w-2xl drop-shadow-sm" }, subtitle)));
|
|
2965
1344
|
};
|
|
2966
1345
|
|
|
2967
1346
|
// src/components/MedicalFeatureStatsBlock.tsx
|
|
2968
|
-
var
|
|
1347
|
+
var import_react31 = __toESM(require("react"));
|
|
2969
1348
|
var import_image9 = __toESM(require("next/image"));
|
|
2970
1349
|
var MedicalFeatureStatsBlock = ({
|
|
2971
1350
|
bottomHeadline,
|
|
@@ -2974,9 +1353,9 @@ var MedicalFeatureStatsBlock = ({
|
|
|
2974
1353
|
trustText,
|
|
2975
1354
|
stats
|
|
2976
1355
|
}) => {
|
|
2977
|
-
const [isAnimating, setIsAnimating] = (0,
|
|
2978
|
-
const titleRef = (0,
|
|
2979
|
-
(0,
|
|
1356
|
+
const [isAnimating, setIsAnimating] = (0, import_react31.useState)(false);
|
|
1357
|
+
const titleRef = (0, import_react31.useRef)(null);
|
|
1358
|
+
(0, import_react31.useEffect)(() => {
|
|
2980
1359
|
const observer = new IntersectionObserver(
|
|
2981
1360
|
([entry]) => {
|
|
2982
1361
|
if (entry.isIntersecting) {
|
|
@@ -2994,15 +1373,15 @@ var MedicalFeatureStatsBlock = ({
|
|
|
2994
1373
|
}
|
|
2995
1374
|
return () => observer.disconnect();
|
|
2996
1375
|
}, []);
|
|
2997
|
-
return /* @__PURE__ */
|
|
1376
|
+
return /* @__PURE__ */ import_react31.default.createElement("section", { className: "py-24 w-full flex justify-center relative z-10" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-10 mb-12" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "max-w-xl" }, /* @__PURE__ */ import_react31.default.createElement(
|
|
2998
1377
|
"h2",
|
|
2999
1378
|
{
|
|
3000
1379
|
ref: titleRef,
|
|
3001
|
-
className: `text-3xl text-
|
|
1380
|
+
className: `text-3xl text-black tracking-tight leading-[1.1] mb-5 ${isAnimating ? "" : ""}`,
|
|
3002
1381
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
3003
1382
|
},
|
|
3004
1383
|
bottomHeadline
|
|
3005
|
-
), /* @__PURE__ */
|
|
1384
|
+
), /* @__PURE__ */ import_react31.default.createElement("p", { className: "text-[14px] leading-relaxed text-neutral-500" }, bottomDescription)), /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center gap-4 shrink-0" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex -space-x-3" }, avatars.map((src, i) => /* @__PURE__ */ import_react31.default.createElement("div", { key: i, className: "relative w-12 h-12 rounded-full border-[3px] border-white overflow-hidden bg-neutral-100 z-1 hover:z-10 transition-all" }, /* @__PURE__ */ import_react31.default.createElement(
|
|
3006
1385
|
import_image9.default,
|
|
3007
1386
|
{
|
|
3008
1387
|
src,
|
|
@@ -3011,17 +1390,17 @@ var MedicalFeatureStatsBlock = ({
|
|
|
3011
1390
|
sizes: "48px",
|
|
3012
1391
|
className: "object-cover"
|
|
3013
1392
|
}
|
|
3014
|
-
)))), /* @__PURE__ */
|
|
1393
|
+
)))), /* @__PURE__ */ import_react31.default.createElement("p", { className: "text-[11px] text-neutral-800 leading-[1.4] max-w-55" }, trustText))), /* @__PURE__ */ import_react31.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, stats.map((stat, idx) => /* @__PURE__ */ import_react31.default.createElement("div", { key: idx, className: "bg-white rounded-4xl p-8 md:p-10 flex flex-col h-70" }, /* @__PURE__ */ import_react31.default.createElement("div", { className: "flex items-center p-0.5 mb-6" }, /* @__PURE__ */ import_react31.default.createElement("span", { className: "text-[14px] text-neutral-500 tracking-wide" }, stat.label)), /* @__PURE__ */ import_react31.default.createElement("div", { className: "text-6xl gradient-text md:text-[80px] font-light tracking-tighter text-black mt-auto leading-none" }, stat.value))))));
|
|
3015
1394
|
};
|
|
3016
1395
|
|
|
3017
1396
|
// src/components/ConsultantShowcase.tsx
|
|
3018
|
-
var
|
|
1397
|
+
var import_react32 = __toESM(require("react"));
|
|
3019
1398
|
var import_image10 = __toESM(require("next/image"));
|
|
3020
|
-
var
|
|
3021
|
-
var
|
|
1399
|
+
var import_react33 = require("@hugeicons/react");
|
|
1400
|
+
var import_core_free_icons7 = require("@hugeicons/core-free-icons");
|
|
3022
1401
|
var ImageWithLoader = ({ src, alt, className, sizes, priority = false }) => {
|
|
3023
|
-
const [isLoading, setIsLoading] = (0,
|
|
3024
|
-
return /* @__PURE__ */
|
|
1402
|
+
const [isLoading, setIsLoading] = (0, import_react32.useState)(true);
|
|
1403
|
+
return /* @__PURE__ */ import_react32.default.createElement("div", { className: `absolute inset-0 bg-neutral-800 ${className}` }, isLoading && /* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-800/50 backdrop-blur-md transition-opacity duration-300" }, /* @__PURE__ */ import_react32.default.createElement(import_react33.HugeiconsIcon, { icon: import_core_free_icons7.Loading03Icon, size: 24, className: "animate-spin text-white/50" })), /* @__PURE__ */ import_react32.default.createElement(
|
|
3025
1404
|
import_image10.default,
|
|
3026
1405
|
{
|
|
3027
1406
|
src,
|
|
@@ -3040,9 +1419,9 @@ var ImageWithLoader = ({ src, alt, className, sizes, priority = false }) => {
|
|
|
3040
1419
|
var ConsultantShowcase = ({
|
|
3041
1420
|
profiles
|
|
3042
1421
|
}) => {
|
|
3043
|
-
const [currentIndex, setCurrentIndex] = (0,
|
|
3044
|
-
const [touchStart, setTouchStart] = (0,
|
|
3045
|
-
const [touchEnd, setTouchEnd] = (0,
|
|
1422
|
+
const [currentIndex, setCurrentIndex] = (0, import_react32.useState)(0);
|
|
1423
|
+
const [touchStart, setTouchStart] = (0, import_react32.useState)(null);
|
|
1424
|
+
const [touchEnd, setTouchEnd] = (0, import_react32.useState)(null);
|
|
3046
1425
|
const nextSlide = () => {
|
|
3047
1426
|
setCurrentIndex((prev) => prev === profiles.length - 1 ? 0 : prev + 1);
|
|
3048
1427
|
};
|
|
@@ -3067,23 +1446,23 @@ var ConsultantShowcase = ({
|
|
|
3067
1446
|
}
|
|
3068
1447
|
};
|
|
3069
1448
|
if (!profiles || profiles.length === 0) return null;
|
|
3070
|
-
return /* @__PURE__ */
|
|
1449
|
+
return /* @__PURE__ */ import_react32.default.createElement("section", { className: "py-24 w-full flex justify-center px-4 md:px-8 z-10 relative" }, /* @__PURE__ */ import_react32.default.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ import_react32.default.createElement(
|
|
3071
1450
|
"div",
|
|
3072
1451
|
{
|
|
3073
|
-
className: "relative w-full h-100 md:h-112.5 rounded-4xl overflow-hidden bg-neutral-900
|
|
1452
|
+
className: "relative w-full h-100 md:h-112.5 rounded-4xl overflow-hidden bg-neutral-900 group select-none",
|
|
3074
1453
|
onTouchStart,
|
|
3075
1454
|
onTouchMove,
|
|
3076
1455
|
onTouchEnd
|
|
3077
1456
|
},
|
|
3078
1457
|
profiles.map((profile, idx) => {
|
|
3079
1458
|
const isActive = idx === currentIndex;
|
|
3080
|
-
return /* @__PURE__ */
|
|
1459
|
+
return /* @__PURE__ */ import_react32.default.createElement(
|
|
3081
1460
|
"div",
|
|
3082
1461
|
{
|
|
3083
1462
|
key: profile.id,
|
|
3084
1463
|
className: `absolute inset-0 transition-opacity duration-700 ease-in-out ${isActive ? "opacity-100 z-10" : "opacity-0 z-0 pointer-events-none"}`
|
|
3085
1464
|
},
|
|
3086
|
-
/* @__PURE__ */
|
|
1465
|
+
/* @__PURE__ */ import_react32.default.createElement(
|
|
3087
1466
|
ImageWithLoader,
|
|
3088
1467
|
{
|
|
3089
1468
|
src: profile.imageSrc,
|
|
@@ -3091,14 +1470,14 @@ var ConsultantShowcase = ({
|
|
|
3091
1470
|
priority: idx === 0
|
|
3092
1471
|
}
|
|
3093
1472
|
),
|
|
3094
|
-
/* @__PURE__ */
|
|
3095
|
-
/* @__PURE__ */
|
|
3096
|
-
/* @__PURE__ */
|
|
1473
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute inset-0 bg-black/20 z-10 pointer-events-none" }),
|
|
1474
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute top-0 left-0 w-full h-[60%] bg-linear-to-b from-black/80 via-black/30 to-transparent z-20 pointer-events-none" }),
|
|
1475
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: `absolute top-8 left-8 md:top-12 md:left-12 z-30 text-white max-w-lg transition-transform duration-700 ease-out ${isActive ? "translate-y-0" : "-translate-y-4"}` }, /* @__PURE__ */ import_react32.default.createElement("h2", { className: "text-[29px] tracking-tight mb-2 leading-none" }, profile.name), /* @__PURE__ */ import_react32.default.createElement("div", { className: "flex flex-col gap-0.5" }, /* @__PURE__ */ import_react32.default.createElement("p", { className: "text-[15px] text-white/80 font-light tracking-wide" }, profile.role), profile.description && /* @__PURE__ */ import_react32.default.createElement("p", { className: "text-[15px] text-white/80 font-light tracking-wide mt-1" }, profile.description)))
|
|
3097
1476
|
);
|
|
3098
1477
|
}),
|
|
3099
|
-
/* @__PURE__ */
|
|
3100
|
-
/* @__PURE__ */
|
|
3101
|
-
/* @__PURE__ */
|
|
1478
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute top-0 left-0 w-[20%] h-full z-40 cursor-w-resize hidden md:block", onClick: prevSlide, "aria-label": "Previous image" }),
|
|
1479
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute top-0 right-0 w-[20%] h-full z-40 cursor-e-resize hidden md:block", onClick: nextSlide, "aria-label": "Next image" }),
|
|
1480
|
+
/* @__PURE__ */ import_react32.default.createElement("div", { className: "absolute bottom-6 md:bottom-8 left-0 w-full px-4 z-30 flex justify-center items-center gap-2" }, profiles.map((_, idx) => /* @__PURE__ */ import_react32.default.createElement(
|
|
3102
1481
|
"button",
|
|
3103
1482
|
{
|
|
3104
1483
|
key: idx,
|
|
@@ -3111,10 +1490,10 @@ var ConsultantShowcase = ({
|
|
|
3111
1490
|
};
|
|
3112
1491
|
|
|
3113
1492
|
// src/components/ContentGridBlock.tsx
|
|
3114
|
-
var
|
|
1493
|
+
var import_react34 = __toESM(require("react"));
|
|
3115
1494
|
var import_image11 = __toESM(require("next/image"));
|
|
3116
|
-
var
|
|
3117
|
-
var
|
|
1495
|
+
var import_react35 = require("@hugeicons/react");
|
|
1496
|
+
var import_core_free_icons8 = require("@hugeicons/core-free-icons");
|
|
3118
1497
|
var ContentGridBlock = ({
|
|
3119
1498
|
header,
|
|
3120
1499
|
leftCard,
|
|
@@ -3122,23 +1501,23 @@ var ContentGridBlock = ({
|
|
|
3122
1501
|
middleBottomCard,
|
|
3123
1502
|
rightCards
|
|
3124
1503
|
}) => {
|
|
3125
|
-
return /* @__PURE__ */
|
|
1504
|
+
return /* @__PURE__ */ import_react34.default.createElement("section", { className: " w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "max-w-300 w-full px-4 md:px-8 flex flex-col gap-12" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-6 w-full" }, /* @__PURE__ */ import_react34.default.createElement("h2", { className: "text-3xl tracking-tight text-black leading-[1.15] max-w-lg" }, header.titlePrefix, " ", /* @__PURE__ */ import_react34.default.createElement("span", { className: "gradient-text" }, header.highlightText))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex flex-col justify-end" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "bg-black rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[17px] text-white leading-snug mb-4" }, leftCard.mainText), leftCard.tag && /* @__PURE__ */ import_react34.default.createElement("span", { className: "mb-auto text-[11px] text-neutral-200 tracking-widest" }, leftCard.tag), /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex items-center justify-between mt-8" }, /* @__PURE__ */ import_react34.default.createElement("div", null, /* @__PURE__ */ import_react34.default.createElement("h4", { className: "text-[15px] text-white" }, leftCard.title), /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[13px] text-neutral-300" }, leftCard.subtitle)), /* @__PURE__ */ import_react34.default.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ import_react34.default.createElement(import_image11.default, { src: leftCard.thumbnailSrc, alt: leftCard.title, fill: true, className: "object-cover" }))))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "bg-white rounded-3xl p-8 flex flex-col relative h-75" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "absolute top-6 right-6 flex flex-col items-end gap-1" }, /* @__PURE__ */ import_react34.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-wide" }, middleTopCard.topRightLabel), /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex -space-x-2" }, middleTopCard.topRightAvatars.map((src, i) => /* @__PURE__ */ import_react34.default.createElement("div", { key: i, className: "w-7 h-7 rounded-full border-2 border-white overflow-hidden relative z-10" }, /* @__PURE__ */ import_react34.default.createElement(import_image11.default, { src, alt: "Avatar", fill: true, className: "object-cover", sizes: "28px" })))), /* @__PURE__ */ import_react34.default.createElement("span", { className: "text-sm text-neutral-500" }, middleTopCard.topRightCount))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "grow flex flex-col justify-center items-center py-6" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "px-5 py-2 rounded-full bg-neutral-50/50 border border-neutral-100 text-[13px] text-neutral-600" }, middleTopCard.badgePrefix, " ", /* @__PURE__ */ import_react34.default.createElement("span", { className: " text-black" }, middleTopCard.badgeHighlight), middleTopCard.badgeSuffix)), /* @__PURE__ */ import_react34.default.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[11px] text-neutral-400 tracking-wide mb-1" }, middleTopCard.title), /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[14px] text-black leading-snug pr-4" }, middleTopCard.description))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "bg-white rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex justify-between items-start mb-6" }, /* @__PURE__ */ import_react34.default.createElement("div", null, /* @__PURE__ */ import_react34.default.createElement("h4", { className: "text-[15px] text-black leading-tight" }, middleBottomCard.title), /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[13px] text-neutral-400" }, middleBottomCard.subtitle)), /* @__PURE__ */ import_react34.default.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ import_react34.default.createElement(import_image11.default, { src: middleBottomCard.thumbnailSrc, alt: middleBottomCard.title, fill: true, className: "object-cover" }))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[16px] text-black leading-snug mb-4" }, middleBottomCard.mainText), middleBottomCard.tag && /* @__PURE__ */ import_react34.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-widest" }, middleBottomCard.tag)))), /* @__PURE__ */ import_react34.default.createElement("div", { className: "flex flex-col gap-6" }, rightCards.slice(0, 2).map((card, idx) => /* @__PURE__ */ import_react34.default.createElement("div", { key: idx, className: "relative w-full h-80 bg-[#ffffff] text-black rounded-3xl overflow-hidden group" }, /* @__PURE__ */ import_react34.default.createElement("div", { className: "absolute inset-0 z-20 pointer-events-none" }), /* @__PURE__ */ import_react34.default.createElement("div", { className: "absolute inset-0 z-30 p-6 flex flex-col justify-end text-black" }, /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[14px] leading-snug mb-3 pr-2 text-black/90" }, card.mainText), card.tag && /* @__PURE__ */ import_react34.default.createElement("span", { className: "mb-4 text-[11px] text-black/50 tracking-widest" }, card.tag), /* @__PURE__ */ import_react34.default.createElement("div", { className: "pt-3" }, /* @__PURE__ */ import_react34.default.createElement("h4", { className: "text-[15px] tracking-wide" }, card.title), /* @__PURE__ */ import_react34.default.createElement("p", { className: "text-[13px] text-black/60" }, card.subtitle)))))))));
|
|
3126
1505
|
};
|
|
3127
1506
|
|
|
3128
1507
|
// src/components/ManagedProjectsBlock.tsx
|
|
3129
|
-
var
|
|
3130
|
-
var
|
|
1508
|
+
var import_react36 = __toESM(require("react"));
|
|
1509
|
+
var import_link7 = __toESM(require("next/link"));
|
|
3131
1510
|
var GridSection = ({
|
|
3132
1511
|
children,
|
|
3133
1512
|
isLast = false,
|
|
3134
1513
|
className = "py-8 md:py-10"
|
|
3135
|
-
}) => /* @__PURE__ */
|
|
1514
|
+
}) => /* @__PURE__ */ import_react36.default.createElement("div", { className: `relative px-5 md:px-12 ${className} ${!isLast ? "" : ""}` }, children);
|
|
3136
1515
|
var ManagedProjectsBlock = ({
|
|
3137
1516
|
tagline,
|
|
3138
1517
|
title,
|
|
3139
1518
|
projects
|
|
3140
1519
|
}) => {
|
|
3141
|
-
return /* @__PURE__ */
|
|
1520
|
+
return /* @__PURE__ */ import_react36.default.createElement("div", { className: "grow pt-28 pb-20 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-5xl mx-auto overflow-hidden" }, /* @__PURE__ */ import_react36.default.createElement(
|
|
3142
1521
|
"div",
|
|
3143
1522
|
{
|
|
3144
1523
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -3147,17 +1526,15 @@ var ManagedProjectsBlock = ({
|
|
|
3147
1526
|
backgroundRepeat: "repeat"
|
|
3148
1527
|
}
|
|
3149
1528
|
}
|
|
3150
|
-
), /* @__PURE__ */
|
|
1529
|
+
), /* @__PURE__ */ import_react36.default.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ import_react36.default.createElement(GridSection, null, tagline && /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ import_react36.default.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), projects.map((project, index) => {
|
|
3151
1530
|
const isLast = index === projects.length - 1;
|
|
3152
|
-
const projectContent = /* @__PURE__ */
|
|
3153
|
-
return /* @__PURE__ */
|
|
1531
|
+
const projectContent = /* @__PURE__ */ import_react36.default.createElement("div", { className: "group block w-full" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex flex-col md:flex-row md:items-center justify-between gap-3 md:gap-4 mb-4 md:mb-5" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex items-center gap-3 md:gap-4" }, /* @__PURE__ */ import_react36.default.createElement("h2", { className: " text-[16px] text-black transition-all flex items-center gap-2" }, project.title, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[11px] opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-300" }, project.isExternal ? "\u2197" : "\u2192")), /* @__PURE__ */ import_react36.default.createElement("span", { className: `text-[9px] px-2.5 py-1 rounded-full tracking-[0.15em] transition-colors ${project.status.toLowerCase() === "production" ? "bg-black text-white" : "bg-neutral-100 text-neutral-500 group-hover:bg-neutral-100 group-hover:text-black"}` }, project.status)), /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 shrink-0 " }, project.date)), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 max-w-4xl text-left transition-colors group-hover:text-black" }, project.description));
|
|
1532
|
+
return /* @__PURE__ */ import_react36.default.createElement(GridSection, { key: project.id || index, isLast, className: isLast ? "py-8 md:py-10 pb-12 md:pb-14" : "py-8 md:py-10" }, project.isExternal ? /* @__PURE__ */ import_react36.default.createElement("a", { href: project.link, target: "_blank", rel: "noopener noreferrer", className: "block outline-none" }, projectContent) : /* @__PURE__ */ import_react36.default.createElement(import_link7.default, { href: project.link, className: "block outline-none" }, projectContent));
|
|
3154
1533
|
}))));
|
|
3155
1534
|
};
|
|
3156
1535
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3157
1536
|
0 && (module.exports = {
|
|
3158
1537
|
AppBento2,
|
|
3159
|
-
Banner,
|
|
3160
|
-
CardLogo,
|
|
3161
1538
|
ConsultantShowcase,
|
|
3162
1539
|
ContentGridBlock,
|
|
3163
1540
|
Faq,
|
|
@@ -3177,19 +1554,9 @@ var ManagedProjectsBlock = ({
|
|
|
3177
1554
|
MedicalFeatureStatsBlock,
|
|
3178
1555
|
NumberInput,
|
|
3179
1556
|
PageSpinner,
|
|
3180
|
-
PipleAuth,
|
|
3181
1557
|
PlatformFeatures,
|
|
3182
1558
|
PortfolioHero,
|
|
3183
|
-
Stagger,
|
|
3184
1559
|
TextInput,
|
|
3185
1560
|
ThreeDActionButton,
|
|
3186
|
-
ThreeDButton
|
|
3187
|
-
UniversalErrorView,
|
|
3188
|
-
UniversalHomeView,
|
|
3189
|
-
UniversalOrganizationPage,
|
|
3190
|
-
UniversalProfileSettings,
|
|
3191
|
-
UniversalSidebar,
|
|
3192
|
-
UniversalTransactionPage,
|
|
3193
|
-
UniversalWalletPage,
|
|
3194
|
-
ZairusAuth
|
|
1561
|
+
ThreeDButton
|
|
3195
1562
|
});
|