@loafmarkets/ui 0.1.404 → 0.1.405

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
@@ -5076,7 +5076,6 @@ var Header = ({
5076
5076
  onOrdersNavigate: _onOrdersNavigate,
5077
5077
  onWalletNavigate: _onWalletNavigate,
5078
5078
  onSettingsClick,
5079
- onReferClick,
5080
5079
  portfolioSummary,
5081
5080
  fundsPending = false,
5082
5081
  transparentOnTop = false,
@@ -5515,7 +5514,7 @@ var Header = ({
5515
5514
  onClick: (event) => {
5516
5515
  event?.preventDefault();
5517
5516
  closeMenus();
5518
- (onReferClick ?? onSettingsClick)?.();
5517
+ onSettingsClick?.();
5519
5518
  },
5520
5519
  children: "Refer"
5521
5520
  }
@@ -5558,7 +5557,7 @@ var Header = ({
5558
5557
  onClick: (event) => {
5559
5558
  event?.preventDefault();
5560
5559
  closeMenus();
5561
- (onReferClick ?? onSettingsClick)?.();
5560
+ onSettingsClick?.();
5562
5561
  },
5563
5562
  children: /* @__PURE__ */ jsx(MenuItem, { children: "Refer" })
5564
5563
  }
@@ -7551,7 +7550,6 @@ var LoginPopup = ({
7551
7550
  ] })
7552
7551
  ] });
7553
7552
  if (gate) {
7554
- const codeAccepted = codeStatus === "valid";
7555
7553
  const showSignIn = signInMode || signInRevealed;
7556
7554
  return /* @__PURE__ */ jsxs(GateShell, { children: [
7557
7555
  /* @__PURE__ */ jsx(GateTint, { $reveal: showSignIn ? 1 : 0 }),
@@ -7577,35 +7575,30 @@ var LoginPopup = ({
7577
7575
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
7578
7576
  /* @__PURE__ */ jsxs(CodeInputWrapper, { $status: codeStatus, children: [
7579
7577
  /* @__PURE__ */ jsx(CodePrefix, { children: CODE_PREFIX }),
7580
- codeInput,
7581
- /* @__PURE__ */ jsx(
7582
- GateSubmit,
7583
- {
7584
- type: "button",
7585
- "aria-label": "Submit access code",
7586
- $status: codeStatus,
7587
- disabled: codeStatus === "checking" || !codeComplete,
7588
- onClick: () => void runCodeValidation(referralCode),
7589
- 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" }) })
7590
- }
7591
- )
7578
+ codeInput
7592
7579
  ] }),
7593
7580
  (codeStatus === "invalid" || error && !signInRevealed) && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: error || "That code isn't valid. Double-check and try again." }),
7594
- signInRevealed ? signInStep : /* @__PURE__ */ jsxs(GateResendText, { children: [
7595
- "Already have an account?",
7596
- " ",
7597
- /* @__PURE__ */ jsx(
7598
- "button",
7599
- {
7600
- type: "button",
7601
- onClick: () => {
7602
- setError("");
7603
- setIsSignUp(false);
7604
- setSignInMode(true);
7605
- },
7606
- children: "Sign in"
7607
- }
7608
- )
7581
+ signInRevealed ? signInStep : /* @__PURE__ */ jsxs(Fragment, { children: [
7582
+ /* @__PURE__ */ jsxs(GateResendText, { children: [
7583
+ "Already have an account?",
7584
+ " ",
7585
+ /* @__PURE__ */ jsx(
7586
+ "button",
7587
+ {
7588
+ type: "button",
7589
+ onClick: () => {
7590
+ setError("");
7591
+ setIsSignUp(false);
7592
+ setSignInMode(true);
7593
+ },
7594
+ children: "Sign in"
7595
+ }
7596
+ )
7597
+ ] }),
7598
+ /* @__PURE__ */ jsxs(GateEarlyAccess, { href: "https://loafmarkets.com/?waitlist=1", children: [
7599
+ "Signup for early access",
7600
+ /* @__PURE__ */ jsx("svg", { 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
+ ] })
7609
7602
  ] })
7610
7603
  ] })
7611
7604
  ] })
@@ -7682,12 +7675,12 @@ var LoginPopup = ({
7682
7675
  marginBottom: "1.25rem"
7683
7676
  }, children: [
7684
7677
  /* @__PURE__ */ jsx("div", { style: { width: 7, height: 7, borderRadius: "50%", background: "#0052FF", flexShrink: 0 } }),
7685
- /* @__PURE__ */ jsx("span", { style: { fontSize: "0.72rem", fontWeight: 600, color: "#6b9fff", letterSpacing: "0.02em" }, children: "Arbitrum Sepolia" })
7678
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "0.72rem", fontWeight: 600, color: "#6b9fff", letterSpacing: "0.02em" }, children: "Base Sepolia" })
7686
7679
  ] }),
