@retinalabsllc/zairusjs 0.5.9 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +15 -21
- package/dist/index.d.ts +15 -21
- package/dist/index.js +370 -362
- package/dist/index.mjs +348 -338
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -63,7 +63,6 @@ __export(index_exports, {
|
|
|
63
63
|
UniversalDashboardPage: () => UniversalDashboardPage,
|
|
64
64
|
UniversalDirectoryPage: () => UniversalDirectoryPage,
|
|
65
65
|
UniversalErrorView: () => UniversalErrorView,
|
|
66
|
-
UniversalHeader: () => UniversalHeader,
|
|
67
66
|
UniversalIdentityPage: () => UniversalIdentityPage,
|
|
68
67
|
UniversalLookupPage: () => UniversalLookupPage,
|
|
69
68
|
UniversalMembersPage: () => UniversalMembersPage,
|
|
@@ -740,9 +739,23 @@ var import_react13 = __toESM(require("react"));
|
|
|
740
739
|
var import_image3 = __toESM(require("next/image"));
|
|
741
740
|
var import_react14 = require("@hugeicons/react");
|
|
742
741
|
var import_core_free_icons3 = require("@hugeicons/core-free-icons");
|
|
743
|
-
var FeatureCard = ({ feature }) => {
|
|
744
|
-
const [
|
|
745
|
-
|
|
742
|
+
var FeatureCard = ({ feature, bgImage }) => {
|
|
743
|
+
const [isBgLoading, setIsBgLoading] = (0, import_react13.useState)(true);
|
|
744
|
+
const [isFgLoading, setIsFgLoading] = (0, import_react13.useState)(!!feature.image);
|
|
745
|
+
return /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col shrink-0 w-[90vw] sm:w-150 snap-center md:snap-start group cursor-grab active:cursor-grabbing" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative w-full aspect-16/10 bg-neutral-100 rounded-2xl overflow-hidden mb-6 flex items-center justify-center" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
746
|
+
import_image3.default,
|
|
747
|
+
{
|
|
748
|
+
src: bgImage,
|
|
749
|
+
alt: "Card Background",
|
|
750
|
+
fill: true,
|
|
751
|
+
sizes: "(max-width: 768px) 90vw, 600px",
|
|
752
|
+
onLoad: () => setIsBgLoading(false),
|
|
753
|
+
className: `
|
|
754
|
+
object-cover z-0 transition-all duration-700 ease-out
|
|
755
|
+
${isBgLoading ? "blur-xl scale-110" : "blur-0 scale-100"}
|
|
756
|
+
`
|
|
757
|
+
}
|
|
758
|
+
), /* @__PURE__ */ import_react13.default.createElement(
|
|
746
759
|
"div",
|
|
747
760
|
{
|
|
748
761
|
className: "absolute inset-0 w-full h-full pointer-events-none z-0 opacity-[0.25] mix-blend-overlay",
|
|
@@ -750,18 +763,17 @@ var FeatureCard = ({ feature }) => {
|
|
|
750
763
|
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")`
|
|
751
764
|
}
|
|
752
765
|
}
|
|
753
|
-
),
|
|
754
|
-
/* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute -bottom-6 -right-6 w-[85%] h-[85%] z-10 transition-transform duration-700 ease-out group-hover:-translate-x-2 group-hover:-translate-y-2" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
766
|
+
), isFgLoading && feature.image && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-50/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ import_react13.default.createElement(import_react14.HugeiconsIcon, { icon: import_core_free_icons3.Loading03Icon, size: 32, className: "animate-spin text-neutral-400" })), feature.image && /* @__PURE__ */ import_react13.default.createElement("div", { className: "absolute -bottom-6 -right-6 w-[85%] h-[85%] z-10 transition-transform duration-700 ease-out group-hover:-translate-x-2 group-hover:-translate-y-2" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
755
767
|
import_image3.default,
|
|
756
768
|
{
|
|
757
769
|
src: feature.image,
|
|
758
770
|
alt: feature.title,
|
|
759
771
|
fill: true,
|
|
760
772
|
sizes: "(max-width: 768px) 90vw, 600px",
|
|
761
|
-
onLoad: () =>
|
|
773
|
+
onLoad: () => setIsFgLoading(false),
|
|
762
774
|
className: `
|
|
763
|
-
object-cover rounded-tl-2xl shadow-[-12px_-12px_30px_rgba(0,0,0,0.06)] transition-all duration-700 ease-out
|
|
764
|
-
${
|
|
775
|
+
object-cover object-top-left rounded-tl-2xl shadow-[-12px_-12px_30px_rgba(0,0,0,0.06)] transition-all duration-700 ease-out
|
|
776
|
+
${isFgLoading ? "opacity-0 blur-xl" : "opacity-100 blur-0"}
|
|
765
777
|
`
|
|
766
778
|
}
|
|
767
779
|
))), /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col text-left pr-4" }, /* @__PURE__ */ import_react13.default.createElement("h3", { className: " font-serif text-xl tracking-tight text-black mb-2" }, feature.title), /* @__PURE__ */ import_react13.default.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 max-w-[90%]" }, feature.desc)));
|
|
@@ -788,6 +800,11 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
788
800
|
scrollRef.current.scrollBy({ left: scrollAmount, behavior: "smooth" });
|
|
789
801
|
}
|
|
790
802
|
};
|
|
803
|
+
const bgImages = [
|
|
804
|
+
"/assets/webp/card-bg.webp",
|
|
805
|
+
"/assets/webp/card-bg2.webp",
|
|
806
|
+
"/assets/webp/card-bg3.webp"
|
|
807
|
+
];
|
|
791
808
|
return /* @__PURE__ */ import_react13.default.createElement("section", { className: "py-24 w-full flex justify-center relative z-10 overflow-hidden" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col md:flex-row md:items-end justify-between gap-6 mb-12" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative z-10 text-left" }, /* @__PURE__ */ import_react13.default.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ import_react13.default.createElement("h2", { className: " font-serif text-3xl md:text-5xl tracking-tight text-black leading-[1.05]" }, headline)), /* @__PURE__ */ import_react13.default.createElement("div", { className: "hidden md:flex items-center gap-3" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
792
809
|
"button",
|
|
793
810
|
{
|
|
@@ -813,7 +830,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
813
830
|
onScroll: checkScroll,
|
|
814
831
|
className: "flex gap-6 overflow-x-auto snap-x snap-mandatory [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] scrollbar-none pb-8 -mx-4 px-4 md:mx-0 md:px-0"
|
|
815
832
|
},
|
|
816
|
-
features.map((feature, idx) => /* @__PURE__ */ import_react13.default.createElement(FeatureCard, { key: idx, feature }))
|
|
833
|
+
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */ import_react13.default.createElement(FeatureCard, { key: idx, feature, bgImage: bgImages[idx] }))
|
|
817
834
|
), /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex md:hidden items-center justify-center gap-4 mt-2" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
818
835
|
"button",
|
|
819
836
|
{
|
|
@@ -1508,12 +1525,27 @@ var import_react37 = __toESM(require("react"));
|
|
|
1508
1525
|
var import_link9 = __toESM(require("next/link"));
|
|
1509
1526
|
var import_react38 = require("@hugeicons/react");
|
|
1510
1527
|
var import_core_free_icons9 = require("@hugeicons/core-free-icons");
|
|
1528
|
+
var ButtonSpinner = () => /* @__PURE__ */ import_react37.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react37.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react37.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1511
1529
|
var UniversalSidebar = ({
|
|
1512
1530
|
navItems,
|
|
1513
1531
|
currentPath,
|
|
1514
1532
|
isMobileOpen,
|
|
1515
1533
|
closeMobile,
|
|
1534
|
+
openMobile,
|
|
1516
1535
|
onNavClick,
|
|
1536
|
+
// Header integrations
|
|
1537
|
+
title = "App",
|
|
1538
|
+
subtitle,
|
|
1539
|
+
homeUrl = "/app",
|
|
1540
|
+
showBackButton = false,
|
|
1541
|
+
backUrl = "/app",
|
|
1542
|
+
showWorkspaceSwitcher = false,
|
|
1543
|
+
workspaces = [],
|
|
1544
|
+
activeWorkspaceId,
|
|
1545
|
+
onSwitchWorkspace,
|
|
1546
|
+
showLogoutAction = false,
|
|
1547
|
+
onLogout,
|
|
1548
|
+
// Intercept
|
|
1517
1549
|
showInterceptDialog = false,
|
|
1518
1550
|
onCancelIntercept,
|
|
1519
1551
|
onConfirmIntercept,
|
|
@@ -1521,6 +1553,9 @@ var UniversalSidebar = ({
|
|
|
1521
1553
|
interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
|
|
1522
1554
|
}) => {
|
|
1523
1555
|
const [isCollapsed, setIsCollapsed] = (0, import_react37.useState)(false);
|
|
1556
|
+
const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react37.useState)(false);
|
|
1557
|
+
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react37.useState)(false);
|
|
1558
|
+
const [isLoggingOut, setIsLoggingOut] = (0, import_react37.useState)(false);
|
|
1524
1559
|
(0, import_react37.useEffect)(() => {
|
|
1525
1560
|
if (isMobileOpen) {
|
|
1526
1561
|
closeMobile();
|
|
@@ -1529,7 +1564,25 @@ var UniversalSidebar = ({
|
|
|
1529
1564
|
const hasActiveMatch = navItems.some(
|
|
1530
1565
|
(item) => item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`)
|
|
1531
1566
|
);
|
|
1567
|
+
const handleLogoutInitiation = async () => {
|
|
1568
|
+
if (isLoggingOut || !onLogout) return;
|
|
1569
|
+
setIsLoggingOut(true);
|
|
1570
|
+
try {
|
|
1571
|
+
await onLogout();
|
|
1572
|
+
} catch (error) {
|
|
1573
|
+
setIsLoggingOut(false);
|
|
1574
|
+
setShowLogoutDialog(false);
|
|
1575
|
+
}
|
|
1576
|
+
};
|
|
1532
1577
|
return /* @__PURE__ */ import_react37.default.createElement(import_react37.default.Fragment, null, /* @__PURE__ */ import_react37.default.createElement(
|
|
1578
|
+
"button",
|
|
1579
|
+
{
|
|
1580
|
+
onClick: openMobile,
|
|
1581
|
+
className: `md:hidden fixed top-4 left-4 z-40 w-10 h-10 bg-white rounded-full flex items-center justify-center shadow-[0_4px_20px_rgba(0,0,0,0.08)] border border-neutral-100 text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
|
|
1582
|
+
"aria-label": "Open Menu"
|
|
1583
|
+
},
|
|
1584
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.SidebarLeft01Icon, size: 18 })
|
|
1585
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1533
1586
|
"div",
|
|
1534
1587
|
{
|
|
1535
1588
|
className: `fixed inset-0 bg-black/30 shadow-2xl transition-opacity duration-300 md:hidden z-90 ${isMobileOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
|
|
@@ -1545,16 +1598,16 @@ var UniversalSidebar = ({
|
|
|
1545
1598
|
${isCollapsed ? "md:w-16 w-64" : "w-64"}
|
|
1546
1599
|
`
|
|
1547
1600
|
},
|
|
1548
|
-
/* @__PURE__ */ import_react37.default.createElement("div", { className: "
|
|
1601
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center" : "justify-between"}` }, !isCollapsed || isMobileOpen ? /* @__PURE__ */ import_react37.default.createElement(import_link9.default, { href: homeUrl, className: "flex flex-col justify-center outline-none group min-w-0 pr-2" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)) : /* @__PURE__ */ import_react37.default.createElement(import_link9.default, { href: homeUrl, className: "w-8 h-8 bg-neutral-100 rounded-full flex items-center justify-center text-black font-serif text-xs font-medium hover:opacity-70 transition-opacity outline-none" }, title.charAt(0).toUpperCase()), /* @__PURE__ */ import_react37.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1549
1602
|
"button",
|
|
1550
1603
|
{
|
|
1551
1604
|
onClick: closeMobile,
|
|
1552
1605
|
className: "text-neutral-400 hover:text-black transition-colors outline-none",
|
|
1553
1606
|
"aria-label": "Close Menu"
|
|
1554
1607
|
},
|
|
1555
|
-
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CancelCircleIcon, size:
|
|
1556
|
-
)),
|
|
1557
|
-
/* @__PURE__ */ import_react37.default.createElement("nav", { className: "flex-1 py-
|
|
1608
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CancelCircleIcon, size: 24 })
|
|
1609
|
+
))),
|
|
1610
|
+
/* @__PURE__ */ import_react37.default.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar" }, navItems.map((item, index) => {
|
|
1558
1611
|
const isExactOrSubMatch = item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
|
|
1559
1612
|
const isCurrentRoute = isExactOrSubMatch || !hasActiveMatch && index === 0;
|
|
1560
1613
|
return /* @__PURE__ */ import_react37.default.createElement(
|
|
@@ -1563,7 +1616,7 @@ var UniversalSidebar = ({
|
|
|
1563
1616
|
key: item.name,
|
|
1564
1617
|
href: item.path,
|
|
1565
1618
|
onClick: (e) => onNavClick ? onNavClick(e, item.path) : void 0,
|
|
1566
|
-
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
|
|
1619
|
+
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group shrink-0 ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
|
|
1567
1620
|
title: isCollapsed && !isMobileOpen ? item.name : void 0
|
|
1568
1621
|
},
|
|
1569
1622
|
/* @__PURE__ */ import_react37.default.createElement(
|
|
@@ -1577,7 +1630,31 @@ var UniversalSidebar = ({
|
|
|
1577
1630
|
(!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs tracking-wide truncate" }, item.name)
|
|
1578
1631
|
);
|
|
1579
1632
|
})),
|
|
1580
|
-
/* @__PURE__ */ import_react37.default.createElement("div", { className: "p-4
|
|
1633
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2 border-t border-neutral-100/50" }, (showBackButton || showWorkspaceSwitcher || showLogoutAction) && /* @__PURE__ */ import_react37.default.createElement("div", { className: `flex gap-2 px-1 pb-2 ${isCollapsed && !isMobileOpen ? "flex-col items-center" : "items-center"}` }, showBackButton && /* @__PURE__ */ import_react37.default.createElement(
|
|
1634
|
+
import_link9.default,
|
|
1635
|
+
{
|
|
1636
|
+
href: backUrl,
|
|
1637
|
+
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 group",
|
|
1638
|
+
title: "Go Back"
|
|
1639
|
+
},
|
|
1640
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.ArrowLeft01Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1641
|
+
), showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react37.default.createElement(
|
|
1642
|
+
"button",
|
|
1643
|
+
{
|
|
1644
|
+
onClick: () => setShowSwitcherDialog(true),
|
|
1645
|
+
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",
|
|
1646
|
+
title: "Switch Workspace"
|
|
1647
|
+
},
|
|
1648
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.UserIcon, size: 16 })
|
|
1649
|
+
), showLogoutAction && /* @__PURE__ */ import_react37.default.createElement(
|
|
1650
|
+
"button",
|
|
1651
|
+
{
|
|
1652
|
+
onClick: () => setShowLogoutDialog(true),
|
|
1653
|
+
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",
|
|
1654
|
+
title: "Secure Logout"
|
|
1655
|
+
},
|
|
1656
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.LogoutCircle02Icon, size: 16 })
|
|
1657
|
+
)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1581
1658
|
"button",
|
|
1582
1659
|
{
|
|
1583
1660
|
onClick: () => setIsCollapsed(!isCollapsed),
|
|
@@ -1585,102 +1662,14 @@ var UniversalSidebar = ({
|
|
|
1585
1662
|
},
|
|
1586
1663
|
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
|
|
1587
1664
|
!isCollapsed && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs" }, "Collapse")
|
|
1588
|
-
))
|
|
1589
|
-
),
|
|
1590
|
-
"div",
|
|
1591
|
-
{
|
|
1592
|
-
className: "absolute inset-0 bg-black/30",
|
|
1593
|
-
onClick: onCancelIntercept
|
|
1594
|
-
}
|
|
1595
|
-
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, interceptTitle), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, interceptMessage)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1596
|
-
"button",
|
|
1597
|
-
{
|
|
1598
|
-
onClick: onCancelIntercept,
|
|
1599
|
-
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1600
|
-
},
|
|
1601
|
-
"Cancel"
|
|
1602
|
-
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1603
|
-
"button",
|
|
1604
|
-
{
|
|
1605
|
-
onClick: onConfirmIntercept,
|
|
1606
|
-
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors flex justify-center items-center outline-none"
|
|
1607
|
-
},
|
|
1608
|
-
"Leave"
|
|
1609
|
-
)))));
|
|
1610
|
-
};
|
|
1611
|
-
|
|
1612
|
-
// src/components/UniversalHeader.tsx
|
|
1613
|
-
var import_react39 = __toESM(require("react"));
|
|
1614
|
-
var import_link10 = __toESM(require("next/link"));
|
|
1615
|
-
var import_react40 = require("@hugeicons/react");
|
|
1616
|
-
var import_core_free_icons10 = require("@hugeicons/core-free-icons");
|
|
1617
|
-
var ButtonSpinner = () => /* @__PURE__ */ import_react39.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react39.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react39.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1618
|
-
var UniversalHeader = ({
|
|
1619
|
-
onOpenMobile,
|
|
1620
|
-
title,
|
|
1621
|
-
subtitle,
|
|
1622
|
-
homeUrl = "/app",
|
|
1623
|
-
showBackButton = false,
|
|
1624
|
-
backUrl = "/app",
|
|
1625
|
-
showWorkspaceSwitcher = false,
|
|
1626
|
-
workspaces = [],
|
|
1627
|
-
activeWorkspaceId,
|
|
1628
|
-
onSwitchWorkspace,
|
|
1629
|
-
showLogoutAction = false,
|
|
1630
|
-
onLogout
|
|
1631
|
-
}) => {
|
|
1632
|
-
const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react39.useState)(false);
|
|
1633
|
-
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react39.useState)(false);
|
|
1634
|
-
const [isLoggingOut, setIsLoggingOut] = (0, import_react39.useState)(false);
|
|
1635
|
-
const handleLogoutInitiation = async () => {
|
|
1636
|
-
if (isLoggingOut || !onLogout) return;
|
|
1637
|
-
setIsLoggingOut(true);
|
|
1638
|
-
try {
|
|
1639
|
-
await onLogout();
|
|
1640
|
-
} catch (error) {
|
|
1641
|
-
setIsLoggingOut(false);
|
|
1642
|
-
setShowLogoutDialog(false);
|
|
1643
|
-
}
|
|
1644
|
-
};
|
|
1645
|
-
return /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full shrink-0 z-50 flex flex-col absolute top-0 left-0 pointer-events-none" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full pointer-events-auto relative z-20" }, /* @__PURE__ */ import_react39.default.createElement("header", { className: "w-full pt-6 pb-3" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "max-w-7xl mx-auto px-6 flex justify-between items-center" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1646
|
-
"button",
|
|
1647
|
-
{
|
|
1648
|
-
className: "md:hidden bg-white rounded-full w-8 h-8 text-neutral-500 hover:text-black transition-colors outline-none",
|
|
1649
|
-
onClick: onOpenMobile,
|
|
1650
|
-
"aria-label": "Open Menu"
|
|
1651
|
-
},
|
|
1652
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.SidebarLeft01Icon, size: 16 })
|
|
1653
|
-
), /* @__PURE__ */ import_react39.default.createElement(import_link10.default, { href: homeUrl, className: "flex items-center gap-3 transition-opacity hover:opacity-70 outline-none" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col justify-center" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate tracking-wide mb-1" }, title), subtitle && /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center gap-3" }, showWorkspaceSwitcher && workspaces.length > 0 && /* @__PURE__ */ import_react39.default.createElement(
|
|
1654
|
-
"button",
|
|
1655
|
-
{
|
|
1656
|
-
onClick: () => setShowSwitcherDialog(true),
|
|
1657
|
-
className: "w-8 h-8 rounded-full bg-white flex items-center justify-center text-black transition-all group outline-none",
|
|
1658
|
-
"aria-label": "Switch Workspace"
|
|
1659
|
-
},
|
|
1660
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.UserIcon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1661
|
-
), showLogoutAction && /* @__PURE__ */ import_react39.default.createElement(
|
|
1662
|
-
"button",
|
|
1663
|
-
{
|
|
1664
|
-
onClick: () => setShowLogoutDialog(true),
|
|
1665
|
-
className: "w-8 h-8 rounded-full bg-white flex items-center justify-center text-black transition-all group outline-none",
|
|
1666
|
-
"aria-label": "Secure Logout"
|
|
1667
|
-
},
|
|
1668
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.LogoutCircle02Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1669
|
-
), showBackButton && /* @__PURE__ */ import_react39.default.createElement(
|
|
1670
|
-
import_link10.default,
|
|
1671
|
-
{
|
|
1672
|
-
href: backUrl,
|
|
1673
|
-
className: "flex items-center bg-white justify-center w-8 h-8 rounded-full text-black transition-all group outline-none",
|
|
1674
|
-
"aria-label": "Go Back"
|
|
1675
|
-
},
|
|
1676
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1677
|
-
))))), showSwitcherDialog && showWorkspaceSwitcher && workspaces.length > 0 && /* @__PURE__ */ import_react39.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1665
|
+
)))
|
|
1666
|
+
), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1678
1667
|
"div",
|
|
1679
1668
|
{
|
|
1680
1669
|
className: "absolute inset-0 bg-black/30",
|
|
1681
1670
|
onClick: () => setShowSwitcherDialog(false)
|
|
1682
1671
|
}
|
|
1683
|
-
), /* @__PURE__ */
|
|
1672
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-5 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Switch Workspace"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-snug" }, "Select an organization to switch your current context.")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "max-h-75 overflow-y-auto w-full custom-scrollbar" }, workspaces.map((org) => /* @__PURE__ */ import_react37.default.createElement(
|
|
1684
1673
|
"button",
|
|
1685
1674
|
{
|
|
1686
1675
|
key: org.id,
|
|
@@ -1690,22 +1679,22 @@ var UniversalHeader = ({
|
|
|
1690
1679
|
},
|
|
1691
1680
|
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"
|
|
1692
1681
|
},
|
|
1693
|
-
/* @__PURE__ */
|
|
1694
|
-
activeWorkspaceId === org.id && /* @__PURE__ */
|
|
1695
|
-
))), /* @__PURE__ */
|
|
1682
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col truncate pr-4" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: `text-[13px] truncate ${activeWorkspaceId === org.id ? "text-black" : "text-neutral-600 group-hover:text-black"}` }, org.name), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[9px] text-neutral-400 tracking-[0.2em] mt-1" }, "Role: ", org.role)),
|
|
1683
|
+
activeWorkspaceId === org.id && /* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CheckmarkCircle01Icon, size: 16, className: "text-black shrink-0" })
|
|
1684
|
+
))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex mt-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1696
1685
|
"button",
|
|
1697
1686
|
{
|
|
1698
1687
|
onClick: () => setShowSwitcherDialog(false),
|
|
1699
1688
|
className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1700
1689
|
},
|
|
1701
1690
|
"Cancel"
|
|
1702
|
-
)))), showLogoutDialog && showLogoutAction && /* @__PURE__ */
|
|
1691
|
+
)))), showLogoutDialog && showLogoutAction && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1703
1692
|
"div",
|
|
1704
1693
|
{
|
|
1705
1694
|
className: "absolute inset-0 bg-black/30",
|
|
1706
1695
|
onClick: () => !isLoggingOut && setShowLogoutDialog(false)
|
|
1707
1696
|
}
|
|
1708
|
-
), /* @__PURE__ */
|
|
1697
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Secure Logout"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to log out? You will need to authenticate to return.")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1709
1698
|
"button",
|
|
1710
1699
|
{
|
|
1711
1700
|
onClick: () => setShowLogoutDialog(false),
|
|
@@ -1713,21 +1702,41 @@ var UniversalHeader = ({
|
|
|
1713
1702
|
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
1714
1703
|
},
|
|
1715
1704
|
"Cancel"
|
|
1716
|
-
), /* @__PURE__ */
|
|
1705
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1717
1706
|
"button",
|
|
1718
1707
|
{
|
|
1719
1708
|
onClick: handleLogoutInitiation,
|
|
1720
1709
|
disabled: isLoggingOut,
|
|
1721
1710
|
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center items-center outline-none"
|
|
1722
1711
|
},
|
|
1723
|
-
isLoggingOut ? /* @__PURE__ */
|
|
1712
|
+
isLoggingOut ? /* @__PURE__ */ import_react37.default.createElement(ButtonSpinner, null) : "Log Out"
|
|
1713
|
+
)))), showInterceptDialog && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1714
|
+
"div",
|
|
1715
|
+
{
|
|
1716
|
+
className: "absolute inset-0 bg-black/30",
|
|
1717
|
+
onClick: onCancelIntercept
|
|
1718
|
+
}
|
|
1719
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, interceptTitle), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, interceptMessage)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1720
|
+
"button",
|
|
1721
|
+
{
|
|
1722
|
+
onClick: onCancelIntercept,
|
|
1723
|
+
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1724
|
+
},
|
|
1725
|
+
"Cancel"
|
|
1726
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1727
|
+
"button",
|
|
1728
|
+
{
|
|
1729
|
+
onClick: onConfirmIntercept,
|
|
1730
|
+
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors flex justify-center items-center outline-none"
|
|
1731
|
+
},
|
|
1732
|
+
"Leave"
|
|
1724
1733
|
)))));
|
|
1725
1734
|
};
|
|
1726
1735
|
|
|
1727
1736
|
// src/components/UniversalOrganizationPage.tsx
|
|
1728
|
-
var
|
|
1737
|
+
var import_react39 = __toESM(require("react"));
|
|
1729
1738
|
var import_react_hot_toast3 = __toESM(require("react-hot-toast"));
|
|
1730
|
-
var InputSpinner2 = () => /* @__PURE__ */
|
|
1739
|
+
var InputSpinner2 = () => /* @__PURE__ */ import_react39.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react39.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react39.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1731
1740
|
var UniversalOrganizationPage = ({
|
|
1732
1741
|
initialOrgName,
|
|
1733
1742
|
initialSlug,
|
|
@@ -1737,12 +1746,12 @@ var UniversalOrganizationPage = ({
|
|
|
1737
1746
|
onSaveConfiguration,
|
|
1738
1747
|
onCheckSlugAvailability
|
|
1739
1748
|
}) => {
|
|
1740
|
-
const [orgName, setOrgName] = (0,
|
|
1741
|
-
const [slug, setSlug] = (0,
|
|
1742
|
-
const [isCheckingSlug, setIsCheckingSlug] = (0,
|
|
1743
|
-
const [slugAvailable, setSlugAvailable] = (0,
|
|
1744
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
1745
|
-
(0,
|
|
1749
|
+
const [orgName, setOrgName] = (0, import_react39.useState)(initialOrgName);
|
|
1750
|
+
const [slug, setSlug] = (0, import_react39.useState)(initialSlug);
|
|
1751
|
+
const [isCheckingSlug, setIsCheckingSlug] = (0, import_react39.useState)(false);
|
|
1752
|
+
const [slugAvailable, setSlugAvailable] = (0, import_react39.useState)(null);
|
|
1753
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react39.useState)(false);
|
|
1754
|
+
(0, import_react39.useEffect)(() => {
|
|
1746
1755
|
setOrgName(initialOrgName || "");
|
|
1747
1756
|
setSlug(initialSlug || "");
|
|
1748
1757
|
}, [initialOrgName, initialSlug]);
|
|
@@ -1752,7 +1761,7 @@ var UniversalOrganizationPage = ({
|
|
|
1752
1761
|
const handleSlugChange = (val) => {
|
|
1753
1762
|
setSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
|
|
1754
1763
|
};
|
|
1755
|
-
(0,
|
|
1764
|
+
(0, import_react39.useEffect)(() => {
|
|
1756
1765
|
if (!slug || slug === initialSlug) {
|
|
1757
1766
|
setSlugAvailable(null);
|
|
1758
1767
|
setIsCheckingSlug(false);
|
|
@@ -1806,7 +1815,7 @@ var UniversalOrganizationPage = ({
|
|
|
1806
1815
|
};
|
|
1807
1816
|
const hasChanges = orgName !== initialOrgName || slug !== initialSlug;
|
|
1808
1817
|
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || orgName.length < 3 || slug.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
1809
|
-
return /* @__PURE__ */
|
|
1818
|
+
return /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react39.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react39.default.createElement("div", null, /* @__PURE__ */ import_react39.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, "Organization"), /* @__PURE__ */ import_react39.default.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your tenant workspace details and identity.")), isReadOnly && /* @__PURE__ */ import_react39.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0" }, "Read Only Access")), /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react39.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1810
1819
|
TextInput,
|
|
1811
1820
|
{
|
|
1812
1821
|
label: "Organization Name",
|
|
@@ -1816,7 +1825,7 @@ var UniversalOrganizationPage = ({
|
|
|
1816
1825
|
placeholder: "Acme Corporation",
|
|
1817
1826
|
maxLength: 50
|
|
1818
1827
|
}
|
|
1819
|
-
), /* @__PURE__ */
|
|
1828
|
+
), /* @__PURE__ */ import_react39.default.createElement("div", { className: "space-y-2 relative w-full" }, /* @__PURE__ */ import_react39.default.createElement("label", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block uppercase" }, "Organization Slug"), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center relative w-full" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-neutral-400 text-sm py-3 pr-2 border-b border-neutral-100 shrink-0" }, slugPrefixUrl), /* @__PURE__ */ import_react39.default.createElement(
|
|
1820
1829
|
"input",
|
|
1821
1830
|
{
|
|
1822
1831
|
type: "text",
|
|
@@ -1828,7 +1837,7 @@ var UniversalOrganizationPage = ({
|
|
|
1828
1837
|
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-100 text-black transition-all outline-none focus:border-black pr-8 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
1829
1838
|
placeholder: "acme-corp"
|
|
1830
1839
|
}
|
|
1831
|
-
), /* @__PURE__ */
|
|
1840
|
+
), /* @__PURE__ */ import_react39.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react39.default.createElement(InputSpinner2, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react39.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-100" }, /* @__PURE__ */ import_react39.default.createElement("svg", { className: "w-2 h-2 text-red-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react39.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" }))), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react39.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react39.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react39.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 10-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z" })))))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1832
1841
|
ThreeDActionButton,
|
|
1833
1842
|
{
|
|
1834
1843
|
type: "submit",
|
|
@@ -1837,7 +1846,7 @@ var UniversalOrganizationPage = ({
|
|
|
1837
1846
|
className: "min-w-32"
|
|
1838
1847
|
},
|
|
1839
1848
|
"Save Changes"
|
|
1840
|
-
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */
|
|
1849
|
+
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react39.default.createElement(
|
|
1841
1850
|
"button",
|
|
1842
1851
|
{
|
|
1843
1852
|
type: "button",
|
|
@@ -1852,9 +1861,9 @@ var UniversalOrganizationPage = ({
|
|
|
1852
1861
|
};
|
|
1853
1862
|
|
|
1854
1863
|
// src/components/UniversalIdentityPage.tsx
|
|
1855
|
-
var
|
|
1864
|
+
var import_react40 = __toESM(require("react"));
|
|
1856
1865
|
var import_react_hot_toast4 = __toESM(require("react-hot-toast"));
|
|
1857
|
-
var ButtonSpinner2 = () => /* @__PURE__ */
|
|
1866
|
+
var ButtonSpinner2 = () => /* @__PURE__ */ import_react40.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react40.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react40.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1858
1867
|
var UniversalIdentityPage = ({
|
|
1859
1868
|
headerTitle,
|
|
1860
1869
|
headerDescription,
|
|
@@ -1870,12 +1879,12 @@ var UniversalIdentityPage = ({
|
|
|
1870
1879
|
onDeleteResource,
|
|
1871
1880
|
onSuccessfulDeleteRedirect = "/app"
|
|
1872
1881
|
}) => {
|
|
1873
|
-
const [primaryValue, setPrimaryValue] = (0,
|
|
1874
|
-
const [secondaryValue, setSecondaryValue] = (0,
|
|
1875
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
1876
|
-
const [isDeleteModalOpen, setIsDeleteModalOpen] = (0,
|
|
1877
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
1878
|
-
(0,
|
|
1882
|
+
const [primaryValue, setPrimaryValue] = (0, import_react40.useState)(initialPrimaryValue);
|
|
1883
|
+
const [secondaryValue, setSecondaryValue] = (0, import_react40.useState)(initialSecondaryValue);
|
|
1884
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react40.useState)(false);
|
|
1885
|
+
const [isDeleteModalOpen, setIsDeleteModalOpen] = (0, import_react40.useState)(false);
|
|
1886
|
+
const [isDeleting, setIsDeleting] = (0, import_react40.useState)(false);
|
|
1887
|
+
(0, import_react40.useEffect)(() => {
|
|
1879
1888
|
setPrimaryValue(initialPrimaryValue || "");
|
|
1880
1889
|
setSecondaryValue(initialSecondaryValue || "");
|
|
1881
1890
|
}, [initialPrimaryValue, initialSecondaryValue]);
|
|
@@ -1926,7 +1935,7 @@ var UniversalIdentityPage = ({
|
|
|
1926
1935
|
};
|
|
1927
1936
|
const hasChanges = primaryValue !== initialPrimaryValue || secondaryValue !== initialSecondaryValue;
|
|
1928
1937
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || primaryValue.trim().length < 3;
|
|
1929
|
-
return /* @__PURE__ */
|
|
1938
|
+
return /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react40.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react40.default.createElement("div", null, /* @__PURE__ */ import_react40.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react40.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), isReadOnly && /* @__PURE__ */ import_react40.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0" }, "Read Only Access")), /* @__PURE__ */ import_react40.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react40.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1930
1939
|
TextInput,
|
|
1931
1940
|
{
|
|
1932
1941
|
label: primaryInputLabel,
|
|
@@ -1935,7 +1944,7 @@ var UniversalIdentityPage = ({
|
|
|
1935
1944
|
disabled: isReadOnly || isSubmitting,
|
|
1936
1945
|
maxLength: 50
|
|
1937
1946
|
}
|
|
1938
|
-
), secondaryInputLabel && /* @__PURE__ */
|
|
1947
|
+
), secondaryInputLabel && /* @__PURE__ */ import_react40.default.createElement(
|
|
1939
1948
|
TextInput,
|
|
1940
1949
|
{
|
|
1941
1950
|
label: secondaryInputLabel,
|
|
@@ -1944,7 +1953,7 @@ var UniversalIdentityPage = ({
|
|
|
1944
1953
|
disabled: isReadOnly || isSubmitting,
|
|
1945
1954
|
maxLength: 150
|
|
1946
1955
|
}
|
|
1947
|
-
), !isReadOnly && /* @__PURE__ */
|
|
1956
|
+
), !isReadOnly && /* @__PURE__ */ import_react40.default.createElement("div", { className: "pt-8 mt-2 flex flex-col sm:flex-row sm:items-center justify-between gap-6" }, /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex items-center gap-4 w-full sm:w-auto" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1948
1957
|
ThreeDActionButton,
|
|
1949
1958
|
{
|
|
1950
1959
|
type: "submit",
|
|
@@ -1953,7 +1962,7 @@ var UniversalIdentityPage = ({
|
|
|
1953
1962
|
className: "min-w-32 w-full sm:w-auto"
|
|
1954
1963
|
},
|
|
1955
1964
|
"Save Changes"
|
|
1956
|
-
), hasChanges && !isSubmitting && /* @__PURE__ */
|
|
1965
|
+
), hasChanges && !isSubmitting && /* @__PURE__ */ import_react40.default.createElement(
|
|
1957
1966
|
"button",
|
|
1958
1967
|
{
|
|
1959
1968
|
type: "button",
|
|
@@ -1964,7 +1973,7 @@ var UniversalIdentityPage = ({
|
|
|
1964
1973
|
className: "text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
1965
1974
|
},
|
|
1966
1975
|
"Cancel"
|
|
1967
|
-
)), allowDeletion && /* @__PURE__ */
|
|
1976
|
+
)), allowDeletion && /* @__PURE__ */ import_react40.default.createElement(
|
|
1968
1977
|
"button",
|
|
1969
1978
|
{
|
|
1970
1979
|
type: "button",
|
|
@@ -1973,7 +1982,7 @@ var UniversalIdentityPage = ({
|
|
|
1973
1982
|
},
|
|
1974
1983
|
"Delete ",
|
|
1975
1984
|
headerTitle.split(" ")[0]
|
|
1976
|
-
)))), isDeleteModalOpen && !isReadOnly && allowDeletion && /* @__PURE__ */
|
|
1985
|
+
)))), isDeleteModalOpen && !isReadOnly && allowDeletion && /* @__PURE__ */ import_react40.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react40.default.createElement("div", { className: "absolute inset-0 bg-black/30 shadow-2xl", onClick: () => !isDeleting && setIsDeleteModalOpen(false) }), /* @__PURE__ */ import_react40.default.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__ */ import_react40.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react40.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Confirm Deletion"), /* @__PURE__ */ import_react40.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, deleteWarningText)), /* @__PURE__ */ import_react40.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1977
1986
|
"button",
|
|
1978
1987
|
{
|
|
1979
1988
|
type: "button",
|
|
@@ -1982,7 +1991,7 @@ var UniversalIdentityPage = ({
|
|
|
1982
1991
|
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
1983
1992
|
},
|
|
1984
1993
|
"Cancel"
|
|
1985
|
-
), /* @__PURE__ */
|
|
1994
|
+
), /* @__PURE__ */ import_react40.default.createElement(
|
|
1986
1995
|
"button",
|
|
1987
1996
|
{
|
|
1988
1997
|
type: "button",
|
|
@@ -1990,17 +1999,17 @@ var UniversalIdentityPage = ({
|
|
|
1990
1999
|
disabled: isDeleting,
|
|
1991
2000
|
className: "flex-1 py-2 text-[13px] text-red-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center items-center outline-none"
|
|
1992
2001
|
},
|
|
1993
|
-
isDeleting ? /* @__PURE__ */
|
|
2002
|
+
isDeleting ? /* @__PURE__ */ import_react40.default.createElement(ButtonSpinner2, null) : "Delete"
|
|
1994
2003
|
)))));
|
|
1995
2004
|
};
|
|
1996
2005
|
|
|
1997
2006
|
// src/components/UniversalMembersPage.tsx
|
|
1998
|
-
var
|
|
2007
|
+
var import_react41 = __toESM(require("react"));
|
|
1999
2008
|
var import_react_hot_toast5 = __toESM(require("react-hot-toast"));
|
|
2000
|
-
var
|
|
2001
|
-
var
|
|
2002
|
-
var ButtonSpinner3 = () => /* @__PURE__ */
|
|
2003
|
-
var PageSpinner2 = () => /* @__PURE__ */
|
|
2009
|
+
var import_react42 = require("@hugeicons/react");
|
|
2010
|
+
var import_core_free_icons10 = require("@hugeicons/core-free-icons");
|
|
2011
|
+
var ButtonSpinner3 = () => /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Loading03Icon, size: 16, className: "animate-spin text-white" });
|
|
2012
|
+
var PageSpinner2 = () => /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2004
2013
|
var getInitials = (name) => {
|
|
2005
2014
|
if (!name) return "U";
|
|
2006
2015
|
const parts = name.trim().split(" ");
|
|
@@ -2043,18 +2052,18 @@ var UniversalMembersPage = ({
|
|
|
2043
2052
|
onRemoveMember,
|
|
2044
2053
|
onUpdateRole
|
|
2045
2054
|
}) => {
|
|
2046
|
-
const [currentView, setCurrentView] = (0,
|
|
2047
|
-
const [selectedMember, setSelectedMember] = (0,
|
|
2048
|
-
const [inviteEmail, setInviteEmail] = (0,
|
|
2049
|
-
const [inviteFirst, setInviteFirst] = (0,
|
|
2050
|
-
const [inviteLast, setInviteLast] = (0,
|
|
2051
|
-
const [isInviting, setIsInviting] = (0,
|
|
2052
|
-
const [isRoleModalOpen, setIsRoleModalOpen] = (0,
|
|
2053
|
-
const [isUpdatingRole, setIsUpdatingRole] = (0,
|
|
2054
|
-
const [memberToDelete, setMemberToDelete] = (0,
|
|
2055
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
2056
|
-
const dropdownRef = (0,
|
|
2057
|
-
(0,
|
|
2055
|
+
const [currentView, setCurrentView] = (0, import_react41.useState)("list");
|
|
2056
|
+
const [selectedMember, setSelectedMember] = (0, import_react41.useState)(null);
|
|
2057
|
+
const [inviteEmail, setInviteEmail] = (0, import_react41.useState)("");
|
|
2058
|
+
const [inviteFirst, setInviteFirst] = (0, import_react41.useState)("");
|
|
2059
|
+
const [inviteLast, setInviteLast] = (0, import_react41.useState)("");
|
|
2060
|
+
const [isInviting, setIsInviting] = (0, import_react41.useState)(false);
|
|
2061
|
+
const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react41.useState)(false);
|
|
2062
|
+
const [isUpdatingRole, setIsUpdatingRole] = (0, import_react41.useState)(false);
|
|
2063
|
+
const [memberToDelete, setMemberToDelete] = (0, import_react41.useState)(null);
|
|
2064
|
+
const [isDeleting, setIsDeleting] = (0, import_react41.useState)(false);
|
|
2065
|
+
const dropdownRef = (0, import_react41.useRef)(null);
|
|
2066
|
+
(0, import_react41.useEffect)(() => {
|
|
2058
2067
|
function handleClickOutside(event) {
|
|
2059
2068
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
2060
2069
|
setIsRoleModalOpen(false);
|
|
@@ -2128,15 +2137,15 @@ var UniversalMembersPage = ({
|
|
|
2128
2137
|
setSelectedMember(null);
|
|
2129
2138
|
setIsRoleModalOpen(false);
|
|
2130
2139
|
};
|
|
2131
|
-
return /* @__PURE__ */
|
|
2140
|
+
return /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white " }, /* @__PURE__ */ import_react41.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" && /* @__PURE__ */ import_react41.default.createElement(import_react41.default.Fragment, null, /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), canManage && /* @__PURE__ */ import_react41.default.createElement(
|
|
2132
2141
|
ThreeDActionButton,
|
|
2133
2142
|
{
|
|
2134
2143
|
onClick: () => setCurrentView("invite"),
|
|
2135
2144
|
className: "w-fit shrink-0 gap-2"
|
|
2136
2145
|
},
|
|
2137
|
-
/* @__PURE__ */
|
|
2146
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.UserAdd01Icon, size: 12 }),
|
|
2138
2147
|
"Add Member"
|
|
2139
|
-
)), currentView !== "list" && /* @__PURE__ */
|
|
2148
|
+
)), currentView !== "list" && /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react41.default.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__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 12 }), " Back"), /* @__PURE__ */ import_react41.default.createElement("h1", { className: " font-serif text-lg text-black tracking-tight" }, currentView === "invite" ? "Add New Member" : "Member Profile"))), currentView === "list" && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react41.default.createElement(PageSpinner2, null) : /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "divide-y divide-neutral-100" }, members.map((member) => /* @__PURE__ */ import_react41.default.createElement(
|
|
2140
2149
|
"div",
|
|
2141
2150
|
{
|
|
2142
2151
|
key: member.id,
|
|
@@ -2146,7 +2155,7 @@ var UniversalMembersPage = ({
|
|
|
2146
2155
|
},
|
|
2147
2156
|
className: "flex items-center justify-between p-4 sm:p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0"
|
|
2148
2157
|
},
|
|
2149
|
-
/* @__PURE__ */
|
|
2158
|
+
/* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, member.displayImage && member.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2150
2159
|
"img",
|
|
2151
2160
|
{
|
|
2152
2161
|
src: member.displayImage,
|
|
@@ -2154,25 +2163,25 @@ var UniversalMembersPage = ({
|
|
|
2154
2163
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2155
2164
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2156
2165
|
}
|
|
2157
|
-
)) : /* @__PURE__ */
|
|
2158
|
-
/* @__PURE__ */
|
|
2159
|
-
))), /* @__PURE__ */
|
|
2166
|
+
)) : /* @__PURE__ */ import_react41.default.createElement("div", { className: `w-10 h-10 shrink-0 rounded-full flex items-center justify-center text-black text-xs ${resolveThemeColor(member.profileColor)}` }, getInitials(member.fullName)), /* @__PURE__ */ import_react41.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-sm text-black truncate pr-2 sm:pr-4" }, member.fullName, " ", member.userId === currentUserId && /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-neutral-400 ml-1 sm:ml-2" }, "(You)")), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-xs text-neutral-500 truncate pr-2 sm:pr-4 mt-0.5" }, member.email))),
|
|
2167
|
+
/* @__PURE__ */ import_react41.default.createElement("div", { className: `shrink-0 pl-2 sm:pl-4 transition-opacity hidden sm:block ${canManage ? "opacity-0 group-hover:opacity-100" : "opacity-100"}` }, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-black border border-neutral-100 px-4 py-2 rounded-full bg-white whitespace-nowrap" }, canManage ? "Manage" : "View"))
|
|
2168
|
+
))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2160
2169
|
"button",
|
|
2161
2170
|
{
|
|
2162
2171
|
onClick: () => onPageChange(currentPage - 1),
|
|
2163
2172
|
disabled: currentPage === 1 || isLoading,
|
|
2164
2173
|
className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2165
2174
|
},
|
|
2166
|
-
/* @__PURE__ */
|
|
2167
|
-
), /* @__PURE__ */
|
|
2175
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 14 })
|
|
2176
|
+
), /* @__PURE__ */ import_react41.default.createElement(
|
|
2168
2177
|
"button",
|
|
2169
2178
|
{
|
|
2170
2179
|
onClick: () => onPageChange(currentPage + 1),
|
|
2171
2180
|
disabled: currentPage >= totalPages || isLoading,
|
|
2172
2181
|
className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2173
2182
|
},
|
|
2174
|
-
/* @__PURE__ */
|
|
2175
|
-
))))), currentView === "details" && selectedMember && /* @__PURE__ */
|
|
2183
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowRight01Icon, size: 14 })
|
|
2184
|
+
))))), currentView === "details" && selectedMember && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-5" }, selectedMember.displayImage && selectedMember.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-16 h-16 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2176
2185
|
"img",
|
|
2177
2186
|
{
|
|
2178
2187
|
src: selectedMember.displayImage,
|
|
@@ -2180,7 +2189,7 @@ var UniversalMembersPage = ({
|
|
|
2180
2189
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2181
2190
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2182
2191
|
}
|
|
2183
|
-
)) : /* @__PURE__ */
|
|
2192
|
+
)) : /* @__PURE__ */ import_react41.default.createElement("div", { className: `w-16 h-16 shrink-0 rounded-full flex items-center justify-center text-black text-sm ${resolveThemeColor(selectedMember.profileColor)}` }, getInitials(selectedMember.fullName)), /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("h2", { className: " font-serif text-lg text-black" }, selectedMember.fullName), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-sm text-neutral-500 mt-1" }, selectedMember.email))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "grid grid-cols-2 gap-6 border-t border-neutral-100 pt-8" }, /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Role"), canChangeRoles && selectedMember.userId !== currentUserId ? /* @__PURE__ */ import_react41.default.createElement(
|
|
2184
2193
|
"button",
|
|
2185
2194
|
{
|
|
2186
2195
|
onClick: () => !isUpdatingRole && setIsRoleModalOpen(true),
|
|
@@ -2188,16 +2197,16 @@ var UniversalMembersPage = ({
|
|
|
2188
2197
|
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-100 hover:bg-neutral-50"}`
|
|
2189
2198
|
},
|
|
2190
2199
|
selectedMember.role,
|
|
2191
|
-
isUpdatingRole ? /* @__PURE__ */
|
|
2192
|
-
) : /* @__PURE__ */
|
|
2200
|
+
isUpdatingRole ? /* @__PURE__ */ import_react41.default.createElement(ButtonSpinner3, null) : /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2201
|
+
) : /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-xs text-black bg-neutral-50 px-4 py-2 rounded-full inline-block" }, selectedMember.role)), /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Joined Date"), /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-sm text-black" }, new Date(selectedMember.joinedAt).toLocaleDateString()))), canManage && selectedMember.userId !== currentUserId && /* @__PURE__ */ import_react41.default.createElement("div", { className: "pt-8 mt-2 border-t border-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2193
2202
|
"button",
|
|
2194
2203
|
{
|
|
2195
2204
|
onClick: () => setMemberToDelete(selectedMember),
|
|
2196
2205
|
className: "flex items-center gap-2 text-[11px] tracking-widest text-red-600 hover:text-red-700 transition-colors w-fit outline-none"
|
|
2197
2206
|
},
|
|
2198
|
-
/* @__PURE__ */
|
|
2207
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Delete01Icon, size: 14 }),
|
|
2199
2208
|
" Remove Member"
|
|
2200
|
-
)))), currentView === "invite" && canManage && /* @__PURE__ */
|
|
2209
|
+
)))), currentView === "invite" && canManage && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ import_react41.default.createElement("form", { onSubmit: handleInvite, className: "space-y-8", autoComplete: "off" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2201
2210
|
TextInput,
|
|
2202
2211
|
{
|
|
2203
2212
|
label: "Email Address",
|
|
@@ -2206,7 +2215,7 @@ var UniversalMembersPage = ({
|
|
|
2206
2215
|
disabled: isInviting,
|
|
2207
2216
|
placeholder: "developer@acme.com"
|
|
2208
2217
|
}
|
|
2209
|
-
), requireNamesForInvite && /* @__PURE__ */
|
|
2218
|
+
), requireNamesForInvite && /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2210
2219
|
TextInput,
|
|
2211
2220
|
{
|
|
2212
2221
|
label: "First Name",
|
|
@@ -2215,7 +2224,7 @@ var UniversalMembersPage = ({
|
|
|
2215
2224
|
disabled: isInviting,
|
|
2216
2225
|
placeholder: "Jane"
|
|
2217
2226
|
}
|
|
2218
|
-
), /* @__PURE__ */
|
|
2227
|
+
), /* @__PURE__ */ import_react41.default.createElement(
|
|
2219
2228
|
TextInput,
|
|
2220
2229
|
{
|
|
2221
2230
|
label: "Last Name",
|
|
@@ -2224,7 +2233,7 @@ var UniversalMembersPage = ({
|
|
|
2224
2233
|
disabled: isInviting,
|
|
2225
2234
|
placeholder: "Doe"
|
|
2226
2235
|
}
|
|
2227
|
-
)), /* @__PURE__ */
|
|
2236
|
+
)), /* @__PURE__ */ import_react41.default.createElement("div", { className: "pt-8 mt-2" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2228
2237
|
ThreeDActionButton,
|
|
2229
2238
|
{
|
|
2230
2239
|
type: "submit",
|
|
@@ -2233,7 +2242,7 @@ var UniversalMembersPage = ({
|
|
|
2233
2242
|
className: "min-w-40"
|
|
2234
2243
|
},
|
|
2235
2244
|
"Send Invitation"
|
|
2236
|
-
)))), isRoleModalOpen && canChangeRoles && /* @__PURE__ */
|
|
2245
|
+
)))), isRoleModalOpen && canChangeRoles && /* @__PURE__ */ import_react41.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isUpdatingRole && setIsRoleModalOpen(false) }), /* @__PURE__ */ import_react41.default.createElement("div", { ref: dropdownRef, 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__ */ import_react41.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react41.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight" }, "Update Role")), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, availableRoles.map((roleOption) => /* @__PURE__ */ import_react41.default.createElement(
|
|
2237
2246
|
"button",
|
|
2238
2247
|
{
|
|
2239
2248
|
key: roleOption,
|
|
@@ -2241,9 +2250,9 @@ var UniversalMembersPage = ({
|
|
|
2241
2250
|
disabled: isUpdatingRole,
|
|
2242
2251
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedMember?.role === roleOption ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2243
2252
|
},
|
|
2244
|
-
/* @__PURE__ */
|
|
2245
|
-
selectedMember?.role === roleOption && /* @__PURE__ */
|
|
2246
|
-
))), /* @__PURE__ */
|
|
2253
|
+
/* @__PURE__ */ import_react41.default.createElement("span", { className: "truncate pr-2" }, roleOption),
|
|
2254
|
+
selectedMember?.role === roleOption && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-1.5 h-1.5 rounded-full shrink-0 bg-black" })
|
|
2255
|
+
))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2247
2256
|
"button",
|
|
2248
2257
|
{
|
|
2249
2258
|
onClick: () => setIsRoleModalOpen(false),
|
|
@@ -2251,11 +2260,11 @@ var UniversalMembersPage = ({
|
|
|
2251
2260
|
className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
2252
2261
|
},
|
|
2253
2262
|
"Cancel"
|
|
2254
|
-
)))), memberToDelete && canManage && /* @__PURE__ */
|
|
2263
|
+
)))), memberToDelete && canManage && /* @__PURE__ */ import_react41.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isDeleting && setMemberToDelete(null) }), /* @__PURE__ */ import_react41.default.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__ */ import_react41.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react41.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Remove Member"), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to remove this member? They will lose access instantly.")), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react41.default.createElement("button", { onClick: () => setMemberToDelete(null), disabled: isDeleting, className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none" }, "Cancel"), /* @__PURE__ */ import_react41.default.createElement("button", { onClick: handleDelete, disabled: isDeleting, className: "flex-1 py-2 text-[13px] text-red-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center outline-none" }, isDeleting ? /* @__PURE__ */ import_react41.default.createElement(ButtonSpinner3, null) : "Remove")))));
|
|
2255
2264
|
};
|
|
2256
2265
|
|
|
2257
2266
|
// src/components/UniversalProfileSettings.tsx
|
|
2258
|
-
var
|
|
2267
|
+
var import_react43 = __toESM(require("react"));
|
|
2259
2268
|
var import_react_hot_toast6 = __toESM(require("react-hot-toast"));
|
|
2260
2269
|
var UniversalProfileSettings = ({
|
|
2261
2270
|
initialFirstName,
|
|
@@ -2266,10 +2275,10 @@ var UniversalProfileSettings = ({
|
|
|
2266
2275
|
isReadOnly = false,
|
|
2267
2276
|
onSaveProfile
|
|
2268
2277
|
}) => {
|
|
2269
|
-
const [firstName, setFirstName] = (0,
|
|
2270
|
-
const [lastName, setLastName] = (0,
|
|
2271
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
2272
|
-
(0,
|
|
2278
|
+
const [firstName, setFirstName] = (0, import_react43.useState)(initialFirstName);
|
|
2279
|
+
const [lastName, setLastName] = (0, import_react43.useState)(initialLastName);
|
|
2280
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react43.useState)(false);
|
|
2281
|
+
(0, import_react43.useEffect)(() => {
|
|
2273
2282
|
setFirstName(initialFirstName || "");
|
|
2274
2283
|
setLastName(initialLastName || "");
|
|
2275
2284
|
}, [initialFirstName, initialLastName]);
|
|
@@ -2299,7 +2308,7 @@ var UniversalProfileSettings = ({
|
|
|
2299
2308
|
};
|
|
2300
2309
|
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
2301
2310
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
2302
|
-
return /* @__PURE__ */
|
|
2311
|
+
return /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react43.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ import_react43.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit" }, "Read Only Access")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react43.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2303
2312
|
TextInput,
|
|
2304
2313
|
{
|
|
2305
2314
|
label: "First Name",
|
|
@@ -2308,7 +2317,7 @@ var UniversalProfileSettings = ({
|
|
|
2308
2317
|
disabled: isReadOnly || isSubmitting,
|
|
2309
2318
|
placeholder: "System"
|
|
2310
2319
|
}
|
|
2311
|
-
)), /* @__PURE__ */
|
|
2320
|
+
)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2312
2321
|
TextInput,
|
|
2313
2322
|
{
|
|
2314
2323
|
label: "Last Name",
|
|
@@ -2317,7 +2326,7 @@ var UniversalProfileSettings = ({
|
|
|
2317
2326
|
disabled: isReadOnly || isSubmitting,
|
|
2318
2327
|
placeholder: "Admin"
|
|
2319
2328
|
}
|
|
2320
|
-
))), /* @__PURE__ */
|
|
2329
|
+
))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2321
2330
|
TextInput,
|
|
2322
2331
|
{
|
|
2323
2332
|
label: "Email ID",
|
|
@@ -2326,7 +2335,7 @@ var UniversalProfileSettings = ({
|
|
|
2326
2335
|
},
|
|
2327
2336
|
disabled: true
|
|
2328
2337
|
}
|
|
2329
|
-
), /* @__PURE__ */
|
|
2338
|
+
), /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Account Status"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-xs text-black block truncate" }, accountStatus)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Member Since"), /* @__PURE__ */ import_react43.default.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__ */ import_react43.default.createElement("div", { className: "flex flex-col-reverse sm:flex-row items-center gap-3 sm:gap-4 w-full sm:w-auto shrink-0" }, hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react43.default.createElement(
|
|
2330
2339
|
"button",
|
|
2331
2340
|
{
|
|
2332
2341
|
type: "button",
|
|
@@ -2337,7 +2346,7 @@ var UniversalProfileSettings = ({
|
|
|
2337
2346
|
className: "text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
2338
2347
|
},
|
|
2339
2348
|
"Cancel"
|
|
2340
|
-
), /* @__PURE__ */
|
|
2349
|
+
), /* @__PURE__ */ import_react43.default.createElement(
|
|
2341
2350
|
ThreeDActionButton,
|
|
2342
2351
|
{
|
|
2343
2352
|
type: "submit",
|
|
@@ -2350,11 +2359,11 @@ var UniversalProfileSettings = ({
|
|
|
2350
2359
|
};
|
|
2351
2360
|
|
|
2352
2361
|
// src/components/UniversalBillingPage.tsx
|
|
2353
|
-
var
|
|
2354
|
-
var
|
|
2355
|
-
var
|
|
2356
|
-
var PageSpinner3 = () => /* @__PURE__ */
|
|
2357
|
-
var ButtonSpinner4 = () => /* @__PURE__ */
|
|
2362
|
+
var import_react44 = __toESM(require("react"));
|
|
2363
|
+
var import_react45 = require("@hugeicons/react");
|
|
2364
|
+
var import_core_free_icons11 = require("@hugeicons/core-free-icons");
|
|
2365
|
+
var PageSpinner3 = () => /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.Loading03Icon, size: 32, className: "animate-spin mb-4 text-neutral-400" }));
|
|
2366
|
+
var ButtonSpinner4 = () => /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.Loading03Icon, size: 16, className: "animate-spin text-neutral-500" });
|
|
2358
2367
|
var formatDate = (dateString) => {
|
|
2359
2368
|
if (!dateString) return "N/A";
|
|
2360
2369
|
return new Date(dateString).toLocaleDateString("en-US", {
|
|
@@ -2396,13 +2405,13 @@ var UniversalBillingPage = ({
|
|
|
2396
2405
|
onPayInvoice,
|
|
2397
2406
|
onUpdateInvoiceStatus
|
|
2398
2407
|
}) => {
|
|
2399
|
-
const [currentView, setCurrentView] = (0,
|
|
2400
|
-
const [selectedInvoice, setSelectedInvoice] = (0,
|
|
2401
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2402
|
-
const [isPaying, setIsPaying] = (0,
|
|
2403
|
-
const [isActionModalOpen, setIsActionModalOpen] = (0,
|
|
2404
|
-
const [isUpdating, setIsUpdating] = (0,
|
|
2405
|
-
const [twoFactorCode, setTwoFactorCode] = (0,
|
|
2408
|
+
const [currentView, setCurrentView] = (0, import_react44.useState)("list");
|
|
2409
|
+
const [selectedInvoice, setSelectedInvoice] = (0, import_react44.useState)(null);
|
|
2410
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react44.useState)(false);
|
|
2411
|
+
const [isPaying, setIsPaying] = (0, import_react44.useState)(false);
|
|
2412
|
+
const [isActionModalOpen, setIsActionModalOpen] = (0, import_react44.useState)(false);
|
|
2413
|
+
const [isUpdating, setIsUpdating] = (0, import_react44.useState)(false);
|
|
2414
|
+
const [twoFactorCode, setTwoFactorCode] = (0, import_react44.useState)("");
|
|
2406
2415
|
const handlePayment = async () => {
|
|
2407
2416
|
if (!selectedInvoice || isReadOnly || !onPayInvoice || isPaying) return;
|
|
2408
2417
|
setIsPaying(true);
|
|
@@ -2429,14 +2438,14 @@ var UniversalBillingPage = ({
|
|
|
2429
2438
|
setIsUpdating(false);
|
|
2430
2439
|
}
|
|
2431
2440
|
};
|
|
2432
|
-
return /* @__PURE__ */
|
|
2441
|
+
return /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex max-w-3xl rounded-2xl bg-white p-6 flex-col gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react44.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0 w-full" }, /* @__PURE__ */ import_react44.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 truncate mb-6" }, headerDescription), showSearchAndFilter && onSearchChange && onTimeframeChange && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row gap-4 mb-4" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2433
2442
|
TextInput,
|
|
2434
2443
|
{
|
|
2435
2444
|
placeholder: "Search by ID or Name...",
|
|
2436
2445
|
value: searchQuery,
|
|
2437
2446
|
onChange: onSearchChange
|
|
2438
2447
|
}
|
|
2439
|
-
), /* @__PURE__ */
|
|
2448
|
+
), /* @__PURE__ */ import_react44.default.createElement(
|
|
2440
2449
|
"button",
|
|
2441
2450
|
{
|
|
2442
2451
|
type: "button",
|
|
@@ -2444,10 +2453,10 @@ var UniversalBillingPage = ({
|
|
|
2444
2453
|
className: "px-4 py-3 text-sm bg-transparent border-b border-neutral-100 text-black outline-none focus:border-black shrink-0 text-left"
|
|
2445
2454
|
},
|
|
2446
2455
|
timeframe === "ALL" ? "All Time" : timeframe === "24H" ? "Past 24 Hours" : timeframe === "7D" ? "Past 7 Days" : "Past 30 Days"
|
|
2447
|
-
))) : /* @__PURE__ */
|
|
2456
|
+
))) : /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowLeft01Icon, size: 12 }), " Back")), isReadOnly && currentView === "list" && /* @__PURE__ */ import_react44.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit" }, "Read Only Access")), currentView === "list" && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-8 w-full" }, (metricPrimaryLabel || metricSecondaryLabel) && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between sm:items-start pb-8 border-b border-neutral-100 gap-6 sm:gap-0" }, metricPrimaryLabel && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricPrimaryLabel), /* @__PURE__ */ import_react44.default.createElement("div", { className: "text-xl text-black tracking-tight truncate" }, formatNaira(metricPrimaryValue)), metricPrimarySubtext && /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricPrimarySubtext)), metricSecondaryLabel && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0 sm:text-right" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricSecondaryLabel), /* @__PURE__ */ import_react44.default.createElement("div", { className: "text-xl text-emerald-600 tracking-tight truncate" }, formatNaira(metricSecondaryValue)), metricSecondarySubtext && /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricSecondarySubtext))), !isReadOnly && showBillingOverview && /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-8 sm:gap-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Billing Status"), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center gap-2 min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: `w-2 h-2 rounded-full shrink-0 ${billingStatus === "ACTIVE" ? "bg-green-500" : "bg-neutral-300"}` }), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-black tracking-widest truncate" }, billingStatus || "UNKNOWN"))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Next Billing Date"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black truncate" }, formatDate(nextBillingDate))), lastPaidDate && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Last Paid Date"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-neutral-600 truncate" }, formatDate(lastPaidDate)))), !isReadOnly && showUsageMetrics && usageMetrics.length > 0 && /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 truncate block uppercase" }, "Usage & Limits"), /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement("div", { key: idx, className: "flex justify-between border-b border-neutral-50 pb-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-neutral-500 text-xs" }, metric.label), /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-xs text-black" }, metric.value))))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-4 truncate block uppercase" }, "Transaction History"), isLoading ? /* @__PURE__ */ import_react44.default.createElement(PageSpinner3, null) : invoices.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, "No records found.")) : /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "divide-y divide-neutral-100" }, invoices.map((inv) => /* @__PURE__ */ import_react44.default.createElement("div", { key: inv.id, onClick: () => {
|
|
2448
2457
|
setSelectedInvoice(inv);
|
|
2449
2458
|
setCurrentView("details");
|
|
2450
|
-
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */
|
|
2459
|
+
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-1 min-w-0 flex-1" }, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, inv.name), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, inv.subtext)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black" }, formatNaira(inv.amountDue)), /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement("div", { className: "flex items-center justify-between pt-4 mt-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowRight01Icon, size: 14 })))))))), currentView === "details" && selectedInvoice && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-2xl animate-in fade-in duration-300" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-6 w-full" }, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Breakdown"), /* @__PURE__ */ import_react44.default.createElement("h2", { className: " font-serif text-xl text-black mb-1" }, selectedInvoice.name), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500" }, "Generated on ", formatDate(selectedInvoice.createdAt))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 p-6 sm:p-8 rounded-2xl border border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Amount"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xl text-black" }, formatNaira(selectedInvoice.amountDue))), /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Status"), isModMode ? /* @__PURE__ */ import_react44.default.createElement(
|
|
2451
2460
|
"button",
|
|
2452
2461
|
{
|
|
2453
2462
|
onClick: () => !isUpdating && setIsActionModalOpen(true),
|
|
@@ -2455,8 +2464,8 @@ var UniversalBillingPage = ({
|
|
|
2455
2464
|
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-100 hover:bg-neutral-50"}`
|
|
2456
2465
|
},
|
|
2457
2466
|
selectedInvoice.status,
|
|
2458
|
-
isUpdating ? /* @__PURE__ */
|
|
2459
|
-
) : /* @__PURE__ */
|
|
2467
|
+
isUpdating ? /* @__PURE__ */ import_react44.default.createElement(ButtonSpinner4, null) : /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2468
|
+
) : /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement("div", { className: "md:col-span-2 pt-4 border-t border-neutral-100/60 mt-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Reference ID"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 bg-white px-3 py-2 rounded-full border border-neutral-100 inline-block" }, selectedInvoice.id))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-end gap-4 pt-4" }, !isModMode && selectedInvoice.status === "SCHEDULED" && onPayInvoice && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-end gap-2 w-full sm:w-auto" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2460
2469
|
ThreeDActionButton,
|
|
2461
2470
|
{
|
|
2462
2471
|
onClick: handlePayment,
|
|
@@ -2465,12 +2474,12 @@ var UniversalBillingPage = ({
|
|
|
2465
2474
|
className: "w-full sm:w-auto"
|
|
2466
2475
|
},
|
|
2467
2476
|
"Pay Invoice"
|
|
2468
|
-
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */
|
|
2477
|
+
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[11px] tracking-widest text-emerald-600 px-6 py-3 bg-emerald-50 rounded-full" }, "Invoice Completed")))), isTimeframeModalOpen && showSearchAndFilter && onTimeframeChange && /* @__PURE__ */ import_react44.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Select Timeframe"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[12px] text-neutral-500" }, "Choose the range of transactions to display.")), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, [
|
|
2469
2478
|
{ value: "ALL", label: "All Time" },
|
|
2470
2479
|
{ value: "24H", label: "Past 24 Hours" },
|
|
2471
2480
|
{ value: "7D", label: "Past 7 Days" },
|
|
2472
2481
|
{ value: "30D", label: "Past 30 Days" }
|
|
2473
|
-
].map((option) => /* @__PURE__ */
|
|
2482
|
+
].map((option) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2474
2483
|
"button",
|
|
2475
2484
|
{
|
|
2476
2485
|
key: option.value,
|
|
@@ -2481,9 +2490,9 @@ var UniversalBillingPage = ({
|
|
|
2481
2490
|
},
|
|
2482
2491
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${timeframe === option.value ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2483
2492
|
},
|
|
2484
|
-
/* @__PURE__ */
|
|
2485
|
-
timeframe === option.value && /* @__PURE__ */
|
|
2486
|
-
))), /* @__PURE__ */
|
|
2493
|
+
/* @__PURE__ */ import_react44.default.createElement("span", { className: "truncate pr-2" }, option.label),
|
|
2494
|
+
timeframe === option.value && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2495
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setIsTimeframeModalOpen(false), className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none" }, "Cancel")))), isActionModalOpen && isModMode && /* @__PURE__ */ import_react44.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isUpdating && setIsActionModalOpen(false) }), /* @__PURE__ */ import_react44.default.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__ */ import_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Update Invoice Status"), /* @__PURE__ */ import_react44.default.createElement(
|
|
2487
2496
|
TextInput,
|
|
2488
2497
|
{
|
|
2489
2498
|
placeholder: "Enter 2FA Code...",
|
|
@@ -2491,7 +2500,7 @@ var UniversalBillingPage = ({
|
|
|
2491
2500
|
onChange: setTwoFactorCode,
|
|
2492
2501
|
type: "password"
|
|
2493
2502
|
}
|
|
2494
|
-
)), /* @__PURE__ */
|
|
2503
|
+
)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, ["SCHEDULED", "PAID", "FAILED", "CANCELED"].map((statusOption) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2495
2504
|
"button",
|
|
2496
2505
|
{
|
|
2497
2506
|
key: statusOption,
|
|
@@ -2499,15 +2508,15 @@ var UniversalBillingPage = ({
|
|
|
2499
2508
|
disabled: isUpdating || !twoFactorCode,
|
|
2500
2509
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedInvoice?.status === statusOption ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2501
2510
|
},
|
|
2502
|
-
/* @__PURE__ */
|
|
2503
|
-
selectedInvoice?.status === statusOption && /* @__PURE__ */
|
|
2504
|
-
))), /* @__PURE__ */
|
|
2511
|
+
/* @__PURE__ */ import_react44.default.createElement("span", { className: "truncate pr-2" }, statusOption),
|
|
2512
|
+
selectedInvoice?.status === statusOption && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2513
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setIsActionModalOpen(false), disabled: isUpdating, className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none" }, "Cancel")))));
|
|
2505
2514
|
};
|
|
2506
2515
|
|
|
2507
2516
|
// src/components/UniversalDashboardPage.tsx
|
|
2508
|
-
var
|
|
2509
|
-
var
|
|
2510
|
-
var
|
|
2517
|
+
var import_react46 = __toESM(require("react"));
|
|
2518
|
+
var import_react47 = require("@hugeicons/react");
|
|
2519
|
+
var import_core_free_icons12 = require("@hugeicons/core-free-icons");
|
|
2511
2520
|
var UniversalDashboardPage = ({
|
|
2512
2521
|
headerTitle,
|
|
2513
2522
|
headerDescription,
|
|
@@ -2518,20 +2527,20 @@ var UniversalDashboardPage = ({
|
|
|
2518
2527
|
lists,
|
|
2519
2528
|
isLoading = false
|
|
2520
2529
|
}) => {
|
|
2521
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2530
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react46.useState)(false);
|
|
2522
2531
|
const selectedTimeframe = timeframes.find((t) => t.id === activeTimeframe) || timeframes[0];
|
|
2523
2532
|
if (isLoading) {
|
|
2524
|
-
return /* @__PURE__ */
|
|
2533
|
+
return /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react46.default.createElement(import_react47.HugeiconsIcon, { icon: import_core_free_icons12.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2525
2534
|
}
|
|
2526
|
-
return /* @__PURE__ */
|
|
2535
|
+
return /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react46.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4" }, /* @__PURE__ */ import_react46.default.createElement("div", null, /* @__PURE__ */ import_react46.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), timeframes.length > 0 && selectedTimeframe && onTimeframeChange && /* @__PURE__ */ import_react46.default.createElement(
|
|
2527
2536
|
"button",
|
|
2528
2537
|
{
|
|
2529
2538
|
onClick: () => setIsTimeframeModalOpen(true),
|
|
2530
2539
|
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"
|
|
2531
2540
|
},
|
|
2532
|
-
/* @__PURE__ */
|
|
2533
|
-
/* @__PURE__ */
|
|
2534
|
-
)), stats.length > 0 && /* @__PURE__ */
|
|
2541
|
+
/* @__PURE__ */ import_react46.default.createElement("span", null, selectedTimeframe.label),
|
|
2542
|
+
/* @__PURE__ */ import_react46.default.createElement(import_react47.HugeiconsIcon, { icon: import_core_free_icons12.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2543
|
+
)), stats.length > 0 && /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react46.default.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__ */ import_react46.default.createElement("div", { key: idx, className: "p-6 flex flex-col gap-1 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react46.default.createElement("p", { className: `text-xl tracking-tight truncate ${stat.valueClass || "text-black"}` }, stat.value))))), lists.length > 0 && /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col gap-8 w-full max-w-4xl" }, lists.map((list, idx) => /* @__PURE__ */ import_react46.default.createElement("div", { key: idx, className: "bg-white rounded-2xl p-6 flex flex-col min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "text-neutral-400" }, list.icon), /* @__PURE__ */ import_react46.default.createElement("h2", { className: " font-serif text-[11px] text-black tracking-[0.2em] uppercase" }, list.title)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1 overflow-y-auto" }, list.items.length === 0 ? /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, list.emptyMessage) : list.items.map((item) => /* @__PURE__ */ import_react46.default.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__ */ import_react46.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.primaryText), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-[10px] text-neutral-500 truncate tracking-widest mt-0.5" }, item.secondaryText)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex items-center gap-4 shrink-0 pl-4" }, item.rightText && /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-black" }, item.rightText), item.rightBadge && /* @__PURE__ */ import_react46.default.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__ */ import_react46.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react46.default.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__ */ import_react46.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react46.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight" }, "Select Timeframe")), /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, timeframes.map((tf) => /* @__PURE__ */ import_react46.default.createElement(
|
|
2535
2544
|
"button",
|
|
2536
2545
|
{
|
|
2537
2546
|
key: tf.id,
|
|
@@ -2541,9 +2550,9 @@ var UniversalDashboardPage = ({
|
|
|
2541
2550
|
},
|
|
2542
2551
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeTimeframe === tf.id ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2543
2552
|
},
|
|
2544
|
-
/* @__PURE__ */
|
|
2545
|
-
activeTimeframe === tf.id && /* @__PURE__ */
|
|
2546
|
-
))), /* @__PURE__ */
|
|
2553
|
+
/* @__PURE__ */ import_react46.default.createElement("span", { className: "truncate pr-2" }, tf.label),
|
|
2554
|
+
activeTimeframe === tf.id && /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2555
|
+
))), /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full flex border-t border-neutral-50" }, /* @__PURE__ */ import_react46.default.createElement(
|
|
2547
2556
|
"button",
|
|
2548
2557
|
{
|
|
2549
2558
|
onClick: () => setIsTimeframeModalOpen(false),
|
|
@@ -2554,9 +2563,9 @@ var UniversalDashboardPage = ({
|
|
|
2554
2563
|
};
|
|
2555
2564
|
|
|
2556
2565
|
// src/components/UniversalAgentConsole.tsx
|
|
2557
|
-
var
|
|
2558
|
-
var
|
|
2559
|
-
var
|
|
2566
|
+
var import_react48 = __toESM(require("react"));
|
|
2567
|
+
var import_react49 = require("@hugeicons/react");
|
|
2568
|
+
var import_core_free_icons13 = require("@hugeicons/core-free-icons");
|
|
2560
2569
|
var formatKeyName = (key) => key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
2561
2570
|
var toTitleCaseSafe = (str) => {
|
|
2562
2571
|
if (!str) return "";
|
|
@@ -2585,13 +2594,13 @@ var UniversalAgentConsole = ({
|
|
|
2585
2594
|
onUploadArchives,
|
|
2586
2595
|
onDeleteArchive
|
|
2587
2596
|
}) => {
|
|
2588
|
-
const archiveRef = (0,
|
|
2589
|
-
const [pendingFiles, setPendingFiles] = (0,
|
|
2590
|
-
const [isUploading, setIsUploading] = (0,
|
|
2591
|
-
const [isActioning, setIsActioning] = (0,
|
|
2592
|
-
const [actionModal, setActionModal] = (0,
|
|
2593
|
-
const [actionMessage, setActionMessage] = (0,
|
|
2594
|
-
const [archiveToDelete, setArchiveToDelete] = (0,
|
|
2597
|
+
const archiveRef = (0, import_react48.useRef)(null);
|
|
2598
|
+
const [pendingFiles, setPendingFiles] = (0, import_react48.useState)([]);
|
|
2599
|
+
const [isUploading, setIsUploading] = (0, import_react48.useState)(false);
|
|
2600
|
+
const [isActioning, setIsActioning] = (0, import_react48.useState)(false);
|
|
2601
|
+
const [actionModal, setActionModal] = (0, import_react48.useState)(null);
|
|
2602
|
+
const [actionMessage, setActionMessage] = (0, import_react48.useState)("");
|
|
2603
|
+
const [archiveToDelete, setArchiveToDelete] = (0, import_react48.useState)(null);
|
|
2595
2604
|
const handleFileSelect = (e) => {
|
|
2596
2605
|
if (e.target.files && e.target.files.length > 0) {
|
|
2597
2606
|
setPendingFiles((prev) => [...prev, ...Array.from(e.target.files)]);
|
|
@@ -2620,36 +2629,36 @@ var UniversalAgentConsole = ({
|
|
|
2620
2629
|
}
|
|
2621
2630
|
};
|
|
2622
2631
|
const DynamicArrayAccordion = ({ items, parentKey }) => {
|
|
2623
|
-
const [activeFAQ, setActiveFAQ] = (0,
|
|
2624
|
-
return /* @__PURE__ */
|
|
2632
|
+
const [activeFAQ, setActiveFAQ] = (0, import_react48.useState)(null);
|
|
2633
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col relative z-10 bg-transparent w-full mt-2 border-t border-neutral-100" }, items.map((item, index) => {
|
|
2625
2634
|
const isOpen = activeFAQ === index;
|
|
2626
2635
|
let label = `${parentKey ? formatKeyName(parentKey) : "Item"} ${index + 1}`;
|
|
2627
2636
|
if (item.fullName) label = toTitleCaseSafe(item.fullName);
|
|
2628
2637
|
else if (item.role) label = item.role;
|
|
2629
2638
|
else if (item.proposedName) label = toTitleCaseSafe(item.proposedName);
|
|
2630
|
-
return /* @__PURE__ */
|
|
2639
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { key: index, className: `transition-all duration-300 ${index !== items.length - 1 ? "border-b border-neutral-100" : ""}` }, /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("span", { className: `text-[13px] md:text-[14px] transition-colors ${isOpen ? "text-black" : "text-neutral-700 group-hover:text-black"}` }, label), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowDown01Icon, size: 16 }))), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "pt-2 flex flex-col gap-3 pr-4 md:pr-12" }, renderDynamicObject(item)))));
|
|
2631
2640
|
}));
|
|
2632
2641
|
};
|
|
2633
2642
|
const renderValue = (key, value) => {
|
|
2634
2643
|
if (value === null || value === void 0 || value === "") return null;
|
|
2635
2644
|
if (typeof value === "string") {
|
|
2636
|
-
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */
|
|
2637
|
-
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */
|
|
2638
|
-
return /* @__PURE__ */
|
|
2645
|
+
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */ import_react48.default.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-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors w-fit outline-none mt-2" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Download01Icon, size: 14 }), " Download File");
|
|
2646
|
+
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(value));
|
|
2647
|
+
return /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, value);
|
|
2639
2648
|
}
|
|
2640
2649
|
if (Array.isArray(value)) {
|
|
2641
2650
|
const validItems = value.filter((item) => item !== null && item !== void 0 && item !== "");
|
|
2642
2651
|
if (validItems.length === 0) return null;
|
|
2643
|
-
if (typeof validItems[0] === "string") return /* @__PURE__ */
|
|
2644
|
-
return /* @__PURE__ */
|
|
2652
|
+
if (typeof validItems[0] === "string") return /* @__PURE__ */ import_react48.default.createElement("ul", { className: "list-disc pl-4 mt-1" }, validItems.map((v, i) => /* @__PURE__ */ import_react48.default.createElement("li", { key: i, className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(v))));
|
|
2653
|
+
return /* @__PURE__ */ import_react48.default.createElement(DynamicArrayAccordion, { items: validItems, parentKey: key });
|
|
2645
2654
|
}
|
|
2646
2655
|
if (typeof value === "object") {
|
|
2647
2656
|
if (Object.keys(value).length === 0) return null;
|
|
2648
2657
|
const renderedObj = renderDynamicObject(value);
|
|
2649
2658
|
if (!renderedObj || Array.isArray(renderedObj) && renderedObj.length === 0) return null;
|
|
2650
|
-
return /* @__PURE__ */
|
|
2659
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-3 mt-1 w-full border-l border-neutral-100 pl-4 py-2" }, renderedObj);
|
|
2651
2660
|
}
|
|
2652
|
-
return /* @__PURE__ */
|
|
2661
|
+
return /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-sm text-black" }, String(value));
|
|
2653
2662
|
};
|
|
2654
2663
|
const renderDynamicObject = (obj) => {
|
|
2655
2664
|
if (!obj) return null;
|
|
@@ -2660,22 +2669,22 @@ var UniversalAgentConsole = ({
|
|
|
2660
2669
|
return true;
|
|
2661
2670
|
});
|
|
2662
2671
|
if (entries.length === 0) return null;
|
|
2663
|
-
return entries.map(([k, v]) => /* @__PURE__ */
|
|
2672
|
+
return entries.map(([k, v]) => /* @__PURE__ */ import_react48.default.createElement("div", { key: k, className: "flex flex-col items-start min-w-0 wrap-break-word w-full mb-3 last:mb-0" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 uppercase" }, formatKeyName(k)), renderValue(k, v)));
|
|
2664
2673
|
};
|
|
2665
|
-
return /* @__PURE__ */
|
|
2674
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react48.default.createElement(ManagedToaster, null), currentView === "list" && /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-start gap-1" }, /* @__PURE__ */ import_react48.default.createElement("h1", { className: " font-serif text-xl text-black tracking-tight" }, headerTitle), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-500" }, headerDescription)), stats.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-100 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xl text-black tracking-tight truncate" }, stat.value)))))), tabs.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-6" }, tabs.map((tab) => /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "w-full bg-white rounded-2xl max-w-3xl overflow-hidden flex flex-col min-h-100" }, isLoadingList ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Loading03Icon, size: 32, className: "animate-spin text-black" })) : listData.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex-1 flex justify-center items-center text-neutral-500 text-sm py-20" }, "No matching applications found.")) : /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1" }, listData.map((item) => /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.title), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 truncate mt-1" }, item.subtitle)), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("span", { className: "text-[10px] text-neutral-400 mt-1" }, item.date))))), totalPages > 1 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center justify-between p-5 bg-neutral-50/50" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowRight01Icon, size: 14 }))))))), currentView === "details" && selectedApp && /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "flex items-center justify-between gap-4 pb-6" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => {
|
|
2666
2675
|
onBackToList();
|
|
2667
2676
|
setPendingFiles([]);
|
|
2668
|
-
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */
|
|
2677
|
+
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowLeft01Icon, size: 14 }), " Back to List"), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-2 mb-8" }, /* @__PURE__ */ import_react48.default.createElement("h2", { className: " font-serif text-xl text-black tracking-tight" }, selectedApp.name || selectedApp.title), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-5" }, renderDynamicObject(selectedApp.metadata)) : selectedApp.agentId === currentAgentId ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-5" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-500" }, "No application data extracted.")) : null, selectedApp.agentId && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-4 pt-8 mt-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-1 mb-4" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-sm text-black" }, "Official Archives"), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.File02Icon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, arch.name)), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setArchiveToDelete(arch), className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Delete02Icon, size: 16 })))), pendingFiles.map((file, idx) => /* @__PURE__ */ import_react48.default.createElement("div", { key: idx, className: "flex items-center justify-between text-neutral-600 text-sm w-full" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.AttachmentIcon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, file.name)), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Cancel01Icon, size: 16 })))), /* @__PURE__ */ import_react48.default.createElement("input", { type: "file", multiple: true, ref: archiveRef, onChange: handleFileSelect, className: "hidden", accept: "application/pdf,image/*" }), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => archiveRef.current?.click(), disabled: selectedApp.status !== "COMPLETED" || isUploading, className: "flex items-center justify-center gap-3 p-4 border border-neutral-100 rounded-full hover:bg-neutral-50 transition-colors text-black text-sm w-full outline-none disabled:opacity-50" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Upload01Icon, size: 18, className: "text-neutral-400" }), " Select Files to Upload"), pendingFiles.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full sm:w-auto shrink-0" }, /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: executeUpload, disabled: isUploading, isLoading: isUploading, className: "w-full sm:w-auto" }, "Upload ", pendingFiles.length, " File(s)")))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 mt-8 pt-6" }, !selectedApp.agentId ? /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2669
2678
|
setIsActioning(true);
|
|
2670
2679
|
await onAcceptApplication(selectedApp.id);
|
|
2671
2680
|
setIsActioning(false);
|
|
2672
|
-
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */
|
|
2681
|
+
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full p-4 border border-red-100 bg-red-50/30 rounded-xl flex items-start gap-3" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Cancel01Icon, size: 16, className: "text-red-500 shrink-0 mt-0.5" }), /* @__PURE__ */ import_react48.default.createElement("div", null, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-red-700" }, "Application Taken"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-red-600 mt-1" }, "Currently handled by ", selectedApp.agentName || "another agent", "."))) : /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex flex-col sm:flex-row items-center gap-4 justify-between" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, "You are the assigned agent."), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-end gap-3 w-full sm:w-auto" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setActionModal("query"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Query"), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setActionModal("reject"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Reject"), /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: () => setActionModal("success"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto" }, "Mark Success"))))), actionModal && /* @__PURE__ */ import_react48.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setActionModal(null) }), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-lg text-black tracking-tight capitalize mb-2" }, actionModal === "success" ? "Complete Application" : `${actionModal} Application`), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "p-6 pb-2" }, /* @__PURE__ */ import_react48.default.createElement(TextInput, { label: "Reason for Action", value: actionMessage, onChange: setActionMessage, placeholder: "Enter your reason here...", disabled: isActioning })), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center p-6 pt-4 gap-3" }, /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2673
2682
|
setIsActioning(true);
|
|
2674
2683
|
await onUpdateStatus(selectedApp.id, actionModal === "success" ? "COMPLETED" : actionModal === "reject" ? "REJECTED" : "QUEUED", actionMessage);
|
|
2675
2684
|
setIsActioning(false);
|
|
2676
2685
|
setActionModal(null);
|
|
2677
2686
|
setActionMessage("");
|
|
2678
|
-
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */
|
|
2687
|
+
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */ import_react48.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setArchiveToDelete(null) }), /* @__PURE__ */ import_react48.default.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__ */ import_react48.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-lg text-black tracking-tight mb-2" }, "Delete Document?"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, 'Are you sure you want to permanently delete "', archiveToDelete.name, '"?')), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center p-6 gap-3" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setArchiveToDelete(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__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2679
2688
|
setIsActioning(true);
|
|
2680
2689
|
await onDeleteArchive(selectedApp.id, archiveToDelete.id);
|
|
2681
2690
|
setIsActioning(false);
|
|
@@ -2684,7 +2693,7 @@ var UniversalAgentConsole = ({
|
|
|
2684
2693
|
};
|
|
2685
2694
|
|
|
2686
2695
|
// src/components/UniversalOverviewPage.tsx
|
|
2687
|
-
var
|
|
2696
|
+
var import_react50 = __toESM(require("react"));
|
|
2688
2697
|
var UniversalOverviewPage = ({
|
|
2689
2698
|
headerTitle,
|
|
2690
2699
|
headerDescription,
|
|
@@ -2694,7 +2703,7 @@ var UniversalOverviewPage = ({
|
|
|
2694
2703
|
primaryAction,
|
|
2695
2704
|
alerts = []
|
|
2696
2705
|
}) => {
|
|
2697
|
-
return /* @__PURE__ */
|
|
2706
|
+
return /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react50.default.createElement("div", null, /* @__PURE__ */ import_react50.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription))), quickStats.length > 0 && /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden max-w-3xl bg-white" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, quickStats.map((stat, idx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-100 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ import_react50.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-lg md:text-xl text-black tracking-tight truncate" }, stat.value)))))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "p-6 sm:p-8 flex flex-col h-full min-w-0 gap-6" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4 border-b border-neutral-100 pb-4" }, /* @__PURE__ */ import_react50.default.createElement("h3", { className: " font-serif text-[11px] text-black tracking-[0.2em] uppercase" }, detailsTitle), primaryAction && (primaryAction.href ? /* @__PURE__ */ import_react50.default.createElement(
|
|
2698
2707
|
ThreeDButton,
|
|
2699
2708
|
{
|
|
2700
2709
|
href: primaryAction.href,
|
|
@@ -2703,7 +2712,7 @@ var UniversalOverviewPage = ({
|
|
|
2703
2712
|
},
|
|
2704
2713
|
primaryAction.label,
|
|
2705
2714
|
primaryAction.icon
|
|
2706
|
-
) : /* @__PURE__ */
|
|
2715
|
+
) : /* @__PURE__ */ import_react50.default.createElement(
|
|
2707
2716
|
ThreeDActionButton,
|
|
2708
2717
|
{
|
|
2709
2718
|
onClick: primaryAction.onClick,
|
|
@@ -2712,19 +2721,19 @@ var UniversalOverviewPage = ({
|
|
|
2712
2721
|
},
|
|
2713
2722
|
primaryAction.label,
|
|
2714
2723
|
primaryAction.icon
|
|
2715
|
-
))), /* @__PURE__ */
|
|
2724
|
+
))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-8" }, details.map((detail, idx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: "min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1.5 uppercase" }, detail.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[13px] text-black truncate" }, detail.value)))), alerts.map((alert, idx) => {
|
|
2716
2725
|
const bgClass = alert.type === "warning" ? "bg-amber-50/50" : alert.type === "info" ? "bg-blue-50/50" : "bg-red-50/50";
|
|
2717
2726
|
const textClass = alert.type === "warning" ? "text-amber-600" : alert.type === "info" ? "text-blue-600" : "text-red-600";
|
|
2718
2727
|
const valClass = alert.type === "warning" ? "text-amber-700" : alert.type === "info" ? "text-blue-700" : "text-red-700";
|
|
2719
2728
|
const lblClass = alert.type === "warning" ? "text-amber-400" : alert.type === "info" ? "text-blue-400" : "text-red-400";
|
|
2720
|
-
return /* @__PURE__ */
|
|
2729
|
+
return /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: `mt-4 p-5 rounded-xl flex flex-col gap-4 ${bgClass}` }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react50.default.createElement("span", { className: `text-[11px] tracking-widest uppercase ${textClass}` }, alert.title)), alert.items.map((item, itemIdx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: itemIdx }, /* @__PURE__ */ import_react50.default.createElement("span", { className: `text-[10px] tracking-[0.2em] block mb-1 uppercase ${lblClass}` }, item.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: `text-[13px] leading-relaxed ${valClass}` }, item.text))));
|
|
2721
2730
|
}))));
|
|
2722
2731
|
};
|
|
2723
2732
|
|
|
2724
2733
|
// src/components/UniversalErrorView.tsx
|
|
2725
|
-
var
|
|
2726
|
-
var
|
|
2727
|
-
var
|
|
2734
|
+
var import_react51 = __toESM(require("react"));
|
|
2735
|
+
var import_react52 = require("@hugeicons/react");
|
|
2736
|
+
var import_core_free_icons14 = require("@hugeicons/core-free-icons");
|
|
2728
2737
|
var UniversalErrorView = ({
|
|
2729
2738
|
isBooting,
|
|
2730
2739
|
isLoading,
|
|
@@ -2736,7 +2745,7 @@ var UniversalErrorView = ({
|
|
|
2736
2745
|
returnLabel = "Return to Workspace"
|
|
2737
2746
|
}) => {
|
|
2738
2747
|
if (isBooting || isLoading && !activeData) {
|
|
2739
|
-
return /* @__PURE__ */
|
|
2748
|
+
return /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex items-center justify-center h-screen w-full bg-transparent" }, /* @__PURE__ */ import_react51.default.createElement(PageSpinner, null));
|
|
2740
2749
|
}
|
|
2741
2750
|
if (!isLoading && (!activeData || activeError)) {
|
|
2742
2751
|
const errorString = typeof activeError === "string" ? activeError : JSON.stringify(activeError || "");
|
|
@@ -2747,7 +2756,7 @@ var UniversalErrorView = ({
|
|
|
2747
2756
|
const apiMessage = typeof activeError === "string" && activeError.trim() !== "" ? activeError : null;
|
|
2748
2757
|
let title = "Oops Connection Error";
|
|
2749
2758
|
let description = apiMessage || `We could not load your request. Please check your connection and try again.`;
|
|
2750
|
-
let IconComponent =
|
|
2759
|
+
let IconComponent = import_core_free_icons14.ConfusedIcon;
|
|
2751
2760
|
if (isNotFoundError) {
|
|
2752
2761
|
title = "Oops its not your fault";
|
|
2753
2762
|
description = apiMessage || `We could not reach the ${envName} you just loaded. Our team has been notified.`;
|
|
@@ -2755,7 +2764,7 @@ var UniversalErrorView = ({
|
|
|
2755
2764
|
title = "Access Restricted";
|
|
2756
2765
|
description = apiMessage || `You have insufficient permissions to view this ${envName}. Please contact your administrator.`;
|
|
2757
2766
|
}
|
|
2758
|
-
return /* @__PURE__ */
|
|
2767
|
+
return /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 animate-in fade-in duration-500" }, /* @__PURE__ */ import_react51.default.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ import_react51.default.createElement(import_react52.HugeiconsIcon, { icon: IconComponent, size: 48, className: "text-neutral-300" })), /* @__PURE__ */ import_react51.default.createElement("h2", { className: " font-serif text-lg text-black tracking-tight " }, title), /* @__PURE__ */ import_react51.default.createElement("p", { className: "text-xs mt-2 mb-8 text-neutral-500 max-w-sm text-center leading-relaxed" }, description), /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full justify-center sm:w-auto" }, isNotFoundError || isPermissionError ? /* @__PURE__ */ import_react51.default.createElement(
|
|
2759
2768
|
"button",
|
|
2760
2769
|
{
|
|
2761
2770
|
onClick: () => window.location.href = returnUrl,
|
|
@@ -2764,14 +2773,14 @@ var UniversalErrorView = ({
|
|
|
2764
2773
|
returnLabel
|
|
2765
2774
|
) : (
|
|
2766
2775
|
// Soft errors (Network timeouts) allow them to retry or optionally retreat
|
|
2767
|
-
/* @__PURE__ */
|
|
2776
|
+
/* @__PURE__ */ import_react51.default.createElement(import_react51.default.Fragment, null, envName.toLowerCase().includes("application") && /* @__PURE__ */ import_react51.default.createElement(
|
|
2768
2777
|
"button",
|
|
2769
2778
|
{
|
|
2770
2779
|
onClick: () => window.location.href = returnUrl,
|
|
2771
2780
|
className: "px-6 py-2 bg-transparent border border-neutral-100 hover:bg-neutral-50 text-neutral-600 hover:text-black rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none"
|
|
2772
2781
|
},
|
|
2773
2782
|
"Back Home"
|
|
2774
|
-
), /* @__PURE__ */
|
|
2783
|
+
), /* @__PURE__ */ import_react51.default.createElement(
|
|
2775
2784
|
"button",
|
|
2776
2785
|
{
|
|
2777
2786
|
onClick: onRetry,
|
|
@@ -2786,9 +2795,9 @@ var UniversalErrorView = ({
|
|
|
2786
2795
|
};
|
|
2787
2796
|
|
|
2788
2797
|
// src/components/UniversalLookupPage.tsx
|
|
2789
|
-
var
|
|
2790
|
-
var
|
|
2791
|
-
var
|
|
2798
|
+
var import_react53 = __toESM(require("react"));
|
|
2799
|
+
var import_react54 = require("@hugeicons/react");
|
|
2800
|
+
var import_core_free_icons15 = require("@hugeicons/core-free-icons");
|
|
2792
2801
|
var UniversalLookupPage = ({
|
|
2793
2802
|
headerTitle,
|
|
2794
2803
|
headerDescription,
|
|
@@ -2802,9 +2811,9 @@ var UniversalLookupPage = ({
|
|
|
2802
2811
|
resultContent,
|
|
2803
2812
|
modals
|
|
2804
2813
|
}) => {
|
|
2805
|
-
const [isTypeModalOpen, setIsTypeModalOpen] = (0,
|
|
2814
|
+
const [isTypeModalOpen, setIsTypeModalOpen] = (0, import_react53.useState)(false);
|
|
2806
2815
|
const currentOptionLabel = searchOptions.find((opt) => opt.value === selectedSearchType)?.label || "Select Type";
|
|
2807
|
-
return /* @__PURE__ */
|
|
2816
|
+
return /* @__PURE__ */ import_react53.default.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__ */ import_react53.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react53.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react53.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, headerDescription))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full max-w-2xl pb-8" }, /* @__PURE__ */ import_react53.default.createElement("form", { className: "flex flex-col gap-6", onSubmit: onSearch, autoComplete: "off" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2808
2817
|
"button",
|
|
2809
2818
|
{
|
|
2810
2819
|
type: "button",
|
|
@@ -2812,7 +2821,7 @@ var UniversalLookupPage = ({
|
|
|
2812
2821
|
className: "mt-2 text-[12px] tracking-widest bg-transparent border-b border-neutral-100 text-black text-left outline-none focus:border-black shrink-0 uppercase"
|
|
2813
2822
|
},
|
|
2814
2823
|
currentOptionLabel
|
|
2815
|
-
), /* @__PURE__ */
|
|
2824
|
+
), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2816
2825
|
TextInput,
|
|
2817
2826
|
{
|
|
2818
2827
|
placeholder: "Enter Exact ID, Email, or Slug...",
|
|
@@ -2820,7 +2829,7 @@ var UniversalLookupPage = ({
|
|
|
2820
2829
|
onChange: onSearchQueryChange,
|
|
2821
2830
|
disabled: isSearching
|
|
2822
2831
|
}
|
|
2823
|
-
))), /* @__PURE__ */
|
|
2832
|
+
))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2824
2833
|
ThreeDActionButton,
|
|
2825
2834
|
{
|
|
2826
2835
|
type: "submit",
|
|
@@ -2828,9 +2837,9 @@ var UniversalLookupPage = ({
|
|
|
2828
2837
|
isLoading: isSearching,
|
|
2829
2838
|
className: "min-w-32"
|
|
2830
2839
|
},
|
|
2831
|
-
/* @__PURE__ */
|
|
2840
|
+
/* @__PURE__ */ import_react53.default.createElement(import_react54.HugeiconsIcon, { icon: import_core_free_icons15.Search01Icon, size: 14, className: "mr-2" }),
|
|
2832
2841
|
" Lookup"
|
|
2833
|
-
)))), resultContent && /* @__PURE__ */
|
|
2842
|
+
)))), resultContent && /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full max-w-2xl bg-white text-left animate-in fade-in slide-in-from-bottom-4" }, /* @__PURE__ */ import_react53.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 uppercase" }, "Entity Record Found"), resultContent), isTypeModalOpen && /* @__PURE__ */ import_react53.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTypeModalOpen(false) }), /* @__PURE__ */ import_react53.default.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__ */ import_react53.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react53.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Select Entity Type")), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, searchOptions.map((option) => /* @__PURE__ */ import_react53.default.createElement(
|
|
2834
2843
|
"button",
|
|
2835
2844
|
{
|
|
2836
2845
|
key: option.value,
|
|
@@ -2841,16 +2850,16 @@ var UniversalLookupPage = ({
|
|
|
2841
2850
|
},
|
|
2842
2851
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedSearchType === option.value ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2843
2852
|
},
|
|
2844
|
-
/* @__PURE__ */
|
|
2845
|
-
selectedSearchType === option.value && /* @__PURE__ */
|
|
2846
|
-
))), /* @__PURE__ */
|
|
2853
|
+
/* @__PURE__ */ import_react53.default.createElement("span", { className: "truncate pr-2" }, option.label),
|
|
2854
|
+
selectedSearchType === option.value && /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2855
|
+
))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react53.default.createElement("button", { type: "button", onClick: () => setIsTypeModalOpen(false), className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none" }, "Cancel")))), modals);
|
|
2847
2856
|
};
|
|
2848
2857
|
|
|
2849
2858
|
// src/components/UniversalDirectoryPage.tsx
|
|
2850
|
-
var
|
|
2851
|
-
var
|
|
2852
|
-
var
|
|
2853
|
-
var PageSpinner4 = () => /* @__PURE__ */
|
|
2859
|
+
var import_react55 = __toESM(require("react"));
|
|
2860
|
+
var import_react56 = require("@hugeicons/react");
|
|
2861
|
+
var import_core_free_icons16 = require("@hugeicons/core-free-icons");
|
|
2862
|
+
var PageSpinner4 = () => /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2854
2863
|
var UniversalDirectoryPage = ({
|
|
2855
2864
|
headerTitle,
|
|
2856
2865
|
headerDescription,
|
|
@@ -2872,33 +2881,33 @@ var UniversalDirectoryPage = ({
|
|
|
2872
2881
|
detailsContent,
|
|
2873
2882
|
modals
|
|
2874
2883
|
}) => {
|
|
2875
|
-
return /* @__PURE__ */
|
|
2884
|
+
return /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ import_react55.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, /* @__PURE__ */ import_react55.default.createElement("div", { className: "w-full" }, /* @__PURE__ */ import_react55.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react55.default.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ import_react55.default.createElement(
|
|
2876
2885
|
TextInput,
|
|
2877
2886
|
{
|
|
2878
2887
|
placeholder: searchPlaceholder,
|
|
2879
2888
|
value: searchQuery,
|
|
2880
2889
|
onChange: onSearchChange
|
|
2881
2890
|
}
|
|
2882
|
-
)), headerAction && /* @__PURE__ */
|
|
2891
|
+
)), headerAction && /* @__PURE__ */ import_react55.default.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react55.default.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__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowLeft01Icon, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ import_react55.default.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ import_react55.default.createElement(PageSpinner4, null) : /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, /* @__PURE__ */ import_react55.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.")) : items.map((item) => /* @__PURE__ */ import_react55.default.createElement(
|
|
2883
2892
|
"div",
|
|
2884
2893
|
{
|
|
2885
2894
|
key: item.id,
|
|
2886
2895
|
onClick: () => onRowClick(item.id),
|
|
2887
2896
|
className: "flex items-center justify-between p-4 sm:p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0"
|
|
2888
2897
|
},
|
|
2889
|
-
/* @__PURE__ */
|
|
2890
|
-
item.rightBadge && /* @__PURE__ */
|
|
2891
|
-
))), totalPages > 1 && /* @__PURE__ */
|
|
2898
|
+
/* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react55.default.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__ */ import_react55.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "text-sm text-black truncate pr-2" }, item.primaryText), /* @__PURE__ */ import_react55.default.createElement("div", { className: "text-xs text-neutral-500 truncate pr-2 mt-0.5" }, item.secondaryText))),
|
|
2899
|
+
item.rightBadge && /* @__PURE__ */ import_react55.default.createElement("div", { className: "shrink-0 pl-2" }, /* @__PURE__ */ import_react55.default.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-100 bg-white"}` }, item.rightBadge))
|
|
2900
|
+
))), totalPages > 1 && /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react55.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react55.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react55.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowRight01Icon, size: 14 })))))), currentView === "details" && detailsContent, modals);
|
|
2892
2901
|
};
|
|
2893
2902
|
|
|
2894
2903
|
// src/components/AiApproveDecline.tsx
|
|
2895
|
-
var
|
|
2896
|
-
var
|
|
2897
|
-
var
|
|
2904
|
+
var import_react57 = __toESM(require("react"));
|
|
2905
|
+
var import_react58 = require("@hugeicons/react");
|
|
2906
|
+
var import_core_free_icons17 = require("@hugeicons/core-free-icons");
|
|
2898
2907
|
var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline, onEdit }) => {
|
|
2899
|
-
const [isEditing, setIsEditing] = (0,
|
|
2900
|
-
const [editVal, setEditVal] = (0,
|
|
2901
|
-
return /* @__PURE__ */
|
|
2908
|
+
const [isEditing, setIsEditing] = (0, import_react57.useState)(false);
|
|
2909
|
+
const [editVal, setEditVal] = (0, import_react57.useState)(typeof suggestionValue === "string" ? suggestionValue : "");
|
|
2910
|
+
return /* @__PURE__ */ import_react57.default.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__ */ import_react57.default.createElement("div", null, /* @__PURE__ */ import_react57.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1 uppercase" }, "AI Suggestion: ", suggestionTitle), !isEditing ? /* @__PURE__ */ import_react57.default.createElement("div", { className: "text-sm text-black" }, suggestionValue) : /* @__PURE__ */ import_react57.default.createElement(
|
|
2902
2911
|
"input",
|
|
2903
2912
|
{
|
|
2904
2913
|
type: "text",
|
|
@@ -2907,45 +2916,45 @@ var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline
|
|
|
2907
2916
|
className: "w-full text-sm p-2 border-b border-purple-200 bg-transparent outline-none focus:border-purple-400 transition-colors",
|
|
2908
2917
|
autoFocus: true
|
|
2909
2918
|
}
|
|
2910
|
-
)), /* @__PURE__ */
|
|
2919
|
+
)), /* @__PURE__ */ import_react57.default.createElement("div", { className: "flex items-center gap-1 mt-2" }, !isEditing ? /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.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__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CheckmarkCircle01Icon, size: 28 })), /* @__PURE__ */ import_react57.default.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__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CancelCircleIcon, size: 28 })), onEdit && /* @__PURE__ */ import_react57.default.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__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.PencilEdit01Icon, size: 18 }))) : /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement("button", { onClick: () => {
|
|
2911
2920
|
onEdit?.(editVal);
|
|
2912
2921
|
setIsEditing(false);
|
|
2913
|
-
}, 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__ */
|
|
2922
|
+
}, 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__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CheckmarkCircle01Icon, size: 28 })), /* @__PURE__ */ import_react57.default.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__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CancelCircleIcon, size: 28 })))));
|
|
2914
2923
|
};
|
|
2915
2924
|
|
|
2916
2925
|
// src/components/AiStageCheck.tsx
|
|
2917
|
-
var
|
|
2918
|
-
var
|
|
2919
|
-
var
|
|
2926
|
+
var import_react59 = __toESM(require("react"));
|
|
2927
|
+
var import_react60 = require("@hugeicons/react");
|
|
2928
|
+
var import_core_free_icons18 = require("@hugeicons/core-free-icons");
|
|
2920
2929
|
var AiStageCheck = ({ tasks }) => {
|
|
2921
|
-
return /* @__PURE__ */
|
|
2930
|
+
return /* @__PURE__ */ import_react59.default.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__ */ import_react59.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 mb-1 uppercase" }, "AI Processing"), tasks.map((task) => /* @__PURE__ */ import_react59.default.createElement("div", { key: task.id, className: "flex items-center gap-3" }, task.status === "pending" && /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-4 h-4 rounded-full border border-purple-200" }), task.status === "loading" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.Loading03Icon, size: 16, className: "animate-spin text-purple-500" }), task.status === "success" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.CheckmarkCircle02Icon, size: 16, className: "text-emerald-500" }), task.status === "error" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.CancelCircleIcon, size: 16, className: "text-red-500" }), /* @__PURE__ */ import_react59.default.createElement("span", { className: `text-xs transition-colors ${task.status === "success" ? "text-black" : task.status === "loading" ? "text-purple-700" : "text-neutral-500"}` }, task.label))));
|
|
2922
2931
|
};
|
|
2923
2932
|
|
|
2924
2933
|
// src/components/Stagger.tsx
|
|
2925
|
-
var
|
|
2926
|
-
var
|
|
2927
|
-
var
|
|
2934
|
+
var import_react61 = __toESM(require("react"));
|
|
2935
|
+
var import_react62 = require("@hugeicons/react");
|
|
2936
|
+
var import_core_free_icons19 = require("@hugeicons/core-free-icons");
|
|
2928
2937
|
var Stagger = ({ steps, currentStep }) => {
|
|
2929
2938
|
const getIconForStep = (stepName) => {
|
|
2930
2939
|
const lowerName = stepName.toLowerCase();
|
|
2931
|
-
if (lowerName.includes("document")) return
|
|
2932
|
-
if (lowerName.includes("review")) return
|
|
2933
|
-
if (lowerName.includes("submit")) return
|
|
2934
|
-
return
|
|
2940
|
+
if (lowerName.includes("document")) return import_core_free_icons19.Upload01Icon;
|
|
2941
|
+
if (lowerName.includes("review")) return import_core_free_icons19.FileSyncIcon;
|
|
2942
|
+
if (lowerName.includes("submit")) return import_core_free_icons19.CloudUploadIcon;
|
|
2943
|
+
return import_core_free_icons19.Briefcase02Icon;
|
|
2935
2944
|
};
|
|
2936
|
-
return /* @__PURE__ */
|
|
2945
|
+
return /* @__PURE__ */ import_react61.default.createElement("div", { className: "w-full flex items-center justify-between relative z-0" }, /* @__PURE__ */ import_react61.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 w-full h-px bg-neutral-200 -z-10" }), /* @__PURE__ */ import_react61.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 h-px bg-emerald-500 -z-10 transition-all duration-500", style: { width: `${currentStep / (steps.length - 1) * 100}%` } }), steps.map((step, idx) => {
|
|
2937
2946
|
const isActive = idx === currentStep;
|
|
2938
2947
|
const isPassed = idx < currentStep;
|
|
2939
2948
|
const colorClass = isPassed ? "bg-emerald-500 text-white" : isActive ? "bg-neutral-200 text-neutral-500" : "bg-neutral-200 text-neutral-500";
|
|
2940
|
-
return /* @__PURE__ */
|
|
2949
|
+
return /* @__PURE__ */ import_react61.default.createElement("div", { key: step, className: `w-6 h-6 rounded-full flex items-center justify-center transition-colors duration-300 ${colorClass}` }, /* @__PURE__ */ import_react61.default.createElement(import_react62.HugeiconsIcon, { icon: getIconForStep(step), size: 11 }));
|
|
2941
2950
|
}));
|
|
2942
2951
|
};
|
|
2943
2952
|
|
|
2944
2953
|
// src/components/UniversalRegistrationFlow.tsx
|
|
2945
|
-
var
|
|
2954
|
+
var import_react63 = __toESM(require("react"));
|
|
2946
2955
|
var import_react_hot_toast7 = __toESM(require("react-hot-toast"));
|
|
2947
|
-
var
|
|
2948
|
-
var
|
|
2956
|
+
var import_react64 = require("@hugeicons/react");
|
|
2957
|
+
var import_core_free_icons20 = require("@hugeicons/core-free-icons");
|
|
2949
2958
|
var MACRO_STEPS = ["Details", "Documents", "Review", "Submit"];
|
|
2950
2959
|
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"];
|
|
2951
2960
|
var MEMBER_ROLES = ["Director Only", "Shareholder Only", "Both Director & Shareholder"];
|
|
@@ -2958,12 +2967,12 @@ var UniversalRegistrationFlow = ({
|
|
|
2958
2967
|
onRedirectToBilling,
|
|
2959
2968
|
onRedirectToApplication
|
|
2960
2969
|
}) => {
|
|
2961
|
-
const [isBooting, setIsBooting] = (0,
|
|
2962
|
-
const [macroStep, setMacroStep] = (0,
|
|
2963
|
-
const [appStatus, setAppStatus] = (0,
|
|
2964
|
-
const [isAbortModalOpen, setIsAbortModalOpen] = (0,
|
|
2965
|
-
const [isAborting, setIsAborting] = (0,
|
|
2966
|
-
const [formState, setFormState] = (0,
|
|
2970
|
+
const [isBooting, setIsBooting] = (0, import_react63.useState)(true);
|
|
2971
|
+
const [macroStep, setMacroStep] = (0, import_react63.useState)(0);
|
|
2972
|
+
const [appStatus, setAppStatus] = (0, import_react63.useState)("");
|
|
2973
|
+
const [isAbortModalOpen, setIsAbortModalOpen] = (0, import_react63.useState)(false);
|
|
2974
|
+
const [isAborting, setIsAborting] = (0, import_react63.useState)(false);
|
|
2975
|
+
const [formState, setFormState] = (0, import_react63.useState)({
|
|
2967
2976
|
natureApproved: false,
|
|
2968
2977
|
nameApproved: false,
|
|
2969
2978
|
addressApproved: false,
|
|
@@ -2974,13 +2983,13 @@ var UniversalRegistrationFlow = ({
|
|
|
2974
2983
|
passportApproved: false,
|
|
2975
2984
|
signatureApproved: false
|
|
2976
2985
|
});
|
|
2977
|
-
const idRef = (0,
|
|
2978
|
-
const passportRef = (0,
|
|
2979
|
-
const signatureRef = (0,
|
|
2980
|
-
const other1Ref = (0,
|
|
2981
|
-
const other2Ref = (0,
|
|
2982
|
-
const other3Ref = (0,
|
|
2983
|
-
const [formData, setFormData] = (0,
|
|
2986
|
+
const idRef = (0, import_react63.useRef)(null);
|
|
2987
|
+
const passportRef = (0, import_react63.useRef)(null);
|
|
2988
|
+
const signatureRef = (0, import_react63.useRef)(null);
|
|
2989
|
+
const other1Ref = (0, import_react63.useRef)(null);
|
|
2990
|
+
const other2Ref = (0, import_react63.useRef)(null);
|
|
2991
|
+
const other3Ref = (0, import_react63.useRef)(null);
|
|
2992
|
+
const [formData, setFormData] = (0, import_react63.useState)({
|
|
2984
2993
|
businessDesc: "",
|
|
2985
2994
|
natureOfBusiness: null,
|
|
2986
2995
|
proposedName: "",
|
|
@@ -3007,22 +3016,22 @@ var UniversalRegistrationFlow = ({
|
|
|
3007
3016
|
otherDoc3Url: "",
|
|
3008
3017
|
otherDoc3Meta: null
|
|
3009
3018
|
});
|
|
3010
|
-
const [activeModal, setActiveModal] = (0,
|
|
3011
|
-
const [iAgree, setIAgree] = (0,
|
|
3012
|
-
const [isAnalyzingNature, setIsAnalyzingNature] = (0,
|
|
3013
|
-
const [suggestedNature, setSuggestedNature] = (0,
|
|
3014
|
-
const [isCheckingQualifier, setIsCheckingQualifier] = (0,
|
|
3015
|
-
const [qualifierCheckResult, setQualifierCheckResult] = (0,
|
|
3016
|
-
const [isCheckingName, setIsCheckingName] = (0,
|
|
3017
|
-
const [nameCheckResult, setNameCheckResult] = (0,
|
|
3018
|
-
const [globalExtractingId, setGlobalExtractingId] = (0,
|
|
3019
|
-
const [globalUploadingPassport, setGlobalUploadingPassport] = (0,
|
|
3020
|
-
const [globalUploadingSignature, setGlobalUploadingSignature] = (0,
|
|
3021
|
-
const [isUploadingOther1, setIsUploadingOther1] = (0,
|
|
3022
|
-
const [isUploadingOther2, setIsUploadingOther2] = (0,
|
|
3023
|
-
const [isUploadingOther3, setIsUploadingOther3] = (0,
|
|
3024
|
-
const [aiTasks, setAiTasks] = (0,
|
|
3025
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
3019
|
+
const [activeModal, setActiveModal] = (0, import_react63.useState)({ isOpen: false, type: null, memberIndex: null });
|
|
3020
|
+
const [iAgree, setIAgree] = (0, import_react63.useState)(false);
|
|
3021
|
+
const [isAnalyzingNature, setIsAnalyzingNature] = (0, import_react63.useState)(false);
|
|
3022
|
+
const [suggestedNature, setSuggestedNature] = (0, import_react63.useState)(null);
|
|
3023
|
+
const [isCheckingQualifier, setIsCheckingQualifier] = (0, import_react63.useState)(false);
|
|
3024
|
+
const [qualifierCheckResult, setQualifierCheckResult] = (0, import_react63.useState)(null);
|
|
3025
|
+
const [isCheckingName, setIsCheckingName] = (0, import_react63.useState)(false);
|
|
3026
|
+
const [nameCheckResult, setNameCheckResult] = (0, import_react63.useState)(null);
|
|
3027
|
+
const [globalExtractingId, setGlobalExtractingId] = (0, import_react63.useState)(false);
|
|
3028
|
+
const [globalUploadingPassport, setGlobalUploadingPassport] = (0, import_react63.useState)(false);
|
|
3029
|
+
const [globalUploadingSignature, setGlobalUploadingSignature] = (0, import_react63.useState)(false);
|
|
3030
|
+
const [isUploadingOther1, setIsUploadingOther1] = (0, import_react63.useState)(false);
|
|
3031
|
+
const [isUploadingOther2, setIsUploadingOther2] = (0, import_react63.useState)(false);
|
|
3032
|
+
const [isUploadingOther3, setIsUploadingOther3] = (0, import_react63.useState)(false);
|
|
3033
|
+
const [aiTasks, setAiTasks] = (0, import_react63.useState)([]);
|
|
3034
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react63.useState)(false);
|
|
3026
3035
|
const isReadOnly = ["PENDING", "AWAITING_PAYMENT", "COMPLETED"].includes(appStatus);
|
|
3027
3036
|
const isAnyUploading = globalExtractingId || globalUploadingPassport || globalUploadingSignature || isUploadingOther1 || isUploadingOther2 || isUploadingOther3;
|
|
3028
3037
|
const baseApi = async (action, payload = {}) => {
|
|
@@ -3037,7 +3046,7 @@ var UniversalRegistrationFlow = ({
|
|
|
3037
3046
|
return { success: false, error: "Network communication failed." };
|
|
3038
3047
|
}
|
|
3039
3048
|
};
|
|
3040
|
-
(0,
|
|
3049
|
+
(0, import_react63.useEffect)(() => {
|
|
3041
3050
|
baseApi("progress_load").then((data) => {
|
|
3042
3051
|
if (data.success && data.data) {
|
|
3043
3052
|
const meta = data.data;
|
|
@@ -3513,23 +3522,23 @@ var UniversalRegistrationFlow = ({
|
|
|
3513
3522
|
const isStep0Valid = type === "company" ? formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.membersDetailsApproved : formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.ownerApproved;
|
|
3514
3523
|
const isStep1Valid = type === "company" ? formState.membersDocsApproved : formState.idApproved && formState.passportApproved && formState.signatureApproved;
|
|
3515
3524
|
const titleText = type === "company" ? "Company Incorporation (LLC)" : "Business Name Registration";
|
|
3516
|
-
if (isBooting) return /* @__PURE__ */
|
|
3525
|
+
if (isBooting) return /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-center py-20" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 32, className: "animate-spin text-black" }));
|
|
3517
3526
|
if (!["DRAFT", "QUEUED", "REJECTED"].includes(appStatus) && appStatus !== "") {
|
|
3518
|
-
return /* @__PURE__ */
|
|
3527
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-4xl 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__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.CheckmarkBadge01Icon, size: 35 })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Registration Completed"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application has been successfully verified and registered.")) : appStatus === "PENDING" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35, className: "animate-spin" })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Application is Pending"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is currently pending review.")) : appStatus === "AWAITING_PAYMENT" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-amber-50 text-amber-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35, className: "animate-pulse" })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Awaiting Payment"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort & Edit Application"))) : /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35 })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Application Submitted"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort Application"))), isAbortModalOpen && /* @__PURE__ */ import_react63.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isAborting && setIsAbortModalOpen(false) }), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "p-6 flex flex-col gap-4 text-center" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-[17px] font-serif text-black tracking-tight" }, "Abort Application?"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "w-full flex " }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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")))));
|
|
3519
3528
|
}
|
|
3520
|
-
return /* @__PURE__ */
|
|
3529
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-4xl p-6 sm:p-10 flex flex-col gap-10 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black tracking-tight mb-1" }, titleText), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500" }, "Answer the questions below to build your official application.")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "px-2" }, /* @__PURE__ */ import_react63.default.createElement(Stagger, { steps: MACRO_STEPS, currentStep: macroStep }))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8" }, macroStep === 0 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "What does your ", type === "company" ? "company" : "business", " do?")), !formState.natureApproved ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3 " }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleAnalyzeNature, disabled: formData.businessDesc.length < 5 || isAnalyzingNature || isReadOnly, isLoading: isAnalyzingNature, className: "w-fit" }, "Analyze Nature")), isAnalyzingNature && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: [{ id: "1", label: "Matching with Official Categories...", status: "loading" }] })), suggestedNature && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement(AiApproveDecline, { suggestionTitle: "Classification Found", suggestionValue: /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: " text-black" }, suggestedNature.specificLabel), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Category: ", suggestedNature.categoryLabel)), onApprove: () => {
|
|
3521
3530
|
const newForm = { ...formData, natureOfBusiness: suggestedNature };
|
|
3522
3531
|
setFormData(newForm);
|
|
3523
3532
|
approveSection("natureApproved", newForm);
|
|
3524
|
-
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */
|
|
3533
|
+
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "pr-4" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.natureApproved && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "What name would you like to register?")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide two options. We will verify availability against the official registry."), !formState.nameApproved ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Proposed Name 1 (Preferred)", value: formData.proposedName, onChange: (v) => setFormData({ ...formData, proposedName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Proposed Name 2 (Alternative)", value: formData.proposedName2, onChange: (v) => setFormData({ ...formData, proposedName2: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1" }, "AI Suggestion: Structural Qualifier Missing"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black mb-3" }, "Nigerian registrations require a structural qualifier to be approved."), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, (qualifierCheckResult.suggestions || []).map((alt, i) => /* @__PURE__ */ import_react63.default.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-100 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in" }, nameCheckResult.status === "APPROVED" || nameCheckResult.status === "APPROVED_WARNING" || nameCheckResult.status === "SKIPPED" ? /* @__PURE__ */ import_react63.default.createElement(AiApproveDecline, { suggestionTitle: nameCheckResult.status === "APPROVED" ? "Name Available!" : "Fallback Approval", suggestionValue: /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-600" }, nameCheckResult.message), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-600 mt-2 " }, "Proposed Option: ", nameCheckResult.approvedOption)), onApprove: () => {
|
|
3525
3534
|
const newForm = { ...formData, approvedName: nameCheckResult.approvedOption };
|
|
3526
3535
|
setFormData(newForm);
|
|
3527
3536
|
approveSection("nameApproved", newForm);
|
|
3528
|
-
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */
|
|
3529
|
-
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */
|
|
3530
|
-
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */
|
|
3531
|
-
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */
|
|
3532
|
-
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex border-b border-neutral-100 items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " border-b border-neutral-100 flex items-center justify-between" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react65.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react65.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 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__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-2xl" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-emerald-800" }, "All Member Documents Verified"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and ready for submission.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react65.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 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__ */ import_react65.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-100 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react65.default.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__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3537
|
+
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-red-600 block mb-1" }, "Registry Conflict Detected"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black mb-3" }, nameCheckResult.message), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, (nameCheckResult.alternatives || []).map((alt, i) => /* @__PURE__ */ import_react63.default.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-100 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.approvedName), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Verified against registry")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("nameApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.nameApproved && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Where is your head office located?")), !formState.addressApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Street Address", value: formData.address, onChange: (v) => setFormData({ ...formData, address: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "City", value: formData.city, onChange: (v) => setFormData({ ...formData, city: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "State", value: formData.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: null, isGlobalState: true }), placeholder: "Select State", onChange: () => {
|
|
3538
|
+
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("addressApproved"), disabled: !formData.address || !formData.city || !formData.state || isReadOnly, className: "w-fit mt-2" }, "Confirm Address")) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500" }, formData.address, ", ", formData.city, ", ", formData.state), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("addressApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "company" && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between gap-2 text-black border-b border-neutral-100 pb-3" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Directors & Shareholders")), !formState.membersDetailsApproved && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide details for all individuals. Ensure total share percentage equals 100%."), !formState.membersDetailsApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 " }, formData.members.map((member, i) => /* @__PURE__ */ import_react63.default.createElement("div", { key: member.id, className: "flex flex-col gap-4 border border-neutral-100 p-5 rounded-2xl bg-neutral-50/30" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-between items-center mb-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-neutral-400" }, "Member ", i + 1), formData.members.length > 1 && !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => removeCompanyMember(i), className: "text-red-500 text-xs hover:text-red-600" }, "Remove")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Role", value: member.role, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "role", memberIndex: i }), onChange: () => {
|
|
3539
|
+
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Share Percentage (%)", value: member.sharePercentage, onChange: (v) => updateCompanyMemberInfo(i, "sharePercentage", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name", value: member.fullName, onChange: (v) => updateCompanyMemberInfo(i, "fullName", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Phone Number", value: member.phone, onChange: (v) => updateCompanyMemberInfo(i, "phone", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Email Address", value: member.email, onChange: (v) => updateCompanyMemberInfo(i, "email", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Nationality", value: member.nationality, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "nationality", memberIndex: i }), onChange: () => {
|
|
3540
|
+
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Residential Address", value: member.address, onChange: (v) => updateCompanyMemberInfo(i, "address", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "City", value: member.city, onChange: (v) => updateCompanyMemberInfo(i, "city", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "State", value: member.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: i }), onChange: () => {
|
|
3541
|
+
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex border-b border-neutral-100 items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " border-b border-neutral-100 flex items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react63.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 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__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-2xl" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-emerald-800" }, "All Member Documents Verified"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and ready for submission.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 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__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-100 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3533
3542
|
const docType = `other${num}`;
|
|
3534
3543
|
const ref = num === 1 ? other1Ref : num === 2 ? other2Ref : other3Ref;
|
|
3535
3544
|
const isUploading = num === 1 ? isUploadingOther1 : num === 2 ? isUploadingOther2 : isUploadingOther3;
|
|
@@ -3537,20 +3546,20 @@ var UniversalRegistrationFlow = ({
|
|
|
3537
3546
|
if (!fileUrl && !isUploading) {
|
|
3538
3547
|
const prevUrl = num > 1 ? formData[`otherDoc${num - 1}Url`] : true;
|
|
3539
3548
|
if (!prevUrl) return null;
|
|
3540
|
-
return /* @__PURE__ */
|
|
3549
|
+
return /* @__PURE__ */ import_react63.default.createElement("button", { key: num, onClick: () => !isReadOnly && !isAnyUploading && ref.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Optional Document ", num);
|
|
3541
3550
|
}
|
|
3542
3551
|
if (isUploading) {
|
|
3543
|
-
return /* @__PURE__ */
|
|
3552
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { key: num, className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Document ", num, "...");
|
|
3544
3553
|
}
|
|
3545
|
-
return /* @__PURE__ */
|
|
3546
|
-
}))), /* @__PURE__ */
|
|
3554
|
+
return /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.CheckmarkBadge01Icon, size: 18 }), " Optional Document ", num, " Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 })));
|
|
3555
|
+
}))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Back"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep1Valid || isAnyUploading, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 2 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm mb-5 text-black" }, "Application Summary"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 text-sm" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 truncate text-[13px] " }, type === "company" ? "Company Name" : "Business Name"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black text-[13px]" }, formData.approvedName)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Classification"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate sm:text-right text-[13px] " }, formData.natureOfBusiness?.specificLabel || "Pending")), type === "company" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Total Members"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, formData.members.length, " Directors/Shareholders")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Share Capital"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, "100% Allocated"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Proprietor"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, formData.ownerName)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Documents Attached"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-neutral-400 text-[13px] " }, "ID, Passport, Signature")), formData.otherDoc1Url && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Optional Documents"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-neutral-400 text-[13px] " }, [formData.otherDoc1Url, formData.otherDoc2Url, formData.otherDoc3Url].filter(Boolean).length, " Attached")))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-4 pt-4 " }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Back"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, className: "w-fit shrink-0" }, "Confirm & Proceed"))), macroStep === 3 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 py-6 animate-in zoom-in-95 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-lg font-serif text-black tracking-tight mb-2" }, "Terms and Conditions of Application"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "text-xs text-neutral-500 mb-4" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: " mb-3" }, "Declaration and Consent"), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement("p", { className: "leading-relaxed" }, "Proceeding to generate the invoice confirms your acceptance of these terms and initiates the formal filing process.")), /* @__PURE__ */ import_react63.default.createElement("label", { className: "flex items-start gap-3 mt-2 cursor-pointer group" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-4 mt-8 w-full justify-end pt-6" }, /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.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__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleFinalSubmit, disabled: isSubmitting || !iAgree || isReadOnly, isLoading: isSubmitting, className: "min-w-40 w-full sm:w-auto" }, "Submit")))), activeModal.isOpen && /* @__PURE__ */ import_react63.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setActiveModal({ isOpen: false, type: null, memberIndex: null }) }), /* @__PURE__ */ import_react63.default.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__ */ import_react63.default.createElement("div", { className: "p-4 text-center w-full shrink-0" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-[14px] text-black tracking-tight capitalize" }, "Select ", activeModal.type)), /* @__PURE__ */ import_react63.default.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) => {
|
|
3547
3556
|
const isSelected = activeModal.isGlobalState ? formData.state === opt : formData.members[activeModal.memberIndex][activeModal.type] === opt;
|
|
3548
|
-
return /* @__PURE__ */
|
|
3557
|
+
return /* @__PURE__ */ import_react63.default.createElement("button", { key: opt, onClick: () => {
|
|
3549
3558
|
if (activeModal.isGlobalState) setFormData({ ...formData, state: opt });
|
|
3550
3559
|
else updateCompanyMemberInfo(activeModal.memberIndex, activeModal.type, opt);
|
|
3551
3560
|
setActiveModal({ isOpen: false, type: null, memberIndex: null });
|
|
3552
3561
|
}, className: `text-left px-4 py-3 rounded-full text-[13px] transition-colors outline-none ${isSelected ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}` }, opt);
|
|
3553
|
-
})), /* @__PURE__ */
|
|
3562
|
+
})), /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full flex mt-auto shrink-0 " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setActiveModal({ isOpen: false, type: null, memberIndex: null }), className: "w-full py-4 text-[13px] text-neutral-500 hover:bg-neutral-50 transition-colors outline-none" }, "Close")))));
|
|
3554
3563
|
};
|
|
3555
3564
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3556
3565
|
0 && (module.exports = {
|
|
@@ -3586,7 +3595,6 @@ var UniversalRegistrationFlow = ({
|
|
|
3586
3595
|
UniversalDashboardPage,
|
|
3587
3596
|
UniversalDirectoryPage,
|
|
3588
3597
|
UniversalErrorView,
|
|
3589
|
-
UniversalHeader,
|
|
3590
3598
|
UniversalIdentityPage,
|
|
3591
3599
|
UniversalLookupPage,
|
|
3592
3600
|
UniversalMembersPage,
|