@ng-forge/dynamic-forms 1.2.0-next.9 → 1.2.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.
Files changed (37) hide show
  1. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-6yyDriVB.mjs → ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs} +5 -5
  2. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-6yyDriVB.mjs.map → ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map} +1 -1
  3. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-BB8jAcY4.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs} +2 -2
  4. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-BB8jAcY4.mjs.map → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map} +1 -1
  5. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +1054 -0
  6. package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +1 -0
  7. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-DfQ0y-77.mjs → ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs} +7 -7
  8. package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +1 -0
  9. package/fesm2022/{ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs → ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs} +5 -5
  10. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +1 -0
  11. package/fesm2022/{ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs → ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs} +4 -4
  12. package/fesm2022/{ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs.map → ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map} +1 -1
  13. package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-BzbBv-r0.mjs → ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs} +5 -5
  14. package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-BzbBv-r0.mjs.map → ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map} +1 -1
  15. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-DxHD5I8E.mjs → ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs} +6 -6
  16. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-DxHD5I8E.mjs.map → ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map} +1 -1
  17. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +33 -33
  18. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +19 -19
  19. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  20. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-tA8ZkP8i.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs} +154 -68
  21. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +1 -0
  22. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-DCdBvJ-h.mjs → ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs} +5 -5
  23. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-DCdBvJ-h.mjs.map → ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map} +1 -1
  24. package/fesm2022/{ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs → ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs} +5 -5
  25. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +1 -0
  26. package/fesm2022/{ng-forge-dynamic-forms-schema-builder-IsjNBo0h.mjs → ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs} +2 -2
  27. package/fesm2022/{ng-forge-dynamic-forms-schema-builder-IsjNBo0h.mjs.map → ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map} +1 -1
  28. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs} +4 -4
  29. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs.map → ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map} +1 -1
  30. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  31. package/package.json +1 -1
  32. package/types/ng-forge-dynamic-forms-internal.d.ts +114 -3
  33. package/types/ng-forge-dynamic-forms.d.ts +157 -4
  34. package/fesm2022/ng-forge-dynamic-forms-container-field.component-DfQ0y-77.mjs.map +0 -1
  35. package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs.map +0 -1
  36. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-tA8ZkP8i.mjs.map +0 -1
  37. package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs.map +0 -1
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, PLATFORM_ID, DestroyRef, Injectable, reflectComponentType, Injector, EnvironmentInjector, computed, signal, afterNextRender, input, ViewContainerRef, Directive, isSignal, runInInjectionContext, untracked, linkedSignal, injectAsync, resource, ChangeDetectionStrategy, Component, PendingTasks, ElementRef, isDevMode, TemplateRef, model, contentChildren, makeEnvironmentProviders } from '@angular/core';
3
3
  import { explicitEffect } from 'ngxtension/explicit-effect';
4
4
  import { derivedFrom } from 'ngxtension/derived-from';
5
- import { of, Observable, distinctUntilChanged, forkJoin, from, catchError, map, switchMap, pipe, isObservable, firstValueFrom, exhaustMap, EMPTY, scan, Subject, concatMap, filter, take, shareReplay } from 'rxjs';
5
+ import { of, Observable, distinctUntilChanged, forkJoin, from, catchError, map, switchMap, pipe, isObservable, firstValueFrom, exhaustMap, EMPTY, defer, tap, scan, Subject, concatMap, filter, take, shareReplay } from 'rxjs';
6
6
  import { DynamicFormLogger, WRAPPER_COMPONENT_LOAD_CACHE, WRAPPER_COMPONENT_CACHE, WRAPPER_REGISTRY, toReadonlyFieldTreeCached, writeToFieldValue, ComponentInitializedEvent, isPageField, isGroupField, isArrayField, isRowField, isGenericContainerField, hasChildFields, normalizeFieldsArray, WRAPPER_AUTO_ASSOCIATIONS, DEFAULT_WRAPPERS, READONLY_FIELD_TREE_CACHE, EventBus, getGridClassString, FORM_OPTIONS, GROUP_CONTEXT, FIELD_REGISTRY, DynamicFormError, isContainerField, isSimplifiedArrayField, getFieldValueHandling, keyBy, mapValues, isEqual, isDerivationLogicConfig, hasTargetProperty, ARRAY_CONTEXT, FORM_ID_PREFIX, baseFieldMapper, detectFormMode, validatePageNesting, assertNever, FunctionRegistryService, ADDON_TYPE_REGISTRY, deepMergeDefaults, FIELD_SIGNAL_CONTEXT, derivedFromDeferred, FieldContextRegistryService, evaluateCondition, createWarningTracker, RootFormRegistryService, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, EXTERNAL_DATA, DEPRECATION_WARNING_TRACKER, createAddonActionRegistry, ADDON_ACTION_REGISTRY, HttpConditionCache, HTTP_CONDITION_CACHE, HttpConditionFunctionCacheService, AsyncConditionFunctionCacheService, DynamicValueFunctionCacheService, LogicFunctionCacheService, DF_FIELD_TEMPLATES, rowFieldMapper, groupFieldMapper, arrayFieldMapper, pageFieldMapper, textFieldMapper, containerFieldMapper, isWrapperTypeDefinition, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, createDefaultDerivationLogConfig, NoopLogger, EMIT_FORM_VALUE_ON_EVENTS, DynamicTextPipe, ADDON_ACTION_HANDLERS } from '@ng-forge/dynamic-forms/internal';
7
7
  import { isPlatformBrowser, AsyncPipe, NgTemplateOutlet, NgComponentOutlet } from '@angular/common';
8
8
  import { takeUntilDestroyed, toObservable, outputFromObservable } from '@angular/core/rxjs-interop';
@@ -120,10 +120,10 @@ class FieldViewportObserver {
120
120
  this.observers.set(rootMargin, entry);
121
121
  return entry;
122
122
  }
