fix: prevent Markdown and Highlight landing link crashes - #1202
Conversation
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
tanstack-com | 53de61c | Commit Preview URL Branch Preview URL |
Aug 31 2026, 11:56 AM |
|
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 (2)
Included review availability: Your plan provides up to 4 included reviews per hour; 3 remain after this review. 📝 WalkthroughWalkthroughThe landing page companion links now target explicit ChangesLanding page route corrections
Estimated code review effort: 1 (Trivial) | ~5 minutes Merge Risk: ⚪ Minimal · up to The PR corrects reciprocal Markdown and Highlight landing-page links so navigation and preloading use the intended dedicated routes; no actionable merge-blocking risk remains after normal checks and review. Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ 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 |
fix: disambiguate library companion links
* feat(partners): add Vercel and Render as Gold partners - 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 * Remove partner score field from types and objects - 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 Render SVGs with official Brand Kit wordmarks - 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 * Crop Render SVG viewBox to wordmark bounds Remove ~400px whitespace padding from official Brand Kit SVGs. viewBox 400 400 2106.6 400 crops to actual path content bbox. * Wire Render per-placement UTM content URLs 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. * ci: apply automated fixes * Fix Gold partner layout in builder * Update Vercel partner positioning * Keep Gold partner cells equal width * fix: prevent Markdown and Highlight landing link crashes (#1202) fix: disambiguate library companion links * feat(ds): Dialog, Drawer and Takeover primitives — overlay audit (#1205) * 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> * Update Vercel partner logos * feat: add Vercel and Render builder actions * Update Vercel partner logos * fix: infer Render deployment partner * fix: disambiguate Render deployment requests * chore: update TanStack Create --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Kevin Van Cott <kevinvandy656@gmail.com> Co-authored-by: Andy <andy@werooney.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Summary
Fixes #1200
Testing
pnpm testSummary by CodeRabbit