@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.d.mts CHANGED
@@ -1093,7 +1093,7 @@ type ToastData = {
1093
1093
  amount?: string;
1094
1094
  /** On-chain tx hash — shown truncated with a block explorer link */
1095
1095
  txHash?: string;
1096
- /** Explorer base URL, defaults to Arbitrum Sepolia */
1096
+ /** Explorer base URL, defaults to Base Sepolia */
1097
1097
  explorerUrl?: string;
1098
1098
  /** Auto-dismiss after ms. 0 = never. Default 6000 */
1099
1099
  duration?: number;
@@ -1269,13 +1269,11 @@ type PropertyPhotoGalleryProps = {
1269
1269
  isOpen: boolean;
1270
1270
  onClose: () => void;
1271
1271
  startIndex?: number;
1272
- startWithVideo?: boolean;
1273
1272
  images?: PropertyGalleryImage[];
1274
1273
  title?: string;
1275
1274
  subtitle?: string;
1276
- videoUrl?: string;
1277
1275
  };
1278
- declare function PropertyPhotoGallery({ isOpen, onClose, startIndex, startWithVideo, title, subtitle, images, videoUrl, }: PropertyPhotoGalleryProps): react_jsx_runtime.JSX.Element | null;
1276
+ declare function PropertyPhotoGallery({ isOpen, onClose, startIndex, title, subtitle, images, }: PropertyPhotoGalleryProps): react_jsx_runtime.JSX.Element | null;
1279
1277
 
1280
1278
  type UseAdaptivePollingOptions = {
1281
1279
  enabled: boolean;
package/dist/index.d.ts CHANGED
@@ -1093,7 +1093,7 @@ type ToastData = {
1093
1093
  amount?: string;
1094
1094
  /** On-chain tx hash — shown truncated with a block explorer link */
1095
1095
  txHash?: string;
1096
- /** Explorer base URL, defaults to Arbitrum Sepolia */
1096
+ /** Explorer base URL, defaults to Base Sepolia */
1097
1097
  explorerUrl?: string;
1098
1098
  /** Auto-dismiss after ms. 0 = never. Default 6000 */
1099
1099
  duration?: number;
@@ -1269,13 +1269,11 @@ type PropertyPhotoGalleryProps = {
1269
1269
  isOpen: boolean;
1270
1270
  onClose: () => void;
1271
1271
  startIndex?: number;
1272
- startWithVideo?: boolean;
1273
1272
  images?: PropertyGalleryImage[];
1274
1273
  title?: string;
1275
1274
  subtitle?: string;
1276
- videoUrl?: string;
1277
1275
  };
1278
- declare function PropertyPhotoGallery({ isOpen, onClose, startIndex, startWithVideo, title, subtitle, images, videoUrl, }: PropertyPhotoGalleryProps): react_jsx_runtime.JSX.Element | null;
1276
+ declare function PropertyPhotoGallery({ isOpen, onClose, startIndex, title, subtitle, images, }: PropertyPhotoGalleryProps): react_jsx_runtime.JSX.Element | null;
1279
1277
 
1280
1278
  type UseAdaptivePollingOptions = {
1281
1279
  enabled: boolean;
package/dist/index.js CHANGED
@@ -7575,7 +7575,6 @@ var LoginPopup = ({
7575
7575
  ] })
7576
7576
  ] });
