+ {/* 1. Sidebar: Example Selector */}
+
+
+ {/* 2. Middle: Code Editor */}
+
+
+
JSON Schema
+
+
+
+ {jsonError && (
+
+ JSON Error: {jsonError}
+
+ )}
+
+
+ setCode(val || '')}
+ options={{
+ minimap: { enabled: false },
+ fontSize: 14,
+ lineNumbers: 'on',
+ scrollBeyondLastLine: false,
+ automaticLayout: true,
+ tabSize: 2,
+ }}
+ theme="vs-light"
+ />
+
+
+
+ {/* 3. Right: Live Preview */}
+
+
+
Preview
+
+ {/* Viewport Size Toggles */}
+
+
+
+
+
+
+
+
+
+
+ {schema && !jsonError ? (
+
+ ) : (
+
+ {jsonError ? (
+
+
Invalid JSON
+
Fix the syntax error to see the preview
+
+ ) : (
+
Select an example to get started
+ )}
+
+ )}
+
+
+
+
+
+ );
+}
diff --git a/apps/playground/src/data/examples.ts b/apps/playground/src/data/examples.ts
new file mode 100644
index 000000000..8c393c104
--- /dev/null
+++ b/apps/playground/src/data/examples.ts
@@ -0,0 +1,650 @@
+/**
+ * Predefined JSON schema examples for the Object UI Playground
+ * Organized by category to showcase different capabilities
+ */
+
+export const examples = {
+ // A. Basic Primitives - Showcase Shadcn component wrapping
+ 'input-states': `{
+ "type": "div",
+ "className": "space-y-6 max-w-md",
+ "body": [
+ {
+ "type": "div",
+ "className": "space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "Input Component States",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "Demonstrating various input states and configurations",
+ "className": "text-muted-foreground"
+ }
+ ]
+ },
+ {
+ "type": "input",
+ "label": "Regular Input",
+ "id": "regular",
+ "placeholder": "Enter your name"
+ },
+ {
+ "type": "input",
+ "label": "Required Field",
+ "id": "required",
+ "required": true,
+ "placeholder": "This field is required"
+ },
+ {
+ "type": "input",
+ "label": "Disabled Input",
+ "id": "disabled",
+ "disabled": true,
+ "value": "Cannot edit this"
+ },
+ {
+ "type": "input",
+ "label": "Email Input",
+ "id": "email",
+ "inputType": "email",
+ "placeholder": "user@example.com"
+ }
+ ]
+}`,
+
+ 'button-variants': `{
+ "type": "div",
+ "className": "space-y-6 max-w-2xl",
+ "body": [
+ {
+ "type": "div",
+ "className": "space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "Button Variants",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "Different button styles using Shadcn variants",
+ "className": "text-muted-foreground"
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "className": "space-y-4",
+ "body": [
+ {
+ "type": "div",
+ "className": "flex flex-wrap gap-2",
+ "body": [
+ {
+ "type": "button",
+ "label": "Default"
+ },
+ {
+ "type": "button",
+ "label": "Destructive",
+ "variant": "destructive"
+ },
+ {
+ "type": "button",
+ "label": "Outline",
+ "variant": "outline"
+ },
+ {
+ "type": "button",
+ "label": "Secondary",
+ "variant": "secondary"
+ },
+ {
+ "type": "button",
+ "label": "Ghost",
+ "variant": "ghost"
+ },
+ {
+ "type": "button",
+ "label": "Link",
+ "variant": "link"
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "className": "space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "Tailwind Native: Custom Styling",
+ "className": "text-sm font-semibold"
+ },
+ {
+ "type": "button",
+ "label": "Purple Custom Button",
+ "className": "bg-purple-500 hover:bg-purple-700 text-white"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}`,
+
+ // B. Complex Layouts - The killer feature
+ 'grid-layout': `{
+ "type": "div",
+ "className": "space-y-6",
+ "body": [
+ {
+ "type": "div",
+ "className": "space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "Responsive Grid Layout",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "Complex nested grid with responsive breakpoints",
+ "className": "text-muted-foreground"
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "className": "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
+ "body": [
+ {
+ "type": "card",
+ "className": "md:col-span-2",
+ "title": "Wide Card",
+ "description": "This card spans 2 columns on medium screens",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Try resizing your browser to see the responsive behavior!"
+ }
+ }
+ },
+ {
+ "type": "card",
+ "title": "Regular Card",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Standard card"
+ }
+ }
+ },
+ {
+ "type": "card",
+ "title": "Card 1",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Content 1"
+ }
+ }
+ },
+ {
+ "type": "card",
+ "title": "Card 2",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Content 2"
+ }
+ }
+ },
+ {
+ "type": "card",
+ "title": "Card 3",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Content 3"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}`,
+
+ 'dashboard': `{
+ "type": "div",
+ "className": "space-y-6",
+ "body": [
+ {
+ "type": "div",
+ "className": "flex items-center justify-between",
+ "body": [
+ {
+ "type": "div",
+ "className": "space-y-1",
+ "body": [
+ {
+ "type": "text",
+ "content": "Analytics Dashboard",
+ "className": "text-2xl font-bold tracking-tight"
+ },
+ {
+ "type": "text",
+ "content": "Overview of your project performance and metrics.",
+ "className": "text-sm text-muted-foreground"
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "className": "flex items-center gap-2",
+ "body": [
+ {
+ "type": "button",
+ "label": "Download",
+ "variant": "outline",
+ "size": "sm"
+ },
+ {
+ "type": "button",
+ "label": "Create Report",
+ "size": "sm"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "div",
+ "className": "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
+ "body": [
+ {
+ "type": "card",
+ "className": "shadow-sm hover:shadow-md transition-shadow",
+ "body": [
+ {
+ "type": "div",
+ "className": "p-6 pb-2",
+ "body": {
+ "type": "text",
+ "content": "Total Revenue",
+ "className": "text-sm font-medium text-muted-foreground"
+ }
+ },
+ {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": [
+ {
+ "type": "text",
+ "content": "$45,231.89",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "+20.1% from last month",
+ "className": "text-xs text-muted-foreground mt-1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "card",
+ "className": "shadow-sm hover:shadow-md transition-shadow",
+ "body": [
+ {
+ "type": "div",
+ "className": "p-6 pb-2",
+ "body": {
+ "type": "text",
+ "content": "Subscriptions",
+ "className": "text-sm font-medium text-muted-foreground"
+ }
+ },
+ {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": [
+ {
+ "type": "text",
+ "content": "+2,350",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "+180.1% from last month",
+ "className": "text-xs text-muted-foreground mt-1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "card",
+ "className": "shadow-sm hover:shadow-md transition-shadow",
+ "body": [
+ {
+ "type": "div",
+ "className": "p-6 pb-2",
+ "body": {
+ "type": "text",
+ "content": "Sales",
+ "className": "text-sm font-medium text-muted-foreground"
+ }
+ },
+ {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": [
+ {
+ "type": "text",
+ "content": "+12,234",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "+19% from last month",
+ "className": "text-xs text-muted-foreground mt-1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "card",
+ "className": "shadow-sm hover:shadow-md transition-shadow",
+ "body": [
+ {
+ "type": "div",
+ "className": "p-6 pb-2",
+ "body": {
+ "type": "text",
+ "content": "Active Now",
+ "className": "text-sm font-medium text-muted-foreground"
+ }
+ },
+ {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": [
+ {
+ "type": "text",
+ "content": "+573",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "+201 since last hour",
+ "className": "text-xs text-muted-foreground mt-1"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "card",
+ "className": "shadow-sm",
+ "title": "Recent Activity",
+ "description": "Your latest component interactions",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0 space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "Schema updated successfully",
+ "className": "text-sm"
+ },
+ {
+ "type": "text",
+ "content": "New component rendered at 10:42 AM",
+ "className": "text-sm text-muted-foreground"
+ }
+ ]
+ }
+ }
+ ]
+}`,
+
+ 'tabs-demo': `{
+ "type": "div",
+ "className": "space-y-6",
+ "body": [
+ {
+ "type": "text",
+ "content": "Tabs Component",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "tabs",
+ "defaultValue": "account",
+ "className": "w-full",
+ "items": [
+ {
+ "value": "account",
+ "label": "Account",
+ "body": {
+ "type": "card",
+ "title": "Account Settings",
+ "description": "Make changes to your account here.",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0 space-y-4",
+ "body": [
+ {
+ "type": "input",
+ "label": "Name",
+ "id": "name",
+ "value": "Pedro Duarte"
+ },
+ {
+ "type": "input",
+ "label": "Username",
+ "id": "username",
+ "value": "@peduarte"
+ },
+ {
+ "type": "button",
+ "label": "Save changes"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "value": "password",
+ "label": "Password",
+ "body": {
+ "type": "card",
+ "title": "Password",
+ "description": "Change your password here.",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0 space-y-4",
+ "body": [
+ {
+ "type": "input",
+ "label": "Current password",
+ "id": "current",
+ "inputType": "password"
+ },
+ {
+ "type": "input",
+ "label": "New password",
+ "id": "new",
+ "inputType": "password"
+ },
+ {
+ "type": "button",
+ "label": "Update password"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "value": "notifications",
+ "label": "Notifications",
+ "body": {
+ "type": "card",
+ "title": "Notifications",
+ "description": "Configure how you receive notifications.",
+ "body": {
+ "type": "div",
+ "className": "p-6 pt-0",
+ "body": {
+ "type": "text",
+ "content": "Notification settings will be displayed here."
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}`,
+
+ // C. Form with simple structure (no data linkage for now as that requires runtime state)
+ 'form-demo': `{
+ "type": "div",
+ "className": "max-w-2xl space-y-6",
+ "body": [
+ {
+ "type": "div",
+ "className": "space-y-2",
+ "body": [
+ {
+ "type": "text",
+ "content": "User Registration Form",
+ "className": "text-2xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "A comprehensive form demonstrating various input types",
+ "className": "text-muted-foreground"
+ }
+ ]
+ },
+ {
+ "type": "card",
+ "className": "shadow-sm",
+ "body": {
+ "type": "div",
+ "className": "p-6 space-y-6",
+ "body": [
+ {
+ "type": "div",
+ "className": "grid gap-4 md:grid-cols-2",
+ "body": [
+ {
+ "type": "input",
+ "label": "First Name",
+ "id": "firstName",
+ "required": true,
+ "placeholder": "John"
+ },
+ {
+ "type": "input",
+ "label": "Last Name",
+ "id": "lastName",
+ "required": true,
+ "placeholder": "Doe"
+ }
+ ]
+ },
+ {
+ "type": "input",
+ "label": "Email Address",
+ "id": "email",
+ "inputType": "email",
+ "required": true,
+ "placeholder": "john.doe@example.com"
+ },
+ {
+ "type": "input",
+ "label": "Password",
+ "id": "password",
+ "inputType": "password",
+ "required": true,
+ "placeholder": "••••••••"
+ },
+ {
+ "type": "div",
+ "className": "flex items-center justify-end gap-2",
+ "body": [
+ {
+ "type": "button",
+ "label": "Cancel",
+ "variant": "outline"
+ },
+ {
+ "type": "button",
+ "label": "Create Account"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+}`,
+
+ 'simple-page': `{
+ "type": "div",
+ "className": "space-y-4",
+ "body": [
+ {
+ "type": "text",
+ "content": "Welcome to Object UI",
+ "className": "text-3xl font-bold"
+ },
+ {
+ "type": "text",
+ "content": "The Universal, Schema-Driven Rendering Engine",
+ "className": "text-xl text-muted-foreground"
+ },
+ {
+ "type": "div",
+ "className": "flex gap-2 mt-4",
+ "body": [
+ {
+ "type": "button",
+ "label": "Get Started"
+ },
+ {
+ "type": "button",
+ "label": "Learn More",
+ "variant": "outline"
+ }
+ ]
+ }
+ ]
+}`
+};
+
+export type ExampleKey = keyof typeof examples;
+
+export const exampleCategories = {
+ 'Primitives': ['simple-page', 'input-states', 'button-variants'],
+ 'Layouts': ['grid-layout', 'dashboard', 'tabs-demo'],
+ 'Forms': ['form-demo']
+};
diff --git a/apps/playground/src/index.css b/apps/playground/src/index.css
new file mode 100644
index 000000000..d924e2434
--- /dev/null
+++ b/apps/playground/src/index.css
@@ -0,0 +1,69 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 222.2 84% 4.9%;
+ --radius: 0.5rem;
+ --chart-1: 12 76% 61%;
+ --chart-2: 173 58% 39%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 212.7 26.8% 83.9%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/apps/playground/src/main.tsx b/apps/playground/src/main.tsx
new file mode 100644
index 000000000..cc14d8376
--- /dev/null
+++ b/apps/playground/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react';
+import { createRoot } from 'react-dom/client';
+import './index.css';
+import App from './App';
+
+createRoot(document.getElementById('root')!).render(
+
-
JSON Schema
+
+
+
JSON Schema
+
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 55266b828..f11f396b2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -117,6 +117,9 @@ importers:
vite:
specifier: ^7.2.4
version: 7.3.1(@types/node@24.10.8)(jiti@1.21.7)
+ vite-plugin-monaco-editor:
+ specifier: ^1.1.0
+ version: 1.1.0(monaco-editor@0.55.1)
docs:
devDependencies:
@@ -4151,6 +4154,11 @@ packages:
vite:
optional: true
+ vite-plugin-monaco-editor@1.1.0:
+ resolution: {integrity: sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==}
+ peerDependencies:
+ monaco-editor: '>=0.33.0'
+
vite@5.4.21:
resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -8199,6 +8207,10 @@ snapshots:
- rollup
- supports-color
+ vite-plugin-monaco-editor@1.1.0(monaco-editor@0.55.1):
+ dependencies:
+ monaco-editor: 0.55.1
+
vite@5.4.21(@types/node@24.10.8):
dependencies:
esbuild: 0.21.5
From f2c426f1b6beeda0dbea39ba1d55e385b9ef727c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 13 Jan 2026 18:31:05 +0000
Subject: [PATCH 4/6] fix: add vite-env.d.ts and fix TypeScript build errors
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
apps/playground/src/App.tsx | 2 +-
apps/playground/src/vite-env.d.ts | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 apps/playground/src/vite-env.d.ts
diff --git a/apps/playground/src/App.tsx b/apps/playground/src/App.tsx
index 3fb4db246..1b13f23a2 100644
--- a/apps/playground/src/App.tsx
+++ b/apps/playground/src/App.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from 'react';
+import { useState, useEffect } from 'react';
import { SchemaRenderer } from '@object-ui/react';
import '@object-ui/components';
import { examples, exampleCategories, ExampleKey } from './data/examples';
diff --git a/apps/playground/src/vite-env.d.ts b/apps/playground/src/vite-env.d.ts
new file mode 100644
index 000000000..11f02fe2a
--- /dev/null
+++ b/apps/playground/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
From 9b62c3558eb7ee92daad6c6f46726323eb33f083 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 13 Jan 2026 18:33:33 +0000
Subject: [PATCH 5/6] fix: address code review feedback - add
tailwindcss-animate, fix typos
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
README.md | 2 -
apps/playground/package.json | 1 +
apps/playground/src/data/examples.ts | 2 +-
apps/playground/vite.config.ts | 2 +-
pnpm-lock.yaml | 72 ++--------------------------
5 files changed, 6 insertions(+), 73 deletions(-)
diff --git a/README.md b/README.md
index 6a6035ce7..d0eab9714 100644
--- a/README.md
+++ b/README.md
@@ -207,5 +207,3 @@ Licensed under the [MIT License](https://www.google.com/search?q=LICENSE).
Built with ❤️ by the Object Ecosystem Team.
-
-```
diff --git a/apps/playground/package.json b/apps/playground/package.json
index 54562eb57..30a8a2490 100644
--- a/apps/playground/package.json
+++ b/apps/playground/package.json
@@ -25,6 +25,7 @@
"autoprefixer": "^10.4.23",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.19",
+ "tailwindcss-animate": "^1.0.7",
"typescript": "~5.9.3",
"vite": "^7.2.4"
}
diff --git a/apps/playground/src/data/examples.ts b/apps/playground/src/data/examples.ts
index 8c393c104..1af817fab 100644
--- a/apps/playground/src/data/examples.ts
+++ b/apps/playground/src/data/examples.ts
@@ -20,7 +20,7 @@ export const examples = {
},
{
"type": "text",
- "content": "Demonstrating various input states and configurations",
+ "content": "Demonstrates various input states and configurations",
"className": "text-muted-foreground"
}
]
diff --git a/apps/playground/vite.config.ts b/apps/playground/vite.config.ts
index b521469a9..486187985 100644
--- a/apps/playground/vite.config.ts
+++ b/apps/playground/vite.config.ts
@@ -2,7 +2,7 @@ import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
-// https://vite.dev/config/
+// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
resolve: {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f11f396b2..389aeaaaf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -71,9 +71,6 @@ importers:
apps/playground:
dependencies:
- '@monaco-editor/react':
- specifier: ^4.6.0
- version: 4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@object-ui/components':
specifier: workspace:*
version: link:../../packages/components
@@ -111,15 +108,15 @@ importers:
tailwindcss:
specifier: ^3.4.19
version: 3.4.19
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.19)
typescript:
specifier: ~5.9.3
version: 5.9.3
vite:
specifier: ^7.2.4
version: 7.3.1(@types/node@24.10.8)(jiti@1.21.7)
- vite-plugin-monaco-editor:
- specifier: ^1.1.0
- version: 1.1.0(monaco-editor@0.55.1)
docs:
devDependencies:
@@ -1165,16 +1162,6 @@ packages:
'@microsoft/tsdoc@0.16.0':
resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==}
- '@monaco-editor/loader@1.7.0':
- resolution: {integrity: sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==}
-
- '@monaco-editor/react@4.7.0':
- resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==}
- peerDependencies:
- monaco-editor: '>= 0.25.0 < 1'
- react: 18.3.1
- react-dom: 18.3.1
-
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -2173,9 +2160,6 @@ packages:
'@types/react@18.3.12':
resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
- '@types/trusted-types@2.0.7':
- resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
-
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
@@ -2795,9 +2779,6 @@ packages:
dom-accessibility-api@0.6.3:
resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
- dompurify@3.2.7:
- resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==}
-
electron-to-chromium@1.5.267:
resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
@@ -3338,11 +3319,6 @@ packages:
mark.js@8.11.1:
resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
- marked@14.0.0:
- resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==}
- engines: {node: '>= 18'}
- hasBin: true
-
mdast-util-to-hast@13.2.1:
resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
@@ -3403,9 +3379,6 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
- monaco-editor@0.55.1:
- resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==}
-
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -3851,9 +3824,6 @@ packages:
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
- state-local@1.0.7:
- resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==}
-
std-env@3.10.0:
resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==}
@@ -4154,11 +4124,6 @@ packages:
vite:
optional: true
- vite-plugin-monaco-editor@1.1.0:
- resolution: {integrity: sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==}
- peerDependencies:
- monaco-editor: '>=0.33.0'
-
vite@5.4.21:
resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -5024,17 +4989,6 @@ snapshots:
'@microsoft/tsdoc@0.16.0': {}
- '@monaco-editor/loader@1.7.0':
- dependencies:
- state-local: 1.0.7
-
- '@monaco-editor/react@4.7.0(monaco-editor@0.55.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@monaco-editor/loader': 1.7.0
- monaco-editor: 0.55.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -6056,9 +6010,6 @@ snapshots:
'@types/prop-types': 15.7.15
csstype: 3.2.3
- '@types/trusted-types@2.0.7':
- optional: true
-
'@types/unist@3.0.3': {}
'@types/use-sync-external-store@0.0.6': {}
@@ -6748,10 +6699,6 @@ snapshots:
dom-accessibility-api@0.6.3: {}
- dompurify@3.2.7:
- optionalDependencies:
- '@types/trusted-types': 2.0.7
-
electron-to-chromium@1.5.267: {}
embla-carousel-react@8.6.0(react@18.3.1):
@@ -7385,8 +7332,6 @@ snapshots:
mark.js@8.11.1: {}
- marked@14.0.0: {}
-
mdast-util-to-hast@13.2.1:
dependencies:
'@types/hast': 3.0.4
@@ -7454,11 +7399,6 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.2
- monaco-editor@0.55.1:
- dependencies:
- dompurify: 3.2.7
- marked: 14.0.0
-
mrmime@2.0.1: {}
ms@2.1.3: {}
@@ -7876,8 +7816,6 @@ snapshots:
stackback@0.0.2: {}
- state-local@1.0.7: {}
-
std-env@3.10.0: {}
string-argv@0.3.2: {}
@@ -8207,10 +8145,6 @@ snapshots:
- rollup
- supports-color
- vite-plugin-monaco-editor@1.1.0(monaco-editor@0.55.1):
- dependencies:
- monaco-editor: 0.55.1
-
vite@5.4.21(@types/node@24.10.8):
dependencies:
esbuild: 0.21.5
From 57cab786c47e673a0881811456388cd3785a2b5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=84=E6=80=A1?=
Date: Wed, 14 Jan 2026 02:37:23 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
apps/playground/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/playground/README.md b/apps/playground/README.md
index 55d1b6a7b..b871400d8 100644
--- a/apps/playground/README.md
+++ b/apps/playground/README.md
@@ -4,7 +4,7 @@ A live, interactive playground to showcase Object UI's schema-driven rendering c
## Features
-- **Split View Editor**: Monaco Editor (VS Code style) on the left, live preview on the right
+- **Split View Editor**: JSON editor with syntax validation on the left, live preview on the right
- **Real-time Rendering**: See your changes instantly as you edit JSON schemas
- **Example Gallery**: Curated examples organized by category (Primitives, Layouts, Forms)
- **Responsive Preview**: Toggle between desktop, tablet, and mobile viewports