@ng-modular-forms/core 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,16 @@
1
1
  import * as i2 from '@angular/forms';
2
2
  import { NgControl, FormControl, Validators, TouchedChangeEvent, ReactiveFormsModule, FormGroup } from '@angular/forms';
3
3
  import * as i0 from '@angular/core';
4
- import { inject, ChangeDetectorRef, DestroyRef, input, booleanAttribute, signal, computed, effect, Directive, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
4
+ import { inject, DestroyRef, input, booleanAttribute, signal, computed, Directive, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { Subscription, startWith } from 'rxjs';
6
+ import { merge, startWith, Subscription } from 'rxjs';
7
7
  import * as i1 from '@angular/common';
8
8
  import { CommonModule } from '@angular/common';
9
9
 
10
10
  class FormControlBase {
11
- cdr = inject(ChangeDetectorRef);
12
11
  destroyRef = inject(DestroyRef);
13
12
  static nextId = 0;
14
- id = input(`nmf-form-control-${FormControlBase.nextId++}`);
15
- _id = input(null, { alias: 'id' });
13
+ id = input(`nmf-form-control-${FormControlBase.nextId++}`, { alias: 'id' });
16
14
  label = input('');
17
15
  classList = input([]);
18
16
  loading = input(false);
@@ -26,71 +24,49 @@ class FormControlBase {
26
24
  self: true,
27
25
  optional: true,
28
26
  });
29
- control = new FormControl(null);
27
+ standaloneControl = new FormControl(null);
28
+ get formControl() {
29
+ return (this.ngControl?.control ??
30
+ this.standaloneControl);
31
+ }
30
32
  disabled = computed(() => this._disabledByInput() || this._disabledByCva());
31
33
  isRequired = signal(this.ngControl?.control?.hasValidator(Validators.required) ?? false);
32
34
  hasErrors = signal(false);
33
- changeSub = new Subscription();
34
35
  onChange = () => { };
35
36
  onTouched = () => { };
36
37
  constructor() {
37
38
  if (this.ngControl) {
38
39
  this.ngControl.valueAccessor = this;
39
40
  }
40
- effect(() => {
41
- const inputDisabled = this._disabledByInput();
42
- const cvaDisabled = this._disabledByCva();
43
- if (inputDisabled || cvaDisabled) {
44
- this.control.disable({ emitEvent: false });
45
- }
46
- else {
47
- this.control.enable({ emitEvent: true });
48
- }
49
- });
50
41
  }
51
42
  ngOnInit() {
52
- const parent = this.ngControl?.control;
53
- if (!parent)
43
+ const control = this.ngControl?.control;
44
+ if (!control)
54
45
  return;
55
- parent.statusChanges
46
+ merge(control.statusChanges, control.valueChanges)
56
47
  .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))
57
48
  .subscribe(() => {
58
- this.control.setValidators(parent.validator ?? null);
59
- this.control.setAsyncValidators(parent.asyncValidator ?? null);
60
- this.control.updateValueAndValidity({ emitEvent: false });
61
- this.hasErrors.set(parent.invalid && parent.touched);
62
- this.isRequired.set(parent.hasValidator(Validators.required) ?? false);
63
- this.cdr.markForCheck();
49
+ this.hasErrors.set(control.invalid && control.touched);
50
+ this.isRequired.set(control.hasValidator(Validators.required) ?? false);
64
51
  });
65
- parent.events
52
+ control.events
66
53
  .pipe(takeUntilDestroyed(this.destroyRef))
67
54
  .subscribe((event) => {
68
55
  if (event instanceof TouchedChangeEvent) {
69
- if (parent.touched) {
70
- this.control.markAsTouched();
71
- }
72
- else {
73
- this.control.markAsUntouched();
74
- }
75
- this.hasErrors.set(parent.invalid && parent.touched);
76
- this.cdr.markForCheck();
56
+ this.hasErrors.set(control.invalid && control.touched);
77
57
  }
78
58
  });
79
- parent.valueChanges
80
- .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))
81
- .subscribe(() => this.cdr.markForCheck());
82
59
  }
83
60
  writeValue(value) {
84
- this.control.setValue(value, { emitEvent: false });
61
+ const control = this.ngControl?.control;
62
+ if (!control)
63
+ return;
64
+ if (control.value !== value) {
65
+ control.setValue(value, { emitEvent: false });
66
+ }
85
67
  }
86
68
  registerOnChange(fn) {
87
69
  this.onChange = fn;
88
- this.changeSub.unsubscribe();
89
- this.changeSub = this.control.valueChanges
90
- .pipe(takeUntilDestroyed(this.destroyRef))
91
- .subscribe((v) => {
92
- fn(v);
93
- });
94
70
  }
95
71
  registerOnTouched(fn) {
96
72
  this.onTouched = fn;
@@ -129,7 +105,7 @@ class FormControlBase {
129
105
  }
130
106
  }
131
107
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
132
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlBase, isStandalone: true, inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, _id: { classPropertyName: "_id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, classList: { classPropertyName: "classList", publicName: "classList", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledByInput: { classPropertyName: "_disabledByInput", publicName: "_disabledByInput", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
108
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.21", type: FormControlBase, isStandalone: true, inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, classList: { classPropertyName: "classList", publicName: "classList", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledByInput: { classPropertyName: "_disabledByInput", publicName: "_disabledByInput", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
133
109
  }
