Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 14, 2026

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.

Copilot AI and 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
Contributor

hotlong commented Jan 14, 2026

@copilot 继续

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

Copilot AI commented Jan 14, 2026

@copilot 继续

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

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

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

Copilot AI changed the title [WIP] Implement UI components from @objectql/types Implement UI components from @object-ui/types Jan 14, 2026
Copilot AI requested a review from hotlong January 14, 2026 13:36
@hotlong hotlong requested review from Copilot and removed request for hotlong and huangyiirene January 14, 2026 13:43
Copy link
Contributor

Copilot AI left a comment

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
File Description
packages/components/package.json Added @object-ui/types workspace dependency
pnpm-lock.yaml Updated lockfile with new dependency reference
packages/components/src/renderers/form/*.tsx Updated 14 form components to use typed schemas (Button, Input, Textarea, Select, etc.)
packages/components/src/renderers/layout/*.tsx Updated 5 layout components (Card, Container, Flex, Grid, Tabs)
packages/components/src/renderers/basic/*.tsx Updated 6 basic components (Div, Text, Span, Image, Icon, Separator)
packages/components/src/renderers/data-display/*.tsx Updated 7 data display components (Alert, Badge, Avatar, List, etc.)
packages/components/src/renderers/feedback/*.tsx Updated 4 feedback components (Loading, Progress, Skeleton, Toaster)
packages/components/src/renderers/disclosure/*.tsx Updated 2 disclosure components with corrected property names
packages/components/src/renderers/overlay/*.tsx Updated 9 overlay components (Dialog, Sheet, Popover, etc.)
packages/components/src/renderers/navigation/*.tsx Updated 2 navigation components (HeaderBar, Sidebar)
packages/components/src/renderers/complex/*.tsx Updated 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)}
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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}
Copy link

Copilot AI Jan 14, 2026

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}>
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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';
Copy link

Copilot AI Jan 14, 2026

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
Contributor

hotlong commented Jan 14, 2026

@copilot 帮我修改

@huangyiirene
Copy link
Contributor

@copilot 继续

…mes, remove duplicate types and type assertions

Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Jan 14, 2026

@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

✅ All checks passed!

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

@hotlong hotlong marked this pull request as ready for review January 14, 2026 15:04
@hotlong hotlong merged commit 3cc21d4 into main Jan 14, 2026
5 checks passed
Sign up for free to 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.

3 participants