Skip to content

feat: DR-8328 Add compute page first stage#7859

Open
carlagn wants to merge 50 commits into
mainfrom
feat/DR-8328-compute-page
Open

feat: DR-8328 Add compute page first stage#7859
carlagn wants to merge 50 commits into
mainfrom
feat/DR-8328-compute-page

Conversation

@carlagn
Copy link
Copy Markdown
Contributor

@carlagn carlagn commented Apr 30, 2026

Summary by CodeRabbit

  • New Features

    • Launched Prisma Compute landing page with hero, features, workload comparison cards, starter templates, and a technical “How it works” section.
    • Added many interactive compute UI components: animated deploy terminal, runtime visuals, animated globe, workload/template cards, and deploy/copy actions.
  • Enhancements

    • Improved typography via local font loading and global font variables for consistent font stacks.
    • Homepage/card components support optional subtitles, images, custom children, and extra layout classes.

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 30, 2026

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

Project Deployment Actions Updated (UTC)
blog Ready Ready Preview, Comment Jun 4, 2026 1:47pm
docs Ready Ready Preview, Comment Jun 4, 2026 1:47pm
eclipse Ready Ready Preview, Comment Jun 4, 2026 1:47pm
site Ready Ready Preview, 💬 21 unresolved
✅ 15 resolved
Jun 4, 2026 1:47pm

Request Review

@argos-ci
Copy link
Copy Markdown

argos-ci Bot commented Apr 30, 2026

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

Build Status Details Updated (UTC)
default (Inspect) ⚠️ Changes detected (Review) 1 changed Jun 4, 2026, 1:53 PM

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 30, 2026

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

Walkthrough

Adds local Mona Sans fonts and CSS-variable bridges across apps, introduces a new Prisma Compute landing page with many interactive UI components (including a Cobe WebGL globe and theme tokens), extends homepage card APIs, updates global CSS (token additions and reformatting), and adds the cobe dependency.

Changes

Font system & global token bridge

Layer / File(s) Summary
Font registration
apps/docs/src/app/layout.tsx, apps/eclipse/src/app/layout.tsx, apps/site/src/app/layout.tsx
Add next/font/local usage to load Mona Sans and Mona Sans Mono, exposing generated CSS variables (e.g., --font-mona-sans, --font-mona-mono) and appending them to the <html> className.
Design-token bridge
apps/docs/src/app/global.css, apps/eclipse/src/app/global.css, apps/site/src/app/global.css
Add :root CSS variables --font-sans-display and --font-mono that map to the loaded font vars with quoted fallback stacks.
Wiring / formatting
same files as above
Update HTML root class usage to include font vars and reformat related CSS/JSX without semantic changes.

Compute landing page and interactive UI

Layer / File(s) Summary
Data / tokens
apps/site/src/app/compute/tokens.ts
Add dark/light color palettes, hexToRgb01 utility, COBE_MARKER_DOT_RGB, and cobeGlobe color config.
New visual components
apps/site/src/app/compute/components.tsx, apps/site/src/app/compute/how-it-works.tsx
Add many exported UI components (WorkloadCards, TemplateCards, ThemFragmentedCard, UsUnifiedCard, StatefulExecutionCard, DeployTerminal, HowItWorks) with internal subcomponents and interactive/animated logic (timers, effects, conditional renders).
Globe integration
apps/site/src/app/compute/CobeGlobe.tsx
Add client-side CobeGlobe component using cobe for an animated WebGL globe: markers/arcs configuration, RAF animation loop, drag-to-rotate handlers, ResizeObserver sizing, optional DOM label elements, and teardown cleanup.
Page composition / metadata
apps/site/src/app/compute/page.tsx
Add Compute landing page that composes the new components, defines FEATURES/DOES_IT_WORK/WHY_FEATURES data arrays, and exports generateMetadata() and default Page() rendering all sections.

Site/global CSS adjustments

Layer / File(s) Summary
Token additions
apps/site/src/app/global.css
Add :root mappings for --font-sans-display / --font-mono, add html, body { overscroll-behavior: none; }, and compute-specific overrides (.compute-box alignment and heading sizes).
Reformat / minor style adjustments
apps/site/src/app/global.css, apps/docs/src/app/global.css, apps/eclipse/src/app/global.css
Large reindent/reflow and minor selector/format changes; most property values and selectors retained.