7687
7680
  /* @__PURE__ */ jsxs("p", { style: { fontSize: "0.82rem", color: "rgba(255,255,255,0.5)", textAlign: "center", marginBottom: "1.1rem", lineHeight: 1.5, maxWidth: 320 }, children: [
7688
7681
  "Send ",
7689
7682
  /* @__PURE__ */ jsx("strong", { style: { color: "rgba(255,255,255,0.8)" }, children: "USDC" }),
7690
- " on Arbitrum Sepolia to the address below. Only send on this network."
7683
+ " on Base Sepolia to the address below. Only send on this network."
7691
7684
  ] }),
7692
7685
  /* @__PURE__ */ jsxs("div", { style: {
7693
7686
  width: "100%",
@@ -8228,6 +8221,33 @@ var GateResendText = styled10.p`
8228
8221
  font-size: inherit;
8229
8222
  }
8230
8223
  `;
8224
+ var GateEarlyAccess = styled10.a`
8225
+ display: inline-flex;
8226
+ align-items: center;
8227
+ gap: 0.4rem;
8228
+ margin-top: 0.15rem;
8229
+ color: var(--color-text-secondary, #848e9c);
8230
+ font-size: 0.8rem;
8231
+ font-weight: 500;
8232
+ letter-spacing: 0.02em;
8233
+ text-decoration: none;
8234
+ cursor: pointer;
8235
+ transition: color 0.15s ease;
8236
+
8237
+ svg {
8238
+ width: 13px;
8239
+ height: 13px;
8240
+ transition: transform 0.15s ease;
8241
+ }
8242
+
8243
+ &:hover {
8244
+ color: var(--color-accent, #E6C87E);
8245
+ }
8246
+
8247
+ &:hover svg {
8248
+ transform: translateX(3px);
8249
+ }
8250
+ `;
8231
8251
  var GateSubmit = styled10.button`
8232
8252
  display: flex;
8233
8253
  align-items: center;
@@ -10305,7 +10325,7 @@ function PropertyOverview({
10305
10325
  isLoading = false,
10306
10326
  ticker,
10307
10327
  contractAddress,
10308
- chain = "Arbitrum (Ethereum L2)",
10328
+ chain = "Base (Ethereum L2)",
10309
10329
  volume24h,
10310
10330
  priceHistory: priceHistoryProp,
10311
10331
  beta = false,
@@ -10344,13 +10364,13 @@ function PropertyOverview({
10344
10364
  const resolvedPropertyType = rawPropertyType?.toLowerCase() === "house" ? "Residential" : rawPropertyType;
10345
10365
  const galleryImages = images ?? [];
10346
10366
  const chainValue = /* @__PURE__ */ jsxs(ChainLogos, { children: [
10347
- /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Arbitrum-Symbol.svg", alt: "Arbitrum" }),
10367
+ /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Base-Symbol.png", alt: "Base" }),
10348
10368
  /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Ethereum-Logo.png", alt: "Ethereum", style: { filter: "brightness(0) invert(1)" } }),
10349
10369
  /* @__PURE__ */ jsx("span", { children: chain })
10350
10370
  ] });
10351
10371
  const tokenDetailsItems = [
10352
10372
  { label: "Chain", value: chainValue },
10353
- { label: "On-Chain Address", value: contractAddress ? truncateAddress(contractAddress) : "\u2014", mono: true, link: contractAddress ? `https://sepolia.arbiscan.io/address/${contractAddress}` : void 0, copyValue: contractAddress },
10373
+ { label: "On-Chain Address", value: contractAddress ? truncateAddress(contractAddress) : "\u2014", mono: true, link: contractAddress ? `https://sepolia.basescan.org/address/${contractAddress}` : void 0, copyValue: contractAddress },
10354
10374
  { label: "Token Ticker", value: ticker ?? "\u2014" },
10355
10375
  { label: "Total Circulating Tokens", value: isLoading && resolvedTokensIssued == null ? loadingSkeleton : resolvedTokensIssued?.toLocaleString() ?? "\u2014" },
10356
10376
  { label: "Legal Structuring", value: "See Documents", docLink: true },
@@ -10370,9 +10390,7 @@ function PropertyOverview({
10370
10390
  ];
10371
10391
  const growthPct = overviewData?.growth5Yr;
10372
10392
  const propertyStats = [
10373
- // Property Value = the API offeringValuation (OverviewResponse.offeringValuation), NOT
10374
- // midPrice×tokensIssued market cap (fixed 2026-07-22). null → '—', never a fabricated cap.
10375
- { label: "Property Value", value: isLoading && overviewData?.offeringValuation == null ? loadingSkeleton : overviewData?.offeringValuation ? fmtDollar(overviewData.offeringValuation) : "\u2014" },
10393
+ { label: "Property Value", value: isLoading && tokenMarketCap == null ? loadingSkeleton : tokenMarketCap ? fmtDollar(tokenMarketCap) : "\u2014" },
10376
10394
  ...beta ? [] : [{ label: "Offers", value: "3" }],
10377
10395
  { label: "Growth (5yr)", value: growthPct != null ? `${growthPct > 0 ? "+" : ""}${growthPct}%` : "\u2014" },
10378
10396
  { label: "Last Dividend", value: overviewData?.lastDividend != null ? `$${overviewData.lastDividend.toFixed(2)}` : "\u2014" },
@@ -14873,7 +14891,7 @@ var getOrderStatusMeta = (statusRaw) => {
14873
14891
  return { color: "#E6C87E", bg: "rgba(240,185,11,0.15)" };
14874
14892
  };
14875
14893
  var ChevronDown = () => /* @__PURE__ */ jsx("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "rgba(255,255,255,0.5)", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" }) });
14876
- var ArbiscanIconLink = ({ url }) => /* @__PURE__ */ jsx(TxLink, { href: url, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
14894
+ var BaseScanIconLink = ({ url }) => /* @__PURE__ */ jsx(TxLink, { href: url, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
14877
14895
  /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
14878
14896
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
14879
14897
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -14898,7 +14916,7 @@ function PortfolioActivityPanel({
14898
14916
  defaultTab,
14899
14917
  onTabChange,
14900
14918
  pageSize = ACTIVITY_PAGE_SIZE_DEFAULT,
14901
- blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.arbiscan.io/tx",
14919
+ blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.basescan.org/tx",
14902
14920
  className,
14903
14921
  style
14904
14922
  }) {
@@ -15342,7 +15360,7 @@ function PortfolioActivityPanel({
15342
15360
  /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15343
15361
  formatNumber2(order.quantity),
15344
15362
  order.ticker && /* @__PURE__ */ jsx(TickerTag, { style: { marginLeft: 0 }, children: order.ticker.toUpperCase() }),
15345
- order.txHash && /* @__PURE__ */ jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15363
+ order.txHash && /* @__PURE__ */ jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15346
15364
  ] })
15347
15365
  ] }),
15348
15366
  /* @__PURE__ */ jsxs(CUnitsCell, { children: [
@@ -15395,7 +15413,7 @@ function PortfolioActivityPanel({
15395
15413
  order.status === "REJECTED" && order.rejectionReason && /* @__PURE__ */ jsx(CellText, { $muted: true, style: { fontSize: "0.62rem", marginTop: "0.2rem", maxWidth: "120px", overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }, title: order.rejectionReason, children: order.rejectionReason })
15396
15414
  ] }),
15397
15415
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(order.createdAt) }) }),
15398
- /* @__PURE__ */ jsx(GridCell, { children: order.txHash && /* @__PURE__ */ jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${order.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15416
+ /* @__PURE__ */ jsx(GridCell, { children: order.txHash && /* @__PURE__ */ jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${order.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15399
15417
  /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15400
15418
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15401
15419
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15639,7 +15657,7 @@ function PortfolioActivityPanel({
15639
15657
  /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15640
15658
  formatNumber2(trade.quantity),
15641
15659
  trade.ticker && /* @__PURE__ */ jsx(TickerTag, { style: { marginLeft: 0 }, children: trade.ticker.toUpperCase() }),
15642
- trade.txHash && /* @__PURE__ */ jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15660
+ trade.txHash && /* @__PURE__ */ jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15643
15661
  ] })
15644
15662
  ] }),
15645
15663
  /* @__PURE__ */ jsxs(CUnitsCell, { children: [
@@ -15706,7 +15724,7 @@ function PortfolioActivityPanel({
15706
15724
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { children: formatCurrency4(trade.price * trade.quantity) }) }),
15707
15725
  /* @__PURE__ */ jsx(GridCell, { children: settlementMeta ? /* @__PURE__ */ jsx(ActivityTag, { $color: settlementMeta.color, $bg: settlementMeta.bg, children: settlementLabel }) : /* @__PURE__ */ jsx(CellText, { $muted: true, children: "\u2014" }) }),
15708
15726
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(trade.executedAt) }) }),
15709
- /* @__PURE__ */ jsx(GridCell, { children: trade.txHash && /* @__PURE__ */ jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${trade.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15727
+ /* @__PURE__ */ jsx(GridCell, { children: trade.txHash && /* @__PURE__ */ jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${trade.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15710
15728
  /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15711
15729
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15712
15730
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15753,7 +15771,7 @@ function PortfolioActivityPanel({
15753
15771
  /* @__PURE__ */ jsx(CDValue, { children: formatTimestamp(t.createdAt) })
15754
15772
  ] })
15755
15773
  ] }),
15756
- txUrl && /* @__PURE__ */ jsx(CExpandedLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: "View on Arbiscan \u2197" })
15774
+ txUrl && /* @__PURE__ */ jsx(CExpandedLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: "View on BaseScan \u2197" })
15757
15775
  ] })
