@@ -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({
+
+ Skip to content
+
- {children}
+
+ {children}
+
diff --git a/src/context/AuthContext.tsx b/src/context/AuthContext.tsx
index 76c5bd9..a5cb079 100644
--- a/src/context/AuthContext.tsx
+++ b/src/context/AuthContext.tsx
@@ -49,9 +49,13 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
useEffect(() => {
// Session hydration on mount: reads the JWT from localStorage and
- // resolves the current user. Inherently async, not a render-time value.
- // eslint-disable-next-line react-hooks/set-state-in-effect
- void refresh();
+ // resolves the current user. Deferred by a tick (#223) so it runs after
+ // the initial commit instead of on the critical path to interactivity —
+ // every route mounts this provider, including static marketing pages.
+ const id = window.setTimeout(() => {
+ void refresh();
+ }, 0);
+ return () => window.clearTimeout(id);
}, [refresh]);
const handleTokenChangedElsewhere = useCallback(
diff --git a/src/context/WalletContext.tsx b/src/context/WalletContext.tsx
index 82e2761..22ab53c 100644
--- a/src/context/WalletContext.tsx
+++ b/src/context/WalletContext.tsx
@@ -35,9 +35,14 @@ export function WalletProvider({ children }: { children: React.ReactNode }) {
useEffect(() => {
// localStorage is unavailable during SSR, so this can't be a lazy
// useState initializer — it must run after mount on the client.
- const stored = window.localStorage.getItem(WALLET_KEY);
- // eslint-disable-next-line react-hooks/set-state-in-effect
- if (stored) setAddress(stored);
+ // Deferred by a tick (#223), same as AuthProvider's mount hydration,
+ // so this provider (mounted on every route) doesn't add to the
+ // critical path to interactivity for routes that don't need it yet.
+ const id = window.setTimeout(() => {
+ const stored = window.localStorage.getItem(WALLET_KEY);
+ if (stored) setAddress(stored);
+ }, 0);
+ return () => window.clearTimeout(id);
}, []);
const handleWalletKeyChangedElsewhere = useCallback((newValue: string | null) => {