Skip to content
9 changes: 6 additions & 3 deletions apps/site/app/docs/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { source } from '@/lib/source';
import type { ReactNode } from 'react';
import { DocsLayout } from 'fumadocs-ui/layouts/docs';
import { RootProvider } from 'fumadocs-ui/provider';

export default function Layout({ children }: { children: ReactNode }) {
return (
<DocsLayout tree={source.pageTree} nav={{ title: 'Object UI' }}>
{children}
</DocsLayout>
<RootProvider>
<DocsLayout tree={source.pageTree} nav={{ title: 'Object UI' }}>
{children}
</DocsLayout>
</RootProvider>
);
}
5 changes: 1 addition & 4 deletions apps/site/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import './global.css';
import { RootProvider } from 'fumadocs-ui/provider';
import type { ReactNode } from 'react';

export default function Layout({ children }: { children: ReactNode }) {
return (
<html lang="en" suppressHydrationWarning>
<body>
<RootProvider>{children}</RootProvider>
</body>
<body>{children}</body>
</html>
);
}
298 changes: 285 additions & 13 deletions apps/site/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,291 @@ import Link from 'next/link';

Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The HomePage component lacks a JSDoc comment explaining its purpose and structure. According to documentation best practices, exported components should have documentation describing their functionality.

Suggested change
/**
* Renders the main marketing homepage for ObjectUI.
*
* The layout includes:
* - A hero section introducing the JSON-driven UI engine.
* - Primary calls to action linking to documentation and GitHub.
* - A code preview demonstrating a sample JSON page schema.
*
* This component is used as the root route of the site (`/`).
*/

