diff --git a/src/app/dashboard/maintainer/PipelineBoard.tsx b/src/app/dashboard/maintainer/PipelineBoard.tsx index 07fe85e..c34b030 100644 --- a/src/app/dashboard/maintainer/PipelineBoard.tsx +++ b/src/app/dashboard/maintainer/PipelineBoard.tsx @@ -41,7 +41,15 @@ export const ESCROW_LOCKED_EXCLUDED_STATUSES: BountyStatus[] = [ "expired", ]; +// Cap per-column rendering so a busy repo's pipeline (potentially hundreds +// of bounties in one status) doesn't render an unbounded, unvirtualized +// list of cards on every dashboard visit (#226). +const MAX_VISIBLE_PER_COLUMN = 8; + function PipelineColumn({ label, bounties }: { label: string; bounties: Bounty[] }) { + const visible = bounties.slice(0, MAX_VISIBLE_PER_COLUMN); + const hiddenCount = bounties.length - visible.length; + return (
@@ -51,10 +59,11 @@ function PipelineColumn({ label, bounties }: { label: string; bounties: Bounty[]
- {bounties.map((b) => ( + {visible.map((b) => (

@@ -73,6 +82,14 @@ function PipelineColumn({ label, bounties }: { label: string; bounties: Bounty[] Nothing here

)} + {hiddenCount > 0 && ( + + View all {bounties.length} in Bounty pipeline + + )}
); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2c7882d..672b4ed 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -42,11 +42,19 @@ export default function RootLayout({