134
110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: FormControlBase, decorators: [{
135
111
  type: Directive
@@ -367,11 +343,16 @@ class InputCurrencyComponent extends FormControlBase {
367
343
  {{ errorMessage() }}
368
344
  </p>
369
345
  </div>
370
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
346
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
371
347
  }
372
348
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputCurrencyComponent, decorators: [{
373
349
  type: Component,
374
- args: [{ selector: 'nmf-currency', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
350
+ args: [{
351
+ selector: 'nmf-currency',
352
+ standalone: true,
353
+ imports: [CommonModule, ReactiveFormsModule],
354
+ changeDetection: ChangeDetectionStrategy.OnPush,
355
+ template: `
375
356
  <div class="nmf-field">
376
357
  @if (label()) {
377
358
  <label class="nmf-label">
@@ -427,7 +408,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
427
408
  {{ errorMessage() }}
428
409
  </p>
429
410
  </div>
430
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
411
+ `,
412
+ }]
431
413
  }] });
432
414
 
433
415
  class InputDatepickerComponent extends FormControlBase {
@@ -503,11 +485,16 @@ class InputDatepickerComponent extends FormControlBase {
503
485
  {{ errorMessage() }}
504
486
  </p>
505
487
  </div>
506
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
488
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
507
489
  }
508
490
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputDatepickerComponent, decorators: [{
509
491
  type: Component,
510
- args: [{ selector: 'nmf-datepicker', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
492
+ args: [{
493
+ selector: 'nmf-datepicker',
494
+ standalone: true,
495
+ imports: [CommonModule, ReactiveFormsModule],
496
+ changeDetection: ChangeDetectionStrategy.OnPush,
497
+ template: `
511
498
  <div class="nmf-field" [class.loading]="loading()">
512
499
  @if (label()) {
513
500
  <label class="nmf-label">
@@ -548,7 +535,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
548
535
  {{ errorMessage() }}
549
536
  </p>
550
537
  </div>
551
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
538
+ `,
539
+ }]
552
540
  }] });
553
541
 
554
542
  class InputNumberComponent extends FormControlBase {
@@ -621,11 +609,16 @@ class InputNumberComponent extends FormControlBase {
621
609
  </div>
622
610
  }
623
611
  </div>
624
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
612
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
625
613
  }
626
614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputNumberComponent, decorators: [{
627
615
  type: Component,
628
- args: [{ selector: 'nmf-number', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
616
+ args: [{
617
+ selector: 'nmf-number',
618
+ standalone: true,
619
+ imports: [CommonModule, ReactiveFormsModule],
620
+ changeDetection: ChangeDetectionStrategy.OnPush,
621
+ template: `
629
622
  <div class="nmf-field">
630
623
  @if (label()) {
631
624
  <label class="nmf-label">
@@ -666,7 +659,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
666
659
  </div>
667
660
  }
668
661
  </div>
669
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
662
+ `,
663
+ }]
670
664
  }] });
671
665
 
672
666
  class InputSelectComponent extends FormControlBase {
@@ -684,35 +678,36 @@ class InputSelectComponent extends FormControlBase {
684
678
  }
685
679
  </label>
686
680
  }
687
-
688
- <select
689
- class="nmf-input"
690
- [ngClass]="classList()"
691
- [class.error]="hasErrors()"
692
- [class.disabled]="disabled()"
693
- [required]="isRequired()"
694
- [formControl]="control"
695
- (blur)="onTouched()"
696
- >
697
- <!-- Empty option -->
698
- <option [ngValue]="null" disabled>
699
- {{ emptyOptionLabel() }}
700
- </option>
701
-
702
- <!-- Options -->
703
- @for (option of options(); track option.key) {
704
- <option [ngValue]="option.key" [disabled]="option.disabled">
705
- {{ option.label }}
681
+ <div class="select-wrapper" [class.disabled]="disabled()">
682
+ <select
683
+ class="nmf-input"
684
+ [ngClass]="classList()"
685
+ [class.error]="hasErrors()"
686
+ [class.disabled]="disabled()"
687
+ [required]="isRequired()"
688
+ [formControl]="formControl"
689
+ (blur)="onTouched()"
690
+ >
691
+ <!-- Empty option -->
692
+ <option [ngValue]="null" disabled>
693
+ {{ emptyOptionLabel() }}
706
694
  </option>
707
- }
708
695
 
709
- <!-- Clear option -->
710
- @if (clearOptionLabel()) {
711
- <option [ngValue]="null">
712
- {{ clearOptionLabel() }}
713
- </option>
714
- }
715
- </select>
696
+ <!-- Options -->
697
+ @for (option of options(); track option.key) {
698
+ <option [ngValue]="option.key" [disabled]="option.disabled">
699
+ {{ option.label }}
700
+ </option>
701
+ }
702
+
703
+ <!-- Clear option -->
704
+ @if (clearOptionLabel()) {
705
+ <option [ngValue]="null">
706
+ {{ clearOptionLabel() }}
707
+ </option>
708
+ }
709
+ </select>
710
+ </div>
716
711
 
717
712
  @if (loading()) {
718
713
  <div class="nmf-loading">
@@ -724,11 +719,16 @@ class InputSelectComponent extends FormControlBase {
724
719
  {{ errorMessage() }}
725
720
  </p>
726
721
  </div>
727
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
722
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
728
723
  }
729
724
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputSelectComponent, decorators: [{
730
725
  type: Component,
731
- args: [{ selector: 'nmf-select', imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
726
+ args: [{
727
+ selector: 'nmf-select',
728
+ standalone: true,
729
+ imports: [CommonModule, ReactiveFormsModule],
730
+ changeDetection: ChangeDetectionStrategy.OnPush,
731
+ template: `
732
732
  <div class="nmf-field" [class.loading]="loading()">
733
733
  @if (label()) {
734
734
  <label class="nmf-label">
@@ -738,35 +738,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
738
738
  }
739
739
  </label>
740
740
  }
741
-
742
- <select
743
- class="nmf-input"
744
- [ngClass]="classList()"
745
- [class.error]="hasErrors()"
746
- [class.disabled]="disabled()"
747
- [required]="isRequired()"
748
- [formControl]="control"
749
- (blur)="onTouched()"
750
- >
751
- <!-- Empty option -->
752
- <option [ngValue]="null" disabled>
753
- {{ emptyOptionLabel() }}
754
- </option>
755
-
756
- <!-- Options -->
757
- @for (option of options(); track option.key) {
758
- <option [ngValue]="option.key" [disabled]="option.disabled">
759
- {{ option.label }}
741
+ <div class="select-wrapper" [class.disabled]="disabled()">
742
+ <select
743
+ class="nmf-input"
744
+ [ngClass]="classList()"
745
+ [class.error]="hasErrors()"
746
+ [class.disabled]="disabled()"
747
+ [required]="isRequired()"
748
+ [formControl]="formControl"
749
+ (blur)="onTouched()"
750
+ >
751
+ <!-- Empty option -->
752
+ <option [ngValue]="null" disabled>
753
+ {{ emptyOptionLabel() }}
760
754
  </option>
761
- }
762
755
 
763
- <!-- Clear option -->
764
- @if (clearOptionLabel()) {
765
- <option [ngValue]="null">
766
- {{ clearOptionLabel() }}
767
- </option>
768
- }
769
- </select>
756
+ <!-- Options -->
757
+ @for (option of options(); track option.key) {
758
+ <option [ngValue]="option.key" [disabled]="option.disabled">
759
+ {{ option.label }}
760
+ </option>
761
+ }
762
+
763
+ <!-- Clear option -->
764
+ @if (clearOptionLabel()) {
765
+ <option [ngValue]="null">
766
+ {{ clearOptionLabel() }}
767
+ </option>
768
+ }
769
+ </select>
770
+ </div>
770
771
 
771
772
  @if (loading()) {
772
773
  <div class="nmf-loading">
@@ -778,7 +779,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
778
779
  {{ errorMessage() }}
779
780
  </p>
780
781
  </div>
781
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
782
+ `,
783
+ }]
782
784
  }] });
783
785
 
784
786
  class InputTextComponent extends FormControlBase {
@@ -810,16 +812,15 @@ class InputTextComponent extends FormControlBase {
810
812
  [type]="computedType()"
811
813
  [required]="isRequired()"
812
814
  [placeholder]="placeholder()"
813
- [formControl]="control"
815
+ [formControl]="formControl"
814
816
  (blur)="onTouched()"
815
817
  />
816
818
 
817
- @if (type() === 'password' && !loading()) {
819
+ @if (type() === 'password' && !loading() && !disabled()) {
818
820
  <button
819
821
  type="button"
820
822
  class="nmf-password-toggle"
821
823
  aria-label="Toggle password visibility"
822
- [disabled]="disabled()"
823
824
  (click)="behavior.toggleShowPassword($event)"
824
825
  >
825
826
  @if (behavior.showPassword()) {
@@ -878,11 +879,16 @@ class InputTextComponent extends FormControlBase {
878
879
  />
879
880
  </svg>
880
881
  </ng-template>
881
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
882
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
882
883
  }
883
884
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTextComponent, decorators: [{
884
885
  type: Component,
885
- args: [{ selector: 'nmf-text', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
886
+ args: [{
887
+ selector: 'nmf-text',
888
+ standalone: true,
889
+ imports: [CommonModule, ReactiveFormsModule],
890
+ changeDetection: ChangeDetectionStrategy.OnPush,
891
+ template: `
886
892
  <div class="nmf-field">
887
893
  @if (label()) {
888
894
  <label class="nmf-label">
@@ -904,16 +910,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
904
910
  [type]="computedType()"
905
911
  [required]="isRequired()"
906
912
  [placeholder]="placeholder()"
907
- [formControl]="control"
913
+ [formControl]="formControl"
908
914
  (blur)="onTouched()"
909
915
  />
910
916
 
911
- @if (type() === 'password' && !loading()) {
917
+ @if (type() === 'password' && !loading() && !disabled()) {
912
918
  <button
913
919
  type="button"
914
920
  class="nmf-password-toggle"
915
921
  aria-label="Toggle password visibility"
916
- [disabled]="disabled()"
917
922
  (click)="behavior.toggleShowPassword($event)"
918
923
  >
919
924
  @if (behavior.showPassword()) {
@@ -972,7 +977,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
972
977
  />
973
978
  </svg>
974
979
  </ng-template>
975
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
980
+ `,
981
+ }]
976
982
  }] });
977
983
 
978
984
  class InputTextareaComponent extends FormControlBase {
@@ -1000,7 +1006,7 @@ class InputTextareaComponent extends FormControlBase {
1000
1006
  [cols]="cols()"
1001
1007
  [required]="isRequired()"
1002
1008
  [placeholder]="placeholder()"
1003
- [formControl]="control"
1009
+ [formControl]="formControl"
1004
1010
  (blur)="onTouched()"
1005
1011
  ></textarea>
1006
1012
 
@@ -1014,11 +1020,16 @@ class InputTextareaComponent extends FormControlBase {
1014
1020
  </div>
1015
1021
  }
1016
1022
  </div>
1017
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1023
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1018
1024
  }
1019
1025
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTextareaComponent, decorators: [{
1020
1026
  type: Component,
1021
- args: [{ selector: 'nmf-textarea', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1027
+ args: [{
1028
+ selector: 'nmf-textarea',
1029
+ standalone: true,
1030
+ imports: [CommonModule, ReactiveFormsModule],
1031
+ changeDetection: ChangeDetectionStrategy.OnPush,
1032
+ template: `
1022
1033
  <div class="nmf-field">
1023
1034
  @if (label()) {
1024
1035
  <label class="nmf-label">
@@ -1039,7 +1050,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
1039
1050
  [cols]="cols()"
1040
1051
  [required]="isRequired()"
1041
1052
  [placeholder]="placeholder()"
1042
- [formControl]="control"
1053
+ [formControl]="formControl"
1043
1054
  (blur)="onTouched()"
1044
1055
  ></textarea>
1045
1056
 
@@ -1053,7 +1064,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
1053
1064
  </div>
1054
1065
  }
1055
1066
  </div>
1056
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
1067
+ `,
1068
+ }]
1057
1069
  }] });
1058
1070
 
1059
1071
  class InputTimepickerComponent extends FormControlBase {
@@ -1130,11 +1142,16 @@ class InputTimepickerComponent extends FormControlBase {
1130
1142
  {{ errorMessage() }}
1131
1143
  </p>
1132
1144
  </div>
1133
- `, isInline: true, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1145
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1134
1146
  }
1135
1147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: InputTimepickerComponent, decorators: [{
1136
1148
  type: Component,
1137
- args: [{ selector: 'nmf-timepicker', standalone: true, imports: [CommonModule, ReactiveFormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
1149
+ args: [{
1150
+ selector: 'nmf-timepicker',
1151
+ standalone: true,
1152
+ imports: [CommonModule, ReactiveFormsModule],
1153
+ changeDetection: ChangeDetectionStrategy.OnPush,
1154
+ template: `
1138
1155
  <div class="nmf-field" [class.loading]="loading()">
1139
1156
  @if (label()) {
1140
1157
  <label class="nmf-label">
@@ -1175,7 +1192,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
1175
1192
  {{ errorMessage() }}
1176
1193
  </p>
1177
1194
  </div>
1178
- `, styles: [".nmf-field{position:relative;display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.nmf-label{display:block;font-weight:500;font-size:.875rem;margin-bottom:.25rem}.nmf-required{color:#dc2626;font-size:.8rem}.nmf-input-wrapper{position:relative;display:flex;align-items:center}.nmf-input{width:100%;box-sizing:border-box;padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;border:1px solid #d1d5db;border-radius:.275rem;background-color:#f4f3f2;color:#111827;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.nmf-field.loading select{background-image:none!important}.nmf-field.loading input[type=date]::-webkit-calendar-picker-indicator,.nmf-field.loading input[type=time]::-webkit-calendar-picker-indicator{opacity:0;pointer-events:none}select.nmf-input{appearance:none!important;-webkit-appearance:none!important;-moz-appearance:none!important;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAUCAMAAACtdX32AAAAdVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhMdQaAAAAJ3RSTlMAAAECAwQGBwsOFBwkJTg5RUZ4eYCHkJefpaytrsXGy8zW3+Do8vNn0bsyAAAAYElEQVR42tXROwJDQAAA0Ymw1p9kiT+L5P5HVEi3qJn2lcPjtIuzUIJ/rhIGy762N3XaThqMN1ZPALsZPEzG1x8LrFL77DHBnEMxBewz0fJ6LyFHTPL7xhwzWYrJ9z22AqmQBV757MHfAAAAAElFTkSuQmCC);background-position:100% center;background-repeat:no-repeat}.nmf-input:focus{border-color:#10b981;box-shadow:0 0 0 2px #10b98133}select.nmf-input:disabled{background-image:none}.nmf-input:disabled{opacity:.6;background-color:#f3f4f6;cursor:not-allowed}.nmf-input.error{border-color:#dc2626}.nmf-input.error:focus{box-shadow:0 0 0 2px #dc262633}.nmf-prefix{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);line-height:1;font-size:.875rem;pointer-events:none}.nmf-prefix.error{color:#dc2626}.nmf-prefix-disabled{opacity:.6}.nmf-input-with-prefix{padding-left:1.25rem}.nmf-icon{width:20px;height:20px;fill:currentColor}.nmf-password-toggle{position:absolute;right:.75rem;background:none;border:none;padding:0;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.875rem;line-height:1}.nmf-password-toggle:disabled{cursor:not-allowed}.nmf-error{font-size:.75rem;color:#dc2626;height:16px;margin-top:.25rem;margin-bottom:0;min-height:16px}.nmf-loading{position:absolute;width:1rem;height:1rem;top:50%;transform:translateY(-50%);right:.75rem}.nmf-spinner{display:inline-block;width:1rem;height:1rem;border:2px solid #d1d5db;border-top-color:#10b981;border-radius:50%;animation:nmf-spin .8s linear infinite}@keyframes nmf-spin{to{transform:rotate(360deg)}}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{appearance:textfield;-moz-appearance:textfield}\n"] }]
1195
+ `,
1196
+ }]
1179
1197
  }] });
1180
1198
 
1181
1199
  class FormHydrator {
@@ -1232,12 +1250,12 @@ class FormOrchestrator extends FormMapperBase {
1232
1250
  hydrator;
1233
1251
  serializer;
1234
1252
  _form = signal(new FormGroup({}));
1235
- _handlers = signal([]);
1253
+ _handlerRegistry = signal([]);
1236
1254
  _mapperRegistry = signal({});
1237
1255
  _status = signal('idle');
1238
1256
  _errorMessage = signal(null);
1239
1257
  form = this._form.asReadonly();
1240
- handlers = this._handlers.asReadonly();
1258
+ handlerRegistry = this._handlerRegistry.asReadonly();
1241
1259
  mapperRegistry = this._mapperRegistry.asReadonly();
1242
1260
  status = this._status.asReadonly();
1243
1261
  errorMessage = this._errorMessage.asReadonly();
@@ -1252,11 +1270,11 @@ class FormOrchestrator extends FormMapperBase {
1252
1270
  * Must be called before any subform registration or handler execution.
1253
1271
  */
1254
1272
  orchestrate(options) {
1255
- const { form, handlers = [], mapperRegistry = {} } = options;
1273
+ const { form, mapperRegistry = {}, handlerRegistry = [] } = options;
1256
1274
  this._form.set(form);
1257
- this._handlers.set(handlers);
1258
1275
  this._mapperRegistry.set(mapperRegistry);
1259
- Object.values(this.handlers()).forEach((handler) => {
1276
+ this._handlerRegistry.set(handlerRegistry);
1277
+ Object.values(this.handlerRegistry()).forEach((handler) => {
1260
1278
  this.addReactiveLogic(handler.getReactiveLogic(form));
1261
1279
  });
1262
1280
  }
@@ -1266,8 +1284,8 @@ class FormOrchestrator extends FormMapperBase {
1266
1284
  getSubForm(key) {
1267
1285
  return this.form().get(key);
1268
1286
  }
1269
- addHandler(handler) {
1270
- this._handlers.set([...this._handlers(), handler]);
1287
+ addHandlerToRegistry(handler) {
1288
+ this._handlerRegistry.set([...this._handlerRegistry(), handler]);
1271
1289
  }
1272
1290
  addReactiveLogic(subscription) {
1273
1291
  this._logicSubscription.add(subscription);
@@ -1 +1 @@
1
- {"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/base/form-control-base.ts","../../../projects/core/src/lib/form-util.ts","../../../projects/core/src/lib/base/form-handler-base.ts","../../../projects/core/src/lib/base/form-mapper-base.ts","../../../projects/core/src/lib/behavior/currency.behavior.ts","../../../projects/core/src/lib/behavior/text.behavior.ts","../../../projects/core/src/lib/input/input-currency.component.ts","../../../projects/core/src/lib/input/input-datepicker.component.ts","../../../projects/core/src/lib/input/input-number.component.ts","../../../projects/core/src/lib/input/input-select.component.ts","../../../projects/core/src/lib/input/input-text.component.ts","../../../projects/core/src/lib/input/input-textarea.component.ts","../../../projects/core/src/lib/input/input-timepicker.component.ts","../../../projects/core/src/lib/form-hydrator.ts","../../../projects/core/src/lib/form-serializer.ts","../../../projects/core/src/lib/form-orchestrator.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\n ControlValueAccessor,\n FormControl,\n NgControl,\n TouchedChangeEvent,\n Validators,\n} from '@angular/forms';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n computed,\n DestroyRef,\n Directive,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { startWith, Subscription } from 'rxjs';\n\n@Directive()\nexport abstract class FormControlBase<T> implements ControlValueAccessor {\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly destroyRef = inject(DestroyRef);\n\n static nextId = 0;\n\n readonly id = input<string | null>(\n `nmf-form-control-${FormControlBase.nextId++}`,\n );\n\n readonly _id = input<string | null>(null, { alias: 'id' });\n readonly label = input<string>('');\n readonly classList = input<string[]>([]);\n readonly loading = input<boolean>(false);\n\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n readonly _disabledByCva = signal(false);\n\n readonly ngControl = inject(NgControl, {\n self: true,\n optional: true,\n });\n\n protected readonly control = new FormControl<T | null>(null);\n\n protected readonly disabled = computed(\n () => this._disabledByInput() || this._disabledByCva(),\n );\n\n protected readonly isRequired = signal(\n this.ngControl?.control?.hasValidator(Validators.required) ?? false,\n );\n\n protected readonly hasErrors = signal(false);\n\n private changeSub = new Subscription();\n\n protected onChange: (value: T | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n\n effect(() => {\n const inputDisabled = this._disabledByInput();\n const cvaDisabled = this._disabledByCva();\n\n if (inputDisabled || cvaDisabled) {\n this.control.disable({ emitEvent: false });\n } else {\n this.control.enable({ emitEvent: true });\n }\n });\n }\n\n ngOnInit() {\n const parent = this.ngControl?.control;\n if (!parent) return;\n\n parent.statusChanges\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.control.setValidators(parent.validator ?? null);\n this.control.setAsyncValidators(parent.asyncValidator ?? null);\n this.control.updateValueAndValidity({ emitEvent: false });\n\n this.hasErrors.set(parent.invalid && parent.touched);\n this.isRequired.set(parent.hasValidator(Validators.required) ?? false);\n\n this.cdr.markForCheck();\n });\n\n parent.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n if (parent.touched) {\n this.control.markAsTouched();\n } else {\n this.control.markAsUntouched();\n }\n this.hasErrors.set(parent.invalid && parent.touched);\n this.cdr.markForCheck();\n }\n });\n\n parent.valueChanges\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.cdr.markForCheck());\n }\n\n writeValue(value: T): void {\n this.control.setValue(value, { emitEvent: false });\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n\n this.changeSub.unsubscribe();\n this.changeSub = this.control.valueChanges\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((v) => {\n fn(v);\n });\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByCva.set(isDisabled);\n }\n\n protected errorMessage(): string | null {\n const control = this.ngControl?.control;\n if (control == null || !control.errors || !control.touched) return null;\n\n const firstKey = Object.keys(control.errors)[0];\n const error = control.errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n case 'custom':\n if (typeof error === 'string') {\n return error;\n }\n return 'Invalid value';\n default:\n return 'Invalid value';\n }\n }\n}\n","import { FormControl, FormGroup } from '@angular/forms';\n\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\n if (!form) {\n throw new Error(\n `Missing form instance while getting the control of \"${controlName}\"`,\n );\n }\n\n const control = form.get(controlName) as FormControl<T>;\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n return control;\n}\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null;\n\nexport function getControlValue(\n controlName: string,\n form: FormGroup,\n): number | null;\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null {\n const control = getControl<T>(controlName, form);\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n const value = control.getRawValue();\n if (value === '') {\n return null;\n }\n\n if (typeof value === 'string') {\n const cleaned = value.replace(/,/g, '');\n\n if (!Number.isNaN(Number(cleaned))) {\n return parseNumber(value) as T;\n }\n }\n\n return value;\n}\n\nexport function parseNumber(\n input: string | number | null | undefined,\n): number | null {\n if (input == null || input === '') return null;\n\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : null;\n }\n\n const normalized = input\n .trim()\n .replace(/,/g, '') // remove thousands\n .replace(/(?!^)-/g, ''); // only allow leading '-'\n\n if (normalized === '-' || normalized === '.' || normalized === '-.') {\n return null;\n }\n\n const num = Number(normalized);\n\n return Number.isFinite(num) ? num : null;\n}\n\nexport function formatNumber(\n value: string | number | null,\n locale: string = 'en-US',\n options: Intl.NumberFormatOptions = { maximumFractionDigits: 2 },\n): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value !== 'string') {\n value = String(value);\n }\n\n value = value.replace(/[^\\d\\-,.]/g, '');\n\n if (value === '') {\n return null;\n }\n\n const isNegative = value.startsWith('-');\n const numericValue = Number(value.replace(/[,$-]/g, ''));\n const formatted = numericValue.toLocaleString(locale, options);\n\n return isNegative ? `-${formatted}` : formatted;\n}\n","import { FormControl, FormGroup } from '@angular/forms';\nimport { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-util';\n\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n private registeredControls: Record<string, FormControl> = {};\n\n /**\n * Registers form controls for later reactive access.\n */\n registerControls(form: FormGroup, controlNames: ControlNames[]): void {\n controlNames.forEach((cn) => {\n const control = getControl(cn.replace(/_/g, '.'), form);\n\n if (!control) {\n throw new Error(\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\n );\n }\n\n const key = cn as ControlNames;\n this.registeredControls[key] = control;\n });\n }\n\n valueChangesOf<T>(key: ControlNames): Observable<T> {\n if (!this.registeredControls[key]) {\n throw new Error(\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\n );\n }\n\n return this.registeredControls[key].valueChanges as Observable<T>;\n }\n}\n","export abstract class FormMapperBase<TIn = unknown, TOut = TIn, TForm = TIn> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm): TOut {\n return formValue as unknown as TOut;\n }\n}\n","export class CurrencyBehavior {\n blockNonDigitKey(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n const isDigit = /^[0-9]$/.test(event.key);\n if (isDigit) {\n return;\n }\n\n if (event.key === '.') {\n if (value.includes('.')) {\n event.preventDefault();\n }\n return;\n }\n\n if (event.key === ',') {\n event.preventDefault();\n return;\n }\n\n if (event.key === '-') {\n const hasMinus = value.includes('-');\n const isAtStart = input.selectionStart === 0;\n\n if (hasMinus || !isAtStart) {\n event.preventDefault();\n }\n return;\n }\n\n event.preventDefault();\n }\n}\n","import { signal } from '@angular/core';\n\nexport class TextBehavior {\n private _showPassword = signal<boolean>(false);\n\n showPassword = this._showPassword.asReadonly();\n\n toggleShowPassword(event?: MouseEvent): void {\n event?.stopPropagation();\n this._showPassword.set(!this.showPassword());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper nmf-input-prefix\">\n @if (displayValue() != null) {\n <span\n class=\"nmf-prefix\"\n [class.error]=\"hasErrors()\"\n [class.nmf-prefix-disabled]=\"disabled()\"\n [style.color]=\"textColor()\"\n >\n $\n </span>\n }\n\n <input\n type=\"text\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [class.nmf-input-with-prefix]=\"displayValue() != null\"\n [style.color]=\"textColor()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputCurrencyComponent extends FormControlBase<number | null> {\n displayValue = signal<string | null>(null);\n\n behavior = new CurrencyBehavior();\n\n override writeValue(value: number | null): void {\n super.writeValue(value);\n this.displayValue.set(value != null ? formatNumber(value) : null);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.behavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event) {\n if (this._disabledByInput()) return;\n\n const rawValue = (event.target as HTMLInputElement).value ?? null;\n const value = parseNumber(rawValue);\n\n this.displayValue.set(value != null ? formatNumber(value) : null);\n\n this.onChange(value);\n }\n\n textColor = computed(() => {\n const value = this.displayValue();\n if (this._disabledByInput() || !value) {\n return 'inherit';\n }\n\n const parsedValue = parseNumber(value);\n const valid = parsedValue != null && parsedValue >= 0;\n\n return valid ? 'inherit' : '#dc6262';\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"date\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [min]=\"formatDate(minDate())\"\n [max]=\"formatDate(maxDate())\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputDatepickerComponent extends FormControlBase<Date | null> {\n minDate = input<Date | null>(null);\n maxDate = input<Date | null>(null);\n\n displayValue = signal<string>('');\n\n formatDate(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n // yyyy-MM-dd (required by input[type=\"date\"])\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, '0');\n const dd = String(date.getDate()).padStart(2, '0');\n\n return `${yyyy}-${mm}-${dd}`;\n }\n\n parseDate(value: string): Date | null {\n if (!value) return null;\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d);\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n\n this.displayValue.set(this.formatDate(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseDate(input.value);\n\n this.displayValue.set(this.formatDate(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { TextBehavior } from '../behavior/text.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatNumberValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatNumberValue = input<boolean>(false);\n displayValue = signal<string>('');\n\n behavior = new TextBehavior();\n currencyBehavior = new CurrencyBehavior();\n\n override writeValue(value: string | number | null): void {\n super.writeValue(value);\n this.updateDisplayValue(value);\n }\n\n handleKeyDown(event: KeyboardEvent) {\n this.currencyBehavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const raw = (event.target as HTMLInputElement).value;\n const parsed = parseNumber(raw);\n\n this.updateDisplayValue(parsed);\n\n this.onChange(parsed);\n }\n\n updateDisplayValue(value: string | number | null) {\n if (this.formatNumberValue() && value != null) {\n this.displayValue.set(formatNumber(value) ?? '');\n } else {\n this.displayValue.set(value != null ? String(value) : '');\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\nexport interface SelectOption {\n key: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <select\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n >\n <!-- Empty option -->\n <option [ngValue]=\"null\" disabled>\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.key) {\n <option [ngValue]=\"option.key\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n\n <!-- Clear option -->\n @if (clearOptionLabel()) {\n <option [ngValue]=\"null\">\n {{ clearOptionLabel() }}\n </option>\n }\n </select>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<any> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n clearOptionLabel = input<string | null>('Clear selection');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { TextBehavior } from '../behavior/text.behavior';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper\">\n <input\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"computedType()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n />\n\n @if (type() === 'password' && !loading()) {\n <button\n type=\"button\"\n class=\"nmf-password-toggle\"\n aria-label=\"Toggle password visibility\"\n [disabled]=\"disabled()\"\n (click)=\"behavior.toggleShowPassword($event)\"\n >\n @if (behavior.showPassword()) {\n <ng-container [ngTemplateOutlet]=\"eyeOffIcon\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"eyeIcon\"></ng-container>\n }\n </button>\n }\n </div>\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n\n <ng-template #eyeIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n />\n </svg>\n </ng-template>\n\n <ng-template #eyeOffIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path\n d=\"M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z\"\n fill=\"none\"\n />\n <path\n d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n />\n </svg>\n </ng-template>\n `,\n})\nexport class InputTextComponent extends FormControlBase<\n string | number | null\n> {\n type = input<\n 'text' | 'number' | 'email' | 'tel' | 'url' | 'password' | 'search'\n >('text');\n\n behavior = new TextBehavior();\n\n computedType = computed(() =>\n this.behavior.showPassword() && this.type() === 'password'\n ? 'text'\n : this.type(),\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n styleUrls: ['./input-styles.css'],\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <textarea\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"control\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n styleUrls: ['./input-styles.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"time\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [step]=\"step()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputTimepickerComponent extends FormControlBase<Date | null> {\n // step in seconds: 60 = minutes only, 1 = show seconds\n step = input<number>(60);\n displayValue = signal<string>('');\n\n formatTime(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n const hh = String(date.getHours()).padStart(2, '0');\n const mm = String(date.getMinutes()).padStart(2, '0');\n const ss = String(date.getSeconds()).padStart(2, '0');\n\n return this.step() < 60 ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\n }\n\n parseTime(value: string): Date | null {\n if (!value) return null;\n\n const [h, m, s = 0] = value.split(':').map(Number);\n const date = new Date();\n date.setHours(h, m, s, 0);\n return date;\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n this.displayValue.set(this.formatTime(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseTime(input.value);\n\n this.displayValue.set(this.formatTime(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate(form: FormGroup, model: any, registry: MapperRegistry = {}) {\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapFn = registry[key]?.fromModel;\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n if (mapFn) {\n control.patchValue(mapFn(value), { emitEvent: false });\n } else {\n this.hydrate(control, value, registry);\n }\n return;\n }\n\n control.patchValue(value, { emitEvent: false });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest(form: FormGroup, registry: MapperRegistry = {}) {\n const result: any = {};\n\n Object.entries(form.controls).forEach(([key, control]) => {\n const mapFn = registry[key]?.toRequest;\n\n if (control instanceof FormGroup) {\n result[key] = mapFn\n ? mapFn(control.value)\n : this.toRequest(control, registry);\n return;\n }\n\n result[key] = control.value;\n });\n\n return result;\n }\n}\n","import { FormGroup } from '@angular/forms';\nimport { Directive, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { FormHandlerBase } from './base/form-handler-base';\nimport { FormMapperBase } from './base/form-mapper-base';\nimport { FormHydrator } from './form-hydrator';\nimport { FormSerializer } from './form-serializer';\nimport {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\n\n@Directive()\nexport abstract class FormOrchestrator\n extends FormMapperBase\n implements OnDestroy\n{\n private readonly _form = signal<FormGroup>(new FormGroup({}));\n private readonly _handlers = signal<FormHandlerRegistry>([]);\n private readonly _mapperRegistry = signal<MapperRegistry>({});\n private readonly _status = signal<FormStatus>('idle');\n private readonly _errorMessage = signal<string | null>(null);\n\n public readonly form = this._form.asReadonly();\n public readonly handlers = this._handlers.asReadonly();\n public readonly mapperRegistry = this._mapperRegistry.asReadonly();\n public readonly status = this._status.asReadonly();\n public readonly errorMessage = this._errorMessage.asReadonly();\n\n private _logicSubscription = new Subscription();\n\n constructor(\n protected readonly hydrator: FormHydrator,\n protected readonly serializer: FormSerializer,\n ) {\n super();\n }\n\n /**\n * Initializes orchestration state.\n * Must be called before any subform registration or handler execution.\n */\n public orchestrate(options: FormOrchestratorOptions) {\n const { form, handlers = [], mapperRegistry = {} } = options;\n this._form.set(form);\n this._handlers.set(handlers);\n this._mapperRegistry.set(mapperRegistry);\n\n Object.values(this.handlers()).forEach((handler) => {\n this.addReactiveLogic(handler.getReactiveLogic(form));\n });\n }\n\n public setForm(form: FormGroup) {\n this._form.set(form);\n }\n\n public getSubForm(key: string): FormGroup {\n return this.form().get(key) as FormGroup;\n }\n\n public addHandler(handler: FormHandlerBase) {\n this._handlers.set([...this._handlers(), handler]);\n }\n\n public addReactiveLogic(subscription: Subscription) {\n this._logicSubscription.add(subscription);\n }\n\n public setStatus(status: FormStatus) {\n this._status.set(status);\n }\n\n public setErrorMessage(message: string | null) {\n this._errorMessage.set(message);\n }\n\n public hydrateFromModel(model: any) {\n const form = this.form();\n const registry = this.mapperRegistry();\n\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapper = registry[key];\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n this.hydrator.hydrate(\n control,\n mapper ? mapper.fromModel(value) : value,\n );\n }\n });\n }\n\n public buildRequest(): any {\n return this.serializer.toRequest(this.form(), this.mapperRegistry());\n }\n\n ngOnDestroy(): void {\n this._logicSubscription.unsubscribe();\n }\n}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/base/form-control-base';\nexport * from './lib/base/form-handler-base';\nexport * from './lib/base/form-mapper-base';\n\nexport * from './lib/behavior/currency.behavior';\nexport * from './lib/behavior/text.behavior';\n\nexport * from './lib/input/input-currency.component';\nexport * from './lib/input/input-datepicker.component';\nexport * from './lib/input/input-number.component';\nexport * from './lib/input/input-select.component';\nexport * from './lib/input/input-text.component';\nexport * from './lib/input/input-textarea.component';\nexport * from './lib/input/input-timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-util';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FormHydrator","i2.FormSerializer"],"mappings":"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"}
1
+ {"version":3,"file":"ng-modular-forms-core.mjs","sources":["../../../projects/core/src/lib/base/form-control-base.ts","../../../projects/core/src/lib/form-util.ts","../../../projects/core/src/lib/base/form-handler-base.ts","../../../projects/core/src/lib/base/form-mapper-base.ts","../../../projects/core/src/lib/behavior/currency.behavior.ts","../../../projects/core/src/lib/behavior/text.behavior.ts","../../../projects/core/src/lib/input/input-currency.component.ts","../../../projects/core/src/lib/input/input-datepicker.component.ts","../../../projects/core/src/lib/input/input-number.component.ts","../../../projects/core/src/lib/input/input-select.component.ts","../../../projects/core/src/lib/input/input-text.component.ts","../../../projects/core/src/lib/input/input-textarea.component.ts","../../../projects/core/src/lib/input/input-timepicker.component.ts","../../../projects/core/src/lib/form-hydrator.ts","../../../projects/core/src/lib/form-serializer.ts","../../../projects/core/src/lib/form-orchestrator.ts","../../../projects/core/src/public-api.ts","../../../projects/core/src/ng-modular-forms-core.ts"],"sourcesContent":["import {\n ControlValueAccessor,\n FormControl,\n NgControl,\n TouchedChangeEvent,\n Validators,\n} from '@angular/forms';\nimport {\n booleanAttribute,\n computed,\n DestroyRef,\n Directive,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge, startWith } from 'rxjs';\n\n@Directive()\nexport abstract class FormControlBase<T> implements ControlValueAccessor {\n protected readonly destroyRef = inject(DestroyRef);\n\n static nextId = 0;\n readonly id = input<string | null>(\n `nmf-form-control-${FormControlBase.nextId++}`,\n { alias: 'id' },\n );\n\n readonly label = input<string>('');\n readonly classList = input<string[]>([]);\n readonly loading = input<boolean>(false);\n\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly _disabledByInput = input<boolean, unknown>(false, {\n transform: booleanAttribute,\n });\n readonly _disabledByCva = signal(false);\n\n readonly ngControl = inject(NgControl, {\n self: true,\n optional: true,\n });\n\n protected readonly standaloneControl = new FormControl<T | null>(null);\n\n get formControl(): FormControl<T | null> {\n return (\n (this.ngControl?.control as FormControl<T | null> | null) ??\n this.standaloneControl\n );\n }\n\n protected readonly disabled = computed(\n () => this._disabledByInput() || this._disabledByCva(),\n );\n\n protected readonly isRequired = signal(\n this.ngControl?.control?.hasValidator(Validators.required) ?? false,\n );\n\n protected readonly hasErrors = signal(false);\n\n protected onChange: (value: T | null) => void = () => {};\n protected onTouched: () => void = () => {};\n\n constructor() {\n if (this.ngControl) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n const control = this.ngControl?.control;\n if (!control) return;\n\n merge(control.statusChanges, control.valueChanges)\n .pipe(startWith(null), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.hasErrors.set(control.invalid && control.touched);\n this.isRequired.set(control.hasValidator(Validators.required) ?? false);\n });\n\n control.events\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event instanceof TouchedChangeEvent) {\n this.hasErrors.set(control.invalid && control.touched);\n }\n });\n }\n\n writeValue(value: T | null): void {\n const control = this.ngControl?.control;\n if (!control) return;\n\n if (control.value !== value) {\n control.setValue(value, { emitEvent: false });\n }\n }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByCva.set(isDisabled);\n }\n\n protected errorMessage(): string | null {\n const control = this.ngControl?.control;\n if (control == null || !control.errors || !control.touched) return null;\n\n const firstKey = Object.keys(control.errors)[0];\n const error = control.errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n\n case 'min':\n return `Minimum value is ${error.min}`;\n\n case 'max':\n return `Maximum value is ${error.max}`;\n\n case 'email':\n return 'Invalid email address';\n\n case 'pattern':\n return 'Invalid format';\n\n case 'custom':\n if (typeof error === 'string') {\n return error;\n }\n return 'Invalid value';\n\n default:\n return 'Invalid value';\n }\n }\n}\n","import { FormControl, FormGroup } from '@angular/forms';\n\nexport function getControl<T = unknown>(controlName: string, form: FormGroup) {\n if (!form) {\n throw new Error(\n `Missing form instance while getting the control of \"${controlName}\"`,\n );\n }\n\n const control = form.get(controlName) as FormControl<T>;\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n return control;\n}\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null;\n\nexport function getControlValue(\n controlName: string,\n form: FormGroup,\n): number | null;\n\nexport function getControlValue<T = unknown>(\n controlName: string,\n form: FormGroup,\n): T | null {\n const control = getControl<T>(controlName, form);\n if (!control) {\n throw new Error(`Missing control \"${controlName}\" in form \"${form}\"`);\n }\n\n const value = control.getRawValue();\n if (value === '') {\n return null;\n }\n\n if (typeof value === 'string') {\n const cleaned = value.replace(/,/g, '');\n\n if (!Number.isNaN(Number(cleaned))) {\n return parseNumber(value) as T;\n }\n }\n\n return value;\n}\n\nexport function parseNumber(\n input: string | number | null | undefined,\n): number | null {\n if (input == null || input === '') return null;\n\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : null;\n }\n\n const normalized = input\n .trim()\n .replace(/,/g, '') // remove thousands\n .replace(/(?!^)-/g, ''); // only allow leading '-'\n\n if (normalized === '-' || normalized === '.' || normalized === '-.') {\n return null;\n }\n\n const num = Number(normalized);\n\n return Number.isFinite(num) ? num : null;\n}\n\nexport function formatNumber(\n value: string | number | null,\n locale: string = 'en-US',\n options: Intl.NumberFormatOptions = { maximumFractionDigits: 2 },\n): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value !== 'string') {\n value = String(value);\n }\n\n value = value.replace(/[^\\d\\-,.]/g, '');\n\n if (value === '') {\n return null;\n }\n\n const isNegative = value.startsWith('-');\n const numericValue = Number(value.replace(/[,$-]/g, ''));\n const formatted = numericValue.toLocaleString(locale, options);\n\n return isNegative ? `-${formatted}` : formatted;\n}\n","import { FormControl, FormGroup } from '@angular/forms';\nimport { Observable, Subscription } from 'rxjs';\nimport { getControl } from '../form-util';\n\nexport abstract class FormHandlerBase<ControlNames extends string = string> {\n abstract getReactiveLogic(form: FormGroup): Subscription;\n\n private registeredControls: Record<string, FormControl> = {};\n\n /**\n * Registers form controls for later reactive access.\n */\n public registerControls(form: FormGroup, controlNames: ControlNames[]): void {\n controlNames.forEach((cn) => {\n const control = getControl(cn.replace(/_/g, '.'), form);\n\n if (!control) {\n throw new Error(\n `Failed to register control with name: \"${cn}\" in form group: \"${form}\"`,\n );\n }\n\n const key = cn as ControlNames;\n this.registeredControls[key] = control;\n });\n }\n\n public valueChangesOf<T>(key: ControlNames): Observable<T> {\n if (!this.registeredControls[key]) {\n throw new Error(\n `Control with name: \"${key}\" not found. Ensure it is registered in registerControls(...)`,\n );\n }\n\n return this.registeredControls[key].valueChanges as Observable<T>;\n }\n}\n","export abstract class FormMapperBase<TIn = unknown, TOut = TIn, TForm = TIn> {\n public fromModel(model: TIn): TForm {\n return structuredClone(model) as unknown as TForm;\n }\n\n public toRequest(formValue: TForm): TOut {\n return formValue as unknown as TOut;\n }\n}\n","export class CurrencyBehavior {\n blockNonDigitKey(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const value = input.value;\n\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n\n if (allowedKeys.includes(event.key)) {\n return;\n }\n\n const isDigit = /^[0-9]$/.test(event.key);\n if (isDigit) {\n return;\n }\n\n if (event.key === '.') {\n if (value.includes('.')) {\n event.preventDefault();\n }\n return;\n }\n\n if (event.key === ',') {\n event.preventDefault();\n return;\n }\n\n if (event.key === '-') {\n const hasMinus = value.includes('-');\n const isAtStart = input.selectionStart === 0;\n\n if (hasMinus || !isAtStart) {\n event.preventDefault();\n }\n return;\n }\n\n event.preventDefault();\n }\n}\n","import { signal } from '@angular/core';\n\nexport class TextBehavior {\n private _showPassword = signal<boolean>(false);\n\n showPassword = this._showPassword.asReadonly();\n\n toggleShowPassword(event?: MouseEvent): void {\n event?.stopPropagation();\n this._showPassword.set(!this.showPassword());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-currency',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper nmf-input-prefix\">\n @if (displayValue() != null) {\n <span\n class=\"nmf-prefix\"\n [class.error]=\"hasErrors()\"\n [class.nmf-prefix-disabled]=\"disabled()\"\n [style.color]=\"textColor()\"\n >\n $\n </span>\n }\n\n <input\n type=\"text\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [class.nmf-input-with-prefix]=\"displayValue() != null\"\n [style.color]=\"textColor()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n </div>\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputCurrencyComponent extends FormControlBase<number | null> {\n displayValue = signal<string | null>(null);\n\n behavior = new CurrencyBehavior();\n\n override writeValue(value: number | null): void {\n super.writeValue(value);\n this.displayValue.set(value != null ? formatNumber(value) : null);\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n this.behavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event) {\n if (this._disabledByInput()) return;\n\n const rawValue = (event.target as HTMLInputElement).value ?? null;\n const value = parseNumber(rawValue);\n\n this.displayValue.set(value != null ? formatNumber(value) : null);\n\n this.onChange(value);\n }\n\n textColor = computed(() => {\n const value = this.displayValue();\n if (this._disabledByInput() || !value) {\n return 'inherit';\n }\n\n const parsedValue = parseNumber(value);\n const valid = parsedValue != null && parsedValue >= 0;\n\n return valid ? 'inherit' : '#dc6262';\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-datepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"date\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [min]=\"formatDate(minDate())\"\n [max]=\"formatDate(maxDate())\"\n [name]=\"name()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputDatepickerComponent extends FormControlBase<Date | null> {\n minDate = input<Date | null>(null);\n maxDate = input<Date | null>(null);\n\n displayValue = signal<string>('');\n\n formatDate(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n // yyyy-MM-dd (required by input[type=\"date\"])\n const yyyy = date.getFullYear();\n const mm = String(date.getMonth() + 1).padStart(2, '0');\n const dd = String(date.getDate()).padStart(2, '0');\n\n return `${yyyy}-${mm}-${dd}`;\n }\n\n parseDate(value: string): Date | null {\n if (!value) return null;\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d);\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n\n this.displayValue.set(this.formatDate(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseDate(input.value);\n\n this.displayValue.set(this.formatDate(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { CurrencyBehavior } from '../behavior/currency.behavior';\nimport { TextBehavior } from '../behavior/text.behavior';\nimport { formatNumber, parseNumber } from '../form-util';\n\n@Component({\n selector: 'nmf-number',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"formatNumberValue() ? 'text' : 'number'\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n (keydown)=\"handleKeyDown($event)\"\n />\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputNumberComponent extends FormControlBase<\n string | number | null\n> {\n formatNumberValue = input<boolean>(false);\n displayValue = signal<string>('');\n\n behavior = new TextBehavior();\n currencyBehavior = new CurrencyBehavior();\n\n override writeValue(value: string | number | null): void {\n super.writeValue(value);\n this.updateDisplayValue(value);\n }\n\n handleKeyDown(event: KeyboardEvent) {\n this.currencyBehavior.blockNonDigitKey(event);\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const raw = (event.target as HTMLInputElement).value;\n const parsed = parseNumber(raw);\n\n this.updateDisplayValue(parsed);\n\n this.onChange(parsed);\n }\n\n updateDisplayValue(value: string | number | null) {\n if (this.formatNumberValue() && value != null) {\n this.displayValue.set(formatNumber(value) ?? '');\n } else {\n this.displayValue.set(value != null ? String(value) : '');\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\nexport interface SelectOption {\n key: string | number;\n label: string | number;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'nmf-select',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n <div class=\"select-wrapper\" [class.disabled]=\"disabled()\">\n <select\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n >\n <!-- Empty option -->\n <option [ngValue]=\"null\" disabled>\n {{ emptyOptionLabel() }}\n </option>\n\n <!-- Options -->\n @for (option of options(); track option.key) {\n <option [ngValue]=\"option.key\" [disabled]=\"option.disabled\">\n {{ option.label }}\n </option>\n }\n\n <!-- Clear option -->\n @if (clearOptionLabel()) {\n <option [ngValue]=\"null\">\n {{ clearOptionLabel() }}\n </option>\n }\n </select>\n </div>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputSelectComponent extends FormControlBase<any> {\n options = input<SelectOption[]>([]);\n emptyOptionLabel = input<string>('Select an option');\n clearOptionLabel = input<string | null>('Clear selection');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n} from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\nimport { TextBehavior } from '../behavior/text.behavior';\n\n@Component({\n selector: 'nmf-text',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <div class=\"nmf-input-wrapper\">\n <input\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [type]=\"computedType()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n />\n\n @if (type() === 'password' && !loading() && !disabled()) {\n <button\n type=\"button\"\n class=\"nmf-password-toggle\"\n aria-label=\"Toggle password visibility\"\n (click)=\"behavior.toggleShowPassword($event)\"\n >\n @if (behavior.showPassword()) {\n <ng-container [ngTemplateOutlet]=\"eyeOffIcon\"></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"eyeIcon\"></ng-container>\n }\n </button>\n }\n </div>\n\n <ng-content></ng-content>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n\n <ng-template #eyeIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n />\n </svg>\n </ng-template>\n\n <ng-template #eyeOffIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#e3e3e3\"\n class=\"nmf-icon\"\n >\n <path\n d=\"M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z\"\n fill=\"none\"\n />\n <path\n d=\"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n />\n </svg>\n </ng-template>\n `,\n})\nexport class InputTextComponent extends FormControlBase<\n string | number | null\n> {\n type = input<\n 'text' | 'number' | 'email' | 'tel' | 'url' | 'password' | 'search'\n >('text');\n\n behavior = new TextBehavior();\n\n computedType = computed(() =>\n this.behavior.showPassword() && this.type() === 'password'\n ? 'text'\n : this.type(),\n );\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-textarea',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <textarea\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n [formControl]=\"formControl\"\n (blur)=\"onTouched()\"\n ></textarea>\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n </div>\n `,\n})\nexport class InputTextareaComponent extends FormControlBase<string | null> {\n rows = input<number>(5);\n cols = input<number>(5);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n input,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FormControlBase } from '../base/form-control-base';\n\n@Component({\n selector: 'nmf-timepicker',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"nmf-field\" [class.loading]=\"loading()\">\n @if (label()) {\n <label class=\"nmf-label\">\n {{ label() }}\n @if (isRequired()) {\n <span class=\"nmf-required\">*</span>\n }\n </label>\n }\n\n <input\n type=\"time\"\n autocomplete=\"off\"\n class=\"nmf-input\"\n [ngClass]=\"classList()\"\n [class.error]=\"hasErrors()\"\n [class.disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [step]=\"step()\"\n [value]=\"displayValue()\"\n [disabled]=\"disabled()\"\n [required]=\"isRequired()\"\n [placeholder]=\"placeholder()\"\n (blur)=\"onTouched()\"\n (input)=\"onInput($event)\"\n />\n\n <ng-content></ng-content>\n\n @if (loading()) {\n <div class=\"nmf-loading\">\n <span class=\"nmf-spinner\"></span>\n </div>\n }\n\n <p class=\"nmf-error\">\n {{ errorMessage() }}\n </p>\n </div>\n `,\n})\nexport class InputTimepickerComponent extends FormControlBase<Date | null> {\n // step in seconds: 60 = minutes only, 1 = show seconds\n step = input<number>(60);\n displayValue = signal<string>('');\n\n formatTime(date: Date | null | undefined): string | null {\n if (!date) return null;\n\n const hh = String(date.getHours()).padStart(2, '0');\n const mm = String(date.getMinutes()).padStart(2, '0');\n const ss = String(date.getSeconds()).padStart(2, '0');\n\n return this.step() < 60 ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;\n }\n\n parseTime(value: string): Date | null {\n if (!value) return null;\n\n const [h, m, s = 0] = value.split(':').map(Number);\n const date = new Date();\n date.setHours(h, m, s, 0);\n return date;\n }\n\n override writeValue(value: Date | null): void {\n super.writeValue(value);\n this.displayValue.set(this.formatTime(value) ?? '');\n }\n\n onInput(event: Event): void {\n if (this._disabledByInput()) return;\n\n const input = event.target as HTMLInputElement;\n const parsed = this.parseTime(input.value);\n\n this.displayValue.set(this.formatTime(parsed) ?? '');\n\n this.onChange(parsed);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormHydrator {\n hydrate(form: FormGroup, model: any, registry: MapperRegistry = {}) {\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapFn = registry[key]?.fromModel;\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n if (mapFn) {\n control.patchValue(mapFn(value), { emitEvent: false });\n } else {\n this.hydrate(control, value, registry);\n }\n return;\n }\n\n control.patchValue(value, { emitEvent: false });\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MapperRegistry } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class FormSerializer {\n toRequest(form: FormGroup, registry: MapperRegistry = {}) {\n const result: any = {};\n\n Object.entries(form.controls).forEach(([key, control]) => {\n const mapFn = registry[key]?.toRequest;\n\n if (control instanceof FormGroup) {\n result[key] = mapFn\n ? mapFn(control.value)\n : this.toRequest(control, registry);\n return;\n }\n\n result[key] = control.value;\n });\n\n return result;\n }\n}\n","import { FormGroup } from '@angular/forms';\nimport { Directive, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { FormHandlerBase } from './base/form-handler-base';\nimport { FormMapperBase } from './base/form-mapper-base';\nimport { FormHydrator } from './form-hydrator';\nimport { FormSerializer } from './form-serializer';\nimport {\n FormHandlerRegistry,\n FormOrchestratorOptions,\n FormStatus,\n MapperRegistry,\n} from './types';\n\n@Directive()\nexport abstract class FormOrchestrator\n extends FormMapperBase\n implements OnDestroy\n{\n private readonly _form = signal<FormGroup>(new FormGroup({}));\n private readonly _handlerRegistry = signal<FormHandlerRegistry>([]);\n private readonly _mapperRegistry = signal<MapperRegistry>({});\n private readonly _status = signal<FormStatus>('idle');\n private readonly _errorMessage = signal<string | null>(null);\n\n public readonly form = this._form.asReadonly();\n public readonly handlerRegistry = this._handlerRegistry.asReadonly();\n public readonly mapperRegistry = this._mapperRegistry.asReadonly();\n public readonly status = this._status.asReadonly();\n public readonly errorMessage = this._errorMessage.asReadonly();\n\n private _logicSubscription = new Subscription();\n\n constructor(\n protected readonly hydrator: FormHydrator,\n protected readonly serializer: FormSerializer,\n ) {\n super();\n }\n\n /**\n * Initializes orchestration state.\n * Must be called before any subform registration or handler execution.\n */\n public orchestrate(options: FormOrchestratorOptions) {\n const { form, mapperRegistry = {}, handlerRegistry = [] } = options;\n this._form.set(form);\n this._mapperRegistry.set(mapperRegistry);\n this._handlerRegistry.set(handlerRegistry);\n\n Object.values(this.handlerRegistry()).forEach((handler) => {\n this.addReactiveLogic(handler.getReactiveLogic(form));\n });\n }\n\n public setForm(form: FormGroup) {\n this._form.set(form);\n }\n\n public getSubForm(key: string): FormGroup {\n return this.form().get(key) as FormGroup;\n }\n\n public addHandlerToRegistry(handler: FormHandlerBase) {\n this._handlerRegistry.set([...this._handlerRegistry(), handler]);\n }\n\n public addReactiveLogic(subscription: Subscription) {\n this._logicSubscription.add(subscription);\n }\n\n public setStatus(status: FormStatus) {\n this._status.set(status);\n }\n\n public setErrorMessage(message: string | null) {\n this._errorMessage.set(message);\n }\n\n public hydrateFromModel(model: any) {\n const form = this.form();\n const registry = this.mapperRegistry();\n\n Object.entries(form.controls).forEach(([key, control]) => {\n if (!(key in model)) return;\n\n const mapper = registry[key];\n const value = model?.[key];\n\n if (control instanceof FormGroup) {\n this.hydrator.hydrate(\n control,\n mapper ? mapper.fromModel(value) : value,\n );\n }\n });\n }\n\n public buildRequest(): any {\n return this.serializer.toRequest(this.form(), this.mapperRegistry());\n }\n\n ngOnDestroy(): void {\n this._logicSubscription.unsubscribe();\n }\n}\n","/*\n * Public API Surface of core\n */\n\nexport * from './lib/base/form-control-base';\nexport * from './lib/base/form-handler-base';\nexport * from './lib/base/form-mapper-base';\n\nexport * from './lib/behavior/currency.behavior';\nexport * from './lib/behavior/text.behavior';\n\nexport * from './lib/input/input-currency.component';\nexport * from './lib/input/input-datepicker.component';\nexport * from './lib/input/input-number.component';\nexport * from './lib/input/input-select.component';\nexport * from './lib/input/input-text.component';\nexport * from './lib/input/input-textarea.component';\nexport * from './lib/input/input-timepicker.component';\n\nexport * from './lib/form-hydrator';\nexport * from './lib/form-orchestrator';\nexport * from './lib/form-serializer';\nexport * from './lib/form-util';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FormHydrator","i2.FormSerializer"],"mappings":"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"}
@@ -1,12 +1,10 @@
1
1
  import { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';
2
- import { ChangeDetectorRef, DestroyRef } from '@angular/core';
2
+ import { DestroyRef } from '@angular/core';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare abstract class FormControlBase<T> implements ControlValueAccessor {
5
- protected readonly cdr: ChangeDetectorRef;
6
5
  protected readonly destroyRef: DestroyRef;
7
6
  static nextId: number;
8
7
  readonly id: import("@angular/core").InputSignal<string | null>;
9
- readonly _id: import("@angular/core").InputSignal<string | null>;
10
8
  readonly label: import("@angular/core").InputSignal<string>;
11
9
  readonly classList: import("@angular/core").InputSignal<string[]>;
12
10
  readonly loading: import("@angular/core").InputSignal<boolean>;
@@ -15,20 +13,20 @@ export declare abstract class FormControlBase<T> implements ControlValueAccessor
15
13
  readonly _disabledByInput: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
16
14
  readonly _disabledByCva: import("@angular/core").WritableSignal<boolean>;
17
15
  readonly ngControl: NgControl | null;
18
- protected readonly control: FormControl<T | null>;
16
+ protected readonly standaloneControl: FormControl<T | null>;
17
+ get formControl(): FormControl<T | null>;
19
18
  protected readonly disabled: import("@angular/core").Signal<boolean>;
20
19
  protected readonly isRequired: import("@angular/core").WritableSignal<boolean>;
21
20
  protected readonly hasErrors: import("@angular/core").WritableSignal<boolean>;
22
- private changeSub;
23
21
  protected onChange: (value: T | null) => void;
24
22
  protected onTouched: () => void;
25
23
  constructor();
26
24
  ngOnInit(): void;
27
- writeValue(value: T): void;
25
+ writeValue(value: T | null): void;
28
26
  registerOnChange(fn: (value: T | null) => void): void;
29
27
  registerOnTouched(fn: () => void): void;
30
28
  setDisabledState(isDisabled: boolean): void;
31
29
  protected errorMessage(): string | null;
32
30
  static ɵfac: i0.ɵɵFactoryDeclaration<FormControlBase<any>, never>;
33
- static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "_id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "classList": { "alias": "classList"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "_disabledByInput": { "alias": "_disabledByInput"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
31
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FormControlBase<any>, never, never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "classList": { "alias": "classList"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "_disabledByInput": { "alias": "_disabledByInput"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
34
32
  }
@@ -11,12 +11,12 @@ export declare abstract class FormOrchestrator extends FormMapperBase implements
11
11
  protected readonly hydrator: FormHydrator;
12
12
  protected readonly serializer: FormSerializer;
13
13
  private readonly _form;
14
- private readonly _handlers;
14
+ private readonly _handlerRegistry;
15
15
  private readonly _mapperRegistry;
16
16
  private readonly _status;
17
17
  private readonly _errorMessage;
18
18
  readonly form: import("@angular/core").Signal<FormGroup<any>>;
19
- readonly handlers: import("@angular/core").Signal<FormHandlerRegistry>;
19
+ readonly handlerRegistry: import("@angular/core").Signal<FormHandlerRegistry>;
20
20
  readonly mapperRegistry: import("@angular/core").Signal<MapperRegistry>;
21
21
  readonly status: import("@angular/core").Signal<FormStatus>;
22
22
  readonly errorMessage: import("@angular/core").Signal<string | null>;
@@ -29,7 +29,7 @@ export declare abstract class FormOrchestrator extends FormMapperBase implements
29
29
  orchestrate(options: FormOrchestratorOptions): void;
30
30
  setForm(form: FormGroup): void;
31
31
  getSubForm(key: string): FormGroup;
32
- addHandler(handler: FormHandlerBase): void;
32
+ addHandlerToRegistry(handler: FormHandlerBase): void;
33
33
  addReactiveLogic(subscription: Subscription): void;
34
34
  setStatus(status: FormStatus): void;
35
35
  setErrorMessage(message: string | null): void;
package/lib/types.d.ts CHANGED
@@ -6,6 +6,6 @@ export type MapperRegistry = Record<string, FormMapperBase<any, any, any>>;
6
6
  export type FormHandlerRegistry = FormHandlerBase[];
7
7
  export interface FormOrchestratorOptions {
8
8
  form: FormGroup;
9
- handlers?: FormHandlerRegistry;
10
9
  mapperRegistry?: MapperRegistry;
10
+ handlerRegistry?: FormHandlerRegistry;
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-modular-forms/core",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Core primitives, behaviors, and input components for orchestrating complex Angular reactive forms.",
5
5
  "keywords": [
6
6
  "angular",