@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.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: "1fr 1fr 1fr", padding: "0.2rem 0", fontSize: "0.8rem" },
1868
+ style: { gridTemplateColumns: "1.2fr 0.8fr", padding: "0.2rem 0", fontSize: "0.8rem" },
1874
1869
  children: [
1875
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: trade.type === "buy" ? "#0ecb81" : "#f6465d" }, className: "tabular-nums", children: formatNumber(trade.price, precision) }),
1876
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "right" }, className: "tabular-nums text-white/90", children: formatNumber(trade.amount, amountPrecision) }),
1877
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "right", paddingRight: "0.5rem", display: "flex", alignItems: "center", justifyContent: "flex-end", gap: "4px" }, className: "tabular-nums text-white/50", children: [
1878
- trade.time != null && /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatTradeTime(trade.time) }),
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: "relative grid grid-cols-3 items-center gap-3 px-3 text-[0.8rem]",
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.jsx(
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: formatNumber(trade.price, precision)
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 tabular-nums text-white/50", children: [
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 = 5;
1983
- var DEPTH_ROW_HEIGHT_PX = 28;
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 effectiveLevels = maxLevels ?? LEVEL_ROWS_VISIBLE;
2054
- const effectiveCompactLevels = maxLevels ?? COMPACT_ROWS_VISIBLE;
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 askMaxCumDepth = Math.max(1, ...askCumDepths);
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
- askMaxCumDepth,
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
- askMaxCumDepth,
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: effectiveLevels }).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", { children: tradeFiltered.map((trade, i) => {
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: cn("flex flex-col min-h-0 overflow-hidden", fillHeight && "flex-1"), children: [
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: cn("flex flex-col justify-end overflow-hidden", !fillHeight && "flex-shrink-0"),
2292
- style: fillHeight ? { flex: 1, minHeight: 0 } : { height: `${sectionHeight}px` },
2293
- children: isLoading ? Array.from({ length: effectiveLevels }).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(
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] / askMaxCumDepth * 100,
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 flex-shrink-0",
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: cn("flex flex-col overflow-hidden", !fillHeight && "flex-shrink-0"),
2333
- style: fillHeight ? { flex: 1, minHeight: 0 } : { height: `${sectionHeight}px` },
2334
- children: isLoading ? Array.from({ length: effectiveLevels }).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(
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] / bidMaxCumDepth * 100,
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
- askMaxCumDepth,
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", height: `${effectiveCompactLevels * COMPACT_ROW_HEIGHT_PX}px`, justifyContent: "flex-end", overflow: "hidden" }, children: isLoading ? Array.from({ length: effectiveCompactLevels }).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(
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] / askMaxCumDepth * 100,
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", height: `${effectiveCompactLevels * COMPACT_ROW_HEIGHT_PX}px`, overflow: "hidden" }, children: isLoading ? Array.from({ length: effectiveCompactLevels }).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(
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] / bidMaxCumDepth * 100,
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: effectiveCompactLevels }).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) => {
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
- height: `${COMPACT_ROW_HEIGHT_PX}px`,
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 = 6;
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 ? `${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: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", style: { color: "var(--color-text, #fff)", flexShrink: 0, display: "block" }, 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" }) }),
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", style: { margin: 0 }, children: resolvedHeading }),
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: "1.5rem", marginTop: "0.75rem", marginBottom: "0.5rem", borderBottom: "1px solid rgba(255, 255, 255, 0.08)", paddingBottom: "0.5rem" }, children: ["all", "property", "market"].map((tab) => /* @__PURE__ */ jsxRuntime.jsx(
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 0 0.5rem 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: cn("flex flex-1 flex-col overflow-hidden", isHomeVariant ? "mt-2 gap-0" : "mt-4 gap-3"),
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
- backgroundColor: "transparent",
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.95rem", fontWeight: 500, marginBottom: "0.35rem", color: "#f8f9fa", lineHeight: 1.45, transition: "color 0.15s" }, children: item.title }),
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: formatDateShort(item.date) }),
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 ? `${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 ? paginatedItems.map((item, index) => {
3125
- const absoluteIndex = page * ITEMS_PER_PAGE + index;
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 && absoluteIndex === 0) ? "Just now" : typeof item.date === "string" && item.date.trim().length > 0 ? item.date : formatDate(item.date);
3129
- const isHighlighted = item.isNew ?? (highlightFirst && absoluteIndex === 0);
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 ? `${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: "50%", width: "28px", height: "28px", display: "flex", alignItems: "center", justifyContent: "center", padding: 0, cursor: homePage === 0 ? "not-allowed" : "pointer", opacity: homePage === 0 ? 0.4 : 1, color: "rgba(255,255,255,0.6)" },
3197
- 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" }) })
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: "50%", width: "28px", height: "28px", display: "flex", alignItems: "center", justifyContent: "center", padding: 0, cursor: homePage >= homeTotalPages - 1 ? "not-allowed" : "pointer", opacity: homePage >= homeTotalPages - 1 ? 0.4 : 1, color: "rgba(255,255,255,0.6)" },
3212
- 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" }) })
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
- priceChange,
4751
- beds: _beds,
4752
- baths: _baths,
4753
- cars: _cars,
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.3rem, 3vw, 1.8rem)",
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.jsx(OuterWrapper, { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs(HeroContainer, { children: [
4790
- /* @__PURE__ */ jsxRuntime.jsx(
4791
- HeroImage,
4792
- {
4793
- src: imageUrl,
4794
- alt: imageAlt ?? name
4795
- }
4796
- ),
4797
- statusBadge ? /* @__PURE__ */ jsxRuntime.jsxs(StatusBadge, { $isLive: statusBadge.variant === "live", children: [
4798
- statusBadge.variant === "live" ? /* @__PURE__ */ jsxRuntime.jsx(PulsingDot, {}) : null,
4799
- statusBadge.label
4800
- ] }) : null,
4801
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-0 left-0 right-0 z-10 flex w-full items-end justify-center", style: { background: "linear-gradient(to top, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0) 100%)" }, 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: [
4802
- /* @__PURE__ */ jsxRuntime.jsx(InfoCard, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardLayout, { children: [
4803
- /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { src: imageUrl, alt: imageAlt ?? name }),
4804
- /* @__PURE__ */ jsxRuntime.jsx(CardContent2, { children: /* @__PURE__ */ jsxRuntime.jsxs(InfoRow, { children: [
4805
- /* @__PURE__ */ jsxRuntime.jsx(NameGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
4806
- /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem", flexWrap: "wrap" }, children: [
4807
- /* @__PURE__ */ jsxRuntime.jsx("h1", { style: headingStyle, className: "break-words", children: name }),
4808
- location ? /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { children: location }) : null
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
- address ? /* @__PURE__ */ jsxRuntime.jsx(AddressText, { children: address }) : null
4811
- ] }) }),
4812
- /* @__PURE__ */ jsxRuntime.jsxs(PriceGroup, { children: [
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
- changePercent != null ? /* @__PURE__ */ jsxRuntime.jsxs(PriceChangeRow, { $isPositive: isPositive, children: [
4819
- priceChange != null ? `${isPositive ? "+" : ""}${priceChange.toFixed(2)} ` : null,
4820
- "(",
4821
- isPositive ? "+" : "",
4822
- Math.abs(changePercent).toFixed(2),
4823
- "%)"
4824
- ] }) : null
4825
- ] })
4826
- ] }) })
4827
- ] }) }),
4828
- /* @__PURE__ */ jsxRuntime.jsxs(ActionButtons, { children: [
4829
- /* @__PURE__ */ jsxRuntime.jsx(
4830
- "button",
4831
- {
4832
- type: "button",
4833
- onClick: isTradeDisabled ? void 0 : onTrade,
4834
- 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]",
4835
- style: {
4836
- backgroundColor: isTradeInteracting ? tradeHoverColor : accentColor,
4837
- color: "black",
4838
- padding: "0.75rem 1.5rem",
4839
- borderColor: isTradeInteracting ? accentColor : "transparent",
4840
- boxShadow: isTradeInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4841
- opacity: isTradeDisabled ? 0.5 : 1,
4842
- cursor: isTradeDisabled ? "not-allowed" : "pointer"
4843
- },
4844
- onMouseEnter: () => setTradeInteraction(true),
4845
- onMouseLeave: () => setTradeInteraction(false),
4846
- onMouseDown: () => setTradeInteraction(true),
4847
- onMouseUp: () => setTradeInteraction(false),
4848
- onFocus: () => setTradeInteraction(true),
4849
- onBlur: () => setTradeInteraction(false),
4850
- onTouchStart: () => setTradeInteraction(true),
4851
- onTouchEnd: () => setTradeInteraction(false),
4852
- disabled: isTradeDisabled,
4853
- "aria-disabled": isTradeDisabled,
4854
- children: tradeButtonLabel
4855
- }
4856
- ),
4857
- showMakeOfferButton ? /* @__PURE__ */ jsxRuntime.jsx(
4858
- "button",
4859
- {
4860
- type: "button",
4861
- onClick: isMakeOfferButtonDisabled ? void 0 : onMakeOffer,
4862
- 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]",
4863
- style: {
4864
- backgroundColor: isOfferInteracting ? accentColor : "transparent",
4865
- borderColor: accentColor,
4866
- color: isOfferInteracting ? "black" : accentColor,
4867
- padding: "0.75rem 1.5rem",
4868
- boxShadow: isOfferInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4869
- opacity: isMakeOfferButtonDisabled ? 0.5 : 1,
4870
- cursor: isMakeOfferButtonDisabled ? "not-allowed" : "pointer"
4871
- },
4872
- onMouseEnter: () => setOfferInteraction(true),
4873
- onMouseLeave: () => setOfferInteraction(false),
4874
- onMouseDown: () => setOfferInteraction(true),
4875
- onMouseUp: () => setOfferInteraction(false),
4876
- onFocus: () => setOfferInteraction(true),
4877
- onBlur: () => setOfferInteraction(false),
4878
- onTouchStart: () => setOfferInteraction(true),
4879
- onTouchEnd: () => setOfferInteraction(false),
4880
- disabled: isMakeOfferButtonDisabled,
4881
- "aria-disabled": isMakeOfferButtonDisabled,
4882
- children: makeOfferButtonLabel
4883
- }
4884
- ) : null
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.15);
4994
- padding: 1rem 1.5rem;
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
- padding: 0.85rem 1.15rem;
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
- padding: 0.65rem 0.85rem;
4991
+ max-width: 95%;
5007
4992
  }
5008
4993
  `;
5009
- var NameGroup = styled25__default.default.div`
5010
- display: flex;
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
- min-width: 0;
5014
- flex-wrap: wrap;
4999
+ width: 100%;
5000
+
5001
+ @media (max-width: 640px) {
5002
+ gap: 0.5rem;
5003
+ }
5015
5004
  `;
5016
- var TypeBadge = styled25__default.default.span`
5017
- display: inline-flex;
5018
- align-items: center;
5019
- padding: 0.2rem 0.5rem;
5020
- border-radius: 4px;
5021
- font-size: 0.7rem;
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 InfoRow = styled25__default.default.div`
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
- white-space: nowrap;
5083
- flex-shrink: 0;
5084
- font-size: 0.85rem;
5085
- font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'JetBrains Mono', ui-monospace, monospace;
5086
- font-variant-numeric: tabular-nums;
5087
- color: ${({ $isPositive }) => $isPositive ? "#0ecb81" : "#f6465d"};
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
- top: 0.5rem;
5793
- left: 0.75rem;
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
- setView("kyc-success");
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
- setView("kyc-failed");
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(Title, { children: [
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(Title, { children: [
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(Title, { children: [
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 Title = styled25__default.default.h2`
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(PriceBlock, { $variant: propertyValueVariant, children: [
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 PriceBlock = styled25__default.default.div`
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(Thumbnail2, { "data-active": !showVideo && carouselIndex === actualIndex, onClick: () => {
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 Thumbnail2 = styled25__default.default.div`
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(TypeBadge2, { $type: loafListing.type, children: loafListing.type === "Sale" ? "Sold" : loafListing.type }) }),
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(TypeBadge2, { $type: ownershipSale.type, children: ownershipSale.type === "Sale" ? "Sold" : ownershipSale.type }) }),
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(TypeBadge2, { $type: sale.type, children: sale.type === "Sale" ? "Sold" : sale.type }) }),
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(TypeBadge2, { $type: event.type, children: event.type === "Sale" ? "Sold" : event.type }),
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 TypeBadge2 = styled25__default.default.span`
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, $secondary: !!m.secondary, children: m.value })
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: ${(p) => p.$secondary ? "0.95rem" : "1.25rem"};
9861
- font-weight: ${(p) => p.$secondary ? "600" : "700"};
9862
- color: ${(p) => p.$accent ? "#D4AF37" : p.$secondary ? "rgba(255,255,255,0.7)" : "#fff"};
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: ${(p) => p.$secondary ? "0.85rem" : "1.05rem"};
9687
+ font-size: 1.05rem;
9866
9688
  }
9867
9689
 
9868
9690
  @media (max-width: 480px) {
9869
- font-size: ${(p) => p.$secondary ? "0.8rem" : "0.95rem"};
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
- if (variant === "compact") {
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 Container = styled25__default.default.div`
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
- formatNumber2(pos.quantity),
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
- formatCurrency5(Math.abs(pnl))
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.6rem;
12316
- color: rgba(255, 255, 255, 0.35);
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: formatCurrency6(lastPrice) })
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
- formatCurrency6(fairValue),
13695
+ formatCompact(fairValue),
14221
13696
  " ",
14222
13697
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
14223
13698
  "(",
14224
- formatCurrency6(fairValue * tokensOutstanding, { maximumFractionDigits: 0 }),
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: formatCurrency6(lastPrice) })
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
- formatCurrency6(undervaluedThreshold)
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
- formatMillions(undervaluedThreshold * tokensOutstanding),
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: formatCurrency6(fairValue) }),
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
- formatMillions(fairValue * tokensOutstanding),
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
- formatCurrency6(overvaluedThreshold)
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
- formatMillions(overvaluedThreshold * tokensOutstanding),
13747
+ formatCompact(overvaluedThreshold * tokensOutstanding),
14273
13748
  ")"
14274
13749
  ] })
14275
13750
  ] }) })
14276
13751
  ] })
14277
13752
  ] }),
14278
- /* @__PURE__ */ jsxRuntime.jsxs(HiddenMobileChart, { children: [
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: center;
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 Thumbnail3 = styled25__default.default.button`
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(Thumbnail3, { $active: idx === currentIndex, onClick: () => setCurrentIndex(idx), "aria-label": `Preview ${image.label}`, children: /* @__PURE__ */ jsxRuntime.jsx("img", { src: image.src, alt: image.alt }) }, image.alt)) })
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
  );