Skip to content

[landing-page][Section] Top builders row #320

Description

@Benjtalkshow

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

  • Section fetches GET /api/leaderboard?limit=8 via a Query hook and renders BuilderCards.
  • Loading and empty states handled.
  • "View all builders" links to /builders.
  • Uses Section / SectionHeading from components/marketing/section.tsx (not a new wrapper).
  • npm run lint and npm run build pass.
  • Screenshot attached to the PR.

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.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions