Skip to content

feat(partners): add Vercel and Render Gold builder flows - #1204

Merged
tannerlinsley merged 19 commits into
mainfrom
cursor/vercel-render-gold-partners-1f48
Sep 1, 2026
Merged

feat(partners): add Vercel and Render Gold builder flows#1204
tannerlinsley merged 19 commits into
mainfrom
cursor/vercel-render-gold-partners-1f48

Conversation

@tannerlinsley

@tannerlinsley tannerlinsley commented Aug 31, 2026

Copy link
Copy Markdown
Member

Summary

Activates Vercel and Render as Gold partners and wires both providers through the application starter.

Builder flows

  • Selecting Vercel generates the Vercel CLI deployment recipe and opens the generated prompt in v0
  • Selecting Render generates the Render CLI deployment recipe, creates the user's GitHub repository, and opens Render's Blueprint flow
  • Prompt-based actions say Build with Lovable, Build with Netlify, or Build with v0
  • Repository-based hosting actions continue to say Deploy
  • React and Solid worker manifests load both deployment targets
  • Render language detection recognizes hosting intent without treating ordinary uses of the verb “render” as a provider selection

Partner placement

  • Reactivates Vercel as an active Gold partner
  • Adds Render as an active Gold partner
  • Adds current logos, partner resources, placement metadata, and campaign attribution
  • Keeps Gold partner placement and hosting constraints consistent across the directory, homepage, docs, and builder

Analytics

  • Tracks prompt-builder handoffs separately from deploy-dialog actions
  • Preserves the existing Netlify start event and records Vercel attribution when opening v0

Validation

  • 477 tests pass, 1 skipped, 0 failed
  • TypeScript passes
  • Lint passes with zero warnings
  • Production build passes
  • Builder actions were checked in the browser for Vercel, Render, Netlify, Lovable, Cloudflare, and Railway

- Reactivate Vercel as Gold tier partner (was inactive Previous Partner)
- Add Render as new Gold tier partner
- Add Render logo SVGs (render-black.svg, render-white.svg)
- Both partners have hosting unique constraint
- UTMs: utm_source=tanstack&utm_medium=referral&utm_campaign=gold-launch
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0bc02443-7040-4283-b976-bcaf6013501b

📥 Commits

Reviewing files that changed from the base of the PR and between 8d9a405 and 6da1d78.

📒 Files selected for processing (1)
  • src/utils/partners.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/utils/partners.tsx

Included review availability: Your plan provides up to 4 included reviews per hour; 2 remain after this review.


📝 Walkthrough

Walkthrough

The partner catalog activates Vercel, adds Render as an active gold-tier hosting partner, removes partner scores, applies placement-specific URLs across partner surfaces, and updates the seven-partner starter grid layout.

Changes

Partner links and catalog

Layer / File(s) Summary
Partner placement contracts and score removal
src/utils/partners.tsx, src/utils/partner-placement.ts, src/utils/useDeploymentProviderPlacement.ts, src/components/LibraryLayout.tsx
Partner types, definitions, placement inputs, and deployment provider selections no longer include score. Legacy priority comparison now uses partner identity.
Hosting partner definitions
src/utils/partners.tsx
Vercel is now an active gold-tier hosting partner. Render was added with hosting metadata, documentation, deployment details, and light and dark logo assets.
Placement URL resolution and surface integration
src/utils/partners.tsx, src/components/LibraryLayout.tsx, src/components/PartnersGrid.tsx, src/components/ds/ui/PartnerRail.tsx, tests/application-starter-partners.test.ts
getPartnerHref adds Render UTM content for supported placements. Library, grid, and rail links use the resolved URL for navigation and click-tracking host extraction. Tests cover Render and Vercel behavior.
Starter partner grid layout
src/components/application-starter/prompt-parts.tsx
The seven-partner large grid now uses responsive two-, four-, and twelve-column layouts. The first four partners use three-column spans at large widths, and the remaining three use four-column spans.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to 6da1d

This change adds Vercel and Render as Gold partners and updates partner ranking types and placement links; no actionable merge-blocking risk remains after normal checks and review.

Sequence Diagram(s)