7577
7577
  if (gate) {
7578
- const codeAccepted = codeStatus === "valid";
7579
7578
  const showSignIn = signInMode || signInRevealed;
7580
7579
  return /* @__PURE__ */ jsxRuntime.jsxs(GateShell, { children: [
7581
7580
  /* @__PURE__ */ jsxRuntime.jsx(GateTint, { $reveal: showSignIn ? 1 : 0 }),
@@ -7601,35 +7600,30 @@ var LoginPopup = ({
7601
7600
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7602
7601
  /* @__PURE__ */ jsxRuntime.jsxs(CodeInputWrapper, { $status: codeStatus, children: [
7603
7602
  /* @__PURE__ */ jsxRuntime.jsx(CodePrefix, { children: CODE_PREFIX }),
7604
- codeInput,
7605
- /* @__PURE__ */ jsxRuntime.jsx(
7606
- GateSubmit,
7607
- {
7608
- type: "button",
7609
- "aria-label": "Submit access code",
7610
- $status: codeStatus,
7611
- disabled: codeStatus === "checking" || !codeComplete,
7612
- onClick: () => void runCodeValidation(referralCode),
7613
- children: codeAccepted ? /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.4", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 6L9 17l-5-5" }) }) : codeStatus === "checking" ? /* @__PURE__ */ jsxRuntime.jsx(GateSpinner, {}) : /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 12h14M13 6l6 6-6 6" }) })
7614
- }
7615
- )
7603
+ codeInput
7616
7604
  ] }),
7617
7605
  (codeStatus === "invalid" || error && !signInRevealed) && /* @__PURE__ */ jsxRuntime.jsx(StatusMessage, { $error: true, children: error || "That code isn't valid. Double-check and try again." }),
7618
- signInRevealed ? signInStep : /* @__PURE__ */ jsxRuntime.jsxs(GateResendText, { children: [
7619
- "Already have an account?",
7620
- " ",
7621
- /* @__PURE__ */ jsxRuntime.jsx(
7622
- "button",
7623
- {
7624
- type: "button",
7625
- onClick: () => {
7626
- setError("");
7627
- setIsSignUp(false);
7628
- setSignInMode(true);
7629
- },
7630
- children: "Sign in"
7631
- }
7632
- )
7606
+ signInRevealed ? signInStep : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7607
+ /* @__PURE__ */ jsxRuntime.jsxs(GateResendText, { children: [
7608
+ "Already have an account?",
7609
+ " ",
7610
+ /* @__PURE__ */ jsxRuntime.jsx(
7611
+ "button",
7612
+ {
7613
+ type: "button",
7614
+ onClick: () => {
7615
+ setError("");
7616
+ setIsSignUp(false);
7617
+ setSignInMode(true);
7618
+ },
7619
+ children: "Sign in"
7620
+ }
7621
+ )
7622
+ ] }),
7623
+ /* @__PURE__ */ jsxRuntime.jsxs(GateEarlyAccess, { href: "https://loafmarkets.com/?waitlist=1", children: [
7624
+ "Signup for early access",
7625
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M5 12h14M13 6l6 6-6 6" }) })
7626
+ ] })
7633
7627
  ] })
7634
7628
  ] })
7635
7629
  ] })
@@ -7706,12 +7700,12 @@ var LoginPopup = ({
7706
7700
  marginBottom: "1.25rem"
7707
7701
  }, children: [
7708
7702
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: { width: 7, height: 7, borderRadius: "50%", background: "#0052FF", flexShrink: 0 } }),
7709
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.72rem", fontWeight: 600, color: "#6b9fff", letterSpacing: "0.02em" }, children: "Arbitrum Sepolia" })
7703
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontSize: "0.72rem", fontWeight: 600, color: "#6b9fff", letterSpacing: "0.02em" }, children: "Base Sepolia" })
7710
7704
  ] }),
7711
7705
  /* @__PURE__ */ jsxRuntime.jsxs("p", { style: { fontSize: "0.82rem", color: "rgba(255,255,255,0.5)", textAlign: "center", marginBottom: "1.1rem", lineHeight: 1.5, maxWidth: 320 }, children: [
7712
7706
  "Send ",
7713
7707
  /* @__PURE__ */ jsxRuntime.jsx("strong", { style: { color: "rgba(255,255,255,0.8)" }, children: "USDC" }),
7714
- " on Arbitrum Sepolia to the address below. Only send on this network."
7708
+ " on Base Sepolia to the address below. Only send on this network."
7715
7709
  ] }),
