@loafmarkets/ui 0.1.88 → 0.1.90

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,6 +1796,11 @@ 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
+ };
1799
1804
  var FLASH_DURATION_MS = 450;
1800
1805
  var FLASH_UP_COLOR = "rgba(14, 203, 129, 0.35)";
1801
1806
  var FLASH_DOWN_COLOR = "rgba(246, 70, 93, 0.35)";
@@ -1865,14 +1870,12 @@ function TradeRow({
1865
1870
  {
1866
1871
  ref: rowRef,
1867
1872
  className: "grid items-center",
1868
- style: { gridTemplateColumns: "1.2fr 0.8fr", padding: "0.2rem 0", fontSize: "0.8rem" },
1873
+ style: { gridTemplateColumns: "1fr 1fr 1fr", padding: "0.2rem 0", fontSize: "0.8rem" },
1869
1874
  children: [
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),
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) }),
1876
1879
  explorerUrl && /* @__PURE__ */ jsxRuntime.jsx(
1877
1880
  "a",
1878
1881
  {
@@ -1893,24 +1896,22 @@ function TradeRow({
1893
1896
  "div",
1894
1897
  {
1895
1898
  ref: rowRef,
1896
- className: "grid grid-cols-3 items-center gap-3 px-3 py-1.5",
1899
+ className: "relative grid grid-cols-3 items-center gap-3 px-3 text-[0.8rem]",
1900
+ style: { height: `${DEPTH_ROW_HEIGHT_PX}px` },
1897
1901
  children: [
1898
- /* @__PURE__ */ jsxRuntime.jsxs(
1902
+ /* @__PURE__ */ jsxRuntime.jsx(
1899
1903
  "div",
1900
1904
  {
1901
1905
  className: cn(
1902
1906
  "tabular-nums",
1903
1907
  trade.type === "buy" ? "text-[#0ecb81]" : "text-[#f6465d]"
1904
1908
  ),
1905
- children: [
1906
- "$",
1907
- formatNumber(trade.price, precision)
1908
- ]
1909
+ children: formatNumber(trade.price, precision)
1909
1910
  }
1910
1911
  ),
1911
1912
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right tabular-nums text-white/90", children: formatNumber(trade.amount, amountPrecision) }),
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 }),
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 }),
1914
1915
  explorerUrl && /* @__PURE__ */ jsxRuntime.jsx(
1915
1916
  "a",
1916
1917
  {
@@ -1978,8 +1979,8 @@ function DepthRow({
1978
1979
  );
1979
1980
  }
1980
1981
  var clamp3 = (value, min, max) => Math.min(max, Math.max(min, value));
1981
- var LEVEL_ROWS_VISIBLE = 6;
1982
- var DEPTH_ROW_HEIGHT_PX = 26;
1982
+ var LEVEL_ROWS_VISIBLE = 5;
1983
+ var DEPTH_ROW_HEIGHT_PX = 28;
1983
1984
  var COMPACT_ROWS_VISIBLE = 5;
1984
1985
  var COMPACT_ROW_HEIGHT_PX = 30;
1985
1986
  var COMPACT_BREAKPOINT_PX = 1024;
@@ -2003,6 +2004,7 @@ var Orderbook = React5__namespace.forwardRef(
2003
2004
  onPriceClick,
2004
2005
  onLoafLiquidityClick,
2005
2006
  tradeExplorerUrl,
2007
+ maxLevels,
2006
2008
  className,
2007
2009
  ...props
2008
2010
  }, ref) => {
@@ -2047,8 +2049,10 @@ var Orderbook = React5__namespace.forwardRef(
2047
2049
  onTabChange?.(next);
2048
2050
  };
2049
2051
  const isCompact = variant === "compact" || variant === "auto" && viewportCompact;
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;
2052
+ const effectiveLevels = maxLevels ?? LEVEL_ROWS_VISIBLE;
2053
+ const effectiveCompactLevels = maxLevels ?? COMPACT_ROWS_VISIBLE;
2054
+ const sectionHeight = isCompact ? effectiveCompactLevels * COMPACT_ROW_HEIGHT_PX : effectiveLevels * DEPTH_ROW_HEIGHT_PX;
2055
+ const rowCount = isCompact ? effectiveCompactLevels : effectiveLevels;
2052
2056
  const askVisibleLevels = asks.slice(-rowCount);
2053
2057
  const bidVisibleLevels = bids.slice(0, rowCount);
2054
2058
  const askCumDepths = new Array(askVisibleLevels.length);
@@ -2067,7 +2071,8 @@ var Orderbook = React5__namespace.forwardRef(
2067
2071
  bidCumDepths[i] = acc;
2068
2072
  }
2069
2073
  }
2070
- const combinedMaxCumDepth = Math.max(1, ...askCumDepths, ...bidCumDepths);
2074
+ const askMaxCumDepth = Math.max(1, ...askCumDepths);
2075
+ const bidMaxCumDepth = Math.max(1, ...bidCumDepths);
2071
2076
  const midClass = midChangePercent == null ? "text-white" : midChangePercent >= 0 ? "text-[#0ecb81]" : "text-[#f6465d]";
2072
2077
  const tradeFiltered = trades.filter((t) => tradeFilter === "all" || t.type === tradeFilter);
2073
2078
  const layoutProps = {
@@ -2087,7 +2092,8 @@ var Orderbook = React5__namespace.forwardRef(
2087
2092
  bidVisibleLevels,
2088
2093
  askCumDepths,
2089
2094
  bidCumDepths,
2090
- combinedMaxCumDepth,
2095
+ askMaxCumDepth,
2096
+ bidMaxCumDepth,
2091
2097
  midPrice,
2092
2098
  midChangePercent,
2093
2099
  midClass,
@@ -2097,14 +2103,16 @@ var Orderbook = React5__namespace.forwardRef(
2097
2103
  isLoading,
2098
2104
  seenTradeKeysRef,
2099
2105
  tradeExplorerUrl,
2100
- onPriceClick
2106
+ onPriceClick,
2107
+ levelCount: effectiveLevels,
2108
+ compactLevelCount: effectiveCompactLevels
2101
2109
  };
2102
2110
  return /* @__PURE__ */ jsxRuntime.jsx(
2103
2111
  Card,
2104
2112
  {
2105
2113
  ref,
2106
2114
  className: cn(
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",
2115
+ "w-full max-w-[520px] overflow-hidden rounded-[12px] border border-white/10 bg-[#111111] text-white shadow-md flex flex-col",
2108
2116
  isCompact && "max-w-none",
2109
2117
  className
2110
2118
  ),
@@ -2154,7 +2162,8 @@ function DesktopOrderbookLayout({
2154
2162
  bidVisibleLevels,
2155
2163
  askCumDepths,
2156
2164
  bidCumDepths,
2157
- combinedMaxCumDepth,
2165
+ askMaxCumDepth,
2166
+ bidMaxCumDepth,
2158
2167
  midPrice,
2159
2168
  midChangePercent,
2160
2169
  midClass,
@@ -2164,7 +2173,9 @@ function DesktopOrderbookLayout({
2164
2173
  isLoading,
2165
2174
  seenTradeKeysRef,
2166
2175
  tradeExplorerUrl,
2167
- onPriceClick
2176
+ onPriceClick,
2177
+ levelCount: effectiveLevels,
2178
+ compactLevelCount: _compactLevelCount
2168
2179
  }) {
2169
2180
  const midRef = React5__namespace.useRef(null);
2170
2181
  useMidPriceFlash(midRef, midPrice, "#0b1a24");
@@ -2252,7 +2263,7 @@ function DesktopOrderbookLayout({
2252
2263
  {
2253
2264
  className: "max-h-[380px] overflow-y-auto overflow-x-hidden",
2254
2265
  style: { scrollbarGutter: "stable" },
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) => {
2266
+ 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) => {
2256
2267
  const tradeKey = getTradeKey(trade, i);
2257
2268
  const explorerUrl = trade.txHash && tradeExplorerUrl ? tradeExplorerUrl(trade.txHash) : trade.txHash ? `https://sepolia.etherscan.io/tx/${trade.txHash}` : void 0;
2258
2269
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -2269,20 +2280,20 @@ function DesktopOrderbookLayout({
2269
2280
  );
2270
2281
  }) })
2271
2282
  }
2272
- ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col min-h-0", children: [
2283
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col min-h-0 overflow-hidden", children: [
2273
2284
  /* @__PURE__ */ jsxRuntime.jsx(
2274
2285
  "div",
2275
2286
  {
2276
- className: "flex flex-col justify-end divide-y divide-white/5 overflow-hidden",
2287
+ className: "flex flex-col justify-end overflow-hidden flex-shrink-0",
2277
2288
  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(
2289
+ 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(
2279
2290
  DepthRow,
2280
2291
  {
2281
2292
  side: "ask",
2282
2293
  price: l.price,
2283
2294
  amount: l.amount,
2284
2295
  cumDepth: askCumDepths[i],
2285
- depthPct: askCumDepths[i] / combinedMaxCumDepth * 100,
2296
+ depthPct: askCumDepths[i] / askMaxCumDepth * 100,
2286
2297
  precision,
2287
2298
  amountPrecision,
2288
2299
  hasUserOrder: userAskPrices.has(l.price),
@@ -2296,7 +2307,7 @@ function DesktopOrderbookLayout({
2296
2307
  "div",
2297
2308
  {
2298
2309
  ref: midRef,
2299
- className: "grid grid-cols-2 items-center gap-3 bg-[#0b1a24] px-3 py-2",
2310
+ className: "grid grid-cols-2 items-center gap-3 bg-[#0b1a24] px-3 py-2 flex-shrink-0",
2300
2311
  children: [
2301
2312
  /* @__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: [
2302
2313
  "$",
@@ -2314,16 +2325,16 @@ function DesktopOrderbookLayout({
2314
2325
  /* @__PURE__ */ jsxRuntime.jsx(
2315
2326
  "div",
2316
2327
  {
2317
- className: "divide-y divide-white/5 overflow-hidden",
2328
+ className: "flex flex-col overflow-hidden flex-shrink-0",
2318
2329
  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(
2330
+ 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(
2320
2331
  DepthRow,
2321
2332
  {
2322
2333
  side: "bid",
2323
2334
  price: l.price,
2324
2335
  amount: l.amount,
2325
2336
  cumDepth: bidCumDepths[i],
2326
- depthPct: bidCumDepths[i] / combinedMaxCumDepth * 100,
2337
+ depthPct: bidCumDepths[i] / bidMaxCumDepth * 100,
2327
2338
  precision,
2328
2339
  amountPrecision,
2329
2340
  hasUserOrder: userBidPrices.has(l.price),
@@ -2352,7 +2363,8 @@ function MobileOrderbookLayout({
2352
2363
  bidVisibleLevels: visibleBids,
2353
2364
  askCumDepths,
2354
2365
  bidCumDepths,
2355
- combinedMaxCumDepth,
2366
+ askMaxCumDepth,
2367
+ bidMaxCumDepth,
2356
2368
  midPrice,
2357
2369
  midChangePercent,
2358
2370
  midClass,
@@ -2362,7 +2374,9 @@ function MobileOrderbookLayout({
2362
2374
  isLoading,
2363
2375
  seenTradeKeysRef,
2364
2376
  tradeExplorerUrl,
2365
- onPriceClick
2377
+ onPriceClick,
2378
+ levelCount: _levelCount,
2379
+ compactLevelCount: effectiveCompactLevels
2366
2380
  }) {
2367
2381
  const midRef = React5__namespace.useRef(null);
2368
2382
  useMidPriceFlash(midRef, midPrice, "transparent");
@@ -2434,13 +2448,13 @@ function MobileOrderbookLayout({
2434
2448
  ]
2435
2449
  }
2436
2450
  ),
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(
2451
+ /* @__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(
2438
2452
  MobileDepthRow,
2439
2453
  {
2440
2454
  side: "ask",
2441
2455
  price: l.price,
2442
2456
  amount: l.amount,
2443
- depthPct: askCumDepths[i] / combinedMaxCumDepth * 100,
2457
+ depthPct: askCumDepths[i] / askMaxCumDepth * 100,
2444
2458
  precision,
2445
2459
  amountPrecision,
2446
2460
  hasUserOrder: userAskPrices.has(l.price),
@@ -2481,13 +2495,13 @@ function MobileOrderbookLayout({
2481
2495
  ]
2482
2496
  }
2483
2497
  ),
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(
2498
+ /* @__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(
2485
2499
  MobileDepthRow,
2486
2500
  {
2487
2501
  side: "bid",
2488
2502
  price: l.price,
2489
2503
  amount: l.amount,
2490
- depthPct: bidCumDepths[i] / combinedMaxCumDepth * 100,
2504
+ depthPct: bidCumDepths[i] / bidMaxCumDepth * 100,
2491
2505
  precision,
2492
2506
  amountPrecision,
2493
2507
  hasUserOrder: userBidPrices.has(l.price),
@@ -2507,7 +2521,7 @@ function MobileOrderbookLayout({
2507
2521
  ]
2508
2522
  }
2509
2523
  ),
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) => {
2524
+ /* @__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) => {
2511
2525
  const tradeKey = getTradeKey(trade, i);
2512
2526
  const explorerUrl = trade.txHash && tradeExplorerUrl ? tradeExplorerUrl(trade.txHash) : trade.txHash ? `https://sepolia.etherscan.io/tx/${trade.txHash}` : void 0;
2513
2527
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -2547,7 +2561,8 @@ function MobileDepthRow({
2547
2561
  style: {
2548
2562
  display: "grid",
2549
2563
  gridTemplateColumns: "1.2fr 0.8fr",
2550
- padding: "0.2rem 0",
2564
+ height: `${COMPACT_ROW_HEIGHT_PX}px`,
2565
+ alignItems: "center",
2551
2566
  fontSize: "0.8rem",
2552
2567
  position: "relative",
2553
2568
  cursor: onPriceClick ? "pointer" : void 0
@@ -2690,7 +2705,7 @@ var PropertyTour = React5__namespace.forwardRef(
2690
2705
  }
2691
2706
  );
2692
2707
  PropertyTour.displayName = "PropertyTour";
2693
- var ITEMS_PER_PAGE = 4;
2708
+ var ITEMS_PER_PAGE = 6;
2694
2709
  var ensureAnimationsInjected = () => {
2695
2710
  if (typeof document === "undefined") return;
2696
2711
  if (document.getElementById("property-news-updates-animations")) return;
@@ -2735,6 +2750,21 @@ var formatDate = (value) => {
2735
2750
  if (!(value instanceof Date) || Number.isNaN(value.getTime())) return "";
2736
2751
  return value.toLocaleDateString(void 0, { month: "short", day: "numeric", year: "numeric" });
2737
2752
  };
2753
+ var formatDateShort = (value) => {
2754
+ const d = typeof value === "string" ? new Date(value) : value;
2755
+ if (!(d instanceof Date) || Number.isNaN(d.getTime())) {
2756
+ if (typeof value === "string") {
2757
+ return value.replace(/\s*\d{4}\s*$/, "");
2758
+ }
2759
+ return "";
2760
+ }
2761
+ const diffMs = Date.now() - d.getTime();
2762
+ const diffS = diffMs / 1e3;
2763
+ if (diffS < 60) return "Just now";
2764
+ if (diffS < 3600) return `${Math.floor(diffS / 60)}m ago`;
2765
+ if (diffS < 86400) return `${Math.floor(diffS / 3600)}h ago`;
2766
+ return d.toLocaleDateString(void 0, { month: "short", day: "numeric" });
2767
+ };
2738
2768
  var formatTimeAgo = (timestamp) => {
2739
2769
  const diff = (Date.now() - new Date(timestamp).getTime()) / 1e3;
2740
2770
  if (diff < 60) return `${Math.floor(diff)}s ago`;
@@ -2745,7 +2775,7 @@ function getSentimentInfo(score) {
2745
2775
  if (score == null) return null;
2746
2776
  if (score > 0.15) return { arrow: "\u25B2", label: "Bullish", color: "#0ecb81" };
2747
2777
  if (score < -0.15) return { arrow: "\u25BC", label: "Bearish", color: "#f6465d" };
2748
- return { arrow: "\u2014", label: "Neutral", color: "#848e9c" };
2778
+ return { arrow: "", label: "Neutral", color: "#848e9c" };
2749
2779
  }
2750
2780
  function NewsArticleModal({ item, onClose }) {
2751
2781
  const sentimentInfo = getSentimentInfo(item.sentimentScore);
@@ -2827,8 +2857,7 @@ function NewsArticleModal({ item, onClose }) {
2827
2857
  border: `1px solid ${sentimentInfo.color}40`
2828
2858
  },
2829
2859
  children: [
2830
- sentimentInfo.arrow,
2831
- " ",
2860
+ sentimentInfo.arrow ? `${sentimentInfo.arrow} ` : "",
2832
2861
  sentimentInfo.label
2833
2862
  ]
2834
2863
  }
@@ -2868,7 +2897,35 @@ function NewsArticleModal({ item, onClose }) {
2868
2897
  )
2869
2898
  ] }),
2870
2899
  /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: "1px", background: "rgba(255,255,255,0.08)", marginBottom: "1.25rem" } }),
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." })
2900
+ 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." }),
2901
+ 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(
2902
+ "a",
2903
+ {
2904
+ href: item.url,
2905
+ target: "_blank",
2906
+ rel: "noopener noreferrer",
2907
+ style: {
2908
+ display: "inline-flex",
2909
+ alignItems: "center",
2910
+ gap: "0.4rem",
2911
+ fontSize: "0.8rem",
2912
+ fontWeight: 600,
2913
+ color: "var(--color-accent, #f0b90b)",
2914
+ textDecoration: "none",
2915
+ transition: "opacity 0.15s"
2916
+ },
2917
+ onMouseEnter: (e) => {
2918
+ e.currentTarget.style.opacity = "0.8";
2919
+ },
2920
+ onMouseLeave: (e) => {
2921
+ e.currentTarget.style.opacity = "1";
2922
+ },
2923
+ children: [
2924
+ "Read full article",
2925
+ /* @__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" }) })
2926
+ ]
2927
+ }
2928
+ ) })
2872
2929
  ]
2873
2930
  }
2874
2931
  )
@@ -2938,10 +2995,10 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
2938
2995
  children: [
2939
2996
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
2940
2997
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
2941
- 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" }) }),
2998
+ 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" }) }),
2942
2999
  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" } }),
2943
3000
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2944
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: isHomeVariant ? "text-base font-semibold text-white" : "text-lg font-semibold text-white", children: resolvedHeading }),
3001
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: isHomeVariant ? "text-base font-semibold text-white" : "text-lg font-semibold text-white", style: { margin: 0 }, children: resolvedHeading }),
2945
3002
  subheading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-white/60", children: subheading }) : null
2946
3003
  ] })
2947
3004
  ] }),
@@ -2956,7 +3013,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
2956
3013
  "LIVE"
2957
3014
  ] }) : null
2958
3015
  ] }),
2959
- 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(
3016
+ 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(
2960
3017
  "button",
2961
3018
  {
2962
3019
  type: "button",
@@ -2965,7 +3022,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
2965
3022
  background: "transparent",
2966
3023
  border: "none",
2967
3024
  borderBottom: homeTab === tab ? "2px solid var(--color-accent, #f0b90b)" : "2px solid transparent",
2968
- padding: "0.5rem 0.75rem",
3025
+ padding: "0 0 0.5rem 0",
3026
+ marginBottom: "-1px",
2969
3027
  fontSize: "0.75rem",
2970
3028
  fontWeight: homeTab === tab ? 600 : 400,
2971
3029
  color: homeTab === tab ? "var(--color-text, #fff)" : "var(--color-text-secondary, #848e9c)",
@@ -2979,7 +3037,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
2979
3037
  /* @__PURE__ */ jsxRuntime.jsx(
2980
3038
  "div",
2981
3039
  {
2982
- className: "mt-4 flex flex-1 flex-col gap-3 overflow-hidden",
3040
+ className: cn("flex flex-1 flex-col overflow-hidden", isHomeVariant ? "mt-2 gap-0" : "mt-4 gap-3"),
2983
3041
  style: !isPurchaseVariant && !isHomeVariant ? { minHeight: `${ITEMS_PER_PAGE * 86}px` } : void 0,
2984
3042
  children: isPurchaseVariant ? purchaseItems.length > 0 ? purchaseItems.slice(0, 7).map((purchase, index) => {
2985
3043
  const maxAmount = 6e4;
@@ -3018,7 +3076,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3018
3076
  style: {
3019
3077
  width: "100%",
3020
3078
  textAlign: "left",
3021
- background: "transparent",
3079
+ backgroundColor: "transparent",
3022
3080
  border: "none",
3023
3081
  cursor: "pointer",
3024
3082
  padding: "0.75rem 0",
@@ -3027,18 +3085,28 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3027
3085
  justifyContent: "space-between",
3028
3086
  alignItems: "flex-start",
3029
3087
  gap: "0.5rem",
3030
- color: "inherit"
3088
+ color: "inherit",
3089
+ transition: "background-color 0.15s"
3090
+ },
3091
+ onMouseEnter: (e) => {
3092
+ e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.04)";
3093
+ const title = e.currentTarget.querySelector("h3");
3094
+ if (title) title.style.color = "var(--color-accent, #E6C87E)";
3095
+ },
3096
+ onMouseLeave: (e) => {
3097
+ e.currentTarget.style.backgroundColor = "transparent";
3098
+ const title = e.currentTarget.querySelector("h3");
3099
+ if (title) title.style.color = "#f8f9fa";
3031
3100
  },
3032
3101
  children: [
3033
3102
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { flex: 1 }, children: [
3034
- /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { fontSize: "0.85rem", fontWeight: 400, marginBottom: "0.25rem", color: "#f8f9fa", lineHeight: 1.4 }, children: item.title }),
3103
+ /* @__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 }),
3035
3104
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: "0.5rem", alignItems: "center", flexWrap: "wrap" }, children: [
3036
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#848e9c", fontSize: "0.7rem" }, children: typeof item.date === "string" ? item.date : formatDate(item.date) }),
3105
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#848e9c", fontSize: "0.7rem" }, children: formatDateShort(item.date) }),
3037
3106
  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 }),
3038
3107
  /* @__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" }),
3039
3108
  sentimentInfo && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.65rem", fontWeight: 600, color: sentimentInfo.color }, children: [
3040
- sentimentInfo.arrow,
3041
- " ",
3109
+ sentimentInfo.arrow ? `${sentimentInfo.arrow} ` : "",
3042
3110
  sentimentInfo.label
3043
3111
  ] })
3044
3112
  ] })
@@ -3095,8 +3163,7 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3095
3163
  ] }),
3096
3164
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", alignItems: "flex-end", gap: "0.3rem", flexShrink: 0 }, children: [
3097
3165
  sentimentInfo && /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.65rem", fontWeight: 700, color: sentimentInfo.color, whiteSpace: "nowrap" }, children: [
3098
- sentimentInfo.arrow,
3099
- " ",
3166
+ sentimentInfo.arrow ? `${sentimentInfo.arrow} ` : "",
3100
3167
  sentimentInfo.label
3101
3168
  ] }),
3102
3169
  /* @__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" })
@@ -3121,8 +3188,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3121
3188
  type: "button",
3122
3189
  onClick: () => setHomePage((p) => Math.max(0, p - 1)),
3123
3190
  disabled: homePage === 0,
3124
- 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)" },
3125
- children: "Prev"
3191
+ 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)" },
3192
+ 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" }) })
3126
3193
  }
3127
3194
  ),
3128
3195
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.7rem", color: "rgba(255,255,255,0.5)" }, children: [
@@ -3136,8 +3203,8 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3136
3203
  type: "button",
3137
3204
  onClick: () => setHomePage((p) => Math.min(homeTotalPages - 1, p + 1)),
3138
3205
  disabled: homePage >= homeTotalPages - 1,
3139
- 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)" },
3140
- children: "Next"
3206
+ 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)" },
3207
+ 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" }) })
3141
3208
  }
3142
3209
  )
3143
3210
  ] }),
@@ -3148,8 +3215,9 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3148
3215
  type: "button",
3149
3216
  onClick: () => setPage((p) => Math.max(0, p - 1)),
3150
3217
  disabled: page === 0,
3151
- className: cn("rounded-full border border-white/15 px-3 py-1 uppercase tracking-[0.2em]", page === 0 ? "opacity-40 cursor-not-allowed" : "hover:border-white/40"),
3152
- children: "Prev"
3218
+ className: cn("rounded-full border border-white/15 flex items-center justify-center", page === 0 ? "opacity-40 cursor-not-allowed" : "hover:border-white/40"),
3219
+ style: { width: "28px", height: "28px", padding: 0, background: "transparent", color: "rgba(255,255,255,0.6)" },
3220
+ 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" }) })
3153
3221
  }
3154
3222
  ),
3155
3223
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-white/70", children: [
@@ -3164,8 +3232,9 @@ var PropertyNewsUpdates = React5__namespace.forwardRef(
3164
3232
  type: "button",
3165
3233
  onClick: () => setPage((p) => Math.min(totalPages - 1, p + 1)),
3166
3234
  disabled: page >= totalPages - 1,
3167
- className: cn("rounded-full border border-white/15 px-3 py-1 uppercase tracking-[0.2em]", page >= totalPages - 1 ? "opacity-40 cursor-not-allowed" : "hover:border-white/40"),
3168
- children: "Next"
3235
+ 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"),
3236
+ style: { width: "28px", height: "28px", padding: 0, background: "transparent", color: "rgba(255,255,255,0.6)" },
3237
+ 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" }) })
3169
3238
  }
3170
3239
  )
3171
3240
  ] }),
@@ -4668,14 +4737,16 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
4668
4737
  imageUrl,
4669
4738
  imageAlt,
4670
4739
  name,
4740
+ address,
4671
4741
  location,
4672
4742
  price,
4673
4743
  currencySymbol = "$",
4674
4744
  changePercent,
4675
- beds,
4676
- baths,
4677
- cars,
4678
- propertyTypeLabel,
4745
+ priceChange,
4746
+ beds: _beds,
4747
+ baths: _baths,
4748
+ cars: _cars,
4749
+ propertyTypeLabel: _propertyTypeLabel,
4679
4750
  onTrade,
4680
4751
  onMakeOffer,
4681
4752
  tradeButtonLabel = "Trade",
@@ -4691,7 +4762,6 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
4691
4762
  const tradeHoverColor = "#f5dd9a";
4692
4763
  const [isTradeInteracting, setIsTradeInteracting] = React5__namespace.useState(false);
4693
4764
  const [isOfferInteracting, setIsOfferInteracting] = React5__namespace.useState(false);
4694
- const hasAmenities = isLoading || beds != null || baths != null || cars != null || propertyTypeLabel != null;
4695
4765
  const isTradeDisabled = !onTrade;
4696
4766
  const isMakeOfferButtonDisabled = makeOfferDisabled || !onMakeOffer;
4697
4767
  const showMakeOfferButton = !hideMakeOfferButton;
@@ -4704,201 +4774,112 @@ var PropertyHeroHeader = React5__namespace.forwardRef(
4704
4774
  setIsOfferInteracting(state);
4705
4775
  };
4706
4776
  const headingStyle = {
4707
- fontSize: "clamp(1.6rem, 4vw, 2.5rem)",
4708
- marginBottom: "0.5rem",
4777
+ fontSize: "clamp(1.3rem, 3vw, 1.8rem)",
4778
+ marginBottom: "0",
4709
4779
  color: "#ffffff",
4710
4780
  textShadow: "0 2px 4px rgba(0, 0, 0, 0.3)",
4711
4781
  fontWeight: 600,
4712
4782
  lineHeight: 1.2
4713
4783
  };
4714
- return /* @__PURE__ */ jsxRuntime.jsxs(OuterWrapper, { ref, className: cn(className), ...props, children: [
4715
- /* @__PURE__ */ jsxRuntime.jsxs(HeroContainer, { children: [
4716
- /* @__PURE__ */ jsxRuntime.jsx(
4717
- HeroImage,
4718
- {
4719
- src: imageUrl,
4720
- alt: imageAlt ?? name
4721
- }
4722
- ),
4723
- statusBadge ? /* @__PURE__ */ jsxRuntime.jsxs(StatusBadge, { $isLive: statusBadge.variant === "live", children: [
4724
- statusBadge.variant === "live" ? /* @__PURE__ */ jsxRuntime.jsx(PulsingDot, {}) : null,
4725
- statusBadge.label
4726
- ] }) : null,
4727
- /* @__PURE__ */ jsxRuntime.jsx(HeroGradient, { "aria-hidden": "true" }),
4728
- /* @__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: [
4729
- /* @__PURE__ */ jsxRuntime.jsxs(InfoCard, { children: [
4730
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-2", children: [
4731
- /* @__PURE__ */ jsxRuntime.jsx("h1", { style: headingStyle, className: "break-words", children: name }),
4732
- /* @__PURE__ */ jsxRuntime.jsxs(InfoRow, { className: "mb-3 max-[768px]:mb-[0.6rem] max-[480px]:mb-[0.5rem]", children: [
4733
- /* @__PURE__ */ jsxRuntime.jsx(LocationText, { children: location }),
4734
- isLoading ? /* @__PURE__ */ jsxRuntime.jsx(PriceBlock, { children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 110, height: 18 }) }) : price == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(PriceBlock, { children: [
4735
- formatPrice3(price, currencySymbol),
4736
- changePercent == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(
4737
- "span",
4738
- {
4739
- className: cn(
4740
- "ml-2 flex items-center text-[0.875rem] font-medium",
4741
- isPositive ? "text-[#0ecb81]" : "text-[#f6465d]"
4742
- ),
4743
- children: [
4744
- /* @__PURE__ */ jsxRuntime.jsx(
4745
- "svg",
4746
- {
4747
- xmlns: "http://www.w3.org/2000/svg",
4748
- width: "12",
4749
- height: "12",
4750
- viewBox: "0 0 24 24",
4751
- fill: "currentColor",
4752
- className: "mr-[0.15rem]",
4753
- children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: isPositive ? "M7 14l5-5 5 5H7z" : "M7 10l5 5 5-5H7z" })
4754
- }
4755
- ),
4756
- Math.abs(changePercent).toFixed(2),
4757
- "%"
4758
- ]
4759
- }
4760
- )
4761
- ] })
4762
- ] })
4763
- ] }),
4764
- /* @__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: [
4765
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4766
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
4767
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 52, height: 14 })
4768
- ] }),
4769
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4770
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
4771
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 56, height: 14 })
4772
- ] }),
4773
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4774
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "mr-2 h-[18px] w-[18px] opacity-60" }),
4775
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 50, height: 14 })
4776
- ] }),
4777
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 60, height: 14 })
4778
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4779
- beds == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4780
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "mr-2 h-[18px] w-[18px]" }),
4781
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4782
- beds,
4783
- " Beds"
4784
- ] })
4785
- ] }),
4786
- baths == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4787
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "mr-2 h-[18px] w-[18px]" }),
4788
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4789
- baths,
4790
- " Baths"
4791
- ] })
4784
+ return /* @__PURE__ */ jsxRuntime.jsx(OuterWrapper, { ref, className: cn(className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs(HeroContainer, { children: [
4785
+ /* @__PURE__ */ jsxRuntime.jsx(
4786
+ HeroImage,
4787
+ {
4788
+ src: imageUrl,
4789
+ alt: imageAlt ?? name
4790
+ }
4791
+ ),
4792
+ statusBadge ? /* @__PURE__ */ jsxRuntime.jsxs(StatusBadge, { $isLive: statusBadge.variant === "live", children: [
4793
+ statusBadge.variant === "live" ? /* @__PURE__ */ jsxRuntime.jsx(PulsingDot, {}) : null,
4794
+ statusBadge.label
4795
+ ] }) : null,
4796
+ /* @__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: [
4797
+ /* @__PURE__ */ jsxRuntime.jsx(InfoCard, { children: /* @__PURE__ */ jsxRuntime.jsxs(CardLayout, { children: [
4798
+ /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { src: imageUrl, alt: imageAlt ?? name }),
4799
+ /* @__PURE__ */ jsxRuntime.jsx(CardContent2, { children: /* @__PURE__ */ jsxRuntime.jsxs(InfoRow, { children: [
4800
+ /* @__PURE__ */ jsxRuntime.jsx(NameGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
4801
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.75rem", flexWrap: "wrap" }, children: [
4802
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { style: headingStyle, className: "break-words", children: name }),
4803
+ location ? /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { children: location }) : null
4792
4804
  ] }),
4793
- cars == null ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
4794
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "mr-2 h-[18px] w-[18px]" }),
4795
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4796
- cars,
4797
- " Cars"
4798
- ] })
4805
+ address ? /* @__PURE__ */ jsxRuntime.jsx(AddressText, { children: address }) : null
4806
+ ] }) }),
4807
+ /* @__PURE__ */ jsxRuntime.jsxs(PriceGroup, { children: [
4808
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 110, height: 24 }) : price == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(PriceRow, { children: [
4809
+ /* @__PURE__ */ jsxRuntime.jsx(CurrencyLabel, { children: "USD" }),
4810
+ changePercent != null ? /* @__PURE__ */ jsxRuntime.jsx(PriceArrow, { $isPositive: isPositive, children: isPositive ? "\u25B2" : "\u25BC" }) : null,
4811
+ formatPrice3(price, "")
4799
4812
  ] }),
4800
- propertyTypeLabel == null ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { children: propertyTypeLabel })
4801
- ] }) })
4802
- ] }),
4803
- /* @__PURE__ */ jsxRuntime.jsxs(ActionButtons, { children: [
4804
- /* @__PURE__ */ jsxRuntime.jsx(
4805
- "button",
4806
- {
4807
- type: "button",
4808
- onClick: isTradeDisabled ? void 0 : onTrade,
4809
- 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]",
4810
- style: {
4811
- backgroundColor: isTradeInteracting ? tradeHoverColor : accentColor,
4812
- color: "black",
4813
- padding: "0.75rem 1.5rem",
4814
- borderColor: isTradeInteracting ? accentColor : "transparent",
4815
- boxShadow: isTradeInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4816
- opacity: isTradeDisabled ? 0.5 : 1,
4817
- cursor: isTradeDisabled ? "not-allowed" : "pointer"
4818
- },
4819
- onMouseEnter: () => setTradeInteraction(true),
4820
- onMouseLeave: () => setTradeInteraction(false),
4821
- onMouseDown: () => setTradeInteraction(true),
4822
- onMouseUp: () => setTradeInteraction(false),
4823
- onFocus: () => setTradeInteraction(true),
4824
- onBlur: () => setTradeInteraction(false),
4825
- onTouchStart: () => setTradeInteraction(true),
4826
- onTouchEnd: () => setTradeInteraction(false),
4827
- disabled: isTradeDisabled,
4828
- "aria-disabled": isTradeDisabled,
4829
- children: tradeButtonLabel
4830
- }
4831
- ),
4832
- showMakeOfferButton ? /* @__PURE__ */ jsxRuntime.jsx(
4833
- "button",
4834
- {
4835
- type: "button",
4836
- onClick: isMakeOfferButtonDisabled ? void 0 : onMakeOffer,
4837
- 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]",
4838
- style: {
4839
- backgroundColor: isOfferInteracting ? accentColor : "transparent",
4840
- borderColor: accentColor,
4841
- color: isOfferInteracting ? "black" : accentColor,
4842
- padding: "0.75rem 1.5rem",
4843
- boxShadow: isOfferInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4844
- opacity: isMakeOfferButtonDisabled ? 0.5 : 1,
4845
- cursor: isMakeOfferButtonDisabled ? "not-allowed" : "pointer"
4846
- },
4847
- onMouseEnter: () => setOfferInteraction(true),
4848
- onMouseLeave: () => setOfferInteraction(false),
4849
- onMouseDown: () => setOfferInteraction(true),
4850
- onMouseUp: () => setOfferInteraction(false),
4851
- onFocus: () => setOfferInteraction(true),
4852
- onBlur: () => setOfferInteraction(false),
4853
- onTouchStart: () => setOfferInteraction(true),
4854
- onTouchEnd: () => setOfferInteraction(false),
4855
- disabled: isMakeOfferButtonDisabled,
4856
- "aria-disabled": isMakeOfferButtonDisabled,
4857
- children: makeOfferButtonLabel
4858
- }
4859
- ) : null
4860
- ] })
4861
- ] }) })
4862
- ] }),
4863
- hasAmenities ? /* @__PURE__ */ jsxRuntime.jsx(MobileAmenities, { children: isLoading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4864
- /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4865
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "h-4 w-4 opacity-60" }),
4866
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 40, height: 12 })
4867
- ] }),
4868
- /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4869
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "h-4 w-4 opacity-60" }),
4870
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 44, height: 12 })
4871
- ] }),
4872
- /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4873
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "h-4 w-4 opacity-60" }),
4874
- /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 42, height: 12 })
4875
- ] }),
4876
- /* @__PURE__ */ jsxRuntime.jsx(MobileAmenity, { children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { width: 52, height: 12 }) })
4877
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4878
- beds == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4879
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BedDouble, { className: "h-4 w-4" }),
4880
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4881
- beds,
4882
- " Beds"
4883
- ] })
4884
- ] }),
4885
- baths == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4886
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bath, { className: "h-4 w-4" }),
4887
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4888
- baths,
4889
- " Baths"
4890
- ] })
4891
- ] }),
4892
- cars == null ? null : /* @__PURE__ */ jsxRuntime.jsxs(MobileAmenity, { children: [
4893
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CarFront, { className: "h-4 w-4" }),
4894
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
4895
- cars,
4896
- " Cars"
4897
- ] })
4898
- ] }),
4899
- propertyTypeLabel == null ? null : /* @__PURE__ */ jsxRuntime.jsx(MobileAmenity, { children: propertyTypeLabel })
4900
- ] }) }) : null
4901
- ] });
4813
+ changePercent != null ? /* @__PURE__ */ jsxRuntime.jsxs(PriceChangeRow, { $isPositive: isPositive, children: [
4814
+ priceChange != null ? `${isPositive ? "+" : ""}${priceChange.toFixed(2)} ` : null,
4815
+ "(",
4816
+ isPositive ? "+" : "",
4817
+ Math.abs(changePercent).toFixed(2),
4818
+ "%)"
4819
+ ] }) : null
4820
+ ] })
4821
+ ] }) })
4822
+ ] }) }),
4823
+ /* @__PURE__ */ jsxRuntime.jsxs(ActionButtons, { children: [
4824
+ /* @__PURE__ */ jsxRuntime.jsx(
4825
+ "button",
4826
+ {
4827
+ type: "button",
4828
+ onClick: isTradeDisabled ? void 0 : onTrade,
4829
+ 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]",
4830
+ style: {
4831
+ backgroundColor: isTradeInteracting ? tradeHoverColor : accentColor,
4832
+ color: "black",
4833
+ padding: "0.75rem 1.5rem",
4834
+ borderColor: isTradeInteracting ? accentColor : "transparent",
4835
+ boxShadow: isTradeInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4836
+ opacity: isTradeDisabled ? 0.5 : 1,
4837
+ cursor: isTradeDisabled ? "not-allowed" : "pointer"
4838
+ },
4839
+ onMouseEnter: () => setTradeInteraction(true),
4840
+ onMouseLeave: () => setTradeInteraction(false),
4841
+ onMouseDown: () => setTradeInteraction(true),
4842
+ onMouseUp: () => setTradeInteraction(false),
4843
+ onFocus: () => setTradeInteraction(true),
4844
+ onBlur: () => setTradeInteraction(false),
4845
+ onTouchStart: () => setTradeInteraction(true),
4846
+ onTouchEnd: () => setTradeInteraction(false),
4847
+ disabled: isTradeDisabled,
4848
+ "aria-disabled": isTradeDisabled,
4849
+ children: tradeButtonLabel
4850
+ }
4851
+ ),
4852
+ showMakeOfferButton ? /* @__PURE__ */ jsxRuntime.jsx(
4853
+ "button",
4854
+ {
4855
+ type: "button",
4856
+ onClick: isMakeOfferButtonDisabled ? void 0 : onMakeOffer,
4857
+ 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]",
4858
+ style: {
4859
+ backgroundColor: isOfferInteracting ? accentColor : "transparent",
4860
+ borderColor: accentColor,
4861
+ color: isOfferInteracting ? "black" : accentColor,
4862
+ padding: "0.75rem 1.5rem",
4863
+ boxShadow: isOfferInteracting ? `0 0 0 2px rgba(0,0,0,0.4), 0 0 0 4px ${accentColor}` : "none",
4864
+ opacity: isMakeOfferButtonDisabled ? 0.5 : 1,
4865
+ cursor: isMakeOfferButtonDisabled ? "not-allowed" : "pointer"
4866
+ },
4867
+ onMouseEnter: () => setOfferInteraction(true),
4868
+ onMouseLeave: () => setOfferInteraction(false),
4869
+ onMouseDown: () => setOfferInteraction(true),
4870
+ onMouseUp: () => setOfferInteraction(false),
4871
+ onFocus: () => setOfferInteraction(true),
4872
+ onBlur: () => setOfferInteraction(false),
4873
+ onTouchStart: () => setOfferInteraction(true),
4874
+ onTouchEnd: () => setOfferInteraction(false),
4875
+ disabled: isMakeOfferButtonDisabled,
4876
+ "aria-disabled": isMakeOfferButtonDisabled,
4877
+ children: makeOfferButtonLabel
4878
+ }
4879
+ ) : null
4880
+ ] })
4881
+ ] }) })
4882
+ ] }) });
4902
4883
  }
4903
4884
  );
4904
4885
  PropertyHeroHeader.displayName = "PropertyHeroHeader";
@@ -4941,32 +4922,6 @@ var HeroContainer = styled25__default.default.div`
4941
4922
  border-radius: 6px;
4942
4923
  }
4943
4924
  `;
4944
- var MobileAmenities = styled25__default.default.div`
4945
- display: none;
4946
- align-items: center;
4947
- justify-content: space-between;
4948
- gap: 0.5rem;
4949
- padding: 0.5rem 0.75rem;
4950
- background: rgba(8, 8, 12, 0.85);
4951
- border-radius: 12px;
4952
- border: 1px solid rgba(255, 255, 255, 0.1);
4953
- color: rgba(255, 255, 255, 0.85);
4954
- font-size: 0.85rem;
4955
-
4956
- @media (max-width: 768px) {
4957
- display: flex;
4958
- flex-wrap: wrap;
4959
- }
4960
- `;
4961
- var MobileAmenity = styled25__default.default.span`
4962
- display: inline-flex;
4963
- align-items: center;
4964
- gap: 0.35rem;
4965
- padding: 0.35rem 0.5rem;
4966
- border-radius: 999px;
4967
- background: rgba(255, 255, 255, 0.08);
4968
- font-weight: 500;
4969
- `;
4970
4925
  var HeroImage = styled25__default.default.img`
4971
4926
  width: 100%;
4972
4927
  height: 100%;
@@ -4981,15 +4936,6 @@ var HeroImage = styled25__default.default.img`
4981
4936
  transform: scale(1.0);