Homepage cards & layout API updates

Layer / File(s) Summary
Data shape / types
apps/site/src/components/homepage/bento.tsx, apps/site/src/components/homepage/card-section/card-section.tsx
Make CardData fields optional: subtitle?, image?, add children?: React.ReactNode; add optional visualClass? on TwoColumnItem; add className?: string to Card and CardSection props.
Core rendering
same files
Conditionally render subtitle and children in Card; merge optional className into container className; adjust layout behavior when item.step is present.
Tests / formatting
same files
JSX/typing reformatted to multi-line destructuring and cn(...) usage; no behavioral changes beyond new optional fields.

Dependency addition

Layer / File(s) Summary
Package manifest
apps/site/package.json
Add dependency "cobe": "^2.0.1".

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.33% which is insufficient. The required threshold is 80.00%. 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 'feat: DR-8328 Add compute page first stage' clearly and specifically identifies the main change: adding the first stage of a compute page feature, tied to ticket DR-8328.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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 and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/site/src/app/global.css (1)

3-23: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The :root block is placed before other imports, contradicting the comment.

The comment states this block is "placed after all @import statements," but it actually appears between @import "tailwindcss" (line 1) and the remaining imports (lines 19–23). If fumadocs-ui/css/preset.css, @prisma/eclipse/styles/globals.css, or @prisma-docs/ui/styles also define --font-sans-display or --font-mono, those later imports will override your definitions due to cascade order.

Move the :root block after line 23 (after all imports) to match the comment's intent and ensure your font tokens win.

🔧 Suggested fix
 `@import` "tailwindcss";
 
-/* Promote next/font/local preloaded fonts into the design-token CSS variables.
-   This :root block is intentionally placed after all `@import` statements so it
-   wins the cascade (same :root specificity, later position = last write wins).
-   --font-mona-sans / --font-mona-mono are set on <html> by next/font/local and
-   inherited here; the quoted names act as a safe fallback if JS is disabled or
-   the font object is somehow not applied. */
-:root {
-    --font-sans-display:
-        var(--font-mona-sans, "Mona Sans VF"), "Inter", "Roboto",
-        "Helvetica Neue", "Arial Nova", "Nimbus Sans", "Arial", sans-serif;
-    --font-mono:
-        var(--font-mona-mono, "Mona Sans Mono VF"), ui-monospace,
-        "Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
-        "DejaVu Sans Mono", monospace;
-}
-
 `@import` "fumadocs-ui/css/shadcn.css";
 `@import` "fumadocs-ui/css/preset.css";
 
 `@import` "@prisma/eclipse/styles/globals.css";
 `@import` "@prisma-docs/ui/styles";