7716
7710
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: {
7717
7711
  width: "100%",
@@ -8252,6 +8246,33 @@ var GateResendText = styled10__default.default.p`
8252
8246
  font-size: inherit;
8253
8247
  }
8254
8248
  `;
8249
+ var GateEarlyAccess = styled10__default.default.a`
8250
+ display: inline-flex;
8251
+ align-items: center;
8252
+ gap: 0.4rem;
8253
+ margin-top: 0.15rem;
8254
+ color: var(--color-text-secondary, #848e9c);
8255
+ font-size: 0.8rem;
8256
+ font-weight: 500;
8257
+ letter-spacing: 0.02em;
8258
+ text-decoration: none;
8259
+ cursor: pointer;
8260
+ transition: color 0.15s ease;
8261
+
8262
+ svg {
8263
+ width: 13px;
8264
+ height: 13px;
8265
+ transition: transform 0.15s ease;
8266
+ }
8267
+
8268
+ &:hover {
8269
+ color: var(--color-accent, #E6C87E);
8270
+ }
8271
+
8272
+ &:hover svg {
8273
+ transform: translateX(3px);
8274
+ }
8275
+ `;
8255
8276
  var GateSubmit = styled10__default.default.button`
8256
8277
  display: flex;
8257
8278
  align-items: center;
@@ -10329,7 +10350,7 @@ function PropertyOverview({
10329
10350
  isLoading = false,
10330
10351
  ticker,
10331
10352
  contractAddress,
10332
- chain = "Arbitrum (Ethereum L2)",
10353
+ chain = "Base (Ethereum L2)",
10333
10354
  volume24h,
10334
10355
  priceHistory: priceHistoryProp,
10335
10356
  beta = false,
@@ -10368,13 +10389,13 @@ function PropertyOverview({
10368
10389
  const resolvedPropertyType = rawPropertyType?.toLowerCase() === "house" ? "Residential" : rawPropertyType;
10369
10390
  const galleryImages = images ?? [];
10370
10391
  const chainValue = /* @__PURE__ */ jsxRuntime.jsxs(ChainLogos, { children: [
10371
- /* @__PURE__ */ jsxRuntime.jsx(ChainLogoImg, { src: "/Arbitrum-Symbol.svg", alt: "Arbitrum" }),
10392
+ /* @__PURE__ */ jsxRuntime.jsx(ChainLogoImg, { src: "/Base-Symbol.png", alt: "Base" }),
10372
10393
  /* @__PURE__ */ jsxRuntime.jsx(ChainLogoImg, { src: "/Ethereum-Logo.png", alt: "Ethereum", style: { filter: "brightness(0) invert(1)" } }),
10373
10394
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: chain })
10374
10395
  ] });
10375
10396
  const tokenDetailsItems = [
10376
10397
  { label: "Chain", value: chainValue },
10377
- { label: "On-Chain Address", value: contractAddress ? truncateAddress(contractAddress) : "\u2014", mono: true, link: contractAddress ? `https://sepolia.arbiscan.io/address/${contractAddress}` : void 0, copyValue: contractAddress },
10398
+ { label: "On-Chain Address", value: contractAddress ? truncateAddress(contractAddress) : "\u2014", mono: true, link: contractAddress ? `https://sepolia.basescan.org/address/${contractAddress}` : void 0, copyValue: contractAddress },
10378
10399
  { label: "Token Ticker", value: ticker ?? "\u2014" },
10379
10400
  { label: "Total Circulating Tokens", value: isLoading && resolvedTokensIssued == null ? loadingSkeleton : resolvedTokensIssued?.toLocaleString() ?? "\u2014" },
10380
10401
  { label: "Legal Structuring", value: "See Documents", docLink: true },
@@ -10394,9 +10415,7 @@ function PropertyOverview({
10394
10415
  ];
10395
10416
  const growthPct = overviewData?.growth5Yr;
10396
10417
  const propertyStats = [
10397
- // Property Value = the API offeringValuation (OverviewResponse.offeringValuation), NOT
10398
- // midPrice×tokensIssued market cap (fixed 2026-07-22). null → '—', never a fabricated cap.
10399
- { label: "Property Value", value: isLoading && overviewData?.offeringValuation == null ? loadingSkeleton : overviewData?.offeringValuation ? fmtDollar(overviewData.offeringValuation) : "\u2014" },
10418
+ { label: "Property Value", value: isLoading && tokenMarketCap == null ? loadingSkeleton : tokenMarketCap ? fmtDollar(tokenMarketCap) : "\u2014" },
10400
10419
  ...beta ? [] : [{ label: "Offers", value: "3" }],
10401
10420
  { label: "Growth (5yr)", value: growthPct != null ? `${growthPct > 0 ? "+" : ""}${growthPct}%` : "\u2014" },
10402
10421
  { label: "Last Dividend", value: overviewData?.lastDividend != null ? `$${overviewData.lastDividend.toFixed(2)}` : "\u2014" },
@@ -14897,7 +14916,7 @@ var getOrderStatusMeta = (statusRaw) => {
14897
14916
  return { color: "#E6C87E", bg: "rgba(240,185,11,0.15)" };
14898
14917
  };
14899
14918
  var ChevronDown = () => /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" }) });
14900
- var ArbiscanIconLink = ({ url }) => /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: url, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
14919
+ var BaseScanIconLink = ({ url }) => /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: url, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
14901
14920
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
14902
14921
  /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 3 21 3 21 9" }),
14903
14922
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -14922,7 +14941,7 @@ function PortfolioActivityPanel({
14922
14941
  defaultTab,
14923
14942
  onTabChange,
14924
14943
  pageSize = ACTIVITY_PAGE_SIZE_DEFAULT,
14925
- blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.arbiscan.io/tx",
14944
+ blockExplorerBaseUrl: _blockExplorerBaseUrl = "https://sepolia.basescan.org/tx",
14926
14945
  className,
14927
14946
  style
14928
14947
  }) {
@@ -15366,7 +15385,7 @@ function PortfolioActivityPanel({
15366
15385
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15367
15386
  formatNumber2(order.quantity),
15368
15387
  order.ticker && /* @__PURE__ */ jsxRuntime.jsx(TickerTag, { style: { marginLeft: 0 }, children: order.ticker.toUpperCase() }),
15369
- order.txHash && /* @__PURE__ */ jsxRuntime.jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15388
+ order.txHash && /* @__PURE__ */ jsxRuntime.jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${order.txHash}` })
15370
15389
  ] })
15371
15390
  ] }),
15372
15391
  /* @__PURE__ */ jsxRuntime.jsxs(CUnitsCell, { children: [
@@ -15419,7 +15438,7 @@ function PortfolioActivityPanel({
15419
15438
  order.status === "REJECTED" && order.rejectionReason && /* @__PURE__ */ jsxRuntime.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 })
15420
15439
  ] }),
15421
15440
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(CellText, { $muted: true, children: formatTimestamp(order.createdAt) }) }),
15422
- /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: order.txHash && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${order.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15441
+ /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: order.txHash && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${order.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15423
15442
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15424
15443
  /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 3 21 3 21 9" }),
15425
15444
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15663,7 +15682,7 @@ function PortfolioActivityPanel({
15663
15682
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { display: "inline-flex", alignItems: "center", gap: "0.35rem" }, children: [
15664
15683
  formatNumber2(trade.quantity),
15665
15684
  trade.ticker && /* @__PURE__ */ jsxRuntime.jsx(TickerTag, { style: { marginLeft: 0 }, children: trade.ticker.toUpperCase() }),
15666
- trade.txHash && /* @__PURE__ */ jsxRuntime.jsx(ArbiscanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15685
+ trade.txHash && /* @__PURE__ */ jsxRuntime.jsx(BaseScanIconLink, { url: `${_blockExplorerBaseUrl}/${trade.txHash}` })
15667
15686
  ] })
15668
15687
  ] }),
15669
15688
  /* @__PURE__ */ jsxRuntime.jsxs(CUnitsCell, { children: [
@@ -15730,7 +15749,7 @@ function PortfolioActivityPanel({
15730
15749
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(CellText, { children: formatCurrency4(trade.price * trade.quantity) }) }),
15731
15750
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: settlementMeta ? /* @__PURE__ */ jsxRuntime.jsx(ActivityTag, { $color: settlementMeta.color, $bg: settlementMeta.bg, children: settlementLabel }) : /* @__PURE__ */ jsxRuntime.jsx(CellText, { $muted: true, children: "\u2014" }) }),
15732
15751
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(CellText, { $muted: true, children: formatTimestamp(trade.executedAt) }) }),
15733
- /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: trade.txHash && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${trade.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15752
+ /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: trade.txHash && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: `${_blockExplorerBaseUrl}/${trade.txHash}`, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15734
15753
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15735
15754
  /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 3 21 3 21 9" }),
15736
15755
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -15777,7 +15796,7 @@ function PortfolioActivityPanel({
15777
15796
  /* @__PURE__ */ jsxRuntime.jsx(CDValue, { children: formatTimestamp(t.createdAt) })
15778
15797
  ] })
15779
15798
  ] }),
15780
- txUrl && /* @__PURE__ */ jsxRuntime.jsx(CExpandedLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: "View on Arbiscan \u2197" })
15799
+ txUrl && /* @__PURE__ */ jsxRuntime.jsx(CExpandedLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: "View on BaseScan \u2197" })
15781
15800
  ] })
15782
15801
  ] }, rowKey);
15783
15802
  }),
@@ -15803,7 +15822,7 @@ function PortfolioActivityPanel({
15803
15822
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(CellText, { $muted: true, children: formatAddress(t.address) }) }),
15804
15823
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(ActivityTag, { $color: statusMeta.color, $bg: statusMeta.bg, children: prettyLabel(t.status) }) }),
15805
15824
  /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: /* @__PURE__ */ jsxRuntime.jsx(CellText, { $muted: true, children: formatTimestamp(t.createdAt) }) }),
15806
- /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: txUrl && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", title: "View on Arbiscan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15825
+ /* @__PURE__ */ jsxRuntime.jsx(GridCell, { children: txUrl && /* @__PURE__ */ jsxRuntime.jsx(TxLink, { href: txUrl, target: "_blank", rel: "noopener noreferrer", title: "View on BaseScan", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "15", height: "15", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
15807
15826
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
15808
15827
  /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "15 3 21 3 21 9" }),
15809
15828
  /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
@@ -18906,14 +18925,13 @@ var CloseButton3 = styled10__default.default.button`
18906
18925
  var MainImageContainer = styled10__default.default.div`
18907
18926
  position: relative;
18908
18927
  flex: 1;
18909
- min-height: 0;
18910
18928
  display: flex;
18911
18929
  align-items: center;
18912
18930
  justify-content: center;
18913
- padding: 20px 20px 160px;
18931
+ padding: 80px 20px 140px;
18914
18932
 
18915
18933
  @media (max-width: 768px) {
18916
- padding: 10px 0 130px;
18934
+ padding: 60px 0 110px;
18917
18935
  }
18918
18936
  `;
18919
18937
  var MainImage = styled10__default.default.img`
@@ -18925,11 +18943,8 @@ var MainImage = styled10__default.default.img`
18925
18943
  opacity: ${(p) => p.$visible ? 1 : 0};
18926
18944
  pointer-events: ${(p) => p.$visible ? "auto" : "none"};
18927
18945
  transition: opacity 300ms ease;
18928
- /* All slides share the same absolute box so switching only crossfades opacity
18929
- no relative↔absolute size jump (the "grow then shrink" on navigation).
18930
- The inset box excludes the bottom thumbnail strip so margin:auto centres the image
18931
- in the space ABOVE the thumbnails (absolute positioning ignores the parent's padding,
18932
- which otherwise let the image sink behind the thumbnails / "lean down"). */
18946
+ /* Inset box excludes the bottom thumbnail strip so margin:auto centres the image in the
18947
+ space ABOVE the thumbnails (absolute ignores the parent's padding). */
18933
18948
  position: absolute;
18934
18949
  top: 24px;
18935
18950
  left: 24px;
@@ -19123,11 +19138,9 @@ function PropertyPhotoGallery({
19123
19138
  isOpen,
19124
19139
  onClose,
19125
19140
  startIndex = 0,
19126
- startWithVideo = false,
19127
19141
  title = "28 Derby Street, Vaucluse",
19128
19142
  subtitle = "Elara \u2014 Luxury Harbour Residence",
19129
- images,
19130
- videoUrl
19143
+ images
19131
19144
  }) {
19132
19145
  const galleryImages = images?.length ? images : DEFAULT_IMAGES;
19133
19146
  if (!isOpen) return null;
@@ -19136,19 +19149,16 @@ function PropertyPhotoGallery({
19136
19149
  {
19137
19150
  galleryImages,
19138
19151
  startIndex,
19139
- startWithVideo,
19140
19152
  title,
19141
19153
  subtitle,
19142
- onClose,
19143
- videoUrl
19154
+ onClose
19144
19155
  },
19145
- `${startIndex}-${galleryImages.length}-${startWithVideo}`
19156
+ `${startIndex}-${galleryImages.length}`
19146
19157
  );
19147
19158
  }
19148
- function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subtitle, onClose, videoUrl }) {
19159
+ function GalleryContent({ galleryImages, startIndex, title, subtitle, onClose }) {
19149
19160
  const [currentIndex, setCurrentIndex] = React5.useState(() => clampIndex(startIndex, galleryImages.length));
19150
19161
  const [activeHotspotId, setActiveHotspotId] = React5.useState(null);
19151
- const [showVideo, setShowVideo] = React5.useState(startWithVideo ?? false);
19152
19162
  const sliderRef = React5.useRef(null);
19153
19163
  const [isDragging, setIsDragging] = React5.useState(false);
19154
19164
  const wasDraggingRef = React5.useRef(false);
@@ -19198,7 +19208,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19198
19208
  ] }),
19199
19209
  /* @__PURE__ */ jsxRuntime.jsx(CloseButton3, { onClick: onClose, "aria-label": "Close gallery", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: "22", height: "22", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 6l12 12M6 18L18 6" }) }) })
19200
19210
  ] }),
19201
- !showVideo && /* @__PURE__ */ jsxRuntime.jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19211
+ /* @__PURE__ */ jsxRuntime.jsxs(SliderContainer, { onClick: (event) => event.stopPropagation(), children: [
19202
19212
  /* @__PURE__ */ jsxRuntime.jsxs(
19203
19213
  SliderTrack,
19204
19214
  {
@@ -19261,21 +19271,7 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19261
19271
  children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", width: "22", height: "22", fill: "none", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15 18l-6-6 6-6" }) })
19262
19272
  }
19263
19273
  ),
19264
- showVideo && videoUrl ? /* @__PURE__ */ jsxRuntime.jsx(GalleryVideoWrap, { children: /* @__PURE__ */ jsxRuntime.jsx(
19265
- "video",
19266
- {
19267
- autoPlay: true,
19268
- loop: true,
19269
- playsInline: true,
19270
- muted: true,
19271
- controls: true,
19272
- onVolumeChange: (e) => {
19273
- if (!e.currentTarget.muted) e.currentTarget.muted = true;
19274
- },
19275
- style: { objectFit: "contain", borderRadius: 12, boxShadow: "0 30px 80px rgba(0,0,0,0.55)" },
19276
- children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: videoUrl, type: "video/mp4" })
19277
- }
19278
- ) }) : galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(MainImage, { src: image.src, alt: image.alt, $visible: idx === currentIndex }, image.alt)),
19274
+ galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(MainImage, { src: image.src, alt: image.alt, $visible: idx === currentIndex }, image.alt)),
19279
19275
  galleryImages[currentIndex]?.hotspots?.map((hotspot) => /* @__PURE__ */ jsxRuntime.jsx(
19280
19276
  Hotspot,
19281
19277
  {
@@ -19320,83 +19316,11 @@ function GalleryContent({ galleryImages, startIndex, startWithVideo, title, subt
19320
19316
  ]
19321
19317
  }
19322
19318
  ),
19323
- /* @__PURE__ */ jsxRuntime.jsxs(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: [
19324
- galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(Thumbnail3, { $active: !showVideo && idx === currentIndex, onClick: () => {
19325
- setShowVideo(false);
19326
- setCurrentIndex(idx);
19327
- }, "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: image.src, alt: image.alt }) }, image.alt)),
19328
- videoUrl && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19329
- /* @__PURE__ */ jsxRuntime.jsx(ThumbnailDivider, {}),
19330
- /* @__PURE__ */ jsxRuntime.jsxs(VideoBtn, { $active: showVideo, onClick: () => setShowVideo(true), children: [
19331
- /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
19332
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "2", y: "4", width: "14", height: "16", rx: "2" }),
19333
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 8l6-4v16l-6-4z" })
19334
- ] }),
19335
- "Video"
19336
- ] })
19337
- ] })
19338
- ] })
19319
+ /* @__PURE__ */ jsxRuntime.jsx(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(Thumbnail3, { $active: idx === currentIndex, onClick: () => setCurrentIndex(idx), "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: image.src, alt: image.alt }) }, image.alt)) })
19339
19320
  ]
19340
19321
  }
19341
19322
  );
