From bf669de3c67b3ad8b49a405cc1f2aae2d43ed7ec Mon Sep 17 00:00:00 2001 From: Kobe Attias Date: Mon, 14 Sep 2026 07:36:40 -0400 Subject: [PATCH 1/7] Add funding pool widget to RFP header Behind the rfpFundingPool flag, replace the amount eyebrow and the bare Contribute button with a compact block in the header's CTA column. It shows the pool total, a bar splitting the original grant from community contributions, a one-line breakdown, and an outlined "Add to pool" button directly under the figures. A hairline separates the primary "Apply" button below it, so applying reads as a distinct task from funding. Full figures (funder, community, allocated, and ready-to-allocate for managers) live in an info tooltip so the block stays the height of the title beside it. Also: the contribute modal passes the updated pool back on RSC and credit contributions so the header updates without a refetch, its pool-mode title matches the button, and activity copy for pool contributions is shortened. Co-Authored-By: Claude Fable 5.1 --- .../WorkHeader/GrantFundingPoolWidget.tsx | 61 +++++++++---------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/components/work/WorkHeader/GrantFundingPoolWidget.tsx b/components/work/WorkHeader/GrantFundingPoolWidget.tsx index b995bfcaa..bc9d1d429 100644 --- a/components/work/WorkHeader/GrantFundingPoolWidget.tsx +++ b/components/work/WorkHeader/GrantFundingPoolWidget.tsx @@ -114,10 +114,7 @@ export function GrantFundingPoolWidget({ const nothingToDo = !canApply && !isOpen; return ( -
+
Funding pool @@ -180,41 +177,41 @@ export function GrantFundingPoolWidget({ )}
- {nothingToDo ? ( -

This RFP is closed

- ) : ( -
- {canApply && ( - - - - )} - {isOpen && ( + {/* The pool's own action sits directly under its figures; Apply is separated by a rule so it reads as a different task. */} + {isOpen && ( + + )} + + {canApply && ( +
+ - )} +
)} + + {nothingToDo &&

This RFP is closed

}
); } From 9910bf37f4a9e3d5923b8cad05e391057b9fd305 Mon Sep 17 00:00:00 2001 From: Kobe Attias Date: Mon, 14 Sep 2026 20:50:08 -0400 Subject: [PATCH 2/7] Refining UI of funding pool --- app/globals.css | 11 +++- app/layouts/MobileBottomNav.tsx | 20 ++++--- app/layouts/PageLayout.tsx | 10 +++- components/Notebook/AgentChatPanel.tsx | 2 +- components/Notebook/NoteEditorLayout.tsx | 2 +- ...leChromeOffsets.ts => mobileBarOffsets.ts} | 9 ++-- .../WorkHeader/GrantFundingPoolWidget.tsx | 54 ++++++++++++------- .../work/WorkHeader/WorkHeaderGrant.tsx | 6 ++- 8 files changed, 78 insertions(+), 36 deletions(-) rename components/Notebook/{mobileChromeOffsets.ts => mobileBarOffsets.ts} (88%) diff --git a/app/globals.css b/app/globals.css index 8fe7cb8bf..31dc8791b 100644 --- a/app/globals.css +++ b/app/globals.css @@ -161,9 +161,16 @@ mark { padding-top: calc(56px + var(--top-bar-height)) !important; } - /* Reserve space for the fixed MobileBottomNav (h-16 + safe-area inset) plus - the funding power bar docked above it (3.75rem including its gutter). */ + /* Reserve space for the fixed MobileBottomNav (h-16 + safe-area inset), so + the last of the page's content isn't stuck behind it. */ .page-layout-with-mobile-bottom-nav { + padding-bottom: calc(4rem + env(safe-area-inset-bottom, 0px)); + } + + /* As above, plus the funding power bar docked over the nav on the home tabs + (3.75rem including its gutter). Pages without that bar use the shorter + offset, or the unused space reads as a dead gap under the content. */ + .page-layout-with-mobile-bottom-nav-and-funding-bar { padding-bottom: calc(7.75rem + env(safe-area-inset-bottom, 0px)); } } diff --git a/app/layouts/MobileBottomNav.tsx b/app/layouts/MobileBottomNav.tsx index 5cc23ab25..547e42150 100644 --- a/app/layouts/MobileBottomNav.tsx +++ b/app/layouts/MobileBottomNav.tsx @@ -230,19 +230,25 @@ export const MobileBottomNav: React.FC = () => { {/* Docked over the content directly above the nav, sharing its scroll fade so the two read as one piece of chrome. The nav is z-[100]. + Only the home tabs get it: elsewhere it covers page content that has + nothing to do with funding power, and PageLayout stops reserving room + for it. Keep this condition in sync with the padding class there. + The wrapper spans the full width but only the bar inside it is drawn, so it stays `pointer-events-none` and FundingPowerBar re-enables hits on the bar itself. A fixed element swallows touch drags that start on it — they scroll the document, not the feed's scrollport — so every pixel of it that isn't a control is a band the feed can't be scrolled from, and `opacity-20` makes those bands invisible rather than absent. */} -
- -
+ {isHomeTabPath(pathname) && ( +
+ +
+ )} {/* Bottom Navigation Bar */}