The component registry maps element type names from your spec to Angular component classes. It is the bridge between the declarative JSON spec and your Angular component tree.
Every component rendered by @ngaf/render receives inputs conforming to the AngularComponentInputs interface. Your custom props from the spec are spread as additional inputs alongside the standard ones.
Here is a complete example of a component designed to work with the rendering system:
import { Component, ChangeDetectionStrategy, input } from '@angular/core';import type { Spec } from '@json-render/core';@Component({ selector: 'app-card', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: ` <div class="card"> <h2>{{ title() }}</h2> <p>{{ description() }}</p> @if (loading()) { <div class="loading-indicator">Loading...</div> } </div> `,})export class CardComponent { // Custom props from the spec readonly title = input<string>(''); readonly description = input<string>(''); // Standard inputs from AngularComponentInputs readonly emit = input<(event: string) => void>(() => {}); readonly bindings = input<Record<string, string>>({}); readonly loading = input<boolean>(false); readonly childKeys = input<string[]>([]); readonly spec = input<Spec | null>(null);}
✓Input defaults
Always provide default values for your inputs. The rendering system spreads resolved props onto the component, but not all standard inputs are guaranteed to have values in every context.