Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene
, '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

Implement UI components from @object-ui/types - #28

Merged
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components
Jan 14, 2026
Merged

Implement UI components from @object-ui/types#28
hotlong merged 5 commits into
mainfrom
copilot/implement-ui-components

Conversation

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
Contributor

Implementation Plan

  • Add @object-ui/types as a dependency to @object-ui/components package
  • Update form component renderers to use types from @object-ui/types:
    • button.tsx - use ButtonSchema
    • input.tsx - use InputSchema
    • textarea.tsx - use TextareaSchema
    • select.tsx - use SelectSchema
    • checkbox.tsx - use CheckboxSchema
    • radio-group.tsx - use RadioGroupSchema
    • switch.tsx - use SwitchSchema
    • toggle.tsx - use ToggleSchema ✅ Fixed fallback logic
    • slider.tsx - use SliderSchema
    • file-upload.tsx - use FileUploadSchema
    • date-picker.tsx - use DatePickerSchema
    • calendar.tsx - use CalendarSchema ✅ Removed as any
    • input-otp.tsx - use InputOTPSchema
    • form.tsx - use FormSchema
  • Update layout component renderers to use types from @object-ui/types
    • card.tsx - use CardSchema
    • container.tsx - use ContainerSchema
    • flex.tsx - use FlexSchema
    • grid.tsx - use GridSchema
    • tabs.tsx - use TabsSchema
  • Update basic component renderers to use types from @object-ui/types
    • div.tsx - use DivSchema
    • text.tsx - use TextSchema
    • span.tsx - use SpanSchema
    • image.tsx - use ImageSchema
    • icon.tsx - use IconSchema
    • separator.tsx - use SeparatorSchema
  • Update data-display component renderers to use types from @object-ui/types
    • alert.tsx - use AlertSchema
    • badge.tsx - use BadgeSchema
    • avatar.tsx - use AvatarSchema
    • list.tsx - use ListSchema
    • markdown.tsx - use MarkdownSchema
    • tree-view.tsx - use TreeViewSchema
    • chart.tsx - use ChartSchema
  • Update feedback component renderers to use types from @object-ui/types
    • loading.tsx - use LoadingSchema
    • progress.tsx - use ProgressSchema
    • skeleton.tsx - use SkeletonSchema
    • toaster.tsx - use ToasterSchema
  • Update disclosure component renderers to use types from @object-ui/types
    • accordion.tsx - use AccordionSchema ✅ Fixed property name
    • collapsible.tsx - use CollapsibleSchema
  • Update overlay component renderers to use types from @object-ui/types
    • dialog.tsx - use DialogSchema
    • alert-dialog.tsx - use AlertDialogSchema
    • popover.tsx - use PopoverSchema
    • tooltip.tsx - use TooltipSchema
    • hover-card.tsx - use HoverCardSchema
    • sheet.tsx - use SheetSchema
    • drawer.tsx - use DrawerSchema
    • dropdown-menu.tsx - use DropdownMenuSchema ✅ Added type annotation
    • context-menu.tsx - use ContextMenuSchema ✅ Added type annotation
  • Update navigation component renderers to use types from @object-ui/types
    • header-bar.tsx - use HeaderBarSchema
    • sidebar.tsx - use SidebarSchema ✅ Added type annotation
  • Update complex component renderers to use types from @object-ui/types
    • kanban.tsx - use KanbanSchema
    • carousel.tsx - use CarouselSchema
    • calendar-view.tsx - use CalendarViewSchema
    • filter-builder.tsx - use FilterBuilderSchema
    • chatbot.tsx - use ChatbotSchema
    • data-table.tsx - use DataTableSchema ✅ Removed duplicate type definition
    • table.tsx - use TableSchema ✅ Added type annotation
    • scroll-area.tsx - use ScrollAreaSchema
    • resizable.tsx - use ResizableSchema
    • timeline.tsx - use TimelineSchema ✅ Added type annotation
  • Build and test the changes
  • Address code review feedback

Summary

This PR completes the integration of @object-ui/types into @object-ui/components, ensuring all 60 component renderers use proper TypeScript types from the centralized type definitions package. This improves type safety, maintainability, and follows the "Schema First" architecture principle of Object UI.

Code Review Fixes Applied:

  1. ✅ Removed schema.body || fallback in toggle.tsx (now uses only schema.children)
  2. ✅ Fixed accordion property name from schema.type to schema.accordionType
  3. ✅ Removed as any type assertion in calendar.tsx
  4. ✅ Added missing type annotations for: context-menu, dropdown-menu, table, sidebar, timeline
  5. ✅ Removed duplicate DataTableSchema interface definition
Original prompt

@copilot 应依赖 @objectql/types,并实现其中的界面控件


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

CopilotAIand others added 2 commits January 14, 2026 12:46
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 继续

Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已完成所有组件的类型更新。所有渲染器现在都使用 @object-ui/types 中的类型定义,包括:

✅ 表单组件 (15个)
✅ 布局组件 (5个)
✅ 基础组件 (6个)
✅ 数据展示组件 (7个)
✅ 反馈组件 (4个)
✅ 披露组件 (2个)
✅ 覆盖层组件 (9个)
✅ 导航组件 (2个)
✅ 复杂组件 (10个)

共更新了 60 个组件渲染器,构建成功。提交: 8058f2f

CopilotAI changed the title [WIP] Implement UI components from @objectql/typesImplement UI components from @object-ui/typesJan 14, 2026
CopilotAI requested a review from hotlongJanuary 14, 2026 13:36
@hotlong
hotlong requested review from Copilot and removed request for hotlong and huangyiireneJanuary 14, 2026 13:43

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This pull request implements the integration of @object-ui/types into @object-ui/components, establishing a centralized type system for all 60+ UI component renderers. This aligns with Object UI's "Schema First" architecture principle where types define the protocol layer.

Changes:

  • Added @object-ui/types as a workspace dependency to the components package
  • Updated all component renderers to import and use TypeScript interfaces from the centralized types package
  • Fixed property naming inconsistencies (e.g., itemsoptions in RadioGroup, maxLengthlength in InputOTP, accordionTypetype in Accordion)
  • Replaced local type definitions with imports from the centralized types package

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 14 comments.

Show a summary per file
FileDescription
packages/components/package.jsonAdded @object-ui/types workspace dependency
pnpm-lock.yamlUpdated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsxUpdated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsxUpdated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsxUpdated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsxUpdated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsxUpdated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsxUpdated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsxUpdated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsxUpdated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsxUpdated 11 complex components (Kanban, DataTable, Calendar, etc.)
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

{...props}
>
{schema.label || renderChildren(schema.body)}
{schema.label || renderChildren(schema.body || schema.children)}

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 fallback logic schema.body || schema.children suggests uncertainty about the property name. According to the ToggleSchema interface, the property is named children. Consider removing the fallback to schema.body for clarity and type safety, or verify if this is intentionally supporting both property names for backward compatibility.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { ContextMenuSchema } 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: ContextMenuSchema; 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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { SidebarSchema } 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. Although multiple sidebar-related components are registered in this file, at minimum the main 'sidebar' component should have type annotation: ({ schema, ...props }: { schema: SidebarSchema; [key: string]: any }) to ensure type safety.

Copilot uses AI. Check for mistakes.
@@ -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.
selected={schema.value || schema.defaultValue}
className={className}
{...props}
{...props as any}

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 use of as any type assertion bypasses TypeScript type checking and eliminates type safety benefits. This suggests a type mismatch between the Calendar component's expected props and the schema properties being passed. Consider fixing the underlying type incompatibility instead of using a type assertion.

Copilot uses AI. Check for mistakes.
<Accordion type={schema.accordionType || 'single'} collapsible={schema.collapsible} className={className} {...props}>
{schema.items?.map((item: any, index: number) => (
({ schema, className, ...props }: { schema: AccordionSchema; className?: string; [key: string]: any }) => (
<Accordion type={schema.type || 'single'} collapsible={schema.collapsible} className={className} {...props}>

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.

Incorrect property name used. The schema uses accordionType property according to the type definition in @object-ui/types, but the code references schema.type. This should be schema.accordionType to match the AccordionSchema interface.

Copilot uses AI. Check for mistakes.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { FormSchema, FormField as FormFieldConfig, ValidationRule, FieldCondition, SelectOption } 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 FormField type is renamed to FormFieldConfig to avoid naming conflict with the FormField component from @/ui/form, which is a good practice. However, the import shows that FormField as FormFieldConfig is imported from @object-ui/types. Verify that the type is actually exported as FormField in the types package, as the export list shows FormField, not FormFieldConfig.

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +3
import type { FilterBuilderSchema, FilterGroup } from '@object-ui/types';
import { FilterBuilder } from '@/ui/filter-builder';

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.
@@ -1,4 +1,5 @@
import { ComponentRegistry } from '@object-ui/core';
import type { DropdownMenuSchema } 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: DropdownMenuSchema; 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.
@@ -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.
@hotlong

Copy link
Copy Markdown
Contributor

@copilot 帮我修改

@huangyiirene

Copy link
Copy Markdown
Collaborator

@copilot 继续

…mes, remove duplicate types and type assertions
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>

CopilotAI commented Jan 14, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot 继续

已修复代码审查中的所有问题:

✅ 移除了 toggle.tsx 中的 schema.body 回退逻辑
✅ 修正了 accordion.tsx 属性名:schema.typeschema.accordionType
✅ 移除了 calendar.tsx 中的 as any 类型断言
✅ 为以下组件添加了缺失的类型注解:context-menu, dropdown-menu, table, sidebar, timeline
✅ 移除了 data-table.tsx 中的重复类型定义

所有修改已提交,构建成功。提交: 45ba397

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@hotlong@huangyiirene