|
| 1 | +# Task 5: Build the Packages Page + Final Polish |
| 2 | + |
| 3 | +## Context |
| 4 | + |
| 5 | +You're building a website for **PumpKit** — an open-source PumpFun Telegram bot framework on Solana. The site uses a **Telegram-style UI** with dark chat aesthetics. |
| 6 | + |
| 7 | +The site already has: |
| 8 | +- Vite + React + TypeScript + Tailwind CSS |
| 9 | +- Telegram-style Layout shell with sidebar + top bar |
| 10 | +- Tailwind config with `tg-*` and `pump-*` color tokens |
| 11 | +- Pages: Home (`/`), Create Coin (`/create`), Dashboard (`/dashboard`), Docs (`/docs`) |
| 12 | +- All pages use Telegram message bubble patterns |
| 13 | + |
| 14 | +## Your Task |
| 15 | + |
| 16 | +1. **Create `src/pages/Packages.tsx`** — a package showcase page |
| 17 | +2. **Update `src/main.tsx`** — add the `/packages` route |
| 18 | +3. **Add a Telegram-style input bar** to the bottom of Layout.tsx (cosmetic only) |
| 19 | +4. **Add the slideIn animation** to `src/index.css` for the Dashboard |
| 20 | +5. **Create `public/favicon.svg`** — simple PumpKit logo |
| 21 | + |
| 22 | +## Part 1: Packages Page |
| 23 | + |
| 24 | +The packages page displays each PumpKit package as a detailed **Telegram channel post**, showcasing what each bot does with code examples and feature lists. |
| 25 | + |
| 26 | +### Page Container |
| 27 | +```tsx |
| 28 | +<div className="flex flex-col gap-4 p-4 max-w-3xl mx-auto pb-24"> |
| 29 | + {/* Date separator */} |
| 30 | + <div className="text-center py-2"> |
| 31 | + <span className="bg-tg-input/80 text-zinc-400 text-xs px-3 py-1 rounded-full"> |
| 32 | + Packages |
| 33 | + </span> |
| 34 | + </div> |
| 35 | + {/* Package posts */} |
| 36 | +</div> |
| 37 | +``` |
| 38 | + |
| 39 | +### Overview Message (incoming bubble) |
| 40 | +- Sender: "PumpKit" with 📦 avatar |
| 41 | +- Text: "PumpKit ships 5 packages. Each is independent — use what you need." |
| 42 | +- Below text, a small stat bar: |
| 43 | + ``` |
| 44 | + 5 packages • TypeScript • MIT License • Node.js ≥ 20 |
| 45 | + ``` |
| 46 | + in `text-xs text-zinc-500` |
| 47 | + |
| 48 | +### Package Cards (one incoming bubble per package) |
| 49 | + |
| 50 | +Each package gets a "rich" channel post bubble: |
| 51 | + |
| 52 | +**@pumpkit/core** |
| 53 | +``` |
| 54 | +🧱 @pumpkit/core |
| 55 | +
|
| 56 | +The shared foundation. Every PumpKit bot uses core. |
| 57 | +
|
| 58 | +Features: |
| 59 | +├─ 🤖 Grammy bot scaffolding + command router |
| 60 | +├─ 📡 WebSocket + HTTP event monitors |
| 61 | +├─ ⛓️ Solana RPC client + program decoders |
| 62 | +├─ 📝 HTML message formatter (Telegram) |
| 63 | +├─ 💾 File-based + SQLite storage adapters |
| 64 | +├─ ⚙️ Typed env config with validation |
| 65 | +├─ 🏥 HTTP health check server |
| 66 | +└─ 📊 Leveled console logger |
| 67 | +
|
| 68 | +npm install @pumpkit/core (coming soon) |
| 69 | +``` |
| 70 | +Code example inside the bubble: |
| 71 | +```typescript |
| 72 | +import { createBot, createHealthServer } from '@pumpkit/core'; |
| 73 | + |
| 74 | +const bot = createBot({ |
| 75 | + token: process.env.BOT_TOKEN!, |
| 76 | + commands: { start: (ctx) => ctx.reply('Hello!') }, |
| 77 | +}); |
| 78 | +``` |
| 79 | + |
| 80 | +**@pumpkit/monitor** |
| 81 | +``` |
| 82 | +📡 @pumpkit/monitor |
| 83 | +
|
| 84 | +All-in-one PumpFun activity monitor. DM bot + REST API + SSE streaming. |
| 85 | +
|
| 86 | +Monitors: |
| 87 | +├─ 💰 Fee claims (by wallet or token) |
| 88 | +├─ 🚀 Token launches (with cashback detection) |
| 89 | +├─ 🎓 Graduations (bonding curve → AMM) |
| 90 | +├─ 🐋 Whale trades (configurable threshold) |
| 91 | +├─ 👑 CTO events (creator transfers) |
| 92 | +└─ 💎 Fee distributions |
| 93 | +
|
| 94 | +API: REST endpoints + SSE real-time stream |
| 95 | +Deploy: Railway, Fly.io, or any Node.js host |
| 96 | +``` |
| 97 | + |
| 98 | +**@pumpkit/channel** |
| 99 | +``` |
| 100 | +📢 @pumpkit/channel |
| 101 | +
|
| 102 | +Read-only Telegram channel feed. Broadcasts token events to a public channel. |
| 103 | +
|
| 104 | +• Zero interaction needed — just add the bot as channel admin |
| 105 | +• Customizable message templates |
| 106 | +• Filter by event type |
| 107 | +• Rate limiting built in |
| 108 | +``` |
| 109 | + |
| 110 | +**@pumpkit/claim** |
| 111 | +``` |
| 112 | +💰 @pumpkit/claim |
| 113 | +
|
| 114 | +Fee claim tracker. Look up claims by token CA or creator X handle. |
| 115 | +
|
| 116 | +• /claim <CA> — show fee claims for a token |
| 117 | +• /creator <handle> — find tokens by X/Twitter handle |
| 118 | +• CSV export for accounting |
| 119 | +• Historical claim data |
| 120 | +``` |
| 121 | + |
| 122 | +**@pumpkit/tracker** |
| 123 | +``` |
| 124 | +🏆 @pumpkit/tracker |
| 125 | +
|
| 126 | +Group call-tracking bot. Add to your Telegram group, members call tokens, bot tracks results. |
| 127 | +
|
| 128 | +Features: |
| 129 | +├─ 📊 Leaderboards (daily/weekly/monthly/all-time) |
| 130 | +├─ 💰 PNL cards with entry/exit prices |
| 131 | +├─ 🏅 Rank tiers (Amateur → Oracle) |
| 132 | +├─ ⛓️ Multi-chain (Solana, ETH, Base, BSC) |
| 133 | +├─ 📈 Win rate & multiplier tracking |
| 134 | +└─ 🎯 Call resolution (auto or manual) |
| 135 | +``` |
| 136 | + |
| 137 | +### Style for Package Bubbles |
| 138 | + |
| 139 | +Each package bubble should have a subtle colored left border to distinguish it: |
| 140 | +``` |
| 141 | +border-l-4 border-l-{color} |
| 142 | +``` |
| 143 | +Colors by package: |
| 144 | +- core: `border-l-tg-blue` |
| 145 | +- monitor: `border-l-pump-green` |
| 146 | +- channel: `border-l-pump-cyan` |
| 147 | +- claim: `border-l-pump-yellow` |
| 148 | +- tracker: `border-l-pump-purple` |
| 149 | + |
| 150 | +Code snippets inside bubbles: |
| 151 | +``` |
| 152 | +bg-[#1a2332] rounded-lg p-3 font-mono text-xs text-zinc-300 overflow-x-auto mt-3 |
| 153 | +``` |
| 154 | + |
| 155 | +### CTA at Bottom (outgoing bubble) |
| 156 | +``` |
| 157 | +Ready to build? Pick a package and start coding. |
| 158 | +
|
| 159 | +[📖 Read the Docs] [🪙 Create Coin] [⭐ GitHub] |
| 160 | +``` |
| 161 | + |
| 162 | +## Part 2: Telegram Input Bar (Layout.tsx) |
| 163 | + |
| 164 | +Add a cosmetic Telegram-style message input bar to the bottom of the main content area. It's non-functional but completes the Telegram look. |
| 165 | + |
| 166 | +At the bottom of the `<main>` in Layout.tsx, after `<Outlet />`, add: |
| 167 | + |
| 168 | +```tsx |
| 169 | +{/* Cosmetic Telegram input bar */} |
| 170 | +<div className="shrink-0 bg-tg-header border-t border-tg-border px-4 py-2 flex items-center gap-3"> |
| 171 | + <button className="text-zinc-500 hover:text-zinc-300 transition text-xl">😊</button> |
| 172 | + <div className="flex-1 bg-tg-input rounded-full px-4 py-2 text-sm text-zinc-500"> |
| 173 | + Message... |
| 174 | + </div> |
| 175 | + <button className="text-zinc-500 hover:text-tg-blue transition text-xl">📎</button> |
| 176 | + <button className="w-9 h-9 rounded-full bg-tg-blue flex items-center justify-center text-white text-sm hover:bg-tg-blue/80 transition"> |
| 177 | + ▶ |
| 178 | + </button> |
| 179 | +</div> |
| 180 | +``` |
| 181 | + |
| 182 | +This should be inside the right panel's flex column, after `<main>` but inside the flex container so it sticks to the bottom. |
| 183 | + |
| 184 | +## Part 3: SlideIn Animation (index.css) |
| 185 | + |
| 186 | +Add to the end of `src/index.css`: |
| 187 | + |
| 188 | +```css |
| 189 | +/* Event card entrance animation */ |
| 190 | +@keyframes slideIn { |
| 191 | + from { |
| 192 | + opacity: 0; |
| 193 | + transform: translateY(-8px); |
| 194 | + } |
| 195 | + to { |
| 196 | + opacity: 1; |
| 197 | + transform: translateY(0); |
| 198 | + } |
| 199 | +} |
| 200 | + |
| 201 | +.animate-slide-in { |
| 202 | + animation: slideIn 0.3s ease-out; |
| 203 | +} |
| 204 | +``` |
| 205 | + |
| 206 | +## Part 4: Favicon (public/favicon.svg) |
| 207 | + |
| 208 | +Create a simple SVG favicon — a rocket emoji style icon in PumpKit colors: |
| 209 | + |
| 210 | +```svg |
| 211 | +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"> |
| 212 | + <circle cx="50" cy="50" r="48" fill="#17212b" stroke="#5eb5f7" stroke-width="3"/> |
| 213 | + <text x="50" y="68" text-anchor="middle" font-size="52">🚀</text> |
| 214 | +</svg> |
| 215 | +``` |
| 216 | + |
| 217 | +## Tailwind Colors Available |
| 218 | + |
| 219 | +``` |
| 220 | +tg-bg: #17212b tg-sidebar: #0e1621 tg-chat: #0e1621 |
| 221 | +tg-header: #17212b tg-input: #242f3d tg-hover: #202b36 |
| 222 | +tg-border: #1c2733 tg-blue: #5eb5f7 tg-green: #4fae4e |
| 223 | +tg-bubble: #2b5278 tg-bubble-in: #182533 |
| 224 | +pump-green: #00e676 pump-pink: #ff6b9d pump-yellow: #ffd54f |
| 225 | +pump-purple: #b388ff pump-orange: #ff9100 pump-cyan: #00e5ff |
| 226 | +``` |
| 227 | + |
| 228 | +## Files to Edit |
| 229 | + |
| 230 | +1. **Create** `packages/web/src/pages/Packages.tsx` |
| 231 | +2. **Edit** `packages/web/src/main.tsx` — add: `<Route path="packages" element={<Packages />} />` |
| 232 | +3. **Edit** `packages/web/src/components/Layout.tsx` — add the input bar to the bottom |
| 233 | +4. **Edit** `packages/web/src/index.css` — add the slideIn animation |
| 234 | +5. **Create/replace** `packages/web/public/favicon.svg` |
| 235 | + |
| 236 | +## Do NOT |
| 237 | + |
| 238 | +- Add any dependencies |
| 239 | +- Change the tailwind.config.js |
| 240 | +- Make any API calls |
| 241 | +- Use images (emoji only, except the SVG favicon) |
| 242 | +- Remove any existing route — only add the new `/packages` route |
0 commit comments