From 9c0529071b5fae2fda32cd875f0f8d906e396147 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 03:54:01 +0000 Subject: [PATCH 01/14] Add database section (from client) --- apps/site/src/app/enterprise/page.tsx | 265 ++++++++++++++++++++++++ apps/site/src/components/technology.tsx | 36 ++++ 2 files changed, 301 insertions(+) create mode 100644 apps/site/src/app/enterprise/page.tsx create mode 100644 apps/site/src/components/technology.tsx diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx new file mode 100644 index 0000000000..425c1922a4 --- /dev/null +++ b/apps/site/src/app/enterprise/page.tsx @@ -0,0 +1,265 @@ +import type { Metadata } from "next"; +import { + SITE_HOME_DESCRIPTION, + SITE_HOME_TITLE, +} from "../../lib/blog-metadata"; +import { Button, Card, Action } from "@prisma/eclipse"; +import { CopyCode } from "@/components/homepage/copy-btn"; +import LogoParade from "@prisma-docs/ui/components/logo-parade"; +import React from "react"; +import { Bento } from "@/components/homepage/bento"; +import { CardSection } from "@/components/homepage/card-section/card-section"; +import review from "../../data/homepage.json"; +import Testimonials from "../../components/homepage/testimonials"; +import { cn } from "@/lib/cn"; +import { Technology } from "@/components/technology"; +const twoCol = [ + { + content: ( + <> +

+ Postgres that
fits your stack. +

+

+ Works with your existing stack, wherever you deploy.Your choice of + ORM, frameworks, and tools, they all just connect. +

+ + ), + imageUrl: null, + imageAlt: null, + mobileImageUrl: null, + mobileImageAlt: null, + logos: null, + useDefaultLogos: true, + visualPosition: "right" as const, + visualType: "logoGrid" as const, + }, + { + content: ( + <> +

+ Real Postgres.
Better experience. +

+

+ The PostgreSQL millions know and trust in production, ready in seconds + with zero configuration. Automatic backups, observability and + compliance. +

+ + ), + imageUrl: "/illustrations/homepage/real_ppg", + imageAlt: "Real Postgres", + mobileImageUrl: "/illustrations/homepage/real_ppg_mobile", + mobileImageAlt: "Real PPG mobile", + logos: null, + useDefaultLogos: false, + visualPosition: "left" as const, + visualType: "image" as const, + }, +]; +const databases = { + title: "Supported Databases", + list: [ + { + name: "PostgreSQL", + icon: "/icons/companies/postgres.svg", + url: "/", + }, + { + name: "MySQL", + icon: "/icons/technologies/mysqlsimple.svg", + url: "/", + }, + { + name: "MariaDB", + icon: "/icons/technologies/mariadb.svg", + url: "/", + }, + { + name: "SQLite", + icon: "/icons/companies/sqlite.svg", + url: "/", + }, + { + name: "SQL Server", + icon: "/icons/companies/sqlserver.svg", + url: "/", + }, + { + name: "CockroachDB", + icon: "/icons/companies/cockroachdb.svg", + url: "/", + }, + { + name: "PlanetScale", + icon: "/icons/companies/planetscale.svg", + url: "/", + }, + { + name: "MongoDB", + icon: "/icons/technologies/mongodbsimple.svg", + url: "/", + }, + ], +}; +const frameworks = { + title: "Selected Frameworks", + description: + "Easy to integrate into your framework of choice, Prisma simplifies database access, saves repetitive CRUD boilerplate and increases type safety.", + list: [ + { + name: "React", + icon: "/icons/technologies/react.svg", + url: "/react", + }, + { + name: "Next.js", + icon: "/icons/technologies/nextjs.svg", + url: "/nextjs", + }, + { + name: "NestJS", + icon: "/icons/technologies/nestjs.svg", + url: "/nestjs", + }, + { + name: "Apollo", + icon: "/icons/technologies/apollo.svg", + url: "/apollo", + }, + { + name: "Hapi", + icon: "/icons/technologies/hapi.svg", + url: "/hapi", + }, + { + name: "GraphQL", + icon: "/icons/technologies/graphql.svg", + url: "/graphql", + }, + { + name: "ExpressJS", + icon: "/icons/technologies/express.svg", + url: "/express", + }, + { + name: "Redwood", + icon: "/icons/technologies/redwoodjs.svg", + url: "/redwood", + }, + ], +}; +export const metadata: Metadata = { + title: SITE_HOME_TITLE, + description: SITE_HOME_DESCRIPTION, +}; + +export default function SiteHome() { + return ( +
+
+
+

+ Postgres,
+ perfectly managed. +

+

+ Real Postgres with the developer experience and infrastructure to + ship faster. +

+
+ + + $ + +  npx prisma init + + + +
+
+
+
+
+
+

+ Works with your favourite +
+ databases and framework +

+ +
+ {databases.title} +
+
+ {databases.list.map((db) => ( + + + {db.name} + + + ))} +
+
+ +
+
+ {frameworks.title} +
+

+ {frameworks.description} +

+
+
+ {frameworks.list.map((fw) => ( + + + {fw.name} + + + ))} +
+
+
+ + +
+
+
+
+
+ ); +} diff --git a/apps/site/src/components/technology.tsx b/apps/site/src/components/technology.tsx new file mode 100644 index 0000000000..ab24464528 --- /dev/null +++ b/apps/site/src/components/technology.tsx @@ -0,0 +1,36 @@ +"use client"; +import { + Button, + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@prisma/eclipse"; +import { useState } from "react"; + +export const Technology = ({ + children, + text, + url, +}: { + children: React.ReactNode; + text: string; + url?: string; +}) => { + return ( + + + + + + {text} + + + ); +}; From 34771189b30b1877c2fa2b9fe103862c581ceb90 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 05:15:57 +0000 Subject: [PATCH 02/14] Add first grid section --- apps/site/package.json | 3 + .../enterprise/build_fortify_grow.riv | Bin 0 -> 110243 bytes .../Illustrations/Diagrams/Code/Type3.svg | 6 + .../illustrations/enterprise/enterprise_0.svg | 19 ++ .../enterprise/enterprise_0_light.svg | 15 + .../illustrations/enterprise/enterprise_1.svg | 27 ++ .../enterprise/enterprise_1_light.svg | 23 ++ .../illustrations/enterprise/enterprise_2.svg | 37 +++ .../enterprise/enterprise_2_light.svg | 37 +++ apps/site/src/app/enterprise/page.tsx | 273 ++++++++++-------- apps/site/src/components/animation.tsx | 64 ++++ .../homepage/card-section/card-section.tsx | 8 +- apps/site/src/components/logo-parade.tsx | 156 ++++++++++ pnpm-lock.yaml | 54 ++++ 14 files changed, 604 insertions(+), 118 deletions(-) create mode 100644 apps/site/public/animations/enterprise/build_fortify_grow.riv create mode 100644 apps/site/public/illustrations/enterprise/Illustrations/Diagrams/Code/Type3.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_0.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_0_light.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_1.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_1_light.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_2.svg create mode 100644 apps/site/public/illustrations/enterprise/enterprise_2_light.svg create mode 100644 apps/site/src/components/animation.tsx create mode 100644 apps/site/src/components/logo-parade.tsx diff --git a/apps/site/package.json b/apps/site/package.json index c9d6de8357..f67cd85b10 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -16,6 +16,8 @@ "@prisma-docs/ui": "workspace:*", "@prisma/eclipse": "workspace:^", "@react-three/fiber": "^9.5.0", + "@rive-app/react-canvas": "^4.27.3", + "@rive-app/react-webgl2": "^4.27.3", "cors": "^2.8.6", "html-react-parser": "^5.2.17", "lucide-react": "catalog:", @@ -24,6 +26,7 @@ "posthog-js": "catalog:", "react": "catalog:", "react-dom": "catalog:", + "react-intersection-observer": "^10.0.3", "react-tweet": "catalog:", "remark-directive": "catalog:", "tailwind-merge": "catalog:", diff --git a/apps/site/public/animations/enterprise/build_fortify_grow.riv b/apps/site/public/animations/enterprise/build_fortify_grow.riv new file mode 100644 index 0000000000000000000000000000000000000000..8ad4e9dc5cb2096b711a1607e6801e58b7ab42c4 GIT binary patch literal 110243 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 literal 0 HcmV?d00001 diff --git a/apps/site/public/illustrations/enterprise/Illustrations/Diagrams/Code/Type3.svg b/apps/site/public/illustrations/enterprise/Illustrations/Diagrams/Code/Type3.svg new file mode 100644 index 0000000000..78dfa6497f --- /dev/null +++ b/apps/site/public/illustrations/enterprise/Illustrations/Diagrams/Code/Type3.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_0.svg b/apps/site/public/illustrations/enterprise/enterprise_0.svg new file mode 100644 index 0000000000..a10db98acc --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_0.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_0_light.svg b/apps/site/public/illustrations/enterprise/enterprise_0_light.svg new file mode 100644 index 0000000000..a0ea478802 --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_0_light.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_1.svg b/apps/site/public/illustrations/enterprise/enterprise_1.svg new file mode 100644 index 0000000000..a5cf9592d4 --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_1.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_1_light.svg b/apps/site/public/illustrations/enterprise/enterprise_1_light.svg new file mode 100644 index 0000000000..a2e312a734 --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_1_light.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_2.svg b/apps/site/public/illustrations/enterprise/enterprise_2.svg new file mode 100644 index 0000000000..56ca9665dd --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_2.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/public/illustrations/enterprise/enterprise_2_light.svg b/apps/site/public/illustrations/enterprise/enterprise_2_light.svg new file mode 100644 index 0000000000..2260f0324d --- /dev/null +++ b/apps/site/public/illustrations/enterprise/enterprise_2_light.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx index 425c1922a4..456021bc65 100644 --- a/apps/site/src/app/enterprise/page.tsx +++ b/apps/site/src/app/enterprise/page.tsx @@ -1,3 +1,4 @@ +import LogoParade from "@/components/logo-parade"; import type { Metadata } from "next"; import { SITE_HOME_DESCRIPTION, @@ -5,7 +6,6 @@ import { } from "../../lib/blog-metadata"; import { Button, Card, Action } from "@prisma/eclipse"; import { CopyCode } from "@/components/homepage/copy-btn"; -import LogoParade from "@prisma-docs/ui/components/logo-parade"; import React from "react"; import { Bento } from "@/components/homepage/bento"; import { CardSection } from "@/components/homepage/card-section/card-section"; @@ -13,16 +13,28 @@ import review from "../../data/homepage.json"; import Testimonials from "../../components/homepage/testimonials"; import { cn } from "@/lib/cn"; import { Technology } from "@/components/technology"; -const twoCol = [ +import { FitHeight } from "@rive-app/react-canvas"; +import { Animation } from "@/components/animation"; + +const first = [ { content: ( <>

- Postgres that
fits your stack. + Boost your
+ application’s lifecycle

-

- Works with your existing stack, wherever you deploy.Your choice of - ORM, frameworks, and tools, they all just connect. +

+ By integrating Prisma into your development ecosystem, you leverage + its capabilities to Build robust, adaptable applications with less + code and fewer errors and also Fortify your database interactions for + peak performance right from the start. +

+

+ As your application Grows, our platform products Accelerate and Prisma + Postgres ensure that your data layer can adapt and scale, supporting + increased traffic and requirements without sacrificing performance or + security.

), @@ -31,31 +43,23 @@ const twoCol = [ mobileImageUrl: null, mobileImageAlt: null, logos: null, - useDefaultLogos: true, - visualPosition: "right" as const, - visualType: "logoGrid" as const, - }, - { - content: ( - <> -

- Real Postgres.
Better experience. -

-

- The PostgreSQL millions know and trust in production, ready in seconds - with zero configuration. Automatic backups, observability and - compliance. -

- + other: ( + canvas]:max-w-full", + "[&>canvas]:h-auto!", + "[&>div]:flex", + "[&>div]:items-center", + "[&>div]:justify-center", + )} + /> ), - imageUrl: "/illustrations/homepage/real_ppg", - imageAlt: "Real Postgres", - mobileImageUrl: "/illustrations/homepage/real_ppg_mobile", - mobileImageAlt: "Real PPG mobile", - logos: null, - useDefaultLogos: false, + useDefaultLogos: true, visualPosition: "left" as const, - visualType: "image" as const, + visualType: "other" as const, }, ]; const databases = { @@ -150,6 +154,30 @@ const frameworks = { }, ], }; + +const complexities = [ + { + title: "Improved developer experience", + image: "/illustrations/enterprise/enterprise_0", + subtitle: + "Prisma ORM enhances code clarity and modularity. New team members can onboard quickly, thanks to the high level of abstraction and the intuitive query syntax.", + icon: "fa-regular fa-cubes-stacked", + }, + { + title: "Increased productivity", + image: "/illustrations/enterprise/enterprise_1", + subtitle: + "The Prisma ORM Client API comes with an intuitive querying interface and editor auto-completion, allowing developers to focus on business logic instead of database syntax.", + icon: "fa-regular fa-code", + }, + { + title: "Bring your own database", + subtitle: + "Prisma ORM’s extensive compatibility enables teams to work with different databases and switch without significant changes to the application logic.", + icon: "fa-regular fa-database", + }, +]; + export const metadata: Metadata = { title: SITE_HOME_TITLE, description: SITE_HOME_DESCRIPTION, @@ -158,106 +186,121 @@ export const metadata: Metadata = { export default function SiteHome() { return (
-
-
-

- Postgres,
- perfectly managed. -

+
+
+
+
+
+ Enterprise & Solution Providers +
+

+ Streamline your +
development workflow +

+

- Real Postgres with the developer experience and infrastructure to - ship faster. + Prisma acts as your comprehensive enterprise data toolset, + simplifying database interactions and reducing complexity so + developers can focus on business logic.

- - $ - -  npx prisma init - - -
-
-
-
-

- Works with your favourite -
- databases and framework -

- -
- {databases.title} -
-
- {databases.list.map((db) => ( - - - {db.name} - - - ))} -
-
- -
-
- {frameworks.title} -
-

- {frameworks.description} -

-
-
- {frameworks.list.map((fw) => ( - - - {fw.name} - - - ))} -
-
-
- - -
-
+
+
+ Trusted by teams at +
+ +
+
+ +
+
+
+

+ Leave the database complexities to us +

+

+ Focus on core competencies of your team, rather than building and + managing complex infrastructure components. +

+
+
+ {complexities.map((card: any, index: number) => { + const last = index === complexities.length - 1; + return ( + +
+
+
+ + + +

+ {card.title} +

+
+

+ {card.subtitle} +

+ {!last && ( +
+ Enterprise + Enterprise +
+ )} +
+ {last && ( +
+
+ {databases.title} +
+
+ {databases.list.map((db) => ( + + + {db.name} + + + ))} +
+
+ )} +
+
+ ); + })}
diff --git a/apps/site/src/components/animation.tsx b/apps/site/src/components/animation.tsx new file mode 100644 index 0000000000..c1d9dd857e --- /dev/null +++ b/apps/site/src/components/animation.tsx @@ -0,0 +1,64 @@ +"use client"; +import { useRive, Layout, Alignment } from "@rive-app/react-webgl2"; +import { useEffect, useState } from "react"; +import { useInView } from "react-intersection-observer"; + +interface AnimationProps { + name: string; + className?: string; + fit?: reactCanvas.Fit; + threshold?: number; + style?: React.CSSProperties; + autoplay?: boolean; +} + +export const Animation = ({ + name, + className, + fit, + threshold, + style, + autoplay, +}: AnimationProps) => { + const [isVisible, setVisible] = useState(false); + + const [reference, isInView] = useInView({ + threshold: threshold ? threshold : 0.2, + }); + + const { rive, RiveComponent } = useRive({ + src: `/animations/${name}.riv`, + autoplay: autoplay || false, + onLoad: () => console.log("Rive loaded successfully"), + onLoadError: (e) => console.error("Rive load error:", e), + layout: new Layout({ + fit: fit, + alignment: Alignment.Center, + }), + }); + + useEffect(() => { + if (isInView) setVisible(true); + else setVisible(false); + }, [isInView]); + + useEffect(() => { + if (rive) { + if (isVisible) { + rive.play(); + } else rive.pause(); + } + return () => rive?.pause(); // <- this + }, [isVisible, rive]); + + return ( +
+ +
+ ); +}; diff --git a/apps/site/src/components/homepage/card-section/card-section.tsx b/apps/site/src/components/homepage/card-section/card-section.tsx index 3537d0b6f8..469f344a2c 100644 --- a/apps/site/src/components/homepage/card-section/card-section.tsx +++ b/apps/site/src/components/homepage/card-section/card-section.tsx @@ -14,7 +14,8 @@ interface TwoColumnItem { logos: any[] | null; useDefaultLogos: boolean; visualPosition: "left" | "right"; - visualType: "logoGrid" | "image"; + visualType: "logoGrid" | "image" | "other"; + other?: ReactNode; } interface CardSectionProps { @@ -58,11 +59,12 @@ export const CardSection = ({ cardSection }: CardSectionProps) => { item.visualType === "logoGrid" ? "max-w-full" : "lg:w-full", )} > + {item.visualType === "other" && item.other} {item.visualType === "logoGrid" && item.useDefaultLogos && ( )} {item.visualType === "image" && item.imageUrl && ( - <> +
{ alt={item.mobileImageAlt || ""} /> )} - +
)} diff --git a/apps/site/src/components/logo-parade.tsx b/apps/site/src/components/logo-parade.tsx new file mode 100644 index 0000000000..1b44e5c7af --- /dev/null +++ b/apps/site/src/components/logo-parade.tsx @@ -0,0 +1,156 @@ +"use client"; +import { useState, useRef } from "react"; + +const logoParade = [ + { + label: "Gatsby", + imageUrl: `/icons/companies/gatsby.svg`, + url: "https://www.gatsbyjs.com", + width: 107, + height: 29, + }, + { + label: "Rapha", + imageUrl: `/icons/companies/rapha.svg`, + url: "https://www.rapha.cc/", + width: 85, + height: 39, + }, + { + label: "Poppy", + imageUrl: `/icons/companies/poppy.svg`, + url: "https://poppy.be/", + width: 110, + height: 40, + }, + { + label: "Twiga", + imageUrl: `/icons/companies/twiga.svg`, + url: "https://twiga.com/", + width: 55, + height: 61, + }, + { + label: "Panther", + imageUrl: `/icons/companies/panther.svg`, + url: " https://www.panther.co/", + width: 122, + height: 28, + }, + { + label: "Grover", + imageUrl: `/icons/companies/grover.svg`, + url: "https://www.grover.com/", + width: 97, + height: 26, + }, + { + label: "Invisible", + imageUrl: `/icons/companies/invisible.svg`, + url: "https://inv.tech/", + width: 182, + height: 36, + }, + { + label: "Elsevier", + imageUrl: `/icons/companies/elsevier.svg`, + url: "https://www.elsevier.com/", + width: 177, + height: 48, + }, + { + label: "Tryg", + imageUrl: `/icons/companies/tryg.svg`, + url: "https://www.tryg.com/", + width: 105, + height: 45, + }, + { + label: "IHI", + imageUrl: `/icons/companies/ihi.svg`, + url: "https://www.ihiterrasun.com/", + width: 225, + height: 55, + }, + { + label: "Insta", + imageUrl: `/icons/companies/insta.svg`, + url: "", + width: 225, + height: 55, + }, + { + label: "Outrider", + imageUrl: `/icons/companies/outrider.svg`, + url: "https://outrider.org/", + width: 225, + height: 55, + }, + { + label: "Oxio", + imageUrl: `/icons/companies/oxio.svg`, + url: "https://oxio.com/", + width: 225, + height: 55, + }, + { + label: "Southpole", + imageUrl: `/icons/companies/southpole.svg`, + url: "https://www.southpole.com/", + width: 173, + height: 32, + }, +]; + +const speeds = { slow: "100s", normal: "30s", fast: "15s" }; + +const keyframes = ` + @keyframes scroll-left { + 0% { transform: translateX(0); } + 100% { transform: translateX(-50%); } + } +`; + +export default function LogoParade() { + const [speed, setSpeed] = useState("normal"); + const [paused, setPaused] = useState(false); + const allItems = [...logoParade, ...logoParade]; + + return ( +
+ + {/* Ticker wrapper */} +
+ {/* Fade edges */} +
+
+ + {/* Track */} +
setPaused(true)} + onMouseLeave={() => setPaused(false)} + > + {allItems.map((item, i) => ( +
+ {item.label} +
+ ))} +
+
+
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b24cda31ba..656d71b39e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -591,6 +591,12 @@ importers: '@react-three/fiber': specifier: ^9.5.0 version: 9.5.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(three@0.183.2) + '@rive-app/react-canvas': + specifier: ^4.27.3 + version: 4.27.3(react@19.2.4) + '@rive-app/react-webgl2': + specifier: ^4.27.3 + version: 4.27.3(react@19.2.4) cors: specifier: ^2.8.6 version: 2.8.6 @@ -615,6 +621,9 @@ importers: react-dom: specifier: 'catalog:' version: 19.2.4(react@19.2.4) + react-intersection-observer: + specifier: ^10.0.3 + version: 10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-tweet: specifier: 'catalog:' version: 3.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -2984,6 +2993,22 @@ packages: react-redux: optional: true + '@rive-app/canvas@2.35.4': + resolution: {integrity: sha512-Blyi0jeBnRvgU9JQsFW3MZkmAdhKakSmqp6lZeOupFENjd8OGt4YrR1E0btH7soO9lae7m8N76MtnBwupNzxSw==} + + '@rive-app/react-canvas@4.27.3': + resolution: {integrity: sha512-DpxtvuRAtXWmS6sM+thuatKrRy1fT79GpShPe6sXxzKRLI1ZhNEOk+VRqawCZxNfedTf5B03ZDoEFxtCeRYphg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 + + '@rive-app/react-webgl2@4.27.3': + resolution: {integrity: sha512-f+i0w/iipxwJWOH2J+0u2se0OdTM5PNWqwndRMO6EwOG5YsHHOc9opmFQCViiwkzT6Sr3vU/hqdrZy8tno6exw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 + + '@rive-app/webgl2@2.35.4': + resolution: {integrity: sha512-1dX1axIC6WgrvCkBsH1tjHjPz3xXGoDUuu3CZMdnlCOtGmASq4WM7LOPvuggmLgGl5mLHX9VF7Nr/AakpcMeUw==} + '@rolldown/binding-android-arm64@1.0.0-rc.3': resolution: {integrity: sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5351,6 +5376,15 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 + react-intersection-observer@10.0.3: + resolution: {integrity: sha512-luICLMbs0zxTO/70Zy7K5jOXkABPEVSAF8T3FdZUlctsrIaPLmx8TZe2SSA+CY2HGWfz2INyNTnp82pxNNsShA==} + peerDependencies: + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + react-dom: + optional: true + react-is@19.2.4: resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} @@ -7990,6 +8024,20 @@ snapshots: react: 19.2.4 react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1) + '@rive-app/canvas@2.35.4': {} + + '@rive-app/react-canvas@4.27.3(react@19.2.4)': + dependencies: + '@rive-app/canvas': 2.35.4 + react: 19.2.4 + + '@rive-app/react-webgl2@4.27.3(react@19.2.4)': + dependencies: + '@rive-app/webgl2': 2.35.4 + react: 19.2.4 + + '@rive-app/webgl2@2.35.4': {} + '@rolldown/binding-android-arm64@1.0.0-rc.3': optional: true @@ -10653,6 +10701,12 @@ snapshots: dependencies: react: 19.2.4 + react-intersection-observer@10.0.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) + react-is@19.2.4: {} react-medium-image-zoom@5.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): From 420b700f800edd68605af5f72bdc532cf86fb5f2 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 05:21:12 +0000 Subject: [PATCH 03/14] Remove unnecessary package --- apps/site/package.json | 1 - apps/site/src/app/enterprise/page.tsx | 1 - pnpm-lock.yaml | 187 +++++--------------------- 3 files changed, 33 insertions(+), 156 deletions(-) diff --git a/apps/site/package.json b/apps/site/package.json index f67cd85b10..7ce8d2745b 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -16,7 +16,6 @@ "@prisma-docs/ui": "workspace:*", "@prisma/eclipse": "workspace:^", "@react-three/fiber": "^9.5.0", - "@rive-app/react-canvas": "^4.27.3", "@rive-app/react-webgl2": "^4.27.3", "cors": "^2.8.6", "html-react-parser": "^5.2.17", diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx index 456021bc65..1471084cda 100644 --- a/apps/site/src/app/enterprise/page.tsx +++ b/apps/site/src/app/enterprise/page.tsx @@ -13,7 +13,6 @@ import review from "../../data/homepage.json"; import Testimonials from "../../components/homepage/testimonials"; import { cn } from "@/lib/cn"; import { Technology } from "@/components/technology"; -import { FitHeight } from "@rive-app/react-canvas"; import { Animation } from "@/components/animation"; const first = [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 656d71b39e..f99595ed9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,69 +6,9 @@ settings: catalogs: default: - '@argos-ci/playwright': - specifier: ^6.4.1 - version: 6.4.2 '@base-ui/react': specifier: ^1.2.0 version: 1.2.0 - '@fumadocs/base-ui': - specifier: 16.6.3 - version: 16.6.3 - '@fumadocs/cli': - specifier: ^1.2.5 - version: 1.2.5 - '@kapaai/react-sdk': - specifier: ^0.9.1 - version: 0.9.1 - '@mixedbread/sdk': - specifier: ^0.46.0 - version: 0.46.0 - '@playwright/test': - specifier: ^1.58.2 - version: 1.58.2 - '@radix-ui/react-accordion': - specifier: ^1.2.12 - version: 1.2.12 - '@radix-ui/react-checkbox': - specifier: ^1.3.3 - version: 1.3.3 - '@radix-ui/react-collapsible': - specifier: ^1.1.12 - version: 1.1.12 - '@radix-ui/react-dialog': - specifier: ^1.1.15 - version: 1.1.15 - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.16 - version: 2.1.16 - '@radix-ui/react-label': - specifier: ^2.1.8 - version: 2.1.8 - '@radix-ui/react-radio-group': - specifier: ^1.3.8 - version: 1.3.8 - '@radix-ui/react-separator': - specifier: ^1.1.8 - version: 1.1.8 - '@radix-ui/react-slider': - specifier: ^1.3.6 - version: 1.3.6 - '@radix-ui/react-slot': - specifier: ^1.2.4 - version: 1.2.4 - '@radix-ui/react-tabs': - specifier: ^1.1.13 - version: 1.1.13 - '@radix-ui/react-tooltip': - specifier: ^1.2.8 - version: 1.2.8 - '@sentry/nextjs': - specifier: ^10.39.0 - version: 10.42.0 - '@streamdown/code': - specifier: ^1.0.3 - version: 1.1.0 '@tailwindcss/postcss': specifier: ^4.2.0 version: 4.2.1 @@ -87,69 +27,18 @@ catalogs: babel-plugin-react-compiler: specifier: 1.0.0 version: 1.0.0 - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cspell: - specifier: ^9.6.4 - version: 9.7.0 - dexie: - specifier: ^4.3.0 - version: 4.3.0 - dexie-react-hooks: - specifier: ^4.2.0 - version: 4.2.0 - fast-glob: - specifier: ^3.3.3 - version: 3.3.3 - feed: - specifier: ^5.2.0 - version: 5.2.0 - fumadocs-core: - specifier: 16.6.3 - version: 16.6.3 - fumadocs-mdx: - specifier: 14.2.9 - version: 14.2.9 - fumadocs-openapi: - specifier: ^10.3.17 - version: 10.3.17 - fumadocs-ui: - specifier: npm:@fumadocs/base-ui@16.6.3 - version: 16.6.3 - gray-matter: - specifier: ^4.0.3 - version: 4.0.3 - jotai: - specifier: ^2.18.0 - version: 2.18.0 lucide-react: specifier: ^0.575.0 version: 0.575.0 - motion: - specifier: ^12.34.2 - version: 12.35.0 next: specifier: 16.1.6 version: 16.1.6 - next-themes: - specifier: ^0.4.6 - version: 0.4.6 next-validate-link: specifier: ^1.6.3 version: 1.6.4 npm-to-yarn: specifier: ^3.0.1 version: 3.0.1 - oxfmt: - specifier: ^0.33.0 - version: 0.33.0 - oxlint: - specifier: ^1.48.0 - version: 1.51.0 postcss: specifier: ^8.5.6 version: 8.5.8 @@ -165,21 +54,9 @@ catalogs: react-tweet: specifier: ^3.3.0 version: 3.3.0 - recharts: - specifier: ^3.7.0 - version: 3.7.0 remark-directive: specifier: ^4.0.0 version: 4.0.0 - rimraf: - specifier: ^6.1.3 - version: 6.1.3 - scroll-into-view-if-needed: - specifier: ^3.1.0 - version: 3.1.0 - streamdown: - specifier: ^2.3.0 - version: 2.4.0 tailwind-merge: specifier: ^3.5.0 version: 3.5.0 @@ -189,21 +66,9 @@ catalogs: tsx: specifier: ^4.19.0 version: 4.21.0 - turbo: - specifier: ^2.8.10 - version: 2.8.14 - tw-animate-css: - specifier: ^1.4.0 - version: 1.4.0 typescript: specifier: ^5.9.3 version: 5.9.3 - use-stick-to-bottom: - specifier: ^1.1.3 - version: 1.1.3 - vaul: - specifier: ^1.1.2 - version: 1.1.2 zod: specifier: ^4.3.6 version: 4.3.6 @@ -591,9 +456,6 @@ importers: '@react-three/fiber': specifier: ^9.5.0 version: 9.5.0(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(three@0.183.2) - '@rive-app/react-canvas': - specifier: ^4.27.3 - version: 4.27.3(react@19.2.4) '@rive-app/react-webgl2': specifier: ^4.27.3 version: 4.27.3(react@19.2.4) @@ -608,7 +470,7 @@ importers: version: 0.575.0(react@19.2.4) next: specifier: 'catalog:' - version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) npm-to-yarn: specifier: 'catalog:' version: 3.0.1 @@ -2993,14 +2855,6 @@ packages: react-redux: optional: true - '@rive-app/canvas@2.35.4': - resolution: {integrity: sha512-Blyi0jeBnRvgU9JQsFW3MZkmAdhKakSmqp6lZeOupFENjd8OGt4YrR1E0btH7soO9lae7m8N76MtnBwupNzxSw==} - - '@rive-app/react-canvas@4.27.3': - resolution: {integrity: sha512-DpxtvuRAtXWmS6sM+thuatKrRy1fT79GpShPe6sXxzKRLI1ZhNEOk+VRqawCZxNfedTf5B03ZDoEFxtCeRYphg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 - '@rive-app/react-webgl2@4.27.3': resolution: {integrity: sha512-f+i0w/iipxwJWOH2J+0u2se0OdTM5PNWqwndRMO6EwOG5YsHHOc9opmFQCViiwkzT6Sr3vU/hqdrZy8tno6exw==} peerDependencies: @@ -8024,13 +7878,6 @@ snapshots: react: 19.2.4 react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.4)(redux@5.0.1) - '@rive-app/canvas@2.35.4': {} - - '@rive-app/react-canvas@4.27.3(react@19.2.4)': - dependencies: - '@rive-app/canvas': 2.35.4 - react: 19.2.4 - '@rive-app/react-webgl2@4.27.3(react@19.2.4)': dependencies: '@rive-app/webgl2': 2.35.4 @@ -10421,6 +10268,33 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@16.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001777 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.58.2 + babel-plugin-react-compiler: 1.0.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -11176,6 +11050,11 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 + styled-jsx@5.1.6(react@19.2.4): + dependencies: + client-only: 0.0.1 + react: 19.2.4 + supports-color@8.1.1: dependencies: has-flag: 4.0.0 From e74f6e1b210c10d9cc38bfc71326fb45176917e7 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 05:22:20 +0000 Subject: [PATCH 04/14] update import --- apps/site/src/app/enterprise/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx index 1471084cda..ff46549025 100644 --- a/apps/site/src/app/enterprise/page.tsx +++ b/apps/site/src/app/enterprise/page.tsx @@ -14,6 +14,7 @@ import Testimonials from "../../components/homepage/testimonials"; import { cn } from "@/lib/cn"; import { Technology } from "@/components/technology"; import { Animation } from "@/components/animation"; +import { Fit } from "@rive-app/react-webgl2"; const first = [ { @@ -45,7 +46,7 @@ const first = [ other: ( canvas]:max-w-full", From 7e7141938483afd76d3d19f6b09374b2e211bba8 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 05:26:08 +0000 Subject: [PATCH 05/14] Update animation import --- apps/site/src/components/animation.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/site/src/components/animation.tsx b/apps/site/src/components/animation.tsx index c1d9dd857e..7eb48a0808 100644 --- a/apps/site/src/components/animation.tsx +++ b/apps/site/src/components/animation.tsx @@ -1,12 +1,12 @@ "use client"; -import { useRive, Layout, Alignment } from "@rive-app/react-webgl2"; +import { useRive, Layout, Alignment, Fit } from "@rive-app/react-webgl2"; import { useEffect, useState } from "react"; import { useInView } from "react-intersection-observer"; interface AnimationProps { name: string; className?: string; - fit?: reactCanvas.Fit; + fit?: Fit; threshold?: number; style?: React.CSSProperties; autoplay?: boolean; From e1218f61ff375582ce2ea2208d5046bb981d4524 Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 06:07:57 +0000 Subject: [PATCH 06/14] Fix responsive --- .../illustrations/enterprise/enterprise_1.svg | 46 ++++++++----------- apps/site/src/app/enterprise/page.tsx | 15 +++--- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/apps/site/public/illustrations/enterprise/enterprise_1.svg b/apps/site/public/illustrations/enterprise/enterprise_1.svg index a5cf9592d4..d6ae7f414f 100644 --- a/apps/site/public/illustrations/enterprise/enterprise_1.svg +++ b/apps/site/public/illustrations/enterprise/enterprise_1.svg @@ -1,27 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx index ff46549025..633cb50a8a 100644 --- a/apps/site/src/app/enterprise/page.tsx +++ b/apps/site/src/app/enterprise/page.tsx @@ -237,18 +237,19 @@ export default function SiteHome() { managing complex infrastructure components.

-
+
{complexities.map((card: any, index: number) => { const last = index === complexities.length - 1; return ( -
+
@@ -262,15 +263,15 @@ export default function SiteHome() { {card.subtitle}

{!last && ( -
+
Enterprise Enterprise
From 5d9358c28b66515796e57ce56b20262d87bf420c Mon Sep 17 00:00:00 2001 From: Carla Goncalves Date: Fri, 27 Mar 2026 08:49:16 +0000 Subject: [PATCH 07/14] Update enterprise with remaining elements + optimized colors for light mode --- .../public/icons/technologies/mariadb.svg | 47 ++++ .../public/icons/technologies/mariadbdark.svg | 15 ++ .../icons/technologies/mongodb copy.svg | 29 +++ .../icons/technologies/mongodbsimple.svg | 8 + apps/site/public/icons/technologies/mssql.svg | 22 ++ .../public/icons/technologies/mysql copy.svg | 17 ++ .../public/icons/technologies/mysqlsimple.svg | 44 ++++ apps/site/src/app/enterprise/page.tsx | 237 ++++++++++++++---- .../enterprise/footer-accordion.tsx | 61 +++++ apps/site/src/components/enterprise/form.tsx | 20 ++ .../enterprise/switch-enterprise.tsx | 116 +++++++++ apps/site/src/components/logo-parade.tsx | 2 +- apps/site/src/components/technology.tsx | 10 +- apps/site/src/types/global.d.ts | 9 + packages/eclipse/src/components/button.tsx | 2 + 15 files changed, 587 insertions(+), 52 deletions(-) create mode 100644 apps/site/public/icons/technologies/mariadb.svg create mode 100644 apps/site/public/icons/technologies/mariadbdark.svg create mode 100644 apps/site/public/icons/technologies/mongodb copy.svg create mode 100644 apps/site/public/icons/technologies/mongodbsimple.svg create mode 100644 apps/site/public/icons/technologies/mssql.svg create mode 100644 apps/site/public/icons/technologies/mysql copy.svg create mode 100644 apps/site/public/icons/technologies/mysqlsimple.svg create mode 100644 apps/site/src/components/enterprise/footer-accordion.tsx create mode 100644 apps/site/src/components/enterprise/form.tsx create mode 100644 apps/site/src/components/enterprise/switch-enterprise.tsx create mode 100644 apps/site/src/types/global.d.ts diff --git a/apps/site/public/icons/technologies/mariadb.svg b/apps/site/public/icons/technologies/mariadb.svg new file mode 100644 index 0000000000..ef34e995a6 --- /dev/null +++ b/apps/site/public/icons/technologies/mariadb.svg @@ -0,0 +1,47 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mariadbdark.svg b/apps/site/public/icons/technologies/mariadbdark.svg new file mode 100644 index 0000000000..7e93faa3ba --- /dev/null +++ b/apps/site/public/icons/technologies/mariadbdark.svg @@ -0,0 +1,15 @@ + + + + + + MDB-VLogo_White + + + + + + + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mongodb copy.svg b/apps/site/public/icons/technologies/mongodb copy.svg new file mode 100644 index 0000000000..69b6564fd8 --- /dev/null +++ b/apps/site/public/icons/technologies/mongodb copy.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mongodbsimple.svg b/apps/site/public/icons/technologies/mongodbsimple.svg new file mode 100644 index 0000000000..ebe9937d6b --- /dev/null +++ b/apps/site/public/icons/technologies/mongodbsimple.svg @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mssql.svg b/apps/site/public/icons/technologies/mssql.svg new file mode 100644 index 0000000000..b6b81fb5ec --- /dev/null +++ b/apps/site/public/icons/technologies/mssql.svg @@ -0,0 +1,22 @@ + + + + + + + + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mysql copy.svg b/apps/site/public/icons/technologies/mysql copy.svg new file mode 100644 index 0000000000..eef39d31a2 --- /dev/null +++ b/apps/site/public/icons/technologies/mysql copy.svg @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/apps/site/public/icons/technologies/mysqlsimple.svg b/apps/site/public/icons/technologies/mysqlsimple.svg new file mode 100644 index 0000000000..953749db04 --- /dev/null +++ b/apps/site/public/icons/technologies/mysqlsimple.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/site/src/app/enterprise/page.tsx b/apps/site/src/app/enterprise/page.tsx index 633cb50a8a..2c72bcef5e 100644 --- a/apps/site/src/app/enterprise/page.tsx +++ b/apps/site/src/app/enterprise/page.tsx @@ -1,3 +1,9 @@ +import { EnterpriseForm } from "@/components/enterprise/form"; + +import Script from "next/script"; +import { FooterAccordion } from "@/components/enterprise/footer-accordion"; + +import { SwitchEnterprise } from "@/components/enterprise/switch-enterprise"; import LogoParade from "@/components/logo-parade"; import type { Metadata } from "next"; import { @@ -62,6 +68,7 @@ const first = [ visualType: "other" as const, }, ]; + const databases = { title: "Supported Databases", list: [ @@ -107,53 +114,6 @@ const databases = { }, ], }; -const frameworks = { - title: "Selected Frameworks", - description: - "Easy to integrate into your framework of choice, Prisma simplifies database access, saves repetitive CRUD boilerplate and increases type safety.", - list: [ - { - name: "React", - icon: "/icons/technologies/react.svg", - url: "/react", - }, - { - name: "Next.js", - icon: "/icons/technologies/nextjs.svg", - url: "/nextjs", - }, - { - name: "NestJS", - icon: "/icons/technologies/nestjs.svg", - url: "/nestjs", - }, - { - name: "Apollo", - icon: "/icons/technologies/apollo.svg", - url: "/apollo", - }, - { - name: "Hapi", - icon: "/icons/technologies/hapi.svg", - url: "/hapi", - }, - { - name: "GraphQL", - icon: "/icons/technologies/graphql.svg", - url: "/graphql", - }, - { - name: "ExpressJS", - icon: "/icons/technologies/express.svg", - url: "/express", - }, - { - name: "Redwood", - icon: "/icons/technologies/redwoodjs.svg", - url: "/redwood", - }, - ], -}; const complexities = [ { @@ -178,6 +138,112 @@ const complexities = [ }, ]; +const enterprises = [ + { + title: "Enterprise-level support", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-headset", // or "fa-light fa-headset" + }, + { + title: "Risk and compliance", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-file-contract", // or "fa-light fa-file-contract" + }, + { + title: "Custom solutions", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-wrench", // or "fa-light fa-wrench" + }, + { + title: "Priority resolution", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-check-to-slot", // or "fa-light fa-circle-check" + }, + { + title: "Advanced security", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-shield-exclamation", // or "fa-light fa-shield-exclamation" + }, + { + title: "Performance optimization", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-chart-line-up", // or "fa-light fa-chart-line-up" + }, + { + title: "Expert scalability consultation", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-up-right-and-down-left-from-center", // or "fa-light fa-arrow-trend-up" + }, + { + title: "Comprehensive team training", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-screen-users", // or "fa-light fa-people-group" + }, + { + title: "Influential feedback loop", + description: + "Obtain the level of dedicated support from a team that understands and caters to the complexities and demands of large-scale enterprise operations.", + icon: "fa-regular fa-repeat", // or "fa-light fa-repeat" + }, +]; +const solution_providers = [ + { + title: "Direct access to product experts", + description: + "Engage with the brains behind the Prisma ORM for in-depth problem-solving and specialized insights.", + icon: "fa-regular fa-person-chalkboard", // or "fa-light fa-person-chalkboard" + }, + { + title: "Swift problem resolution", + description: + "Benefit from quick and effective support responses that are crucial in maintaining the pace of your project timelines.", + icon: "fa-regular fa-gauge-simple-max", // or "fa-light fa-badge-check" + }, + { + title: "Bespoke customization guidance", + description: + "Receive personalized advice on tailoring the Prisma ORM to the specific requirements of your unique projects.", + icon: "fa-regular fa-comments-question-check", // or "fa-light fa-comments-question" + }, + { + title: "Advanced updates", + description: + "Stay ahead in the game with the latest updates and best practices.", + icon: "fa-regular fa-file-arrow-up", // or "fa-light fa-file-import" + }, + { + title: "Expedited and priority support", + description: + "Benefit from prioritized attention to your inquiries and problems.", + icon: "fa-regular fa-phone-volume", // or "fa-light fa-phone-arrow-up-right" + }, + { + title: "Specialized training for your team", + description: + "Empower your team with advanced training sessions, enabling them to leverage the full capabilities of our ORM.", + icon: "fa-regular fa-screen-users", // or "fa-light fa-people-group" + }, + { + title: "Optimization for peak performance", + description: "Ensure your software solutions run smoothly and efficiently.", + icon: "fa-regular fa-arrow-up-right-dots", // or "fa-light fa-chart-mixed" + }, + { + title: "Proactive risk management", + description: + "Help you to anticipate and mitigate risks, ensuring a seamless development process and uninterrupted service to your clients.", + icon: "fa-regular fa-triangle-exclamation", // or "fa-light fa-triangle-exclamation" + }, +]; + export const metadata: Metadata = { title: SITE_HOME_TITLE, description: SITE_HOME_DESCRIPTION, @@ -219,7 +285,7 @@ export default function SiteHome() {
-
+
Trusted by teams at
@@ -284,7 +350,12 @@ export default function SiteHome() {
{databases.list.map((db) => ( - +
+
+
+

+ Code quality and safety +

+
+
+
+ +
+
+ Code quality and safety + Code quality and safety +
+
+
+
+
+
+
+

+ Dedicated ORM support options +

+

+ Focus on core competencies of your team, rather than building and + managing complex infrastructure components. +

+ +
+
+
+
+

+ Connect with us +

+

+ To explore how our support solutions can revolutionize your agency + or enterprise's approach to developing with Prisma ORM. +

+ +
+
); } diff --git a/apps/site/src/components/enterprise/footer-accordion.tsx b/apps/site/src/components/enterprise/footer-accordion.tsx new file mode 100644 index 0000000000..695a8bb519 --- /dev/null +++ b/apps/site/src/components/enterprise/footer-accordion.tsx @@ -0,0 +1,61 @@ +import { Accordions, Accordion } from "@prisma/eclipse"; + +export const FooterAccordion = () => { + return ( +
+ + + + Type-safety +
+ } + > +

+ With Prisma ORM’s first-class TypeScript support, developers benefit + from compile-time type checking, significantly reducing runtime + errors. Any changes in the database schema are reflected in the + code, prompting immediate updates where necessary. +

+ + + + Security features +
+ } + > +

+ Prisma ORM mitigates common security vulnerabilities, such as SQL + injection, by abstracting raw SQL queries and sanitizing inputs. + This built-in protection layer adds an additional security safeguard + for applications. +

+ + + + Performance considerations +
+ } + > +

+ While ORMs add a layer of abstraction, Prisma ORM is optimized to + generate efficient SQL queries, minimizing performance overhead. + Techniques such as query batching and selective loading of data + ensure applications remain responsive and scalable. +

+ + +
+ ); +}; diff --git a/apps/site/src/components/enterprise/form.tsx b/apps/site/src/components/enterprise/form.tsx new file mode 100644 index 0000000000..a0f76d1236 --- /dev/null +++ b/apps/site/src/components/enterprise/form.tsx @@ -0,0 +1,20 @@ +"use client"; +import Script from "next/script"; + +export const EnterpriseForm = () => ( + <> +