123
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldViewportObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
124
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldViewportObserver });
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldViewportObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
124
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldViewportObserver });
125
125
  }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FieldViewportObserver, decorators: [{
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FieldViewportObserver, decorators: [{
127
127
  type: Injectable
128
128
  }], ctorParameters: () => [] });
129
129
 
@@ -747,16 +747,19 @@ class DfFieldOutlet {
747
747
  return false;
748
748
  return (domState?.errors.length ?? 0) === 0;
749
749
  }
750
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfFieldOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive });
751
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: DfFieldOutlet, isStandalone: true, selector: "[dfFieldOutlet]", inputs: { dfFieldOutlet: { classPropertyName: "dfFieldOutlet", publicName: "dfFieldOutlet", isSignal: true, isRequired: true, transformFunction: null }, dfFieldOutletEnvironmentInjector: { classPropertyName: "dfFieldOutletEnvironmentInjector", publicName: "dfFieldOutletEnvironmentInjector", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
750
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfFieldOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive });
751
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: DfFieldOutlet, isStandalone: true, selector: "[dfFieldOutlet]", inputs: { dfFieldOutlet: { classPropertyName: "dfFieldOutlet", publicName: "dfFieldOutlet", isSignal: true, isRequired: true, transformFunction: null }, dfFieldOutletEnvironmentInjector: { classPropertyName: "dfFieldOutletEnvironmentInjector", publicName: "dfFieldOutletEnvironmentInjector", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
752
752
  }
753
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfFieldOutlet, decorators: [{
753
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfFieldOutlet, decorators: [{
754
754
  type: Directive,
755
755
  args: [{
756
756
  selector: '[dfFieldOutlet]',
757
757
  }]
758
758
  }], ctorParameters: () => [], propDecorators: { dfFieldOutlet: [{ type: i0.Input, args: [{ isSignal: true, alias: "dfFieldOutlet", required: true }] }], dfFieldOutletEnvironmentInjector: [{ type: i0.Input, args: [{ isSignal: true, alias: "dfFieldOutletEnvironmentInjector", required: false }] }] } });
759
759
 
760
+ function isPending(formSignal) {
761
+ return formSignal()().pending();
762
+ }
760
763
  function isTreeValidationErrors(result) {
761
764
  const isError = (v) => typeof v === 'object' && v !== null && 'kind' in v;
762
765
  return Array.isArray(result) ? result.every(isError) && result.length > 0 : isError(result);
@@ -770,25 +773,40 @@ function wrapSubmissionAction(action) {
770
773
  }
771
774
  function createSubmissionHandler(options) {
772
775
  const { eventBus, configSignal, formSignal, validSignal, logger } = options;
773
- return eventBus.on('submit').pipe(exhaustMap(() => {
776
+ return eventBus.on('submit').pipe(exhaustMap((event) => {
777
+ const reply = event.reply;
778
+ reply?.accept();
774
779
  const submissionConfig = configSignal().submission;
775
780
  if (!submissionConfig?.action) {
781
+ reply?.settle(validSignal() ? { status: 'dispatched' } : { status: 'validation-failed' });
776
782
  return EMPTY;
777
783
  }
778
784
  if (!validSignal()) {
779
785
  logger.debug('Submission action skipped: form is not valid (invalid or pending async validators)');
786
+ reply?.settle(isPending(formSignal) ? { status: 'pending-validation' } : { status: 'validation-failed' });
780
787
  return EMPTY;
781
788
  }
782
789
  const wrappedAction = wrapSubmissionAction(submissionConfig.action);
783
- return from(submit(formSignal(), wrappedAction)).pipe(catchError((error) => {
784
- logger.error('Submission action failed:', error);
785
- return EMPTY;
786
- }));
790
+ return defer(() => {
791
+ const formTree = formSignal();
792
+ return from(submit(formTree, wrappedAction)).pipe(
793
+ tap(() => {
794
+ reply?.settle(formTree().errorSummary().length ? { status: 'server-errors' } : { status: 'success' });
795
+ }), catchError((error) => {
796
+ logger.error('Submission action failed:', error);
797
+ reply?.settle({ status: 'action-failed', error });
798
+ return EMPTY;
799
+ }));
800
+ });
787
801
  }));
788
802
  }
789
803
 
790
804
  class FormSubmitEvent {
805
+ reply;
791
806
  type = 'submit';
807
+ constructor(reply) {
808
+ this.reply = reply;
809
+ }
792
810
  }
793
811
 
794
812
  const COMPONENT_CACHE = new InjectionToken('COMPONENT_CACHE', {
@@ -1194,10 +1212,10 @@ class ArrayItemRegistryService {
1194
1212
  slot.clear();
1195
1213
  this.slots.clear();
1196
1214
  }
1197
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: ArrayItemRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1198
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: ArrayItemRegistryService });
1215
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ArrayItemRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1216
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ArrayItemRegistryService });
1199
1217
  }
1200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: ArrayItemRegistryService, decorators: [{
1218
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ArrayItemRegistryService, decorators: [{
1201
1219
  type: Injectable
1202
1220
  }] });
1203
1221
 
@@ -1221,10 +1239,10 @@ class SchemaRegistryService {
1221
1239
  }
1222
1240
  return schema;
1223
1241
  }
1224
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: SchemaRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1225
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: SchemaRegistryService });
1242
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SchemaRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1243
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SchemaRegistryService });
1226
1244
  }
1227
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: SchemaRegistryService, decorators: [{
1245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: SchemaRegistryService, decorators: [{
1228
1246
  type: Injectable
1229
1247
  }] });
1230
1248
 
@@ -2935,7 +2953,7 @@ class FormStateManager {
2935
2953
  debugName: 'FormStateManager.entity',
2936
2954
  equal: isEqual,
2937
2955
  });