19342
19323
  }
19343
- var GalleryVideoWrap = styled10__default.default.div`
19344
- position: absolute;
19345
- inset: 0;
19346
- display: flex;
19347
- align-items: center;
19348
- justify-content: center;
19349
- padding: 20px 20px 160px;
19350
-
19351
- video {
19352
- max-width: 90%;
19353
- max-height: 100%;
19354
- }
19355
-
19356
- /* Property videos stay permanently muted — remove the volume + mute buttons
19357
- from the native player (Chrome/Edge/Safari/iOS/Android). Firefox ignores
19358
- these and is covered by the onVolumeChange force-mute fallback. */
19359
- video::-webkit-media-controls-mute-button,
19360
- video::-webkit-media-controls-volume-slider,
19361
- video::-webkit-media-controls-volume-control-container {
19362
- display: none !important;
19363
- }
19364
-
19365
- @media (max-width: 768px) {
19366
- padding: 10px 0 130px;
19367
-
19368
- video {
19369
- max-width: 100%;
19370
- }
19371
- }
19372
- `;
19373
- var ThumbnailDivider = styled10__default.default.div`
19374
- width: 1px;
19375
- height: 48px;
19376
- background: rgba(255, 255, 255, 0.15);
19377
- flex-shrink: 0;
19378
- align-self: center;
19379
- `;
19380
- var VideoBtn = styled10__default.default.button`
19381
- display: flex;
19382
- align-items: center;
19383
- gap: 6px;
19384
- padding: 8px 14px;
19385
- border-radius: 8px;
19386
- border: 1px solid ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "rgba(255, 255, 255, 0.2)"};
19387
- background: ${(p) => p.$active ? "rgba(240, 185, 11, 0.15)" : "rgba(255, 255, 255, 0.08)"};
19388
- color: ${(p) => p.$active ? "var(--color-accent, #E6C87E)" : "#fff"};
19389
- font-size: 0.82rem;
19390
- font-weight: 500;
19391
- cursor: pointer;
19392
- flex-shrink: 0;
19393
- transition: all 0.2s ease;
19394
-
19395
- &:hover {
19396
- background: rgba(255, 255, 255, 0.15);
19397
- border-color: rgba(255, 255, 255, 0.3);
19398
- }
19399
- `;
19400
19324
  var slideIn2 = styled10.keyframes`
19401
19325
  from { transform: translateX(110%); opacity: 0; }
19402
19326
  to { transform: translateX(0); opacity: 1; }
@@ -19565,7 +19489,7 @@ var Container3 = styled10__default.default.div`
19565
19489
  gap: 8px;
