improvement(landing): SSR-friendly URL-state filters + cleanup pass + polish#5298
Conversation
…memos, changelog useInfiniteQuery - emcn: collapse 29 square h-N w-N pairs to size-* across models/integrations/blog/faq/landing-preview - landing-preview: remove redundant animationKeyRef (functional setState) + dead isDesktopRef - model-directory: hoist static provider options to a module const - auth-modal: drop useMemo over the cheap getBrandConfig() call - changelog: replace useState+fetch pagination with a co-located useInfiniteQuery hook (first page stays SSR-seeded via initialData)
…back bump - integrations grid, models directory: search + category/provider filters now live in the URL (nuqs useQueryStates), server-parsed via createSearchParamsCache so filtered views render server-side (crawlable, shareable) — mirrors the blog index SSR pattern. Search URL writes debounced; in-memory filtering stays instant. - pricing: billing-period toggle moves to ?billing=annual (shareable, no flash). - co-located search-params.ts per page as the single source of truth (server + client). - stars: bump fallback floor 28800 -> 28900 to track the current count.
Replace brandbook/logo/small.png — referenced only by the 'Start automating
{service} today' CTA on integration pages — with the black-on-light sim mark so
the tile reads as a neutral brand mark beside the partner icon instead of a green
block.
Drop the scale-150 + brightness-75 hover (a 50% size jump plus a muddy darken) for an understated opacity-fill (0.85 -> 1) with a slight scale-110, matching the comparison chart's opacity-driven hover language.
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryLow Risk Overview Alongside that, a behavior-neutral cleanup pass: square Polish: model release-timeline dot hover is subtler (opacity + slight scale), GitHub star fallback floor bumps to 28900, and integration bottom CTA uses the neutral Sim mark asset. Reviewed by Cursor Bugbot for commit 5370824. Configure here. |
Greptile SummaryThis PR updates the landing pages with URL-backed filters and cleanup.
Confidence Score: 5/5This looks safe to merge.
Important Files Changed
Reviews (3): Last reviewed commit: "revert(landing): keep the original chang..." | Re-trigger Greptile |
…op inline comments - changelog: getNextPageParam no longer treats an empty server-seeded page 1 as end-of-feed, so a failed/empty initial GitHub fetch still surfaces 'Show more' (addresses Cursor Bugbot). - replace the inline comments added in this branch with TSDoc on the search-param caches (documents the dynamic-render → SSR-filtered behavior), per the codebase's TSDoc-only convention.
|
@greptile review |
|
@cursor review |
…teQuery) The React Query conversion of an SSR-seeded, cross-origin, infrequently-changing paginated list introduced caching edge cases (empty-seed load-more, singleton cache serving stale page 1 on client-side nav) without real benefit. Restore the original useState(initialEntries)+fetch timeline, which is simpler, correct, and already review-clean from #5181.
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 5370824. Configure here.
Summary
Post-merge cleanup and polish for the landing surface (follows #5181). Quality-only where it touches existing behavior; the one functional change (URL-state filters) is implemented the SSR-friendly way so SEO and shareability both improve.
Code-quality cleanup (behavior-identical)
h-N w-Npairs to thesize-*shorthand across models / integrations / blog / FAQ / landing-preview.landing-preview: drop a redundantanimationKeyRef(use a functionalsetState) and a dead write-onlyisDesktopRef.model-directory: hoist a staticuseMemoto a module constant.auth-modal: drop auseMemoover the cheapgetBrandConfig().changelog: replaceuseState+fetchpagination with a co-locateduseInfiniteQueryhook. The first page stays SSR-seeded viainitialData(no SEO loss); search/abort unaffected.URL-state filters via nuqs (SSR-friendly)
useQueryStates), with a co-locatedsearch-params.tsas the single source of truth and server-sidecreateSearchParamsCache.parsein the page so filtered views render server-side — crawlable and shareable, no Suspense content-drop. Mirrors the existing/blogSSR pattern. Search URL writes are debounced; in-memory filtering stays instant.?billing=annual(shareable, server-rendered, no toggle flash)./blog. They render from in-memory constants, so the render is cheap.Polish
simtile with the neutral black-on-lightsimmark (asset referenced only by that CTA).scale-150+brightness-75for an understated opacity-fill + slight scale, matching the comparison chart's hover language.28800 → 28900to track the current count.Testing
bunx tsc --noEmit— cleanbiome check— cleannext build— 712/712 pages generated, 0 errors;/integrations,/models,/models/[provider],/pricingconfirmed dynamic (server-rendered on demand)Type of Change