2938
- loadFormSchemaService = injectAsync(() => import('./ng-forge-dynamic-forms-form-schema.service-BzbBv-r0.mjs'));
2956
+ loadFormSchemaService = injectAsync(() => import('./ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs'));
2939
2957
  formSchemaRequest = computed(() => {
2940
2958
  const setup = this.formSetup();
2941
2959
  const config = this.activeConfig();
@@ -3261,7 +3279,7 @@ class FormStateManager {
3261
3279
  setupEffects() {
3262
3280
  explicitEffect([this.formSchemaResource.error], ([error]) => {
3263
3281
  if (error) {
3264
- this.logger.error('[Dynamic Forms] Failed to compile the form schema; rendering without validation and blocking submission.', error);
3282
+ this.logger.error('Failed to compile the form schema; rendering without validation and blocking submission.', error);
3265
3283
  }
3266
3284
  });
3267
3285
  explicitEffect([this.deps.config], ([config]) => {
@@ -3414,10 +3432,10 @@ class FormStateManager {
3414
3432
  ngOnDestroy() {
3415
3433
  this.machine.dispatch({ type: Action.Destroy });
3416
3434
  }
3417
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormStateManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3418
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormStateManager });
3435
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormStateManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3436
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormStateManager });
3419
3437
  }
3420
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormStateManager, decorators: [{
3438
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormStateManager, decorators: [{
3421
3439
  type: Injectable
3422
3440
  }], ctorParameters: () => [] });
3423
3441
 
@@ -3748,8 +3766,8 @@ class PageOrchestratorComponent {
3748
3766
  }
3749
3767
  return false;
3750
3768
  }
3751
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: PageOrchestratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3752
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: PageOrchestratorComponent, isStandalone: true, selector: "div[page-orchestrator]", inputs: { pageFields: { classPropertyName: "pageFields", publicName: "pageFields", isSignal: true, isRequired: true, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: true, transformFunction: null }, fieldSignalContext: { classPropertyName: "fieldSignalContext", publicName: "fieldSignalContext", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "attr.data-current-page": "state().currentPageIndex", "attr.data-total-pages": "state().totalPages" }, classAttribute: "df-page-orchestrator" }, providers: [
3769
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: PageOrchestratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3770
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: PageOrchestratorComponent, isStandalone: true, selector: "div[page-orchestrator]", inputs: { pageFields: { classPropertyName: "pageFields", publicName: "pageFields", isSignal: true, isRequired: true, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: true, transformFunction: null }, fieldSignalContext: { classPropertyName: "fieldSignalContext", publicName: "fieldSignalContext", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "attr.data-current-page": "state().currentPageIndex", "attr.data-total-pages": "state().totalPages" }, classAttribute: "df-page-orchestrator" }, providers: [
3753
3771
  {
3754
3772
  provide: FIELD_SIGNAL_CONTEXT,
3755
3773
  useFactory: (orchestrator) => orchestrator.extendedFieldSignalContext(),
@@ -3783,10 +3801,10 @@ class PageOrchestratorComponent {
3783
3801
  }
3784
3802
  }
3785
3803
  `, isInline: true, styles: [":host{display:block;position:relative;width:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
3786
- import('./ng-forge-dynamic-forms-page-field.component-DCdBvJ-h.mjs').then(m => m.default)]] });
3804
+ import('./ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs').then(m => m.default)]] });
3787
3805
  }
3788
- i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.1", ngImport: i0, type: PageOrchestratorComponent, resolveDeferredDeps: () => [/* @ts-ignore */
3789
- import('./ng-forge-dynamic-forms-page-field.component-DCdBvJ-h.mjs').then(m => m.default)], resolveMetadata: PageFieldComponent => ({ decorators: [{
3806
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.1.5", ngImport: i0, type: PageOrchestratorComponent, resolveDeferredDeps: () => [/* @ts-ignore */
3807
+ import('./ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs').then(m => m.default)], resolveMetadata: PageFieldComponent => ({ decorators: [{
3790
3808
  type: Component,
3791
3809
  args: [{ selector: 'div[page-orchestrator]', imports: [PageFieldComponent], template: `
3792
3810
  @for (page of pageRenderStates(); track page.field.key) {
@@ -3905,14 +3923,14 @@ function createDerivationRenderGate() {
3905
3923
  if (!has || engine() !== 'idle')
3906
3924
  return;
3907
3925
  engine.set('loading');
3908
- pendingTasks.run(() => import('./ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-BB8jAcY4.mjs')
3926
+ pendingTasks.run(() => import('./ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs')
3909
3927
  .then(({ bootstrapDerivationOrchestrator }) => {
3910
3928
  runInInjectionContext(injector, () => bootstrapDerivationOrchestrator());
3911
3929
  engine.set('wired');
3912
3930
  })
3913
3931
  .catch((error) => {
3914
3932
  engine.set('failed');
3915
- logger.error('[Dynamic Forms] Failed to load the derivation engine; derivations will not apply.', error);
3933
+ logger.error('Failed to load the derivation engine; derivations will not apply.', error);
3916
3934
  }));
3917
3935
  });
3918
3936
  return computed(() => {
@@ -3923,6 +3941,68 @@ function createDerivationRenderGate() {
3923
3941
  });
3924
3942
  }
3925
3943
 
3944
+ const WEB_MCP_ENABLED = new InjectionToken('WEB_MCP_ENABLED', {
3945
+ providedIn: 'root',
3946
+ factory: () => false,
3947
+ });
3948
+
3949
+ const WEB_MCP_GATE = new InjectionToken('WEB_MCP_GATE');
3950
+ function createWebMcpGate() {
3951
+ const enabled = inject(WEB_MCP_ENABLED);
3952
+ const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
3953
+ const stateManager = inject(FormStateManager);
3954
+ const injector = inject(Injector);
3955
+ const destroyRef = inject(DestroyRef);
3956
+ const logger = inject(DynamicFormLogger);
3957
+ if (!enabled || !isBrowser)
3958
+ return computed(() => 'disabled');
3959
+ const registration = computed(() => {
3960
+ const options = stateManager.effectiveFormOptions().webMcp;
3961
+ return options ? { options: options, setup: stateManager.formSetup() } : undefined;
3962
+ }, /* @ts-ignore */
3963
+ ...(ngDevMode ? [{ debugName: "registration" }] : /* istanbul ignore next */ []));
3964
+ const status = signal('idle', /* @ts-ignore */
3965
+ ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
3966
+ let epoch;
3967
+ let epochId = 0;
3968
+ const closeEpoch = () => {
3969
+ epoch?.abort();
3970
+ epoch = undefined;
3971
+ };
3972
+ destroyRef.onDestroy(closeEpoch);
3973
+ explicitEffect([registration], ([input]) => {
3974
+ closeEpoch();
3975
+ epochId += 1;
3976
+ const thisEpoch = epochId;
3977
+ if (!input) {
3978
+ status.set('idle');
3979
+ return;
3980
+ }
3981
+ const controller = new AbortController();
3982
+ epoch = controller;
3983
+ status.set('registering');
3984
+ void import('./ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs')
3985
+ .then(({ bootstrapWebMcp }) => {
3986
+ if (thisEpoch !== epochId || controller.signal.aborted)
3987
+ return;
3988
+ return runInInjectionContext(injector, () => bootstrapWebMcp(input.options, controller.signal));
3989
+ })
3990
+ .then((result) => {
3991
+ if (thisEpoch !== epochId || controller.signal.aborted)
3992
+ return;
3993
+ if (result)
3994
+ status.set(result);
3995
+ })
3996
+ .catch((error) => {
3997
+ if (thisEpoch !== epochId)
3998
+ return;
3999
+ status.set('failed');
4000
+ logger.error('Failed to load the WebMCP registrar; this form will not be exposed to agents.', error);
4001
+ });
4002
+ });
4003
+ return status.asReadonly();
4004
+ }
4005
+
3926
4006
  const FORM_INITIALIZER = new InjectionToken('FORM_INITIALIZER');
3927
4007
 
3928
4008
  const AUTO_ID_PREFIX = 'df-';
@@ -3955,10 +4035,10 @@ class DynamicFormInstanceRegistry {
3955
4035
  this.slots.delete(Number(id.slice(AUTO_ID_PREFIX.length)));
3956
4036
  this._membership.update((m) => m + 1);
3957
4037
  }
3958
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicFormInstanceRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3959
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicFormInstanceRegistry, providedIn: 'root' });
4038
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicFormInstanceRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4039
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicFormInstanceRegistry, providedIn: 'root' });
3960
4040
  }