15758
15776
  ] }, rowKey);
15759
15777
  }),
@@ -15779,7 +15797,7 @@ function PortfolioActivityPanel({
15779
15797
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatAddress(t.address) }) }),
15780
15798
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(ActivityTag, { $color: statusMeta.color, $bg: statusMeta.bg, children: prettyLabel(t.status) }) }),
15781
15799
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(t.createdAt) }) }),
15782
- /* @__PURE__ */ jsx(GridCell, { children: txUrl && /* @__PURE__ */ jsx(TxLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15800
+ /* @__PURE__ */ jsx(GridCell, { children: txUrl && /* @__PURE__ */ jsx(TxLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15783
15801
  /* @__PURE__ */ jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15784
15802
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15785
15803
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -18882,14 +18900,13 @@ var CloseButton3 = styled10.button`
18882
18900
  var MainImageContainer = styled10.div`
18883
18901
  position: relative;
18884
18902
  flex: 1;
18885
- min-height: 0;
18886
18903
  display: flex;
18887
18904
  align-items: center;
18888
18905
  justify-content: center;
18889
- padding: 20px 20px 160px;
18906
+ padding: 80px 20px 140px;
18890
18907
 
18891
18908
  @media (max-width: 768px) {
18892
- padding: 10px 0 130px;
18909
+ padding: 60px 0 110px;
18893
18910
  }
18894
18911
  `;
18895
18912
  var MainImage = styled10.img`
@@ -18901,11 +18918,8 @@ var MainImage = styled10.img`
18901
18918
  opacity: ${(p) => p.$visible ? 1 : 0};
18902
18919
  pointer-events: ${(p) => p.$visible ? "auto" : "none"};
18903
18920
  transition: opacity 300ms ease;
18904
- /* All slides share the same absolute box so switching only crossfades opacity
18905
- no relative↔absolute size jump (the "grow then shrink" on navigation).
18906
- The inset box excludes the bottom thumbnail strip so margin:auto centres the image
18907
- in the space ABOVE the thumbnails (absolute positioning ignores the parent's padding,
18908
- which otherwise let the image sink behind the thumbnails / "lean down"). */
18921
+ /* Inset box excludes the bottom thumbnail strip so margin:auto centres the image in the
18922
+ space ABOVE the thumbnails (absolute ignores the parent's padding). */
18909
18923
  position: absolute;
18910
18924
  top: 24px;
18911
18925
  left: 24px;
@@ -19099,11 +19113,9 @@ function PropertyPhotoGallery({
19099
19113
  isOpen,
19100
19114
  onClose,
19101
19115
  startIndex = 0,
19102
- startWithVideo = false,
19103
19116
  title = "28 Derby Street, Vaucluse",
19104
19117
  subtitle = "Elara \u2014 Luxury Harbour Residence",
19105
- images,
19106
- videoUrl
19118
+ images
19107
19119
  }) {
19108
19120
  const galleryImages = images?.length ? images : DEFAULT_IMAGES;
19109
19121
  if (!isOpen) return null;
@@ -19112,19 +19124,16 @@ function PropertyPhotoGallery({
19112
19124
  {
19113
19125
  galleryImages,
19114
19126
  startIndex,
19115
- startWithVideo,
19116
19127
  title,
19117
19128
  subtitle,
19118
- onClose,
19119
- videoUrl
19129
+ onClose
19120
19130
  },
19121
- `${startIndex}-${galleryImages.length}-${startWithVideo}`
19131
+ `${startIndex}-${galleryImages.length}`
19122
19132
  );
19123
19133
  }
19124
- function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subtitle, onClose, videoUrl }) {
19134
+ function GalleryContent({ galleryImages, startIndex, title, subtitle, onClose }) {
19125
19135
  const [currentIndex, setCurrentIndex] = useState(() => clampIndex(startIndex, galleryImages.length));
19126
19136
  const [activeHotspotId, setActiveHotspotId] = useState(null);
19127
- const [showVideo, setShowVideo] = useState(startWithVideo ?? false);
19128
19137
  const sliderRef = useRef(null);
19129
19138
  const [isDragging, setIsDragging] = useState(false);
19130
19139
  const wasDraggingRef = useRef(false);
@@ -19174,7 +19183,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19174
19183
  ] }),
19175
19184
  /* @__PURE__ */ jsx(CloseButton3, { onClick: onClose, "aria-label": "Close gallery", children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "22", height: "22", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "M6 6l12 12M6 18L18 6" }) }) })
19176
19185
  ] }),
19177
- !showVideo && /* @__PURE__ */ jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19186
+ /* @__PURE__ */ jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19178
19187
  /* @__PURE__ */ jsxs(
19179
19188
  SliderTrack,
19180
19189
  {
@@ -19237,21 +19246,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19237
19246
  children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "22", height: "22", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { d: "M15 18l-6-6 6-6" }) })
19238
19247
  }
19239
19248
  ),
19240
- showVideo && videoUrl ? /* @__PURE__ */ jsx(GalleryVideoWrap, { children: /* @__PURE__ */ jsx(
19241
- "video",
19242
- {
19243
- autoPlay: true,
19244
- loop: true,
19245
- playsInline: true,
19246
- muted: true,
19247
- controls: true,
19248
- onVolumeChange: (e) => {
19249
- if (!e.currentTarget.muted) e.currentTarget.muted = true;
19250
- },
19251
- style: { objectFit: "contain", borderRadius: 12, boxShadow: "0 30px 80px rgba(0,0,0,0.55)" },
19252
- children: /* @__PURE__ */ jsx("source", { src: videoUrl, type: "video/mp4" })
19253
- }
19254
- ) }) : galleryImages.map((image, idx) => /* @__PURE__ */ jsx(MainImage, { src: image.src, alt: image.alt, $visible: idx === currentIndex }, image.alt)),
19249
+ galleryImages.map((image, idx) => /* @__PURE__ */ jsx(MainImage, { src: image.src, alt: image.alt, $visible: idx === currentIndex }, image.alt)),
19255
19250
  galleryImages[currentIndex]?.hotspots?.map((hotspot) => /* @__PURE__ */ jsx(
19256
19251
  Hotspot,
19257
19252
  {
@@ -19296,83 +19291,11 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19296
19291
  ]
19297
19292
  }
19298
19293
  ),
19299
- /* @__PURE__ */ jsxs(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: [
19300
- galleryImages.map((image, idx) => /* @__PURE__ */ jsx(Thumbnail3, { $active: !showVideo && idx === currentIndex, onClick: () => {
19301
- setShowVideo(false);
19302
- setCurrentIndex(idx);
19303
- }, "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsx("img", { src: image.src, alt: image.alt }) }, image.alt)),
19304
- videoUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
19305
- /* @__PURE__ */ jsx(ThumbnailDivider, {}),
19306
- /* @__PURE__ */ jsxs(VideoBtn, { $active: showVideo, onClick: () => setShowVideo(true), children: [
19307
- /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
19308
- /* @__PURE__ */ jsx("rect", { x: "2", y: "4", width: "14", height: "16", rx: "2" }),
19309
- /* @__PURE__ */ jsx("path", { d: "M16 8l6-4v16l-6-4z" })
19310
- ] }),
19311
- "Video"
19312
- ] })
19313
- ] })
19314
- ] })
19294
+ /* @__PURE__ */ jsx(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: galleryImages.map((image, idx) => /* @__PURE__ */ jsx(Thumbnail3, { $active: idx === currentIndex, onClick: () => setCurrentIndex(idx), "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsx("img", { src: image.src, alt: image.alt }) }, image.alt)) })
19315
19295
  ]
19316
19296
  }
19317
19297
  );
19318
19298
  }
19319
- var GalleryVideoWrap = styled10.div`
19320
- position: absolute;
19321
- inset: 0;
19322
- display: flex;
19323
- align-items: center;
19324
- justify-content: center;
19325
- padding: 20px 20px 160px;
19326
-
19327
- video {
19328
- max-width: 90%;
19329
- max-height: 100%;
19330
- }
19331
-
19332
- /* Property videos stay permanently muted — remove the volume + mute buttons
19333
- from the native player (Chrome/Edge/Safari/iOS/Android). Firefox ignores
19334
- these and is covered by the onVolumeChange force-mute fallback. */
19335
- video::-webkit-media-controls-mute-button,
19336
- video::-webkit-media-controls-volume-slider,
19337
- video::-webkit-media-controls-volume-control-container {
19338
- display: none !important;
19339
- }
19340
-
19341
- @media (max-width: 768px) {
19342
- padding: 10px 0 130px;
19343
-
19344
- video {
19345
- max-width: 100%;
19346
- }
19347
- }
19348
- `;
19349
- var ThumbnailDivider = styled10.div`
19350
- width: 1px;
19351
- height: 48px;
19352
- background: rgba(255, 255, 255, 0.15);
19353
- flex-shrink: 0;
19354
- align-self: center;
19355
- `;
19356
- var VideoBtn = styled10.button`
19357
- display: flex;
19358
- align-items: center;
19359
- gap: 6px;
19360
- padding: 8px 14px;
19361
- border-radius: 8px;
19362
- border: 1px solid ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "rgba(255, 255, 255, 0.2)"};
19363
- background: ${(p) => p.$active ? "rgba(240, 185, 11, 0.15)" : "rgba(255, 255, 255, 0.08)"};
19364
- color: ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "#fff"};
19365
- font-size: 0.82rem;
19366
- font-weight: 500;
19367
- cursor: pointer;
19368
- flex-shrink: 0;
19369
- transition: all 0.2s ease;
19370
-
19371
- &:hover {
19372
- background: rgba(255, 255, 255, 0.15);
19373
- border-color: rgba(255, 255, 255, 0.3);
19374
- }
19375
- `;
19376
19299
  var slideIn2 = keyframes`
19377
19300
  from { transform: translateX(110%); opacity: 0; }
19378
19301
  to { transform: translateX(0); opacity: 1; }
@@ -19541,7 +19464,7 @@ var Container3 = styled10.div`
19541
19464
  gap: 8px;
19542
19465
  }
19543
19466
  `;
19544
- var DEFAULT_EXPLORER = "https://sepolia.arbiscan.io/tx/";
19467
+ var DEFAULT_EXPLORER = "https://sepolia.basescan.org/tx/";
19545
19468
  function truncateHash(hash) {
19546
19469
  return `${hash.slice(0, 6)}\u2026${hash.slice(-4)}`;
19547
19470
  }
@@ -20108,7 +20031,8 @@ var SiteFooter = () => {
20108
20031
  /* @__PURE__ */ jsxs(LegalLinks, { children: [
20109
20032
  /* @__PURE__ */ jsx(LegalLink, { href: "/privacy", children: "Privacy Policy" }),
20110
20033
  /* @__PURE__ */ jsx(LegalLink, { href: "/terms", children: "Terms of Use" }),
20111
- /* @__PURE__ */ jsx(LegalLink, { href: "/cookies", children: "Cookie Policy" })
20034
+ /* @__PURE__ */ jsx(LegalLink, { href: "/cookies", children: "Cookie Policy" }),
20035
+ /* @__PURE__ */ jsx(LegalLink, { href: "/risk", children: "Risk Warning" })
20112
20036
  ] })
20113
20037
  ] }),
20114
20038
  /* @__PURE__ */ jsx(Disclaimer2, { children: /* @__PURE__ */ jsx(DisclaimerText, { children: "Warning: Digital asset prices can be volatile. The value of your investment can go down or up and you may not get back the amount invested. Past gains are not indicative of future returns. You are solely responsible for your investment decisions and Loaf is not liable for any losses you may incur. The information here should not be regarded as financial or investment advice. For more information, see our Terms of Use and Risk Warning." }) })