@loafmarkets/ui 0.1.383 → 0.1.384

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.mjs CHANGED
@@ -7,7 +7,6 @@ import { twMerge } from 'tailwind-merge';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import styled10, { keyframes, css } from 'styled-components';
9
9
  import * as ReactDOM from 'react-dom';
10
- import { createPortal } from 'react-dom';
11
10
  import { Newspaper } from 'lucide-react';
12
11
  import * as LightweightCharts from 'lightweight-charts';
13
12
  import { MdKingBed, MdBathtub, MdDirectionsCar, MdPool, MdYard, MdFitnessCenter } from 'react-icons/md';
@@ -1875,7 +1874,6 @@ var Orderbook = React5.forwardRef(
1875
1874
  amountPrecision = 2,
1876
1875
  defaultTab = "orderbook",
1877
1876
  onTabChange,
1878
- showTradesTab = true,
1879
1877
  rightHeader,
1880
1878
  variant = "auto",
1881
1879
  userOrderPrices,
@@ -1889,9 +1887,7 @@ var Orderbook = React5.forwardRef(
1889
1887
  ...props
1890
1888
  }, ref) => {
1891
1889
  const resolvedRightHeader = rightHeader ?? /* @__PURE__ */ jsx(LoafLiquidityBadge, { className: "text-[0.6rem] orderbook-ll-badge", onClick: onLoafLiquidityClick });
1892
- const [tab, setTabState] = React5.useState(defaultTab);
1893
- const setTab = setTabState;
1894
- const effectiveTab = showTradesTab ? tab : "orderbook";
1890
+ const [tab, setTab] = React5.useState(defaultTab);
1895
1891
  const [tradeFilter, setTradeFilter] = React5.useState("all");
1896
1892
  const viewportCompact = useViewportCompact(COMPACT_BREAKPOINT_PX);
1897
1893
  const { userAskPrices, userBidPrices } = React5.useMemo(() => {
@@ -1985,8 +1981,7 @@ var Orderbook = React5.forwardRef(
1985
1981
  const midClass = midChangePercent == null ? "text-white" : midChangePercent >= 0 ? "text-[#0ecb81]" : "text-[#f6465d]";
1986
1982
  const tradeFiltered = trades.filter((t) => tradeFilter === "all" || t.type === tradeFilter);
1987
1983
  const layoutProps = {
1988
- tab: effectiveTab,
1989
- showTradesTab,
1984
+ tab,
1990
1985
  handleTab,
1991
1986
  tradeFilter,
1992
1987
  setTradeFilter,
@@ -2063,7 +2058,6 @@ function SkeletonRow({ compact }) {
2063
2058
  }
2064
2059
  function DesktopOrderbookLayout({
2065
2060
  tab,
2066
- showTradesTab = true,
2067
2061
  handleTab,
2068
2062
  tradeFilter,
2069
2063
  setTradeFilter,
@@ -2113,7 +2107,7 @@ function DesktopOrderbookLayout({
2113
2107
  ]
2114
2108
  }
2115
2109
  ),
2116
- showTradesTab ? /* @__PURE__ */ jsxs(
2110
+ /* @__PURE__ */ jsxs(
2117
2111
  "button",
2118
2112
  {
2119
2113
  type: "button",
@@ -2127,7 +2121,7 @@ function DesktopOrderbookLayout({
2127
2121
  tab === "trades" ? /* @__PURE__ */ jsx("span", { className: "absolute -bottom-px left-0 h-[2px] w-full bg-[#E6C87E]" }) : null
2128
2122
  ]
2129
2123
  }
2130
- ) : null
2124
+ )
2131
2125
  ] }),
2132
2126
  tab === "trades" ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-xs", children: [
2133
2127
  /* @__PURE__ */ jsx(
@@ -2266,7 +2260,6 @@ function DesktopOrderbookLayout({
2266
2260
  }
2267
2261
  function MobileOrderbookLayout({
2268
2262
  tab,
2269
- showTradesTab = true,
2270
2263
  handleTab,
2271
2264
  tradeFilter,
2272
2265
  setTradeFilter,
@@ -2315,7 +2308,7 @@ function MobileOrderbookLayout({
2315
2308
  children: "Orderbook"
2316
2309
  }
2317
2310
  ),
2318
- showTradesTab ? /* @__PURE__ */ jsx(
2311
+ /* @__PURE__ */ jsx(
2319
2312
  "span",
2320
2313
  {
2321
2314
  onClick: () => handleTab("trades"),
@@ -2329,7 +2322,7 @@ function MobileOrderbookLayout({
2329
2322
  },
2330
2323
  children: "Trades"
2331
2324
  }
2332
- ) : null
2325
+ )
2333
2326
  ] }),
2334
2327
  tab === "trades" ? /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 text-[0.6rem] text-white/70", children: ["all", "buy", "sell"].map((filter) => /* @__PURE__ */ jsx(
2335
2328
  "button",
@@ -5017,9 +5010,9 @@ var PulsingDot = styled10.span`
5017
5010
  `;
5018
5011
  function fmtCompactUsd(n) {
5019
5012
  const abs = Math.abs(n);
5020
- if (abs >= 1e6) return `${(abs / 1e6).toFixed(2)}M`;
5021
- if (abs >= 1e3) return `${(abs / 1e3).toFixed(1)}K`;
5022
- return `${abs.toFixed(2)}`;
5013
+ if (abs >= 1e6) return `$${(abs / 1e6).toFixed(2)}M`;
5014
+ if (abs >= 1e3) return `$${(abs / 1e3).toFixed(1)}K`;
5015
+ return `$${abs.toFixed(2)}`;
5023
5016
  }
5024
5017
  function useIsNarrow(maxWidthPx = 768) {
5025
5018
  const query = `(max-width:${maxWidthPx}px)`;
@@ -5042,6 +5035,8 @@ var DEFAULT_ABOUT_PATH = "/about";
5042
5035
  var DEFAULT_LEARN_PATH = "/learn";
5043
5036
  var DEFAULT_API_PATH = "/api";
5044
5037
  var DEFAULT_PROPERTY_MAP_PATH = "/map";
5038
+ var DEFAULT_LEADERBOARD_PATH = "/league";
5039
+ var DEFAULT_LEADERBOARD_PAGE_PATH = "/leaderboard";
5045
5040
  var DEFAULT_PORTFOLIO_PATH = "/portfolio";
5046
5041
  var DEFAULT_LOAF_LIQUIDITY_PATH = "/loaf-liquidity";
5047
5042
  var DEFAULT_AUTH_RETURN_PARAM = "returnTo";
@@ -5062,6 +5057,8 @@ var Header = ({
5062
5057
  apiPath = DEFAULT_API_PATH,
5063
5058
  offeringsPath,
5064
5059
  propertyMapPath = DEFAULT_PROPERTY_MAP_PATH,
5060
+ leaderboardPath = DEFAULT_LEADERBOARD_PATH,
5061
+ leaderboardPagePath = DEFAULT_LEADERBOARD_PAGE_PATH,
5065
5062
  portfolioPath = DEFAULT_PORTFOLIO_PATH,
5066
5063
  loafLiquidityPath = DEFAULT_LOAF_LIQUIDITY_PATH,
5067
5064
  authLoginUrl,
@@ -5335,6 +5332,8 @@ var Header = ({
5335
5332
  const resolvedOfferingsPath = offeringsPath ?? void 0;
5336
5333
  const offeringsHref = resolvedOfferingsPath ?? resolvedHomePath;
5337
5334
  const resolvedPropertyMapPath = propertyMapPath ?? DEFAULT_PROPERTY_MAP_PATH;
5335
+ const resolvedLeaderboardPath = leaderboardPath ?? DEFAULT_LEADERBOARD_PATH;
5336
+ const resolvedLeaderboardPagePath = leaderboardPagePath ?? DEFAULT_LEADERBOARD_PAGE_PATH;
5338
5337
  const resolvedPortfolioPath = portfolioPath ?? DEFAULT_PORTFOLIO_PATH;
5339
5338
  const resolvedLoafLiquidityPath = loafLiquidityPath ?? DEFAULT_LOAF_LIQUIDITY_PATH;
5340
5339
  const inferredActiveTab = (() => {
@@ -5345,6 +5344,8 @@ var Header = ({
5345
5344
  if (locationPath === resolvedApiPath) return "api";
5346
5345
  if (resolvedOfferingsPath && locationPath.startsWith(resolvedOfferingsPath)) return "offerings";
5347
5346
  if (locationPath === resolvedPropertyMapPath) return "propertyMap";
5347
+ if (locationPath === resolvedLeaderboardPagePath) return "leaderboardPage";
5348
+ if (locationPath === resolvedLeaderboardPath) return "leaderboard";
5348
5349
  if (locationPath === resolvedPortfolioPath) return "portfolio";
5349
5350
  return null;
5350
5351
  })();
@@ -5353,6 +5354,8 @@ var Header = ({
5353
5354
  const homeActive = resolvedActiveTab === "home";
5354
5355
  const offeringsActive = resolvedActiveTab === "offerings";
5355
5356
  const propertyMapActive = resolvedActiveTab === "propertyMap";
5357
+ const leaderboardActive = resolvedActiveTab === "leaderboard";
5358
+ const leaderboardPageActive = resolvedActiveTab === "leaderboardPage";
5356
5359
  const aboutActive = resolvedActiveTab === "about";
5357
5360
  const portfolioActive = resolvedActiveTab === "portfolio";
5358
5361
  const learnActive = resolvedActiveTab === "learn";
@@ -5360,7 +5363,7 @@ var Header = ({
5360
5363
  return /* @__PURE__ */ jsxs(Fragment, { children: [
5361
5364
  /* @__PURE__ */ jsx(SafeAreaCover, {}),
5362
5365
  /* @__PURE__ */ jsx(Overlay, { $isOpen: isMobileMenuOpen, onClick: () => setIsMobileMenuOpen(false) }),
5363
- /* @__PURE__ */ jsxs(HeaderContainer, { id: "loaf-header", $bgOpacity: headerBgOpacity, $menuOpen: isMobileMenuOpen, children: [
5366
+ /* @__PURE__ */ jsxs(HeaderContainer, { id: "loaf-header", $bgOpacity: headerBgOpacity, children: [
5364
5367
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
5365
5368
  /* @__PURE__ */ jsxs(Logo, { children: [
5366
5369
  /* @__PURE__ */ jsx(LogoLink, { href: logoHref ?? resolvedHomePath, onClick: handleLogoNavigation, children: /* @__PURE__ */ jsx("img", { src: Loaf_logo_Banner_default, alt: "LOAF Logo" }) }),
@@ -5436,48 +5439,91 @@ var Header = ({
5436
5439
  /* @__PURE__ */ jsx(
5437
5440
  NavLink,
5438
5441
  {
5439
- href: resolvedLearnPath,
5440
- className: learnActive ? "active" : "",
5442
+ href: resolvedLeaderboardPath,
5443
+ className: leaderboardActive ? "active" : "",
5441
5444
  onClick: (event) => {
5442
5445
  event.preventDefault();
5443
- handleNavigation(resolvedLearnPath);
5446
+ handleNavigation(resolvedLeaderboardPath);
5444
5447
  },
5445
- children: "Learn"
5448
+ children: "Competition"
5446
5449
  }
5447
5450
  ),
5448
5451
  /* @__PURE__ */ jsx(
5449
5452
  NavLink,
5450
5453
  {
5451
- href: resolvedAboutPath,
5452
- className: aboutActive ? "active" : "",
5454
+ href: resolvedLeaderboardPagePath,
5455
+ className: leaderboardPageActive ? "active" : "",
5453
5456
  onClick: (event) => {
5454
5457
  event.preventDefault();
5455
- handleNavigation(resolvedAboutPath);
5458
+ handleNavigation(resolvedLeaderboardPagePath);
5456
5459
  },
5457
- children: "About"
5460
+ children: "Leaderboard"
5458
5461
  }
5459
5462
  ),
5460
5463
  /* @__PURE__ */ jsx(
5461
5464
  NavLink,
5462
5465
  {
5463
- href: resolvedApiPath,
5464
- className: apiActive ? "active" : "",
5466
+ href: resolvedLearnPath,
5467
+ className: learnActive ? "active" : "",
5465
5468
  onClick: (event) => {
5466
5469
  event.preventDefault();
5467
- handleNavigation(resolvedApiPath);
5470
+ handleNavigation(resolvedLearnPath);
5468
5471
  },
5469
- children: "API"
5470
- }
5471
- ),
5472
- /* @__PURE__ */ jsx(
5473
- NavLink,
5474
- {
5475
- href: "https://docs.loafmarkets.com/en/",
5476
- target: "_blank",
5477
- rel: "noopener noreferrer",
5478
- children: "Docs"
5472
+ children: "Learn"
5479
5473
  }
5480
5474
  ),
5475
+ /* @__PURE__ */ jsxs(MoreMenu, { className: "more-menu", children: [
5476
+ /* @__PURE__ */ jsxs(
5477
+ MoreTrigger,
5478
+ {
5479
+ type: "button",
5480
+ className: `${isMoreMenuOpen ? "open" : ""} ${aboutActive || apiActive ? "active" : ""}`,
5481
+ "aria-haspopup": "true",
5482
+ "aria-expanded": isMoreMenuOpen,
5483
+ onClick: () => setIsMoreMenuOpen((open) => !open),
5484
+ children: [
5485
+ "More",
5486
+ /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M6 9l6 6 6-6", strokeLinecap: "round", strokeLinejoin: "round" }) })
5487
+ ]
5488
+ }
5489
+ ),
5490
+ isMoreMenuOpen && /* @__PURE__ */ jsxs(MoreDropdown, { children: [
5491
+ /* @__PURE__ */ jsx(
5492
+ MoreItem,
5493
+ {
5494
+ href: resolvedAboutPath,
5495
+ className: aboutActive ? "active" : "",
5496
+ onClick: (event) => {
5497
+ event.preventDefault();
5498
+ handleNavigation(resolvedAboutPath);
5499
+ },
5500
+ children: "About"
5501
+ }
5502
+ ),
5503
+ /* @__PURE__ */ jsx(
5504
+ MoreItem,
5505
+ {
5506
+ href: resolvedApiPath,
5507
+ className: apiActive ? "active" : "",
5508
+ onClick: (event) => {
5509
+ event.preventDefault();
5510
+ handleNavigation(resolvedApiPath);
5511
+ },
5512
+ children: "API"
5513
+ }
5514
+ ),
5515
+ /* @__PURE__ */ jsx(
5516
+ MoreItem,
5517
+ {
5518
+ href: "https://docs.loafmarkets.com/en/",
5519
+ target: "_blank",
5520
+ rel: "noopener noreferrer",
5521
+ onClick: () => setIsMoreMenuOpen(false),
5522
+ children: "Docs"
5523
+ }
5524
+ )
5525
+ ] })
5526
+ ] }),
5481
5527
  /* @__PURE__ */ jsx("div", { style: { marginLeft: "auto", display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx(
5482
5528
  "div",
5483
5529
  {
@@ -5518,6 +5564,8 @@ var Header = ({
5518
5564
  ),
5519
5565
  /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(offeringsHref), children: "Initial Offerings" }),
5520
5566
  /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedPropertyMapPath), children: "Property Map" }),
5567
+ /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedLeaderboardPath), children: "Competition" }),
5568
+ /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedLeaderboardPagePath), children: "Leaderboard" }),
5521
5569
  /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedLearnPath), children: "Learn" }),
5522
5570
  /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedAboutPath), children: "About" }),
5523
5571
  /* @__PURE__ */ jsx(MobileNavItem, { onClick: () => handleNavigation(resolvedApiPath), children: "API" }),
@@ -5791,8 +5839,7 @@ var Overlay = styled10.div`
5791
5839
  height: 100%;
5792
5840
  background-color: rgba(0, 0, 0, 0.7);
5793
5841
  backdrop-filter: blur(3px);
5794
- /* Above the trade page's sticky/console layers (z 2000) + close modal (10001). */
5795
- z-index: 10070;
5842
+ z-index: 970;
5796
5843
  `;
5797
5844
  var MobileOnlyButton = styled10.button.attrs({ type: "button" })`
5798
5845
  display: none;
@@ -5840,11 +5887,7 @@ var HeaderContainer = styled10.header`
5840
5887
  top: 0;
5841
5888
  left: 0;
5842
5889
  right: 0;
5843
- /* Normally 1000. When the mobile menu is open, lift the whole header
5844
- (and the Nav drawer trapped inside its stacking context) above the
5845
- backdrop Overlay (10070) AND the trade page's modal layers (10001) so
5846
- the drawer renders on top instead of being dimmed by the backdrop. */
5847
- z-index: ${({ $menuOpen }) => $menuOpen ? 10075 : 1e3};
5890
+ z-index: 1000;
5848
5891
  width: 100%;
5849
5892
  /* Fallback min-height for browsers that can't evaluate calc+env */
5850
5893
  min-height: 56px;
@@ -5938,8 +5981,7 @@ var Nav = styled10.nav`
5938
5981
  max-width: 100%;
5939
5982
  height: calc(100dvh - var(--loaf-menu-top, calc(56px + max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px)))));
5940
5983
  background: rgb(17, 17, 19);
5941
- /* Above the trade page's sticky/console layers (z 2000) + close modal (10001). */
5942
- z-index: 10080;
5984
+ z-index: 980;
5943
5985
  /* Gentle fade + slide-down instead of an abrupt slide-in. */
5944
5986
  opacity: ${(props) => props.$isOpen ? "1" : "0"};
5945
5987
  transform: ${(props) => props.$isOpen ? "translateY(0)" : "translateY(-14px)"};
@@ -5957,12 +5999,9 @@ var Nav = styled10.nav`
5957
5999
  display: flex;
5958
6000
  flex-direction: column;
5959
6001
  align-items: center;
5960
- /* safe-center keeps centering when the menu fits, but top-aligns (honouring the
5961
- 2.5rem top padding) when the logged-in menu overflows — otherwise flex
5962
- centering pushes the first item + padding above the scroll area and clips it. */
5963
- justify-content: safe center;
6002
+ justify-content: center;
5964
6003
  min-height: 100%;
5965
- padding: 2.5rem 1.5rem 2.5rem;
6004
+ padding: 2rem 1.5rem 2.5rem;
5966
6005
  gap: 0.4rem;
5967
6006
  }
5968
6007
  }
@@ -6035,6 +6074,77 @@ var NavLink = styled10.a`
6035
6074
  }
6036
6075
  }
6037
6076
  `;
6077
+ var MoreMenu = styled10.div`
6078
+ position: relative;
6079
+ display: flex;
6080
+ align-items: center;
6081
+ height: 56px;
6082
+ `;
6083
+ var MoreTrigger = styled10.button`
6084
+ margin: 0 12px;
6085
+ padding: 0 4px;
6086
+ height: 56px;
6087
+ display: inline-flex;
6088
+ align-items: center;
6089
+ gap: 4px;
6090
+ background: none;
6091
+ border: none;
6092
+ cursor: pointer;
6093
+ color: #eaecef;
6094
+ font-weight: 500;
6095
+ font-size: 14px;
6096
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;
6097
+ letter-spacing: 0.2px;
6098
+ transition: color 0.2s ease;
6099
+
6100
+ &:hover,
6101
+ &.active {
6102
+ color: #E6C87E;
6103
+ }
6104
+
6105
+ svg {
6106
+ width: 14px;
6107
+ height: 14px;
6108
+ transition: transform 0.2s ease;
6109
+ }
6110
+ &.open svg {
6111
+ transform: rotate(180deg);
6112
+ }
6113
+ `;
6114
+ var MoreDropdown = styled10.div`
6115
+ position: absolute;
6116
+ top: 100%;
6117
+ right: 0;
6118
+ min-width: 160px;
6119
+ padding: 6px;
6120
+ background: #1e2026;
6121
+ border: 1px solid #2b3139;
6122
+ border-radius: 10px;
6123
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4);
6124
+ display: flex;
6125
+ flex-direction: column;
6126
+ z-index: 1100;
6127
+ `;
6128
+ var MoreItem = styled10.a`
6129
+ padding: 10px 12px;
6130
+ border-radius: 6px;
6131
+ color: #eaecef;
6132
+ font-weight: 500;
6133
+ font-size: 14px;
6134
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif;
6135
+ letter-spacing: 0.2px;
6136
+ text-decoration: none;
6137
+ cursor: pointer;
6138
+ transition: background 0.15s ease, color 0.15s ease;
6139
+
6140
+ &:hover {
6141
+ background: #2b3139;
6142
+ color: #E6C87E;
6143
+ }
6144
+ &.active {
6145
+ color: #E6C87E;
6146
+ }
6147
+ `;
6038
6148
  var Button2 = styled10.button.attrs({ type: "button" })`
6039
6149
  padding: 0.5rem 1rem;
6040
6150
  border-radius: 6px;
@@ -6601,17 +6711,6 @@ PropertySubheader.displayName = "PropertySubheader";
6601
6711
  var DEFAULT_LOGO_SRC = Loaf_logo_Banner_default;
6602
6712
  var DEFAULT_LOGO_ALT = "Loaf";
6603
6713
  var OTP_INPUT_LENGTH = 6;
6604
- var CODE_PREFIX = "LOAF-";
6605
- var CODE_SUFFIX_LEN = 5;
6606
- var normalizeAccessCode = (raw) => CODE_PREFIX + raw.toUpperCase().replace(/^LOAF-?/, "").replace(/[^A-Z0-9]/g, "").slice(0, CODE_SUFFIX_LEN);
6607
- var friendlyError = (err, fallback) => {
6608
- const data = err?.response?.data;
6609
- if (typeof data?.error === "string" && data.error.trim()) return data.error;
6610
- if (typeof data?.message === "string" && data.message.trim()) return data.message;
6611
- const msg = err instanceof Error ? err.message : "";
6612
- if (msg && !/request failed with status code/i.test(msg) && !/network error/i.test(msg)) return msg;
6613
- return fallback;
6614
- };
6615
6714
  var LoginPopup = ({
6616
6715
  onClose,
6617
6716
  onOpenEarlyAccess,
@@ -6630,13 +6729,10 @@ var LoginPopup = ({
6630
6729
  renderKycWidget,
6631
6730
  onFundWallet,
6632
6731
  initialView,
6633
- initialCode,
6634
6732
  kycStatus: kycStatusProp,
6635
6733
  walletAddress,
6636
6734
  onSubmitReferralCode,
6637
- onValidateCode,
6638
- onCheckAccess,
6639
- gate
6735
+ onJoinWaitlist
6640
6736
  }) => {
6641
6737
  const [view, setView] = useState(() => initialView ?? "main");
6642
6738
  const [email, setEmail] = useState("");
@@ -6644,17 +6740,19 @@ var LoginPopup = ({
6644
6740
  const [otp, setOtp] = useState(Array(OTP_INPUT_LENGTH).fill(""));
6645
6741
  const [error, setError] = useState("");
6646
6742
  const [copied, setCopied] = useState(false);
6647
- const [referralCode, setReferralCode] = useState(
6648
- () => gate && initialCode ? normalizeAccessCode(initialCode) : ""
6649
- );
6743
+ const [referralCode, setReferralCode] = useState("");
6650
6744
  const [referralLoading, setReferralLoading] = useState(false);
6651
6745
  const [referralError, setReferralError] = useState("");
6652
- const [codeStatus, setCodeStatus] = useState("idle");
6653
- const [signInRevealed, setSignInRevealed] = useState(false);
6654
- const [otpStatus, setOtpStatus] = useState("idle");
6655
- const [signInMode, setSignInMode] = useState(false);
6746
+ const [waitlistLoading, setWaitlistLoading] = useState(false);
6747
+ const [waitlistMessage, setWaitlistMessage] = useState("");
6656
6748
  const [loading, setLoading] = useState(false);
6657
6749
  const [isSignUp, setIsSignUp] = useState(false);
6750
+ const [loginTitle] = useState(() => {
6751
+ if (typeof window === "undefined") return null;
6752
+ const t = window.__LOAF_LOGIN_TITLE__ ?? null;
6753
+ if (t) delete window.__LOAF_LOGIN_TITLE__;
6754
+ return t;
6755
+ });
6658
6756
  const [fundingAmount] = useState("");
6659
6757
  const [kycLoading, setKycLoading] = useState(false);
6660
6758
  const [showKycWidget, setShowKycWidget] = useState(false);
@@ -6664,64 +6762,6 @@ var LoginPopup = ({
6664
6762
  const [fundingError, setFundingError] = useState("");
6665
6763
  const [transakWidgetUrl, setTransakWidgetUrl] = useState(null);
6666
6764
  const suppressAutoCloseRef = React5__default.useRef(false);
6667
- const validatedCodeRef = React5__default.useRef(null);
6668
- const finishGate = React5__default.useCallback(async () => {
6669
- if (!gate) return true;
6670
- const code = validatedCodeRef.current;
6671
- if (code) {
6672
- try {
6673
- await onSubmitReferralCode?.(code);
6674
- window.dispatchEvent(new CustomEvent("loaf:onboarding-start"));
6675
- return true;
6676
- } catch {
6677
- }
6678
- }
6679
- const hasAccess = onCheckAccess ? await onCheckAccess() : true;
6680
- if (hasAccess) return true;
6681
- suppressAutoCloseRef.current = true;
6682
- validatedCodeRef.current = null;
6683
- setOtp(Array(OTP_INPUT_LENGTH).fill(""));
6684
- setOtpStatus("idle");
6685
- setSignInMode(false);
6686
- setSignInRevealed(false);
6687
- setCodeStatus(code ? "invalid" : "idle");
6688
- setView("referral");
6689
- setError(
6690
- code ? "That code can't be redeemed anymore. Enter a different access code." : "Enter your access code to continue."
6691
- );
6692
- return false;
6693
- }, [gate, onSubmitReferralCode, onCheckAccess]);
6694
- const runCodeValidation = React5__default.useCallback(async (fullCode) => {
6695
- setCodeStatus("checking");
6696
- setError("");
6697
- try {
6698
- const ok = onValidateCode ? await onValidateCode(fullCode) : true;
6699
- if (!ok) {
6700
- validatedCodeRef.current = null;
6701
- setCodeStatus("invalid");
6702
- return;
6703
- }
6704
- validatedCodeRef.current = fullCode;
6705
- setCodeStatus("valid");
6706
- if (isAuthenticated) {
6707
- if (await finishGate()) setTimeout(() => onClose(), 500);
6708
- return;
6709
- }
6710
- setIsSignUp(true);
6711
- setSignInRevealed(true);
6712
- } catch {
6713
- validatedCodeRef.current = null;
6714
- setCodeStatus("invalid");
6715
- }
6716
- }, [onValidateCode, isAuthenticated, finishGate, onClose]);
6717
- const autoCodeTriedRef = React5__default.useRef(false);
6718
- useEffect(() => {
6719
- if (autoCodeTriedRef.current || !gate || !initialCode) return;
6720
- const full = normalizeAccessCode(initialCode);
6721
- if (full.length !== CODE_PREFIX.length + CODE_SUFFIX_LEN) return;
6722
- autoCodeTriedRef.current = true;
6723
- void runCodeValidation(full);
6724
- }, [gate, initialCode, runCodeValidation]);
6725
6765
  useEffect(() => {
6726
6766
  if (typeof initialView === "string") {
6727
6767
  setView(initialView);
@@ -6776,11 +6816,11 @@ var LoginPopup = ({
6776
6816
  }, [autoCloseOnAuth, currentUser, isAuthenticated, onClose, view]);
6777
6817
  useEffect(() => {
6778
6818
  const handleEsc = (e) => {
6779
- if (e.key === "Escape" && !gate) onClose();
6819
+ if (e.key === "Escape") onClose();
6780
6820
  };
6781
6821
  window.addEventListener("keydown", handleEsc);
6782
6822
  return () => window.removeEventListener("keydown", handleEsc);
6783
- }, [onClose, gate]);
6823
+ }, [onClose]);
6784
6824
  const handleWalletLogin = async () => {
6785
6825
  if (onWalletLogin) {
6786
6826
  suppressAutoCloseRef.current = true;
@@ -6792,16 +6832,12 @@ var LoginPopup = ({
6792
6832
  setView("wallet-handle");
6793
6833
  return;
6794
6834
  }
6795
- if (await finishGate()) {
6796
- suppressAutoCloseRef.current = false;
6797
- onClose();
6798
- }
6835
+ suppressAutoCloseRef.current = false;
6836
+ onClose();
6799
6837
  return;
6800
6838
  } catch (err) {
6801
6839
  console.error("[LoginTrace][Popup] Wallet login failed", err);
6802
6840
  suppressAutoCloseRef.current = false;
6803
- setError(friendlyError(err, "Wallet login failed. Please try again."));
6804
- return;
6805
6841
  }
6806
6842
  }
6807
6843
  onClose();
@@ -6823,13 +6859,6 @@ var LoginPopup = ({
6823
6859
  setError("");
6824
6860
  try {
6825
6861
  await onWalletSignup(handle.trim());
6826
- if (gate) {
6827
- if (await finishGate()) {
6828
- suppressAutoCloseRef.current = false;
6829
- onClose();
6830
- }
6831
- return;
6832
- }
6833
6862
  if (onSubmitReferralCode) {
6834
6863
  setView("referral");
6835
6864
  } else {
@@ -6841,11 +6870,6 @@ var LoginPopup = ({
6841
6870
  setLoading(false);
6842
6871
  }
6843
6872
  };
6844
- const handleEmailClick = (signUp = false) => {
6845
- setIsSignUp(signUp);
6846
- setView("email");
6847
- setError("");
6848
- };
6849
6873
  const handleSendCode = async (event) => {
6850
6874
  event?.preventDefault();
6851
6875
  if (!email || !email.includes("@")) {
@@ -6858,7 +6882,6 @@ var LoginPopup = ({
6858
6882
  }
6859
6883
  setLoading(true);
6860
6884
  setError("");
6861
- setOtpStatus("idle");
6862
6885
  const normalizedHandle = isSignUp && handle.trim() ? handle.trim() : void 0;
6863
6886
  try {
6864
6887
  const demoResult = await onDemoLogin?.(email, normalizedHandle ?? null);
@@ -6879,15 +6902,11 @@ var LoginPopup = ({
6879
6902
  setView("otp");
6880
6903
  setOtp(Array(OTP_INPUT_LENGTH).fill(""));
6881
6904
  } catch (err) {
6882
- const message = friendlyError(err, "We couldn't send a code to that email. Please double-check it and try again.");
6905
+ const message = err instanceof Error ? err.message : "Failed to send verification code";
6883
6906
  console.error("[LoginTrace][Popup] onSendEmailCode threw", err);
6884
6907
  if (!isSignUp && message.includes("No account found")) {
6885
- if (signInMode) {
6886
- setError("No account found for this email. Go back and enter your access code to create one.");
6887
- setLoading(false);
6888
- return;
6889
- }
6890
6908
  setIsSignUp(true);
6909
+ setView("email");
6891
6910
  setError("");
6892
6911
  setLoading(false);
6893
6912
  return;
@@ -6899,7 +6918,7 @@ var LoginPopup = ({
6899
6918
  setView("otp");
6900
6919
  setOtp(Array(OTP_INPUT_LENGTH).fill(""));
6901
6920
  } catch (retryErr) {
6902
- setError(friendlyError(retryErr, "We couldn't send a code to that email. Please try again."));
6921
+ setError(retryErr instanceof Error ? retryErr.message : "Failed to send verification code");
6903
6922
  }
6904
6923
  setLoading(false);
6905
6924
  return;
@@ -6993,30 +7012,6 @@ var LoginPopup = ({
6993
7012
  setLoading(false);
6994
7013
  }
6995
7014
  };
6996
- const runGateOtpVerify = React5__default.useCallback(async (code) => {
6997
- if (!onVerifyEmailCode) return;
6998
- setOtpStatus("checking");
6999
- setError("");
7000
- suppressAutoCloseRef.current = true;
7001
- try {
7002
- await onVerifyEmailCode({ code, email });
7003
- if (await finishGate()) {
7004
- setOtpStatus("valid");
7005
- setTimeout(() => onClose(), 750);
7006
- }
7007
- } catch {
7008
- suppressAutoCloseRef.current = false;
7009
- setOtpStatus("invalid");
7010
- }
7011
- }, [onVerifyEmailCode, email, finishGate, onClose]);
7012
- useEffect(() => {
7013
- if (!gate || view !== "otp") return;
7014
- if (otp.join("").length < OTP_INPUT_LENGTH) {
7015
- if (otpStatus === "invalid") setOtpStatus("idle");
7016
- return;
7017
- }
7018
- if (otpStatus === "idle") void runGateOtpVerify(otp.join(""));
7019
- }, [gate, view, otp, otpStatus, runGateOtpVerify]);
7020
7015
  const handleKycWidgetResult = (result) => {
7021
7016
  setShowKycWidget(false);
7022
7017
  if (result.passed) {
@@ -7113,36 +7108,35 @@ var LoginPopup = ({
7113
7108
  setError("");
7114
7109
  };
7115
7110
  if (view === "main") {
7116
- return /* @__PURE__ */ jsx(Overlay2, { $transparent: gate, onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7111
+ return /* @__PURE__ */ jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7117
7112
  /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7118
- /* @__PURE__ */ jsxs(Title, { children: [
7119
- /* @__PURE__ */ jsxs(LogoContainer3, { children: [
7120
- /* @__PURE__ */ jsx(LogoImage, { src: logoSrc, alt: logoAlt }),
7121
- /* @__PURE__ */ jsx(LogoBeta, { children: "Private Beta" })
7122
- ] }),
7123
- /* @__PURE__ */ jsx(TitleText, { children: "Welcome to Loaf" })
7124
- ] }),
7125
- /* @__PURE__ */ jsx(Subtitle, { children: "Sign in to claim 100k in test USD." }),
7126
- /* @__PURE__ */ jsxs(ButtonsContainer, { children: [
7127
- /* @__PURE__ */ jsxs(LoginButton, { onClick: () => handleEmailClick(false), children: [
7128
- /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }),
7129
- "Sign in with Email"
7113
+ /* @__PURE__ */ jsx(MainHeading, { children: loginTitle?.title ?? "Welcome to Loaf" }),
7114
+ (loginTitle ? loginTitle.subtitle : "Sign in to claim 100k in test USD.") && /* @__PURE__ */ jsx(MainSubtitle, { children: loginTitle ? loginTitle.subtitle : "Sign in to claim 100k in test USD." }),
7115
+ /* @__PURE__ */ jsxs(GateForm, { onSubmit: handleSendCode, children: [
7116
+ /* @__PURE__ */ jsxs(GateInputRow, { children: [
7117
+ /* @__PURE__ */ jsx(
7118
+ GateInput,
7119
+ {
7120
+ type: "email",
7121
+ placeholder: "Enter your email",
7122
+ value: email,
7123
+ onChange: (event) => setEmail(event.target.value),
7124
+ autoFocus: true
7125
+ }
7126
+ ),
7127
+ /* @__PURE__ */ jsx(GateSubmit, { type: "submit", disabled: loading || !email, "aria-label": "Continue with email", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M5 12h14M13 6l6 6-6 6" }) }) })
7130
7128
  ] }),
7131
- /* @__PURE__ */ jsx("div", { style: { textAlign: "center", color: "var(--color-text-secondary, #848e9c)", fontSize: "0.875rem" }, children: "or" }),
7132
- /* @__PURE__ */ jsxs(LoginButton, { onClick: handleWalletLogin, children: [
7133
- /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }),
7134
- "Sign in with Wallet"
7135
- ] })
7129
+ error && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: error })
7136
7130
  ] }),
7137
- /* @__PURE__ */ jsxs(SignUpPrompt, { children: [
7138
- "New to Loaf?",
7139
- " ",
7140
- /* @__PURE__ */ jsx(SignUpLink, { type: "button", onClick: () => handleEmailClick(true), children: "Sign up" })
7131
+ /* @__PURE__ */ jsx(GateOr, { children: "or" }),
7132
+ /* @__PURE__ */ jsxs(LoginButton, { onClick: handleWalletLogin, children: [
7133
+ /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }),
7134
+ "Join with wallet"
7141
7135
  ] })
7142
7136
  ] }) });
7143
7137
  }
7144
7138
  if (view === "email") {
7145
- return /* @__PURE__ */ jsx(Overlay2, { $transparent: gate, onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7139
+ return /* @__PURE__ */ jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7146
7140
  /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7147
7141
  /* @__PURE__ */ jsxs(BackButton, { onClick: handleBack, children: [
7148
7142
  /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" }) }),
@@ -7181,7 +7175,7 @@ var LoginPopup = ({
7181
7175
  ] }) });
7182
7176
  }
7183
7177
  if (view === "wallet-handle") {
7184
- return /* @__PURE__ */ jsx(Overlay2, { $transparent: gate, onClick: loading ? void 0 : onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7178
+ return /* @__PURE__ */ jsx(Overlay2, { onClick: loading ? void 0 : onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7185
7179
  !loading && /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7186
7180
  /* @__PURE__ */ jsxs(Title, { children: [
7187
7181
  /* @__PURE__ */ jsx(LogoContainer3, { children: /* @__PURE__ */ jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
@@ -7206,71 +7200,7 @@ var LoginPopup = ({
7206
7200
  ] }) });
7207
7201
  }
7208
7202
  if (view === "otp") {
7209
- if (gate) {
7210
- return /* @__PURE__ */ jsxs(GateShell, { children: [
7211
- /* @__PURE__ */ jsx(GateTint, { $reveal: otpStatus === "valid" ? 3 : 2 }),
7212
- /* @__PURE__ */ jsxs(GateForm, { children: [
7213
- /* @__PURE__ */ jsxs(GateBrand, { children: [
7214
- /* @__PURE__ */ jsx(GateLogoLink, { href: "https://loafmarkets.com", "aria-label": "Go to loafmarkets.com", children: /* @__PURE__ */ jsx(GateLogo, { src: logoSrc, alt: logoAlt }) }),
7215
- /* @__PURE__ */ jsx(GateBrandDivider, {}),
7216
- /* @__PURE__ */ jsx(GateBetaTag, { children: "Private Beta" })
7217
- ] }),
7218
- /* @__PURE__ */ jsxs(GateOtpText, { children: [
7219
- "We sent a code to",
7220
- /* @__PURE__ */ jsx("br", {}),
7221
- /* @__PURE__ */ jsx("strong", { children: email })
7222
- ] }),
7223
- /* @__PURE__ */ jsx(OTPContainer, { children: otp.map((digit, index) => /* @__PURE__ */ jsx(
7224
- OTPInput,
7225
- {
7226
- id: `otp-${index}`,
7227
- type: "text",
7228
- inputMode: "numeric",
7229
- maxLength: 1,
7230
- $status: otpStatus,
7231
- readOnly: otpStatus === "valid" || otpStatus === "checking",
7232
- value: digit,
7233
- onChange: (event) => handleOTPChange(index, event.target.value),
7234
- onKeyDown: (event) => handleOTPKeyDown(index, event),
7235
- onInput: (event) => handleOTPInput(index, event),
7236
- onPaste: handleOTPPaste,
7237
- autoComplete: index === 0 ? "one-time-code" : "off",
7238
- autoFocus: index === 0
7239
- },
7240
- index
7241
- )) }),
7242
- otpStatus === "invalid" && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: "That code isn't right. Try again." }),
7243
- /* @__PURE__ */ jsxs(GateResendText, { children: [
7244
- /* @__PURE__ */ jsx(
7245
- "button",
7246
- {
7247
- type: "button",
7248
- onClick: (event) => {
7249
- event.preventDefault();
7250
- void handleSendCode(event);
7251
- },
7252
- children: "Resend code"
7253
- }
7254
- ),
7255
- /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }),
7256
- /* @__PURE__ */ jsx(
7257
- "button",
7258
- {
7259
- type: "button",
7260
- onClick: () => {
7261
- setOtp(Array(OTP_INPUT_LENGTH).fill(""));
7262
- setOtpStatus("idle");
7263
- setError("");
7264
- setView("referral");
7265
- },
7266
- children: "Back"
7267
- }
7268
- )
7269
- ] })
7270
- ] })
7271
- ] });
7272
- }
7273
- return /* @__PURE__ */ jsx(Overlay2, { $transparent: gate, onClick: loading ? void 0 : onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7203
+ return /* @__PURE__ */ jsx(Overlay2, { onClick: loading ? void 0 : onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7274
7204
  !loading && /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7275
7205
  loading ? /* @__PURE__ */ jsxs(AccountCreationLoader, { children: [
7276
7206
  /* @__PURE__ */ jsx(SpinnerRing, {}),
@@ -7359,8 +7289,8 @@ var LoginPopup = ({
7359
7289
  /* @__PURE__ */ jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }),
7360
7290
  /* @__PURE__ */ jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })
7361
7291
  ] }) }),
7362
- /* @__PURE__ */ jsx(KycHeading, { children: "Verify Wholesale Status" }),
7363
- /* @__PURE__ */ jsx(KycSubline, { children: "Initial offerings are only available to accredited or wholesale investors" }),
7292
+ /* @__PURE__ */ jsx(KycHeading, { children: "Verify Your Identity" }),
7293
+ /* @__PURE__ */ jsx(KycSubline, { children: "Initial offerings are only available to verified investors" }),
7364
7294
  /* @__PURE__ */ jsx(KycStartButton, { type: "button", onClick: handleKycStart, disabled: kycLoading, children: kycLoading ? "Verifying\u2026" : kycStatusProp === "PENDING" || kycStatusProp === "ON_HOLD" ? "Resume Verification" : "Start Verification" }),
7365
7295
  /* @__PURE__ */ jsx(KycDuration, { children: "Takes about 2 minutes" }),
7366
7296
  /* @__PURE__ */ jsx(KycDivider, {}),
@@ -7446,7 +7376,7 @@ var LoginPopup = ({
7446
7376
  /* @__PURE__ */ jsx("div", { style: { color: "rgba(255,255,255,0.5)", fontSize: "0.8rem" }, children: "Deposit USDC from an exchange or wallet" })
7447
7377
  ] })
7448
7378
  ] }),
7449
- /* @__PURE__ */ jsxs(ModalOptionCard, { onClick: handleFiatFund, disabled: true, children: [
7379
+ /* @__PURE__ */ jsxs(ModalOptionCard, { onClick: handleFiatFund, disabled: fiatFundingLoading, children: [
7450
7380
  /* @__PURE__ */ jsxs("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round", style: { color: "rgba(255,255,255,0.6)", flexShrink: 0 }, children: [
7451
7381
  /* @__PURE__ */ jsx("line", { x1: "3", y1: "22", x2: "21", y2: "22" }),
7452
7382
  /* @__PURE__ */ jsx("line", { x1: "6", y1: "18", x2: "6", y2: "11" }),
@@ -7456,10 +7386,7 @@ var LoginPopup = ({
7456
7386
  /* @__PURE__ */ jsx("polygon", { points: "12 2 20 7 4 7" })
7457
7387
  ] }),
7458
7388
  /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
7459
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem", marginBottom: "0.25rem" }, children: [
7460
- /* @__PURE__ */ jsx("span", { style: { color: "#fff", fontWeight: 600, fontSize: "0.95rem" }, children: fiatFundingLoading ? "Loading widget\u2026" : "Bank Deposit" }),
7461
- /* @__PURE__ */ jsx("span", { style: { fontSize: "0.6rem", fontWeight: 700, color: "#E6C87E", background: "rgba(230,198,86,0.12)", padding: "0.12rem 0.4rem", borderRadius: "4px", textTransform: "uppercase", letterSpacing: "0.04em", whiteSpace: "nowrap" }, children: "Coming Soon" })
7462
- ] }),
7389
+ /* @__PURE__ */ jsx("div", { style: { color: "#fff", fontWeight: 600, fontSize: "0.95rem", marginBottom: "0.25rem" }, children: fiatFundingLoading ? "Loading widget\u2026" : "Bank Deposit" }),
7463
7390
  /* @__PURE__ */ jsx("div", { style: { color: "rgba(255,255,255,0.5)", fontSize: "0.8rem" }, children: "Deposit to your account via card or bank transfer" })
7464
7391
  ] })
7465
7392
  ] })
@@ -7490,162 +7417,84 @@ var LoginPopup = ({
7490
7417
  setReferralLoading(false);
7491
7418
  }
7492
7419
  };
7493
- const codeSuffix = referralCode.startsWith(CODE_PREFIX) ? referralCode.slice(CODE_PREFIX.length) : referralCode.replace(/^LOAF-?/i, "");
7494
- const setCodeSuffix = (suffix) => {
7495
- setReferralCode(CODE_PREFIX + suffix);
7420
+ const handleJoinWaitlistSkip = async () => {
7421
+ if (!onJoinWaitlist || !email) {
7422
+ onClose();
7423
+ return;
7424
+ }
7496
7425
  setReferralError("");
7497
- setError("");
7498
- if (gate) {
7499
- if (suffix.length === 5) void runCodeValidation(CODE_PREFIX + suffix);
7500
- else {
7501
- validatedCodeRef.current = null;
7502
- setCodeStatus("idle");
7503
- }
7426
+ setWaitlistLoading(true);
7427
+ try {
7428
+ const message = await onJoinWaitlist(email);
7429
+ setWaitlistMessage(message || "You're on the waitlist.");
7430
+ setTimeout(() => onClose(), 1400);
7431
+ } catch (err) {
7432
+ setReferralError(err instanceof Error ? err.message : "Couldn't join the waitlist. Please try again.");
7433
+ setWaitlistLoading(false);
7504
7434
  }
7505
7435
  };
7506
- const handleCodeChange = (e) => {
7507
- setCodeSuffix(e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, "").slice(0, 5));
7508
- };
7509
- const handleCodePaste = (e) => {
7510
- e.preventDefault();
7511
- const text = (e.clipboardData.getData("text") || "").toUpperCase();
7512
- setCodeSuffix(text.replace(/^LOAF-?/, "").replace(/[^A-Z0-9]/g, "").slice(0, 5));
7513
- };
7514
- const codeComplete = codeSuffix.length === 5;
7515
- const codeInput = /* @__PURE__ */ jsx(
7516
- CodeSuffixInput,
7517
- {
7518
- type: "text",
7519
- inputMode: "text",
7520
- autoComplete: "off",
7521
- autoCapitalize: "characters",
7522
- spellCheck: false,
7523
- maxLength: 5,
7524
- "aria-label": "Access code",
7525
- readOnly: codeStatus === "valid",
7526
- value: codeSuffix,
7527
- onChange: handleCodeChange,
7528
- onPaste: handleCodePaste,
7529
- onKeyDown: (e) => {
7530
- if (e.key !== "Enter" || !codeComplete) return;
7531
- if (gate) void runCodeValidation(referralCode);
7532
- else void handleReferralSubmit();
7533
- },
7534
- autoFocus: true
7535
- }
7536
- );
7537
- const signInStep = /* @__PURE__ */ jsxs(GateReveal, { children: [
7538
- /* @__PURE__ */ jsxs("form", { onSubmit: handleSendCode, style: { width: "100%" }, children: [
7539
- /* @__PURE__ */ jsxs(CodeInputWrapper, { children: [
7436
+ return /* @__PURE__ */ jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7437
+ /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7438
+ /* @__PURE__ */ jsxs(OnboardingStepContainer, { children: [
7439
+ /* @__PURE__ */ jsx("div", { style: {
7440
+ width: 52,
7441
+ height: 52,
7442
+ borderRadius: 14,
7443
+ background: "linear-gradient(135deg, rgba(230,200,126,0.15) 0%, rgba(230,200,126,0.08) 100%)",
7444
+ border: "1px solid rgba(230,200,126,0.25)",
7445
+ display: "flex",
7446
+ alignItems: "center",
7447
+ justifyContent: "center",
7448
+ marginBottom: "1.1rem"
7449
+ }, children: /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "#e6c87e", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", children: [
7450
+ /* @__PURE__ */ jsx("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }),
7451
+ /* @__PURE__ */ jsx("circle", { cx: "9", cy: "7", r: "4" }),
7452
+ /* @__PURE__ */ jsx("path", { d: "M23 21v-2a4 4 0 0 0-3-3.87" }),
7453
+ /* @__PURE__ */ jsx("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })
7454
+ ] }) }),
7455
+ /* @__PURE__ */ jsx(OnboardingHeading, { children: "Enter code to access Private Beta trading" }),
7456
+ /* @__PURE__ */ jsx(OnboardingSubtext, { style: { marginBottom: "1.5rem" }, children: "Enter code to trade 100k in USDC, or skip to continue." }),
7457
+ /* @__PURE__ */ jsxs(EmailFormContainer, { style: { width: "100%", marginBottom: 0 }, children: [
7540
7458
  /* @__PURE__ */ jsx(
7541
- GateEmailInput,
7459
+ EmailInput,
7542
7460
  {
7543
- type: "email",
7544
- inputMode: "email",
7545
- autoComplete: "email",
7546
- placeholder: "Enter your email",
7547
- value: email,
7548
- onChange: (event) => setEmail(event.target.value),
7461
+ type: "text",
7462
+ placeholder: "e.g. LOAF-XXXX",
7463
+ value: referralCode,
7464
+ onChange: (e) => {
7465
+ setReferralCode(e.target.value.toUpperCase());
7466
+ setReferralError("");
7467
+ },
7468
+ onKeyDown: (e) => {
7469
+ if (e.key === "Enter") void handleReferralSubmit();
7470
+ },
7549
7471
  autoFocus: true
7550
7472
  }
7551
7473
  ),
7552
- /* @__PURE__ */ jsx(GateSubmit, { type: "submit", "aria-label": "Continue", disabled: loading || !email, children: loading ? /* @__PURE__ */ jsx(GateSpinner, {}) : /* @__PURE__ */ jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M5 12h14M13 6l6 6-6 6" }) }) })
7553
- ] }),
7554
- error && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: error })
7555
- ] }),
7556
- /* @__PURE__ */ jsxs(Fragment, { children: [
7557
- /* @__PURE__ */ jsx(GateOr, { children: "or" }),
7558
- /* @__PURE__ */ jsxs(GateWalletButton, { type: "button", onClick: handleWalletLogin, children: [
7559
- /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }),
7560
- signInMode ? "Sign in with Wallet" : "Connect Wallet"
7561
- ] })
7562
- ] })
7563
- ] });
7564
- if (gate) {
7565
- const codeAccepted = codeStatus === "valid";
7566
- const showSignIn = signInMode || signInRevealed;
7567
- return /* @__PURE__ */ jsxs(GateShell, { children: [
7568
- /* @__PURE__ */ jsx(GateTint, { $reveal: showSignIn ? 1 : 0 }),
7569
- /* @__PURE__ */ jsxs(GateForm, { children: [
7570
- /* @__PURE__ */ jsxs(GateBrand, { children: [
7571
- /* @__PURE__ */ jsx(GateLogoLink, { href: "https://loafmarkets.com", "aria-label": "Go to loafmarkets.com", children: /* @__PURE__ */ jsx(GateLogo, { src: logoSrc, alt: logoAlt }) }),
7572
- /* @__PURE__ */ jsx(GateBrandDivider, {}),
7573
- /* @__PURE__ */ jsx(GateBetaTag, { children: "Private Beta" })
7574
- ] }),
7575
- signInMode ? /* @__PURE__ */ jsxs(Fragment, { children: [
7576
- signInStep,
7577
- /* @__PURE__ */ jsx(GateResendText, { children: /* @__PURE__ */ jsx(
7578
- "button",
7579
- {
7580
- type: "button",
7581
- onClick: () => {
7582
- setError("");
7583
- setSignInMode(false);
7584
- },
7585
- children: "\u2190 Enter access code instead"
7586
- }
7587
- ) })
7588
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
7589
- /* @__PURE__ */ jsxs(CodeInputWrapper, { $status: codeStatus, children: [
7590
- /* @__PURE__ */ jsx(CodePrefix, { children: CODE_PREFIX }),
7591
- codeInput,
7592
- /* @__PURE__ */ jsx(
7593
- GateSubmit,
7594
- {
7595
- type: "button",
7596
- "aria-label": "Submit access code",
7597
- $status: codeStatus,
7598
- disabled: codeStatus === "checking" || !codeComplete,
7599
- onClick: () => void runCodeValidation(referralCode),
7600
- children: codeAccepted ? /* @__PURE__ */ jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M20 6L9 17l-5-5" }) }) : codeStatus === "checking" ? /* @__PURE__ */ jsx(GateSpinner, {}) : /* @__PURE__ */ jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M5 12h14M13 6l6 6-6 6" }) })
7601
- }
7602
- )
7603
- ] }),
7604
- (codeStatus === "invalid" || error && !signInRevealed) && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: error || "That code isn't valid. Double-check and try again." }),
7605
- signInRevealed ? signInStep : /* @__PURE__ */ jsxs(GateResendText, { children: [
7606
- "Already have an account?",
7607
- " ",
7608
- /* @__PURE__ */ jsx(
7609
- "button",
7610
- {
7611
- type: "button",
7612
- onClick: () => {
7613
- setError("");
7614
- setIsSignUp(false);
7615
- setSignInMode(true);
7616
- },
7617
- children: "Sign in"
7618
- }
7619
- )
7620
- ] })
7621
- ] })
7622
- ] })
7623
- ] });
7624
- }
7625
- return /* @__PURE__ */ jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
7626
- /* @__PURE__ */ jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ 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" }) }) }),
7627
- /* @__PURE__ */ jsxs(Title, { children: [
7628
- /* @__PURE__ */ jsxs(LogoContainer3, { children: [
7629
- /* @__PURE__ */ jsx(LogoImage, { src: logoSrc, alt: logoAlt }),
7630
- /* @__PURE__ */ jsx(LogoBeta, { children: "Private Beta" })
7631
- ] }),
7632
- /* @__PURE__ */ jsx(TitleText, { children: "Enter your access code" })
7633
- ] }),
7634
- /* @__PURE__ */ jsxs(EmailFormContainer, { style: { width: "100%", marginTop: "1.5rem", marginBottom: 0 }, children: [
7635
- /* @__PURE__ */ jsxs(CodeInputWrapper, { children: [
7636
- /* @__PURE__ */ jsx(CodePrefix, { children: CODE_PREFIX }),
7637
- codeInput
7474
+ /* @__PURE__ */ jsx(
7475
+ SubmitButton,
7476
+ {
7477
+ type: "button",
7478
+ onClick: () => void handleReferralSubmit(),
7479
+ disabled: referralLoading || !referralCode.trim(),
7480
+ children: referralLoading ? "Verifying\u2026" : "Apply Code"
7481
+ }
7482
+ ),
7483
+ referralError && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: referralError })
7638
7484
  ] }),
7639
- /* @__PURE__ */ jsx(
7640
- SubmitButton,
7485
+ waitlistMessage ? /* @__PURE__ */ jsxs(StatusMessage, { style: { marginTop: "0.75rem" }, children: [
7486
+ "\u2713 ",
7487
+ waitlistMessage
7488
+ ] }) : /* @__PURE__ */ jsx(
7489
+ OnboardingSkipButton,
7641
7490
  {
7642
7491
  type: "button",
7643
- onClick: () => void handleReferralSubmit(),
7644
- disabled: referralLoading || !codeComplete,
7645
- children: referralLoading ? "Verifying\u2026" : "Continue"
7492
+ onClick: () => void handleJoinWaitlistSkip(),
7493
+ disabled: waitlistLoading,
7494
+ style: { marginTop: "0.75rem" },
7495
+ children: waitlistLoading ? "Joining\u2026" : email ? "Skip for now & join Waitlist" : "Skip for now"
7646
7496
  }
7647
- ),
7648
- referralError && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: referralError })
7497
+ )
7649
7498
  ] })
7650
7499
  ] }) });
7651
7500
  }
@@ -7765,9 +7614,8 @@ var Overlay2 = styled10.div`
7765
7614
  left: 0;
7766
7615
  right: 0;
7767
7616
  bottom: 0;
7768
- background-color: ${(props) => props.$gate ? "var(--color-background, #0a0a0a)" : props.$transparent ? "rgba(0, 0, 0, 0.45)" : "rgba(0, 0, 0, 0.8)"};
7769
- backdrop-filter: ${(props) => props.$gate ? "none" : props.$transparent ? "blur(2px)" : "blur(4px)"};
7770
- transition: background-color 0.4s ease, backdrop-filter 0.4s ease;
7617
+ background-color: rgba(0, 0, 0, 0.8);
7618
+ backdrop-filter: blur(4px);
7771
7619
  display: flex;
7772
7620
  justify-content: center;
7773
7621
  align-items: center;
@@ -7784,15 +7632,15 @@ var Overlay2 = styled10.div`
7784
7632
  }
7785
7633
  `;
7786
7634
  var PopupContainer = styled10.div`
7787
- background-color: ${(props) => props.$gate ? "transparent" : "var(--color-background, #0a0a0a)"};
7788
- border: ${(props) => props.$gate ? "none" : "1px solid rgba(230, 198, 86, 0.3)"};
7635
+ background-color: var(--color-background, #0a0a0a);
7636
+ border: 1px solid rgba(230, 198, 86, 0.3);
7789
7637
  border-radius: var(--border-radius, 12px);
7790
7638
  padding: 2.5rem;
7791
7639
  max-width: 440px;
7792
7640
  width: 90%;
7793
7641
  position: relative;
7794
7642
  animation: slideUp 0.3s ease-out;
7795
- box-shadow: ${(props) => props.$gate ? "none" : "0 10px 30px rgba(0, 0, 0, 0.3)"};
7643
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
7796
7644
 
7797
7645
  @keyframes slideUp {
7798
7646
  from {
@@ -7979,379 +7827,180 @@ var Title = styled10.h2`
7979
7827
  flex-direction: column;
7980
7828
  align-items: center;
7981
7829
  justify-content: center;
7982
- gap: 1rem;
7983
- `;
7984
- var TitleText = styled10.span`
7985
- text-align: center;
7986
- line-height: 1.2;
7987
- `;
7988
- var LogoBeta = styled10.span`
7989
- color: var(--color-accent, #E6C87E);
7990
- font-size: 0.6rem;
7991
- font-weight: 600;
7992
- letter-spacing: 0.14em;
7993
- text-transform: uppercase;
7994
- white-space: nowrap;
7995
- padding-bottom: 0.95rem;
7830
+ gap: 0.4rem;
7996
7831
  `;
7997
- var Subtitle = styled10.p`
7832
+ styled10.p`
7998
7833
  font-size: 0.9rem;
7999
7834
  font-weight: 400;
8000
7835
  color: var(--color-text-secondary, #848e9c);
8001
7836
  text-align: center;
8002
7837
  margin: 0 0 2rem;
8003
7838
  `;
8004
- var LogoContainer3 = styled10.div`
8005
- display: flex;
8006
- align-items: flex-end;
8007
- justify-content: center;
8008
- gap: 0.45rem;
8009
- margin-bottom: 0.5rem;
8010
- `;
8011
- var LogoImage = styled10.img`
8012
- height: 60px;
8013
- `;
8014
- var ButtonsContainer = styled10.div`
8015
- display: flex;
8016
- flex-direction: column;
8017
- gap: 1rem;
8018
- margin-bottom: 1.5rem;
8019
- `;
8020
- var SignUpPrompt = styled10.div`
8021
- text-align: center;
8022
- font-size: 0.875rem;
8023
- color: var(--color-text-secondary, #848e9c);
8024
- margin-bottom: 0.5rem;
8025
- `;
8026
- var SignUpLink = styled10.button`
8027
- background: none;
8028
- border: none;
8029
- padding: 0;
8030
- font: inherit;
8031
- color: var(--color-accent, #E6C87E);
8032
- text-decoration: underline;
8033
- cursor: pointer;
8034
-
8035
- &:hover {
8036
- opacity: 0.85;
8037
- }
8038
- `;
8039
- var LoginButton = styled10.button`
8040
- display: flex;
8041
- align-items: center;
8042
- justify-content: center;
8043
- gap: 0.75rem;
8044
- padding: 1rem 1.5rem;
8045
- background-color: var(--color-background-light, #1a1a1a);
8046
- border: 1px solid rgba(230, 198, 86, 0.2);
8047
- border-radius: var(--border-radius, 8px);
8048
- color: var(--color-text, #eaecef);
8049
- font-size: 1rem;
8050
- font-weight: 500;
8051
- cursor: pointer;
8052
- transition: all 0.2s ease;
8053
-
8054
- &:hover {
8055
- background-color: rgba(230, 198, 86, 0.1);
8056
- border-color: var(--color-accent, #E6C87E);
8057
- }
8058
-
8059
- svg {
8060
- width: 20px;
8061
- height: 20px;
8062
- color: var(--color-accent, #E6C87E);
8063
- }
8064
- `;
8065
- var InfoText = styled10.p`
8066
- color: var(--color-text-secondary, #848e9c);
8067
- font-size: 0.875rem;
8068
- text-align: center;
8069
- line-height: 1.5;
8070
- `;
8071
- var EmailFormContainer = styled10.div`
8072
- display: flex;
8073
- flex-direction: column;
8074
- gap: 1rem;
8075
- margin-bottom: 1.5rem;
8076
- `;
8077
- var EmailInput = styled10.input`
8078
- width: 100%;
8079
- padding: 1rem 1.25rem;
8080
- background-color: var(--color-background-light, #1a1a1a);
8081
- border: 1px solid rgba(230, 198, 86, 0.2);
8082
- border-radius: var(--border-radius, 8px);
7839
+ var MainHeading = styled10.h2`
7840
+ font-size: 1.5rem;
7841
+ font-weight: 700;
8083
7842
  color: var(--color-text, #eaecef);
8084
- font-size: 1rem;
8085
- transition: all 0.2s ease;
8086
-
8087
- &:focus {
8088
- outline: none;
8089
- border-color: var(--color-accent, #E6C87E);
8090
- }
8091
-
8092
- &::placeholder {
8093
- color: var(--color-text-secondary, #848e9c);
8094
- }
8095
- `;
8096
- var codeBorderColor = (status, focused) => {
8097
- if (status === "valid") return "var(--color-positive, #00C076)";
8098
- if (status === "invalid") return "var(--color-negative, #FF5757)";
8099
- return focused ? "var(--color-accent, #E6C87E)" : "rgba(230, 198, 86, 0.2)";
8100
- };
8101
- var CodeInputWrapper = styled10.div`
8102
- display: flex;
8103
- align-items: center;
8104
- width: 100%;
8105
- padding: 1rem 1.25rem;
8106
- background-color: var(--color-background-light, #1a1a1a);
8107
- border: 1px solid ${(props) => codeBorderColor(props.$status, false)};
8108
- border-radius: var(--border-radius, 8px);
8109
- box-shadow: ${(props) => props.$status === "valid" ? "0 0 0 1px var(--color-positive, #00C076)" : props.$status === "invalid" ? "0 0 0 1px var(--color-negative, #FF5757)" : "none"};
8110
- transition: all 0.2s ease;
8111
-
8112
- &:focus-within {
8113
- border-color: ${(props) => codeBorderColor(props.$status, true)};
8114
- }
7843
+ text-align: left;
7844
+ margin: 0 0 0.35rem;
8115
7845
  `;
8116
- var CodePrefix = styled10.span`
7846
+ var MainSubtitle = styled10.p`
7847
+ font-size: 0.9rem;
7848
+ font-weight: 400;
8117
7849
  color: var(--color-text-secondary, #848e9c);
8118
- font-size: 1.1rem;
8119
- font-weight: 600;
8120
- letter-spacing: 0.22em;
8121
- font-family: 'Space Grotesk', monospace;
8122
- user-select: none;
8123
- `;
8124
- var CodeSuffixInput = styled10.input`
8125
- flex: 1;
8126
- min-width: 0;
8127
- border: none;
8128
- background: transparent;
8129
- color: var(--color-text, #eaecef);
8130
- font-size: 1.1rem;
8131
- font-weight: 600;
8132
- letter-spacing: 0.22em;
8133
- text-transform: uppercase;
8134
- font-family: 'Space Grotesk', monospace;
8135
- /* Explicit line-height so iOS in-app WebViews size the caret to the text
8136
- box instead of rendering a short, top-aligned caret (line-height: normal
8137
- + webfont + letter-spacing miscomputes it in some WebViews). */
7850
+ text-align: left;
7851
+ margin: 0 0 1.5rem;
8138
7852
  line-height: 1.5;
8139
-
8140
- &:focus {
8141
- outline: none;
8142
- }
8143
-
8144
- &::placeholder {
8145
- color: rgba(132, 142, 156, 0.45);
8146
- letter-spacing: 0.22em;
8147
- }
8148
- `;
8149
- var GateBrand = styled10.div`
8150
- display: flex;
8151
- align-items: center;
8152
- justify-content: center;
8153
- gap: 0.7rem;
8154
- margin-bottom: 0.6rem;
8155
- `;
8156
- var GateLogoLink = styled10.a`
8157
- display: inline-flex;
8158
- align-items: center;
8159
- cursor: pointer;
8160
- transition: opacity 0.15s ease;
8161
-
8162
- &:hover {
8163
- opacity: 0.85;
8164
- }
8165
- `;
8166
- var GateLogo = styled10.img`
8167
- height: 44px;
8168
- display: block;
8169
- `;
8170
- var GateBrandDivider = styled10.span`
8171
- width: 1px;
8172
- height: 26px;
8173
- background: rgba(255, 255, 255, 0.18);
8174
- `;
8175
- var GateBetaTag = styled10.span`
8176
- color: var(--color-text-secondary, #848e9c);
8177
- font-size: 0.8rem;
8178
- font-weight: 500;
8179
- letter-spacing: 0.28em;
8180
- text-transform: uppercase;
8181
- `;
8182
- var GateForm = styled10.div`
8183
- display: flex;
8184
- flex-direction: column;
8185
- align-items: center;
8186
- gap: 0.9rem;
8187
- width: 100%;
8188
- max-width: 360px;
8189
- position: relative;
8190
- z-index: 1;
8191
- `;
8192
- var GateShell = styled10.div`
8193
- position: fixed;
8194
- inset: 0;
7853
+ `;
7854
+ var LogoContainer3 = styled10.div`
8195
7855
  display: flex;
8196
- align-items: center;
7856
+ align-items: flex-end;
8197
7857
  justify-content: center;
8198
- z-index: 10000;
8199
- background-color: rgba(10, 10, 12, 0.66);
7858
+ gap: 0.45rem;
7859
+ margin-bottom: 0.5rem;
8200
7860
  `;
8201
- var GateTint = styled10.div`
8202
- position: absolute;
8203
- left: 0;
8204
- right: 0;
8205
- bottom: 0;
8206
- height: calc(${(props) => (3 - Math.max(0, Math.min(3, props.$reveal))) / 3 * 100}% + 90px);
8207
- background: linear-gradient(
8208
- to top,
8209
- var(--color-background, #0a0a0c) calc(100% - 90px),
8210
- rgba(10, 10, 12, 0) 100%
8211
- );
8212
- transition: height 0.65s ease;
8213
- pointer-events: none;
7861
+ var LogoImage = styled10.img`
7862
+ height: 40px;
8214
7863
  `;
8215
- var GateOtpText = styled10.p`
8216
- margin: 0;
7864
+ styled10.div`
7865
+ display: flex;
7866
+ flex-direction: column;
7867
+ gap: 1rem;
7868
+ margin-bottom: 1.5rem;
7869
+ `;
7870
+ styled10.div`
8217
7871
  text-align: center;
8218
- font-size: 0.9rem;
8219
- line-height: 1.5;
7872
+ font-size: 0.875rem;
8220
7873
  color: var(--color-text-secondary, #848e9c);
8221
-
8222
- strong {
8223
- color: var(--color-text, #eaecef);
8224
- font-weight: 600;
8225
- }
7874
+ margin-bottom: 0.5rem;
8226
7875
  `;
8227
- var GateResendText = styled10.p`
8228
- margin: 0.2rem 0 0;
8229
- font-size: 0.85rem;
8230
- color: var(--color-text-secondary, #848e9c);
7876
+ styled10.button`
7877
+ background: none;
7878
+ border: none;
7879
+ padding: 0;
7880
+ font: inherit;
7881
+ color: var(--color-accent, #E6C87E);
7882
+ text-decoration: underline;
7883
+ cursor: pointer;
8231
7884
 
8232
- button {
8233
- background: none;
8234
- border: none;
8235
- color: var(--color-accent, #E6C87E);
8236
- cursor: pointer;
8237
- text-decoration: underline;
8238
- font-size: inherit;
7885
+ &:hover {
7886
+ opacity: 0.85;
8239
7887
  }
8240
7888
  `;
8241
- var GateSubmit = styled10.button`
7889
+ var LoginButton = styled10.button`
8242
7890
  display: flex;
7891
+ width: 100%;
7892
+ box-sizing: border-box;
8243
7893
  align-items: center;
8244
7894
  justify-content: center;
8245
- flex-shrink: 0;
8246
- width: 28px;
8247
- height: 28px;
8248
- margin-left: 0.5rem;
8249
- padding: 0;
8250
- background: none;
8251
- border: none;
7895
+ gap: 0.55rem;
7896
+ padding: 0.55rem 1.1rem;
7897
+ background-color: var(--color-background-light, #1a1a1a);
7898
+ border: 1px solid rgba(230, 198, 86, 0.2);
7899
+ border-radius: var(--border-radius, 8px);
7900
+ color: var(--color-text, #eaecef);
7901
+ font-size: 0.82rem;
7902
+ font-weight: 500;
8252
7903
  cursor: pointer;
8253
- color: ${(props) => props.$status === "valid" ? "var(--color-positive, #00C076)" : props.$status === "invalid" ? "var(--color-negative, #FF5757)" : "var(--color-accent, #E6C87E)"};
8254
- transition: color 0.15s ease, transform 0.15s ease, opacity 0.15s ease;
7904
+ transition: all 0.2s ease;
8255
7905
 
8256
- &:not(:disabled):hover {
8257
- transform: translateX(2px);
7906
+ svg { width: 16px; height: 16px; }
7907
+
7908
+ &:hover {
7909
+ background-color: rgba(230, 198, 86, 0.1);
7910
+ border-color: var(--color-accent, #E6C87E);
8258
7911
  }
8259
7912
 
8260
- &:disabled {
8261
- opacity: ${(props) => props.$status === "valid" ? 1 : 0.35};
8262
- color: ${(props) => props.$status === "valid" ? "var(--color-positive, #00C076)" : "var(--color-text-secondary, #848e9c)"};
8263
- cursor: default;
7913
+ svg {
7914
+ width: 20px;
7915
+ height: 20px;
7916
+ color: var(--color-accent, #E6C87E);
8264
7917
  }
8265
7918
  `;
8266
- var GateEmailInput = styled10.input`
8267
- flex: 1;
8268
- min-width: 0;
8269
- border: none;
8270
- background: transparent;
7919
+ var InfoText = styled10.p`
7920
+ color: var(--color-text-secondary, #848e9c);
7921
+ font-size: 0.875rem;
7922
+ text-align: center;
7923
+ line-height: 1.5;
7924
+ `;
7925
+ var EmailFormContainer = styled10.div`
7926
+ display: flex;
7927
+ flex-direction: column;
7928
+ gap: 1rem;
7929
+ margin-bottom: 1.5rem;
7930
+ `;
7931
+ var EmailInput = styled10.input`
7932
+ width: 100%;
7933
+ padding: 1rem 1.25rem;
7934
+ background-color: var(--color-background-light, #1a1a1a);
7935
+ border: 1px solid rgba(230, 198, 86, 0.2);
7936
+ border-radius: var(--border-radius, 8px);
8271
7937
  color: var(--color-text, #eaecef);
8272
7938
  font-size: 1rem;
7939
+ transition: all 0.2s ease;
8273
7940
 
8274
7941
  &:focus {
8275
7942
  outline: none;
7943
+ border-color: var(--color-accent, #E6C87E);
8276
7944
  }
8277
7945
 
8278
7946
  &::placeholder {
8279
- color: rgba(132, 142, 156, 0.5);
8280
- }
8281
- `;
8282
- var GateSpinner = styled10.span`
8283
- width: 18px;
8284
- height: 18px;
8285
- border: 2px solid rgba(230, 198, 86, 0.3);
8286
- border-top-color: var(--color-accent, #E6C87E);
8287
- border-radius: 50%;
8288
- animation: gateSpin 0.7s linear infinite;
8289
-
8290
- @keyframes gateSpin {
8291
- to { transform: rotate(360deg); }
7947
+ color: var(--color-text-secondary, #848e9c);
8292
7948
  }
8293
7949
  `;
8294
- var GateOr = styled10.div`
7950
+ var GateForm = styled10.form`
8295
7951
  display: flex;
8296
- align-items: center;
7952
+ flex-direction: column;
8297
7953
  gap: 0.6rem;
8298
7954
  width: 100%;
8299
- color: var(--color-text-secondary, #848e9c);
8300
- font-size: 0.78rem;
8301
- text-transform: lowercase;
7955
+ `;
7956
+ var GateInputRow = styled10.div`
7957
+ position: relative;
7958
+ width: 100%;
7959
+ `;
7960
+ var GateInput = styled10.input`
7961
+ width: 100%;
7962
+ box-sizing: border-box;
7963
+ padding: 1rem 3.25rem 1rem 1.25rem;
7964
+ background-color: var(--color-background-light, #1a1a1a);
7965
+ border: 1px solid rgba(230, 198, 86, 0.2);
7966
+ border-radius: var(--border-radius, 8px);
7967
+ color: var(--color-text, #eaecef);
7968
+ font-size: 1rem;
7969
+ transition: all 0.2s ease;
8302
7970
 
8303
- &::before,
8304
- &::after {
8305
- content: "";
8306
- flex: 1;
8307
- height: 1px;
8308
- background: rgba(255, 255, 255, 0.1);
8309
- }
7971
+ &:focus { outline: none; border-color: var(--color-accent, #E6C87E); }
7972
+ &::placeholder { color: var(--color-text-secondary, #848e9c); }
8310
7973
  `;
8311
- var GateWalletButton = styled10.button`
8312
- display: inline-flex;
7974
+ var GateSubmit = styled10.button`
7975
+ position: absolute;
7976
+ top: 50%;
7977
+ right: 0.55rem;
7978
+ transform: translateY(-50%);
7979
+ width: 34px;
7980
+ height: 34px;
7981
+ display: flex;
8313
7982
  align-items: center;
8314
7983
  justify-content: center;
8315
- gap: 0.5rem;
8316
- margin-top: 0.1rem;
8317
- padding: 0.55rem 1.1rem;
8318
- background: transparent;
8319
- border: 1px solid rgba(255, 255, 255, 0.12);
8320
- border-radius: var(--border-radius, 8px);
7984
+ background: none;
7985
+ border: none;
7986
+ border-radius: 8px;
8321
7987
  color: var(--color-text-secondary, #848e9c);
8322
- font-size: 0.85rem;
8323
- font-weight: 500;
8324
7988
  cursor: pointer;
8325
- transition: border-color 0.15s ease, color 0.15s ease;
8326
-
8327
- svg {
8328
- width: 16px;
8329
- height: 16px;
8330
- }
7989
+ transition: color 0.2s ease, background 0.2s ease;
8331
7990
 
8332
- &:hover {
8333
- border-color: rgba(230, 198, 86, 0.4);
8334
- color: var(--color-text, #eaecef);
8335
- }
7991
+ svg { width: 18px; height: 18px; }
7992
+ &:hover:not(:disabled) { color: var(--color-accent, #E6C87E); background: rgba(230, 198, 86, 0.1); }
7993
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
8336
7994
  `;
8337
- var GateReveal = styled10.div`
7995
+ var GateOr = styled10.div`
8338
7996
  display: flex;
8339
- flex-direction: column;
8340
7997
  align-items: center;
8341
- gap: 0.9rem;
8342
- width: 100%;
8343
- animation: gateReveal 0.3s ease-out;
7998
+ gap: 0.75rem;
7999
+ color: var(--color-text-secondary, #848e9c);
8000
+ font-size: 0.8rem;
8001
+ margin: 0.4rem 0;
8344
8002
 
8345
- @keyframes gateReveal {
8346
- from {
8347
- opacity: 0;
8348
- transform: translateY(-6px);
8349
- }
8350
- to {
8351
- opacity: 1;
8352
- transform: translateY(0);
8353
- }
8354
- }
8003
+ &::before, &::after { content: ""; flex: 1; height: 1px; background: rgba(255, 255, 255, 0.08); }
8355
8004
  `;
8356
8005
  var OTPContainer = styled10.div`
8357
8006
  display: flex;
@@ -8365,17 +8014,15 @@ var OTPInput = styled10.input`
8365
8014
  font-size: 1.5rem;
8366
8015
  font-weight: 600;
8367
8016
  background-color: var(--color-background-light, #1a1a1a);
8368
- border: 1px solid ${(props) => codeBorderColor(props.$status, false)};
8017
+ border: 1px solid rgba(230, 198, 86, 0.2);
8369
8018
  border-radius: var(--border-radius, 8px);
8370
- color: ${(props) => props.$status === "valid" ? "var(--color-positive, #00C076)" : props.$status === "invalid" ? "var(--color-negative, #FF5757)" : "var(--color-accent, #E6C87E)"};
8371
- box-shadow: ${(props) => props.$status === "valid" ? "0 0 0 1px var(--color-positive, #00C076)" : props.$status === "invalid" ? "0 0 0 1px var(--color-negative, #FF5757)" : "none"};
8372
- opacity: ${(props) => props.$status === "checking" ? 0.6 : 1};
8019
+ color: var(--color-accent, #E6C87E);
8373
8020
  transition: all 0.2s ease;
8374
8021
 
8375
8022
  &:focus {
8376
8023
  outline: none;
8377
- border-color: ${(props) => codeBorderColor(props.$status, true)};
8378
- box-shadow: 0 0 0 2px ${(props) => props.$status === "valid" ? "rgba(0, 192, 118, 0.25)" : props.$status === "invalid" ? "rgba(255, 87, 87, 0.25)" : "rgba(230, 198, 86, 0.2)"};
8024
+ border-color: var(--color-accent, #E6C87E);
8025
+ box-shadow: 0 0 0 2px rgba(230, 198, 86, 0.2);
8379
8026
  }
8380
8027
  `;
8381
8028
  var SubmitButton = styled10.button`
@@ -8743,24 +8390,15 @@ var SpinnerRing = styled10.div`
8743
8390
  }
8744
8391
  `;
8745
8392
  var PREPARING_FACTS = [
8746
- // Exchange
8393
+ "Property is the world's largest asset class \u2014 worth over US$300 trillion.",
8394
+ "Loaf settles trades in about 1 second. Traditional property takes ~90 days.",
8747
8395
  "Our matching engine processes orders in 30 microseconds.",
8748
- "Loaf settles in 1 second. Traditional property takes 30-90 days.",
8396
+ "Every token is backed 1:1 by land-title-registered property.",
8397
+ "Own a slice of premium real estate \u2014 no mortgage, no paperwork.",
8749
8398
  "Buy and sell property as easily as a stock, on a live orderbook.",
8750
- "Continuous price discovery, not a single buyer negotiating in a back room.",
8751
- "Algo-trade property on our API. Build a bot with Claude using our docs.",
8752
- // What you're holding
8753
- "Hold shares secured 1:1 by the underlying property, as regulated securities.",
8754
- "The same economic exposure as owning the property. Without the friction, gatekeeping, or illiquidity.",
8755
- "Securitisation of property brings a new dimension of flexibility and tradability.",
8756
- // Frictionless
8757
- "Settle in seconds, then sell again whenever you want. No waiting days or weeks.",
8758
- "99% of the frictions in property transactions can be, and have been, reduced.",
8759
- // Vision
8760
- "A family office can rebalance a billion dollars in an afternoon, but couldn't sell a $50M property in under six months.",
8761
- "Family offices and HNWIs prize capital flexibility. Loaf makes property flexible.",
8762
- "There's no law of physics that says the world's oldest asset class must stay illiquid.",
8763
- "What if property underwent an IPO?"
8399
+ "Earn rental yield on the exact fraction of property you own.",
8400
+ "Title-backed by the NSW Land Registry \u2014 real ownership, on-chain.",
8401
+ "Loaf ran the world's first property IPO."
8764
8402
  ];
8765
8403
  var FactCard = styled10.div`
8766
8404
  margin-top: 1.5rem;
@@ -8868,7 +8506,7 @@ var LogoImage2 = styled10.img`
8868
8506
  height: 30px;
8869
8507
  width: auto;
8870
8508
  `;
8871
- var LogoBeta2 = styled10.span`
8509
+ var LogoBeta = styled10.span`
8872
8510
  font-size: 0.6rem;
8873
8511
  font-weight: 600;
8874
8512
  letter-spacing: 0.08em;
@@ -9026,7 +8664,7 @@ function OnboardingGuide({
9026
8664
  /* @__PURE__ */ jsx(CloseButton2, { onClick: onClose, "aria-label": "Skip", children: /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 6l12 12M18 6L6 18" }) }) }),
9027
8665
  /* @__PURE__ */ jsxs(LogoRow, { children: [
9028
8666
  /* @__PURE__ */ jsx(LogoImage2, { src: logoSrc, alt: "Loaf" }),
9029
- /* @__PURE__ */ jsx(LogoBeta2, { children: "Private Beta" })
8667
+ /* @__PURE__ */ jsx(LogoBeta, { children: "Private Beta" })
9030
8668
  ] }),
9031
8669
  /* @__PURE__ */ jsx(Title2, { children: "You're in \u{1F389}" }),
9032
8670
  /* @__PURE__ */ jsx(Subtitle2, { children: "Here's everything you need to make your first trade." }),
@@ -12396,8 +12034,7 @@ function AssetSelectorBar({
12396
12034
  onSelect,
12397
12035
  trailing,
12398
12036
  imageUrl,
12399
- badgeLabel,
12400
- tickerPrimary
12037
+ badgeLabel
12401
12038
  }) {
12402
12039
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
12403
12040
  const hasItems = selectorItems && selectorItems.length > 0;
@@ -12408,14 +12045,9 @@ function AssetSelectorBar({
12408
12045
  ];
12409
12046
  return /* @__PURE__ */ jsx(AssetSelectorWrapper, { children: /* @__PURE__ */ jsxs(IPOAssetSelector, { children: [
12410
12047
  imageUrl && /* @__PURE__ */ jsx(AssetThumbnail, { src: imageUrl, alt: propertyName }),
12411
- /* @__PURE__ */ jsx(AssetSelectorDropdown, { $flush: tickerPrimary, onClick: () => hasItems && setIsDropdownOpen((prev) => !prev), children: /* @__PURE__ */ jsxs(AssetName, { children: [
12412
- tickerPrimary && currentTicker ? /* @__PURE__ */ jsxs(AssetIdentity, { children: [
12413
- /* @__PURE__ */ jsx(AssetTicker, { children: currentTicker.toUpperCase() }),
12414
- /* @__PURE__ */ jsx(AssetSubName, { children: propertyName })
12415
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
12416
- propertyName,
12417
- currentTicker ? ` (${currentTicker.toUpperCase()})` : ""
12418
- ] }),
12048
+ /* @__PURE__ */ jsx(AssetSelectorDropdown, { onClick: () => hasItems && setIsDropdownOpen((prev) => !prev), children: /* @__PURE__ */ jsxs(AssetName, { children: [
12049
+ propertyName,
12050
+ currentTicker ? ` (${currentTicker.toUpperCase()})` : "",
12419
12051
  badgeLabel && /* @__PURE__ */ jsx(CompetitionBadge, { children: badgeLabel }),
12420
12052
  hasItems && /* @__PURE__ */ jsx(
12421
12053
  "svg",
@@ -12444,7 +12076,7 @@ function AssetSelectorBar({
12444
12076
  ] })
12445
12077
  ] })
12446
12078
  ] }, m.label)) }),
12447
- trailing != null && /* @__PURE__ */ jsx(TrailingWrapper, { className: "asset-bar-trailing", children: /* @__PURE__ */ jsx(TrailingInner, { children: trailing }) }),
12079
+ trailing != null && /* @__PURE__ */ jsx(TrailingWrapper, { children: /* @__PURE__ */ jsx(TrailingInner, { children: trailing }) }),
12448
12080
  isDropdownOpen && hasItems && /* @__PURE__ */ jsx(IPODropdown, { children: selectorItems.map((item) => {
12449
12081
  const isCurrent = item.tokenName === currentTokenName;
12450
12082
  const status = item.status?.toUpperCase();
@@ -12535,40 +12167,13 @@ var AssetSelectorDropdown = styled10.div`
12535
12167
  display: flex;
12536
12168
  align-items: center;
12537
12169
  cursor: pointer;
12538
- /* $flush (tickerPrimary): no horizontal padding / no hover box, so opening the
12539
- selector doesn't make the ticker appear shoved right by the highlight box. */
12540
- padding: ${(p) => p.$flush ? "0.25rem 0" : "0.5rem"};
12170
+ padding: 0.5rem;
12541
12171
  border-radius: 8px;
12542
- transition: ${(p) => p.$flush ? "none" : "all 0.2s ease"};
12172
+ transition: all 0.2s ease;
12543
12173
  flex: 0 1 auto;
12544
12174
  min-width: 0;
12545
12175
  overflow: hidden;
12546
- &:hover { background-color: ${(p) => p.$flush ? "transparent" : "rgba(255,255,255,0.05)"}; }
12547
- `;
12548
- var AssetIdentity = styled10.div`
12549
- display: flex;
12550
- flex-direction: column;
12551
- min-width: 0;
12552
- line-height: 1.2;
12553
- `;
12554
- var AssetTicker = styled10.span`
12555
- font-weight: 700;
12556
- font-size: 1.35rem;
12557
- color: var(--color-text);
12558
- letter-spacing: -0.01em;
12559
- white-space: nowrap;
12560
- overflow: hidden;
12561
- text-overflow: ellipsis;
12562
-
12563
- @media (max-width: 480px) { font-size: 1.2rem; }
12564
- `;
12565
- var AssetSubName = styled10.span`
12566
- font-size: 0.8rem;
12567
- font-weight: 500;
12568
- color: rgba(255, 255, 255, 0.4);
12569
- white-space: nowrap;
12570
- overflow: hidden;
12571
- text-overflow: ellipsis;
12176
+ &:hover { background-color: rgba(255,255,255,0.05); }
12572
12177
  `;
12573
12178
  var AssetName = styled10.div`
12574
12179
  display: flex;
@@ -15246,30 +14851,27 @@ function PortfolioActivityPanel({
15246
14851
  ] }, pos.tokenName);
15247
14852
  })
15248
14853
  ] }),
15249
- positions.length > 0 && closeAllOpen && onClosePosition && typeof document !== "undefined" && createPortal(
15250
- /* @__PURE__ */ jsx(CloseAllOverlay, { onClick: () => setCloseAllOpen(false), children: /* @__PURE__ */ jsxs(CloseAllModal, { onClick: (e) => e.stopPropagation(), children: [
15251
- /* @__PURE__ */ jsx(CloseAllModalX, { onClick: () => setCloseAllOpen(false), children: "\xD7" }),
15252
- /* @__PURE__ */ jsx(CloseAllTitle, { children: "Confirm Sell All" }),
15253
- /* @__PURE__ */ jsx(CloseAllDesc, { children: "This will sell all your positions and cancel their associated TP/SL orders." }),
15254
- /* @__PURE__ */ jsxs(CloseAllOption, { onClick: () => setCloseAllType("market"), children: [
15255
- /* @__PURE__ */ jsx(CloseAllRadio, { $selected: closeAllType === "market" }),
15256
- /* @__PURE__ */ jsx("span", { children: "Market Sell" })
15257
- ] }),
15258
- /* @__PURE__ */ jsxs(CloseAllOption, { onClick: () => setCloseAllType("limit"), children: [
15259
- /* @__PURE__ */ jsx(CloseAllRadio, { $selected: closeAllType === "limit" }),
15260
- /* @__PURE__ */ jsx("span", { children: "Limit Sell at Mid Price" })
15261
- ] }),
15262
- /* @__PURE__ */ jsxs(CloseAllConfirmBtn, { onClick: () => {
15263
- positions.forEach((pos) => onClosePosition(pos.tokenName, closeAllType, pos.quantity, pos.marketPrice));
15264
- setCloseAllOpen(false);
15265
- }, children: [
15266
- "Confirm ",
15267
- closeAllType === "market" ? "Market" : "Limit",
15268
- " Sell"
15269
- ] })
15270
- ] }) }),
15271
- document.body
15272
- )
14854
+ positions.length > 0 && closeAllOpen && onClosePosition && /* @__PURE__ */ jsx(CloseAllOverlay, { onClick: () => setCloseAllOpen(false), children: /* @__PURE__ */ jsxs(CloseAllModal, { onClick: (e) => e.stopPropagation(), children: [
14855
+ /* @__PURE__ */ jsx(CloseAllModalX, { onClick: () => setCloseAllOpen(false), children: "\xD7" }),
14856
+ /* @__PURE__ */ jsx(CloseAllTitle, { children: "Confirm Sell All" }),
14857
+ /* @__PURE__ */ jsx(CloseAllDesc, { children: "This will sell all your positions and cancel their associated TP/SL orders." }),
14858
+ /* @__PURE__ */ jsxs(CloseAllOption, { onClick: () => setCloseAllType("market"), children: [
14859
+ /* @__PURE__ */ jsx(CloseAllRadio, { $selected: closeAllType === "market" }),
14860
+ /* @__PURE__ */ jsx("span", { children: "Market Sell" })
14861
+ ] }),
14862
+ /* @__PURE__ */ jsxs(CloseAllOption, { onClick: () => setCloseAllType("limit"), children: [
14863
+ /* @__PURE__ */ jsx(CloseAllRadio, { $selected: closeAllType === "limit" }),
14864
+ /* @__PURE__ */ jsx("span", { children: "Limit Sell at Mid Price" })
14865
+ ] }),
14866
+ /* @__PURE__ */ jsxs(CloseAllConfirmBtn, { onClick: () => {
14867
+ positions.forEach((pos) => onClosePosition(pos.tokenName, closeAllType, pos.quantity, pos.marketPrice));
14868
+ setCloseAllOpen(false);
14869
+ }, children: [
14870
+ "Confirm ",
14871
+ closeAllType === "market" ? "Market" : "Limit",
14872
+ " Sell"
14873
+ ] })
14874
+ ] }) })
15273
14875
  ] }),
15274
14876
  activeTab === "subscriptions" && /* @__PURE__ */ jsxs(Fragment, { children: [
15275
14877
  offeringOrders.length === 0 && /* @__PURE__ */ jsx(EmptyState, { children: "IPO allocations will appear here once you subscribe." }),
@@ -15726,63 +15328,57 @@ function PortfolioActivityPanel({
15726
15328
  ] }),
15727
15329
  /* @__PURE__ */ jsx(PaginationBtn, { disabled: currentPage >= totalPages - 1, onClick: () => setCurrentPage((p) => p + 1), children: "Next \u203A" })
15728
15330
  ] }),
15729
- cancelAllConfirmOpen && typeof document !== "undefined" && createPortal(
15730
- /* @__PURE__ */ jsx(CancelConfirmOverlay, { onClick: () => setCancelAllConfirmOpen(false), children: /* @__PURE__ */ jsxs(CancelConfirmModal, { onClick: (e) => e.stopPropagation(), children: [
15731
- /* @__PURE__ */ jsx(CancelConfirmTitle, { children: "Cancel All Orders" }),
15732
- /* @__PURE__ */ jsxs(CancelConfirmBody, { children: [
15733
- "Are you sure you want to cancel all ",
15734
- openOrdersCount,
15735
- " open orders? This action cannot be undone."
15736
- ] }),
15737
- /* @__PURE__ */ jsxs(CancelConfirmActions, { children: [
15738
- /* @__PURE__ */ jsx(CancelConfirmDismiss, { type: "button", onClick: () => setCancelAllConfirmOpen(false), children: "Keep Orders" }),
15739
- /* @__PURE__ */ jsx(
15740
- CancelConfirmProceed,
15741
- {
15742
- type: "button",
15743
- disabled: cancellingAll,
15744
- onClick: async () => {
15745
- if (onCancelAllOrders) {
15746
- setCancellingAll(true);
15747
- try {
15748
- await onCancelAllOrders();
15749
- } finally {
15750
- setCancellingAll(false);
15751
- }
15752
- }
15753
- setCancelAllConfirmOpen(false);
15754
- },
15755
- children: cancellingAll ? "Cancelling\u2026" : "Yes, Cancel All"
15756
- }
15757
- )
15758
- ] })
15759
- ] }) }),
15760
- document.body
15761
- ),
15762
- pendingCancelOrderId !== null && typeof document !== "undefined" && createPortal(
15763
- /* @__PURE__ */ jsx(CancelConfirmOverlay, { onClick: () => setPendingCancelOrderId(null), children: /* @__PURE__ */ jsxs(CancelConfirmModal, { onClick: (e) => e.stopPropagation(), children: [
15764
- /* @__PURE__ */ jsx(CancelConfirmTitle, { children: "Cancel Order" }),
15765
- /* @__PURE__ */ jsx(CancelConfirmBody, { children: "Are you sure you want to cancel this order? This action cannot be undone." }),
15766
- /* @__PURE__ */ jsxs(CancelConfirmActions, { children: [
15767
- /* @__PURE__ */ jsx(CancelConfirmDismiss, { type: "button", onClick: () => setPendingCancelOrderId(null), children: "Keep Order" }),
15768
- /* @__PURE__ */ jsx(
15769
- CancelConfirmProceed,
15770
- {
15771
- type: "button",
15772
- disabled: cancellingOrderId != null,
15773
- onClick: async () => {
15774
- if (onCancelOrder && pendingCancelOrderId !== null) {
15775
- await onCancelOrder(pendingCancelOrderId);
15331
+ cancelAllConfirmOpen && /* @__PURE__ */ jsx(CancelConfirmOverlay, { onClick: () => setCancelAllConfirmOpen(false), children: /* @__PURE__ */ jsxs(CancelConfirmModal, { onClick: (e) => e.stopPropagation(), children: [
15332
+ /* @__PURE__ */ jsx(CancelConfirmTitle, { children: "Cancel All Orders" }),
15333
+ /* @__PURE__ */ jsxs(CancelConfirmBody, { children: [
15334
+ "Are you sure you want to cancel all ",
15335
+ openOrdersCount,
15336
+ " open orders? This action cannot be undone."
15337
+ ] }),
15338
+ /* @__PURE__ */ jsxs(CancelConfirmActions, { children: [
15339
+ /* @__PURE__ */ jsx(CancelConfirmDismiss, { type: "button", onClick: () => setCancelAllConfirmOpen(false), children: "Keep Orders" }),
15340
+ /* @__PURE__ */ jsx(
15341
+ CancelConfirmProceed,
15342
+ {
15343
+ type: "button",
15344
+ disabled: cancellingAll,
15345
+ onClick: async () => {
15346
+ if (onCancelAllOrders) {
15347
+ setCancellingAll(true);
15348
+ try {
15349
+ await onCancelAllOrders();
15350
+ } finally {
15351
+ setCancellingAll(false);
15776
15352
  }
15777
- setPendingCancelOrderId(null);
15778
- },
15779
- children: cancellingOrderId === pendingCancelOrderId ? "Cancelling\u2026" : "Yes, Cancel"
15780
- }
15781
- )
15782
- ] })
15783
- ] }) }),
15784
- document.body
15785
- )
15353
+ }
15354
+ setCancelAllConfirmOpen(false);
15355
+ },
15356
+ children: cancellingAll ? "Cancelling\u2026" : "Yes, Cancel All"
15357
+ }
15358
+ )
15359
+ ] })
15360
+ ] }) }),
15361
+ pendingCancelOrderId !== null && /* @__PURE__ */ jsx(CancelConfirmOverlay, { onClick: () => setPendingCancelOrderId(null), children: /* @__PURE__ */ jsxs(CancelConfirmModal, { onClick: (e) => e.stopPropagation(), children: [
15362
+ /* @__PURE__ */ jsx(CancelConfirmTitle, { children: "Cancel Order" }),
15363
+ /* @__PURE__ */ jsx(CancelConfirmBody, { children: "Are you sure you want to cancel this order? This action cannot be undone." }),
15364
+ /* @__PURE__ */ jsxs(CancelConfirmActions, { children: [
15365
+ /* @__PURE__ */ jsx(CancelConfirmDismiss, { type: "button", onClick: () => setPendingCancelOrderId(null), children: "Keep Order" }),
15366
+ /* @__PURE__ */ jsx(
15367
+ CancelConfirmProceed,
15368
+ {
15369
+ type: "button",
15370
+ disabled: cancellingOrderId != null,
15371
+ onClick: async () => {
15372
+ if (onCancelOrder && pendingCancelOrderId !== null) {
15373
+ await onCancelOrder(pendingCancelOrderId);
15374
+ }
15375
+ setPendingCancelOrderId(null);
15376
+ },
15377
+ children: cancellingOrderId === pendingCancelOrderId ? "Cancelling\u2026" : "Yes, Cancel"
15378
+ }
15379
+ )
15380
+ ] })
15381
+ ] }) })
15786
15382
  ] });
15787
15383
  }
15788
15384
  var Container2 = styled10.div`
@@ -15853,7 +15449,7 @@ var Tab = styled10.button`
15853
15449
  }
15854
15450
  `;
15855
15451
  var TabCount = styled10.span`
15856
- color: var(--color-accent, #E6C87E);
15452
+ color: #E6C656;
15857
15453
  font-weight: 600;
15858
15454
  margin-left: 2px;
15859
15455
  `;
@@ -16038,8 +15634,7 @@ var CancelConfirmOverlay = styled10.div`
16038
15634
  display: flex;
16039
15635
  align-items: center;
16040
15636
  justify-content: center;
16041
- /* Above the trade page's fullscreen/sticky layers (TradePage.css uses up to 10001). */
16042
- z-index: 10050;
15637
+ z-index: 1000;
16043
15638
  `;
16044
15639
  var CancelConfirmModal = styled10.div`
16045
15640
  background: #1a1a1a;
@@ -16153,8 +15748,7 @@ var CloseAllOverlay = styled10.div`
16153
15748
  display: flex;
16154
15749
  align-items: center;
16155
15750
  justify-content: center;
16156
- /* Above the trade page's fullscreen/sticky layers (TradePage.css uses up to 10001). */
16157
- z-index: 10050;
15751
+ z-index: 1000;
16158
15752
  `;
16159
15753
  var CloseAllModal = styled10.div`
16160
15754
  background: #1a1a1a;