@praxisui/dynamic-form 10.0.0-rc.37 → 10.0.0-rc.39

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "10.0.0-rc.37",
3
+ "version": "10.0.0-rc.39",
4
4
  "description": "Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -9,13 +9,13 @@
9
9
  "@angular/forms": "^21.0.0",
10
10
  "@angular/material": "^21.0.0",
11
11
  "@angular/router": "^21.0.0",
12
- "@praxisui/ai": "^10.0.0-rc.37",
13
- "@praxisui/dynamic-fields": "^10.0.0-rc.37",
14
- "@praxisui/metadata-editor": "^10.0.0-rc.37",
15
- "@praxisui/rich-content": "^10.0.0-rc.37",
16
- "@praxisui/settings-panel": "^10.0.0-rc.37",
17
- "@praxisui/visual-builder": "^10.0.0-rc.37",
18
- "@praxisui/core": "^10.0.0-rc.37",
12
+ "@praxisui/ai": "^10.0.0-rc.39",
13
+ "@praxisui/dynamic-fields": "^10.0.0-rc.39",
14
+ "@praxisui/metadata-editor": "^10.0.0-rc.39",
15
+ "@praxisui/rich-content": "^10.0.0-rc.39",
16
+ "@praxisui/settings-panel": "^10.0.0-rc.39",
17
+ "@praxisui/visual-builder": "^10.0.0-rc.39",
18
+ "@praxisui/core": "^10.0.0-rc.39",
19
19
  "rxjs": "^7.8.0"
20
20
  },