sequenceDiagram
  participant PartnerSurface
  participant getPartnerHref
  participant PartnerURL
  PartnerSurface->>getPartnerHref: partner and placement
  getPartnerHref->>PartnerURL: add Render UTM content when supported
  getPartnerHref-->>PartnerSurface: resolved href
  PartnerSurface->>PartnerURL: parse resolved host for click tracking
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 8 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: adding Render and reactivating Vercel as Gold partners. It is concise and specific, although “add Vercel” is slightly imprecise because Vercel is being re…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title clearly identifies the main change: adding Render and reactivating Vercel as Gold partners. It is concise and specific, although “add Vercel” is slightly imprecise because Vercel is being reactivated.

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/vercel-render-gold-partners-1f48

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@tannerlinsley
tannerlinsley marked this pull request as ready for review August 31, 2026 17:09
- Remove score from PartnerBase, RailPartner, PartnerForPlacement, DocsPartner types
- Remove score from all partner objects in partners.tsx
- Update compareLegacyPartnerPriority to use identity/name comparison
- Update useDeploymentProviderPlacement to remove score mapping

Tier remains as the ranking mechanism.
- Replace 110x21 scrapes with official wordmarks (viewBox 0 0 2909 1200)
- 7 path elements: logomark + RENDER letters
- Black fill for render-black.svg, white fill for render-white.svg
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 31, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
tanstack-com 5eb86e1 Commit Preview URL

Branch Preview URL
Sep 01 2026, 01:16 AM

cursoragent and others added 16 commits August 31, 2026 18:15
Remove ~400px whitespace padding from official Brand Kit SVGs.
viewBox 400 400 2106.6 400 crops to actual path content bbox.
Add utm_content parameter for Render partner on approved surfaces:
- home_grid
- library_grid
- docs_rail
- docs_strip

Other placements and partners use their default href unchanged.

Implemented via getPartnerHref helper that checks partner id and placement.
* feat(ds): add Dialog and Drawer primitives, migrate 9 overlays

Audited every overlay on the site and found 11 independent implementations
across 6 positional postures. All 4 hand-rolled ones (no Radix) were missing
focus trapping, focus restoration, or Escape-to-dismiss — the admin roles
confirm was a destructive action a keyboard user could not dismiss.

Adds two primitives, both Radix-backed with no opt-out:

- Dialog  — centered. Header/Body/Footer, sizes xs–xl, scrolling body capped
            at the viewport, tinted header (media + tint) for third-party
            brands, and DialogStatus for outcome panels.
- Drawer  — edge-anchored. side="right|left|bottom", sizes sm–2xl, and `fit`
            to size the panel to its content instead of filling the edge.

Migrated onto them: LoginModal, AvatarCropModal, the npm-stats combine dialog,
the admin roles confirm, BaselineSection, BuilderAssistant's model connections,
both deploy dialogs, and BuilderGuideDialog (Drawer). The two deploy dialogs
were byte-identical 1,065-line twins; they now share one header and one status
panel and are fully off raw Tailwind colours.

Tokens the primitives needed and the system did not have:

- --color-scrim, heavier in dark (0.65 vs 0.5) — equal alpha reads as weaker
  separation over an already-dark page. Replaces 7 hand-picked black/NN values.
- --z-scrim / --z-overlay, set to the 999/1000 pair already used by the
  majority, so adopting them moves nothing. Five stacking families existed.
- Real dialog/drawer keyframes. The animate-in / fade-in-0 / zoom-in-95 classes
  used elsewhere come from tailwindcss-animate, which is NOT installed — they
  match zero CSS rules and animate nothing. Timing reuses the existing
  --motion-duration-* and --motion-ease-* tokens.

Also rebalances the text scale. text-muted was #756c5b on #111111 — 3.64:1,
below the 4.5:1 AA floor, so all muted copy in dark mode was failing. muted now
takes the old secondary value and secondary lightens, adding ds-neutral-150 and
-350 as ramp midpoints (not yet in Figma). Both roles now read at matched
weight across themes: secondary 12.0/11.3, muted 7.9/7.8.

Fixes DsKit's Swatch reading its hex once on mount, which left the palette and
semantic pages showing #FFFFFF next to a black chip after a theme toggle.

