From cdcda8764ecb32dee9cf18bf74fff55612f16f60 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Wed, 1 Apr 2026 15:25:01 +0100 Subject: [PATCH] =?UTF-8?q?[#721]=20Portfolio=20tab=20v3=20=E2=80=94=20min?= =?UTF-8?q?imal=20clean=20layout=20for=20mobile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Holdings: border-separated list items instead of bordered cards - Primary row: title + genre badge + value + 24h% (flex-wrap) - Secondary row: tokens · price · entry · date (compact, wrapping) - Genre tags as lightweight accent badges, not bordered elements - No toggles, all info visible - Consistent with Stories tab v3 design language Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/profile/[address]/page.tsx | 87 +++++++++++++----------------- 1 file changed, 37 insertions(+), 50 deletions(-) diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index 22638bb0..94451c88 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -1387,66 +1387,53 @@ function PortfolioTab({ address, isOwnProfile }: { address: string; isOwnProfile {/* Token holdings */} {hasHoldings && ( -
+
{holdings!.map((h) => ( -
- {/* Row 1: Title + value */} -
-
- - {h.storyline.title} - - {h.storyline.genre && ( - - {h.storyline.genre} - - )} -
-
- - {formatPrice(formatUnits(h.value, h.reserveDecimals))} {RESERVE_LABEL} +
+ {/* Primary: title + genre + value + change */} +
+ + {h.storyline.title} + + {h.storyline.genre && ( + + {h.storyline.genre} - {plotUsd && ( - - ({formatUsdValue(Number(formatUnits(h.value, h.reserveDecimals)) * plotUsd)}) - - )} - {h.priceChange !== null && ( - = 0 ? "text-accent" : "text-error"}`}> - {h.priceChange >= 0 ? "+" : ""}{h.priceChange.toFixed(1)}% - - )} -
+ )} + + {formatPrice(formatUnits(h.value, h.reserveDecimals))} {RESERVE_LABEL} + + {plotUsd && ( + + ({formatUsdValue(Number(formatUnits(h.value, h.reserveDecimals)) * plotUsd)}) + + )} + {h.priceChange !== null && ( + = 0 ? "text-accent" : "text-error"}`}> + {h.priceChange >= 0 ? "+" : ""}{h.priceChange.toFixed(1)}% + + )}
- {/* Row 2: Inline stats */} -
+ {/* Secondary: compact stats */} +
{formatPrice(formatUnits(h.balance, 18))} tokens - · - - price {formatPrice(formatUnits(h.price, 18))} {RESERVE_LABEL} - {plotUsd != null && (≈ {formatUsdValue(Number(formatUnits(h.price, 18)) * plotUsd)})} - + · + price {formatPrice(formatUnits(h.price, 18))} {RESERVE_LABEL} + {plotUsd != null && (≈ {formatUsdValue(Number(formatUnits(h.price, 18)) * plotUsd)})} {h.entryPrice !== null && h.entryPrice > 0 && ( <> - · - - entry {formatPrice(h.entryPrice)} {RESERVE_LABEL} - {plotUsd != null && (≈ {formatUsdValue(h.entryPrice * plotUsd)})} - + · + entry {formatPrice(h.entryPrice)} {RESERVE_LABEL} + {plotUsd != null && (≈ {formatUsdValue(h.entryPrice * plotUsd)})} )} {h.lastTraded && ( <> - · - - {new Date(h.lastTraded).toLocaleDateString("en-US", { month: "short", day: "numeric" })} - + · + {new Date(h.lastTraded).toLocaleDateString("en-US", { month: "short", day: "numeric" })} )}