4982
4937
  transform-origin: center;
4983
4938
  `;
4984
- var HeroGradient = styled25__default.default.div`
4985
- position: absolute;
4986
- bottom: 0;
4987
- left: 0;
4988
- right: 0;
4989
- width: 100%;
4990
- z-index: 1;
4991
- background: linear-gradient(to top, rgba(0, 0, 0, 0.7) 0%, rgba(0, 0, 0, 0) 100%);
4992
- `;
4993
4939
  var ActionButtons = styled25__default.default.div`
4994
4940
  display: flex;
4995
4941
  flex-wrap: wrap;
@@ -5005,13 +4951,42 @@ var ActionButtons = styled25__default.default.div`
5005
4951
  display: none;
5006
4952
  }
5007
4953
  `;
4954
+ var CardLayout = styled25__default.default.div`
4955
+ display: flex;
4956
+ align-items: center;
4957
+ gap: 1rem;
4958
+
4959
+ @media (max-width: 480px) {
4960
+ gap: 0.75rem;
4961
+ }
4962
+ `;
4963
+ var Thumbnail = styled25__default.default.img`
4964
+ width: 72px;
4965
+ height: 72px;
4966
+ border-radius: 8px;
4967
+ object-fit: cover;
4968
+ flex-shrink: 0;
4969
+ border: 1px solid rgba(255, 255, 255, 0.15);
4970
+
4971
+ @media (max-width: 768px) {
4972
+ width: 56px;
4973
+ height: 56px;
4974
+ border-radius: 6px;
4975
+ }
4976
+
4977
+ @media (max-width: 480px) {
4978
+ width: 48px;
4979
+ height: 48px;
4980
+ }
4981
+ `;
4982
+ var CardContent2 = styled25__default.default.div`
4983
+ min-width: 0;
4984
+ flex: 1;
4985
+ `;
5008
4986
  var InfoCard = styled25__default.default.div`
5009
- display: inline-block;
5010
- width: fit-content;
5011
- max-width: 70%;
5012
4987
  border-radius: 12px;
5013
- background: rgba(0, 0, 0, 0.12);
5014
- padding: 0.75rem 1rem;
4988
+ background: rgba(0, 0, 0, 0.15);
4989
+ padding: 1rem 1.5rem;
5015
4990
  color: #fff;
5016
4991
  backdrop-filter: blur(6px);
5017
4992
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
@@ -5019,45 +4994,92 @@ var InfoCard = styled25__default.default.div`
5019
4994
  min-width: 0;
