@retinalabsllc/zairusjs 9.0.30 → 9.0.50
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 +21 -5
- package/dist/index.d.ts +21 -5
- package/dist/index.js +724 -484
- package/dist/index.mjs +680 -434
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -593,49 +593,206 @@ var Footer = ({
|
|
|
593
593
|
};
|
|
594
594
|
|
|
595
595
|
// src/components/MobileNav.tsx
|
|
596
|
-
import
|
|
596
|
+
import React8, { useState as useState5 } from "react";
|
|
597
597
|
import Link4 from "next/link";
|
|
598
|
-
import { usePathname as usePathname2 } from "next/navigation";
|
|
598
|
+
import { usePathname as usePathname2, useRouter } from "next/navigation";
|
|
599
|
+
import { HugeiconsIcon as HugeiconsIcon4 } from "@hugeicons/react";
|
|
600
|
+
import {
|
|
601
|
+
SidebarLeft01Icon,
|
|
602
|
+
ArrowLeft01Icon,
|
|
603
|
+
LogoutCircle02Icon,
|
|
604
|
+
Notification01Icon
|
|
605
|
+
} from "@hugeicons/core-free-icons";
|
|
606
|
+
|
|
607
|
+
// src/components/ConfirmationDialog.tsx
|
|
608
|
+
import React7 from "react";
|
|
599
609
|
import { HugeiconsIcon as HugeiconsIcon3 } from "@hugeicons/react";
|
|
600
|
-
|
|
610
|
+
import { Loading03Icon as Loading03Icon2 } from "@hugeicons/core-free-icons";
|
|
611
|
+
var ConfirmationDialog = ({
|
|
612
|
+
isOpen,
|
|
613
|
+
title,
|
|
614
|
+
message,
|
|
615
|
+
confirmText = "Confirm",
|
|
616
|
+
cancelText = "Cancel",
|
|
617
|
+
isProcessing = false,
|
|
618
|
+
isDestructive = true,
|
|
619
|
+
onClose,
|
|
620
|
+
onConfirm
|
|
621
|
+
}) => {
|
|
622
|
+
if (!isOpen) return null;
|
|
623
|
+
return /* @__PURE__ */ React7.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React7.createElement(
|
|
624
|
+
"div",
|
|
625
|
+
{
|
|
626
|
+
className: "absolute inset-0 bg-black/40 ",
|
|
627
|
+
onClick: () => !isProcessing && onClose()
|
|
628
|
+
}
|
|
629
|
+
), /* @__PURE__ */ React7.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__ */ React7.createElement("div", { className: "p-6 pb-4 text-center w-full" }, /* @__PURE__ */ React7.createElement("h3", { className: "text-[17px] text-black tracking-tight mb-2" }, title), /* @__PURE__ */ React7.createElement("p", { className: "text-[12px] text-neutral-500 leading-relaxed px-2" }, message)), /* @__PURE__ */ React7.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ React7.createElement(
|
|
630
|
+
"button",
|
|
631
|
+
{
|
|
632
|
+
onClick: onClose,
|
|
633
|
+
disabled: isProcessing,
|
|
634
|
+
className: "flex-1 py-4 text-[14px] text-neutral-500 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none "
|
|
635
|
+
},
|
|
636
|
+
cancelText
|
|
637
|
+
), /* @__PURE__ */ React7.createElement(
|
|
638
|
+
"button",
|
|
639
|
+
{
|
|
640
|
+
onClick: onConfirm,
|
|
641
|
+
disabled: isProcessing,
|
|
642
|
+
className: `flex-1 py-4 text-[13px] transition-colors disabled:opacity-50 flex justify-center items-center outline-none ${isDestructive ? "text-red-500 hover:bg-red-50" : "text-black hover:bg-neutral-50"}`
|
|
643
|
+
},
|
|
644
|
+
isProcessing ? /* @__PURE__ */ React7.createElement(HugeiconsIcon3, { icon: Loading03Icon2, className: "animate-spin", size: 18 }) : confirmText
|
|
645
|
+
))));
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
// src/components/MobileNav.tsx
|
|
649
|
+
var MobileNav = ({
|
|
650
|
+
items,
|
|
651
|
+
web3Address,
|
|
652
|
+
web3Avatar,
|
|
653
|
+
userInitials = "U",
|
|
654
|
+
unreadCount = 0,
|
|
655
|
+
onOpenNotifications,
|
|
656
|
+
onLogout
|
|
657
|
+
}) => {
|
|
601
658
|
const pathname = usePathname2();
|
|
659
|
+
const router = useRouter();
|
|
660
|
+
const [isCollapsed, setIsCollapsed] = useState5(false);
|
|
661
|
+
const [showLogoutDialog, setShowLogoutDialog] = useState5(false);
|
|
662
|
+
const [isLoggingOut, setIsLoggingOut] = useState5(false);
|
|
602
663
|
if (!items || items.length === 0) return null;
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
664
|
+
const isItemActive = (href) => {
|
|
665
|
+
if (href === "/" || href === "/app") {
|
|
666
|
+
return pathname === "/" || pathname === "/app";
|
|
667
|
+
}
|
|
668
|
+
return pathname?.startsWith(href);
|
|
669
|
+
};
|
|
670
|
+
const isChildRoute = pathname !== "/" && pathname !== "/app" && !items.some((item) => item.href === pathname);
|
|
671
|
+
const handleLogout = async () => {
|
|
672
|
+
setIsLoggingOut(true);
|
|
673
|
+
try {
|
|
674
|
+
if (onLogout) await onLogout();
|
|
675
|
+
} finally {
|
|
676
|
+
setIsLoggingOut(false);
|
|
677
|
+
setShowLogoutDialog(false);
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
const handleCopyWallet = () => {
|
|
681
|
+
if (web3Address) {
|
|
682
|
+
navigator.clipboard.writeText(web3Address);
|
|
683
|
+
}
|
|
684
|
+
};
|
|
685
|
+
return /* @__PURE__ */ React8.createElement(React8.Fragment, null, /* @__PURE__ */ React8.createElement(
|
|
686
|
+
"aside",
|
|
687
|
+
{
|
|
688
|
+
className: `hidden md:flex fixed top-0 left-0 h-screen bg-white border-r border-neutral-100 flex-col transition-all duration-300 z-40 ${isCollapsed ? "w-20" : "w-64"}`
|
|
689
|
+
},
|
|
690
|
+
/* @__PURE__ */ React8.createElement("div", { className: `p-5 flex items-center shrink-0 ${isCollapsed ? "justify-center" : "justify-start"}` }, /* @__PURE__ */ React8.createElement("div", { className: "flex items-center gap-3 w-full" }, /* @__PURE__ */ React8.createElement("div", { className: "w-10 h-10 rounded-full flex items-center justify-center shrink-0 border border-neutral-100 bg-neutral-50 overflow-hidden" }, web3Avatar ? /* @__PURE__ */ React8.createElement("img", { src: web3Avatar, alt: "Avatar", className: "w-full h-full object-cover" }) : /* @__PURE__ */ React8.createElement("span", { className: "text-[12px] font-medium text-black uppercase" }, userInitials)), !isCollapsed && /* @__PURE__ */ React8.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React8.createElement("span", { className: "text-[14px] font-medium text-black truncate" }, "Aeona Profile"), web3Address && /* @__PURE__ */ React8.createElement(
|
|
691
|
+
"span",
|
|
692
|
+
{
|
|
693
|
+
onClick: handleCopyWallet,
|
|
694
|
+
className: "text-[10px] text-neutral-500 truncate cursor-pointer hover:text-black transition-colors"
|
|
695
|
+
},
|
|
696
|
+
web3Address
|
|
697
|
+
)))),
|
|
698
|
+
/* @__PURE__ */ React8.createElement("nav", { className: "flex-1 py-4 flex flex-col gap-2 px-3 overflow-y-auto custom-scrollbar" }, items.map((item) => {
|
|
699
|
+
const active = isItemActive(item.href);
|
|
700
|
+
return /* @__PURE__ */ React8.createElement(
|
|
701
|
+
Link4,
|
|
702
|
+
{
|
|
703
|
+
key: item.label,
|
|
704
|
+
href: item.href,
|
|
705
|
+
className: `flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all outline-none group shrink-0 ${active ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`,
|
|
706
|
+
title: isCollapsed ? item.label : void 0
|
|
707
|
+
},
|
|
708
|
+
/* @__PURE__ */ React8.createElement(
|
|
709
|
+
HugeiconsIcon4,
|
|
710
|
+
{
|
|
711
|
+
icon: item.icon,
|
|
712
|
+
size: 20,
|
|
713
|
+
className: `shrink-0 transition-colors ${active ? "text-black" : "text-neutral-400 group-hover:text-black"}`
|
|
714
|
+
}
|
|
715
|
+
),
|
|
716
|
+
!isCollapsed && /* @__PURE__ */ React8.createElement("span", { className: `text-[13px] font-medium tracking-wide truncate ${active ? "text-black" : ""}` }, item.label)
|
|
717
|
+
);
|
|
718
|
+
})),
|
|
719
|
+
/* @__PURE__ */ React8.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2 border-t border-neutral-50" }, /* @__PURE__ */ React8.createElement(
|
|
720
|
+
"button",
|
|
721
|
+
{
|
|
722
|
+
onClick: () => setShowLogoutDialog(true),
|
|
723
|
+
className: `flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all outline-none group text-neutral-500 hover:bg-neutral-50 hover:text-red-500 ${isCollapsed ? "justify-center" : ""}`,
|
|
724
|
+
title: isCollapsed ? "Log Out" : void 0
|
|
725
|
+
},
|
|
726
|
+
/* @__PURE__ */ React8.createElement(HugeiconsIcon4, { icon: LogoutCircle02Icon, size: 20, className: "shrink-0 transition-colors" }),
|
|
727
|
+
!isCollapsed && /* @__PURE__ */ React8.createElement("span", { className: "text-[13px] font-medium tracking-wide" }, "Log Out")
|
|
728
|
+
), /* @__PURE__ */ React8.createElement(
|
|
729
|
+
"button",
|
|
730
|
+
{
|
|
731
|
+
onClick: () => setIsCollapsed(!isCollapsed),
|
|
732
|
+
className: `flex items-center gap-3 px-3 py-2.5 rounded-xl transition-all outline-none group text-neutral-400 hover:bg-neutral-50 hover:text-black ${isCollapsed ? "justify-center" : ""}`
|
|
733
|
+
},
|
|
734
|
+
/* @__PURE__ */ React8.createElement(HugeiconsIcon4, { icon: SidebarLeft01Icon, size: 20, className: "shrink-0 transition-colors" }),
|
|
735
|
+
!isCollapsed && /* @__PURE__ */ React8.createElement("span", { className: "text-[13px] font-medium tracking-wide" }, "Collapse")
|
|
736
|
+
))
|
|
737
|
+
), /* @__PURE__ */ React8.createElement("div", { className: "md:hidden fixed top-3 inset-x-0 z-50 flex justify-center pointer-events-none px-2.5" }, /* @__PURE__ */ React8.createElement("header", { className: "pointer-events-auto w-full max-w-sm backdrop-blur-xl bg-white/65 rounded-full p-2 flex items-center justify-between" }, /* @__PURE__ */ React8.createElement("div", { className: "flex items-center gap-2" }, isChildRoute && /* @__PURE__ */ React8.createElement(
|
|
738
|
+
"button",
|
|
739
|
+
{
|
|
740
|
+
onClick: () => router.back(),
|
|
741
|
+
className: "w-8 h-8 rounded-full bg-white flex items-center justify-center text-neutral-600 hover:text-black transition-colors outline-none shrink-0 border border-neutral-100"
|
|
742
|
+
},
|
|
743
|
+
/* @__PURE__ */ React8.createElement(HugeiconsIcon4, { icon: ArrowLeft01Icon, size: 16 })
|
|
744
|
+
), web3Address && /* @__PURE__ */ React8.createElement(
|
|
745
|
+
"div",
|
|
746
|
+
{
|
|
747
|
+
onClick: handleCopyWallet,
|
|
748
|
+
className: "flex items-center gap-2 bg-white rounded-full p-1 pr-3 cursor-pointer hover:bg-neutral-50 transition-colors border border-neutral-100"
|
|
749
|
+
},
|
|
750
|
+
web3Avatar ? /* @__PURE__ */ React8.createElement("img", { src: web3Avatar, alt: "Avatar", className: "w-6 h-6 rounded-full object-cover shrink-0" }) : /* @__PURE__ */ React8.createElement("div", { className: "w-6 h-6 rounded-full bg-neutral-100 flex items-center justify-center text-[10px] font-medium text-black shrink-0" }, userInitials),
|
|
751
|
+
/* @__PURE__ */ React8.createElement("span", { className: "text-[12px] font-medium text-black truncate max-w-24 sm:max-w-40" }, web3Address)
|
|
752
|
+
)), /* @__PURE__ */ React8.createElement(
|
|
753
|
+
"button",
|
|
754
|
+
{
|
|
755
|
+
onClick: onOpenNotifications,
|
|
756
|
+
className: "relative w-8 h-8 shrink-0 bg-white rounded-full flex items-center justify-center text-neutral-600 hover:text-black transition-colors outline-none mr-1 border border-neutral-100"
|
|
757
|
+
},
|
|
758
|
+
/* @__PURE__ */ React8.createElement(HugeiconsIcon4, { icon: Notification01Icon, size: 16 }),
|
|
759
|
+
unreadCount > 0 && /* @__PURE__ */ React8.createElement("span", { className: "absolute top-1 right-1.5 w-2 h-2 bg-blue-600 rounded-full border-2 border-white" })
|
|
760
|
+
))), /* @__PURE__ */ React8.createElement("div", { className: "md:hidden fixed bottom-6 inset-x-0 z-100 flex justify-center pointer-events-none px-3 animate-in slide-in-from-bottom-8 fade-in duration-500" }, /* @__PURE__ */ React8.createElement("nav", { className: "pointer-events-auto w-full max-w-sm bg-white/65 backdrop-blur-xl shadow-[0_8px_30px_rgb(0,0,0,0.08)] rounded-full px-6 py-2.5 flex items-center justify-between border border-white/50" }, items.map((item) => {
|
|
761
|
+
const active = isItemActive(item.href);
|
|
762
|
+
return /* @__PURE__ */ React8.createElement(
|
|
606
763
|
Link4,
|
|
607
764
|
{
|
|
608
765
|
key: item.label,
|
|
609
766
|
href: item.href,
|
|
610
767
|
className: "flex flex-col items-center justify-center gap-1 min-w-14 transition-transform active:scale-95 outline-none"
|
|
611
768
|
},
|
|
612
|
-
/* @__PURE__ */
|
|
613
|
-
|
|
614
|
-
{
|
|
615
|
-
icon: item.icon,
|
|
616
|
-
size: 20
|
|
617
|
-
}
|
|
618
|
-
)),
|
|
619
|
-
/* @__PURE__ */ React7.createElement(
|
|
620
|
-
"span",
|
|
621
|
-
{
|
|
622
|
-
className: `text-[9px] tracking-wide transition-colors duration-300 ${isActive ? "text-black" : "text-neutral-400"}`
|
|
623
|
-
},
|
|
624
|
-
item.label
|
|
625
|
-
)
|
|
769
|
+
/* @__PURE__ */ React8.createElement("div", { className: `transition-colors duration-300 ${active ? "text-black" : "text-neutral-400 hover:text-neutral-600"}` }, /* @__PURE__ */ React8.createElement(HugeiconsIcon4, { icon: item.icon, size: 20 })),
|
|
770
|
+
/* @__PURE__ */ React8.createElement("span", { className: `text-[9px] tracking-wide font-medium transition-colors duration-300 ${active ? "text-black" : "text-neutral-400"}` }, item.label)
|
|
626
771
|
);
|
|
627
|
-
})))
|
|
772
|
+
}))), /* @__PURE__ */ React8.createElement(
|
|
773
|
+
ConfirmationDialog,
|
|
774
|
+
{
|
|
775
|
+
isOpen: showLogoutDialog,
|
|
776
|
+
title: "Secure Logout",
|
|
777
|
+
message: "Are you sure you want to log out? You will need to authenticate to return.",
|
|
778
|
+
confirmText: "Log Out",
|
|
779
|
+
isDestructive: true,
|
|
780
|
+
isProcessing: isLoggingOut,
|
|
781
|
+
onClose: () => setShowLogoutDialog(false),
|
|
782
|
+
onConfirm: handleLogout
|
|
783
|
+
}
|
|
784
|
+
));
|
|
628
785
|
};
|
|
629
786
|
|
|
630
787
|
// src/components/UniversalOrganizationPage.tsx
|
|
631
|
-
import
|
|
788
|
+
import React12, { useState as useState7, useEffect as useEffect4 } from "react";
|
|
632
789
|
import toast2 from "react-hot-toast";
|
|
633
790
|
|
|
634
791
|
// src/components/ManagedToaster.tsx
|
|
635
|
-
import
|
|
792
|
+
import React9 from "react";
|
|
636
793
|
import { Toaster } from "react-hot-toast";
|
|
637
794
|
var ManagedToaster = () => {
|
|
638
|
-
return /* @__PURE__ */
|
|
795
|
+
return /* @__PURE__ */ React9.createElement(
|
|
639
796
|
Toaster,
|
|
640
797
|
{
|
|
641
798
|
position: "top-right",
|
|
@@ -667,7 +824,7 @@ var ManagedToaster = () => {
|
|
|
667
824
|
};
|
|
668
825
|
|
|
669
826
|
// src/components/ReusableInputs.tsx
|
|
670
|
-
import
|
|
827
|
+
import React10 from "react";
|
|
671
828
|
var TextInput = ({
|
|
672
829
|
label,
|
|
673
830
|
value,
|
|
@@ -678,7 +835,7 @@ var TextInput = ({
|
|
|
678
835
|
readOnly,
|
|
679
836
|
type = "text",
|
|
680
837
|
onClick
|
|
681
|
-
}) => /* @__PURE__ */
|
|
838
|
+
}) => /* @__PURE__ */ React10.createElement("div", { className: "space-y-2 flex-1 w-full", onClick }, label && /* @__PURE__ */ React10.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ React10.createElement(
|
|
682
839
|
"input",
|
|
683
840
|
{
|
|
684
841
|
type,
|
|
@@ -699,7 +856,7 @@ var NumberInput = ({
|
|
|
699
856
|
placeholder,
|
|
700
857
|
maxLength,
|
|
701
858
|
disabled
|
|
702
|
-
}) => /* @__PURE__ */
|
|
859
|
+
}) => /* @__PURE__ */ React10.createElement("div", { className: "space-y-2 flex-1 w-full" }, label && /* @__PURE__ */ React10.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ React10.createElement(
|
|
703
860
|
"input",
|
|
704
861
|
{
|
|
705
862
|
type: "text",
|
|
@@ -717,8 +874,8 @@ var NumberInput = ({
|
|
|
717
874
|
));
|
|
718
875
|
|
|
719
876
|
// src/components/Banner.tsx
|
|
720
|
-
import
|
|
721
|
-
import { HugeiconsIcon as
|
|
877
|
+
import React11, { useState as useState6 } from "react";
|
|
878
|
+
import { HugeiconsIcon as HugeiconsIcon5 } from "@hugeicons/react";
|
|
722
879
|
import {
|
|
723
880
|
Alert02Icon,
|
|
724
881
|
CheckmarkBadge01Icon,
|
|
@@ -734,7 +891,7 @@ var Banner = ({
|
|
|
734
891
|
onDismiss,
|
|
735
892
|
action
|
|
736
893
|
}) => {
|
|
737
|
-
const [isVisible, setIsVisible] =
|
|
894
|
+
const [isVisible, setIsVisible] = useState6(true);
|
|
738
895
|
if (!isVisible) return null;
|
|
739
896
|
const handleDismiss = () => {
|
|
740
897
|
setIsVisible(false);
|
|
@@ -768,23 +925,23 @@ var Banner = ({
|
|
|
768
925
|
};
|
|
769
926
|
const currentConfig = config[type];
|
|
770
927
|
const IconToUse = icon || currentConfig.defaultIcon;
|
|
771
|
-
return /* @__PURE__ */
|
|
928
|
+
return /* @__PURE__ */ React11.createElement("div", { className: `relative w-full rounded-2xl p-4 flex items-start gap-4 transition-all duration-300 animate-in fade-in slide-in-from-top-2 ${currentConfig.bg}` }, /* @__PURE__ */ React11.createElement("div", { className: "flex-1 flex flex-col min-w-0" }, /* @__PURE__ */ React11.createElement("h4", { className: `text-sm tracking-tight mb-1 ${currentConfig.titleColor}` }, title), /* @__PURE__ */ React11.createElement("p", { className: `text-xs leading-relaxed ${currentConfig.msgColor}` }, message), action && /* @__PURE__ */ React11.createElement("div", { className: "mt-3" }, action)), isDismissible && /* @__PURE__ */ React11.createElement(
|
|
772
929
|
"button",
|
|
773
930
|
{
|
|
774
931
|
onClick: handleDismiss,
|
|
775
932
|
className: `absolute top-3 right-3 p-1.5 rounded-full transition-colors outline-none shrink-0 ${currentConfig.closeHover}`,
|
|
776
933
|
"aria-label": "Dismiss banner"
|
|
777
934
|
},
|
|
778
|
-
/* @__PURE__ */
|
|
935
|
+
/* @__PURE__ */ React11.createElement(HugeiconsIcon5, { icon: Cancel01Icon, size: 16 })
|
|
779
936
|
));
|
|
780
937
|
};
|
|
781
938
|
|
|
782
939
|
// src/components/UniversalOrganizationPage.tsx
|
|
783
|
-
import { HugeiconsIcon as
|
|
940
|
+
import { HugeiconsIcon as HugeiconsIcon6 } from "@hugeicons/react";
|
|
784
941
|
import {
|
|
785
942
|
CircleLock02Icon
|
|
786
943
|
} from "@hugeicons/core-free-icons";
|
|
787
|
-
var InputSpinner2 = () => /* @__PURE__ */
|
|
944
|
+
var InputSpinner2 = () => /* @__PURE__ */ React12.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__ */ React12.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React12.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" }));
|
|
788
945
|
var UniversalOrganizationPage = ({
|
|
789
946
|
initialOrgName,
|
|
790
947
|
initialSlug,
|
|
@@ -797,12 +954,12 @@ var UniversalOrganizationPage = ({
|
|
|
797
954
|
onCheckSlugAvailability
|
|
798
955
|
}) => {
|
|
799
956
|
const resolvedInitialUsername = initialUsername || initialSlug;
|
|
800
|
-
const [web3Name, setWeb3Name] =
|
|
801
|
-
const [username, setUsername] =
|
|
802
|
-
const [slug, setSlug] =
|
|
803
|
-
const [isCheckingSlug, setIsCheckingSlug] =
|
|
804
|
-
const [slugAvailable, setSlugAvailable] =
|
|
805
|
-
const [isSubmitting, setIsSubmitting] =
|
|
957
|
+
const [web3Name, setWeb3Name] = useState7(initialOrgName);
|
|
958
|
+
const [username, setUsername] = useState7(resolvedInitialUsername);
|
|
959
|
+
const [slug, setSlug] = useState7(initialSlug);
|
|
960
|
+
const [isCheckingSlug, setIsCheckingSlug] = useState7(false);
|
|
961
|
+
const [slugAvailable, setSlugAvailable] = useState7(null);
|
|
962
|
+
const [isSubmitting, setIsSubmitting] = useState7(false);
|
|
806
963
|
useEffect4(() => {
|
|
807
964
|
setWeb3Name(initialOrgName || "");
|
|
808
965
|
setSlug(initialSlug || "");
|
|
@@ -872,7 +1029,7 @@ var UniversalOrganizationPage = ({
|
|
|
872
1029
|
};
|
|
873
1030
|
const hasChanges = web3Name !== initialOrgName || slug !== initialSlug || username !== resolvedInitialUsername;
|
|
874
1031
|
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || web3Name.length < 3 || slug.length < 3 || username.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
875
|
-
return /* @__PURE__ */
|
|
1032
|
+
return /* @__PURE__ */ React12.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl rounded-2xl p-6 bg-white fade-in duration-300" }, /* @__PURE__ */ React12.createElement(ManagedToaster, null), /* @__PURE__ */ React12.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React12.createElement("div", null, /* @__PURE__ */ React12.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, "Public Profile"), /* @__PURE__ */ React12.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your financial payment handle identifiers and global public cryptographic signature identity details.")), isReadOnly && /* @__PURE__ */ React12.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-100 text-neutral-400 rounded-full shrink-0" }, /* @__PURE__ */ React12.createElement(HugeiconsIcon6, { icon: CircleLock02Icon, size: 18, className: "text-current" }))), bannerProps && /* @__PURE__ */ React12.createElement(Banner, { ...bannerProps }), /* @__PURE__ */ React12.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ React12.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ React12.createElement(
|
|
876
1033
|
TextInput,
|
|
877
1034
|
{
|
|
878
1035
|
label: "Display Name",
|
|
@@ -882,7 +1039,7 @@ var UniversalOrganizationPage = ({
|
|
|
882
1039
|
placeholder: "Sovereign User",
|
|
883
1040
|
maxLength: 50
|
|
884
1041
|
}
|
|
885
|
-
), /* @__PURE__ */
|
|
1042
|
+
), /* @__PURE__ */ React12.createElement(
|
|
886
1043
|
TextInput,
|
|
887
1044
|
{
|
|
888
1045
|
label: "Digital Identity",
|
|
@@ -892,7 +1049,7 @@ var UniversalOrganizationPage = ({
|
|
|
892
1049
|
placeholder: "sovereignuser",
|
|
893
1050
|
maxLength: 30
|
|
894
1051
|
}
|
|
895
|
-
), /* @__PURE__ */
|
|
1052
|
+
), /* @__PURE__ */ React12.createElement("div", { className: "space-y-1.5 relative w-full" }, /* @__PURE__ */ React12.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Wallet Username"), /* @__PURE__ */ React12.createElement("div", { className: "flex items-center relative w-full border-b border-neutral-100 focus-within:border-black transition-all duration-300" }, /* @__PURE__ */ React12.createElement(
|
|
896
1053
|
"input",
|
|
897
1054
|
{
|
|
898
1055
|
type: "text",
|
|
@@ -904,7 +1061,7 @@ var UniversalOrganizationPage = ({
|
|
|
904
1061
|
className: "w-full px-2 py-3 text-sm bg-transparent text-black outline-none disabled:opacity-50 disabled:cursor-not-allowed",
|
|
905
1062
|
placeholder: "sovereign-user-handle"
|
|
906
1063
|
}
|
|
907
|
-
), /* @__PURE__ */
|
|
1064
|
+
), /* @__PURE__ */ React12.createElement("span", { className: "text-neutral-400 text-sm py-3 pr-8 shrink-0 whitespace-nowrap" }, slugPrefixUrl), /* @__PURE__ */ React12.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ React12.createElement(InputSpinner2, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ React12.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-100" }, /* @__PURE__ */ React12.createElement("svg", { className: "w-2 h-2 text-red-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React12.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__ */ React12.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ React12.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React12.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__ */ React12.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ React12.createElement(
|
|
908
1065
|
ThreeDActionButton,
|
|
909
1066
|
{
|
|
910
1067
|
type: "submit",
|
|
@@ -913,7 +1070,7 @@ var UniversalOrganizationPage = ({
|
|
|
913
1070
|
className: "min-w-32"
|
|
914
1071
|
},
|
|
915
1072
|
"Save Changes"
|
|
916
|
-
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */
|
|
1073
|
+
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ React12.createElement(
|
|
917
1074
|
"button",
|
|
918
1075
|
{
|
|
919
1076
|
type: "button",
|
|
@@ -929,13 +1086,13 @@ var UniversalOrganizationPage = ({
|
|
|
929
1086
|
};
|
|
930
1087
|
|
|
931
1088
|
// src/components/UniversalProfileSettings.tsx
|
|
932
|
-
import
|
|
1089
|
+
import React13, { useState as useState8, useEffect as useEffect5 } from "react";
|
|
933
1090
|
import toast3 from "react-hot-toast";
|
|
934
|
-
import { HugeiconsIcon as
|
|
1091
|
+
import { HugeiconsIcon as HugeiconsIcon7 } from "@hugeicons/react";
|
|
935
1092
|
import {
|
|
936
1093
|
CircleLock02Icon as CircleLock02Icon2,
|
|
937
1094
|
CancelCircleIcon,
|
|
938
|
-
Loading03Icon as
|
|
1095
|
+
Loading03Icon as Loading03Icon3,
|
|
939
1096
|
LockKeyIcon
|
|
940
1097
|
} from "@hugeicons/core-free-icons";
|
|
941
1098
|
var UniversalProfileSettings = ({
|
|
@@ -951,14 +1108,14 @@ var UniversalProfileSettings = ({
|
|
|
951
1108
|
onSavePin,
|
|
952
1109
|
onSaveProfile
|
|
953
1110
|
}) => {
|
|
954
|
-
const [firstName, setFirstName] =
|
|
955
|
-
const [lastName, setLastName] =
|
|
956
|
-
const [isSubmitting, setIsSubmitting] =
|
|
957
|
-
const [isPinModalOpen, setIsPinModalOpen] =
|
|
958
|
-
const [oldPin, setOldPin] =
|
|
959
|
-
const [newPin, setNewPin] =
|
|
960
|
-
const [confirmPin, setConfirmPin] =
|
|
961
|
-
const [isPinSubmitting, setIsPinSubmitting] =
|
|
1111
|
+
const [firstName, setFirstName] = useState8(initialFirstName);
|
|
1112
|
+
const [lastName, setLastName] = useState8(initialLastName);
|
|
1113
|
+
const [isSubmitting, setIsSubmitting] = useState8(false);
|
|
1114
|
+
const [isPinModalOpen, setIsPinModalOpen] = useState8(false);
|
|
1115
|
+
const [oldPin, setOldPin] = useState8("");
|
|
1116
|
+
const [newPin, setNewPin] = useState8("");
|
|
1117
|
+
const [confirmPin, setConfirmPin] = useState8("");
|
|
1118
|
+
const [isPinSubmitting, setIsPinSubmitting] = useState8(false);
|
|
962
1119
|
useEffect5(() => {
|
|
963
1120
|
setFirstName(initialFirstName || "");
|
|
964
1121
|
setLastName(initialLastName || "");
|
|
@@ -1025,7 +1182,7 @@ var UniversalProfileSettings = ({
|
|
|
1025
1182
|
};
|
|
1026
1183
|
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
1027
1184
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
1028
|
-
return /* @__PURE__ */
|
|
1185
|
+
return /* @__PURE__ */ React13.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ React13.createElement(ManagedToaster, null), /* @__PURE__ */ React13.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ React13.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React13.createElement("h1", { className: "text-black text-xl mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ React13.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ React13.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-100 text-neutral-400 rounded-full shrink-0" }, /* @__PURE__ */ React13.createElement(HugeiconsIcon7, { icon: CircleLock02Icon2, size: 18, className: "text-current" }))), bannerProps && /* @__PURE__ */ React13.createElement(Banner, { ...bannerProps }), /* @__PURE__ */ React13.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ React13.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ React13.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ React13.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React13.createElement(
|
|
1029
1186
|
TextInput,
|
|
1030
1187
|
{
|
|
1031
1188
|
label: "First Name",
|
|
@@ -1034,7 +1191,7 @@ var UniversalProfileSettings = ({
|
|
|
1034
1191
|
disabled: isReadOnly || isSubmitting,
|
|
1035
1192
|
placeholder: "System"
|
|
1036
1193
|
}
|
|
1037
|
-
)), /* @__PURE__ */
|
|
1194
|
+
)), /* @__PURE__ */ React13.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React13.createElement(
|
|
1038
1195
|
TextInput,
|
|
1039
1196
|
{
|
|
1040
1197
|
label: "Last Name",
|
|
@@ -1043,7 +1200,7 @@ var UniversalProfileSettings = ({
|
|
|
1043
1200
|
disabled: isReadOnly || isSubmitting,
|
|
1044
1201
|
placeholder: "Admin"
|
|
1045
1202
|
}
|
|
1046
|
-
))), /* @__PURE__ */
|
|
1203
|
+
))), /* @__PURE__ */ React13.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ React13.createElement(
|
|
1047
1204
|
TextInput,
|
|
1048
1205
|
{
|
|
1049
1206
|
label: "Email ID",
|
|
@@ -1052,7 +1209,7 @@ var UniversalProfileSettings = ({
|
|
|
1052
1209
|
},
|
|
1053
1210
|
disabled: true
|
|
1054
1211
|
}
|
|
1055
|
-
), /* @__PURE__ */
|
|
1212
|
+
), /* @__PURE__ */ React13.createElement("p", { className: "text-[11px] text-neutral-500 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ React13.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4" }, /* @__PURE__ */ React13.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ React13.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React13.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block truncate" }, "Account Status"), /* @__PURE__ */ React13.createElement("span", { className: "text-xs text-black block truncate" }, accountStatus)), /* @__PURE__ */ React13.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React13.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block truncate" }, "Member Since"), /* @__PURE__ */ React13.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__ */ React13.createElement("div", { className: "min-w-0 pl-4" }, /* @__PURE__ */ React13.createElement(
|
|
1056
1213
|
"button",
|
|
1057
1214
|
{
|
|
1058
1215
|
type: "button",
|
|
@@ -1060,8 +1217,8 @@ var UniversalProfileSettings = ({
|
|
|
1060
1217
|
"aria-label": "PIN Settings",
|
|
1061
1218
|
className: "w-9 h-9 flex items-center justify-center border border-neutral-200 rounded-full text-black hover:bg-neutral-50 transition-colors outline-none"
|
|
1062
1219
|
},
|
|
1063
|
-
/* @__PURE__ */
|
|
1064
|
-
))), /* @__PURE__ */
|
|
1220
|
+
/* @__PURE__ */ React13.createElement(HugeiconsIcon7, { icon: LockKeyIcon, size: 17, className: "text-black" })
|
|
1221
|
+
))), /* @__PURE__ */ React13.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__ */ React13.createElement(
|
|
1065
1222
|
"button",
|
|
1066
1223
|
{
|
|
1067
1224
|
type: "button",
|
|
@@ -1072,7 +1229,7 @@ var UniversalProfileSettings = ({
|
|
|
1072
1229
|
className: "text-[11px] tracking-widest text-neutral-400 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
1073
1230
|
},
|
|
1074
1231
|
"Cancel"
|
|
1075
|
-
), /* @__PURE__ */
|
|
1232
|
+
), /* @__PURE__ */ React13.createElement(
|
|
1076
1233
|
ThreeDActionButton,
|
|
1077
1234
|
{
|
|
1078
1235
|
type: "submit",
|
|
@@ -1081,7 +1238,7 @@ var UniversalProfileSettings = ({
|
|
|
1081
1238
|
className: "min-w-32 w-full sm:w-auto"
|
|
1082
1239
|
},
|
|
1083
1240
|
"Save Changes"
|
|
1084
|
-
))))), isPinModalOpen && /* @__PURE__ */
|
|
1241
|
+
))))), isPinModalOpen && /* @__PURE__ */ React13.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React13.createElement("div", { className: "absolute inset-0 bg-black/40", onClick: closePinModal }), /* @__PURE__ */ React13.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__ */ React13.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ React13.createElement("h3", { className: "text-[15px] text-black tracking-tight" }, hasPin ? "Change PIN" : "Create PIN"), /* @__PURE__ */ React13.createElement("button", { onClick: closePinModal, disabled: isPinSubmitting, className: "text-neutral-400 hover:text-black transition-colors outline-none disabled:opacity-50" }, /* @__PURE__ */ React13.createElement(HugeiconsIcon7, { icon: CancelCircleIcon, size: 18 }))), /* @__PURE__ */ React13.createElement("div", { className: "p-6" }, isPinLoading ? /* @__PURE__ */ React13.createElement("div", { className: "flex flex-col items-center justify-center py-10" }, /* @__PURE__ */ React13.createElement(HugeiconsIcon7, { icon: Loading03Icon3, size: 28, className: "animate-spin text-neutral-400 mb-4" })) : /* @__PURE__ */ React13.createElement("form", { onSubmit: handlePinSubmit, className: "flex flex-col gap-6" }, hasPin && /* @__PURE__ */ React13.createElement(
|
|
1085
1242
|
TextInput,
|
|
1086
1243
|
{
|
|
1087
1244
|
type: "password",
|
|
@@ -1092,7 +1249,7 @@ var UniversalProfileSettings = ({
|
|
|
1092
1249
|
onChange: (val) => handlePinInput(val, setOldPin),
|
|
1093
1250
|
placeholder: "\u2022\u2022\u2022\u2022"
|
|
1094
1251
|
}
|
|
1095
|
-
), /* @__PURE__ */
|
|
1252
|
+
), /* @__PURE__ */ React13.createElement(
|
|
1096
1253
|
TextInput,
|
|
1097
1254
|
{
|
|
1098
1255
|
type: "password",
|
|
@@ -1103,7 +1260,7 @@ var UniversalProfileSettings = ({
|
|
|
1103
1260
|
onChange: (val) => handlePinInput(val, setNewPin),
|
|
1104
1261
|
placeholder: "\u2022\u2022\u2022\u2022"
|
|
1105
1262
|
}
|
|
1106
|
-
), /* @__PURE__ */
|
|
1263
|
+
), /* @__PURE__ */ React13.createElement(
|
|
1107
1264
|
TextInput,
|
|
1108
1265
|
{
|
|
1109
1266
|
type: "password",
|
|
@@ -1114,7 +1271,7 @@ var UniversalProfileSettings = ({
|
|
|
1114
1271
|
onChange: (val) => handlePinInput(val, setConfirmPin),
|
|
1115
1272
|
placeholder: "\u2022\u2022\u2022\u2022"
|
|
1116
1273
|
}
|
|
1117
|
-
), /* @__PURE__ */
|
|
1274
|
+
), /* @__PURE__ */ React13.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React13.createElement(
|
|
1118
1275
|
ThreeDActionButton,
|
|
1119
1276
|
{
|
|
1120
1277
|
type: "submit",
|
|
@@ -1127,14 +1284,14 @@ var UniversalProfileSettings = ({
|
|
|
1127
1284
|
};
|
|
1128
1285
|
|
|
1129
1286
|
// src/components/UniversalErrorView.tsx
|
|
1130
|
-
import
|
|
1131
|
-
import { HugeiconsIcon as
|
|
1287
|
+
import React15 from "react";
|
|
1288
|
+
import { HugeiconsIcon as HugeiconsIcon9 } from "@hugeicons/react";
|
|
1132
1289
|
import { ConfusedIcon } from "@hugeicons/core-free-icons";
|
|
1133
1290
|
|
|
1134
1291
|
// src/components/PageSpinner.tsx
|
|
1135
|
-
import
|
|
1136
|
-
import { HugeiconsIcon as
|
|
1137
|
-
import { Loading03Icon as
|
|
1292
|
+
import React14 from "react";
|
|
1293
|
+
import { HugeiconsIcon as HugeiconsIcon8 } from "@hugeicons/react";
|
|
1294
|
+
import { Loading03Icon as Loading03Icon4 } from "@hugeicons/core-free-icons";
|
|
1138
1295
|
var PageSpinner = ({
|
|
1139
1296
|
className = "",
|
|
1140
1297
|
iconClassName = "text-black",
|
|
@@ -1142,10 +1299,10 @@ var PageSpinner = ({
|
|
|
1142
1299
|
}) => {
|
|
1143
1300
|
return (
|
|
1144
1301
|
// z-[100] ensures it sits above absolute headers and modals
|
|
1145
|
-
/* @__PURE__ */
|
|
1146
|
-
|
|
1302
|
+
/* @__PURE__ */ React14.createElement("div", { className: `fixed inset-0 z-100 flex flex-col items-center justify-center w-full h-full pointer-events-none ${className}` }, /* @__PURE__ */ React14.createElement(
|
|
1303
|
+
HugeiconsIcon8,
|
|
1147
1304
|
{
|
|
1148
|
-
icon:
|
|
1305
|
+
icon: Loading03Icon4,
|
|
1149
1306
|
size,
|
|
1150
1307
|
className: `animate-spin mb-4 ${iconClassName}`
|
|
1151
1308
|
}
|
|
@@ -1165,7 +1322,7 @@ var UniversalErrorView = ({
|
|
|
1165
1322
|
returnLabel = "Return to Workspace"
|
|
1166
1323
|
}) => {
|
|
1167
1324
|
if (isBooting || isLoading && !activeData) {
|
|
1168
|
-
return /* @__PURE__ */
|
|
1325
|
+
return /* @__PURE__ */ React15.createElement("div", { className: "flex items-center justify-center h-screen w-full bg-white" }, /* @__PURE__ */ React15.createElement(PageSpinner, null));
|
|
1169
1326
|
}
|
|
1170
1327
|
if (!isLoading && (!activeData || activeError)) {
|
|
1171
1328
|
const errorString = typeof activeError === "string" ? activeError : JSON.stringify(activeError || "");
|
|
@@ -1184,7 +1341,7 @@ var UniversalErrorView = ({
|
|
|
1184
1341
|
title = "Access Restricted";
|
|
1185
1342
|
description = apiMessage || `You have insufficient permissions to view this ${envName}. Please contact your administrator.`;
|
|
1186
1343
|
}
|
|
1187
|
-
return /* @__PURE__ */
|
|
1344
|
+
return /* @__PURE__ */ React15.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 animate-in fade-in duration-500" }, /* @__PURE__ */ React15.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ React15.createElement(HugeiconsIcon9, { icon: IconComponent, size: 48, className: "text-neutral-300" })), /* @__PURE__ */ React15.createElement("h2", { className: "text-lg text-black tracking-tight " }, title), /* @__PURE__ */ React15.createElement("p", { className: "text-xs mt-2 mb-8 text-neutral-500 max-w-sm text-center leading-relaxed" }, description), /* @__PURE__ */ React15.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full justify-center sm:w-auto" }, isNotFoundError || isPermissionError ? /* @__PURE__ */ React15.createElement(
|
|
1188
1345
|
"button",
|
|
1189
1346
|
{
|
|
1190
1347
|
onClick: () => window.location.href = returnUrl,
|
|
@@ -1193,14 +1350,14 @@ var UniversalErrorView = ({
|
|
|
1193
1350
|
returnLabel
|
|
1194
1351
|
) : (
|
|
1195
1352
|
// Soft errors (Network timeouts) allow them to retry or optionally retreat
|
|
1196
|
-
/* @__PURE__ */
|
|
1353
|
+
/* @__PURE__ */ React15.createElement(React15.Fragment, null, envName.toLowerCase().includes("application") && /* @__PURE__ */ React15.createElement(
|
|
1197
1354
|
"button",
|
|
1198
1355
|
{
|
|
1199
1356
|
onClick: () => window.location.href = returnUrl,
|
|
1200
1357
|
className: "px-6 py-2 bg-transparent border border-neutral-200 text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none "
|
|
1201
1358
|
},
|
|
1202
1359
|
"Back Home"
|
|
1203
|
-
), /* @__PURE__ */
|
|
1360
|
+
), /* @__PURE__ */ React15.createElement(
|
|
1204
1361
|
"button",
|
|
1205
1362
|
{
|
|
1206
1363
|
onClick: onRetry,
|
|
@@ -1215,13 +1372,13 @@ var UniversalErrorView = ({
|
|
|
1215
1372
|
};
|
|
1216
1373
|
|
|
1217
1374
|
// src/components/UniversalTransactionPage.tsx
|
|
1218
|
-
import
|
|
1219
|
-
import { HugeiconsIcon as
|
|
1375
|
+
import React16, { useState as useState9, useEffect as useEffect6, useRef as useRef3 } from "react";
|
|
1376
|
+
import { HugeiconsIcon as HugeiconsIcon10 } from "@hugeicons/react";
|
|
1220
1377
|
import toast4 from "react-hot-toast";
|
|
1221
1378
|
import {
|
|
1222
|
-
ArrowLeft01Icon,
|
|
1379
|
+
ArrowLeft01Icon as ArrowLeft01Icon2,
|
|
1223
1380
|
ArrowRight01Icon,
|
|
1224
|
-
Loading03Icon as
|
|
1381
|
+
Loading03Icon as Loading03Icon5,
|
|
1225
1382
|
ArrowDownRight01Icon,
|
|
1226
1383
|
ArrowUpRight01Icon,
|
|
1227
1384
|
Search01Icon,
|
|
@@ -1229,7 +1386,7 @@ import {
|
|
|
1229
1386
|
ListSettingIcon,
|
|
1230
1387
|
CancelCircleIcon as CancelCircleIcon2
|
|
1231
1388
|
} from "@hugeicons/core-free-icons";
|
|
1232
|
-
var PageSpinner2 = () => /* @__PURE__ */
|
|
1389
|
+
var PageSpinner2 = () => /* @__PURE__ */ React16.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: Loading03Icon5, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
1233
1390
|
var formatDate = (dateInput) => {
|
|
1234
1391
|
const d = new Date(dateInput);
|
|
1235
1392
|
const day = d.getDate();
|
|
@@ -1264,12 +1421,12 @@ var UniversalTransactionPage = ({
|
|
|
1264
1421
|
onReportTransaction,
|
|
1265
1422
|
onGenerateReceipt
|
|
1266
1423
|
}) => {
|
|
1267
|
-
const [selectedTransaction, setSelectedTransaction] =
|
|
1268
|
-
const [isGeneratingReceipt, setIsGeneratingReceipt] =
|
|
1269
|
-
const [localSearchQuery, setLocalSearchQuery] =
|
|
1270
|
-
const [isTyping, setIsTyping] =
|
|
1271
|
-
const [isDirectionModalOpen, setIsDirectionModalOpen] =
|
|
1272
|
-
const [isTypeModalOpen, setIsTypeModalOpen] =
|
|
1424
|
+
const [selectedTransaction, setSelectedTransaction] = useState9(null);
|
|
1425
|
+
const [isGeneratingReceipt, setIsGeneratingReceipt] = useState9(false);
|
|
1426
|
+
const [localSearchQuery, setLocalSearchQuery] = useState9(searchQuery);
|
|
1427
|
+
const [isTyping, setIsTyping] = useState9(false);
|
|
1428
|
+
const [isDirectionModalOpen, setIsDirectionModalOpen] = useState9(false);
|
|
1429
|
+
const [isTypeModalOpen, setIsTypeModalOpen] = useState9(false);
|
|
1273
1430
|
const directionDropdownRef = useRef3(null);
|
|
1274
1431
|
const typeDropdownRef = useRef3(null);
|
|
1275
1432
|
useEffect6(() => {
|
|
@@ -1315,7 +1472,7 @@ var UniversalTransactionPage = ({
|
|
|
1315
1472
|
}
|
|
1316
1473
|
};
|
|
1317
1474
|
const isListLoading = isLoading || isTyping;
|
|
1318
|
-
return /* @__PURE__ */
|
|
1475
|
+
return /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col gap-6 animate-in max-w-5xl fade-in duration-300" }, /* @__PURE__ */ React16.createElement(ManagedToaster, null), !hideControls && /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 w-full" }, /* @__PURE__ */ React16.createElement("div", { className: "relative w-full sm:w-96" }, /* @__PURE__ */ React16.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: Search01Icon, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ React16.createElement(
|
|
1319
1476
|
"input",
|
|
1320
1477
|
{
|
|
1321
1478
|
type: "text",
|
|
@@ -1324,53 +1481,53 @@ var UniversalTransactionPage = ({
|
|
|
1324
1481
|
onChange: (e) => setLocalSearchQuery(e.target.value),
|
|
1325
1482
|
className: "w-full pl-10 pr-4 py-2 bg-white rounded-full text-[13px] text-black placeholder-neutral-400 outline-none transition-colors focus:border-black"
|
|
1326
1483
|
}
|
|
1327
|
-
)), /* @__PURE__ */
|
|
1484
|
+
)), /* @__PURE__ */ React16.createElement("div", { className: "flex items-center gap-3 w-auto pb-0" }, /* @__PURE__ */ React16.createElement(
|
|
1328
1485
|
"button",
|
|
1329
1486
|
{
|
|
1330
1487
|
onClick: () => setIsDirectionModalOpen(true),
|
|
1331
1488
|
"aria-label": "Filter by payment type",
|
|
1332
1489
|
className: "flex items-center justify-center bg-white w-10 h-10 rounded-full text-neutral-500 hover:text-black transition-colors outline-none"
|
|
1333
1490
|
},
|
|
1334
|
-
/* @__PURE__ */
|
|
1335
|
-
), /* @__PURE__ */
|
|
1491
|
+
/* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: SearchList02Icon, size: 16 })
|
|
1492
|
+
), /* @__PURE__ */ React16.createElement(
|
|
1336
1493
|
"button",
|
|
1337
1494
|
{
|
|
1338
1495
|
onClick: () => setIsTypeModalOpen(true),
|
|
1339
1496
|
"aria-label": "Filter by transaction type",
|
|
1340
1497
|
className: "flex items-center justify-center bg-white w-10 h-10 rounded-full text-neutral-500 hover:text-black transition-colors outline-none"
|
|
1341
1498
|
},
|
|
1342
|
-
/* @__PURE__ */
|
|
1343
|
-
))), /* @__PURE__ */
|
|
1499
|
+
/* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: ListSettingIcon, size: 16 })
|
|
1500
|
+
))), /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ React16.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription))), /* @__PURE__ */ React16.createElement("div", { className: "w-full overflow-hidden" }, isListLoading ? /* @__PURE__ */ React16.createElement(PageSpinner2, null) : /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React16.createElement("div", null, transactions.length === 0 ? /* @__PURE__ */ React16.createElement("p", { className: "text-xs text-neutral-400 py-6 text-center" }, "No transactions found") : transactions.map((tx) => /* @__PURE__ */ React16.createElement(
|
|
1344
1501
|
"div",
|
|
1345
1502
|
{
|
|
1346
1503
|
key: tx.id,
|
|
1347
1504
|
onClick: () => setSelectedTransaction(tx),
|
|
1348
1505
|
className: "flex items-center justify-between py-4 hover:bg-neutral-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl"
|
|
1349
1506
|
},
|
|
1350
|
-
/* @__PURE__ */
|
|
1351
|
-
/* @__PURE__ */
|
|
1352
|
-
))), !hidePagination && /* @__PURE__ */
|
|
1507
|
+
/* @__PURE__ */ React16.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ React16.createElement("div", { className: `w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-100 text-black` }, /* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: tx.direction === "CREDIT" ? ArrowDownRight01Icon : ArrowUpRight01Icon, size: 18 })), /* @__PURE__ */ React16.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-1" }, /* @__PURE__ */ React16.createElement("p", { className: "text-[13px] text-black truncate" }, getDisplayName(tx)), /* @__PURE__ */ React16.createElement("p", { className: `text-[13px] text-neutral-500 truncate transition-all duration-300 ${hideBalanceAmounts ? "blur-sm opacity-40 select-none" : ""}` }, tx.direction === "CREDIT" ? "+" : "-", tx.amount, " ", tx.currency))),
|
|
1508
|
+
/* @__PURE__ */ React16.createElement("div", { className: "shrink-0 flex flex-col items-end gap-1 text-right" }, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] text-neutral-400" }, formatDate(tx.createdAt)), /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] text-neutral-400 capitalize" }, tx.direction.toLowerCase()))
|
|
1509
|
+
))), !hidePagination && /* @__PURE__ */ React16.createElement("div", { className: "flex items-center justify-between pt-6 mt-2 " }, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages === 0 ? 1 : totalPages), /* @__PURE__ */ React16.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React16.createElement(
|
|
1353
1510
|
"button",
|
|
1354
1511
|
{
|
|
1355
1512
|
onClick: () => onPageChange(currentPage - 1),
|
|
1356
1513
|
disabled: currentPage <= 1 || isListLoading,
|
|
1357
1514
|
className: "p-2 bg-white border border-neutral-200 rounded-full text-black hover:bg-neutral-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
1358
1515
|
},
|
|
1359
|
-
/* @__PURE__ */
|
|
1360
|
-
), /* @__PURE__ */
|
|
1516
|
+
/* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: ArrowLeft01Icon2, size: 14 })
|
|
1517
|
+
), /* @__PURE__ */ React16.createElement(
|
|
1361
1518
|
"button",
|
|
1362
1519
|
{
|
|
1363
1520
|
onClick: () => onPageChange(currentPage + 1),
|
|
1364
1521
|
disabled: currentPage >= totalPages || isListLoading || totalPages === 0,
|
|
1365
1522
|
className: "p-2 bg-white border border-neutral-200 rounded-full text-black hover:bg-neutral-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
1366
1523
|
},
|
|
1367
|
-
/* @__PURE__ */
|
|
1368
|
-
)))))), selectedTransaction && /* @__PURE__ */
|
|
1524
|
+
/* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: ArrowRight01Icon, size: 14 })
|
|
1525
|
+
)))))), selectedTransaction && /* @__PURE__ */ React16.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React16.createElement("div", { className: "absolute inset-0 bg-black/40 ", onClick: () => setSelectedTransaction(null) }), /* @__PURE__ */ React16.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 max-h-[90vh]" }, /* @__PURE__ */ React16.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ React16.createElement("h3", { className: "text-[15px] text-black tracking-tight" }, "Details"), /* @__PURE__ */ React16.createElement("button", { onClick: () => setSelectedTransaction(null), className: "text-neutral-400 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: CancelCircleIcon2, size: 18 }))), /* @__PURE__ */ React16.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6" }, /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col items-center justify-center mb-4" }, /* @__PURE__ */ React16.createElement("div", { className: `w-12 h-12 rounded-full flex items-center justify-center mb-4 bg-neutral-100 text-black` }, /* @__PURE__ */ React16.createElement(HugeiconsIcon10, { icon: selectedTransaction.direction === "CREDIT" ? ArrowDownRight01Icon : ArrowUpRight01Icon, size: 20 })), /* @__PURE__ */ React16.createElement("h2", { className: `text-2xl text-black mb-2 transition-all duration-300 ${hideBalanceAmounts ? "blur-[6px] opacity-40 select-none" : ""}` }, selectedTransaction.direction === "CREDIT" ? "+" : "-", selectedTransaction.amount, " ", selectedTransaction.currency), /* @__PURE__ */ React16.createElement("span", { className: "text-[9px] tracking-widest text-neutral-500 px-4 py-1.5 rounded-full bg-neutral-50" }, selectedTransaction.status)), /* @__PURE__ */ React16.createElement("div", { className: "grid grid-cols-1 gap-y-8 gap-x-4 mb-10 mt-6" }, /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Reference ID"), /* @__PURE__ */ React16.createElement("span", { className: "text-[13px] text-black break-all" }, selectedTransaction.reference)), /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Date & Time"), /* @__PURE__ */ React16.createElement("span", { className: "text-[13px] text-black" }, formatDate(selectedTransaction.createdAt), " at ", formatTime(selectedTransaction.createdAt))), /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Transaction Type"), /* @__PURE__ */ React16.createElement("span", { className: "text-[13px] text-black capitalize" }, selectedTransaction.type.replace("_", " ").toLowerCase())), /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Flow Direction"), /* @__PURE__ */ React16.createElement("span", { className: "text-[13px] text-black capitalize" }, selectedTransaction.direction.toLowerCase())), selectedTransaction.metadata?.fromAddress && selectedTransaction.metadata?.toAddress && /* @__PURE__ */ React16.createElement("div", null, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Transfer Route"), /* @__PURE__ */ React16.createElement("div", { className: "flex items-center gap-2 text-[13px] text-black" }, /* @__PURE__ */ React16.createElement("span", { className: "truncate " }, truncateAddress(String(selectedTransaction.metadata.fromAddress))), /* @__PURE__ */ React16.createElement("span", { className: "text-neutral-400" }, "\u2192"), /* @__PURE__ */ React16.createElement("span", { className: "truncate " }, truncateAddress(String(selectedTransaction.metadata.toAddress))))), selectedTransaction.metadata && Object.entries(selectedTransaction.metadata).map(([key, value]) => {
|
|
1369
1526
|
if (key === "fromAddress" || key === "toAddress") return null;
|
|
1370
1527
|
if (value === null || value === void 0 || typeof value === "object") return null;
|
|
1371
1528
|
const formattedKey = key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase());
|
|
1372
|
-
return /* @__PURE__ */
|
|
1373
|
-
})), /* @__PURE__ */
|
|
1529
|
+
return /* @__PURE__ */ React16.createElement("div", { key }, /* @__PURE__ */ React16.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, formattedKey), /* @__PURE__ */ React16.createElement("span", { className: "text-[13px] text-black break-all" }, String(value)));
|
|
1530
|
+
})), /* @__PURE__ */ React16.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React16.createElement(
|
|
1374
1531
|
ThreeDActionButton,
|
|
1375
1532
|
{
|
|
1376
1533
|
onClick: handleGenerateReceipt,
|
|
@@ -1378,14 +1535,14 @@ var UniversalTransactionPage = ({
|
|
|
1378
1535
|
className: "w-full py-3 text-[14px]"
|
|
1379
1536
|
},
|
|
1380
1537
|
"Generate Receipt"
|
|
1381
|
-
), /* @__PURE__ */
|
|
1538
|
+
), /* @__PURE__ */ React16.createElement(
|
|
1382
1539
|
"button",
|
|
1383
1540
|
{
|
|
1384
1541
|
onClick: () => onReportTransaction && onReportTransaction(selectedTransaction),
|
|
1385
1542
|
className: "w-full flex items-center justify-center py-2.5 rounded-full border border-neutral-200 text-black hover:bg-neutral-50 transition-colors outline-none text-[13px] tracking-wide mt-2"
|
|
1386
1543
|
},
|
|
1387
1544
|
"Report Transaction"
|
|
1388
|
-
), selectedTransaction.type === "WALLET_TRANSACTION" && /* @__PURE__ */
|
|
1545
|
+
), selectedTransaction.type === "WALLET_TRANSACTION" && /* @__PURE__ */ React16.createElement(
|
|
1389
1546
|
"a",
|
|
1390
1547
|
{
|
|
1391
1548
|
href: `https://basescan.org/tx/${selectedTransaction.reference}`,
|
|
@@ -1394,7 +1551,7 @@ var UniversalTransactionPage = ({
|
|
|
1394
1551
|
className: "w-full flex items-center justify-center py-2.5 rounded-full border border-neutral-200 text-black hover:bg-neutral-50 transition-colors outline-none text-[13px] tracking-wide mt-2"
|
|
1395
1552
|
},
|
|
1396
1553
|
"View in block explorer"
|
|
1397
|
-
))))), isDirectionModalOpen && /* @__PURE__ */
|
|
1554
|
+
))))), isDirectionModalOpen && /* @__PURE__ */ React16.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React16.createElement("div", { className: "absolute inset-0 bg-black/40 ", onClick: () => setIsDirectionModalOpen(false) }), /* @__PURE__ */ React16.createElement("div", { ref: directionDropdownRef, 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__ */ React16.createElement("div", { className: "p-6 text-center w-full mb-2" }, /* @__PURE__ */ React16.createElement("h3", { className: "text-[14px] text-black tracking-tight" }, "Payment Type")), /* @__PURE__ */ React16.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 gap-1" }, ["ALL", "CREDIT", "DEBIT"].map((option) => /* @__PURE__ */ React16.createElement(
|
|
1398
1555
|
"button",
|
|
1399
1556
|
{
|
|
1400
1557
|
key: option,
|
|
@@ -1404,19 +1561,19 @@ var UniversalTransactionPage = ({
|
|
|
1404
1561
|
},
|
|
1405
1562
|
className: `text-left px-4 py-3 text-[11px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeDirectionFilter === option ? "bg-neutral-100 text-black " : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
1406
1563
|
},
|
|
1407
|
-
/* @__PURE__ */
|
|
1408
|
-
))), /* @__PURE__ */
|
|
1564
|
+
/* @__PURE__ */ React16.createElement("span", { className: "truncate pr-2" }, option.charAt(0).toUpperCase() + option.slice(1).toLowerCase())
|
|
1565
|
+
))), /* @__PURE__ */ React16.createElement("div", { className: "w-full flex mt-2 " }, /* @__PURE__ */ React16.createElement(
|
|
1409
1566
|
"button",
|
|
1410
1567
|
{
|
|
1411
1568
|
onClick: () => setIsDirectionModalOpen(false),
|
|
1412
1569
|
className: "w-full py-4 text-[13px] text-neutral-500 hover:text-black transition-colors outline-none "
|
|
1413
1570
|
},
|
|
1414
1571
|
"Cancel"
|
|
1415
|
-
)))), isTypeModalOpen && /* @__PURE__ */
|
|
1572
|
+
)))), isTypeModalOpen && /* @__PURE__ */ React16.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React16.createElement("div", { className: "absolute inset-0 bg-black/40 ", onClick: () => setIsTypeModalOpen(false) }), /* @__PURE__ */ React16.createElement("div", { ref: typeDropdownRef, 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__ */ React16.createElement("div", { className: "p-6 text-center w-full mb-2" }, /* @__PURE__ */ React16.createElement("h3", { className: "text-[14px] text-black tracking-tight" }, "Transactions Type")), /* @__PURE__ */ React16.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 gap-1" }, [
|
|
1416
1573
|
{ label: "All Transactions", value: "ALL" },
|
|
1417
1574
|
{ label: "Wallet Transactions", value: "WALLET_TRANSACTION" },
|
|
1418
1575
|
{ label: "Card Transactions", value: "CARD_TRANSACTION" }
|
|
1419
|
-
].map((option) => /* @__PURE__ */
|
|
1576
|
+
].map((option) => /* @__PURE__ */ React16.createElement(
|
|
1420
1577
|
"button",
|
|
1421
1578
|
{
|
|
1422
1579
|
key: option.value,
|
|
@@ -1426,8 +1583,8 @@ var UniversalTransactionPage = ({
|
|
|
1426
1583
|
},
|
|
1427
1584
|
className: `text-left px-4 py-3 text-[11px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeTypeFilter === option.value ? "bg-neutral-100 text-black " : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
1428
1585
|
},
|
|
1429
|
-
/* @__PURE__ */
|
|
1430
|
-
))), /* @__PURE__ */
|
|
1586
|
+
/* @__PURE__ */ React16.createElement("span", { className: "truncate pr-2" }, option.label.charAt(0).toUpperCase() + option.label.slice(1).toLowerCase())
|
|
1587
|
+
))), /* @__PURE__ */ React16.createElement("div", { className: "w-full flex mt-2 " }, /* @__PURE__ */ React16.createElement(
|
|
1431
1588
|
"button",
|
|
1432
1589
|
{
|
|
1433
1590
|
onClick: () => setIsTypeModalOpen(false),
|
|
@@ -1438,8 +1595,8 @@ var UniversalTransactionPage = ({
|
|
|
1438
1595
|
};
|
|
1439
1596
|
|
|
1440
1597
|
// src/components/UniversalHomeView.tsx
|
|
1441
|
-
import
|
|
1442
|
-
import { HugeiconsIcon as
|
|
1598
|
+
import React17, { useState as useState10, useEffect as useEffect7 } from "react";
|
|
1599
|
+
import { HugeiconsIcon as HugeiconsIcon11 } from "@hugeicons/react";
|
|
1443
1600
|
import { ViewOffSlashIcon, ViewIcon } from "@hugeicons/core-free-icons";
|
|
1444
1601
|
var UniversalHomeView = ({
|
|
1445
1602
|
balanceLabel = "Your Balance",
|
|
@@ -1449,8 +1606,8 @@ var UniversalHomeView = ({
|
|
|
1449
1606
|
secondaryAction,
|
|
1450
1607
|
transactionsProps
|
|
1451
1608
|
}) => {
|
|
1452
|
-
const [displayAmount, setDisplayAmount] =
|
|
1453
|
-
const [isBalanceHidden, setIsBalanceHidden] =
|
|
1609
|
+
const [displayAmount, setDisplayAmount] = useState10("0.00");
|
|
1610
|
+
const [isBalanceHidden, setIsBalanceHidden] = useState10(false);
|
|
1454
1611
|
useEffect7(() => {
|
|
1455
1612
|
const target = parseFloat(balanceAmount.replace(/,/g, ""));
|
|
1456
1613
|
if (isNaN(target)) {
|
|
@@ -1480,29 +1637,29 @@ var UniversalHomeView = ({
|
|
|
1480
1637
|
requestAnimationFrame(step);
|
|
1481
1638
|
}, [balanceAmount]);
|
|
1482
1639
|
const [intPart, decPart] = displayAmount.includes(".") ? displayAmount.split(".") : [displayAmount, "00"];
|
|
1483
|
-
return /* @__PURE__ */
|
|
1640
|
+
return /* @__PURE__ */ React17.createElement("div", { className: "w-full max-w-5xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ React17.createElement("div", { className: "relative flex items-start justify-between w-full pt-4 pb-8" }, /* @__PURE__ */ React17.createElement("div", { className: "flex flex-col items-start text-left z-10 w-full" }, /* @__PURE__ */ React17.createElement("div", { className: "flex items-center gap-2 mb-1.5" }, /* @__PURE__ */ React17.createElement("span", { className: "text-[12px] sm:text-[13px] text-neutral-500" }, balanceLabel), /* @__PURE__ */ React17.createElement(
|
|
1484
1641
|
"button",
|
|
1485
1642
|
{
|
|
1486
1643
|
onClick: () => setIsBalanceHidden(!isBalanceHidden),
|
|
1487
1644
|
className: "text-neutral-400 hover:text-black transition-colors outline-none"
|
|
1488
1645
|
},
|
|
1489
|
-
/* @__PURE__ */
|
|
1490
|
-
)), /* @__PURE__ */
|
|
1646
|
+
/* @__PURE__ */ React17.createElement(HugeiconsIcon11, { icon: isBalanceHidden ? ViewIcon : ViewOffSlashIcon, size: 14 })
|
|
1647
|
+
)), /* @__PURE__ */ React17.createElement("h1", { className: `text-3xl sm:text-4xl md:text-5xl text-black tracking-tight mb-5 tabular-nums flex items-baseline transition-all duration-300 ${isBalanceHidden ? "blur-sm opacity-40 select-none" : ""}` }, /* @__PURE__ */ React17.createElement("span", { className: "text-xl sm:text-2xl text-neutral-400 mr-1" }, balanceCurrency), intPart, /* @__PURE__ */ React17.createElement("span", { className: "text-xl sm:text-2xl text-neutral-400" }, ".", decPart)), /* @__PURE__ */ React17.createElement("div", { className: "flex items-center gap-3" }, primaryAction && /* @__PURE__ */ React17.createElement(
|
|
1491
1648
|
ThreeDActionButton,
|
|
1492
1649
|
{
|
|
1493
1650
|
onClick: primaryAction.onClick,
|
|
1494
1651
|
className: "px-6 py-2.5 sm:px-8 sm:py-2.5"
|
|
1495
1652
|
},
|
|
1496
|
-
/* @__PURE__ */
|
|
1497
|
-
), secondaryAction && /* @__PURE__ */
|
|
1653
|
+
/* @__PURE__ */ React17.createElement("span", { className: "flex items-center gap-1.5 text-[13px] tracking-wide " }, primaryAction.label, primaryAction.icon && /* @__PURE__ */ React17.createElement(HugeiconsIcon11, { icon: primaryAction.icon, size: 16 }))
|
|
1654
|
+
), secondaryAction && /* @__PURE__ */ React17.createElement(
|
|
1498
1655
|
"button",
|
|
1499
1656
|
{
|
|
1500
1657
|
onClick: secondaryAction.onClick,
|
|
1501
1658
|
className: "flex items-center gap-1.5 px-6 py-2.5 sm:px-8 sm:py-2.5 rounded-full border border-neutral-200 text-black hover:bg-neutral-50 transition-colors outline-none"
|
|
1502
1659
|
},
|
|
1503
|
-
/* @__PURE__ */
|
|
1504
|
-
secondaryAction.icon && /* @__PURE__ */
|
|
1505
|
-
)))), /* @__PURE__ */
|
|
1660
|
+
/* @__PURE__ */ React17.createElement("span", { className: "text-[13px] tracking-wide " }, secondaryAction.label),
|
|
1661
|
+
secondaryAction.icon && /* @__PURE__ */ React17.createElement(HugeiconsIcon11, { icon: secondaryAction.icon, size: 16 })
|
|
1662
|
+
)))), /* @__PURE__ */ React17.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ React17.createElement(
|
|
1506
1663
|
UniversalTransactionPage,
|
|
1507
1664
|
{
|
|
1508
1665
|
...transactionsProps,
|
|
@@ -1514,18 +1671,18 @@ var UniversalHomeView = ({
|
|
|
1514
1671
|
};
|
|
1515
1672
|
|
|
1516
1673
|
// src/components/UniversalWalletPage.tsx
|
|
1517
|
-
import
|
|
1674
|
+
import React18, { useState as useState11 } from "react";
|
|
1518
1675
|
import toast5 from "react-hot-toast";
|
|
1519
|
-
import { HugeiconsIcon as
|
|
1676
|
+
import { HugeiconsIcon as HugeiconsIcon12 } from "@hugeicons/react";
|
|
1520
1677
|
import {
|
|
1521
1678
|
Search01Icon as Search01Icon2,
|
|
1522
1679
|
CancelCircleIcon as CancelCircleIcon3,
|
|
1523
|
-
Loading03Icon as
|
|
1680
|
+
Loading03Icon as Loading03Icon6
|
|
1524
1681
|
} from "@hugeicons/core-free-icons";
|
|
1525
|
-
var PageSpinner3 = () => /* @__PURE__ */
|
|
1682
|
+
var PageSpinner3 = () => /* @__PURE__ */ React18.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React18.createElement(HugeiconsIcon12, { icon: Loading03Icon6, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
1526
1683
|
var WalletLogo = ({ src, alt, sizeClass = "w-10 h-10" }) => {
|
|
1527
|
-
const [isLoaded, setIsLoaded] =
|
|
1528
|
-
return /* @__PURE__ */
|
|
1684
|
+
const [isLoaded, setIsLoaded] = useState11(false);
|
|
1685
|
+
return /* @__PURE__ */ React18.createElement("div", { className: `relative shrink-0 rounded-full bg-neutral-100 flex items-center justify-center overflow-hidden ${sizeClass}` }, !isLoaded && /* @__PURE__ */ React18.createElement(HugeiconsIcon12, { icon: Loading03Icon6, size: 16, className: "animate-spin text-neutral-400 absolute" }), /* @__PURE__ */ React18.createElement(
|
|
1529
1686
|
"img",
|
|
1530
1687
|
{
|
|
1531
1688
|
src,
|
|
@@ -1547,8 +1704,8 @@ var UniversalWalletPage = ({
|
|
|
1547
1704
|
onDownloadPayId,
|
|
1548
1705
|
onCopyAddress
|
|
1549
1706
|
}) => {
|
|
1550
|
-
const [selectedWallet, setSelectedWallet] =
|
|
1551
|
-
const [localSearchQuery, setLocalSearchQuery] =
|
|
1707
|
+
const [selectedWallet, setSelectedWallet] = useState11(null);
|
|
1708
|
+
const [localSearchQuery, setLocalSearchQuery] = useState11("");
|
|
1552
1709
|
const filteredWallets = wallets.filter((wallet) => {
|
|
1553
1710
|
const q = localSearchQuery.toLowerCase();
|
|
1554
1711
|
return wallet.name.toLowerCase().includes(q) || wallet.currency.toLowerCase().includes(q) || wallet.network.toLowerCase().includes(q);
|
|
@@ -1561,7 +1718,7 @@ var UniversalWalletPage = ({
|
|
|
1561
1718
|
}
|
|
1562
1719
|
toast5.success("Address copied to clipboard");
|
|
1563
1720
|
};
|
|
1564
|
-
return /* @__PURE__ */
|
|
1721
|
+
return /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col gap-6 animate-in max-w-5xl fade-in duration-300" }, /* @__PURE__ */ React18.createElement(ManagedToaster, null), !hideControls && /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 w-full" }, /* @__PURE__ */ React18.createElement("div", { className: "relative w-full sm:w-96" }, /* @__PURE__ */ React18.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ React18.createElement(HugeiconsIcon12, { icon: Search01Icon2, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ React18.createElement(
|
|
1565
1722
|
"input",
|
|
1566
1723
|
{
|
|
1567
1724
|
type: "text",
|
|
@@ -1570,16 +1727,16 @@ var UniversalWalletPage = ({
|
|
|
1570
1727
|
onChange: (e) => setLocalSearchQuery(e.target.value),
|
|
1571
1728
|
className: "w-full pl-10 pr-4 py-2 bg-white rounded-full text-[13px] text-black placeholder-neutral-400 outline-none transition-all duration-300 focus:border-black"
|
|
1572
1729
|
}
|
|
1573
|
-
))), /* @__PURE__ */
|
|
1730
|
+
))), /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ React18.createElement("div", null, /* @__PURE__ */ React18.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ React18.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription))), /* @__PURE__ */ React18.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ React18.createElement(PageSpinner3, null) : /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React18.createElement("div", null, filteredWallets.length === 0 ? /* @__PURE__ */ React18.createElement("p", { className: "text-xs text-neutral-400 py-6 text-center" }, "No wallets found") : filteredWallets.map((wallet) => /* @__PURE__ */ React18.createElement(
|
|
1574
1731
|
"div",
|
|
1575
1732
|
{
|
|
1576
1733
|
key: wallet.id,
|
|
1577
1734
|
onClick: () => setSelectedWallet(wallet),
|
|
1578
1735
|
className: "flex items-center justify-between py-4 hover:bg-neutral-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl"
|
|
1579
1736
|
},
|
|
1580
|
-
/* @__PURE__ */
|
|
1581
|
-
/* @__PURE__ */
|
|
1582
|
-
)))))), selectedWallet && /* @__PURE__ */
|
|
1737
|
+
/* @__PURE__ */ React18.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ React18.createElement(WalletLogo, { src: wallet.logoSrc, alt: wallet.name }), /* @__PURE__ */ React18.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-1" }, /* @__PURE__ */ React18.createElement("p", { className: "text-[13px] text-black truncate " }, wallet.name), /* @__PURE__ */ React18.createElement("p", { className: `text-[13px] text-neutral-500 truncate transition-all duration-300 ${hideBalanceAmounts ? "blur-sm opacity-40 select-none" : ""}` }, wallet.balance, " ", wallet.currency))),
|
|
1738
|
+
/* @__PURE__ */ React18.createElement("div", { className: "shrink-0 flex flex-col items-end gap-1 text-right" }, /* @__PURE__ */ React18.createElement("span", { className: "text-[10px] tracking-wide text-neutral-600 bg-neutral-100 px-2.5 py-1 rounded-full " }, wallet.network))
|
|
1739
|
+
)))))), selectedWallet && /* @__PURE__ */ React18.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React18.createElement("div", { className: "absolute inset-0 bg-black/40 ", onClick: () => setSelectedWallet(null) }), /* @__PURE__ */ React18.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 max-h-[90vh]" }, /* @__PURE__ */ React18.createElement("div", { className: "flex items-center justify-between p-5 shrink-0 " }, /* @__PURE__ */ React18.createElement("h3", { className: "text-[15px] text-black tracking-tight" }, "Wallet Details"), /* @__PURE__ */ React18.createElement("button", { onClick: () => setSelectedWallet(null), className: "text-neutral-400 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ React18.createElement(HugeiconsIcon12, { icon: CancelCircleIcon3, size: 18 }))), /* @__PURE__ */ React18.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-6 pt-6" }, /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col items-center justify-center mb-6" }, /* @__PURE__ */ React18.createElement(WalletLogo, { src: selectedWallet.logoSrc, alt: selectedWallet.name, sizeClass: "w-14 h-14 mb-4" }), /* @__PURE__ */ React18.createElement("h2", { className: `text-2xl text-black mb-2 transition-all duration-300 ${hideBalanceAmounts ? "blur-[6px] opacity-40 select-none" : ""}` }, selectedWallet.balance, " ", selectedWallet.currency), /* @__PURE__ */ React18.createElement("span", { className: "text-[9px] tracking-widest text-neutral-500 px-4 py-1.5 rounded-full border border-neutral-200 uppercase mt-1 " }, selectedWallet.network, " NETWORK")), renderQrCode && /* @__PURE__ */ React18.createElement("div", { className: "w-full flex justify-center mb-6 mix-blend-multiply" }, renderQrCode(selectedWallet)), /* @__PURE__ */ React18.createElement("div", { className: "grid grid-cols-1 gap-y-6 gap-x-4 mb-10" }, /* @__PURE__ */ React18.createElement("div", null, /* @__PURE__ */ React18.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Wallet Address"), /* @__PURE__ */ React18.createElement("span", { className: "text-[13px] text-black break-all " }, selectedWallet.address)), /* @__PURE__ */ React18.createElement("div", null, /* @__PURE__ */ React18.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-2" }, "Wallet Name"), /* @__PURE__ */ React18.createElement("span", { className: "text-[13px] text-black" }, selectedWallet.name))), /* @__PURE__ */ React18.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React18.createElement(
|
|
1583
1740
|
ThreeDActionButton,
|
|
1584
1741
|
{
|
|
1585
1742
|
onClick: () => onDownloadPayId && onDownloadPayId(selectedWallet),
|
|
@@ -1587,7 +1744,7 @@ var UniversalWalletPage = ({
|
|
|
1587
1744
|
className: "w-full py-3 text-[13px]"
|
|
1588
1745
|
},
|
|
1589
1746
|
"Generate Statement"
|
|
1590
|
-
), /* @__PURE__ */
|
|
1747
|
+
), /* @__PURE__ */ React18.createElement(
|
|
1591
1748
|
"button",
|
|
1592
1749
|
{
|
|
1593
1750
|
onClick: () => handleCopy(selectedWallet),
|
|
@@ -1598,8 +1755,8 @@ var UniversalWalletPage = ({
|
|
|
1598
1755
|
};
|
|
1599
1756
|
|
|
1600
1757
|
// src/components/UniversalCardPage.tsx
|
|
1601
|
-
import
|
|
1602
|
-
import { HugeiconsIcon as
|
|
1758
|
+
import React21, { useState as useState13, useEffect as useEffect9 } from "react";
|
|
1759
|
+
import { HugeiconsIcon as HugeiconsIcon15 } from "@hugeicons/react";
|
|
1603
1760
|
import {
|
|
1604
1761
|
SnowIcon,
|
|
1605
1762
|
Delete02Icon,
|
|
@@ -1609,51 +1766,10 @@ import {
|
|
|
1609
1766
|
Loading03Icon as Loading03Icon8
|
|
1610
1767
|
} from "@hugeicons/core-free-icons";
|
|
1611
1768
|
|
|
1612
|
-
// src/components/ConfirmationDialog.tsx
|
|
1613
|
-
import React18 from "react";
|
|
1614
|
-
import { HugeiconsIcon as HugeiconsIcon12 } from "@hugeicons/react";
|
|
1615
|
-
import { Loading03Icon as Loading03Icon6 } from "@hugeicons/core-free-icons";
|
|
1616
|
-
var ConfirmationDialog = ({
|
|
1617
|
-
isOpen,
|
|
1618
|
-
title,
|
|
1619
|
-
message,
|
|
1620
|
-
confirmText = "Confirm",
|
|
1621
|
-
cancelText = "Cancel",
|
|
1622
|
-
isProcessing = false,
|
|
1623
|
-
isDestructive = true,
|
|
1624
|
-
onClose,
|
|
1625
|
-
onConfirm
|
|
1626
|
-
}) => {
|
|
1627
|
-
if (!isOpen) return null;
|
|
1628
|
-
return /* @__PURE__ */ React18.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React18.createElement(
|
|
1629
|
-
"div",
|
|
1630
|
-
{
|
|
1631
|
-
className: "absolute inset-0 bg-black/40 ",
|
|
1632
|
-
onClick: () => !isProcessing && onClose()
|
|
1633
|
-
}
|
|
1634
|
-
), /* @__PURE__ */ React18.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__ */ React18.createElement("div", { className: "p-6 pb-4 text-center w-full" }, /* @__PURE__ */ React18.createElement("h3", { className: "text-[17px] text-black tracking-tight mb-2" }, title), /* @__PURE__ */ React18.createElement("p", { className: "text-[12px] text-neutral-500 leading-relaxed px-2" }, message)), /* @__PURE__ */ React18.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ React18.createElement(
|
|
1635
|
-
"button",
|
|
1636
|
-
{
|
|
1637
|
-
onClick: onClose,
|
|
1638
|
-
disabled: isProcessing,
|
|
1639
|
-
className: "flex-1 py-4 text-[14px] text-neutral-500 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none "
|
|
1640
|
-
},
|
|
1641
|
-
cancelText
|
|
1642
|
-
), /* @__PURE__ */ React18.createElement(
|
|
1643
|
-
"button",
|
|
1644
|
-
{
|
|
1645
|
-
onClick: onConfirm,
|
|
1646
|
-
disabled: isProcessing,
|
|
1647
|
-
className: `flex-1 py-4 text-[13px] transition-colors disabled:opacity-50 flex justify-center items-center outline-none ${isDestructive ? "text-red-500 hover:bg-red-50" : "text-black hover:bg-neutral-50"}`
|
|
1648
|
-
},
|
|
1649
|
-
isProcessing ? /* @__PURE__ */ React18.createElement(HugeiconsIcon12, { icon: Loading03Icon6, className: "animate-spin", size: 18 }) : confirmText
|
|
1650
|
-
))));
|
|
1651
|
-
};
|
|
1652
|
-
|
|
1653
1769
|
// src/components/PinDialerBottomSheet.tsx
|
|
1654
|
-
import React19, { useState as
|
|
1770
|
+
import React19, { useState as useState12, useEffect as useEffect8 } from "react";
|
|
1655
1771
|
import { HugeiconsIcon as HugeiconsIcon13 } from "@hugeicons/react";
|
|
1656
|
-
import { Loading03Icon as Loading03Icon7, CancelCircleIcon as CancelCircleIcon4 } from "@hugeicons/core-free-icons";
|
|
1772
|
+
import { Loading03Icon as Loading03Icon7, CancelCircleIcon as CancelCircleIcon4, LessThanIcon } from "@hugeicons/core-free-icons";
|
|
1657
1773
|
var PinDialerBottomSheet = ({
|
|
1658
1774
|
isOpen,
|
|
1659
1775
|
title = "Action Required",
|
|
@@ -1661,7 +1777,7 @@ var PinDialerBottomSheet = ({
|
|
|
1661
1777
|
onClose,
|
|
1662
1778
|
onComplete
|
|
1663
1779
|
}) => {
|
|
1664
|
-
const [pin, setPin] =
|
|
1780
|
+
const [pin, setPin] = useState12("");
|
|
1665
1781
|
useEffect8(() => {
|
|
1666
1782
|
setPin("");
|
|
1667
1783
|
}, [isOpen]);
|
|
@@ -1708,14 +1824,14 @@ var PinDialerBottomSheet = ({
|
|
|
1708
1824
|
{
|
|
1709
1825
|
key: num,
|
|
1710
1826
|
onClick: () => handlePinPress(num),
|
|
1711
|
-
className: "w-14 h-14 rounded-full flex
|
|
1827
|
+
className: "w-14 h-14 rounded-full flex bg-neutral-50 items-center justify-center text-sm text-black hover:bg-neutral-50 transition-colors mx-auto outline-none active:scale-95"
|
|
1712
1828
|
},
|
|
1713
1829
|
num
|
|
1714
1830
|
)), /* @__PURE__ */ React19.createElement("div", null), " ", /* @__PURE__ */ React19.createElement(
|
|
1715
1831
|
"button",
|
|
1716
1832
|
{
|
|
1717
1833
|
onClick: () => handlePinPress(0),
|
|
1718
|
-
className: "w-14 h-14 rounded-full flex
|
|
1834
|
+
className: "w-14 h-14 rounded-full flex bg-neutral-50 items-center justify-center text-sm text-black hover:bg-neutral-50 transition-colors mx-auto outline-none active:scale-95"
|
|
1719
1835
|
},
|
|
1720
1836
|
"0"
|
|
1721
1837
|
), /* @__PURE__ */ React19.createElement(
|
|
@@ -1724,49 +1840,98 @@ var PinDialerBottomSheet = ({
|
|
|
1724
1840
|
onClick: () => handlePinPress("del"),
|
|
1725
1841
|
className: "w-14 h-14 rounded-full flex items-center justify-center text-neutral-400 hover:text-black hover:bg-neutral-50 transition-colors mx-auto outline-none active:scale-95"
|
|
1726
1842
|
},
|
|
1727
|
-
/* @__PURE__ */ React19.createElement(HugeiconsIcon13, { icon:
|
|
1843
|
+
/* @__PURE__ */ React19.createElement(HugeiconsIcon13, { icon: LessThanIcon, size: 20 })
|
|
1728
1844
|
)))));
|
|
1729
1845
|
};
|
|
1730
1846
|
|
|
1847
|
+
// src/components/CardAction.tsx
|
|
1848
|
+
import React20 from "react";
|
|
1849
|
+
import { HugeiconsIcon as HugeiconsIcon14 } from "@hugeicons/react";
|
|
1850
|
+
import { CancelCircleIcon as CancelCircleIcon5, CreditCardIcon } from "@hugeicons/core-free-icons";
|
|
1851
|
+
var CardActionDialog = ({
|
|
1852
|
+
isOpen,
|
|
1853
|
+
card,
|
|
1854
|
+
actionType,
|
|
1855
|
+
onClose,
|
|
1856
|
+
onProceed
|
|
1857
|
+
}) => {
|
|
1858
|
+
if (!isOpen || !card) return null;
|
|
1859
|
+
const title = actionType === "ACTIVATE" ? "Activate Card" : "Create New Card";
|
|
1860
|
+
const description = actionType === "ACTIVATE" ? `You are about to activate your ${card.type.toLowerCase()} card. Once activated, you can view details and set limits.` : `Your current ${card.type.toLowerCase()} card is ${card.status.toLowerCase()}. You need to provision a new one to continue.`;
|
|
1861
|
+
return /* @__PURE__ */ React20.createElement("div", { className: "fixed inset-0 z-150 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React20.createElement(
|
|
1862
|
+
"div",
|
|
1863
|
+
{
|
|
1864
|
+
className: "absolute inset-0 bg-black/40 animate-in fade-in duration-200",
|
|
1865
|
+
onClick: onClose
|
|
1866
|
+
}
|
|
1867
|
+
), /* @__PURE__ */ React20.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__ */ React20.createElement("div", { className: "flex items-center justify-between p-5 shrink-0" }, /* @__PURE__ */ React20.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React20.createElement(HugeiconsIcon14, { icon: CreditCardIcon, size: 20, className: "text-black" }), /* @__PURE__ */ React20.createElement("h3", { className: "text-[16px] text-black font-medium tracking-tight" }, title)), /* @__PURE__ */ React20.createElement(
|
|
1868
|
+
"button",
|
|
1869
|
+
{
|
|
1870
|
+
onClick: onClose,
|
|
1871
|
+
className: "text-neutral-400 hover:text-black transition-colors outline-none"
|
|
1872
|
+
},
|
|
1873
|
+
/* @__PURE__ */ React20.createElement(HugeiconsIcon14, { icon: CancelCircleIcon5, size: 20 })
|
|
1874
|
+
)), /* @__PURE__ */ React20.createElement("div", { className: "p-6 text-center" }, /* @__PURE__ */ React20.createElement("p", { className: "text-[13px] text-neutral-500 leading-relaxed mb-6" }, description), /* @__PURE__ */ React20.createElement(
|
|
1875
|
+
"button",
|
|
1876
|
+
{
|
|
1877
|
+
onClick: onProceed,
|
|
1878
|
+
className: "w-full py-3.5 bg-black text-white text-[13px] font-medium rounded-xl hover:bg-neutral-800 transition-colors outline-none active:scale-95"
|
|
1879
|
+
},
|
|
1880
|
+
actionType === "ACTIVATE" ? "Activate Now" : "Create Card"
|
|
1881
|
+
))));
|
|
1882
|
+
};
|
|
1883
|
+
|
|
1731
1884
|
// src/components/UniversalCardPage.tsx
|
|
1732
1885
|
var UniversalCardPage = ({
|
|
1733
|
-
|
|
1734
|
-
cardNumber,
|
|
1735
|
-
expiry,
|
|
1736
|
-
cvv,
|
|
1737
|
-
cardBgSrc,
|
|
1738
|
-
backgroundOverlay,
|
|
1739
|
-
companyLogoSrc,
|
|
1740
|
-
networkLogoSrc,
|
|
1886
|
+
cards = [],
|
|
1741
1887
|
onReveal,
|
|
1742
1888
|
onFreeze,
|
|
1743
1889
|
onSetLimits,
|
|
1744
|
-
onDelete
|
|
1890
|
+
onDelete,
|
|
1891
|
+
onCardAction
|
|
1745
1892
|
}) => {
|
|
1746
|
-
const [
|
|
1747
|
-
const
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
const [
|
|
1753
|
-
const [
|
|
1754
|
-
const [
|
|
1893
|
+
const [activeTabIndex, setActiveTabIndex] = useState13(0);
|
|
1894
|
+
const activeCard = cards[activeTabIndex];
|
|
1895
|
+
useEffect9(() => {
|
|
1896
|
+
setIsFlipped(false);
|
|
1897
|
+
setIsRevealed(false);
|
|
1898
|
+
}, [activeTabIndex]);
|
|
1899
|
+
const [isFlipped, setIsFlipped] = useState13(false);
|
|
1900
|
+
const [isBgLoaded, setIsBgLoaded] = useState13(false);
|
|
1901
|
+
const [isRevealed, setIsRevealed] = useState13(false);
|
|
1902
|
+
const [isRevealing, setIsRevealing] = useState13(false);
|
|
1903
|
+
const [isFreezing, setIsFreezing] = useState13(false);
|
|
1904
|
+
const [isOverlayActionLoading, setIsOverlayActionLoading] = useState13(false);
|
|
1905
|
+
const [showDeleteDialog, setShowDeleteDialog] = useState13(false);
|
|
1906
|
+
const [isDeleting, setIsDeleting] = useState13(false);
|
|
1907
|
+
const [showPinDialer, setShowPinDialer] = useState13(false);
|
|
1908
|
+
const [showCardActionDialog, setShowCardActionDialog] = useState13(false);
|
|
1909
|
+
const [cardActionType, setCardActionType] = useState13("ACTIVATE");
|
|
1755
1910
|
useEffect9(() => {
|
|
1756
|
-
|
|
1911
|
+
setIsBgLoaded(false);
|
|
1912
|
+
if (!activeCard?.cardBgSrc) return;
|
|
1757
1913
|
const img = new Image();
|
|
1758
|
-
img.src = cardBgSrc;
|
|
1914
|
+
img.src = activeCard.cardBgSrc;
|
|
1759
1915
|
img.onload = () => {
|
|
1760
1916
|
setTimeout(() => setIsBgLoaded(true), 300);
|
|
1761
1917
|
};
|
|
1762
|
-
}, [cardBgSrc]);
|
|
1918
|
+
}, [activeCard?.cardBgSrc]);
|
|
1919
|
+
if (!activeCard) return /* @__PURE__ */ React21.createElement("div", { className: "text-center p-8 text-neutral-500" }, "No cards available");
|
|
1920
|
+
const isActivated = activeCard.status === "ACTIVATED";
|
|
1921
|
+
const isFrozen = activeCard.status === "FROZEN";
|
|
1922
|
+
const isUnactivated = activeCard.status === "UNACTIVATED";
|
|
1923
|
+
const isDead = ["BLOCKED", "EXPIRED", "DELETED"].includes(activeCard.status);
|
|
1924
|
+
const canFlip = isBgLoaded && isActivated;
|
|
1925
|
+
const actionsDisabled = !isActivated && !isFrozen;
|
|
1926
|
+
const revealDisabled = !isActivated;
|
|
1927
|
+
const freezeDisabled = isUnactivated || isDead;
|
|
1763
1928
|
const handleToggleReveal = () => {
|
|
1764
|
-
if (isRevealing) return;
|
|
1929
|
+
if (revealDisabled || isRevealing) return;
|
|
1765
1930
|
if (isRevealed) {
|
|
1766
1931
|
setIsRevealed(false);
|
|
1767
1932
|
setIsRevealing(true);
|
|
1768
1933
|
setTimeout(() => {
|
|
1769
|
-
if (onReveal) onReveal();
|
|
1934
|
+
if (onReveal) onReveal(activeCard.id);
|
|
1770
1935
|
setIsRevealing(false);
|
|
1771
1936
|
}, 800);
|
|
1772
1937
|
} else {
|
|
@@ -1778,67 +1943,125 @@ var UniversalCardPage = ({
|
|
|
1778
1943
|
setTimeout(() => {
|
|
1779
1944
|
setShowPinDialer(false);
|
|
1780
1945
|
setIsRevealed(true);
|
|
1781
|
-
if (onReveal) onReveal();
|
|
1946
|
+
if (onReveal) onReveal(activeCard.id);
|
|
1782
1947
|
setIsRevealing(false);
|
|
1783
1948
|
}, 1e3);
|
|
1784
1949
|
};
|
|
1785
1950
|
const handleToggleFreeze = () => {
|
|
1786
|
-
if (isFreezing) return;
|
|
1951
|
+
if (freezeDisabled || isFreezing) return;
|
|
1787
1952
|
setIsFreezing(true);
|
|
1788
1953
|
setTimeout(() => {
|
|
1789
|
-
|
|
1790
|
-
if (onFreeze) onFreeze();
|
|
1954
|
+
if (onFreeze) onFreeze(activeCard.id);
|
|
1791
1955
|
setIsFreezing(false);
|
|
1792
1956
|
}, 800);
|
|
1793
1957
|
};
|
|
1958
|
+
const handleOverlayUnfreeze = () => {
|
|
1959
|
+
if (isOverlayActionLoading) return;
|
|
1960
|
+
setIsOverlayActionLoading(true);
|
|
1961
|
+
setTimeout(() => {
|
|
1962
|
+
if (onFreeze) onFreeze(activeCard.id);
|
|
1963
|
+
setIsOverlayActionLoading(false);
|
|
1964
|
+
}, 800);
|
|
1965
|
+
};
|
|
1966
|
+
const handleOverlayActionClick = (type) => {
|
|
1967
|
+
setCardActionType(type);
|
|
1968
|
+
setShowCardActionDialog(true);
|
|
1969
|
+
};
|
|
1794
1970
|
const confirmDelete = async () => {
|
|
1795
1971
|
setIsDeleting(true);
|
|
1796
1972
|
setTimeout(() => {
|
|
1797
|
-
if (onDelete) onDelete();
|
|
1973
|
+
if (onDelete) onDelete(activeCard.id);
|
|
1798
1974
|
setIsDeleting(false);
|
|
1799
1975
|
setShowDeleteDialog(false);
|
|
1800
1976
|
}, 1200);
|
|
1801
1977
|
};
|
|
1802
|
-
const
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1978
|
+
const formatTabLabel = (type) => {
|
|
1979
|
+
const capitalized = type.charAt(0).toUpperCase() + type.slice(1).toLowerCase();
|
|
1980
|
+
return `${capitalized} Card`;
|
|
1981
|
+
};
|
|
1982
|
+
const displayCardNumber = isRevealed ? activeCard.cardNumber : `\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 ${activeCard.cardNumber.slice(-4)}`;
|
|
1983
|
+
const displayExpiry = isRevealed ? activeCard.expiry : "\u2022\u2022/\u2022\u2022";
|
|
1984
|
+
const displayCvv = isRevealed ? activeCard.cvv : "\u2022\u2022\u2022";
|
|
1985
|
+
return /* @__PURE__ */ React21.createElement("div", { className: "w-full flex flex-col items-center animate-in fade-in duration-300 pb-12" }, cards.length > 1 && /* @__PURE__ */ React21.createElement("div", { className: "flex items-center justify-center mb-6 w-full px-2" }, /* @__PURE__ */ React21.createElement("div", { className: "flex items-center bg-white rounded-full p-1 sm:p-1.5 max-w-full overflow-x-auto custom-scrollbar " }, cards.map((tab, idx) => {
|
|
1986
|
+
const isActive = activeTabIndex === idx;
|
|
1987
|
+
return /* @__PURE__ */ React21.createElement(
|
|
1988
|
+
"button",
|
|
1989
|
+
{
|
|
1990
|
+
key: tab.id,
|
|
1991
|
+
onClick: () => setActiveTabIndex(idx),
|
|
1992
|
+
className: `px-4 sm:px-6 py-1.5 sm:py-2 rounded-full text-[11px] sm:text-xs font-medium transition-all duration-200 outline-none whitespace-nowrap shrink-0 ${isActive ? "bg-neutral-100 text-black" : "text-neutral-500 hover:text-black hover:bg-neutral-50/50"}`
|
|
1993
|
+
},
|
|
1994
|
+
formatTabLabel(tab.type)
|
|
1995
|
+
);
|
|
1996
|
+
}))), /* @__PURE__ */ React21.createElement("div", { className: "w-full pt-2 pb-2 flex justify-center", style: { perspective: "1000px" } }, /* @__PURE__ */ React21.createElement(
|
|
1806
1997
|
"div",
|
|
1807
1998
|
{
|
|
1808
1999
|
onClick: () => {
|
|
1809
|
-
if (
|
|
2000
|
+
if (canFlip) setIsFlipped(!isFlipped);
|
|
1810
2001
|
},
|
|
1811
|
-
className: `relative w-full max-w-85 transition-transform duration-700 ${!isBgLoaded ? "cursor-wait" : "cursor-pointer"}`,
|
|
2002
|
+
className: `relative w-full max-w-85 transition-transform duration-700 ${!isBgLoaded ? "cursor-wait" : canFlip ? "cursor-pointer" : "cursor-default"}`,
|
|
1812
2003
|
style: {
|
|
1813
2004
|
height: 185,
|
|
1814
2005
|
transformStyle: "preserve-3d",
|
|
1815
2006
|
transform: isFlipped ? "rotateY(180deg)" : "rotateY(0deg)"
|
|
1816
2007
|
}
|
|
1817
2008
|
},
|
|
1818
|
-
!isBgLoaded && /* @__PURE__ */
|
|
1819
|
-
/* @__PURE__ */
|
|
2009
|
+
!isBgLoaded && /* @__PURE__ */ React21.createElement("div", { className: "absolute inset-0 w-full h-full bg-white rounded-2xl flex items-center justify-center z-50 " }, /* @__PURE__ */ React21.createElement(HugeiconsIcon15, { icon: Loading03Icon8, size: 28, className: "animate-spin text-black" })),
|
|
2010
|
+
!isActivated && isBgLoaded && /* @__PURE__ */ React21.createElement("div", { className: "absolute inset-0 z-40 w-full h-full rounded-2xl backdrop-blur-sm bg-white/20 flex flex-col items-center justify-center border border-white/30", style: { transform: "translateZ(1px)" } }, isUnactivated && /* @__PURE__ */ React21.createElement(
|
|
2011
|
+
"button",
|
|
2012
|
+
{
|
|
2013
|
+
onClick: (e) => {
|
|
2014
|
+
e.stopPropagation();
|
|
2015
|
+
handleOverlayActionClick("ACTIVATE");
|
|
2016
|
+
},
|
|
2017
|
+
className: "px-6 py-2.5 bg-white/35 text-black text-[12px] font-medium rounded-full transition-all outline-none active:scale-95"
|
|
2018
|
+
},
|
|
2019
|
+
"Activate Card"
|
|
2020
|
+
), isDead && /* @__PURE__ */ React21.createElement(
|
|
2021
|
+
"button",
|
|
2022
|
+
{
|
|
2023
|
+
onClick: (e) => {
|
|
2024
|
+
e.stopPropagation();
|
|
2025
|
+
handleOverlayActionClick("CREATE");
|
|
2026
|
+
},
|
|
2027
|
+
className: "px-6 py-2.5 bg-white/35 text-black text-[12px] font-medium rounded-full transition-all outline-none active:scale-95"
|
|
2028
|
+
},
|
|
2029
|
+
"Create Card"
|
|
2030
|
+
), isFrozen && /* @__PURE__ */ React21.createElement(
|
|
2031
|
+
"button",
|
|
2032
|
+
{
|
|
2033
|
+
onClick: (e) => {
|
|
2034
|
+
e.stopPropagation();
|
|
2035
|
+
handleOverlayUnfreeze();
|
|
2036
|
+
},
|
|
2037
|
+
disabled: isOverlayActionLoading,
|
|
2038
|
+
className: "px-6 py-2.5 bg-white/35 text-black text-[12px] font-medium rounded-full transition-all outline-none active:scale-95 flex items-center gap-2 disabled:opacity-80"
|
|
2039
|
+
},
|
|
2040
|
+
isOverlayActionLoading ? /* @__PURE__ */ React21.createElement(HugeiconsIcon15, { icon: Loading03Icon8, size: 16, className: "animate-spin" }) : "Unfreeze Card"
|
|
2041
|
+
)),
|
|
2042
|
+
/* @__PURE__ */ React21.createElement(
|
|
1820
2043
|
"div",
|
|
1821
2044
|
{
|
|
1822
2045
|
className: `absolute inset-0 w-full h-full rounded-2xl overflow-hidden transition-all duration-700 ${isBgLoaded ? "opacity-100 scale-100" : "opacity-0 scale-105"}`,
|
|
1823
2046
|
style: { backfaceVisibility: "hidden" }
|
|
1824
2047
|
},
|
|
1825
|
-
/* @__PURE__ */
|
|
2048
|
+
/* @__PURE__ */ React21.createElement(
|
|
1826
2049
|
"div",
|
|
1827
2050
|
{
|
|
1828
2051
|
className: "absolute inset-0 bg-cover bg-center",
|
|
1829
|
-
style: { backgroundImage: `url(${cardBgSrc}), linear-gradient(to bottom right, #111, #333)` }
|
|
2052
|
+
style: { backgroundImage: `url(${activeCard.cardBgSrc}), linear-gradient(to bottom right, #111, #333)` }
|
|
1830
2053
|
}
|
|
1831
2054
|
),
|
|
1832
|
-
backgroundOverlay && /* @__PURE__ */
|
|
2055
|
+
activeCard.backgroundOverlay && /* @__PURE__ */ React21.createElement(
|
|
1833
2056
|
"div",
|
|
1834
2057
|
{
|
|
1835
2058
|
className: "absolute inset-0 bg-cover bg-center pointer-events-none",
|
|
1836
|
-
style: { backgroundImage: `url(${backgroundOverlay})` }
|
|
2059
|
+
style: { backgroundImage: `url(${activeCard.backgroundOverlay})` }
|
|
1837
2060
|
}
|
|
1838
2061
|
),
|
|
1839
|
-
/* @__PURE__ */
|
|
2062
|
+
/* @__PURE__ */ React21.createElement("div", { className: "relative z-10 w-full h-full p-5 flex flex-col justify-between" }, /* @__PURE__ */ React21.createElement("div", { className: "flex justify-between items-start w-full" }, /* @__PURE__ */ React21.createElement("div", null, /* @__PURE__ */ React21.createElement("span", { className: "text-[12px] text-white/70 " }, "Prepaid Card")), activeCard.companyLogoSrc && /* @__PURE__ */ React21.createElement("img", { src: activeCard.companyLogoSrc, alt: "Company Logo", className: "h-10 w-auto max-w-30 object-contain opacity-90" })), /* @__PURE__ */ React21.createElement("div", { className: "flex justify-between items-end w-full" }, /* @__PURE__ */ React21.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ React21.createElement("span", { className: "text-[10px] text-white/60 tracking-widest uppercase" }, "Card Number"), /* @__PURE__ */ React21.createElement("span", { className: "text-[14px] text-white tracking-widest font-light" }, displayCardNumber)), activeCard.networkLogoSrc && /* @__PURE__ */ React21.createElement("img", { src: activeCard.networkLogoSrc, alt: "Network Logo", className: "h-10 w-auto max-w-20 object-contain opacity-90" })))
|
|
1840
2063
|
),
|
|
1841
|
-
/* @__PURE__ */
|
|
2064
|
+
/* @__PURE__ */ React21.createElement(
|
|
1842
2065
|
"div",
|
|
1843
2066
|
{
|
|
1844
2067
|
className: `absolute inset-0 w-full h-full rounded-2xl overflow-hidden transition-all duration-700 ${isBgLoaded ? "opacity-100 scale-100" : "opacity-0 scale-105"}`,
|
|
@@ -1847,23 +2070,24 @@ var UniversalCardPage = ({
|
|
|
1847
2070
|
transform: "rotateY(180deg)"
|
|
1848
2071
|
}
|
|
1849
2072
|
},
|
|
1850
|
-
/* @__PURE__ */
|
|
2073
|
+
/* @__PURE__ */ React21.createElement(
|
|
1851
2074
|
"div",
|
|
1852
2075
|
{
|
|
1853
2076
|
className: "absolute inset-0 bg-cover bg-center",
|
|
1854
|
-
style: { backgroundImage: `url(${cardBgSrc}), linear-gradient(to bottom right, #111, #333)` }
|
|
2077
|
+
style: { backgroundImage: `url(${activeCard.cardBgSrc}), linear-gradient(to bottom right, #111, #333)` }
|
|
1855
2078
|
}
|
|
1856
2079
|
),
|
|
1857
|
-
backgroundOverlay && /* @__PURE__ */
|
|
2080
|
+
activeCard.backgroundOverlay && /* @__PURE__ */ React21.createElement(
|
|
1858
2081
|
"div",
|
|
1859
2082
|
{
|
|
1860
2083
|
className: "absolute inset-0 bg-cover bg-center pointer-events-none",
|
|
1861
|
-
style: { backgroundImage: `url(${backgroundOverlay})` }
|
|
2084
|
+
style: { backgroundImage: `url(${activeCard.backgroundOverlay})` }
|
|
1862
2085
|
}
|
|
1863
2086
|
),
|
|
1864
|
-
/* @__PURE__ */
|
|
2087
|
+
/* @__PURE__ */ React21.createElement("div", { className: "absolute top-6 left-0 right-0 h-10 bg-black/80 w-full" }),
|
|
2088
|
+
/* @__PURE__ */ React21.createElement("div", { className: "relative z-10 w-full h-full p-5 flex flex-col justify-end" }, /* @__PURE__ */ React21.createElement("div", { className: "w-full text-center mb-6" }, /* @__PURE__ */ React21.createElement("span", { className: "text-white text-3xl italic tracking-wide opacity-90", style: { fontFamily: "'Whisper', cursive" } }, activeCard.cardHolderName)), /* @__PURE__ */ React21.createElement("div", { className: "flex justify-between w-full max-w-[80%]" }, /* @__PURE__ */ React21.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React21.createElement("span", { className: "text-[9px] text-white/60 tracking-widest uppercase" }, "Expiry"), /* @__PURE__ */ React21.createElement("span", { className: "text-[14px] text-white font-light" }, displayExpiry)), /* @__PURE__ */ React21.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React21.createElement("span", { className: "text-[9px] text-white/60 tracking-widest uppercase" }, "CVV"), /* @__PURE__ */ React21.createElement("span", { className: "text-[14px] text-white font-light" }, displayCvv))))
|
|
1865
2089
|
)
|
|
1866
|
-
)), /* @__PURE__ */
|
|
2090
|
+
)), /* @__PURE__ */ React21.createElement("p", { className: "text-xs text-neutral-400 mb-6 mt-1" }, isActivated ? "Tap to flip card" : "Action Required"), /* @__PURE__ */ React21.createElement("div", { className: "w-full flex flex-col gap-4" }, /* @__PURE__ */ React21.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ React21.createElement(
|
|
1867
2091
|
MenuRow,
|
|
1868
2092
|
{
|
|
1869
2093
|
icon: ViewOffSlashIcon2,
|
|
@@ -1872,9 +2096,10 @@ var UniversalCardPage = ({
|
|
|
1872
2096
|
onClick: handleToggleReveal,
|
|
1873
2097
|
isToggle: true,
|
|
1874
2098
|
toggleState: isRevealed,
|
|
1875
|
-
toggleLoading: isRevealing
|
|
2099
|
+
toggleLoading: isRevealing,
|
|
2100
|
+
disabled: revealDisabled
|
|
1876
2101
|
}
|
|
1877
|
-
), /* @__PURE__ */
|
|
2102
|
+
), /* @__PURE__ */ React21.createElement(
|
|
1878
2103
|
MenuRow,
|
|
1879
2104
|
{
|
|
1880
2105
|
icon: SnowIcon,
|
|
@@ -1883,27 +2108,34 @@ var UniversalCardPage = ({
|
|
|
1883
2108
|
onClick: handleToggleFreeze,
|
|
1884
2109
|
isToggle: true,
|
|
1885
2110
|
toggleState: isFrozen,
|
|
1886
|
-
toggleLoading: isFreezing
|
|
2111
|
+
toggleLoading: isFreezing,
|
|
2112
|
+
disabled: freezeDisabled
|
|
1887
2113
|
}
|
|
1888
|
-
), /* @__PURE__ */
|
|
2114
|
+
), /* @__PURE__ */ React21.createElement(
|
|
1889
2115
|
MenuRow,
|
|
1890
2116
|
{
|
|
1891
2117
|
icon: Dollar02Icon,
|
|
1892
2118
|
title: "Set Limits",
|
|
1893
2119
|
subtitle: "Set card limits",
|
|
1894
|
-
onClick:
|
|
2120
|
+
onClick: () => {
|
|
2121
|
+
if (!actionsDisabled && onSetLimits) onSetLimits(activeCard.id);
|
|
2122
|
+
},
|
|
2123
|
+
disabled: actionsDisabled,
|
|
1895
2124
|
isLast: true
|
|
1896
2125
|
}
|
|
1897
|
-
)), /* @__PURE__ */
|
|
2126
|
+
)), /* @__PURE__ */ React21.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ React21.createElement(
|
|
1898
2127
|
MenuRow,
|
|
1899
2128
|
{
|
|
1900
2129
|
icon: Delete02Icon,
|
|
1901
2130
|
title: "Delete card",
|
|
1902
2131
|
subtitle: "Permanently delete card",
|
|
1903
|
-
onClick: () =>
|
|
2132
|
+
onClick: () => {
|
|
2133
|
+
if (!actionsDisabled) setShowDeleteDialog(true);
|
|
2134
|
+
},
|
|
2135
|
+
disabled: actionsDisabled,
|
|
1904
2136
|
isLast: true
|
|
1905
2137
|
}
|
|
1906
|
-
))), /* @__PURE__ */
|
|
2138
|
+
))), /* @__PURE__ */ React21.createElement(
|
|
1907
2139
|
ConfirmationDialog,
|
|
1908
2140
|
{
|
|
1909
2141
|
isOpen: showDeleteDialog,
|
|
@@ -1915,7 +2147,7 @@ var UniversalCardPage = ({
|
|
|
1915
2147
|
onClose: () => setShowDeleteDialog(false),
|
|
1916
2148
|
onConfirm: confirmDelete
|
|
1917
2149
|
}
|
|
1918
|
-
), /* @__PURE__ */
|
|
2150
|
+
), /* @__PURE__ */ React21.createElement(
|
|
1919
2151
|
PinDialerBottomSheet,
|
|
1920
2152
|
{
|
|
1921
2153
|
isOpen: showPinDialer,
|
|
@@ -1924,6 +2156,18 @@ var UniversalCardPage = ({
|
|
|
1924
2156
|
onClose: () => setShowPinDialer(false),
|
|
1925
2157
|
onComplete: handlePinComplete
|
|
1926
2158
|
}
|
|
2159
|
+
), /* @__PURE__ */ React21.createElement(
|
|
2160
|
+
CardActionDialog,
|
|
2161
|
+
{
|
|
2162
|
+
isOpen: showCardActionDialog,
|
|
2163
|
+
card: activeCard,
|
|
2164
|
+
actionType: cardActionType,
|
|
2165
|
+
onClose: () => setShowCardActionDialog(false),
|
|
2166
|
+
onProceed: () => {
|
|
2167
|
+
if (onCardAction) onCardAction(activeCard.id, cardActionType);
|
|
2168
|
+
setShowCardActionDialog(false);
|
|
2169
|
+
}
|
|
2170
|
+
}
|
|
1927
2171
|
));
|
|
1928
2172
|
};
|
|
1929
2173
|
var MenuRow = ({
|
|
@@ -1936,21 +2180,22 @@ var MenuRow = ({
|
|
|
1936
2180
|
isLast = false,
|
|
1937
2181
|
isToggle = false,
|
|
1938
2182
|
toggleState = false,
|
|
1939
|
-
toggleLoading = false
|
|
1940
|
-
|
|
2183
|
+
toggleLoading = false,
|
|
2184
|
+
disabled = false
|
|
2185
|
+
}) => /* @__PURE__ */ React21.createElement(
|
|
1941
2186
|
"div",
|
|
1942
2187
|
{
|
|
1943
|
-
onClick,
|
|
1944
|
-
className: `flex items-center p-3
|
|
2188
|
+
onClick: disabled ? void 0 : onClick,
|
|
2189
|
+
className: `flex items-center p-3 transition-colors ${!isLast ? "" : ""} ${disabled ? "opacity-40 cursor-not-allowed" : "cursor-pointer hover:bg-neutral-50"}`
|
|
1945
2190
|
},
|
|
1946
|
-
/* @__PURE__ */
|
|
1947
|
-
/* @__PURE__ */
|
|
1948
|
-
isToggle ? /* @__PURE__ */
|
|
2191
|
+
/* @__PURE__ */ React21.createElement("div", { className: "w-9 h-9 rounded-full border border-neutral-200 flex items-center justify-center shrink-0 mr-4" }, /* @__PURE__ */ React21.createElement(HugeiconsIcon15, { icon, size: 16, className: iconColor })),
|
|
2192
|
+
/* @__PURE__ */ React21.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React21.createElement("p", { className: `text-[13px] truncate ${titleColor}` }, title), /* @__PURE__ */ React21.createElement("p", { className: "text-[11px] text-neutral-500 truncate" }, subtitle)),
|
|
2193
|
+
isToggle ? /* @__PURE__ */ React21.createElement("div", { className: `relative w-11 h-6 rounded-full transition-colors duration-300 ml-2 shrink-0 ${toggleState ? "bg-black" : "bg-neutral-200"} ${disabled ? "opacity-50" : ""}` }, /* @__PURE__ */ React21.createElement("div", { className: `absolute top-1 left-1 w-4 h-4 rounded-full bg-white shadow-sm transition-transform duration-300 flex items-center justify-center ${toggleState ? "translate-x-5" : "translate-x-0"}` }, toggleLoading && /* @__PURE__ */ React21.createElement(HugeiconsIcon15, { icon: Loading03Icon8, size: 10, className: "animate-spin text-black" }))) : /* @__PURE__ */ React21.createElement(HugeiconsIcon15, { icon: ArrowRight01Icon2, size: 18, className: "text-neutral-400 shrink-0 ml-2" })
|
|
1949
2194
|
);
|
|
1950
2195
|
|
|
1951
2196
|
// src/components/UniversalProfilePage.tsx
|
|
1952
|
-
import
|
|
1953
|
-
import { HugeiconsIcon as
|
|
2197
|
+
import React22, { useState as useState14 } from "react";
|
|
2198
|
+
import { HugeiconsIcon as HugeiconsIcon16 } from "@hugeicons/react";
|
|
1954
2199
|
import {
|
|
1955
2200
|
UserIcon,
|
|
1956
2201
|
LockKeyIcon as LockKeyIcon2,
|
|
@@ -1958,10 +2203,11 @@ import {
|
|
|
1958
2203
|
MessageQuestionIcon,
|
|
1959
2204
|
UserIdVerificationIcon,
|
|
1960
2205
|
FileDownloadIcon,
|
|
1961
|
-
LogoutCircle02Icon,
|
|
2206
|
+
LogoutCircle02Icon as LogoutCircle02Icon2,
|
|
1962
2207
|
UserRemove01Icon,
|
|
1963
2208
|
ArrowRight01Icon as ArrowRight01Icon3,
|
|
1964
|
-
Loading03Icon as Loading03Icon9
|
|
2209
|
+
Loading03Icon as Loading03Icon9,
|
|
2210
|
+
CrownIcon
|
|
1965
2211
|
} from "@hugeicons/core-free-icons";
|
|
1966
2212
|
var UniversalProfilePage = ({
|
|
1967
2213
|
avatarSrc,
|
|
@@ -1976,9 +2222,9 @@ var UniversalProfilePage = ({
|
|
|
1976
2222
|
onLogoutTap,
|
|
1977
2223
|
onDeleteTap
|
|
1978
2224
|
}) => {
|
|
1979
|
-
const [isAvatarLoaded, setIsAvatarLoaded] =
|
|
1980
|
-
const [showLogoutDialog, setShowLogoutDialog] =
|
|
1981
|
-
const [isLoggingOut, setIsLoggingOut] =
|
|
2225
|
+
const [isAvatarLoaded, setIsAvatarLoaded] = useState14(false);
|
|
2226
|
+
const [showLogoutDialog, setShowLogoutDialog] = useState14(false);
|
|
2227
|
+
const [isLoggingOut, setIsLoggingOut] = useState14(false);
|
|
1982
2228
|
const handleConfirmLogout = async () => {
|
|
1983
2229
|
setIsLoggingOut(true);
|
|
1984
2230
|
try {
|
|
@@ -1990,7 +2236,7 @@ var UniversalProfilePage = ({
|
|
|
1990
2236
|
setShowLogoutDialog(false);
|
|
1991
2237
|
}
|
|
1992
2238
|
};
|
|
1993
|
-
return /* @__PURE__ */
|
|
2239
|
+
return /* @__PURE__ */ React22.createElement("div", { className: "w-full max-w-md mx-auto flex flex-col items-center animate-in fade-in duration-300 pb-12" }, /* @__PURE__ */ React22.createElement("div", { className: "pt-8 pb-4 flex flex-col items-center" }, /* @__PURE__ */ React22.createElement("div", { className: "w-22 h-22 rounded-full bg-white p-1 mb-4 flex items-center justify-center" }, /* @__PURE__ */ React22.createElement("div", { className: "relative w-full h-full rounded-full overflow-hidden bg-neutral-100 flex items-center justify-center" }, avatarSrc ? /* @__PURE__ */ React22.createElement(React22.Fragment, null, !isAvatarLoaded && /* @__PURE__ */ React22.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-neutral-100" }, /* @__PURE__ */ React22.createElement(HugeiconsIcon16, { icon: Loading03Icon9, size: 24, className: "animate-spin text-black" })), /* @__PURE__ */ React22.createElement(
|
|
1994
2240
|
"img",
|
|
1995
2241
|
{
|
|
1996
2242
|
src: avatarSrc,
|
|
@@ -1998,7 +2244,7 @@ var UniversalProfilePage = ({
|
|
|
1998
2244
|
onLoad: () => setIsAvatarLoaded(true),
|
|
1999
2245
|
className: `w-full h-full object-cover transition-opacity duration-300 ${isAvatarLoaded ? "opacity-100" : "opacity-0"}`
|
|
2000
2246
|
}
|
|
2001
|
-
)) : /* @__PURE__ */
|
|
2247
|
+
)) : /* @__PURE__ */ React22.createElement(HugeiconsIcon16, { icon: UserIcon, size: 40, className: "text-neutral-300" }))), /* @__PURE__ */ React22.createElement("div", { className: "bg-white rounded-full px-4 py-2 flex items-center justify-center gap-2 mb-3" }, /* @__PURE__ */ React22.createElement("span", { className: "text-[12px] text-black" }, roleName), /* @__PURE__ */ React22.createElement(HugeiconsIcon16, { icon: CrownIcon, size: 14, className: "text-neutral-400" })), /* @__PURE__ */ React22.createElement("span", { className: "text-[12px] text-neutral-500" }, memberSince)), /* @__PURE__ */ React22.createElement("div", { className: "w-full flex flex-col gap-4 mt-2" }, /* @__PURE__ */ React22.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ React22.createElement(
|
|
2002
2248
|
MenuRow2,
|
|
2003
2249
|
{
|
|
2004
2250
|
icon: UserIcon,
|
|
@@ -2006,7 +2252,7 @@ var UniversalProfilePage = ({
|
|
|
2006
2252
|
subtitle: "Your account details",
|
|
2007
2253
|
onClick: onAccountTap
|
|
2008
2254
|
}
|
|
2009
|
-
), /* @__PURE__ */
|
|
2255
|
+
), /* @__PURE__ */ React22.createElement(
|
|
2010
2256
|
MenuRow2,
|
|
2011
2257
|
{
|
|
2012
2258
|
icon: LockKeyIcon2,
|
|
@@ -2014,7 +2260,7 @@ var UniversalProfilePage = ({
|
|
|
2014
2260
|
subtitle: "2FA & authentication",
|
|
2015
2261
|
onClick: onSecurityTap
|
|
2016
2262
|
}
|
|
2017
|
-
), /* @__PURE__ */
|
|
2263
|
+
), /* @__PURE__ */ React22.createElement(
|
|
2018
2264
|
MenuRow2,
|
|
2019
2265
|
{
|
|
2020
2266
|
icon: ShieldUserIcon,
|
|
@@ -2022,7 +2268,7 @@ var UniversalProfilePage = ({
|
|
|
2022
2268
|
subtitle: "Manage web3 profile",
|
|
2023
2269
|
onClick: onDefiTap
|
|
2024
2270
|
}
|
|
2025
|
-
), /* @__PURE__ */
|
|
2271
|
+
), /* @__PURE__ */ React22.createElement(
|
|
2026
2272
|
MenuRow2,
|
|
2027
2273
|
{
|
|
2028
2274
|
icon: MessageQuestionIcon,
|
|
@@ -2031,7 +2277,7 @@ var UniversalProfilePage = ({
|
|
|
2031
2277
|
onClick: onHelpTap,
|
|
2032
2278
|
isLast: true
|
|
2033
2279
|
}
|
|
2034
|
-
)), /* @__PURE__ */
|
|
2280
|
+
)), /* @__PURE__ */ React22.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ React22.createElement(
|
|
2035
2281
|
MenuRow2,
|
|
2036
2282
|
{
|
|
2037
2283
|
icon: UserIdVerificationIcon,
|
|
@@ -2039,7 +2285,7 @@ var UniversalProfilePage = ({
|
|
|
2039
2285
|
subtitle: "Account Verifications",
|
|
2040
2286
|
onClick: onVerificationsTap
|
|
2041
2287
|
}
|
|
2042
|
-
), /* @__PURE__ */
|
|
2288
|
+
), /* @__PURE__ */ React22.createElement(
|
|
2043
2289
|
MenuRow2,
|
|
2044
2290
|
{
|
|
2045
2291
|
icon: FileDownloadIcon,
|
|
@@ -2047,16 +2293,16 @@ var UniversalProfilePage = ({
|
|
|
2047
2293
|
subtitle: "Transfer your account",
|
|
2048
2294
|
onClick: onExportTap
|
|
2049
2295
|
}
|
|
2050
|
-
), /* @__PURE__ */
|
|
2296
|
+
), /* @__PURE__ */ React22.createElement(
|
|
2051
2297
|
MenuRow2,
|
|
2052
2298
|
{
|
|
2053
|
-
icon:
|
|
2299
|
+
icon: LogoutCircle02Icon2,
|
|
2054
2300
|
title: "LogOut",
|
|
2055
2301
|
subtitle: "End your session",
|
|
2056
2302
|
onClick: () => setShowLogoutDialog(true),
|
|
2057
2303
|
isLast: true
|
|
2058
2304
|
}
|
|
2059
|
-
)), /* @__PURE__ */
|
|
2305
|
+
)), /* @__PURE__ */ React22.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden mb-4" }, /* @__PURE__ */ React22.createElement(
|
|
2060
2306
|
MenuRow2,
|
|
2061
2307
|
{
|
|
2062
2308
|
icon: UserRemove01Icon,
|
|
@@ -2065,7 +2311,7 @@ var UniversalProfilePage = ({
|
|
|
2065
2311
|
onClick: onDeleteTap,
|
|
2066
2312
|
isLast: true
|
|
2067
2313
|
}
|
|
2068
|
-
))), /* @__PURE__ */
|
|
2314
|
+
))), /* @__PURE__ */ React22.createElement(
|
|
2069
2315
|
ConfirmationDialog,
|
|
2070
2316
|
{
|
|
2071
2317
|
isOpen: showLogoutDialog,
|
|
@@ -2079,28 +2325,28 @@ var UniversalProfilePage = ({
|
|
|
2079
2325
|
}
|
|
2080
2326
|
));
|
|
2081
2327
|
};
|
|
2082
|
-
var MenuRow2 = ({ icon, title, subtitle, onClick, iconColor = "text-black", titleColor = "text-black", isLast = false }) => /* @__PURE__ */
|
|
2328
|
+
var MenuRow2 = ({ icon, title, subtitle, onClick, iconColor = "text-black", titleColor = "text-black", isLast = false }) => /* @__PURE__ */ React22.createElement(
|
|
2083
2329
|
"div",
|
|
2084
2330
|
{
|
|
2085
2331
|
onClick,
|
|
2086
2332
|
className: `flex items-center p-4 cursor-pointer hover:bg-neutral-50 transition-colors ${!isLast ? "" : ""}`
|
|
2087
2333
|
},
|
|
2088
|
-
/* @__PURE__ */
|
|
2089
|
-
/* @__PURE__ */
|
|
2090
|
-
/* @__PURE__ */
|
|
2334
|
+
/* @__PURE__ */ React22.createElement("div", { className: "w-9 h-9 rounded-full border border-neutral-200 flex items-center justify-center shrink-0 mr-4" }, /* @__PURE__ */ React22.createElement(HugeiconsIcon16, { icon, size: 16, className: iconColor })),
|
|
2335
|
+
/* @__PURE__ */ React22.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React22.createElement("p", { className: `text-[13px] truncate ${titleColor}` }, title), /* @__PURE__ */ React22.createElement("p", { className: "text-[11px] text-neutral-500 truncate" }, subtitle)),
|
|
2336
|
+
/* @__PURE__ */ React22.createElement(HugeiconsIcon16, { icon: ArrowRight01Icon3, size: 18, className: "text-neutral-400 shrink-0 ml-2" })
|
|
2091
2337
|
);
|
|
2092
2338
|
|
|
2093
2339
|
// src/components/HeroSection.tsx
|
|
2094
|
-
import
|
|
2340
|
+
import React24, { useState as useState16, useEffect as useEffect10, useRef as useRef4 } from "react";
|
|
2095
2341
|
import Link5 from "next/link";
|
|
2096
2342
|
import Image3 from "next/image";
|
|
2097
2343
|
|
|
2098
2344
|
// src/components/WaitlistDialog.tsx
|
|
2099
|
-
import
|
|
2345
|
+
import React23, { useState as useState15 } from "react";
|
|
2100
2346
|
import { toast as toast6 } from "react-hot-toast";
|
|
2101
2347
|
var WaitlistDialog = ({ isOpen, onClose }) => {
|
|
2102
|
-
const [email, setEmail] =
|
|
2103
|
-
const [isLoading, setIsLoading] =
|
|
2348
|
+
const [email, setEmail] = useState15("");
|
|
2349
|
+
const [isLoading, setIsLoading] = useState15(false);
|
|
2104
2350
|
if (!isOpen) return null;
|
|
2105
2351
|
const handleSubmit = async (e) => {
|
|
2106
2352
|
e.preventDefault();
|
|
@@ -2131,12 +2377,12 @@ var WaitlistDialog = ({ isOpen, onClose }) => {
|
|
|
2131
2377
|
setIsLoading(false);
|
|
2132
2378
|
}
|
|
2133
2379
|
};
|
|
2134
|
-
return /* @__PURE__ */
|
|
2380
|
+
return /* @__PURE__ */ React23.createElement("div", { className: "fixed inset-0 z-100 flex items-center justify-center p-4 bg-black/40" }, /* @__PURE__ */ React23.createElement("div", { className: "absolute inset-0", onClick: !isLoading ? onClose : void 0 }), /* @__PURE__ */ React23.createElement(
|
|
2135
2381
|
"div",
|
|
2136
2382
|
{
|
|
2137
2383
|
className: "w-full max-w-md bg-white rounded-2xl shadow-2xl overflow-hidden relative z-10 animate-in fade-in zoom-in-95 duration-200"
|
|
2138
2384
|
},
|
|
2139
|
-
/* @__PURE__ */
|
|
2385
|
+
/* @__PURE__ */ React23.createElement(
|
|
2140
2386
|
"button",
|
|
2141
2387
|
{
|
|
2142
2388
|
onClick: onClose,
|
|
@@ -2144,7 +2390,7 @@ var WaitlistDialog = ({ isOpen, onClose }) => {
|
|
|
2144
2390
|
className: "absolute top-4 right-4 p-2 text-neutral-700 hover:text-neutral-400 transition-colors disabled:opacity-50 outline-none",
|
|
2145
2391
|
"aria-label": "Close dialog"
|
|
2146
2392
|
},
|
|
2147
|
-
/* @__PURE__ */
|
|
2393
|
+
/* @__PURE__ */ React23.createElement(
|
|
2148
2394
|
"svg",
|
|
2149
2395
|
{
|
|
2150
2396
|
xmlns: "http://www.w3.org/2000/svg",
|
|
@@ -2157,11 +2403,11 @@ var WaitlistDialog = ({ isOpen, onClose }) => {
|
|
|
2157
2403
|
strokeLinecap: "round",
|
|
2158
2404
|
strokeLinejoin: "round"
|
|
2159
2405
|
},
|
|
2160
|
-
/* @__PURE__ */
|
|
2161
|
-
/* @__PURE__ */
|
|
2406
|
+
/* @__PURE__ */ React23.createElement("path", { d: "M18 6 6 18" }),
|
|
2407
|
+
/* @__PURE__ */ React23.createElement("path", { d: "m6 6 12 12" })
|
|
2162
2408
|
)
|
|
2163
2409
|
),
|
|
2164
|
-
/* @__PURE__ */
|
|
2410
|
+
/* @__PURE__ */ React23.createElement("div", { className: "p-6 sm:p-8" }, /* @__PURE__ */ React23.createElement("div", { className: "mb-8 mt-2" }, /* @__PURE__ */ React23.createElement("h2", { className: "text-2xl text-black tracking-tight mb-2" }, "Join the Waitlist"), /* @__PURE__ */ React23.createElement("p", { className: "text-[13px] text-neutral-500 leading-relaxed" }, "Be the first to experience the future of Web3 freedom. Secure your early access spot today.")), /* @__PURE__ */ React23.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col gap-8" }, /* @__PURE__ */ React23.createElement(
|
|
2165
2411
|
TextInput,
|
|
2166
2412
|
{
|
|
2167
2413
|
label: "Email ID",
|
|
@@ -2171,7 +2417,7 @@ var WaitlistDialog = ({ isOpen, onClose }) => {
|
|
|
2171
2417
|
placeholder: "name@example.com",
|
|
2172
2418
|
disabled: isLoading
|
|
2173
2419
|
}
|
|
2174
|
-
), /* @__PURE__ */
|
|
2420
|
+
), /* @__PURE__ */ React23.createElement(
|
|
2175
2421
|
ThreeDActionButton,
|
|
2176
2422
|
{
|
|
2177
2423
|
type: "submit",
|
|
@@ -2204,8 +2450,8 @@ var HeroSection = ({
|
|
|
2204
2450
|
bgImageSrc,
|
|
2205
2451
|
isWaitlist = false
|
|
2206
2452
|
}) => {
|
|
2207
|
-
const [isAnimating, setIsAnimating] =
|
|
2208
|
-
const [isWaitlistOpen, setIsWaitlistOpen] =
|
|
2453
|
+
const [isAnimating, setIsAnimating] = useState16(false);
|
|
2454
|
+
const [isWaitlistOpen, setIsWaitlistOpen] = useState16(false);
|
|
2209
2455
|
const titleRef = useRef4(null);
|
|
2210
2456
|
useEffect10(() => {
|
|
2211
2457
|
const observer = new IntersectionObserver(
|
|
@@ -2229,7 +2475,7 @@ var HeroSection = ({
|
|
|
2229
2475
|
setIsWaitlistOpen(true);
|
|
2230
2476
|
}
|
|
2231
2477
|
};
|
|
2232
|
-
return /* @__PURE__ */
|
|
2478
|
+
return /* @__PURE__ */ React24.createElement("div", { className: "w-screen min-h-screen flex justify-center items-center p-4" }, /* @__PURE__ */ React24.createElement("section", { className: "relative h-[95vh] w-full overflow-hidden rounded-2xl " }, bgVideoSrc ? /* @__PURE__ */ React24.createElement(
|
|
2233
2479
|
"video",
|
|
2234
2480
|
{
|
|
2235
2481
|
src: bgVideoSrc,
|
|
@@ -2240,7 +2486,7 @@ var HeroSection = ({
|
|
|
2240
2486
|
playsInline: true,
|
|
2241
2487
|
className: "absolute inset-0 h-full w-full object-cover z-0"
|
|
2242
2488
|
}
|
|
2243
|
-
) : bgImageSrc ? /* @__PURE__ */
|
|
2489
|
+
) : bgImageSrc ? /* @__PURE__ */ React24.createElement(
|
|
2244
2490
|
Image3,
|
|
2245
2491
|
{
|
|
2246
2492
|
src: bgImageSrc,
|
|
@@ -2249,7 +2495,7 @@ var HeroSection = ({
|
|
|
2249
2495
|
priority: true,
|
|
2250
2496
|
className: "absolute inset-0 h-full w-full object-cover z-0"
|
|
2251
2497
|
}
|
|
2252
|
-
) : null, /* @__PURE__ */
|
|
2498
|
+
) : null, /* @__PURE__ */ React24.createElement(
|
|
2253
2499
|
"div",
|
|
2254
2500
|
{
|
|
2255
2501
|
className: "pointer-events-none absolute inset-0 z-10 opacity-[0.7] mix-blend-overlay",
|
|
@@ -2257,15 +2503,15 @@ var HeroSection = ({
|
|
|
2257
2503
|
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")`
|
|
2258
2504
|
}
|
|
2259
2505
|
}
|
|
2260
|
-
), /* @__PURE__ */
|
|
2506
|
+
), /* @__PURE__ */ React24.createElement("div", { className: "pointer-events-none absolute inset-0 bg-linear-to-b from-black/30 via-transparent to-black/80 z-10" }), /* @__PURE__ */ React24.createElement("div", { className: "absolute bottom-0 left-0 right-0 px-4 pb-4 sm:px-6 md:px-10 z-20" }, /* @__PURE__ */ React24.createElement("div", { className: "grid grid-cols-12 items-end gap-4" }, /* @__PURE__ */ React24.createElement("div", { className: "col-span-12 lg:col-span-8" }, /* @__PURE__ */ React24.createElement(
|
|
2261
2507
|
"h1",
|
|
2262
2508
|
{
|
|
2263
2509
|
ref: titleRef,
|
|
2264
2510
|
className: "leading-[0.85] tracking-[-0.07em] text-[18.2vw] sm:text-[16.8vw] md:text-[15.4vw] lg:text-[14vw] xl:text-[13.3vw] 2xl:text-[14vw] text-[#ffffff]"
|
|
2265
2511
|
},
|
|
2266
|
-
/* @__PURE__ */
|
|
2267
|
-
)), /* @__PURE__ */
|
|
2268
|
-
/* @__PURE__ */
|
|
2512
|
+
/* @__PURE__ */ React24.createElement("div", { className: "inline-flex flex-wrap" }, /* @__PURE__ */ React24.createElement("span", { className: `inline-block relative transition-all duration-1000 ${isAnimating ? "opacity-100 translate-y-0" : "opacity-0 translate-y-10"}` }, titlePrefix, titlePrefix && /* @__PURE__ */ React24.createElement("br", null), highlightText, /* @__PURE__ */ React24.createElement("span", { className: "absolute top-[0.65em] right-[-0.3em] text-[0.31em] text-[#ffffff]/70" }, "*")))
|
|
2513
|
+
)), /* @__PURE__ */ React24.createElement("div", { className: "col-span-12 flex flex-col gap-5 pb-6 lg:col-span-4 lg:pb-10" }, subtitle && /* @__PURE__ */ React24.createElement("p", { className: "text-xs text-[#ffffff]/70 sm:text-sm md:text-base leading-[1.2] max-w-md transition-opacity duration-1000 delay-300" }, subtitle), /* @__PURE__ */ React24.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center gap-4" }, ctaText && // Changed from <button> to <Link> so it actually navigates!
|
|
2514
|
+
/* @__PURE__ */ React24.createElement(
|
|
2269
2515
|
Link5,
|
|
2270
2516
|
{
|
|
2271
2517
|
href: isWaitlist ? "#" : ctaHref || "#",
|
|
@@ -2273,15 +2519,15 @@ var HeroSection = ({
|
|
|
2273
2519
|
className: "group inline-flex h-10 items-center gap-2 self-start rounded-full bg-[#ffffff] pl-5 pr-1 text-xs text-black transition-all hover:gap-3"
|
|
2274
2520
|
},
|
|
2275
2521
|
ctaText,
|
|
2276
|
-
/* @__PURE__ */
|
|
2277
|
-
), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */
|
|
2522
|
+
/* @__PURE__ */ React24.createElement("span", { className: "flex h-8 w-8 items-center justify-center rounded-full bg-black transition-transform group-hover:scale-110" }, /* @__PURE__ */ React24.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "lucide lucide-arrow-right h-4 w-4 text-[#ffffff]" }, /* @__PURE__ */ React24.createElement("path", { d: "M5 12h14" }), /* @__PURE__ */ React24.createElement("path", { d: "m12 5 7 7-7 7" })))
|
|
2523
|
+
), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */ React24.createElement(
|
|
2278
2524
|
Link5,
|
|
2279
2525
|
{
|
|
2280
2526
|
href: secondaryCtaHref,
|
|
2281
2527
|
className: "inline-flex h-10 items-center self-start justify-center text-xs tracking-wide rounded-full px-6 border border-[#ffffff]/30 text-[#ffffff] hover:bg-[#ffffff]/10 transition-colors"
|
|
2282
2528
|
},
|
|
2283
2529
|
secondaryCtaText
|
|
2284
|
-
)), showApps && appLogos && appLogos.length > 0 && /* @__PURE__ */
|
|
2530
|
+
)), showApps && appLogos && appLogos.length > 0 && /* @__PURE__ */ React24.createElement("div", { className: "flex flex-col gap-3 mt-4" }, appsText && /* @__PURE__ */ React24.createElement("span", { className: "text-[10px] tracking-widest uppercase text-[#ffffff]/50 " }, appsText), /* @__PURE__ */ React24.createElement("div", { className: "flex items-center gap-4" }, appLogos.map((logo, idx) => /* @__PURE__ */ React24.createElement("div", { key: idx, className: "relative h-6 w-6 sm:h-7 sm:w-7 opacity-70 hover:opacity-100 transition-opacity invert" }, /* @__PURE__ */ React24.createElement(
|
|
2285
2531
|
Image3,
|
|
2286
2532
|
{
|
|
2287
2533
|
src: logo.src,
|
|
@@ -2290,7 +2536,7 @@ var HeroSection = ({
|
|
|
2290
2536
|
height: 28,
|
|
2291
2537
|
className: "object-contain"
|
|
2292
2538
|
}
|
|
2293
|
-
))))))))), /* @__PURE__ */
|
|
2539
|
+
))))))))), /* @__PURE__ */ React24.createElement(
|
|
2294
2540
|
WaitlistDialog,
|
|
2295
2541
|
{
|
|
2296
2542
|
isOpen: isWaitlistOpen,
|
|
@@ -2300,10 +2546,10 @@ var HeroSection = ({
|
|
|
2300
2546
|
};
|
|
2301
2547
|
|
|
2302
2548
|
// src/components/AppBento2.tsx
|
|
2303
|
-
import
|
|
2304
|
-
import { HugeiconsIcon as
|
|
2549
|
+
import React25, { useState as useState17, useEffect as useEffect11, useRef as useRef5 } from "react";
|
|
2550
|
+
import { HugeiconsIcon as HugeiconsIcon17 } from "@hugeicons/react";
|
|
2305
2551
|
var AppBento2 = ({ tagline, headline, features }) => {
|
|
2306
|
-
const [isAnimating, setIsAnimating] =
|
|
2552
|
+
const [isAnimating, setIsAnimating] = useState17(false);
|
|
2307
2553
|
const titleRef = useRef5(null);
|
|
2308
2554
|
useEffect11(() => {
|
|
2309
2555
|
const observer = new IntersectionObserver(
|
|
@@ -2323,7 +2569,7 @@ var AppBento2 = ({ tagline, headline, features }) => {
|
|
|
2323
2569
|
}
|
|
2324
2570
|
return () => observer.disconnect();
|
|
2325
2571
|
}, []);
|
|
2326
|
-
return /* @__PURE__ */
|
|
2572
|
+
return /* @__PURE__ */ React25.createElement("div", { className: "w-full py-16" }, /* @__PURE__ */ React25.createElement("div", { className: "w-full flex justify-center px-4" }, /* @__PURE__ */ React25.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ React25.createElement("div", { className: "relative overflow-hidden mb-12 text-left" }, /* @__PURE__ */ React25.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React25.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4 " }, tagline), /* @__PURE__ */ React25.createElement(
|
|
2327
2573
|
"h2",
|
|
2328
2574
|
{
|
|
2329
2575
|
ref: titleRef,
|
|
@@ -2331,7 +2577,7 @@ var AppBento2 = ({ tagline, headline, features }) => {
|
|
|
2331
2577
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
2332
2578
|
},
|
|
2333
2579
|
headline
|
|
2334
|
-
))), /* @__PURE__ */
|
|
2580
|
+
))), /* @__PURE__ */ React25.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-6 gap-6" }, features.map((f, i) => {
|
|
2335
2581
|
const isWhite = i === 0;
|
|
2336
2582
|
const isBlack = i === 1;
|
|
2337
2583
|
const isNeutral = i === 2;
|
|
@@ -2353,36 +2599,36 @@ var AppBento2 = ({ tagline, headline, features }) => {
|
|
|
2353
2599
|
const textColor = isBlack ? "text-white" : "text-black";
|
|
2354
2600
|
const subTextColor = isBlack ? "text-neutral-300" : "text-neutral-600";
|
|
2355
2601
|
const labelColor = isBlack ? "text-neutral-400" : "text-neutral-500";
|
|
2356
|
-
return /* @__PURE__ */
|
|
2602
|
+
return /* @__PURE__ */ React25.createElement(
|
|
2357
2603
|
"div",
|
|
2358
2604
|
{
|
|
2359
2605
|
key: i,
|
|
2360
2606
|
className: `relative rounded-2xl overflow-hidden p-8 flex flex-col min-h-75 transition-all duration-500 group text-left ${getBgStyle()} ${f.size}`,
|
|
2361
2607
|
style: { boxShadow: getShadowStyle() }
|
|
2362
2608
|
},
|
|
2363
|
-
/* @__PURE__ */
|
|
2609
|
+
/* @__PURE__ */ React25.createElement(
|
|
2364
2610
|
"div",
|
|
2365
2611
|
{
|
|
2366
2612
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
2367
2613
|
style: { backgroundImage: `url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E")` }
|
|
2368
2614
|
}
|
|
2369
2615
|
),
|
|
2370
|
-
isBlack && /* @__PURE__ */
|
|
2371
|
-
/* @__PURE__ */
|
|
2372
|
-
/* @__PURE__ */
|
|
2616
|
+
isBlack && /* @__PURE__ */ React25.createElement("span", { className: "absolute inset-0 rounded-2xl bg-linear-to-b from-white/10 via-white/5 to-transparent pointer-events-none z-10" }),
|
|
2617
|
+
/* @__PURE__ */ React25.createElement("div", { className: "absolute inset-0 overflow-hidden pointer-events-none z-0" }, /* @__PURE__ */ React25.createElement("div", { className: `absolute -bottom-8 -right-8 transform group-hover:scale-110 transition-transform duration-700 ease-out ${isBlack ? "text-white/5" : "text-black/5"}` }, /* @__PURE__ */ React25.createElement(HugeiconsIcon17, { icon: f.icon, size: 180 }))),
|
|
2618
|
+
/* @__PURE__ */ React25.createElement("div", { className: "relative z-10 w-full h-full flex flex-col pointer-events-auto" }, /* @__PURE__ */ React25.createElement("div", { className: "flex items-center justify-between mb-8" }, /* @__PURE__ */ React25.createElement("span", { className: `text-[9px] tracking-widest ${labelColor}` }, f.label), /* @__PURE__ */ React25.createElement("div", { className: `p-2 rounded-full transition-colors ${isBlack ? "bg-white/10" : "bg-white/50 backdrop-blur-sm"}` }, /* @__PURE__ */ React25.createElement(HugeiconsIcon17, { icon: f.icon, size: 20, className: textColor }))), /* @__PURE__ */ React25.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React25.createElement("h3", { className: `text-xl mb-2 tracking-tight ${textColor}` }, f.title), /* @__PURE__ */ React25.createElement("p", { className: `text-[13px] leading-relaxed max-w-sm ${subTextColor}` }, f.desc)))
|
|
2373
2619
|
);
|
|
2374
2620
|
})))));
|
|
2375
2621
|
};
|
|
2376
2622
|
|
|
2377
2623
|
// src/components/FeatureScroll.tsx
|
|
2378
|
-
import
|
|
2624
|
+
import React26, { useRef as useRef6, useState as useState18, useEffect as useEffect12 } from "react";
|
|
2379
2625
|
import Image4 from "next/image";
|
|
2380
|
-
import { HugeiconsIcon as
|
|
2381
|
-
import { ArrowLeft01Icon as
|
|
2626
|
+
import { HugeiconsIcon as HugeiconsIcon18 } from "@hugeicons/react";
|
|
2627
|
+
import { ArrowLeft01Icon as ArrowLeft01Icon3, ArrowRight01Icon as ArrowRight01Icon4, Loading03Icon as Loading03Icon10 } from "@hugeicons/core-free-icons";
|
|
2382
2628
|
var FeatureCard = ({ feature, bgImage }) => {
|
|
2383
|
-
const [isBgLoading, setIsBgLoading] =
|
|
2384
|
-
const [isFgLoading, setIsFgLoading] =
|
|
2385
|
-
return /* @__PURE__ */
|
|
2629
|
+
const [isBgLoading, setIsBgLoading] = useState18(true);
|
|
2630
|
+
const [isFgLoading, setIsFgLoading] = useState18(!!feature.image);
|
|
2631
|
+
return /* @__PURE__ */ React26.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__ */ React26.createElement("div", { className: "relative w-full aspect-16/10 bg-neutral-100 rounded-2xl overflow-hidden mb-6 flex items-center justify-center" }, /* @__PURE__ */ React26.createElement(
|
|
2386
2632
|
Image4,
|
|
2387
2633
|
{
|
|
2388
2634
|
src: bgImage,
|
|
@@ -2395,7 +2641,7 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
2395
2641
|
${isBgLoading ? "blur-xl scale-110" : "blur-0 scale-100"}
|
|
2396
2642
|
`
|
|
2397
2643
|
}
|
|
2398
|
-
), /* @__PURE__ */
|
|
2644
|
+
), /* @__PURE__ */ React26.createElement(
|
|
2399
2645
|
"div",
|
|
2400
2646
|
{
|
|
2401
2647
|
className: "absolute inset-0 w-full h-full pointer-events-none z-0 opacity-[0.25] mix-blend-overlay",
|
|
@@ -2403,7 +2649,7 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
2403
2649
|
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")`
|
|
2404
2650
|
}
|
|
2405
2651
|
}
|
|
2406
|
-
), isFgLoading && feature.image && /* @__PURE__ */
|
|
2652
|
+
), isFgLoading && feature.image && /* @__PURE__ */ React26.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__ */ React26.createElement(HugeiconsIcon18, { icon: Loading03Icon10, size: 32, className: "animate-spin text-neutral-400" })), feature.image && /* @__PURE__ */ React26.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__ */ React26.createElement(
|
|
2407
2653
|
Image4,
|
|
2408
2654
|
{
|
|
2409
2655
|
src: feature.image,
|
|
@@ -2416,12 +2662,12 @@ var FeatureCard = ({ feature, bgImage }) => {
|
|
|
2416
2662
|
${isFgLoading ? "opacity-0 blur-xl" : "opacity-100 blur-0"}
|
|
2417
2663
|
`
|
|
2418
2664
|
}
|
|
2419
|
-
))), /* @__PURE__ */
|
|
2665
|
+
))), /* @__PURE__ */ React26.createElement("div", { className: "flex flex-col text-left pr-4" }, /* @__PURE__ */ React26.createElement("h3", { className: " text-xl tracking-tight text-black mb-2" }, feature.title), /* @__PURE__ */ React26.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 max-w-[90%]" }, feature.desc)));
|
|
2420
2666
|
};
|
|
2421
2667
|
var FeatureScroll = ({ tagline, headline, features }) => {
|
|
2422
2668
|
const scrollRef = useRef6(null);
|
|
2423
|
-
const [canScrollLeft, setCanScrollLeft] =
|
|
2424
|
-
const [canScrollRight, setCanScrollRight] =
|
|
2669
|
+
const [canScrollLeft, setCanScrollLeft] = useState18(false);
|
|
2670
|
+
const [canScrollRight, setCanScrollRight] = useState18(true);
|
|
2425
2671
|
const checkScroll = () => {
|
|
2426
2672
|
if (scrollRef.current) {
|
|
2427
2673
|
const { scrollLeft, scrollWidth, clientWidth } = scrollRef.current;
|
|
@@ -2445,7 +2691,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
2445
2691
|
"https://retinalabs.company/assets/images/bg_6.avif",
|
|
2446
2692
|
"https://retinalabs.company/assets/images/bg_1.avif"
|
|
2447
2693
|
];
|
|
2448
|
-
return /* @__PURE__ */
|
|
2694
|
+
return /* @__PURE__ */ React26.createElement("section", { className: "py-24 w-full flex justify-center relative z-10 overflow-hidden" }, /* @__PURE__ */ React26.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ React26.createElement("div", { className: "flex flex-col md:flex-row md:items-end justify-between gap-6 mb-12" }, /* @__PURE__ */ React26.createElement("div", { className: "relative z-10 text-left" }, /* @__PURE__ */ React26.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ React26.createElement("h2", { className: " text-3xl tracking-tight text-black leading-[1.05]" }, headline)), /* @__PURE__ */ React26.createElement("div", { className: "hidden md:flex items-center gap-3" }, /* @__PURE__ */ React26.createElement(
|
|
2449
2695
|
"button",
|
|
2450
2696
|
{
|
|
2451
2697
|
onClick: () => scroll("left"),
|
|
@@ -2453,8 +2699,8 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
2453
2699
|
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:hover:border-neutral-200 disabled:hover:text-neutral-500 disabled:cursor-not-allowed transition-all outline-none",
|
|
2454
2700
|
"aria-label": "Previous feature"
|
|
2455
2701
|
},
|
|
2456
|
-
/* @__PURE__ */
|
|
2457
|
-
), /* @__PURE__ */
|
|
2702
|
+
/* @__PURE__ */ React26.createElement(HugeiconsIcon18, { icon: ArrowLeft01Icon3, size: 20 })
|
|
2703
|
+
), /* @__PURE__ */ React26.createElement(
|
|
2458
2704
|
"button",
|
|
2459
2705
|
{
|
|
2460
2706
|
onClick: () => scroll("right"),
|
|
@@ -2462,57 +2708,57 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
2462
2708
|
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:hover:border-neutral-200 disabled:hover:text-neutral-500 disabled:cursor-not-allowed transition-all outline-none",
|
|
2463
2709
|
"aria-label": "Next feature"
|
|
2464
2710
|
},
|
|
2465
|
-
/* @__PURE__ */
|
|
2466
|
-
))), /* @__PURE__ */
|
|
2711
|
+
/* @__PURE__ */ React26.createElement(HugeiconsIcon18, { icon: ArrowRight01Icon4, size: 20 })
|
|
2712
|
+
))), /* @__PURE__ */ React26.createElement(
|
|
2467
2713
|
"div",
|
|
2468
2714
|
{
|
|
2469
2715
|
ref: scrollRef,
|
|
2470
2716
|
onScroll: checkScroll,
|
|
2471
2717
|
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"
|
|
2472
2718
|
},
|
|
2473
|
-
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */
|
|
2474
|
-
), /* @__PURE__ */
|
|
2719
|
+
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */ React26.createElement(FeatureCard, { key: idx, feature, bgImage: bgImages[idx] }))
|
|
2720
|
+
), /* @__PURE__ */ React26.createElement("div", { className: "flex md:hidden items-center justify-center gap-4 mt-2" }, /* @__PURE__ */ React26.createElement(
|
|
2475
2721
|
"button",
|
|
2476
2722
|
{
|
|
2477
2723
|
onClick: () => scroll("left"),
|
|
2478
2724
|
disabled: !canScrollLeft,
|
|
2479
2725
|
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 transition-all outline-none"
|
|
2480
2726
|
},
|
|
2481
|
-
/* @__PURE__ */
|
|
2482
|
-
), /* @__PURE__ */
|
|
2727
|
+
/* @__PURE__ */ React26.createElement(HugeiconsIcon18, { icon: ArrowLeft01Icon3, size: 20 })
|
|
2728
|
+
), /* @__PURE__ */ React26.createElement(
|
|
2483
2729
|
"button",
|
|
2484
2730
|
{
|
|
2485
2731
|
onClick: () => scroll("right"),
|
|
2486
2732
|
disabled: !canScrollRight,
|
|
2487
2733
|
className: "p-4 border border-neutral-200 rounded-full text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 transition-all outline-none"
|
|
2488
2734
|
},
|
|
2489
|
-
/* @__PURE__ */
|
|
2735
|
+
/* @__PURE__ */ React26.createElement(HugeiconsIcon18, { icon: ArrowRight01Icon4, size: 20 })
|
|
2490
2736
|
))));
|
|
2491
2737
|
};
|
|
2492
2738
|
|
|
2493
2739
|
// src/components/PlatformFeatures.tsx
|
|
2494
|
-
import
|
|
2495
|
-
import { HugeiconsIcon as
|
|
2740
|
+
import React27 from "react";
|
|
2741
|
+
import { HugeiconsIcon as HugeiconsIcon19 } from "@hugeicons/react";
|
|
2496
2742
|
var PlatformFeatures = ({
|
|
2497
2743
|
tagline,
|
|
2498
2744
|
headline,
|
|
2499
2745
|
description,
|
|
2500
2746
|
features
|
|
2501
2747
|
}) => {
|
|
2502
|
-
return /* @__PURE__ */
|
|
2748
|
+
return /* @__PURE__ */ React27.createElement("section", { className: "w-full flex justify-center mb-15 relative z-10" }, /* @__PURE__ */ React27.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col items-start mb-16 relative z-10" }, /* @__PURE__ */ React27.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ React27.createElement("h2", { className: "text-3xl tracking-tight text-black leading-[1.05] mb-6" }, headline), /* @__PURE__ */ React27.createElement("p", { className: "text-[15px] leading-[1.8] text-neutral-600 max-w-2xl" }, description)), /* @__PURE__ */ React27.createElement("div", { className: "w-full h-px bg-neutral-100 mb-16", "aria-hidden": "true" }), /* @__PURE__ */ React27.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-x-8 gap-y-12" }, features.map((feature, idx) => /* @__PURE__ */ React27.createElement(
|
|
2503
2749
|
"div",
|
|
2504
2750
|
{
|
|
2505
2751
|
key: idx,
|
|
2506
2752
|
className: "flex flex-col group animate-in fade-in slide-in-from-bottom-4 duration-700 fill-mode-both",
|
|
2507
2753
|
style: { animationDelay: feature.delay || "0ms" }
|
|
2508
2754
|
},
|
|
2509
|
-
/* @__PURE__ */
|
|
2510
|
-
/* @__PURE__ */
|
|
2755
|
+
/* @__PURE__ */ React27.createElement("div", { className: "flex flex-row items-center gap-4 mb-4" }, /* @__PURE__ */ React27.createElement("div", { className: "w-14 h-14 shrink-0 rounded-xl border border-neutral-200 flex items-center justify-center text-neutral-600 transition-colors duration-300" }, /* @__PURE__ */ React27.createElement(HugeiconsIcon19, { icon: feature.icon, size: 24 })), /* @__PURE__ */ React27.createElement("div", { className: "flex flex-col justify-center" }, /* @__PURE__ */ React27.createElement("span", { className: "text-[11px] tracking-widest text-neutral-400 mb-0.5" }, feature.label || "CAPABILITY"), /* @__PURE__ */ React27.createElement("h3", { className: "text-xl tracking-tight text-black" }, feature.title))),
|
|
2756
|
+
/* @__PURE__ */ React27.createElement("div", null, /* @__PURE__ */ React27.createElement("p", { className: "text-[13px] leading-relaxed text-neutral-600 pr-4" }, feature.desc))
|
|
2511
2757
|
)))));
|
|
2512
2758
|
};
|
|
2513
2759
|
|
|
2514
2760
|
// src/components/ManagedDocument.tsx
|
|
2515
|
-
import
|
|
2761
|
+
import React28, { useState as useState19, useEffect as useEffect13, useRef as useRef7 } from "react";
|
|
2516
2762
|
var ManagedDocument = ({
|
|
2517
2763
|
tagline,
|
|
2518
2764
|
title,
|
|
@@ -2520,7 +2766,7 @@ var ManagedDocument = ({
|
|
|
2520
2766
|
contactText,
|
|
2521
2767
|
contactEmail
|
|
2522
2768
|
}) => {
|
|
2523
|
-
const [isAnimating, setIsAnimating] =
|
|
2769
|
+
const [isAnimating, setIsAnimating] = useState19(false);
|
|
2524
2770
|
const titleRef = useRef7(null);
|
|
2525
2771
|
useEffect13(() => {
|
|
2526
2772
|
const observer = new IntersectionObserver(
|
|
@@ -2542,7 +2788,7 @@ var ManagedDocument = ({
|
|
|
2542
2788
|
}, []);
|
|
2543
2789
|
return (
|
|
2544
2790
|
// Outer layout wrapper (takes up available space, adds padding)
|
|
2545
|
-
/* @__PURE__ */
|
|
2791
|
+
/* @__PURE__ */ React28.createElement("div", { className: "grow pt-4 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React28.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ React28.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React28.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ React28.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ React28.createElement(
|
|
2546
2792
|
"h1",
|
|
2547
2793
|
{
|
|
2548
2794
|
ref: titleRef,
|
|
@@ -2550,7 +2796,7 @@ var ManagedDocument = ({
|
|
|
2550
2796
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
2551
2797
|
},
|
|
2552
2798
|
title
|
|
2553
|
-
)), sections.map((section, index) => /* @__PURE__ */
|
|
2799
|
+
)), sections.map((section, index) => /* @__PURE__ */ React28.createElement("div", { key: index, className: "relative px-5 md:px-12 py-8 md:py-10" }, section.heading && /* @__PURE__ */ React28.createElement("p", { className: " text-[11px] tracking-[0.2em] text-black mb-4 text-left " }, section.heading), section.paragraphs && section.paragraphs.length > 0 && /* @__PURE__ */ React28.createElement("div", { className: "text-[14px] leading-[1.8] text-neutral-700 space-y-4 text-left " }, section.paragraphs.map((text, pIndex) => /* @__PURE__ */ React28.createElement("p", { key: pIndex }, text))), section.quote && /* @__PURE__ */ React28.createElement("div", { className: `border-neutral-100 border rounded-xl p-6 ${section.paragraphs && section.paragraphs.length > 0 ? "mt-6" : ""}` }, /* @__PURE__ */ React28.createElement("p", { className: "text-neutral-900 text-[14px] md:text-[14px] leading-relaxed" }, '"', section.quote, '"')))), (contactText || contactEmail) && /* @__PURE__ */ React28.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10 pb-12 md:pb-14" }, /* @__PURE__ */ React28.createElement("p", { className: "text-[11px] text-neutral-600 text-left" }, contactText, contactEmail && /* @__PURE__ */ React28.createElement(
|
|
2554
2800
|
"a",
|
|
2555
2801
|
{
|
|
2556
2802
|
href: `mailto:${contactEmail}`,
|
|
@@ -2562,18 +2808,18 @@ var ManagedDocument = ({
|
|
|
2562
2808
|
};
|
|
2563
2809
|
|
|
2564
2810
|
// src/components/ManagedContactBlock.tsx
|
|
2565
|
-
import
|
|
2566
|
-
import { HugeiconsIcon as
|
|
2811
|
+
import React29, { useState as useState20, useEffect as useEffect14 } from "react";
|
|
2812
|
+
import { HugeiconsIcon as HugeiconsIcon20 } from "@hugeicons/react";
|
|
2567
2813
|
var SecureEmail = ({ user, domain, className }) => {
|
|
2568
|
-
const [isMounted, setIsMounted] =
|
|
2814
|
+
const [isMounted, setIsMounted] = useState20(false);
|
|
2569
2815
|
useEffect14(() => {
|
|
2570
2816
|
setIsMounted(true);
|
|
2571
2817
|
}, []);
|
|
2572
2818
|
if (!isMounted) {
|
|
2573
|
-
return /* @__PURE__ */
|
|
2819
|
+
return /* @__PURE__ */ React29.createElement("span", { className, style: { opacity: 0 } }, "Loading");
|
|
2574
2820
|
}
|
|
2575
2821
|
const email = `${user}@${domain}`;
|
|
2576
|
-
return /* @__PURE__ */
|
|
2822
|
+
return /* @__PURE__ */ React29.createElement("a", { href: `mailto:${email}`, className }, email);
|
|
2577
2823
|
};
|
|
2578
2824
|
var ManagedContactBlock = ({
|
|
2579
2825
|
tagline,
|
|
@@ -2582,7 +2828,7 @@ var ManagedContactBlock = ({
|
|
|
2582
2828
|
emails,
|
|
2583
2829
|
socials
|
|
2584
2830
|
}) => {
|
|
2585
|
-
return /* @__PURE__ */
|
|
2831
|
+
return /* @__PURE__ */ React29.createElement("div", { className: "grow pt-4 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React29.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ React29.createElement(
|
|
2586
2832
|
"div",
|
|
2587
2833
|
{
|
|
2588
2834
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -2591,21 +2837,21 @@ var ManagedContactBlock = ({
|
|
|
2591
2837
|
backgroundRepeat: "repeat"
|
|
2592
2838
|
}
|
|
2593
2839
|
}
|
|
2594
|
-
), /* @__PURE__ */
|
|
2840
|
+
), /* @__PURE__ */ React29.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React29.createElement("div", { className: "relative px-8 md:px-12 py-10" }, tagline && /* @__PURE__ */ React29.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ React29.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), /* @__PURE__ */ React29.createElement("div", { className: "relative px-8 md:px-12 py-8 pb-14" }, /* @__PURE__ */ React29.createElement("div", { className: "flex flex-wrap gap-12 lg:gap-16 w-full" }, company && /* @__PURE__ */ React29.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ React29.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Contact Details"), /* @__PURE__ */ React29.createElement("div", { className: "space-y-3 text-[13px] text-neutral-600 leading-[1.8]" }, company.name && /* @__PURE__ */ React29.createElement("p", { className: "text-black" }, company.name), company.lines && company.lines.map((line, idx) => /* @__PURE__ */ React29.createElement("p", { key: idx }, line)), company.phone && /* @__PURE__ */ React29.createElement("p", { className: "pt-2" }, /* @__PURE__ */ React29.createElement(
|
|
2595
2841
|
"a",
|
|
2596
2842
|
{
|
|
2597
2843
|
href: `tel:${company.phone.replace(/\s+/g, "")}`,
|
|
2598
2844
|
className: "transition-colors hover:text-black"
|
|
2599
2845
|
},
|
|
2600
2846
|
company.phone
|
|
2601
|
-
)))), emails && emails.length > 0 && /* @__PURE__ */
|
|
2847
|
+
)))), emails && emails.length > 0 && /* @__PURE__ */ React29.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ React29.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Email Directory"), /* @__PURE__ */ React29.createElement("div", { className: "space-y-6 text-[13px]" }, emails.map((email, idx) => /* @__PURE__ */ React29.createElement("div", { key: idx }, /* @__PURE__ */ React29.createElement("p", { className: "text-[11px] tracking-[0.2em] mb-1.5 text-neutral-500 " }, email.label), /* @__PURE__ */ React29.createElement(
|
|
2602
2848
|
SecureEmail,
|
|
2603
2849
|
{
|
|
2604
2850
|
user: email.user,
|
|
2605
2851
|
domain: email.domain,
|
|
2606
2852
|
className: "text-neutral-600 transition-colors hover:text-black"
|
|
2607
2853
|
}
|
|
2608
|
-
))))), socials && socials.length > 0 && /* @__PURE__ */
|
|
2854
|
+
))))), socials && socials.length > 0 && /* @__PURE__ */ React29.createElement("div", { className: "flex-1 min-w-65 space-y-6" }, /* @__PURE__ */ React29.createElement("p", { className: "text-[11px] tracking-[0.2em] text-black mb-4 " }, "Find Us Online"), /* @__PURE__ */ React29.createElement("div", { className: "flex flex-col space-y-5 pt-1" }, socials.map((social, idx) => /* @__PURE__ */ React29.createElement(
|
|
2609
2855
|
"a",
|
|
2610
2856
|
{
|
|
2611
2857
|
key: idx,
|
|
@@ -2615,25 +2861,25 @@ var ManagedContactBlock = ({
|
|
|
2615
2861
|
className: "flex items-center gap-3 transition-colors group text-neutral-600 hover:text-black",
|
|
2616
2862
|
"aria-label": social.label
|
|
2617
2863
|
},
|
|
2618
|
-
/* @__PURE__ */
|
|
2619
|
-
/* @__PURE__ */
|
|
2864
|
+
/* @__PURE__ */ React29.createElement(HugeiconsIcon20, { icon: social.icon, size: 18 }),
|
|
2865
|
+
/* @__PURE__ */ React29.createElement("span", { className: "text-[13px]" }, social.label)
|
|
2620
2866
|
)))))))));
|
|
2621
2867
|
};
|
|
2622
2868
|
|
|
2623
2869
|
// src/components/ManagedPricingBlock.tsx
|
|
2624
|
-
import
|
|
2870
|
+
import React30, { useState as useState21, useEffect as useEffect15, useRef as useRef8 } from "react";
|
|
2625
2871
|
import Link6 from "next/link";
|
|
2626
2872
|
import Image5 from "next/image";
|
|
2627
|
-
var CheckIcon = ({ className = "" }) => /* @__PURE__ */
|
|
2628
|
-
var CrossIcon = ({ className = "" }) => /* @__PURE__ */
|
|
2873
|
+
var CheckIcon = ({ className = "" }) => /* @__PURE__ */ React30.createElement("svg", { viewBox: "0 0 24 24", fill: "none", className: `w-4 h-4 shrink-0 ${className}`, xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React30.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "black" }), /* @__PURE__ */ React30.createElement("path", { d: "M8 12L11 15L16 9", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
2874
|
+
var CrossIcon = ({ className = "" }) => /* @__PURE__ */ React30.createElement("svg", { viewBox: "0 0 24 24", fill: "none", className: `w-4 h-4 shrink-0 ${className}`, xmlns: "http://www.w3.org/2000/svg" }, /* @__PURE__ */ React30.createElement("circle", { cx: "12", cy: "12", r: "10", fill: "#F5F5F5" }), /* @__PURE__ */ React30.createElement("path", { d: "M15 9L9 15M9 9l6 6", stroke: "#D4D4D4", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }));
|
|
2629
2875
|
var ManagedPricingBlock = ({
|
|
2630
2876
|
tagline,
|
|
2631
2877
|
title,
|
|
2632
2878
|
plans = [],
|
|
2633
2879
|
tabs
|
|
2634
2880
|
}) => {
|
|
2635
|
-
const [isAnimating, setIsAnimating] =
|
|
2636
|
-
const [activeTabIndex, setActiveTabIndex] =
|
|
2881
|
+
const [isAnimating, setIsAnimating] = useState21(false);
|
|
2882
|
+
const [activeTabIndex, setActiveTabIndex] = useState21(0);
|
|
2637
2883
|
const titleRef = useRef8(null);
|
|
2638
2884
|
useEffect15(() => {
|
|
2639
2885
|
const observer = new IntersectionObserver(
|
|
@@ -2655,7 +2901,7 @@ var ManagedPricingBlock = ({
|
|
|
2655
2901
|
}, []);
|
|
2656
2902
|
const hasTabs = tabs && tabs.length > 0;
|
|
2657
2903
|
const currentPlans = hasTabs ? tabs[activeTabIndex].plans : plans;
|
|
2658
|
-
return /* @__PURE__ */
|
|
2904
|
+
return /* @__PURE__ */ React30.createElement("div", { className: "grow pt-10 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React30.createElement("div", { className: "w-full max-w-5xl mx-auto flex flex-col items-center" }, /* @__PURE__ */ React30.createElement("div", { className: "w-full flex flex-col items-center text-center mb-10 sm:mb-12" }, tagline && /* @__PURE__ */ React30.createElement("span", { className: "text-[9px] tracking-[0.4em] text-black block " }, tagline), /* @__PURE__ */ React30.createElement(
|
|
2659
2905
|
"h1",
|
|
2660
2906
|
{
|
|
2661
2907
|
ref: titleRef,
|
|
@@ -2663,9 +2909,9 @@ var ManagedPricingBlock = ({
|
|
|
2663
2909
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
2664
2910
|
},
|
|
2665
2911
|
title
|
|
2666
|
-
)), hasTabs && /* @__PURE__ */
|
|
2912
|
+
)), hasTabs && /* @__PURE__ */ React30.createElement("div", { className: "flex items-center justify-center mb-8 sm:mb-10 w-full animate-in fade-in duration-300 px-2" }, /* @__PURE__ */ React30.createElement("div", { className: "flex items-center bg-white rounded-full p-1 sm:p-1.5 max-w-full overflow-x-auto custom-scrollbar" }, tabs.map((tab, idx) => {
|
|
2667
2913
|
const isActive = activeTabIndex === idx;
|
|
2668
|
-
return /* @__PURE__ */
|
|
2914
|
+
return /* @__PURE__ */ React30.createElement(
|
|
2669
2915
|
"button",
|
|
2670
2916
|
{
|
|
2671
2917
|
key: idx,
|
|
@@ -2674,19 +2920,19 @@ var ManagedPricingBlock = ({
|
|
|
2674
2920
|
},
|
|
2675
2921
|
tab.label
|
|
2676
2922
|
);
|
|
2677
|
-
}))), /* @__PURE__ */
|
|
2923
|
+
}))), /* @__PURE__ */ React30.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-5 w-full max-w-3xl animate-in slide-in-from-bottom-2 fade-in duration-500" }, currentPlans.map((plan, planIdx) => /* @__PURE__ */ React30.createElement(
|
|
2678
2924
|
"div",
|
|
2679
2925
|
{
|
|
2680
2926
|
key: `${activeTabIndex}-${planIdx}`,
|
|
2681
2927
|
className: `bg-white rounded-3xl p-6 flex flex-col relative overflow-hidden transition-all duration-300 ${plan.isPremium ? "" : ""}`
|
|
2682
2928
|
},
|
|
2683
|
-
/* @__PURE__ */
|
|
2929
|
+
/* @__PURE__ */ React30.createElement("div", { className: "mb-6" }, /* @__PURE__ */ React30.createElement("span", { className: "text-black text-base block mb-1" }, plan.name), /* @__PURE__ */ React30.createElement("div", { className: "flex items-baseline gap-1" }, /* @__PURE__ */ React30.createElement("h3", { className: "text-3xl font-light text-black" }, plan.price), plan.period && /* @__PURE__ */ React30.createElement("span", { className: "text-xs text-neutral-500" }, plan.period)), /* @__PURE__ */ React30.createElement("p", { className: "text-xs text-neutral-500 mt-2 min-h-8" }, plan.description), plan.showApps && plan.appLogos && plan.appLogos.length > 0 && /* @__PURE__ */ React30.createElement("div", { className: "flex items-center gap-2 mt-4" }, plan.appLogos.map((logo, logoIdx) => /* @__PURE__ */ React30.createElement(
|
|
2684
2930
|
"div",
|
|
2685
2931
|
{
|
|
2686
2932
|
key: logoIdx,
|
|
2687
2933
|
className: "relative w-5 h-5 overflow-hidden flex items-center justify-center shrink-0"
|
|
2688
2934
|
},
|
|
2689
|
-
/* @__PURE__ */
|
|
2935
|
+
/* @__PURE__ */ React30.createElement(
|
|
2690
2936
|
Image5,
|
|
2691
2937
|
{
|
|
2692
2938
|
src: logo.src,
|
|
@@ -2697,7 +2943,7 @@ var ManagedPricingBlock = ({
|
|
|
2697
2943
|
}
|
|
2698
2944
|
)
|
|
2699
2945
|
)))),
|
|
2700
|
-
plan.isPremium ? /* @__PURE__ */
|
|
2946
|
+
plan.isPremium ? /* @__PURE__ */ React30.createElement(ThreeDButton, { href: plan.ctaHref, className: "mb-6 w-full" }, plan.ctaText) : /* @__PURE__ */ React30.createElement(
|
|
2701
2947
|
Link6,
|
|
2702
2948
|
{
|
|
2703
2949
|
href: plan.ctaHref,
|
|
@@ -2705,20 +2951,20 @@ var ManagedPricingBlock = ({
|
|
|
2705
2951
|
},
|
|
2706
2952
|
plan.ctaText
|
|
2707
2953
|
),
|
|
2708
|
-
/* @__PURE__ */
|
|
2954
|
+
/* @__PURE__ */ React30.createElement("div", { className: "flex flex-col gap-3" }, plan.features.map((feature, featureIdx) => {
|
|
2709
2955
|
const isAvailable = feature.value !== false;
|
|
2710
2956
|
const valueText = typeof feature.value === "string" ? feature.value : "";
|
|
2711
|
-
return /* @__PURE__ */
|
|
2957
|
+
return /* @__PURE__ */ React30.createElement("div", { key: featureIdx, className: "flex items-center gap-2.5" }, isAvailable ? /* @__PURE__ */ React30.createElement(CheckIcon, null) : /* @__PURE__ */ React30.createElement(CrossIcon, null), /* @__PURE__ */ React30.createElement("span", { className: `text-xs truncate ${isAvailable ? "text-neutral-800" : "text-neutral-400"}` }, feature.name, valueText && /* @__PURE__ */ React30.createElement("span", { className: "text-neutral-500 ml-1" }, "(", valueText, ")")));
|
|
2712
2958
|
}))
|
|
2713
2959
|
)))));
|
|
2714
2960
|
};
|
|
2715
2961
|
|
|
2716
2962
|
// src/components/ManagedBoardBlock.tsx
|
|
2717
|
-
import
|
|
2963
|
+
import React31 from "react";
|
|
2718
2964
|
import Image6 from "next/image";
|
|
2719
|
-
import { HugeiconsIcon as
|
|
2965
|
+
import { HugeiconsIcon as HugeiconsIcon21 } from "@hugeicons/react";
|
|
2720
2966
|
import { TwitterIcon, LinkedinIcon } from "@hugeicons/core-free-icons";
|
|
2721
|
-
var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */
|
|
2967
|
+
var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */ React31.createElement(
|
|
2722
2968
|
"a",
|
|
2723
2969
|
{
|
|
2724
2970
|
href,
|
|
@@ -2727,7 +2973,7 @@ var MemberSocialLink = ({ href, icon, label, name }) => /* @__PURE__ */ React30.
|
|
|
2727
2973
|
className: "text-neutral-400 hover:text-black transition-colors",
|
|
2728
2974
|
"aria-label": `${name} on ${label}`
|
|
2729
2975
|
},
|
|
2730
|
-
/* @__PURE__ */
|
|
2976
|
+
/* @__PURE__ */ React31.createElement(HugeiconsIcon21, { icon, size: 16 })
|
|
2731
2977
|
);
|
|
2732
2978
|
var ManagedBoardBlock = ({
|
|
2733
2979
|
tagline,
|
|
@@ -2736,7 +2982,7 @@ var ManagedBoardBlock = ({
|
|
|
2736
2982
|
contactText,
|
|
2737
2983
|
contactEmail
|
|
2738
2984
|
}) => {
|
|
2739
|
-
return /* @__PURE__ */
|
|
2985
|
+
return /* @__PURE__ */ React31.createElement("div", { className: "grow pt-4 pb-20 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React31.createElement("div", { className: "relative w-full mx-auto overflow-hidden max-w-7xl" }, /* @__PURE__ */ React31.createElement(
|
|
2740
2986
|
"div",
|
|
2741
2987
|
{
|
|
2742
2988
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -2745,7 +2991,7 @@ var ManagedBoardBlock = ({
|
|
|
2745
2991
|
backgroundRepeat: "repeat"
|
|
2746
2992
|
}
|
|
2747
2993
|
}
|
|
2748
|
-
), /* @__PURE__ */
|
|
2994
|
+
), /* @__PURE__ */ React31.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React31.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10" }, tagline && /* @__PURE__ */ React31.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ React31.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), /* @__PURE__ */ React31.createElement("div", { className: "relative px-5 md:px-12 py-4 md:py-8" }, /* @__PURE__ */ React31.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5 md:gap-8" }, members.map((member, idx) => /* @__PURE__ */ React31.createElement("div", { key: idx, className: "relative p-6 md:p-8 rounded-2xl bg-white flex flex-col transition-all group" }, /* @__PURE__ */ React31.createElement("div", { className: "flex items-start space-x-4 md:space-x-5 mb-5 md:mb-6" }, /* @__PURE__ */ React31.createElement("div", { className: "relative w-14 h-14 md:w-16 md:h-16 shrink-0 bg-white overflow-hidden rounded-xl" }, /* @__PURE__ */ React31.createElement(
|
|
2749
2995
|
Image6,
|
|
2750
2996
|
{
|
|
2751
2997
|
src: member.imageSrc,
|
|
@@ -2754,7 +3000,7 @@ var ManagedBoardBlock = ({
|
|
|
2754
3000
|
sizes: "(max-width: 768px) 56px, 64px",
|
|
2755
3001
|
className: "object-cover grayscale opacity-100 transition-opacity"
|
|
2756
3002
|
}
|
|
2757
|
-
)), /* @__PURE__ */
|
|
3003
|
+
)), /* @__PURE__ */ React31.createElement("div", { className: "pt-1" }, /* @__PURE__ */ React31.createElement("h3", { className: " text-[14px] md:text-[15px] text-black tracking-tight" }, member.name), /* @__PURE__ */ React31.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-500 mt-1.5 " }, member.title))), /* @__PURE__ */ React31.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 text-left grow mb-8" }, member.bio), /* @__PURE__ */ React31.createElement("div", { className: "space-y-6 mt-auto" }, /* @__PURE__ */ React31.createElement("div", { className: "w-full *:w-full" }, /* @__PURE__ */ React31.createElement(ThreeDButton, { href: member.website }, "Visit Website")), /* @__PURE__ */ React31.createElement("div", { className: "flex space-x-4 pt-5" }, member.twitterHandle && member.twitterHandle.length > 0 && /* @__PURE__ */ React31.createElement(
|
|
2758
3004
|
MemberSocialLink,
|
|
2759
3005
|
{
|
|
2760
3006
|
href: `https://x.com/${member.twitterHandle}`,
|
|
@@ -2762,7 +3008,7 @@ var ManagedBoardBlock = ({
|
|
|
2762
3008
|
label: "X",
|
|
2763
3009
|
name: member.name
|
|
2764
3010
|
}
|
|
2765
|
-
), member.linkedinHandle && member.linkedinHandle.length > 0 && /* @__PURE__ */
|
|
3011
|
+
), member.linkedinHandle && member.linkedinHandle.length > 0 && /* @__PURE__ */ React31.createElement(
|
|
2766
3012
|
MemberSocialLink,
|
|
2767
3013
|
{
|
|
2768
3014
|
href: member.linkedinHandle,
|
|
@@ -2770,28 +3016,28 @@ var ManagedBoardBlock = ({
|
|
|
2770
3016
|
label: "LinkedIn",
|
|
2771
3017
|
name: member.name
|
|
2772
3018
|
}
|
|
2773
|
-
))))))), (contactText || contactEmail) && /* @__PURE__ */
|
|
3019
|
+
))))))), (contactText || contactEmail) && /* @__PURE__ */ React31.createElement("div", { className: "relative px-5 md:px-12 py-8 md:py-10 pb-12 md:pb-14" }, /* @__PURE__ */ React31.createElement("p", { className: "text-[11px] text-neutral-600 text-left" }, contactText, contactEmail && /* @__PURE__ */ React31.createElement("a", { href: `mailto:${contactEmail}`, className: "text-black decoration-black decoration-2 underline-offset-4 ml-1 transition-colors" }, contactEmail))))));
|
|
2774
3020
|
};
|
|
2775
3021
|
|
|
2776
3022
|
// src/components/ManagedNotFoundBlock.tsx
|
|
2777
|
-
import
|
|
3023
|
+
import React32 from "react";
|
|
2778
3024
|
var ManagedNotFoundBlock = ({
|
|
2779
3025
|
title = "404 - Page Not Found",
|
|
2780
3026
|
description = "The page you are looking for does not exist or has been moved."
|
|
2781
3027
|
}) => {
|
|
2782
|
-
return /* @__PURE__ */
|
|
3028
|
+
return /* @__PURE__ */ React32.createElement("main", { className: "min-h-screen flex items-center justify-center relative z-20 bg-transparent" }, /* @__PURE__ */ React32.createElement("div", { className: "p-6 w-full max-w-md mx-auto text-center" }, /* @__PURE__ */ React32.createElement("div", { className: "mb-8 flex justify-center" }, /* @__PURE__ */ React32.createElement(
|
|
2783
3029
|
"svg",
|
|
2784
3030
|
{
|
|
2785
3031
|
xmlns: "http://www.w3.org/2000/svg",
|
|
2786
3032
|
viewBox: "0 0 24 24",
|
|
2787
3033
|
className: "w-12 h-12 fill-neutral-100"
|
|
2788
3034
|
},
|
|
2789
|
-
/* @__PURE__ */
|
|
2790
|
-
)), /* @__PURE__ */
|
|
3035
|
+
/* @__PURE__ */ React32.createElement("path", { fillRule: "evenodd", d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z", clipRule: "evenodd" })
|
|
3036
|
+
)), /* @__PURE__ */ React32.createElement("h1", { className: " text-xl md:text-3xl text-black tracking-tight mb-4" }, title), /* @__PURE__ */ React32.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 mb-12" }, description)));
|
|
2791
3037
|
};
|
|
2792
3038
|
|
|
2793
3039
|
// src/components/ManagedNewsletterSplitBlock.tsx
|
|
2794
|
-
import
|
|
3040
|
+
import React33 from "react";
|
|
2795
3041
|
import Image7 from "next/image";
|
|
2796
3042
|
var ManagedNewsletterSplitBlock = ({
|
|
2797
3043
|
tagline,
|
|
@@ -2805,7 +3051,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2805
3051
|
ctaHref = "/contact",
|
|
2806
3052
|
children
|
|
2807
3053
|
}) => {
|
|
2808
|
-
return /* @__PURE__ */
|
|
3054
|
+
return /* @__PURE__ */ React33.createElement("div", { className: "grow flex flex-col md:flex-row relative w-full pt-32 md:pt-0" }, /* @__PURE__ */ React33.createElement("div", { className: "hidden md:block md:w-1/2 relative min-h-screen overflow-hidden" }, /* @__PURE__ */ React33.createElement(
|
|
2809
3055
|
Image7,
|
|
2810
3056
|
{
|
|
2811
3057
|
src: imageSrc,
|
|
@@ -2815,7 +3061,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2815
3061
|
className: "object-cover object-top grayscale opacity-60",
|
|
2816
3062
|
quality: 100
|
|
2817
3063
|
}
|
|
2818
|
-
), /* @__PURE__ */
|
|
3064
|
+
), /* @__PURE__ */ React33.createElement(
|
|
2819
3065
|
"div",
|
|
2820
3066
|
{
|
|
2821
3067
|
className: "absolute inset-0 z-10 pointer-events-none",
|
|
@@ -2823,7 +3069,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2823
3069
|
background: "linear-gradient(to right, rgba(255,255,255,0) 30%, #ffffff 100%)"
|
|
2824
3070
|
}
|
|
2825
3071
|
}
|
|
2826
|
-
), /* @__PURE__ */
|
|
3072
|
+
), /* @__PURE__ */ React33.createElement(
|
|
2827
3073
|
"div",
|
|
2828
3074
|
{
|
|
2829
3075
|
className: "absolute inset-x-0 bottom-0 h-40 z-10 pointer-events-none",
|
|
@@ -2831,7 +3077,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2831
3077
|
background: "linear-gradient(to bottom, rgba(255,255,255,0) 0%, #ffffff 100%)"
|
|
2832
3078
|
}
|
|
2833
3079
|
}
|
|
2834
|
-
)), /* @__PURE__ */
|
|
3080
|
+
)), /* @__PURE__ */ React33.createElement("div", { className: "w-full md:w-1/2 flex mt-22 flex-col items-center justify-center p-4 md:p-12 relative z-20" }, /* @__PURE__ */ React33.createElement("div", { className: "relative w-full max-w-lg p-8 md:p-12 text-center md:text-left transition-all duration-700 ease-out" }, /* @__PURE__ */ React33.createElement(
|
|
2835
3081
|
"div",
|
|
2836
3082
|
{
|
|
2837
3083
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -2840,7 +3086,7 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2840
3086
|
backgroundRepeat: "repeat"
|
|
2841
3087
|
}
|
|
2842
3088
|
}
|
|
2843
|
-
), /* @__PURE__ */
|
|
3089
|
+
), /* @__PURE__ */ React33.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React33.createElement("div", { className: "mb-10 border-b border-neutral-100 pb-8 text-center md:text-left" }, tagline && /* @__PURE__ */ React33.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 " }, tagline), /* @__PURE__ */ React33.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight mb-4" }, title), subtitle && /* @__PURE__ */ React33.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-500 " }, subtitle)), /* @__PURE__ */ React33.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 mb-10 text-center md:text-left" }, description), children && /* @__PURE__ */ React33.createElement("div", { className: "mb-8 text-left" }, children), /* @__PURE__ */ React33.createElement("div", { className: "text-center md:text-left mt-10 space-y-6" }, dividerText && /* @__PURE__ */ React33.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React33.createElement("div", { className: "grow h-px bg-neutral-100" }), /* @__PURE__ */ React33.createElement("span", { className: "shrink mx-4 text-[11px] tracking-[0.2em] text-neutral-400 " }, dividerText), /* @__PURE__ */ React33.createElement("div", { className: "grow h-px bg-neutral-100" })), ctaText && ctaHref && /* @__PURE__ */ React33.createElement("div", { className: "w-full *:w-full" }, /* @__PURE__ */ React33.createElement(
|
|
2844
3090
|
ThreeDButton,
|
|
2845
3091
|
{
|
|
2846
3092
|
href: ctaHref,
|
|
@@ -2851,10 +3097,10 @@ var ManagedNewsletterSplitBlock = ({
|
|
|
2851
3097
|
};
|
|
2852
3098
|
|
|
2853
3099
|
// src/components/PortfolioHero.tsx
|
|
2854
|
-
import
|
|
3100
|
+
import React34, { useEffect as useEffect16, useRef as useRef9 } from "react";
|
|
2855
3101
|
import Link7 from "next/link";
|
|
2856
3102
|
import Image8 from "next/image";
|
|
2857
|
-
import { HugeiconsIcon as
|
|
3103
|
+
import { HugeiconsIcon as HugeiconsIcon22 } from "@hugeicons/react";
|
|
2858
3104
|
import { ArrowRight01Icon as ArrowRight01Icon5 } from "@hugeicons/core-free-icons";
|
|
2859
3105
|
var useScrollAnimation = () => {
|
|
2860
3106
|
const elementRef = useRef9(null);
|
|
@@ -2894,13 +3140,13 @@ var PortfolioHero = ({
|
|
|
2894
3140
|
secondaryCtaHref
|
|
2895
3141
|
}) => {
|
|
2896
3142
|
const heroContentRef = useScrollAnimation();
|
|
2897
|
-
return /* @__PURE__ */
|
|
3143
|
+
return /* @__PURE__ */ React34.createElement("section", { className: "pt-8 pb-16 px-6 md:px-12 flex flex-col relative overflow-hidden z-10 w-full" }, /* @__PURE__ */ React34.createElement(
|
|
2898
3144
|
"div",
|
|
2899
3145
|
{
|
|
2900
3146
|
ref: heroContentRef,
|
|
2901
3147
|
className: "w-full opacity-0 translate-y-5 transition-all duration-1000 ease-out relative z-10"
|
|
2902
3148
|
},
|
|
2903
|
-
/* @__PURE__ */
|
|
3149
|
+
/* @__PURE__ */ React34.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center gap-5 sm:gap-8 mb-10" }, /* @__PURE__ */ React34.createElement("div", { className: "relative w-20 h-20 sm:w-32 sm:h-32 rounded-full overflow-hidden border border-neutral-100 shrink-0 shadow-sm" }, /* @__PURE__ */ React34.createElement(
|
|
2904
3150
|
Image8,
|
|
2905
3151
|
{
|
|
2906
3152
|
src: imageSrc,
|
|
@@ -2911,7 +3157,7 @@ var PortfolioHero = ({
|
|
|
2911
3157
|
sizes: "(max-width: 640px) 80px, 128px",
|
|
2912
3158
|
quality: 100
|
|
2913
3159
|
}
|
|
2914
|
-
)), /* @__PURE__ */
|
|
3160
|
+
)), /* @__PURE__ */ React34.createElement("div", { className: "flex flex-col text-left" }, /* @__PURE__ */ React34.createElement("h1", { className: " text-3xl sm:text-5xl lg:text-6xl tracking-tight text-black leading-none mb-3" }, name), socialLabel && /* @__PURE__ */ React34.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 " }, socialLabel), socialLinkText && socialLinkHref && /* @__PURE__ */ React34.createElement(
|
|
2915
3161
|
"a",
|
|
2916
3162
|
{
|
|
2917
3163
|
href: socialLinkHref,
|
|
@@ -2921,30 +3167,30 @@ var PortfolioHero = ({
|
|
|
2921
3167
|
},
|
|
2922
3168
|
socialLinkText
|
|
2923
3169
|
))),
|
|
2924
|
-
/* @__PURE__ */
|
|
2925
|
-
/* @__PURE__ */
|
|
3170
|
+
/* @__PURE__ */ React34.createElement("p", { className: "text-[13px] leading-[1.8] max-w-4xl mb-12 text-neutral-600" }, bio),
|
|
3171
|
+
/* @__PURE__ */ React34.createElement("div", { className: "flex flex-col sm:flex-row gap-4 w-full sm:w-auto" }, primaryCtaText && primaryCtaHref && /* @__PURE__ */ React34.createElement("div", { className: "w-full sm:w-auto *:w-full" }, /* @__PURE__ */ React34.createElement(
|
|
2926
3172
|
ThreeDButton,
|
|
2927
3173
|
{
|
|
2928
3174
|
href: primaryCtaHref,
|
|
2929
3175
|
className: "py-3 tracking-widest text-[11px]"
|
|
2930
3176
|
},
|
|
2931
3177
|
primaryCtaText
|
|
2932
|
-
)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */
|
|
3178
|
+
)), secondaryCtaText && secondaryCtaHref && /* @__PURE__ */ React34.createElement(
|
|
2933
3179
|
Link7,
|
|
2934
3180
|
{
|
|
2935
3181
|
href: secondaryCtaHref,
|
|
2936
3182
|
className: "w-full sm:w-auto inline-flex items-center justify-center gap-3 text-[11px] tracking-[0.2em] rounded-full px-8 py-3.5 bg-neutral-200 transition-colors text-black hover:bg-neutral-200 outline-none"
|
|
2937
3183
|
},
|
|
2938
3184
|
secondaryCtaText,
|
|
2939
|
-
/* @__PURE__ */
|
|
3185
|
+
/* @__PURE__ */ React34.createElement(HugeiconsIcon22, { icon: ArrowRight01Icon5, size: 16 })
|
|
2940
3186
|
))
|
|
2941
3187
|
));
|
|
2942
3188
|
};
|
|
2943
3189
|
|
|
2944
3190
|
// src/components/GifFeatureCard.tsx
|
|
2945
|
-
import
|
|
3191
|
+
import React35, { useState as useState22 } from "react";
|
|
2946
3192
|
import Image9 from "next/image";
|
|
2947
|
-
import { HugeiconsIcon as
|
|
3193
|
+
import { HugeiconsIcon as HugeiconsIcon23 } from "@hugeicons/react";
|
|
2948
3194
|
import { Loading03Icon as Loading03Icon11 } from "@hugeicons/core-free-icons";
|
|
2949
3195
|
var GifFeatureCard = ({
|
|
2950
3196
|
gifSrc,
|
|
@@ -2953,20 +3199,20 @@ var GifFeatureCard = ({
|
|
|
2953
3199
|
alt = "Feature animation",
|
|
2954
3200
|
className = "aspect-video"
|
|
2955
3201
|
}) => {
|
|
2956
|
-
const [isLoading, setIsLoading] =
|
|
2957
|
-
return /* @__PURE__ */
|
|
2958
|
-
|
|
3202
|
+
const [isLoading, setIsLoading] = useState22(true);
|
|
3203
|
+
return /* @__PURE__ */ React35.createElement("div", { className: `relative w-full bg-black overflow-hidden shadow-2xl ${className}` }, isLoading && /* @__PURE__ */ React35.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-black" }, /* @__PURE__ */ React35.createElement(
|
|
3204
|
+
HugeiconsIcon23,
|
|
2959
3205
|
{
|
|
2960
3206
|
icon: Loading03Icon11,
|
|
2961
3207
|
size: 32,
|
|
2962
3208
|
className: "animate-spin text-white"
|
|
2963
3209
|
}
|
|
2964
|
-
)), /* @__PURE__ */
|
|
3210
|
+
)), /* @__PURE__ */ React35.createElement(
|
|
2965
3211
|
"div",
|
|
2966
3212
|
{
|
|
2967
3213
|
className: `absolute inset-0 z-0 transition-all duration-1000 ease-out ${isLoading ? "scale-105 blur-2xl opacity-0" : "scale-100 blur-0 opacity-100"}`
|
|
2968
3214
|
},
|
|
2969
|
-
/* @__PURE__ */
|
|
3215
|
+
/* @__PURE__ */ React35.createElement(
|
|
2970
3216
|
Image9,
|
|
2971
3217
|
{
|
|
2972
3218
|
src: gifSrc,
|
|
@@ -2977,16 +3223,16 @@ var GifFeatureCard = ({
|
|
|
2977
3223
|
className: "object-cover object-center pointer-events-none"
|
|
2978
3224
|
}
|
|
2979
3225
|
)
|
|
2980
|
-
), /* @__PURE__ */
|
|
3226
|
+
), /* @__PURE__ */ React35.createElement(
|
|
2981
3227
|
"div",
|
|
2982
3228
|
{
|
|
2983
3229
|
className: "absolute inset-x-0 bottom-0 h-1/2 sm:h-2/3 bg-linear-to-t from-black/95 via-black/40 to-transparent z-10 pointer-events-none transition-opacity duration-700"
|
|
2984
3230
|
}
|
|
2985
|
-
), /* @__PURE__ */
|
|
3231
|
+
), /* @__PURE__ */ React35.createElement("div", { className: "absolute inset-x-0 bottom-0 p-6 sm:p-8 z-30 flex flex-col justify-end text-left pointer-events-none" }, title && /* @__PURE__ */ React35.createElement("h3", { className: " text-xl sm:text-2xl md:text-3xl text-white tracking-tight mb-2 sm:mb-3 drop-shadow-md" }, title), subtitle && /* @__PURE__ */ React35.createElement("p", { className: "text-[13px] sm:text-[15px] leading-relaxed text-neutral-300 max-w-2xl drop-shadow-sm" }, subtitle)));
|
|
2986
3232
|
};
|
|
2987
3233
|
|
|
2988
3234
|
// src/components/MedicalFeatureStatsBlock.tsx
|
|
2989
|
-
import
|
|
3235
|
+
import React36, { useState as useState23, useEffect as useEffect17, useRef as useRef10 } from "react";
|
|
2990
3236
|
import Image10 from "next/image";
|
|
2991
3237
|
var MedicalFeatureStatsBlock = ({
|
|
2992
3238
|
bottomHeadline,
|
|
@@ -2995,7 +3241,7 @@ var MedicalFeatureStatsBlock = ({
|
|
|
2995
3241
|
trustText,
|
|
2996
3242
|
stats
|
|
2997
3243
|
}) => {
|
|
2998
|
-
const [isAnimating, setIsAnimating] =
|
|
3244
|
+
const [isAnimating, setIsAnimating] = useState23(false);
|
|
2999
3245
|
const titleRef = useRef10(null);
|
|
3000
3246
|
useEffect17(() => {
|
|
3001
3247
|
const observer = new IntersectionObserver(
|
|
@@ -3015,7 +3261,7 @@ var MedicalFeatureStatsBlock = ({
|
|
|
3015
3261
|
}
|
|
3016
3262
|
return () => observer.disconnect();
|
|
3017
3263
|
}, []);
|
|
3018
|
-
return /* @__PURE__ */
|
|
3264
|
+
return /* @__PURE__ */ React36.createElement("section", { className: "py-24 w-full flex justify-center relative z-10" }, /* @__PURE__ */ React36.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ React36.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-10 mb-12" }, /* @__PURE__ */ React36.createElement("div", { className: "max-w-xl" }, /* @__PURE__ */ React36.createElement(
|
|
3019
3265
|
"h2",
|
|
3020
3266
|
{
|
|
3021
3267
|
ref: titleRef,
|
|
@@ -3023,7 +3269,7 @@ var MedicalFeatureStatsBlock = ({
|
|
|
3023
3269
|
style: isAnimating ? { animationIterationCount: 1 } : {}
|
|
3024
3270
|
},
|
|
3025
3271
|
bottomHeadline
|
|
3026
|
-
), /* @__PURE__ */
|
|
3272
|
+
), /* @__PURE__ */ React36.createElement("p", { className: "text-[14px] leading-relaxed text-neutral-500" }, bottomDescription)), /* @__PURE__ */ React36.createElement("div", { className: "flex items-center gap-4 shrink-0" }, /* @__PURE__ */ React36.createElement("div", { className: "flex -space-x-3" }, avatars.map((src, i) => /* @__PURE__ */ React36.createElement("div", { key: i, className: "relative w-12 h-12 rounded-full border-[3px] border-white overflow-hidden bg-neutral-100 z-1 hover:z-10 transition-all" }, /* @__PURE__ */ React36.createElement(
|
|
3027
3273
|
Image10,
|
|
3028
3274
|
{
|
|
3029
3275
|
src,
|
|
@@ -3032,17 +3278,17 @@ var MedicalFeatureStatsBlock = ({
|
|
|
3032
3278
|
sizes: "48px",
|
|
3033
3279
|
className: "object-cover"
|
|
3034
3280
|
}
|
|
3035
|
-
)))), /* @__PURE__ */
|
|
3281
|
+
)))), /* @__PURE__ */ React36.createElement("p", { className: "text-[11px] text-neutral-800 leading-[1.4] max-w-55" }, trustText))), /* @__PURE__ */ React36.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, stats.map((stat, idx) => /* @__PURE__ */ React36.createElement("div", { key: idx, className: "bg-white rounded-4xl p-8 md:p-10 flex flex-col h-70" }, /* @__PURE__ */ React36.createElement("div", { className: "flex items-center p-0.5 mb-6" }, /* @__PURE__ */ React36.createElement("span", { className: "text-[14px] text-neutral-500 tracking-wide" }, stat.label)), /* @__PURE__ */ React36.createElement("h1", { className: "text-6xl gradient-text md:text-[80px] tracking-tighter text-black mt-auto leading-none" }, stat.value))))));
|
|
3036
3282
|
};
|
|
3037
3283
|
|
|
3038
3284
|
// src/components/ConsultantShowcase.tsx
|
|
3039
|
-
import
|
|
3285
|
+
import React37, { useState as useState24 } from "react";
|
|
3040
3286
|
import Image11 from "next/image";
|
|
3041
|
-
import { HugeiconsIcon as
|
|
3287
|
+
import { HugeiconsIcon as HugeiconsIcon24 } from "@hugeicons/react";
|
|
3042
3288
|
import { Loading03Icon as Loading03Icon12 } from "@hugeicons/core-free-icons";
|
|
3043
3289
|
var ImageWithLoader = ({ src, alt, className, sizes, priority = false }) => {
|
|
3044
|
-
const [isLoading, setIsLoading] =
|
|
3045
|
-
return /* @__PURE__ */
|
|
3290
|
+
const [isLoading, setIsLoading] = useState24(true);
|
|
3291
|
+
return /* @__PURE__ */ React37.createElement("div", { className: `absolute inset-0 bg-neutral-800 ${className}` }, isLoading && /* @__PURE__ */ React37.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-800/50 backdrop-blur-md transition-opacity duration-300" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon24, { icon: Loading03Icon12, size: 24, className: "animate-spin text-white/50" })), /* @__PURE__ */ React37.createElement(
|
|
3046
3292
|
Image11,
|
|
3047
3293
|
{
|
|
3048
3294
|
src,
|
|
@@ -3061,9 +3307,9 @@ var ImageWithLoader = ({ src, alt, className, sizes, priority = false }) => {
|
|
|
3061
3307
|
var ConsultantShowcase = ({
|
|
3062
3308
|
profiles
|
|
3063
3309
|
}) => {
|
|
3064
|
-
const [currentIndex, setCurrentIndex] =
|
|
3065
|
-
const [touchStart, setTouchStart] =
|
|
3066
|
-
const [touchEnd, setTouchEnd] =
|
|
3310
|
+
const [currentIndex, setCurrentIndex] = useState24(0);
|
|
3311
|
+
const [touchStart, setTouchStart] = useState24(null);
|
|
3312
|
+
const [touchEnd, setTouchEnd] = useState24(null);
|
|
3067
3313
|
const nextSlide = () => {
|
|
3068
3314
|
setCurrentIndex((prev) => prev === profiles.length - 1 ? 0 : prev + 1);
|
|
3069
3315
|
};
|
|
@@ -3088,7 +3334,7 @@ var ConsultantShowcase = ({
|
|
|
3088
3334
|
}
|
|
3089
3335
|
};
|
|
3090
3336
|
if (!profiles || profiles.length === 0) return null;
|
|
3091
|
-
return /* @__PURE__ */
|
|
3337
|
+
return /* @__PURE__ */ React37.createElement("section", { className: "py-24 w-full flex justify-center px-4 md:px-8 z-10 relative" }, /* @__PURE__ */ React37.createElement("div", { className: "max-w-6xl w-full" }, /* @__PURE__ */ React37.createElement(
|
|
3092
3338
|
"div",
|
|
3093
3339
|
{
|
|
3094
3340
|
className: "relative w-full h-100 md:h-112.5 rounded-4xl overflow-hidden bg-neutral-900 group select-none",
|
|
@@ -3098,13 +3344,13 @@ var ConsultantShowcase = ({
|
|
|
3098
3344
|
},
|
|
3099
3345
|
profiles.map((profile, idx) => {
|
|
3100
3346
|
const isActive = idx === currentIndex;
|
|
3101
|
-
return /* @__PURE__ */
|
|
3347
|
+
return /* @__PURE__ */ React37.createElement(
|
|
3102
3348
|
"div",
|
|
3103
3349
|
{
|
|
3104
3350
|
key: profile.id,
|
|
3105
3351
|
className: `absolute inset-0 transition-opacity duration-700 ease-in-out ${isActive ? "opacity-100 z-10" : "opacity-0 z-0 pointer-events-none"}`
|
|
3106
3352
|
},
|
|
3107
|
-
/* @__PURE__ */
|
|
3353
|
+
/* @__PURE__ */ React37.createElement(
|
|
3108
3354
|
ImageWithLoader,
|
|
3109
3355
|
{
|
|
3110
3356
|
src: profile.imageSrc,
|
|
@@ -3112,14 +3358,14 @@ var ConsultantShowcase = ({
|
|
|
3112
3358
|
priority: idx === 0
|
|
3113
3359
|
}
|
|
3114
3360
|
),
|
|
3115
|
-
/* @__PURE__ */
|
|
3116
|
-
/* @__PURE__ */
|
|
3117
|
-
/* @__PURE__ */
|
|
3361
|
+
/* @__PURE__ */ React37.createElement("div", { className: "absolute inset-0 bg-black/20 z-10 pointer-events-none" }),
|
|
3362
|
+
/* @__PURE__ */ React37.createElement("div", { className: "absolute top-0 left-0 w-full h-[60%] bg-linear-to-b from-black/80 via-black/30 to-transparent z-20 pointer-events-none" }),
|
|
3363
|
+
/* @__PURE__ */ React37.createElement("div", { className: `absolute top-8 left-8 md:top-12 md:left-12 z-30 text-white max-w-lg transition-transform duration-700 ease-out ${isActive ? "translate-y-0" : "-translate-y-4"}` }, /* @__PURE__ */ React37.createElement("h2", { className: "text-[29px] tracking-tight mb-2 leading-none" }, profile.name), /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col gap-0.5" }, /* @__PURE__ */ React37.createElement("p", { className: "text-[15px] text-white/80 tracking-wide" }, profile.role), profile.description && /* @__PURE__ */ React37.createElement("p", { className: "text-[15px] text-white/80 tracking-wide mt-1" }, profile.description)))
|
|
3118
3364
|
);
|
|
3119
3365
|
}),
|
|
3120
|
-
/* @__PURE__ */
|
|
3121
|
-
/* @__PURE__ */
|
|
3122
|
-
/* @__PURE__ */
|
|
3366
|
+
/* @__PURE__ */ React37.createElement("div", { className: "absolute top-0 left-0 w-[20%] h-full z-40 cursor-w-resize hidden md:block", onClick: prevSlide, "aria-label": "Previous image" }),
|
|
3367
|
+
/* @__PURE__ */ React37.createElement("div", { className: "absolute top-0 right-0 w-[20%] h-full z-40 cursor-e-resize hidden md:block", onClick: nextSlide, "aria-label": "Next image" }),
|
|
3368
|
+
/* @__PURE__ */ React37.createElement("div", { className: "absolute bottom-6 md:bottom-8 left-0 w-full px-4 z-30 flex justify-center items-center gap-2" }, profiles.map((_, idx) => /* @__PURE__ */ React37.createElement(
|
|
3123
3369
|
"button",
|
|
3124
3370
|
{
|
|
3125
3371
|
key: idx,
|
|
@@ -3132,13 +3378,13 @@ var ConsultantShowcase = ({
|
|
|
3132
3378
|
};
|
|
3133
3379
|
|
|
3134
3380
|
// src/components/ContentGridBlock.tsx
|
|
3135
|
-
import
|
|
3381
|
+
import React38, { useState as useState25 } from "react";
|
|
3136
3382
|
import Image12 from "next/image";
|
|
3137
|
-
import { HugeiconsIcon as
|
|
3383
|
+
import { HugeiconsIcon as HugeiconsIcon25 } from "@hugeicons/react";
|
|
3138
3384
|
import { Loading03Icon as Loading03Icon13 } from "@hugeicons/core-free-icons";
|
|
3139
3385
|
var ImageWithLoader2 = ({ src, alt, className, sizes }) => {
|
|
3140
|
-
const [isLoading, setIsLoading] =
|
|
3141
|
-
return /* @__PURE__ */
|
|
3386
|
+
const [isLoading, setIsLoading] = useState25(true);
|
|
3387
|
+
return /* @__PURE__ */ React38.createElement("div", { className: `relative overflow-hidden bg-neutral-100 ${className}` }, isLoading && /* @__PURE__ */ React38.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-20 bg-neutral-100/50 backdrop-blur-sm transition-opacity duration-300" }, /* @__PURE__ */ React38.createElement(HugeiconsIcon25, { icon: Loading03Icon13, size: 24, className: "animate-spin text-neutral-400" })), /* @__PURE__ */ React38.createElement(
|
|
3142
3388
|
Image12,
|
|
3143
3389
|
{
|
|
3144
3390
|
src,
|
|
@@ -3160,30 +3406,30 @@ var ContentGridBlock = ({
|
|
|
3160
3406
|
middleBottomCard,
|
|
3161
3407
|
rightCards
|
|
3162
3408
|
}) => {
|
|
3163
|
-
return /* @__PURE__ */
|
|
3409
|
+
return /* @__PURE__ */ React38.createElement("section", { className: " w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React38.createElement("div", { className: "max-w-300 w-full px-4 md:px-8 flex flex-col gap-12" }, /* @__PURE__ */ React38.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start lg:items-end gap-6 w-full" }, /* @__PURE__ */ React38.createElement("h2", { className: "text-3xl tracking-tight text-black leading-[1.15] max-w-lg" }, header.titlePrefix, " ", /* @__PURE__ */ React38.createElement("span", { className: "gradient-text" }, header.highlightText))), /* @__PURE__ */ React38.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6" }, /* @__PURE__ */ React38.createElement("div", { className: "flex flex-col justify-end" }, /* @__PURE__ */ React38.createElement("div", { className: "bg-black rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ React38.createElement("p", { className: "text-[17px] text-white leading-snug mb-4" }, leftCard.mainText), leftCard.tag && /* @__PURE__ */ React38.createElement("span", { className: "mb-auto text-[11px] text-neutral-200 tracking-widest" }, leftCard.tag), /* @__PURE__ */ React38.createElement("div", { className: "flex items-center justify-between mt-8" }, /* @__PURE__ */ React38.createElement("div", null, /* @__PURE__ */ React38.createElement("h4", { className: "text-[15px] text-white" }, leftCard.title), /* @__PURE__ */ React38.createElement("p", { className: "text-[13px] text-neutral-300" }, leftCard.subtitle)), /* @__PURE__ */ React38.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ React38.createElement(Image12, { src: leftCard.thumbnailSrc, alt: leftCard.title, fill: true, className: "object-cover" }))))), /* @__PURE__ */ React38.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React38.createElement("div", { className: "bg-white rounded-3xl p-8 flex flex-col relative h-75" }, /* @__PURE__ */ React38.createElement("div", { className: "absolute top-6 right-6 flex flex-col items-end gap-1" }, /* @__PURE__ */ React38.createElement("span", { className: "text-[11px] text-neutral-400 tracking-wide" }, middleTopCard.topRightLabel), /* @__PURE__ */ React38.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React38.createElement("div", { className: "flex -space-x-2" }, middleTopCard.topRightAvatars.map((src, i) => /* @__PURE__ */ React38.createElement("div", { key: i, className: "w-7 h-7 rounded-full border-2 border-white overflow-hidden relative z-10" }, /* @__PURE__ */ React38.createElement(Image12, { src, alt: "Avatar", fill: true, className: "object-cover", sizes: "28px" })))), /* @__PURE__ */ React38.createElement("span", { className: "text-sm text-neutral-500" }, middleTopCard.topRightCount))), /* @__PURE__ */ React38.createElement("div", { className: "grow flex flex-col justify-center items-center py-6" }, /* @__PURE__ */ React38.createElement("div", { className: "px-5 py-2 rounded-full bg-neutral-50/50 border border-neutral-100 text-[13px] text-neutral-600" }, middleTopCard.badgePrefix, " ", /* @__PURE__ */ React38.createElement("span", { className: " text-black" }, middleTopCard.badgeHighlight), middleTopCard.badgeSuffix)), /* @__PURE__ */ React38.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React38.createElement("p", { className: "text-[11px] text-neutral-400 tracking-wide mb-1" }, middleTopCard.title), /* @__PURE__ */ React38.createElement("p", { className: "text-[14px] text-black leading-snug pr-4" }, middleTopCard.description))), /* @__PURE__ */ React38.createElement("div", { className: "bg-white rounded-3xl p-8 flex flex-col h-80" }, /* @__PURE__ */ React38.createElement("div", { className: "flex justify-between items-start mb-6" }, /* @__PURE__ */ React38.createElement("div", null, /* @__PURE__ */ React38.createElement("h4", { className: "text-[15px] text-black leading-tight" }, middleBottomCard.title), /* @__PURE__ */ React38.createElement("p", { className: "text-[13px] text-neutral-400" }, middleBottomCard.subtitle)), /* @__PURE__ */ React38.createElement("div", { className: "w-10 h-10 rounded-full overflow-hidden relative" }, /* @__PURE__ */ React38.createElement(Image12, { src: middleBottomCard.thumbnailSrc, alt: middleBottomCard.title, fill: true, className: "object-cover" }))), /* @__PURE__ */ React38.createElement("div", { className: "mt-auto" }, /* @__PURE__ */ React38.createElement("p", { className: "text-[16px] text-black leading-snug mb-4" }, middleBottomCard.mainText), middleBottomCard.tag && /* @__PURE__ */ React38.createElement("span", { className: "text-[11px] text-neutral-400 tracking-widest" }, middleBottomCard.tag)))), /* @__PURE__ */ React38.createElement("div", { className: "flex flex-col gap-6" }, rightCards.slice(0, 2).map((card, idx) => /* @__PURE__ */ React38.createElement("div", { key: idx, className: "relative w-full h-80 text-white rounded-3xl overflow-hidden group" }, /* @__PURE__ */ React38.createElement(
|
|
3164
3410
|
ImageWithLoader2,
|
|
3165
3411
|
{
|
|
3166
3412
|
src: card.bgImageSrc,
|
|
3167
3413
|
alt: card.title,
|
|
3168
3414
|
className: "absolute inset-0 w-full h-full"
|
|
3169
3415
|
}
|
|
3170
|
-
), /* @__PURE__ */
|
|
3416
|
+
), /* @__PURE__ */ React38.createElement("div", { className: "absolute inset-0 z-20 pointer-events-none" }), /* @__PURE__ */ React38.createElement("div", { className: "absolute inset-0 z-30 p-6 flex flex-col justify-end text-white" }, /* @__PURE__ */ React38.createElement("p", { className: "text-[14px] leading-snug mb-3 pr-2 text-white/90" }, card.mainText), card.tag && /* @__PURE__ */ React38.createElement("span", { className: "mb-4 text-[11px] text-white/50 tracking-widest" }, card.tag), /* @__PURE__ */ React38.createElement("div", { className: "pt-3" }, /* @__PURE__ */ React38.createElement("h4", { className: "text-[15px] text-white tracking-wide" }, card.title), /* @__PURE__ */ React38.createElement("p", { className: "text-[13px] text-white/60" }, card.subtitle)))))))));
|
|
3171
3417
|
};
|
|
3172
3418
|
|
|
3173
3419
|
// src/components/ManagedProjectsBlock.tsx
|
|
3174
|
-
import
|
|
3420
|
+
import React39 from "react";
|
|
3175
3421
|
import Link8 from "next/link";
|
|
3176
3422
|
var GridSection = ({
|
|
3177
3423
|
children,
|
|
3178
3424
|
isLast = false,
|
|
3179
3425
|
className = "py-8 md:py-10"
|
|
3180
|
-
}) => /* @__PURE__ */
|
|
3426
|
+
}) => /* @__PURE__ */ React39.createElement("div", { className: `relative px-5 md:px-12 ${className} ${!isLast ? "" : ""}` }, children);
|
|
3181
3427
|
var ManagedProjectsBlock = ({
|
|
3182
3428
|
tagline,
|
|
3183
3429
|
title,
|
|
3184
3430
|
projects
|
|
3185
3431
|
}) => {
|
|
3186
|
-
return /* @__PURE__ */
|
|
3432
|
+
return /* @__PURE__ */ React39.createElement("div", { className: "grow pt-4 pb-20 px-3 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ React39.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-5xl mx-auto overflow-hidden" }, /* @__PURE__ */ React39.createElement(
|
|
3187
3433
|
"div",
|
|
3188
3434
|
{
|
|
3189
3435
|
className: "absolute inset-0 pointer-events-none opacity-[0.03] z-0",
|
|
@@ -3192,10 +3438,10 @@ var ManagedProjectsBlock = ({
|
|
|
3192
3438
|
backgroundRepeat: "repeat"
|
|
3193
3439
|
}
|
|
3194
3440
|
}
|
|
3195
|
-
), /* @__PURE__ */
|
|
3441
|
+
), /* @__PURE__ */ React39.createElement("div", { className: "relative z-10" }, /* @__PURE__ */ React39.createElement(GridSection, null, tagline && /* @__PURE__ */ React39.createElement("span", { className: "text-[11px] tracking-[0.4em] text-neutral-500 text-left block " }, tagline), /* @__PURE__ */ React39.createElement("h1", { className: " text-3xl mt-4 text-black tracking-tight text-left" }, title)), projects.map((project, index) => {
|
|
3196
3442
|
const isLast = index === projects.length - 1;
|
|
3197
|
-
const projectContent = /* @__PURE__ */
|
|
3198
|
-
return /* @__PURE__ */
|
|
3443
|
+
const projectContent = /* @__PURE__ */ React39.createElement("div", { className: "group block w-full" }, /* @__PURE__ */ React39.createElement("div", { className: "flex flex-col md:flex-row md:items-center justify-between gap-3 md:gap-4 mb-4 md:mb-5" }, /* @__PURE__ */ React39.createElement("div", { className: "flex items-center gap-3 md:gap-4" }, /* @__PURE__ */ React39.createElement("h2", { className: " text-[16px] text-black transition-all flex items-center gap-2" }, project.title, /* @__PURE__ */ React39.createElement("span", { className: "text-[11px] opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-300" }, project.isExternal ? "\u2197" : "\u2192")), /* @__PURE__ */ React39.createElement("span", { className: `text-[9px] px-2.5 py-1 rounded-full tracking-[0.15em] transition-colors ${project.status.toLowerCase() === "production" ? "bg-black text-white" : "bg-neutral-100 text-neutral-500 group-hover:bg-neutral-100 group-hover:text-black"}` }, project.status)), /* @__PURE__ */ React39.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-500 shrink-0 " }, project.date)), /* @__PURE__ */ React39.createElement("p", { className: "text-[13px] leading-[1.8] text-neutral-600 max-w-4xl text-left transition-colors group-hover:text-black" }, project.description));
|
|
3444
|
+
return /* @__PURE__ */ React39.createElement(GridSection, { key: project.id || index, isLast, className: isLast ? "py-8 md:py-10 pb-12 md:pb-14" : "py-8 md:py-10" }, project.isExternal ? /* @__PURE__ */ React39.createElement("a", { href: project.link, target: "_blank", rel: "noopener noreferrer", className: "block outline-none" }, projectContent) : /* @__PURE__ */ React39.createElement(Link8, { href: project.link, className: "block outline-none" }, projectContent));
|
|
3199
3445
|
}))));
|
|
3200
3446
|
};
|
|
3201
3447
|
export {
|