diff --git a/package.json b/package.json index d6387640..539d2d19 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plotlink", - "version": "1.3.3", + "version": "1.4.0", "private": true, "workspaces": [ "packages/*" diff --git a/src/app/airdrop/page.tsx b/src/app/airdrop/page.tsx index 46a2e92b..54df2487 100644 --- a/src/app/airdrop/page.tsx +++ b/src/app/airdrop/page.tsx @@ -4,7 +4,6 @@ import { UserPoints } from "../../components/airdrop/UserPoints"; import { ClaimPanel } from "../../components/airdrop/ClaimPanel"; import { Leaderboard } from "../../components/airdrop/Leaderboard"; import { WeeklySnapshots } from "../../components/airdrop/WeeklySnapshots"; -import { InnovationBanner } from "../../components/airdrop/InnovationBanner"; import { AIRDROP_CONFIG } from "../../../lib/airdrop/config"; export const metadata: Metadata = { @@ -20,11 +19,6 @@ export default function AirdropPage() { {/* Hero spans full width */} - {/* Innovation banner — between hero and user sections */} -
- -
- {/* 2-column grid below hero */}
{/* Left column: user-specific */} diff --git a/src/components/airdrop/CampaignHero.tsx b/src/components/airdrop/CampaignHero.tsx index 4cea95c3..e95dcfa1 100644 --- a/src/components/airdrop/CampaignHero.tsx +++ b/src/components/airdrop/CampaignHero.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import { useQuery } from "@tanstack/react-query"; /* ─── Types ─── */ @@ -74,6 +74,9 @@ function useCountdown(endDateStr: string) { export function CampaignHero() { const { data, isLoading } = useAirdropStatus(); const countdown = useCountdown(data?.campaignEnd ?? "2027-01-01"); + const [showModal, setShowModal] = useState(false); + + const closeModal = useCallback(() => setShowModal(false), []); if (isLoading || !data) { return ( @@ -111,6 +114,17 @@ export function CampaignHero() {

+ {/* ── Modal trigger ── */} +
+ +
+ {/* ── Countdown ── */} {data.timeRemainingDays > 0 && (
@@ -177,6 +191,61 @@ export function CampaignHero() {
MCap = PLOT price × 1M max supply
+ + {/* ── Innovation modal ── */} + {showModal && ( +
+
e.stopPropagation()} + > + + +
+ ── How is this different? ── +
+ +
+
+
+ TYPICAL AIRDROP +
+
+
Fixed amount
+
Dumps on day 1
+
No skin in game
+
+
+
+
+ THIS AIRDROP +
+
+
Pool grows with MCap
+
Burned if no growth
+
Everyone wins together
+
+
+
+ +

+ The pool isn't pre-valued — it's valued by the market. + At $100M MCap, 50,000 PLOT = $5M distributed. + At $0 growth, 50,000 PLOT = burned forever. + Everyone — team, holders, earners — wins only if PLOT grows. +

+
+
+ )}
); } diff --git a/src/components/airdrop/InnovationBanner.tsx b/src/components/airdrop/InnovationBanner.tsx deleted file mode 100644 index c74d72ba..00000000 --- a/src/components/airdrop/InnovationBanner.tsx +++ /dev/null @@ -1,55 +0,0 @@ -const COLUMNS = [ - { - title: "TYPICAL AIRDROP", - rows: ["Fixed amount", "Dumps on day 1", "No skin in game"], - highlighted: false, - }, - { - title: "THIS AIRDROP", - rows: ["Pool grows with MCap", "Burned if no growth", "Everyone wins together"], - highlighted: true, - }, -] as const; - -export function InnovationBanner() { - return ( -
-
- ── How is this different? ── -
- - {/* Two-column comparison */} -
- {COLUMNS.map((col) => ( -
-
- {col.title} -
-
- {col.rows.map((row) => ( -
- {row} -
- ))} -
-
- ))} -
- - {/* Summary */} -

- The pool isn't pre-valued — it's valued by the market. - At $100M MCap, 50,000 PLOT = $5M distributed. - At $0 growth, 50,000 PLOT = burned forever. - Everyone — team, holders, earners — wins only if PLOT grows. -

-
- ); -}