feat(partners): add Vercel and Render Gold builder flows - #1204
Conversation
- 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
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
Included review availability: Your plan provides up to 4 included reviews per hour; 2 remain after this review. 📝 WalkthroughWalkthroughThe 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. ChangesPartner links and catalog
Estimated code review effort: 3 (Moderate) | ~25 minutes Merge Risk: ⚪ Minimal · up to 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
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Title checkExplanation 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 💡
🧪 Generate unit tests (beta)
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. Comment |
- 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
Deploying with
|
| 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 |
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.
fix: disambiguate library companion links
* 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>
…rs-1f48' into taren/vercel-v0-builder
|
@coderabbitai review |
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
Summary
Activates Vercel and Render as Gold partners and wires both providers through the application starter.
Builder flows
Partner placement
Analytics
Validation