21
21
  "dependencies": {
@@ -57,7 +57,7 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form-config
57
57
 
58
58
  - Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
59
59
  - `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
60
- - Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. Não existe um quarto valor em `bindings.mode`.
60
+ - Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. A UI prefere os três modos de operação; documentos nativos também aceitam e preservam `presentation` e `dossier`, já suportados pelo runtime.
61
61
  - O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
62
62
  - `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
63
63
 
@@ -226,6 +226,14 @@ contrato explicito -> aliases legados (quando suportados) -> defaults internos -
226
226
 
227
227
  Campos e aliases preservados do documento anterior devem convergir progressivamente para paths canonicos declarados.
228
228
 
229
+ The Rules tab separates structural completeness, property editing, sample-data
230
+ simulation, and form/runtime diagnostics. Review both branches and every effect
231
+ before applying. A successful preview does not validate target availability or
232
+ grant field access. Presentation rules and conditional command rules retain
233
+ separate channels. JSON rule replacement and Reset refresh the visual draft and
234
+ structured effects panel; a valid stale visual projection cannot override the
235
+ canonical `formRules` list. Clearing that list clears residual visual state.
236
+
229
237
  ### Precedence rules
230
238
 
231
239
  Quando houver conflito entre alias e path canonico, priorizar path canonico e manter alias apenas para backward compatibility.
@@ -287,7 +295,7 @@ A entrada operacional vem via `SETTINGS_PANEL_DATA` (injetado pelo settings pane
287
295
  | `backConfig` | `BackConfig` | Nao | Active | Configuracao de retorno do CRUD; fallback local quando ausente. |
288
296
  | `formId` | `string` | Nao | Active | Identidade para persistencia auxiliar e chave de painel. |
289
297
  | `componentKeyId` | `string` | Nao | Active | Prioridade para chave de persistencia quando informado. |
290
- | `mode` | `'create' \| 'edit' \| 'view'` | Nao | Active | Inicializa `inputMode`; invalido cai para `create`. |
298
+ | `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | Nao | Active | Inicializa `inputMode`; invalido cai para `create`. |
291
299
  | `presentationMode` | `boolean` | Nao | Active | Controla exibicao da aba "Modo Apresentacao". |
292
300
  | `runtimeContext` | `DynamicFormRuntimeContext` | Nao | Active | Contexto operacional somente leitura; pode expor `resolvedContract.schemaUrl/submitUrl/submitMethod` para diagnosticos visuais, sem persistencia no documento autoral. |
293
301
 
@@ -318,7 +326,7 @@ A entrada operacional vem via `SETTINGS_PANEL_DATA` (injetado pelo settings pane
318
326
  labelAlign?: 'start' | 'center' | 'end';
319
327
  valueAlign?: 'start' | 'center' | 'end';
320
328
  };
321
- inputsPatch: { mode: 'create' | 'edit' | 'view' };
329
+ inputsPatch: { mode: 'create' | 'edit' | 'view' | 'presentation' | 'dossier' };
322
330
  schemaPrefs: {
323
331
  notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none';
324
332
  snoozeMs: number;
@@ -38,7 +38,7 @@ source_of_truth:
38
38
  - "projects/praxis-core/src/lib/models/form/rule-property.schema.ts"
39
39
  - "projects/praxis-dynamic-form/docs/layout-items-visual-blocks.md"
40
40
  source_of_truth_last_verified: "2026-08-12"
41
- last_updated: "2026-08-12"
41
+ last_updated: "2026-10-22"
42
42
  toc: true
43
43
  sidebar: true
44
44
  tags:
@@ -59,6 +59,10 @@ related_components: []
59
59
 
60
60
  Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
61
61
 
62
+ ## Form runtime ownership (breaking beta correction)
63
+
64
+ Every mounted form owns its mutable `GenericCrudService` and editor field/rule context. Replacing a service in an ancestor injector no longer changes the form's client. Configure the form through `resourcePath`, `apiEndpointKey`, `apiUrlEntry`, and `customEndpoints` for a directly mounted form. Shared `HttpClient` interceptors, `API_URL` and infrastructure remain inherited. No new JSON/config field is introduced by this correction. In component tests, replace the local client with `TestBed.overrideComponent(PraxisDynamicForm, { add: { providers: [{ provide: GenericCrudService, useValue: crudMock }] } })` so the i18n provider is retained.
65
+
62
66
  ## Summary
63
67
 
64
68
  - Tipo documental: API reference canonica de contrato JSON.
@@ -70,7 +74,7 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
70
74
 
71
75
  - Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
72
76
  - `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
73
- - Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. Não existe um quarto valor em `bindings.mode`.
77
+ - Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. A UI prefere os três modos de operação; documentos nativos preservam também `presentation` e `dossier` suportados pelo runtime.
74
78
  - O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
75
79
  - `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
76
80
  - `presentationPreset` (`'corporate-dossier' | 'editorial-card' | 'compact-presentation' | 'default'`) define o preset visual nativo em modo apresentação (`view`). Pode ser configurado via `@Input() presentationPreset`, em `FormPresentationConfig.preset` / `FormPresentationConfig.presentationPreset`, em `FormConfigMetadata.presentationPreset`, ou por seção via `FormSection.presentationPreset` para sobrescrever o estilo de uma seção específica sem recorrer a regras CSS ad hoc com `::ng-deep`.
@@ -278,7 +282,7 @@ of initial values: a contextual `resourceId` never triggers entity hydration.
278
282
  | `config` | `FormConfig` | Conditional | component-input | `normalizeFormConfig(config)` | Contrato principal quando fornecido diretamente pelo host. |
279
283
  | `resourcePath` | `string \| undefined` | Conditional | component-input | `crud.configure(resourcePath)` | Endpoint base para schema e dados remotos. Alternativa canônica: `schemaUrl` explícito. |
280
284
  | `resourceId` | `string \| number \| undefined` | No | component-input | update `pendingEntityId`; hydrate only in `edit/view` | Carrega entidade em modo `edit/view`. Em `create`, pode identificar o item dono de um comando sem iniciar leitura nem bloquear os campos. |
281
- | `mode` | `'create' \| 'edit' \| 'view'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
285
+ | `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
282
286
  | `schemaSource` | `'resource' \| 'filter'` | No | component-input | runtime branch | Seleciona caminho de obtenção de schema quando `schemaUrl` não é informado. |
283
287
  | `schemaUrl` | `string \| null \| undefined` | Conditional | component-input | parsed as `/schemas/filtered` contract | Fonte canônica explícita para inicialização schema-backed sem depender de `resourcePath`. |
284
288
  | `readUrl` | `string \| null \| undefined` | No | component-input | resolved via API origin and `{id}` placeholders | URL concreta de leitura publicada por surface `VIEW`/`READ_PROJECTION`; quando presente, substitui `crud.getById` na hidratação da entidade. |
@@ -623,7 +627,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
623
627
  | `config` | `FormConfig` | `{ sections: [] }` | Active | Contrato principal consumido no ciclo inteiro. `sections` é opcional somente para forms schema-driven com grounding explícito (`metadata.source='schema'`, schema metadata ou fonte runtime como `schemaUrl`/`resourcePath`); ausência de layout manual é normalizada internamente como array vazio e permite que `layoutPolicy`/schema materializem agrupamentos. |
624
628
  | `resourcePath` | `string \| undefined` | `undefined` | Active | Habilita carga de schema/dados remotos. Opcional quando `schemaUrl` explícito é fornecido. |
625
629
  | `resourceId` | `string \| number \| undefined` | `undefined` | Active | Carrega entidade no modo `edit/view`; em `create`, funciona apenas como contexto do item e não dispara hidratação. |
626
- | `mode` | `'create' \| 'edit' \| 'view'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
630
+ | `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
627
631
  | `schemaSource` | `'resource' \| 'filter'` | `'resource'` | Active | Seleciona origem do schema remoto. |
628
632
  | `schemaUrl` | `string \| undefined` | `undefined` | Active | Permite usar schema canonico publicado pelo backend sem heuristica local de path e pode iniciar o fluxo corporativo sem `resourcePath`. |
629
633
  | `readUrl` | `string \| undefined` | `undefined` | Active | Hidrata dados de surfaces de leitura/projecao pelo endpoint publicado, preservando `resourcePath` como recurso dono. |
@@ -641,7 +645,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
641
645
  | `enableCustomization` | `boolean` | `false` | Active | Habilita UX de customizacao do layout. |
642
646
  | `formId` | `string \| undefined` | `undefined` | Active | Chave de persistencia e identidade logica. |
643
647
  | `componentInstanceId` | `string \| undefined` | `undefined` | Active | Isola instancias com mesmo `formId`. |
644
- | `configPersistenceStrategy` | `'local-first' \| 'input-first'` | `'local-first'` | Active | Em `input-first`, os inputs fornecidos pelo host, inclusive `mode`, permanecem autoritativos sobre preferencias persistidas da mesma instancia. Combine com `layoutPolicy.persistence='transient'` em commands efemeros para nao carregar nem gravar layout local. |
648
+ | `configPersistenceStrategy` | `'local-first' \| 'input-first' \| 'volatile'` | `'local-first'` | Active | Em `input-first`, os inputs fornecidos pelo host, inclusive `mode`, permanecem autoritativos sobre preferencias persistidas da mesma instancia. Use `volatile` para filhos controlados pela página: não lê, grava nem limpa preferências próprias ou conexão persistida. `layoutPolicy.persistence='transient'` continua governando a persistência do layout gerado. |
645
649
  | `layout` | `FormLayout \| undefined` | `undefined` | Partial | Funciona como override estrutural em parte dos fluxos de layout/editor. |
646
650
  | `generatedLayoutPreset` | `'default' \| 'compactPresentation'` | `'default'` | Active | Usado apenas ao criar a configuracao inicial a partir de schema/metadata; nao reprocessa layouts persistidos ou authorados. |
647
651
  | `layoutPolicy` | `DynamicFormLayoutPolicy \| null` | `null` | Active | Politica opt-in para materializar layout a partir do schema atual. Use `source: 'schema'` com `persistence: 'transient'` para detalhe/read-only e command forms schema-driven sem persistir `sections` geradas nem reabrir configuracao local salva; politicas de host em `config`, como `helpPresentation`, continuam sendo aplicadas ao layout materializado. Em `mode='view'`, `intent: 'detail'` ou `preset: 'compactPresentation'` ativa apresentacao quando `presentationModeGlobal` nao foi informado; use `[presentationModeGlobal]=false` para controles read-only tradicionais. No preset `compactPresentation`, `x-ui.width` explicito empacota campos em linhas de 12 colunas e tem precedencia sobre `detailSummary.columns` por default; campos sem width permanecem full-width, a menos que `detailSummary.columns`/`responsiveColumns` declare a densidade do resumo. Use `detailSummary.widthPrecedence='summary'` quando a densidade do resumo read-only deve sobrescrever `x-ui.width` apenas nessa surface compacta. No preset `groupedCommand`, `groupedCommand.orphanFieldExpansion` controla linhas logicas com um unico campo: `medium-and-wide` (default) expande spans 6/8, `preserve` mantem o width publicado e `all` tambem expande campos compactos. `groupedCommand.partialRowStrategy` usa `preserve` por default; `fill-compatible` particiona o grupo nas linhas visuais depois de resolver visibilidade responsiva, CSS `order` e wrap em cada breakpoint/container, projeta cada linha parcial elegivel em spans canônicos que completam 12 colunas e mapeia o resultado de volta as colunas authoradas apenas para renderizacao, sem alterar `x-ui.width`, `sections` ou o documento de authoring. Um singleton elegivel criado por wrap pode preencher sua linha visual; controles compactos, uploads e tipos desconhecidos preservam seus spans. `groupedCommand.contextFields` identifica campos schema-backed já hidratados pela surface: eles permanecem no `FormGroup` e no payload, mas não renderizam controles redundantes. Use `responsiveColumns`, por exemplo `{ lg: 3, md: 2, sm: 1 }`, para drawers, side sheets e painéis corporativos estreitos sem copiar `FormConfig.sections` locais. `schemaType` e `schemaOperation` sao validados contra `schemaUrl` quando a URL declara esses parametros. |
@@ -7,7 +7,7 @@ import { MatDialog } from '@angular/material/dialog';
7
7
  import { MatSnackBar } from '@angular/material/snack-bar';
8
8
  import { CdkDragStart, CdkDragMove, CdkDragEnd, CdkDragDrop } from '@angular/cdk/drag-drop';
9
9
  import * as _praxisui_core from '@praxisui/core';
10
- import { AsyncConfigStorage, FormLayout, FieldMetadata, FormLayoutRule, FormRuleTargetType as FormRuleTargetType$1, PraxisJsonLogicService, FormSection, FormRow, FormColumn, FormConfig, FormConfigWithSections, FormLayoutItem, ReactiveDeterminationDefinition, ReactiveDeterminationExecutionEvent, FormActionButton, DynamicFormMode, AiCapability, DynamicFormLayoutScope, BackConfig, FormPresentationConfig, EmptyStateTone, EmptyStateVariant, EmptyStateAlignment, EmptyStateDensity, EmptyStateIconContainer, FormPresentationPreset, RichBlockHostCapabilities, ApiEndpoint, ApiUrlEntry, FormLayoutMode, FormLayoutOptions, DynamicFormLayoutPolicy, FormHooksLayout, EndpointConfig, FormSubmitEvent, FormReadyEvent, FormValueChangeEvent, FormPayloadPreviewEvent, SyncResult, FormInitializationError, LoadingState, FormCustomActionEvent, FormActionConfirmationEvent, FormLayoutTabItem, RichContentDocument, JsonLogicRecord, GenericCrudService, ConnectionStorage, DynamicFormService, ErrorMessageService, SchemaNormalizerService, ComponentMetadataRegistry, GlobalConfigService, ComponentKeyService, LoadingOrchestrator, ApiUrlConfig, PraxisLoadingRenderer, FormHooksRegistry, FormHookPreset, LoggerService, EnterpriseRuntimeContextService, FormLayoutTabsAppearance, FormSectionHeaderAction, FormSectionHeaderConfig, FormConfigState, JsonLogicExpression, FormHelpPresentationConfig, GlobalActionCatalogEntry, PraxisRuntimeConditionalEffectRule, PraxisRuntimeGlobalActionEffect, SurfaceOpenPayload, GlobalActionField, PraxisEffectPolicy, FieldDefinition, ComponentDocMeta, Breakpoint, DomainRuleRequestOptions, DomainRuleService, DomainRuleMaterialization, SchemaIdParams, CompiledDynamicFormSchema, TableConfig, SurfaceOpenActionEditorComponent, IconPickerService, GlobalActionRef, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, ComponentAuthoringManifest } from '@praxisui/core';
10
+ import { AsyncConfigStorage, FormLayout, FieldMetadata, FormLayoutRule, FormRuleTargetType as FormRuleTargetType$1, PraxisJsonLogicService, FormSection, FormRow, FormColumn, FormConfig, FormConfigWithSections, FormLayoutItem, ReactiveDeterminationDefinition, ReactiveDeterminationExecutionEvent, FormActionButton, DynamicFormMode, AiCapability, DynamicFormLayoutScope, BackConfig, FormPresentationConfig, EmptyStateTone, EmptyStateVariant, EmptyStateAlignment, EmptyStateDensity, EmptyStateIconContainer, FormPresentationPreset, RichBlockHostCapabilities, ApiEndpoint, ApiUrlEntry, FormLayoutMode, FormLayoutOptions, DynamicFormLayoutPolicy, FormHooksLayout, EndpointConfig, FormSubmitEvent, FormReadyEvent, FormValueChangeEvent, FormPayloadPreviewEvent, SyncResult, FormInitializationError, LoadingState, FormCustomActionEvent, FormActionConfirmationEvent, FormLayoutTabItem, RichContentDocument, JsonLogicRecord, GenericCrudService, ConnectionStorage, DynamicFormService, ErrorMessageService, SchemaNormalizerService, ComponentMetadataRegistry, GlobalConfigService, ComponentKeyService, LoadingOrchestrator, ApiUrlConfig, PraxisLoadingRenderer, FormHooksRegistry, FormHookPreset, LoggerService, EnterpriseRuntimeContextService, FormLayoutTabsAppearance, FormSectionHeaderAction, FormSectionHeaderConfig, FormConfigState, JsonLogicExpression, FormHelpPresentationConfig, GlobalActionCatalogEntry, PraxisRuntimeConditionalEffectRule, PraxisRuntimeGlobalActionEffect, SurfaceOpenPayload, GlobalActionField, PraxisEffectPolicy, FieldDefinition, ComponentDocMeta, DiscoveredResourceOption, Breakpoint, DomainRuleRequestOptions, DomainRuleService, DomainRuleMaterialization, SchemaIdParams, CompiledDynamicFormSchema, TableConfig, SurfaceOpenActionEditorComponent, IconPickerService, GlobalActionRef, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, ComponentAuthoringManifest, GovernedPagePreviewWidgetAdapter, WidgetInstance } from '@praxisui/core';
11
11
  export { CompiledDynamicFormSchema, DynamicFormLayoutScope, DynamicFormMode } from '@praxisui/core';
12
12
  import * as rxjs from 'rxjs';
13
13
  import { Observable, Subscription, BehaviorSubject } from 'rxjs';
@@ -591,7 +591,7 @@ interface DynamicFormSchemaPrefsSnapshot {
591
591
  }
592
592
  interface DynamicFormContextSnapshot {
593
593
  backConfig?: BackConfig;
594
- presentation?: DynamicFormPresentationSnapshot;
594
+ presentation?: DynamicFormPresentationSnapshot | null;
595
595
  schemaPrefs?: DynamicFormSchemaPrefsSnapshot;
596
596
  }
597
597
  interface DynamicFormAuthoringDocument extends EditorDocument<FormConfig, DynamicFormBindings> {
@@ -797,7 +797,10 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
797
797
  */
798
798
  editorialContext: Record<string, unknown> | null;
799
799
  mode: DynamicFormMode;
800
- config: FormConfig;
800
+ private effectiveConfig;
801
+ private configAssignment;
802
+ get config(): FormConfig;
803
+ set config(value: FormConfig);
801
804
  private hostConfigInputProvided;
802
805
  /** Optional host-level overrides for the rendered form action bar. */
803
806
  actions?: FormConfig['actions'] | null;
@@ -854,7 +857,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
854
857
  /** Identifier for persisting layouts */
855
858
  formId?: string;
856
859
  componentInstanceId?: string;
857
- configPersistenceStrategy: 'local-first' | 'input-first';
860
+ configPersistenceStrategy: 'local-first' | 'input-first' | 'volatile';
858
861
  /** Optional layout to use instead of generated one */
859
862
  layout?: FormLayout;
860
863
  /**
@@ -1039,6 +1042,10 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
1039
1042
  private schemaCache;
1040
1043
  private lastSchemaMeta?;
1041
1044
  private readonly schemaMetaPersistenceQueues;
1045
+ private persistenceContextEpoch;
1046
+ private persistenceContextDestroyed;
1047
+ /** Fence delayed work; requests already sent are not retroactively canceled. */
1048
+ private persistenceGuard;
1042
1049
  private readonly formConfigPersistenceQueues;
1043
1050
  private readonly formConfigPersistenceGenerations;
1044
1051
  private readonly formConfigConflictBlockThrough;
@@ -1870,7 +1877,11 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1870
1877
  };
1871
1878
  private destroy$;
1872
1879
  private hasProcessedInitialRuleState;
1880
+ ruleConversionFailed: boolean;
1881
+ private readonly jsonLogic;
1882
+ private readonly cascadeRulesService;
1873
1883
  private jsonEditorIsValid;
1884
+ private cascadeDraftIsValid;
1874
1885
  private globalActionValidationIssues;
1875
1886
  private readonly i18n;
1876
1887
  readonly globalActionCatalog: GlobalActionCatalogEntry[];
@@ -1883,7 +1894,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1883
1894
  isValid$: BehaviorSubject<boolean>;
1884
1895
  isBusy$: BehaviorSubject<boolean>;
1885
1896
  private lastRulesSignature;
1886
- private pendingRulePropertiesStateSignature;
1897
+ private supersededRuleStateSignature;
1887
1898
  private readonly DEBUG;
1888
1899
  private debugLog;
1889
1900
  get configTabOptions(): ConfigEditorTabOption[];
@@ -1901,6 +1912,8 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1901
1912
  onJsonValidationChange(result: JsonValidationResult): void;
1902
1913
  onJsonEditorEvent(_event: JsonEditorEvent): void;
1903
1914
  onConfigChange(newConfig: FormConfig): void;
1915
+ onCascadeValidChange(valid: boolean): void;
1916
+ private isCascadeGraphValid;
1904
1917
  private updateValidityState;
1905
1918
  private collectGlobalActionValidationIssues;
1906
1919
  private collectGlobalActionValidationTargets;
@@ -1953,6 +1966,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1953
1966
  getRuleDiagnosticDetails(diagnostic: FormRuleDiagnostics): string[];
1954
1967
  private getRulePropertyIssueNames;
1955
1968
  private markLlmRuleAccepted;
1969
+ private projectBuilderRules;
1956
1970
  private refreshRuleDiagnostics;
1957
1971
  get jsonDocument(): DynamicFormAuthoringDocument;
1958
1972
  onBackConfigChange(): void;
@@ -1984,6 +1998,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1984
1998
  onCascadeApply(patch: Record<string, Partial<FieldDefinition>>): void;
1985
1999
  private syncCascadeManagerFields;
1986
2000
  private stripLegacy;
2001
+ private hydrateRuleDraft;
1987
2002
  private computeRulesSignature;
1988
2003
  restoreHintsDefaults(): void;
1989
2004
  private loadPrefsFromStorage;
@@ -2097,6 +2112,7 @@ declare class PraxisFilterFormWidgetConfigEditor implements SettingsValueProvide
2097
2112
  private childBusy;
2098
2113
  private schemaLoading;
2099
2114
  private resourcePathDraft?;
2115
+ private selectedCatalogResource;
2100
2116
  private committedBaselineDocument?;
2101
2117
  private readonly crudService;
2102
2118
  private readonly resourceDiscovery;
@@ -2105,6 +2121,7 @@ declare class PraxisFilterFormWidgetConfigEditor implements SettingsValueProvide
2105
2121
  get effectiveEndpointKey(): ApiEndpoint | undefined;
2106
2122
  get effectiveApiUrlEntry(): ApiUrlEntry | null | undefined;
2107
2123
  onResourceQuickConnect(resourcePath: string): void;
2124
+ onCatalogResourceSelected(entry: DiscoveredResourceOption | null): void;
2108
2125
  onResourceQuickClear(): void;
2109
2126
  private updateDirtyState;
2110
2127
  ngAfterViewInit(): void;
@@ -2117,6 +2134,8 @@ declare class PraxisFilterFormWidgetConfigEditor implements SettingsValueProvide
2117
2134
  private applyBaselineDocumentToChildEditor;
2118
2135
  private applyDraftDocumentToChildEditor;
2119
2136
  private loadFilterSchemaFieldsIfNeeded;
2137
+ private extractCatalogFallbackFields;
2138
+ private applyLoadedFilterFieldMetadata;
2120
2139
  private buildDiscoveryOptions;
2121
2140
  private buildValue;
2122
2141
  private createDocumentFromInputs;
@@ -2238,6 +2257,10 @@ declare class LayoutEditorComponent implements OnInit {
2238
2257
  get layoutSections(): FormSection[];
2239
2258
  canApplyAll(): boolean;
2240
2259
  applyGapToAll(): void;
2260
+ canCalibrateFieldsFromSemantics(): boolean;
2261
+ calibrateAllFieldsFromSemantics(): void;
2262
+ canOrganizeSectionsFromSemantics(): boolean;
2263
+ organizeSectionsFromSemantics(): void;
2241
2264
  ngOnInit(): void;
2242
2265
  handleKeydown(event: KeyboardEvent): void;
2243
2266
  /**
@@ -2472,7 +2495,7 @@ interface PraxisDynamicFormWidgetEditorInputs {
2472
2495
  apiUrlEntry?: ApiUrlEntry | null;
2473
2496
  schemaSource?: 'resource' | 'filter';
2474
2497
  layoutPolicy?: DynamicFormLayoutPolicy | null;
2475
- configPersistenceStrategy?: 'local-first' | 'input-first';
2498
+ configPersistenceStrategy?: 'local-first' | 'input-first' | 'volatile';
2476
2499
  mode?: DynamicFormMode;
2477
2500
  emptyState?: PraxisDynamicFormEmptyState | null;
2478
2501
  presentationModeGlobal?: boolean | null;
@@ -2513,12 +2536,16 @@ declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvid
2513
2536
  private committedBaselineDocument?;
2514
2537
  private sourceDraft?;
2515
2538
  private resourcePathDraft?;
2539
+ selectedCatalogResource: DiscoveredResourceOption | null;
2516
2540
  private optionalInject;
2517
- get configurationSource(): 'local-first' | 'input-first';
2541
+ get configurationSource(): 'local-first' | 'input-first' | 'volatile';
2518
2542
  get effectiveResourcePath(): string;
2519
2543
  get effectiveEndpointKey(): ApiEndpoint | undefined;
2520
2544
  get effectiveApiUrlEntry(): ApiUrlEntry | null | undefined;
2521
2545
  get effectiveDiscoveryIntent(): 'crud' | 'filter';
2546
+ get hasReadOnlyModeWarning(): boolean;
2547
+ switchToReadOnlyViewMode(): void;
2548
+ onCatalogResourceSelected(resource: DiscoveredResourceOption | null): void;
2522
2549
  changeConfigurationSource(value: string): void;
2523
2550
  onResourceQuickConnect(resourcePath: string): void;
2524
2551
  onResourceQuickClear(): void;
@@ -2535,6 +2562,8 @@ declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvid
2535
2562
  private applyBaselineDocumentToChildEditor;
2536
2563
  private applyDraftDocumentToChildEditor;
2537
2564
  private loadResourceSchemaFieldsIfNeeded;
2565
+ private extractCatalogFallbackFields;
2566
+ private applyFieldMetadataHydration;
2538
2567
  private buildDiscoveryOptions;
2539
2568
  private buildValue;
2540
2569
  private createDocumentFromInputs;
@@ -2649,14 +2678,15 @@ declare function applyVisibilityRules(rules: FormLayoutRule[], data: any): Recor
2649
2678
  /**
2650
2679
  * Converts a RuleBuilderState produced by the visual builder into
2651
2680
  * an array of FormLayoutRule objects understood by the dynamic form.
2681
+ * Throws when a referenced condition graph cannot be serialized without losing semantics.
2652
2682
  */
2653
2683
  declare function ruleBuilderStateToFormLayoutRules(state: RuleBuilderState | null | undefined): FormLayoutRule[];
2654
2684
  /**
2655
2685
  * Converts an array of FormLayoutRule back into a RuleBuilderState
2656
2686
  * so that the visual builder can display the saved rules.
2657
2687
  *
2658
- * The conversion handles a limited subset of rules (visibility and
2659
- * required/validation rules with simple field conditions).
2688
+ * Every canonical effect reopens as a propertyRule, with all targets and both
2689
+ * branches intact. Conditions outside the visual vocabulary stay inline.
2660
2690
  */
2661
2691
  declare function formLayoutRulesToBuilderState(rules: FormLayoutRule[] | null | undefined): RuleBuilderState;
2662
2692
 
@@ -3230,7 +3260,50 @@ declare const PRAXIS_FILTER_FORM_AUTHORING_PROJECTION: {
3230
3260
  readonly operationIds: readonly ["field.label.set", "field.placeholder.set", "field.required.set", "field.readOnly.set", "field.disabled.set", "field.hidden.set", "field.controlType.set", "field.optionSource.set", "field.local.add", "field.local.remove", "layout.section.add", "layout.section.remove", "layout.row.add", "layout.column.add", "layout.field.move"];
3231
3261
  readonly roundTripRequirements: readonly ["strip-undefined", "stable-field-order", "preserve-local-field-source", "preserve-section-row-column-ids"];
3232
3262
  };
3233
- declare const PRAXIS_FILTER_FORM_AUTHORING_MANIFEST: _praxisui_core.ComponentAuthoringManifest;
3263
+ declare const PRAXIS_FILTER_FORM_AUTHORING_MANIFEST: {
3264
+ runtimeInputs: _praxisui_core.ManifestInput[];
3265
+ schemaVersion: string;
3266
+ componentId: string;
3267
+ ownerPackage: string;
3268
+ configSchemaId: string;
3269
+ manifestVersion: string;
3270
+ editableTargets: _praxisui_core.ManifestTarget[];
3271
+ operations: _praxisui_core.ManifestOperation[];
3272
+ validators: _praxisui_core.ManifestValidator[];
3273
+ roundTripRequirements?: string[];
3274
+ presentationAffordances?: _praxisui_core.ManifestPresentationAffordanceCatalog;
3275
+ examples: _praxisui_core.ManifestExample[];
3276
+ controlProfiles?: _praxisui_core.ManifestControlProfile[];
3277
+ };
3278
+
3279
+ /** Reconstruct raw native authorship. Normalized editor/runtime defaults are never the source. */
3280
+ declare function decodeDynamicFormPageInputs(value: unknown): {
3281
+ document: DynamicFormAuthoringDocument | null;
3282
+ diagnostics: EditorDiagnostic[];
3283
+ };
3284
+ /** Owner callback for Core admission; no component loading or second config authority. */
3285
+ declare function validateDynamicFormPageWidget(widget: WidgetInstance): readonly {
3286
+ code: string;
3287
+ path: string;
3288
+ }[];
3289
+ /** Inverse native projection. Explicit unrepresentable authoring blocks fail instead of being filtered. */
3290
+ declare function encodeDynamicFormPageInputs(value: unknown): {
3291
+ inputs: Record<string, unknown> | null;
3292
+ diagnostics: EditorDiagnostic[];
3293
+ };
3294
+ /** Persist only explicit deltas from the mounted native editor; bindings/context stay pinned to the seed. */
3295
+ declare function projectDynamicFormPageEditorChanges(authoredInputs: unknown, editorBaseline: unknown, editorValue: unknown): {
3296
+ inputs: Record<string, unknown> | null;
3297
+ diagnostics: EditorDiagnostic[];
3298
+ };
3299
+ /** Derive execution-only identity and disable independent preferences. Never persist this projection. */
3300
+ declare function materializeDynamicFormPageRuntimeInputs(value: unknown, pageId: string, widgetKey: string, options?: {
3301
+ preview?: boolean;
3302
+ }): {
3303
+ inputs: Record<string, unknown> | null;
3304
+ diagnostics: EditorDiagnostic[];
3305
+ };
3306
+ declare const DYNAMIC_FORM_GOVERNED_PAGE_PREVIEW_ADAPTER: GovernedPagePreviewWidgetAdapter;
3234
3307
 
3235
- export { ActionsEditorComponent, CORPORATE_PRESENTATION_FORMAT_GALLERY, CanvasStateService, CanvasToolbarComponent, ColumnEditorComponent, DomainRuleFormRulesService, DynamicFormLayoutService, DynamicFormSchemaCacheService, ERGADM00034_COMPACT_PRESENTATION_EXAMPLE, Ergadm00034CompactPresentationExampleComponent, FORM_AI_CAPABILITIES, FORM_COMPONENT_AI_CAPABILITIES, FieldConfiguratorComponent, FieldEditorComponent, FormConfigService, FormContextService, FormLayoutService, FormRulesService, JsonConfigEditorComponent, LayoutColorToken, LayoutEditorComponent, LayoutPrefsService, PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST, PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA, PRAXIS_FILTER_FORM_AUTHORING_MANIFEST, PRAXIS_FILTER_FORM_AUTHORING_PROJECTION, PRAXIS_FILTER_FORM_COMPONENT_METADATA, PraxisDynamicForm, PraxisDynamicFormConfigEditor, PraxisDynamicFormWidgetConfigEditor, PraxisFilterForm, PraxisFilterFormWidgetConfigEditor, PraxisFormActionsComponent, RowConfiguratorComponent, RowEditorComponent, SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER, SectionEditorComponent, TASK_PRESETS, applyVisibilityRules, buildCorporatePresentationFormatGalleryConfig, buildDynamicFormApplyPlan, buildDynamicFormRuleAuthoringContext, buildErgadm00034CompactPresentationConfig, createDynamicFormAuthoringDocument, formLayoutRulesToBuilderState, getFormAiCatalog, getFormCapabilities, getFormEnum, isRuleSatisfied, normalizeDateArrays, normalizeDynamicFormAuthoringDocument, parseLegacyOrDynamicFormDocument, providePraxisDynamicFormMetadata, providePraxisFilterFormMetadata, provideSettingsPanelDynamicForm, ruleBuilderStateToFormLayoutRules, serializeDynamicFormAuthoringDocument, stripLegacyFieldMetadata, toCanonicalDynamicFormConfig, validateDynamicFormAuthoringDocument, validateDynamicFormAuthoringInput };
3308
+ export { ActionsEditorComponent, CORPORATE_PRESENTATION_FORMAT_GALLERY, CanvasStateService, CanvasToolbarComponent, ColumnEditorComponent, DYNAMIC_FORM_GOVERNED_PAGE_PREVIEW_ADAPTER, DomainRuleFormRulesService, DynamicFormLayoutService, DynamicFormSchemaCacheService, ERGADM00034_COMPACT_PRESENTATION_EXAMPLE, Ergadm00034CompactPresentationExampleComponent, FORM_AI_CAPABILITIES, FORM_COMPONENT_AI_CAPABILITIES, FieldConfiguratorComponent, FieldEditorComponent, FormConfigService, FormContextService, FormLayoutService, FormRulesService, JsonConfigEditorComponent, LayoutColorToken, LayoutEditorComponent, LayoutPrefsService, PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST, PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA, PRAXIS_FILTER_FORM_AUTHORING_MANIFEST, PRAXIS_FILTER_FORM_AUTHORING_PROJECTION, PRAXIS_FILTER_FORM_COMPONENT_METADATA, PraxisDynamicForm, PraxisDynamicFormConfigEditor, PraxisDynamicFormWidgetConfigEditor, PraxisFilterForm, PraxisFilterFormWidgetConfigEditor, PraxisFormActionsComponent, RowConfiguratorComponent, RowEditorComponent, SETTINGS_PANEL_DYNAMIC_FORM_PROVIDER, SectionEditorComponent, TASK_PRESETS, applyVisibilityRules, buildCorporatePresentationFormatGalleryConfig, buildDynamicFormApplyPlan, buildDynamicFormRuleAuthoringContext, buildErgadm00034CompactPresentationConfig, createDynamicFormAuthoringDocument, decodeDynamicFormPageInputs, encodeDynamicFormPageInputs, formLayoutRulesToBuilderState, getFormAiCatalog, getFormCapabilities, getFormEnum, isRuleSatisfied, materializeDynamicFormPageRuntimeInputs, normalizeDateArrays, normalizeDynamicFormAuthoringDocument, parseLegacyOrDynamicFormDocument, projectDynamicFormPageEditorChanges, providePraxisDynamicFormMetadata, providePraxisFilterFormMetadata, provideSettingsPanelDynamicForm, ruleBuilderStateToFormLayoutRules, serializeDynamicFormAuthoringDocument, stripLegacyFieldMetadata, toCanonicalDynamicFormConfig, validateDynamicFormAuthoringDocument, validateDynamicFormAuthoringInput, validateDynamicFormPageWidget };
3236
3309
  export type { CanvasElement, CanvasElementType, CanvasPathPart, Capability$1 as Capability, CapabilityCatalog$1 as CapabilityCatalog, CapabilityCategory$1 as CapabilityCategory, CorporatePresentationExample, DomainRuleFormRulesRequestOptions, DomainRuleMaterializedFormLayoutRule, DynamicFieldRenderErrorEvent, DynamicFormAllowedRuleProperties, DynamicFormApplyPlan, DynamicFormAuthoringDocument, DynamicFormBindings, DynamicFormConfigPatchChangeEvent, DynamicFormContextSnapshot, DynamicFormGeneratedLayoutPreset, DynamicFormPresentationSnapshot, DynamicFormProjectionContext, DynamicFormResolvedRuntimeContract, DynamicFormRuleAuthoringContext, DynamicFormRuleAuthoringField, DynamicFormRuleAuthoringTarget, DynamicFormRuleAuthoringTargetDetails, DynamicFormRuleAuthoringTargets, DynamicFormRuleAuthoringVisualBlockNode, DynamicFormRuleTargetType, DynamicFormRuntimeContext, DynamicFormRuntimeValueSource, DynamicFormSchemaPrefsSnapshot, DynamicFormValidationContext, EditorDiagnostic, EditorDocument, Ergadm00034CompactPresentationExample, Ergadm00034LegacyFrequencyRow, FieldPath, FieldPathContainer, FieldPathWithIndex, Capability as FormComponentCapability, CapabilityCatalog as FormComponentCapabilityCatalog, CapabilityCategory as FormComponentCapabilityCategory, ValueKind as FormComponentValueKind, FormConfigLike, GenerateFormConfigFromMetadataOptions, IdPath, InsertLocalFieldOptions, InsertLocalFieldResult, JsonEditorEvent, JsonValidationResult, LayoutChange, LayoutResult, LocalFieldInsertionDiagnostic, LocalFieldInsertionDiagnosticCode, Operation, Path, PathWithIndex, PraxisDynamicFormDomainRulesOptions, PraxisDynamicFormEmptyState, PraxisDynamicFormWidgetEditorInputs, PraxisDynamicFormWidgetEditorValue, PraxisFilterFormWidgetEditorInputs, PraxisFilterFormWidgetEditorValue, PraxisFormActionEvent, RemovePolicy, RuleApplicationContext, RuleApplicationDiagnostic, RuleApplicationDiagnosticCode, RuleApplicationResult, RuleApplicationTargetIndex, RuleApplicationTargetType, ValidationReport, ValueKind$1 as ValueKind };