@retinalabsllc/zairusjs 0.7.8 → 0.7.9
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 +116 -3
- package/dist/index.d.ts +116 -3
- package/dist/index.js +923 -553
- package/dist/index.mjs +640 -273
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,57 +1,95 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
// src/components/Faq.tsx
|
|
4
|
-
import React, { useState } from "react";
|
|
5
|
-
import { HugeiconsIcon } from "@hugeicons/react";
|
|
6
|
-
import { ArrowDown01Icon } from "@hugeicons/core-free-icons";
|
|
4
|
+
import React, { useState, useEffect, useRef } from "react";
|
|
7
5
|
var Faq = ({
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
badgeText = "FAQ",
|
|
7
|
+
title = /* @__PURE__ */ React.createElement(React.Fragment, null, "Helpful Answers For", /* @__PURE__ */ React.createElement("br", null), "Better Understanding"),
|
|
10
8
|
items
|
|
11
9
|
}) => {
|
|
12
|
-
const [activeFaq, setActiveFaq] = useState(
|
|
10
|
+
const [activeFaq, setActiveFaq] = useState(0);
|
|
11
|
+
const [isAnimating, setIsAnimating] = useState(false);
|
|
12
|
+
const titleRef = useRef(null);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const observer = new IntersectionObserver(
|
|
15
|
+
([entry]) => {
|
|
16
|
+
if (entry.isIntersecting) {
|
|
17
|
+
if (entry.boundingClientRect.top > 0) {
|
|
18
|
+
setIsAnimating(true);
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
setIsAnimating(false);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{ threshold: 0.1 }
|
|
25
|
+
// Triggers when 10% of the title is visible
|
|
26
|
+
);
|
|
27
|
+
if (titleRef.current) {
|
|
28
|
+
observer.observe(titleRef.current);
|
|
29
|
+
}
|
|
30
|
+
return () => observer.disconnect();
|
|
31
|
+
}, []);
|
|
13
32
|
const toggleFaq = (index) => {
|
|
14
33
|
setActiveFaq(activeFaq === index ? null : index);
|
|
15
34
|
};
|
|
16
|
-
return /* @__PURE__ */ React.createElement("div", { className: "w-full flex justify-center
|
|
35
|
+
return /* @__PURE__ */ React.createElement("div", { className: "py-24 w-full flex justify-center px-4 md:px-8 z-10 relative" }, /* @__PURE__ */ React.createElement("div", { className: "max-w-300 w-full flex flex-col lg:flex-row gap-12 lg:gap-20" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-col items-start lg:w-[40%] shrink-0" }, badgeText && /* @__PURE__ */ React.createElement("div", { className: "inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-black text-white mb-6 shadow-[0_4px_14px_rgba(0,0,0,0.15)]" }, /* @__PURE__ */ React.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-white/90" }), /* @__PURE__ */ React.createElement("span", { className: "text-[10px] tracking-widest uppercase font-medium mt-px" }, badgeText)), title && /* @__PURE__ */ React.createElement(
|
|
36
|
+
"h2",
|
|
37
|
+
{
|
|
38
|
+
ref: titleRef,
|
|
39
|
+
className: `font-serif text-4xl md:text-5xl text-black tracking-tight leading-[1.15] ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
40
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
41
|
+
},
|
|
42
|
+
title
|
|
43
|
+
)), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-6 lg:w-[60%] w-full" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3 w-full" }, items.map((faq, index) => {
|
|
17
44
|
const isOpen = activeFaq === index;
|
|
18
|
-
const
|
|
45
|
+
const getShadowStyle = () => {
|
|
46
|
+
if (isOpen) return `
|
|
47
|
+
inset 0 1.5px 0 0 rgba(255, 255, 255, 0.2),
|
|
48
|
+
inset 0 -3px 0 0 rgba(0, 0, 0, 0.3),
|
|
49
|
+
0 4px 0 0 #0c0c0c,
|
|
50
|
+
0 12px 24px rgba(0, 0, 0, 0.1)
|
|
51
|
+
`;
|
|
52
|
+
return "none";
|
|
53
|
+
};
|
|
19
54
|
return /* @__PURE__ */ React.createElement(
|
|
20
55
|
"div",
|
|
21
56
|
{
|
|
22
57
|
key: index,
|
|
23
|
-
className: `transition-all duration-
|
|
58
|
+
className: `relative transition-all duration-500 rounded-4xl overflow-hidden ${isOpen ? "bg-black border-transparent" : "border border-neutral-200 hover:border-neutral-300"}`,
|
|
59
|
+
style: { boxShadow: getShadowStyle() }
|
|
24
60
|
},
|
|
61
|
+
isOpen && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
65
|
+
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")` }
|
|
66
|
+
}
|
|
67
|
+
), /* @__PURE__ */ React.createElement("span", { className: "absolute inset-0 rounded-4xl bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none z-10" })),
|
|
25
68
|
/* @__PURE__ */ React.createElement(
|
|
26
69
|
"button",
|
|
27
70
|
{
|
|
28
|
-
className: "flex items-center justify-between w-full gap-4 text-left
|
|
71
|
+
className: "relative z-20 flex items-center justify-between w-full gap-4 text-left px-6 py-5 outline-none cursor-pointer group",
|
|
29
72
|
onClick: () => toggleFaq(index)
|
|
30
73
|
},
|
|
31
74
|
/* @__PURE__ */ React.createElement(
|
|
32
75
|
"span",
|
|
33
76
|
{
|
|
34
|
-
className: `text-[
|
|
77
|
+
className: `text-[15px] font-medium transition-colors duration-300 flex items-center gap-2 ${isOpen ? "text-white" : "text-black"}`
|
|
35
78
|
},
|
|
79
|
+
/* @__PURE__ */ React.createElement("span", { className: isOpen ? "text-neutral-400" : "text-neutral-400" }, index + 1, "."),
|
|
36
80
|
faq.question
|
|
37
81
|
),
|
|
38
|
-
/* @__PURE__ */ React.createElement(
|
|
39
|
-
"div",
|
|
40
|
-
{
|
|
41
|
-
className: `shrink-0 flex items-center justify-center w-8 h-8 rounded-full border transition-all duration-300 ${isOpen ? "rotate-180 border-black text-black" : "border-neutral-300 text-neutral-500 group-hover:border-neutral-400 group-hover:text-black"}`
|
|
42
|
-
},
|
|
43
|
-
/* @__PURE__ */ React.createElement(HugeiconsIcon, { icon: ArrowDown01Icon, size: 16 })
|
|
44
|
-
)
|
|
82
|
+
/* @__PURE__ */ React.createElement("div", { className: `shrink-0 transition-colors duration-300 ${isOpen ? "text-white" : "text-black group-hover:text-black/70"}` }, isOpen ? /* @__PURE__ */ React.createElement("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M8 12h8", strokeLinecap: "round" })) : /* @__PURE__ */ React.createElement("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.5" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8v8M8 12h8", strokeLinecap: "round" })))
|
|
45
83
|
),
|
|
46
84
|
/* @__PURE__ */ React.createElement(
|
|
47
85
|
"div",
|
|
48
86
|
{
|
|
49
|
-
className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr]
|
|
87
|
+
className: `relative z-20 grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0"}`
|
|
50
88
|
},
|
|
51
|
-
/* @__PURE__ */ React.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ React.createElement("p", { className:
|
|
89
|
+
/* @__PURE__ */ React.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ React.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))
|
|
52
90
|
)
|
|
53
91
|
);
|
|
54
|
-
}))));
|
|
92
|
+
})))));
|
|
55
93
|
};
|
|
56
94
|
|
|
57
95
|
// src/components/ThreeDButton.tsx
|
|
@@ -111,7 +149,7 @@ var ThreeDButton = ({
|
|
|
111
149
|
|
|
112
150
|
// src/components/ThreeDActionButton.tsx
|
|
113
151
|
import React3 from "react";
|
|
114
|
-
import { HugeiconsIcon
|
|
152
|
+
import { HugeiconsIcon } from "@hugeicons/react";
|
|
115
153
|
import { Loading03Icon } from "@hugeicons/core-free-icons";
|
|
116
154
|
var ThreeDActionButton = ({
|
|
117
155
|
type = "button",
|
|
@@ -182,12 +220,12 @@ var ThreeDActionButton = ({
|
|
|
182
220
|
}
|
|
183
221
|
},
|
|
184
222
|
/* @__PURE__ */ React3.createElement("span", { className: "absolute inset-0 rounded-full bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none" }),
|
|
185
|
-
/* @__PURE__ */ React3.createElement("span", { className: "relative z-10 flex items-center justify-center gap-2 leading-none" }, isLoading ? /* @__PURE__ */ React3.createElement(
|
|
223
|
+
/* @__PURE__ */ React3.createElement("span", { className: "relative z-10 flex items-center justify-center gap-2 leading-none" }, isLoading ? /* @__PURE__ */ React3.createElement(HugeiconsIcon, { icon: Loading03Icon, size: 16, className: "animate-spin text-white" }) : children)
|
|
186
224
|
);
|
|
187
225
|
};
|
|
188
226
|
|
|
189
227
|
// src/components/ZairusAuth.tsx
|
|
190
|
-
import React4, { useState as useState2, useRef, useEffect, Suspense } from "react";
|
|
228
|
+
import React4, { useState as useState2, useRef as useRef2, useEffect as useEffect2, Suspense } from "react";
|
|
191
229
|
import { useSearchParams } from "next/navigation";
|
|
192
230
|
import toast from "react-hot-toast";
|
|
193
231
|
import { useGoogleReCaptcha, GoogleReCaptchaProvider } from "react-google-recaptcha-v3";
|
|
@@ -223,11 +261,11 @@ function AuthFormInner({
|
|
|
223
261
|
const [orgName, setOrgName] = useState2("");
|
|
224
262
|
const [agreedToTerms, setAgreedToTerms] = useState2(false);
|
|
225
263
|
const [otp, setOtp] = useState2(["", "", "", "", "", ""]);
|
|
226
|
-
const inputRefs =
|
|
264
|
+
const inputRefs = useRef2([]);
|
|
227
265
|
const cleanAlpha = (val) => val.replace(/[^a-zA-Z\s-]/g, "");
|
|
228
266
|
const cleanOrgName = (val) => val.replace(/[^a-zA-Z0-9\s]/g, "").substring(0, 50);
|
|
229
267
|
const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
|
|
230
|
-
|
|
268
|
+
useEffect2(() => {
|
|
231
269
|
if (countdown > 0) {
|
|
232
270
|
const timer = setTimeout(() => setCountdown(countdown - 1), 1e3);
|
|
233
271
|
return () => clearTimeout(timer);
|
|
@@ -513,7 +551,7 @@ var Header = ({
|
|
|
513
551
|
// src/components/Footer.tsx
|
|
514
552
|
import React6, { useState as useState3 } from "react";
|
|
515
553
|
import Link3 from "next/link";
|
|
516
|
-
import { HugeiconsIcon as
|
|
554
|
+
import { HugeiconsIcon as HugeiconsIcon2 } from "@hugeicons/react";
|
|
517
555
|
var Footer = ({
|
|
518
556
|
description,
|
|
519
557
|
columns,
|
|
@@ -555,12 +593,12 @@ var Footer = ({
|
|
|
555
593
|
className: "text-neutral-400 hover:text-black transition-colors",
|
|
556
594
|
"aria-label": social.name
|
|
557
595
|
},
|
|
558
|
-
/* @__PURE__ */ React6.createElement(
|
|
596
|
+
/* @__PURE__ */ React6.createElement(HugeiconsIcon2, { icon: social.icon, size: 20 })
|
|
559
597
|
))))))));
|
|
560
598
|
};
|
|
561
599
|
|
|
562
600
|
// src/components/HeroSection.tsx
|
|
563
|
-
import React7 from "react";
|
|
601
|
+
import React7, { useState as useState4, useEffect as useEffect3, useRef as useRef3 } from "react";
|
|
564
602
|
import Link4 from "next/link";
|
|
565
603
|
import Image2 from "next/image";
|
|
566
604
|
var HeroSection = ({
|
|
@@ -573,9 +611,32 @@ var HeroSection = ({
|
|
|
573
611
|
ctaHref,
|
|
574
612
|
secondaryCtaText,
|
|
575
613
|
secondaryCtaHref,
|
|
614
|
+
showApps = false,
|
|
615
|
+
appsText,
|
|
616
|
+
appLogos,
|
|
576
617
|
showImage = false,
|
|
577
618
|
imageSrc = "/assets/ai.avif"
|
|
578
619
|
}) => {
|
|
620
|
+
const [isAnimating, setIsAnimating] = useState4(false);
|
|
621
|
+
const titleRef = useRef3(null);
|
|
622
|
+
useEffect3(() => {
|
|
623
|
+
const observer = new IntersectionObserver(
|
|
624
|
+
([entry]) => {
|
|
625
|
+
if (entry.isIntersecting) {
|
|
626
|
+
if (entry.boundingClientRect.top >= 0) {
|
|
627
|
+
setIsAnimating(true);
|
|
628
|
+
}
|
|
629
|
+
} else {
|
|
630
|
+
setIsAnimating(false);
|
|
631
|
+
}
|
|
632
|
+
},
|
|
633
|
+
{ threshold: 0.1 }
|
|
634
|
+
);
|
|
635
|
+
if (titleRef.current) {
|
|
636
|
+
observer.observe(titleRef.current);
|
|
637
|
+
}
|
|
638
|
+
return () => observer.disconnect();
|
|
639
|
+
}, []);
|
|
579
640
|
return /* @__PURE__ */ React7.createElement("section", { className: "relative pt-32 sm:pt-40 pb-16 flex flex-col items-center overflow-hidden w-full bg-[linear-gradient(to_bottom,#ffffff_0%,#ffffff_85%,#f5f5f5_100%)]" }, /* @__PURE__ */ React7.createElement(
|
|
580
641
|
"div",
|
|
581
642
|
{
|
|
@@ -584,14 +645,31 @@ var HeroSection = ({
|
|
|
584
645
|
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")`
|
|
585
646
|
}
|
|
586
647
|
}
|
|
587
|
-
), /* @__PURE__ */ React7.createElement("div", { className: "relative max-w-5xl mx-auto px-4 sm:px-6 w-full flex flex-col items-center text-center z-10" }, badgeText && /* @__PURE__ */ React7.createElement("div", { className: "inline-flex items-center gap-1.5 mb-6 px-4 py-1.5 rounded-full bg-black/5 backdrop-blur-md shadow-xs" }, /* @__PURE__ */ React7.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-900 uppercase" }, badgeText)), /* @__PURE__ */ React7.createElement(
|
|
648
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "relative max-w-5xl mx-auto px-4 sm:px-6 w-full flex flex-col items-center text-center z-10" }, badgeText && /* @__PURE__ */ React7.createElement("div", { className: "inline-flex items-center gap-1.5 mb-6 px-4 py-1.5 rounded-full bg-black/5 backdrop-blur-md shadow-xs" }, /* @__PURE__ */ React7.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-900 uppercase" }, badgeText)), /* @__PURE__ */ React7.createElement(
|
|
649
|
+
"h1",
|
|
650
|
+
{
|
|
651
|
+
ref: titleRef,
|
|
652
|
+
className: `text-[40px] font-serif font-light md:text-5xl lg:text-7xl text-neutral-900 tracking-tight leading-[1.05] max-w-4xl mb-4 ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
653
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
654
|
+
},
|
|
655
|
+
titlePrefix
|
|
656
|
+
), /* @__PURE__ */ React7.createElement("div", { className: "flex justify-center mt-2 mb-10 md:mb-14" }, /* @__PURE__ */ React7.createElement("span", { className: "relative font-serif inline-block mx-1.5 px-4 py-2 md:py-3 bg-[#54535314] border border-[#545353] rounded-sm text-[#000000]/60 select-none text-4xl lg:text-6xl tracking-tight" }, /* @__PURE__ */ React7.createElement("span", { className: "absolute top-[-3.5px] left-[-3.5px] w-2 h-2 bg-white border border-[#5453539e] rounded-[1px] z-10" }), /* @__PURE__ */ React7.createElement("span", { className: "absolute top-[-3.5px] right-[-3.5px] w-2 h-2 bg-white border border-[#545353] rounded-[1px] z-10" }), /* @__PURE__ */ React7.createElement("span", { className: "absolute bottom-[-3.5px] left-[-3.5px] w-2 h-2 bg-white border border-[#545353] rounded-[1px] z-10" }), /* @__PURE__ */ React7.createElement("span", { className: "absolute bottom-[-3.5px] right-[-3.5px] w-2 h-2 bg-white border border-[#545353] rounded-[1px] z-10" }), highlightText, /* @__PURE__ */ React7.createElement("span", { className: "absolute -bottom-5 -right-5 flex items-center z-20 pointer-events-none select-none filter drop-shadow-[0_2px_4px_rgba(0,0,0,0.25)]" }, /* @__PURE__ */ React7.createElement("svg", { width: "18", height: "22", viewBox: "0 0 16 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: "transform -rotate-12" }, /* @__PURE__ */ React7.createElement("path", { d: "M1 1V17.8L5.8 13.1H12.8L1 1Z", fill: "#545353", stroke: "white", strokeWidth: "1.8", strokeLinejoin: "round" })), /* @__PURE__ */ React7.createElement("span", { className: "ml-1 bg-[#545353] text-[10px] text-white px-2 py-0.5 rounded-full border border-white tracking-wide" }, cursorLabel)))), subtitle && /* @__PURE__ */ React7.createElement("p", { className: "text-[13px] md:text-[15px] text-neutral-500 max-w-xl mx-auto mb-10 font-light leading-relaxed" }, subtitle), /* @__PURE__ */ React7.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-10" }, ctaText && ctaHref && /* @__PURE__ */ React7.createElement("div", { className: "w-full sm:w-60 flex justify-center *:w-full" }, /* @__PURE__ */ React7.createElement(ThreeDButton, { href: ctaHref }, ctaText)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */ React7.createElement(
|
|
588
657
|
Link4,
|
|
589
658
|
{
|
|
590
659
|
href: secondaryCtaHref,
|
|
591
|
-
className: "w-full sm:w-60 inline-flex items-center justify-center text-[12px] tracking-widest rounded-full px-8 py-2.5
|
|
660
|
+
className: "w-full sm:w-60 inline-flex items-center justify-center text-[12px] tracking-widest rounded-full px-8 py-2.5 border border-neutral-200 text-center text-black text-xs hover:bg-neutral-50 outline-none transition-colors"
|
|
592
661
|
},
|
|
593
662
|
secondaryCtaText
|
|
594
|
-
)),
|
|
663
|
+
)), showApps && appLogos && appLogos.length > 0 && /* @__PURE__ */ React7.createElement("div", { className: "w-full flex flex-col items-center mb-12 md:mb-16" }, appsText && /* @__PURE__ */ React7.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 uppercase mb-5" }, appsText), /* @__PURE__ */ React7.createElement("div", { className: "flex flex-wrap justify-center items-center gap-8 md:gap-12 opacity-60 grayscale hover:grayscale-0 transition-all duration-500" }, appLogos.map((logo, idx) => /* @__PURE__ */ React7.createElement("div", { key: idx, className: "relative h-8 w-8 flex items-center justify-center transition-opacity hover:opacity-100 cursor-default" }, /* @__PURE__ */ React7.createElement(
|
|
664
|
+
Image2,
|
|
665
|
+
{
|
|
666
|
+
src: logo.src,
|
|
667
|
+
alt: logo.alt,
|
|
668
|
+
width: 50,
|
|
669
|
+
height: 50,
|
|
670
|
+
className: "object-contain h-full w-auto"
|
|
671
|
+
}
|
|
672
|
+
))))), showImage && /* @__PURE__ */ React7.createElement("div", { className: "w-full max-w-4xl mx-auto px-2 sm:px-6" }, /* @__PURE__ */ React7.createElement("div", { className: "relative w-full flex flex-col items-center" }, /* @__PURE__ */ React7.createElement("div", { className: "relative w-full aspect-video rounded-xl overflow-hidden shadow-[0_0_40px_rgba(0,0,0,0.03)] border border-neutral-100" }, /* @__PURE__ */ React7.createElement(
|
|
595
673
|
Image2,
|
|
596
674
|
{
|
|
597
675
|
src: imageSrc,
|
|
@@ -605,10 +683,38 @@ var HeroSection = ({
|
|
|
605
683
|
};
|
|
606
684
|
|
|
607
685
|
// src/components/AppBento2.tsx
|
|
608
|
-
import React8 from "react";
|
|
609
|
-
import { HugeiconsIcon as
|
|
686
|
+
import React8, { useState as useState5, useEffect as useEffect4, useRef as useRef4 } from "react";
|
|
687
|
+
import { HugeiconsIcon as HugeiconsIcon3 } from "@hugeicons/react";
|
|
610
688
|
var AppBento2 = ({ tagline, headline, features }) => {
|
|
611
|
-
|
|
689
|
+
const [isAnimating, setIsAnimating] = useState5(false);
|
|
690
|
+
const titleRef = useRef4(null);
|
|
691
|
+
useEffect4(() => {
|
|
692
|
+
const observer = new IntersectionObserver(
|
|
693
|
+
([entry]) => {
|
|
694
|
+
if (entry.isIntersecting) {
|
|
695
|
+
if (entry.boundingClientRect.top > 0) {
|
|
696
|
+
setIsAnimating(true);
|
|
697
|
+
}
|
|
698
|
+
} else {
|
|
699
|
+
setIsAnimating(false);
|
|
700
|
+
}
|
|
701
|
+
},
|
|
702
|
+
{ threshold: 0.1 }
|
|
703
|
+
);
|
|
704
|
+
if (titleRef.current) {
|
|
705
|
+
observer.observe(titleRef.current);
|
|
706
|
+
}
|
|
707
|
+
return () => observer.disconnect();
|
|
708
|
+
}, []);
|
|
709
|
+
return /* @__PURE__ */ React8.createElement("div", { className: "w-full py-16" }, /* @__PURE__ */ React8.createElement("div", { className: "w-full flex justify-center px-4" }, /* @__PURE__ */ React8.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ React8.createElement("div", { className: "relative overflow-hidden mb-12 text-left" }, /* @__PURE__ */ React8.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React8.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 block mb-4 uppercase" }, tagline), /* @__PURE__ */ React8.createElement(
|
|
710
|
+
"h2",
|
|
711
|
+
{
|
|
712
|
+
ref: titleRef,
|
|
713
|
+
className: `font-serif text-3xl md:text-4xl tracking-tight text-black leading-[1.1] ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
714
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
715
|
+
},
|
|
716
|
+
headline
|
|
717
|
+
))), /* @__PURE__ */ React8.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-6" }, features.map((f, i) => {
|
|
612
718
|
const isWhite = i === 0;
|
|
613
719
|
const isBlack = i === 1;
|
|
614
720
|
const isNeutral = i === 2;
|
|
@@ -645,20 +751,20 @@ var AppBento2 = ({ tagline, headline, features }) => {
|
|
|
645
751
|
}
|
|
646
752
|
),
|
|
647
753
|
isBlack && /* @__PURE__ */ React8.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" }),
|
|
648
|
-
/* @__PURE__ */ React8.createElement("div", { className: "absolute inset-0 overflow-hidden pointer-events-none z-0" }, /* @__PURE__ */ React8.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__ */ React8.createElement(
|
|
649
|
-
/* @__PURE__ */ React8.createElement("div", { className: "relative z-10 w-full h-full flex flex-col pointer-events-auto" }, /* @__PURE__ */ React8.createElement("div", { className: "flex items-center justify-between mb-8" }, /* @__PURE__ */ React8.createElement("span", { className: `text-[9px] uppercase tracking-widest ${labelColor}` }, f.label), /* @__PURE__ */ React8.createElement("div", { className: `p-2 rounded-full transition-colors ${isBlack ? "bg-white/10" : "bg-white/50 backdrop-blur-sm"}` }, /* @__PURE__ */ React8.createElement(
|
|
754
|
+
/* @__PURE__ */ React8.createElement("div", { className: "absolute inset-0 overflow-hidden pointer-events-none z-0" }, /* @__PURE__ */ React8.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__ */ React8.createElement(HugeiconsIcon3, { icon: f.icon, size: 180 }))),
|
|
755
|
+
/* @__PURE__ */ React8.createElement("div", { className: "relative z-10 w-full h-full flex flex-col pointer-events-auto" }, /* @__PURE__ */ React8.createElement("div", { className: "flex items-center justify-between mb-8" }, /* @__PURE__ */ React8.createElement("span", { className: `text-[9px] uppercase tracking-widest ${labelColor}` }, f.label), /* @__PURE__ */ React8.createElement("div", { className: `p-2 rounded-full transition-colors ${isBlack ? "bg-white/10" : "bg-white/50 backdrop-blur-sm"}` }, /* @__PURE__ */ React8.createElement(HugeiconsIcon3, { icon: f.icon, size: 20, className: textColor }))), /* @__PURE__ */ React8.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React8.createElement("h3", { className: `text-xl font-serif mb-2 tracking-tight ${textColor}` }, f.title), /* @__PURE__ */ React8.createElement("p", { className: `text-[13px] leading-relaxed max-w-sm ${subTextColor}` }, f.desc)))
|
|
650
756
|
);
|
|
651
757
|
})))));
|
|
652
758
|
};
|
|
653
759
|
|
|
654
760
|
// src/components/FeatureScroll.tsx
|
|
655
|
-
import React9, { useRef as
|
|
761
|
+
import React9, { useRef as useRef5, useState as useState6, useEffect as useEffect5 } from "react";
|
|
656
762
|
import Image3 from "next/image";
|
|
657
|
-
import { HugeiconsIcon as
|
|
763
|
+
import { HugeiconsIcon as HugeiconsIcon4 } from "@hugeicons/react";
|
|
658
764
|
import { ArrowLeft01Icon, ArrowRight01Icon, Loading03Icon as Loading03Icon2 } from "@hugeicons/core-free-icons";
|
|
659
765
|
var FeatureCard = ({ feature, bgImage }) => {
|
|
660
|
-
const [isBgLoading, setIsBgLoading] =
|
|
661
|
-
const [isFgLoading, setIsFgLoading] =
|
|
766
|
+
const [isBgLoading, setIsBgLoading] = useState6(true);
|
|
767
|
+
const [isFgLoading, setIsFgLoading] = useState6(!!feature.image);
|
|
662
768
|
return /* @__PURE__ */ React9.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__ */ React9.createElement("div", { className: "relative w-full aspect-16/10 bg-neutral-100 rounded-2xl overflow-hidden mb-6 flex items-center justify-center" }, /* @__PURE__ */ React9.createElement(
|
|
663
769
|
Image3,
|
|
664
770
|
{
|
|
@@ -680,7 +786,7 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
680
786
|
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")`
|
|
681
787
|
}
|
|
682
788
|
}
|
|
683
|
-
), isFgLoading && feature.image && /* @__PURE__ */ React9.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__ */ React9.createElement(
|
|
789
|
+
), isFgLoading && feature.image && /* @__PURE__ */ React9.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__ */ React9.createElement(HugeiconsIcon4, { icon: Loading03Icon2, size: 32, className: "animate-spin text-neutral-400" })), feature.image && /* @__PURE__ */ React9.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__ */ React9.createElement(
|
|
684
790
|
Image3,
|
|
685
791
|
{
|
|
686
792
|
src: feature.image,
|
|
@@ -696,9 +802,9 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
696
802
|
))), /* @__PURE__ */ React9.createElement("div", { className: "flex flex-col text-left pr-4" }, /* @__PURE__ */ React9.createElement("h3", { className: " font-serif text-xl tracking-tight text-black mb-2" }, feature.title), /* @__PURE__ */ React9.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 max-w-[90%]" }, feature.desc)));
|
|
697
803
|
};
|
|
698
804
|
var FeatureScroll = ({ tagline, headline, features }) => {
|
|
699
|
-
const scrollRef =
|
|
700
|
-
const [canScrollLeft, setCanScrollLeft] =
|
|
701
|
-
const [canScrollRight, setCanScrollRight] =
|
|
805
|
+
const scrollRef = useRef5(null);
|
|
806
|
+
const [canScrollLeft, setCanScrollLeft] = useState6(false);
|
|
807
|
+
const [canScrollRight, setCanScrollRight] = useState6(true);
|
|
702
808
|
const checkScroll = () => {
|
|
703
809
|
if (scrollRef.current) {
|
|
704
810
|
const { scrollLeft, scrollWidth, clientWidth } = scrollRef.current;
|
|
@@ -706,7 +812,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
706
812
|
setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 2);
|
|
707
813
|
}
|
|
708
814
|
};
|
|
709
|
-
|
|
815
|
+
useEffect5(() => {
|
|
710
816
|
checkScroll();
|
|
711
817
|
window.addEventListener("resize", checkScroll);
|
|
712
818
|
return () => window.removeEventListener("resize", checkScroll);
|
|
@@ -730,7 +836,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
730
836
|
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",
|
|
731
837
|
"aria-label": "Previous feature"
|
|
732
838
|
},
|
|
733
|
-
/* @__PURE__ */ React9.createElement(
|
|
839
|
+
/* @__PURE__ */ React9.createElement(HugeiconsIcon4, { icon: ArrowLeft01Icon, size: 20 })
|
|
734
840
|
), /* @__PURE__ */ React9.createElement(
|
|
735
841
|
"button",
|
|
736
842
|
{
|
|
@@ -739,7 +845,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
739
845
|
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",
|
|
740
846
|
"aria-label": "Next feature"
|
|
741
847
|
},
|
|
742
|
-
/* @__PURE__ */ React9.createElement(
|
|
848
|
+
/* @__PURE__ */ React9.createElement(HugeiconsIcon4, { icon: ArrowRight01Icon, size: 20 })
|
|
743
849
|
))), /* @__PURE__ */ React9.createElement(
|
|
744
850
|
"div",
|
|
745
851
|
{
|
|
@@ -755,7 +861,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
755
861
|
disabled: !canScrollLeft,
|
|
756
862
|
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"
|
|
757
863
|
},
|
|
758
|
-
/* @__PURE__ */ React9.createElement(
|
|
864
|
+
/* @__PURE__ */ React9.createElement(HugeiconsIcon4, { icon: ArrowLeft01Icon, size: 20 })
|
|
759
865
|
), /* @__PURE__ */ React9.createElement(
|
|
760
866
|
"button",
|
|
761
867
|
{
|
|
@@ -763,14 +869,14 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
763
869
|
disabled: !canScrollRight,
|
|
764
870
|
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"
|
|
765
871
|
},
|
|
766
|
-
/* @__PURE__ */ React9.createElement(
|
|
872
|
+
/* @__PURE__ */ React9.createElement(HugeiconsIcon4, { icon: ArrowRight01Icon, size: 20 })
|
|
767
873
|
))));
|
|
768
874
|
};
|
|
769
875
|
|
|
770
876
|
// src/components/AITranscriptionFeature.tsx
|
|
771
|
-
import React10, { useState as
|
|
877
|
+
import React10, { useState as useState7 } from "react";
|
|
772
878
|
import Image4 from "next/image";
|
|
773
|
-
import { HugeiconsIcon as
|
|
879
|
+
import { HugeiconsIcon as HugeiconsIcon5 } from "@hugeicons/react";
|
|
774
880
|
import { Loading03Icon as Loading03Icon3 } from "@hugeicons/core-free-icons";
|
|
775
881
|
var AITranscriptionFeature = ({
|
|
776
882
|
tagline,
|
|
@@ -782,7 +888,7 @@ var AITranscriptionFeature = ({
|
|
|
782
888
|
cursorLabel,
|
|
783
889
|
detailTextSuffix
|
|
784
890
|
}) => {
|
|
785
|
-
const [isLoading, setIsLoading] =
|
|
891
|
+
const [isLoading, setIsLoading] = useState7(!!imagePath);
|
|
786
892
|
return /* @__PURE__ */ React10.createElement("section", { className: "py-24 w-full flex justify-center relative z-10" }, /* @__PURE__ */ React10.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ React10.createElement("div", { className: "flex flex-col items-center text-center mb-12 relative z-10 animate-in fade-in slide-in-from-bottom-4 duration-700" }, /* @__PURE__ */ React10.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ React10.createElement("h2", { className: " font-serif text-3xl md:text-5xl tracking-tight animate-gradient-wipe leading-[1.05] mb-4" }, headline), /* @__PURE__ */ React10.createElement("p", { className: "text-[15px] md:text-[16px] leading-[1.8] text-neutral-600 max-w-xl mx-auto" }, description)), /* @__PURE__ */ React10.createElement("div", { className: "relative w-full max-w-5xl mx-auto aspect-video sm:aspect-21/9 bg-neutral-100 rounded-2xl overflow-hidden mb-12 flex items-center justify-center shadow-[0_0_40px_rgba(0,0,0,0.03)] animate-in fade-in zoom-in-95 duration-700 delay-150 fill-mode-both" }, /* @__PURE__ */ React10.createElement(
|
|
787
893
|
"div",
|
|
788
894
|
{
|
|
@@ -792,7 +898,7 @@ var AITranscriptionFeature = ({
|
|
|
792
898
|
backgroundRepeat: "repeat"
|
|
793
899
|
}
|
|
794
900
|
}
|
|
795
|
-
), isLoading && imagePath && /* @__PURE__ */ React10.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-neutral-50/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ React10.createElement(
|
|
901
|
+
), isLoading && imagePath && /* @__PURE__ */ React10.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-neutral-50/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ React10.createElement(HugeiconsIcon5, { icon: Loading03Icon3, size: 32, className: "animate-spin text-neutral-400" })), imagePath ? /* @__PURE__ */ React10.createElement(
|
|
796
902
|
Image4,
|
|
797
903
|
{
|
|
798
904
|
src: imagePath,
|
|
@@ -810,7 +916,7 @@ var AITranscriptionFeature = ({
|
|
|
810
916
|
|
|
811
917
|
// src/components/PlatformFeatures.tsx
|
|
812
918
|
import React11 from "react";
|
|
813
|
-
import { HugeiconsIcon as
|
|
919
|
+
import { HugeiconsIcon as HugeiconsIcon6 } from "@hugeicons/react";
|
|
814
920
|
var PlatformFeatures = ({
|
|
815
921
|
tagline,
|
|
816
922
|
headline,
|
|
@@ -824,13 +930,13 @@ var PlatformFeatures = ({
|
|
|
824
930
|
className: "flex flex-col group animate-in fade-in slide-in-from-bottom-4 duration-700 fill-mode-both",
|
|
825
931
|
style: { animationDelay: feature.delay || "0ms" }
|
|
826
932
|
},
|
|
827
|
-
/* @__PURE__ */ React11.createElement("div", { className: "w-12 h-12 rounded-full bg-neutral-100 flex items-center justify-center text-neutral-600 mb-5 transition-colors duration-300" }, /* @__PURE__ */ React11.createElement(
|
|
933
|
+
/* @__PURE__ */ React11.createElement("div", { className: "w-12 h-12 rounded-full bg-neutral-100 flex items-center justify-center text-neutral-600 mb-5 transition-colors duration-300" }, /* @__PURE__ */ React11.createElement(HugeiconsIcon6, { icon: feature.icon, size: 24 })),
|
|
828
934
|
/* @__PURE__ */ React11.createElement("div", null, /* @__PURE__ */ React11.createElement("h3", { className: " text-xl font-serif tracking-tight text-black mb-2" }, feature.title), /* @__PURE__ */ React11.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 pr-4" }, feature.desc))
|
|
829
935
|
)))));
|
|
830
936
|
};
|
|
831
937
|
|
|
832
938
|
// src/components/ManagedDocument.tsx
|
|
833
|
-
import React12 from "react";
|
|
939
|
+
import React12, { useState as useState8, useEffect as useEffect6, useRef as useRef6 } from "react";
|
|
834
940
|
var ManagedDocument = ({
|
|
835
941
|
tagline,
|
|
836
942
|
title,
|
|
@@ -838,9 +944,37 @@ var ManagedDocument = ({
|
|
|
838
944
|
contactText,
|
|
839
945
|
contactEmail
|
|
840
946
|
}) => {
|
|
947
|
+
const [isAnimating, setIsAnimating] = useState8(false);
|
|
948
|
+
const titleRef = useRef6(null);
|
|
949
|
+
useEffect6(() => {
|
|
950
|
+
const observer = new IntersectionObserver(
|
|
951
|
+
([entry]) => {
|
|
952
|
+
if (entry.isIntersecting) {
|
|
953
|
+
if (entry.boundingClientRect.top > 0) {
|
|
954
|
+
setIsAnimating(true);
|
|
955
|
+
}
|
|
956
|
+
} else {
|
|
957
|
+
setIsAnimating(false);
|
|
958
|
+
}
|
|
959
|
+
},
|
|
960
|
+
{ threshold: 0.1 }
|
|
961
|
+
);
|
|
962
|
+
if (titleRef.current) {
|
|
963
|
+
observer.observe(titleRef.current);
|
|
964
|
+
}
|
|
965
|
+
return () => observer.disconnect();
|
|
966
|
+
}, []);
|
|
841
967
|
return (
|
|
842
968
|
// Outer layout wrapper (takes up available space, adds padding)
|
|
843
|
-
/* @__PURE__ */ React12.createElement("div", { className: "grow pt-28 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React12.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ React12.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React12.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ React12.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 text-left block uppercase" }, tagline), /* @__PURE__ */ React12.createElement(
|
|
969
|
+
/* @__PURE__ */ React12.createElement("div", { className: "grow pt-28 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React12.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ React12.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React12.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ React12.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 text-left block uppercase" }, tagline), /* @__PURE__ */ React12.createElement(
|
|
970
|
+
"h1",
|
|
971
|
+
{
|
|
972
|
+
ref: titleRef,
|
|
973
|
+
className: `font-serif text-4xl md:text-5xl mt-4 text-black tracking-tight text-left ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
974
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
975
|
+
},
|
|
976
|
+
title
|
|
977
|
+
)), sections.map((section, index) => /* @__PURE__ */ React12.createElement("div", { key: index, className: "relative px-5 md:px-12 py-8 md:py-10" }, section.heading && /* @__PURE__ */ React12.createElement("h2", { className: " text-[11px] tracking-[0.2em] text-black mb-4 text-left uppercase" }, section.heading), section.paragraphs && section.paragraphs.length > 0 && /* @__PURE__ */ React12.createElement("div", { className: "text-[14px] leading-[1.8] text-neutral-700 space-y-4 text-left font-light" }, section.paragraphs.map((text, pIndex) => /* @__PURE__ */ React12.createElement("p", { key: pIndex }, text))), section.quote && /* @__PURE__ */ React12.createElement("div", { className: `border-neutral-200 border rounded-xl p-6 ${section.paragraphs && section.paragraphs.length > 0 ? "mt-6" : ""}` }, /* @__PURE__ */ React12.createElement("p", { className: "text-neutral-900 text-[14px] md:text-[14px] leading-relaxed" }, '"', section.quote, '"')))), (contactText || contactEmail) && /* @__PURE__ */ React12.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10 pb-12 md:pb-14" }, /* @__PURE__ */ React12.createElement("p", { className: "text-[12px] text-neutral-600 text-left" }, contactText, contactEmail && /* @__PURE__ */ React12.createElement(
|
|
844
978
|
"a",
|
|
845
979
|
{
|
|
846
980
|
href: `mailto:${contactEmail}`,
|
|
@@ -852,11 +986,11 @@ var ManagedDocument = ({
|
|
|
852
986
|
};
|
|
853
987
|
|
|
854
988
|
// src/components/ManagedContactBlock.tsx
|
|
855
|
-
import React13, { useState as
|
|
856
|
-
import { HugeiconsIcon as
|
|
989
|
+
import React13, { useState as useState9, useEffect as useEffect7 } from "react";
|
|
990
|
+
import { HugeiconsIcon as HugeiconsIcon7 } from "@hugeicons/react";
|
|
857
991
|
var SecureEmail = ({ user, domain, className }) => {
|
|
858
|
-
const [isMounted, setIsMounted] =
|
|
859
|
-
|
|
992
|
+
const [isMounted, setIsMounted] = useState9(false);
|
|
993
|
+
useEffect7(() => {
|
|
860
994
|
setIsMounted(true);
|
|
861
995
|
}, []);
|
|
862
996
|
if (!isMounted) {
|
|
@@ -905,14 +1039,15 @@ var ManagedContactBlock = ({
|
|
|
905
1039
|
className: "flex items-center gap-3 transition-colors group text-neutral-600 hover:text-black",
|
|
906
1040
|
"aria-label": social.label
|
|
907
1041
|
},
|
|
908
|
-
/* @__PURE__ */ React13.createElement(
|
|
1042
|
+
/* @__PURE__ */ React13.createElement(HugeiconsIcon7, { icon: social.icon, size: 18 }),
|
|
909
1043
|
/* @__PURE__ */ React13.createElement("span", { className: "text-[13px]" }, social.label)
|
|
910
1044
|
)))))))));
|
|
911
1045
|
};
|
|
912
1046
|
|
|
913
1047
|
// src/components/ManagedPricingBlock.tsx
|
|
914
|
-
import React14 from "react";
|
|
1048
|
+
import React14, { useState as useState10, useEffect as useEffect8, useRef as useRef7 } from "react";
|
|
915
1049
|
import Link5 from "next/link";
|
|
1050
|
+
import Image5 from "next/image";
|
|
916
1051
|
var CheckIcon = ({ className = "" }) => /* @__PURE__ */ React14.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__ */ React14.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "black" }), /* @__PURE__ */ React14.createElement("path", { d: "M8 12L11 15L16 9", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
917
1052
|
var CrossIcon = ({ className = "" }) => /* @__PURE__ */ React14.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__ */ React14.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "#F5F5F5" }), /* @__PURE__ */ React14.createElement("path", { d: "M15 9L9 15M9 9l6 6", stroke: "#D4D4D4", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
918
1053
|
var ManagedPricingBlock = ({
|
|
@@ -920,13 +1055,57 @@ var ManagedPricingBlock = ({
|
|
|
920
1055
|
title,
|
|
921
1056
|
plans
|
|
922
1057
|
}) => {
|
|
923
|
-
|
|
1058
|
+
const [isAnimating, setIsAnimating] = useState10(false);
|
|
1059
|
+
const titleRef = useRef7(null);
|
|
1060
|
+
useEffect8(() => {
|
|
1061
|
+
const observer = new IntersectionObserver(
|
|
1062
|
+
([entry]) => {
|
|
1063
|
+
if (entry.isIntersecting) {
|
|
1064
|
+
if (entry.boundingClientRect.top > 0) {
|
|
1065
|
+
setIsAnimating(true);
|
|
1066
|
+
}
|
|
1067
|
+
} else {
|
|
1068
|
+
setIsAnimating(false);
|
|
1069
|
+
}
|
|
1070
|
+
},
|
|
1071
|
+
{ threshold: 0.1 }
|
|
1072
|
+
);
|
|
1073
|
+
if (titleRef.current) {
|
|
1074
|
+
observer.observe(titleRef.current);
|
|
1075
|
+
}
|
|
1076
|
+
return () => observer.disconnect();
|
|
1077
|
+
}, []);
|
|
1078
|
+
return /* @__PURE__ */ React14.createElement("div", { className: "grow pt-40 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React14.createElement("div", { className: "w-full max-w-5xl mx-auto flex flex-col items-center" }, /* @__PURE__ */ React14.createElement("div", { className: "w-full flex flex-col items-center text-center mb-12" }, tagline && /* @__PURE__ */ React14.createElement("span", { className: "text-[9px] tracking-[0.4em] text-black block uppercase" }, tagline), /* @__PURE__ */ React14.createElement(
|
|
1079
|
+
"h1",
|
|
1080
|
+
{
|
|
1081
|
+
ref: titleRef,
|
|
1082
|
+
className: `font-serif text-2xl sm:text-3xl mt-3 text-black tracking-tight ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
1083
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
1084
|
+
},
|
|
1085
|
+
title
|
|
1086
|
+
)), /* @__PURE__ */ React14.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5 w-full max-w-3xl" }, plans.map((plan, planIdx) => /* @__PURE__ */ React14.createElement(
|
|
924
1087
|
"div",
|
|
925
1088
|
{
|
|
926
1089
|
key: planIdx,
|
|
927
1090
|
className: `bg-white rounded-3xl p-6 flex flex-col relative overflow-hidden ${plan.isPremium ? "" : ""}`
|
|
928
1091
|
},
|
|
929
|
-
/* @__PURE__ */ React14.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React14.createElement("span", { className: "text-black text-base block mb-1" }, plan.name), /* @__PURE__ */ React14.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ React14.createElement("span", { className: "text-5xl font-serif text-black" }, plan.price), plan.period && /* @__PURE__ */ React14.createElement("span", { className: "text-xs text-neutral-500" }, plan.period)), /* @__PURE__ */ React14.createElement("p", { className: "text-xs text-neutral-500 mt-2" }, plan.description))
|
|
1092
|
+
/* @__PURE__ */ React14.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React14.createElement("span", { className: "text-black text-base block mb-1" }, plan.name), /* @__PURE__ */ React14.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ React14.createElement("span", { className: "text-5xl font-serif text-black" }, plan.price), plan.period && /* @__PURE__ */ React14.createElement("span", { className: "text-xs text-neutral-500" }, plan.period)), /* @__PURE__ */ React14.createElement("p", { className: "text-xs text-neutral-500 mt-2" }, plan.description), plan.showApps && plan.appLogos && plan.appLogos.length > 0 && /* @__PURE__ */ React14.createElement("div", { className: "flex items-center gap-2 mt-4" }, plan.appLogos.map((logo, logoIdx) => /* @__PURE__ */ React14.createElement(
|
|
1093
|
+
"div",
|
|
1094
|
+
{
|
|
1095
|
+
key: logoIdx,
|
|
1096
|
+
className: "relative w-7 h-7 rounded-md border border-neutral-100 overflow-hidden bg-neutral-50/50 flex items-center justify-center shrink-0 shadow-sm"
|
|
1097
|
+
},
|
|
1098
|
+
/* @__PURE__ */ React14.createElement(
|
|
1099
|
+
Image5,
|
|
1100
|
+
{
|
|
1101
|
+
src: logo.src,
|
|
1102
|
+
alt: logo.alt,
|
|
1103
|
+
width: 16,
|
|
1104
|
+
height: 16,
|
|
1105
|
+
className: "object-contain"
|
|
1106
|
+
}
|
|
1107
|
+
)
|
|
1108
|
+
)))),
|
|
930
1109
|
plan.isPremium ? /* @__PURE__ */ React14.createElement(ThreeDButton, { href: plan.ctaHref, className: "mb-6 w-full" }, plan.ctaText) : /* @__PURE__ */ React14.createElement(
|
|
931
1110
|
Link5,
|
|
932
1111
|
{
|
|
@@ -945,8 +1124,8 @@ var ManagedPricingBlock = ({
|
|
|
945
1124
|
|
|
946
1125
|
// src/components/ManagedBoardBlock.tsx
|
|
947
1126
|
import React15 from "react";
|
|
948
|
-
import
|
|
949
|
-
import { HugeiconsIcon as
|
|
1127
|
+
import Image6 from "next/image";
|
|
1128
|
+
import { HugeiconsIcon as HugeiconsIcon8 } from "@hugeicons/react";
|
|
950
1129
|
import { TwitterIcon, LinkedinIcon } from "@hugeicons/core-free-icons";
|
|
951
1130
|
var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */ React15.createElement(
|
|
952
1131
|
"a",
|
|
@@ -957,7 +1136,7 @@ var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */ React15.
|
|
|
957
1136
|
className: "text-neutral-400 hover:text-black transition-colors",
|
|
958
1137
|
"aria-label": `${name} on ${label}`
|
|
959
1138
|
},
|
|
960
|
-
/* @__PURE__ */ React15.createElement(
|
|
1139
|
+
/* @__PURE__ */ React15.createElement(HugeiconsIcon8, { icon, size: 16 })
|
|
961
1140
|
);
|
|
962
1141
|
var ManagedBoardBlock = ({
|
|
963
1142
|
tagline,
|
|
@@ -976,7 +1155,7 @@ var ManagedBoardBlock = ({
|
|
|
976
1155
|
}
|
|
977
1156
|
}
|
|
978
1157
|
), /* @__PURE__ */ React15.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React15.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ React15.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 text-left block uppercase" }, tagline), /* @__PURE__ */ React15.createElement("h1", { className: " font-serif text-4xl md:text-5xl mt-4 text-black tracking-tight text-left" }, title)), /* @__PURE__ */ React15.createElement("div", { className: "relative px-5 md:px-12 py-4 md:py-8" }, /* @__PURE__ */ React15.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__ */ React15.createElement("div", { key: idx, className: "relative p-6 md:p-8 rounded-2xl bg-white flex flex-col transition-all group" }, /* @__PURE__ */ React15.createElement("div", { className: "flex items-start space-x-4 md:space-x-5 mb-5 md:mb-6" }, /* @__PURE__ */ React15.createElement("div", { className: "relative w-14 h-14 md:w-16 md:h-16 shrink-0 bg-white overflow-hidden rounded-xl" }, /* @__PURE__ */ React15.createElement(
|
|
979
|
-
|
|
1158
|
+
Image6,
|
|
980
1159
|
{
|
|
981
1160
|
src: member.imageSrc,
|
|
982
1161
|
alt: member.name,
|
|
@@ -1053,7 +1232,7 @@ var ManagedNotFoundBlock = ({
|
|
|
1053
1232
|
|
|
1054
1233
|
// src/components/PageSpinner.tsx
|
|
1055
1234
|
import React18 from "react";
|
|
1056
|
-
import { HugeiconsIcon as
|
|
1235
|
+
import { HugeiconsIcon as HugeiconsIcon9 } from "@hugeicons/react";
|
|
1057
1236
|
import { Loading03Icon as Loading03Icon4 } from "@hugeicons/core-free-icons";
|
|
1058
1237
|
var PageSpinner = ({
|
|
1059
1238
|
className = "",
|
|
@@ -1063,7 +1242,7 @@ var PageSpinner = ({
|
|
|
1063
1242
|
return (
|
|
1064
1243
|
// z-[100] ensures it sits above absolute headers and modals
|
|
1065
1244
|
/* @__PURE__ */ React18.createElement("div", { className: `fixed inset-0 z-100 flex flex-col items-center justify-center w-full h-full pointer-events-none ${className}` }, /* @__PURE__ */ React18.createElement(
|
|
1066
|
-
|
|
1245
|
+
HugeiconsIcon9,
|
|
1067
1246
|
{
|
|
1068
1247
|
icon: Loading03Icon4,
|
|
1069
1248
|
size,
|
|
@@ -1110,7 +1289,7 @@ var ManagedToaster = () => {
|
|
|
1110
1289
|
|
|
1111
1290
|
// src/components/ManagedNewsletterSplitBlock.tsx
|
|
1112
1291
|
import React20 from "react";
|
|
1113
|
-
import
|
|
1292
|
+
import Image7 from "next/image";
|
|
1114
1293
|
var ManagedNewsletterSplitBlock = ({
|
|
1115
1294
|
tagline,
|
|
1116
1295
|
title,
|
|
@@ -1124,7 +1303,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
1124
1303
|
children
|
|
1125
1304
|
}) => {
|
|
1126
1305
|
return /* @__PURE__ */ React20.createElement("div", { className: "grow flex flex-col md:flex-row relative w-full pt-32 md:pt-0" }, /* @__PURE__ */ React20.createElement("div", { className: "hidden md:block md:w-1/2 relative min-h-screen overflow-hidden" }, /* @__PURE__ */ React20.createElement(
|
|
1127
|
-
|
|
1306
|
+
Image7,
|
|
1128
1307
|
{
|
|
1129
1308
|
src: imageSrc,
|
|
1130
1309
|
alt: imageAlt,
|
|
@@ -1219,14 +1398,14 @@ var NumberInput = ({
|
|
|
1219
1398
|
));
|
|
1220
1399
|
|
|
1221
1400
|
// src/components/PortfolioHero.tsx
|
|
1222
|
-
import React22, { useEffect as
|
|
1401
|
+
import React22, { useEffect as useEffect9, useRef as useRef8 } from "react";
|
|
1223
1402
|
import Link7 from "next/link";
|
|
1224
|
-
import
|
|
1225
|
-
import { HugeiconsIcon as
|
|
1403
|
+
import Image8 from "next/image";
|
|
1404
|
+
import { HugeiconsIcon as HugeiconsIcon10 } from "@hugeicons/react";
|
|
1226
1405
|
import { ArrowRight01Icon as ArrowRight01Icon2 } from "@hugeicons/core-free-icons";
|
|
1227
1406
|
var useScrollAnimation = () => {
|
|
1228
|
-
const elementRef =
|
|
1229
|
-
|
|
1407
|
+
const elementRef = useRef8(null);
|
|
1408
|
+
useEffect9(() => {
|
|
1230
1409
|
const el = elementRef.current;
|
|
1231
1410
|
if (!el) return;
|
|
1232
1411
|
const observer = new IntersectionObserver(
|
|
@@ -1269,7 +1448,7 @@ var PortfolioHero = ({
|
|
|
1269
1448
|
className: "w-full opacity-0 translate-y-5 transition-all duration-1000 ease-out relative z-10"
|
|
1270
1449
|
},
|
|
1271
1450
|
/* @__PURE__ */ React22.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-5 sm:gap-8 mb-10" }, /* @__PURE__ */ React22.createElement("div", { className: "relative w-20 h-20 sm:w-32 sm:h-32 rounded-full overflow-hidden border border-neutral-200 shrink-0 shadow-sm" }, /* @__PURE__ */ React22.createElement(
|
|
1272
|
-
|
|
1451
|
+
Image8,
|
|
1273
1452
|
{
|
|
1274
1453
|
src: imageSrc,
|
|
1275
1454
|
alt: imageAlt,
|
|
@@ -1279,7 +1458,7 @@ var PortfolioHero = ({
|
|
|
1279
1458
|
sizes: "(max-width: 640px) 80px, 128px",
|
|
1280
1459
|
quality: 100
|
|
1281
1460
|
}
|
|
1282
|
-
)), /* @__PURE__ */ React22.createElement("div", { className: "flex flex-col text-left" }, /* @__PURE__ */ React22.createElement("h1", { className: " font-serif text-3xl sm:text-5xl
|
|
1461
|
+
)), /* @__PURE__ */ React22.createElement("div", { className: "flex flex-col text-left" }, /* @__PURE__ */ React22.createElement("h1", { className: " font-serif text-3xl sm:text-5xl lg:text-6xl tracking-tight text-black leading-none mb-3" }, name), socialLabel && /* @__PURE__ */ React22.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-500 uppercase" }, socialLabel), socialLinkText && socialLinkHref && /* @__PURE__ */ React22.createElement(
|
|
1283
1462
|
"a",
|
|
1284
1463
|
{
|
|
1285
1464
|
href: socialLinkHref,
|
|
@@ -1304,15 +1483,15 @@ var PortfolioHero = ({
|
|
|
1304
1483
|
className: "w-full sm:w-auto inline-flex items-center justify-center gap-3 text-[11px] tracking-[0.2em] uppercase rounded-full px-8 py-3.5 bg-neutral-200 transition-colors text-black hover:bg-neutral-200 outline-none"
|
|
1305
1484
|
},
|
|
1306
1485
|
secondaryCtaText,
|
|
1307
|
-
/* @__PURE__ */ React22.createElement(
|
|
1486
|
+
/* @__PURE__ */ React22.createElement(HugeiconsIcon10, { icon: ArrowRight01Icon2, size: 16 })
|
|
1308
1487
|
))
|
|
1309
1488
|
));
|
|
1310
1489
|
};
|
|
1311
1490
|
|
|
1312
1491
|
// src/components/ProductHero.tsx
|
|
1313
|
-
import React23, { useState as
|
|
1492
|
+
import React23, { useState as useState11, useEffect as useEffect10, useCallback } from "react";
|
|
1314
1493
|
import Link8 from "next/link";
|
|
1315
|
-
import
|
|
1494
|
+
import Image9 from "next/image";
|
|
1316
1495
|
var ProductHero = ({
|
|
1317
1496
|
badgeText,
|
|
1318
1497
|
titlePrefix,
|
|
@@ -1324,14 +1503,14 @@ var ProductHero = ({
|
|
|
1324
1503
|
secondaryCtaHref,
|
|
1325
1504
|
images
|
|
1326
1505
|
}) => {
|
|
1327
|
-
const [currentIndex, setCurrentIndex] =
|
|
1506
|
+
const [currentIndex, setCurrentIndex] = useState11(0);
|
|
1328
1507
|
const nextSlide = useCallback(() => {
|
|
1329
1508
|
setCurrentIndex((prev) => (prev + 1) % images.length);
|
|
1330
1509
|
}, [images.length]);
|
|
1331
1510
|
const prevSlide = useCallback(() => {
|
|
1332
1511
|
setCurrentIndex((prev) => (prev - 1 + images.length) % images.length);
|
|
1333
1512
|
}, [images.length]);
|
|
1334
|
-
|
|
1513
|
+
useEffect10(() => {
|
|
1335
1514
|
const timer = setInterval(() => {
|
|
1336
1515
|
nextSlide();
|
|
1337
1516
|
}, 5e3);
|
|
@@ -1380,7 +1559,7 @@ var ProductHero = ({
|
|
|
1380
1559
|
className: `absolute inset-0 transition-all duration-700 ease-out transform ${getCarouselClasses(idx)}`
|
|
1381
1560
|
},
|
|
1382
1561
|
/* @__PURE__ */ React23.createElement("div", { className: "relative w-full h-full rounded-2xl overflow-hidden shadow-xl" }, /* @__PURE__ */ React23.createElement(
|
|
1383
|
-
|
|
1562
|
+
Image9,
|
|
1384
1563
|
{
|
|
1385
1564
|
src,
|
|
1386
1565
|
alt: `Product Overview ${idx + 1}`,
|
|
@@ -1394,9 +1573,9 @@ var ProductHero = ({
|
|
|
1394
1573
|
};
|
|
1395
1574
|
|
|
1396
1575
|
// src/components/GifFeatureCard.tsx
|
|
1397
|
-
import React24, { useState as
|
|
1398
|
-
import
|
|
1399
|
-
import { HugeiconsIcon as
|
|
1576
|
+
import React24, { useState as useState12 } from "react";
|
|
1577
|
+
import Image10 from "next/image";
|
|
1578
|
+
import { HugeiconsIcon as HugeiconsIcon11 } from "@hugeicons/react";
|
|
1400
1579
|
import { Loading03Icon as Loading03Icon5 } from "@hugeicons/core-free-icons";
|
|
1401
1580
|
var GifFeatureCard = ({
|
|
1402
1581
|
gifSrc,
|
|
@@ -1405,9 +1584,9 @@ var GifFeatureCard = ({
|
|
|
1405
1584
|
alt = "Feature animation",
|
|
1406
1585
|
className = "aspect-video"
|
|
1407
1586
|
}) => {
|
|
1408
|
-
const [isLoading, setIsLoading] =
|
|
1587
|
+
const [isLoading, setIsLoading] = useState12(true);
|
|
1409
1588
|
return /* @__PURE__ */ React24.createElement("div", { className: `relative w-full bg-black overflow-hidden shadow-2xl ${className}` }, isLoading && /* @__PURE__ */ React24.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-black" }, /* @__PURE__ */ React24.createElement(
|
|
1410
|
-
|
|
1589
|
+
HugeiconsIcon11,
|
|
1411
1590
|
{
|
|
1412
1591
|
icon: Loading03Icon5,
|
|
1413
1592
|
size: 32,
|
|
@@ -1419,7 +1598,7 @@ var GifFeatureCard = ({
|
|
|
1419
1598
|
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"}`
|
|
1420
1599
|
},
|
|
1421
1600
|
/* @__PURE__ */ React24.createElement(
|
|
1422
|
-
|
|
1601
|
+
Image10,
|
|
1423
1602
|
{
|
|
1424
1603
|
src: gifSrc,
|
|
1425
1604
|
alt,
|
|
@@ -1438,9 +1617,9 @@ var GifFeatureCard = ({
|
|
|
1438
1617
|
};
|
|
1439
1618
|
|
|
1440
1619
|
// src/components/UniversalSidebar.tsx
|
|
1441
|
-
import React25, { useState as
|
|
1620
|
+
import React25, { useState as useState13, useEffect as useEffect11 } from "react";
|
|
1442
1621
|
import Link9 from "next/link";
|
|
1443
|
-
import { HugeiconsIcon as
|
|
1622
|
+
import { HugeiconsIcon as HugeiconsIcon12 } from "@hugeicons/react";
|
|
1444
1623
|
import {
|
|
1445
1624
|
SidebarLeft01Icon,
|
|
1446
1625
|
CancelCircleIcon,
|
|
@@ -1476,11 +1655,11 @@ var UniversalSidebar = ({
|
|
|
1476
1655
|
interceptTitle = "Discard Changes",
|
|
1477
1656
|
interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
|
|
1478
1657
|
}) => {
|
|
1479
|
-
const [isCollapsed, setIsCollapsed] =
|
|
1480
|
-
const [showSwitcherDialog, setShowSwitcherDialog] =
|
|
1481
|
-
const [showLogoutDialog, setShowLogoutDialog] =
|
|
1482
|
-
const [isLoggingOut, setIsLoggingOut] =
|
|
1483
|
-
|
|
1658
|
+
const [isCollapsed, setIsCollapsed] = useState13(false);
|
|
1659
|
+
const [showSwitcherDialog, setShowSwitcherDialog] = useState13(false);
|
|
1660
|
+
const [showLogoutDialog, setShowLogoutDialog] = useState13(false);
|
|
1661
|
+
const [isLoggingOut, setIsLoggingOut] = useState13(false);
|
|
1662
|
+
useEffect11(() => {
|
|
1484
1663
|
if (isMobileOpen) {
|
|
1485
1664
|
closeMobile();
|
|
1486
1665
|
}
|
|
@@ -1505,7 +1684,7 @@ var UniversalSidebar = ({
|
|
|
1505
1684
|
className: `w-10 h-10 bg-white rounded-full flex items-center justify-center text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
|
|
1506
1685
|
"aria-label": "Open Menu"
|
|
1507
1686
|
},
|
|
1508
|
-
/* @__PURE__ */ React25.createElement(
|
|
1687
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: SidebarLeft01Icon, size: 18 })
|
|
1509
1688
|
), showBackButton && /* @__PURE__ */ React25.createElement(
|
|
1510
1689
|
Link9,
|
|
1511
1690
|
{
|
|
@@ -1513,7 +1692,7 @@ var UniversalSidebar = ({
|
|
|
1513
1692
|
className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none",
|
|
1514
1693
|
"aria-label": "Go Back"
|
|
1515
1694
|
},
|
|
1516
|
-
/* @__PURE__ */ React25.createElement(
|
|
1695
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: ArrowLeft01Icon2, size: 18 })
|
|
1517
1696
|
)), showBackButton && /* @__PURE__ */ React25.createElement("div", { className: "hidden md:flex fixed top-0 right-0 w-full justify-end px-8 pt-6 pb-4 bg-neutral-100 z-40 pointer-events-none" }, /* @__PURE__ */ React25.createElement(
|
|
1518
1697
|
Link9,
|
|
1519
1698
|
{
|
|
@@ -1521,7 +1700,7 @@ var UniversalSidebar = ({
|
|
|
1521
1700
|
className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none pointer-events-auto",
|
|
1522
1701
|
"aria-label": "Go Back"
|
|
1523
1702
|
},
|
|
1524
|
-
/* @__PURE__ */ React25.createElement(
|
|
1703
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: ArrowLeft01Icon2, size: 18 })
|
|
1525
1704
|
)), /* @__PURE__ */ React25.createElement(
|
|
1526
1705
|
"div",
|
|
1527
1706
|
{
|
|
@@ -1545,7 +1724,7 @@ var UniversalSidebar = ({
|
|
|
1545
1724
|
className: "text-neutral-400 hover:text-black transition-colors outline-none",
|
|
1546
1725
|
"aria-label": "Close Menu"
|
|
1547
1726
|
},
|
|
1548
|
-
/* @__PURE__ */ React25.createElement(
|
|
1727
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: CancelCircleIcon, size: 24 })
|
|
1549
1728
|
))),
|
|
1550
1729
|
/* @__PURE__ */ React25.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar" }, navItems.map((item, index) => {
|
|
1551
1730
|
const isExactOrSubMatch = item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
|
|
@@ -1560,7 +1739,7 @@ var UniversalSidebar = ({
|
|
|
1560
1739
|
title: isCollapsed && !isMobileOpen ? item.name : void 0
|
|
1561
1740
|
},
|
|
1562
1741
|
/* @__PURE__ */ React25.createElement(
|
|
1563
|
-
|
|
1742
|
+
HugeiconsIcon12,
|
|
1564
1743
|
{
|
|
1565
1744
|
icon: item.icon,
|
|
1566
1745
|
size: 18,
|
|
@@ -1577,7 +1756,7 @@ var UniversalSidebar = ({
|
|
|
1577
1756
|
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
1578
1757
|
title: "Switch Workspace"
|
|
1579
1758
|
},
|
|
1580
|
-
/* @__PURE__ */ React25.createElement(
|
|
1759
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: UserIcon, size: 16 })
|
|
1581
1760
|
), showLogoutAction && /* @__PURE__ */ React25.createElement(
|
|
1582
1761
|
"button",
|
|
1583
1762
|
{
|
|
@@ -1585,14 +1764,14 @@ var UniversalSidebar = ({
|
|
|
1585
1764
|
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
1586
1765
|
title: "Secure Logout"
|
|
1587
1766
|
},
|
|
1588
|
-
/* @__PURE__ */ React25.createElement(
|
|
1767
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: LogoutCircle02Icon, size: 16 })
|
|
1589
1768
|
)), /* @__PURE__ */ React25.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ React25.createElement(
|
|
1590
1769
|
"button",
|
|
1591
1770
|
{
|
|
1592
1771
|
onClick: () => setIsCollapsed(!isCollapsed),
|
|
1593
1772
|
className: "flex items-center justify-center md:justify-start gap-3 w-full p-2.5 rounded-full text-neutral-500 hover:text-black hover:bg-neutral-50 transition-colors outline-none"
|
|
1594
1773
|
},
|
|
1595
|
-
/* @__PURE__ */ React25.createElement(
|
|
1774
|
+
/* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
|
|
1596
1775
|
!isCollapsed && /* @__PURE__ */ React25.createElement("span", { className: "text-xs" }, "Collapse")
|
|
1597
1776
|
)))
|
|
1598
1777
|
), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ React25.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React25.createElement(
|
|
@@ -1612,7 +1791,7 @@ var UniversalSidebar = ({
|
|
|
1612
1791
|
className: "w-full text-left px-5 py-4 flex items-center justify-between hover:bg-neutral-50 transition-colors group outline-none last:border-0"
|
|
1613
1792
|
},
|
|
1614
1793
|
/* @__PURE__ */ React25.createElement("div", { className: "flex flex-col truncate pr-4" }, /* @__PURE__ */ React25.createElement("span", { className: `text-[13px] truncate ${activeWorkspaceId === org.id ? "text-black" : "text-neutral-600 group-hover:text-black"}` }, org.name), /* @__PURE__ */ React25.createElement("span", { className: "text-[9px] text-neutral-400 tracking-[0.2em] mt-1" }, "Role: ", org.role)),
|
|
1615
|
-
activeWorkspaceId === org.id && /* @__PURE__ */ React25.createElement(
|
|
1794
|
+
activeWorkspaceId === org.id && /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: CheckmarkCircle01Icon, size: 16, className: "text-black shrink-0" })
|
|
1616
1795
|
))), /* @__PURE__ */ React25.createElement("div", { className: "w-full flex mt-auto" }, /* @__PURE__ */ React25.createElement(
|
|
1617
1796
|
"button",
|
|
1618
1797
|
{
|
|
@@ -1666,9 +1845,9 @@ var UniversalSidebar = ({
|
|
|
1666
1845
|
};
|
|
1667
1846
|
|
|
1668
1847
|
// src/components/UniversalOrganizationPage.tsx
|
|
1669
|
-
import React26, { useState as
|
|
1848
|
+
import React26, { useState as useState14, useEffect as useEffect12 } from "react";
|
|
1670
1849
|
import toast2 from "react-hot-toast";
|
|
1671
|
-
import { HugeiconsIcon as
|
|
1850
|
+
import { HugeiconsIcon as HugeiconsIcon13 } from "@hugeicons/react";
|
|
1672
1851
|
import {
|
|
1673
1852
|
CircleLock02Icon
|
|
1674
1853
|
} from "@hugeicons/core-free-icons";
|
|
@@ -1682,12 +1861,12 @@ var UniversalOrganizationPage = ({
|
|
|
1682
1861
|
onSaveConfiguration,
|
|
1683
1862
|
onCheckSlugAvailability
|
|
1684
1863
|
}) => {
|
|
1685
|
-
const [orgName, setOrgName] =
|
|
1686
|
-
const [slug, setSlug] =
|
|
1687
|
-
const [isCheckingSlug, setIsCheckingSlug] =
|
|
1688
|
-
const [slugAvailable, setSlugAvailable] =
|
|
1689
|
-
const [isSubmitting, setIsSubmitting] =
|
|
1690
|
-
|
|
1864
|
+
const [orgName, setOrgName] = useState14(initialOrgName);
|
|
1865
|
+
const [slug, setSlug] = useState14(initialSlug);
|
|
1866
|
+
const [isCheckingSlug, setIsCheckingSlug] = useState14(false);
|
|
1867
|
+
const [slugAvailable, setSlugAvailable] = useState14(null);
|
|
1868
|
+
const [isSubmitting, setIsSubmitting] = useState14(false);
|
|
1869
|
+
useEffect12(() => {
|
|
1691
1870
|
setOrgName(initialOrgName || "");
|
|
1692
1871
|
setSlug(initialSlug || "");
|
|
1693
1872
|
}, [initialOrgName, initialSlug]);
|
|
@@ -1697,7 +1876,7 @@ var UniversalOrganizationPage = ({
|
|
|
1697
1876
|
const handleSlugChange = (val) => {
|
|
1698
1877
|
setSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
|
|
1699
1878
|
};
|
|
1700
|
-
|
|
1879
|
+
useEffect12(() => {
|
|
1701
1880
|
if (!slug || slug === initialSlug) {
|
|
1702
1881
|
setSlugAvailable(null);
|
|
1703
1882
|
setIsCheckingSlug(false);
|
|
@@ -1751,7 +1930,7 @@ var UniversalOrganizationPage = ({
|
|
|
1751
1930
|
};
|
|
1752
1931
|
const hasChanges = orgName !== initialOrgName || slug !== initialSlug;
|
|
1753
1932
|
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || orgName.length < 3 || slug.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
1754
|
-
return /* @__PURE__ */ React26.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ React26.createElement(ManagedToaster, null), /* @__PURE__ */ React26.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React26.createElement("div", null, /* @__PURE__ */ React26.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, "Organization"), /* @__PURE__ */ React26.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your tenant workspace details and identity.")), isReadOnly && /* @__PURE__ */ React26.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React26.createElement(
|
|
1933
|
+
return /* @__PURE__ */ React26.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ React26.createElement(ManagedToaster, null), /* @__PURE__ */ React26.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React26.createElement("div", null, /* @__PURE__ */ React26.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, "Organization"), /* @__PURE__ */ React26.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your tenant workspace details and identity.")), isReadOnly && /* @__PURE__ */ React26.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React26.createElement(HugeiconsIcon13, { icon: CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ React26.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ React26.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ React26.createElement(
|
|
1755
1934
|
TextInput,
|
|
1756
1935
|
{
|
|
1757
1936
|
label: "Organization Name",
|
|
@@ -1797,9 +1976,9 @@ var UniversalOrganizationPage = ({
|
|
|
1797
1976
|
};
|
|
1798
1977
|
|
|
1799
1978
|
// src/components/UniversalIdentityPage.tsx
|
|
1800
|
-
import React27, { useState as
|
|
1979
|
+
import React27, { useState as useState15, useEffect as useEffect13 } from "react";
|
|
1801
1980
|
import toast3 from "react-hot-toast";
|
|
1802
|
-
import { HugeiconsIcon as
|
|
1981
|
+
import { HugeiconsIcon as HugeiconsIcon14 } from "@hugeicons/react";
|
|
1803
1982
|
import {
|
|
1804
1983
|
CircleLock02Icon as CircleLock02Icon2
|
|
1805
1984
|
} from "@hugeicons/core-free-icons";
|
|
@@ -1819,12 +1998,12 @@ var UniversalIdentityPage = ({
|
|
|
1819
1998
|
onDeleteResource,
|
|
1820
1999
|
onSuccessfulDeleteRedirect = "/app"
|
|
1821
2000
|
}) => {
|
|
1822
|
-
const [primaryValue, setPrimaryValue] =
|
|
1823
|
-
const [secondaryValue, setSecondaryValue] =
|
|
1824
|
-
const [isSubmitting, setIsSubmitting] =
|
|
1825
|
-
const [isDeleteModalOpen, setIsDeleteModalOpen] =
|
|
1826
|
-
const [isDeleting, setIsDeleting] =
|
|
1827
|
-
|
|
2001
|
+
const [primaryValue, setPrimaryValue] = useState15(initialPrimaryValue);
|
|
2002
|
+
const [secondaryValue, setSecondaryValue] = useState15(initialSecondaryValue);
|
|
2003
|
+
const [isSubmitting, setIsSubmitting] = useState15(false);
|
|
2004
|
+
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState15(false);
|
|
2005
|
+
const [isDeleting, setIsDeleting] = useState15(false);
|
|
2006
|
+
useEffect13(() => {
|
|
1828
2007
|
setPrimaryValue(initialPrimaryValue || "");
|
|
1829
2008
|
setSecondaryValue(initialSecondaryValue || "");
|
|
1830
2009
|
}, [initialPrimaryValue, initialSecondaryValue]);
|
|
@@ -1875,7 +2054,7 @@ var UniversalIdentityPage = ({
|
|
|
1875
2054
|
};
|
|
1876
2055
|
const hasChanges = primaryValue !== initialPrimaryValue || secondaryValue !== initialSecondaryValue;
|
|
1877
2056
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || primaryValue.trim().length < 3;
|
|
1878
|
-
return /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ React27.createElement(ManagedToaster, null), /* @__PURE__ */ React27.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React27.createElement("div", null, /* @__PURE__ */ React27.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ React27.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), isReadOnly && /* @__PURE__ */ React27.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React27.createElement(
|
|
2057
|
+
return /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ React27.createElement(ManagedToaster, null), /* @__PURE__ */ React27.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React27.createElement("div", null, /* @__PURE__ */ React27.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ React27.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), isReadOnly && /* @__PURE__ */ React27.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React27.createElement(HugeiconsIcon14, { icon: CircleLock02Icon2, size: 18, className: "text-current" }))), /* @__PURE__ */ React27.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ React27.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ React27.createElement(
|
|
1879
2058
|
TextInput,
|
|
1880
2059
|
{
|
|
1881
2060
|
label: primaryInputLabel,
|
|
@@ -1944,19 +2123,19 @@ var UniversalIdentityPage = ({
|
|
|
1944
2123
|
};
|
|
1945
2124
|
|
|
1946
2125
|
// src/components/UniversalMembersPage.tsx
|
|
1947
|
-
import React28, { useState as
|
|
2126
|
+
import React28, { useState as useState16, useEffect as useEffect14, useRef as useRef9 } from "react";
|
|
1948
2127
|
import toast4 from "react-hot-toast";
|
|
1949
|
-
import { HugeiconsIcon as
|
|
2128
|
+
import { HugeiconsIcon as HugeiconsIcon15 } from "@hugeicons/react";
|
|
1950
2129
|
import {
|
|
1951
2130
|
UserAdd01Icon,
|
|
1952
2131
|
ArrowLeft01Icon as ArrowLeft01Icon3,
|
|
1953
2132
|
ArrowRight01Icon as ArrowRight01Icon3,
|
|
1954
2133
|
Delete01Icon,
|
|
1955
|
-
ArrowDown01Icon
|
|
2134
|
+
ArrowDown01Icon,
|
|
1956
2135
|
Loading03Icon as Loading03Icon6
|
|
1957
2136
|
} from "@hugeicons/core-free-icons";
|
|
1958
|
-
var ButtonSpinner3 = () => /* @__PURE__ */ React28.createElement(
|
|
1959
|
-
var PageSpinner2 = () => /* @__PURE__ */ React28.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React28.createElement(
|
|
2137
|
+
var ButtonSpinner3 = () => /* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: Loading03Icon6, size: 16, className: "animate-spin text-white" });
|
|
2138
|
+
var PageSpinner2 = () => /* @__PURE__ */ React28.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: Loading03Icon6, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
1960
2139
|
var getInitials = (name) => {
|
|
1961
2140
|
if (!name) return "U";
|
|
1962
2141
|
const parts = name.trim().split(" ");
|
|
@@ -1999,18 +2178,18 @@ var UniversalMembersPage = ({
|
|
|
1999
2178
|
onRemoveMember,
|
|
2000
2179
|
onUpdateRole
|
|
2001
2180
|
}) => {
|
|
2002
|
-
const [currentView, setCurrentView] =
|
|
2003
|
-
const [selectedMember, setSelectedMember] =
|
|
2004
|
-
const [inviteEmail, setInviteEmail] =
|
|
2005
|
-
const [inviteFirst, setInviteFirst] =
|
|
2006
|
-
const [inviteLast, setInviteLast] =
|
|
2007
|
-
const [isInviting, setIsInviting] =
|
|
2008
|
-
const [isRoleModalOpen, setIsRoleModalOpen] =
|
|
2009
|
-
const [isUpdatingRole, setIsUpdatingRole] =
|
|
2010
|
-
const [memberToDelete, setMemberToDelete] =
|
|
2011
|
-
const [isDeleting, setIsDeleting] =
|
|
2012
|
-
const dropdownRef =
|
|
2013
|
-
|
|
2181
|
+
const [currentView, setCurrentView] = useState16("list");
|
|
2182
|
+
const [selectedMember, setSelectedMember] = useState16(null);
|
|
2183
|
+
const [inviteEmail, setInviteEmail] = useState16("");
|
|
2184
|
+
const [inviteFirst, setInviteFirst] = useState16("");
|
|
2185
|
+
const [inviteLast, setInviteLast] = useState16("");
|
|
2186
|
+
const [isInviting, setIsInviting] = useState16(false);
|
|
2187
|
+
const [isRoleModalOpen, setIsRoleModalOpen] = useState16(false);
|
|
2188
|
+
const [isUpdatingRole, setIsUpdatingRole] = useState16(false);
|
|
2189
|
+
const [memberToDelete, setMemberToDelete] = useState16(null);
|
|
2190
|
+
const [isDeleting, setIsDeleting] = useState16(false);
|
|
2191
|
+
const dropdownRef = useRef9(null);
|
|
2192
|
+
useEffect14(() => {
|
|
2014
2193
|
function handleClickOutside(event) {
|
|
2015
2194
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
2016
2195
|
setIsRoleModalOpen(false);
|
|
@@ -2090,9 +2269,9 @@ var UniversalMembersPage = ({
|
|
|
2090
2269
|
onClick: () => setCurrentView("invite"),
|
|
2091
2270
|
className: "w-fit shrink-0 gap-2"
|
|
2092
2271
|
},
|
|
2093
|
-
/* @__PURE__ */ React28.createElement(
|
|
2272
|
+
/* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: UserAdd01Icon, size: 12 }),
|
|
2094
2273
|
"Add Member"
|
|
2095
|
-
)), currentView !== "list" && /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React28.createElement("button", { onClick: goBack, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ React28.createElement(
|
|
2274
|
+
)), currentView !== "list" && /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React28.createElement("button", { onClick: goBack, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: ArrowLeft01Icon3, size: 12 }), " Back"), /* @__PURE__ */ React28.createElement("h1", { className: " font-serif text-lg text-black tracking-tight" }, currentView === "invite" ? "Add New Member" : "Member Profile"))), currentView === "list" && /* @__PURE__ */ React28.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ React28.createElement(PageSpinner2, null) : /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React28.createElement("div", { className: "divide-y divide-neutral-100" }, members.map((member) => /* @__PURE__ */ React28.createElement(
|
|
2096
2275
|
"div",
|
|
2097
2276
|
{
|
|
2098
2277
|
key: member.id,
|
|
@@ -2119,7 +2298,7 @@ var UniversalMembersPage = ({
|
|
|
2119
2298
|
disabled: currentPage === 1 || isLoading,
|
|
2120
2299
|
className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2121
2300
|
},
|
|
2122
|
-
/* @__PURE__ */ React28.createElement(
|
|
2301
|
+
/* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: ArrowLeft01Icon3, size: 14 })
|
|
2123
2302
|
), /* @__PURE__ */ React28.createElement(
|
|
2124
2303
|
"button",
|
|
2125
2304
|
{
|
|
@@ -2127,7 +2306,7 @@ var UniversalMembersPage = ({
|
|
|
2127
2306
|
disabled: currentPage >= totalPages || isLoading,
|
|
2128
2307
|
className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2129
2308
|
},
|
|
2130
|
-
/* @__PURE__ */ React28.createElement(
|
|
2309
|
+
/* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: ArrowRight01Icon3, size: 14 })
|
|
2131
2310
|
))))), currentView === "details" && selectedMember && /* @__PURE__ */ React28.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ React28.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ React28.createElement("div", { className: "flex items-center gap-5" }, selectedMember.displayImage && selectedMember.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ React28.createElement("div", { className: "w-16 h-16 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ React28.createElement(
|
|
2132
2311
|
"img",
|
|
2133
2312
|
{
|
|
@@ -2144,14 +2323,14 @@ var UniversalMembersPage = ({
|
|
|
2144
2323
|
className: `flex items-center gap-3 text-xs text-black pl-4 pr-3 py-2 border rounded-full transition-colors disabled:opacity-50 outline-none ${isRoleModalOpen ? "bg-neutral-50 border-neutral-300" : "bg-white border-neutral-200 hover:bg-neutral-50"}`
|
|
2145
2324
|
},
|
|
2146
2325
|
selectedMember.role,
|
|
2147
|
-
isUpdatingRole ? /* @__PURE__ */ React28.createElement(ButtonSpinner3, null) : /* @__PURE__ */ React28.createElement(
|
|
2326
|
+
isUpdatingRole ? /* @__PURE__ */ React28.createElement(ButtonSpinner3, null) : /* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2148
2327
|
) : /* @__PURE__ */ React28.createElement("span", { className: "text-xs text-black bg-neutral-50 px-4 py-2 rounded-full inline-block" }, selectedMember.role)), /* @__PURE__ */ React28.createElement("div", null, /* @__PURE__ */ React28.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Joined Date"), /* @__PURE__ */ React28.createElement("span", { className: "text-sm text-black" }, new Date(selectedMember.joinedAt).toLocaleDateString()))), canManage && selectedMember.userId !== currentUserId && /* @__PURE__ */ React28.createElement("div", { className: "pt-8 mt-2 border-t border-neutral-200" }, /* @__PURE__ */ React28.createElement(
|
|
2149
2328
|
"button",
|
|
2150
2329
|
{
|
|
2151
2330
|
onClick: () => setMemberToDelete(selectedMember),
|
|
2152
2331
|
className: "flex items-center gap-2 text-[11px] tracking-widest text-red-600 hover:text-red-700 transition-colors w-fit outline-none"
|
|
2153
2332
|
},
|
|
2154
|
-
/* @__PURE__ */ React28.createElement(
|
|
2333
|
+
/* @__PURE__ */ React28.createElement(HugeiconsIcon15, { icon: Delete01Icon, size: 14 }),
|
|
2155
2334
|
" Remove Member"
|
|
2156
2335
|
)))), currentView === "invite" && canManage && /* @__PURE__ */ React28.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ React28.createElement("form", { onSubmit: handleInvite, className: "space-y-8", autoComplete: "off" }, /* @__PURE__ */ React28.createElement(
|
|
2157
2336
|
TextInput,
|
|
@@ -2211,9 +2390,9 @@ var UniversalMembersPage = ({
|
|
|
2211
2390
|
};
|
|
2212
2391
|
|
|
2213
2392
|
// src/components/UniversalProfileSettings.tsx
|
|
2214
|
-
import React29, { useState as
|
|
2393
|
+
import React29, { useState as useState17, useEffect as useEffect15 } from "react";
|
|
2215
2394
|
import toast5 from "react-hot-toast";
|
|
2216
|
-
import { HugeiconsIcon as
|
|
2395
|
+
import { HugeiconsIcon as HugeiconsIcon16 } from "@hugeicons/react";
|
|
2217
2396
|
import {
|
|
2218
2397
|
CircleLock02Icon as CircleLock02Icon3
|
|
2219
2398
|
} from "@hugeicons/core-free-icons";
|
|
@@ -2226,10 +2405,10 @@ var UniversalProfileSettings = ({
|
|
|
2226
2405
|
isReadOnly = false,
|
|
2227
2406
|
onSaveProfile
|
|
2228
2407
|
}) => {
|
|
2229
|
-
const [firstName, setFirstName] =
|
|
2230
|
-
const [lastName, setLastName] =
|
|
2231
|
-
const [isSubmitting, setIsSubmitting] =
|
|
2232
|
-
|
|
2408
|
+
const [firstName, setFirstName] = useState17(initialFirstName);
|
|
2409
|
+
const [lastName, setLastName] = useState17(initialLastName);
|
|
2410
|
+
const [isSubmitting, setIsSubmitting] = useState17(false);
|
|
2411
|
+
useEffect15(() => {
|
|
2233
2412
|
setFirstName(initialFirstName || "");
|
|
2234
2413
|
setLastName(initialLastName || "");
|
|
2235
2414
|
}, [initialFirstName, initialLastName]);
|
|
@@ -2259,7 +2438,7 @@ var UniversalProfileSettings = ({
|
|
|
2259
2438
|
};
|
|
2260
2439
|
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
2261
2440
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
2262
|
-
return /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ React29.createElement(ManagedToaster, null), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React29.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React29.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ React29.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ React29.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React29.createElement(
|
|
2441
|
+
return /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ React29.createElement(ManagedToaster, null), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React29.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React29.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ React29.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ React29.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React29.createElement(HugeiconsIcon16, { icon: CircleLock02Icon3, size: 18, className: "text-current" }))), /* @__PURE__ */ React29.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ React29.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ React29.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React29.createElement(
|
|
2263
2442
|
TextInput,
|
|
2264
2443
|
{
|
|
2265
2444
|
label: "First Name",
|
|
@@ -2286,7 +2465,7 @@ var UniversalProfileSettings = ({
|
|
|
2286
2465
|
},
|
|
2287
2466
|
disabled: true
|
|
2288
2467
|
}
|
|
2289
|
-
), /* @__PURE__ */ React29.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4
|
|
2468
|
+
), /* @__PURE__ */ React29.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4 " }, /* @__PURE__ */ React29.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ React29.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React29.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Account Status"), /* @__PURE__ */ React29.createElement("span", { className: "text-xs text-black block truncate" }, accountStatus)), /* @__PURE__ */ React29.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React29.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Member Since"), /* @__PURE__ */ React29.createElement("span", { className: "text-xs text-black block truncate" }, memberSince ? new Date(memberSince).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric" }) : "N/A"))), /* @__PURE__ */ React29.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__ */ React29.createElement(
|
|
2290
2469
|
"button",
|
|
2291
2470
|
{
|
|
2292
2471
|
type: "button",
|
|
@@ -2310,17 +2489,17 @@ var UniversalProfileSettings = ({
|
|
|
2310
2489
|
};
|
|
2311
2490
|
|
|
2312
2491
|
// src/components/UniversalBillingPage.tsx
|
|
2313
|
-
import React30, { useState as
|
|
2314
|
-
import { HugeiconsIcon as
|
|
2492
|
+
import React30, { useState as useState18 } from "react";
|
|
2493
|
+
import { HugeiconsIcon as HugeiconsIcon17 } from "@hugeicons/react";
|
|
2315
2494
|
import {
|
|
2316
2495
|
ArrowLeft01Icon as ArrowLeft01Icon4,
|
|
2317
2496
|
ArrowRight01Icon as ArrowRight01Icon4,
|
|
2318
2497
|
Loading03Icon as Loading03Icon7,
|
|
2319
|
-
ArrowDown01Icon as
|
|
2498
|
+
ArrowDown01Icon as ArrowDown01Icon2,
|
|
2320
2499
|
CircleLock02Icon as CircleLock02Icon4
|
|
2321
2500
|
} from "@hugeicons/core-free-icons";
|
|
2322
|
-
var PageSpinner3 = () => /* @__PURE__ */ React30.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React30.createElement(
|
|
2323
|
-
var ButtonSpinner4 = () => /* @__PURE__ */ React30.createElement(
|
|
2501
|
+
var PageSpinner3 = () => /* @__PURE__ */ React30.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: Loading03Icon7, size: 32, className: "animate-spin mb-4 text-neutral-400" }));
|
|
2502
|
+
var ButtonSpinner4 = () => /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: Loading03Icon7, size: 16, className: "animate-spin text-neutral-500" });
|
|
2324
2503
|
var formatDate = (dateString) => {
|
|
2325
2504
|
if (!dateString) return "N/A";
|
|
2326
2505
|
return new Date(dateString).toLocaleDateString("en-US", {
|
|
@@ -2362,13 +2541,13 @@ var UniversalBillingPage = ({
|
|
|
2362
2541
|
onPayInvoice,
|
|
2363
2542
|
onUpdateInvoiceStatus
|
|
2364
2543
|
}) => {
|
|
2365
|
-
const [currentView, setCurrentView] =
|
|
2366
|
-
const [selectedInvoice, setSelectedInvoice] =
|
|
2367
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] =
|
|
2368
|
-
const [isPaying, setIsPaying] =
|
|
2369
|
-
const [isActionModalOpen, setIsActionModalOpen] =
|
|
2370
|
-
const [isUpdating, setIsUpdating] =
|
|
2371
|
-
const [twoFactorCode, setTwoFactorCode] =
|
|
2544
|
+
const [currentView, setCurrentView] = useState18("list");
|
|
2545
|
+
const [selectedInvoice, setSelectedInvoice] = useState18(null);
|
|
2546
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = useState18(false);
|
|
2547
|
+
const [isPaying, setIsPaying] = useState18(false);
|
|
2548
|
+
const [isActionModalOpen, setIsActionModalOpen] = useState18(false);
|
|
2549
|
+
const [isUpdating, setIsUpdating] = useState18(false);
|
|
2550
|
+
const [twoFactorCode, setTwoFactorCode] = useState18("");
|
|
2372
2551
|
const handlePayment = async () => {
|
|
2373
2552
|
if (!selectedInvoice || isReadOnly || !onPayInvoice || isPaying) return;
|
|
2374
2553
|
setIsPaying(true);
|
|
@@ -2410,10 +2589,10 @@ var UniversalBillingPage = ({
|
|
|
2410
2589
|
className: "px-4 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black shrink-0 text-left"
|
|
2411
2590
|
},
|
|
2412
2591
|
timeframe === "ALL" ? "All Time" : timeframe === "24H" ? "Past 24 Hours" : timeframe === "7D" ? "Past 7 Days" : "Past 30 Days"
|
|
2413
|
-
))) : /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React30.createElement("button", { onClick: () => setCurrentView("list"), className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ React30.createElement(
|
|
2592
|
+
))) : /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React30.createElement("button", { onClick: () => setCurrentView("list"), className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: ArrowLeft01Icon4, size: 12 }), " Back")), isReadOnly && currentView === "list" && /* @__PURE__ */ React30.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: CircleLock02Icon4, size: 18, className: "text-current" }))), currentView === "list" && /* @__PURE__ */ React30.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col gap-8 w-full" }, (metricPrimaryLabel || metricSecondaryLabel) && /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between sm:items-start pb-8 border-b border-neutral-200 gap-6 sm:gap-0" }, metricPrimaryLabel && /* @__PURE__ */ React30.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricPrimaryLabel), /* @__PURE__ */ React30.createElement("div", { className: "text-xl text-black tracking-tight truncate" }, formatNaira(metricPrimaryValue)), metricPrimarySubtext && /* @__PURE__ */ React30.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricPrimarySubtext)), metricSecondaryLabel && /* @__PURE__ */ React30.createElement("div", { className: "min-w-0 sm:text-right" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricSecondaryLabel), /* @__PURE__ */ React30.createElement("div", { className: "text-xl text-emerald-600 tracking-tight truncate" }, formatNaira(metricSecondaryValue)), metricSecondarySubtext && /* @__PURE__ */ React30.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricSecondarySubtext))), !isReadOnly && showBillingOverview && /* @__PURE__ */ React30.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-8 sm:gap-4" }, /* @__PURE__ */ React30.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Billing Status"), /* @__PURE__ */ React30.createElement("div", { className: "flex items-center gap-2 min-w-0" }, /* @__PURE__ */ React30.createElement("div", { className: `w-2 h-2 rounded-full shrink-0 ${billingStatus === "ACTIVE" ? "bg-green-500" : "bg-neutral-300"}` }), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-black tracking-widest truncate" }, billingStatus || "UNKNOWN"))), /* @__PURE__ */ React30.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Next Billing Date"), /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-black truncate" }, formatDate(nextBillingDate))), lastPaidDate && /* @__PURE__ */ React30.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Last Paid Date"), /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-neutral-600 truncate" }, formatDate(lastPaidDate)))), !isReadOnly && showUsageMetrics && usageMetrics.length > 0 && /* @__PURE__ */ React30.createElement("div", { className: "pt-8 border-t border-neutral-200" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 truncate block uppercase" }, "Usage & Limits"), /* @__PURE__ */ React30.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-4 text-sm text-black" }, usageMetrics.map((metric, idx) => /* @__PURE__ */ React30.createElement("div", { key: idx, className: "flex justify-between border-b border-neutral-50 pb-2" }, /* @__PURE__ */ React30.createElement("span", { className: "text-neutral-500 text-xs" }, metric.label), /* @__PURE__ */ React30.createElement("span", { className: "text-xs text-black" }, metric.value))))), /* @__PURE__ */ React30.createElement("div", { className: "pt-8 border-t border-neutral-200" }, /* @__PURE__ */ React30.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-4 truncate block uppercase" }, "Transaction History"), isLoading ? /* @__PURE__ */ React30.createElement(PageSpinner3, null) : invoices.length === 0 ? /* @__PURE__ */ React30.createElement(React30.Fragment, null, /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500 py-4" }, "No records found.")) : /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React30.createElement("div", { className: "divide-y divide-neutral-100" }, invoices.map((inv) => /* @__PURE__ */ React30.createElement("div", { key: inv.id, onClick: () => {
|
|
2414
2593
|
setSelectedInvoice(inv);
|
|
2415
2594
|
setCurrentView("details");
|
|
2416
|
-
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col gap-1 min-w-0 flex-1" }, /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-black truncate pr-4" }, inv.name), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500 truncate" }, inv.subtext)), /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-black" }, formatNaira(inv.amountDue)), /* @__PURE__ */ React30.createElement("span", { className: `text-[9px] tracking-widest px-2 py-0.5 rounded-full ${inv.status === "PAID" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, inv.status))))), totalPages > 1 && /* @__PURE__ */ React30.createElement("div", { className: "flex items-center justify-between pt-4 mt-2" }, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React30.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React30.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React30.createElement(
|
|
2595
|
+
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col gap-1 min-w-0 flex-1" }, /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-black truncate pr-4" }, inv.name), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500 truncate" }, inv.subtext)), /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ React30.createElement("p", { className: "text-sm text-black" }, formatNaira(inv.amountDue)), /* @__PURE__ */ React30.createElement("span", { className: `text-[9px] tracking-widest px-2 py-0.5 rounded-full ${inv.status === "PAID" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, inv.status))))), totalPages > 1 && /* @__PURE__ */ React30.createElement("div", { className: "flex items-center justify-between pt-4 mt-2" }, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React30.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React30.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: ArrowLeft01Icon4, size: 14 })), /* @__PURE__ */ React30.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: ArrowRight01Icon4, size: 14 })))))))), currentView === "details" && selectedInvoice && /* @__PURE__ */ React30.createElement("div", { className: "w-full max-w-2xl animate-in fade-in duration-300" }, /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col gap-6 w-full" }, /* @__PURE__ */ React30.createElement("div", null, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Breakdown"), /* @__PURE__ */ React30.createElement("h2", { className: " font-serif text-xl text-black mb-1" }, selectedInvoice.name), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500" }, "Generated on ", formatDate(selectedInvoice.createdAt))), /* @__PURE__ */ React30.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 p-6 sm:p-8 rounded-2xl border border-neutral-200" }, /* @__PURE__ */ React30.createElement("div", null, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Amount"), /* @__PURE__ */ React30.createElement("p", { className: "text-xl text-black" }, formatNaira(selectedInvoice.amountDue))), /* @__PURE__ */ React30.createElement("div", null, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Status"), isModMode ? /* @__PURE__ */ React30.createElement(
|
|
2417
2596
|
"button",
|
|
2418
2597
|
{
|
|
2419
2598
|
onClick: () => !isUpdating && setIsActionModalOpen(true),
|
|
@@ -2421,7 +2600,7 @@ var UniversalBillingPage = ({
|
|
|
2421
2600
|
className: `flex items-center gap-3 text-xs text-black px-3 py-1.5 mt-1 border rounded-full transition-colors disabled:opacity-50 outline-none ${isActionModalOpen ? "bg-neutral-50 border-neutral-300" : "bg-white border-neutral-200 hover:bg-neutral-50"}`
|
|
2422
2601
|
},
|
|
2423
2602
|
selectedInvoice.status,
|
|
2424
|
-
isUpdating ? /* @__PURE__ */ React30.createElement(ButtonSpinner4, null) : /* @__PURE__ */ React30.createElement(
|
|
2603
|
+
isUpdating ? /* @__PURE__ */ React30.createElement(ButtonSpinner4, null) : /* @__PURE__ */ React30.createElement(HugeiconsIcon17, { icon: ArrowDown01Icon2, size: 14, className: "text-neutral-400" })
|
|
2425
2604
|
) : /* @__PURE__ */ React30.createElement("span", { className: `text-[10px] tracking-widest px-3 py-1 mt-1 inline-block rounded-full ${selectedInvoice.status === "PAID" ? "bg-emerald-100 text-emerald-700" : "bg-neutral-100 text-neutral-700"}` }, selectedInvoice.status)), /* @__PURE__ */ React30.createElement("div", { className: "md:col-span-2 pt-4 border-t border-neutral-200/60 mt-2" }, /* @__PURE__ */ React30.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Reference ID"), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500 bg-white px-3 py-2 rounded-full border border-neutral-200 inline-block" }, selectedInvoice.id))), /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-end gap-4 pt-4" }, !isModMode && selectedInvoice.status === "SCHEDULED" && onPayInvoice && /* @__PURE__ */ React30.createElement("div", { className: "flex flex-col items-end gap-2 w-full sm:w-auto" }, /* @__PURE__ */ React30.createElement(
|
|
2426
2605
|
ThreeDActionButton,
|
|
2427
2606
|
{
|
|
@@ -2471,9 +2650,9 @@ var UniversalBillingPage = ({
|
|
|
2471
2650
|
};
|
|
2472
2651
|
|
|
2473
2652
|
// src/components/UniversalDashboardPage.tsx
|
|
2474
|
-
import React31, { useState as
|
|
2475
|
-
import { HugeiconsIcon as
|
|
2476
|
-
import { ArrowDown01Icon as
|
|
2653
|
+
import React31, { useState as useState19 } from "react";
|
|
2654
|
+
import { HugeiconsIcon as HugeiconsIcon18 } from "@hugeicons/react";
|
|
2655
|
+
import { ArrowDown01Icon as ArrowDown01Icon3, Loading03Icon as Loading03Icon8 } from "@hugeicons/core-free-icons";
|
|
2477
2656
|
var UniversalDashboardPage = ({
|
|
2478
2657
|
headerTitle,
|
|
2479
2658
|
headerDescription,
|
|
@@ -2484,10 +2663,10 @@ var UniversalDashboardPage = ({
|
|
|
2484
2663
|
lists,
|
|
2485
2664
|
isLoading = false
|
|
2486
2665
|
}) => {
|
|
2487
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] =
|
|
2666
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = useState19(false);
|
|
2488
2667
|
const selectedTimeframe = timeframes.find((t) => t.id === activeTimeframe) || timeframes[0];
|
|
2489
2668
|
if (isLoading) {
|
|
2490
|
-
return /* @__PURE__ */ React31.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React31.createElement(
|
|
2669
|
+
return /* @__PURE__ */ React31.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React31.createElement(HugeiconsIcon18, { icon: Loading03Icon8, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2491
2670
|
}
|
|
2492
2671
|
return /* @__PURE__ */ React31.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ React31.createElement(ManagedToaster, null), /* @__PURE__ */ React31.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4" }, /* @__PURE__ */ React31.createElement("div", null, /* @__PURE__ */ React31.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ React31.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), timeframes.length > 0 && selectedTimeframe && onTimeframeChange && /* @__PURE__ */ React31.createElement(
|
|
2493
2672
|
"button",
|
|
@@ -2496,7 +2675,7 @@ var UniversalDashboardPage = ({
|
|
|
2496
2675
|
className: "flex items-center gap-3 px-4 py-2 text-xs bg-white text-black outline-none rounded-full transition-colors hover:bg-neutral-50 shrink-0"
|
|
2497
2676
|
},
|
|
2498
2677
|
/* @__PURE__ */ React31.createElement("span", null, selectedTimeframe.label),
|
|
2499
|
-
/* @__PURE__ */ React31.createElement(
|
|
2678
|
+
/* @__PURE__ */ React31.createElement(HugeiconsIcon18, { icon: ArrowDown01Icon3, size: 14, className: "text-neutral-400" })
|
|
2500
2679
|
)), stats.length > 0 && /* @__PURE__ */ React31.createElement("div", { className: "w-full rounded-2xl overflow-hidden bg-white" }, /* @__PURE__ */ React31.createElement("div", { className: "grid grid-cols-2 md:grid-cols-5 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, stats.map((stat, idx) => /* @__PURE__ */ React31.createElement("div", { key: idx, className: "p-6 flex flex-col gap-1 min-w-0" }, /* @__PURE__ */ React31.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 truncate uppercase" }, stat.label), /* @__PURE__ */ React31.createElement("p", { className: `text-xl tracking-tight truncate ${stat.valueClass || "text-black"}` }, stat.value))))), lists.length > 0 && /* @__PURE__ */ React31.createElement("div", { className: "flex flex-col gap-8 w-full max-w-4xl" }, lists.map((list, idx) => /* @__PURE__ */ React31.createElement("div", { key: idx, className: "bg-white rounded-2xl p-6 flex flex-col min-w-0" }, /* @__PURE__ */ React31.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ React31.createElement("div", { className: "text-neutral-400" }, list.icon), /* @__PURE__ */ React31.createElement("h2", { className: " font-serif text-[11px] text-black tracking-[0.2em] uppercase" }, list.title)), /* @__PURE__ */ React31.createElement("div", { className: "divide-y divide-neutral-100 flex-1 overflow-y-auto" }, list.items.length === 0 ? /* @__PURE__ */ React31.createElement("p", { className: "text-xs text-neutral-500 py-4" }, list.emptyMessage) : list.items.map((item) => /* @__PURE__ */ React31.createElement("div", { key: item.id, className: "flex flex-col sm:flex-row sm:items-center justify-between py-4 gap-2 min-w-0 group" }, /* @__PURE__ */ React31.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React31.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.primaryText), /* @__PURE__ */ React31.createElement("p", { className: "text-[10px] text-neutral-500 truncate tracking-widest mt-0.5" }, item.secondaryText)), /* @__PURE__ */ React31.createElement("div", { className: "flex items-center gap-4 shrink-0 pl-4" }, item.rightText && /* @__PURE__ */ React31.createElement("p", { className: "text-xs text-black" }, item.rightText), item.rightBadge && /* @__PURE__ */ React31.createElement("span", { className: `text-[9px] tracking-widest px-2.5 py-1 rounded-full ${item.rightBadgeClass || "bg-neutral-50 text-neutral-600"}` }, item.rightBadge)))))))), isTimeframeModalOpen && timeframes.length > 0 && onTimeframeChange && /* @__PURE__ */ React31.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React31.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ React31.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React31.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ React31.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight" }, "Select Timeframe")), /* @__PURE__ */ React31.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, timeframes.map((tf) => /* @__PURE__ */ React31.createElement(
|
|
2501
2680
|
"button",
|
|
2502
2681
|
{
|
|
@@ -2520,8 +2699,8 @@ var UniversalDashboardPage = ({
|
|
|
2520
2699
|
};
|
|
2521
2700
|
|
|
2522
2701
|
// src/components/UniversalAgentConsole.tsx
|
|
2523
|
-
import React32, { useState as
|
|
2524
|
-
import { HugeiconsIcon as
|
|
2702
|
+
import React32, { useState as useState20, useRef as useRef10 } from "react";
|
|
2703
|
+
import { HugeiconsIcon as HugeiconsIcon19 } from "@hugeicons/react";
|
|
2525
2704
|
import {
|
|
2526
2705
|
ArrowLeft01Icon as ArrowLeft01Icon5,
|
|
2527
2706
|
ArrowRight01Icon as ArrowRight01Icon5,
|
|
@@ -2530,7 +2709,7 @@ import {
|
|
|
2530
2709
|
Cancel01Icon,
|
|
2531
2710
|
Upload01Icon,
|
|
2532
2711
|
Download01Icon,
|
|
2533
|
-
ArrowDown01Icon as
|
|
2712
|
+
ArrowDown01Icon as ArrowDown01Icon4,
|
|
2534
2713
|
Delete02Icon,
|
|
2535
2714
|
File02Icon
|
|
2536
2715
|
} from "@hugeicons/core-free-icons";
|
|
@@ -2562,13 +2741,13 @@ var UniversalAgentConsole = ({
|
|
|
2562
2741
|
onUploadArchives,
|
|
2563
2742
|
onDeleteArchive
|
|
2564
2743
|
}) => {
|
|
2565
|
-
const archiveRef =
|
|
2566
|
-
const [pendingFiles, setPendingFiles] =
|
|
2567
|
-
const [isUploading, setIsUploading] =
|
|
2568
|
-
const [isActioning, setIsActioning] =
|
|
2569
|
-
const [actionModal, setActionModal] =
|
|
2570
|
-
const [actionMessage, setActionMessage] =
|
|
2571
|
-
const [archiveToDelete, setArchiveToDelete] =
|
|
2744
|
+
const archiveRef = useRef10(null);
|
|
2745
|
+
const [pendingFiles, setPendingFiles] = useState20([]);
|
|
2746
|
+
const [isUploading, setIsUploading] = useState20(false);
|
|
2747
|
+
const [isActioning, setIsActioning] = useState20(false);
|
|
2748
|
+
const [actionModal, setActionModal] = useState20(null);
|
|
2749
|
+
const [actionMessage, setActionMessage] = useState20("");
|
|
2750
|
+
const [archiveToDelete, setArchiveToDelete] = useState20(null);
|
|
2572
2751
|
const handleFileSelect = (e) => {
|
|
2573
2752
|
if (e.target.files && e.target.files.length > 0) {
|
|
2574
2753
|
setPendingFiles((prev) => [...prev, ...Array.from(e.target.files)]);
|
|
@@ -2597,20 +2776,20 @@ var UniversalAgentConsole = ({
|
|
|
2597
2776
|
}
|
|
2598
2777
|
};
|
|
2599
2778
|
const DynamicArrayAccordion = ({ items, parentKey }) => {
|
|
2600
|
-
const [activeFAQ, setActiveFAQ] =
|
|
2779
|
+
const [activeFAQ, setActiveFAQ] = useState20(null);
|
|
2601
2780
|
return /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col relative z-10 bg-transparent w-full mt-2 border-t border-neutral-200" }, items.map((item, index) => {
|
|
2602
2781
|
const isOpen = activeFAQ === index;
|
|
2603
2782
|
let label = `${parentKey ? formatKeyName(parentKey) : "Item"} ${index + 1}`;
|
|
2604
2783
|
if (item.fullName) label = toTitleCaseSafe(item.fullName);
|
|
2605
2784
|
else if (item.role) label = item.role;
|
|
2606
2785
|
else if (item.proposedName) label = toTitleCaseSafe(item.proposedName);
|
|
2607
|
-
return /* @__PURE__ */ React32.createElement("div", { key: index, className: `transition-all duration-300 ${index !== items.length - 1 ? "border-b border-neutral-200" : ""}` }, /* @__PURE__ */ React32.createElement("button", { className: "flex items-center justify-between w-full gap-4 text-left py-5 md:py-6 group outline-none bg-transparent", onClick: () => setActiveFAQ(isOpen ? null : index) }, /* @__PURE__ */ React32.createElement("span", { className: `text-[13px] md:text-[14px] transition-colors ${isOpen ? "text-black" : "text-neutral-700 group-hover:text-black"}` }, label), /* @__PURE__ */ React32.createElement("div", { className: `shrink-0 flex items-center justify-center w-8 h-8 rounded-full border transition-all duration-300 ${isOpen ? "rotate-180 border-black text-black" : "border-neutral-300 text-neutral-500"}` }, /* @__PURE__ */ React32.createElement(
|
|
2786
|
+
return /* @__PURE__ */ React32.createElement("div", { key: index, className: `transition-all duration-300 ${index !== items.length - 1 ? "border-b border-neutral-200" : ""}` }, /* @__PURE__ */ React32.createElement("button", { className: "flex items-center justify-between w-full gap-4 text-left py-5 md:py-6 group outline-none bg-transparent", onClick: () => setActiveFAQ(isOpen ? null : index) }, /* @__PURE__ */ React32.createElement("span", { className: `text-[13px] md:text-[14px] transition-colors ${isOpen ? "text-black" : "text-neutral-700 group-hover:text-black"}` }, label), /* @__PURE__ */ React32.createElement("div", { className: `shrink-0 flex items-center justify-center w-8 h-8 rounded-full border transition-all duration-300 ${isOpen ? "rotate-180 border-black text-black" : "border-neutral-300 text-neutral-500"}` }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: ArrowDown01Icon4, size: 16 }))), /* @__PURE__ */ React32.createElement("div", { className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] pb-6 md:pb-8 opacity-100" : "grid-rows-[0fr] opacity-0"}` }, /* @__PURE__ */ React32.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ React32.createElement("div", { className: "pt-2 flex flex-col gap-3 pr-4 md:pr-12" }, renderDynamicObject(item)))));
|
|
2608
2787
|
}));
|
|
2609
2788
|
};
|
|
2610
2789
|
const renderValue = (key, value) => {
|
|
2611
2790
|
if (value === null || value === void 0 || value === "") return null;
|
|
2612
2791
|
if (typeof value === "string") {
|
|
2613
|
-
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */ React32.createElement("a", { href: value, download: true, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-2 px-5 py-2 bg-white border border-neutral-200 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors w-fit outline-none mt-2" }, /* @__PURE__ */ React32.createElement(
|
|
2792
|
+
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */ React32.createElement("a", { href: value, download: true, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-2 px-5 py-2 bg-white border border-neutral-200 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors w-fit outline-none mt-2" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Download01Icon, size: 14 }), " Download File");
|
|
2614
2793
|
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */ React32.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(value));
|
|
2615
2794
|
return /* @__PURE__ */ React32.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, value);
|
|
2616
2795
|
}
|
|
@@ -2639,14 +2818,14 @@ var UniversalAgentConsole = ({
|
|
|
2639
2818
|
if (entries.length === 0) return null;
|
|
2640
2819
|
return entries.map(([k, v]) => /* @__PURE__ */ React32.createElement("div", { key: k, className: "flex flex-col items-start min-w-0 wrap-break-word w-full mb-3 last:mb-0" }, /* @__PURE__ */ React32.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 uppercase" }, formatKeyName(k)), renderValue(k, v)));
|
|
2641
2820
|
};
|
|
2642
|
-
return /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ React32.createElement(ManagedToaster, null), currentView === "list" && /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col items-start gap-1" }, /* @__PURE__ */ React32.createElement("h1", { className: " font-serif text-xl text-black tracking-tight" }, headerTitle), /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-neutral-500" }, headerDescription)), stats.length > 0 && /* @__PURE__ */ React32.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white" }, /* @__PURE__ */ React32.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, stats.map((stat, idx) => /* @__PURE__ */ React32.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ React32.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-200 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ React32.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React32.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ React32.createElement("p", { className: "text-xl text-black tracking-tight truncate" }, stat.value)))))), tabs.length > 0 && /* @__PURE__ */ React32.createElement("div", { className: "flex items-center gap-6" }, tabs.map((tab) => /* @__PURE__ */ React32.createElement("button", { key: tab.id, onClick: () => onTabChange(tab.id), className: `pb-3 text-sm transition-colors outline-none ${activeTab === tab.id ? "text-black border-b border-black" : "text-neutral-400 hover:text-black"}` }, tab.label))), /* @__PURE__ */ React32.createElement("div", { className: "w-full bg-white rounded-2xl max-w-3xl overflow-hidden flex flex-col min-h-100" }, isLoadingList ? /* @__PURE__ */ React32.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React32.createElement(
|
|
2821
|
+
return /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ React32.createElement(ManagedToaster, null), currentView === "list" && /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col items-start gap-1" }, /* @__PURE__ */ React32.createElement("h1", { className: " font-serif text-xl text-black tracking-tight" }, headerTitle), /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-neutral-500" }, headerDescription)), stats.length > 0 && /* @__PURE__ */ React32.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white" }, /* @__PURE__ */ React32.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, stats.map((stat, idx) => /* @__PURE__ */ React32.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ React32.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-200 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ React32.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React32.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ React32.createElement("p", { className: "text-xl text-black tracking-tight truncate" }, stat.value)))))), tabs.length > 0 && /* @__PURE__ */ React32.createElement("div", { className: "flex items-center gap-6" }, tabs.map((tab) => /* @__PURE__ */ React32.createElement("button", { key: tab.id, onClick: () => onTabChange(tab.id), className: `pb-3 text-sm transition-colors outline-none ${activeTab === tab.id ? "text-black border-b border-black" : "text-neutral-400 hover:text-black"}` }, tab.label))), /* @__PURE__ */ React32.createElement("div", { className: "w-full bg-white rounded-2xl max-w-3xl overflow-hidden flex flex-col min-h-100" }, isLoadingList ? /* @__PURE__ */ React32.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Loading03Icon9, size: 32, className: "animate-spin text-black" })) : listData.length === 0 ? /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", { className: "flex-1 flex justify-center items-center text-neutral-500 text-sm py-20" }, "No matching applications found.")) : /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement("div", { className: "divide-y divide-neutral-100 flex-1" }, listData.map((item) => /* @__PURE__ */ React32.createElement("div", { key: item.id, onClick: () => onRowClick(item.id), className: "flex items-center justify-between p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0" }, /* @__PURE__ */ React32.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.title), /* @__PURE__ */ React32.createElement("p", { className: "text-xs text-neutral-500 truncate mt-1" }, item.subtitle)), /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ React32.createElement("span", { className: `text-[10px] tracking-widest px-3 py-1 rounded-full uppercase ${item.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, item.status.replace(/_/g, " ")), /* @__PURE__ */ React32.createElement("span", { className: "text-[10px] text-neutral-400 mt-1" }, item.date))))), totalPages > 1 && /* @__PURE__ */ React32.createElement("div", { className: "flex items-center justify-between p-5 bg-neutral-50/50" }, /* @__PURE__ */ React32.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React32.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: ArrowLeft01Icon5, size: 14 })), /* @__PURE__ */ React32.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: ArrowRight01Icon5, size: 14 }))))))), currentView === "details" && selectedApp && /* @__PURE__ */ React32.createElement("div", { className: "w-full bg-white rounded-2xl p-6 sm:p-10 animate-in fade-in duration-300 max-w-3xl flex flex-col" }, /* @__PURE__ */ React32.createElement("div", { className: "flex items-center justify-between gap-4 pb-6" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => {
|
|
2643
2822
|
onBackToList();
|
|
2644
2823
|
setPendingFiles([]);
|
|
2645
|
-
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */ React32.createElement(
|
|
2824
|
+
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: ArrowLeft01Icon5, size: 14 }), " Back to List"), /* @__PURE__ */ React32.createElement("span", { className: `text-[10px] tracking-widest px-4 py-1.5 rounded-full uppercase ${selectedApp.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, selectedApp.status.replace(/_/g, " "))), /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-2 mb-8" }, /* @__PURE__ */ React32.createElement("h2", { className: " font-serif text-xl text-black tracking-tight" }, selectedApp.name || selectedApp.title), /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-neutral-500" }, selectedApp.type ? selectedApp.type.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (c) => c.toUpperCase()) : selectedApp.subtitle)), selectedApp.agentId === currentAgentId && selectedApp.metadata && Object.keys(selectedApp.metadata).length > 0 ? /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-5" }, renderDynamicObject(selectedApp.metadata)) : selectedApp.agentId === currentAgentId ? /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-5" }, /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-neutral-500" }, "No application data extracted.")) : null, selectedApp.agentId && /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-4 pt-8 mt-4 border-t border-neutral-200" }, /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col gap-1 mb-4" }, /* @__PURE__ */ React32.createElement("h3", { className: " font-serif text-sm text-black" }, "Official Archives"), /* @__PURE__ */ React32.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload final certificates or documents. Once marked completed, the archive unlocks for the user.")), selectedApp.archives?.map((arch) => /* @__PURE__ */ React32.createElement("div", { key: arch.id, className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React32.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: File02Icon, size: 18, className: "shrink-0" }), /* @__PURE__ */ React32.createElement("span", { className: "truncate pr-2" }, arch.name)), /* @__PURE__ */ React32.createElement("button", { onClick: () => setArchiveToDelete(arch), className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Delete02Icon, size: 16 })))), pendingFiles.map((file, idx) => /* @__PURE__ */ React32.createElement("div", { key: idx, className: "flex items-center justify-between text-neutral-600 text-sm w-full" }, /* @__PURE__ */ React32.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: AttachmentIcon, size: 18, className: "shrink-0" }), /* @__PURE__ */ React32.createElement("span", { className: "truncate pr-2" }, file.name)), /* @__PURE__ */ React32.createElement("button", { onClick: () => setPendingFiles((p) => p.filter((_, i) => i !== idx)), className: "text-neutral-400 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Cancel01Icon, size: 16 })))), /* @__PURE__ */ React32.createElement("input", { type: "file", multiple: true, ref: archiveRef, onChange: handleFileSelect, className: "hidden", accept: "application/pdf,image/*" }), /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => archiveRef.current?.click(), disabled: selectedApp.status !== "COMPLETED" || isUploading, className: "flex items-center justify-center gap-3 p-4 border border-neutral-200 rounded-full hover:bg-neutral-50 transition-colors text-black text-sm w-full outline-none disabled:opacity-50" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Upload01Icon, size: 18, className: "text-neutral-400" }), " Select Files to Upload"), pendingFiles.length > 0 && /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full sm:w-auto shrink-0" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => setPendingFiles([]), disabled: isUploading, className: "px-6 py-2 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-200 outline-none w-full sm:w-auto uppercase" }, "Clear All"), /* @__PURE__ */ React32.createElement(ThreeDActionButton, { onClick: executeUpload, disabled: isUploading, isLoading: isUploading, className: "w-full sm:w-auto" }, "Upload ", pendingFiles.length, " File(s)")))), /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 mt-8 pt-6" }, !selectedApp.agentId ? /* @__PURE__ */ React32.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2646
2825
|
setIsActioning(true);
|
|
2647
2826
|
await onAcceptApplication(selectedApp.id);
|
|
2648
2827
|
setIsActioning(false);
|
|
2649
|
-
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */ React32.createElement("div", { className: "w-full p-4 border border-red-100 bg-red-50/30 rounded-xl flex items-start gap-3" }, /* @__PURE__ */ React32.createElement(
|
|
2828
|
+
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */ React32.createElement("div", { className: "w-full p-4 border border-red-100 bg-red-50/30 rounded-xl flex items-start gap-3" }, /* @__PURE__ */ React32.createElement(HugeiconsIcon19, { icon: Cancel01Icon, size: 16, className: "text-red-500 shrink-0 mt-0.5" }), /* @__PURE__ */ React32.createElement("div", null, /* @__PURE__ */ React32.createElement("p", { className: "text-sm text-red-700" }, "Application Taken"), /* @__PURE__ */ React32.createElement("p", { className: "text-xs text-red-600 mt-1" }, "Currently handled by ", selectedApp.agentName || "another agent", "."))) : /* @__PURE__ */ React32.createElement("div", { className: "w-full flex flex-col sm:flex-row items-center gap-4 justify-between" }, /* @__PURE__ */ React32.createElement("p", { className: "text-xs text-neutral-500" }, "You are the assigned agent."), /* @__PURE__ */ React32.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-end gap-3 w-full sm:w-auto" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => setActionModal("query"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-200 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Query"), /* @__PURE__ */ React32.createElement("button", { onClick: () => setActionModal("reject"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-200 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Reject"), /* @__PURE__ */ React32.createElement(ThreeDActionButton, { onClick: () => setActionModal("success"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto" }, "Mark Success"))))), actionModal && /* @__PURE__ */ React32.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React32.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setActionModal(null) }), /* @__PURE__ */ React32.createElement("div", { className: "relative w-full max-w-md bg-white rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 text-left" }, /* @__PURE__ */ React32.createElement("div", { className: "p-6" }, /* @__PURE__ */ React32.createElement("h3", { className: " font-serif text-lg text-black tracking-tight capitalize mb-2" }, actionModal === "success" ? "Complete Application" : `${actionModal} Application`), /* @__PURE__ */ React32.createElement("p", { className: "text-xs text-neutral-500" }, actionModal === "success" ? "Are you sure you want to mark this application as successfully completed?" : `Please provide a clear reason for the user. They will see this message and be asked to fix their application.`)), (actionModal === "query" || actionModal === "reject") && /* @__PURE__ */ React32.createElement("div", { className: "p-6 pb-2" }, /* @__PURE__ */ React32.createElement(TextInput, { label: "Reason for Action", value: actionMessage, onChange: setActionMessage, placeholder: "Enter your reason here...", disabled: isActioning })), /* @__PURE__ */ React32.createElement("div", { className: "flex items-center p-6 pt-4 gap-3" }, /* @__PURE__ */ React32.createElement("button", { onClick: () => setActionModal(null), disabled: isActioning, className: "flex-1 py-3 text-[11px] tracking-widest uppercase text-neutral-600 rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ React32.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2650
2829
|
setIsActioning(true);
|
|
2651
2830
|
await onUpdateStatus(selectedApp.id, actionModal === "success" ? "COMPLETED" : actionModal === "reject" ? "REJECTED" : "QUEUED", actionMessage);
|
|
2652
2831
|
setIsActioning(false);
|
|
@@ -2664,8 +2843,8 @@ var UniversalAgentConsole = ({
|
|
|
2664
2843
|
import React34 from "react";
|
|
2665
2844
|
|
|
2666
2845
|
// src/components/Banner.tsx
|
|
2667
|
-
import React33, { useState as
|
|
2668
|
-
import { HugeiconsIcon as
|
|
2846
|
+
import React33, { useState as useState21 } from "react";
|
|
2847
|
+
import { HugeiconsIcon as HugeiconsIcon20 } from "@hugeicons/react";
|
|
2669
2848
|
import {
|
|
2670
2849
|
Alert02Icon,
|
|
2671
2850
|
CheckmarkBadge01Icon,
|
|
@@ -2681,7 +2860,7 @@ var Banner = ({
|
|
|
2681
2860
|
onDismiss,
|
|
2682
2861
|
action
|
|
2683
2862
|
}) => {
|
|
2684
|
-
const [isVisible, setIsVisible] =
|
|
2863
|
+
const [isVisible, setIsVisible] = useState21(true);
|
|
2685
2864
|
if (!isVisible) return null;
|
|
2686
2865
|
const handleDismiss = () => {
|
|
2687
2866
|
setIsVisible(false);
|
|
@@ -2715,14 +2894,14 @@ var Banner = ({
|
|
|
2715
2894
|
};
|
|
2716
2895
|
const currentConfig = config[type];
|
|
2717
2896
|
const IconToUse = icon || currentConfig.defaultIcon;
|
|
2718
|
-
return /* @__PURE__ */ React33.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__ */ React33.createElement("div", { className: `shrink-0 mt-0.5 ${currentConfig.iconColor}` }, /* @__PURE__ */ React33.createElement(
|
|
2897
|
+
return /* @__PURE__ */ React33.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__ */ React33.createElement("div", { className: `shrink-0 mt-0.5 ${currentConfig.iconColor}` }, /* @__PURE__ */ React33.createElement(HugeiconsIcon20, { icon: IconToUse, size: 20 })), /* @__PURE__ */ React33.createElement("div", { className: "flex-1 flex flex-col min-w-0 pr-6" }, /* @__PURE__ */ React33.createElement("h4", { className: `text-sm font-medium tracking-tight mb-1 ${currentConfig.titleColor}` }, title), /* @__PURE__ */ React33.createElement("p", { className: `text-xs leading-relaxed ${currentConfig.msgColor}` }, message), action && /* @__PURE__ */ React33.createElement("div", { className: "mt-3" }, action)), isDismissible && /* @__PURE__ */ React33.createElement(
|
|
2719
2898
|
"button",
|
|
2720
2899
|
{
|
|
2721
2900
|
onClick: handleDismiss,
|
|
2722
2901
|
className: `absolute top-3 right-3 p-1.5 rounded-full transition-colors outline-none shrink-0 ${currentConfig.closeHover}`,
|
|
2723
2902
|
"aria-label": "Dismiss banner"
|
|
2724
2903
|
},
|
|
2725
|
-
/* @__PURE__ */ React33.createElement(
|
|
2904
|
+
/* @__PURE__ */ React33.createElement(HugeiconsIcon20, { icon: Cancel01Icon2, size: 16 })
|
|
2726
2905
|
));
|
|
2727
2906
|
};
|
|
2728
2907
|
|
|
@@ -2777,7 +2956,7 @@ var UniversalOverviewPage = ({
|
|
|
2777
2956
|
|
|
2778
2957
|
// src/components/UniversalErrorView.tsx
|
|
2779
2958
|
import React35 from "react";
|
|
2780
|
-
import { HugeiconsIcon as
|
|
2959
|
+
import { HugeiconsIcon as HugeiconsIcon21 } from "@hugeicons/react";
|
|
2781
2960
|
import { ConfusedIcon } from "@hugeicons/core-free-icons";
|
|
2782
2961
|
var UniversalErrorView = ({
|
|
2783
2962
|
isBooting,
|
|
@@ -2809,7 +2988,7 @@ var UniversalErrorView = ({
|
|
|
2809
2988
|
title = "Access Restricted";
|
|
2810
2989
|
description = apiMessage || `You have insufficient permissions to view this ${envName}. Please contact your administrator.`;
|
|
2811
2990
|
}
|
|
2812
|
-
return /* @__PURE__ */ React35.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 animate-in fade-in duration-500" }, /* @__PURE__ */ React35.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ React35.createElement(
|
|
2991
|
+
return /* @__PURE__ */ React35.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 animate-in fade-in duration-500" }, /* @__PURE__ */ React35.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ React35.createElement(HugeiconsIcon21, { icon: IconComponent, size: 48, className: "text-neutral-300" })), /* @__PURE__ */ React35.createElement("h2", { className: " font-serif text-lg text-black tracking-tight " }, title), /* @__PURE__ */ React35.createElement("p", { className: "text-xs mt-2 mb-8 text-neutral-500 max-w-sm text-center leading-relaxed" }, description), /* @__PURE__ */ React35.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full justify-center sm:w-auto" }, isNotFoundError || isPermissionError ? /* @__PURE__ */ React35.createElement(
|
|
2813
2992
|
"button",
|
|
2814
2993
|
{
|
|
2815
2994
|
onClick: () => window.location.href = returnUrl,
|
|
@@ -2840,8 +3019,8 @@ var UniversalErrorView = ({
|
|
|
2840
3019
|
};
|
|
2841
3020
|
|
|
2842
3021
|
// src/components/UniversalLookupPage.tsx
|
|
2843
|
-
import React36, { useState as
|
|
2844
|
-
import { HugeiconsIcon as
|
|
3022
|
+
import React36, { useState as useState22 } from "react";
|
|
3023
|
+
import { HugeiconsIcon as HugeiconsIcon22 } from "@hugeicons/react";
|
|
2845
3024
|
import { Search01Icon } from "@hugeicons/core-free-icons";
|
|
2846
3025
|
var UniversalLookupPage = ({
|
|
2847
3026
|
headerTitle,
|
|
@@ -2856,7 +3035,7 @@ var UniversalLookupPage = ({
|
|
|
2856
3035
|
resultContent,
|
|
2857
3036
|
modals
|
|
2858
3037
|
}) => {
|
|
2859
|
-
const [isTypeModalOpen, setIsTypeModalOpen] =
|
|
3038
|
+
const [isTypeModalOpen, setIsTypeModalOpen] = useState22(false);
|
|
2860
3039
|
const currentOptionLabel = searchOptions.find((opt) => opt.value === selectedSearchType)?.label || "Select Type";
|
|
2861
3040
|
return /* @__PURE__ */ React36.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 pb-20" }, /* @__PURE__ */ React36.createElement(ManagedToaster, null), /* @__PURE__ */ React36.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React36.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React36.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ React36.createElement("p", { className: "text-xs text-neutral-500 truncate" }, headerDescription))), /* @__PURE__ */ React36.createElement("div", { className: "w-full max-w-2xl pb-8" }, /* @__PURE__ */ React36.createElement("form", { className: "flex flex-col gap-6", onSubmit: onSearch, autoComplete: "off" }, /* @__PURE__ */ React36.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ React36.createElement(
|
|
2862
3041
|
"button",
|
|
@@ -2882,7 +3061,7 @@ var UniversalLookupPage = ({
|
|
|
2882
3061
|
isLoading: isSearching,
|
|
2883
3062
|
className: "min-w-32"
|
|
2884
3063
|
},
|
|
2885
|
-
/* @__PURE__ */ React36.createElement(
|
|
3064
|
+
/* @__PURE__ */ React36.createElement(HugeiconsIcon22, { icon: Search01Icon, size: 14, className: "mr-2" }),
|
|
2886
3065
|
" Lookup"
|
|
2887
3066
|
)))), resultContent && /* @__PURE__ */ React36.createElement("div", { className: "w-full max-w-2xl bg-white text-left animate-in fade-in slide-in-from-bottom-4" }, /* @__PURE__ */ React36.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 uppercase" }, "Entity Record Found"), resultContent), isTypeModalOpen && /* @__PURE__ */ React36.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React36.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTypeModalOpen(false) }), /* @__PURE__ */ React36.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React36.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ React36.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Select Entity Type")), /* @__PURE__ */ React36.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, searchOptions.map((option) => /* @__PURE__ */ React36.createElement(
|
|
2888
3067
|
"button",
|
|
@@ -2902,9 +3081,9 @@ var UniversalLookupPage = ({
|
|
|
2902
3081
|
|
|
2903
3082
|
// src/components/UniversalDirectoryPage.tsx
|
|
2904
3083
|
import React37 from "react";
|
|
2905
|
-
import { HugeiconsIcon as
|
|
3084
|
+
import { HugeiconsIcon as HugeiconsIcon23 } from "@hugeicons/react";
|
|
2906
3085
|
import { ArrowLeft01Icon as ArrowLeft01Icon6, ArrowRight01Icon as ArrowRight01Icon6, Loading03Icon as Loading03Icon10 } from "@hugeicons/core-free-icons";
|
|
2907
|
-
var PageSpinner4 = () => /* @__PURE__ */ React37.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React37.createElement(
|
|
3086
|
+
var PageSpinner4 = () => /* @__PURE__ */ React37.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: Loading03Icon10, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2908
3087
|
var UniversalDirectoryPage = ({
|
|
2909
3088
|
headerTitle,
|
|
2910
3089
|
headerDescription,
|
|
@@ -2933,7 +3112,7 @@ var UniversalDirectoryPage = ({
|
|
|
2933
3112
|
value: searchQuery,
|
|
2934
3113
|
onChange: onSearchChange
|
|
2935
3114
|
}
|
|
2936
|
-
)), headerAction && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React37.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ React37.createElement(
|
|
3115
|
+
)), headerAction && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React37.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ React37.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ React37.createElement(PageSpinner4, null) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React37.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ React37.createElement(React37.Fragment, null, /* @__PURE__ */ React37.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.")) : items.map((item) => /* @__PURE__ */ React37.createElement(
|
|
2937
3116
|
"div",
|
|
2938
3117
|
{
|
|
2939
3118
|
key: item.id,
|
|
@@ -2942,16 +3121,16 @@ var UniversalDirectoryPage = ({
|
|
|
2942
3121
|
},
|
|
2943
3122
|
/* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, /* @__PURE__ */ React37.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-100 text-black text-xs" }, item.icon), /* @__PURE__ */ React37.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React37.createElement("div", { className: "text-sm text-black truncate pr-2" }, item.primaryText), /* @__PURE__ */ React37.createElement("div", { className: "text-xs text-neutral-500 truncate pr-2 mt-0.5" }, item.secondaryText))),
|
|
2944
3123
|
item.rightBadge && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 pl-2" }, /* @__PURE__ */ React37.createElement("span", { className: `text-[10px] tracking-[0.2em] px-3 py-1 rounded-full whitespace-nowrap uppercase ${item.rightBadgeClass || "text-neutral-500 border border-neutral-200 bg-white"}` }, item.rightBadge))
|
|
2945
|
-
))), totalPages > 1 && /* @__PURE__ */ React37.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ React37.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React37.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React37.createElement(
|
|
3124
|
+
))), totalPages > 1 && /* @__PURE__ */ React37.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ React37.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React37.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 14 })), /* @__PURE__ */ React37.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowRight01Icon6, size: 14 })))))), currentView === "details" && detailsContent, modals);
|
|
2946
3125
|
};
|
|
2947
3126
|
|
|
2948
3127
|
// src/components/AiApproveDecline.tsx
|
|
2949
|
-
import React38, { useState as
|
|
2950
|
-
import { HugeiconsIcon as
|
|
3128
|
+
import React38, { useState as useState23 } from "react";
|
|
3129
|
+
import { HugeiconsIcon as HugeiconsIcon24 } from "@hugeicons/react";
|
|
2951
3130
|
import { CheckmarkCircle01Icon as CheckmarkCircle01Icon2, CancelCircleIcon as CancelCircleIcon2, PencilEdit01Icon } from "@hugeicons/core-free-icons";
|
|
2952
3131
|
var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline, onEdit }) => {
|
|
2953
|
-
const [isEditing, setIsEditing] =
|
|
2954
|
-
const [editVal, setEditVal] =
|
|
3132
|
+
const [isEditing, setIsEditing] = useState23(false);
|
|
3133
|
+
const [editVal, setEditVal] = useState23(typeof suggestionValue === "string" ? suggestionValue : "");
|
|
2955
3134
|
return /* @__PURE__ */ React38.createElement("div", { className: "border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React38.createElement("div", null, /* @__PURE__ */ React38.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1 uppercase" }, "AI Suggestion: ", suggestionTitle), !isEditing ? /* @__PURE__ */ React38.createElement("div", { className: "text-sm text-black" }, suggestionValue) : /* @__PURE__ */ React38.createElement(
|
|
2956
3135
|
"input",
|
|
2957
3136
|
{
|
|
@@ -2961,23 +3140,23 @@ var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline
|
|
|
2961
3140
|
className: "w-full text-sm p-2 border-b border-purple-200 bg-transparent outline-none focus:border-purple-400 transition-colors",
|
|
2962
3141
|
autoFocus: true
|
|
2963
3142
|
}
|
|
2964
|
-
)), /* @__PURE__ */ React38.createElement("div", { className: "flex items-center gap-1 mt-2" }, !isEditing ? /* @__PURE__ */ React38.createElement(React38.Fragment, null, /* @__PURE__ */ React38.createElement("button", { onClick: onApprove, title: "Approve", className: "p-1.5 text-black hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(
|
|
3143
|
+
)), /* @__PURE__ */ React38.createElement("div", { className: "flex items-center gap-1 mt-2" }, !isEditing ? /* @__PURE__ */ React38.createElement(React38.Fragment, null, /* @__PURE__ */ React38.createElement("button", { onClick: onApprove, title: "Approve", className: "p-1.5 text-black hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon24, { icon: CheckmarkCircle01Icon2, size: 28 })), /* @__PURE__ */ React38.createElement("button", { onClick: onDecline, title: "Decline", className: "p-1.5 text-neutral-400 hover:text-neutral-400 hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon24, { icon: CancelCircleIcon2, size: 28 })), onEdit && /* @__PURE__ */ React38.createElement("button", { onClick: () => setIsEditing(true), title: "Edit", className: "ml-auto p-1.5 text-neutral-400 hover:text-black hover:bg-neutral-100 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon24, { icon: PencilEdit01Icon, size: 18 }))) : /* @__PURE__ */ React38.createElement(React38.Fragment, null, /* @__PURE__ */ React38.createElement("button", { onClick: () => {
|
|
2965
3144
|
onEdit?.(editVal);
|
|
2966
3145
|
setIsEditing(false);
|
|
2967
|
-
}, title: "Save Edit", className: "p-1.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(
|
|
3146
|
+
}, title: "Save Edit", className: "p-1.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon24, { icon: CheckmarkCircle01Icon2, size: 28 })), /* @__PURE__ */ React38.createElement("button", { onClick: () => setIsEditing(false), title: "Cancel Edit", className: "p-1.5 text-neutral-400 hover:text-black hover:bg-neutral-100 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon24, { icon: CancelCircleIcon2, size: 28 })))));
|
|
2968
3147
|
};
|
|
2969
3148
|
|
|
2970
3149
|
// src/components/AiStageCheck.tsx
|
|
2971
3150
|
import React39 from "react";
|
|
2972
|
-
import { HugeiconsIcon as
|
|
3151
|
+
import { HugeiconsIcon as HugeiconsIcon25 } from "@hugeicons/react";
|
|
2973
3152
|
import { Loading03Icon as Loading03Icon11, CheckmarkCircle02Icon, CancelCircleIcon as CancelCircleIcon3 } from "@hugeicons/core-free-icons";
|
|
2974
3153
|
var AiStageCheck = ({ tasks }) => {
|
|
2975
|
-
return /* @__PURE__ */ React39.createElement("div", { className: "flex flex-col gap-3 p-5 rounded-2xl border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white relative overflow-hidden" }, /* @__PURE__ */ React39.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 mb-1 uppercase" }, "AI Processing"), tasks.map((task) => /* @__PURE__ */ React39.createElement("div", { key: task.id, className: "flex items-center gap-3" }, task.status === "pending" && /* @__PURE__ */ React39.createElement("div", { className: "w-4 h-4 rounded-full border border-purple-200" }), task.status === "loading" && /* @__PURE__ */ React39.createElement(
|
|
3154
|
+
return /* @__PURE__ */ React39.createElement("div", { className: "flex flex-col gap-3 p-5 rounded-2xl border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white relative overflow-hidden" }, /* @__PURE__ */ React39.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 mb-1 uppercase" }, "AI Processing"), tasks.map((task) => /* @__PURE__ */ React39.createElement("div", { key: task.id, className: "flex items-center gap-3" }, task.status === "pending" && /* @__PURE__ */ React39.createElement("div", { className: "w-4 h-4 rounded-full border border-purple-200" }), task.status === "loading" && /* @__PURE__ */ React39.createElement(HugeiconsIcon25, { icon: Loading03Icon11, size: 16, className: "animate-spin text-purple-500" }), task.status === "success" && /* @__PURE__ */ React39.createElement(HugeiconsIcon25, { icon: CheckmarkCircle02Icon, size: 16, className: "text-emerald-500" }), task.status === "error" && /* @__PURE__ */ React39.createElement(HugeiconsIcon25, { icon: CancelCircleIcon3, size: 16, className: "text-red-500" }), /* @__PURE__ */ React39.createElement("span", { className: `text-xs transition-colors ${task.status === "success" ? "text-black" : task.status === "loading" ? "text-purple-700" : "text-neutral-500"}` }, task.label))));
|
|
2976
3155
|
};
|
|
2977
3156
|
|
|
2978
3157
|
// src/components/Stagger.tsx
|
|
2979
3158
|
import React40 from "react";
|
|
2980
|
-
import { HugeiconsIcon as
|
|
3159
|
+
import { HugeiconsIcon as HugeiconsIcon26 } from "@hugeicons/react";
|
|
2981
3160
|
import { Briefcase02Icon, Upload01Icon as Upload01Icon2, FileSyncIcon, CloudUploadIcon } from "@hugeicons/core-free-icons";
|
|
2982
3161
|
var Stagger = ({ steps, currentStep }) => {
|
|
2983
3162
|
const getIconForStep = (stepName) => {
|
|
@@ -2991,14 +3170,14 @@ var Stagger = ({ steps, currentStep }) => {
|
|
|
2991
3170
|
const isActive = idx === currentStep;
|
|
2992
3171
|
const isPassed = idx < currentStep;
|
|
2993
3172
|
const colorClass = isPassed ? "bg-emerald-500 text-white" : isActive ? "bg-neutral-200 text-neutral-500" : "bg-neutral-200 text-neutral-500";
|
|
2994
|
-
return /* @__PURE__ */ React40.createElement("div", { key: step, className: `w-6 h-6 rounded-full flex items-center justify-center transition-colors duration-300 ${colorClass}` }, /* @__PURE__ */ React40.createElement(
|
|
3173
|
+
return /* @__PURE__ */ React40.createElement("div", { key: step, className: `w-6 h-6 rounded-full flex items-center justify-center transition-colors duration-300 ${colorClass}` }, /* @__PURE__ */ React40.createElement(HugeiconsIcon26, { icon: getIconForStep(step), size: 11 }));
|
|
2995
3174
|
}));
|
|
2996
3175
|
};
|
|
2997
3176
|
|
|
2998
3177
|
// src/components/UniversalRegistrationFlow.tsx
|
|
2999
|
-
import React41, { useState as
|
|
3178
|
+
import React41, { useState as useState24, useEffect as useEffect16, useRef as useRef11 } from "react";
|
|
3000
3179
|
import toast6 from "react-hot-toast";
|
|
3001
|
-
import { HugeiconsIcon as
|
|
3180
|
+
import { HugeiconsIcon as HugeiconsIcon27 } from "@hugeicons/react";
|
|
3002
3181
|
import { CheckmarkBadge01Icon as CheckmarkBadge01Icon2, Upload01Icon as Upload01Icon3, Loading03Icon as Loading03Icon12, PencilEdit01Icon as PencilEdit01Icon2, Delete02Icon as Delete02Icon2, SignatureIcon, IdentificationIcon, ArrowLeft01Icon as ArrowLeft01Icon7, HourglassIcon } from "@hugeicons/core-free-icons";
|
|
3003
3182
|
var MACRO_STEPS = ["Details", "Documents", "Review", "Submit"];
|
|
3004
3183
|
var NIGERIAN_STATES = ["Abia", "Adamawa", "Akwa Ibom", "Anambra", "Bauchi", "Bayelsa", "Benue", "Borno", "Cross River", "Delta", "Ebonyi", "Edo", "Ekiti", "Enugu", "FCT - Abuja", "Gombe", "Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos", "Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto", "Taraba", "Yobe", "Zamfara"];
|
|
@@ -3012,12 +3191,12 @@ var UniversalRegistrationFlow = ({
|
|
|
3012
3191
|
onRedirectToBilling,
|
|
3013
3192
|
onRedirectToApplication
|
|
3014
3193
|
}) => {
|
|
3015
|
-
const [isBooting, setIsBooting] =
|
|
3016
|
-
const [macroStep, setMacroStep] =
|
|
3017
|
-
const [appStatus, setAppStatus] =
|
|
3018
|
-
const [isAbortModalOpen, setIsAbortModalOpen] =
|
|
3019
|
-
const [isAborting, setIsAborting] =
|
|
3020
|
-
const [formState, setFormState] =
|
|
3194
|
+
const [isBooting, setIsBooting] = useState24(true);
|
|
3195
|
+
const [macroStep, setMacroStep] = useState24(0);
|
|
3196
|
+
const [appStatus, setAppStatus] = useState24("");
|
|
3197
|
+
const [isAbortModalOpen, setIsAbortModalOpen] = useState24(false);
|
|
3198
|
+
const [isAborting, setIsAborting] = useState24(false);
|
|
3199
|
+
const [formState, setFormState] = useState24({
|
|
3021
3200
|
natureApproved: false,
|
|
3022
3201
|
nameApproved: false,
|
|
3023
3202
|
addressApproved: false,
|
|
@@ -3028,13 +3207,13 @@ var UniversalRegistrationFlow = ({
|
|
|
3028
3207
|
passportApproved: false,
|
|
3029
3208
|
signatureApproved: false
|
|
3030
3209
|
});
|
|
3031
|
-
const idRef =
|
|
3032
|
-
const passportRef =
|
|
3033
|
-
const signatureRef =
|
|
3034
|
-
const other1Ref =
|
|
3035
|
-
const other2Ref =
|
|
3036
|
-
const other3Ref =
|
|
3037
|
-
const [formData, setFormData] =
|
|
3210
|
+
const idRef = useRef11(null);
|
|
3211
|
+
const passportRef = useRef11(null);
|
|
3212
|
+
const signatureRef = useRef11(null);
|
|
3213
|
+
const other1Ref = useRef11(null);
|
|
3214
|
+
const other2Ref = useRef11(null);
|
|
3215
|
+
const other3Ref = useRef11(null);
|
|
3216
|
+
const [formData, setFormData] = useState24({
|
|
3038
3217
|
businessDesc: "",
|
|
3039
3218
|
natureOfBusiness: null,
|
|
3040
3219
|
proposedName: "",
|
|
@@ -3061,22 +3240,22 @@ var UniversalRegistrationFlow = ({
|
|
|
3061
3240
|
otherDoc3Url: "",
|
|
3062
3241
|
otherDoc3Meta: null
|
|
3063
3242
|
});
|
|
3064
|
-
const [activeModal, setActiveModal] =
|
|
3065
|
-
const [iAgree, setIAgree] =
|
|
3066
|
-
const [isAnalyzingNature, setIsAnalyzingNature] =
|
|
3067
|
-
const [suggestedNature, setSuggestedNature] =
|
|
3068
|
-
const [isCheckingQualifier, setIsCheckingQualifier] =
|
|
3069
|
-
const [qualifierCheckResult, setQualifierCheckResult] =
|
|
3070
|
-
const [isCheckingName, setIsCheckingName] =
|
|
3071
|
-
const [nameCheckResult, setNameCheckResult] =
|
|
3072
|
-
const [globalExtractingId, setGlobalExtractingId] =
|
|
3073
|
-
const [globalUploadingPassport, setGlobalUploadingPassport] =
|
|
3074
|
-
const [globalUploadingSignature, setGlobalUploadingSignature] =
|
|
3075
|
-
const [isUploadingOther1, setIsUploadingOther1] =
|
|
3076
|
-
const [isUploadingOther2, setIsUploadingOther2] =
|
|
3077
|
-
const [isUploadingOther3, setIsUploadingOther3] =
|
|
3078
|
-
const [aiTasks, setAiTasks] =
|
|
3079
|
-
const [isSubmitting, setIsSubmitting] =
|
|
3243
|
+
const [activeModal, setActiveModal] = useState24({ isOpen: false, type: null, memberIndex: null });
|
|
3244
|
+
const [iAgree, setIAgree] = useState24(false);
|
|
3245
|
+
const [isAnalyzingNature, setIsAnalyzingNature] = useState24(false);
|
|
3246
|
+
const [suggestedNature, setSuggestedNature] = useState24(null);
|
|
3247
|
+
const [isCheckingQualifier, setIsCheckingQualifier] = useState24(false);
|
|
3248
|
+
const [qualifierCheckResult, setQualifierCheckResult] = useState24(null);
|
|
3249
|
+
const [isCheckingName, setIsCheckingName] = useState24(false);
|
|
3250
|
+
const [nameCheckResult, setNameCheckResult] = useState24(null);
|
|
3251
|
+
const [globalExtractingId, setGlobalExtractingId] = useState24(false);
|
|
3252
|
+
const [globalUploadingPassport, setGlobalUploadingPassport] = useState24(false);
|
|
3253
|
+
const [globalUploadingSignature, setGlobalUploadingSignature] = useState24(false);
|
|
3254
|
+
const [isUploadingOther1, setIsUploadingOther1] = useState24(false);
|
|
3255
|
+
const [isUploadingOther2, setIsUploadingOther2] = useState24(false);
|
|
3256
|
+
const [isUploadingOther3, setIsUploadingOther3] = useState24(false);
|
|
3257
|
+
const [aiTasks, setAiTasks] = useState24([]);
|
|
3258
|
+
const [isSubmitting, setIsSubmitting] = useState24(false);
|
|
3080
3259
|
const isReadOnly = ["PENDING", "AWAITING_PAYMENT", "COMPLETED"].includes(appStatus);
|
|
3081
3260
|
const isAnyUploading = globalExtractingId || globalUploadingPassport || globalUploadingSignature || isUploadingOther1 || isUploadingOther2 || isUploadingOther3;
|
|
3082
3261
|
const baseApi = async (action, payload = {}) => {
|
|
@@ -3091,7 +3270,7 @@ var UniversalRegistrationFlow = ({
|
|
|
3091
3270
|
return { success: false, error: "Network communication failed." };
|
|
3092
3271
|
}
|
|
3093
3272
|
};
|
|
3094
|
-
|
|
3273
|
+
useEffect16(() => {
|
|
3095
3274
|
baseApi("progress_load").then((data) => {
|
|
3096
3275
|
if (data.success && data.data) {
|
|
3097
3276
|
const meta = data.data;
|
|
@@ -3567,23 +3746,23 @@ var UniversalRegistrationFlow = ({
|
|
|
3567
3746
|
const isStep0Valid = type === "company" ? formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.membersDetailsApproved : formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.ownerApproved;
|
|
3568
3747
|
const isStep1Valid = type === "company" ? formState.membersDocsApproved : formState.idApproved && formState.passportApproved && formState.signatureApproved;
|
|
3569
3748
|
const titleText = type === "company" ? "Company Incorporation (LLC)" : "Business Name Registration";
|
|
3570
|
-
if (isBooting) return /* @__PURE__ */ React41.createElement("div", { className: "flex justify-center py-20" }, /* @__PURE__ */ React41.createElement(
|
|
3749
|
+
if (isBooting) return /* @__PURE__ */ React41.createElement("div", { className: "flex justify-center py-20" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 32, className: "animate-spin text-black" }));
|
|
3571
3750
|
if (!["DRAFT", "QUEUED", "REJECTED"].includes(appStatus) && appStatus !== "") {
|
|
3572
|
-
return /* @__PURE__ */ React41.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-2xl p-6 sm:p-10 flex flex-col items-center justify-center text-center gap-5 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20 py-24" }, appStatus === "COMPLETED" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ React41.createElement(
|
|
3751
|
+
return /* @__PURE__ */ React41.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-2xl p-6 sm:p-10 flex flex-col items-center justify-center text-center gap-5 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20 py-24" }, appStatus === "COMPLETED" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: CheckmarkBadge01Icon2, size: 35 })), /* @__PURE__ */ React41.createElement("h2", { className: "text-xl font-serif text-black" }, "Registration Completed"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application has been successfully verified and registered.")) : appStatus === "PENDING" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: HourglassIcon, size: 35, className: "animate-spin" })), /* @__PURE__ */ React41.createElement("h2", { className: "text-xl font-serif text-black" }, "Application is Pending"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is currently pending review.")) : appStatus === "AWAITING_PAYMENT" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "w-20 h-20 bg-amber-50 text-amber-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: HourglassIcon, size: 35, className: "animate-pulse" })), /* @__PURE__ */ React41.createElement("h2", { className: "text-xl font-serif text-black" }, "Awaiting Payment"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is complete and awaiting government fee settlement. Please go to the Billing tab to authorize payment."), /* @__PURE__ */ React41.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ React41.createElement("button", { onClick: onRedirectToBilling, className: "px-8 py-3 bg-black text-white text-[11px] tracking-widest rounded-full hover:bg-neutral-800 outline-none" }, "Go to Billing & Invoices"), /* @__PURE__ */ React41.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-200 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort & Edit Application"))) : /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: HourglassIcon, size: 35 })), /* @__PURE__ */ React41.createElement("h2", { className: "text-xl font-serif text-black" }, "Application Submitted"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is currently ", appStatus.replace(/_/g, " ").toLowerCase(), "."), ["AWAITING_PAYMENT", "READY_FOR_SUBMISSION", "AWAITING_CONFIRMATION"].includes(appStatus) && /* @__PURE__ */ React41.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ React41.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-200 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort Application"))), isAbortModalOpen && /* @__PURE__ */ React41.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React41.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isAborting && setIsAbortModalOpen(false) }), /* @__PURE__ */ React41.createElement("div", { className: "relative w-100 bg-white shadow-2xl rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 text-left" }, /* @__PURE__ */ React41.createElement("div", { className: "p-6 flex flex-col gap-4 text-center" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-[17px] font-serif text-black tracking-tight" }, "Abort Application?"), /* @__PURE__ */ React41.createElement("p", { className: "text-[12px] text-neutral-500 leading-relaxed" }, "Are you sure you want to abort? If you have already made a payment, returning to draft may cause issues. Your invoice will be deleted.")), /* @__PURE__ */ React41.createElement("div", { className: "w-full flex " }, /* @__PURE__ */ React41.createElement("button", { onClick: () => setIsAbortModalOpen(false), disabled: isAborting, className: "flex-1 py-4 text-[13px] text-neutral-500 hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ React41.createElement("button", { onClick: handleAbort, disabled: isAborting, className: "flex-1 py-4 text-[13px] text-red-500 hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, isAborting ? "Aborting..." : "Yes, Abort")))));
|
|
3573
3752
|
}
|
|
3574
3753
|
return /* @__PURE__ */ React41.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-2xl p-6 sm:p-10 flex flex-col gap-10 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20" }, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("h2", { className: "text-xl font-serif text-black tracking-tight mb-1" }, titleText), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500" }, "Answer the questions below to build your official application.")), /* @__PURE__ */ React41.createElement("div", { className: "px-2" }, /* @__PURE__ */ React41.createElement(Stagger, { steps: MACRO_STEPS, currentStep: macroStep }))), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-8" }, macroStep === 0 && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "What does your ", type === "company" ? "company" : "business", " do?")), !formState.natureApproved ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-3 " }, /* @__PURE__ */ React41.createElement(TextInput, { label: type === "company" ? "Company Description" : "Business Description", placeholder: "e.g. We provide professional services to clients.", value: formData.businessDesc, onChange: (v) => setFormData({ ...formData, businessDesc: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleAnalyzeNature, disabled: formData.businessDesc.length < 5 || isAnalyzingNature || isReadOnly, isLoading: isAnalyzingNature, className: "w-fit" }, "Analyze Nature")), isAnalyzingNature && /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: [{ id: "1", label: "Matching with Official Categories...", status: "loading" }] })), suggestedNature && /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in" }, /* @__PURE__ */ React41.createElement(AiApproveDecline, { suggestionTitle: "Classification Found", suggestionValue: /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: " text-black" }, suggestedNature.specificLabel), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 mt-1" }, "Category: ", suggestedNature.categoryLabel)), onApprove: () => {
|
|
3575
3754
|
const newForm = { ...formData, natureOfBusiness: suggestedNature };
|
|
3576
3755
|
setFormData(newForm);
|
|
3577
3756
|
approveSection("natureApproved", newForm);
|
|
3578
|
-
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", { className: "pr-4" }, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(
|
|
3757
|
+
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", { className: "pr-4" }, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), formState.natureApproved && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "What name would you like to register?")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide two options. We will verify availability against the official registry."), !formState.nameApproved ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Proposed Name 1 (Preferred)", value: formData.proposedName, onChange: (v) => setFormData({ ...formData, proposedName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Proposed Name 2 (Alternative)", value: formData.proposedName2, onChange: (v) => setFormData({ ...formData, proposedName2: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => handleCheckNames(formData.proposedName), disabled: !formData.proposedName || !formData.proposedName2 || isCheckingName || isCheckingQualifier || isReadOnly, isLoading: isCheckingQualifier || isCheckingName, className: "w-fit" }, "Check Availability")), (isCheckingQualifier || isCheckingName) && /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: [{ id: "1", label: "AI Qualifier Pre-check...", status: isCheckingQualifier ? "loading" : "success" }, { id: "2", label: "Checking Official Registry Database...", status: isCheckingName ? "loading" : "pending" }, { id: "3", label: "Fallback Checking Public Database...", status: isCheckingName ? "loading" : "pending" }, { id: "4", label: "Validation Status...", status: isCheckingName ? "loading" : "pending" }] })), qualifierCheckResult && /* @__PURE__ */ React41.createElement("div", { className: "mt-2 animate-in fade-in" }, /* @__PURE__ */ React41.createElement("div", { className: "border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1" }, "AI Suggestion: Structural Qualifier Missing"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black mb-3" }, "Nigerian registrations require a structural qualifier to be approved."), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-2" }, (qualifierCheckResult.suggestions || []).map((alt, i) => /* @__PURE__ */ React41.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-200 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ React41.createElement("button", { onClick: () => setQualifierCheckResult(null), className: "w-fit text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors mt-2 outline-none" }, "Edit Name Manually"))), nameCheckResult && /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in" }, nameCheckResult.status === "APPROVED" || nameCheckResult.status === "APPROVED_WARNING" || nameCheckResult.status === "SKIPPED" ? /* @__PURE__ */ React41.createElement(AiApproveDecline, { suggestionTitle: nameCheckResult.status === "APPROVED" ? "Name Available!" : "Fallback Approval", suggestionValue: /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: `mb-1 ${nameCheckResult.status === "APPROVED" ? "text-emerald-600 " : "text-orange-500 "}` }, nameCheckResult.status === "APPROVED" ? "Excellent chance of approval." : "Validation Bypassed / Fallback."), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-600" }, nameCheckResult.message), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-600 mt-2 " }, "Proposed Option: ", nameCheckResult.approvedOption)), onApprove: () => {
|
|
3579
3758
|
const newForm = { ...formData, approvedName: nameCheckResult.approvedOption };
|
|
3580
3759
|
setFormData(newForm);
|
|
3581
3760
|
approveSection("nameApproved", newForm);
|
|
3582
|
-
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */ React41.createElement("div", { className: "border border-red-100 bg-linear-to-bl from-red-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-red-600 block mb-1" }, "Registry Conflict Detected"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black mb-3" }, nameCheckResult.message), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-2" }, (nameCheckResult.alternatives || []).map((alt, i) => /* @__PURE__ */ React41.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-200 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ React41.createElement("button", { onClick: () => setNameCheckResult(null), className: "w-fit text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors mt-2 outline-none" }, "Try New Name")))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.approvedName), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Verified against registry")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("nameApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(
|
|
3583
|
-
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("addressApproved"), disabled: !formData.address || !formData.city || !formData.state || isReadOnly, className: "w-fit mt-2" }, "Confirm Address")) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500" }, formData.address, ", ", formData.city, ", ", formData.state), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("addressApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(
|
|
3761
|
+
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */ React41.createElement("div", { className: "border border-red-100 bg-linear-to-bl from-red-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-red-600 block mb-1" }, "Registry Conflict Detected"), /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black mb-3" }, nameCheckResult.message), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-2" }, (nameCheckResult.alternatives || []).map((alt, i) => /* @__PURE__ */ React41.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-200 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ React41.createElement("button", { onClick: () => setNameCheckResult(null), className: "w-fit text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors mt-2 outline-none" }, "Try New Name")))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.approvedName), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Verified against registry")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("nameApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), formState.nameApproved && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Where is your head office located?")), !formState.addressApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Street Address", value: formData.address, onChange: (v) => setFormData({ ...formData, address: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "City", value: formData.city, onChange: (v) => setFormData({ ...formData, city: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "State", value: formData.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: null, isGlobalState: true }), placeholder: "Select State", onChange: () => {
|
|
3762
|
+
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("addressApproved"), disabled: !formData.address || !formData.city || !formData.state || isReadOnly, className: "w-fit mt-2" }, "Confirm Address")) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-neutral-500" }, formData.address, ", ", formData.city, ", ", formData.state), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("addressApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), formState.addressApproved && type === "company" && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between gap-2 text-black" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Directors & Shareholders")), !formState.membersDetailsApproved && /* @__PURE__ */ React41.createElement("div", { className: `text-xs px-3 py-1 rounded-full ${getCompanyTotalShares() === 100 ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-500"}` }, "Total Shares: ", getCompanyTotalShares(), "%")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide details for all individuals. Ensure total share percentage equals 100%."), !formState.membersDetailsApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-6 " }, formData.members.map((member, i) => /* @__PURE__ */ React41.createElement("div", { key: member.id, className: "flex flex-col gap-4 border border-neutral-200 p-5 rounded-2xl bg-neutral-50/30" }, /* @__PURE__ */ React41.createElement("div", { className: "flex justify-between items-center mb-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-neutral-400" }, "Member ", i + 1), formData.members.length > 1 && !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => removeCompanyMember(i), className: "text-red-500 text-xs hover:text-red-600" }, "Remove")), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Role", value: member.role, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "role", memberIndex: i }), onChange: () => {
|
|
3584
3763
|
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */ React41.createElement(NumberInput, { label: "Share Percentage (%)", value: member.sharePercentage, onChange: (v) => updateCompanyMemberInfo(i, "sharePercentage", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name", value: member.fullName, onChange: (v) => updateCompanyMemberInfo(i, "fullName", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(NumberInput, { label: "Phone Number", value: member.phone, onChange: (v) => updateCompanyMemberInfo(i, "phone", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Email Address", value: member.email, onChange: (v) => updateCompanyMemberInfo(i, "email", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(TextInput, { label: "Nationality", value: member.nationality, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "nationality", memberIndex: i }), onChange: () => {
|
|
3585
3764
|
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Residential Address", value: member.address, onChange: (v) => updateCompanyMemberInfo(i, "address", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "City", value: member.city, onChange: (v) => updateCompanyMemberInfo(i, "city", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "State", value: member.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: i }), onChange: () => {
|
|
3586
|
-
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-200 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: PencilEdit01Icon2, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: PencilEdit01Icon2, size: 16 })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ React41.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: ArrowLeft01Icon7, size: 14 }), " Close"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload valid means of identification, passport photographs, and signatures for every director and shareholder.")), !formState.membersDocsApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ React41.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ React41.createElement("input", { id: `id-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "id"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("input", { id: `pass-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "passport"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("input", { id: `sig-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "signature"), disabled: isReadOnly || isAnyUploading }), !member.idExtractedData && !globalExtractingId ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-200 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload ID"))) : null, !member.passportFileUrl && !globalUploadingPassport ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Delete02Icon2, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Delete02Icon2, size: 16 }))) : null)), /* @__PURE__ */ React41.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-emerald-800" }, "Documents Uploaded"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: PencilEdit01Icon2, size: 16 })))) : /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: idRef, onChange: (e) => handleBusinessUpload(e, "id"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: passportRef, onChange: (e) => handleBusinessUpload(e, "passport"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: signatureRef, onChange: (e) => handleBusinessUpload(e, "signature"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Upload your NIN, Driver's License, Voter's Card, or Int'l Passport (JPG/PNG/WEBP)."), !formState.idApproved ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-200 rounded-full flex flex-col items-center justify-center gap-2 transition-colors outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "hover:bg-neutral-50 text-black"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ React41.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name on ID", value: formData.idExtractedData.fullName, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, fullName: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Date of Birth (YYYY-MM-DD)", value: formData.idExtractedData.dob, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, dob: v } })), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-200 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload")))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: PencilEdit01Icon2, size: 16 })))), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Delete02Icon2, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon28, { icon: Delete02Icon2, size: 16 })))))), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-200 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other1Ref, onChange: (e) => handleOptionalUpload(e, "other1"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other2Ref, onChange: (e) => handleOptionalUpload(e, "other2"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other3Ref, onChange: (e) => handleOptionalUpload(e, "other3"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "If your ", type === "company" ? "company" : "business", " involves regulated professional services, please upload relevant licenses, certificates, or permits here (up to 3 documents).")), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3765
|
+
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-200 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ React41.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: ArrowLeft01Icon7, size: 14 }), " Close"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload valid means of identification, passport photographs, and signatures for every director and shareholder.")), !formState.membersDocsApproved ? /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ React41.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ React41.createElement("input", { id: `id-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "id"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("input", { id: `pass-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "passport"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("input", { id: `sig-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "signature"), disabled: isReadOnly || isAnyUploading }), !member.idExtractedData && !globalExtractingId ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-200 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload ID"))) : null, !member.passportFileUrl && !globalUploadingPassport ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Delete02Icon2, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Delete02Icon2, size: 16 }))) : null)), /* @__PURE__ */ React41.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-emerald-800" }, "Documents Uploaded"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))) : /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: idRef, onChange: (e) => handleBusinessUpload(e, "id"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: passportRef, onChange: (e) => handleBusinessUpload(e, "passport"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: signatureRef, onChange: (e) => handleBusinessUpload(e, "signature"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Upload your NIN, Driver's License, Voter's Card, or Int'l Passport (JPG/PNG/WEBP)."), !formState.idApproved ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-200 rounded-full flex flex-col items-center justify-center gap-2 transition-colors outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "hover:bg-neutral-50 text-black"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ React41.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ React41.createElement("div", { className: " mt-2" }, /* @__PURE__ */ React41.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ React41.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "Full Name on ID", value: formData.idExtractedData.fullName, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, fullName: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React41.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ React41.createElement(TextInput, { label: "Date of Birth (YYYY-MM-DD)", value: formData.idExtractedData.dob, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, dob: v } })), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-200 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload")))) : /* @__PURE__ */ React41.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: PencilEdit01Icon2, size: 16 })))), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Delete02Icon2, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ React41.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteBusinessDocument("signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Delete02Icon2, size: 16 })))))), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-200 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other1Ref, onChange: (e) => handleOptionalUpload(e, "other1"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other2Ref, onChange: (e) => handleOptionalUpload(e, "other2"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other3Ref, onChange: (e) => handleOptionalUpload(e, "other3"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ React41.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "If your ", type === "company" ? "company" : "business", " involves regulated professional services, please upload relevant licenses, certificates, or permits here (up to 3 documents).")), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3587
3766
|
const docType = `other${num}`;
|
|
3588
3767
|
const ref = num === 1 ? other1Ref : num === 2 ? other2Ref : other3Ref;
|
|
3589
3768
|
const isUploading = num === 1 ? isUploadingOther1 : num === 2 ? isUploadingOther2 : isUploadingOther3;
|
|
@@ -3591,13 +3770,13 @@ var UniversalRegistrationFlow = ({
|
|
|
3591
3770
|
if (!fileUrl && !isUploading) {
|
|
3592
3771
|
const prevUrl = num > 1 ? formData[`otherDoc${num - 1}Url`] : true;
|
|
3593
3772
|
if (!prevUrl) return null;
|
|
3594
|
-
return /* @__PURE__ */ React41.createElement("button", { key: num, onClick: () => !isReadOnly && !isAnyUploading && ref.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(
|
|
3773
|
+
return /* @__PURE__ */ React41.createElement("button", { key: num, onClick: () => !isReadOnly && !isAnyUploading && ref.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-200 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Upload01Icon3, size: 18, className: "text-neutral-400" }), " Upload Optional Document ", num);
|
|
3595
3774
|
}
|
|
3596
3775
|
if (isUploading) {
|
|
3597
|
-
return /* @__PURE__ */ React41.createElement("div", { key: num, className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(
|
|
3776
|
+
return /* @__PURE__ */ React41.createElement("div", { key: num, className: "flex items-center gap-3 p-4 border border-neutral-200 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Loading03Icon12, size: 18, className: "animate-spin text-black" }), " Uploading Document ", num, "...");
|
|
3598
3777
|
}
|
|
3599
|
-
return /* @__PURE__ */ React41.createElement("div", { key: num, className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(
|
|
3600
|
-
}))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ React41.createElement("button", { onClick: handleBack, disabled: isAnyUploading, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(
|
|
3778
|
+
return /* @__PURE__ */ React41.createElement("div", { key: num, className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ React41.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: CheckmarkBadge01Icon2, size: 18 }), " Optional Document ", num, " Uploaded"), !isReadOnly && /* @__PURE__ */ React41.createElement("button", { onClick: () => deleteOptionalDocument(docType), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: Delete02Icon2, size: 16 })));
|
|
3779
|
+
}))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ React41.createElement("button", { onClick: handleBack, disabled: isAnyUploading, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: ArrowLeft01Icon7, size: 14 }), " Back"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep1Valid || isAnyUploading, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 2 && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-6 animate-in fade-in" }, /* @__PURE__ */ React41.createElement("div", null, /* @__PURE__ */ React41.createElement("h3", { className: "text-sm mb-5 text-black" }, "Application Summary"), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-4 text-sm" }, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-200 pb-3 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 truncate text-[13px] " }, type === "company" ? "Company Name" : "Business Name"), /* @__PURE__ */ React41.createElement("span", { className: " text-black text-[13px]" }, formData.approvedName)), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-200 pb-3 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Classification"), /* @__PURE__ */ React41.createElement("span", { className: " text-black truncate sm:text-right text-[13px] " }, formData.natureOfBusiness?.specificLabel || "Pending")), type === "company" ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-200 pb-3 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Total Members"), /* @__PURE__ */ React41.createElement("span", { className: " text-black truncate text-[13px] " }, formData.members.length, " Directors/Shareholders")), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-200 pb-3 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Share Capital"), /* @__PURE__ */ React41.createElement("span", { className: " text-black truncate text-[13px] " }, "100% Allocated"))) : /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-200 pb-3 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Proprietor"), /* @__PURE__ */ React41.createElement("span", { className: " text-black truncate text-[13px] " }, formData.ownerName)), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Documents Attached"), /* @__PURE__ */ React41.createElement("span", { className: " text-neutral-400 text-[13px] " }, "ID, Passport, Signature")), formData.otherDoc1Url && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ React41.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Optional Documents"), /* @__PURE__ */ React41.createElement("span", { className: " text-neutral-400 text-[13px] " }, [formData.otherDoc1Url, formData.otherDoc2Url, formData.otherDoc3Url].filter(Boolean).length, " Attached")))), /* @__PURE__ */ React41.createElement("div", { className: "flex items-center justify-between mt-4 pt-4 " }, /* @__PURE__ */ React41.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 rounded-full text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 transition-colors outline-none" }, /* @__PURE__ */ React41.createElement(HugeiconsIcon27, { icon: ArrowLeft01Icon7, size: 14 }), " Back"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleNext, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 3 && /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col gap-6 py-6 animate-in zoom-in-95 duration-500" }, /* @__PURE__ */ React41.createElement("h2", { className: "text-lg font-serif text-black tracking-tight mb-2" }, "Terms and Conditions of Application"), /* @__PURE__ */ React41.createElement("div", { className: "text-xs text-neutral-500 mb-4" }, /* @__PURE__ */ React41.createElement("p", { className: " mb-3" }, "Declaration and Consent"), /* @__PURE__ */ React41.createElement("p", { className: "mb-3 leading-relaxed" }, "By proceeding with this application, you acknowledge and agree that all data, documents, and identification materials provided herein will be securely transmitted to the relevant official registries and authorized agents for the purpose of ", type === "company" ? "company" : "business", " incorporation and compliance verification."), /* @__PURE__ */ React41.createElement("p", { className: "mb-3 leading-relaxed" }, "You confirm that all information provided is accurate and authentic. Any falsification of identity or corporate data may result in immediate rejection, and you may be held liable under applicable laws and regulations."), /* @__PURE__ */ React41.createElement("p", { className: "mb-3 leading-relaxed" }, "This service operates strictly as a digital intermediary connecting you with official registries. The final approval of the ", type === "company" ? "company" : "business", " name and registration rests solely with the regulatory authorities. We are not liable for rejections arising from pre existing conflicts, non compliance, or regulatory policy changes not flagged during the AI pre check stages."), /* @__PURE__ */ React41.createElement("p", { className: "leading-relaxed" }, "Proceeding to generate the invoice confirms your acceptance of these terms and initiates the formal filing process.")), /* @__PURE__ */ React41.createElement("label", { className: "flex items-start gap-3 mt-2 cursor-pointer group" }, /* @__PURE__ */ React41.createElement("input", { type: "checkbox", checked: iAgree, onChange: (e) => setIAgree(e.target.checked), disabled: isReadOnly, className: "mt-0.5 w-4 h-4 accent-black rounded cursor-pointer" }), /* @__PURE__ */ React41.createElement("span", { className: "text-[13px] text-red-500 group-hover:text-red-600 transition-colors" }, "I have read, understood, and agree to the terms of data transfer and processing.")), /* @__PURE__ */ React41.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-4 mt-8 w-full justify-end pt-6" }, /* @__PURE__ */ React41.createElement("button", { onClick: onCancelOrClose, disabled: isSubmitting, className: "px-8 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none w-full sm:w-auto" }, "Cancel"), /* @__PURE__ */ React41.createElement("button", { onClick: () => setMacroStep(0), disabled: isSubmitting || isReadOnly, className: "px-8 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none w-full sm:w-auto" }, "Edit Application"), /* @__PURE__ */ React41.createElement(ThreeDActionButton, { onClick: handleFinalSubmit, disabled: isSubmitting || !iAgree || isReadOnly, isLoading: isSubmitting, className: "min-w-40 w-full sm:w-auto" }, "Submit")))), activeModal.isOpen && /* @__PURE__ */ React41.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React41.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setActiveModal({ isOpen: false, type: null, memberIndex: null }) }), /* @__PURE__ */ React41.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 max-h-[80vh]" }, /* @__PURE__ */ React41.createElement("div", { className: "p-4 text-center w-full shrink-0" }, /* @__PURE__ */ React41.createElement("h3", { className: "text-[14px] text-black tracking-tight capitalize" }, "Select ", activeModal.type)), /* @__PURE__ */ React41.createElement("div", { className: "p-4 flex flex-col gap-2 overflow-y-auto custom-scrollbar" }, (activeModal.type === "state" ? NIGERIAN_STATES : activeModal.type === "role" ? MEMBER_ROLES : NATIONALITIES).map((opt) => {
|
|
3601
3780
|
const isSelected = activeModal.isGlobalState ? formData.state === opt : formData.members[activeModal.memberIndex][activeModal.type] === opt;
|
|
3602
3781
|
return /* @__PURE__ */ React41.createElement("button", { key: opt, onClick: () => {
|
|
3603
3782
|
if (activeModal.isGlobalState) setFormData({ ...formData, state: opt });
|
|
@@ -3608,11 +3787,11 @@ var UniversalRegistrationFlow = ({
|
|
|
3608
3787
|
};
|
|
3609
3788
|
|
|
3610
3789
|
// src/components/UniversalDeveloperSettings.tsx
|
|
3611
|
-
import React42, { useState as
|
|
3790
|
+
import React42, { useState as useState25, useEffect as useEffect17 } from "react";
|
|
3612
3791
|
import { toast as toast7 } from "react-hot-toast";
|
|
3613
|
-
import { HugeiconsIcon as
|
|
3792
|
+
import { HugeiconsIcon as HugeiconsIcon28 } from "@hugeicons/react";
|
|
3614
3793
|
import { Loading03Icon as Loading03Icon13, CircleLock02Icon as CircleLock02Icon5 } from "@hugeicons/core-free-icons";
|
|
3615
|
-
var ButtonSpinner5 = () => /* @__PURE__ */ React42.createElement(
|
|
3794
|
+
var ButtonSpinner5 = () => /* @__PURE__ */ React42.createElement(HugeiconsIcon28, { icon: Loading03Icon13, size: 16, className: "animate-spin text-current" });
|
|
3616
3795
|
var UniversalDeveloperSettings = ({
|
|
3617
3796
|
initialPublicKey,
|
|
3618
3797
|
initialWebhookUrl,
|
|
@@ -3620,12 +3799,12 @@ var UniversalDeveloperSettings = ({
|
|
|
3620
3799
|
onGenerateKeys,
|
|
3621
3800
|
onSaveWebhook
|
|
3622
3801
|
}) => {
|
|
3623
|
-
const [publicKey, setPublicKey] =
|
|
3624
|
-
const [webhookUrl, setWebhookUrl] =
|
|
3625
|
-
const [isGenerating, setIsGenerating] =
|
|
3626
|
-
const [isSavingWebhook, setIsSavingWebhook] =
|
|
3627
|
-
const [isRollModalOpen, setIsRollModalOpen] =
|
|
3628
|
-
|
|
3802
|
+
const [publicKey, setPublicKey] = useState25(initialPublicKey);
|
|
3803
|
+
const [webhookUrl, setWebhookUrl] = useState25(initialWebhookUrl);
|
|
3804
|
+
const [isGenerating, setIsGenerating] = useState25(false);
|
|
3805
|
+
const [isSavingWebhook, setIsSavingWebhook] = useState25(false);
|
|
3806
|
+
const [isRollModalOpen, setIsRollModalOpen] = useState25(false);
|
|
3807
|
+
useEffect17(() => {
|
|
3629
3808
|
setPublicKey(initialPublicKey || "");
|
|
3630
3809
|
setWebhookUrl(initialWebhookUrl || "");
|
|
3631
3810
|
}, [initialPublicKey, initialWebhookUrl]);
|
|
@@ -3685,7 +3864,7 @@ AUDDITUR_SECRET_KEY="${secKey}"
|
|
|
3685
3864
|
};
|
|
3686
3865
|
const hasWebhookChanges = webhookUrl !== initialWebhookUrl;
|
|
3687
3866
|
const isWebhookSaveDisabled = isSavingWebhook || isReadOnly || !hasWebhookChanges;
|
|
3688
|
-
return /* @__PURE__ */ React42.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 min-h-full" }, /* @__PURE__ */ React42.createElement(ManagedToaster, null), /* @__PURE__ */ React42.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React42.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React42.createElement("h1", { className: "font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Developer Settings"), /* @__PURE__ */ React42.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations.")), isReadOnly && /* @__PURE__ */ React42.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React42.createElement(
|
|
3867
|
+
return /* @__PURE__ */ React42.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 min-h-full" }, /* @__PURE__ */ React42.createElement(ManagedToaster, null), /* @__PURE__ */ React42.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React42.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React42.createElement("h1", { className: "font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Developer Settings"), /* @__PURE__ */ React42.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations.")), isReadOnly && /* @__PURE__ */ React42.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ React42.createElement(HugeiconsIcon28, { icon: CircleLock02Icon5, size: 18, className: "text-current" }))), /* @__PURE__ */ React42.createElement("div", { className: "w-full max-w-2xl flex flex-col gap-12" }, /* @__PURE__ */ React42.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React42.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ React42.createElement(
|
|
3689
3868
|
TextInput,
|
|
3690
3869
|
{
|
|
3691
3870
|
label: "Public Key",
|
|
@@ -3751,12 +3930,199 @@ AUDDITUR_SECRET_KEY="${secKey}"
|
|
|
3751
3930
|
isGenerating ? /* @__PURE__ */ React42.createElement(ButtonSpinner5, null) : "Roll Keys"
|
|
3752
3931
|
)))));
|
|
3753
3932
|
};
|
|
3933
|
+
|
|
3934
|
+
// src/components/MedicalFeatureStatsBlock.tsx
|
|
3935
|
+
import React43, { useState as useState26, useEffect as useEffect18, useRef as useRef12 } from "react";
|
|
3936
|
+
import Image11 from "next/image";
|
|
3937
|
+
var MedicalFeatureStatsBlock = ({
|
|
3938
|
+
bottomHeadline,
|
|
3939
|
+
bottomDescription,
|
|
3940
|
+
avatars,
|
|
3941
|
+
trustText,
|
|
3942
|
+
stats
|
|
3943
|
+
}) => {
|
|
3944
|
+
const [isAnimating, setIsAnimating] = useState26(false);
|
|
3945
|
+
const titleRef = useRef12(null);
|
|
3946
|
+
useEffect18(() => {
|
|
3947
|
+
const observer = new IntersectionObserver(
|
|
3948
|
+
([entry]) => {
|
|
3949
|
+
if (entry.isIntersecting) {
|
|
3950
|
+
if (entry.boundingClientRect.top > 0) {
|
|
3951
|
+
setIsAnimating(true);
|
|
3952
|
+
}
|
|
3953
|
+
} else {
|
|
3954
|
+
setIsAnimating(false);
|
|
3955
|
+
}
|
|
3956
|
+
},
|
|
3957
|
+
{ threshold: 0.1 }
|
|
3958
|
+
);
|
|
3959
|
+
if (titleRef.current) {
|
|
3960
|
+
observer.observe(titleRef.current);
|
|
3961
|
+
}
|
|
3962
|
+
return () => observer.disconnect();
|
|
3963
|
+
}, []);
|
|
3964
|
+
return /* @__PURE__ */ React43.createElement("section", { className: "py-24 w-full flex justify-center relative z-10" }, /* @__PURE__ */ React43.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8 gap-32" }, /* @__PURE__ */ React43.createElement("div", null, /* @__PURE__ */ React43.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-10 mb-12" }, /* @__PURE__ */ React43.createElement("div", { className: "max-w-xl" }, /* @__PURE__ */ React43.createElement(
|
|
3965
|
+
"h2",
|
|
3966
|
+
{
|
|
3967
|
+
ref: titleRef,
|
|
3968
|
+
className: `font-serif text-4xl md:text-5xl text-black tracking-tight leading-[1.1] mb-5 ${isAnimating ? "animate-gradient-wipe" : ""}`,
|
|
3969
|
+
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
3970
|
+
},
|
|
3971
|
+
bottomHeadline
|
|
3972
|
+
), /* @__PURE__ */ React43.createElement("p", { className: "text-[14px] leading-relaxed text-neutral-500" }, bottomDescription)), /* @__PURE__ */ React43.createElement("div", { className: "flex items-center gap-4 shrink-0" }, /* @__PURE__ */ React43.createElement("div", { className: "flex -space-x-3" }, avatars.map((src, i) => /* @__PURE__ */ React43.createElement("div", { key: i, className: "relative w-12 h-12 rounded-full border-[3px] border-white overflow-hidden bg-neutral-100 s z-1 hover:z-10 transition-all" }, /* @__PURE__ */ React43.createElement(
|
|
3973
|
+
Image11,
|
|
3974
|
+
{
|
|
3975
|
+
src,
|
|
3976
|
+
alt: "Professional Avatar",
|
|
3977
|
+
fill: true,
|
|
3978
|
+
sizes: "48px",
|
|
3979
|
+
className: "object-cover"
|
|
3980
|
+
}
|
|
3981
|
+
)))), /* @__PURE__ */ React43.createElement("p", { className: "text-[12px] font-medium text-neutral-800 leading-[1.4] max-w-55" }, trustText))), /* @__PURE__ */ React43.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, stats.map((stat, idx) => /* @__PURE__ */ React43.createElement("div", { key: idx, className: " border border-neutral-200 rounded-4xl p-8 md:p-10 flex flex-col h-70" }, /* @__PURE__ */ React43.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ React43.createElement("span", { className: "w-1.5 h-1.5 rounded-full bg-neutral-400 shrink-0" }), /* @__PURE__ */ React43.createElement("span", { className: "text-[14px] text-neutral-500 tracking-wide" }, stat.label)), /* @__PURE__ */ React43.createElement("div", { className: "text-6xl md:text-[80px] font-light tracking-tighter text-black mt-auto leading-none" }, stat.value)))))));
|
|
3982
|
+
};
|
|
3983
|
+
|
|
3984
|
+
// src/components/ConsultantShowcase.tsx
|
|
3985
|
+
import React44, { useState as useState27 } from "react";
|
|
3986
|
+
import Image12 from "next/image";
|
|
3987
|
+
import { HugeiconsIcon as HugeiconsIcon29 } from "@hugeicons/react";
|
|
3988
|
+
import { Loading03Icon as Loading03Icon14 } from "@hugeicons/core-free-icons";
|
|
3989
|
+
var ImageWithLoader = ({ src, alt, className, sizes, priority = false }) => {
|
|
3990
|
+
const [isLoading, setIsLoading] = useState27(true);
|
|
3991
|
+
return /* @__PURE__ */ React44.createElement("div", { className: `absolute inset-0 bg-neutral-800 ${className}` }, isLoading && /* @__PURE__ */ React44.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__ */ React44.createElement(HugeiconsIcon29, { icon: Loading03Icon14, size: 24, className: "animate-spin text-white/50" })), /* @__PURE__ */ React44.createElement(
|
|
3992
|
+
Image12,
|
|
3993
|
+
{
|
|
3994
|
+
src,
|
|
3995
|
+
alt,
|
|
3996
|
+
fill: true,
|
|
3997
|
+
priority,
|
|
3998
|
+
sizes: sizes || "(max-width: 768px) 100vw, 1200px",
|
|
3999
|
+
onLoad: () => setIsLoading(false),
|
|
4000
|
+
className: `
|
|
4001
|
+
object-cover transition-all duration-1000 ease-out z-10
|
|
4002
|
+
${isLoading ? "scale-105 blur-xl opacity-0" : "scale-100 blur-0 opacity-100"}
|
|
4003
|
+
`
|
|
4004
|
+
}
|
|
4005
|
+
));
|
|
4006
|
+
};
|
|
4007
|
+
var ConsultantShowcase = ({
|
|
4008
|
+
profiles
|
|
4009
|
+
}) => {
|
|
4010
|
+
const [currentIndex, setCurrentIndex] = useState27(0);
|
|
4011
|
+
const [touchStart, setTouchStart] = useState27(null);
|
|
4012
|
+
const [touchEnd, setTouchEnd] = useState27(null);
|
|
4013
|
+
const nextSlide = () => {
|
|
4014
|
+
setCurrentIndex((prev) => prev === profiles.length - 1 ? 0 : prev + 1);
|
|
4015
|
+
};
|
|
4016
|
+
const prevSlide = () => {
|
|
4017
|
+
setCurrentIndex((prev) => prev === 0 ? profiles.length - 1 : prev - 1);
|
|
4018
|
+
};
|
|
4019
|
+
const onTouchStart = (e) => {
|
|
4020
|
+
setTouchEnd(null);
|
|
4021
|
+
setTouchStart(e.targetTouches[0].clientX);
|
|
4022
|
+
};
|
|
4023
|
+
const onTouchMove = (e) => {
|
|
4024
|
+
setTouchEnd(e.targetTouches[0].clientX);
|
|
4025
|
+
};
|
|
4026
|
+
const onTouchEnd = () => {
|
|
4027
|
+
if (!touchStart || !touchEnd) return;
|
|
4028
|
+
const distance = touchStart - touchEnd;
|
|
4029
|
+
const minSwipeDistance = 50;
|
|
4030
|
+
if (distance > minSwipeDistance) {
|
|
4031
|
+
nextSlide();
|
|
4032
|
+
} else if (distance < -minSwipeDistance) {
|
|
4033
|
+
prevSlide();
|
|
4034
|
+
}
|
|
4035
|
+
};
|
|
4036
|
+
if (!profiles || profiles.length === 0) return null;
|
|
4037
|
+
return /* @__PURE__ */ React44.createElement("section", { className: "py-24 w-full flex justify-center px-4 md:px-8 bg-white z-10 relative" }, /* @__PURE__ */ React44.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ React44.createElement(
|
|
4038
|
+
"div",
|
|
4039
|
+
{
|
|
4040
|
+
className: "relative w-full h-100 md:h-112.5 rounded-4xl overflow-hidden bg-neutral-900 shadow-xl shadow-black/5 group select-none",
|
|
4041
|
+
onTouchStart,
|
|
4042
|
+
onTouchMove,
|
|
4043
|
+
onTouchEnd
|
|
4044
|
+
},
|
|
4045
|
+
profiles.map((profile, idx) => {
|
|
4046
|
+
const isActive = idx === currentIndex;
|
|
4047
|
+
return /* @__PURE__ */ React44.createElement(
|
|
4048
|
+
"div",
|
|
4049
|
+
{
|
|
4050
|
+
key: profile.id,
|
|
4051
|
+
className: `absolute inset-0 transition-opacity duration-700 ease-in-out ${isActive ? "opacity-100 z-10" : "opacity-0 z-0 pointer-events-none"}`
|
|
4052
|
+
},
|
|
4053
|
+
/* @__PURE__ */ React44.createElement(
|
|
4054
|
+
ImageWithLoader,
|
|
4055
|
+
{
|
|
4056
|
+
src: profile.imageSrc,
|
|
4057
|
+
alt: profile.name,
|
|
4058
|
+
priority: idx === 0
|
|
4059
|
+
}
|
|
4060
|
+
),
|
|
4061
|
+
/* @__PURE__ */ React44.createElement("div", { className: "absolute inset-0 bg-black/20 z-10 pointer-events-none" }),
|
|
4062
|
+
/* @__PURE__ */ React44.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" }),
|
|
4063
|
+
/* @__PURE__ */ React44.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__ */ React44.createElement("h2", { className: "text-[32px] font-serif tracking-tight mb-2 leading-none" }, profile.name), /* @__PURE__ */ React44.createElement("div", { className: "flex flex-col gap-0.5" }, /* @__PURE__ */ React44.createElement("p", { className: "text-[15px] text-white/80 font-light tracking-wide" }, profile.role), profile.description && /* @__PURE__ */ React44.createElement("p", { className: "text-[15px] text-white/80 font-light tracking-wide mt-1" }, profile.description)))
|
|
4064
|
+
);
|
|
4065
|
+
}),
|
|
4066
|
+
/* @__PURE__ */ React44.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" }),
|
|
4067
|
+
/* @__PURE__ */ React44.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" }),
|
|
4068
|
+
/* @__PURE__ */ React44.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__ */ React44.createElement(
|
|
4069
|
+
"button",
|
|
4070
|
+
{
|
|
4071
|
+
key: idx,
|
|
4072
|
+
onClick: () => setCurrentIndex(idx),
|
|
4073
|
+
"aria-label": `Go to slide ${idx + 1}`,
|
|
4074
|
+
className: `h-1 rounded-full transition-all duration-300 ease-out outline-none ${currentIndex === idx ? "w-8 bg-white" : "w-4 bg-white/30 hover:bg-white/60 cursor-pointer"}`
|
|
4075
|
+
}
|
|
4076
|
+
)))
|
|
4077
|
+
)));
|
|
4078
|
+
};
|
|
4079
|
+
|
|
4080
|
+
// src/components/ContentGridBlock.tsx
|
|
4081
|
+
import React45, { useState as useState28 } from "react";
|
|
4082
|
+
import Image13 from "next/image";
|
|
4083
|
+
import { HugeiconsIcon as HugeiconsIcon30 } from "@hugeicons/react";
|
|
4084
|
+
import { Loading03Icon as Loading03Icon15 } from "@hugeicons/core-free-icons";
|
|
4085
|
+
var ImageWithLoader2 = ({ src, alt, className, sizes }) => {
|
|
4086
|
+
const [isLoading, setIsLoading] = useState28(true);
|
|
4087
|
+
return /* @__PURE__ */ React45.createElement("div", { className: `relative overflow-hidden bg-neutral-100 ${className}` }, isLoading && /* @__PURE__ */ React45.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-100/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ React45.createElement(HugeiconsIcon30, { icon: Loading03Icon15, size: 24, className: "animate-spin text-neutral-400" })), /* @__PURE__ */ React45.createElement(
|
|
4088
|
+
Image13,
|
|
4089
|
+
{
|
|
4090
|
+
src,
|
|
4091
|
+
alt,
|
|
4092
|
+
fill: true,
|
|
4093
|
+
sizes: sizes || "(max-width: 768px) 100vw, 500px",
|
|
4094
|
+
onLoad: () => setIsLoading(false),
|
|
4095
|
+
className: `
|
|
4096
|
+
object-cover transition-all duration-1000 ease-out z-10
|
|
4097
|
+
${isLoading ? "scale-105 blur-xl opacity-0" : "scale-100 blur-0 opacity-100"}
|
|
4098
|
+
`
|
|
4099
|
+
}
|
|
4100
|
+
));
|
|
4101
|
+
};
|
|
4102
|
+
var ContentGridBlock = ({
|
|
4103
|
+
header,
|
|
4104
|
+
leftCard,
|
|
4105
|
+
middleTopCard,
|
|
4106
|
+
middleBottomCard,
|
|
4107
|
+
rightCards
|
|
4108
|
+
}) => {
|
|
4109
|
+
return /* @__PURE__ */ React45.createElement("section", { className: "py-24 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React45.createElement("div", { className: "max-w-300 w-full px-4 md:px-8 flex flex-col gap-12" }, /* @__PURE__ */ React45.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-6 w-full" }, /* @__PURE__ */ React45.createElement("h2", { className: "text-5xl font-serif font-medium tracking-tight text-black leading-[1.15] max-w-lg" }, header.titlePrefix, " ", /* @__PURE__ */ React45.createElement("span", { className: "text-[#A7372A]" }, header.highlightText))), /* @__PURE__ */ React45.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" }, /* @__PURE__ */ React45.createElement("div", { className: "flex flex-col justify-end" }, /* @__PURE__ */ React45.createElement("div", { className: "border border-neutral-200 rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ React45.createElement("p", { className: "text-[17px] text-black leading-snug font-medium mb-4" }, leftCard.mainText), leftCard.tag && /* @__PURE__ */ React45.createElement("span", { className: "mb-auto text-[11px] font-medium text-neutral-400 uppercase tracking-widest" }, leftCard.tag), /* @__PURE__ */ React45.createElement("div", { className: "flex items-center justify-between mt-8" }, /* @__PURE__ */ React45.createElement("div", null, /* @__PURE__ */ React45.createElement("h4", { className: "text-[15px] font-semibold text-black" }, leftCard.title), /* @__PURE__ */ React45.createElement("p", { className: "text-[13px] text-neutral-400" }, leftCard.subtitle)), /* @__PURE__ */ React45.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ React45.createElement(Image13, { src: leftCard.thumbnailSrc, alt: leftCard.title, fill: true, className: "object-cover" }))))), /* @__PURE__ */ React45.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React45.createElement("div", { className: "border border-neutral-200 rounded-3xl p-8 flex flex-col relative h-75" }, /* @__PURE__ */ React45.createElement("div", { className: "absolute top-6 right-6 flex flex-col items-end gap-1" }, /* @__PURE__ */ React45.createElement("span", { className: "text-[11px] text-neutral-400 font-medium tracking-wide" }, middleTopCard.topRightLabel), /* @__PURE__ */ React45.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React45.createElement("div", { className: "flex -space-x-2" }, middleTopCard.topRightAvatars.map((src, i) => /* @__PURE__ */ React45.createElement("div", { key: i, className: "w-7 h-7 rounded-full border-2 border-white overflow-hidden relative z-10" }, /* @__PURE__ */ React45.createElement(Image13, { src, alt: "Avatar", fill: true, className: "object-cover", sizes: "28px" })))), /* @__PURE__ */ React45.createElement("span", { className: "text-sm font-medium text-neutral-500" }, middleTopCard.topRightCount))), /* @__PURE__ */ React45.createElement("div", { className: "grow flex flex-col justify-center items-center py-6" }, /* @__PURE__ */ React45.createElement("div", { className: "px-5 py-2 rounded-full bg-neutral-50/50 border border-neutral-200 text-[13px] text-neutral-600" }, middleTopCard.badgePrefix, " ", /* @__PURE__ */ React45.createElement("span", { className: "font-semibold text-black" }, middleTopCard.badgeHighlight), middleTopCard.badgeSuffix)), /* @__PURE__ */ React45.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React45.createElement("p", { className: "text-[12px] text-neutral-400 font-medium tracking-wide mb-1" }, middleTopCard.title), /* @__PURE__ */ React45.createElement("p", { className: "text-[14px] text-black font-medium leading-snug pr-4" }, middleTopCard.description))), /* @__PURE__ */ React45.createElement("div", { className: "border border-neutral-200 rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ React45.createElement("div", { className: "flex justify-between items-start mb-6" }, /* @__PURE__ */ React45.createElement("div", null, /* @__PURE__ */ React45.createElement("h4", { className: "text-[15px] font-semibold text-black leading-tight" }, middleBottomCard.title), /* @__PURE__ */ React45.createElement("p", { className: "text-[13px] text-neutral-400" }, middleBottomCard.subtitle)), /* @__PURE__ */ React45.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ React45.createElement(Image13, { src: middleBottomCard.thumbnailSrc, alt: middleBottomCard.title, fill: true, className: "object-cover" }))), /* @__PURE__ */ React45.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React45.createElement("p", { className: "text-[16px] text-black leading-snug font-medium mb-4" }, middleBottomCard.mainText), middleBottomCard.tag && /* @__PURE__ */ React45.createElement("span", { className: "text-[11px] font-medium text-neutral-400 uppercase tracking-widest" }, middleBottomCard.tag)))), /* @__PURE__ */ React45.createElement("div", { className: "flex flex-col gap-6" }, rightCards.slice(0, 2).map((card, idx) => /* @__PURE__ */ React45.createElement("div", { key: idx, className: "relative w-full h-80 rounded-3xl overflow-hidden group" }, /* @__PURE__ */ React45.createElement(
|
|
4110
|
+
ImageWithLoader2,
|
|
4111
|
+
{
|
|
4112
|
+
src: card.bgImageSrc,
|
|
4113
|
+
alt: card.title,
|
|
4114
|
+
className: "absolute inset-0 w-full h-full"
|
|
4115
|
+
}
|
|
4116
|
+
), /* @__PURE__ */ React45.createElement("div", { className: "absolute inset-0 bg-linear-to-t from-black/90 via-black/30 to-transparent z-20 pointer-events-none" }), /* @__PURE__ */ React45.createElement("div", { className: "absolute inset-0 z-30 p-6 flex flex-col justify-end text-white" }, /* @__PURE__ */ React45.createElement("p", { className: "text-[14px] font-medium leading-snug mb-3 pr-2 text-white/90" }, card.mainText), card.tag && /* @__PURE__ */ React45.createElement("span", { className: "mb-4 text-[11px] font-medium text-white/50 uppercase tracking-widest" }, card.tag), /* @__PURE__ */ React45.createElement("div", { className: "pt-3" }, /* @__PURE__ */ React45.createElement("h4", { className: "text-[15px] font-semibold tracking-wide" }, card.title), /* @__PURE__ */ React45.createElement("p", { className: "text-[13px] text-white/60" }, card.subtitle)))))))));
|
|
4117
|
+
};
|
|
3754
4118
|
export {
|
|
3755
4119
|
AITranscriptionFeature,
|
|
3756
4120
|
AiApproveDecline,
|
|
3757
4121
|
AiStageCheck,
|
|
3758
4122
|
AppBento2,
|
|
3759
4123
|
Banner,
|
|
4124
|
+
ConsultantShowcase,
|
|
4125
|
+
ContentGridBlock,
|
|
3760
4126
|
Faq,
|
|
3761
4127
|
FeatureScroll,
|
|
3762
4128
|
Footer,
|
|
@@ -3771,6 +4137,7 @@ export {
|
|
|
3771
4137
|
ManagedPricingBlock,
|
|
3772
4138
|
ManagedProjectsBlock,
|
|
3773
4139
|
ManagedToaster,
|
|
4140
|
+
MedicalFeatureStatsBlock,
|
|
3774
4141
|
NumberInput,
|
|
3775
4142
|
PageSpinner,
|
|
3776
4143
|
PlatformFeatures,
|