Documented at /ds/overlays (the audit itself), /ds/dialog and /ds/drawer.

Not migrated, each blocked on a posture not yet built: SearchModal
(command palette), CartDrawer (anchored panel), ProductDrawer (bottom sheet
plus cross-panel chrome), LibrariesOverlay (full-bleed).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* feat(ds): add Drawer anchor prop, migrate CartDrawer

Completes the audit's sixth posture — the anchored panel.

It turned out not to need a new component. CartDrawer already matched
`Drawer side="right" fit` in every respect except one: its top edge cleared the
site header. That offset had nowhere to live, which is the only reason it was a
separate implementation. So this adds `anchor="viewport" | "navbar"` rather
than a near-duplicate of Drawer.

`navbar` reads --navbar-height with the same 56px fallback the navbar itself
uses, and shortens the `fit` height cap by the same amount so a content-sized
panel still cannot run off the bottom. Verified against a live 58px navbar:
viewport anchors at 12px, navbar at 66px.

CartDrawer now uses it, and settles the open question about the shop's parallel
token namespace: the primitive supplies posture and behaviour while the caller
passes `shop-scope` and its surface colours through className. Panel geometry is
unchanged at 384px wide; the right gutter normalises from 16px to the DS 12px.

That leaves ProductDrawer as the last hand-rolled overlay on the site.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* feat(ds): migrate ProductDrawer to the DS Drawer

The last hand-rolled overlay on the site. It was a bare <aside> plus a scrim
<button>, so it had no focus trap, no focus restoration and no scroll lock —
it hand-rolled only an Escape listener. Radix now supplies all four.

`side="bottom" fit` matched its geometry almost exactly: both are centred at
calc(100% - 2rem) capped at 1400px with rounded-t-2xl and no bottom border.

The prev/next arrows move from viewport-fixed on a third z-tier (z-[71]) to
absolute inside the panel. This is required, not cosmetic: Radix traps focus
inside the panel, so viewport-level siblings would have become unreachable by
keyboard. It also retires the third z-tier the audit flagged. Verified that
absolute children inside the fixed, animated, overflow-hidden panel position
against the panel and are not clipped.

Product logic is preserved verbatim — the displayHandle / hasOpened derived
state still gates opening until the product query resolves, so the sheet never
animates in over a skeleton. It now drives Radix's `open` instead of a manual
`isAnimatedOpen` class toggle.

shop.css: drops the orphaned .shop-product-scrim rule, and .shop-product-sheet
keeps only its custom property. Height and motion come from the DS panel, with
the sheet's navbar-aware cap applied as a max-h utility so there is exactly one
source of truth rather than a stylesheet-order race with the `fit` cap.

NOT VERIFIED IN THE BROWSER: /shop requires SHOPIFY_PRIVATE_STOREFRONT_TOKEN,
which is not set locally, so the drawer cannot be opened. Types, lint and tests
pass and the arrow-positioning mechanism was verified in isolation, but this
needs a pass with Shopify credentials before it ships.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* feat(ds): add Takeover primitive, migrate LibrariesOverlay

The full-bleed posture — the fifth of the audit's six, and the last one with a
shipping caller other than SearchModal.

Unlike Dialog and Drawer there is no panel: the content element is itself the
viewport-filling scroll container, with the close affordance floating over it.
That is why it is a third component rather than a Drawer variant — a drawer is
defined by having a panel anchored to an edge, and this has neither.

Its bespoke glass treatment becomes the DS's second scrim, which is exactly the
pair the audit asked for after finding seven hand-picked values: --color-scrim
for panels, and `glass` for takeovers that should feel like a new surface
rather than a layer over the old one. Verified identical to the original at
blur(40px) saturate(1.5) over rgb(0 0 0 / 0.95) in dark.

Backdrop dismissal routes through the same close button the component already
renders rather than a second dismissal path that could drift from it — Radix
never sees a click as "outside" when the content fills the viewport.

LibrariesBrowser also drops its direct @radix-ui/react-dialog import in favour
of TakeoverTitle / TakeoverDescription, so content components no longer reach
past the design system for their accessible name.

