Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions packages/components/package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@
"@dnd-kit/utilities": "^3.2.2",
"@object-ui/core": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.8",
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/div.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DivSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('div',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: DivSchema; className?: string; [key: string]: any }) => (
<div className={className} {...props}>
{renderChildren(schema.body)}
</div>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/icon.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { IconSchema } from '@object-ui/types';
import { icons } from 'lucide-react';

ComponentRegistry.register('icon',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: IconSchema; className?: string; [key: string]: any }) => {
const Icon = (icons as any)[schema.name || schema.icon];
if (!Icon) return null;
return <Icon className={className} {...props} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/image.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ImageSchema } from '@object-ui/types';

ComponentRegistry.register('image',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ImageSchema; className?: string; [key: string]: any }) => (
<img
src={schema.src}
alt={schema.alt || ''}
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/basic/separator.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SeparatorSchema } from '@object-ui/types';
import { Separator } from '@/ui';

ComponentRegistry.register('separator',
({ className, ...props }) => (
<Separator className={className} {...props} />
({ schema, className, ...props }: { schema: SeparatorSchema; className?: string; [key: string]: any }) => (
<Separator orientation={schema.orientation} className={className} {...props} />
),
{
label: 'Separator',
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/span.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SpanSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('span',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: SpanSchema; className?: string; [key: string]: any }) => (
<span className={className} {...props}>
{renderChildren(schema.body)}
</span>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/basic/text.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TextSchema } from '@object-ui/types';

ComponentRegistry.register('text',
({ schema }) => (
({ schema }: { schema: TextSchema }) => (
<>{schema.content}</>
),
{
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/calendar-view.tsx
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { ComponentRegistry } from '@object-ui/core';
import { CalendarView, type CalendarEvent } from '@/ui';
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
import { CalendarView } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing CalendarEvent from the UI library to importing it from @object-ui/types. Verify that CalendarEvent is correctly exported from @object-ui/types and that the type definition matches what the CalendarView component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import React from 'react';

// Calendar View Renderer - Airtable-style calendar for displaying records as events
ComponentRegistry.register('calendar-view',
({ schema, className, onAction, ...props }) => {
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
// Transform schema data to CalendarEvent format
const events: CalendarEvent[] = React.useMemo(() => {
if (!schema.data || !Array.isArray(schema.data)) return [];
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/carousel.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { CarouselSchema } from '@object-ui/types';
import {
Carousel,
CarouselContent,
Expand All@@ -9,7 +10,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('carousel',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
<Carousel
opts={schema.opts}
orientation={schema.orientation || 'horizontal'}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/chatbot.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import { ComponentRegistry } from '@object-ui/core';
import { Chatbot, type ChatMessage } from '@/ui';
import type { ChatbotSchema, ChatMessage } from '@object-ui/types';
import { Chatbot } from '@/ui';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is changing from importing ChatMessage from the UI library to importing it from @object-ui/types. Verify that ChatMessage is correctly exported from @object-ui/types and that the type definition matches what the Chatbot component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.
import { useState } from 'react';

/**
Expand Down
66 changes: 1 addition & 65 deletions packages/components/src/renderers/complex/data-table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
// Enterprise-level DataTable Component (Airtable-like)
import React, { useState, useMemo, useRef, useEffect } from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { DataTableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Duplicate type definition. A local DataTableSchema interface is defined (lines 70-105) which conflicts with the imported DataTableSchema type from @object-ui/types (line 4). The local interface should be removed to use the centralized type definition from the types package, ensuring consistency and avoiding potential type mismatches.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand DownExpand Up@@ -38,71 +39,6 @@ import {

type SortDirection = 'asc' | 'desc' | null;

/**
* Column configuration for the data table.
* @interface Column
*/
interface Column {
/** Display name of the column */
header: string;
/** Key to access the data field in each row object */
accessorKey: string;
/** Optional CSS classes for the column header */
className?: string;
/** Optional CSS classes for the column cells */
cellClassName?: string;
/** Width of the column (e.g., '80px' or 80) */
width?: string | number;
/** Whether sorting is enabled for this column (default: true) */
sortable?: boolean;
/** Whether filtering is enabled for this column (default: true) */
filterable?: boolean;
/** Whether column resizing is enabled (default: true) */
resizable?: boolean;
}

/**
* Schema definition for the enterprise data table component.
* Supports sorting, pagination, search, row selection, CSV export, and row actions.
* @interface DataTableSchema
*/
interface DataTableSchema {
/** Optional caption text displayed above the table */
caption?: string;
/** Array of column definitions */
columns: Column[];
/** Array of data objects to display. Each object should have an 'id' field for stable row identification */
data: any[];
/** Enable/disable pagination (default: true) */
pagination?: boolean;
/** Number of rows per page (default: 10) */
pageSize?: number;
/** Enable/disable search across all columns (default: true) */
searchable?: boolean;
/** Enable/disable row selection with checkboxes (default: false) */
selectable?: boolean;
/** Enable/disable column sorting (default: true) */
sortable?: boolean;
/** Enable/disable CSV export button (default: false) */
exportable?: boolean;
/** Show/hide edit and delete action buttons for each row (default: false) */
rowActions?: boolean;
/** Enable/disable column resizing by dragging (default: true) */
resizableColumns?: boolean;
/** Enable/disable column reordering by dragging (default: true) */
reorderableColumns?: boolean;
/** Callback function triggered when the edit button is clicked */
onRowEdit?: (row: any) => void;
/** Callback function triggered when the delete button is clicked */
onRowDelete?: (row: any) => void;
/** Callback function triggered when row selection changes, receives array of selected rows */
onSelectionChange?: (selectedRows: any[]) => void;
/** Callback function triggered when columns are reordered */
onColumnsReorder?: (columns: Column[]) => void;
/** Optional CSS classes for the table container */
className?: string;
}

/**
* Enterprise-level data table component with Airtable-like features.
*
Expand Down
5 changes: 3 additions & 2 deletions packages/components/src/renderers/complex/filter-builder.tsx
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import { FilterBuilder, type FilterGroup } from '@/ui/filter-builder';
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';
Comment on lines +2 to +3

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The import statement is removing the FilterGroup type from being imported from the UI library and instead importing it from @object-ui/types. Verify that FilterGroup is correctly exported from @object-ui/types and that the type definition matches what the FilterBuilder component expects. This is a potential breaking change if the types are not compatible.

Copilot uses AI. Check for mistakes.

ComponentRegistry.register('filter-builder',
({ schema, className, onChange, ...props }) => {
({ schema, className, onChange, ...props }: { schema: FilterBuilderSchema; className?: string; onChange?: (event: any) => void; [key: string]: any }) => {
const handleChange = (value: FilterGroup) => {
if (onChange) {
onChange({
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/kanban.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { KanbanSchema } from '@object-ui/types';
import { KanbanBoard, type KanbanColumn, type KanbanCard } from '@/ui';
import React from 'react';

ComponentRegistry.register('kanban',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: KanbanSchema; className?: string; [key: string]: any }) => {
return (
<KanbanBoard
columns={schema.columns || []}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/resizable.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import React from 'react';
import { ComponentRegistry } from '@object-ui/core';
import type { ResizableSchema } from '@object-ui/types';
import {
ResizablePanelGroup,
ResizablePanel,
Expand All@@ -8,7 +9,7 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('resizable',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ResizableSchema; className?: string; [key: string]: any }) => (
<ResizablePanelGroup
direction={schema.direction || 'horizontal'}
className={className}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/scroll-area.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ScrollAreaSchema } from '@object-ui/types';
import { ScrollArea, ScrollBar } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('scroll-area',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: ScrollAreaSchema; className?: string; [key: string]: any }) => (
<ScrollArea className={className} style={{ height: schema.height, width: schema.width }} {...props}>
{renderChildren(schema.content || schema.children)}
{schema.orientation === 'horizontal' && <ScrollBar orientation="horizontal" />}
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/table.tsx
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
// table.tsx implementation
import { ComponentRegistry } from '@object-ui/core';
import type { TableSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Table,
TableHeader,
Expand All@@ -13,7 +14,7 @@ import {

// A simple data-driven table
ComponentRegistry.register('table',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: TableSchema; className?: string; [key: string]: any }) => (
<Table className={className} {...props}>
{schema.caption && <TableCaption>{schema.caption}</TableCaption>}
<TableHeader>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/complex/timeline.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TimelineSchema } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

Missing type annotation for component props. The type import was added but the component function parameters are not typed. Add type annotation: ({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) to ensure type safety and consistency with the pattern used in other components in this PR.

Copilot uses AI. Check for mistakes.
import {
Timeline,
TimelineItem,
Expand DownExpand Up@@ -78,7 +79,7 @@ function formatDate(dateString: string, format?: string): string {

ComponentRegistry.register(
'timeline',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: TimelineSchema; className?: string; [key: string]: any }) => {
const {
variant = 'vertical',
items = [],
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/alert.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AlertSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import {
Alert,
Expand All@@ -7,7 +8,7 @@ import {
} from '@/ui';

ComponentRegistry.register('alert',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AlertSchema; className?: string; [key: string]: any }) => (
<Alert variant={schema.variant} className={className} {...props}>
<AlertTitle>{schema.title}</AlertTitle>
<AlertDescription>{schema.description || renderChildren(schema.body)}</AlertDescription>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/avatar.tsx
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AvatarSchema } from '@object-ui/types';
import {
Avatar,
AvatarImage,
AvatarFallback
} from '@/ui';

ComponentRegistry.register('avatar',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AvatarSchema; className?: string; [key: string]: any }) => (
<Avatar className={className} {...props}>
<AvatarImage src={schema.src} alt={schema.alt} />
<AvatarFallback>{schema.fallback}</AvatarFallback>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/badge.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { BadgeSchema } from '@object-ui/types';
import { Badge } from '@/ui';
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('badge',
({ schema, ...props }) => (
({ schema, ...props }: { schema: BadgeSchema; [key: string]: any }) => (
<Badge variant={schema.variant} className={schema.className} {...props}>
{schema.label || renderChildren(schema.body)}
</Badge>
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/chart.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ChartSchema } from '@object-ui/types';
import {
ChartContainer,
ChartTooltip,
Expand All@@ -20,7 +21,7 @@ import {
} from 'recharts';

ComponentRegistry.register('chart',
({ schema, className }) => {
({ schema, className }: { schema: ChartSchema; className?: string }) => {
const { chartType = 'bar', data = [], config = {}, xAxisKey, series = [] } = schema;

const ChartComponent = {
Expand Down
3 changes: 2 additions & 1 deletion packages/components/src/renderers/data-display/list.tsx
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ListSchema } from '@object-ui/types';
import { renderChildren } from '../../lib/utils';
import { cn } from '@/lib/utils';

ComponentRegistry.register('list',
({ schema, className, ...props }) => {
({ schema, className, ...props }: { schema: ListSchema; className?: string; [key: string]: any }) => {
const ListTag = schema.ordered ? 'ol' : 'ul';

return (
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { MarkdownSchema } from '@object-ui/types';
import { Markdown } from '@/ui';

/**
Expand All@@ -23,7 +24,7 @@ import { Markdown } from '@/ui';
* - Tailwind CSS prose styling
*/
ComponentRegistry.register('markdown',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: MarkdownSchema; className?: string; [key: string]: any }) => (
<Markdown
content={schema.content || ''}
className={className}
Expand Down
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
import { ComponentRegistry } from '@object-ui/core';
import type { TreeViewSchema, TreeNode } from '@object-ui/types';

CopilotAIJan 14, 2026

Copy link

Choose a reason for hiding this comment

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

The local TreeNode interface definition is being removed and replaced with an import from @object-ui/types. Verify that the TreeNode type definition in @object-ui/types matches the removed local interface to ensure no breaking changes occur. The removed interface had properties: id, label, icon, children, and data.

Copilot uses AI. Check for mistakes.
import { ChevronRight, ChevronDown, Folder, File } from 'lucide-react';
import { useState } from 'react';
import { cn } from '@/lib/utils';

interface TreeNode {
id: string;
label: string;
icon?: string;
children?: TreeNode[];
data?: any;
}

const TreeNodeComponent = ({
node,
level = 0,
Expand Down
7 changes: 4 additions & 3 deletions packages/components/src/renderers/disclosure/accordion.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { AccordionSchema } from '@object-ui/types';
import {
Accordion,
AccordionItem,
Expand All@@ -8,11 +9,11 @@ import {
import { renderChildren } from '../../lib/utils';

ComponentRegistry.register('accordion',
({ schema, className, ...props }) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
{schema.items?.map((item, index: number) => (
<AccordionItem key={item.value || index} value={item.value || `item-${index}`}>
<AccordionTrigger>{item.trigger || item.label}</AccordionTrigger>
<AccordionTrigger>{item.title}</AccordionTrigger>
<AccordionContent>
{renderChildren(item.content)}
</AccordionContent>
Expand Down
Loading