Skip to main content
Forms designed for Angular signals

Typed forms that stay close to your model.

Compose fields, nested objects, and dynamic arrays with precise TypeScript inference, reactive validation, and one binding for native and custom controls.

import { Component } from '@angular/core';
import { form, field, required, FormNodeDirective } from '@ngblocks/form-nodes';

@Component({
selector: 'app-profile-editor',
imports: [FormNodeDirective],
template: `
<input [formNode]="form.username" />
<p>Hello {{ form.username() }}</p>

<input [formNode]="form.email" />
<p>Your email is {{ form.email() }}</p>
`,
})
export class ProfileEditor {
form = form({
username: field(''),
email: field('', [required]),
});
}
01

💡 Inferred end to end

Values, patches, validators, children, and array items retain the shape of the form you declared.

02

âš¡ Reactive by construction

Values and state are signals. Validators track the dependencies they read without extra wiring.

03

🔌 Angular when you need it

Use the model outside injection context, then connect native, signal, or CVA controls with [formNode].

Find your starting point​

🔗 Learn by task​

Start with the essentials

🚀 From installation to a bound form in minutes.

Read the quick start