5020
4995
 
5021
4996
  @media (max-width: 768px) {
5022
- max-width: 85%;
5023
- }
5024
-
5025
- @media (max-width: 640px) {
5026
- max-width: 92%;
4997
+ padding: 0.85rem 1.15rem;
5027
4998
  }
5028
4999
 
5029
5000
  @media (max-width: 480px) {
5030
- max-width: 95%;
5001
+ padding: 0.65rem 0.85rem;
5031
5002
  }
5032
5003
  `;
5033
- var InfoRow = styled25__default.default.div`
5034
- display: grid;
5035
- grid-template-columns: minmax(0, 1fr) auto;
5004
+ var NameGroup = styled25__default.default.div`
5005
+ display: flex;
5036
5006
  align-items: center;
5037
5007
  gap: 0.75rem;
5038
- width: 100%;
5039
-
5040
- @media (max-width: 640px) {
5041
- gap: 0.5rem;
5042
- }
5008
+ min-width: 0;
5009
+ flex-wrap: wrap;
5043
5010
  `;
5044
- var LocationText = styled25__default.default.span`
5045
- font-size: clamp(1rem, 2.6vw, 1.25rem);
5046
- color: rgba(255, 255, 255, 0.9);
5047
- font-weight: 500;
5048
- overflow: hidden;
5049
- text-overflow: ellipsis;
5011
+ var TypeBadge = styled25__default.default.span`
5012
+ display: inline-flex;
5013
+ align-items: center;
5014
+ padding: 0.2rem 0.5rem;
5015
+ border-radius: 4px;
5016
+ font-size: 0.7rem;
5017
+ font-weight: 600;
5018
+ letter-spacing: 0.03em;
5019
+ text-transform: uppercase;
5020
+ line-height: 1;
5021
+ color: #E6C87E;
5022
+ background: rgba(230, 200, 126, 0.12);
5050
5023
  white-space: nowrap;
