@loafmarkets/ui 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -39,6 +39,8 @@ var buttonVariants = classVarianceAuthority.cva(
39
39
  variants: {
40
40
  variant: {
41
41
  primary: "bg-teal-500 text-slate-950 hover:bg-teal-400 focus-visible:ring-teal-200",
42
+ onboarding: "rounded-lg bg-[#F2D898] text-[#0A0C15] shadow-[0_20px_60px_rgba(242,216,152,0.35)] transition will-change-transform hover:-translate-y-0.5 hover:brightness-110 focus-visible:ring-[#F2D898]/50 focus-visible:ring-offset-[#0A0C15]",
43
+ onboardingOutline: "rounded-lg border border-[#F2D898] bg-transparent text-white hover:bg-white/5 focus-visible:ring-[#F2D898]/50 focus-visible:ring-offset-[#0A0C15]",
42
44
  accent: "bg-[var(--color-accent,#e6c87e)] text-black hover:bg-[var(--color-accent-hover,#f8d12f)] focus-visible:ring-[var(--color-accent,#e6c87e)]",
43
45
  accentOutline: "border border-[var(--color-accent,#e6c87e)] bg-transparent text-[var(--color-accent,#e6c87e)] hover:bg-[rgba(230,200,126,0.10)] focus-visible:ring-[var(--color-accent,#e6c87e)]",
44
46
  media: "border border-white/10 bg-transparent text-white/90 hover:bg-white/5 hover:border-[var(--color-accent,#e6c87e)] hover:text-[var(--color-accent,#e6c87e)] focus-visible:ring-[var(--color-accent,#e6c87e)]",
@@ -54,7 +56,8 @@ var buttonVariants = classVarianceAuthority.cva(
54
56
  },
55
57
  radius: {
56
58
  pill: "rounded-full",
57
- md: "rounded"
59
+ md: "rounded",
60
+ square: "rounded-lg"
58
61
  }
59
62
  },
60
63
  defaultVariants: {
@@ -67,11 +70,12 @@ var buttonVariants = classVarianceAuthority.cva(
67
70
  var Button = o__namespace.forwardRef(
68
71
  ({ className, variant, size, radius, asChild = false, ...props }, ref) => {
69
72
  const Comp = asChild ? reactSlot.Slot : "button";
73
+ const coercedRadius = radius ?? (variant === "onboarding" || variant === "onboardingOutline" ? "square" : void 0);
70
74
  return /* @__PURE__ */ jsxRuntime.jsx(
71
75
  Comp,
72
76
  {
73
77
  ref,
74
- className: cn(buttonVariants({ variant, size, radius }), className),
78
+ className: cn(buttonVariants({ variant, size, radius: coercedRadius }), className),
75
79
  ...props
76
80
  }
77
81
  );
@@ -2889,6 +2893,9 @@ function lt(t) {
2889
2893
  "production" !== process.env.NODE_ENV && "undefined" != typeof navigator && "ReactNative" === navigator.product && console.warn("It looks like you've imported 'styled-components' on React Native.\nPerhaps you're looking to import 'styled-components/native'?\nRead more about this at https://www.styled-components.com/docs/basics#react-native");
2890
2894
  var mt = "__sc-".concat(a, "__");
2891
2895
  "production" !== process.env.NODE_ENV && "test" !== process.env.NODE_ENV && "undefined" != typeof window && (window[mt] || (window[mt] = 0), 1 === window[mt] && console.warn("It looks like there are several instances of 'styled-components' initialized in this application. This may cause dynamic styles to not render properly, errors during the rehydration process, a missing theme prop, and makes your application bigger without good reason.\n\nSee https://styled-components.com/docs/faqs#why-am-i-getting-a-warning-about-several-instances-of-module-on-the-page for more info."), window[mt] += 1);
2896
+
2897
+ // src/assets/Loaf-logo-Banner.png
2898
+ var Loaf_logo_Banner_default = "./Loaf-logo-Banner-DYV62HAW.png";
2892
2899
  var pulse = lt`
2893
2900
  0%, 100% {
2894
2901
  opacity: 0.45;
@@ -3071,7 +3078,7 @@ var LoafLiquidityBadge = o__namespace.forwardRef(
3071
3078
  ...props,
3072
3079
  children: [
3073
3080
  /* @__PURE__ */ jsxRuntime.jsxs(LogoText, { children: [
3074
- /* @__PURE__ */ jsxRuntime.jsx(LoafLogoImage, { src: "/Loaf-logo-Banner.png", alt: "Loaf" }),
3081
+ /* @__PURE__ */ jsxRuntime.jsx(LoafLogoImage, { src: Loaf_logo_Banner_default, alt: "Loaf" }),
3075
3082
  /* @__PURE__ */ jsxRuntime.jsx(LiquidityText, { children: children ?? "Liquidity" })
3076
3083
  ] }),
3077
3084
  /* @__PURE__ */ jsxRuntime.jsxs(IconWrapper, { children: [
@@ -4357,6 +4364,225 @@ function TradeConfirmationModal({
4357
4364
  ] })
4358
4365
  ] }) });
4359
4366
  }
4367
+ var pulse2 = lt`
4368
+ 0%, 100% {
4369
+ opacity: 0.45;
4370
+ transform: scale(1);
4371
+ }
4372
+ 50% {
4373
+ opacity: 0.7;
4374
+ transform: scale(1.08);
4375
+ }
4376
+ `;
4377
+ var shimmer2 = lt`
4378
+ 0% {
4379
+ background-position: -100% 0;
4380
+ }
4381
+ 100% {
4382
+ background-position: 200% 0;
4383
+ }
4384
+ `;
4385
+ var LogoContainer2 = at.span`
4386
+ display: inline-flex;
4387
+ align-items: center;
4388
+ gap: 0.35rem;
4389
+ padding: 0.35rem 0.6rem;
4390
+ background: linear-gradient(
4391
+ 135deg,
4392
+ rgba(240, 185, 11, 0.05) 0%,
4393
+ rgba(240, 185, 11, 0.1) 50%,
4394
+ rgba(240, 185, 11, 0.05) 100%
4395
+ );
4396
+ border: 1px solid rgba(240, 185, 11, 0.3);
4397
+ border-radius: 5px;
4398
+ position: relative;
4399
+ overflow: visible;
4400
+ cursor: pointer;
4401
+ transition: all 0.3s ease;
4402
+ line-height: 1.4;
4403
+
4404
+ ${(props) => props.$isGlowing && `
4405
+ border-color: rgba(240, 185, 11, 1);
4406
+ box-shadow: 0 0 25px rgba(240, 185, 11, 0.8),
4407
+ 0 0 40px rgba(240, 185, 11, 0.5),
4408
+ inset 0 0 20px rgba(240, 185, 11, 0.3);
4409
+ background: linear-gradient(
4410
+ 135deg,
4411
+ rgba(240, 185, 11, 0.2) 0%,
4412
+ rgba(240, 185, 11, 0.3) 50%,
4413
+ rgba(240, 185, 11, 0.2) 100%
4414
+ );
4415
+ animation: quickPulse 0.35s ease-out;
4416
+
4417
+ @keyframes quickPulse {
4418
+ 0% {
4419
+ transform: scale(1);
4420
+ }
4421
+ 50% {
4422
+ transform: scale(1.05);
4423
+ }
4424
+ 100% {
4425
+ transform: scale(1);
4426
+ }
4427
+ }
4428
+ `}
4429
+
4430
+ @media (max-width: 768px) {
4431
+ padding: 0.3rem 0.4rem 0.3rem 0.25rem;
4432
+ gap: 0.25rem;
4433
+ border-radius: 4px;
4434
+ transform: none !important;
4435
+ transition: none;
4436
+
4437
+ &:active {
4438
+ transform: none !important;
4439
+ }
4440
+ }
4441
+
4442
+ @media (max-width: 480px) {
4443
+ padding: 0.2rem 0.3rem 0.2rem 0.2rem;
4444
+ gap: 0.2rem;
4445
+ transform: none !important;
4446
+ }
4447
+
4448
+ @media (hover: hover) and (pointer: fine) {
4449
+ &:hover {
4450
+ border-color: rgba(240, 185, 11, 0.6);
4451
+ background: linear-gradient(
4452
+ 135deg,
4453
+ rgba(240, 185, 11, 0.1) 0%,
4454
+ rgba(240, 185, 11, 0.15) 50%,
4455
+ rgba(240, 185, 11, 0.1) 100%
4456
+ );
4457
+ transform: translateY(-1px);
4458
+ box-shadow: 0 4px 12px rgba(240, 185, 11, 0.2);
4459
+ }
4460
+ }
4461
+
4462
+ &::before {
4463
+ content: "";
4464
+ position: absolute;
4465
+ top: 0;
4466
+ left: 0;
4467
+ right: 0;
4468
+ bottom: 0;
4469
+ background: linear-gradient(
4470
+ 90deg,
4471
+ transparent,
4472
+ rgba(240, 185, 11, 0.1),
4473
+ transparent
4474
+ );
4475
+ background-size: 200% 100%;
4476
+ animation: ${shimmer2} 3s infinite;
4477
+ pointer-events: none;
4478
+ }
4479
+ `;
4480
+ var IconWrapper2 = at.div`
4481
+ display: flex;
4482
+ align-items: center;
4483
+ justify-content: center;
4484
+ position: relative;
4485
+ width: 16px;
4486
+ height: 16px;
4487
+
4488
+ @media (max-width: 768px) {
4489
+ width: 16px;
4490
+ height: 16px;
4491
+ }
4492
+
4493
+ @media (max-width: 480px) {
4494
+ width: 14px;
4495
+ height: 14px;
4496
+ }
4497
+ `;
4498
+ var IconCircle2 = at.div`
4499
+ position: absolute;
4500
+ width: ${(props) => props.$size}px;
4501
+ height: ${(props) => props.$size}px;
4502
+ border: 2px solid ${(props) => props.$color};
4503
+ border-radius: 50%;
4504
+ animation: ${pulse2} ${(props) => props.$duration}s infinite cubic-bezier(0.4, 0, 0.6, 1);
4505
+ animation-delay: ${(props) => props.$delay}s;
4506
+ transform-origin: center;
4507
+ will-change: transform, opacity;
4508
+ `;
4509
+ var IconCore2 = at.div`
4510
+ width: 5px;
4511
+ height: 5px;
4512
+ background: linear-gradient(135deg, #0ecb81 0%, #2ecc71 100%);
4513
+ border-radius: 50%;
4514
+ box-shadow: 0 0 6px rgba(14, 203, 129, 0.6);
4515
+ position: relative;
4516
+ z-index: 1;
4517
+ `;
4518
+ var LogoText2 = at.span`
4519
+ display: inline-flex;
4520
+ align-items: center;
4521
+ gap: 0.2rem;
4522
+ position: relative;
4523
+ z-index: 1;
4524
+ vertical-align: middle;
4525
+ `;
4526
+ var LoafLogoImage2 = at.img`
4527
+ height: 20px;
4528
+ position: relative;
4529
+ z-index: 1;
4530
+
4531
+ @media (max-width: 768px) {
4532
+ height: 20px;
4533
+ }
4534
+
4535
+ @media (max-width: 480px) {
4536
+ height: 18px;
4537
+ }
4538
+ `;
4539
+ var LiquidityText2 = at.span`
4540
+ font-size: 0.65rem;
4541
+ font-weight: 400;
4542
+ background: linear-gradient(135deg, #f0b90b 0%, #ffd700 50%, #f0b90b 100%);
4543
+ background-size: 200% auto;
4544
+ -webkit-background-clip: text;
4545
+ -webkit-text-fill-color: transparent;
4546
+ background-clip: text;
4547
+ letter-spacing: 0.3px;
4548
+ font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
4549
+ opacity: 0.75;
4550
+ align-self: center;
4551
+ line-height: 1;
4552
+ display: flex;
4553
+ align-items: center;
4554
+ position: relative;
4555
+ top: 1px;
4556
+
4557
+ @media (max-width: 768px) {
4558
+ font-size: 0.6rem;
4559
+ letter-spacing: 0.2px;
4560
+ }
4561
+
4562
+ @media (max-width: 480px) {
4563
+ font-size: 0.55rem;
4564
+ letter-spacing: 0.1px;
4565
+ }
4566
+ `;
4567
+ var LoafLiquidityLogo = ({
4568
+ onClick,
4569
+ isGlowing,
4570
+ className
4571
+ }) => {
4572
+ return /* @__PURE__ */ jsxRuntime.jsxs(LogoContainer2, { onClick, $isGlowing: isGlowing, className, children: [
4573
+ /* @__PURE__ */ jsxRuntime.jsxs(LogoText2, { children: [
4574
+ /* @__PURE__ */ jsxRuntime.jsx(LoafLogoImage2, { src: Loaf_logo_Banner_default, alt: "Loaf" }),
4575
+ /* @__PURE__ */ jsxRuntime.jsx(LiquidityText2, { children: "Liquidity" })
4576
+ ] }),
4577
+ /* @__PURE__ */ jsxRuntime.jsxs(IconWrapper2, { children: [
4578
+ /* @__PURE__ */ jsxRuntime.jsx(IconCore2, {}),
4579
+ /* @__PURE__ */ jsxRuntime.jsx(IconCircle2, { $size: 10, $color: "rgba(14, 203, 129, 0.5)", $duration: 4, $delay: 0 }),
4580
+ /* @__PURE__ */ jsxRuntime.jsx(IconCircle2, { $size: 13, $color: "rgba(14, 203, 129, 0.35)", $duration: 5.2, $delay: 0.7 }),
4581
+ /* @__PURE__ */ jsxRuntime.jsx(IconCircle2, { $size: 16, $color: "rgba(14, 203, 129, 0.25)", $duration: 6.3, $delay: 1.3 })
4582
+ ] })
4583
+ ] });
4584
+ };
4585
+ LoafLiquidityLogo.displayName = "LoafLiquidityLogo";
4360
4586
  var DEFAULT_TABS = [
4361
4587
  { id: "portfolio", label: "Portfolio" },
4362
4588
  { id: "openOrders", label: "Open Orders" },
@@ -5525,76 +5751,842 @@ var PriceBlock = at.span`
5525
5751
  border-left: 1px solid rgba(255, 255, 255, 0.25);
5526
5752
  min-height: 1.5rem;
5527
5753
  `;
5528
- var PropertySubheader = o__namespace.forwardRef(
5529
- ({ className, tabs, activeTabId, onTabChange, actions, ...props }, ref) => {
5530
- const tabsContainerRef = o__namespace.useRef(null);
5531
- o__namespace.useEffect(() => {
5532
- const container = tabsContainerRef.current;
5533
- if (!container) return;
5534
- const isMobile = window.innerWidth <= 768;
5535
- if (!isMobile) return;
5536
- const forceScrollbar = () => {
5537
- if (container.scrollWidth > container.clientWidth) {
5538
- container.scrollTop = 1;
5539
- container.scrollTop = 0;
5540
- container.scrollLeft = 1;
5541
- container.scrollLeft = 0;
5542
- }
5543
- };
5544
- setTimeout(forceScrollbar, 100);
5545
- window.addEventListener("resize", forceScrollbar);
5546
- return () => window.removeEventListener("resize", forceScrollbar);
5547
- }, [tabs]);
5548
- return /* @__PURE__ */ jsxRuntime.jsxs(
5549
- "div",
5550
- {
5551
- ref,
5552
- className: cn(
5553
- "w-full font-normal",
5554
- "flex flex-col-reverse gap-3",
5555
- "md:flex-row md:items-center md:justify-between",
5556
- className
5557
- ),
5558
- ...props,
5559
- children: [
5560
- /* @__PURE__ */ jsxRuntime.jsx(
5754
+ var DEFAULT_TRADE_URL = "https://loafx-frontend-web.vercel.app/";
5755
+ var DEFAULT_TRADE_PATH = "/trade";
5756
+ var DEFAULT_HOME_PATH = "/";
5757
+ var DEFAULT_ABOUT_PATH = "/about";
5758
+ var DEFAULT_OFFERINGS_PATH = "/ipo/musgrave";
5759
+ var DEFAULT_PROPERTY_MAP_PATH = "/map";
5760
+ var DEFAULT_LOAF_LIQUIDITY_PATH = "/loaf-liquidity";
5761
+ var DEFAULT_AUTH_LOGIN_URL = "http://localhost:5174/";
5762
+ var DEFAULT_AUTH_RETURN_PARAM = "returnTo";
5763
+ var Header = ({
5764
+ currentUser,
5765
+ isAuthenticated = false,
5766
+ locationPath = DEFAULT_HOME_PATH,
5767
+ activeTab,
5768
+ onNavigate,
5769
+ onLogout,
5770
+ onSignInClick,
5771
+ loginPopupComponent: LoginPopupComponent,
5772
+ tradeUrl = DEFAULT_TRADE_URL,
5773
+ tradePath = DEFAULT_TRADE_PATH,
5774
+ homePath = DEFAULT_HOME_PATH,
5775
+ aboutPath = DEFAULT_ABOUT_PATH,
5776
+ offeringsPath = DEFAULT_OFFERINGS_PATH,
5777
+ propertyMapPath = DEFAULT_PROPERTY_MAP_PATH,
5778
+ loafLiquidityPath = DEFAULT_LOAF_LIQUIDITY_PATH,
5779
+ authLoginUrl = DEFAULT_AUTH_LOGIN_URL,
5780
+ authReturnParam = DEFAULT_AUTH_RETURN_PARAM,
5781
+ getAuthReturnUrl,
5782
+ logoHref,
5783
+ onLogoClick,
5784
+ onLoafLiquidityClick,
5785
+ onTradeClick,
5786
+ onProfileNavigate,
5787
+ onOrdersNavigate,
5788
+ onWalletNavigate
5789
+ }) => {
5790
+ const [isUserMenuOpen, setIsUserMenuOpen] = o.useState(false);
5791
+ const [isMobileMenuOpen, setIsMobileMenuOpen] = o.useState(false);
5792
+ const [isMoreMenuOpen, setIsMoreMenuOpen] = o.useState(false);
5793
+ const [showLoginPopup, setShowLoginPopup] = o.useState(false);
5794
+ o.useEffect(() => {
5795
+ const handleClickOutside = (event) => {
5796
+ const target = event.target;
5797
+ if (!target) return;
5798
+ const clickedInsideUserMenu = target.closest(".user-menu") || target.closest(".user-menu-dropdown");
5799
+ if (isUserMenuOpen && !clickedInsideUserMenu) {
5800
+ console.log("[Header] Closing user menu due to outside click");
5801
+ setIsUserMenuOpen(false);
5802
+ }
5803
+ if (isMobileMenuOpen && !target.closest(".mobile-menu") && !target.closest(".mobile-menu-button")) {
5804
+ setIsMobileMenuOpen(false);
5805
+ }
5806
+ if (isMoreMenuOpen && !target.closest(".more-menu")) {
5807
+ setIsMoreMenuOpen(false);
5808
+ }
5809
+ };
5810
+ document.addEventListener("mousedown", handleClickOutside);
5811
+ return () => {
5812
+ document.removeEventListener("mousedown", handleClickOutside);
5813
+ };
5814
+ }, [isUserMenuOpen, isMobileMenuOpen, isMoreMenuOpen]);
5815
+ const closeMenus = () => {
5816
+ setIsMobileMenuOpen(false);
5817
+ setIsUserMenuOpen(false);
5818
+ setIsMoreMenuOpen(false);
5819
+ };
5820
+ const handleUserMenuToggle = () => {
5821
+ const nextState = !isUserMenuOpen;
5822
+ console.log("[Header] User dropdown toggle clicked", { nextState });
5823
+ setIsUserMenuOpen(nextState);
5824
+ };
5825
+ const performNavigation = (path) => {
5826
+ if (onNavigate) {
5827
+ onNavigate(path);
5828
+ } else if (typeof window !== "undefined") {
5829
+ window.location.href = path;
5830
+ }
5831
+ };
5832
+ const handleNavigation = (path) => {
5833
+ closeMenus();
5834
+ performNavigation(path);
5835
+ };
5836
+ const handleLogoNavigation = (event) => {
5837
+ event.preventDefault();
5838
+ closeMenus();
5839
+ if (onLogoClick) {
5840
+ onLogoClick();
5841
+ return;
5842
+ }
5843
+ performNavigation(logoHref ?? homePath);
5844
+ };
5845
+ const handleLoafLiquidityNavigation = () => {
5846
+ closeMenus();
5847
+ if (onLoafLiquidityClick) {
5848
+ onLoafLiquidityClick();
5849
+ return;
5850
+ }
5851
+ performNavigation(loafLiquidityPath);
5852
+ };
5853
+ const handleTradeNavigation = () => {
5854
+ closeMenus();
5855
+ if (onTradeClick) {
5856
+ onTradeClick();
5857
+ return;
5858
+ }
5859
+ if (typeof window !== "undefined") {
5860
+ window.location.href = tradeUrl;
5861
+ }
5862
+ };
5863
+ const handleLogoutClick = async (event) => {
5864
+ event?.preventDefault();
5865
+ closeMenus();
5866
+ console.log("[Header] Logout option selected, invoking onLogout handler");
5867
+ await onLogout?.();
5868
+ };
5869
+ const userPrimaryLabel = currentUser?.displayName?.trim() || "User";
5870
+ const resolveAuthReturnUrl = () => {
5871
+ if (getAuthReturnUrl) {
5872
+ return getAuthReturnUrl();
5873
+ }
5874
+ if (typeof window !== "undefined") {
5875
+ return window.location.href;
5876
+ }
5877
+ return null;
5878
+ };
5879
+ const redirectToAuthLogin = () => {
5880
+ if (!authLoginUrl) {
5881
+ return false;
5882
+ }
5883
+ const nextUrl = resolveAuthReturnUrl();
5884
+ let finalUrl = authLoginUrl;
5885
+ if (authReturnParam && nextUrl) {
5886
+ try {
5887
+ const parsed = new URL(authLoginUrl, typeof window !== "undefined" ? window.location.origin : void 0);
5888
+ parsed.searchParams.set(authReturnParam, nextUrl);
5889
+ finalUrl = parsed.toString();
5890
+ } catch {
5891
+ const delimiter2 = authLoginUrl.includes("?") ? "&" : "?";
5892
+ finalUrl = `${authLoginUrl}${delimiter2}${encodeURIComponent(authReturnParam)}=${encodeURIComponent(nextUrl)}`;
5893
+ }
5894
+ }
5895
+ if (typeof window !== "undefined") {
5896
+ window.location.href = finalUrl;
5897
+ return true;
5898
+ }
5899
+ return false;
5900
+ };
5901
+ const handleSignIn = () => {
5902
+ if (onSignInClick) {
5903
+ onSignInClick();
5904
+ return;
5905
+ }
5906
+ if (redirectToAuthLogin()) {
5907
+ return;
5908
+ }
5909
+ if (LoginPopupComponent) {
5910
+ setShowLoginPopup(true);
5911
+ }
5912
+ };
5913
+ const inferredActiveTab = (() => {
5914
+ if (locationPath === tradePath) return "trade";
5915
+ if (locationPath === homePath) return "home";
5916
+ if (locationPath === aboutPath) return "about";
5917
+ if (locationPath.startsWith(offeringsPath)) return "offerings";
5918
+ if (locationPath === propertyMapPath) return "propertyMap";
5919
+ return null;
5920
+ })();
5921
+ const resolvedActiveTab = activeTab ?? inferredActiveTab;
5922
+ const tradeActive = resolvedActiveTab === "trade";
5923
+ const homeActive = resolvedActiveTab === "home";
5924
+ const offeringsActive = resolvedActiveTab === "offerings";
5925
+ const propertyMapActive = resolvedActiveTab === "propertyMap";
5926
+ const aboutActive = resolvedActiveTab === "about";
5927
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
5928
+ /* @__PURE__ */ jsxRuntime.jsx(Overlay, { $isOpen: isMobileMenuOpen, onClick: () => setIsMobileMenuOpen(false) }),
5929
+ /* @__PURE__ */ jsxRuntime.jsxs(HeaderContainer, { children: [
5930
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
5931
+ /* @__PURE__ */ jsxRuntime.jsxs(Logo, { children: [
5932
+ /* @__PURE__ */ jsxRuntime.jsx(LogoLink, { href: logoHref ?? homePath, onClick: handleLogoNavigation, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: Loaf_logo_Banner_default, alt: "LOAF Logo" }) }),
5933
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { children: "LOAF" })
5934
+ ] }),
5935
+ /* @__PURE__ */ jsxRuntime.jsxs(Nav, { $isOpen: isMobileMenuOpen, className: "mobile-menu", children: [
5936
+ !isMobileMenuOpen && /* @__PURE__ */ jsxRuntime.jsxs(
5561
5937
  "div",
5562
5938
  {
5563
- ref: tabsContainerRef,
5564
- className: cn(
5565
- "flex items-center border-b border-white/10",
5566
- "overflow-x-auto md:overflow-visible",
5567
- "[-webkit-overflow-scrolling:touch]",
5568
- "[scroll-behavior:smooth]",
5569
- "[touch-action:pan-x]",
5570
- "md:border-b-0"
5571
- ),
5572
- style: { WebkitTapHighlightColor: "transparent" },
5573
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-max", children: tabs.map((tab) => {
5574
- const active = tab.id === activeTabId;
5575
- return /* @__PURE__ */ jsxRuntime.jsxs(
5576
- "button",
5939
+ style: { display: "flex", flexDirection: "row", alignItems: "center", height: "56px" },
5940
+ className: "desktop-nav",
5941
+ children: [
5942
+ /* @__PURE__ */ jsxRuntime.jsx(
5943
+ NavLink,
5577
5944
  {
5578
- type: "button",
5579
- onClick: () => onTabChange?.(tab.id),
5580
- className: cn(
5581
- "relative whitespace-nowrap",
5582
- "px-6 py-4",
5583
- "font-normal",
5584
- "transition-colors",
5585
- "max-[768px]:px-[1.2rem] max-[768px]:py-[0.8rem]",
5586
- "max-[480px]:px-4 max-[480px]:py-[0.7rem] max-[480px]:text-[0.9rem]",
5587
- active ? "font-semibold text-[var(--color-accent,#e6c87e)]" : "text-white/60 hover:text-white"
5588
- ),
5589
- style: {
5590
- borderBottom: active ? "2px solid var(--color-accent, #e6c87e)" : "2px solid transparent",
5591
- minWidth: "80px",
5592
- touchAction: "manipulation"
5945
+ href: homePath,
5946
+ className: homeActive ? "active" : "",
5947
+ onClick: (event) => {
5948
+ event.preventDefault();
5949
+ handleNavigation(homePath);
5593
5950
  },
5594
- children: [
5595
- tab.label,
5596
- tab.hasNotification ? /* @__PURE__ */ jsxRuntime.jsx(
5597
- "span",
5951
+ children: "Home"
5952
+ }
5953
+ ),
5954
+ /* @__PURE__ */ jsxRuntime.jsx(
5955
+ NavLink,
5956
+ {
5957
+ href: aboutPath,
5958
+ className: aboutActive ? "active" : "",
5959
+ onClick: (event) => {
5960
+ event.preventDefault();
5961
+ handleNavigation(aboutPath);
5962
+ },
5963
+ children: "About"
5964
+ }
5965
+ ),
5966
+ /* @__PURE__ */ jsxRuntime.jsx(
5967
+ NavLink,
5968
+ {
5969
+ href: tradeUrl,
5970
+ className: tradeActive ? "active" : "",
5971
+ onClick: (event) => {
5972
+ event.preventDefault();
5973
+ handleTradeNavigation();
5974
+ },
5975
+ children: "Trade"
5976
+ }
5977
+ ),
5978
+ /* @__PURE__ */ jsxRuntime.jsx(
5979
+ NavLink,
5980
+ {
5981
+ href: offeringsPath,
5982
+ className: offeringsActive ? "active" : "",
5983
+ onClick: (event) => {
5984
+ event.preventDefault();
5985
+ handleNavigation(offeringsPath);
5986
+ },
5987
+ children: "Offerings"
5988
+ }
5989
+ ),
5990
+ /* @__PURE__ */ jsxRuntime.jsx(
5991
+ NavLink,
5992
+ {
5993
+ href: propertyMapPath,
5994
+ className: propertyMapActive ? "active" : "",
5995
+ onClick: (event) => {
5996
+ event.preventDefault();
5997
+ handleNavigation(propertyMapPath);
5998
+ },
5999
+ children: "Property Map"
6000
+ }
6001
+ ),
6002
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginLeft: "auto", display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsxRuntime.jsx(
6003
+ "div",
6004
+ {
6005
+ style: { cursor: "pointer", marginLeft: "12px" },
6006
+ onClick: handleLoafLiquidityNavigation,
6007
+ role: "button",
6008
+ tabIndex: 0,
6009
+ onKeyDown: (event) => {
6010
+ if (event.key === "Enter" || event.key === " ") {
6011
+ event.preventDefault();
6012
+ handleLoafLiquidityNavigation();
6013
+ }
6014
+ },
6015
+ children: /* @__PURE__ */ jsxRuntime.jsx(LoafLiquidityLogo, {})
6016
+ }
6017
+ ) })
6018
+ ]
6019
+ }
6020
+ ),
6021
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mobile-menu-content", children: [
6022
+ /* @__PURE__ */ jsxRuntime.jsx(MobileMenuHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(MobileMenuClose, { onClick: () => setIsMobileMenuOpen(false), "aria-label": "Close menu", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) }) }),
6023
+ /* @__PURE__ */ jsxRuntime.jsxs(SearchBar, { children: [
6024
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zM5 9.5C5 7.01 7.01 5 9.5 5S14 7.01 14 9.5 11.99 14 9.5 14 5 11.99 5 9.5z" }) }),
6025
+ /* @__PURE__ */ jsxRuntime.jsx("input", { type: "text", placeholder: "Search..." })
6026
+ ] }),
6027
+ /* @__PURE__ */ jsxRuntime.jsx(MobileNavItem, { onClick: () => handleNavigation(homePath), children: "Home" }),
6028
+ /* @__PURE__ */ jsxRuntime.jsx(
6029
+ MobileNavItem,
6030
+ {
6031
+ onClick: () => {
6032
+ handleTradeNavigation();
6033
+ },
6034
+ children: "Trade"
6035
+ }
6036
+ ),
6037
+ /* @__PURE__ */ jsxRuntime.jsx(MobileNavItem, { onClick: () => handleNavigation(offeringsPath), children: "Offerings" }),
6038
+ /* @__PURE__ */ jsxRuntime.jsx(MobileNavItem, { onClick: () => handleNavigation(propertyMapPath), children: "Property Map" }),
6039
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { borderTop: "1px solid #2b3139", margin: "8px 0" } }),
6040
+ /* @__PURE__ */ jsxRuntime.jsx(
6041
+ MobileNavItem,
6042
+ {
6043
+ onClick: handleLoafLiquidityNavigation,
6044
+ style: { display: "flex", justifyContent: "center", padding: "16px 24px" },
6045
+ children: /* @__PURE__ */ jsxRuntime.jsx(LoafLiquidityLogo, {})
6046
+ }
6047
+ ),
6048
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { borderTop: "1px solid #2b3139", margin: "8px 0" } }),
6049
+ isAuthenticated && /* @__PURE__ */ jsxRuntime.jsx(MobileNavItem, { onClick: handleLogoutClick, style: { color: "#f6465d" }, children: "Logout" })
6050
+ ] })
6051
+ ] })
6052
+ ] }),
6053
+ isMobileMenuOpen && /* @__PURE__ */ jsxRuntime.jsx(
6054
+ MobileOnlyButton,
6055
+ {
6056
+ onClick: () => setIsMobileMenuOpen(false),
6057
+ $isOpen: true,
6058
+ style: { position: "fixed", right: "1rem", top: "4rem" },
6059
+ "aria-label": "Close menu",
6060
+ children: "\u2715"
6061
+ }
6062
+ ),
6063
+ isAuthenticated ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
6064
+ /* @__PURE__ */ jsxRuntime.jsxs(UserMenu, { children: [
6065
+ /* @__PURE__ */ jsxRuntime.jsxs(
6066
+ UserButton,
6067
+ {
6068
+ onClick: handleUserMenuToggle,
6069
+ isOpen: isUserMenuOpen,
6070
+ className: "user-menu",
6071
+ children: [
6072
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column", alignItems: "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: "0.95rem" }, children: userPrimaryLabel }) }),
6073
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M7 10l5 5 5-5H7z" }) })
6074
+ ]
6075
+ }
6076
+ ),
6077
+ isUserMenuOpen && /* @__PURE__ */ jsxRuntime.jsxs(DropdownMenu, { className: "user-menu-dropdown", children: [
6078
+ /* @__PURE__ */ jsxRuntime.jsx(
6079
+ "div",
6080
+ {
6081
+ style: {
6082
+ padding: "12px 16px",
6083
+ borderBottom: "1px solid rgba(255,255,255,0.08)",
6084
+ textAlign: "left"
6085
+ },
6086
+ children: /* @__PURE__ */ jsxRuntime.jsx("p", { style: { margin: 0, fontWeight: 600 }, children: userPrimaryLabel })
6087
+ }
6088
+ ),
6089
+ /* @__PURE__ */ jsxRuntime.jsx(
6090
+ "button",
6091
+ {
6092
+ type: "button",
6093
+ onClick: (event) => {
6094
+ console.log("[Header] Logout menu item clicked");
6095
+ void handleLogoutClick(event);
6096
+ },
6097
+ children: /* @__PURE__ */ jsxRuntime.jsx(MenuItem, { className: "logout", children: "Logout" })
6098
+ }
6099
+ )
6100
+ ] })
6101
+ ] }),
6102
+ !isMobileMenuOpen && /* @__PURE__ */ jsxRuntime.jsx(
6103
+ MobileOnlyButton,
6104
+ {
6105
+ onClick: () => setIsMobileMenuOpen(true),
6106
+ $isOpen: false,
6107
+ className: "mobile-menu-button",
6108
+ "aria-label": "Open menu",
6109
+ children: "\u2630"
6110
+ }
6111
+ )
6112
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
6113
+ /* @__PURE__ */ jsxRuntime.jsx(Button2, { className: "signup", onClick: handleSignIn, children: "Sign in / Connect" }),
6114
+ !isMobileMenuOpen && /* @__PURE__ */ jsxRuntime.jsx(
6115
+ MobileOnlyButton,
6116
+ {
6117
+ onClick: () => setIsMobileMenuOpen(true),
6118
+ isOpen: false,
6119
+ className: "mobile-menu-button",
6120
+ "aria-label": "Open menu",
6121
+ children: "\u2630"
6122
+ }
6123
+ )
6124
+ ] })
6125
+ ] }),
6126
+ LoginPopupComponent && showLoginPopup && /* @__PURE__ */ jsxRuntime.jsx(LoginPopupComponent, { onClose: () => setShowLoginPopup(false) })
6127
+ ] });
6128
+ };
6129
+ Header.displayName = "Header";
6130
+ var Overlay = at.div`
6131
+ display: ${(props) => props.$isOpen ? "block" : "none"};
6132
+ position: fixed;
6133
+ top: 0;
6134
+ left: 0;
6135
+ width: 100%;
6136
+ height: 100%;
6137
+ background-color: rgba(0, 0, 0, 0.7);
6138
+ backdrop-filter: blur(3px);
6139
+ z-index: 999;
6140
+ `;
6141
+ var MobileOnlyButton = at.button.attrs({ type: "button" })`
6142
+ display: none;
6143
+ background-color: ${(props) => props.$isOpen ? "rgba(240, 185, 11, 0.2)" : "#f0b90b"};
6144
+ color: ${(props) => props.$isOpen ? "#ffffff" : "#0b0e11"};
6145
+ font-size: 24px;
6146
+ font-weight: bold;
6147
+ width: 44px;
6148
+ height: 44px;
6149
+ justify-content: center;
6150
+ align-items: center;
6151
+ margin-left: 0.75rem;
6152
+ z-index: 1100;
6153
+ border-radius: 8px;
6154
+ border: ${(props) => props.$isOpen ? "1px solid #f0b90b" : "none"};
6155
+ line-height: 1;
6156
+ padding: 0;
6157
+ cursor: pointer;
6158
+ box-shadow: ${(props) => props.$isOpen ? "0 2px 8px rgba(0, 0, 0, 0.3)" : "none"};
6159
+
6160
+ &:hover {
6161
+ background-color: ${(props) => props.$isOpen ? "rgba(240, 185, 11, 0.3)" : "#e0aa0b"};
6162
+ }
6163
+
6164
+ &:active {
6165
+ background-color: ${(props) => props.$isOpen ? "rgba(240, 185, 11, 0.4)" : "#d19f0a"};
6166
+ }
6167
+
6168
+ @media (max-width: 1300px) {
6169
+ display: flex;
6170
+ }
6171
+ `;
6172
+ var HeaderContainer = at.header`
6173
+ display: flex;
6174
+ justify-content: space-between;
6175
+ align-items: center;
6176
+ padding: 0 2rem;
6177
+ background-color: #0d1117;
6178
+ border-bottom: 1px solid #232a32;
6179
+ position: sticky;
6180
+ top: 0;
6181
+ left: 0;
6182
+ right: 0;
6183
+ z-index: 1000;
6184
+ width: 100%;
6185
+ height: 56px;
6186
+ box-sizing: border-box;
6187
+
6188
+ @media (max-width: 768px) {
6189
+ padding: 0 1rem;
6190
+ }
6191
+ `;
6192
+ var Logo = at.div`
6193
+ display: flex;
6194
+ align-items: center;
6195
+ margin-right: 24px;
6196
+ height: 56px;
6197
+
6198
+ img {
6199
+ height: 28px;
6200
+ display: block;
6201
+ }
6202
+
6203
+ h1 {
6204
+ display: none;
6205
+ }
6206
+
6207
+ @media (max-width: 768px) {
6208
+ img {
6209
+ height: 30px;
6210
+ }
6211
+ }
6212
+ `;
6213
+ var LogoLink = at.a`
6214
+ display: inline-flex;
6215
+ align-items: center;
6216
+ `;
6217
+ var Nav = at.nav`
6218
+ display: flex;
6219
+ flex-direction: column;
6220
+
6221
+ .desktop-nav {
6222
+ display: flex;
6223
+ }
6224
+
6225
+ .mobile-menu-content {
6226
+ display: none;
6227
+ }
6228
+
6229
+ .mobile-loaf-logo {
6230
+ display: none;
6231
+ }
6232
+
6233
+ @media (max-width: 1300px) {
6234
+ .mobile-loaf-logo {
6235
+ display: flex !important;
6236
+ align-items: center;
6237
+ height: 56px;
6238
+ }
6239
+ }
6240
+
6241
+ @media (max-width: 1300px) {
6242
+ position: fixed;
6243
+ top: 56px;
6244
+ right: ${(props) => props.$isOpen ? "0" : "-100%"} ;
6245
+ width: 280px;
6246
+ max-width: 280px;
6247
+ height: calc(100vh - 56px);
6248
+ background: linear-gradient(180deg, #0f1419 0%, #0a0e13 100%);
6249
+ z-index: 1000;
6250
+ transition: right 0.3s ease;
6251
+ box-shadow: ${(props) => props.$isOpen ? "-10px 0 30px rgba(0, 0, 0, 0.5)" : "none"};
6252
+ overflow-y: auto;
6253
+ border-left: 1px solid rgba(255, 255, 255, 0.05);
6254
+
6255
+ .desktop-nav {
6256
+ display: none;
6257
+ }
6258
+
6259
+ .mobile-menu-content {
6260
+ display: flex;
6261
+ flex-direction: column;
6262
+ padding-top: 0;
6263
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
6264
+ }
6265
+ }
6266
+ `;
6267
+ var NavLink = at.a`
6268
+ margin: 0 12px;
6269
+ color: #eaecef;
6270
+ font-weight: 500;
6271
+ font-size: 14px;
6272
+ padding: 0 4px;
6273
+ height: 56px;
6274
+ display: flex;
6275
+ align-items: center;
6276
+ position: relative;
6277
+ transition: color 0.2s ease;
6278
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;
6279
+ letter-spacing: 0.2px;
6280
+
6281
+ &:first-child {
6282
+ margin-left: 0;
6283
+ }
6284
+
6285
+ &:hover,
6286
+ &.active {
6287
+ color: #f0b90b;
6288
+ }
6289
+
6290
+ &.active::after {
6291
+ content: "";
6292
+ position: absolute;
6293
+ bottom: 0;
6294
+ left: 0;
6295
+ width: 100%;
6296
+ height: 3px;
6297
+ background-color: #f0b90b;
6298
+ }
6299
+
6300
+ @media (max-width: 768px) {
6301
+ margin: 0;
6302
+ padding: 16px 24px;
6303
+ width: 100%;
6304
+ height: auto;
6305
+ text-align: left;
6306
+ font-size: 16px;
6307
+ color: #eaecef;
6308
+ display: flex;
6309
+ align-items: center;
6310
+
6311
+ &:hover {
6312
+ background-color: #2b3139;
6313
+ }
6314
+
6315
+ &.active::after {
6316
+ display: none;
6317
+ }
6318
+
6319
+ svg {
6320
+ margin-right: 12px;
6321
+ width: 20px;
6322
+ height: 20px;
6323
+ }
6324
+ }
6325
+ `;
6326
+ var Button2 = at.button.attrs({ type: "button" })`
6327
+ padding: 0.5rem 1rem;
6328
+ border-radius: 6px;
6329
+ font-weight: 500;
6330
+ font-size: 13px;
6331
+ margin-left: 0.75rem;
6332
+ transition: all 0.2s ease;
6333
+
6334
+ &.login {
6335
+ background-color: transparent;
6336
+ border: 1px solid #f0b90b;
6337
+ color: #f0b90b;
6338
+
6339
+ &:hover {
6340
+ background-color: rgba(240, 185, 11, 0.1);
6341
+ }
6342
+
6343
+ @media (max-width: 768px) {
6344
+ display: none;
6345
+ }
6346
+ }
6347
+
6348
+ &.signup {
6349
+ background-color: #f0b90b;
6350
+ color: #0b0e11;
6351
+ border: none;
6352
+
6353
+ &:hover {
6354
+ background-color: #f8d12f;
6355
+ }
6356
+ }
6357
+
6358
+ @media (max-width: 768px) {
6359
+ padding: 0.65rem 1.25rem;
6360
+ font-size: 0.9rem;
6361
+ margin-left: 0.5rem;
6362
+ }
6363
+ `;
6364
+ var UserMenu = at.div`
6365
+ position: relative;
6366
+ margin-left: 0.75rem;
6367
+ height: 56px;
6368
+ display: flex;
6369
+ align-items: center;
6370
+
6371
+ @media (max-width: 768px) {
6372
+ margin-left: auto;
6373
+ }
6374
+ `;
6375
+ var UserButton = at.button.attrs({ type: "button" })`
6376
+ display: flex;
6377
+ align-items: center;
6378
+ background: transparent;
6379
+ color: #eaecef;
6380
+ font-size: 13px;
6381
+ padding: 0 6px;
6382
+ height: 32px;
6383
+ border-radius: 4px;
6384
+
6385
+ &:hover {
6386
+ background-color: #2b3139;
6387
+ }
6388
+
6389
+ span {
6390
+ margin-right: 0.5rem;
6391
+ }
6392
+
6393
+ svg {
6394
+ width: 12px;
6395
+ height: 12px;
6396
+ transition: transform 0.2s ease;
6397
+ transform: ${(props) => props.isOpen ? "rotate(180deg)" : "rotate(0)"};
6398
+ }
6399
+ `;
6400
+ var DropdownMenu = at.div`
6401
+ position: absolute;
6402
+ top: 100%;
6403
+ left: 0;
6404
+ margin-top: 0.25rem;
6405
+ background-color: #0d1117;
6406
+ border-radius: 8px;
6407
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
6408
+ border: 1px solid rgba(255, 255, 255, 0.1);
6409
+ min-width: 180px;
6410
+ overflow: hidden;
6411
+ z-index: 10;
6412
+ padding: 0.5rem 0;
6413
+
6414
+ button {
6415
+ background: none;
6416
+ border: none;
6417
+ padding: 0;
6418
+ margin: 0;
6419
+ width: 100%;
6420
+ text-align: left;
6421
+ cursor: pointer;
6422
+ color: inherit;
6423
+ display: block;
6424
+ }
6425
+ `;
6426
+ var MenuItem = at.div`
6427
+ padding: 0.75rem 1.25rem;
6428
+ cursor: pointer;
6429
+ transition: all 0.2s ease;
6430
+ color: #eaecef;
6431
+ font-size: 14px;
6432
+ font-weight: 400;
6433
+ display: block;
6434
+ width: 100%;
6435
+ border-bottom: none;
6436
+
6437
+ &:hover {
6438
+ color: #f0b90b;
6439
+ background-color: rgba(240, 185, 11, 0.08);
6440
+ }
6441
+
6442
+ &.logout {
6443
+ color: #f6465d;
6444
+ }
6445
+ `;
6446
+ var MobileMenuHeader = at.div`
6447
+ display: flex;
6448
+ justify-content: flex-end;
6449
+ align-items: center;
6450
+ padding: 16px 20px;
6451
+ margin-top: 60px;
6452
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
6453
+ background: rgba(0, 0, 0, 0.2);
6454
+ `;
6455
+ var MobileMenuClose = at.button.attrs({ type: "button" })`
6456
+ background: none;
6457
+ border: none;
6458
+ color: #eaecef;
6459
+ cursor: pointer;
6460
+ padding: 8px;
6461
+ font-size: 24px;
6462
+ display: flex;
6463
+ align-items: center;
6464
+ justify-content: center;
6465
+ `;
6466
+ var SearchBar = at.div`
6467
+ display: flex;
6468
+ align-items: center;
6469
+ background: rgba(255, 255, 255, 0.03);
6470
+ border-radius: 6px;
6471
+ padding: 10px 14px;
6472
+ margin: 16px 20px 12px;
6473
+ border: 1px solid rgba(255, 255, 255, 0.08);
6474
+ transition: all 0.2s ease;
6475
+
6476
+ &:focus-within {
6477
+ background: rgba(255, 255, 255, 0.05);
6478
+ border-color: rgba(240, 185, 11, 0.3);
6479
+ }
6480
+
6481
+ svg {
6482
+ color: rgba(240, 185, 11, 0.5);
6483
+ margin-right: 10px;
6484
+ width: 16px;
6485
+ height: 16px;
6486
+ }
6487
+
6488
+ input {
6489
+ background: none;
6490
+ border: none;
6491
+ color: #ffffff;
6492
+ font-size: 14px;
6493
+ width: 100%;
6494
+ outline: none;
6495
+ height: 20px;
6496
+
6497
+ &::placeholder {
6498
+ color: rgba(255, 255, 255, 0.4);
6499
+ }
6500
+ }
6501
+ `;
6502
+ var MobileNavItem = at.div`
6503
+ display: flex;
6504
+ align-items: center;
6505
+ padding: 14px 20px;
6506
+ color: rgba(255, 255, 255, 0.85);
6507
+ font-size: 15px;
6508
+ cursor: pointer;
6509
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
6510
+ font-weight: 400;
6511
+ transition: all 0.2s ease;
6512
+ letter-spacing: 0.2px;
6513
+
6514
+ &:hover {
6515
+ background: rgba(255, 255, 255, 0.05);
6516
+ color: #ffffff;
6517
+ padding-left: 24px;
6518
+ }
6519
+ `;
6520
+ var PropertySubheader = o__namespace.forwardRef(
6521
+ ({ className, tabs, activeTabId, onTabChange, actions, ...props }, ref) => {
6522
+ const tabsContainerRef = o__namespace.useRef(null);
6523
+ o__namespace.useEffect(() => {
6524
+ const container = tabsContainerRef.current;
6525
+ if (!container) return;
6526
+ const isMobile = window.innerWidth <= 768;
6527
+ if (!isMobile) return;
6528
+ const forceScrollbar = () => {
6529
+ if (container.scrollWidth > container.clientWidth) {
6530
+ container.scrollTop = 1;
6531
+ container.scrollTop = 0;
6532
+ container.scrollLeft = 1;
6533
+ container.scrollLeft = 0;
6534
+ }
6535
+ };
6536
+ setTimeout(forceScrollbar, 100);
6537
+ window.addEventListener("resize", forceScrollbar);
6538
+ return () => window.removeEventListener("resize", forceScrollbar);
6539
+ }, [tabs]);
6540
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6541
+ "div",
6542
+ {
6543
+ ref,
6544
+ className: cn(
6545
+ "w-full font-normal",
6546
+ "flex flex-col-reverse gap-3",
6547
+ "md:flex-row md:items-center md:justify-between",
6548
+ className
6549
+ ),
6550
+ ...props,
6551
+ children: [
6552
+ /* @__PURE__ */ jsxRuntime.jsx(
6553
+ "div",
6554
+ {
6555
+ ref: tabsContainerRef,
6556
+ className: cn(
6557
+ "flex items-center border-b border-white/10",
6558
+ "overflow-x-auto md:overflow-visible",
6559
+ "[-webkit-overflow-scrolling:touch]",
6560
+ "[scroll-behavior:smooth]",
6561
+ "[touch-action:pan-x]",
6562
+ "md:border-b-0"
6563
+ ),
6564
+ style: { WebkitTapHighlightColor: "transparent" },
6565
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-max", children: tabs.map((tab) => {
6566
+ const active = tab.id === activeTabId;
6567
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6568
+ "button",
6569
+ {
6570
+ type: "button",
6571
+ onClick: () => onTabChange?.(tab.id),
6572
+ className: cn(
6573
+ "relative whitespace-nowrap",
6574
+ "px-6 py-4",
6575
+ "font-normal",
6576
+ "transition-colors",
6577
+ "max-[768px]:px-[1.2rem] max-[768px]:py-[0.8rem]",
6578
+ "max-[480px]:px-4 max-[480px]:py-[0.7rem] max-[480px]:text-[0.9rem]",
6579
+ active ? "font-semibold text-[var(--color-accent,#e6c87e)]" : "text-white/60 hover:text-white"
6580
+ ),
6581
+ style: {
6582
+ borderBottom: active ? "2px solid var(--color-accent, #e6c87e)" : "2px solid transparent",
6583
+ minWidth: "80px",
6584
+ touchAction: "manipulation"
6585
+ },
6586
+ children: [
6587
+ tab.label,
6588
+ tab.hasNotification ? /* @__PURE__ */ jsxRuntime.jsx(
6589
+ "span",
5598
6590
  {
5599
6591
  className: "absolute right-[10px] top-[10px] h-2 w-2 rounded-full animate-pulse",
5600
6592
  style: {
@@ -5650,6 +6642,737 @@ var PropertySubheader = o__namespace.forwardRef(
5650
6642
  }
5651
6643
  );
5652
6644
  PropertySubheader.displayName = "PropertySubheader";
6645
+ var DEFAULT_LOGO_SRC = "/loaf-logo.png";
6646
+ var DEFAULT_LOGO_ALT = "Loaf";
6647
+ var OTP_INPUT_LENGTH = 6;
6648
+ var LoginPopup = ({
6649
+ onClose,
6650
+ onOpenEarlyAccess,
6651
+ isAuthenticated,
6652
+ currentUser,
6653
+ onSendEmailCode,
6654
+ onVerifyEmailCode,
6655
+ onDemoLogin,
6656
+ logoSrc = DEFAULT_LOGO_SRC,
6657
+ logoAlt = DEFAULT_LOGO_ALT,
6658
+ autoCloseOnAuth = true
6659
+ }) => {
6660
+ const [view, setView] = o.useState("main");
6661
+ const [email, setEmail] = o.useState("");
6662
+ const [handle, setHandle] = o.useState("");
6663
+ const [otp, setOtp] = o.useState(Array(OTP_INPUT_LENGTH).fill(""));
6664
+ const [error, setError] = o.useState("");
6665
+ const [loading, setLoading] = o.useState(false);
6666
+ const [isSignUp, setIsSignUp] = o.useState(false);
6667
+ o.useEffect(() => {
6668
+ if (!autoCloseOnAuth) {
6669
+ return;
6670
+ }
6671
+ if (isAuthenticated || currentUser) {
6672
+ onClose();
6673
+ }
6674
+ }, [autoCloseOnAuth, currentUser, isAuthenticated, onClose]);
6675
+ const handleWalletLogin = () => {
6676
+ onClose();
6677
+ if (onOpenEarlyAccess) {
6678
+ onOpenEarlyAccess();
6679
+ }
6680
+ };
6681
+ const handleEmailClick = (signUp = false) => {
6682
+ setIsSignUp(signUp);
6683
+ setView("email");
6684
+ setError("");
6685
+ };
6686
+ const handleSendCode = async (event) => {
6687
+ event?.preventDefault();
6688
+ if (!email || !email.includes("@")) {
6689
+ setError("Please enter a valid email address");
6690
+ return;
6691
+ }
6692
+ if (isSignUp && !handle.trim()) {
6693
+ setError("Please claim a handle to continue");
6694
+ return;
6695
+ }
6696
+ setLoading(true);
6697
+ setError("");
6698
+ const normalizedHandle = isSignUp ? handle.trim() : void 0;
6699
+ try {
6700
+ const demoResult = await onDemoLogin?.(email, normalizedHandle ?? null);
6701
+ if (demoResult && demoResult.success) {
6702
+ setLoading(false);
6703
+ return;
6704
+ }
6705
+ } catch (err) {
6706
+ console.warn("Demo login failed, attempting email OTP", err);
6707
+ }
6708
+ if (!onSendEmailCode) {
6709
+ setError("Email authentication is not configured for this popup.");
6710
+ setLoading(false);
6711
+ return;
6712
+ }
6713
+ setView("otp");
6714
+ setOtp(Array(OTP_INPUT_LENGTH).fill(""));
6715
+ try {
6716
+ await onSendEmailCode({ email, isSignUp, handle: normalizedHandle ?? null });
6717
+ } catch (err) {
6718
+ setView("email");
6719
+ setError(err instanceof Error ? err.message : "Failed to send verification code");
6720
+ } finally {
6721
+ setLoading(false);
6722
+ }
6723
+ };
6724
+ const handleOTPChange = (index, value) => {
6725
+ const sanitizedValue = value.replace(/\D/g, "");
6726
+ if (sanitizedValue.length > 1) {
6727
+ const digits = sanitizedValue.slice(0, OTP_INPUT_LENGTH).split("");
6728
+ const newOtp2 = [...otp];
6729
+ digits.forEach((digit, i) => {
6730
+ if (index + i < OTP_INPUT_LENGTH) {
6731
+ newOtp2[index + i] = digit;
6732
+ }
6733
+ });
6734
+ setOtp(newOtp2);
6735
+ const nextIndex = Math.min(index + digits.length, OTP_INPUT_LENGTH - 1);
6736
+ document.getElementById(`otp-${nextIndex}`)?.focus();
6737
+ return;
6738
+ }
6739
+ const newOtp = [...otp];
6740
+ newOtp[index] = sanitizedValue;
6741
+ setOtp(newOtp);
6742
+ if (sanitizedValue && index < OTP_INPUT_LENGTH - 1) {
6743
+ document.getElementById(`otp-${index + 1}`)?.focus();
6744
+ }
6745
+ };
6746
+ const handleOTPKeyDown = (index, event) => {
6747
+ if (event.key === "Backspace" && !otp[index] && index > 0) {
6748
+ document.getElementById(`otp-${index - 1}`)?.focus();
6749
+ }
6750
+ };
6751
+ const handleVerifyCode = async (event) => {
6752
+ event.preventDefault();
6753
+ const code = otp.join("");
6754
+ if (code.length !== OTP_INPUT_LENGTH) {
6755
+ setError("Please enter the 6-digit code");
6756
+ return;
6757
+ }
6758
+ if (!onVerifyEmailCode) {
6759
+ setError("Verification handler missing. Cannot verify code.");
6760
+ return;
6761
+ }
6762
+ setLoading(true);
6763
+ setError("");
6764
+ try {
6765
+ await onVerifyEmailCode({ code, email });
6766
+ } catch (err) {
6767
+ setError(err instanceof Error ? err.message : "Invalid verification code");
6768
+ } finally {
6769
+ setLoading(false);
6770
+ }
6771
+ };
6772
+ const handleBack = () => {
6773
+ setView("main");
6774
+ setEmail("");
6775
+ setHandle("");
6776
+ setOtp(Array(OTP_INPUT_LENGTH).fill(""));
6777
+ setError("");
6778
+ };
6779
+ if (view === "main") {
6780
+ return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
6781
+ /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) }),
6782
+ /* @__PURE__ */ jsxRuntime.jsxs(Title, { children: [
6783
+ /* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
6784
+ "Welcome to Loaf"
6785
+ ] }),
6786
+ /* @__PURE__ */ jsxRuntime.jsxs(ButtonsContainer, { children: [
6787
+ /* @__PURE__ */ jsxRuntime.jsxs(LoginButton, { onClick: () => handleEmailClick(false), children: [
6788
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z" }) }),
6789
+ "Sign in with Email"
6790
+ ] }),
6791
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", color: "var(--color-text-secondary, #848e9c)", fontSize: "0.875rem" }, children: "or" }),
6792
+ /* @__PURE__ */ jsxRuntime.jsxs(LoginButton, { onClick: handleWalletLogin, children: [
6793
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z" }) }),
6794
+ "Sign in with Wallet"
6795
+ ] })
6796
+ ] }),
6797
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", marginTop: "0.5rem", marginBottom: "1rem" }, children: /* @__PURE__ */ jsxRuntime.jsx(
6798
+ "span",
6799
+ {
6800
+ onClick: () => handleEmailClick(true),
6801
+ style: {
6802
+ color: "var(--color-text-secondary, #848e9c)",
6803
+ fontSize: "0.8rem",
6804
+ cursor: "pointer",
6805
+ textDecoration: "underline"
6806
+ },
6807
+ children: "Sign Up"
6808
+ }
6809
+ ) }),
6810
+ /* @__PURE__ */ jsxRuntime.jsx(Divider, {}),
6811
+ /* @__PURE__ */ jsxRuntime.jsxs(AnnotationContainer, { children: [
6812
+ /* @__PURE__ */ jsxRuntime.jsxs(Annotation, { children: [
6813
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M21 18v1c0 1.1-.9 2-2 2H5c-1.11 0-2-.9-2-2V5c0-1.1.89-2 2-2h14c1.1 0 2 .9 2 2v1h-9c-1.11 0-2 .9-2 2v8c0 1.1.89 2 2 2h9zm-9-2h10V8H12v8zm4-2.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5z" }) }),
6814
+ /* @__PURE__ */ jsxRuntime.jsxs(AnnotationText, { children: [
6815
+ /* @__PURE__ */ jsxRuntime.jsx(AnnotationLabel, { children: "\u2190 Digital Asset users" }),
6816
+ "Connect your Web3 wallet to access your assets"
6817
+ ] })
6818
+ ] }),
6819
+ /* @__PURE__ */ jsxRuntime.jsxs(Annotation, { children: [
6820
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z" }) }),
6821
+ /* @__PURE__ */ jsxRuntime.jsxs(AnnotationText, { children: [
6822
+ /* @__PURE__ */ jsxRuntime.jsx(AnnotationLabel, { children: "\u2190 Traditional Finance users" }),
6823
+ "Sign in with email, no web3 experience needed"
6824
+ ] })
6825
+ ] }),
6826
+ /* @__PURE__ */ jsxRuntime.jsxs(Annotation, { children: [
6827
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z" }) }),
6828
+ /* @__PURE__ */ jsxRuntime.jsxs(AnnotationText, { children: [
6829
+ /* @__PURE__ */ jsxRuntime.jsx(AnnotationLabel, { children: "\u2190 Self-custodied" }),
6830
+ "We never have ownership of your assets. All units are self-custodied"
6831
+ ] })
6832
+ ] })
6833
+ ] })
6834
+ ] }) });
6835
+ }
6836
+ if (view === "email") {
6837
+ return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
6838
+ /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) }),
6839
+ /* @__PURE__ */ jsxRuntime.jsxs(BackButton, { onClick: handleBack, children: [
6840
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" }) }),
6841
+ "Back"
6842
+ ] }),
6843
+ /* @__PURE__ */ jsxRuntime.jsxs(Title, { children: [
6844
+ /* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
6845
+ isSignUp ? "Sign up with Email" : "Sign in with Email"
6846
+ ] }),
6847
+ /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSendCode, children: /* @__PURE__ */ jsxRuntime.jsxs(EmailFormContainer, { children: [
6848
+ /* @__PURE__ */ jsxRuntime.jsx(
6849
+ EmailInput,
6850
+ {
6851
+ type: "email",
6852
+ placeholder: "Enter your email address",
6853
+ value: email,
6854
+ onChange: (event) => setEmail(event.target.value),
6855
+ autoFocus: true
6856
+ }
6857
+ ),
6858
+ isSignUp && /* @__PURE__ */ jsxRuntime.jsx(
6859
+ EmailInput,
6860
+ {
6861
+ type: "text",
6862
+ placeholder: "Claim your handle (e.g. Landlord)",
6863
+ value: handle,
6864
+ onChange: (event) => setHandle(event.target.value),
6865
+ style: { marginTop: "0.5rem" }
6866
+ }
6867
+ ),
6868
+ /* @__PURE__ */ jsxRuntime.jsx(SubmitButton, { type: "submit", disabled: loading || !email || isSignUp && !handle, children: loading ? "Sending..." : "Continue" }),
6869
+ error && /* @__PURE__ */ jsxRuntime.jsx(StatusMessage, { $error: true, children: error })
6870
+ ] }) }),
6871
+ /* @__PURE__ */ jsxRuntime.jsx(InfoText, { children: "We'll send you a verification code to sign in securely." }),
6872
+ isSignUp && /* @__PURE__ */ jsxRuntime.jsx(MiniLiveFeed, {})
6873
+ ] }) });
6874
+ }
6875
+ if (view === "otp") {
6876
+ return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
6877
+ /* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) }),
6878
+ /* @__PURE__ */ jsxRuntime.jsxs(BackButton, { onClick: () => setView("email"), children: [
6879
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" }) }),
6880
+ "Back"
6881
+ ] }),
6882
+ /* @__PURE__ */ jsxRuntime.jsxs(Title, { children: [
6883
+ /* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
6884
+ "Enter Verification Code"
6885
+ ] }),
6886
+ /* @__PURE__ */ jsxRuntime.jsxs(InfoText, { style: { marginBottom: "1.5rem" }, children: [
6887
+ "We sent a code to ",
6888
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { style: { color: "#eaecef" }, children: email })
6889
+ ] }),
6890
+ /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleVerifyCode, children: /* @__PURE__ */ jsxRuntime.jsxs(EmailFormContainer, { children: [
6891
+ /* @__PURE__ */ jsxRuntime.jsx(OTPContainer, { children: otp.map((digit, index) => /* @__PURE__ */ jsxRuntime.jsx(
6892
+ OTPInput,
6893
+ {
6894
+ id: `otp-${index}`,
6895
+ type: "text",
6896
+ inputMode: "numeric",
6897
+ maxLength: 1,
6898
+ value: digit,
6899
+ onChange: (event) => handleOTPChange(index, event.target.value),
6900
+ onKeyDown: (event) => handleOTPKeyDown(index, event),
6901
+ autoFocus: index === 0
6902
+ },
6903
+ index
6904
+ )) }),
6905
+ /* @__PURE__ */ jsxRuntime.jsx(SubmitButton, { type: "submit", disabled: loading || otp.join("").length !== OTP_INPUT_LENGTH, children: loading ? "Verifying..." : "Verify" }),
6906
+ error && /* @__PURE__ */ jsxRuntime.jsx(StatusMessage, { $error: true, children: error })
6907
+ ] }) }),
6908
+ /* @__PURE__ */ jsxRuntime.jsxs(InfoText, { children: [
6909
+ "Didn't receive a code?",
6910
+ " ",
6911
+ /* @__PURE__ */ jsxRuntime.jsx(
6912
+ "button",
6913
+ {
6914
+ type: "button",
6915
+ onClick: (event) => {
6916
+ event.preventDefault();
6917
+ void handleSendCode(event);
6918
+ },
6919
+ style: {
6920
+ background: "none",
6921
+ border: "none",
6922
+ color: "#f0b90b",
6923
+ cursor: "pointer",
6924
+ textDecoration: "underline"
6925
+ },
6926
+ children: "Resend"
6927
+ }
6928
+ )
6929
+ ] })
6930
+ ] }) });
6931
+ }
6932
+ return null;
6933
+ };
6934
+ var Overlay2 = at.div`
6935
+ position: fixed;
6936
+ top: 0;
6937
+ left: 0;
6938
+ right: 0;
6939
+ bottom: 0;
6940
+ background-color: rgba(0, 0, 0, 0.8);
6941
+ backdrop-filter: blur(4px);
6942
+ display: flex;
6943
+ justify-content: center;
6944
+ align-items: center;
6945
+ z-index: 10000;
6946
+ animation: fadeIn 0.2s ease-in-out;
6947
+
6948
+ @keyframes fadeIn {
6949
+ from {
6950
+ opacity: 0;
6951
+ }
6952
+ to {
6953
+ opacity: 1;
6954
+ }
6955
+ }
6956
+ `;
6957
+ var PopupContainer = at.div`
6958
+ background-color: var(--color-background, #0a0a0a);
6959
+ border: 1px solid rgba(230, 198, 86, 0.3);
6960
+ border-radius: var(--border-radius, 12px);
6961
+ padding: 2.5rem;
6962
+ max-width: 440px;
6963
+ width: 90%;
6964
+ position: relative;
6965
+ animation: slideUp 0.3s ease-out;
6966
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
6967
+
6968
+ @keyframes slideUp {
6969
+ from {
6970
+ transform: translateY(20px);
6971
+ opacity: 0;
6972
+ }
6973
+ to {
6974
+ transform: translateY(0);
6975
+ opacity: 1;
6976
+ }
6977
+ }
6978
+
6979
+ @media (max-width: 768px) {
6980
+ padding: 2rem;
6981
+ max-width: 90%;
6982
+ }
6983
+ `;
6984
+ var CloseButton = at.button`
6985
+ position: absolute;
6986
+ top: 1rem;
6987
+ right: 1rem;
6988
+ background: none;
6989
+ border: none;
6990
+ color: var(--color-text-secondary, #848e9c);
6991
+ font-size: 1.5rem;
6992
+ cursor: pointer;
6993
+ padding: 0.5rem;
6994
+ display: flex;
6995
+ align-items: center;
6996
+ justify-content: center;
6997
+ transition: color 0.2s ease;
6998
+
6999
+ &:hover {
7000
+ color: var(--color-accent, #e6c656);
7001
+ }
7002
+ `;
7003
+ var Title = at.h2`
7004
+ font-size: 1.75rem;
7005
+ font-weight: 600;
7006
+ color: var(--color-text, #eaecef);
7007
+ margin-bottom: 2rem;
7008
+ text-align: center;
7009
+ display: flex;
7010
+ flex-direction: column;
7011
+ align-items: center;
7012
+ justify-content: center;
7013
+ gap: 1rem;
7014
+ `;
7015
+ var LogoContainer3 = at.div`
7016
+ display: flex;
7017
+ justify-content: center;
7018
+ margin-bottom: 0.5rem;
7019
+ `;
7020
+ var LogoImage = at.img`
7021
+ height: 60px;
7022
+ `;
7023
+ var ButtonsContainer = at.div`
7024
+ display: flex;
7025
+ flex-direction: column;
7026
+ gap: 1rem;
7027
+ margin-bottom: 1.5rem;
7028
+ `;
7029
+ var LoginButton = at.button`
7030
+ display: flex;
7031
+ align-items: center;
7032
+ justify-content: center;
7033
+ gap: 0.75rem;
7034
+ padding: 1rem 1.5rem;
7035
+ background-color: var(--color-background-light, #1a1a1a);
7036
+ border: 1px solid rgba(230, 198, 86, 0.2);
7037
+ border-radius: var(--border-radius, 8px);
7038
+ color: var(--color-text, #eaecef);
7039
+ font-size: 1rem;
7040
+ font-weight: 500;
7041
+ cursor: pointer;
7042
+ transition: all 0.2s ease;
7043
+
7044
+ &:hover {
7045
+ background-color: rgba(230, 198, 86, 0.1);
7046
+ border-color: var(--color-accent, #e6c656);
7047
+ }
7048
+
7049
+ svg {
7050
+ width: 20px;
7051
+ height: 20px;
7052
+ color: var(--color-accent, #e6c656);
7053
+ }
7054
+ `;
7055
+ var Divider = at.div`
7056
+ display: flex;
7057
+ align-items: center;
7058
+ margin: 1.5rem 0;
7059
+
7060
+ &::before,
7061
+ &::after {
7062
+ content: "";
7063
+ flex: 1;
7064
+ height: 1px;
7065
+ background-color: rgba(230, 198, 86, 0.2);
7066
+ }
7067
+ `;
7068
+ var InfoText = at.p`
7069
+ color: var(--color-text-secondary, #848e9c);
7070
+ font-size: 0.875rem;
7071
+ text-align: center;
7072
+ line-height: 1.5;
7073
+ `;
7074
+ var AnnotationContainer = at.div`
7075
+ display: flex;
7076
+ flex-direction: column;
7077
+ gap: 0.75rem;
7078
+ margin-top: 1.5rem;
7079
+ padding-top: 1.5rem;
7080
+ border-top: 1px solid rgba(230, 198, 86, 0.2);
7081
+ `;
7082
+ var Annotation = at.div`
7083
+ display: flex;
7084
+ align-items: flex-start;
7085
+ gap: 1rem;
7086
+ color: var(--color-text-secondary, #848e9c);
7087
+ font-size: 0.8rem;
7088
+
7089
+ svg {
7090
+ width: 16px;
7091
+ height: 16px;
7092
+ flex-shrink: 0;
7093
+ margin-top: 2px;
7094
+ color: var(--color-accent, #e6c656);
7095
+ }
7096
+ `;
7097
+ var AnnotationText = at.span`
7098
+ flex: 1;
7099
+ line-height: 1.4;
7100
+ `;
7101
+ var AnnotationLabel = at.span`
7102
+ color: var(--color-text, #eaecef);
7103
+ font-weight: 500;
7104
+ margin-right: 0.25rem;
7105
+ `;
7106
+ var EmailFormContainer = at.div`
7107
+ display: flex;
7108
+ flex-direction: column;
7109
+ gap: 1rem;
7110
+ margin-bottom: 1.5rem;
7111
+ `;
7112
+ var EmailInput = at.input`
7113
+ width: 100%;
7114
+ padding: 1rem 1.25rem;
7115
+ background-color: var(--color-background-light, #1a1a1a);
7116
+ border: 1px solid rgba(230, 198, 86, 0.2);
7117
+ border-radius: var(--border-radius, 8px);
7118
+ color: var(--color-text, #eaecef);
7119
+ font-size: 1rem;
7120
+ transition: all 0.2s ease;
7121
+
7122
+ &:focus {
7123
+ outline: none;
7124
+ border-color: var(--color-accent, #e6c656);
7125
+ }
7126
+
7127
+ &::placeholder {
7128
+ color: var(--color-text-secondary, #848e9c);
7129
+ }
7130
+ `;
7131
+ var OTPContainer = at.div`
7132
+ display: flex;
7133
+ gap: 0.5rem;
7134
+ justify-content: center;
7135
+ `;
7136
+ var OTPInput = at.input`
7137
+ width: 48px;
7138
+ height: 56px;
7139
+ text-align: center;
7140
+ font-size: 1.5rem;
7141
+ font-weight: 600;
7142
+ background-color: var(--color-background-light, #1a1a1a);
7143
+ border: 1px solid rgba(230, 198, 86, 0.2);
7144
+ border-radius: var(--border-radius, 8px);
7145
+ color: var(--color-accent, #e6c656);
7146
+ transition: all 0.2s ease;
7147
+
7148
+ &:focus {
7149
+ outline: none;
7150
+ border-color: var(--color-accent, #e6c656);
7151
+ box-shadow: 0 0 0 2px rgba(230, 198, 86, 0.2);
7152
+ }
7153
+ `;
7154
+ var SubmitButton = at.button`
7155
+ width: 100%;
7156
+ padding: 1rem;
7157
+ background-color: var(--color-accent, #e6c656);
7158
+ border: none;
7159
+ border-radius: var(--border-radius, 8px);
7160
+ color: var(--color-background, #0a0a0a);
7161
+ font-size: 1rem;
7162
+ font-weight: 600;
7163
+ cursor: pointer;
7164
+ transition: all 0.2s ease;
7165
+
7166
+ &:hover:not(:disabled) {
7167
+ background-color: var(--color-accent-hover, #d4a50a);
7168
+ transform: translateY(-1px);
7169
+ }
7170
+
7171
+ &:disabled {
7172
+ background-color: var(--color-background-light, #1a1a1a);
7173
+ color: var(--color-text-secondary, #848e9c);
7174
+ cursor: not-allowed;
7175
+ }
7176
+ `;
7177
+ var BackButton = at.button`
7178
+ background: none;
7179
+ border: none;
7180
+ color: var(--color-text-secondary, #848e9c);
7181
+ font-size: 0.875rem;
7182
+ cursor: pointer;
7183
+ display: flex;
7184
+ align-items: center;
7185
+ gap: 0.5rem;
7186
+ margin-bottom: 1rem;
7187
+
7188
+ &:hover {
7189
+ color: var(--color-accent, #e6c656);
7190
+ }
7191
+ `;
7192
+ var StatusMessage = at.p`
7193
+ color: ${(props) => props.$error ? "#f6465d" : "#0ecb81"};
7194
+ font-size: 0.875rem;
7195
+ text-align: center;
7196
+ margin-top: 0.5rem;
7197
+ `;
7198
+ var MiniLiveFeed = () => {
7199
+ const [purchases, setPurchases] = o.useState([]);
7200
+ o.useEffect(() => {
7201
+ const handles = [
7202
+ "Landlord",
7203
+ "PropertyKing",
7204
+ "RealEstateGuru",
7205
+ "InvestorPro",
7206
+ "WealthBuilder",
7207
+ "AssetHunter",
7208
+ "PortfolioMax",
7209
+ "CapitalGains",
7210
+ "DividendKing",
7211
+ "YieldSeeker",
7212
+ "BrickNMortar",
7213
+ "EquityBoss",
7214
+ "CashFlowKing",
7215
+ "PropMogul",
7216
+ "RentCollector",
7217
+ "LandBaron",
7218
+ "EstateBuilder",
7219
+ "ValueInvestor",
7220
+ "GrowthSeeker",
7221
+ "PassiveIncome",
7222
+ "WealthyOwl",
7223
+ "SmartMoney",
7224
+ "AlphaInvestor",
7225
+ "DiamondHands",
7226
+ "GoldenGoose",
7227
+ "EliteHolder",
7228
+ "TopTierInvestor",
7229
+ "PlatinumPro",
7230
+ "AussieInvestor",
7231
+ "HarbourHero",
7232
+ "James W.",
7233
+ "Sarah M.",
7234
+ "Michael T.",
7235
+ "Emma L.",
7236
+ "David K.",
7237
+ "Sophie R.",
7238
+ "Chris B.",
7239
+ "Jessica H.",
7240
+ "Andrew P.",
7241
+ "Rachel S.",
7242
+ "Daniel C.",
7243
+ "Olivia N."
7244
+ ];
7245
+ const generatePurchase = () => {
7246
+ const tokenPrice = 250;
7247
+ const tokenCount = Math.floor(Math.random() * 150) + 10;
7248
+ const amount = tokenPrice * tokenCount;
7249
+ const randomHandle = handles[Math.floor(Math.random() * handles.length)];
7250
+ return {
7251
+ id: `p-${Date.now()}-${Math.random()}`,
7252
+ name: randomHandle,
7253
+ amount,
7254
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
7255
+ };
7256
+ };
7257
+ const initial = Array.from({ length: 5 }, generatePurchase);
7258
+ setPurchases(initial);
7259
+ const interval = setInterval(() => {
7260
+ setPurchases((prev2) => [generatePurchase(), ...prev2.slice(0, 5)]);
7261
+ }, 2e3 + Math.random() * 2e3);
7262
+ return () => clearInterval(interval);
7263
+ }, []);
7264
+ const formatCurrency3 = (amount) => `$${amount.toLocaleString()}`;
7265
+ return /* @__PURE__ */ jsxRuntime.jsxs(
7266
+ "div",
7267
+ {
7268
+ style: {
7269
+ marginTop: "1rem",
7270
+ maxHeight: "180px",
7271
+ overflow: "hidden",
7272
+ borderRadius: "8px",
7273
+ background: "rgba(0, 0, 0, 0.3)"
7274
+ },
7275
+ children: [
7276
+ /* @__PURE__ */ jsxRuntime.jsxs(
7277
+ "div",
7278
+ {
7279
+ style: {
7280
+ fontSize: "0.7rem",
7281
+ color: "var(--color-text-secondary, #848e9c)",
7282
+ padding: "0.5rem 0.75rem",
7283
+ borderBottom: "1px solid rgba(255, 255, 255, 0.05)",
7284
+ display: "flex",
7285
+ alignItems: "center",
7286
+ gap: "0.4rem"
7287
+ },
7288
+ children: [
7289
+ /* @__PURE__ */ jsxRuntime.jsx(
7290
+ "span",
7291
+ {
7292
+ style: {
7293
+ width: "6px",
7294
+ height: "6px",
7295
+ borderRadius: "50%",
7296
+ background: "#0ecb81",
7297
+ animation: "pulse 1.5s infinite"
7298
+ }
7299
+ }
7300
+ ),
7301
+ "Handles will Appear:"
7302
+ ]
7303
+ }
7304
+ ),
7305
+ purchases.map((purchase, index) => {
7306
+ const maxAmount = 4e4;
7307
+ const barPercent = Math.min(80, Math.max(15, purchase.amount / maxAmount * 100));
7308
+ return /* @__PURE__ */ jsxRuntime.jsxs(
7309
+ "div",
7310
+ {
7311
+ style: {
7312
+ padding: "0.4rem 0.75rem",
7313
+ display: "flex",
7314
+ justifyContent: "space-between",
7315
+ alignItems: "center",
7316
+ borderBottom: "1px solid rgba(255, 255, 255, 0.03)",
7317
+ position: "relative",
7318
+ animation: index === 0 ? "slideIn 0.3s ease-out" : "none"
7319
+ },
7320
+ children: [
7321
+ /* @__PURE__ */ jsxRuntime.jsx(
7322
+ "div",
7323
+ {
7324
+ style: {
7325
+ position: "absolute",
7326
+ top: 0,
7327
+ right: 0,
7328
+ bottom: 0,
7329
+ width: `${barPercent}%`,
7330
+ background: "linear-gradient(90deg, transparent 0%, rgba(14, 203, 129, 0.12) 100%)",
7331
+ pointerEvents: "none"
7332
+ }
7333
+ }
7334
+ ),
7335
+ /* @__PURE__ */ jsxRuntime.jsx(
7336
+ "div",
7337
+ {
7338
+ style: {
7339
+ position: "absolute",
7340
+ left: 0,
7341
+ top: 0,
7342
+ bottom: 0,
7343
+ width: "2px",
7344
+ background: index === 0 ? "rgba(14, 203, 129, 0.5)" : "transparent"
7345
+ }
7346
+ }
7347
+ ),
7348
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { position: "relative", zIndex: 1 }, children: [
7349
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: "0.8rem", fontWeight: 500, color: "#fff" }, children: purchase.name }),
7350
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: "0.65rem", color: "var(--color-text-secondary, #848e9c)" }, children: "less than a minute ago" })
7351
+ ] }),
7352
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem", position: "relative", zIndex: 1 }, children: [
7353
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.75rem", color: "var(--color-text-secondary, #848e9c)" }, children: "bought" }),
7354
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.8rem", fontWeight: 600, color: "#fff" }, children: formatCurrency3(purchase.amount) })
7355
+ ] })
7356
+ ]
7357
+ },
7358
+ purchase.id
7359
+ );
7360
+ }),
7361
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
7362
+ @keyframes slideIn {
7363
+ from { opacity: 0; transform: translateY(-10px); }
7364
+ to { opacity: 1; transform: translateY(0); }
7365
+ }
7366
+ @keyframes pulse {
7367
+ 0%, 100% { opacity: 1; }
7368
+ 50% { opacity: 0.5; }
7369
+ }
7370
+ ` })
7371
+ ]
7372
+ }
7373
+ );
7374
+ };
7375
+ LoginPopup.displayName = "LoginPopup";
5653
7376
  var PropertyCompareBar = o__namespace.forwardRef(
5654
7377
  ({
5655
7378
  className,
@@ -6046,9 +7769,12 @@ exports.CardDescription = CardDescription;
6046
7769
  exports.CardFooter = CardFooter;
6047
7770
  exports.CardHeader = CardHeader;
6048
7771
  exports.CardTitle = CardTitle;
7772
+ exports.Header = Header;
6049
7773
  exports.HousePositionSlider = HousePositionSlider;
6050
7774
  exports.HousePositionSliderMobile = HousePositionSliderMobile;
6051
7775
  exports.LoafLiquidityBadge = LoafLiquidityBadge;
7776
+ exports.LoafLiquidityLogo = LoafLiquidityLogo;
7777
+ exports.LoginPopup = LoginPopup;
6052
7778
  exports.MobileTradeNav = MobileTradeNav;
6053
7779
  exports.Orderbook = Orderbook;
6054
7780
  exports.PortfolioSummary = PortfolioSummary;