From 5ee469b306c9a7e37653b5566f6bb7316043567b Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Fri, 1 May 2026 07:43:56 +0900 Subject: [PATCH 1/2] [#1019] Redesign milestone section into 3 clear blocks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace flat milestone rows with three narrative sections: 1. "Your airdrop grows with $PLOT" — value table with Now + 4 steps 2. "Four steps — not unrealistic" — 4 MCap cards with CMC rank + unlock % 3. "Not reached? Burned forever." — burn callout + holder benefit Responsive: cards 2×2 on mobile, 4-col on desktop. CMC rank text and "thousands have done it" copy hidden in test mode. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/components/airdrop/CampaignHero.tsx | 128 +++++++++++++++++------- 1 file changed, 93 insertions(+), 35 deletions(-) diff --git a/src/components/airdrop/CampaignHero.tsx b/src/components/airdrop/CampaignHero.tsx index cf3b1eb..2ae6c0b 100644 --- a/src/components/airdrop/CampaignHero.tsx +++ b/src/components/airdrop/CampaignHero.tsx @@ -283,52 +283,110 @@ export function CampaignHero() { poolUsd={burnState.poolUsd} /> - {/* ── What happens as PLOT grows ── */} + {/* ── Section 1: Your airdrop grows with $PLOT ── */}
- What happens as PLOT grows + Your airdrop grows with $PLOT
+

+ The pool is {data.poolAmount.toLocaleString()} PLOT. Its value depends on the market. +

+ +
+ {/* "Now" row */} +
+ Now + MCap {data.currentFdv > 0 ? formatCompact(data.currentFdv) : "—"} + Pool value: {data.currentFdv > 0 ? formatUsdValue(burnState.poolUsd) : "$0"} +
+ {/* Milestone rows */} + {milestoneRows.map((row) => ( +
+ + Step {milestoneRows.indexOf(row) + 1} + + MCap {formatCompact(row.fdv)} + + Pool ~{formatCompact(row.poolUsd)} + +
+ ))} +
+ +

+ The same {data.poolAmount.toLocaleString()} PLOT — worth{" "} + {data.currentFdv > 0 ? formatUsdValue(burnState.poolUsd) : "$0"} today, or{" "} + ~{formatCompact(milestoneRows[milestoneRows.length - 1]?.poolUsd ?? 0)} at full distribution. + Your airdrop size = market growth. +

+
-
- {milestoneRows.map((row, i) => ( -
- {i > 0 &&
} + {/* ── Section 2: Four steps — not unrealistic ── */} +
+
+ Four steps — not unrealistic +
+

+ Each step unlocks a bigger share of the pool. +

+ +
+ {milestoneRows.map((row) => { + const reached = data.currentFdv >= row.fdv; + return (
-
- - MCap {formatCompact(row.fdv)} - - {row.cmcRank && ( - {row.cmcRank} - )} -
-
- - {row.pct}% unlocked - - - {row.burnPct}% burned - +
+ {formatCompact(row.fdv)}
-
- {row.unlockPlot.toLocaleString()} PLOT -
-
- Pool ~{formatCompact(row.poolUsd)} - {row.isFull && ( - - Full distribution - - )} + {row.cmcRank && ( +
{row.cmcRank}
+ )} +
unlocks
+
+ {row.pct}%
-
- ))} + ); + })} +
+ + {!AIRDROP_TEST_MODE && ( +

+ These aren't moonshot numbers — #250 on CMC is a mid-tier project. + Thousands of tokens have done it. +

+ )} +
+ + {/* ── Section 3: Not reached? Burned forever. ── */} +
+
+ Not reached? Burned forever.
+ +
+
+ If MCap stays below {formatCompact(milestoneRows[0]?.fdv ?? 0)}: +
+
+ {data.poolAmount.toLocaleString()} PLOT → burned permanently 🔥 +
+

+ No team keeps it. No treasury recycles it.
+ Burned = reduced supply = value for holders. +

+
+ +

+ Either way, PLOT holders benefit:
+ reach milestones → earn airdrop. + Miss milestones → supply shrinks. +

{/* ── Participant count ── */} From d24df5ab4aaa1299331d2b1fea609c8d89aee1cb Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Fri, 1 May 2026 07:45:19 +0900 Subject: [PATCH 2/2] [#1019] Use map index instead of indexOf for step numbering Co-Authored-By: Claude Opus 4.6 (1M context) --- src/components/airdrop/CampaignHero.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/airdrop/CampaignHero.tsx b/src/components/airdrop/CampaignHero.tsx index 2ae6c0b..a84dd14 100644 --- a/src/components/airdrop/CampaignHero.tsx +++ b/src/components/airdrop/CampaignHero.tsx @@ -300,10 +300,10 @@ export function CampaignHero() { Pool value: {data.currentFdv > 0 ? formatUsdValue(burnState.poolUsd) : "$0"}
{/* Milestone rows */} - {milestoneRows.map((row) => ( + {milestoneRows.map((row, i) => (
- Step {milestoneRows.indexOf(row) + 1} + Step {i + 1} MCap {formatCompact(row.fdv)}