Verified in the real overlay: glass scrim intact, role=dialog, labelled and
described, custom scrollbar preserved, focus trapped inside.

The audit's Scrim row is now closed apart from SearchModal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* refactor(ds): put SearchModal on the DS scrim and stacking tokens

Closes the last bespoke scrim and the last bespoke z-tier in the overlay audit.

Deliberately does NOT extract a CommandPalette. SearchModal is already Radix,
already accessible, and already has real data-state animation, so an extraction
buys no correctness on 3,766 load-bearing lines. It would also need five
caller-specific escape hatches: forceMount on Portal/Overlay/Content to keep
InstantSearch state alive between opens; animation applied to an inner panel
because Content is a full-bleed hit area on mobile; the top-anchored responsive
posture; a conditional sm:bottom-4 for full-height results; and a scrim that
lightens at xl. Five hatches for one caller is a primitive shaped entirely by
its first consumer. The reasoning is recorded in the audit metadata so it
outlives the conversation — revisit if a second palette ever appears.

What did change is tokens only, 7 lines:

- The overlay moves to bg-scrim. The xl override stays as the one deliberate
  exception: past that width the palette covers a small share of the screen and
  the full scrim reads heavier than the interaction warrants.
- z-[999] / z-[1000] become --z-scrim / --z-overlay, on both the palette and
  the AI dock that shares the tier.
- Adds --z-above-overlay (1200) for chrome that must float over an open
  overlay — the palette's tooltips had nowhere else to go. That completes the
  stacking scale; no overlay declares its own tier any more.

Verified live: scrim resolves to --color-scrim below xl and to the intended
lighter value above it, tiers read 999/1000, the top-4 anchoring and the
component's own enter animation are untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(ds): replace inert animation classes with real keyframes

Every `animate-in` / `animate-out` / `fade-in-0` / `zoom-in-95` /
`slide-in-from-*` class in the codebase came from tailwindcss-animate, which is
not installed. They matched no CSS rule and animated nothing — the Tooltip,
the workbench dropdown, the game HUD and the intro overlay have all been
static since they were written.

The `duration-300` / `duration-500` utilities sitting alongside them were inert
for the same work: Tailwind's `duration-*` sets transition-duration, not
animation-duration, so it never applied to an animation either.

Replaces them with real keyframes on the existing motion tokens, following the
pattern already used for Dialog, Drawer and Takeover rather than adding a
dependency:

- [data-ds-pop] for Radix-driven transient surfaces (Tooltip, the workbench
  dropdown menu), with enter and exit.
- .ds-enter-fade / .ds-enter-rise / .ds-enter-pop for content that mounts
  already open (game HUD callouts, intro overlay).

Tooltip does NOT report data-state="open". It uses `delayed-open` after the
hover delay and `instant-open` inside the skip-delay window, so the selector
has to match all three — matching only `open` leaves tooltips silently
un-animated, which is how this was caught.

`transform` carries scale and offset only, never a centring translate: Tailwind
v4 compiles `-translate-x-1/2` to the independent `translate` property, which
composes with `transform` rather than replacing it. That also leaves Radix's
--radix-*-content-transform-origin free to govern where a popover grows from.

Also aligns Tooltip's stacking from a bare z-1300 onto --z-above-overlay, so
"floats above an open overlay" has one name rather than two values.

Verified live: the tooltip animates ds-pop-in at 180ms with the DS easing on
tier 1200.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Tanner Linsley <tannerlinsley@gmail.com>
@tannerlinsley tannerlinsley changed the title feat(partners): add Vercel and Render as Gold partners feat(partners): add Vercel and Render Gold builder flows Sep 1, 2026
@tannerlinsley

Copy link
Copy Markdown
Member Author

@coderabbitai review

@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​tanstack/​create@​0.70.0981008698100

View full report

@tannerlinsley
tannerlinsley requested a review from jherr September 1, 2026 01:20
@tannerlinsley
tannerlinsley merged commit 6413eb7 into main Sep 1, 2026
6 checks passed
@tannerlinsley
tannerlinsley deleted the cursor/vercel-render-gold-partners-1f48 branch September 1, 2026 01:20
@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown
⚠️ Action not completed

Pull request is closed.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants