Skip to content

Replace /stack with the Prisma Stack landing page#8002

Open
tylerhogarth wants to merge 3 commits into
mainfrom
stack/prisma-stack-redesign
Open

Replace /stack with the Prisma Stack landing page#8002
tylerhogarth wants to merge 3 commits into
mainfrom
stack/prisma-stack-redesign

Conversation

@tylerhogarth

@tylerhogarth tylerhogarth commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Replaces the old /stack "Prisma in your stack" link grid with a new Prisma Stack marketing page.

What's here

  1. Hero with the teal ppg glow, an H1 wordmark, and the value prop.
  2. An interactive "stack simplified" flow diagram: Compute, Postgres, Bun and TypeScript wired with SVG connectors, a cycling frontend framework, and a sub-ms latency link. Scales to fit and clips so it never overflows on mobile.
  3. A vertical framework carousel (marquee + a Prisma Compute card) that reads cleanly on small screens.
  4. A Bun API grid, a Prisma Postgres data section with shiki-highlighted code, and a closing CTA.

Implementation notes

  1. Built with Tailwind + @prisma/eclipse (Button, Card, Action, CodeBlock) and semantic design tokens, so it themes in light and dark.
  2. Only the diagram/marquee geometry lives in a scoped CSS module (tokens only, no hardcoded colours); everything else uses shared components, matching the compute and postgres pages.
  3. Product marks: Font Awesome icons plus inline Prisma and Bun marks drawn in currentColor so they take each tile's colour.

Verified with typecheck, oxlint, oxfmt, and a local render at desktop and mobile widths.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added a refreshed “Prisma Stack” landing page with redesigned sections, stronger visual hierarchy, and updated content.
    • Introduced new interactive visuals: animated stack diagram, vertical framework marquee, and scroll-to-reveal animations.
    • Added branded SVG marks for Bun and Prisma.
    • Surfaced new stack content for Bun APIs and Postgres extensions, including updated framework presentation.
  • Bug Fixes
    • Improved diagram rendering to better fit its container across screen sizes and after font loading, preventing unwanted horizontal overflow.

Rebuild the /stack route as a Prisma Stack marketing page: hero, an
interactive "stack simplified" flow diagram (Compute, Postgres, Bun,
TypeScript with SVG connectors and a cycling frontend framework), a
vertical framework carousel, a Bun API grid, a Prisma Postgres data
section with highlighted code, and a CTA.

Built with Tailwind + @prisma/eclipse (Button, Card, Action, CodeBlock)
and semantic design tokens so it themes in light and dark. Diagram and
marquee geometry live in a scoped CSS module; product marks use Font
Awesome plus inline Prisma and Bun marks tinted to currentColor.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
blog Ready Ready Preview, Comment Jul 3, 2026 1:31pm
docs Ready Ready Preview, Comment Jul 3, 2026 1:31pm
eclipse Ready Ready Preview, Comment Jul 3, 2026 1:31pm
site Ready Ready Preview, Comment Jul 3, 2026 1:31pm

Request Review

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

An error occurred during the review process. Please try again later.

Walkthrough

The stack page is redesigned with new framework, Bun API, and Postgres extension data, new Bun and Prisma SVG marks, a scroll-reveal wrapper, an animated connector-based diagram, a framework marquee carousel, Shiki-rendered code samples, and updated page styling.

Changes

Prisma Stack page redesign

Layer / File(s) Summary
Stack data and marks
apps/site/src/app/stack/stack-data.ts, apps/site/src/app/stack/bun-mark.tsx, apps/site/src/app/stack/prisma-mark.tsx
Replaces the stack category data with framework, Bun API, and Postgres extension exports, and adds Bun and Prisma inline SVG mark components.
Scroll-reveal wrapper
apps/site/src/app/stack/reveal.tsx
Adds a client-side Reveal component that observes intersection changes and toggles reveal classes on its rendered element.
Framework carousel
apps/site/src/app/stack/framework-carousel.tsx
Adds a vertical carousel that scrolls frameworks in a marquee and shows a Prisma Compute highlight card below it.
Animated stack diagram
apps/site/src/app/stack/stack-diagram.tsx
Adds the stack diagram component that measures node positions, draws SVG connector paths, cycles the frontend framework, and renders the diagram UI.
Stack page composition
apps/site/src/app/stack/page.tsx
Rewrites the page metadata, adds highlighted code samples and section headers, and composes the new hero, diagram, carousel, Bun, data, and final CTA sections.
Stack module styles
apps/site/src/app/stack/stack.module.css
Adds page theming, simplified stack layout, flow diagram geometry, node card variants, and reveal and reduced-motion styles.

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

Related PRs: None identified from the provided information.

Suggested labels: enhancement, ui, site

Suggested reviewers: None identified from the provided information.


A stack of tools, reworked and bright,
New marks, new data, new page light.
Diagrams link, carousels glide,
Reveal on scroll, with code beside.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: replacing the old /stack page with a new Prisma Stack landing page.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

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

@argos-ci

argos-ci Bot commented Jul 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Argos notifications ↗︎

Build Status Details Updated (UTC)
default (Inspect) ✅ No changes detected - Jul 3, 2026, 1:37 PM

Drop the bespoke .fw-* marquee CSS and fwscroll keyframe in favour of the
existing @/components/marquee (two-copy loop, marquee-up keyframes, fade
mask). Row styling moves to Tailwind. Trims the CSS module to the
diagram/bracket geometry that has no eclipse/Tailwind equivalent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
apps/site/src/app/stack/stack-diagram.tsx (2)

144-156: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Resize handler is unthrottled and triggers a full SVG rebuild each call.

drawFlow reflows the DOM (multiple offsetWidth/offsetTop reads) and rewrites svg.innerHTML on every resize event, which can fire dozens of times per second during a drag-resize. Debouncing (e.g. rAF-batched or a short setTimeout debounce) would avoid layout-thrash on the hot resize path.

⚡ Suggested debounce
   useEffect(() => {
     drawFlow();
-    window.addEventListener("resize", drawFlow);
+    let raf = 0;
+    const onResize = () => {
+      cancelAnimationFrame(raf);
+      raf = requestAnimationFrame(drawFlow);
+    };
+    window.addEventListener("resize", onResize);
     if (document.fonts?.ready) document.fonts.ready.then(drawFlow);
     const t1 = setTimeout(drawFlow, 300);
     const t2 = setTimeout(drawFlow, 900);
     return () => {
-      window.removeEventListener("resize", drawFlow);
+      window.removeEventListener("resize", onResize);
+      cancelAnimationFrame(raf);
       clearTimeout(t1);
       clearTimeout(t2);
     };
   }, [drawFlow]);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/site/src/app/stack/stack-diagram.tsx` around lines 144 - 156, The resize
path in stack-diagram.tsx is doing a full redraw on every window resize event
via drawFlow, which can cause layout thrash. Update the useEffect resize
listener to debounce or batch calls (for example with requestAnimationFrame or a
short timeout) so drawFlow runs at most once per resize burst, and make sure the
cleanup in the same effect cancels any pending scheduled redraws alongside
removing the listener.

295-295: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add aria-hidden to the dynamically-built connector SVG.

The <svg ref={svgRef}> element's content is entirely decorative (connector lines/arrowheads injected via innerHTML) but lacks aria-hidden, so assistive tech may attempt to parse the injected path markup.

♿ Suggested fix
-          <svg className={styles["flow-svg"]} ref={svgRef} />
+          <svg className={styles["flow-svg"]} ref={svgRef} aria-hidden />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/site/src/app/stack/stack-diagram.tsx` at line 295, The dynamically
generated connector SVG in stack-diagram.tsx is decorative only, so update the
SVG element rendered by the stack diagram component to include aria-hidden. Use
the existing svgRef-based element in the stack diagram render path and keep the
injected innerHTML connector markup unchanged; just mark the SVG as hidden from
assistive technology so screen readers ignore it.
apps/site/src/app/stack/reveal.tsx (1)

16-16: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

