-
{weeks > 0 ? remainingDays : days}
-
days
+
+
+
+
+
+
+
+
+
+ {/* Grid lines (horizontal at each milestone FDV) */}
+ {milestoneLines.map((m) => (
+
+
+ {/* Right-side label */}
+
+ {m.emoji} {formatCompact(m.fdv)}
+
+
+ ))}
+
+ {/* Y-left axis ticks (pool value) */}
+ {yLeftTicks.map((val) => (
+
+ {formatCompact(val)}
+
+ ))}
+
+ {/* X-axis month labels */}
+ {months.map((m) => (
+
+
+
+ {m.label}
+
+
+ ))}
+
+ {/* Axis labels */}
+
+ Pool Value (USD)
+
+
+ FDV (USD)
+
+
+ {/* 1. Pool value area fill */}
+ {poolAreaPath && (
+
+ )}
+
+ {/* 2. Pool value step line */}
+ {poolStepPath && (
+
+ )}
+
+ {/* 3. Linear FDV projection (dashed) */}
+
+
+ {/* 4. Actual FDV line (solid) */}
+ {actualFdvPath && (
+
+ )}
+
+ {/* Heartbeat dot on current FDV position */}
+ {currentFdv > 0 && (
+
+ {/* Pulse ring */}
+
+
+
+
+ {/* Solid dot */}
+
+
+
+
+
+ )}
+
+ {/* Chart border */}
+
+
+
+ {/* Legend */}
+
+
+ Actual FDV
+
+
+ Linear projection
+
+
+ Pool value
+
);
}
+/* ─── Main component ─── */
+
export function CampaignHero() {
const { data, isLoading } = useAirdropStatus();
+ const countdown = useCountdown(data?.campaignEnd ?? "2027-01-01");
+
+ const tiers = useMemo(
+ () => (data ? buildTiers(data.milestones) : []),
+ [data],
+ );
if (isLoading || !data) {
return (
@@ -69,33 +472,57 @@ export function CampaignHero() {
);
}
+ const pad2 = (n: number) => String(n).padStart(2, "0");
+
return (
-
- {/* Title + Tagline */}
-
+
+ {/* Title + Explanation */}
+
PLOT Big or Nothing Airdrop
-
- {data.poolAmount.toLocaleString()} PLOT locked. Earn or burn.
+
+ {data.poolAmount.toLocaleString()} PLOT (5% of max supply) locked in a time-locked contract.
+ If PLOT FDV reaches milestone targets within 6 months, the pool is distributed to point holders.
+ If not, it's burned forever.
+
+ {/* Lock-up proof */}
+ {data.lockerId ? (
+
+ 🔒 View lock-up proof on Mint Club
+
+ ) : (
+
+ 🔒 Lock-up proof: pending
+
+ )}
- {/* Countdown */}
+ {/* Live Countdown */}
{data.timeRemainingDays > 0 && (
-
-
-
-
-
- {data.timeElapsedPercent}% elapsed
+
+ {[
+ { val: countdown.d, label: "days" },
+ { val: countdown.h, label: "hrs" },
+ { val: countdown.m, label: "min" },
+ { val: countdown.s, label: "sec" },
+ ].map((unit, i) => (
+
+ {i > 0 &&
: }
+
+
+ {i === 0 ? unit.val : pad2(unit.val)}
+
+
{unit.label}
+
-
+ ))}
)}
@@ -117,19 +544,25 @@ export function CampaignHero() {
- {/* Lockup proof */}
- {data.lockerId && (
-
-
- View lockup proof on-chain
-
+ {/* 6-Month Timeline Chart */}
+
+
+ {/* Current position summary */}
+
+
+ Current FDV: {data.currentFdv > 0 ? formatUsdValue(data.currentFdv) : "\u2014"}
+ · Zone: {currentZoneLabel(data.currentFdv, tiers)}
- )}
+
+ Pool value: {data.currentFdv > 0 ? formatUsdValue(poolValueAtFdv(data.currentFdv, data.poolAmount, tiers)) : "$0"}
+
+
);
}