import React, { useState } from 'react'; import { ChevronDown, ChevronRight } from 'lucide-react'; import { IPropertyRenderer, PropertyContext, PropertyRendererRegistry } from '@esengine/editor-core'; import { Core } from '@esengine/ecs-framework'; interface ComponentData { typeName: string; properties: Record; } export class ComponentRenderer implements IPropertyRenderer { readonly id = 'app.component'; readonly name = 'Component Renderer'; readonly priority = 75; canHandle(value: any, _context: PropertyContext): value is ComponentData { return ( typeof value === 'object' && value !== null && typeof value.typeName === 'string' && typeof value.properties === 'object' && value.properties !== null ); } render(value: ComponentData, context: PropertyContext): React.ReactElement { const [isExpanded, setIsExpanded] = useState(context.expandByDefault ?? false); const depth = context.depth ?? 0; return (
0 ? '12px' : 0 }}>
setIsExpanded(!isExpanded)} style={{ display: 'flex', alignItems: 'center', padding: '6px 8px', backgroundColor: '#3a3a3a', cursor: 'pointer', userSelect: 'none', borderRadius: '4px', marginBottom: '2px' }} > {isExpanded ? : } {value.typeName}
{isExpanded && (
{Object.entries(value.properties).map(([key, propValue]) => { const registry = Core.services.resolve(PropertyRendererRegistry); const propContext: PropertyContext = { ...context, name: key, depth: depth + 1, path: [...(context.path || []), key] }; const rendered = registry.render(propValue, propContext); if (rendered) { return
{rendered}
; } return (
[No Renderer]
); })}
)}
); } }