@loafmarkets/ui 0.1.403 → 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
@@ -7550,7 +7550,6 @@ var LoginPopup = ({
7550
7550
  ] })
7551
7551
  ] });
7552
7552
  if (gate) {
7553
- const codeAccepted = codeStatus === "valid";
7554
7553
  const showSignIn = signInMode || signInRevealed;
7555
7554
  return /* @__PURE__ */ jsxs(GateShell, { children: [
7556
7555
  /* @__PURE__ */ jsx(GateTint, { $reveal: showSignIn ? 1 : 0 }),
@@ -7576,35 +7575,30 @@ var LoginPopup = ({
7576
7575
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
7577
7576
  /* @__PURE__ */ jsxs(CodeInputWrapper, { $status: codeStatus, children: [
7578
7577
  /* @__PURE__ */ jsx(CodePrefix, { children: CODE_PREFIX }),
7579
- codeInput,
7580
- /* @__PURE__ */ jsx(
7581
- GateSubmit,
7582
- {
7583
- type: "button",
7584
- "aria-label": "Submit access code",
7585
- $status: codeStatus,
7586
- disabled: codeStatus === "checking" || !codeComplete,
7587
- onClick: () => void runCodeValidation(referralCode),
7588
- 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" }) })
7589
- }
7590
- )
7578
+ codeInput
7591
7579
  ] }),
7592
7580
  (codeStatus === "invalid" || error && !signInRevealed) && /* @__PURE__ */ jsx(StatusMessage, { $error: true, children: error || "That code isn't valid. Double-check and try again." }),
7593
- signInRevealed ? signInStep : /* @__PURE__ */ jsxs(GateResendText, { children: [
7594
- "Already have an account?",
7595
- " ",
7596
- /* @__PURE__ */ jsx(
7597
- "button",
7598
- {
7599
- type: "button",
7600
- onClick: () => {
7601
- setError("");
7602
- setIsSignUp(false);
7603
- setSignInMode(true);
7604
- },
7605
- children: "Sign in"
7606
- }
7607
- )
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
+ ] })
7608
7602
  ] })
7609
7603
  ] })
7610
7604
  ] })
@@ -7681,12 +7675,12 @@ var LoginPopup = ({
7681
7675
  marginBottom: "1.25rem"
7682
7676
  }, children: [
7683
7677
  /* @__PURE__ */ jsx("div", { style: { width: 7, height: 7, borderRadius: "50%", background: "#0052FF", flexShrink: 0 } }),
7684
- /* @__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" })
7685
7679
  ] }),
7686
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: [
7687
7681
  "Send ",
7688
7682
  /* @__PURE__ */ jsx("strong", { style: { color: "rgba(255,255,255,0.8)" }, children: "USDC" }),
7689
- " 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."
7690
7684
  ] }),
7691
7685
  /* @__PURE__ */ jsxs("div", { style: {
7692
7686
  width: "100%",
@@ -8227,6 +8221,33 @@ var GateResendText = styled10.p`
8227
8221
  font-size: inherit;
8228
8222
  }
8229
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
+ `;
8230
8251
  var GateSubmit = styled10.button`
8231
8252
  display: flex;
8232
8253
  align-items: center;
@@ -10304,7 +10325,7 @@ function PropertyOverview({
10304
10325
  isLoading = false,
10305
10326
  ticker,
10306
10327
  contractAddress,
10307
- chain = "Arbitrum (Ethereum L2)",
10328
+ chain = "Base (Ethereum L2)",
10308
10329
  volume24h,
10309
10330
  priceHistory: priceHistoryProp,
10310
10331
  beta = false,
@@ -10343,13 +10364,13 @@ function PropertyOverview({
10343
10364
  const resolvedPropertyType = rawPropertyType?.toLowerCase() === "house" ? "Residential" : rawPropertyType;
10344
10365
  const galleryImages = images ?? [];
10345
10366
  const chainValue = /* @__PURE__ */ jsxs(ChainLogos, { children: [
10346
- /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Arbitrum-Symbol.svg", alt: "Arbitrum" }),
10367
+ /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Base-Symbol.png", alt: "Base" }),
10347
10368
  /* @__PURE__ */ jsx(ChainLogoImg, { src: "/Ethereum-Logo.png", alt: "Ethereum", style: { filter: "brightness(0) invert(1)" } }),
10348
10369
  /* @__PURE__ */ jsx("span", { children: chain })
10349
10370
  ] });
10350
10371
  const tokenDetailsItems = [
10351
10372
  { label: "Chain", value: chainValue },
10352
- { 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 },
10353
10374
  { label: "Token Ticker", value: ticker ?? "\u2014" },
10354
10375
  { label: "Total Circulating Tokens", value: isLoading && resolvedTokensIssued == null ? loadingSkeleton : resolvedTokensIssued?.toLocaleString() ?? "\u2014" },
10355
10376
  { label: "Legal Structuring", value: "See Documents", docLink: true },
@@ -10369,9 +10390,7 @@ function PropertyOverview({
10369
10390
  ];
10370
10391
  const growthPct = overviewData?.growth5Yr;
10371
10392
  const propertyStats = [
10372
- // Property Value = the API offeringValuation (OverviewResponse.offeringValuation), NOT
10373
- // midPrice×tokensIssued market cap (fixed 2026-07-22). null → '—', never a fabricated cap.
10374
- { 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" },
10375
10394
  ...beta ? [] : [{ label: "Offers", value: "3" }],
10376
10395
  { label: "Growth (5yr)", value: growthPct != null ? `${growthPct > 0 ? "+" : ""}${growthPct}%` : "\u2014" },
10377
10396
  { label: "Last Dividend", value: overviewData?.lastDividend != null ? `$${overviewData.lastDividend.toFixed(2)}` : "\u2014" },
@@ -14872,7 +14891,7 @@ var getOrderStatusMeta = (statusRaw) => {
14872
14891
  return { color: "#E6C87E", bg: "rgba(240,185,11,0.15)" };
14873
14892
  };
14874
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" }) });
14875
- 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: [
14876
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" }),
14877
14896
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
14878
14897
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -14897,7 +14916,7 @@ function PortfolioActivityPanel({
14897
14916
  defaultTab,
14898
14917
  onTabChange,
14899
14918
  pageSize = ACTIVITY_PAGE_SIZE_DEFAULT,
14900
- blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.arbiscan.io/tx",
14919
+ blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.basescan.org/tx",
14901
14920
  className,
14902
14921
  style
14903
14922
  }) {
@@ -15341,7 +15360,7 @@ function PortfolioActivityPanel({
15341
15360
  /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15342
15361
  formatNumber2(order.quantity),
15343
15362
  order.ticker && /* @__PURE__ */ jsx(TickerTag, { style: { marginLeft: 0 }, children: order.ticker.toUpperCase() }),
15344
- order.txHash && /* @__PURE__ */ jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15363
+ order.txHash && /* @__PURE__ */ jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15345
15364
  ] })
15346
15365
  ] }),
15347
15366
  /* @__PURE__ */ jsxs(CUnitsCell, { children: [
@@ -15394,7 +15413,7 @@ function PortfolioActivityPanel({
15394
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 })
15395
15414
  ] }),
15396
15415
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(order.createdAt) }) }),
15397
- /* @__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: [
15398
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" }),
15399
15418
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15400
15419
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15638,7 +15657,7 @@ function PortfolioActivityPanel({
15638
15657
  /* @__PURE__ */ jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15639
15658
  formatNumber2(trade.quantity),
15640
15659
  trade.ticker && /* @__PURE__ */ jsx(TickerTag, { style: { marginLeft: 0 }, children: trade.ticker.toUpperCase() }),
15641
- trade.txHash && /* @__PURE__ */ jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15660
+ trade.txHash && /* @__PURE__ */ jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15642
15661
  ] })
15643
15662
  ] }),
15644
15663
  /* @__PURE__ */ jsxs(CUnitsCell, { children: [
@@ -15705,7 +15724,7 @@ function PortfolioActivityPanel({
15705
15724
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { children: formatCurrency4(trade.price * trade.quantity) }) }),
15706
15725
  /* @__PURE__ */ jsx(GridCell, { children: settlementMeta ? /* @__PURE__ */ jsx(ActivityTag, { $color: settlementMeta.color, $bg: settlementMeta.bg, children: settlementLabel }) : /* @__PURE__ */ jsx(CellText, { $muted: true, children: "\u2014" }) }),
15707
15726
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(trade.executedAt) }) }),
15708
- /* @__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: [
15709
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" }),
15710
15729
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15711
15730
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15752,7 +15771,7 @@ function PortfolioActivityPanel({
15752
15771
  /* @__PURE__ */ jsx(CDValue, { children: formatTimestamp(t.createdAt) })
15753
15772
  ] })
15754
15773
  ] }),
15755
- 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" })
15756
15775
  ] })
15757
15776
  ] }, rowKey);
15758
15777
  }),
@@ -15778,7 +15797,7 @@ function PortfolioActivityPanel({
15778
15797
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatAddress(t.address) }) }),
15779
15798
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(ActivityTag, { $color: statusMeta.color, $bg: statusMeta.bg, children: prettyLabel(t.status) }) }),
15780
15799
  /* @__PURE__ */ jsx(GridCell, { children: /* @__PURE__ */ jsx(CellText, { $muted: true, children: formatTimestamp(t.createdAt) }) }),
15781
- /* @__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: [
15782
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" }),
15783
15802
  /* @__PURE__ */ jsx("polyline", { points: "15 3 21 3 21 9" }),
15784
15803
  /* @__PURE__ */ jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -18881,14 +18900,13 @@ var CloseButton3 = styled10.button`
18881
18900
  var MainImageContainer = styled10.div`
18882
18901
  position: relative;
18883
18902
  flex: 1;
18884
- min-height: 0;
18885
18903
  display: flex;
18886
18904
  align-items: center;
18887
18905
  justify-content: center;
18888
- padding: 20px 20px 160px;
18906
+ padding: 80px 20px 140px;
18889
18907
 
18890
18908
  @media (max-width: 768px) {
18891
- padding: 10px 0 130px;
18909
+ padding: 60px 0 110px;
18892
18910
  }
18893
18911
  `;
18894
18912
  var MainImage = styled10.img`
@@ -18900,11 +18918,8 @@ var MainImage = styled10.img`
18900
18918
  opacity: ${(p) => p.$visible ? 1 : 0};
18901
18919
  pointer-events: ${(p) => p.$visible ? "auto" : "none"};
18902
18920
  transition: opacity 300ms ease;
18903
- /* All slides share the same absolute box so switching only crossfades opacity
18904
- no relative↔absolute size jump (the "grow then shrink" on navigation).
18905
- The inset box excludes the bottom thumbnail strip so margin:auto centres the image
18906
- in the space ABOVE the thumbnails (absolute positioning ignores the parent's padding,
18907
- 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). */
18908
18923
  position: absolute;
18909
18924
  top: 24px;
18910
18925
  left: 24px;
@@ -19098,11 +19113,9 @@ function PropertyPhotoGallery({
19098
19113
  isOpen,
19099
19114
  onClose,
19100
19115
  startIndex = 0,
19101
- startWithVideo = false,
19102
19116
  title = "28 Derby Street, Vaucluse",
19103
19117
  subtitle = "Elara \u2014 Luxury Harbour Residence",
19104
- images,
19105
- videoUrl
19118
+ images
19106
19119
  }) {
19107
19120
  const galleryImages = images?.length ? images : DEFAULT_IMAGES;
19108
19121
  if (!isOpen) return null;
@@ -19111,19 +19124,16 @@ function PropertyPhotoGallery({
19111
19124
  {
19112
19125
  galleryImages,
19113
19126
  startIndex,
19114
- startWithVideo,
19115
19127
  title,
19116
19128
  subtitle,
19117
- onClose,
19118
- videoUrl
19129
+ onClose
19119
19130
  },
19120
- `${startIndex}-${galleryImages.length}-${startWithVideo}`
19131
+ `${startIndex}-${galleryImages.length}`
19121
19132
  );
19122
19133
  }
19123
- function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subtitle, onClose, videoUrl }) {
19134
+ function GalleryContent({ galleryImages, startIndex, title, subtitle, onClose }) {
19124
19135
  const [currentIndex, setCurrentIndex] = useState(() => clampIndex(startIndex, galleryImages.length));
19125
19136
  const [activeHotspotId, setActiveHotspotId] = useState(null);
19126
- const [showVideo, setShowVideo] = useState(startWithVideo ?? false);
19127
19137
  const sliderRef = useRef(null);
19128
19138
  const [isDragging, setIsDragging] = useState(false);
19129
19139
  const wasDraggingRef = useRef(false);
@@ -19173,7 +19183,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19173
19183
  ] }),
19174
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" }) }) })
19175
19185
  ] }),
19176
- !showVideo && /* @__PURE__ */ jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19186
+ /* @__PURE__ */ jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19177
19187
  /* @__PURE__ */ jsxs(
19178
19188
  SliderTrack,
19179
19189
  {
@@ -19236,21 +19246,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19236
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" }) })
19237
19247
  }
19238
19248
  ),
19239
- showVideo && videoUrl ? /* @__PURE__ */ jsx(GalleryVideoWrap, { children: /* @__PURE__ */ jsx(
19240
- "video",
19241
- {
19242
- autoPlay: true,
19243
- loop: true,
19244
- playsInline: true,
19245
- muted: true,
19246
- controls: true,
19247
- onVolumeChange: (e) => {
19248
- if (!e.currentTarget.muted) e.currentTarget.muted = true;
19249
- },
19250
- style: { objectFit: "contain", borderRadius: 12, boxShadow: "0 30px 80px rgba(0,0,0,0.55)" },
19251
- children: /* @__PURE__ */ jsx("source", { src: videoUrl, type: "video/mp4" })
19252
- }
19253
- ) }) : 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)),
19254
19250
  galleryImages[currentIndex]?.hotspots?.map((hotspot) => /* @__PURE__ */ jsx(
19255
19251
  Hotspot,
19256
19252
  {
@@ -19295,83 +19291,11 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19295
19291
  ]
19296
19292
  }
19297
19293
  ),
