+
{/* Density-matched section padding. Uniform `py-24` everywhere
made the page feel padded-for-padding's-sake when section
content was thin (a 100 px marquee strip, a 1-row logo wall).
diff --git a/src/components/MarketingPage.jsx b/src/components/MarketingPage.jsx
index 73db1ec..73524df 100644
--- a/src/components/MarketingPage.jsx
+++ b/src/components/MarketingPage.jsx
@@ -1,13 +1,26 @@
+import { ShowcaseGradient } from '@/components/ShowcaseGradient'
+
// Wrapper for the SEO-only Markdoc pages (/why-gofr, /comparison/*,
// /migrate/*, /learn, /faq). It supplies the flex container DocsLayout
// expects, but unlike DocsPage it does NOT render a left sidebar — these
// pages aren't core navigation, they're SEO landing content. Right-rail
// "On this page" TOC from DocsLayout still renders. Cross-links to the
// other SEO pages live in the global footer.
-export function MarketingPage({ children }) {
+//
+// `withGradient` adds the decorative orb layer (ShowcaseGradient).
+// Opt-in because /faq and /learn are reading-mode reference pages
+// where the gradient is just visual noise; /why-gofr, /comparison/*,
+// /migrate/* are positioning surfaces where it belongs.
+export function MarketingPage({ children, withGradient = false }) {
return (
-
+
+ {withGradient && }
{children}
diff --git a/src/components/Reviews.jsx b/src/components/Reviews.jsx
index 81d9d51..c132d79 100644
--- a/src/components/Reviews.jsx
+++ b/src/components/Reviews.jsx
@@ -9,9 +9,13 @@ export default function Testimonials() {
{/*
*/}
{/* User Testimonials*/}
{/*
*/}
-
+
{testimonials.map((testimonial, index) => (
-
+ // `block break-inside-avoid` keeps each card whole inside
+ // the CSS multi-column flow. Without it, a tall card gets
+ // split at the column boundary and the two halves render
+ // on top of each other on narrow viewports.
+
diff --git a/src/components/ShowcaseGradient.jsx b/src/components/ShowcaseGradient.jsx
new file mode 100644
index 0000000..e6cb387
--- /dev/null
+++ b/src/components/ShowcaseGradient.jsx
@@ -0,0 +1,56 @@
+import Image from 'next/image'
+import blurCyanImage from '@/images/blur-cyan.png'
+import blurIndigoImage from '@/images/blur-indigo.png'
+
+// Decorative gradient layer for the framework's pitch / showcase
+// surfaces — homepage, /why-gofr, /comparison/*, /showcase, /migrate/*.
+// Three pointer-events-none orbs distributed down the page at
+// alternating sides, reusing the cyan + indigo vocabulary the hero
+// already establishes. Drop inside any `relative overflow-x-clip`
+// wrapper.
+//
+// Why an absolute layer instead of a CSS background-image:
+// - Matches the existing Hero implementation (Image PNGs, opacity).
+// - Lets us anchor each orb relative to a known parent, so different
+// pages can opt in without re-tuning a body-level gradient.
+//
+// Why `unoptimized` is mandatory: the site builds with
+// `output: 'export'`, which disables /_next/image. Without unoptimized,
+// Next emits a /_next/image?url=... src that 404s in production and
+// renders as a broken-image icon.
+export function ShowcaseGradient() {
+ return (
+ <>
+
+
+
+ >
+ )
+}