3961
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicFormInstanceRegistry, decorators: [{
4041
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicFormInstanceRegistry, decorators: [{
3962
4042
  type: Injectable,
3963
4043
  args: [{ providedIn: 'root' }]
3964
4044
  }] });
@@ -4009,10 +4089,10 @@ class FormIdPrefixService {
4009
4089
  });
4010
4090
  }
4011
4091
  }
4012
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormIdPrefixService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4013
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormIdPrefixService });
4092
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormIdPrefixService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4093
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormIdPrefixService });
4014
4094
  }
4015
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: FormIdPrefixService, decorators: [{
4095
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: FormIdPrefixService, decorators: [{
4016
4096
  type: Injectable
4017
4097
  }], ctorParameters: () => [] });
4018
4098
 
@@ -4105,6 +4185,7 @@ function provideDynamicFormDI() {
4105
4185
  ...asyncExpressionProviders(),
4106
4186
  ...propertyDerivationProviders(),
4107
4187
  ...derivationProviders(),
4188
+ { provide: WEB_MCP_GATE, useFactory: createWebMcpGate },
4108
4189
  ];
4109
4190
  }
4110
4191
 
@@ -4119,10 +4200,10 @@ class EventDispatcher {
4119
4200
  disconnect() {
4120
4201
  this.bus = undefined;
4121
4202
  }
4122
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4123
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventDispatcher });
4203
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4204
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventDispatcher });
4124
4205
  }
4125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: EventDispatcher, decorators: [{
4206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EventDispatcher, decorators: [{
4126
4207
  type: Injectable
4127
4208
  }] });
4128
4209
 
@@ -4130,10 +4211,10 @@ class DfTemplate {
4130
4211
  dfTemplate = input.required(/* @ts-ignore */
4131
4212
  ...(ngDevMode ? [{ debugName: "dfTemplate" }] : /* istanbul ignore next */ []));
4132
4213
  templateRef = inject(TemplateRef);
4133
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4134
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: DfTemplate, isStandalone: true, selector: "ng-template[dfTemplate]", inputs: { dfTemplate: { classPropertyName: "dfTemplate", publicName: "dfTemplate", isSignal: true, isRequired: true, transformFunction: null } }, exportAs: ["dfTemplate"], ngImport: i0 });
4214
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfTemplate, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4215
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: DfTemplate, isStandalone: true, selector: "ng-template[dfTemplate]", inputs: { dfTemplate: { classPropertyName: "dfTemplate", publicName: "dfTemplate", isSignal: true, isRequired: true, transformFunction: null } }, exportAs: ["dfTemplate"], ngImport: i0 });
4135
4216
  }
