#title: Custom Catalogs
description: Compose custom component catalogs for generative UI using ViewRegistry composition.
Custom Catalogs
Both json-render specs and A2UI surfaces render through the same ViewRegistry. Let's compose catalogs using views, withViews, and withoutViews from @threadplane/render.
Custom components receive the standard AngularComponentInputs:
import { Component, input } from '@angular/core';import type { AngularComponentInputs } from '@threadplane/render';@Component({ selector: 'my-chart', standalone: true, template: `<canvas #chart></canvas>`,})export class MyChartComponent { readonly data = input<number[]>([]); readonly title = input<string>(''); readonly childKeys = input<string[]>([]); readonly spec = input.required<AngularComponentInputs['spec']>(); readonly emit = input<(event: string) => void>(() => {}); readonly loading = input<boolean>();}
The component receives resolved props as inputs. childKeys and spec enable recursive child rendering, and emit triggers event handlers defined in the spec's on bindings. Spec isn't exported on its own — type the input via AngularComponentInputs['spec'] (or implement AngularComponentInputs directly).