@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 +2 -4
- package/dist/index.d.ts +2 -4
- package/dist/index.js +77 -152
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +77 -152
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
|
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,
|
|
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
|
|
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,
|
|
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(
|
|
7619
|
-
|
|
7620
|
-
|
|
7621
|
-
|
|
7622
|
-
|
|
7623
|
-
|
|
7624
|
-
|
|
7625
|
-
|
|
7626
|
-
|
|
7627
|
-
|
|
7628
|
-
|
|
7629
|
-
|
|
7630
|
-
|
|
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: "
|
|
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
|
|
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 = "
|
|
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: "/
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
18931
|
+
padding: 80px 20px 140px;
|
|
18914
18932
|
|
|
18915
18933
|
@media (max-width: 768px) {
|
|
18916
|
-
padding:
|
|
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
|
-
/*
|
|
18929
|
-
|
|
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}
|
|
19156
|
+
`${startIndex}-${galleryImages.length}`
|
|
19146
19157
|
);
|
|
19147
19158
|
}
|
|
19148
|
-
function GalleryContent({ galleryImages, startIndex,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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." }) })
|