4136
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfTemplate, decorators: [{
4217
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfTemplate, decorators: [{
4137
4218
  type: Directive,
4138
4219
  args: [{
4139
4220
  selector: 'ng-template[dfTemplate]',
@@ -4147,10 +4228,10 @@ class DfFieldTemplateRegistry {
4147
4228
  set(value) {
4148
4229
  this._map.set(value);
4149
4230
  }
4150
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfFieldTemplateRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4151
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfFieldTemplateRegistry });
4231
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfFieldTemplateRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4232
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfFieldTemplateRegistry });
4152
4233
  }
4153
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DfFieldTemplateRegistry, decorators: [{
4234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DfFieldTemplateRegistry, decorators: [{
4154
4235
  type: Injectable
4155
4236
  }] });
4156
4237
 
@@ -4196,6 +4277,7 @@ class DynamicForm {
4196
4277
  derivationReady = inject(DERIVATION_RENDER_GATE);
4197
4278
  shouldRender = computed(() => this.stateManager.shouldRender() && this.stateManager.formSchemaReady() && this.derivationReady(), /* @ts-ignore */
4198
4279
  ...(ngDevMode ? [{ debugName: "shouldRender" }] : /* istanbul ignore next */ []));
4280
+ webMcpStatus = inject(WEB_MCP_GATE);
4199
4281
  resolvedFields = this.stateManager.resolvedFields;
4200
4282
  fieldWindowing = computed(() => resolveFieldWindowing(this.globalFieldWindowing, this.effectiveFormOptions()?.fieldWindowing), /* @ts-ignore */
4201
4283
  ...(ngDevMode ? [{ debugName: "fieldWindowing" }] : /* istanbul ignore next */ []));
@@ -4308,8 +4390,8 @@ class DynamicForm {
4308
4390
  error: (err) => this.logger.error('Submission handler error', err),
4309
4391
  });
4310
4392
  }
4311
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
4312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: DynamicForm, isStandalone: true, selector: "form[dynamic-form]", inputs: { config: { classPropertyName: "config", publicName: "dynamic-form", isSignal: true, isRequired: true, transformFunction: null }, formOptions: { classPropertyName: "formOptions", publicName: "formOptions", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", validityChange: "validityChange", dirtyChange: "dirtyChange", submitted: "submitted", reset: "reset", cleared: "cleared", events: "events", initialized: "initialized", activePageInitialized: "activePageInitialized", onPageChange: "onPageChange", onPageNavigationStateChange: "onPageNavigationStateChange" }, host: { attributes: { "novalidate": "" }, listeners: { "submit": "onNativeSubmit($event)" }, properties: { "class.disabled": "disabled()", "class.df-form-paged": "formModeDetection().mode === \"paged\"", "class.df-form-non-paged": "formModeDetection().mode === \"non-paged\"", "attr.data-form-mode": "formModeDetection().mode", "attr.id": "idPrefix() || null" }, classAttribute: "df-dynamic-form df-form" }, providers: [
4393
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
4394
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: DynamicForm, isStandalone: true, selector: "form[dynamic-form]", inputs: { config: { classPropertyName: "config", publicName: "dynamic-form", isSignal: true, isRequired: true, transformFunction: null }, formOptions: { classPropertyName: "formOptions", publicName: "formOptions", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", validityChange: "validityChange", dirtyChange: "dirtyChange", submitted: "submitted", reset: "reset", cleared: "cleared", events: "events", initialized: "initialized", activePageInitialized: "activePageInitialized", onPageChange: "onPageChange", onPageNavigationStateChange: "onPageNavigationStateChange" }, host: { attributes: { "novalidate": "" }, listeners: { "submit": "onNativeSubmit($event)" }, properties: { "class.disabled": "disabled()", "class.df-form-paged": "formModeDetection().mode === \"paged\"", "class.df-form-non-paged": "formModeDetection().mode === \"non-paged\"", "attr.data-form-mode": "formModeDetection().mode", "attr.id": "idPrefix() || null" }, classAttribute: "df-dynamic-form df-form" }, providers: [
4313
4395
  provideDynamicFormDI(),
4314
4396
  DfFieldTemplateRegistry,
4315
4397
  { provide: DF_FIELD_TEMPLATES, useFactory: () => inject(DfFieldTemplateRegistry).map },
@@ -4348,7 +4430,7 @@ class DynamicForm {
4348
4430
  }
4349
4431
  `, isInline: true, styles: [".df-form{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);width:100%}.df-form>*{grid-column:1/-1}.df-row{display:grid;grid-template-columns:repeat(var(--df-grid-columns, 12),1fr);gap:var(--df-grid-gap, .5rem);align-items:start;width:100%}.df-row>*:not([class*=df-col-]){grid-column:1/-1}.df-col-1{grid-column:span 1}.df-col-2{grid-column:span 2}.df-col-3{grid-column:span 3}.df-col-4{grid-column:span 4}.df-col-5{grid-column:span 5}.df-col-6{grid-column:span 6}.df-col-7{grid-column:span 7}.df-col-8{grid-column:span 8}.df-col-9{grid-column:span 9}.df-col-10{grid-column:span 10}.df-col-11{grid-column:span 11}.df-col-12{grid-column:span 12}.df-col-auto{grid-column:span auto;width:auto}.df-col-full{grid-column:1/-1}.df-col-start-1{grid-column-start:1}.df-col-start-2{grid-column-start:2}.df-col-start-3{grid-column-start:3}.df-col-start-4{grid-column-start:4}.df-col-start-5{grid-column-start:5}.df-col-start-6{grid-column-start:6}.df-col-start-7{grid-column-start:7}.df-col-start-8{grid-column-start:8}.df-col-start-9{grid-column-start:9}.df-col-start-10{grid-column-start:10}.df-col-start-11{grid-column-start:11}.df-col-start-12{grid-column-start:12}.df-col-end-1{grid-column-end:1}.df-col-end-2{grid-column-end:2}.df-col-end-3{grid-column-end:3}.df-col-end-4{grid-column-end:4}.df-col-end-5{grid-column-end:5}.df-col-end-6{grid-column-end:6}.df-col-end-7{grid-column-end:7}.df-col-end-8{grid-column-end:8}.df-col-end-9{grid-column-end:9}.df-col-end-10{grid-column-end:10}.df-col-end-11{grid-column-end:11}.df-col-end-12{grid-column-end:12}.df-col-end-13{grid-column-end:13}@media(max-width:576px){.df-form{--df-grid-gap: var(--df-grid-gap-sm, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-sm, .5rem)}.df-row{grid-template-columns:1fr}.df-row>*{grid-column:1/-1!important}.df-row.df-row-mobile-keep-cols{grid-template-columns:repeat(var(--df-grid-columns, 12),1fr)}.df-row.df-row-mobile-keep-cols>*{grid-column:revert!important}}@media(min-width:577px)and (max-width:768px){.df-form{--df-grid-gap: var(--df-grid-gap-md, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-md, .5rem)}.df-row{--df-grid-columns: 6}.df-col-sm-1{grid-column:span 1}.df-col-sm-2{grid-column:span 2}.df-col-sm-3{grid-column:span 3}.df-col-sm-4{grid-column:span 4}.df-col-sm-5{grid-column:span 5}.df-col-sm-6{grid-column:span 6}.df-col-sm-full{grid-column:1/-1}}@media(min-width:769px)and (max-width:992px){.df-form{--df-grid-gap: var(--df-grid-gap-lg, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-lg, .5rem)}.df-col-md-1{grid-column:span 1}.df-col-md-2{grid-column:span 2}.df-col-md-3{grid-column:span 3}.df-col-md-4{grid-column:span 4}.df-col-md-5{grid-column:span 5}.df-col-md-6{grid-column:span 6}.df-col-md-7{grid-column:span 7}.df-col-md-8{grid-column:span 8}.df-col-md-9{grid-column:span 9}.df-col-md-10{grid-column:span 10}.df-col-md-11{grid-column:span 11}.df-col-md-12{grid-column:span 12}.df-col-md-full{grid-column:1/-1}}@media(min-width:993px){.df-form{--df-grid-gap: var(--df-grid-gap-xl, .5rem);--df-grid-row-gap: var(--df-grid-row-gap-xl, .5rem)}.df-col-lg-1{grid-column:span 1}.df-col-lg-2{grid-column:span 2}.df-col-lg-3{grid-column:span 3}.df-col-lg-4{grid-column:span 4}.df-col-lg-5{grid-column:span 5}.df-col-lg-6{grid-column:span 6}.df-col-lg-7{grid-column:span 7}.df-col-lg-8{grid-column:span 8}.df-col-lg-9{grid-column:span 9}.df-col-lg-10{grid-column:span 10}.df-col-lg-11{grid-column:span 11}.df-col-lg-12{grid-column:span 12}.df-col-lg-full{grid-column:1/-1}}.df-gap-none{--df-grid-gap: 0}.df-gap-xs{--df-grid-gap: .25rem}.df-gap-sm{--df-grid-gap: .5rem}.df-gap-md{--df-grid-gap: 1rem}.df-gap-lg{--df-grid-gap: 1.5rem}.df-gap-xl{--df-grid-gap: 2rem}.df-row-gap-none{--df-grid-row-gap: 0}.df-row-gap-xs{--df-grid-row-gap: .25rem}.df-row-gap-sm{--df-grid-row-gap: .5rem}.df-row-gap-md{--df-grid-row-gap: 1rem}.df-row-gap-lg{--df-grid-row-gap: 1.5rem}.df-row-gap-xl{--df-grid-row-gap: 2rem}.df-field{display:block;width:100%;min-width:0;overflow:hidden;margin:0}.df-group,.df-page{display:block;width:100%}.df-form.disabled,.df-row.disabled,.df-field.disabled{opacity:.6;pointer-events:none}.df-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.df-sr-only-focusable:focus,.df-sr-only-focusable:active{position:static;width:auto;height:auto;padding:inherit;margin:inherit;overflow:visible;clip:auto;white-space:normal}.df-live-region{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.df-form :focus-visible{outline:2px solid var(--df-focus-color, #005fcc);outline-offset:2px}.df-group:focus-within{outline:1px dashed var(--df-focus-color, #005fcc);outline-offset:4px}:host{display:grid;grid-template-columns:1fr;gap:var(--df-grid-row-gap, .5rem);width:100%}:host>*{grid-column:1/-1}:host.df-form-spacing-custom{--df-grid-row-gap: var(--df-form-custom-spacing, 1.5rem)}:host.df-form-gap-none{--df-grid-row-gap: 0}:host.df-form-gap-xs{--df-grid-row-gap: .25rem}:host.df-form-gap-sm{--df-grid-row-gap: .5rem}:host.df-form-gap-md{--df-grid-row-gap: 1rem}:host.df-form-gap-lg{--df-grid-row-gap: 1.5rem}:host.df-form-gap-xl{--df-grid-row-gap: 2rem}:host.df-form-paged{gap:0}.df-field-placeholder{display:block}\n"], dependencies: [{ kind: "directive", type: DfFieldOutlet, selector: "[dfFieldOutlet]", inputs: ["dfFieldOutlet", "dfFieldOutletEnvironmentInjector"] }, { kind: "component", type: PageOrchestratorComponent, selector: "div[page-orchestrator]", inputs: ["pageFields", "form", "fieldSignalContext"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [DfFieldOutlet]] });
4350
4432
  }
4351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: DynamicForm, decorators: [{
4433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: DynamicForm, decorators: [{
4352
4434
  type: Component,
4353
4435
  args: [{ selector: 'form[dynamic-form]', imports: [DfFieldOutlet, PageOrchestratorComponent], template: `
4354
4436
  @if (shouldRender()) {
@@ -4444,35 +4526,35 @@ const DISPLAY_FIELD_TYPES_BASE = {
4444
4526
  const BUILT_IN_FIELDS = [
4445
4527
  {
4446
4528
  name: 'row',
4447
- loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-DfQ0y-77.mjs'),
4529
+ loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs'),
4448
4530
  mapper: rowFieldMapper,
4449
4531
  valueHandling: 'flatten',
4450
4532
  ...CONTAINER_FIELD_TYPES_BASE,
4451
4533
  },
4452
4534
  {
4453
4535
  name: 'group',
4454
- loadComponent: () => import('./ng-forge-dynamic-forms-group-field.component-DxHD5I8E.mjs'),
4536
+ loadComponent: () => import('./ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs'),
4455
4537
  mapper: groupFieldMapper,
4456
4538
  valueHandling: 'include',
4457
4539
  ...CONTAINER_FIELD_TYPES_BASE,
4458
4540
  },
4459
4541
  {
4460
4542
  name: 'array',
4461
- loadComponent: () => import('./ng-forge-dynamic-forms-array-field.component-6yyDriVB.mjs'),
4543
+ loadComponent: () => import('./ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs'),
4462
4544
  mapper: arrayFieldMapper,
4463
4545
  valueHandling: 'include',
4464
4546
  ...CONTAINER_FIELD_TYPES_BASE,
4465
4547
  },
4466
4548
  {
4467
4549
  name: 'page',
4468
- loadComponent: () => import('./ng-forge-dynamic-forms-page-field.component-DCdBvJ-h.mjs'),
4550
+ loadComponent: () => import('./ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs'),
4469
4551
  mapper: pageFieldMapper,
4470
4552
  valueHandling: 'flatten',
4471
4553
  ...CONTAINER_FIELD_TYPES_BASE,
4472
4554
  },
4473
4555
  {
4474
4556
  name: 'text',
4475
- loadComponent: () => import('./ng-forge-dynamic-forms-text-field.component-C-f80sbk.mjs'),
4557
+ loadComponent: () => import('./ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs'),
4476
4558
  mapper: textFieldMapper,
4477
4559
  valueHandling: 'exclude',
4478
4560
  ...DISPLAY_FIELD_TYPES_BASE,
@@ -4483,7 +4565,7 @@ const BUILT_IN_FIELDS = [
4483
4565
  },
4484
4566
  {
4485
4567
  name: 'container',
4486
- loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-DfQ0y-77.mjs'),
4568
+ loadComponent: () => import('./ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs'),
4487
4569
  mapper: containerFieldMapper,
4488
4570
  valueHandling: 'flatten',
4489
4571
  ...CONTAINER_FIELD_TYPES_BASE,
@@ -4492,15 +4574,15 @@ const BUILT_IN_FIELDS = [
4492
4574
  const BUILT_IN_WRAPPERS = [
4493
4575
  {
4494
4576
  wrapperName: 'css',
4495
- loadComponent: () => import('./ng-forge-dynamic-forms-css-wrapper.component-D_yRuLpu.mjs'),
4577
+ loadComponent: () => import('./ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs'),
4496
4578
  },
4497
4579
  {
4498
4580
  wrapperName: 'row',
4499
- loadComponent: () => import('./ng-forge-dynamic-forms-row-wrapper.component-BBWmqQA_.mjs'),
4581
+ loadComponent: () => import('./ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs'),
4500
4582
  },
4501
4583
  {
4502
4584
  wrapperName: 'field-errors',
4503
- loadComponent: () => import('./ng-forge-dynamic-forms-field-errors-wrapper.component-ZdaC4Bit.mjs'),
4585
+ loadComponent: () => import('./ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs'),
4504
4586
  rendersFieldErrors: true,
4505
4587
  },
4506
4588
  ];
@@ -4709,6 +4791,10 @@ function withFieldWindowing(config) {
4709
4791
  return createFeature('field-windowing', [{ provide: FIELD_WINDOWING, useValue: resolved }]);
4710
4792
  }
4711
4793
 
4794
+ function withExperimentalWebMcp() {
4795
+ return createFeature('web-mcp', [{ provide: WEB_MCP_ENABLED, useValue: true }]);
4796
+ }
4797
+
4712
4798
  const VALIDATION_EXECUTION_DEFAULTS = new InjectionToken('VALIDATION_EXECUTION_DEFAULTS', {
4713
4799
  providedIn: 'root',
4714
4800
  factory: () => ({
@@ -4736,10 +4822,10 @@ class TextAddonComponent {
4736
4822
  ...(ngDevMode ? [{ debugName: "addon" }] : /* istanbul ignore next */ []));
4737
4823
  fieldInputs = input(/* @ts-ignore */
4738
4824
  ...(ngDevMode ? [undefined, { debugName: "fieldInputs" }] : /* istanbul ignore next */ []));
4739
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TextAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4740
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: TextAddonComponent, isStandalone: true, selector: "df-text-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-hidden": "\"true\"" } }, ngImport: i0, template: `<span>{{ addon().text | dynamicText | async }}</span>`, isInline: true, dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4825
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TextAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4826
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: TextAddonComponent, isStandalone: true, selector: "df-text-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-hidden": "\"true\"" } }, ngImport: i0, template: `<span>{{ addon().text | dynamicText | async }}</span>`, isInline: true, dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DynamicTextPipe, name: "dynamicText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4741
4827
  }
4742
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TextAddonComponent, decorators: [{
4828
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TextAddonComponent, decorators: [{
4743
4829
  type: Component,
4744
4830
  args: [{
4745
4831
  selector: 'df-text-addon',
@@ -4779,14 +4865,14 @@ class TemplateAddonComponent {
4779
4865
  }
4780
4866
  });
4781
4867
  }
4782
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TemplateAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4783
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: TemplateAddonComponent, isStandalone: true, selector: "df-template-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4868
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TemplateAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4869
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: TemplateAddonComponent, isStandalone: true, selector: "df-template-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4784
4870
  @if (template(); as tpl) {
4785
4871
  <ng-container *ngTemplateOutlet="tpl; context: outletContext()" />
4786
4872
  }
4787
4873
  `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4788
4874
  }
4789
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TemplateAddonComponent, decorators: [{
4875
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: TemplateAddonComponent, decorators: [{
4790
4876
  type: Component,
4791
4877
  args: [{
4792
4878
  selector: 'df-template-addon',
@@ -4834,14 +4920,14 @@ class ComponentAddonComponent {
4834
4920
  });
4835
4921
  });
4836
4922
  }
4837
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: ComponentAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4838
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: ComponentAddonComponent, isStandalone: true, selector: "df-component-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4923
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ComponentAddonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4924
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: ComponentAddonComponent, isStandalone: true, selector: "df-component-addon", inputs: { addon: { classPropertyName: "addon", publicName: "addon", isSignal: true, isRequired: true, transformFunction: null }, fieldInputs: { classPropertyName: "fieldInputs", publicName: "fieldInputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
4839
4925
  @if (resolvedComponent(); as cmp) {
4840
4926
  <ng-container *ngComponentOutlet="cmp; inputs: inputs()" />
4841
4927
  }
4842
4928
  `, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4843
4929
  }
4844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: ComponentAddonComponent, decorators: [{
4930
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ComponentAddonComponent, decorators: [{
4845
4931
  type: Component,
4846
4932
  args: [{
4847
4933
  selector: 'df-component-addon',
@@ -5043,5 +5129,5 @@ function arrayEvent(arrayKey) {
5043
5129
 
5044
5130
 
5045
5131
 
5046
- export { arrayEvent as $, ArrayItemRegistryService as A, BUILT_IN_FIELDS as B, CONTAINER_FIELD_PROCESSORS as C, DfFieldOutlet as D, DfTemplate as E, FIELD_WINDOWING as F, DynamicForm as G, EventDispatcher as H, FormClearEvent as I, FormResetEvent as J, FormSubmitEvent as K, GoToPageEvent as L, InsertArrayItemEvent as M, MoveArrayItemEvent as N, NextPageEvent as O, PROPERTY_OVERRIDE_STORE as P, PageChangeEvent as Q, PagerStateEvent as R, SchemaRegistryService as S, PopArrayItemEvent as T, PrependArrayItemEvent as U, VALIDATION_EXECUTION_DEFAULTS as V, PreviousPageEvent as W, RemoveAtIndexEvent as X, ShiftArrayItemEvent as Y, TemplateAddonComponent as Z, TextAddonComponent as _, createFieldResolutionPipe as a, createWrappers as a0, isWrappersBundle as a1, provideDynamicForm as a2, sanitizeFormConfig as a3, withAddonActions as a4, withCustomAddon as a5, withEventFormValue as a6, withFieldWindowing as a7, withLegacyStatusClasses as a8, withLoggerConfig as a9, withPagePreload as aa, withValidationExecutionDefaults as ab, withValueExclusionDefaults as ac, wrapperProps as ad, isSameWrapperChain as b, computeContainerHostClasses as c, initializationComponentPath as d, createWrapperChainController as e, createHiddenSignal as f, createRenderReadySignal as g, getNormalizedArrayMetadata as h, injectFieldRegistry as i, emitComponentInitialized as j, getFieldDefaultValue as k, resolveFieldWindowing as l, mapFieldToInputs as m, collectInitializingContainerKeys as n, ActivePageInitializedEvent as o, initializationComponentKey as p, DEV_MODE as q, resolveWrappers as r, setupContainerInitEffect as s, traverseFieldsWithContext as t, DERIVATION_WARNING_TRACKER as u, FormStateManager as v, DERIVATION_LOG_CONFIG as w, AppendArrayItemEvent as x, ComponentAddonComponent as y, ConsoleLogger as z };
5047
- //# sourceMappingURL=ng-forge-dynamic-forms-ng-forge-dynamic-forms-tA8ZkP8i.mjs.map
5132
+ export { arrayEvent as $, ArrayItemRegistryService as A, BUILT_IN_FIELDS as B, CONTAINER_FIELD_PROCESSORS as C, DfFieldOutlet as D, ConsoleLogger as E, FIELD_WINDOWING as F, DfTemplate as G, DynamicForm as H, EventDispatcher as I, FormClearEvent as J, FormResetEvent as K, GoToPageEvent as L, InsertArrayItemEvent as M, MoveArrayItemEvent as N, NextPageEvent as O, PROPERTY_OVERRIDE_STORE as P, PageChangeEvent as Q, PagerStateEvent as R, SchemaRegistryService as S, PopArrayItemEvent as T, PrependArrayItemEvent as U, VALIDATION_EXECUTION_DEFAULTS as V, PreviousPageEvent as W, RemoveAtIndexEvent as X, ShiftArrayItemEvent as Y, TemplateAddonComponent as Z, TextAddonComponent as _, createFieldResolutionPipe as a, createWrappers as a0, isWrappersBundle as a1, provideDynamicForm as a2, sanitizeFormConfig as a3, withAddonActions as a4, withCustomAddon as a5, withEventFormValue as a6, withExperimentalWebMcp as a7, withFieldWindowing as a8, withLegacyStatusClasses as a9, withLoggerConfig as aa, withPagePreload as ab, withValidationExecutionDefaults as ac, withValueExclusionDefaults as ad, wrapperProps as ae, isSameWrapperChain as b, computeContainerHostClasses as c, initializationComponentPath as d, createWrapperChainController as e, createHiddenSignal as f, createRenderReadySignal as g, getNormalizedArrayMetadata as h, injectFieldRegistry as i, emitComponentInitialized as j, getFieldDefaultValue as k, resolveFieldWindowing as l, mapFieldToInputs as m, collectInitializingContainerKeys as n, ActivePageInitializedEvent as o, initializationComponentKey as p, DEV_MODE as q, resolveWrappers as r, setupContainerInitEffect as s, traverseFieldsWithContext as t, DERIVATION_WARNING_TRACKER as u, FormStateManager as v, DERIVATION_LOG_CONFIG as w, FormSubmitEvent as x, AppendArrayItemEvent as y, ComponentAddonComponent as z };
5133
+ //# sourceMappingURL=ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map