ref as never erases type safety for the polymorphic Tag.

Casting to never silences the compiler entirely rather than narrowing to a shared DOM type. Typing the ref as HTMLElement (the common ancestor of div/section) would keep type checking meaningful without the blunt cast.

♻️ Suggested tightening
-  const ref = useRef<HTMLDivElement>(null);
+  const ref = useRef<HTMLElement>(null);
...
-    <Tag ref={ref as never} className={`${styles.reveal} ${className ?? ""}`}>
+    <Tag ref={ref} className={`${styles.reveal} ${className ?? ""}`}>

Also applies to: 36-40

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/site/src/app/stack/reveal.tsx` at line 16, The polymorphic Tag ref
typing in reveal.tsx is being forced through a `never` cast, which bypasses
useful type checking. Update the `useRef`/`Tag` usage in the reveal component to
use a shared DOM type like `HTMLElement` instead of `HTMLDivElement` plus `ref
as never`, so the ref remains compatible across both `div` and `section`
variants. Make the same tightening where the ref is passed through the related
`Tag` render path so the compiler can still validate the element shape.
apps/site/src/app/stack/stack-data.ts (1)

1-28: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider whether framework accent colors should live in the design-token system.

Only the Next.js entry uses a semantic token (var(--color-foreground-neutral) / var(--color-background-neutral-weak)); every other framework hardcodes brand hex/rgba values. Since the PR emphasizes "semantic design tokens for light and dark theming," worth confirming these brand-specific hex codes are intentionally theme-agnostic (typical for logo brand colors) rather than an oversight.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/site/src/app/stack/stack-data.ts` around lines 1 - 28, The framework
color values in frameworks are mostly hardcoded brand hex/rgba strings while
only Next.js uses semantic tokens, so make the color source intentional and
consistent. If these badges should participate in light/dark theming, replace
the inline color/bg values with semantic design tokens; otherwise keep the brand
colors in a clearly separated brand palette and document that Framework entries
are intentionally theme-agnostic in stack-data.ts.
apps/site/src/app/stack/stack.module.css (1)

366-371: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extending prefers-reduced-motion coverage to swap/hover transitions.

The reduced-motion block turns off .reveal and .fw-track, but the framework-swap opacity transitions (.ss-fw, .n-frontend .node-title) and the .node:hover transform are left active. These are auto-triggered by the diagram's cycling framework display rather than user scroll, so motion-sensitive users would still see them animate.

♻️ Suggested addition
 `@media` (prefers-reduced-motion: reduce) {
   .reveal {
     opacity: 1;
     transform: none;
     transition: none;
   }
   .fw-track {
     animation: none;
   }
+  .ss-fw,
+  .node-title,
+  .node {
+    transition: none;
+  }
 }

Also applies to: 79-83, 248-252, 440-449

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/site/src/app/stack/stack.module.css` around lines 366 - 371, The
reduced-motion styles in stack.module.css only disable `.reveal` and
`.fw-track`, but the framework swap and hover animations still run. Extend the
existing `prefers-reduced-motion` block to also neutralize the `.ss-fw` /
`.n-frontend .node-title` opacity transitions and the `.node:hover` transform so
the diagram’s auto-cycling framework display stays motion-free for sensitive
users.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/site/src/app/stack/stack-diagram.tsx`:
- Around line 128-137: The cycling logic in stack-diagram.tsx leaves the inner
timeout unmanaged, so the callback in the useEffect around setInterval can still
run after unmount. Update the useEffect that schedules the framework swap to
store the timeout ID alongside the interval, and clear both in the cleanup
function; use the existing setSwapping, setIdx, and frameworks.length logic, but
make sure the delayed state updates are cancelled if the component unmounts
before the 240ms delay finishes.

---

Nitpick comments:
In `@apps/site/src/app/stack/reveal.tsx`:
- Line 16: The polymorphic Tag ref typing in reveal.tsx is being forced through
a `never` cast, which bypasses useful type checking. Update the `useRef`/`Tag`
usage in the reveal component to use a shared DOM type like `HTMLElement`
instead of `HTMLDivElement` plus `ref as never`, so the ref remains compatible
across both `div` and `section` variants. Make the same tightening where the ref
is passed through the related `Tag` render path so the compiler can still
validate the element shape.