5024
+ flex-shrink: 0;
5051
5025
  `;
5052
- var PriceBlock = styled25__default.default.span`
5026
+ var InfoRow = styled25__default.default.div`
5053
5027
  display: flex;
5054
- align-items: center;
5055
- font-size: clamp(1rem, 2.2vw, 1.25rem);
5028
+ align-items: baseline;
5029
+ justify-content: space-between;
5030
+ gap: 1rem;
5031
+ `;
5032
+ var PriceGroup = styled25__default.default.div`
5033
+ display: flex;
5034
+ flex-direction: column;
5035
+ align-items: flex-end;
5036
+ flex-shrink: 0;
5037
+ `;
5038
+ var PriceRow = styled25__default.default.span`
5039
+ display: inline-flex;
5040
+ align-items: baseline;
5041
+ font-size: clamp(1.3rem, 3vw, 1.8rem);
5056
5042
  font-weight: 600;
5057
- color: var(--color-accent, #f0b90b);
5058
- padding-left: 1rem;
5059
- border-left: 1px solid rgba(255, 255, 255, 0.25);
5060
- min-height: 1.5rem;
5043
+ color: #fff;
5044
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'JetBrains Mono', ui-monospace, monospace;
5045
+ font-variant-numeric: tabular-nums;
5046
+ white-space: nowrap;
5047
+ flex-shrink: 0;
5048
+ `;
5049
+ var CurrencyLabel = styled25__default.default.span`
5050
+ font-size: 0.55em;
5051
+ font-weight: 500;
5052
+ color: rgba(255, 255, 255, 0.4);
5053
+ margin-right: 0.3em;
5054
+ `;
5055
+ var PriceArrow = styled25__default.default.span`
5056
+ color: ${({ $isPositive }) => $isPositive ? "#0ecb81" : "#f6465d"};
5057
+ font-size: 0.65em;
5058
+ margin: 0 0.1em;
5059
+ `;
5060
+ var AddressText = styled25__default.default.p`
5061
+ font-size: 1.1rem;
5062
+ color: rgba(255, 255, 255, 0.7);
5063
+ font-weight: 400;
5064
+ margin: 0.1rem 0 0;
5065
+
5066
+ @media (max-width: 768px) {
5067
+ font-size: 1rem;
5068
+ }
5069
+
5070
+ @media (max-width: 480px) {
5071
+ font-size: 0.9rem;
5072
+ }
5073
+ `;
5074
+ var PriceChangeRow = styled25__default.default.span`
5075
+ display: inline-flex;
5076
+ align-items: center;
5077
+ white-space: nowrap;
5078
+ flex-shrink: 0;
5079
+ font-size: 0.85rem;
5080
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'JetBrains Mono', ui-monospace, monospace;
5081
+ font-variant-numeric: tabular-nums;
5082
+ color: ${({ $isPositive }) => $isPositive ? "#0ecb81" : "#f6465d"};
5061
5083
  `;
5062
5084
  var StatusBadge = styled25__default.default.div`
5063
5085
  position: absolute;
@@ -5134,13 +5156,45 @@ var Header = ({
5134
5156
  onProfileNavigate: _onProfileNavigate,
5135
5157
  onOrdersNavigate: _onOrdersNavigate,
5136
5158
  onWalletNavigate: _onWalletNavigate,
5137
- showTradeTab = true
5159
+ showTradeTab = true,
5160
+ portfolioSummary
5138
5161
  }) => {
5139
5162
  const [isUserMenuOpen, setIsUserMenuOpen] = React5.useState(false);
5140
5163
  const [isMobileMenuOpen, setIsMobileMenuOpen] = React5.useState(false);
5141
5164
  const [isMoreMenuOpen, setIsMoreMenuOpen] = React5.useState(false);
5142
5165
  const [showLoginPopup, setShowLoginPopup] = React5.useState(false);
5143
5166
  const [loginPopupInitialView, setLoginPopupInitialView] = React5.useState(void 0);
5167
+ const [isPortfolioBarVisible, setIsPortfolioBarVisible] = React5.useState(() => {
5168
+ if (typeof localStorage === "undefined") return false;
5169
+ return localStorage.getItem("portfolioBarVisible") !== "false";
5170
+ });
5171
+ const portfolioPillRef = React5.useRef(null);
5172
+ const [portfolioArrowLeft, setPortfolioArrowLeft] = React5.useState(null);
5173
+ const togglePortfolioBar = React5.useCallback(() => {
5174
+ setIsPortfolioBarVisible((prev) => {
5175
+ const next = !prev;
5176
+ try {
5177
+ localStorage.setItem("portfolioBarVisible", String(next));
5178
+ } catch {
5179
+ }
5180
+ return next;
5181
+ });
5182
+ }, []);
5183
+ const updatePortfolioArrow = React5.useCallback(() => {
5184
+ const eye = document.getElementById("portfolio-eye-toggle");
5185
+ const pill = portfolioPillRef.current;
5186
+ if (!eye || !pill) return;
5187
+ const eyeRect = eye.getBoundingClientRect();
5188
+ const pillRect = pill.getBoundingClientRect();
5189
+ const offset = eyeRect.left + eyeRect.width / 2 - pillRect.left - 7;
5190
+ setPortfolioArrowLeft(offset);
5191
+ }, []);
5192
+ React5.useEffect(() => {
5193
+ if (!isPortfolioBarVisible || !portfolioSummary) return;
5194
+ updatePortfolioArrow();
5195
+ window.addEventListener("resize", updatePortfolioArrow);
5196
+ return () => window.removeEventListener("resize", updatePortfolioArrow);
5197
+ }, [isPortfolioBarVisible, portfolioSummary, updatePortfolioArrow]);
5144
5198
  React5.useEffect(() => {
5145
5199
  if (typeof window === "undefined") return;
5146
5200
  const ua = navigator.userAgent;
@@ -5518,6 +5572,17 @@ var Header = ({
5518
5572
  }
5519
5573
  ),
5520
5574
  isAuthenticated ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [
5575
+ portfolioSummary && /* @__PURE__ */ jsxRuntime.jsx(
5576
+ PortfolioEyeButton,
5577
+ {
5578
+ id: "portfolio-eye-toggle",
5579
+ type: "button",
5580
+ onClick: togglePortfolioBar,
5581
+ $active: isPortfolioBarVisible,
5582
+ title: isPortfolioBarVisible ? "Hide portfolio" : "Show portfolio",
5583
+ 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" }) })
5584
+ }
5585
+ ),
5521
5586
  /* @__PURE__ */ jsxRuntime.jsxs(UserMenu, { children: [
5522
5587
  /* @__PURE__ */ jsxRuntime.jsxs(
5523
5588
  UserButton,
@@ -5589,6 +5654,51 @@ var Header = ({
5589
5654
  ] })
5590
5655
  ] }),
5591
5656
  /* @__PURE__ */ jsxRuntime.jsx(HeaderSpacer, {}),
5657
+ isAuthenticated && portfolioSummary && isPortfolioBarVisible && (() => {
5658
+ const fmt = (n) => n.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
5659
+ const isPLPositive = portfolioSummary.pnl >= 0;
5660
+ return /* @__PURE__ */ jsxRuntime.jsx(PortfolioBarContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(PortfolioBarPill, { ref: portfolioPillRef, children: [
5661
+ portfolioArrowLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(PortfolioBarArrow, { style: { left: `${portfolioArrowLeft}px` } }),
5662
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
5663
+ /* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Holdings" }),
5664
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { children: [
5665
+ "$",
5666
+ fmt(portfolioSummary.holdings)
5667
+ ] })
5668
+ ] }),
5669
+ /* @__PURE__ */ jsxRuntime.jsx(PBOperator, { children: "+" }),
5670
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
5671
+ /* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Cash" }),
5672
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { children: [
5673
+ "$",
5674
+ fmt(portfolioSummary.cash)
5675
+ ] })
5676
+ ] }),
5677
+ /* @__PURE__ */ jsxRuntime.jsx(PBOperator, { children: "=" }),
5678
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
5679
+ /* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "Portfolio" }),
5680
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { style: { color: "#D4AF37", fontWeight: 700 }, children: [
5681
+ "$",
5682
+ fmt(portfolioSummary.portfolioValue)
5683
+ ] })
5684
+ ] }),
5685
+ /* @__PURE__ */ jsxRuntime.jsx(PBDot, {}),
5686
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetric, { children: [
5687
+ /* @__PURE__ */ jsxRuntime.jsx(PBMetricLabel, { children: "P&L" }),
5688
+ /* @__PURE__ */ jsxRuntime.jsxs(PBMetricValue, { $positive: isPLPositive, $negative: !isPLPositive, children: [
5689
+ isPLPositive ? "+" : "",
5690
+ "$",
5691
+ fmt(Math.abs(portfolioSummary.pnl)),
5692
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.6rem", marginLeft: "2px", opacity: 0.7 }, children: [
5693
+ "(",
5694
+ isPLPositive ? "+" : "",
5695
+ portfolioSummary.pnlPercent.toFixed(2),
5696
+ "%)"
5697
+ ] })
5698
+ ] })
5699
+ ] })
5700
+ ] }) });
5701
+ })(),
5592
5702
  LoginPopupComponent && showLoginPopup && /* @__PURE__ */ jsxRuntime.jsx(
5593
5703
  LoginPopupComponent,
5594
5704
  {
@@ -5674,8 +5784,19 @@ var HeaderContainer = styled25__default.default.header`
5674
5784
  box-sizing: border-box;
5675
5785
 
5676
5786
  @media (max-width: 768px) {
5677
- padding: 0 1rem;
5678
- padding-top: max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px));
5787
+ top: 0.5rem;
5788
+ left: 0.75rem;
5789
+ right: 0.75rem;
5790
+ width: calc(100% - 1.5rem);
5791
+ height: 46px;
5792
+ min-height: 46px;
5793
+ padding: 0 0.75rem;
5794
+ border-radius: 12px;
5795
+ background-color: rgba(13, 17, 23, 0.92);
5796
+ backdrop-filter: blur(12px);
5797
+ border: 1px solid rgba(255, 255, 255, 0.08);
5798
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
5799
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
5679
5800
  }
5680
5801
  `;
5681
5802
  var HeaderSpacer = styled25__default.default.div`
@@ -5683,6 +5804,10 @@ var HeaderSpacer = styled25__default.default.div`
5683
5804
  min-height: 56px;
5684
5805
  min-height: calc(56px + max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px)));
5685
5806
  flex-shrink: 0;
5807
+
5808
+ @media (max-width: 768px) {
5809
+ min-height: calc(46px + 0.5rem);
5810
+ }
5686
5811
  `;
5687
5812
  var Logo = styled25__default.default.div`
5688
5813
  display: flex;
@@ -6016,6 +6141,151 @@ var MobileNavItem = styled25__default.default.div`
6016
6141
  padding-left: 24px;
6017
6142
  }
