Context
The projects page renders the results as a grid of project cards with loading, empty, and error states, a result count, and pagination.
Depends on: the projects data hooks issue (useProjects) and the shared card mapper.
Live reference
https://boundlessfi.xyz/bounties — the results grid, the result count in the toolbar, and the "load more" behaviour at the bottom.
What to build
A ProjectsResults block that takes the useProjects result (or the params, and calls it) and renders:
- Grid of cards — map each project through the shared mapper to
OpportunityCardView and render components/cards/opportunity-card.tsx in a responsive grid (1 / 2 / 3 columns).
- Loading — a grid of
components/cards/opportunity-card-skeleton.tsx.
- Empty — a centered muted message when
pagination.total is 0 or the filtered result is empty.
- Error — a centered muted message when the query errors.
- Result count — use the vendored
components/discover/discover-toolbar.tsx / discover-header.tsx to show the count (e.g. "24 projects").
- Pagination — "Load more" using
pagination.hasNext (append the next page), or page-based pagination with components/ui/pagination.tsx. Pick one and keep it consistent.
Where files go
components/discover/projects-results.tsx.
Design system / reuse (in this repo)
components/cards/opportunity-card.tsx + components/cards/opportunity-card-skeleton.tsx (the project card and its skeleton).
components/discover/discover-toolbar.tsx, components/discover/discover-header.tsx (result count / header).
components/ui/pagination.tsx or a Button-based "Load more".
- Follow
design.md. Content caps at max-w-page.
Out of scope
- Search, tabs, filters (separate issues) — this issue just renders results for whatever params it is given.
Acceptance criteria
References (in this repo)
components/cards/opportunity-card.tsx, components/cards/opportunity-card-skeleton.tsx.
components/discover/discover-toolbar.tsx, components/discover/discover-header.tsx, components/ui/pagination.tsx.
components/discover/use-projects.ts, ENDPOINTS.md, design.md.
Context
The projects page renders the results as a grid of project cards with loading, empty, and error states, a result count, and pagination.
Depends on: the projects data hooks issue (
useProjects) and the shared card mapper.Live reference
https://boundlessfi.xyz/bounties — the results grid, the result count in the toolbar, and the "load more" behaviour at the bottom.
What to build
A
ProjectsResultsblock that takes theuseProjectsresult (or the params, and calls it) and renders:OpportunityCardViewand rendercomponents/cards/opportunity-card.tsxin a responsive grid (1 / 2 / 3 columns).components/cards/opportunity-card-skeleton.tsx.pagination.totalis 0 or the filtered result is empty.components/discover/discover-toolbar.tsx/discover-header.tsxto show the count (e.g. "24 projects").pagination.hasNext(append the next page), or page-based pagination withcomponents/ui/pagination.tsx. Pick one and keep it consistent.Where files go
components/discover/projects-results.tsx.Design system / reuse (in this repo)
components/cards/opportunity-card.tsx+components/cards/opportunity-card-skeleton.tsx(the project card and its skeleton).components/discover/discover-toolbar.tsx,components/discover/discover-header.tsx(result count / header).components/ui/pagination.tsxor aButton-based "Load more".design.md. Content caps atmax-w-page.Out of scope
Acceptance criteria
OpportunityCards fromuseProjectsvia the shared mapper, in a responsive grid.pagination.npm run lintandnpm run buildpass.References (in this repo)
components/cards/opportunity-card.tsx,components/cards/opportunity-card-skeleton.tsx.components/discover/discover-toolbar.tsx,components/discover/discover-header.tsx,components/ui/pagination.tsx.components/discover/use-projects.ts,ENDPOINTS.md,design.md.