@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/Loaf-logo-Banner-DYV62HAW.png +0 -0
- package/dist/index.d.mts +94 -3
- package/dist/index.d.ts +94 -3
- package/dist/index.js +1795 -69
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1794 -71
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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:
|
|
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
|
|
5529
|
-
|
|
5530
|
-
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
|
|
5538
|
-
|
|
5539
|
-
|
|
5540
|
-
|
|
5541
|
-
|
|
5542
|
-
|
|
5543
|
-
|
|
5544
|
-
|
|
5545
|
-
|
|
5546
|
-
|
|
5547
|
-
|
|
5548
|
-
|
|
5549
|
-
|
|
5550
|
-
|
|
5551
|
-
|
|
5552
|
-
|
|
5553
|
-
|
|
5554
|
-
|
|
5555
|
-
|
|
5556
|
-
|
|
5557
|
-
|
|
5558
|
-
|
|
5559
|
-
|
|
5560
|
-
|
|
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
|
-
|
|
5564
|
-
className:
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
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
|
-
|
|
5579
|
-
|
|
5580
|
-
|
|
5581
|
-
|
|
5582
|
-
|
|
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
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
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;
|