@theredhead/lucid-forms
v0.1.6
Published
Schema-driven, signal-based Angular form engine with validation, conditional logic, and a visual form designer
Maintainers
Readme
@theredhead/lucid-forms
Schema-driven, signal-based Angular form engine with validation, conditional logic, and a visual form designer. Part of the LucidKit UI library family.
Early-stage — not production ready. This package is still undergoing active development and is subject to breaking changes without notice until a stable
1.0release.
Installation
npm install @theredhead/lucid-forms @theredhead/lucid-kit @theredhead/lucid-foundationOverview
@theredhead/lucid-forms lets you define forms as plain JSON/TypeScript objects
and renders them using @theredhead/lucid-kit components. No template boilerplate,
no FormGroup wiring — just a schema and a binding.
Key features
- Schema-driven — describe fields, groups, validation, and defaults in a
FormSchemaobject - Dynamic field rendering — maps field types (
text,select,checkbox,date, …) to the correct@theredhead/lucid-kitcomponent automatically - Conditional logic — show/hide or enable/disable fields based on other field values
- Validation —
required,minLength,maxLength,min,max,pattern,emailrules with per-field error messages - Form designer — drag-and-drop
UIFormDesignercomponent for building schemas visually at runtime - Signal-based — fully zoneless, all state communicated via Angular signals
Quick start
import { Component } from '@angular/core';
import { UIFormView } from '@theredhead/lucid-forms';
import { provideBuiltInFields } from '@theredhead/lucid-forms';
import type { FormSchema, FormValues } from '@theredhead/lucid-forms';
@Component({
selector: 'app-example',
standalone: true,
imports: [UIFormView],
providers: [provideBuiltInFields()],
template: `
<ui-form-view
[schema]="schema"
[(values)]="values"
/>
`,
})
export class ExampleComponent {
schema: FormSchema = {
groups: [
{
label: 'Personal details',
fields: [
{ key: 'name', label: 'Full name', type: 'text', validation: [{ type: 'required' }] },
{ key: 'email', label: 'Email', type: 'text', validation: [{ type: 'email' }] },
{ key: 'role', label: 'Role', type: 'select',
options: [
{ value: 'admin', label: 'Admin' },
{ value: 'user', label: 'User' },
]
},
],
},
],
};
values: FormValues = {};
}Built-in field types
| Key | Component rendered | Notes |
|----------------|---------------------------|-----------------------------------|
| text | UIInput | Plain text, email, number, etc. |
| select | UIDropdownList | Requires options on the field |
| checkbox | UICheckbox | |
| toggle | UIToggle | |
| radio | UIRadioGroup | Requires options on the field |
| autocomplete | UIAutocomplete | |
| date | UIInput + date adapter | |
| time | UIInput + time adapter | |
| datetime | UIInput + date adapter | |
| color | UIColorPicker | |
| slider | UISlider | |
| richtext | UIRichTextEditor | |
| file | UIFileUpload | |
Custom field types can be registered via provideFormFields().
Peer dependencies
| Package | Version |
|----------------------------------|-----------|
| @angular/core | ^21.0.0 |
| @angular/common | ^21.0.0 |
| @theredhead/lucid-foundation | ^0.0.1 |
| @theredhead/lucid-kit | ^0.0.1 |
