@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.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(
|
|
7594
|
-
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7598
|
-
|
|
7599
|
-
|
|
7600
|
-
|
|
7601
|
-
|
|
7602
|
-
|
|
7603
|
-
|
|
7604
|
-
|
|
7605
|
-
|
|
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: "
|
|
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
|
|
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 = "
|
|
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: "/
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
18906
|
+
padding: 80px 20px 140px;
|
|
18889
18907
|
|
|
18890
18908
|
@media (max-width: 768px) {
|
|
18891
|
-
padding:
|
|
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
|
-
/*
|
|
18904
|
-
|
|
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}
|
|
19131
|
+
`${startIndex}-${galleryImages.length}`
|
|
19121
19132
|
);
|
|
19122
19133
|
}
|
|
19123
|
-
function GalleryContent({ galleryImages, startIndex,
|
|
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
|
-
|
|
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
|
-
|
|
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__ */
|
|
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.
|
|
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." }) })
|