19298
- /* @__PURE__ */ jsxs(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: [
19299
- galleryImages.map((image, idx) => /* @__PURE__ */ jsx(Thumbnail3, { $active: !showVideo && idx === currentIndex, onClick: () => {
19300
- setShowVideo(false);
19301
- setCurrentIndex(idx);
19302
- }, "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsx("img", { src: image.src, alt: image.alt }) }, image.alt)),
19303
- videoUrl && /* @__PURE__ */ jsxs(Fragment, { children: [
19304
- /* @__PURE__ */ jsx(ThumbnailDivider, {}),
19305
- /* @__PURE__ */ jsxs(VideoBtn, { $active: showVideo, onClick: () => setShowVideo(true), children: [
19306
- /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
19307
- /* @__PURE__ */ jsx("rect", { x: "2", y: "4", width: "14", height: "16", rx: "2" }),
19308
- /* @__PURE__ */ jsx("path", { d: "M16 8l6-4v16l-6-4z" })
19309
- ] }),
19310
- "Video"
19311
- ] })
19312
- ] })
19313
- ] })
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)) })
19314
19295
  ]
19315
19296
  }
19316
19297
  );
19317
19298
  }
19318
- var GalleryVideoWrap = styled10.div`
19319
- position: absolute;
19320
- inset: 0;
19321
- display: flex;
19322
- align-items: center;
19323
- justify-content: center;
19324
- padding: 20px 20px 160px;
19325
-
19326
- video {
19327
- max-width: 90%;
19328
- max-height: 100%;
19329
- }
19330
-
19331
- /* Property videos stay permanently muted — remove the volume + mute buttons
19332
- from the native player (Chrome/Edge/Safari/iOS/Android). Firefox ignores
19333
- these and is covered by the onVolumeChange force-mute fallback. */
19334
- video::-webkit-media-controls-mute-button,
19335
- video::-webkit-media-controls-volume-slider,
19336
- video::-webkit-media-controls-volume-control-container {
19337
- display: none !important;
19338
- }
19339
-
19340
- @media (max-width: 768px) {
19341
- padding: 10px 0 130px;
19342
-
19343
- video {
19344
- max-width: 100%;
19345
- }
19346
- }
19347
- `;
19348
- var ThumbnailDivider = styled10.div`
19349
- width: 1px;
19350
- height: 48px;
19351
- background: rgba(255, 255, 255, 0.15);
19352
- flex-shrink: 0;
19353
- align-self: center;
19354
- `;
19355
- var VideoBtn = styled10.button`
19356
- display: flex;
19357
- align-items: center;
19358
- gap: 6px;
19359
- padding: 8px 14px;
19360
- border-radius: 8px;
19361
- border: 1px solid ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "rgba(255, 255, 255, 0.2)"};
19362
- background: ${(p) => p.$active ? "rgba(240, 185, 11, 0.15)" : "rgba(255, 255, 255, 0.08)"};
19363
- color: ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "#fff"};
19364
- font-size: 0.82rem;
19365
- font-weight: 500;
19366
- cursor: pointer;
19367
- flex-shrink: 0;
19368
- transition: all 0.2s ease;
19369
-
19370
- &:hover {
19371
- background: rgba(255, 255, 255, 0.15);
19372
- border-color: rgba(255, 255, 255, 0.3);
19373
- }
19374
- `;
19375
19299
  var slideIn2 = keyframes`
19376
19300
  from { transform: translateX(110%); opacity: 0; }
19377
19301
  to { transform: translateX(0); opacity: 1; }
@@ -19540,7 +19464,7 @@ var Container3 = styled10.div`
19540
19464
  gap: 8px;
19541
19465
  }
19542
19466
  `;
19543
- var DEFAULT_EXPLORER = "https://sepolia.arbiscan.io/tx/";
19467
+ var DEFAULT_EXPLORER = "https://sepolia.basescan.org/tx/";
19544
19468
  function truncateHash(hash) {
19545
19469
  return `${hash.slice(0, 6)}\u2026${hash.slice(-4)}`;
19546
19470
  }
@@ -20107,7 +20031,8 @@ var SiteFooter = () => {
20107
20031
  /* @__PURE__ */ jsxs(LegalLinks, { children: [
20108
20032
  /* @__PURE__ */ jsx(LegalLink, { href: "/privacy", children: "Privacy Policy" }),
20109
20033
  /* @__PURE__ */ jsx(LegalLink, { href: "/terms", children: "Terms of Use" }),
20110
- /* @__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" })
20111
20036
  ] })
20112
20037
  ] }),
20113
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." }) })