From a54c3df153fe6c8a4c92c641cc165cbf563640a2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 17:10:20 +0000 Subject: [PATCH 1/3] Add demo landing page at /landing Introduce a branded landing page with a full-bleed shader background, hero CTAs, and product preview for showcasing 23rd. Co-authored-by: Jay Sharma --- app/landing/landing-view.tsx | 142 +++++++++++++++++++++++++++++++++++ app/landing/page.tsx | 13 ++++ 2 files changed, 155 insertions(+) create mode 100644 app/landing/landing-view.tsx create mode 100644 app/landing/page.tsx diff --git a/app/landing/landing-view.tsx b/app/landing/landing-view.tsx new file mode 100644 index 0000000..3db8f7a --- /dev/null +++ b/app/landing/landing-view.tsx @@ -0,0 +1,142 @@ +"use client" + +import Image from "next/image" +import Link from "next/link" +import { motion, useReducedMotion } from "motion/react" +import { Instrument_Serif } from "next/font/google" + +import { Logo } from "@/components/logo" +import { buttonVariants } from "@/components/ui/button" +import { cn } from "@/lib/utils" +import { ShaderGradient } from "@/registry/shader-gradient/shader-gradient" + +const display = Instrument_Serif({ + subsets: ["latin"], + weight: "400", + variable: "--font-landing-display", +}) + +const ease = [0.22, 1, 0.36, 1] as const + +export function LandingView() { + const reduceMotion = useReducedMotion() + + const initial = reduceMotion ? false : { opacity: 0, y: 18 } + const animate = { opacity: 1, y: 0 } + + return ( +
+
+ +
+ +
+
+ + + 23rd + + + Docs + +
+ +
+
+ + 23rd + + + + Opinionated components for shippers + + + + Install from the registry, own the source, and start from a + sharper baseline. + + + + + Browse docs + + + Live demo + + +
+
+ +
+
+

+ Built to sit behind a real interface +

+

+ Shader washes, fluid trails, and footers that feel finished — + ready to drop into your app. +

+
+
+ Interface preview using 23rd backgrounds +
+
+ +
+

+ Ship with taste +

+ + Explore components + +
+
+
+ ) +} diff --git a/app/landing/page.tsx b/app/landing/page.tsx new file mode 100644 index 0000000..6f427a0 --- /dev/null +++ b/app/landing/page.tsx @@ -0,0 +1,13 @@ +import type { Metadata } from "next" + +import { LandingView } from "./landing-view" + +export const metadata: Metadata = { + title: "Landing", + description: + "23rd — opinionated UI components for shippers. A demo landing page with live shader backgrounds.", +} + +export default function LandingPage() { + return +} From ffdfb604f078aeda02b4c997d64e0b7e36e3f295 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 17:33:45 +0000 Subject: [PATCH 2/3] Fix landing preview section overlapping footer Give the product preview and footer opaque section backgrounds and clip overflow so the demo image no longer spills into the CTA. Co-authored-by: Jay Sharma --- app/landing/landing-view.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/landing/landing-view.tsx b/app/landing/landing-view.tsx index 3db8f7a..0a96dd1 100644 --- a/app/landing/landing-view.tsx +++ b/app/landing/landing-view.tsx @@ -103,8 +103,8 @@ export function LandingView() { -
-
+
+

Built to sit behind a real interface

@@ -113,19 +113,19 @@ export function LandingView() { ready to drop into your app.

-
+
Interface preview using 23rd backgrounds
-
+

Ship with taste

From 083652d2c38549896aab8595c85369bf99862883 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 5 Aug 2026 17:41:07 +0000 Subject: [PATCH 3/3] Treat /landing as draft site homepage only Keep production root redirecting to docs. Mark the landing route noindex/disallowed for crawlers and clarify it is a draft preview. Co-authored-by: Jay Sharma --- app/landing/landing-view.tsx | 60 ++++++++++++++++++++++++------------ app/landing/page.tsx | 8 +++-- app/robots.ts | 2 ++ 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/app/landing/landing-view.tsx b/app/landing/landing-view.tsx index 0a96dd1..2dcd613 100644 --- a/app/landing/landing-view.tsx +++ b/app/landing/landing-view.tsx @@ -40,12 +40,17 @@ export function LandingView() { 23rd - - Docs - +
@@ -62,7 +67,11 @@ export function LandingView() { Opinionated components for shippers @@ -71,33 +80,41 @@ export function LandingView() { - Install from the registry, own the source, and start from a - sharper baseline. + A shadcn registry with strong defaults — install what you need, + own the source, and ship from a sharper baseline. - Browse docs + Read the docs - Live demo + Get started
@@ -106,17 +123,17 @@ export function LandingView() {

- Built to sit behind a real interface + Copy in. Ship out.

- Shader washes, fluid trails, and footers that feel finished — - ready to drop into your app. + Backgrounds, footers, and interaction pieces that already feel + finished — without a kitchen-sink design system.

Interface preview using 23rd backgrounds Ship with taste

+

+ Draft homepage preview — production still opens on docs. +

- Explore components + Browse components
diff --git a/app/landing/page.tsx b/app/landing/page.tsx index 6f427a0..0069195 100644 --- a/app/landing/page.tsx +++ b/app/landing/page.tsx @@ -3,9 +3,13 @@ import type { Metadata } from "next" import { LandingView } from "./landing-view" export const metadata: Metadata = { - title: "Landing", + title: "23rd", description: - "23rd — opinionated UI components for shippers. A demo landing page with live shader backgrounds.", + "Opinionated UI components for shippers — a shadcn registry. Draft site landing (not the production homepage).", + robots: { + index: false, + follow: false, + }, } export default function LandingPage() { diff --git a/app/robots.ts b/app/robots.ts index 2626972..4e89fd0 100644 --- a/app/robots.ts +++ b/app/robots.ts @@ -5,6 +5,8 @@ export default function robots(): MetadataRoute.Robots { rules: { userAgent: "*", allow: "/", + // Draft site landing — not the production homepage yet + disallow: ["/landing"], }, sitemap: "https://23rd.dev/sitemap.xml", }