Copilot uses AI. Check for mistakes.
export default function HomePage() {
return (
<main className="flex min-h-screen flex-col items-center justify-center p-24">
<div className="text-center">
<h1 className="mb-4 text-4xl font-bold">Object UI</h1>
<p className="mb-8 text-xl text-muted-foreground">
A Universal, Schema-Driven UI Engine built on React, Tailwind, and Shadcn UI.
</p>
<Link
href="/docs"
className="inline-flex items-center justify-center rounded-md bg-primary px-8 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90"
>
Get Started
</Link>
</div>
<main className="min-h-screen">
{/* Hero Section */}
<section className="relative overflow-hidden bg-gradient-to-br from-blue-50 via-white to-purple-50 dark:from-gray-900 dark:via-gray-900 dark:to-gray-800">
<div className="relative mx-auto max-w-7xl px-6 py-24 sm:py-32 lg:px-8">
<div className="mx-auto max-w-3xl text-center">
<div className="mb-8 inline-flex items-center rounded-full border border-blue-200 bg-blue-50 px-4 py-1.5 text-sm font-medium text-blue-700 dark:border-blue-800 dark:bg-blue-900/30 dark:text-blue-300">
โœจ The Universal Schema-Driven UI Engine
</div>
<h1 className="mb-6 text-5xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-7xl">
From JSON to
<span className="bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent"> World-Class UI </span>
in Minutes
</h1>
<p className="mb-10 text-lg leading-8 text-gray-600 dark:text-gray-300">
Build beautiful, production-ready interfaces without writing React code.
Just define your UI in JSON and let ObjectUI handle the rest with Tailwind CSS and Shadcn UI.
</p>
<div className="flex flex-col items-center justify-center gap-4 sm:flex-row">
<Link
href="/docs"
className="inline-flex items-center justify-center rounded-lg bg-gradient-to-r from-blue-600 to-purple-600 px-8 py-3.5 text-base font-semibold text-white shadow-lg transition-all hover:shadow-xl hover:scale-105"
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The hover effect hover:scale-105 on the primary CTA button could cause layout shift issues. Consider using transform-gpu or will-change-transform to improve performance and prevent layout instability.

Suggested change
className="inline-flex items-center justify-center rounded-lg bg-gradient-to-r from-blue-600 to-purple-600 px-8 py-3.5 text-base font-semibold text-white shadow-lg transition-all hover:shadow-xl hover:scale-105"
className="inline-flex items-center justify-center rounded-lg bg-gradient-to-r from-blue-600 to-purple-600 px-8 py-3.5 text-base font-semibold text-white shadow-lg transition-all transform-gpu will-change-[transform] hover:shadow-xl hover:scale-105"

Copilot uses AI. Check for mistakes.
>
Get Started
<svg className="ml-2 h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The inline SVG icon lacks accessibility attributes. Add an aria-label or aria-hidden attribute to provide context for screen readers or explicitly mark it as decorative.

Suggested change
<svg className="ml-2 h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<svg
className="ml-2 h-5 w-5"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
focusable="false"
>

Copilot uses AI. Check for mistakes.
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 7l5 5m0 0l-5 5m5-5H6" />
</svg>
</Link>
<a
href="https://github.com/objectstack-ai/objectui"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center justify-center rounded-lg border-2 border-gray-300 bg-white px-8 py-3.5 text-base font-semibold text-gray-900 transition-all hover:border-gray-400 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-white dark:hover:border-gray-500 dark:hover:bg-gray-700"
>
<svg className="mr-2 h-5 w-5" fill="currentColor" viewBox="0 0 24 24">
<path fillRule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clipRule="evenodd" />
</svg>
Comment on lines +52 to +54
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The GitHub icon SVG lacks accessibility attributes. Add aria-hidden="true" to mark it as decorative since the adjacent text "View on GitHub" already provides the context.

Copilot uses AI. Check for mistakes.
View on GitHub
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The external link to GitHub lacks a visual indicator for screen readers to announce that it opens in a new tab. While rel="noopener noreferrer" is correctly included for security, consider adding sr-only text like "(opens in new tab)" to improve accessibility.

Suggested change
View on GitHub
View on GitHub
<span className="sr-only">(opens in a new tab)</span>

Copilot uses AI. Check for mistakes.
</a>
</div>
</div>

{/* Code Preview */}
<div className="mx-auto mt-16 max-w-4xl">
<div className="relative rounded-2xl bg-gray-900 p-8 shadow-2xl ring-1 ring-gray-800">
<div className="flex items-center gap-2 mb-4">
<div className="h-3 w-3 rounded-full bg-red-500"></div>
<div className="h-3 w-3 rounded-full bg-yellow-500"></div>
<div className="h-3 w-3 rounded-full bg-green-500"></div>
</div>
<pre className="overflow-x-auto text-sm text-gray-300">
<code>{`{
"type": "page",
"title": "Dashboard",
"body": {
"type": "grid",
"columns": 3,
"items": [
{
"type": "card",
"title": "Total Users",
"value": "\${stats.users}"
},
{
"type": "card",
"title": "Revenue",
"value": "\${stats.revenue}"
},
{
"type": "card",
"title": "Orders",
"value": "\${stats.orders}"
}
]
}
}`}</code>
</pre>
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The code preview lacks a descriptive aria-label on the pre element. Add an aria-label to describe what the code example demonstrates, improving accessibility for screen reader users.

Copilot uses AI. Check for mistakes.
</div>
</div>
</div>
</section>

{/* Features Section */}
<section className="py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<div className="mx-auto max-w-2xl text-center mb-16">
<h2 className="text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl">
Why Choose ObjectUI?
</h2>
<p className="mt-4 text-lg text-gray-600 dark:text-gray-300">
Stop writing repetitive UI code. Build faster with better results.
</p>
</div>

<div className="mx-auto grid max-w-6xl grid-cols-1 gap-8 sm:grid-cols-2 lg:grid-cols-3">
{/* Feature 1 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-blue-100 dark:bg-blue-900">
<svg className="h-6 w-6 text-blue-600 dark:text-blue-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Blazing Fast
</h3>
<p className="text-gray-600 dark:text-gray-300">
3x faster page loads and 6x smaller bundle sizes compared to traditional low-code platforms. Built on React 18+ with automatic optimizations.
</p>
</div>

{/* Feature 2 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-purple-100 dark:bg-purple-900">
<svg className="h-6 w-6 text-purple-600 dark:text-purple-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" />
</svg>
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Beautiful by Default
</h3>
<p className="text-gray-600 dark:text-gray-300">
Professional designs using Tailwind CSS and Shadcn UI. Light/dark theme support, fully customizable, and WCAG 2.1 AA accessible.
</p>
</div>

{/* Feature 3 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-green-100 dark:bg-green-900">
<svg className="h-6 w-6 text-green-600 dark:text-green-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
</svg>
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Developer Friendly
</h3>
<p className="text-gray-600 dark:text-gray-300">
TypeScript-first with complete type definitions. Zero learning curve if you know React. Works with existing tools and workflows.
</p>
</div>

{/* Feature 4 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-orange-100 dark:bg-orange-900">
<svg className="h-6 w-6 text-orange-600 dark:text-orange-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
</svg>
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Production Ready
</h3>
<p className="text-gray-600 dark:text-gray-300">
85%+ test coverage, enterprise security built-in, comprehensive documentation, and active development support.
</p>
</div>

{/* Feature 5 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-pink-100 dark:bg-pink-900">
<svg className="h-6 w-6 text-pink-600 dark:text-pink-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z" />
</svg>
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Modular Architecture
</h3>
<p className="text-gray-600 dark:text-gray-300">
Tree-shakable packages, lazy-loaded plugins, and support for Server Components. Only load what you need.
</p>
</div>

{/* Feature 6 */}
<div className="relative rounded-2xl border border-gray-200 bg-white p-8 shadow-sm transition-all hover:shadow-lg dark:border-gray-700 dark:bg-gray-800">
<div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-cyan-100 dark:bg-cyan-900">
<svg className="h-6 w-6 text-cyan-600 dark:text-cyan-300" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4" />
</svg>
Comment on lines 42 to 193
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

According to ObjectUI coding guidelines, Lucide Icons should be used instead of inline SVGs. The ObjectUI project explicitly uses lucide-react as a UI primitive. Consider replacing the inline SVG icons with Lucide React components for consistency with the project's architecture and to reduce code duplication.

Copilot generated this review using guidance from repository custom instructions.
</div>
<h3 className="mb-2 text-xl font-semibold text-gray-900 dark:text-white">
Backend Agnostic
</h3>
<p className="text-gray-600 dark:text-gray-300">
Works with any backend through universal DataSource interface. REST, GraphQL, Firebase, or custom adapters.
</p>
</div>
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

All decorative SVG icons in the features section lack accessibility attributes. Add aria-hidden="true" to each SVG since they are purely decorative and the heading text already conveys the meaning.

Copilot uses AI. Check for mistakes.
</div>
</div>
</section>

{/* Stats Section */}
<section className="bg-gradient-to-r from-blue-600 to-purple-600 py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<div className="grid grid-cols-1 gap-8 sm:grid-cols-3 text-center text-white">
<div>
<div className="text-5xl font-bold mb-2">60+</div>
<div className="text-xl opacity-90">Components</div>
</div>
<div>
<div className="text-5xl font-bold mb-2">85%+</div>
<div className="text-xl opacity-90">Test Coverage</div>
</div>
<div>
<div className="text-5xl font-bold mb-2">50KB</div>
<div className="text-xl opacity-90">Bundle Size</div>
</div>
</div>
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The semantic HTML could be improved by wrapping the stat values in appropriate elements. Consider using a

(description list) structure with
and
tags for better semantic markup and screen reader compatibility.

Suggested change
<div className="grid grid-cols-1 gap-8 sm:grid-cols-3 text-center text-white">
<div>
<div className="text-5xl font-bold mb-2">60+</div>
<div className="text-xl opacity-90">Components</div>
</div>
<div>
<div className="text-5xl font-bold mb-2">85%+</div>
<div className="text-xl opacity-90">Test Coverage</div>
</div>
<div>
<div className="text-5xl font-bold mb-2">50KB</div>
<div className="text-xl opacity-90">Bundle Size</div>
</div>
</div>
<dl className="grid grid-cols-1 gap-8 sm:grid-cols-3 text-center text-white">
<div>
<dd className="text-5xl font-bold mb-2">60+</dd>
<dt className="text-xl opacity-90">Components</dt>
</div>
<div>
<dd className="text-5xl font-bold mb-2">85%+</dd>
<dt className="text-xl opacity-90">Test Coverage</dt>
</div>
<div>
<dd className="text-5xl font-bold mb-2">50KB</dd>
<dt className="text-xl opacity-90">Bundle Size</dt>
</div>
</dl>

Copilot uses AI. Check for mistakes.
</div>
</section>

{/* Use Cases Section */}
<section className="py-24 sm:py-32 bg-gray-50 dark:bg-gray-900">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<div className="mx-auto max-w-2xl text-center mb-16">
<h2 className="text-3xl font-bold tracking-tight text-gray-900 dark:text-white sm:text-4xl">
What Can You Build?
</h2>
<p className="mt-4 text-lg text-gray-600 dark:text-gray-300">
From admin panels to dashboards, ObjectUI handles it all
</p>
</div>

<div className="mx-auto grid max-w-6xl grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3">
{[
{ icon: "๐Ÿ“Š", title: "Dashboards", desc: "Data visualization and analytics" },
{ icon: "โš™๏ธ", title: "Admin Panels", desc: "Complete CRUD interfaces" },
{ icon: "๐Ÿ“", title: "Forms", desc: "Complex multi-step forms" },
{ icon: "๐Ÿ“„", title: "CMS", desc: "Content management systems" },
{ icon: "๐Ÿ”ง", title: "Internal Tools", desc: "Business applications" },
{ icon: "๐ŸŽจ", title: "Prototypes", desc: "Rapid UI prototyping" }
].map((useCase) => (
Comment on lines +239 to +246
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The use case data is defined inline within the JSX map function. Consider extracting this array to a constant at the top of the file or in a separate configuration file to improve code maintainability and make it easier to update the content.

Copilot uses AI. Check for mistakes.
<div key={useCase.title} className="rounded-xl border border-gray-200 bg-white p-6 dark:border-gray-700 dark:bg-gray-800">
<div className="text-4xl mb-3">{useCase.icon}</div>
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-1">
{useCase.title}
</h3>
<p className="text-gray-600 dark:text-gray-300 text-sm">
{useCase.desc}
</p>
</div>
))}
</div>
</div>
</section>

{/* CTA Section */}
<section className="py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8">
<div className="relative overflow-hidden rounded-3xl bg-gradient-to-r from-blue-600 to-purple-600 px-8 py-16 text-center shadow-2xl sm:px-16">
<div className="relative z-10">
<h2 className="text-3xl font-bold tracking-tight text-white sm:text-4xl">
Ready to Build Something Amazing?
</h2>
<p className="mx-auto mt-6 max-w-2xl text-lg text-blue-100">
Join developers who are building faster with ObjectUI. Get started in minutes with our comprehensive documentation.
</p>
<div className="mt-10 flex items-center justify-center gap-4">
<Link
href="/docs"
className="rounded-lg bg-white px-8 py-3.5 text-base font-semibold text-blue-600 shadow-lg transition-all hover:bg-blue-50"
>
Get Started Now
</Link>
<a
href="https://github.com/objectstack-ai/objectui"
target="_blank"
rel="noopener noreferrer"
className="rounded-lg border-2 border-white bg-transparent px-8 py-3.5 text-base font-semibold text-white transition-all hover:bg-white hover:text-blue-600"
>
Star on GitHub
Copy link

Copilot AI Jan 20, 2026

Choose a reason for hiding this comment

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

The external link to GitHub in the CTA section also lacks a visual indicator for screen readers to announce that it opens in a new tab. Consider adding sr-only text like "(opens in new tab)" to improve accessibility.

Suggested change
Star on GitHub
Star on GitHub
<span className="sr-only">(opens in new tab)</span>

Copilot uses AI. Check for mistakes.
</a>
</div>
</div>
</div>
</div>
</section>

{/* Footer */}
<footer className="border-t border-gray-200 dark:border-gray-800">
<div className="mx-auto max-w-7xl px-6 py-12 lg:px-8">
<p className="text-center text-sm text-gray-600 dark:text-gray-400">
Built with โค๏ธ by the{' '}
<a href="https://github.com/objectstack-ai" className="font-medium hover:text-gray-900 dark:hover:text-white">
ObjectStack Team
</a>
</p>
</div>
</footer>
</main>
);
}
Loading