Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
1019a63
Initial plan
Copilot Jan 14, 2026
1bc65d9
Add core design management features - storage service, My Designs pag…
Copilot Jan 14, 2026
4b2de5a
Fix JSX syntax error and test playground functionality successfully
Copilot Jan 14, 2026
2947fbb
Fix code review issues - replace deprecated substr() and remove type …
Copilot Jan 14, 2026
79a968f
Merge branch 'main' into copilot/refactor-playground-for-evaluation
hotlong Jan 14, 2026
4113ae1
优化 MyDesigns 组件,移除不必要的 useEffect,直接从设计存储加载初始设计;更新 Design 接口中的 schema …
hotlong Jan 14, 2026
15ef741
修复 KanbanColumn 组件中的卡片处理逻辑,确保安全卡片数组的使用,避免潜在的未定义错误;更新 KanbanBoard 组件以使…
hotlong Jan 14, 2026
b76f864
Add Page layout component and schema
hotlong Jan 14, 2026
39a3854
Address code review feedback - add UUID generation, toast notificatio…
Copilot Jan 14, 2026
d4062a4
Enhance PageRenderer with className and props support
hotlong Jan 14, 2026
0bdaa7d
Merge branch 'copilot/refactor-playground-for-evaluation' of https://…
hotlong Jan 14, 2026
eb3d7da
修复设计导出错误处理,简化异常捕获逻辑
hotlong Jan 14, 2026
8c2d2d4
Add lint, test, and type-check scripts to plugins
hotlong Jan 14, 2026
f0ef37e
为 @object-ui/plugin-charts、@object-ui/plugin-editor、@object-ui/plugin…
hotlong Jan 14, 2026
457d1f9
更新 ESLint 配置,添加 TypeScript 和 React 插件,提升代码质量;在多个包中添加 lint 和类型检查脚本
hotlong Jan 14, 2026
bfa9af1
Merge branch 'main' into copilot/refactor-playground-for-evaluation
hotlong Jan 14, 2026
10c4c96
重构 Canvas 组件,提取 findNodeInSchema 函数至顶层,并添加选中节点边界测量逻辑以支持调整大小
hotlong Jan 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions apps/playground/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@
"@object-ui/designer": "workspace:*",
"@object-ui/plugin-charts": "workspace:*",
"@object-ui/plugin-editor": "workspace:*",
"@object-ui/plugin-kanban": "workspace:*",
"@object-ui/plugin-markdown": "workspace:*",
"@object-ui/react": "workspace:*",
"lucide-react": "^0.469.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^7.12.0",
"@object-ui/plugin-markdown": "workspace:*",
"@object-ui/plugin-kanban": "workspace:*"
"sonner": "^2.0.7"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
Expand Down
10 changes: 8 additions & 2 deletions apps/playground/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import { Toaster } from 'sonner';
import { Home } from './pages/Home';
import { Studio } from './pages/Studio';
import { MyDesigns } from './pages/MyDesigns';
import '@object-ui/components';

// Import lazy-loaded plugins
Expand All @@ -15,9 +17,13 @@ import './index.css';
export default function App() {
return (
<Router>
<Toaster position="top-right" richColors />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/:id" element={<Studio />} />
<Route path="/my-designs" element={<MyDesigns />} />
<Route path="/studio/:id" element={<Studio />} />
{/* Default redirect to first example if typed manually specifically */}
<Route path="/studio" element={<Navigate to="/studio/dashboard" replace />} />
</Routes>
</Router>
);
Expand Down
59 changes: 46 additions & 13 deletions apps/playground/src/pages/Home.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { exampleCategories } from '../data/examples';
import { LayoutTemplate, ArrowRight, Component, Layers, Database, Shield, Box } from 'lucide-react';
import { LayoutTemplate, ArrowRight, Component, Layers, Database, Shield, Box, FolderOpen, Plus } from 'lucide-react';

const CategoryIcon = ({ name }: { name: string }) => {
switch (name) {
Expand Down Expand Up @@ -29,16 +29,32 @@ export const Home = () => {
</div>
<span className="font-bold text-xl tracking-tight bg-gradient-to-r from-gray-900 to-gray-600 bg-clip-text text-transparent">Object UI Studio</span>
</div>
<a
href="https://github.com/objectql/objectui"
target="_blank"
className="flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-900 bg-white/50 hover:bg-white border border-gray-200 rounded-lg transition-all shadow-sm hover:shadow"
>
<svg className="w-4 h-4" 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>
GitHub
</a>
<div className="flex items-center gap-3">
<button
onClick={() => navigate('/studio/new')}
className="flex items-center gap-2 px-4 py-2 text-sm font-semibold text-indigo-600 bg-indigo-50 hover:bg-indigo-100 border border-indigo-200 rounded-lg transition-all shadow-sm hover:shadow"
>
<Plus className="w-4 h-4" />
New Design
</button>
<button
onClick={() => navigate('/my-designs')}
className="flex items-center gap-2 px-4 py-2 text-sm font-semibold text-gray-700 hover:text-gray-900 bg-white/50 hover:bg-white border border-gray-200 rounded-lg transition-all shadow-sm hover:shadow"
>
<FolderOpen className="w-4 h-4" />
My Designs
</button>
<a
href="https://github.com/objectql/objectui"
target="_blank"
className="flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-900 bg-white/50 hover:bg-white border border-gray-200 rounded-lg transition-all shadow-sm hover:shadow"
>
<svg className="w-4 h-4" 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>
GitHub
</a>
</div>
</div>
</header>

Expand All @@ -62,11 +78,28 @@ export const Home = () => {
Build Stunning Interfaces,<br />
<span className="bg-gradient-to-r from-indigo-600 via-purple-600 to-pink-600 bg-clip-text text-transparent">Purely from JSON.</span>
</h1>
<p className="max-w-2xl mx-auto text-xl text-gray-600 leading-relaxed">
<p className="max-w-2xl mx-auto text-xl text-gray-600 leading-relaxed mb-8">
Object UI transforms JSON schemas into fully functional, accessible, and responsive React applications.
<br className="hidden sm:block" />
<span className="font-semibold text-gray-700">Select a template below to start building.</span>
<span className="font-semibold text-gray-700">Select a template below or start from scratch.</span>
</p>

<div className="flex justify-center gap-4">
<button
onClick={() => navigate('/studio/new')}
className="flex items-center gap-2 px-6 py-3 text-lg font-bold text-white bg-gradient-to-r from-indigo-600 to-purple-600 hover:from-indigo-700 hover:to-purple-700 rounded-xl shadow-lg shadow-indigo-300/50 transition-all transform hover:scale-105"
>
<Plus className="w-5 h-5" />
Start New Design
</button>
<button
onClick={() => navigate('/my-designs')}
className="flex items-center gap-2 px-6 py-3 text-lg font-bold text-gray-700 bg-white hover:bg-gray-50 border-2 border-gray-200 rounded-xl shadow-lg transition-all transform hover:scale-105"
>
<FolderOpen className="w-5 h-5" />
Open Saved
</button>
</div>
</div>

{/* Category Filter */}
Expand Down
Loading