@loafmarkets/ui 0.1.100 → 0.1.102
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 +4 -32
- package/dist/index.d.ts +4 -32
- package/dist/index.js +609 -1122
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +611 -1124
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1796,11 +1796,6 @@ function useViewportCompact(breakpoint) {
|
|
|
1796
1796
|
return isCompact;
|
|
1797
1797
|
}
|
|
1798
1798
|
var formatNumber = (value, precision) => value.toFixed(precision);
|
|
1799
|
-
var formatTradeTime = (time) => {
|
|
1800
|
-
const d = new Date(time);
|
|
1801
|
-
if (Number.isNaN(d.getTime())) return time;
|
|
1802
|
-
return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false });
|
|
1803
|
-
};
|
|
1804
1799
|
var FLASH_DURATION_MS = 450;
|
|
1805
1800
|
var FLASH_UP_COLOR = "rgba(14, 203, 129, 0.35)";
|
|
1806
1801
|
var FLASH_DOWN_COLOR = "rgba(246, 70, 93, 0.35)";
|
|
@@ -1870,12 +1865,14 @@ function TradeRow({
|
|
|
1870
1865
|
{
|
|
1871
1866
|
ref: rowRef,
|
|
1872
1867
|
className: "grid items-center",
|
|
1873
|
-
style: { gridTemplateColumns: "
|
|
1868
|
+
style: { gridTemplateColumns: "1.2fr 0.8fr", padding: "0.2rem 0", fontSize: "0.8rem" },
|
|
1874
1869
|
children: [
|
|
1875
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1870
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { color: trade.type === "buy" ? "#0ecb81" : "#f6465d", fontWeight: 500 }, children: [
|
|
1871
|
+
"$",
|
|
1872
|
+
formatNumber(trade.price, precision)
|
|
1873
|
+
] }),
|
|
1874
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "right", paddingRight: "0.5rem", display: "flex", alignItems: "center", justifyContent: "flex-end", gap: "4px" }, children: [
|
|
1875
|
+
formatNumber(trade.amount, amountPrecision),
|
|
1879
1876
|
explorerUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1880
1877
|
"a",
|
|
1881
1878
|
{
|
|
@@ -1896,22 +1893,24 @@ function TradeRow({
|
|
|
1896
1893
|
"div",
|
|
1897
1894
|
{
|
|
1898
1895
|
ref: rowRef,
|
|
1899
|
-
className: "
|
|
1900
|
-
style: { height: `${DEPTH_ROW_HEIGHT_PX}px` },
|
|
1896
|
+
className: "grid grid-cols-3 items-center gap-3 px-3 py-1.5",
|
|
1901
1897
|
children: [
|
|
1902
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1898
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
1903
1899
|
"div",
|
|
1904
1900
|
{
|
|
1905
1901
|
className: cn(
|
|
1906
1902
|
"tabular-nums",
|
|
1907
1903
|
trade.type === "buy" ? "text-[#0ecb81]" : "text-[#f6465d]"
|
|
1908
1904
|
),
|
|
1909
|
-
children:
|
|
1905
|
+
children: [
|
|
1906
|
+
"$",
|
|
1907
|
+
formatNumber(trade.price, precision)
|
|
1908
|
+
]
|
|
1910
1909
|
}
|
|
1911
1910
|
),
|
|
1912
1911
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right tabular-nums text-white/90", children: formatNumber(trade.amount, amountPrecision) }),
|
|
1913
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-1.5
|
|
1914
|
-
trade.time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children: trade.time }),
|
|
1912
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-1.5", children: [
|
|
1913
|
+
trade.time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums text-white/50 text-xs", children: trade.time }),
|
|
1915
1914
|
explorerUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1916
1915
|
"a",
|
|
1917
1916
|
{
|
|
@@ -1979,8 +1978,8 @@ function DepthRow({
|
|
|
1979
1978
|
);
|
|
1980
1979
|
}
|
|
1981
1980
|
var clamp3 = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
1982
|
-
var LEVEL_ROWS_VISIBLE =
|
|
1983
|
-
var DEPTH_ROW_HEIGHT_PX =
|
|
1981
|
+
var LEVEL_ROWS_VISIBLE = 6;
|
|
1982
|
+
var DEPTH_ROW_HEIGHT_PX = 26;
|
|
1984
1983
|
var COMPACT_ROWS_VISIBLE = 5;
|
|
1985
1984
|
var COMPACT_ROW_HEIGHT_PX = 30;
|
|
1986
1985
|
var COMPACT_BREAKPOINT_PX = 1024;
|
|
@@ -2004,8 +2003,6 @@ var Orderbook = React5__namespace.forwardRef(
|
|
|
2004
2003
|
onPriceClick,
|
|
2005
2004
|
onLoafLiquidityClick,
|
|
2006
2005
|
tradeExplorerUrl,
|
|
2007
|
-
maxLevels,
|
|
2008
|
-
fillHeight = false,
|
|
2009
2006
|
className,
|
|
2010
2007
|
...props
|
|
2011
2008
|
}, ref) => {
|
|
@@ -2050,10 +2047,8 @@ var Orderbook = React5__namespace.forwardRef(
|
|
|
2050
2047
|
onTabChange?.(next);
|
|
2051
2048
|
};
|
|
2052
2049
|
const isCompact = variant === "compact" || variant === "auto" && viewportCompact;
|
|
2053
|
-
const
|
|
2054
|
-
const
|
|
2055
|
-
const sectionHeight = isCompact ? effectiveCompactLevels * COMPACT_ROW_HEIGHT_PX : effectiveLevels * DEPTH_ROW_HEIGHT_PX;
|
|
2056
|
-
const rowCount = isCompact ? effectiveCompactLevels : effectiveLevels;
|
|
2050
|
+
const sectionHeight = isCompact ? COMPACT_ROWS_VISIBLE * COMPACT_ROW_HEIGHT_PX : LEVEL_ROWS_VISIBLE * DEPTH_ROW_HEIGHT_PX;
|
|
2051
|
+
const rowCount = isCompact ? COMPACT_ROWS_VISIBLE : LEVEL_ROWS_VISIBLE;
|
|
2057
2052
|
const askVisibleLevels = asks.slice(-rowCount);
|
|
2058
2053
|
const bidVisibleLevels = bids.slice(0, rowCount);
|
|
2059
2054
|
const askCumDepths = new Array(askVisibleLevels.length);
|
|
@@ -2072,8 +2067,7 @@ var Orderbook = React5__namespace.forwardRef(
|
|
|
2072
2067
|
bidCumDepths[i] = acc;
|
|
2073
2068
|
}
|
|
2074
2069
|
}
|
|
2075
|
-
const
|
|
2076
|
-
const bidMaxCumDepth = Math.max(1, ...bidCumDepths);
|
|
2070
|
+
const combinedMaxCumDepth = Math.max(1, ...askCumDepths, ...bidCumDepths);
|
|
2077
2071
|
const midClass = midChangePercent == null ? "text-white" : midChangePercent >= 0 ? "text-[#0ecb81]" : "text-[#f6465d]";
|
|
2078
2072
|
const tradeFiltered = trades.filter((t) => tradeFilter === "all" || t.type === tradeFilter);
|
|
2079
2073
|
const layoutProps = {
|
|
@@ -2093,8 +2087,7 @@ var Orderbook = React5__namespace.forwardRef(
|
|
|
2093
2087
|
bidVisibleLevels,
|
|
2094
2088
|
askCumDepths,
|
|
2095
2089
|
bidCumDepths,
|
|
2096
|
-
|
|
2097
|
-
bidMaxCumDepth,
|
|
2090
|
+
combinedMaxCumDepth,
|
|
2098
2091
|
midPrice,
|
|
2099
2092
|
midChangePercent,
|
|
2100
2093
|
midClass,
|
|
@@ -2104,19 +2097,15 @@ var Orderbook = React5__namespace.forwardRef(
|
|
|
2104
2097
|
isLoading,
|
|
2105
2098
|
seenTradeKeysRef,
|
|
2106
2099
|
tradeExplorerUrl,
|
|
2107
|
-
onPriceClick
|
|
2108
|
-
levelCount: effectiveLevels,
|
|
2109
|
-
compactLevelCount: effectiveCompactLevels,
|
|
2110
|
-
fillHeight
|
|
2100
|
+
onPriceClick
|
|
2111
2101
|
};
|
|
2112
2102
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
2113
2103
|
Card,
|
|
2114
2104
|
{
|
|
2115
2105
|
ref,
|
|
2116
2106
|
className: cn(
|
|
2117
|
-
"w-full max-w-[520px] overflow-hidden rounded-[12px] border border-white/10 bg-[#111111] text-white shadow-md flex flex-col",
|
|
2107
|
+
"w-full max-w-[520px] overflow-hidden rounded-[12px] border border-white/10 bg-[#111111] text-white shadow-md flex flex-col h-full",
|
|
2118
2108
|
isCompact && "max-w-none",
|
|
2119
|
-
fillHeight && "h-full",
|
|
2120
2109
|
className
|
|
2121
2110
|
),
|
|
2122
2111
|
...props,
|
|
@@ -2165,8 +2154,7 @@ function DesktopOrderbookLayout({
|
|
|
2165
2154
|
bidVisibleLevels,
|
|
2166
2155
|
askCumDepths,
|
|
2167
2156
|
bidCumDepths,
|
|
2168
|
-
|
|
2169
|
-
bidMaxCumDepth,
|
|
2157
|
+
combinedMaxCumDepth,
|
|
2170
2158
|
midPrice,
|
|
2171
2159
|
midChangePercent,
|
|
2172
2160
|
midClass,
|
|
@@ -2176,10 +2164,7 @@ function DesktopOrderbookLayout({
|
|
|
2176
2164
|
isLoading,
|
|
2177
2165
|
seenTradeKeysRef,
|
|
2178
2166
|
tradeExplorerUrl,
|
|
2179
|
-
onPriceClick
|
|
2180
|
-
levelCount: effectiveLevels,
|
|
2181
|
-
compactLevelCount: _compactLevelCount,
|
|
2182
|
-
fillHeight
|
|
2167
|
+
onPriceClick
|
|
2183
2168
|
}) {
|
|
2184
2169
|
const midRef = React5__namespace.useRef(null);
|
|
2185
2170
|
useMidPriceFlash(midRef, midPrice, "#0b1a24");
|
|
@@ -2267,7 +2252,7 @@ function DesktopOrderbookLayout({
|
|
|
2267
2252
|
{
|
|
2268
2253
|
className: "max-h-[380px] overflow-y-auto overflow-x-hidden",
|
|
2269
2254
|
style: { scrollbarGutter: "stable" },
|
|
2270
|
-
children: isLoading && tradeFiltered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { children: Array.from({ length:
|
|
2255
|
+
children: isLoading && tradeFiltered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-white/5", children: Array.from({ length: LEVEL_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, {}, `trade-skel-${i}`)) }) : tradeFiltered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-10 text-center text-sm text-white/50", children: "No trades" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-white/5", children: tradeFiltered.map((trade, i) => {
|
|
2271
2256
|
const tradeKey = getTradeKey(trade, i);
|
|
2272
2257
|
const explorerUrl = trade.txHash && tradeExplorerUrl ? tradeExplorerUrl(trade.txHash) : trade.txHash ? `https://sepolia.etherscan.io/tx/${trade.txHash}` : void 0;
|
|
2273
2258
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -2284,20 +2269,20 @@ function DesktopOrderbookLayout({
|
|
|
2284
2269
|
);
|
|
2285
2270
|
}) })
|
|
2286
2271
|
}
|
|
2287
|
-
) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className:
|
|
2272
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col min-h-0", children: [
|
|
2288
2273
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2289
2274
|
"div",
|
|
2290
2275
|
{
|
|
2291
|
-
className:
|
|
2292
|
-
style:
|
|
2293
|
-
children: isLoading ? Array.from({ length:
|
|
2276
|
+
className: "flex flex-col justify-end divide-y divide-white/5 overflow-hidden",
|
|
2277
|
+
style: { height: `${sectionHeight}px` },
|
|
2278
|
+
children: isLoading ? Array.from({ length: LEVEL_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, {}, `ask-skel-${i}`)) : askVisibleLevels.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center px-3 text-xs text-white/40", children: "No asks" }) : askVisibleLevels.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2294
2279
|
DepthRow,
|
|
2295
2280
|
{
|
|
2296
2281
|
side: "ask",
|
|
2297
2282
|
price: l.price,
|
|
2298
2283
|
amount: l.amount,
|
|
2299
2284
|
cumDepth: askCumDepths[i],
|
|
2300
|
-
depthPct: askCumDepths[i] /
|
|
2285
|
+
depthPct: askCumDepths[i] / combinedMaxCumDepth * 100,
|
|
2301
2286
|
precision,
|
|
2302
2287
|
amountPrecision,
|
|
2303
2288
|
hasUserOrder: userAskPrices.has(l.price),
|
|
@@ -2311,7 +2296,7 @@ function DesktopOrderbookLayout({
|
|
|
2311
2296
|
"div",
|
|
2312
2297
|
{
|
|
2313
2298
|
ref: midRef,
|
|
2314
|
-
className: "grid grid-cols-2 items-center gap-3 bg-[#0b1a24] px-3 py-2
|
|
2299
|
+
className: "grid grid-cols-2 items-center gap-3 bg-[#0b1a24] px-3 py-2",
|
|
2315
2300
|
children: [
|
|
2316
2301
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-lg font-semibold tabular-nums", midClass), children: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 110, height: 20 }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
2317
2302
|
"$",
|
|
@@ -2329,16 +2314,16 @@ function DesktopOrderbookLayout({
|
|
|
2329
2314
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
2330
2315
|
"div",
|
|
2331
2316
|
{
|
|
2332
|
-
className:
|
|
2333
|
-
style:
|
|
2334
|
-
children: isLoading ? Array.from({ length:
|
|
2317
|
+
className: "divide-y divide-white/5 overflow-hidden",
|
|
2318
|
+
style: { height: `${sectionHeight}px` },
|
|
2319
|
+
children: isLoading ? Array.from({ length: LEVEL_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, {}, `bid-skel-${i}`)) : bidVisibleLevels.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center px-3 text-xs text-white/40", children: "No bids" }) : bidVisibleLevels.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2335
2320
|
DepthRow,
|
|
2336
2321
|
{
|
|
2337
2322
|
side: "bid",
|
|
2338
2323
|
price: l.price,
|
|
2339
2324
|
amount: l.amount,
|
|
2340
2325
|
cumDepth: bidCumDepths[i],
|
|
2341
|
-
depthPct: bidCumDepths[i] /
|
|
2326
|
+
depthPct: bidCumDepths[i] / combinedMaxCumDepth * 100,
|
|
2342
2327
|
precision,
|
|
2343
2328
|
amountPrecision,
|
|
2344
2329
|
hasUserOrder: userBidPrices.has(l.price),
|
|
@@ -2367,8 +2352,7 @@ function MobileOrderbookLayout({
|
|
|
2367
2352
|
bidVisibleLevels: visibleBids,
|
|
2368
2353
|
askCumDepths,
|
|
2369
2354
|
bidCumDepths,
|
|
2370
|
-
|
|
2371
|
-
bidMaxCumDepth,
|
|
2355
|
+
combinedMaxCumDepth,
|
|
2372
2356
|
midPrice,
|
|
2373
2357
|
midChangePercent,
|
|
2374
2358
|
midClass,
|
|
@@ -2378,9 +2362,7 @@ function MobileOrderbookLayout({
|
|
|
2378
2362
|
isLoading,
|
|
2379
2363
|
seenTradeKeysRef,
|
|
2380
2364
|
tradeExplorerUrl,
|
|
2381
|
-
onPriceClick
|
|
2382
|
-
levelCount: _levelCount,
|
|
2383
|
-
compactLevelCount: effectiveCompactLevels
|
|
2365
|
+
onPriceClick
|
|
2384
2366
|
}) {
|
|
2385
2367
|
const midRef = React5__namespace.useRef(null);
|
|
2386
2368
|
useMidPriceFlash(midRef, midPrice, "transparent");
|
|
@@ -2452,13 +2434,13 @@ function MobileOrderbookLayout({
|
|
|
2452
2434
|
]
|
|
2453
2435
|
}
|
|
2454
2436
|
),
|
|
2455
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column"
|
|
2437
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column" }, children: isLoading ? Array.from({ length: COMPACT_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, { compact: true }, `m-ask-skel-${i}`)) : visibleAsks.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "0.75rem 0", textAlign: "center", color: "rgba(255,255,255,0.4)", fontSize: "0.72rem" }, children: "No asks" }) : visibleAsks.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2456
2438
|
MobileDepthRow,
|
|
2457
2439
|
{
|
|
2458
2440
|
side: "ask",
|
|
2459
2441
|
price: l.price,
|
|
2460
2442
|
amount: l.amount,
|
|
2461
|
-
depthPct: askCumDepths[i] /
|
|
2443
|
+
depthPct: askCumDepths[i] / combinedMaxCumDepth * 100,
|
|
2462
2444
|
precision,
|
|
2463
2445
|
amountPrecision,
|
|
2464
2446
|
hasUserOrder: userAskPrices.has(l.price),
|
|
@@ -2499,13 +2481,13 @@ function MobileOrderbookLayout({
|
|
|
2499
2481
|
]
|
|
2500
2482
|
}
|
|
2501
2483
|
),
|
|
2502
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column"
|
|
2484
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", flexDirection: "column" }, children: isLoading ? Array.from({ length: COMPACT_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, { compact: true }, `m-bid-skel-${i}`)) : visibleBids.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { padding: "0.75rem 0", textAlign: "center", color: "rgba(255,255,255,0.4)", fontSize: "0.72rem" }, children: "No bids" }) : visibleBids.map((l, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
2503
2485
|
MobileDepthRow,
|
|
2504
2486
|
{
|
|
2505
2487
|
side: "bid",
|
|
2506
2488
|
price: l.price,
|
|
2507
2489
|
amount: l.amount,
|
|
2508
|
-
depthPct: bidCumDepths[i] /
|
|
2490
|
+
depthPct: bidCumDepths[i] / combinedMaxCumDepth * 100,
|
|
2509
2491
|
precision,
|
|
2510
2492
|
amountPrecision,
|
|
2511
2493
|
hasUserOrder: userBidPrices.has(l.price),
|
|
@@ -2525,7 +2507,7 @@ function MobileOrderbookLayout({
|
|
|
2525
2507
|
]
|
|
2526
2508
|
}
|
|
2527
2509
|
),
|
|
2528
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, overflowY: "auto", minHeight: 0 }, children: isLoading && tradeFiltered.length === 0 ? Array.from({ length:
|
|
2510
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, overflowY: "auto", minHeight: 0 }, children: isLoading && tradeFiltered.length === 0 ? Array.from({ length: COMPACT_ROWS_VISIBLE }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonRow, { compact: true }, `m-trade-skel-${i}`)) : tradeFiltered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-6 text-center text-[0.7rem] text-white/50", children: "No trades" }) : tradeFiltered.map((trade, i) => {
|
|
2529
2511
|
const tradeKey = getTradeKey(trade, i);
|
|
2530
2512
|
const explorerUrl = trade.txHash && tradeExplorerUrl ? tradeExplorerUrl(trade.txHash) : trade.txHash ? `https://sepolia.etherscan.io/tx/${trade.txHash}` : void 0;
|
|
2531
2513
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -2565,8 +2547,7 @@ function MobileDepthRow({
|
|
|
2565
2547
|
style: {
|
|
2566
2548
|
display: "grid",
|
|
2567
2549
|
gridTemplateColumns: "1.2fr 0.8fr",
|
|
2568
|
-
|
|
2569
|
-
alignItems: "center",
|
|
2550
|
+
padding: "0.2rem 0",
|
|
2570
2551
|
fontSize: "0.8rem",
|
|
2571
2552
|
position: "relative",
|
|
2572
2553
|
cursor: onPriceClick ? "pointer" : void 0
|
|
@@ -2709,7 +2690,7 @@ var PropertyTour = React5__namespace.forwardRef(
|
|
|
2709
2690
|
}
|
|
2710
2691
|
);
|
|
2711
2692
|
PropertyTour.displayName = "PropertyTour";
|
|
2712
|
-
var ITEMS_PER_PAGE =
|
|
2693
|
+
var ITEMS_PER_PAGE = 4;
|
|
2713
2694
|
var ensureAnimationsInjected = () => {
|
|
2714
2695
|
if (typeof document === "undefined") return;
|
|
2715
2696
|
if (document.getElementById("property-news-updates-animations")) return;
|
|
@@ -2754,22 +2735,6 @@ var formatDate = (value) => {
|
|
|
2754
2735
|
if (!(value instanceof Date) || Number.isNaN(value.getTime())) return "";
|
|
2755
2736
|
return value.toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" });
|
|
2756
2737
|
};
|
|
2757
|
-
var formatDateShort = (value) => {
|
|
2758
|
-
const d = typeof value === "string" ? new Date(value) : value;
|
|
2759
|
-
if (!(d instanceof Date) || Number.isNaN(d.getTime())) {
|
|
2760
|
-
if (typeof value === "string") {
|
|
2761
|
-
return value.replace(/\s*\d{4}\s*$/, "");
|
|
2762
|
-
}
|
|
2763
|
-
return "";
|
|
2764
|
-
}
|
|
2765
|
-
const diffMs = Date.now() - d.getTime();
|
|
2766
|
-
const diffS = diffMs / 1e3;
|
|
2767
|
-
if (diffS < 60) return "Just now";
|
|
2768
|
-
if (diffS < 3600) return `${Math.floor(diffS / 60)}m ago`;
|
|
2769
|
-
if (diffS < 86400) return `${Math.floor(diffS / 3600)}h ago`;
|
|
2770
|
-
const time = d.toLocaleTimeString(void 0, { hour: "numeric", minute: "2-digit", hour12: true });
|
|
2771
|
-
return `${time} \xB7 ${d.toLocaleDateString(void 0, { month: "short", day: "numeric" })}`;
|
|
2772
|
-
};
|
|
2773
2738
|
var formatTimeAgo = (timestamp) => {
|
|
2774
2739
|
const diff = (Date.now() - new Date(timestamp).getTime()) / 1e3;
|
|
2775
2740
|
if (diff < 60) return `${Math.floor(diff)}s ago`;
|
|
@@ -2780,7 +2745,7 @@ function getSentimentInfo(score) {
|
|
|
2780
2745
|
if (score == null) return null;
|
|
2781
2746
|
if (score > 0.15) return { arrow: "\u25B2", label: "Bullish", color: "#0ecb81" };
|
|
2782
2747
|
if (score < -0.15) return { arrow: "\u25BC", label: "Bearish", color: "#f6465d" };
|
|
2783
|
-
return { arrow: "", label: "Neutral", color: "#848e9c" };
|
|
2748
|
+
return { arrow: "\u2014", label: "Neutral", color: "#848e9c" };
|
|
2784
2749
|
}
|
|
2785
2750
|
function NewsArticleModal({ item, onClose }) {
|
|
2786
2751
|
const sentimentInfo = getSentimentInfo(item.sentimentScore);
|
|
@@ -2862,7 +2827,8 @@ function NewsArticleModal({ item, onClose }) {
|
|
|
2862
2827
|
border: `1px solid ${sentimentInfo.color}40`
|
|
2863
2828
|
},
|
|
2864
2829
|
children: [
|
|
2865
|
-
sentimentInfo.arrow
|
|
2830
|
+
sentimentInfo.arrow,
|
|
2831
|
+
" ",
|
|
2866
2832
|
sentimentInfo.label
|
|
2867
2833
|
]
|
|
2868
2834
|
}
|
|
@@ -2902,35 +2868,7 @@ function NewsArticleModal({ item, onClose }) {
|
|
|
2902
2868
|
)
|
|
2903
2869
|
] }),
|
|
2904
2870
|
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "1px", background: "rgba(255,255,255,0.08)", marginBottom: "1.25rem" } }),
|
|
2905
|
-
item.summary ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.875rem", color: "rgba(255,255,255,0.8)", lineHeight: 1.75, margin: 0 }, children: item.summary }) : /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.8rem", color: "rgba(255,255,255,0.35)", fontStyle: "italic", margin: 0 }, children: "Summary not available for this article." })
|
|
2906
|
-
item.url && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { marginTop: "1.25rem", paddingTop: "1rem", borderTop: "1px solid rgba(255,255,255,0.08)" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
2907
|
-
"a",
|
|
2908
|
-
{
|
|
2909
|
-
href: item.url,
|
|
2910
|
-
target: "_blank",
|
|
2911
|
-
rel: "noopener noreferrer",
|
|
2912
|
-
style: {
|
|
2913
|
-
display: "inline-flex",
|
|
2914
|
-
alignItems: "center",
|
|
2915
|
-
gap: "0.4rem",
|
|
2916
|
-
fontSize: "0.8rem",
|
|
2917
|
-
fontWeight: 600,
|
|
2918
|
-
color: "var(--color-accent, #f0b90b)",
|
|
2919
|
-
textDecoration: "none",
|
|
2920
|
-
transition: "opacity 0.15s"
|
|
2921
|
-
},
|
|
2922
|
-
onMouseEnter: (e) => {
|
|
2923
|
-
e.currentTarget.style.opacity = "0.8";
|
|
2924
|
-
},
|
|
2925
|
-
onMouseLeave: (e) => {
|
|
2926
|
-
e.currentTarget.style.opacity = "1";
|
|
2927
|
-
},
|
|
2928
|
-
children: [
|
|
2929
|
-
"Read full article",
|
|
2930
|
-
/* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 19H5V5h7V3H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z" }) })
|
|
2931
|
-
]
|
|
2932
|
-
}
|
|
2933
|
-
) })
|
|
2871
|
+
item.summary ? /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.875rem", color: "rgba(255,255,255,0.8)", lineHeight: 1.75, margin: 0 }, children: item.summary }) : /* @__PURE__ */ jsxRuntime.jsx("p", { style: { fontSize: "0.8rem", color: "rgba(255,255,255,0.35)", fontStyle: "italic", margin: 0 }, children: "Summary not available for this article." })
|
|
2934
2872
|
]
|
|
2935
2873
|
}
|
|
2936
2874
|
)
|
|
@@ -2962,7 +2900,6 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
2962
2900
|
const [homeTab, setHomeTab] = React5__namespace.useState("all");
|
|
2963
2901
|
const [homePage, setHomePage] = React5__namespace.useState(0);
|
|
2964
2902
|
const purchaseItems = purchasesProp ?? [];
|
|
2965
|
-
const [page, setPage] = React5__namespace.useState(0);
|
|
2966
2903
|
const [selectedItem, setSelectedItem] = React5__namespace.useState(null);
|
|
2967
2904
|
React5__namespace.useEffect(() => {
|
|
2968
2905
|
ensureAnimationsInjected();
|
|
@@ -2971,14 +2908,6 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
2971
2908
|
setHomePage(0);
|
|
2972
2909
|
}, [homeTab]);
|
|
2973
2910
|
const hasItems = Array.isArray(items) && items.length > 0;
|
|
2974
|
-
const totalPages = React5__namespace.useMemo(
|
|
2975
|
-
() => hasItems ? Math.max(1, Math.ceil(items.length / ITEMS_PER_PAGE)) : 1,
|
|
2976
|
-
[hasItems, items.length]
|
|
2977
|
-
);
|
|
2978
|
-
React5__namespace.useEffect(() => {
|
|
2979
|
-
setPage((prev) => Math.min(prev, totalPages - 1));
|
|
2980
|
-
}, [totalPages]);
|
|
2981
|
-
const paginatedItems = hasItems ? items.slice(page * ITEMS_PER_PAGE, page * ITEMS_PER_PAGE + ITEMS_PER_PAGE) : [];
|
|
2982
2911
|
const homeFilteredItems = React5__namespace.useMemo(
|
|
2983
2912
|
() => hasItems ? items.filter((it) => homeTab === "all" || it.type === homeTab) : [],
|
|
2984
2913
|
[hasItems, items, homeTab]
|
|
@@ -3000,10 +2929,10 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3000
2929
|
children: [
|
|
3001
2930
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
3002
2931
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
|
|
3003
|
-
isHomeVariant && /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "
|
|
2932
|
+
isHomeVariant && /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "currentColor", style: { color: "var(--color-text, #fff)" }, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-5 14H4v-4h11v4zm0-5H4V9h11v4zm5 5h-4V9h4v9z" }) }),
|
|
3004
2933
|
isPurchaseVariant && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { display: "inline-block", width: "8px", height: "8px", borderRadius: "50%", backgroundColor: "#0ecb81", boxShadow: "0 0 8px rgba(14,203,129,0.8)", animation: "propertyNewsPulse 1.5s infinite" } }),
|
|
3005
2934
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
3006
|
-
/* @__PURE__ */ jsxRuntime.jsx("p", { className: isHomeVariant ? "text-base font-semibold text-white" : "text-lg font-semibold text-white",
|
|
2935
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: isHomeVariant ? "text-base font-semibold text-white" : "text-lg font-semibold text-white", children: resolvedHeading }),
|
|
3007
2936
|
subheading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-white/60", children: subheading }) : null
|
|
3008
2937
|
] })
|
|
3009
2938
|
] }),
|
|
@@ -3018,7 +2947,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3018
2947
|
"LIVE"
|
|
3019
2948
|
] }) : null
|
|
3020
2949
|
] }),
|
|
3021
|
-
isHomeVariant && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap:
|
|
2950
|
+
isHomeVariant && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", gap: 0, marginTop: "0.75rem", marginBottom: "0.25rem" }, children: ["all", "property", "market"].map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
3022
2951
|
"button",
|
|
3023
2952
|
{
|
|
3024
2953
|
type: "button",
|
|
@@ -3027,8 +2956,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3027
2956
|
background: "transparent",
|
|
3028
2957
|
border: "none",
|
|
3029
2958
|
borderBottom: homeTab === tab ? "2px solid var(--color-accent, #f0b90b)" : "2px solid transparent",
|
|
3030
|
-
padding: "0
|
|
3031
|
-
marginBottom: "-1px",
|
|
2959
|
+
padding: "0.5rem 0.75rem",
|
|
3032
2960
|
fontSize: "0.75rem",
|
|
3033
2961
|
fontWeight: homeTab === tab ? 600 : 400,
|
|
3034
2962
|
color: homeTab === tab ? "var(--color-text, #fff)" : "var(--color-text-secondary, #848e9c)",
|
|
@@ -3042,8 +2970,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3042
2970
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3043
2971
|
"div",
|
|
3044
2972
|
{
|
|
3045
|
-
className:
|
|
3046
|
-
style: !isPurchaseVariant && !isHomeVariant ? { minHeight: `${ITEMS_PER_PAGE * 86}px` } : void 0,
|
|
2973
|
+
className: "mt-4 flex flex-1 flex-col gap-3 overflow-hidden",
|
|
3047
2974
|
children: isPurchaseVariant ? purchaseItems.length > 0 ? purchaseItems.slice(0, 7).map((purchase, index) => {
|
|
3048
2975
|
const maxAmount = 6e4;
|
|
3049
2976
|
const barPercent = Math.min(85, Math.max(15, purchase.amount / maxAmount * 100));
|
|
@@ -3081,7 +3008,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3081
3008
|
style: {
|
|
3082
3009
|
width: "100%",
|
|
3083
3010
|
textAlign: "left",
|
|
3084
|
-
|
|
3011
|
+
background: "transparent",
|
|
3085
3012
|
border: "none",
|
|
3086
3013
|
cursor: "pointer",
|
|
3087
3014
|
padding: "0.75rem 0",
|
|
@@ -3090,28 +3017,18 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3090
3017
|
justifyContent: "space-between",
|
|
3091
3018
|
alignItems: "flex-start",
|
|
3092
3019
|
gap: "0.5rem",
|
|
3093
|
-
color: "inherit"
|
|
3094
|
-
transition: "background-color 0.15s"
|
|
3095
|
-
},
|
|
3096
|
-
onMouseEnter: (e) => {
|
|
3097
|
-
e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.04)";
|
|
3098
|
-
const title = e.currentTarget.querySelector("h3");
|
|
3099
|
-
if (title) title.style.color = "var(--color-accent, #E6C87E)";
|
|
3100
|
-
},
|
|
3101
|
-
onMouseLeave: (e) => {
|
|
3102
|
-
e.currentTarget.style.backgroundColor = "transparent";
|
|
3103
|
-
const title = e.currentTarget.querySelector("h3");
|
|
3104
|
-
if (title) title.style.color = "#f8f9fa";
|
|
3020
|
+
color: "inherit"
|
|
3105
3021
|
},
|
|
3106
3022
|
children: [
|
|
3107
3023
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [
|
|
3108
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "0.
|
|
3024
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "0.85rem", fontWeight: 400, marginBottom: "0.25rem", color: "#f8f9fa", lineHeight: 1.4 }, children: item.title }),
|
|
3109
3025
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.5rem", alignItems: "center", flexWrap: "wrap" }, children: [
|
|
3110
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#848e9c", fontSize: "0.7rem" }, children:
|
|
3026
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#848e9c", fontSize: "0.7rem" }, children: typeof item.date === "string" ? item.date : formatDate(item.date) }),
|
|
3111
3027
|
item.source && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { padding: "0.1rem 0.4rem", borderRadius: "3px", fontSize: "0.62rem", fontWeight: 500, backgroundColor: "rgba(255,255,255,0.07)", color: "#848e9c", whiteSpace: "nowrap" }, children: item.source }),
|
|
3112
3028
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { padding: "0.15rem 0.4rem", borderRadius: "2px", fontSize: "0.65rem", fontWeight: 500, backgroundColor: isProperty ? "rgba(14,203,129,0.1)" : "rgba(240,185,11,0.1)", color: isProperty ? "#0ecb81" : "#f0b90b" }, children: isProperty ? "Property Update" : "Market News" }),
|
|
3113
3029
|
sentimentInfo && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.65rem", fontWeight: 600, color: sentimentInfo.color }, children: [
|
|
3114
|
-
sentimentInfo.arrow
|
|
3030
|
+
sentimentInfo.arrow,
|
|
3031
|
+
" ",
|
|
3115
3032
|
sentimentInfo.label
|
|
3116
3033
|
] })
|
|
3117
3034
|
] })
|
|
@@ -3121,12 +3038,11 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3121
3038
|
},
|
|
3122
3039
|
key
|
|
3123
3040
|
);
|
|
3124
|
-
}) : emptyState ?? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col items-center justify-center py-10 text-center text-sm text-white/60", children: "No property news yet." }) : hasItems ?
|
|
3125
|
-
const
|
|
3126
|
-
const key = item.displayId ?? item.id ?? `${item.title}-${absoluteIndex}`;
|
|
3041
|
+
}) : emptyState ?? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col items-center justify-center py-10 text-center text-sm text-white/60", children: "No property news yet." }) : hasItems ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { overflowY: "auto", maxHeight: "520px", display: "flex", flexDirection: "column", gap: "0" }, children: items.map((item, index) => {
|
|
3042
|
+
const key = item.displayId ?? item.id ?? `${item.title}-${index}`;
|
|
3127
3043
|
const catStyle = categoryStyles[item.type] ?? categoryStyles.market;
|
|
3128
|
-
const dateLabel = item.isNew ?? (highlightFirst &&
|
|
3129
|
-
const isHighlighted = item.isNew ?? (highlightFirst &&
|
|
3044
|
+
const dateLabel = item.isNew ?? (highlightFirst && index === 0) ? "Just now" : typeof item.date === "string" && item.date.trim().length > 0 ? item.date : formatDate(item.date);
|
|
3045
|
+
const isHighlighted = item.isNew ?? (highlightFirst && index === 0);
|
|
3130
3046
|
const sentimentInfo = getSentimentInfo(item.sentimentScore);
|
|
3131
3047
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3132
3048
|
"button",
|
|
@@ -3168,7 +3084,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3168
3084
|
] }),
|
|
3169
3085
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "flex-end", gap: "0.3rem", flexShrink: 0 }, children: [
|
|
3170
3086
|
sentimentInfo && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.65rem", fontWeight: 700, color: sentimentInfo.color, whiteSpace: "nowrap" }, children: [
|
|
3171
|
-
sentimentInfo.arrow
|
|
3087
|
+
sentimentInfo.arrow,
|
|
3088
|
+
" ",
|
|
3172
3089
|
sentimentInfo.label
|
|
3173
3090
|
] }),
|
|
3174
3091
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { padding: "0.25rem 0.6rem", borderRadius: "4px", border: `1px solid ${catStyle.borderColor}`, backgroundColor: catStyle.backgroundColor, color: catStyle.color, fontSize: "0.68rem", fontWeight: 600, textTransform: "uppercase", whiteSpace: "nowrap" }, children: item.type === "property" ? catStyle.label : "Market News" })
|
|
@@ -3180,7 +3097,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3180
3097
|
},
|
|
3181
3098
|
key
|
|
3182
3099
|
);
|
|
3183
|
-
}) : emptyState ?? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl border border-dashed border-white/20 px-6 py-10 text-center text-sm text-white/60", children: [
|
|
3100
|
+
}) }) : emptyState ?? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center rounded-2xl border border-dashed border-white/20 px-6 py-10 text-center text-sm text-white/60", children: [
|
|
3184
3101
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Newspaper, { className: "mb-3 h-8 w-8 text-white/40" }),
|
|
3185
3102
|
"No property news yet. Updates will land here as soon as we receive new intelligence."
|
|
3186
3103
|
] })
|
|
@@ -3193,8 +3110,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3193
3110
|
type: "button",
|
|
3194
3111
|
onClick: () => setHomePage((p) => Math.max(0, p - 1)),
|
|
3195
3112
|
disabled: homePage === 0,
|
|
3196
|
-
style: { background: "transparent", border: "1px solid rgba(255,255,255,0.15)", borderRadius: "
|
|
3197
|
-
children:
|
|
3113
|
+
style: { background: "transparent", border: "1px solid rgba(255,255,255,0.15)", borderRadius: "999px", padding: "0.2rem 0.75rem", fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.15em", cursor: homePage === 0 ? "not-allowed" : "pointer", opacity: homePage === 0 ? 0.4 : 1, color: "rgba(255,255,255,0.6)" },
|
|
3114
|
+
children: "Prev"
|
|
3198
3115
|
}
|
|
3199
3116
|
),
|
|
3200
3117
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.7rem", color: "rgba(255,255,255,0.5)" }, children: [
|
|
@@ -3208,38 +3125,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
|
|
|
3208
3125
|
type: "button",
|
|
3209
3126
|
onClick: () => setHomePage((p) => Math.min(homeTotalPages - 1, p + 1)),
|
|
3210
3127
|
disabled: homePage >= homeTotalPages - 1,
|
|
3211
|
-
style: { background: "transparent", border: "1px solid rgba(255,255,255,0.15)", borderRadius: "
|
|
3212
|
-
children:
|
|
3213
|
-
}
|
|
3214
|
-
)
|
|
3215
|
-
] }),
|
|
3216
|
-
!isPurchaseVariant && !isHomeVariant && hasItems && totalPages > 1 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center justify-between text-xs text-white/60", children: [
|
|
3217
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3218
|
-
"button",
|
|
3219
|
-
{
|
|
3220
|
-
type: "button",
|
|
3221
|
-
onClick: () => setPage((p) => Math.max(0, p - 1)),
|
|
3222
|
-
disabled: page === 0,
|
|
3223
|
-
className: cn("rounded-full border border-white/15 flex items-center justify-center", page === 0 ? "opacity-40 cursor-not-allowed" : "hover:border-white/40"),
|
|
3224
|
-
style: { width: "28px", height: "28px", padding: 0, background: "transparent", color: "rgba(255,255,255,0.6)" },
|
|
3225
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" }) })
|
|
3226
|
-
}
|
|
3227
|
-
),
|
|
3228
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-white/70", children: [
|
|
3229
|
-
"Page ",
|
|
3230
|
-
page + 1,
|
|
3231
|
-
" / ",
|
|
3232
|
-
totalPages
|
|
3233
|
-
] }),
|
|
3234
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3235
|
-
"button",
|
|
3236
|
-
{
|
|
3237
|
-
type: "button",
|
|
3238
|
-
onClick: () => setPage((p) => Math.min(totalPages - 1, p + 1)),
|
|
3239
|
-
disabled: page >= totalPages - 1,
|
|
3240
|
-
className: cn("rounded-full border border-white/15 flex items-center justify-center", page >= totalPages - 1 ? "opacity-40 cursor-not-allowed" : "hover:border-white/40"),
|
|
3241
|
-
style: { width: "28px", height: "28px", padding: 0, background: "transparent", color: "rgba(255,255,255,0.6)" },
|
|
3242
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" }) })
|
|
3128
|
+
style: { background: "transparent", border: "1px solid rgba(255,255,255,0.15)", borderRadius: "999px", padding: "0.2rem 0.75rem", fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.15em", cursor: homePage >= homeTotalPages - 1 ? "not-allowed" : "pointer", opacity: homePage >= homeTotalPages - 1 ? 0.4 : 1, color: "rgba(255,255,255,0.6)" },
|
|
3129
|
+
children: "Next"
|
|
3243
3130
|
}
|
|
3244
3131
|
)
|
|
3245
3132
|
] }),
|
|
@@ -4742,16 +4629,14 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
|
|
|
4742
4629
|
imageUrl,
|
|
4743
4630
|
imageAlt,
|
|
4744
4631
|
name,
|
|
4745
|
-
address,
|
|
4746
4632
|
location,
|
|
4747
4633
|
price,
|
|
4748
4634
|
currencySymbol = "$",
|
|
4749
4635
|
changePercent,
|
|
4750
|
-
|
|
4751
|
-
|
|
4752
|
-
|
|
4753
|
-
|
|
4754
|
-
propertyTypeLabel: _propertyTypeLabel,
|
|
4636
|
+
beds,
|
|
4637
|
+
baths,
|
|
4638
|
+
cars,
|
|
4639
|
+
propertyTypeLabel,
|
|
4755
4640
|
onTrade,
|
|
4756
4641
|
onMakeOffer,
|
|
4757
4642
|
tradeButtonLabel = "Trade",
|
|
@@ -4767,6 +4652,7 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
|
|
|
4767
4652
|
const tradeHoverColor = "#f5dd9a";
|
|
4768
4653
|
const [isTradeInteracting, setIsTradeInteracting] = React5__namespace.useState(false);
|
|
4769
4654
|
const [isOfferInteracting, setIsOfferInteracting] = React5__namespace.useState(false);
|
|
4655
|
+
const hasAmenities = isLoading || beds != null || baths != null || cars != null || propertyTypeLabel != null;
|
|
4770
4656
|
const isTradeDisabled = !onTrade;
|
|
4771
4657
|
const isMakeOfferButtonDisabled = makeOfferDisabled || !onMakeOffer;
|
|
4772
4658
|
const showMakeOfferButton = !hideMakeOfferButton;
|
|
@@ -4779,112 +4665,201 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
|
|
|
4779
4665
|
setIsOfferInteracting(state);
|
|
4780
4666
|
};
|
|
4781
4667
|
const headingStyle = {
|
|
4782
|
-
fontSize: "clamp(1.
|
|
4783
|
-
marginBottom: "0",
|
|
4668
|
+
fontSize: "clamp(1.6rem, 4vw, 2.5rem)",
|
|
4669
|
+
marginBottom: "0.5rem",
|
|
4784
4670
|
color: "#ffffff",
|
|
4785
4671
|
textShadow: "0 2px 4px rgba(0, 0, 0, 0.3)",
|
|
4786
4672
|
fontWeight: 600,
|
|
4787
4673
|
lineHeight: 1.2
|
|
4788
4674
|
};
|
|
4789
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
4790
|
-
/* @__PURE__ */ jsxRuntime.
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
statusBadge
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4803
|
-
|
|
4804
|
-
/* @__PURE__ */ jsxRuntime.
|
|
4805
|
-
/* @__PURE__ */ jsxRuntime.
|
|
4806
|
-
/* @__PURE__ */ jsxRuntime.
|
|
4807
|
-
|
|
4808
|
-
|
|
4675
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(OuterWrapper, { ref, className: cn(className), ...props, children: [
|
|
4676
|
+
/* @__PURE__ */ jsxRuntime.jsxs(HeroContainer, { children: [
|
|
4677
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4678
|
+
HeroImage,
|
|
4679
|
+
{
|
|
4680
|
+
src: imageUrl,
|
|
4681
|
+
alt: imageAlt ?? name
|
|
4682
|
+
}
|
|
4683
|
+
),
|
|
4684
|
+
statusBadge ? /* @__PURE__ */ jsxRuntime.jsxs(StatusBadge, { $isLive: statusBadge.variant === "live", children: [
|
|
4685
|
+
statusBadge.variant === "live" ? /* @__PURE__ */ jsxRuntime.jsx(PulsingDot, {}) : null,
|
|
4686
|
+
statusBadge.label
|
|
4687
|
+
] }) : null,
|
|
4688
|
+
/* @__PURE__ */ jsxRuntime.jsx(HeroGradient, { "aria-hidden": "true" }),
|
|
4689
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-0 left-0 right-0 z-10 flex w-full items-end justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full max-w-[1800px] flex-wrap items-end justify-between gap-4 p-8 max-[768px]:flex-col max-[768px]:items-start max-[768px]:gap-4 max-[768px]:p-6 max-[480px]:p-4", children: [
|
|
4690
|
+
/* @__PURE__ */ jsxRuntime.jsxs(InfoCard, { children: [
|
|
4691
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-2", children: [
|
|
4692
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { style: headingStyle, className: "break-words", children: name }),
|
|
4693
|
+
/* @__PURE__ */ jsxRuntime.jsxs(InfoRow, { className: "mb-3 max-[768px]:mb-[0.6rem] max-[480px]:mb-[0.5rem]", children: [
|
|
4694
|
+
/* @__PURE__ */ jsxRuntime.jsx(LocationText, { children: location }),
|
|
4695
|
+
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(PriceBlock, { children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 110, height: 18 }) }) : price == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(PriceBlock, { children: [
|
|
4696
|
+
formatPrice3(price, currencySymbol),
|
|
4697
|
+
changePercent == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4698
|
+
"span",
|
|
4699
|
+
{
|
|
4700
|
+
className: cn(
|
|
4701
|
+
"ml-2 flex items-center text-[0.875rem] font-medium",
|
|
4702
|
+
isPositive ? "text-[#0ecb81]" : "text-[#f6465d]"
|
|
4703
|
+
),
|
|
4704
|
+
children: [
|
|
4705
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4706
|
+
"svg",
|
|
4707
|
+
{
|
|
4708
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
4709
|
+
width: "12",
|
|
4710
|
+
height: "12",
|
|
4711
|
+
viewBox: "0 0 24 24",
|
|
4712
|
+
fill: "currentColor",
|
|
4713
|
+
className: "mr-[0.15rem]",
|
|
4714
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: isPositive ? "M7 14l5-5 5 5H7z" : "M7 10l5 5 5-5H7z" })
|
|
4715
|
+
}
|
|
4716
|
+
),
|
|
4717
|
+
Math.abs(changePercent).toFixed(2),
|
|
4718
|
+
"%"
|
|
4719
|
+
]
|
|
4720
|
+
}
|
|
4721
|
+
)
|
|
4722
|
+
] })
|
|
4723
|
+
] })
|
|
4724
|
+
] }),
|
|
4725
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-6 text-[0.95rem] text-white/90 max-[768px]:hidden", children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4726
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4727
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
|
|
4728
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 52, height: 14 })
|
|
4809
4729
|
] }),
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 110, height: 24 }) : price == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(PriceRow, { children: [
|
|
4814
|
-
/* @__PURE__ */ jsxRuntime.jsx(CurrencyLabel, { children: "USD" }),
|
|
4815
|
-
changePercent != null ? /* @__PURE__ */ jsxRuntime.jsx(PriceArrow, { $isPositive: isPositive, children: isPositive ? "\u25B2" : "\u25BC" }) : null,
|
|
4816
|
-
formatPrice3(price, "")
|
|
4730
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4731
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
|
|
4732
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 56, height: 14 })
|
|
4817
4733
|
] }),
|
|
4818
|
-
|
|
4819
|
-
|
|
4820
|
-
|
|
4821
|
-
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
|
|
4880
|
-
|
|
4881
|
-
|
|
4882
|
-
|
|
4883
|
-
|
|
4884
|
-
|
|
4885
|
-
|
|
4886
|
-
|
|
4887
|
-
|
|
4734
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4735
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
|
|
4736
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 50, height: 14 })
|
|
4737
|
+
] }),
|
|
4738
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 60, height: 14 })
|
|
4739
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4740
|
+
beds == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4741
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "mr-2 h-[18px] w-[18px]" }),
|
|
4742
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4743
|
+
beds,
|
|
4744
|
+
" Beds"
|
|
4745
|
+
] })
|
|
4746
|
+
] }),
|
|
4747
|
+
baths == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4748
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "mr-2 h-[18px] w-[18px]" }),
|
|
4749
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4750
|
+
baths,
|
|
4751
|
+
" Baths"
|
|
4752
|
+
] })
|
|
4753
|
+
] }),
|
|
4754
|
+
cars == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
4755
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "mr-2 h-[18px] w-[18px]" }),
|
|
4756
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4757
|
+
cars,
|
|
4758
|
+
" Cars"
|
|
4759
|
+
] })
|
|
4760
|
+
] }),
|
|
4761
|
+
propertyTypeLabel == null ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { children: propertyTypeLabel })
|
|
4762
|
+
] }) })
|
|
4763
|
+
] }),
|
|
4764
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ActionButtons, { children: [
|
|
4765
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4766
|
+
"button",
|
|
4767
|
+
{
|
|
4768
|
+
type: "button",
|
|
4769
|
+
onClick: isTradeDisabled ? void 0 : onTrade,
|
|
4770
|
+
className: "flex items-center justify-center rounded border font-semibold transition-all duration-200 hover:-translate-y-0.5 hover:shadow-[0_4px_8px_rgba(0,0,0,0.2)] active:translate-y-0 active:shadow-[0_2px_4px_rgba(0,0,0,0.1)] text-[0.95rem] max-[480px]:text-[0.9rem]",
|
|
4771
|
+
style: {
|
|
4772
|
+
backgroundColor: isTradeInteracting ? tradeHoverColor : accentColor,
|
|
4773
|
+
color: "black",
|
|
4774
|
+
padding: "0.75rem 1.5rem",
|
|
4775
|
+
borderColor: isTradeInteracting ? accentColor : "transparent",
|
|
4776
|
+
boxShadow: isTradeInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
|
|
4777
|
+
opacity: isTradeDisabled ? 0.5 : 1,
|
|
4778
|
+
cursor: isTradeDisabled ? "not-allowed" : "pointer"
|
|
4779
|
+
},
|
|
4780
|
+
onMouseEnter: () => setTradeInteraction(true),
|
|
4781
|
+
onMouseLeave: () => setTradeInteraction(false),
|
|
4782
|
+
onMouseDown: () => setTradeInteraction(true),
|
|
4783
|
+
onMouseUp: () => setTradeInteraction(false),
|
|
4784
|
+
onFocus: () => setTradeInteraction(true),
|
|
4785
|
+
onBlur: () => setTradeInteraction(false),
|
|
4786
|
+
onTouchStart: () => setTradeInteraction(true),
|
|
4787
|
+
onTouchEnd: () => setTradeInteraction(false),
|
|
4788
|
+
disabled: isTradeDisabled,
|
|
4789
|
+
"aria-disabled": isTradeDisabled,
|
|
4790
|
+
children: tradeButtonLabel
|
|
4791
|
+
}
|
|
4792
|
+
),
|
|
4793
|
+
showMakeOfferButton ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4794
|
+
"button",
|
|
4795
|
+
{
|
|
4796
|
+
type: "button",
|
|
4797
|
+
onClick: isMakeOfferButtonDisabled ? void 0 : onMakeOffer,
|
|
4798
|
+
className: "flex items-center justify-center rounded border font-semibold transition-all duration-200 hover:-translate-y-0.5 hover:shadow-[0_4px_8px_rgba(0,0,0,0.2)] active:translate-y-0 active:shadow-[0_2px_4px_rgba(0,0,0,0.1)] text-[0.95rem] max-[480px]:text-[0.9rem]",
|
|
4799
|
+
style: {
|
|
4800
|
+
backgroundColor: isOfferInteracting ? accentColor : "transparent",
|
|
4801
|
+
borderColor: accentColor,
|
|
4802
|
+
color: isOfferInteracting ? "black" : accentColor,
|
|
4803
|
+
padding: "0.75rem 1.5rem",
|
|
4804
|
+
boxShadow: isOfferInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
|
|
4805
|
+
opacity: isMakeOfferButtonDisabled ? 0.5 : 1,
|
|
4806
|
+
cursor: isMakeOfferButtonDisabled ? "not-allowed" : "pointer"
|
|
4807
|
+
},
|
|
4808
|
+
onMouseEnter: () => setOfferInteraction(true),
|
|
4809
|
+
onMouseLeave: () => setOfferInteraction(false),
|
|
4810
|
+
onMouseDown: () => setOfferInteraction(true),
|
|
4811
|
+
onMouseUp: () => setOfferInteraction(false),
|
|
4812
|
+
onFocus: () => setOfferInteraction(true),
|
|
4813
|
+
onBlur: () => setOfferInteraction(false),
|
|
4814
|
+
onTouchStart: () => setOfferInteraction(true),
|
|
4815
|
+
onTouchEnd: () => setOfferInteraction(false),
|
|
4816
|
+
disabled: isMakeOfferButtonDisabled,
|
|
4817
|
+
"aria-disabled": isMakeOfferButtonDisabled,
|
|
4818
|
+
children: makeOfferButtonLabel
|
|
4819
|
+
}
|
|
4820
|
+
) : null
|
|
4821
|
+
] })
|
|
4822
|
+
] }) })
|
|
4823
|
+
] }),
|
|
4824
|
+
hasAmenities ? /* @__PURE__ */ jsxRuntime.jsx(MobileAmenities, { children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4825
|
+
/* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4826
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "h-4 w-4 opacity-60" }),
|
|
4827
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 40, height: 12 })
|
|
4828
|
+
] }),
|
|
4829
|
+
/* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4830
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "h-4 w-4 opacity-60" }),
|
|
4831
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 44, height: 12 })
|
|
4832
|
+
] }),
|
|
4833
|
+
/* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4834
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "h-4 w-4 opacity-60" }),
|
|
4835
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 42, height: 12 })
|
|
4836
|
+
] }),
|
|
4837
|
+
/* @__PURE__ */ jsxRuntime.jsx(MobileAmenity, { children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 52, height: 12 }) })
|
|
4838
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4839
|
+
beds == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4840
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "h-4 w-4" }),
|
|
4841
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4842
|
+
beds,
|
|
4843
|
+
" Beds"
|
|
4844
|
+
] })
|
|
4845
|
+
] }),
|
|
4846
|
+
baths == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4847
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "h-4 w-4" }),
|
|
4848
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4849
|
+
baths,
|
|
4850
|
+
" Baths"
|
|
4851
|
+
] })
|
|
4852
|
+
] }),
|
|
4853
|
+
cars == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
|
|
4854
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "h-4 w-4" }),
|
|
4855
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
4856
|
+
cars,
|
|
4857
|
+
" Cars"
|
|
4858
|
+
] })
|
|
4859
|
+
] }),
|
|
4860
|
+
propertyTypeLabel == null ? null : /* @__PURE__ */ jsxRuntime.jsx(MobileAmenity, { children: propertyTypeLabel })
|
|
4861
|
+
] }) }) : null
|
|
4862
|
+
] });
|
|
4888
4863
|
}
|
|
4889
4864
|
);
|
|
4890
4865
|
PropertyHeroHeader.displayName = "PropertyHeroHeader";
|
|
@@ -4927,6 +4902,32 @@ var HeroContainer = styled25__default.default.div`
|
|
|
4927
4902
|
border-radius: 6px;
|
|
4928
4903
|
}
|
|
4929
4904
|
`;
|
|
4905
|
+
var MobileAmenities = styled25__default.default.div`
|
|
4906
|
+
display: none;
|
|
4907
|
+
align-items: center;
|
|
4908
|
+
justify-content: space-between;
|
|
4909
|
+
gap: 0.5rem;
|
|
4910
|
+
padding: 0.5rem 0.75rem;
|
|
4911
|
+
background: rgba(8, 8, 12, 0.85);
|
|
4912
|
+
border-radius: 12px;
|
|
4913
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
4914
|
+
color: rgba(255, 255, 255, 0.85);
|
|
4915
|
+
font-size: 0.85rem;
|
|
4916
|
+
|
|
4917
|
+
@media (max-width: 768px) {
|
|
4918
|
+
display: flex;
|
|
4919
|
+
flex-wrap: wrap;
|
|
4920
|
+
}
|
|
4921
|
+
`;
|
|
4922
|
+
var MobileAmenity = styled25__default.default.span`
|
|
4923
|
+
display: inline-flex;
|
|
4924
|
+
align-items: center;
|
|
4925
|
+
gap: 0.35rem;
|
|
4926
|
+
padding: 0.35rem 0.5rem;
|
|
4927
|
+
border-radius: 999px;
|
|
4928
|
+
background: rgba(255, 255, 255, 0.08);
|
|
4929
|
+
font-weight: 500;
|
|
4930
|
+
`;
|
|
4930
4931
|
var HeroImage = styled25__default.default.img`
|
|
4931
4932
|
width: 100%;
|
|
4932
4933
|
height: 100%;
|
|
@@ -4941,6 +4942,15 @@ var HeroImage = styled25__default.default.img`
|
|
|
4941
4942
|
transform: scale(1.0);
|
|
4942
4943
|
transform-origin: center;
|
|
4943
4944
|
`;
|
|
4945
|
+
var HeroGradient = styled25__default.default.div`
|
|
4946
|
+
position: absolute;
|
|
4947
|
+
bottom: 0;
|
|
4948
|
+
left: 0;
|
|
4949
|
+
right: 0;
|
|
4950
|
+
width: 100%;
|
|
4951
|
+
z-index: 1;
|
|
4952
|
+
background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0) 100%);
|
|
4953
|
+
`;
|
|
4944
4954
|
var ActionButtons = styled25__default.default.div`
|
|
4945
4955
|
display: flex;
|
|
4946
4956
|
flex-wrap: wrap;
|
|
@@ -4956,42 +4966,13 @@ var ActionButtons = styled25__default.default.div`
|
|
|
4956
4966
|
display: none;
|
|
4957
4967
|
}
|
|
4958
4968
|
`;
|
|
4959
|
-
var CardLayout = styled25__default.default.div`
|
|
4960
|
-
display: flex;
|
|
4961
|
-
align-items: center;
|
|
4962
|
-
gap: 1rem;
|
|
4963
|
-
|
|
4964
|
-
@media (max-width: 480px) {
|
|
4965
|
-
gap: 0.75rem;
|
|
4966
|
-
}
|
|
4967
|
-
`;
|
|
4968
|
-
var Thumbnail = styled25__default.default.img`
|
|
4969
|
-
width: 72px;
|
|
4970
|
-
height: 72px;
|
|
4971
|
-
border-radius: 8px;
|
|
4972
|
-
object-fit: cover;
|
|
4973
|
-
flex-shrink: 0;
|
|
4974
|
-
border: 1px solid rgba(255, 255, 255, 0.15);
|
|
4975
|
-
|
|
4976
|
-
@media (max-width: 768px) {
|
|
4977
|
-
width: 56px;
|
|
4978
|
-
height: 56px;
|
|
4979
|
-
border-radius: 6px;
|
|
4980
|
-
}
|
|
4981
|
-
|
|
4982
|
-
@media (max-width: 480px) {
|
|
4983
|
-
width: 48px;
|
|
4984
|
-
height: 48px;
|
|
4985
|
-
}
|
|
4986
|
-
`;
|
|
4987
|
-
var CardContent2 = styled25__default.default.div`
|
|
4988
|
-
min-width: 0;
|
|
4989
|
-
flex: 1;
|
|
4990
|
-
`;
|
|
4991
4969
|
var InfoCard = styled25__default.default.div`
|
|
4970
|
+
display: inline-block;
|
|
4971
|
+
width: fit-content;
|
|
4972
|
+
max-width: 70%;
|
|
4992
4973
|
border-radius: 12px;
|
|
4993
|
-
background: rgba(0, 0, 0, 0.
|
|
4994
|
-
padding: 1rem
|
|
4974
|
+
background: rgba(0, 0, 0, 0.12);
|
|
4975
|
+
padding: 0.75rem 1rem;
|
|
4995
4976
|
color: #fff;
|
|
4996
4977
|
backdrop-filter: blur(6px);
|
|
4997
4978
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
|
|
@@ -4999,92 +4980,45 @@ var InfoCard = styled25__default.default.div`
|
|
|
4999
4980
|
min-width: 0;
|
|
5000
4981
|
|
|
5001
4982
|
@media (max-width: 768px) {
|
|
5002
|
-
|
|
4983
|
+
max-width: 85%;
|
|
4984
|
+
}
|
|
4985
|
+
|
|
4986
|
+
@media (max-width: 640px) {
|
|
4987
|
+
max-width: 92%;
|
|
5003
4988
|
}
|
|
5004
4989
|
|
|
5005
4990
|
@media (max-width: 480px) {
|
|
5006
|
-
|
|
4991
|
+
max-width: 95%;
|
|
5007
4992
|
}
|
|
5008
4993
|
`;
|
|
5009
|
-
var
|
|
5010
|
-
display:
|
|
4994
|
+
var InfoRow = styled25__default.default.div`
|
|
4995
|
+
display: grid;
|
|
4996
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
5011
4997
|
align-items: center;
|
|
5012
4998
|
gap: 0.75rem;
|
|
5013
|
-
|
|
5014
|
-
|
|
4999
|
+
width: 100%;
|
|
5000
|
+
|
|
5001
|
+
@media (max-width: 640px) {
|
|
5002
|
+
gap: 0.5rem;
|
|
5003
|
+
}
|
|
5015
5004
|
`;
|
|
5016
|
-
var
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
5021
|
-
|
|
5022
|
-
font-weight: 600;
|
|
5023
|
-
letter-spacing: 0.03em;
|
|
5024
|
-
text-transform: uppercase;
|
|
5025
|
-
line-height: 1;
|
|
5026
|
-
color: #E6C87E;
|
|
5027
|
-
background: rgba(230, 200, 126, 0.12);
|
|
5005
|
+
var LocationText = styled25__default.default.span`
|
|
5006
|
+
font-size: clamp(1rem, 2.6vw, 1.25rem);
|
|
5007
|
+
color: rgba(255, 255, 255, 0.9);
|
|
5008
|
+
font-weight: 500;
|
|
5009
|
+
overflow: hidden;
|
|
5010
|
+
text-overflow: ellipsis;
|
|
5028
5011
|
white-space: nowrap;
|
|
5029
|
-
flex-shrink: 0;
|
|
5030
5012
|
`;
|
|
5031
|
-
var
|
|
5013
|
+
var PriceBlock = styled25__default.default.span`
|
|
5032
5014
|
display: flex;
|
|
5033
|
-
align-items: baseline;
|
|
5034
|
-
justify-content: space-between;
|
|
5035
|
-
gap: 1rem;
|
|
5036
|
-
`;
|
|
5037
|
-
var PriceGroup = styled25__default.default.div`
|
|
5038
|
-
display: flex;
|
|
5039
|
-
flex-direction: column;
|
|
5040
|
-
align-items: flex-end;
|
|
5041
|
-
flex-shrink: 0;
|
|
5042
|
-
`;
|
|
5043
|
-
var PriceRow = styled25__default.default.span`
|
|
5044
|
-
display: inline-flex;
|
|
5045
|
-
align-items: baseline;
|
|
5046
|
-
font-size: clamp(1.3rem, 3vw, 1.8rem);
|
|
5047
|
-
font-weight: 600;
|
|
5048
|
-
color: #fff;
|
|
5049
|
-
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'JetBrains Mono', ui-monospace, monospace;
|
|
5050
|
-
font-variant-numeric: tabular-nums;
|
|
5051
|
-
white-space: nowrap;
|
|
5052
|
-
flex-shrink: 0;
|
|
5053
|
-
`;
|
|
5054
|
-
var CurrencyLabel = styled25__default.default.span`
|
|
5055
|
-
font-size: 0.55em;
|
|
5056
|
-
font-weight: 500;
|
|
5057
|
-
color: rgba(255, 255, 255, 0.4);
|
|
5058
|
-
margin-right: 0.3em;
|
|
5059
|
-
`;
|
|
5060
|
-
var PriceArrow = styled25__default.default.span`
|
|
5061
|
-
color: ${({ $isPositive }) => $isPositive ? "#0ecb81" : "#f6465d"};
|
|
5062
|
-
font-size: 0.65em;
|
|
5063
|
-
margin: 0 0.1em;
|
|
5064
|
-
`;
|
|
5065
|
-
var AddressText = styled25__default.default.p`
|
|
5066
|
-
font-size: 1.1rem;
|
|
5067
|
-
color: rgba(255, 255, 255, 0.7);
|
|
5068
|
-
font-weight: 400;
|
|
5069
|
-
margin: 0.1rem 0 0;
|
|
5070
|
-
|
|
5071
|
-
@media (max-width: 768px) {
|
|
5072
|
-
font-size: 1rem;
|
|
5073
|
-
}
|
|
5074
|
-
|
|
5075
|
-
@media (max-width: 480px) {
|
|
5076
|
-
font-size: 0.9rem;
|
|
5077
|
-
}
|
|
5078
|
-
`;
|
|
5079
|
-
var PriceChangeRow = styled25__default.default.span`
|
|
5080
|
-
display: inline-flex;
|
|
5081
5015
|
align-items: center;
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
|
|
5086
|
-
|
|
5087
|
-
|
|
5016
|
+
font-size: clamp(1rem, 2.2vw, 1.25rem);
|
|
5017
|
+
font-weight: 600;
|
|
5018
|
+
color: var(--color-accent, #f0b90b);
|
|
5019
|
+
padding-left: 1rem;
|
|
5020
|
+
border-left: 1px solid rgba(255, 255, 255, 0.25);
|
|
5021
|
+
min-height: 1.5rem;
|
|
5088
5022
|
`;
|
|
5089
5023
|
var StatusBadge = styled25__default.default.div`
|
|
5090
5024
|
position: absolute;
|
|
@@ -5161,45 +5095,13 @@ var Header = ({
|
|
|
5161
5095
|
onProfileNavigate: _onProfileNavigate,
|
|
5162
5096
|
onOrdersNavigate: _onOrdersNavigate,
|
|
5163
5097
|
onWalletNavigate: _onWalletNavigate,
|
|
5164
|
-
showTradeTab = true
|
|
5165
|
-
portfolioSummary
|
|
5098
|
+
showTradeTab = true
|
|
5166
5099
|
}) => {
|
|
5167
5100
|
const [isUserMenuOpen, setIsUserMenuOpen] = React5.useState(false);
|
|
5168
5101
|
const [isMobileMenuOpen, setIsMobileMenuOpen] = React5.useState(false);
|
|
5169
5102
|
const [isMoreMenuOpen, setIsMoreMenuOpen] = React5.useState(false);
|
|
5170
5103
|
const [showLoginPopup, setShowLoginPopup] = React5.useState(false);
|
|
5171
5104
|
const [loginPopupInitialView, setLoginPopupInitialView] = React5.useState(void 0);
|
|
5172
|
-
const [isPortfolioBarVisible, setIsPortfolioBarVisible] = React5.useState(() => {
|
|
5173
|
-
if (typeof localStorage === "undefined") return false;
|
|
5174
|
-
return localStorage.getItem("portfolioBarVisible") !== "false";
|
|
5175
|
-
});
|
|
5176
|
-
const portfolioPillRef = React5.useRef(null);
|
|
5177
|
-
const [portfolioArrowLeft, setPortfolioArrowLeft] = React5.useState(null);
|
|
5178
|
-
const togglePortfolioBar = React5.useCallback(() => {
|
|
5179
|
-
setIsPortfolioBarVisible((prev) => {
|
|
5180
|
-
const next = !prev;
|
|
5181
|
-
try {
|
|
5182
|
-
localStorage.setItem("portfolioBarVisible", String(next));
|
|
5183
|
-
} catch {
|
|
5184
|
-
}
|
|
5185
|
-
return next;
|
|
5186
|
-
});
|
|
5187
|
-
}, []);
|
|
5188
|
-
const updatePortfolioArrow = React5.useCallback(() => {
|
|
5189
|
-
const eye = document.getElementById("portfolio-eye-toggle");
|
|
5190
|
-
const pill = portfolioPillRef.current;
|
|
5191
|
-
if (!eye || !pill) return;
|
|
5192
|
-
const eyeRect = eye.getBoundingClientRect();
|
|
5193
|
-
const pillRect = pill.getBoundingClientRect();
|
|
5194
|
-
const offset = eyeRect.left + eyeRect.width / 2 - pillRect.left - 7;
|
|
5195
|
-
setPortfolioArrowLeft(offset);
|
|
5196
|
-
}, []);
|
|
5197
|
-
React5.useEffect(() => {
|
|
5198
|
-
if (!isPortfolioBarVisible || !portfolioSummary) return;
|
|
5199
|
-
updatePortfolioArrow();
|
|
5200
|
-
window.addEventListener("resize", updatePortfolioArrow);
|
|
5201
|
-
return () => window.removeEventListener("resize", updatePortfolioArrow);
|
|
5202
|
-
}, [isPortfolioBarVisible, portfolioSummary, updatePortfolioArrow]);
|
|
5203
5105
|
React5.useEffect(() => {
|
|
5204
5106
|
if (typeof window === "undefined") return;
|
|
5205
5107
|
const ua = navigator.userAgent;
|
|
@@ -5577,17 +5479,6 @@ var Header = ({
|
|
|
5577
5479
|
}
|
|
5578
5480
|
),
|
|
5579
5481
|
isAuthenticated ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
|
|
5580
|
-
portfolioSummary && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5581
|
-
PortfolioEyeButton,
|
|
5582
|
-
{
|
|
5583
|
-
id: "portfolio-eye-toggle",
|
|
5584
|
-
type: "button",
|
|
5585
|
-
onClick: togglePortfolioBar,
|
|
5586
|
-
$active: isPortfolioBarVisible,
|
|
5587
|
-
title: isPortfolioBarVisible ? "Hide portfolio" : "Show portfolio",
|
|
5588
|
-
children: isPortfolioBarVisible ? /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" }) }) : /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46A11.804 11.804 0 001 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z" }) })
|
|
5589
|
-
}
|
|
5590
|
-
),
|
|
5591
5482
|
/* @__PURE__ */ jsxRuntime.jsxs(UserMenu, { children: [
|
|
5592
5483
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5593
5484
|
UserButton,
|
|
@@ -5659,51 +5550,6 @@ var Header = ({
|
|
|
5659
5550
|
] })
|
|
5660
5551
|
] }),
|
|
5661
5552
|
/* @__PURE__ */ jsxRuntime.jsx(HeaderSpacer, {}),
|
|
5662
|
-
isAuthenticated && portfolioSummary && isPortfolioBarVisible && (() => {
|
|
5663
|
-
const fmt = (n) => n.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
5664
|
-
const isPLPositive = portfolioSummary.pnl >= 0;
|
|
5665
|
-
return /* @__PURE__ */ jsxRuntime.jsx(PortfolioBarContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(PortfolioBarPill, { ref: portfolioPillRef, children: [
|
|
5666
|
-
portfolioArrowLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(PortfolioBarArrow, { style: { left: `${portfolioArrowLeft}px` } }),
|
|
5667
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
|
|
5668
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Holdings" }),
|
|
5669
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { children: [
|
|
5670
|
-
"$",
|
|
5671
|
-
fmt(portfolioSummary.holdings)
|
|
5672
|
-
] })
|
|
5673
|
-
] }),
|
|
5674
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBOperator, { children: "+" }),
|
|
5675
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
|
|
5676
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Cash" }),
|
|
5677
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { children: [
|
|
5678
|
-
"$",
|
|
5679
|
-
fmt(portfolioSummary.cash)
|
|
5680
|
-
] })
|
|
5681
|
-
] }),
|
|
5682
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBOperator, { children: "=" }),
|
|
5683
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
|
|
5684
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Portfolio" }),
|
|
5685
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { style: { color: "#D4AF37", fontWeight: 700 }, children: [
|
|
5686
|
-
"$",
|
|
5687
|
-
fmt(portfolioSummary.portfolioValue)
|
|
5688
|
-
] })
|
|
5689
|
-
] }),
|
|
5690
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBDot, {}),
|
|
5691
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
|
|
5692
|
-
/* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "P&L" }),
|
|
5693
|
-
/* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { $positive: isPLPositive, $negative: !isPLPositive, children: [
|
|
5694
|
-
isPLPositive ? "+" : "",
|
|
5695
|
-
"$",
|
|
5696
|
-
fmt(Math.abs(portfolioSummary.pnl)),
|
|
5697
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.6rem", marginLeft: "2px", opacity: 0.7 }, children: [
|
|
5698
|
-
"(",
|
|
5699
|
-
isPLPositive ? "+" : "",
|
|
5700
|
-
portfolioSummary.pnlPercent.toFixed(2),
|
|
5701
|
-
"%)"
|
|
5702
|
-
] })
|
|
5703
|
-
] })
|
|
5704
|
-
] })
|
|
5705
|
-
] }) });
|
|
5706
|
-
})(),
|
|
5707
5553
|
LoginPopupComponent && showLoginPopup && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5708
5554
|
LoginPopupComponent,
|
|
5709
5555
|
{
|
|
@@ -5789,19 +5635,8 @@ var HeaderContainer = styled25__default.default.header`
|
|
|
5789
5635
|
box-sizing: border-box;
|
|
5790
5636
|
|
|
5791
5637
|
@media (max-width: 768px) {
|
|
5792
|
-
|
|
5793
|
-
|
|
5794
|
-
right: 0.75rem;
|
|
5795
|
-
width: calc(100% - 1.5rem);
|
|
5796
|
-
height: 46px;
|
|
5797
|
-
min-height: 46px;
|
|
5798
|
-
padding: 0 0.75rem;
|
|
5799
|
-
border-radius: 12px;
|
|
5800
|
-
background-color: rgba(13, 17, 23, 0.92);
|
|
5801
|
-
backdrop-filter: blur(12px);
|
|
5802
|
-
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
5803
|
-
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
|
5804
|
-
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
|
|
5638
|
+
padding: 0 1rem;
|
|
5639
|
+
padding-top: max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px));
|
|
5805
5640
|
}
|
|
5806
5641
|
`;
|
|
5807
5642
|
var HeaderSpacer = styled25__default.default.div`
|
|
@@ -5809,10 +5644,6 @@ var HeaderSpacer = styled25__default.default.div`
|
|
|
5809
5644
|
min-height: 56px;
|
|
5810
5645
|
min-height: calc(56px + max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px)));
|
|
5811
5646
|
flex-shrink: 0;
|
|
5812
|
-
|
|
5813
|
-
@media (max-width: 768px) {
|
|
5814
|
-
min-height: calc(46px + 0.5rem);
|
|
5815
|
-
}
|
|
5816
5647
|
`;
|
|
5817
5648
|
var Logo = styled25__default.default.div`
|
|
5818
5649
|
display: flex;
|
|
@@ -6146,151 +5977,6 @@ var MobileNavItem = styled25__default.default.div`
|
|
|
6146
5977
|
padding-left: 24px;
|
|
6147
5978
|
}
|
|
6148
5979
|
`;
|
|
6149
|
-
var pbShimmer = styled25.keyframes`
|
|
6150
|
-
0% { background-position: -200% 0; }
|
|
6151
|
-
100% { background-position: 200% 0; }
|
|
6152
|
-
`;
|
|
6153
|
-
var PortfolioEyeButton = styled25__default.default.button`
|
|
6154
|
-
background: ${(p) => p.$active ? "rgba(212, 175, 55, 0.15)" : "transparent"};
|
|
6155
|
-
border: none;
|
|
6156
|
-
border-radius: 6px;
|
|
6157
|
-
cursor: pointer;
|
|
6158
|
-
padding: 6px;
|
|
6159
|
-
display: flex;
|
|
6160
|
-
align-items: center;
|
|
6161
|
-
justify-content: center;
|
|
6162
|
-
color: ${(p) => p.$active ? "#D4AF37" : "rgba(255,255,255,0.5)"};
|
|
6163
|
-
transition: all 0.2s ease;
|
|
6164
|
-
margin-right: 4px;
|
|
6165
|
-
|
|
6166
|
-
&:hover {
|
|
6167
|
-
background: rgba(212, 175, 55, 0.2);
|
|
6168
|
-
color: #D4AF37;
|
|
6169
|
-
}
|
|
6170
|
-
|
|
6171
|
-
@media (max-width: 768px) {
|
|
6172
|
-
padding: 4px;
|
|
6173
|
-
margin-right: 2px;
|
|
6174
|
-
}
|
|
6175
|
-
`;
|
|
6176
|
-
var PortfolioBarContainer = styled25__default.default.div`
|
|
6177
|
-
position: fixed;
|
|
6178
|
-
top: 56px;
|
|
6179
|
-
top: calc(56px + max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px)));
|
|
6180
|
-
left: 0;
|
|
6181
|
-
right: 0;
|
|
6182
|
-
z-index: 999;
|
|
6183
|
-
display: flex;
|
|
6184
|
-
justify-content: flex-end;
|
|
6185
|
-
align-items: flex-start;
|
|
6186
|
-
padding: 0 5%;
|
|
6187
|
-
pointer-events: none;
|
|
6188
|
-
overflow: visible;
|
|
6189
|
-
|
|
6190
|
-
&::before {
|
|
6191
|
-
content: '';
|
|
6192
|
-
position: absolute;
|
|
6193
|
-
top: 0;
|
|
6194
|
-
left: 40%;
|
|
6195
|
-
right: 0;
|
|
6196
|
-
height: 2px;
|
|
6197
|
-
background: linear-gradient(90deg, transparent 0%, rgba(212, 175, 55, 0.25) 100%);
|
|
6198
|
-
pointer-events: none;
|
|
6199
|
-
}
|
|
6200
|
-
|
|
6201
|
-
@media (max-width: 768px) {
|
|
6202
|
-
top: calc(46px + 0.5rem);
|
|
6203
|
-
padding: 0 0.75rem;
|
|
6204
|
-
justify-content: center;
|
|
6205
|
-
|
|
6206
|
-
&::before {
|
|
6207
|
-
left: 0;
|
|
6208
|
-
right: 0;
|
|
6209
|
-
background: linear-gradient(90deg, transparent 0%, rgba(212, 175, 55, 0.4) 30%, rgba(212, 175, 55, 0.4) 70%, transparent 100%);
|
|
6210
|
-
}
|
|
6211
|
-
}
|
|
6212
|
-
`;
|
|
6213
|
-
var PortfolioBarPill = styled25__default.default.div`
|
|
6214
|
-
pointer-events: auto;
|
|
6215
|
-
display: flex;
|
|
6216
|
-
align-items: center;
|
|
6217
|
-
gap: 1.25rem;
|
|
6218
|
-
padding: 0.5rem 1.5rem;
|
|
6219
|
-
border-radius: 0 0 20px 20px;
|
|
6220
|
-
background: linear-gradient(135deg, rgba(24, 26, 34, 0.98) 0%, rgba(32, 34, 42, 0.97) 100%);
|
|
6221
|
-
backdrop-filter: blur(16px);
|
|
6222
|
-
border: 1px solid rgba(212, 175, 55, 0.25);
|
|
6223
|
-
border-top: none;
|
|
6224
|
-
box-shadow:
|
|
6225
|
-
0 4px 16px rgba(0, 0, 0, 0.3),
|
|
6226
|
-
0 0 0 1px rgba(255, 255, 255, 0.03) inset,
|
|
6227
|
-
0 1px 0 rgba(212, 175, 55, 0.06) inset;
|
|
6228
|
-
position: relative;
|
|
6229
|
-
overflow: visible;
|
|
6230
|
-
|
|
6231
|
-
&::before {
|
|
6232
|
-
content: '';
|
|
6233
|
-
position: absolute;
|
|
6234
|
-
top: 0;
|
|
6235
|
-
left: 0;
|
|
6236
|
-
right: 0;
|
|
6237
|
-
height: 1px;
|
|
6238
|
-
background: linear-gradient(90deg, transparent, rgba(212, 175, 55, 0.3), transparent);
|
|
6239
|
-
background-size: 200% 100%;
|
|
6240
|
-
animation: ${pbShimmer} 4s linear infinite;
|
|
6241
|
-
}
|
|
6242
|
-
|
|
6243
|
-
@media (max-width: 768px) {
|
|
6244
|
-
gap: 0.75rem;
|
|
6245
|
-
padding: 0.4rem 1rem;
|
|
6246
|
-
border-radius: 0 0 16px 16px;
|
|
6247
|
-
}
|
|
6248
|
-
`;
|
|
6249
|
-
var PortfolioBarArrow = styled25__default.default.div`
|
|
6250
|
-
position: absolute;
|
|
6251
|
-
top: -7px;
|
|
6252
|
-
width: 14px;
|
|
6253
|
-
height: 14px;
|
|
6254
|
-
background: linear-gradient(135deg, rgba(26, 28, 36, 1) 0%, rgba(30, 32, 40, 1) 100%);
|
|
6255
|
-
border-left: 1px solid rgba(212, 175, 55, 0.3);
|
|
6256
|
-
border-top: 1px solid rgba(212, 175, 55, 0.3);
|
|
6257
|
-
transform: rotate(45deg);
|
|
6258
|
-
box-shadow: -2px -2px 6px rgba(0, 0, 0, 0.25);
|
|
6259
|
-
pointer-events: none;
|
|
6260
|
-
`;
|
|
6261
|
-
var PBMetric = styled25__default.default.div`
|
|
6262
|
-
display: flex;
|
|
6263
|
-
flex-direction: column;
|
|
6264
|
-
align-items: center;
|
|
6265
|
-
gap: 1px;
|
|
6266
|
-
white-space: nowrap;
|
|
6267
|
-
`;
|
|
6268
|
-
var PBMetricLabel = styled25__default.default.span`
|
|
6269
|
-
font-size: 0.55rem;
|
|
6270
|
-
color: rgba(255, 255, 255, 0.6);
|
|
6271
|
-
text-transform: uppercase;
|
|
6272
|
-
letter-spacing: 0.5px;
|
|
6273
|
-
font-weight: 500;
|
|
6274
|
-
`;
|
|
6275
|
-
var PBMetricValue = styled25__default.default.span`
|
|
6276
|
-
font-size: 0.75rem;
|
|
6277
|
-
font-weight: 600;
|
|
6278
|
-
color: ${(p) => p.$positive ? "#0ecb81" : p.$negative ? "#f6465d" : "#eaecef"};
|
|
6279
|
-
font-variant-numeric: tabular-nums;
|
|
6280
|
-
`;
|
|
6281
|
-
var PBDot = styled25__default.default.div`
|
|
6282
|
-
width: 3px;
|
|
6283
|
-
height: 3px;
|
|
6284
|
-
border-radius: 50%;
|
|
6285
|
-
background: rgba(212, 175, 55, 0.25);
|
|
6286
|
-
flex-shrink: 0;
|
|
6287
|
-
`;
|
|
6288
|
-
var PBOperator = styled25__default.default.span`
|
|
6289
|
-
font-size: 0.7rem;
|
|
6290
|
-
font-weight: 500;
|
|
6291
|
-
color: rgba(255, 255, 255, 0.35);
|
|
6292
|
-
flex-shrink: 0;
|
|
6293
|
-
`;
|
|
6294
5980
|
var PropertySubheader = React5__namespace.forwardRef(
|
|
6295
5981
|
({ className, tabs, activeTabId, onTabChange, actions, ...props }, ref) => {
|
|
6296
5982
|
const tabsContainerRef = React5__namespace.useRef(null);
|
|
@@ -6414,8 +6100,193 @@ var PropertySubheader = React5__namespace.forwardRef(
|
|
|
6414
6100
|
}
|
|
6415
6101
|
);
|
|
6416
6102
|
}
|
|
6417
|
-
);
|
|
6418
|
-
PropertySubheader.displayName = "PropertySubheader";
|
|
6103
|
+
);
|
|
6104
|
+
PropertySubheader.displayName = "PropertySubheader";
|
|
6105
|
+
var slideIn = styled25.keyframes`
|
|
6106
|
+
from { transform: translateX(110%); opacity: 0; }
|
|
6107
|
+
to { transform: translateX(0); opacity: 1; }
|
|
6108
|
+
`;
|
|
6109
|
+
var slideOut = styled25.keyframes`
|
|
6110
|
+
from { transform: translateX(0); opacity: 1; }
|
|
6111
|
+
to { transform: translateX(110%); opacity: 0; }
|
|
6112
|
+
`;
|
|
6113
|
+
var progressShrink = styled25.keyframes`
|
|
6114
|
+
from { width: 100%; }
|
|
6115
|
+
to { width: 0%; }
|
|
6116
|
+
`;
|
|
6117
|
+
var VARIANT_COLORS = {
|
|
6118
|
+
success: { accent: "#0ecb81", icon: "\u2713" },
|
|
6119
|
+
error: { accent: "#f6465d", icon: "\u2715" },
|
|
6120
|
+
info: { accent: "#E6C656", icon: "\u2139" },
|
|
6121
|
+
pending: { accent: "#7EB3E6", icon: "\u25CC" }
|
|
6122
|
+
};
|
|
6123
|
+
var Wrapper = styled25__default.default.div`
|
|
6124
|
+
position: relative;
|
|
6125
|
+
display: flex;
|
|
6126
|
+
flex-direction: column;
|
|
6127
|
+
gap: 0;
|
|
6128
|
+
width: 340px;
|
|
6129
|
+
background: #0d0f1a;
|
|
6130
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
6131
|
+
border-radius: 10px;
|
|
6132
|
+
overflow: hidden;
|
|
6133
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04);
|
|
6134
|
+
animation: ${({ $exiting }) => $exiting ? styled25.css`${slideOut} 0.28s cubic-bezier(0.4,0,1,1) forwards` : styled25.css`${slideIn} 0.32s cubic-bezier(0,0,0.2,1) forwards`};
|
|
6135
|
+
pointer-events: all;
|
|
6136
|
+
`;
|
|
6137
|
+
var Body = styled25__default.default.div`
|
|
6138
|
+
display: flex;
|
|
6139
|
+
align-items: flex-start;
|
|
6140
|
+
gap: 12px;
|
|
6141
|
+
padding: 14px 16px 12px;
|
|
6142
|
+
`;
|
|
6143
|
+
var IconDot = styled25__default.default.div`
|
|
6144
|
+
flex-shrink: 0;
|
|
6145
|
+
width: 28px;
|
|
6146
|
+
height: 28px;
|
|
6147
|
+
border-radius: 50%;
|
|
6148
|
+
background: ${({ $color }) => $color}1a;
|
|
6149
|
+
border: 1px solid ${({ $color }) => $color}55;
|
|
6150
|
+
display: flex;
|
|
6151
|
+
align-items: center;
|
|
6152
|
+
justify-content: center;
|
|
6153
|
+
font-size: 0.75rem;
|
|
6154
|
+
font-weight: 700;
|
|
6155
|
+
color: ${({ $color }) => $color};
|
|
6156
|
+
margin-top: 1px;
|
|
6157
|
+
`;
|
|
6158
|
+
var Content = styled25__default.default.div`
|
|
6159
|
+
flex: 1;
|
|
6160
|
+
min-width: 0;
|
|
6161
|
+
`;
|
|
6162
|
+
var Title = styled25__default.default.p`
|
|
6163
|
+
margin: 0 0 2px;
|
|
6164
|
+
font-size: 0.8rem;
|
|
6165
|
+
font-weight: 600;
|
|
6166
|
+
color: #fff;
|
|
6167
|
+
letter-spacing: 0.01em;
|
|
6168
|
+
`;
|
|
6169
|
+
var Amount = styled25__default.default.p`
|
|
6170
|
+
margin: 0 0 6px;
|
|
6171
|
+
font-size: 1.05rem;
|
|
6172
|
+
font-weight: 700;
|
|
6173
|
+
color: #E6C656;
|
|
6174
|
+
letter-spacing: -0.01em;
|
|
6175
|
+
`;
|
|
6176
|
+
var TxRow = styled25__default.default.a`
|
|
6177
|
+
display: inline-flex;
|
|
6178
|
+
align-items: center;
|
|
6179
|
+
gap: 5px;
|
|
6180
|
+
font-family: 'IBM Plex Mono', 'Space Mono', monospace;
|
|
6181
|
+
font-size: 0.68rem;
|
|
6182
|
+
color: rgba(255, 255, 255, 0.4);
|
|
6183
|
+
text-decoration: none;
|
|
6184
|
+
transition: color 0.15s;
|
|
6185
|
+
&:hover {
|
|
6186
|
+
color: #7EB3E6;
|
|
6187
|
+
}
|
|
6188
|
+
`;
|
|
6189
|
+
var TxArrow = styled25__default.default.span`
|
|
6190
|
+
font-size: 0.6rem;
|
|
6191
|
+
opacity: 0.6;
|
|
6192
|
+
`;
|
|
6193
|
+
var CloseBtn = styled25__default.default.button`
|
|
6194
|
+
flex-shrink: 0;
|
|
6195
|
+
background: none;
|
|
6196
|
+
border: none;
|
|
6197
|
+
padding: 2px 4px;
|
|
6198
|
+
cursor: pointer;
|
|
6199
|
+
color: rgba(255, 255, 255, 0.25);
|
|
6200
|
+
font-size: 0.9rem;
|
|
6201
|
+
line-height: 1;
|
|
6202
|
+
transition: color 0.15s;
|
|
6203
|
+
&:hover { color: rgba(255, 255, 255, 0.7); }
|
|
6204
|
+
`;
|
|
6205
|
+
var ProgressBar = styled25__default.default.div`
|
|
6206
|
+
height: 2px;
|
|
6207
|
+
background: rgba(255, 255, 255, 0.06);
|
|
6208
|
+
position: relative;
|
|
6209
|
+
&::after {
|
|
6210
|
+
content: '';
|
|
6211
|
+
position: absolute;
|
|
6212
|
+
left: 0;
|
|
6213
|
+
top: 0;
|
|
6214
|
+
height: 100%;
|
|
6215
|
+
background: ${({ $color }) => $color};
|
|
6216
|
+
animation: ${styled25.css`${progressShrink} ${({ $duration }) => $duration}ms linear forwards`};
|
|
6217
|
+
}
|
|
6218
|
+
`;
|
|
6219
|
+
var Container = styled25__default.default.div`
|
|
6220
|
+
position: fixed;
|
|
6221
|
+
bottom: 24px;
|
|
6222
|
+
right: 24px;
|
|
6223
|
+
z-index: 9999;
|
|
6224
|
+
display: flex;
|
|
6225
|
+
flex-direction: column-reverse;
|
|
6226
|
+
gap: 10px;
|
|
6227
|
+
pointer-events: none;
|
|
6228
|
+
`;
|
|
6229
|
+
var DEFAULT_EXPLORER = "https://sepolia.basescan.org/tx/";
|
|
6230
|
+
function truncateHash(hash) {
|
|
6231
|
+
return `${hash.slice(0, 6)}\u2026${hash.slice(-4)}`;
|
|
6232
|
+
}
|
|
6233
|
+
function ToastItem({ toast, onDismiss }) {
|
|
6234
|
+
const [exiting, setExiting] = React5.useState(false);
|
|
6235
|
+
const timerRef = React5.useRef(null);
|
|
6236
|
+
const dismiss = React5.useCallback(() => {
|
|
6237
|
+
setExiting(true);
|
|
6238
|
+
setTimeout(() => onDismiss(toast.id), 280);
|
|
6239
|
+
}, [onDismiss, toast.id]);
|
|
6240
|
+
React5.useEffect(() => {
|
|
6241
|
+
const duration2 = toast.duration ?? 6e3;
|
|
6242
|
+
if (duration2 > 0) {
|
|
6243
|
+
timerRef.current = setTimeout(dismiss, duration2);
|
|
6244
|
+
}
|
|
6245
|
+
return () => {
|
|
6246
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
6247
|
+
};
|
|
6248
|
+
}, [dismiss, toast.duration]);
|
|
6249
|
+
const { accent, icon } = VARIANT_COLORS[toast.variant];
|
|
6250
|
+
const duration = toast.duration ?? 6e3;
|
|
6251
|
+
const explorerBase = toast.explorerUrl ?? DEFAULT_EXPLORER;
|
|
6252
|
+
const txUrl = toast.txHash ? `${explorerBase}${toast.txHash}` : void 0;
|
|
6253
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Wrapper, { $exiting: exiting, children: [
|
|
6254
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Body, { children: [
|
|
6255
|
+
/* @__PURE__ */ jsxRuntime.jsx(IconDot, { $color: accent, children: icon }),
|
|
6256
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Content, { children: [
|
|
6257
|
+
/* @__PURE__ */ jsxRuntime.jsx(Title, { children: toast.title }),
|
|
6258
|
+
toast.amount && /* @__PURE__ */ jsxRuntime.jsx(Amount, { children: toast.amount }),
|
|
6259
|
+
toast.txHash && txUrl && /* @__PURE__ */ jsxRuntime.jsxs(TxRow, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: [
|
|
6260
|
+
truncateHash(toast.txHash),
|
|
6261
|
+
/* @__PURE__ */ jsxRuntime.jsx(TxArrow, { children: "\u2197" })
|
|
6262
|
+
] })
|
|
6263
|
+
] }),
|
|
6264
|
+
/* @__PURE__ */ jsxRuntime.jsx(CloseBtn, { type: "button", onClick: dismiss, "aria-label": "Dismiss", children: "\u2715" })
|
|
6265
|
+
] }),
|
|
6266
|
+
duration > 0 && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { $color: accent, $duration: duration })
|
|
6267
|
+
] });
|
|
6268
|
+
}
|
|
6269
|
+
var ToastContext = React5.createContext(null);
|
|
6270
|
+
function ToastProvider({ children }) {
|
|
6271
|
+
const [toasts, setToasts] = React5.useState([]);
|
|
6272
|
+
const addToast = React5.useCallback((data) => {
|
|
6273
|
+
const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
6274
|
+
setToasts((prev) => [...prev, { ...data, id }]);
|
|
6275
|
+
return id;
|
|
6276
|
+
}, []);
|
|
6277
|
+
const dismiss = React5.useCallback((id) => {
|
|
6278
|
+
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
6279
|
+
}, []);
|
|
6280
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ToastContext.Provider, { value: { toast: addToast, dismiss }, children: [
|
|
6281
|
+
children,
|
|
6282
|
+
/* @__PURE__ */ jsxRuntime.jsx(Container, { children: toasts.map((t) => /* @__PURE__ */ jsxRuntime.jsx(ToastItem, { toast: t, onDismiss: dismiss }, t.id)) })
|
|
6283
|
+
] });
|
|
6284
|
+
}
|
|
6285
|
+
function useToast() {
|
|
6286
|
+
const ctx = React5.useContext(ToastContext);
|
|
6287
|
+
if (!ctx) throw new Error("useToast must be used within a ToastProvider");
|
|
6288
|
+
return ctx;
|
|
6289
|
+
}
|
|
6419
6290
|
var DEFAULT_LOGO_SRC = Loaf_logo_Banner_default;
|
|
6420
6291
|
var DEFAULT_LOGO_ALT = "Loaf";
|
|
6421
6292
|
var OTP_INPUT_LENGTH = 6;
|
|
@@ -6443,6 +6314,7 @@ var LoginPopup = ({
|
|
|
6443
6314
|
const [error, setError] = React5.useState("");
|
|
6444
6315
|
const [loading, setLoading] = React5.useState(false);
|
|
6445
6316
|
const [isSignUp, setIsSignUp] = React5.useState(false);
|
|
6317
|
+
const { toast } = useToast();
|
|
6446
6318
|
const [fundingAmount] = React5.useState("");
|
|
6447
6319
|
const [kycLoading, setKycLoading] = React5.useState(false);
|
|
6448
6320
|
const [showKycWidget, setShowKycWidget] = React5.useState(false);
|
|
@@ -6456,6 +6328,11 @@ var LoginPopup = ({
|
|
|
6456
6328
|
setView(initialView);
|
|
6457
6329
|
}
|
|
6458
6330
|
}, [initialView]);
|
|
6331
|
+
React5.useEffect(() => {
|
|
6332
|
+
if (view === "kyc" && renderKycWidget) {
|
|
6333
|
+
setShowKycWidget(true);
|
|
6334
|
+
}
|
|
6335
|
+
}, [view, renderKycWidget]);
|
|
6459
6336
|
React5.useEffect(() => {
|
|
6460
6337
|
if (!transakWidgetUrl) return;
|
|
6461
6338
|
const handleTransakMessage = (event) => {
|
|
@@ -6658,10 +6535,19 @@ var LoginPopup = ({
|
|
|
6658
6535
|
};
|
|
6659
6536
|
const handleKycWidgetResult = (result) => {
|
|
6660
6537
|
setShowKycWidget(false);
|
|
6538
|
+
onClose();
|
|
6661
6539
|
if (result.passed) {
|
|
6662
|
-
|
|
6540
|
+
toast({
|
|
6541
|
+
variant: "success",
|
|
6542
|
+
title: "KYC submitted \u2014 pending review",
|
|
6543
|
+
amount: "Your documents are under review. Please check back in a few minutes."
|
|
6544
|
+
});
|
|
6663
6545
|
} else {
|
|
6664
|
-
|
|
6546
|
+
toast({
|
|
6547
|
+
variant: "error",
|
|
6548
|
+
title: "Verification unsuccessful",
|
|
6549
|
+
amount: "Your identity check didn't pass. Please contact support if you believe this is an error."
|
|
6550
|
+
});
|
|
6665
6551
|
}
|
|
6666
6552
|
};
|
|
6667
6553
|
const handleKycWidgetClose = () => {
|
|
@@ -6752,7 +6638,7 @@ var LoginPopup = ({
|
|
|
6752
6638
|
if (view === "main") {
|
|
6753
6639
|
return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(PopupContainer, { onClick: (event) => event.stopPropagation(), children: [
|
|
6754
6640
|
/* @__PURE__ */ jsxRuntime.jsx(CloseButton, { onClick: onClose, "aria-label": "Close login popup", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" }) }) }),
|
|
6755
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
6641
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Title2, { children: [
|
|
6756
6642
|
/* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
|
|
6757
6643
|
"Welcome to Loaf"
|
|
6758
6644
|
] }),
|
|
@@ -6813,7 +6699,7 @@ var LoginPopup = ({
|
|
|
6813
6699
|
/* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" }) }),
|
|
6814
6700
|
"Back"
|
|
6815
6701
|
] }),
|
|
6816
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
6702
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Title2, { children: [
|
|
6817
6703
|
/* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
|
|
6818
6704
|
isSignUp ? "Sign up with Email" : "Sign in with Email"
|
|
6819
6705
|
] }),
|
|
@@ -6852,7 +6738,7 @@ var LoginPopup = ({
|
|
|
6852
6738
|
/* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" }) }),
|
|
6853
6739
|
"Back"
|
|
6854
6740
|
] }),
|
|
6855
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
6741
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Title2, { children: [
|
|
6856
6742
|
/* @__PURE__ */ jsxRuntime.jsx(LogoContainer3, { children: /* @__PURE__ */ jsxRuntime.jsx(LogoImage, { src: logoSrc, alt: logoAlt }) }),
|
|
6857
6743
|
"Enter Verification Code"
|
|
6858
6744
|
] }),
|
|
@@ -6968,7 +6854,7 @@ var LoginPopup = ({
|
|
|
6968
6854
|
] }) });
|
|
6969
6855
|
}
|
|
6970
6856
|
if (view === "funding") {
|
|
6971
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6857
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6972
6858
|
FundingPopupContainer,
|
|
6973
6859
|
{
|
|
6974
6860
|
onClick: (event) => event.stopPropagation(),
|
|
@@ -7038,16 +6924,6 @@ var Overlay2 = styled25__default.default.div`
|
|
|
7038
6924
|
justify-content: center;
|
|
7039
6925
|
align-items: center;
|
|
7040
6926
|
z-index: 10000;
|
|
7041
|
-
animation: fadeIn 0.2s ease-in-out;
|
|
7042
|
-
|
|
7043
|
-
@keyframes fadeIn {
|
|
7044
|
-
from {
|
|
7045
|
-
opacity: 0;
|
|
7046
|
-
}
|
|
7047
|
-
to {
|
|
7048
|
-
opacity: 1;
|
|
7049
|
-
}
|
|
7050
|
-
}
|
|
7051
6927
|
`;
|
|
7052
6928
|
var PopupContainer = styled25__default.default.div`
|
|
7053
6929
|
background-color: var(--color-background, #0a0a0a);
|
|
@@ -7057,20 +6933,8 @@ var PopupContainer = styled25__default.default.div`
|
|
|
7057
6933
|
max-width: 440px;
|
|
7058
6934
|
width: 90%;
|
|
7059
6935
|
position: relative;
|
|
7060
|
-
animation: slideUp 0.3s ease-out;
|
|
7061
6936
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
|
7062
6937
|
|
|
7063
|
-
@keyframes slideUp {
|
|
7064
|
-
from {
|
|
7065
|
-
transform: translateY(20px);
|
|
7066
|
-
opacity: 0;
|
|
7067
|
-
}
|
|
7068
|
-
to {
|
|
7069
|
-
transform: translateY(0);
|
|
7070
|
-
opacity: 1;
|
|
7071
|
-
}
|
|
7072
|
-
}
|
|
7073
|
-
|
|
7074
6938
|
@media (max-width: 768px) {
|
|
7075
6939
|
padding: 2rem;
|
|
7076
6940
|
max-width: 90%;
|
|
@@ -7084,21 +6948,9 @@ var KycPopupContainer = styled25__default.default.div`
|
|
|
7084
6948
|
max-width: ${(props) => props.$expanded ? "680px" : "440px"};
|
|
7085
6949
|
width: 90%;
|
|
7086
6950
|
position: relative;
|
|
7087
|
-
animation: slideUp 0.3s ease-out;
|
|
7088
6951
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
|
7089
6952
|
transition: max-width 0.3s ease;
|
|
7090
6953
|
|
|
7091
|
-
@keyframes slideUp {
|
|
7092
|
-
from {
|
|
7093
|
-
transform: translateY(20px);
|
|
7094
|
-
opacity: 0;
|
|
7095
|
-
}
|
|
7096
|
-
to {
|
|
7097
|
-
transform: translateY(0);
|
|
7098
|
-
opacity: 1;
|
|
7099
|
-
}
|
|
7100
|
-
}
|
|
7101
|
-
|
|
7102
6954
|
@media (max-width: 768px) {
|
|
7103
6955
|
padding: 1.5rem;
|
|
7104
6956
|
max-width: 95%;
|
|
@@ -7157,7 +7009,7 @@ var CloseButton = styled25__default.default.button`
|
|
|
7157
7009
|
color: var(--color-accent, #e6c656);
|
|
7158
7010
|
}
|
|
7159
7011
|
`;
|
|
7160
|
-
var
|
|
7012
|
+
var Title2 = styled25__default.default.h2`
|
|
7161
7013
|
font-size: 1.75rem;
|
|
7162
7014
|
font-weight: 600;
|
|
7163
7015
|
color: var(--color-text, #eaecef);
|
|
@@ -7426,21 +7278,9 @@ var FundingPopupContainer = styled25__default.default.div`
|
|
|
7426
7278
|
max-width: ${(props) => props.$hasWidget ? "900px" : "440px"};
|
|
7427
7279
|
width: 90%;
|
|
7428
7280
|
position: relative;
|
|
7429
|
-
animation: slideUp 0.3s ease-out;
|
|
7430
7281
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
|
7431
7282
|
overflow: hidden;
|
|
7432
7283
|
|
|
7433
|
-
@keyframes slideUp {
|
|
7434
|
-
from {
|
|
7435
|
-
transform: translateY(20px);
|
|
7436
|
-
opacity: 0;
|
|
7437
|
-
}
|
|
7438
|
-
to {
|
|
7439
|
-
transform: translateY(0);
|
|
7440
|
-
opacity: 1;
|
|
7441
|
-
}
|
|
7442
|
-
}
|
|
7443
|
-
|
|
7444
7284
|
@media (max-width: 768px) {
|
|
7445
7285
|
padding: ${(props) => props.$hasWidget ? "0" : "2rem"};
|
|
7446
7286
|
max-width: 95%;
|
|
@@ -7729,7 +7569,7 @@ var PropertyCompareBar = React5__namespace.forwardRef(
|
|
|
7729
7569
|
void 0,
|
|
7730
7570
|
pricePercentFormat
|
|
7731
7571
|
)}%`;
|
|
7732
|
-
const priceContent = formattedPriceValue && propertyValueVariant === "pill" ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7572
|
+
const priceContent = formattedPriceValue && propertyValueVariant === "pill" ? /* @__PURE__ */ jsxRuntime.jsxs(PriceBlock2, { $variant: propertyValueVariant, children: [
|
|
7733
7573
|
/* @__PURE__ */ jsxRuntime.jsx(PriceAmount, { children: formattedPriceValue }),
|
|
7734
7574
|
formattedPriceChange || formattedPricePercent ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7735
7575
|
PriceChange,
|
|
@@ -8042,7 +7882,7 @@ var PropertyValueChange = styled25__default.default.span`
|
|
|
8042
7882
|
font-size: 0.65rem;
|
|
8043
7883
|
}
|
|
8044
7884
|
`;
|
|
8045
|
-
var
|
|
7885
|
+
var PriceBlock2 = styled25__default.default.div`
|
|
8046
7886
|
display: none;
|
|
8047
7887
|
|
|
8048
7888
|
${({ $variant }) => $variant === "pill" && styled25.css`
|
|
@@ -8136,7 +7976,7 @@ function GalleryMapSection({
|
|
|
8136
7976
|
/* @__PURE__ */ jsxRuntime.jsxs(ThumbStrip, { children: [
|
|
8137
7977
|
/* @__PURE__ */ jsxRuntime.jsx(ThumbScroll, { children: images.filter((img) => img.category !== "Floorplan").map((img) => {
|
|
8138
7978
|
const actualIndex = images.indexOf(img);
|
|
8139
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7979
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { "data-active": !showVideo && carouselIndex === actualIndex, onClick: () => {
|
|
8140
7980
|
stopAutoPlay();
|
|
8141
7981
|
setShowVideo(false);
|
|
8142
7982
|
setCarouselIndex(actualIndex);
|
|
@@ -8276,7 +8116,7 @@ var ThumbScroll = styled25__default.default.div`
|
|
|
8276
8116
|
scrollbar-width: none;
|
|
8277
8117
|
&::-webkit-scrollbar { display: none; }
|
|
8278
8118
|
`;
|
|
8279
|
-
var
|
|
8119
|
+
var Thumbnail = styled25__default.default.div`
|
|
8280
8120
|
min-width: 60px; height: 45px; border-radius: 4px; overflow: hidden;
|
|
8281
8121
|
cursor: pointer; border: 2px solid transparent; opacity: 0.6;
|
|
8282
8122
|
transition: all 0.2s ease; flex-shrink: 0;
|
|
@@ -8807,7 +8647,7 @@ function PropertyHistory() {
|
|
|
8807
8647
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9rem] font-normal ml-3 opacity-80", children: loafListing.date.replace(/\d+,\s|\s\d+$/, "") })
|
|
8808
8648
|
] }) }),
|
|
8809
8649
|
/* @__PURE__ */ jsxRuntime.jsx(SalesTable, { children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: /* @__PURE__ */ jsxRuntime.jsxs(HistoryRow, { $isOwnershipStart: true, children: [
|
|
8810
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8650
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: loafListing.type, children: loafListing.type === "Sale" ? "Sold" : loafListing.type }) }),
|
|
8811
8651
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: loafListing.saleType ?? "-" }),
|
|
8812
8652
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: loafListing.agent })
|
|
8813
8653
|
] }) }) }),
|
|
@@ -8869,7 +8709,7 @@ function PropertyHistory() {
|
|
|
8869
8709
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9rem] font-normal ml-3 opacity-80", children: ownershipSale.date.replace(/\d+,\s|\s\d+$/, "") })
|
|
8870
8710
|
] }) }),
|
|
8871
8711
|
ownershipSale && (historyFilter === "all" || historyFilter === "sales") && /* @__PURE__ */ jsxRuntime.jsx(SalesTable, { children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: /* @__PURE__ */ jsxRuntime.jsxs(HistoryRow, { $isOwnershipStart: true, children: [
|
|
8872
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8712
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: ownershipSale.type, children: ownershipSale.type === "Sale" ? "Sold" : ownershipSale.type }) }),
|
|
8873
8713
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: ownershipSale.saleType ?? "-" }),
|
|
8874
8714
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: ownershipSale.agent })
|
|
8875
8715
|
] }) }) }),
|
|
@@ -8878,7 +8718,7 @@ function PropertyHistory() {
|
|
|
8878
8718
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-2", children: events.map((event) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-2", children: /* @__PURE__ */ jsxRuntime.jsx(EventDetails, { event }) }, event.id)) })
|
|
8879
8719
|
] }),
|
|
8880
8720
|
otherSales.length > 0 && (historyFilter === "all" || historyFilter === "sales") && /* @__PURE__ */ jsxRuntime.jsx(SalesTable, { children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: otherSales.map((sale) => /* @__PURE__ */ jsxRuntime.jsxs(HistoryRow, { children: [
|
|
8881
|
-
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8721
|
+
/* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: sale.type, children: sale.type === "Sale" ? "Sold" : sale.type }) }),
|
|
8882
8722
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: sale.saleType ?? "-" }),
|
|
8883
8723
|
/* @__PURE__ */ jsxRuntime.jsx("td", { children: sale.agent })
|
|
8884
8724
|
] }, sale.id)) }) })
|
|
@@ -9021,7 +8861,7 @@ function EventDetails({ event }) {
|
|
|
9021
8861
|
onClick: toggleExpand,
|
|
9022
8862
|
children: [
|
|
9023
8863
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-between items-center flex-1 gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
|
|
9024
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8864
|
+
/* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: event.type, children: event.type === "Sale" ? "Sold" : event.type }),
|
|
9025
8865
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2", children: event.date })
|
|
9026
8866
|
] }) }),
|
|
9027
8867
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center text-[var(--color-text-secondary)] w-6 h-6 rounded-full transition-colors duration-200 hover:bg-white/10", children: expanded ? /* @__PURE__ */ jsxRuntime.jsx(bi.BiChevronUp, { size: 20 }) : /* @__PURE__ */ jsxRuntime.jsx(bi.BiChevronDown, { size: 20 }) })
|
|
@@ -9265,7 +9105,7 @@ var HistoryRow = styled25__default.default.tr`
|
|
|
9265
9105
|
background-color: rgba(255, 255, 255, 0.08);
|
|
9266
9106
|
}
|
|
9267
9107
|
`;
|
|
9268
|
-
var
|
|
9108
|
+
var TypeBadge = styled25__default.default.span`
|
|
9269
9109
|
display: inline-block;
|
|
9270
9110
|
padding: 0.25rem 0.5rem;
|
|
9271
9111
|
border-radius: 4px;
|
|
@@ -9675,9 +9515,7 @@ function AssetSelectorBar({
|
|
|
9675
9515
|
metrics: metricsProp,
|
|
9676
9516
|
currentTokenName,
|
|
9677
9517
|
selectorItems,
|
|
9678
|
-
onSelect
|
|
9679
|
-
trailing,
|
|
9680
|
-
imageUrl
|
|
9518
|
+
onSelect
|
|
9681
9519
|
}) {
|
|
9682
9520
|
const [isDropdownOpen, setIsDropdownOpen] = React5.useState(false);
|
|
9683
9521
|
const hasItems = selectorItems && selectorItems.length > 0;
|
|
@@ -9686,7 +9524,6 @@ function AssetSelectorBar({
|
|
|
9686
9524
|
...offeringValuation != null ? [{ label: "Offering Valuation", value: `$${offeringValuation.toLocaleString()}` }] : []
|
|
9687
9525
|
];
|
|
9688
9526
|
return /* @__PURE__ */ jsxRuntime.jsx(AssetSelectorWrapper, { children: /* @__PURE__ */ jsxRuntime.jsxs(IPOAssetSelector, { children: [
|
|
9689
|
-
imageUrl && /* @__PURE__ */ jsxRuntime.jsx(AssetThumbnail, { src: imageUrl, alt: propertyName }),
|
|
9690
9527
|
/* @__PURE__ */ jsxRuntime.jsx(AssetSelectorDropdown, { onClick: () => hasItems && setIsDropdownOpen((prev) => !prev), children: /* @__PURE__ */ jsxRuntime.jsxs(AssetName, { children: [
|
|
9691
9528
|
propertyName,
|
|
9692
9529
|
hasItems && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9707,7 +9544,7 @@ function AssetSelectorBar({
|
|
|
9707
9544
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
|
|
9708
9545
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
9709
9546
|
/* @__PURE__ */ jsxRuntime.jsx(MetricLabel2, { children: m.label }),
|
|
9710
|
-
/* @__PURE__ */ jsxRuntime.jsx(MetricValue, { $accent: !!m.accent,
|
|
9547
|
+
/* @__PURE__ */ jsxRuntime.jsx(MetricValue, { $accent: !!m.accent, children: m.value })
|
|
9711
9548
|
] }),
|
|
9712
9549
|
m.change != null && /* @__PURE__ */ jsxRuntime.jsxs(MetricChange, { $positive: m.change >= 0, children: [
|
|
9713
9550
|
m.change >= 0 ? "\u2191" : "\u2193",
|
|
@@ -9716,7 +9553,6 @@ function AssetSelectorBar({
|
|
|
9716
9553
|
] })
|
|
9717
9554
|
] })
|
|
9718
9555
|
] }, m.label)) }),
|
|
9719
|
-
trailing,
|
|
9720
9556
|
isDropdownOpen && hasItems && /* @__PURE__ */ jsxRuntime.jsx(IPODropdown, { children: selectorItems.map((item) => {
|
|
9721
9557
|
const isCurrent = item.tokenName === currentTokenName;
|
|
9722
9558
|
const status = item.status?.toUpperCase();
|
|
@@ -9776,20 +9612,6 @@ var IPOAssetSelector = styled25__default.default.div`
|
|
|
9776
9612
|
padding: 0.6rem 0.75rem;
|
|
9777
9613
|
}
|
|
9778
9614
|
`;
|
|
9779
|
-
var AssetThumbnail = styled25__default.default.img`
|
|
9780
|
-
width: 40px;
|
|
9781
|
-
height: 40px;
|
|
9782
|
-
border-radius: 8px;
|
|
9783
|
-
object-fit: cover;
|
|
9784
|
-
flex-shrink: 0;
|
|
9785
|
-
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
9786
|
-
|
|
9787
|
-
@media (max-width: 768px) {
|
|
9788
|
-
width: 32px;
|
|
9789
|
-
height: 32px;
|
|
9790
|
-
border-radius: 6px;
|
|
9791
|
-
}
|
|
9792
|
-
`;
|
|
9793
9615
|
var AssetSelectorDropdown = styled25__default.default.div`
|
|
9794
9616
|
display: flex;
|
|
9795
9617
|
align-items: center;
|
|
@@ -9857,16 +9679,16 @@ var MetricLabel2 = styled25__default.default.span`
|
|
|
9857
9679
|
}
|
|
9858
9680
|
`;
|
|
9859
9681
|
var MetricValue = styled25__default.default.span`
|
|
9860
|
-
font-size:
|
|
9861
|
-
font-weight:
|
|
9862
|
-
color: ${(p) => p.$accent ? "#D4AF37" :
|
|
9682
|
+
font-size: 1.25rem;
|
|
9683
|
+
font-weight: 700;
|
|
9684
|
+
color: ${(p) => p.$accent ? "#D4AF37" : "#fff"};
|
|
9863
9685
|
|
|
9864
9686
|
@media (max-width: 768px) {
|
|
9865
|
-
font-size:
|
|
9687
|
+
font-size: 1.05rem;
|
|
9866
9688
|
}
|
|
9867
9689
|
|
|
9868
9690
|
@media (max-width: 480px) {
|
|
9869
|
-
font-size:
|
|
9691
|
+
font-size: 0.95rem;
|
|
9870
9692
|
}
|
|
9871
9693
|
`;
|
|
9872
9694
|
var MetricChange = styled25__default.default.span`
|
|
@@ -9963,7 +9785,6 @@ function OfferingProgressCard({
|
|
|
9963
9785
|
raisedAmount,
|
|
9964
9786
|
targetAmount,
|
|
9965
9787
|
isPrivateClient = false,
|
|
9966
|
-
variant = "default",
|
|
9967
9788
|
style,
|
|
9968
9789
|
className
|
|
9969
9790
|
}) {
|
|
@@ -9995,109 +9816,7 @@ function OfferingProgressCard({
|
|
|
9995
9816
|
const interval = setInterval(() => setCountdown(calculateCountdown()), 1e3);
|
|
9996
9817
|
return () => clearInterval(interval);
|
|
9997
9818
|
}, [opensAt]);
|
|
9998
|
-
|
|
9999
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(CompactContainer, { style, className, children: [
|
|
10000
|
-
/* @__PURE__ */ jsxRuntime.jsx(ProgressBarOuter, { children: /* @__PURE__ */ jsxRuntime.jsx(ProgressBarInner, { style: { width: `${Math.min(percentSold, 100)}%` } }) }),
|
|
10001
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressInfo, { children: [
|
|
10002
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressSubscribers, { children: [
|
|
10003
|
-
"Subscribers: ",
|
|
10004
|
-
subscriberCount.toLocaleString()
|
|
10005
|
-
] }),
|
|
10006
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressAmounts, { children: [
|
|
10007
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "raised", children: formatCurrency3(computedRaised) }),
|
|
10008
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "target", children: [
|
|
10009
|
-
" / ",
|
|
10010
|
-
formatCurrency3(computedTarget)
|
|
10011
|
-
] })
|
|
10012
|
-
] })
|
|
10013
|
-
] })
|
|
10014
|
-
] });
|
|
10015
|
-
}
|
|
10016
|
-
if (variant === "home") {
|
|
10017
|
-
const isPreLive = !ipoStarted && ipoStatus !== "CLOSED" && ipoStatus !== "CANCELLED";
|
|
10018
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Container, { style, className, children: [
|
|
10019
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Header2, { children: [
|
|
10020
|
-
/* @__PURE__ */ jsxRuntime.jsxs("h3", { children: [
|
|
10021
|
-
/* @__PURE__ */ jsxRuntime.jsx(fa.FaChartLine, {}),
|
|
10022
|
-
" Offering Progress"
|
|
10023
|
-
] }),
|
|
10024
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem" }, children: ipoStarted ? /* @__PURE__ */ jsxRuntime.jsxs(StatusSpan, { $color: "#0ecb81", children: [
|
|
10025
|
-
/* @__PURE__ */ jsxRuntime.jsx(StatusDot, { $color: "#0ecb81", $pulse: true }),
|
|
10026
|
-
"LIVE"
|
|
10027
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs(StatusSpan, { $color: statusColor || "#D4AF37", children: [
|
|
10028
|
-
/* @__PURE__ */ jsxRuntime.jsx(StatusDot, { $color: statusColor || "#D4AF37" }),
|
|
10029
|
-
statusLabel || "Preparing"
|
|
10030
|
-
] }) })
|
|
10031
|
-
] }),
|
|
10032
|
-
isPreLive ? /* @__PURE__ */ jsxRuntime.jsxs(HomePreLiveRow, { children: [
|
|
10033
|
-
countdown ? /* @__PURE__ */ jsxRuntime.jsxs(HomeCountdownSide, { children: [
|
|
10034
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownLabel, { children: "Opens In" }),
|
|
10035
|
-
/* @__PURE__ */ jsxRuntime.jsxs(CountdownDigits, { children: [
|
|
10036
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.days).padStart(2, "0") }),
|
|
10037
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "D" }),
|
|
10038
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
|
|
10039
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.hours).padStart(2, "0") }),
|
|
10040
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "H" }),
|
|
10041
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
|
|
10042
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.minutes).padStart(2, "0") }),
|
|
10043
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "M" }),
|
|
10044
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
|
|
10045
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.seconds).padStart(2, "0") }),
|
|
10046
|
-
/* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "S" })
|
|
10047
|
-
] })
|
|
10048
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx(HomeCountdownSide, { children: /* @__PURE__ */ jsxRuntime.jsx(PreLiveStatus, { $statusColor: statusColor, children: "Sale Not Yet Open" }) }),
|
|
10049
|
-
/* @__PURE__ */ jsxRuntime.jsxs(HomeUnitsSide, { children: [
|
|
10050
|
-
/* @__PURE__ */ jsxRuntime.jsx(HomeUnitsLabel, { children: "Units Subscribed" }),
|
|
10051
|
-
/* @__PURE__ */ jsxRuntime.jsxs(HomeUnitsValue, { children: [
|
|
10052
|
-
/* @__PURE__ */ jsxRuntime.jsx(HomeSpinner, {}),
|
|
10053
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
10054
|
-
" / ",
|
|
10055
|
-
supplyToSell.toLocaleString()
|
|
10056
|
-
] })
|
|
10057
|
-
] })
|
|
10058
|
-
] })
|
|
10059
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsxs(LiveBody, { children: [
|
|
10060
|
-
/* @__PURE__ */ jsxRuntime.jsxs(LiveTopRow, { children: [
|
|
10061
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10062
|
-
/* @__PURE__ */ jsxRuntime.jsxs(LiveLabel, { children: [
|
|
10063
|
-
"Offering Subscribed ",
|
|
10064
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u24D8" })
|
|
10065
|
-
] }),
|
|
10066
|
-
/* @__PURE__ */ jsxRuntime.jsxs(LivePercent, { children: [
|
|
10067
|
-
percentSold.toFixed(1),
|
|
10068
|
-
"%",
|
|
10069
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "arrow", children: "\u2191" })
|
|
10070
|
-
] })
|
|
10071
|
-
] }),
|
|
10072
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "right" }, children: [
|
|
10073
|
-
/* @__PURE__ */ jsxRuntime.jsx(LiveLabel, { children: "Units Subscribed" }),
|
|
10074
|
-
/* @__PURE__ */ jsxRuntime.jsxs(UnitsValue, { children: [
|
|
10075
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: totalSold.toLocaleString() }),
|
|
10076
|
-
/* @__PURE__ */ jsxRuntime.jsxs("small", { children: [
|
|
10077
|
-
"/ ",
|
|
10078
|
-
supplyToSell.toLocaleString()
|
|
10079
|
-
] })
|
|
10080
|
-
] })
|
|
10081
|
-
] })
|
|
10082
|
-
] }),
|
|
10083
|
-
/* @__PURE__ */ jsxRuntime.jsx(ProgressBarOuter, { children: /* @__PURE__ */ jsxRuntime.jsx(ProgressBarInner, { style: { width: `${Math.min(percentSold, 100)}%` } }) }),
|
|
10084
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressInfo, { children: [
|
|
10085
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressSubscribers, { children: [
|
|
10086
|
-
"Subscribers: ",
|
|
10087
|
-
subscriberCount.toLocaleString()
|
|
10088
|
-
] }),
|
|
10089
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ProgressAmounts, { children: [
|
|
10090
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "raised", children: formatCurrency3(computedRaised) }),
|
|
10091
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "target", children: [
|
|
10092
|
-
" / ",
|
|
10093
|
-
formatCurrency3(computedTarget)
|
|
10094
|
-
] })
|
|
10095
|
-
] })
|
|
10096
|
-
] })
|
|
10097
|
-
] })
|
|
10098
|
-
] });
|
|
10099
|
-
}
|
|
10100
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Container, { style, className, children: [
|
|
9819
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Container2, { style, className, children: [
|
|
10101
9820
|
/* @__PURE__ */ jsxRuntime.jsxs(Header2, { children: [
|
|
10102
9821
|
/* @__PURE__ */ jsxRuntime.jsxs("h3", { children: [
|
|
10103
9822
|
/* @__PURE__ */ jsxRuntime.jsx(fa.FaChartLine, {}),
|
|
@@ -10165,7 +9884,7 @@ function OfferingProgressCard({
|
|
|
10165
9884
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u24D8" })
|
|
10166
9885
|
] }),
|
|
10167
9886
|
/* @__PURE__ */ jsxRuntime.jsxs(LivePercent, { children: [
|
|
10168
|
-
percentSold.toFixed(1),
|
|
9887
|
+
percentSold < 0.1 && percentSold > 0 ? percentSold.toFixed(3) : percentSold.toFixed(1),
|
|
10169
9888
|
"%",
|
|
10170
9889
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "arrow", children: "\u2191" })
|
|
10171
9890
|
] })
|
|
@@ -10198,7 +9917,7 @@ function OfferingProgressCard({
|
|
|
10198
9917
|
] })
|
|
10199
9918
|
] });
|
|
10200
9919
|
}
|
|
10201
|
-
var
|
|
9920
|
+
var Container2 = styled25__default.default.div`
|
|
10202
9921
|
background-color: var(--color-card-darker, #111);
|
|
10203
9922
|
border-radius: 8px;
|
|
10204
9923
|
padding: 1.5rem;
|
|
@@ -10398,59 +10117,6 @@ var ProgressAmounts = styled25__default.default.div`
|
|
|
10398
10117
|
.raised { color: #D4AF37; }
|
|
10399
10118
|
.target { color: rgba(255,255,255,0.3); }
|
|
10400
10119
|
`;
|
|
10401
|
-
var CompactContainer = styled25__default.default.div`
|
|
10402
|
-
width: 100%;
|
|
10403
|
-
margin: 1.5rem 0;
|
|
10404
|
-
display: flex;
|
|
10405
|
-
flex-direction: column;
|
|
10406
|
-
gap: 0.5rem;
|
|
10407
|
-
`;
|
|
10408
|
-
var HomePreLiveRow = styled25__default.default.div`
|
|
10409
|
-
display: flex;
|
|
10410
|
-
align-items: center;
|
|
10411
|
-
justify-content: space-between;
|
|
10412
|
-
padding-top: 1rem;
|
|
10413
|
-
`;
|
|
10414
|
-
var HomeCountdownSide = styled25__default.default.div`
|
|
10415
|
-
display: flex;
|
|
10416
|
-
flex-direction: column;
|
|
10417
|
-
align-items: center;
|
|
10418
|
-
flex: 1;
|
|
10419
|
-
`;
|
|
10420
|
-
var HomeUnitsSide = styled25__default.default.div`
|
|
10421
|
-
text-align: center;
|
|
10422
|
-
flex-shrink: 0;
|
|
10423
|
-
`;
|
|
10424
|
-
var HomeUnitsLabel = styled25__default.default.div`
|
|
10425
|
-
font-size: 0.6rem;
|
|
10426
|
-
color: var(--color-text-secondary);
|
|
10427
|
-
text-transform: uppercase;
|
|
10428
|
-
letter-spacing: 0.1em;
|
|
10429
|
-
margin-bottom: 0.2rem;
|
|
10430
|
-
`;
|
|
10431
|
-
var HomeUnitsValue = styled25__default.default.div`
|
|
10432
|
-
font-size: 1.1rem;
|
|
10433
|
-
font-weight: 700;
|
|
10434
|
-
font-family: monospace;
|
|
10435
|
-
span {
|
|
10436
|
-
color: var(--color-text-secondary);
|
|
10437
|
-
font-weight: 400;
|
|
10438
|
-
}
|
|
10439
|
-
`;
|
|
10440
|
-
var HomeSpinner = styled25__default.default.span`
|
|
10441
|
-
display: inline-block;
|
|
10442
|
-
width: 14px;
|
|
10443
|
-
height: 14px;
|
|
10444
|
-
border: 2px solid rgba(255, 255, 255, 0.1);
|
|
10445
|
-
border-top-color: var(--color-accent, #f0b90b);
|
|
10446
|
-
border-radius: 50%;
|
|
10447
|
-
animation: homeSpin 1s linear infinite;
|
|
10448
|
-
vertical-align: middle;
|
|
10449
|
-
margin-right: 0.15rem;
|
|
10450
|
-
@keyframes homeSpin {
|
|
10451
|
-
to { transform: rotate(360deg); }
|
|
10452
|
-
}
|
|
10453
|
-
`;
|
|
10454
10120
|
var MAX_DISPLAY_AMOUNT = 6e4;
|
|
10455
10121
|
var formatCurrency4 = (amount) => {
|
|
10456
10122
|
if (amount >= 1e6) return `$${(amount / 1e6).toFixed(2)}M`;
|
|
@@ -10787,191 +10453,6 @@ var LiveIndicatorDot = styled25__default.default.span`
|
|
|
10787
10453
|
100% { box-shadow: 0 0 0 0 rgba(14,203,129,0); }
|
|
10788
10454
|
}
|
|
10789
10455
|
`;
|
|
10790
|
-
var slideIn = styled25.keyframes`
|
|
10791
|
-
from { transform: translateX(110%); opacity: 0; }
|
|
10792
|
-
to { transform: translateX(0); opacity: 1; }
|
|
10793
|
-
`;
|
|
10794
|
-
var slideOut = styled25.keyframes`
|
|
10795
|
-
from { transform: translateX(0); opacity: 1; }
|
|
10796
|
-
to { transform: translateX(110%); opacity: 0; }
|
|
10797
|
-
`;
|
|
10798
|
-
var progressShrink = styled25.keyframes`
|
|
10799
|
-
from { width: 100%; }
|
|
10800
|
-
to { width: 0%; }
|
|
10801
|
-
`;
|
|
10802
|
-
var VARIANT_COLORS = {
|
|
10803
|
-
success: { accent: "#0ecb81", icon: "\u2713" },
|
|
10804
|
-
error: { accent: "#f6465d", icon: "\u2715" },
|
|
10805
|
-
info: { accent: "#E6C656", icon: "\u2139" },
|
|
10806
|
-
pending: { accent: "#7EB3E6", icon: "\u25CC" }
|
|
10807
|
-
};
|
|
10808
|
-
var Wrapper = styled25__default.default.div`
|
|
10809
|
-
position: relative;
|
|
10810
|
-
display: flex;
|
|
10811
|
-
flex-direction: column;
|
|
10812
|
-
gap: 0;
|
|
10813
|
-
width: 340px;
|
|
10814
|
-
background: #0d0f1a;
|
|
10815
|
-
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
10816
|
-
border-radius: 10px;
|
|
10817
|
-
overflow: hidden;
|
|
10818
|
-
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255,255,255,0.04);
|
|
10819
|
-
animation: ${({ $exiting }) => $exiting ? styled25.css`${slideOut} 0.28s cubic-bezier(0.4,0,1,1) forwards` : styled25.css`${slideIn} 0.32s cubic-bezier(0,0,0.2,1) forwards`};
|
|
10820
|
-
pointer-events: all;
|
|
10821
|
-
`;
|
|
10822
|
-
var Body = styled25__default.default.div`
|
|
10823
|
-
display: flex;
|
|
10824
|
-
align-items: flex-start;
|
|
10825
|
-
gap: 12px;
|
|
10826
|
-
padding: 14px 16px 12px;
|
|
10827
|
-
`;
|
|
10828
|
-
var IconDot = styled25__default.default.div`
|
|
10829
|
-
flex-shrink: 0;
|
|
10830
|
-
width: 28px;
|
|
10831
|
-
height: 28px;
|
|
10832
|
-
border-radius: 50%;
|
|
10833
|
-
background: ${({ $color }) => $color}1a;
|
|
10834
|
-
border: 1px solid ${({ $color }) => $color}55;
|
|
10835
|
-
display: flex;
|
|
10836
|
-
align-items: center;
|
|
10837
|
-
justify-content: center;
|
|
10838
|
-
font-size: 0.75rem;
|
|
10839
|
-
font-weight: 700;
|
|
10840
|
-
color: ${({ $color }) => $color};
|
|
10841
|
-
margin-top: 1px;
|
|
10842
|
-
`;
|
|
10843
|
-
var Content = styled25__default.default.div`
|
|
10844
|
-
flex: 1;
|
|
10845
|
-
min-width: 0;
|
|
10846
|
-
`;
|
|
10847
|
-
var Title2 = styled25__default.default.p`
|
|
10848
|
-
margin: 0 0 2px;
|
|
10849
|
-
font-size: 0.8rem;
|
|
10850
|
-
font-weight: 600;
|
|
10851
|
-
color: #fff;
|
|
10852
|
-
letter-spacing: 0.01em;
|
|
10853
|
-
`;
|
|
10854
|
-
var Amount = styled25__default.default.p`
|
|
10855
|
-
margin: 0 0 6px;
|
|
10856
|
-
font-size: 1.05rem;
|
|
10857
|
-
font-weight: 700;
|
|
10858
|
-
color: #E6C656;
|
|
10859
|
-
letter-spacing: -0.01em;
|
|
10860
|
-
`;
|
|
10861
|
-
var TxRow = styled25__default.default.a`
|
|
10862
|
-
display: inline-flex;
|
|
10863
|
-
align-items: center;
|
|
10864
|
-
gap: 5px;
|
|
10865
|
-
font-family: 'IBM Plex Mono', 'Space Mono', monospace;
|
|
10866
|
-
font-size: 0.68rem;
|
|
10867
|
-
color: rgba(255, 255, 255, 0.4);
|
|
10868
|
-
text-decoration: none;
|
|
10869
|
-
transition: color 0.15s;
|
|
10870
|
-
&:hover {
|
|
10871
|
-
color: #7EB3E6;
|
|
10872
|
-
}
|
|
10873
|
-
`;
|
|
10874
|
-
var TxArrow = styled25__default.default.span`
|
|
10875
|
-
font-size: 0.6rem;
|
|
10876
|
-
opacity: 0.6;
|
|
10877
|
-
`;
|
|
10878
|
-
var CloseBtn = styled25__default.default.button`
|
|
10879
|
-
flex-shrink: 0;
|
|
10880
|
-
background: none;
|
|
10881
|
-
border: none;
|
|
10882
|
-
padding: 2px 4px;
|
|
10883
|
-
cursor: pointer;
|
|
10884
|
-
color: rgba(255, 255, 255, 0.25);
|
|
10885
|
-
font-size: 0.9rem;
|
|
10886
|
-
line-height: 1;
|
|
10887
|
-
transition: color 0.15s;
|
|
10888
|
-
&:hover { color: rgba(255, 255, 255, 0.7); }
|
|
10889
|
-
`;
|
|
10890
|
-
var ProgressBar = styled25__default.default.div`
|
|
10891
|
-
height: 2px;
|
|
10892
|
-
background: rgba(255, 255, 255, 0.06);
|
|
10893
|
-
position: relative;
|
|
10894
|
-
&::after {
|
|
10895
|
-
content: '';
|
|
10896
|
-
position: absolute;
|
|
10897
|
-
left: 0;
|
|
10898
|
-
top: 0;
|
|
10899
|
-
height: 100%;
|
|
10900
|
-
background: ${({ $color }) => $color};
|
|
10901
|
-
animation: ${styled25.css`${progressShrink} ${({ $duration }) => $duration}ms linear forwards`};
|
|
10902
|
-
}
|
|
10903
|
-
`;
|
|
10904
|
-
var Container2 = styled25__default.default.div`
|
|
10905
|
-
position: fixed;
|
|
10906
|
-
bottom: 24px;
|
|
10907
|
-
right: 24px;
|
|
10908
|
-
z-index: 9999;
|
|
10909
|
-
display: flex;
|
|
10910
|
-
flex-direction: column-reverse;
|
|
10911
|
-
gap: 10px;
|
|
10912
|
-
pointer-events: none;
|
|
10913
|
-
`;
|
|
10914
|
-
var DEFAULT_EXPLORER = "https://sepolia.basescan.org/tx/";
|
|
10915
|
-
function truncateHash(hash) {
|
|
10916
|
-
return `${hash.slice(0, 6)}\u2026${hash.slice(-4)}`;
|
|
10917
|
-
}
|
|
10918
|
-
function ToastItem({ toast, onDismiss }) {
|
|
10919
|
-
const [exiting, setExiting] = React5.useState(false);
|
|
10920
|
-
const timerRef = React5.useRef(null);
|
|
10921
|
-
const dismiss = React5.useCallback(() => {
|
|
10922
|
-
setExiting(true);
|
|
10923
|
-
setTimeout(() => onDismiss(toast.id), 280);
|
|
10924
|
-
}, [onDismiss, toast.id]);
|
|
10925
|
-
React5.useEffect(() => {
|
|
10926
|
-
const duration2 = toast.duration ?? 6e3;
|
|
10927
|
-
if (duration2 > 0) {
|
|
10928
|
-
timerRef.current = setTimeout(dismiss, duration2);
|
|
10929
|
-
}
|
|
10930
|
-
return () => {
|
|
10931
|
-
if (timerRef.current) clearTimeout(timerRef.current);
|
|
10932
|
-
};
|
|
10933
|
-
}, [dismiss, toast.duration]);
|
|
10934
|
-
const { accent, icon } = VARIANT_COLORS[toast.variant];
|
|
10935
|
-
const duration = toast.duration ?? 6e3;
|
|
10936
|
-
const explorerBase = toast.explorerUrl ?? DEFAULT_EXPLORER;
|
|
10937
|
-
const txUrl = toast.txHash ? `${explorerBase}${toast.txHash}` : void 0;
|
|
10938
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Wrapper, { $exiting: exiting, children: [
|
|
10939
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Body, { children: [
|
|
10940
|
-
/* @__PURE__ */ jsxRuntime.jsx(IconDot, { $color: accent, children: icon }),
|
|
10941
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Content, { children: [
|
|
10942
|
-
/* @__PURE__ */ jsxRuntime.jsx(Title2, { children: toast.title }),
|
|
10943
|
-
toast.amount && /* @__PURE__ */ jsxRuntime.jsx(Amount, { children: toast.amount }),
|
|
10944
|
-
toast.txHash && txUrl && /* @__PURE__ */ jsxRuntime.jsxs(TxRow, { href: txUrl, target: "_blank", rel: "noopener noreferrer", children: [
|
|
10945
|
-
truncateHash(toast.txHash),
|
|
10946
|
-
/* @__PURE__ */ jsxRuntime.jsx(TxArrow, { children: "\u2197" })
|
|
10947
|
-
] })
|
|
10948
|
-
] }),
|
|
10949
|
-
/* @__PURE__ */ jsxRuntime.jsx(CloseBtn, { type: "button", onClick: dismiss, "aria-label": "Dismiss", children: "\u2715" })
|
|
10950
|
-
] }),
|
|
10951
|
-
duration > 0 && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { $color: accent, $duration: duration })
|
|
10952
|
-
] });
|
|
10953
|
-
}
|
|
10954
|
-
var ToastContext = React5.createContext(null);
|
|
10955
|
-
function ToastProvider({ children }) {
|
|
10956
|
-
const [toasts, setToasts] = React5.useState([]);
|
|
10957
|
-
const addToast = React5.useCallback((data) => {
|
|
10958
|
-
const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
10959
|
-
setToasts((prev) => [...prev, { ...data, id }]);
|
|
10960
|
-
return id;
|
|
10961
|
-
}, []);
|
|
10962
|
-
const dismiss = React5.useCallback((id) => {
|
|
10963
|
-
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
10964
|
-
}, []);
|
|
10965
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ToastContext.Provider, { value: { toast: addToast, dismiss }, children: [
|
|
10966
|
-
children,
|
|
10967
|
-
/* @__PURE__ */ jsxRuntime.jsx(Container2, { children: toasts.map((t) => /* @__PURE__ */ jsxRuntime.jsx(ToastItem, { toast: t, onDismiss: dismiss }, t.id)) })
|
|
10968
|
-
] });
|
|
10969
|
-
}
|
|
10970
|
-
function useToast() {
|
|
10971
|
-
const ctx = React5.useContext(ToastContext);
|
|
10972
|
-
if (!ctx) throw new Error("useToast must be used within a ToastProvider");
|
|
10973
|
-
return ctx;
|
|
10974
|
-
}
|
|
10975
10456
|
function OrderPanel({
|
|
10976
10457
|
statusLabel,
|
|
10977
10458
|
statusColor,
|
|
@@ -11989,7 +11470,7 @@ function PortfolioActivityPanel({
|
|
|
11989
11470
|
] }),
|
|
11990
11471
|
/* @__PURE__ */ jsxRuntime.jsxs(HoldingsQuantity, { children: [
|
|
11991
11472
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
11992
|
-
|
|
11473
|
+
pos.quantity.toFixed(2),
|
|
11993
11474
|
" ",
|
|
11994
11475
|
pos.tokenName
|
|
11995
11476
|
] }),
|
|
@@ -12001,7 +11482,8 @@ function PortfolioActivityPanel({
|
|
|
12001
11482
|
/* @__PURE__ */ jsxRuntime.jsxs(HoldingsPnL, { children: [
|
|
12002
11483
|
/* @__PURE__ */ jsxRuntime.jsxs(PnLAmount, { $positive: isPositive, children: [
|
|
12003
11484
|
isPositive ? "+" : "-",
|
|
12004
|
-
|
|
11485
|
+
"$",
|
|
11486
|
+
Math.abs(pnl).toFixed(2)
|
|
12005
11487
|
] }),
|
|
12006
11488
|
/* @__PURE__ */ jsxRuntime.jsxs(PnLPercentage, { $positive: isPositive, children: [
|
|
12007
11489
|
isPositive ? "+" : "",
|
|
@@ -12127,14 +11609,7 @@ function PortfolioActivityPanel({
|
|
|
12127
11609
|
formatTimestamp(trade.executedAt)
|
|
12128
11610
|
] })
|
|
12129
11611
|
] }),
|
|
12130
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12131
|
-
ActivityTag,
|
|
12132
|
-
{
|
|
12133
|
-
$color: trade.side === "SELL" ? "#f6465d" : "#0ecb81",
|
|
12134
|
-
$bg: trade.side === "SELL" ? "rgba(246,70,93,0.12)" : "rgba(14,203,129,0.12)",
|
|
12135
|
-
children: sideLabel(trade.side)
|
|
12136
|
-
}
|
|
12137
|
-
),
|
|
11612
|
+
trade.status === "SETTLEMENT_FAILED" ? /* @__PURE__ */ jsxRuntime.jsx(ActivityTag, { $color: "#f6465d", $bg: "rgba(246,70,93,0.12)", children: "Failed" }) : trade.status === "SETTLED" ? /* @__PURE__ */ jsxRuntime.jsx(ActivityTag, { $color: "#0ecb81", $bg: "rgba(14,203,129,0.12)", children: "Settled" }) : /* @__PURE__ */ jsxRuntime.jsx(ActivityTag, { $color: "#f0b90b", $bg: "rgba(240,185,11,0.15)", children: "Settling" }),
|
|
12138
11613
|
/* @__PURE__ */ jsxRuntime.jsx(ActivityAmount, { children: formatCurrency5(trade.price * trade.quantity) })
|
|
12139
11614
|
] }, trade.tradeId))
|
|
12140
11615
|
] }),
|
|
@@ -12312,8 +11787,8 @@ var ActivityPrimary = styled25__default.default.span`
|
|
|
12312
11787
|
font-weight: 500;
|
|
12313
11788
|
`;
|
|
12314
11789
|
var ActivitySecondary = styled25__default.default.span`
|
|
12315
|
-
font-size: 0.
|
|
12316
|
-
color: rgba(255, 255, 255, 0.
|
|
11790
|
+
font-size: 0.7rem;
|
|
11791
|
+
color: rgba(255, 255, 255, 0.5);
|
|
12317
11792
|
`;
|
|
12318
11793
|
var ActivityTag = styled25__default.default.span`
|
|
12319
11794
|
font-size: 0.58rem;
|
|
@@ -14206,7 +13681,7 @@ function PropertyValuation({
|
|
|
14206
13681
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [
|
|
14207
13682
|
/* @__PURE__ */ jsxRuntime.jsxs(PricingModelDetail, { children: [
|
|
14208
13683
|
/* @__PURE__ */ jsxRuntime.jsx(PropertyDetailLabel, { children: "Last Price" }),
|
|
14209
|
-
/* @__PURE__ */ jsxRuntime.jsx(PricingDetailValue, { children:
|
|
13684
|
+
/* @__PURE__ */ jsxRuntime.jsx(PricingDetailValue, { children: formatCompact(lastPrice) })
|
|
14210
13685
|
] }),
|
|
14211
13686
|
/* @__PURE__ */ jsxRuntime.jsxs(PricingModelDetail, { children: [
|
|
14212
13687
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", width: "100%" }, children: [
|
|
@@ -14217,11 +13692,11 @@ function PropertyValuation({
|
|
|
14217
13692
|
] })
|
|
14218
13693
|
] }),
|
|
14219
13694
|
/* @__PURE__ */ jsxRuntime.jsxs(PricingDetailValue, { style: { color: "var(--color-accent)", fontWeight: "bold" }, children: [
|
|
14220
|
-
|
|
13695
|
+
formatCompact(fairValue),
|
|
14221
13696
|
" ",
|
|
14222
13697
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
|
|
14223
13698
|
"(",
|
|
14224
|
-
|
|
13699
|
+
formatCompact(fairValue * tokensOutstanding),
|
|
14225
13700
|
")"
|
|
14226
13701
|
] })
|
|
14227
13702
|
] })
|
|
@@ -14238,7 +13713,7 @@ function PropertyValuation({
|
|
|
14238
13713
|
/* @__PURE__ */ jsxRuntime.jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
|
|
14239
13714
|
/* @__PURE__ */ jsxRuntime.jsxs(GaugePriceTag, { position: gaugePosition, children: [
|
|
14240
13715
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "Last Price" }),
|
|
14241
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
13716
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCompact(lastPrice) })
|
|
14242
13717
|
] }),
|
|
14243
13718
|
/* @__PURE__ */ jsxRuntime.jsx(GaugeIndicator, { type: "lastPrice", position: gaugePosition })
|
|
14244
13719
|
] }),
|
|
@@ -14246,36 +13721,36 @@ function PropertyValuation({
|
|
|
14246
13721
|
/* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "#4CAF50" }, children: [
|
|
14247
13722
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
14248
13723
|
"< ",
|
|
14249
|
-
|
|
13724
|
+
formatCompact(undervaluedThreshold)
|
|
14250
13725
|
] }),
|
|
14251
13726
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
|
|
14252
13727
|
"(",
|
|
14253
|
-
|
|
13728
|
+
formatCompact(undervaluedThreshold * tokensOutstanding),
|
|
14254
13729
|
")"
|
|
14255
13730
|
] })
|
|
14256
13731
|
] }) }),
|
|
14257
13732
|
/* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "var(--color-accent)" }, children: [
|
|
14258
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
13733
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCompact(fairValue) }),
|
|
14259
13734
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
|
|
14260
13735
|
"(",
|
|
14261
|
-
|
|
13736
|
+
formatCompact(fairValue * tokensOutstanding),
|
|
14262
13737
|
")"
|
|
14263
13738
|
] })
|
|
14264
13739
|
] }) }),
|
|
14265
13740
|
/* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "#F44336" }, children: [
|
|
14266
13741
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
14267
13742
|
"> ",
|
|
14268
|
-
|
|
13743
|
+
formatCompact(overvaluedThreshold)
|
|
14269
13744
|
] }),
|
|
14270
13745
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
|
|
14271
13746
|
"(",
|
|
14272
|
-
|
|
13747
|
+
formatCompact(overvaluedThreshold * tokensOutstanding),
|
|
14273
13748
|
")"
|
|
14274
13749
|
] })
|
|
14275
13750
|
] }) })
|
|
14276
13751
|
] })
|
|
14277
13752
|
] }),
|
|
14278
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
13753
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
14279
13754
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
|
|
14280
13755
|
/* @__PURE__ */ jsxRuntime.jsx(ChartContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(ChartBackground, { children: [
|
|
14281
13756
|
axisLabels.map((label, index) => /* @__PURE__ */ jsxRuntime.jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
|
|
@@ -14394,15 +13869,7 @@ function PropertyValuation({
|
|
|
14394
13869
|
] })
|
|
14395
13870
|
] }) })
|
|
14396
13871
|
] })
|
|
14397
|
-
] })
|
|
14398
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "desktop-only-historical-chart", style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
|
|
14399
|
-
/* @__PURE__ */ jsxRuntime.jsx(ChartContainer, { className: "desktop-only-historical-chart", children: /* @__PURE__ */ jsxRuntime.jsxs(ChartBackground, { children: [
|
|
14400
|
-
axisLabels.map((label, index) => /* @__PURE__ */ jsxRuntime.jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
|
|
14401
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
|
|
14402
|
-
valuationPath ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
|
|
14403
|
-
fairValuePath ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: fairValuePath, fill: "none", stroke: "#FFFFFF", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null
|
|
14404
|
-
] })
|
|
14405
|
-
] }) })
|
|
13872
|
+
] })
|
|
14406
13873
|
] })
|
|
14407
13874
|
] }),
|
|
14408
13875
|
/* @__PURE__ */ jsxRuntime.jsxs(RecentSalesSection, { children: [
|
|
@@ -14476,6 +13943,14 @@ function formatMillions(value) {
|
|
|
14476
13943
|
}
|
|
14477
13944
|
return `$${(value / 1e6).toFixed(2)}m`;
|
|
14478
13945
|
}
|
|
13946
|
+
function formatCompact(value) {
|
|
13947
|
+
if (value == null || !Number.isFinite(value)) return "\u2014";
|
|
13948
|
+
const abs = Math.abs(value);
|
|
13949
|
+
if (abs >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;
|
|
13950
|
+
if (abs >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;
|
|
13951
|
+
if (abs >= 1e3) return `$${(value / 1e3).toFixed(1)}K`;
|
|
13952
|
+
return formatCurrency6(value);
|
|
13953
|
+
}
|
|
14479
13954
|
function formatBedroomLabel(bedrooms) {
|
|
14480
13955
|
if (!Number.isFinite(bedrooms)) return "\u2014";
|
|
14481
13956
|
return `${bedrooms} Bed`;
|
|
@@ -14599,12 +14074,6 @@ var GaugePriceTag = styled25__default.default.div`
|
|
|
14599
14074
|
color: var(--color-accent);
|
|
14600
14075
|
}
|
|
14601
14076
|
`;
|
|
14602
|
-
var HiddenMobileChart = styled25__default.default.div`
|
|
14603
|
-
display: none;
|
|
14604
|
-
@media (max-width: 480px) {
|
|
14605
|
-
display: block;
|
|
14606
|
-
}
|
|
14607
|
-
`;
|
|
14608
14077
|
var ValuationWrapper = styled25__default.default.div`
|
|
14609
14078
|
display: flex;
|
|
14610
14079
|
flex-direction: column;
|
|
@@ -14656,9 +14125,10 @@ var PricingModelCard = styled25__default.default.div`
|
|
|
14656
14125
|
var PricingModelHeader = styled25__default.default.div`
|
|
14657
14126
|
display: flex;
|
|
14658
14127
|
justify-content: space-between;
|
|
14659
|
-
align-items:
|
|
14128
|
+
align-items: flex-start;
|
|
14660
14129
|
margin-bottom: 1.5rem;
|
|
14661
14130
|
gap: 1rem;
|
|
14131
|
+
flex-wrap: wrap;
|
|
14662
14132
|
|
|
14663
14133
|
.valuation-info {
|
|
14664
14134
|
display: flex;
|
|
@@ -14666,6 +14136,7 @@ var PricingModelHeader = styled25__default.default.div`
|
|
|
14666
14136
|
gap: 0.25rem;
|
|
14667
14137
|
font-size: 0.85rem;
|
|
14668
14138
|
color: rgba(255, 255, 255, 0.75);
|
|
14139
|
+
flex-shrink: 0;
|
|
14669
14140
|
}
|
|
14670
14141
|
`;
|
|
14671
14142
|
var PricingModelTitle = styled25__default.default.h3`
|
|
@@ -14732,15 +14203,31 @@ var ValuationDetails = styled25__default.default.div`
|
|
|
14732
14203
|
display: flex;
|
|
14733
14204
|
justify-content: space-between;
|
|
14734
14205
|
margin-top: 1rem;
|
|
14206
|
+
gap: 0.25rem;
|
|
14735
14207
|
`;
|
|
14736
14208
|
var ValuationItem = styled25__default.default.div`
|
|
14737
14209
|
display: flex;
|
|
14738
14210
|
flex-direction: column;
|
|
14211
|
+
min-width: 0;
|
|
14212
|
+
overflow: hidden;
|
|
14739
14213
|
`;
|
|
14740
14214
|
var ValuationValue = styled25__default.default.div`
|
|
14741
14215
|
font-size: 1rem;
|
|
14742
14216
|
font-weight: 600;
|
|
14743
14217
|
color: #fff;
|
|
14218
|
+
display: flex;
|
|
14219
|
+
flex-direction: column;
|
|
14220
|
+
gap: 2px;
|
|
14221
|
+
overflow-wrap: break-word;
|
|
14222
|
+
word-break: break-word;
|
|
14223
|
+
|
|
14224
|
+
@media (max-width: 480px) {
|
|
14225
|
+
font-size: 0.72rem;
|
|
14226
|
+
|
|
14227
|
+
.valuation-amount-span {
|
|
14228
|
+
display: none;
|
|
14229
|
+
}
|
|
14230
|
+
}
|
|
14744
14231
|
`;
|
|
14745
14232
|
var ChartContainer = styled25__default.default.div`
|
|
14746
14233
|
width: 100%;
|
|
@@ -15153,7 +14640,7 @@ var ThumbnailStrip = styled25__default.default.div`
|
|
|
15153
14640
|
display: none;
|
|
15154
14641
|
}
|
|
15155
14642
|
`;
|
|
15156
|
-
var
|
|
14643
|
+
var Thumbnail2 = styled25__default.default.button`
|
|
15157
14644
|
width: 86px;
|
|
15158
14645
|
height: 64px;
|
|
15159
14646
|
border-radius: 6px;
|
|
@@ -15489,7 +14976,7 @@ function GalleryContent({ galleryImages, startIndex, title, subtitle, onClose })
|
|
|
15489
14976
|
]
|
|
15490
14977
|
}
|
|
15491
14978
|
),
|
|
15492
|
-
/* @__PURE__ */ jsxRuntime.jsx(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
14979
|
+
/* @__PURE__ */ jsxRuntime.jsx(ThumbnailStrip, { onClick: (event) => event.stopPropagation(), children: galleryImages.map((image, idx) => /* @__PURE__ */ jsxRuntime.jsx(Thumbnail2, { $active: idx === currentIndex, onClick: () => setCurrentIndex(idx), "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: image.src, alt: image.alt }) }, image.alt)) })
|
|
15493
14980
|
]
|
|
15494
14981
|
}
|
|
15495
14982
|
);
|