Context
The landing page showcases the ecosystem's top builders as a curated row (not the full filterable directory, which lives on /builders). This is the star section of the page.
Depends on: [landing-page][Setup] API client, TanStack Query, and environment config and [landing-page][Component] BuilderCard.
What to build
A TopBuilders section that:
- Fetches the top builders via a TanStack Query hook calling
apiFetch -> GET /api/leaderboard?limit=8 (base URL https://stage-api.boundlessfi.xyz, set via NEXT_PUBLIC_API_URL). Supported params: limit, page, timeframe, tier. Inspect the live response and map its fields into BuilderCardView. Do not assume field names.
- Renders a
SectionHeading ("Top builders" + a short subheading) and a responsive grid of BuilderCards.
- Handles loading (render
BuilderCardSkeleton) and empty states.
- Includes a "View all builders" link to
/builders.
Where files go
components/landing/top-builders.tsx (new components/landing/ folder for landing-specific sections).
- If a leaderboard-to-view-model mapper is needed, put it beside it:
components/landing/to-builder-card.ts.
How Boundless builds this (reference)
On the Boundless explore page (private repo), curated content sits inside a Section wrapper (capped at max-w-page with consistent vertical rhythm) topped by a SectionHeading (eyebrow + title + description), with cards in a responsive grid and Skeleton placeholders while loading. These exact primitives are already vendored in this repo. Reuse them, do not rebuild:
components/marketing/section.tsx -> Section, SectionHeading, Eyebrow
components/marketing/reveal.tsx -> Reveal (optional scroll-in wrapper, as the platform uses)
components/cards/builder-card.tsx -> the card (from its own issue)
components/ui/skeleton.tsx -> loading state
Design system (must follow)
- Reuse the section primitives above. Do not build a new section wrapper.
- Use
BuilderCard as-is. Do not restyle it here.
- Follow
design.md for spacing and type. Content caps at max-w-page.
Out of scope
No filters, pagination, or sort UI (those belong to the /builders directory). Fixed curated row only.
Acceptance criteria
References (in this repo)
components/marketing/section.tsx, components/marketing/reveal.tsx.
components/cards/builder-card.tsx (from its issue), components/cards/opportunity-card.tsx (grid pattern).
lib/api/client.ts (from the setup issue), ENDPOINTS.md, design.md.
Context
The landing page showcases the ecosystem's top builders as a curated row (not the full filterable directory, which lives on
/builders). This is the star section of the page.Depends on:
[landing-page][Setup] API client, TanStack Query, and environment configand[landing-page][Component] BuilderCard.What to build
A
TopBuilderssection that:apiFetch->GET /api/leaderboard?limit=8(base URLhttps://stage-api.boundlessfi.xyz, set viaNEXT_PUBLIC_API_URL). Supported params:limit,page,timeframe,tier. Inspect the live response and map its fields intoBuilderCardView. Do not assume field names.SectionHeading("Top builders" + a short subheading) and a responsive grid ofBuilderCards.BuilderCardSkeleton) and empty states./builders.Where files go
components/landing/top-builders.tsx(newcomponents/landing/folder for landing-specific sections).components/landing/to-builder-card.ts.How Boundless builds this (reference)
On the Boundless explore page (private repo), curated content sits inside a
Sectionwrapper (capped atmax-w-pagewith consistent vertical rhythm) topped by aSectionHeading(eyebrow + title + description), with cards in a responsive grid andSkeletonplaceholders while loading. These exact primitives are already vendored in this repo. Reuse them, do not rebuild:components/marketing/section.tsx->Section,SectionHeading,Eyebrowcomponents/marketing/reveal.tsx->Reveal(optional scroll-in wrapper, as the platform uses)components/cards/builder-card.tsx-> the card (from its own issue)components/ui/skeleton.tsx-> loading stateDesign system (must follow)
BuilderCardas-is. Do not restyle it here.design.mdfor spacing and type. Content caps atmax-w-page.Out of scope
No filters, pagination, or sort UI (those belong to the
/buildersdirectory). Fixed curated row only.Acceptance criteria
GET /api/leaderboard?limit=8via a Query hook and rendersBuilderCards./builders.Section/SectionHeadingfromcomponents/marketing/section.tsx(not a new wrapper).npm run lintandnpm run buildpass.References (in this repo)
components/marketing/section.tsx,components/marketing/reveal.tsx.components/cards/builder-card.tsx(from its issue),components/cards/opportunity-card.tsx(grid pattern).lib/api/client.ts(from the setup issue),ENDPOINTS.md,design.md.