"use client";
import { useState } from "react";
/**
* Design scaffolds — styled React mockups showing what each UI library
* looks like for a given surface. Used in the Design page preview area.
*
* Each scaffold is rendered at its natural size inside a scaled container,
* giving the user a realistic feel for the library's visual language.
*/
// ---------------------------------------------------------------------------
// Shared mock data
// ---------------------------------------------------------------------------
const TABLE_ROWS = [
{ name: "Alice Martin", email: "alice@co.com", role: "Admin", status: "Active", date: "Jan 12" },
{ name: "Ben Walsh", email: "ben@co.com", role: "Member", status: "Pending", date: "Jan 14" },
{ name: "Clara Kim", email: "clara@co.com", role: "Member", status: "Active", date: "Jan 15" },
{ name: "David Osei", email: "david@co.com", role: "Viewer", status: "Inactive", date: "Jan 16" },
];
type Page = "Dashboard" | "Users" | "Settings";
const PAGES: Page[] = ["Dashboard", "Users", "Settings"];
// ---------------------------------------------------------------------------
// WEB APP — shadcn
// ---------------------------------------------------------------------------
function ShadcnDashboard() {
return (
{["Total Revenue", "Active Users", "Conversions"].map((label, i) => (
{label}
{["$12,400", "2,841", "18.2%"][i]}
+{[12, 8, 3][i]}% from last month
))}
Revenue
{[40,60,45,75,65,85,70,90,55,80,75,95].map((h,i)=>(
))}
Recent activity
{TABLE_ROWS.slice(0,3).map(r=>(
))}
);
}
function ShadcnUsers() {
return (
{["Name","Role","Status","Joined",""].map(h=>{h} )}
{TABLE_ROWS.map(r=>(
{r.role}
{r.status}
{r.date}
···
))}
);
}
function ShadcnSettings() {
return (
General
{[{l:"Workspace name",v:"Acme Inc"},{l:"Slug",v:"acme-inc"},{l:"Email",v:"admin@acme.com"}].map(f=>(
{f.l}
))}
Notifications
{["Email digests","Push notifications","Security alerts","Product updates"].map((label,i)=>(
{label}
Receive {label.toLowerCase()}
))}
);
}
export function WebAppShadcn() {
const [page, setPage] = useState("Dashboard");
const NAV_ITEMS: { label: Page; icon: string }[] = [
{ label: "Dashboard", icon: "▦" },
{ label: "Users", icon: "◎" },
{ label: "Settings", icon: "⚙" },
];
return (
{NAV_ITEMS.map(({ label, icon }) => (
setPage(label)}
className={`flex items-center gap-2 px-2 py-1.5 rounded-md text-xs cursor-pointer w-full text-left ${page === label ? "bg-zinc-100 text-zinc-900 font-medium" : "text-zinc-500 hover:bg-zinc-50"}`}>
{icon} {label}
))}
{page === "Dashboard" &&
}
{page === "Users" &&
}
{page === "Settings" &&
}
);
}
function MantineDashboard() {
return (
{[{l:"Total Revenue",v:"$12,400",c:"#2f9e44"},{l:"Active Users",v:"2,841",c:"#228be6"},{l:"Conversions",v:"18.2%",c:"#e67700"}].map(item=>(
{item.l}
{item.v}
↑ trending up
))}
Monthly revenue
{[40,60,45,75,65,85,70,90,55,80,75,95].map((h,i)=>(
))}
Recent
{TABLE_ROWS.slice(0,3).map(r=>(
))}
);
}
function MantineUsers() {
return (
{["Member","Role","Status","Joined","Actions"].map(h=>{h} )}
{TABLE_ROWS.map(r=>(
{r.role}
{r.status}
{r.date}
Manage
))}
);
}
function MantineSettings() {
return (
Workspace
{[{l:"Name",v:"Acme Inc"},{l:"Slug",v:"acme-inc"},{l:"Email",v:"admin@acme.com"}].map(f=>(
{f.l}
))}
Save
Notifications
{["Email digests","Push notifications","Security alerts","Product updates"].map((label,i)=>(
{label}
Get notified via {label.split(" ")[0].toLowerCase()}
))}
);
}
export function WebAppMantine() {
const [page, setPage] = useState("Dashboard");
const NAV: { label: Page; icon: string }[] = [
{ label: "Dashboard", icon: "▦" },
{ label: "Users", icon: "◎" },
{ label: "Settings", icon: "⚙" },
];
return (
{NAV.map(({ label, icon }) => (
setPage(label)}
className="flex items-center gap-2 px-2 py-2 rounded text-xs cursor-pointer w-full text-left"
style={page===label?{background:"#e7f5ff",color:"#1971c2",fontWeight:600}:{color:"#495057"}}>
{icon} {label}
))}
{page === "Dashboard" &&
}
{page === "Users" &&
}
{page === "Settings" &&
}
);
}
function HeroUIDashboard() {
return (
{["Revenue","Users","Conversion"].map((label,i)=>(
{label}
{["$12,400","2,841","18.2%"][i]}
+{[12,8,3][i]}% this month
))}
Revenue
{[40,60,45,75,65,85,70,90,55,80,75,95].map((h,i)=>(
))}
Recent activity
{TABLE_ROWS.slice(0,3).map(r=>(
))}
);
}
function HeroUIUsers() {
return (
{["Member","Role","Status","Joined",""].map(h=>{h} )}
{TABLE_ROWS.map(r=>(
{r.role}
{r.status}
{r.date}
Manage
))}
);
}
function HeroUISettings() {
return (
Profile
{[{l:"Workspace name",v:"Acme Inc"},{l:"Slug",v:"acme-inc"},{l:"Email",v:"admin@acme.com"}].map(f=>(
{f.l}
))}
Save changes
Notifications
{["Email digests","Push notifications","Security alerts","Product updates"].map((label,i)=>(
))}
);
}
export function WebAppHeroUI() {
const [page, setPage] = useState("Dashboard");
const NAV: { label: Page; icon: string }[] = [
{ label: "Dashboard", icon: "▦" },
{ label: "Users", icon: "◎" },
{ label: "Settings", icon: "⚙" },
];
return (
{NAV.map(({ label, icon }) => (
setPage(label)}
className="flex items-center gap-2 px-2 py-2 rounded-xl text-xs cursor-pointer w-full text-left"
style={page===label?{background:"rgba(124,58,237,0.3)",color:"#c084fc",fontWeight:600}:{color:"rgba(255,255,255,0.5)"}}>
{icon} {label}
))}
{page === "Dashboard" &&
}
{page === "Users" &&
}
{page === "Settings" &&
}
);
}
function TremorDashboard() {
return (
{[{l:"Revenue",v:"$12,400",c:"#2563eb",bg:"#dbeafe",pct:65},{l:"Users",v:"2,841",c:"#7c3aed",bg:"#ede9fe",pct:48},{l:"Conversion",v:"18.2%",c:"#059669",bg:"#d1fae5",pct:72}].map(item=>(
))}
Revenue over time
{[40,65,55,80,70,90,75,85,60,95,80,100].map((h,i)=>(
))}
{["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"].map(m=>{m} )}
{TABLE_ROWS.slice(0,3).map(r=>(
))}
);
}
function TremorUsers() {
return (
{[{l:"Total",v:"2,841",c:"#2563eb"},{l:"Active",v:"1,940",c:"#059669"},{l:"Pending",v:"647",c:"#d97706"},{l:"Inactive",v:"254",c:"#6b7280"}].map(s=>(
))}
);
}
function TremorSettings() {
return (
Workspace
{[{l:"Name",v:"Acme Inc"},{l:"Domain",v:"acme.com"},{l:"Timezone",v:"UTC-8"}].map(f=>(
{f.l}
))}
Save
Alerts
{["Email digests","Anomaly alerts","Weekly report","API warnings"].map((label,i)=>(
))}
);
}
export function WebAppTremor() {
const [page, setPage] = useState("Dashboard");
const NAV: { label: Page; icon: string }[] = [
{ label: "Dashboard", icon: "▦" },
{ label: "Users", icon: "◎" },
{ label: "Settings", icon: "⚙" },
];
return (
{NAV.map(({ label, icon }) => (
setPage(label)}
className="flex items-center gap-2 px-2 py-2 rounded text-xs cursor-pointer w-full text-left"
style={page===label?{background:"#eff6ff",color:"#1d4ed8",fontWeight:600}:{color:"#6b7280"}}>
{icon} {label}
))}
{page}
+ New
{page === "Dashboard" &&
}
{page === "Users" &&
}
{page === "Settings" &&
}
);
}
// ---------------------------------------------------------------------------
// MARKETING scaffolds
// ---------------------------------------------------------------------------
export function MarketingDaisy() {
return (
{["Features","Pricing","Docs","Blog"].map(i=>{i} )}
Login
Get started
✦ New — v2.0 is here
Build faster, ship smarter
The all-in-one platform that helps teams build, launch, and scale their products.
Start for free
See demo →
{[{icon:"⚡",title:"Lightning fast",desc:"Deploy in seconds, not hours"},{icon:"🔒",title:"Secure by default",desc:"Enterprise-grade security built in"},{icon:"📈",title:"Scales with you",desc:"From zero to millions of users"}].map(f=>(
{f.icon}
{f.title}
{f.desc}
))}
);
}
export function MarketingHeroUI() {
return (
{["Features","Pricing","Docs","Blog"].map(i=>{i} )}
Login
Get started
🚀 Just launched — v2.0
Build faster, ship smarter
The all-in-one platform for teams that move fast.
Start for free
Live demo →
{["#ff5f56","#ffbd2e","#27c93f"].map(c=>
)}
{["Revenue","Users","Growth","Churn"].map((m,i)=>
{m}
{["$12k","2.8k","+24%","2.1%"][i]}
)}
);
}
export function MarketingAceternity() {
return (
{["Features","Pricing","Docs"].map(i=>{i} )}
Get started
✦ Open source · 12k GitHub stars
Build the future of the web
Beautifully crafted components built with Tailwind CSS and Framer Motion.
Get started →
View components
{["Animated","Accessible","Open source"].map((f,i)=>(
))}
);
}
export function MarketingTailwind() {
return (
acme
{["Features","Pricing","Blog"].map(i=>{i} )}
Log in
Sign up
Now in public beta
The platform built for scale
Everything your team needs to build, deploy, and monitor production applications.
Get started free
Documentation →
{["99.9% uptime SLA","10ms avg latency","SOC2 compliant","GDPR ready"].map(f=>(
))}
);
}
// ---------------------------------------------------------------------------
// ADMIN scaffolds
// ---------------------------------------------------------------------------
export function AdminMantine() { return ; }
export function AdminShadcn() { return ; }
export function AdminTremor() { return ; }
// ---------------------------------------------------------------------------
// MOBILE scaffolds
// ---------------------------------------------------------------------------
function MobileFrame({ children }: { children: React.ReactNode }) {
return (
);
}
export function MobileNativewind() {
return (
{[{l:"Revenue",v:"$4.2k"},{l:"Users",v:"184"}].map(c=>(
))}
{["Fix login bug","Update pricing","Review PR #42"].map((t,i)=>(
))}
{["Home","Projects","Chat","Profile"].map((l,i)=>(
))}
);
}
export function MobileGluestack() {
return (
{[{l:"Revenue",v:"$4.2k",c:"#1976d2"},{l:"Users",v:"184",c:"#7b1fa2"}].map(c=>(
))}
{["Fix login bug","Update pricing","Review PR #42"].map((t,i)=>(
))}
{["Home","Tasks","Chat","Profile"].map((l,i)=>(
))}
);
}
// ---------------------------------------------------------------------------
// EMAIL scaffolds
// ---------------------------------------------------------------------------
export function EmailReactEmail() {
return (
Welcome to Acme! 🎉
Hi Alice, thanks for signing up. Your account is ready and you can start building right away.
Get started →
Your account details
{["Plan: Starter","Workspace: alice-workspace","Status: Active"].map(d=>(
{d}
))}
If you have any questions, reply to this email or visit our help center. We're here to help.
Acme Inc · 123 Main St · San Francisco CA · Unsubscribe
);
}
// ---------------------------------------------------------------------------
// DOCS scaffolds
// ---------------------------------------------------------------------------
export function DocsNextra() {
return (
Getting Started
{["Introduction","Installation","Quick Start"].map((item,i)=>(
{item}
))}
Components
{["Button","Card","Input","Modal","Table"].map(item=>(
{item}
))}
API Reference
{["REST API","Webhooks"].map(item=>(
{item}
))}
Docs / Getting Started / Introduction
Introduction
Acme UI is a collection of re-usable components that you can copy and paste into your web apps. Built with Radix UI and Tailwind CSS.
Key features
{["Accessible","Customisable","Open source","TypeScript ready"].map(f=>(
))}
);
}
export function DocsShadcnCustom() {
return (
{[{section:"Guides",items:["Introduction","Installation","Theming"]},{section:"Components",items:["Button","Input","Select","Dialog"]}].map(g=>(
{g.section}
{g.items.map((item,i)=>(
{item}
))}
))}
Introduction
A set of beautifully designed components built with Radix UI and Tailwind CSS.
{["Button","Card","Input","Badge"].map(c=>(
))}
);
}
// ---------------------------------------------------------------------------
// Registry — maps surface+theme to scaffold component
// ---------------------------------------------------------------------------
export const SCAFFOLD_REGISTRY: Record> = {
"web-app": {
"shadcn": WebAppShadcn,
"mantine": WebAppMantine,
"hero-ui": WebAppHeroUI,
"tremor": WebAppTremor,
},
"marketing": {
"daisy-ui": MarketingDaisy,
"hero-ui": MarketingHeroUI,
"aceternity": MarketingAceternity,
"tailwind-only": MarketingTailwind,
},
"admin": {
"mantine": AdminMantine,
"shadcn": AdminShadcn,
"tremor": AdminTremor,
},
"mobile": {
"nativewind": MobileNativewind,
"gluestack": MobileGluestack,
},
"email": {
"react-email": EmailReactEmail,
},
"docs": {
"nextra": DocsNextra,
"shadcn": DocsShadcnCustom,
},
};