19566
19490
  }
19567
19491
  `;
19568
- var DEFAULT_EXPLORER = "https://sepolia.arbiscan.io/tx/";
19492
+ var DEFAULT_EXPLORER = "https://sepolia.basescan.org/tx/";
19569
19493
  function truncateHash(hash) {
19570
19494
  return `${hash.slice(0, 6)}\u2026${hash.slice(-4)}`;
19571
19495
  }
@@ -20132,7 +20056,8 @@ var SiteFooter = () => {
20132
20056
  /* @__PURE__ */ jsxRuntime.jsxs(LegalLinks, { children: [
20133
20057
  /* @__PURE__ */ jsxRuntime.jsx(LegalLink, { href: "/privacy", children: "Privacy Policy" }),
20134
20058
  /* @__PURE__ */ jsxRuntime.jsx(LegalLink, { href: "/terms", children: "Terms of Use" }),
20135
- /* @__PURE__ */ jsxRuntime.jsx(LegalLink, { href: "/cookies", children: "Cookie Policy" })
20059
+ /* @__PURE__ */ jsxRuntime.jsx(LegalLink, { href: "/cookies", children: "Cookie Policy" }),
20060
+ /* @__PURE__ */ jsxRuntime.jsx(LegalLink, { href: "/risk", children: "Risk Warning" })
20136
20061
  ] })
20137
20062
  ] }),
20138
20063
  /* @__PURE__ */ jsxRuntime.jsx(Disclaimer2, { children: /* @__PURE__ */ jsxRuntime.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." }) })