6018
6143
  `;
6144
+ var pbShimmer = styled25.keyframes`
6145
+ 0% { background-position: -200% 0; }
6146
+ 100% { background-position: 200% 0; }
6147
+ `;
6148
+ var PortfolioEyeButton = styled25__default.default.button`
6149
+ background: ${(p) => p.$active ? "rgba(212, 175, 55, 0.15)" : "transparent"};
6150
+ border: none;
6151
+ border-radius: 6px;
6152
+ cursor: pointer;
6153
+ padding: 6px;
6154
+ display: flex;
6155
+ align-items: center;
6156
+ justify-content: center;
6157
+ color: ${(p) => p.$active ? "#D4AF37" : "rgba(255,255,255,0.5)"};
6158
+ transition: all 0.2s ease;
6159
+ margin-right: 4px;
6160
+
6161
+ &:hover {
6162
+ background: rgba(212, 175, 55, 0.2);
6163
+ color: #D4AF37;
6164
+ }
6165
+
6166
+ @media (max-width: 768px) {
6167
+ padding: 4px;
6168
+ margin-right: 2px;
6169
+ }
6170
+ `;
6171
+ var PortfolioBarContainer = styled25__default.default.div`
6172
+ position: fixed;
6173
+ top: 56px;
6174
+ top: calc(56px + max(env(safe-area-inset-top, 0px), var(--telegram-safe-top, 0px)));
6175
+ left: 0;
6176
+ right: 0;
6177
+ z-index: 999;
6178
+ display: flex;
6179
+ justify-content: flex-end;
6180
+ align-items: flex-start;
6181
+ padding: 0 5%;
6182
+ pointer-events: none;
6183
+ overflow: visible;
6184
+
6185
+ &::before {
6186
+ content: '';
6187
+ position: absolute;
6188
+ top: 0;
6189
+ left: 40%;
6190
+ right: 0;
6191
+ height: 2px;
6192
+ background: linear-gradient(90deg, transparent 0%, rgba(212, 175, 55, 0.25) 100%);
6193
+ pointer-events: none;
6194
+ }
6195
+
6196
+ @media (max-width: 768px) {
6197
+ top: calc(46px + 0.5rem);
6198
+ padding: 0 0.75rem;
6199
+ justify-content: center;
6200
+
6201
+ &::before {
6202
+ left: 0;
6203
+ right: 0;
6204
+ background: linear-gradient(90deg, transparent 0%, rgba(212, 175, 55, 0.4) 30%, rgba(212, 175, 55, 0.4) 70%, transparent 100%);
6205
+ }
6206
+ }
6207
+ `;
6208
+ var PortfolioBarPill = styled25__default.default.div`
6209
+ pointer-events: auto;
6210
+ display: flex;
6211
+ align-items: center;
6212
+ gap: 1.25rem;
6213
+ padding: 0.5rem 1.5rem;
6214
+ border-radius: 0 0 20px 20px;
6215
+ background: linear-gradient(135deg, rgba(24, 26, 34, 0.98) 0%, rgba(32, 34, 42, 0.97) 100%);
6216
+ backdrop-filter: blur(16px);
6217
+ border: 1px solid rgba(212, 175, 55, 0.25);
6218
+ border-top: none;
6219
+ box-shadow:
6220
+ 0 4px 16px rgba(0, 0, 0, 0.3),
6221
+ 0 0 0 1px rgba(255, 255, 255, 0.03) inset,
6222
+ 0 1px 0 rgba(212, 175, 55, 0.06) inset;
6223
+ position: relative;
6224
+ overflow: visible;
6225
+
6226
+ &::before {
6227
+ content: '';
6228
+ position: absolute;
6229
+ top: 0;
6230
+ left: 0;
6231
+ right: 0;
6232
+ height: 1px;
6233
+ background: linear-gradient(90deg, transparent, rgba(212, 175, 55, 0.3), transparent);
6234
+ background-size: 200% 100%;
6235
+ animation: ${pbShimmer} 4s linear infinite;
6236
+ }
6237
+
6238
+ @media (max-width: 768px) {
6239
+ gap: 0.75rem;
6240
+ padding: 0.4rem 1rem;
6241
+ border-radius: 0 0 16px 16px;
6242
+ }
6243
+ `;
6244
+ var PortfolioBarArrow = styled25__default.default.div`
6245
+ position: absolute;
6246
+ top: -7px;
6247
+ width: 14px;
6248
+ height: 14px;
6249
+ background: linear-gradient(135deg, rgba(26, 28, 36, 1) 0%, rgba(30, 32, 40, 1) 100%);
6250
+ border-left: 1px solid rgba(212, 175, 55, 0.3);
6251
+ border-top: 1px solid rgba(212, 175, 55, 0.3);
6252
+ transform: rotate(45deg);
6253
+ box-shadow: -2px -2px 6px rgba(0, 0, 0, 0.25);
6254
+ pointer-events: none;
6255
+ `;
6256
+ var PBMetric = styled25__default.default.div`
6257
+ display: flex;
6258
+ flex-direction: column;
6259
+ align-items: center;
6260
+ gap: 1px;
6261
+ white-space: nowrap;
6262
+ `;
6263
+ var PBMetricLabel = styled25__default.default.span`
6264
+ font-size: 0.55rem;
6265
+ color: rgba(255, 255, 255, 0.6);
6266
+ text-transform: uppercase;
6267
+ letter-spacing: 0.5px;
6268
+ font-weight: 500;
6269
+ `;
6270
+ var PBMetricValue = styled25__default.default.span`
6271
+ font-size: 0.75rem;
6272
+ font-weight: 600;
6273
+ color: ${(p) => p.$positive ? "#0ecb81" : p.$negative ? "#f6465d" : "#eaecef"};
6274
+ font-variant-numeric: tabular-nums;
6275
+ `;
6276
+ var PBDot = styled25__default.default.div`
6277
+ width: 3px;
6278
+ height: 3px;
6279
+ border-radius: 50%;
6280
+ background: rgba(212, 175, 55, 0.25);
6281
+ flex-shrink: 0;
6282
+ `;
6283
+ var PBOperator = styled25__default.default.span`
6284
+ font-size: 0.7rem;
6285
+ font-weight: 500;
6286
+ color: rgba(255, 255, 255, 0.35);
6287
+ flex-shrink: 0;
6288
+ `;
6019
6289
  var PropertySubheader = React5__namespace.forwardRef(
6020
6290
  ({ className, tabs, activeTabId, onTabChange, actions, ...props }, ref) => {
6021
6291
  const tabsContainerRef = React5__namespace.useRef(null);
@@ -6181,11 +6451,6 @@ var LoginPopup = ({
6181
6451
  setView(initialView);
6182
6452
  }
6183
6453
  }, [initialView]);
6184
- React5.useEffect(() => {
6185
- if (view === "kyc" && renderKycWidget) {
6186
- setShowKycWidget(true);
6187
- }
6188
- }, [view, renderKycWidget]);
6189
6454
  React5.useEffect(() => {
6190
6455
  if (!transakWidgetUrl) return;
6191
6456
  const handleTransakMessage = (event) => {
@@ -6698,7 +6963,7 @@ var LoginPopup = ({
6698
6963
  ] }) });
6699
6964
  }
6700
6965
  if (view === "funding") {
6701
- return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { onClick: onClose, children: /* @__PURE__ */ jsxRuntime.jsxs(
6966
+ return /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { children: /* @__PURE__ */ jsxRuntime.jsxs(
6702
6967
  FundingPopupContainer,
6703
6968
  {
6704
6969
  onClick: (event) => event.stopPropagation(),
@@ -6768,6 +7033,16 @@ var Overlay2 = styled25__default.default.div`
6768
7033
  justify-content: center;
6769
7034
  align-items: center;
6770
7035
  z-index: 10000;
7036
+ animation: fadeIn 0.2s ease-in-out;
7037
+
7038
+ @keyframes fadeIn {
7039
+ from {
7040
+ opacity: 0;
7041
+ }
7042
+ to {
7043
+ opacity: 1;
7044
+ }
7045
+ }
6771
7046
  `;
6772
7047
  var PopupContainer = styled25__default.default.div`