In `@apps/site/src/app/stack/stack-data.ts`:
- Around line 1-28: The framework color values in frameworks are mostly
hardcoded brand hex/rgba strings while only Next.js uses semantic tokens, so
make the color source intentional and consistent. If these badges should
participate in light/dark theming, replace the inline color/bg values with
semantic design tokens; otherwise keep the brand colors in a clearly separated
brand palette and document that Framework entries are intentionally
theme-agnostic in stack-data.ts.

In `@apps/site/src/app/stack/stack-diagram.tsx`:
- Around line 144-156: The resize path in stack-diagram.tsx is doing a full
redraw on every window resize event via drawFlow, which can cause layout thrash.
Update the useEffect resize listener to debounce or batch calls (for example
with requestAnimationFrame or a short timeout) so drawFlow runs at most once per
resize burst, and make sure the cleanup in the same effect cancels any pending
scheduled redraws alongside removing the listener.
- Line 295: The dynamically generated connector SVG in stack-diagram.tsx is
decorative only, so update the SVG element rendered by the stack diagram
component to include aria-hidden. Use the existing svgRef-based element in the
stack diagram render path and keep the injected innerHTML connector markup
unchanged; just mark the SVG as hidden from assistive technology so screen
readers ignore it.

In `@apps/site/src/app/stack/stack.module.css`:
- Around line 366-371: The reduced-motion styles in stack.module.css only
disable `.reveal` and `.fw-track`, but the framework swap and hover animations
still run. Extend the existing `prefers-reduced-motion` block to also neutralize
the `.ss-fw` / `.n-frontend .node-title` opacity transitions and the
`.node:hover` transform so the diagram’s auto-cycling framework display stays
motion-free for sensitive users.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 47b02150-3960-4797-a503-4ee481044072

📥 Commits

Reviewing files that changed from the base of the PR and between 8ba14fb and 7e46ddf.

📒 Files selected for processing (8)
  • apps/site/src/app/stack/bun-mark.tsx
  • apps/site/src/app/stack/framework-carousel.tsx
  • apps/site/src/app/stack/page.tsx
  • apps/site/src/app/stack/prisma-mark.tsx
  • apps/site/src/app/stack/reveal.tsx
  • apps/site/src/app/stack/stack-data.ts
  • apps/site/src/app/stack/stack-diagram.tsx
  • apps/site/src/app/stack/stack.module.css

Comment thread apps/site/src/app/stack/stack-diagram.tsx
- Track and clear the framework-swap setTimeout on unmount
- rAF-batch the resize handler so drag-resize doesn't thrash layout
- aria-hidden the runtime-built connector SVG
- Drop the unused polymorphic `as` prop and `ref as never` cast in Reveal
- Extend prefers-reduced-motion to the diagram's swap + hover transitions

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@tylerhogarth

Copy link
Copy Markdown
Contributor Author

Addressed the review in 664bc31:

  1. Untracked setTimeout (actionable) — the swap timeout is now stored and cleared with the interval on unmount.
  2. Unthrottled resize handlerdrawFlow on resize is now rAF-batched (and the frame is cancelled on cleanup).
  3. aria-hidden on the connector SVG — added; it's decorative.
  4. ref as never in Reveal — the polymorphic as prop was unused, so I dropped it and render a plain div with a correctly typed HTMLDivElement ref.
  5. prefers-reduced-motion coverage — extended to the auto-cycling swap transitions (.ss-fw, .n-frontend .node-title) and the .node:hover transform.

Not changed — framework accent colours in stack-data.ts: these are the frameworks' own brand colours (React Router red, Astro orange, etc.), used only for the monogram tiles, mirroring how the site's LogoGrid uses per-brand assets. They aren't part of the Prisma palette, so promoting them into the design-token system would be miscategorising them. Kept as-is intentionally.

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.

1 participant