From fae178e3088521eb04717a2f36f0432c234e788c Mon Sep 17 00:00:00 2001 From: Vasanth T Date: Tue, 6 Oct 2026 10:48:36 +0530 Subject: [PATCH] ui: market board with cards and denser rows A cards or rows layout kept in a cookie, rows that say why a token is listed, badges that shrink to their mark on phones, and a neutral chip for a flat change. --- app/src/app/(home)/page.tsx | 5 +- app/src/components/launchpad/ChainLanding.tsx | 7 +- app/src/components/launchpad/ChangeChip.tsx | 6 +- app/src/components/launchpad/GitlawbBadge.tsx | 9 +- app/src/components/launchpad/LaunchCard.tsx | 145 ++++++++++++++++++ app/src/components/launchpad/LaunchList.tsx | 103 +++++++++---- app/src/components/launchpad/LaunchRow.tsx | 95 ++++++++---- .../components/launchpad/MuseworldBadge.tsx | 18 ++- app/src/components/launchpad/TwigBadge.tsx | 9 +- app/src/components/launchpad/WatchButton.tsx | 35 +++-- .../components/launchpad/change-chip.test.ts | 10 +- app/src/lib/launchpad/list-layout.test.ts | 17 ++ app/src/lib/launchpad/list-layout.ts | 16 ++ app/src/lib/launchpad/museworld.test.ts | 2 +- app/src/lib/launchpad/ranking.test.ts | 12 +- app/src/lib/launchpad/ranking.ts | 30 ++-- app/src/lib/launchpad/twig.test.ts | 2 +- 17 files changed, 409 insertions(+), 112 deletions(-) create mode 100644 app/src/components/launchpad/LaunchCard.tsx create mode 100644 app/src/lib/launchpad/list-layout.test.ts create mode 100644 app/src/lib/launchpad/list-layout.ts diff --git a/app/src/app/(home)/page.tsx b/app/src/app/(home)/page.tsx index eebad0c8..42c563ce 100644 --- a/app/src/app/(home)/page.tsx +++ b/app/src/app/(home)/page.tsx @@ -1,5 +1,6 @@ import type { Metadata } from "next"; import Link from "next/link"; +import { cookies } from "next/headers"; import LaunchHero from "@/components/launchpad/LaunchHero"; import LaunchList from "@/components/launchpad/LaunchList"; import LiveRiver from "@/components/launchpad/LiveRiver"; @@ -14,6 +15,7 @@ import { dbConfigured } from "@/lib/db"; import { isFilter } from "@/lib/launchpad/search"; import { nowMs } from "@/lib/launchpad/time"; import { inRiverWindow, riverCoverage } from "@/lib/launchpad/river"; +import { LAYOUT_COOKIE, parseLayout } from "@/lib/launchpad/list-layout"; import TrendingStrip from "@/components/launchpad/TrendingStrip"; export const dynamic = "force-dynamic"; @@ -40,6 +42,7 @@ export default async function Home({ searchParams }: { searchParams: Promise<{ s ]); const trending = fetchedTrending ?? trendingFrom(page.items); // the default view's first page doubles as the strip's candidates const now = nowMs(); + const layout = parseLayout((await cookies()).get(LAYOUT_COOKIE)?.value); return (
@@ -47,7 +50,7 @@ export default async function Home({ searchParams }: { searchParams: Promise<{ s inRiverWindow(item, now))} serverNow={now} coveredSince={riverCoverage(feed, RIVER_SEED, now)} lastActivityAt={feed[0] ? new Date(feed[0].at).getTime() : 0} />
- +