From f10823d552b7476fc26d5ced392075f8c4e6e3f7 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Wed, 1 Apr 2026 17:49:22 +0100 Subject: [PATCH 1/4] =?UTF-8?q?[#730]=20Writer=20tab=20v6=20=E2=80=94=20Mo?= =?UTF-8?q?leskine=20left=20+=20info=20right=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename Stories tab to Writer (display only, URL param unchanged) - WRITER STATS title outside the bordered box - Rename "Donated" to "Received", remove Claimable from stats - STORIES section title above storyline cards - Each storyline: Moleskine book card left + info right (flex-col sm:flex-row), stacks on mobile - TVL + Donations below book row (no Price — added showPrice prop) - Deadline, Royalties, Donation History as divide-y sections - All within one bordered card per storyline Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/profile/[address]/page.tsx | 138 ++++++++++++++++---------- src/components/WriterTradingStats.tsx | 15 +-- 2 files changed, 92 insertions(+), 61 deletions(-) diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index 9ed2f44a..149b6605 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -164,13 +164,13 @@ export default function ProfilePage() { ))} @@ -677,35 +677,22 @@ function StoriesTab({ return (
- {/* Writer Stats — natural inline */} + {/* Writer Stats — title outside box */} +

Writer Stats

-

Writer Stats

Stories: {storylines.length} Plots: {totalPlots} Holders: {totalHolders !== undefined ? totalHolders : "—"} Views: {storylines.reduce((sum, s) => sum + (s.view_count ?? 0), 0)}
-
-
- Donated:{" "} - - {totalDonations > BigInt(0) ? `${formatPrice(formatUnits(totalDonations, 18))} ${RESERVE_LABEL}` : "—"} - - {totalDonations > BigInt(0) && plotUsd != null && ( - ({formatUsdValue(Number(formatUnits(totalDonations, 18)) * plotUsd)}) - )} -
- {isOwnProfile && royaltyInfo && ( -
- Claimable:{" "} - - {royaltyInfo.unclaimed > BigInt(0) ? `${formatPrice(formatUnits(royaltyInfo.unclaimed, 18))} ${RESERVE_LABEL}` : "—"} - - {royaltyInfo.unclaimed > BigInt(0) && plotUsd != null && ( - ({formatUsdValue(Number(formatUnits(royaltyInfo.unclaimed, 18)) * plotUsd)}) - )} -
+
+ Received:{" "} + + {totalDonations > BigInt(0) ? `${formatPrice(formatUnits(totalDonations, 18))} ${RESERVE_LABEL}` : "—"} + + {totalDonations > BigInt(0) && plotUsd != null && ( + ({formatUsdValue(Number(formatUnits(totalDonations, 18)) * plotUsd)}) )}
@@ -739,7 +726,8 @@ function StoriesTab({
)} - {/* Story portfolio */} + {/* Stories */} +

Stories

{storylines.map((s) => ( - {/* Title + badges */} -
+ {/* Moleskine book (left) + Info (right) */} +
+ {/* Moleskine book card */} - {storyline.title} +
+
+
+ + {storyline.genre || "Uncategorized"} + +
+
+ + {storyline.title} + +
+
+ + {storyline.plot_count} {storyline.plot_count === 1 ? "plot" : "plots"} + +
+
-
- {storyline.genre && ( - {storyline.genre} - )} - {storyline.sunset ? ( - complete - ) : ( - active - )} + + {/* Info (right) */} +
+ + {storyline.title} + +
+
+ Plots: {storyline.plot_count} + · + {storyline.sunset ? ( + complete + ) : ( + active + )} +
+
Holders: {holderCount ?? "—"}
+
Views: {formatViewCount(storyline.view_count)}
+
Created: {storyline.block_timestamp ? new Date(storyline.block_timestamp).toLocaleDateString("en-US", { month: "short", day: "numeric" }) : "—"}
+
- {/* Stats */} -
- {storyline.token_address && ( - - )} -
- Plots: {storyline.plot_count} - Holders: {holderCount ?? "—"} - Views: {formatViewCount(storyline.view_count)} - Created: {storyline.block_timestamp ? new Date(storyline.block_timestamp).toLocaleDateString("en-US", { month: "short", year: "2-digit" }) : "—"} -
- {storyline.token_address && ( + {/* TVL + Donations (below book row, no Price) */} + {storyline.token_address && ( +
+ - )} - {!storyline.sunset && storyline.last_plot_time && ( +
+ )} + + {/* Deadline */} + {!storyline.sunset && storyline.last_plot_time && ( +
- )} -
+
+ )} {/* Genre prompt — own profile */} {isOwnProfile && !storyline.genre && ( @@ -864,7 +892,7 @@ function StoryRow({
)} - {/* Royalties + Claim — own profile */} + {/* Royalties — own profile */} {isOwnProfile && storyline.token_address && (
-
- Price:{" "} - {data ? `${formatPrice(data.price)} ${RESERVE_LABEL}` : "—"} - {data && plotUsd && ({formatUsdValue(parseFloat(data.price) * plotUsd)})} -
+ {showPrice && ( +
+ Price:{" "} + {data ? `${formatPrice(data.price)} ${RESERVE_LABEL}` : "—"} + {data && plotUsd && ({formatUsdValue(parseFloat(data.price) * plotUsd)})} +
+ )}
TVL:{" "} {data ? `${formatPrice(data.tvl)} ${RESERVE_LABEL}` : "—"} From 0887ede32765ac0500a99629e53eee296e388e81 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Wed, 1 Apr 2026 17:52:03 +0100 Subject: [PATCH 2/4] [#730] Fix T2a review: remove donation history from storyline card Card now ends at Royalties section per wireframe. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/profile/[address]/page.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index 149b6605..caddeb30 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -904,12 +904,6 @@ function StoryRow({
)} - {/* Donation history — own profile */} - {isOwnProfile && storyline.token_address && ( -
- -
- )}
); } From 9e6cc186f6e632126381cca0c9495f8a9c0d7cbf Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Wed, 1 Apr 2026 17:54:01 +0100 Subject: [PATCH 3/4] [#730] Fix T2a review: move GenrePrompt into info section, not divider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GenrePrompt now renders inside the right-side info area instead of as a separate divide-y section. Card sections: book+info → TVL+ donations → deadline → royalties (no extra sections). Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/profile/[address]/page.tsx | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index caddeb30..55b01407 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -863,6 +863,13 @@ function StoryRow({
Views: {formatViewCount(storyline.view_count)}
Created: {storyline.block_timestamp ? new Date(storyline.block_timestamp).toLocaleDateString("en-US", { month: "short", day: "numeric" }) : "—"}
+ {isOwnProfile && !storyline.genre && ( + + )}
@@ -881,17 +888,6 @@ function StoryRow({
)} - {/* Genre prompt — own profile */} - {isOwnProfile && !storyline.genre && ( -
- -
- )} - {/* Royalties — own profile */} {isOwnProfile && storyline.token_address && (
From 7dec761f3c17fd0f71519385f3fde430ecf3bde7 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Wed, 1 Apr 2026 17:56:25 +0100 Subject: [PATCH 4/4] [#730] Fix T2a review: move GenrePrompt completely outside card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GenrePrompt now renders below the storyline card, not inside it. Card sections are exactly: book+info → TVL+donations → deadline → royalties — no extra panels. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/app/profile/[address]/page.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index 55b01407..834a3841 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -801,6 +801,7 @@ function StoryRow({ }); return ( + <>
{/* Moleskine book (left) + Info (right) */}
@@ -863,13 +864,6 @@ function StoryRow({
Views: {formatViewCount(storyline.view_count)}
Created: {storyline.block_timestamp ? new Date(storyline.block_timestamp).toLocaleDateString("en-US", { month: "short", day: "numeric" }) : "—"}
- {isOwnProfile && !storyline.genre && ( - - )}
@@ -901,6 +895,17 @@ function StoryRow({ )} + {/* Genre prompt — outside the card */} + {isOwnProfile && !storyline.genre && ( +
+ +
+ )} + ); }