6773
7048
  background-color: var(--color-background, #0a0a0a);
@@ -6777,8 +7052,20 @@ var PopupContainer = styled25__default.default.div`
6777
7052
  max-width: 440px;
6778
7053
  width: 90%;
6779
7054
  position: relative;
7055
+ animation: slideUp 0.3s ease-out;
6780
7056
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
6781
7057
 
7058
+ @keyframes slideUp {
7059
+ from {
7060
+ transform: translateY(20px);
7061
+ opacity: 0;
7062
+ }
7063
+ to {
7064
+ transform: translateY(0);
7065
+ opacity: 1;
7066
+ }
7067
+ }
7068
+
6782
7069
  @media (max-width: 768px) {
6783
7070
  padding: 2rem;
6784
7071
  max-width: 90%;
@@ -6792,9 +7079,21 @@ var KycPopupContainer = styled25__default.default.div`
6792
7079
  max-width: ${(props) => props.$expanded ? "680px" : "440px"};
6793
7080
  width: 90%;
6794
7081
  position: relative;
7082
+ animation: slideUp 0.3s ease-out;
6795
7083
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
6796
7084
  transition: max-width 0.3s ease;
6797
7085
 
7086
+ @keyframes slideUp {
7087
+ from {
7088
+ transform: translateY(20px);
7089
+ opacity: 0;
7090
+ }
7091
+ to {
7092
+ transform: translateY(0);
7093
+ opacity: 1;
7094
+ }
7095
+ }
7096
+
6798
7097
  @media (max-width: 768px) {
6799
7098
  padding: 1.5rem;
6800
7099
  max-width: 95%;
@@ -7122,9 +7421,21 @@ var FundingPopupContainer = styled25__default.default.div`
7122
7421
  max-width: ${(props) => props.$hasWidget ? "900px" : "440px"};
7123
7422
  width: 90%;
7124
7423
  position: relative;
7424
+ animation: slideUp 0.3s ease-out;
7125
7425
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
7126
7426
  overflow: hidden;
7127
7427
 
7428
+ @keyframes slideUp {
7429
+ from {
7430
+ transform: translateY(20px);
7431
+ opacity: 0;
7432
+ }
7433
+ to {
7434
+ transform: translateY(0);
7435
+ opacity: 1;
7436
+ }
7437
+ }
7438
+
7128
7439
  @media (max-width: 768px) {
7129
7440
  padding: ${(props) => props.$hasWidget ? "0" : "2rem"};
7130
7441
  max-width: 95%;
@@ -7413,7 +7724,7 @@ var PropertyCompareBar = React5__namespace.forwardRef(
7413
7724
  void 0,
7414
7725
  pricePercentFormat
7415
7726
  )}%`;
7416
- const priceContent = formattedPriceValue && propertyValueVariant === "pill" ? /* @__PURE__ */ jsxRuntime.jsxs(PriceBlock2, { $variant: propertyValueVariant, children: [
7727
+ const priceContent = formattedPriceValue && propertyValueVariant === "pill" ? /* @__PURE__ */ jsxRuntime.jsxs(PriceBlock, { $variant: propertyValueVariant, children: [
7417
7728
  /* @__PURE__ */ jsxRuntime.jsx(PriceAmount, { children: formattedPriceValue }),
7418
7729
  formattedPriceChange || formattedPricePercent ? /* @__PURE__ */ jsxRuntime.jsxs(
7419
7730
  PriceChange,
@@ -7726,7 +8037,7 @@ var PropertyValueChange = styled25__default.default.span`
7726
8037
  font-size: 0.65rem;
7727
8038
  }
7728
8039
  `;
7729
- var PriceBlock2 = styled25__default.default.div`
8040
+ var PriceBlock = styled25__default.default.div`
7730
8041
  display: none;
7731
8042
 
7732
8043
  ${({ $variant }) => $variant === "pill" && styled25.css`
@@ -7820,7 +8131,7 @@ function GalleryMapSection({
7820
8131
  /* @__PURE__ */ jsxRuntime.jsxs(ThumbStrip, { children: [
7821
8132
  /* @__PURE__ */ jsxRuntime.jsx(ThumbScroll, { children: images.filter((img) => img.category !== "Floorplan").map((img) => {
7822
8133
  const actualIndex = images.indexOf(img);
7823
- return /* @__PURE__ */ jsxRuntime.jsx(Thumbnail, { "data-active": !showVideo && carouselIndex === actualIndex, onClick: () => {
8134
+ return /* @__PURE__ */ jsxRuntime.jsx(Thumbnail2, { "data-active": !showVideo && carouselIndex === actualIndex, onClick: () => {
7824
8135
  stopAutoPlay();
7825
8136
  setShowVideo(false);
7826
8137
  setCarouselIndex(actualIndex);
@@ -7960,7 +8271,7 @@ var ThumbScroll = styled25__default.default.div`
7960
8271
  scrollbar-width: none;
7961
8272
  &::-webkit-scrollbar { display: none; }
7962
8273
  `;
7963
- var Thumbnail = styled25__default.default.div`
8274
+ var Thumbnail2 = styled25__default.default.div`
7964
8275
  min-width: 60px; height: 45px; border-radius: 4px; overflow: hidden;
7965
8276
  cursor: pointer; border: 2px solid transparent; opacity: 0.6;
7966
8277
  transition: all 0.2s ease; flex-shrink: 0;
@@ -8491,7 +8802,7 @@ function PropertyHistory() {
8491
8802
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9rem] font-normal ml-3 opacity-80", children: loafListing.date.replace(/\d+,\s|\s\d+$/, "") })
8492
8803
  ] }) }),
8493
8804
  /* @__PURE__ */ jsxRuntime.jsx(SalesTable, { children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: /* @__PURE__ */ jsxRuntime.jsxs(HistoryRow, { $isOwnershipStart: true, children: [
8494
- /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: loafListing.type, children: loafListing.type === "Sale" ? "Sold" : loafListing.type }) }),
8805
+ /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge2, { $type: loafListing.type, children: loafListing.type === "Sale" ? "Sold" : loafListing.type }) }),
8495
8806
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: loafListing.saleType ?? "-" }),
8496
8807
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: loafListing.agent })
8497
8808
  ] }) }) }),
@@ -8553,7 +8864,7 @@ function PropertyHistory() {
8553
8864
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.9rem] font-normal ml-3 opacity-80", children: ownershipSale.date.replace(/\d+,\s|\s\d+$/, "") })
8554
8865
  ] }) }),
8555
8866
  ownershipSale && (historyFilter === "all" || historyFilter === "sales") && /* @__PURE__ */ jsxRuntime.jsx(SalesTable, { children: /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: /* @__PURE__ */ jsxRuntime.jsxs(HistoryRow, { $isOwnershipStart: true, children: [
8556
- /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: ownershipSale.type, children: ownershipSale.type === "Sale" ? "Sold" : ownershipSale.type }) }),
8867
+ /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge2, { $type: ownershipSale.type, children: ownershipSale.type === "Sale" ? "Sold" : ownershipSale.type }) }),
8557
8868
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: ownershipSale.saleType ?? "-" }),
8558
8869
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: ownershipSale.agent })
8559
8870
  ] }) }) }),
@@ -8562,7 +8873,7 @@ function PropertyHistory() {
8562
8873
  /* @__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)) })
8563
8874
  ] }),
8564
8875
  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: [
8565
- /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: sale.type, children: sale.type === "Sale" ? "Sold" : sale.type }) }),
8876
+ /* @__PURE__ */ jsxRuntime.jsx("td", { children: /* @__PURE__ */ jsxRuntime.jsx(TypeBadge2, { $type: sale.type, children: sale.type === "Sale" ? "Sold" : sale.type }) }),
8566
8877
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: sale.saleType ?? "-" }),
8567
8878
  /* @__PURE__ */ jsxRuntime.jsx("td", { children: sale.agent })
8568
8879
  ] }, sale.id)) }) })
@@ -8705,7 +9016,7 @@ function EventDetails({ event }) {
8705
9016
  onClick: toggleExpand,
8706
9017
  children: [
8707
9018
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-between items-center flex-1 gap-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center", children: [
8708
- /* @__PURE__ */ jsxRuntime.jsx(TypeBadge, { $type: event.type, children: event.type === "Sale" ? "Sold" : event.type }),
9019
+ /* @__PURE__ */ jsxRuntime.jsx(TypeBadge2, { $type: event.type, children: event.type === "Sale" ? "Sold" : event.type }),
8709
9020
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-2", children: event.date })
8710
9021
  ] }) }),
8711
9022
  /* @__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 }) })
@@ -8949,7 +9260,7 @@ var HistoryRow = styled25__default.default.tr`
8949
9260
  background-color: rgba(255, 255, 255, 0.08);
8950
9261
  }
8951
9262
  `;
8952
- var TypeBadge = styled25__default.default.span`
9263
+ var TypeBadge2 = styled25__default.default.span`
8953
9264
  display: inline-block;
8954
9265
  padding: 0.25rem 0.5rem;
8955
9266
  border-radius: 4px;
@@ -9359,7 +9670,8 @@ function AssetSelectorBar({
9359
9670
  metrics: metricsProp,
9360
9671
  currentTokenName,
9361
9672
  selectorItems,
9362
- onSelect
9673
+ onSelect,
9674
+ trailing
9363
9675
  }) {
9364
9676
  const [isDropdownOpen, setIsDropdownOpen] = React5.useState(false);
9365
9677
  const hasItems = selectorItems && selectorItems.length > 0;
@@ -9397,6 +9709,7 @@ function AssetSelectorBar({
9397
9709
  ] })
9398
9710
  ] })
9399
9711
  ] }, m.label)) }),
9712
+ trailing,
9400
9713
  isDropdownOpen && hasItems && /* @__PURE__ */ jsxRuntime.jsx(IPODropdown, { children: selectorItems.map((item) => {
9401
9714
  const isCurrent = item.tokenName === currentTokenName;
9402
9715
  const status = item.status?.toUpperCase();
@@ -9629,6 +9942,7 @@ function OfferingProgressCard({
9629
9942
  raisedAmount,
9630
9943
  targetAmount,
9631
9944
  isPrivateClient = false,
9945
+ variant = "default",
9632
9946
  style,
9633
9947
  className
9634
9948
  }) {
@@ -9660,6 +9974,108 @@ function OfferingProgressCard({
9660
9974
  const interval = setInterval(() => setCountdown(calculateCountdown()), 1e3);
9661
9975
  return () => clearInterval(interval);
9662
9976
  }, [opensAt]);
9977
+ if (variant === "compact") {
9978
+ return /* @__PURE__ */ jsxRuntime.jsxs(CompactContainer, { style, className, children: [
9979
+ /* @__PURE__ */ jsxRuntime.jsx(ProgressBarOuter, { children: /* @__PURE__ */ jsxRuntime.jsx(ProgressBarInner, { style: { width: `${Math.min(percentSold, 100)}%` } }) }),
9980
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressInfo, { children: [
9981
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressSubscribers, { children: [
9982
+ "Subscribers: ",
9983
+ subscriberCount.toLocaleString()
9984
+ ] }),
9985
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressAmounts, { children: [
9986
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "raised", children: formatCurrency3(computedRaised) }),
9987
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "target", children: [
9988
+ " / ",
9989
+ formatCurrency3(computedTarget)
9990
+ ] })
9991
+ ] })
9992
+ ] })
9993
+ ] });
9994
+ }
9995
+ if (variant === "home") {
9996
+ const isPreLive = !ipoStarted && ipoStatus !== "CLOSED" && ipoStatus !== "CANCELLED";
9997
+ return /* @__PURE__ */ jsxRuntime.jsxs(Container, { style, className, children: [
9998
+ /* @__PURE__ */ jsxRuntime.jsxs(Header2, { children: [
9999
+ /* @__PURE__ */ jsxRuntime.jsxs("h3", { children: [
10000
+ /* @__PURE__ */ jsxRuntime.jsx(fa.FaChartLine, {}),
10001
+ " Offering Progress"
10002
+ ] }),
10003
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", alignItems: "center", gap: "0.4rem" }, children: ipoStarted ? /* @__PURE__ */ jsxRuntime.jsxs(StatusSpan, { $color: "#0ecb81", children: [
10004
+ /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { $color: "#0ecb81", $pulse: true }),
10005
+ "LIVE"
10006
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(StatusSpan, { $color: statusColor || "#D4AF37", children: [
10007
+ /* @__PURE__ */ jsxRuntime.jsx(StatusDot, { $color: statusColor || "#D4AF37" }),
10008
+ statusLabel || "Preparing"
10009
+ ] }) })
10010
+ ] }),
10011
+ isPreLive ? /* @__PURE__ */ jsxRuntime.jsxs(HomePreLiveRow, { children: [
10012
+ countdown ? /* @__PURE__ */ jsxRuntime.jsxs(HomeCountdownSide, { children: [
10013
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownLabel, { children: "Opens In" }),
10014
+ /* @__PURE__ */ jsxRuntime.jsxs(CountdownDigits, { children: [
10015
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.days).padStart(2, "0") }),
10016
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "D" }),
10017
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
10018
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.hours).padStart(2, "0") }),
10019
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "H" }),
10020
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
10021
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.minutes).padStart(2, "0") }),
10022
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "M" }),
10023
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownSeparator, { children: ":" }),
10024
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownNumber, { children: String(countdown.seconds).padStart(2, "0") }),
10025
+ /* @__PURE__ */ jsxRuntime.jsx(CountdownUnitLabel, { children: "S" })
10026
+ ] })
10027
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(HomeCountdownSide, { children: /* @__PURE__ */ jsxRuntime.jsx(PreLiveStatus, { $statusColor: statusColor, children: "Sale Not Yet Open" }) }),
10028
+ /* @__PURE__ */ jsxRuntime.jsxs(HomeUnitsSide, { children: [
10029
+ /* @__PURE__ */ jsxRuntime.jsx(HomeUnitsLabel, { children: "Units Subscribed" }),
10030
+ /* @__PURE__ */ jsxRuntime.jsxs(HomeUnitsValue, { children: [
10031
+ /* @__PURE__ */ jsxRuntime.jsx(HomeSpinner, {}),
10032
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
10033
+ " / ",
10034
+ supplyToSell.toLocaleString()
10035
+ ] })
10036
+ ] })
10037
+ ] })
10038
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(LiveBody, { children: [
10039
+ /* @__PURE__ */ jsxRuntime.jsxs(LiveTopRow, { children: [
10040
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10041
+ /* @__PURE__ */ jsxRuntime.jsxs(LiveLabel, { children: [
10042
+ "Offering Subscribed ",
10043
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u24D8" })
10044
+ ] }),
10045
+ /* @__PURE__ */ jsxRuntime.jsxs(LivePercent, { children: [
10046
+ percentSold.toFixed(1),
10047
+ "%",
10048
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "arrow", children: "\u2191" })
10049
+ ] })
10050
+ ] }),
10051
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { textAlign: "right" }, children: [
10052
+ /* @__PURE__ */ jsxRuntime.jsx(LiveLabel, { children: "Units Subscribed" }),
10053
+ /* @__PURE__ */ jsxRuntime.jsxs(UnitsValue, { children: [
10054
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: totalSold.toLocaleString() }),
10055
+ /* @__PURE__ */ jsxRuntime.jsxs("small", { children: [
10056
+ "/ ",
10057
+ supplyToSell.toLocaleString()
10058
+ ] })
10059
+ ] })
10060
+ ] })
10061
+ ] }),
10062
+ /* @__PURE__ */ jsxRuntime.jsx(ProgressBarOuter, { children: /* @__PURE__ */ jsxRuntime.jsx(ProgressBarInner, { style: { width: `${Math.min(percentSold, 100)}%` } }) }),
10063
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressInfo, { children: [
10064
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressSubscribers, { children: [
10065
+ "Subscribers: ",
10066
+ subscriberCount.toLocaleString()
10067
+ ] }),
10068
+ /* @__PURE__ */ jsxRuntime.jsxs(ProgressAmounts, { children: [
10069
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "raised", children: formatCurrency3(computedRaised) }),
10070
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "target", children: [
10071
+ " / ",
10072
+ formatCurrency3(computedTarget)
10073
+ ] })
10074
+ ] })
10075
+ ] })
10076
+ ] })
10077
+ ] });
10078
+ }
9663
10079
  return /* @__PURE__ */ jsxRuntime.jsxs(Container, { style, className, children: [
9664
10080
  /* @__PURE__ */ jsxRuntime.jsxs(Header2, { children: [
9665
10081
  /* @__PURE__ */ jsxRuntime.jsxs("h3", { children: [
@@ -9728,7 +10144,7 @@ function OfferingProgressCard({
9728
10144
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u24D8" })
9729
10145
  ] }),
9730
10146
  /* @__PURE__ */ jsxRuntime.jsxs(LivePercent, { children: [
9731
- percentSold < 0.1 && percentSold > 0 ? percentSold.toFixed(3) : percentSold.toFixed(1),
10147
+ percentSold.toFixed(1),
9732
10148
  "%",
9733
10149
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "arrow", children: "\u2191" })
9734
10150
  ] })
@@ -9961,6 +10377,59 @@ var ProgressAmounts = styled25__default.default.div`
9961
10377
  .raised { color: #D4AF37; }
9962
10378
  .target { color: rgba(255,255,255,0.3); }
9963
10379
  `;
10380
+ var CompactContainer = styled25__default.default.div`
10381
+ width: 100%;
10382
+ margin: 1.5rem 0;
10383
+ display: flex;
10384
+ flex-direction: column;
10385
+ gap: 0.5rem;
10386
+ `;
10387
+ var HomePreLiveRow = styled25__default.default.div`
10388
+ display: flex;
10389
+ align-items: center;
10390
+ justify-content: space-between;
10391
+ padding-top: 1rem;
10392
+ `;
10393
+ var HomeCountdownSide = styled25__default.default.div`
10394
+ display: flex;
10395
+ flex-direction: column;
10396
+ align-items: center;
10397
+ flex: 1;
10398
+ `;
10399
+ var HomeUnitsSide = styled25__default.default.div`
10400
+ text-align: center;
10401
+ flex-shrink: 0;
10402
+ `;
10403
+ var HomeUnitsLabel = styled25__default.default.div`
10404
+ font-size: 0.6rem;
10405
+ color: var(--color-text-secondary);
10406
+ text-transform: uppercase;
10407
+ letter-spacing: 0.1em;
10408
+ margin-bottom: 0.2rem;
10409
+ `;
10410
+ var HomeUnitsValue = styled25__default.default.div`
10411
+ font-size: 1.1rem;
10412
+ font-weight: 700;
10413
+ font-family: monospace;
10414
+ span {
10415
+ color: var(--color-text-secondary);
10416
+ font-weight: 400;
10417
+ }
10418
+ `;
10419
+ var HomeSpinner = styled25__default.default.span`
10420
+ display: inline-block;
10421
+ width: 14px;
10422
+ height: 14px;
10423
+ border: 2px solid rgba(255, 255, 255, 0.1);
10424
+ border-top-color: var(--color-accent, #f0b90b);
10425
+ border-radius: 50%;
10426
+ animation: homeSpin 1s linear infinite;
10427
+ vertical-align: middle;
10428
+ margin-right: 0.15rem;
10429
+ @keyframes homeSpin {
10430
+ to { transform: rotate(360deg); }
10431
+ }
10432
+ `;
9964
10433
  var MAX_DISPLAY_AMOUNT = 6e4;
9965
10434
  var formatCurrency4 = (amount) => {
9966
10435
  if (amount >= 1e6) return `$${(amount / 1e6).toFixed(2)}M`;
@@ -11638,7 +12107,14 @@ function PortfolioActivityPanel({
11638
12107
  formatTimestamp(trade.executedAt)
11639
12108
  ] })
11640
12109
  ] }),
11641
- 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" }),
12110
+ /* @__PURE__ */ jsxRuntime.jsx(
12111
+ ActivityTag,
12112
+ {
12113
+ $color: trade.side === "SELL" ? "#f6465d" : "#0ecb81",
12114
+ $bg: trade.side === "SELL" ? "rgba(246,70,93,0.12)" : "rgba(14,203,129,0.12)",
12115
+ children: sideLabel(trade.side)
12116
+ }
12117
+ ),
11642
12118
  /* @__PURE__ */ jsxRuntime.jsx(ActivityAmount, { children: formatCurrency5(trade.price * trade.quantity) })
11643
12119
  ] }, trade.tradeId))
11644
12120
  ] }),
@@ -13710,7 +14186,7 @@ function PropertyValuation({
13710
14186
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [
13711
14187
  /* @__PURE__ */ jsxRuntime.jsxs(PricingModelDetail, { children: [
13712
14188
  /* @__PURE__ */ jsxRuntime.jsx(PropertyDetailLabel, { children: "Last Price" }),
13713
- /* @__PURE__ */ jsxRuntime.jsx(PricingDetailValue, { children: formatCompact(lastPrice) })
14189
+ /* @__PURE__ */ jsxRuntime.jsx(PricingDetailValue, { children: formatCurrency6(lastPrice) })
13714
14190
  ] }),
13715
14191
  /* @__PURE__ */ jsxRuntime.jsxs(PricingModelDetail, { children: [
13716
14192
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", width: "100%" }, children: [
@@ -13721,11 +14197,11 @@ function PropertyValuation({
13721
14197
  ] })
13722
14198
  ] }),
13723
14199
  /* @__PURE__ */ jsxRuntime.jsxs(PricingDetailValue, { style: { color: "var(--color-accent)", fontWeight: "bold" }, children: [
13724
- formatCompact(fairValue),
14200
+ formatCurrency6(fairValue),
13725
14201
  " ",
13726
14202
  /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { fontSize: "0.85em", fontWeight: "normal", opacity: 0.8 }, children: [
13727
14203
  "(",
13728
- formatCompact(fairValue * tokensOutstanding),
14204
+ formatCurrency6(fairValue * tokensOutstanding, { maximumFractionDigits: 0 }),
13729
14205
  ")"
13730
14206
  ] })
13731
14207
  ] })
@@ -13742,7 +14218,7 @@ function PropertyValuation({
13742
14218
  /* @__PURE__ */ jsxRuntime.jsx(GaugeIndicator, { type: "fairValue", position: 50 }),
13743
14219
  /* @__PURE__ */ jsxRuntime.jsxs(GaugePriceTag, { position: gaugePosition, children: [
13744
14220
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Last Price" }),
13745
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCompact(lastPrice) })
14221
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCurrency6(lastPrice) })
13746
14222
  ] }),
13747
14223
  /* @__PURE__ */ jsxRuntime.jsx(GaugeIndicator, { type: "lastPrice", position: gaugePosition })
13748
14224
  ] }),
@@ -13750,36 +14226,36 @@ function PropertyValuation({
13750
14226
  /* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "#4CAF50" }, children: [
13751
14227
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
13752
14228
  "< ",
13753
- formatCompact(undervaluedThreshold)
14229
+ formatCurrency6(undervaluedThreshold)
13754
14230
  ] }),
13755
14231
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
13756
14232
  "(",
13757
- formatCompact(undervaluedThreshold * tokensOutstanding),
14233
+ formatMillions(undervaluedThreshold * tokensOutstanding),
13758
14234
  ")"
13759
14235
  ] })
13760
14236
  ] }) }),
13761
14237
  /* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "var(--color-accent)" }, children: [
13762
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCompact(fairValue) }),
14238
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: formatCurrency6(fairValue) }),
13763
14239
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
13764
14240
  "(",
13765
- formatCompact(fairValue * tokensOutstanding),
14241
+ formatMillions(fairValue * tokensOutstanding),
13766
14242
  ")"
13767
14243
  ] })
13768
14244
  ] }) }),
13769
14245
  /* @__PURE__ */ jsxRuntime.jsx(ValuationItem, { children: /* @__PURE__ */ jsxRuntime.jsxs(ValuationValue, { style: { color: "#F44336" }, children: [
13770
14246
  /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
13771
14247
  "> ",
13772
- formatCompact(overvaluedThreshold)
14248
+ formatCurrency6(overvaluedThreshold)
13773
14249
  ] }),
13774
14250
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "valuation-amount-span", style: { fontSize: "0.8rem", fontWeight: "normal" }, children: [
13775
14251
  "(",
13776
- formatCompact(overvaluedThreshold * tokensOutstanding),
14252
+ formatMillions(overvaluedThreshold * tokensOutstanding),
13777
14253
  ")"
13778
14254
  ] })
13779
14255
  ] }) })
13780
14256
  ] })
13781
14257
  ] }),
13782
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
14258
+ /* @__PURE__ */ jsxRuntime.jsxs(HiddenMobileChart, { children: [
13783
14259
  /* @__PURE__ */ jsxRuntime.jsx("h3", { style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
13784
14260
  /* @__PURE__ */ jsxRuntime.jsx(ChartContainer, { children: /* @__PURE__ */ jsxRuntime.jsxs(ChartBackground, { children: [
13785
14261
  axisLabels.map((label, index) => /* @__PURE__ */ jsxRuntime.jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
@@ -13898,7 +14374,15 @@ function PropertyValuation({
13898
14374
  ] })
13899
14375
  ] }) })
13900
14376
  ] })
13901
- ] })
14377
+ ] }),
14378
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "desktop-only-historical-chart", style: { marginBottom: "1rem", fontSize: "1.1rem", color: "#fff" }, children: "Historical Valuation" }),
14379
+ /* @__PURE__ */ jsxRuntime.jsx(ChartContainer, { className: "desktop-only-historical-chart", children: /* @__PURE__ */ jsxRuntime.jsxs(ChartBackground, { children: [
14380
+ axisLabels.map((label, index) => /* @__PURE__ */ jsxRuntime.jsx(YAxisLabel, { style: { top: `${10 + index * 22}%` }, children: label }, `${label}-${index}`)),
14381
+ /* @__PURE__ */ jsxRuntime.jsxs(ValuationSvg, { viewBox: `0 0 ${CHART_WIDTH} ${CHART_HEIGHT}`, preserveAspectRatio: "none", children: [
14382
+ valuationPath ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: valuationPath, fill: "none", stroke: "#D4AF37", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null,
14383
+ fairValuePath ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: fairValuePath, fill: "none", stroke: "#FFFFFF", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) : null
14384
+ ] })
14385
+ ] }) })
13902
14386
  ] })
13903
14387
  ] }),
13904
14388
  /* @__PURE__ */ jsxRuntime.jsxs(RecentSalesSection, { children: [
@@ -13972,14 +14456,6 @@ function formatMillions(value) {
13972
14456
  }
13973
14457
  return `$${(value / 1e6).toFixed(2)}m`;
13974
14458
  }
13975
- function formatCompact(value) {
13976
- if (value == null || !Number.isFinite(value)) return "\u2014";
13977
- const abs = Math.abs(value);
13978
- if (abs >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;
13979
- if (abs >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;
13980
- if (abs >= 1e3) return `$${(value / 1e3).toFixed(1)}K`;
13981
- return formatCurrency6(value);
13982
- }
13983
14459
  function formatBedroomLabel(bedrooms) {
13984
14460
  if (!Number.isFinite(bedrooms)) return "\u2014";
13985
14461
  return `${bedrooms} Bed`;
@@ -14103,6 +14579,12 @@ var GaugePriceTag = styled25__default.default.div`
14103
14579
  color: var(--color-accent);
14104
14580
  }
14105
14581
  `;
14582
+ var HiddenMobileChart = styled25__default.default.div`
14583
+ display: none;
14584
+ @media (max-width: 480px) {
14585
+ display: block;
14586
+ }
14587
+ `;
14106
14588
  var ValuationWrapper = styled25__default.default.div`
14107
14589
  display: flex;
14108
14590
  flex-direction: column;
@@ -14154,10 +14636,9 @@ var PricingModelCard = styled25__default.default.div`
14154
14636
  var PricingModelHeader = styled25__default.default.div`
14155
14637
  display: flex;
14156
14638
  justify-content: space-between;
14157
- align-items: flex-start;
14639
+ align-items: center;
14158
14640
  margin-bottom: 1.5rem;
14159
14641
  gap: 1rem;
14160
- flex-wrap: wrap;
14161
14642
 
14162
14643
  .valuation-info {
14163
14644
  display: flex;
@@ -14165,7 +14646,6 @@ var PricingModelHeader = styled25__default.default.div`
14165
14646
  gap: 0.25rem;
14166
14647
  font-size: 0.85rem;
14167
14648
  color: rgba(255, 255, 255, 0.75);
14168
- flex-shrink: 0;
14169
14649
  }
14170
14650
  `;
14171
14651
  var PricingModelTitle = styled25__default.default.h3`
@@ -14232,31 +14712,15 @@ var ValuationDetails = styled25__default.default.div`
14232
14712
  display: flex;
14233
14713
  justify-content: space-between;
14234
14714
  margin-top: 1rem;
14235
- gap: 0.25rem;
14236
14715
  `;
14237
14716
  var ValuationItem = styled25__default.default.div`
14238
14717
  display: flex;
14239
14718
  flex-direction: column;
14240
- min-width: 0;
14241
- overflow: hidden;
14242
14719
  `;
14243
14720
  var ValuationValue = styled25__default.default.div`
14244
14721
  font-size: 1rem;
14245
14722
  font-weight: 600;
14246
14723
  color: #fff;
14247
- display: flex;
14248
- flex-direction: column;
14249
- gap: 2px;
14250
- overflow-wrap: break-word;
14251
- word-break: break-word;
14252
-
14253
- @media (max-width: 480px) {
14254
- font-size: 0.72rem;
14255
-
14256
- .valuation-amount-span {
14257
- display: none;
14258
- }
14259
- }
14260
14724
  `;
14261
14725
  var ChartContainer = styled25__default.default.div`
14262
14726
  width: 100%;
@@ -14669,7 +15133,7 @@ var ThumbnailStrip = styled25__default.default.div`
14669
15133
  display: none;
14670
15134
  }
14671
15135
  `;
14672
- var Thumbnail2 = styled25__default.default.button`
15136
+ var Thumbnail3 = styled25__default.default.button`
14673
15137
  width: 86px;
14674
15138
  height: 64px;
14675
15139
  border-radius: 6px;
@@ -15005,7 +15469,7 @@ function GalleryContent({ galleryImages, startIndex, title, subtitle, onClose })
15005
15469
  ]
15006
15470
  }
15007
15471
  ),
15008
- /* @__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)) })
15472
+ /* @__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)) })
15009
15473
  ]
15010
15474
  }
15011
15475
  );