+
+/* Promote next/font/local preloaded fonts into the design-token CSS variables.
+   This :root block is intentionally placed after all `@import` statements so it
+   wins the cascade (same :root specificity, later position = last write wins).
+   --font-mona-sans / --font-mona-mono are set on <html> by next/font/local and
+   inherited here; the quoted names act as a safe fallback if JS is disabled or
+   the font object is somehow not applied. */
+:root {
+    --font-sans-display:
+        var(--font-mona-sans, "Mona Sans VF"), "Inter", "Roboto",
+        "Helvetica Neue", "Arial Nova", "Nimbus Sans", "Arial", sans-serif;
+    --font-mono:
+        var(--font-mona-mono, "Mona Sans Mono VF"), ui-monospace,
+        "Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
+        "DejaVu Sans Mono", monospace;
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/global.css` around lines 3 - 23, The :root block that
defines --font-sans-display and --font-mono is currently before several `@import`
statements, contradicting the comment and risking those later imports overriding
the variables; move the entire :root { ... } block so it appears after all
`@import` statements (i.e., after the `@prisma-docs/ui/styles` import) so the :root
declarations for --font-sans-display and --font-mono win the cascade and match
the file comment.
🧹 Nitpick comments (1)
apps/site/src/components/homepage/bento.tsx (1)

174-181: ⚡ Quick win

Place className last so consumer overrides reliably apply.

At Line 175, custom classes are prepended, so conflicting defaults (e.g., width/order utilities) can win. Move className to the end of cn(...).

Proposed change
       className={cn(
-        className,
         "box",
         "box-visible",
         "w-full",
         isCenterCard && "w-full md:order-0",
         color,
+        className,
       )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/components/homepage/bento.tsx` around lines 174 - 181, The
current cn(...) call places the prop className first so consumer-provided
classes can be overridden by default utilities; update the cn invocation in the
component (the call that builds the className using cn, className, "box",
"box-visible", "w-full", isCenterCard && "w-full md:order-0", color) by moving
the className argument to the end of the argument list so consumer overrides
reliably apply (keep the rest of arguments and condition isCenterCard logic
unchanged).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/docs/src/app/global.css`:
- Around line 9-22: The :root rule block currently appears before several
`@import` rules (e.g., `@import` "fumadocs-ui/css/shadcn.css", `@import`
"fumadocs-ui/css/preset.css", `@import` "fumadocs-openapi/css/preset.css", `@import`
"@prisma-docs/ui/styles"), which violates CSS `@import` ordering; move the entire
:root { ... } block so it comes after all `@import` statements to ensure those
imports are recognized by browsers and build tools (adjust the file so all
`@import` lines appear first, then the :root block).

In `@apps/site/src/app/compute/components.tsx`:
- Around line 92-99: In DrawbackItem, the icon class string contains a double
space ("fa-regular  fa-xmark"); fix it by changing the className to use a single
space between class names (e.g., "fa-regular fa-xmark") so it matches the rest
of the codebase and avoids inconsistent formatting; update the className in the
DrawbackItem component accordingly.

In `@apps/site/src/app/compute/page.tsx`:
- Around line 273-300: The generateMetadata() function currently returns
copy-pasted Query Insights SEO values; update it to reflect the Compute page by
changing title to "Prisma Compute", replacing the description with a
Compute-relevant blurb, changing openGraph.title to "Prisma Compute",
openGraph.url to "https://www.prisma.io/compute", and openGraph.images[0].url to
the Compute image (e.g., "/og/og-compute.png"); ensure twitter/site/creator
remain correct and that all occurrences inside generateMetadata() and its
openGraph object are updated consistently.

---

Outside diff comments:
In `@apps/site/src/app/global.css`:
- Around line 3-23: The :root block that defines --font-sans-display and
--font-mono is currently before several `@import` statements, contradicting the
comment and risking those later imports overriding the variables; move the
entire :root { ... } block so it appears after all `@import` statements (i.e.,
after the `@prisma-docs/ui/styles` import) so the :root declarations for
--font-sans-display and --font-mono win the cascade and match the file comment.

---

Nitpick comments:
In `@apps/site/src/components/homepage/bento.tsx`:
- Around line 174-181: The current cn(...) call places the prop className first
so consumer-provided classes can be overridden by default utilities; update the
cn invocation in the component (the call that builds the className using cn,
className, "box", "box-visible", "w-full", isCenterCard && "w-full md:order-0",
color) by moving the className argument to the end of the argument list so
consumer overrides reliably apply (keep the rest of arguments and condition
isCenterCard logic unchanged).
🪄 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: 5dec4c3f-c8dc-4318-92bc-b90d00c1acdb

📥 Commits

Reviewing files that changed from the base of the PR and between 30587d8 and d7c463f.

📒 Files selected for processing (11)
  • apps/docs/src/app/global.css
  • apps/docs/src/app/layout.tsx
  • apps/eclipse/src/app/global.css
  • apps/eclipse/src/app/layout.tsx
  • apps/site/src/app/compute/components.tsx
  • apps/site/src/app/compute/how-it-works.tsx
  • apps/site/src/app/compute/page.tsx
  • apps/site/src/app/global.css
  • apps/site/src/app/layout.tsx
  • apps/site/src/components/homepage/bento.tsx
  • apps/site/src/components/homepage/card-section/card-section.tsx

Comment on lines +9 to 22
:root {
--font-sans-display:
var(--font-mona-sans, "Mona Sans VF"), "Inter", "Roboto",
"Helvetica Neue", "Arial Nova", "Nimbus Sans", "Arial", sans-serif;
--font-mono:
var(--font-mona-mono, "Mona Sans Mono VF"), ui-monospace,
"Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
"DejaVu Sans Mono", monospace;
}
@import "fumadocs-ui/css/shadcn.css";
@import "fumadocs-ui/css/preset.css";
@import "fumadocs-openapi/css/preset.css";
@import "@prisma-docs/ui/styles";
@source "../../node_modules/streamdown/dist/*.js";
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.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

In standard CSS, what happens to @importrules that appear after a qualified rule like:root { ... }? Also, for Tailwind CSS v4 with Lightning CSS/PostCSS, does the toolchain safely process late @import rules in source CSS?

💡 Result:

In standard CSS, @import rules that appear after a qualified rule like :root { ... } are invalid and ignored by user agents (browsers). The CSS specification (Cascading and Inheritance Levels 3-6) requires all @import rules to precede all other valid at-rules and style rules (except @charset, @layer statements, and @supports-condition), or else they are invalid. A qualified rule is a style rule (selector + block), so any @import after it is ignored. This is confirmed by MDN, W3C specs, and browser behavior. For Tailwind CSS v4 with Lightning CSS/PostCSS, the toolchain does not safely process late @import rules in source CSS. Tailwind v4 uses Lightning CSS for processing, which enforces the same CSS validity rules: late @import rules cause errors or are invalid. Tailwind's built-in @import handling (replacing postcss-import) processes valid @import rules at the top, inlining them while preserving order and conditions, but late @imports remain invalid per CSS rules and Lightning CSS bundling docs explicitly state they cause errors. Issues in Tailwind repos confirm late @imports (e.g., after @import "tailwindcss") are ignored or fail, requiring them at the top (e.g., before Tailwind import for fonts). No evidence of special handling for late @imports; source CSS must follow standard CSS positioning rules.

Citations:


Move the :root block below all @import rules—this placement violates CSS specifications.

Per the CSS Cascade specification (Levels 3–6), all @import rules must precede any qualified rules (like :root { ... }). Any @import that appears after a qualified rule is invalid and ignored by browsers and build tools alike. Tailwind CSS v4 with Lightning CSS enforces these same rules strictly—it doesn't provide special handling for late imports.

The current code at lines 9–17 places :root before the imports at lines 18–22, which means fumadocs-ui, fumadocs-openapi, and @prisma-docs/ui styles will be silently dropped during the build, leaving your UI incomplete.

Proposed fix
 `@import` "tailwindcss";
 `@import` "@prisma/eclipse/styles/globals.css";
-
-:root {
-    --font-sans-display:
-        var(--font-mona-sans, "Mona Sans VF"), "Inter", "Roboto",
-        "Helvetica Neue", "Arial Nova", "Nimbus Sans", "Arial", sans-serif;
-    --font-mono:
-        var(--font-mona-mono, "Mona Sans Mono VF"), ui-monospace,
-        "Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
-        "DejaVu Sans Mono", monospace;
-}
 `@import` "fumadocs-ui/css/shadcn.css";
 `@import` "fumadocs-ui/css/preset.css";
 `@import` "fumadocs-openapi/css/preset.css";
 `@import` "@prisma-docs/ui/styles";
 `@source` "../../node_modules/streamdown/dist/*.js";
+
+:root {
+    --font-sans-display:
+        var(--font-mona-sans, "Mona Sans VF"), "Inter", "Roboto",
+        "Helvetica Neue", "Arial Nova", "Nimbus Sans", "Arial", sans-serif;
+    --font-mono:
+        var(--font-mona-mono, "Mona Sans Mono VF"), ui-monospace,
+        "Cascadia Code", "Source Code Pro", "Menlo", "Consolas",
+        "DejaVu Sans Mono", monospace;
+}
🧰 Tools
🪛 Stylelint (17.9.0)

[error] 18-18: Invalid position for @import rule (no-invalid-position-at-import-rule)

(no-invalid-position-at-import-rule)


[error] 19-19: Invalid position for @import rule (no-invalid-position-at-import-rule)

(no-invalid-position-at-import-rule)


[error] 20-20: Invalid position for @import rule (no-invalid-position-at-import-rule)

(no-invalid-position-at-import-rule)


[error] 21-21: Invalid position for @import rule (no-invalid-position-at-import-rule)

(no-invalid-position-at-import-rule)


[error] 22-22: Unexpected unknown at-rule "@source" (scss/at-rule-no-unknown)

(scss/at-rule-no-unknown)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/docs/src/app/global.css` around lines 9 - 22, The :root rule block
currently appears before several `@import` rules (e.g., `@import`
"fumadocs-ui/css/shadcn.css", `@import` "fumadocs-ui/css/preset.css", `@import`
"fumadocs-openapi/css/preset.css", `@import` "@prisma-docs/ui/styles"), which
violates CSS `@import` ordering; move the entire :root { ... } block so it comes
after all `@import` statements to ensure those imports are recognized by browsers
and build tools (adjust the file so all `@import` lines appear first, then the
:root block).

Comment thread apps/site/src/app/compute/components.tsx
Comment thread apps/site/src/app/compute/page.tsx
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/site/src/app/compute/how-it-works.tsx`:
- Around line 1548-1551: The TabsTrigger components (rendered with key/value
using tab.value) can become icon-only on mobile when the label span is hidden,
so add an explicit accessible name by passing aria-label={tab.label} (or
aria-labelledby pointing to the label span's id) to each TabsTrigger; update the
TabsTrigger render where value={tab.value} to include aria-label={tab.label} so
inactive mobile tabs retain an accessible name.
- Around line 460-462: The copy icon buttons (the elements rendering <i
className="fa-regular fa-copy" /> inside clickable <button> in the HowItWorks
component) are interactive but not wired; change them to be non-interactive
until the copy action is implemented by marking them disabled and removing them
from keyboard focus, add accessibility labeling and a clear disabled affordance:
add disabled and aria-disabled="true", aria-label="Copy (disabled)" (or "Copy
code (disabled)"), title="Copy disabled until implemented", and set
tabIndex={-1} or replace the <button> with a non-interactive element that still
exposes the label (e.g., a <span> with aria-label) and a visual disabled style
(e.g., cursor-not-allowed); apply the same change for both occurrences that
render the fa-copy icon so keyboard/screen-reader users aren’t presented with a
broken control.
- Line 3: The file imports only hooks (useEffect, useRef, useState) but later
uses the React namespace type React.ReactNode; update the import to include the
ReactNode type (e.g., import { useEffect, useRef, useState, ReactNode } from
"react") and replace any React.ReactNode usages if desired with the imported
ReactNode to satisfy strict TS typing (references: the existing import line and
the React.ReactNode usage in the component/type declarations).
🪄 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: cdccffc5-d523-416d-90cd-b6405ebacf15

📥 Commits

Reviewing files that changed from the base of the PR and between 5621589 and bba9660.

📒 Files selected for processing (1)
  • apps/site/src/app/compute/how-it-works.tsx

@@ -0,0 +1,1626 @@
"use client";

import { useEffect, useRef, useState } from "react";
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.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify if React namespace types are used without explicit type imports,
# and inspect TS compiler options that influence UMD global access.
rg -n --type=tsx 'React\.ReactNode|React\.[A-Z][A-Za-z]+' 
fd -i 'tsconfig*.json' -x sh -c 'echo "---- $1 ----"; sed -n "1,220p" "$1"' sh {}

Repository: prisma/web

Length of output: 5043


🏁 Script executed:

cat -n apps/site/src/app/compute/how-it-works.tsx | head -200

Repository: prisma/web

Length of output: 7300


🏁 Script executed:

grep -n 'React\.' apps/site/src/app/compute/how-it-works.tsx

Repository: prisma/web

Length of output: 127


Import ReactNode type to fix React.ReactNode reference

Line 185 references React.ReactNode, but the React namespace isn't imported on line 3—only the hooks are. With "strict": true in your tsconfig, this fails type-checking. Import the type directly instead of relying on the namespace.

Suggested fix
-import { useEffect, useRef, useState } from "react";
+import { useEffect, useRef, useState, type ReactNode } from "react";
...
-function AnimatedLine({ children }: { children: React.ReactNode }) {
+function AnimatedLine({ children }: { children: ReactNode }) {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/compute/how-it-works.tsx` at line 3, The file imports only
hooks (useEffect, useRef, useState) but later uses the React namespace type
React.ReactNode; update the import to include the ReactNode type (e.g., import {
useEffect, useRef, useState, ReactNode } from "react") and replace any
React.ReactNode usages if desired with the imported ReactNode to satisfy strict
TS typing (references: the existing import line and the React.ReactNode usage in
the component/type declarations).

Comment thread apps/site/src/app/compute/how-it-works.tsx
Comment on lines +1548 to +1551
<TabsTrigger
key={tab.value}
value={tab.value}
className={cn(
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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Inactive mobile tabs can lose an accessible name

Because the label is hidden on mobile for inactive tabs (Lines 1576-1582), those TabsTriggers may become icon-only with no accessible text. Add an explicit name on the trigger.

Suggested fix
 <TabsTrigger
   key={tab.value}
   value={tab.value}
+  aria-label={tab.label}
   className={cn(

Also applies to: 1576-1582

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/compute/how-it-works.tsx` around lines 1548 - 1551, The
TabsTrigger components (rendered with key/value using tab.value) can become
icon-only on mobile when the label span is hidden, so add an explicit accessible
name by passing aria-label={tab.label} (or aria-labelledby pointing to the label
span's id) to each TabsTrigger; update the TabsTrigger render where
value={tab.value} to include aria-label={tab.label} so inactive mobile tabs
retain an accessible name.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (1)
apps/site/src/app/compute/page.tsx (1)

273-300: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Metadata is still for Query Insights, not Compute.

Line 275, Line 279, Line 282, and Line 287/290 still describe the Query Insights page, so SEO indexing and social previews will be incorrect for /compute.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/compute/page.tsx` around lines 273 - 300, The
generateMetadata function currently returns metadata for "Prisma Query Insights"
which is incorrect for the Compute page; update the title, description,
openGraph.title, openGraph.description, openGraph.url, openGraph.images (url and
alt), and twitter fields (card/site/creator if different) inside
generateMetadata to reflect the Compute page content and URL (e.g., replace
"Prisma Query Insights" strings and "https://www.prisma.io/query-insights" with
the appropriate Compute page title, description, og image and URL), ensuring all
references to Query Insights are removed so SEO and social previews target
Compute.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/site/src/app/compute/page.tsx`:
- Around line 339-343: Two anchor elements on the compute page (the <a> tags
with className="flex items-center gap-2" containing the <span>Read the
docs</span>) wrongly point to /docs/postgres/faq#query-insights; update both
occurrences to the correct Compute docs URL (replace
/docs/postgres/faq#query-insights with the appropriate compute docs path, e.g.
/docs/compute or the canonical compute docs anchor) so the "Read the docs" CTAs
link to the relevant Compute documentation.
- Line 487: Fix the Tailwind class typo in the div that renders the footer
background: replace the incorrect "bg-cente" token in the className string with
"bg-center" so the bg-contain background image is properly centered; locate the
div containing "bg-[url('/illustrations/homepage/footer_grid.svg')]" and update
its class list accordingly.

---

Duplicate comments:
In `@apps/site/src/app/compute/page.tsx`:
- Around line 273-300: The generateMetadata function currently returns metadata
for "Prisma Query Insights" which is incorrect for the Compute page; update the
title, description, openGraph.title, openGraph.description, openGraph.url,
openGraph.images (url and alt), and twitter fields (card/site/creator if
different) inside generateMetadata to reflect the Compute page content and URL
(e.g., replace "Prisma Query Insights" strings and
"https://www.prisma.io/query-insights" with the appropriate Compute page title,
description, og image and URL), ensuring all references to Query Insights are
removed so SEO and social previews target Compute.
🪄 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: 01665d78-4e71-4639-89c0-2e5598928e26

📥 Commits

Reviewing files that changed from the base of the PR and between bba9660 and 674de46.

📒 Files selected for processing (1)
  • apps/site/src/app/compute/page.tsx

Comment thread apps/site/src/app/compute/page.tsx Outdated
</div>
</section>
<div className="before:inset-x-20 before:inset-y-0 before:absolute relative before:content-[''] before:pointer-events-none before:-z-0 rounded-full before:bg-[radial-gradient(64.76%_75.81%_at_50%_50%,var(--color-background-ppg)_0%,var(--color-background-default)_70%)]">
<div className="inset-x-20 inset-y-0 bg-[url('/illustrations/homepage/footer_grid.svg')] bg-contain bg-cente absolute inset-0 z-1 pointer-events-none" />
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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Tailwind class typo drops background centering.

Line 487 uses bg-cente, so the centering utility won’t apply.

Suggested fix
-        <div className="inset-x-20 inset-y-0 bg-[url('/illustrations/homepage/footer_grid.svg')] bg-contain bg-cente absolute inset-0 z-1 pointer-events-none" />
+        <div className="inset-x-20 inset-y-0 bg-[url('/illustrations/homepage/footer_grid.svg')] bg-contain bg-center absolute inset-0 z-1 pointer-events-none" />
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="inset-x-20 inset-y-0 bg-[url('/illustrations/homepage/footer_grid.svg')] bg-contain bg-cente absolute inset-0 z-1 pointer-events-none" />
<div className="inset-x-20 inset-y-0 bg-[url('/illustrations/homepage/footer_grid.svg')] bg-contain bg-center absolute inset-0 z-1 pointer-events-none" />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/compute/page.tsx` at line 487, Fix the Tailwind class typo
in the div that renders the footer background: replace the incorrect "bg-cente"
token in the className string with "bg-center" so the bg-contain background
image is properly centered; locate the div containing
"bg-[url('/illustrations/homepage/footer_grid.svg')]" and update its class list
accordingly.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

🍈 Lychee Link Check Report

67 links: ✅ 2 OK | 🚫 0 errors | 🔀 0 redirects | 👻 65 excluded

✅ All links are working!


Full Statistics Table
Status Count
✅ Successful 2
🔀 Redirected 0
👻 Excluded 65
🚫 Errors 0
⛔ Unsupported 0
⏳ Timeouts 0
❓ Unknown 0

ankur-arch and others added 6 commits June 4, 2026 11:09
…7929)

* copy(compute): align page copy with messaging skills

Apply the Prisma communication skills (prisma-copy-review +
prisma-product-messaging) to the Compute landing page copy.

- Remove all em dashes from user-facing copy (page hero/meta, feature
  bullets, comparison card benefits, How-it-works tabs).
- Cut fluff and vague intensifiers: "actually", "ultra-low latency",
  "grows into jobs", and the "felt as good as the code" line, which is
  reframed around the integrated-platform narrative from the
  positioning doc (fewer separate build/hosting/database tools).
- Replace dramatic fragments ("Push code. It runs.", "Sockets stay
  open. Streams flow uninterrupted.") with single workflow sentences,
  and name the mechanism (long-lived process on Bun) in the hero/meta.
- Fix a broken cross-reference ("See the AI workloads section above" —
  no such section exists).
- Mark capabilities not yet covered by the Compute docs as "Coming
  soon": co-located database (feature card + bento + How-it-works tab)
  and reliability automation (auto scaling/recovery/OOM).

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

* copy(compute): second skill pass on empty language + SEO

Drop the "Coming soon" markers and tighten remaining empty language,
plus SEO fields.

- Remove "Coming soon" badges/label (co-located feature card, two
  bento cards, How-it-works tab).
- Empty/slogan language replaced with concrete claims:
  - "Compute keeps it all together." -> "One service for your app,
    assets, and jobs." (matches the comparison cards below it)
  - "No runtime constraints." -> "not a constrained edge runtime"
- SEO: page title and OG title now carry the primary keyword phrase
  ("Deploy TypeScript apps to production") instead of the bare brand
  name; meta description tightened under ~155 chars; OG image alt made
  descriptive.

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

* copy(compute): adjust AI-agent card to avoid co-location claim

The "Building an AI agent?" card carried a green YES badge while
claiming "co-located memory", which reads as an availability promise
for the database co-location story. Reword to "in-process memory",
which describes the long-lived stateful runtime the page already
presents as available, so the card no longer implies co-location
availability.

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

---------
* copy(site): align touched marketing pages with messaging skills

Apply the Prisma communication skills (prisma-copy-review +
prisma-product-messaging) to the user-facing copy on the marketing
pages that PR #7859 touches. Copy-only edits; no structural, logic, or
factual/pricing changes.

- Remove em/en dashes from prose (startups testimonial + body, etc.).
- Cut fluff, empty slogans, and vague intensifiers (seamless, powerful,
  "ship with confidence", "stay ahead in the game", "peak performance",
  "ultimate tool", "scale without limits", "core competencies", ...)
  and replace with concrete workflow/outcome language.
- Fix mid-sentence capitalization (Build, Fortify, Grows, Pricing,
  Database) and tighten run-ons.
- Correct product naming: Prisma Accelerate, Prisma Console (was
  "Prisma Data Platform"/"Platform Console"), VS Code (was VSCode),
  Management API; "Prisma ORM" instead of "the Prisma ORM".

Pages: orm, postgres, enterprise, mcp, startups, query-insights,
partners, community, ecosystem, studio.

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

* copy(site): make homepage + footer product naming consistent

Align the homepage and footer with the positioning doc so all three
core products (Prisma ORM, Prisma Postgres, Prisma Compute) are named
and reachable consistently.

- Hero: name Prisma ORM, Prisma Postgres, and Prisma Compute in the
  subhead (was generic "managed Postgres"/"production-ready compute"),
  add the missing Prisma Postgres CTA, and rename "Explore Compute" to
  "Explore Prisma Compute". Hero now offers all three product CTAs.
- "Start with Prisma" footer-CTA section: add the missing Prisma
  Compute CTA so all three products are reachable.
- Platform-path card: "Explore Compute" -> "Explore Prisma Compute".
- Footer Product column: add Prisma Postgres and Prisma Compute (were
  missing) and use full "Prisma ORM" naming.
- Site metadata description: name the three products.

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

* copy(site): single console CTA on homepage + compute heroes

- Homepage hero: replace the three Explore product buttons with one
  primary "Try Prisma" CTA linking to the Console
  (pris.ly/pdp, utm_campaign=home); move the product links below the
  CTA as secondary text links (Prisma ORM / Prisma Postgres /
  Prisma Compute).
- Compute hero: replace "Deploy a template" + "Read the docs" with one
  "Try Prisma Compute" CTA linking to the Console
  (utm_campaign=compute).
- Homepage subhead: "production-ready compute" -> "serverless
  TypeScript compute" per messaging guidance (Compute production
  readiness needs caution).

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

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…page

# Conflicts:
#	apps/site/src/app/(index)/page.tsx
#	apps/site/src/app/layout.tsx
#	apps/site/src/components/homepage/card-section/card-section.tsx
#	apps/site/src/instrumentation-client.ts
#	pnpm-lock.yaml
- Hero: lead with the stitched-stack problem, name the integrated platform
  once, and collapse to a single console CTA (drop secondary product links)
- Footer CTA: one primary "Try it out in the Console" action (pris.ly/pdp)
- Remove the duplicate "Run TypeScript the way it actually works" section
- Nav (site + blog): move Compute to the top of Products, fix wrong ORM
  description copied from Postgres
- Compute: use "@prisma/cli@latest app deploy" instead of "prisma deploy"
- Compute: point launch post at pris.ly/compute-blog-pb and docs at
  pris.ly/compute-docs, both with standardised UTM params

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

- Hero title: "One Platform for Your TypeScript App" (was "A Database
  Platform for TypeScript Developers"); structured-data name kept in sync
- Tighten hero subhead: drop the second product re-listing, collapse to
  "Prisma brings all three into one platform, from schema to production"
- Compute deploy animation: service URLs now use the real
  <service>.iad1.prisma.build domain instead of *.prisma.run

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The merge conflict resolution kept the branch's consent-gated init, but
that code was inherited shared code (#7864) only reformatted on this
branch, and main deliberately reverted it in #7884. Take main's version.

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