@praxisui/dynamic-form 9.0.66 → 9.0.68-rc.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "9.0.66",
3
+ "version": "9.0.68-rc.0",
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": "^9.0.66",
13
- "@praxisui/dynamic-fields": "^9.0.66",
14
- "@praxisui/metadata-editor": "^9.0.66",
15
- "@praxisui/rich-content": "^9.0.66",
16
- "@praxisui/settings-panel": "^9.0.66",
17
- "@praxisui/visual-builder": "^9.0.66",
18
- "@praxisui/core": "^9.0.66",
12
+ "@praxisui/ai": "^9.0.68-rc.0",
13
+ "@praxisui/dynamic-fields": "^9.0.68-rc.0",
14
+ "@praxisui/metadata-editor": "^9.0.68-rc.0",
15
+ "@praxisui/rich-content": "^9.0.68-rc.0",
16
+ "@praxisui/settings-panel": "^9.0.68-rc.0",
17
+ "@praxisui/visual-builder": "^9.0.68-rc.0",
18
+ "@praxisui/core": "^9.0.68-rc.0",
19
19
  "rxjs": "^7.8.0"
20
20
  },
21
21
  "dependencies": {
@@ -55,6 +55,13 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form-config
55
55
 
56
56
  ## Canonical authoring semantics
57
57
 
58
+ - Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
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`.
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
+ - `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
+
64
+
58
65
  - O editor visual e o editor JSON operam sobre `DynamicFormAuthoringDocument`.
59
66
  - O editor JSON aceita apenas o envelope canônico; payloads legados pertencem aos caminhos de compatibilidade do runtime.
60
67
  - `Apply` e `Save` emitem um snapshot canonico completo com semantica `replace-all`.
@@ -481,3 +488,24 @@ Correcao: e diff estrutural para UX do painel, nao auditoria de negocio.
481
488
  | local-file | projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
482
489
  | local-file | projects/praxis-settings-panel/src/lib/settings-panel.types.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
483
490
  | local-file | projects/praxis-core/src/lib/models/form/form-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
491
+
492
+
493
+ ### Presentation style projection and editor UX
494
+
495
+ - `contextSnapshot.presentation` is the canonical style snapshot. The optional runtime input `presentation: DynamicFormPresentationSnapshot | null` projects it into page widgets independently of schema-generated `config`. Explicit styles take precedence over stored style preferences; `null` restores defaults and blocks stale stored overrides; omission retains normal style resolution.
496
+ - Runtime editor Apply/Save emits `presentation` with `mode` and `presentationModeGlobal` in `configPatchChange.inputPatch`. Widget save/reopen preserves the same snapshot; omitting the document block clears the widget projection with `null`.
497
+ - Numeric font sizes and label widths are pixels. Capturing a runtime `rem` size converts it using the host root font size; opening and saving must not reinterpret `0.78rem` as `0.78px`.
498
+ - **Geral → Dados do formulário** separates **Criar / Editar / Visualizar** from **Automático / Campos / Apresentação**. Selecting presentation in Create/Edit keeps the operation unchanged and explains the inactive state with an explicit action to switch to View.
499
+ - **Estilo da apresentação** remains discoverable regardless of the current mode. It previews sample data and does not activate presentation by itself. Filter Form does not expose this tab because it has no presentation runtime.
500
+ - Applying or finishing widget editing updates the page draft. **Salvar página** persists the composition. Shortening sample text affects the preview only.
501
+
502
+
503
+ ### Orientação antes da seleção de um registro
504
+
505
+ O editor nativo, em **Geral → Sem registro selecionado**, materializa o contrato existente `PraxisDynamicFormEmptyState` em `bindings.emptyState`. O wrapper Page Builder projeta esse binding para `inputs.emptyState`; Apply, Save e JSON usam o mesmo documento. Não pertence a `FormConfig` nem substitui o modo dos dados.
506
+
507
+ `title` é obrigatório e não pode conter apenas espaços. `description` e `icon` são textos opcionais; a cópia de negócio permanece literal, sem ser interpretada automaticamente como chave i18n. O seletor usa o catálogo canônico de ícones. Restaurar o ícone padrão limpa a escolha explícita. Os controles do editor usam o catálogo i18n Form; a aparência runtime usa os tokens do empty state compartilhado.
508
+
509
+ As opções de aparência ficam em disclosure avançado: `tone` (`neutral`, `primary`, `secondary`), `variant` (`card`, `inline`, `panel`, `transparent`), `alignment` (`start`, `center`), `density` (`compact`, `comfortable`) e `iconContainer` (`none`, `circle`, `soft`). Ausência de opção herda o padrão do componente; JSON inválido produz diagnóstico.
510
+
511
+ A orientação aparece somente em `mode=view`, sem registro selecionado nem snapshot local. Criar e Editar preservam a configuração sem exibi-la. Desligar grava `null`, que impede reativação por uma preferência antiga; substituir um documento que omite o binding também limpa a orientação. Em `input-first`, a página governa o valor. Filter Form não expõe essa seção, pois não possui contexto de seleção equivalente.
@@ -268,8 +268,11 @@ Use quando precisar de:
268
268
  | `fieldMetadata[].formHidden` | Active | Campos ocultos não aparecem na palette. |
269
269
  | `actions/behavior/messages/hooks/api/...` | Declared-only | Não manipulados neste editor de layout. |
270
270
 
271
- Extensoes de runtime no editor (fora do contrato canonico):
272
- - `section.gapCustomized` (controle interno de aplicacao de gap).
271
+ O controle **Espaço após as seções** usa `sections[].gapBottom` (pixels após a
272
+ seção inteira). **Preencher espaços não definidos** preenche somente valores
273
+ ausentes/nulos, preservando valores explícitos, inclusive zero. Editar o número
274
+ não emite configuração; o comando explícito emite o rascunho. A marca antiga
275
+ `gapCustomized` não é mais gerada nem consultada para decidir elegibilidade.
273
276
 
274
277
  ### 4. Mapeamento de Comportamento
275
278
  - Palette de campos:
@@ -330,8 +333,9 @@ Correcao: ele cobre layout; demais blocos sao editados em componentes dedicados.
330
333
  5. Ignorar `select` e perder contexto de qual elemento esta em foco.
331
334
  Correcao: conecte `select` com painel lateral/inspector quando houver.
332
335
 
333
- 6. Persistir extensoes internas (`gapCustomized`) como se fossem contrato estavel.
334
- Correcao: trate como detalhe de editor; sanitize se necessario no pipeline.
336
+ 6. Confundir espaço após a seção com espaço entre colunas ou usar `gapCustomized`.
337
+ Correcao: `gapBottom` é o contrato canônico; sua ausência indica elegibilidade
338
+ para preenchimento. Espaçamento entre colunas pertence ao layout da linha.
335
339
 
336
340
  ### 8. Referencias Cruzadas
337
341
  - Orquestrador superior: `projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts`
@@ -68,6 +68,13 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
68
68
 
69
69
  ## Canonical authoring semantics
70
70
 
71
+ - Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
72
+ - `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`.
74
+ - 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
+ - `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
+
77
+
71
78
  - `DynamicFormAuthoringDocument` e o snapshot canonico completo de autoria de `praxis-dynamic-form`.
72
79
  - Quando aplicado por fluxos canonicos de editor, `config`, `bindings` e `contextSnapshot` possuem semantica `replace-all`.
73
80
  - Ausencia de `bindings.mode` limpa o binding persistido e restaura o modo default efetivo do host.
@@ -411,7 +418,7 @@ Limites de segurança:
411
418
  | `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
412
419
  | `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
413
420
  | `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
414
- | `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
421
+ | `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
415
422
  | `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
416
423
  | `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
417
424
  | `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
@@ -745,7 +752,7 @@ Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
745
752
  | `formCancel` | `void` | Acao cancelar. |
746
753
  | `formReset` | `void` | Acao reset. |
747
754
  | `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. |
748
- | `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. |
755
+ | `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. |
749
756
  | `formReady` | `FormReadyEvent` | Form pronto para interacao. |
750
757
  | `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. |
751
758
  | `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. |
@@ -971,7 +978,7 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
971
978
  | `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
972
979
  | `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
973
980
  | `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
974
- | `configPatchChange` | `{ inputPatch: { config: FormConfig } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
981
+ | `configPatchChange` | `{ inputPatch: { config?: FormConfig; resourcePath?: string \| null; mode?: DynamicFormMode; presentationModeGlobal?: boolean \| null; presentation?: DynamicFormPresentationSnapshot \| null } }` | Alteracoes autoradas de configuracao que devem ser persistidas pelo host. | Partial | Contrato aditivo para hosts genericos sem alterar o payload legado de `configChange`. |
975
982
  | `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
976
983
  | `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
977
984
  | `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
@@ -1110,3 +1117,24 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
1110
1117
  | local-file | projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
1111
1118
  | local-file | projects/praxis-core/src/lib/models/form/form-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
1112
1119
  | local-file | projects/praxis-core/src/lib/models/form/form-layout.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
1120
+
1121
+
1122
+ ### Presentation style projection and editor UX
1123
+
1124
+ - `contextSnapshot.presentation` is the canonical style snapshot. The optional runtime input `presentation: DynamicFormPresentationSnapshot | null` projects it into page widgets independently of schema-generated `config`. Explicit styles take precedence over stored style preferences; `null` restores defaults and blocks stale stored overrides; omission retains normal style resolution.
1125
+ - Runtime editor Apply/Save emits `presentation` with `mode` and `presentationModeGlobal` in `configPatchChange.inputPatch`. Widget save/reopen preserves the same snapshot; omitting the document block clears the widget projection with `null`.
1126
+ - Numeric font sizes and label widths are pixels. Capturing a runtime `rem` size converts it using the host root font size; opening and saving must not reinterpret `0.78rem` as `0.78px`.
1127
+ - **Geral → Dados do formulário** separates **Criar / Editar / Visualizar** from **Automático / Campos / Apresentação**. Selecting presentation in Create/Edit keeps the operation unchanged and explains the inactive state with an explicit action to switch to View.
1128
+ - **Estilo da apresentação** remains discoverable regardless of the current mode. It previews sample data and does not activate presentation by itself. Filter Form does not expose this tab because it has no presentation runtime.
1129
+ - Applying or finishing widget editing updates the page draft. **Salvar página** persists the composition. Shortening sample text affects the preview only.
1130
+
1131
+
1132
+ ### Orientação antes da seleção de um registro
1133
+
1134
+ O editor nativo, em **Geral → Sem registro selecionado**, materializa o contrato existente `PraxisDynamicFormEmptyState` em `bindings.emptyState`. O wrapper Page Builder projeta esse binding para `inputs.emptyState`; Apply, Save e JSON usam o mesmo documento. Não pertence a `FormConfig` nem substitui o modo dos dados.
1135
+
1136
+ `title` é obrigatório e não pode conter apenas espaços. `description` e `icon` são textos opcionais; a cópia de negócio permanece literal, sem ser interpretada automaticamente como chave i18n. O seletor usa o catálogo canônico de ícones. Restaurar o ícone padrão limpa a escolha explícita. Os controles do editor usam o catálogo i18n Form; a aparência runtime usa os tokens do empty state compartilhado.
1137
+
1138
+ As opções de aparência ficam em disclosure avançado: `tone` (`neutral`, `primary`, `secondary`), `variant` (`card`, `inline`, `panel`, `transparent`), `alignment` (`start`, `center`), `density` (`compact`, `comfortable`) e `iconContainer` (`none`, `circle`, `soft`). Ausência de opção herda o padrão do componente; JSON inválido produz diagnóstico.
1139
+
1140
+ A orientação aparece somente em `mode=view`, sem registro selecionado nem snapshot local. Criar e Editar preservam a configuração sem exibi-la. Desligar grava `null`, que impede reativação por uma preferência antiga; substituir um documento que omite o binding também limpa a orientação. Em `input-first`, a página governa o valor. Filter Form não expõe essa seção, pois não possui contexto de seleção equivalente.
@@ -1,13 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { OnChanges, OnDestroy, EventEmitter, SimpleChanges, OnInit, ChangeDetectorRef, NgZone, Provider, AfterViewInit, ElementRef } from '@angular/core';
3
3
  import { HttpClient } from '@angular/common/http';
4
- import { FormGroup, AbstractControl, FormBuilder, FormArray } from '@angular/forms';
4
+ import { FormGroup, AbstractControl, FormBuilder, FormArray, FormControl } from '@angular/forms';
5
5
  import { Router, ActivatedRoute } from '@angular/router';
6
6
  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, AiCapability, BackConfig, FormPresentationConfig, RichBlockHostCapabilities, EmptyStateTone, EmptyStateVariant, EmptyStateAlignment, EmptyStateDensity, EmptyStateIconContainer, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, FormHooksLayout, EndpointConfig, FormSubmitEvent, FormReadyEvent, FormValueChangeEvent, FormPayloadPreviewEvent, SyncResult, FormInitializationError, LoadingState, FormCustomActionEvent, FormActionConfirmationEvent, RichContentDocument, JsonLogicRecord, GenericCrudService, ConnectionStorage, DynamicFormService, ErrorMessageService, SchemaNormalizerService, ComponentMetadataRegistry, GlobalConfigService, ComponentKeyService, LoadingOrchestrator, ApiUrlConfig, PraxisLoadingRenderer, FormHooksRegistry, FormHookPreset, LoggerService, EnterpriseRuntimeContextService, FormSectionHeaderAction, FormSectionHeaderConfig, FormConfigState, JsonLogicExpression, FormHelpPresentationConfig, GlobalActionCatalogEntry, PraxisRuntimeConditionalEffectRule, PraxisRuntimeGlobalActionEffect, SurfaceOpenPayload, GlobalActionField, PraxisEffectPolicy, FieldDefinition, ComponentDocMeta, Breakpoint, DomainRuleRequestOptions, DomainRuleService, DomainRuleMaterialization, TableConfig, 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, AiCapability, BackConfig, FormPresentationConfig, EmptyStateTone, EmptyStateVariant, EmptyStateAlignment, EmptyStateDensity, EmptyStateIconContainer, RichBlockHostCapabilities, ApiEndpoint, ApiUrlEntry, DynamicFormLayoutPolicy, FormHooksLayout, EndpointConfig, FormSubmitEvent, FormReadyEvent, FormValueChangeEvent, FormPayloadPreviewEvent, SyncResult, FormInitializationError, LoadingState, FormCustomActionEvent, FormActionConfirmationEvent, RichContentDocument, JsonLogicRecord, GenericCrudService, ConnectionStorage, DynamicFormService, ErrorMessageService, SchemaNormalizerService, ComponentMetadataRegistry, GlobalConfigService, ComponentKeyService, LoadingOrchestrator, ApiUrlConfig, PraxisLoadingRenderer, FormHooksRegistry, FormHookPreset, LoggerService, EnterpriseRuntimeContextService, FormSectionHeaderAction, FormSectionHeaderConfig, FormConfigState, JsonLogicExpression, FormHelpPresentationConfig, GlobalActionCatalogEntry, PraxisRuntimeConditionalEffectRule, PraxisRuntimeGlobalActionEffect, SurfaceOpenPayload, GlobalActionField, PraxisEffectPolicy, FieldDefinition, ComponentDocMeta, Breakpoint, DomainRuleRequestOptions, DomainRuleService, DomainRuleMaterialization, TableConfig, SurfaceOpenActionEditorComponent, IconPickerService, GlobalActionRef, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, ComponentAuthoringManifest } from '@praxisui/core';
11
11
  import * as rxjs from 'rxjs';
12
12
  import { Observable, Subscription, BehaviorSubject } from 'rxjs';
13
13
  import { SettingsPanelService, SettingsValueProvider } from '@praxisui/settings-panel';
@@ -575,6 +575,10 @@ interface EditorDiagnostic {
575
575
  type DynamicFormMode = 'create' | 'edit' | 'view';
576
576
  interface DynamicFormBindings {
577
577
  mode?: DynamicFormMode;
578
+ /** Opt-in view placeholder; null explicitly disables it. */
579
+ emptyState?: PraxisDynamicFormEmptyState | null;
580
+ /** true: presentation in view; false: fields; null/absent: inherit layout policy. */
581
+ presentationModeGlobal?: boolean | null;
578
582
  }
579
583
  type DynamicFormPresentationSnapshot = FormPresentationConfig;
580
584
  interface DynamicFormSchemaPrefsSnapshot {
@@ -628,6 +632,8 @@ interface DynamicFormApplyPlan {
628
632
  runtime?: {
629
633
  rebindMode?: boolean;
630
634
  clearMode?: boolean;
635
+ clearPresentationMode?: boolean;
636
+ clearEmptyState?: boolean;
631
637
  rebuildForm?: boolean;
632
638
  refreshPresentation?: boolean;
633
639
  clearPresentation?: boolean;
@@ -650,7 +656,12 @@ interface DynamicFormApplyPlan {
650
656
 
651
657
  interface DynamicFormConfigPatchChangeEvent {
652
658
  inputPatch: {
653
- config: FormConfig;
659
+ config?: FormConfig;
660
+ resourcePath?: string | null;
661
+ mode?: DynamicFormMode;
662
+ presentationModeGlobal?: boolean | null;
663
+ presentation?: DynamicFormPresentationSnapshot | null;
664
+ emptyState?: PraxisDynamicFormEmptyState | null;
654
665
  };
655
666
  }
656
667
  /**
@@ -863,6 +874,8 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
863
874
  readonlyModeGlobal: boolean | null;
864
875
  disabledModeGlobal: boolean | null;
865
876
  presentationModeGlobal: boolean | null;
877
+ /** Projection of contextSnapshot.presentation; null clears authored style overrides. */
878
+ presentation?: DynamicFormPresentationSnapshot | null;
866
879
  visibleGlobal: boolean | null;
867
880
  fieldIconPolicy: 'all' | 'presentation-only' | 'none';
868
881
  /** Opt-in loader for shared domain rule materializations persisted outside FormConfig. */
@@ -954,9 +967,20 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
954
967
  private ruleApplicationDiagnosticsSignature;
955
968
  private pendingEntityId;
956
969
  private loadedEntityId;
970
+ private entitySelectionCleared;
957
971
  private hydratedEntityId;
958
972
  private loadedEntityData;
959
973
  protected entityHydrationPending: boolean;
974
+ protected entityReadFailed: boolean;
975
+ protected entityReadText(key: 'loading' | 'error' | 'retry' | 'region' | 'success'): string;
976
+ protected entityReadStatusText(): string;
977
+ protected retryEntityRead(focusRegion?: HTMLElement): void;
978
+ private readonly schemaTransportOptions;
979
+ private readonly schemaReadControllers;
980
+ private schemaInitializationCycle;
981
+ private cancelSchemaReads;
982
+ private assertSchemaInitializationCurrent;
983
+ private isSchemaTransportInterruption;
960
984
  private schemaCache;
961
985
  private lastSchemaMeta?;
962
986
  private readonly schemaMetaPersistenceQueues;
@@ -967,6 +991,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
967
991
  private schemaRootReactiveDeterminations;
968
992
  private schemaRootOperationId;
969
993
  private destroy$;
994
+ private readonly entityReadCancel$;
970
995
  private isDestroyed;
971
996
  private formValueChangesSubscription;
972
997
  private readonly submitFieldErrorSubscriptions;
@@ -1510,7 +1535,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
1510
1535
  private applyPresentationVars;
1511
1536
  private applyPresentationConfig;
1512
1537
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicForm, [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
1513
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "emptyState": { "alias": "emptyState"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "readUrl": { "alias": "readUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "submitIdempotencyKey": { "alias": "submitIdempotencyKey"; "required": false; }; "submitCorrelationId": { "alias": "submitCorrelationId"; "required": false; }; "submitResourceVersion": { "alias": "submitResourceVersion"; "required": false; }; "submitResourceVersionTargetResourceKey": { "alias": "submitResourceVersionTargetResourceKey"; "required": false; }; "submitResourceVersionTargetIdField": { "alias": "submitResourceVersionTargetIdField"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showAiAssistant": { "alias": "showAiAssistant"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "configPersistenceStrategy": { "alias": "configPersistenceStrategy"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "generatedLayoutPreset": { "alias": "generatedLayoutPreset"; "required": false; }; "layoutPolicy": { "alias": "layoutPolicy"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "fieldIconPolicy": { "alias": "fieldIconPolicy"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "configPatchChange": "configPatchChange"; "formReady": "formReady"; "valueChange": "valueChange"; "payloadPreviewChange": "payloadPreviewChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; }, never, never, true, never>;
1538
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicForm, "praxis-dynamic-form", never, { "resourcePath": { "alias": "resourcePath"; "required": false; }; "resourceId": { "alias": "resourceId"; "required": false; }; "initialValue": { "alias": "initialValue"; "required": false; }; "emptyState": { "alias": "emptyState"; "required": false; }; "editorialContext": { "alias": "editorialContext"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "config": { "alias": "config"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "schemaSource": { "alias": "schemaSource"; "required": false; }; "schemaUrl": { "alias": "schemaUrl"; "required": false; }; "readUrl": { "alias": "readUrl"; "required": false; }; "submitUrl": { "alias": "submitUrl"; "required": false; }; "submitMethod": { "alias": "submitMethod"; "required": false; }; "submitIdempotencyKey": { "alias": "submitIdempotencyKey"; "required": false; }; "submitCorrelationId": { "alias": "submitCorrelationId"; "required": false; }; "submitResourceVersion": { "alias": "submitResourceVersion"; "required": false; }; "submitResourceVersionTargetResourceKey": { "alias": "submitResourceVersionTargetResourceKey"; "required": false; }; "submitResourceVersionTargetIdField": { "alias": "submitResourceVersionTargetIdField"; "required": false; }; "responseSchemaUrl": { "alias": "responseSchemaUrl"; "required": false; }; "apiEndpointKey": { "alias": "apiEndpointKey"; "required": false; }; "apiUrlEntry": { "alias": "apiUrlEntry"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showAiAssistant": { "alias": "showAiAssistant"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "configPersistenceStrategy": { "alias": "configPersistenceStrategy"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "generatedLayoutPreset": { "alias": "generatedLayoutPreset"; "required": false; }; "layoutPolicy": { "alias": "layoutPolicy"; "required": false; }; "backConfig": { "alias": "backConfig"; "required": false; }; "hooks": { "alias": "hooks"; "required": false; }; "removeEmptyContainersOnSave": { "alias": "removeEmptyContainersOnSave"; "required": false; }; "reactiveValidation": { "alias": "reactiveValidation"; "required": false; }; "reactiveValidationDebounceMs": { "alias": "reactiveValidationDebounceMs"; "required": false; }; "notifyIfOutdated": { "alias": "notifyIfOutdated"; "required": false; }; "snoozeMs": { "alias": "snoozeMs"; "required": false; }; "autoOpenSettingsOnOutdated": { "alias": "autoOpenSettingsOnOutdated"; "required": false; }; "readonlyModeGlobal": { "alias": "readonlyModeGlobal"; "required": false; }; "disabledModeGlobal": { "alias": "disabledModeGlobal"; "required": false; }; "presentationModeGlobal": { "alias": "presentationModeGlobal"; "required": false; }; "presentation": { "alias": "presentation"; "required": false; }; "visibleGlobal": { "alias": "visibleGlobal"; "required": false; }; "fieldIconPolicy": { "alias": "fieldIconPolicy"; "required": false; }; "domainRules": { "alias": "domainRules"; "required": false; }; "customEndpoints": { "alias": "customEndpoints"; "required": false; }; }, { "formSubmit": "formSubmit"; "formCancel": "formCancel"; "formReset": "formReset"; "configChange": "configChange"; "configPatchChange": "configPatchChange"; "formReady": "formReady"; "valueChange": "valueChange"; "payloadPreviewChange": "payloadPreviewChange"; "syncCompleted": "syncCompleted"; "initializationError": "initializationError"; "loadingStateChange": "loadingStateChange"; "enableCustomizationChange": "enableCustomizationChange"; "customAction": "customAction"; "actionConfirmation": "actionConfirmation"; "schemaStatusChange": "schemaStatusChange"; "fieldRenderError": "fieldRenderError"; "ruleDiagnosticsChange": "ruleDiagnosticsChange"; "reactiveDeterminationExecuted": "reactiveDeterminationExecuted"; "reactiveDeterminationPendingChange": "reactiveDeterminationPendingChange"; }, never, never, true, never>;
1514
1539
  }
1515
1540
 
1516
1541
  declare class FormConfigService {
@@ -1581,6 +1606,10 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
1581
1606
  getCurrentConfig(): FormConfig | null;
1582
1607
  getCurrentDocument(): DynamicFormAuthoringDocument | null;
1583
1608
  hasChanges(): boolean;
1609
+ diagnosticMessage(diagnostic: {
1610
+ code: string;
1611
+ message: string;
1612
+ }): string;
1584
1613
  private validateJson;
1585
1614
  private updateValidationState;
1586
1615
  insertHooksTemplate(): void;
@@ -1681,6 +1710,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1681
1710
  };
1682
1711
  private initialConfig;
1683
1712
  private initialDocument;
1713
+ private appliedDocument?;
1684
1714
  private readonly openedWithCanonicalDocument;
1685
1715
  readonly runtimeContext?: DynamicFormRuntimeContext;
1686
1716
  readonly runtimeContract?: DynamicFormResolvedRuntimeContract;
@@ -1691,7 +1721,26 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1691
1721
  inputMode: 'create' | 'edit' | 'view';
1692
1722
  private includeBindingsBlock;
1693
1723
  private readonly editorMode;
1694
- isPresentationMode: boolean;
1724
+ get isPresentationMode(): boolean;
1725
+ supportsPresentationSettings: boolean;
1726
+ inputPresentationMode: boolean | null | undefined;
1727
+ inputEmptyState: PraxisDynamicFormEmptyState | null | undefined;
1728
+ private readonly emptyStateIconPicker;
1729
+ readonly emptyStateOptions: {
1730
+ readonly tone: readonly ["neutral", "primary", "secondary"];
1731
+ readonly variant: readonly ["card", "inline", "panel", "transparent"];
1732
+ readonly alignment: readonly ["start", "center"];
1733
+ readonly density: readonly ["compact", "comfortable"];
1734
+ readonly iconContainer: readonly ["none", "circle", "soft"];
1735
+ };
1736
+ setEmptyStateEnabled(enabled: boolean): void;
1737
+ onEmptyStateChange(): void;
1738
+ pickEmptyStateIcon(): Promise<void>;
1739
+ get displayMode(): 'automatic' | 'fields' | 'presentation';
1740
+ onDisplayModeChange(value: 'automatic' | 'fields' | 'presentation'): void;
1741
+ get displayModeHint(): string;
1742
+ useViewMode(): void;
1743
+ openPresentationStyle(): void;
1695
1744
  truncatePreview: boolean;
1696
1745
  previewItems: Array<{
1697
1746
  label: string;
@@ -1732,6 +1781,11 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1732
1781
  private globalActionValidationIssues;
1733
1782
  private readonly i18n;
1734
1783
  readonly globalActionCatalog: GlobalActionCatalogEntry[];
1784
+ private readonly invalidSurfaceDrafts;
1785
+ get hasInvalidSurfaceDraft(): boolean;
1786
+ onSurfaceDraftValidity(source: {
1787
+ discardInvalidDrafts(): void;
1788
+ }, valid: boolean): void;
1735
1789
  isDirty$: BehaviorSubject<boolean>;
1736
1790
  isValid$: BehaviorSubject<boolean>;
1737
1791
  isBusy$: BehaviorSubject<boolean>;
@@ -1746,6 +1800,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1746
1800
  constructor(storage: AsyncConfigStorage, configService: FormConfigService, settingsPanel: SettingsPanelService, cdr: ChangeDetectorRef, globalActionCatalogSource?: ReadonlyArray<GlobalActionCatalogEntry[]>, injectedData?: any);
1747
1801
  ngOnInit(): void;
1748
1802
  reset(): void;
1803
+ acceptAppliedValue(value: unknown): void;
1749
1804
  updateDirtyState(reason?: string): void;
1750
1805
  getSettingsValue(): any;
1751
1806
  onSave(): any;
@@ -1847,7 +1902,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1847
1902
  private toPresentationSnapshot;
1848
1903
  private toSchemaPrefsSnapshot;
1849
1904
  private toBackConfigSnapshot;
1850
- tx(key: string, fallback: string, params?: Record<string, string | number | boolean | null | undefined>): string;
1905
+ tx(key: string, fallback?: string, params?: Record<string, string | number | boolean | null | undefined>): string;
1851
1906
  private resolveI18n;
1852
1907
  private interpolateFallback;
1853
1908
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormConfigEditor, [null, null, null, null, { optional: true; }, { optional: true; }]>;
@@ -2016,6 +2071,12 @@ declare class LayoutEditorComponent implements OnInit {
2016
2071
  configChange: EventEmitter<FormConfig>;
2017
2072
  paletteCollapsed: boolean;
2018
2073
  protected readonly prefs: LayoutPrefsService;
2074
+ private readonly dialog;
2075
+ private readonly changeDetector;
2076
+ private readonly host;
2077
+ private readonly injector;
2078
+ private readonly sectionEditors;
2079
+ protected fieldMoveError: string;
2019
2080
  private readonly layoutService;
2020
2081
  private readonly settingsPanel;
2021
2082
  private readonly i18n;
@@ -2053,6 +2114,7 @@ declare class LayoutEditorComponent implements OnInit {
2053
2114
  /**
2054
2115
  * Fields that are not yet placed in any section/column of the layout.
2055
2116
  */
2117
+ get hasEligibleApiFields(): boolean;
2056
2118
  get availableFields(): FieldMetadata[];
2057
2119
  t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
2058
2120
  get columnDropListIds(): string[];
@@ -2064,6 +2126,7 @@ declare class LayoutEditorComponent implements OnInit {
2064
2126
  selectSection(sectionIndex: number): void;
2065
2127
  selectRow(sectionIndex: number, rowIndex: number): void;
2066
2128
  selectColumn(sectionIndex: number, rowIndex: number, columnIndex: number): void;
2129
+ openFieldMoveDialog(event: EditFieldEvent): void;
2067
2130
  dropField({ event }: FieldDropEvent): void;
2068
2131
  private getColumnLayoutItemByIndex;
2069
2132
  private getColumnTargetByIndex;
@@ -2089,6 +2152,7 @@ declare class LayoutEditorComponent implements OnInit {
2089
2152
  moveVisualBlock(event: MoveVisualBlockEvent): void;
2090
2153
  moveVisualBlockToColumn(event: MoveVisualBlockToColumnEvent): void;
2091
2154
  removeVisualBlock(event: VisualBlockEvent): void;
2155
+ private focusVisualBlockSelectionAfterRender;
2092
2156
  private emitNewConfig;
2093
2157
  onApplyStyleToAll(patch: Partial<FormSection>): void;
2094
2158
  trackBySection(index: number, s: FormSection & {
@@ -2183,10 +2247,10 @@ declare class RowConfiguratorComponent implements OnChanges {
2183
2247
  trackLayoutItem(_: number, item: FormLayoutItem): string;
2184
2248
  hasColumnContent(column: FormColumn): boolean;
2185
2249
  getVisualBlockLabel(item: FormLayoutItem): string;
2186
- private findRichContentLabel;
2187
- private findRichNodeLabel;
2250
+ formatGap(value: number | null | undefined): string;
2188
2251
  t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
2189
2252
  getFieldLabel(field: FieldMetadata): string;
2253
+ onVisualBlockKeydown(columnIndex: number, item: FormLayoutItem, event: Event, edit: boolean): void;
2190
2254
  selectVisualBlock(columnIndex: number, item: FormLayoutItem, event: Event): void;
2191
2255
  openVisualBlockEditor(columnIndex: number, item: FormLayoutItem, event: Event): void;
2192
2256
  moveVisualBlockItem(columnIndex: number, item: FormLayoutItem, direction: -1 | 1, event: Event): void;
@@ -2197,8 +2261,13 @@ declare class RowConfiguratorComponent implements OnChanges {
2197
2261
  selectRow(): void;
2198
2262
  openColumnConfig(index: number): void;
2199
2263
  selectColumn(index: number, event: MouseEvent): void;
2200
- selectField(fieldName: string, columnIndex: number, event: MouseEvent): void;
2264
+ selectField(fieldName: string, columnIndex: number, event: Event): void;
2265
+ selectFieldFromKeyboard(fieldName: string, columnIndex: number, event: Event): void;
2201
2266
  openFieldEditor(fieldName: string, columnIndex: number, event: Event): void;
2267
+ readonly columnPresets: {
2268
+ label: string;
2269
+ spans: number[];
2270
+ }[];
2202
2271
  openRowMenu(): void;
2203
2272
  onMenuClosed(): void;
2204
2273
  onDropEnter(index: number): void;
@@ -2218,7 +2287,7 @@ declare class RowConfiguratorComponent implements OnChanges {
2218
2287
  addFieldToColumn(index: number): void;
2219
2288
  getColumnId(index: number): string;
2220
2289
  private generateId;
2221
- applyPreset(spansMd: number[]): void;
2290
+ applyPreset(spans: number[]): void;
2222
2291
  getColumnClass(column: any): string;
2223
2292
  getSpanClasses(column: any): string[];
2224
2293
  getColumnClassList(column: any): string;
@@ -2233,6 +2302,9 @@ declare class RowConfiguratorComponent implements OnChanges {
2233
2302
  clearRowGap(): void;
2234
2303
  hasMultipleColumns(): boolean;
2235
2304
  getSpanTotal(bp?: Breakpoint): number;
2305
+ private participatesInRowGuidance;
2306
+ private getOccupiedRowUnits;
2307
+ getRowSpaceGuidance(): string | null;
2236
2308
  getOffsetFor(column: any, bp?: Breakpoint): number;
2237
2309
  setOffset(columnIndex: number, value: number): void;
2238
2310
  adjustOffset(columnIndex: number, delta: number): void;
@@ -2243,6 +2315,8 @@ declare class RowConfiguratorComponent implements OnChanges {
2243
2315
 
2244
2316
  declare class FieldConfiguratorComponent {
2245
2317
  private readonly registry;
2318
+ private readonly i18n;
2319
+ get hiddenLabel(): string;
2246
2320
  field: FieldMetadata;
2247
2321
  private readonly categoryByType;
2248
2322
  private resolveEditorialMeta;
@@ -2258,7 +2332,12 @@ declare class FieldConfiguratorComponent {
2258
2332
 
2259
2333
  interface PraxisDynamicFormWidgetEditorInputs {
2260
2334
  config?: FormConfig | null;
2335
+ layoutPolicy?: DynamicFormLayoutPolicy | null;
2336
+ configPersistenceStrategy?: 'local-first' | 'input-first';
2261
2337
  mode?: DynamicFormMode;
2338
+ emptyState?: PraxisDynamicFormEmptyState | null;
2339
+ presentationModeGlobal?: boolean | null;
2340
+ presentation?: DynamicFormPresentationSnapshot | null;
2262
2341
  formId?: string;
2263
2342
  componentInstanceId?: string;
2264
2343
  backConfig?: BackConfig;
@@ -2273,21 +2352,32 @@ interface PraxisDynamicFormWidgetEditorValue {
2273
2352
  declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvider, AfterViewInit, OnDestroy {
2274
2353
  inputs: PraxisDynamicFormWidgetEditorInputs | null;
2275
2354
  widgetKey?: string;
2355
+ appliedValues$?: Observable<unknown>;
2356
+ private appliedSource?;
2357
+ /** Runtime evidence supplied by the existing component editor context resolver. */
2358
+ context: Record<string, unknown>;
2276
2359
  formEditor?: PraxisDynamicFormConfigEditor;
2277
2360
  readonly isDirty$: BehaviorSubject<boolean>;
2278
2361
  readonly isValid$: BehaviorSubject<boolean>;
2279
2362
  readonly isBusy$: BehaviorSubject<boolean>;
2280
2363
  private readonly subscription;
2364
+ private initialEditorConfig?;
2365
+ private sourceDraft?;
2366
+ get configurationSource(): 'local-first' | 'input-first';
2367
+ changeConfigurationSource(value: string): void;
2368
+ private updateDirtyState;
2369
+ private readonly cdr;
2281
2370
  ngAfterViewInit(): void;
2282
2371
  ngOnDestroy(): void;
2283
2372
  getSettingsValue(): PraxisDynamicFormWidgetEditorValue;
2284
2373
  onSave(): PraxisDynamicFormWidgetEditorValue;
2374
+ acceptAppliedValue(value: unknown): void;
2285
2375
  reset(): void;
2286
2376
  private initializeChildEditor;
2287
2377
  private buildValue;
2288
2378
  private createDocumentFromInputs;
2289
2379
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormWidgetConfigEditor, never>;
2290
- static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicFormWidgetConfigEditor, "praxis-dynamic-form-widget-config-editor", never, { "inputs": { "alias": "inputs"; "required": false; }; "widgetKey": { "alias": "widgetKey"; "required": false; }; }, {}, never, never, true, never>;
2380
+ static ɵcmp: i0.ɵɵComponentDeclaration<PraxisDynamicFormWidgetConfigEditor, "praxis-dynamic-form-widget-config-editor", never, { "inputs": { "alias": "inputs"; "required": false; }; "widgetKey": { "alias": "widgetKey"; "required": false; }; "appliedValues$": { "alias": "appliedValues$"; "required": false; }; "context": { "alias": "context"; "required": false; }; }, {}, never, never, true, never>;
2291
2381
  }
2292
2382
 
2293
2383
  /** Metadata for PraxisDynamicForm component */
@@ -2505,6 +2595,9 @@ declare class SectionEditorComponent implements OnInit, AfterViewInit, OnDestroy
2505
2595
  value: string;
2506
2596
  label: string;
2507
2597
  }>;
2598
+ private readonly invalidSurfaceDrafts;
2599
+ get hasInvalidSurfaceDraft(): boolean;
2600
+ onSurfaceDraftValidity(source: SurfaceOpenActionEditorComponent, valid: boolean): void;
2508
2601
  isDirty$: BehaviorSubject<boolean>;
2509
2602
  isValid$: BehaviorSubject<boolean>;
2510
2603
  isBusy$: BehaviorSubject<boolean>;
@@ -2625,10 +2718,27 @@ declare class RowEditorComponent implements OnInit, OnDestroy, SettingsValueProv
2625
2718
  static ɵcmp: i0.ɵɵComponentDeclaration<RowEditorComponent, "praxis-row-editor", never, {}, {}, never, never, true, never>;
2626
2719
  }
2627
2720
 
2721
+ declare const COLUMN_LAYOUT_LIMITS: {
2722
+ readonly span: {
2723
+ readonly min: 1;
2724
+ readonly max: 12;
2725
+ };
2726
+ readonly offset: {
2727
+ readonly min: 0;
2728
+ readonly max: 11;
2729
+ };
2730
+ readonly order: {
2731
+ readonly min: -12;
2732
+ readonly max: 12;
2733
+ };
2734
+ };
2735
+ type ColumnLayoutNumber = keyof typeof COLUMN_LAYOUT_LIMITS;
2736
+
2628
2737
  declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueProvider {
2629
2738
  private fb;
2630
2739
  private data;
2631
2740
  form: FormGroup;
2741
+ readonly gridParts: number[];
2632
2742
  breakpoints: Breakpoint[];
2633
2743
  previewBreakpoint: Breakpoint;
2634
2744
  column: FormColumn;
@@ -2641,7 +2751,24 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
2641
2751
  private readonly i18n;
2642
2752
  constructor(fb: FormBuilder, data: {
2643
2753
  column: FormColumn;
2754
+ fieldMetadata?: FieldMetadata[];
2644
2755
  });
2756
+ readonly alignmentOptions: readonly [{
2757
+ readonly value: "start";
2758
+ readonly icon: "vertical_align_top";
2759
+ }, {
2760
+ readonly value: "center";
2761
+ readonly icon: "vertical_align_center";
2762
+ }, {
2763
+ readonly value: "end";
2764
+ readonly icon: "vertical_align_bottom";
2765
+ }, {
2766
+ readonly value: "stretch";
2767
+ readonly icon: "height";
2768
+ }];
2769
+ alignmentLabel(value: string): string;
2770
+ get fieldLabels(): string[];
2771
+ breakpointLabel(bp: Breakpoint): string;
2645
2772
  ngOnInit(): void;
2646
2773
  ngOnDestroy(): void;
2647
2774
  private applyChanges;
@@ -2656,6 +2783,8 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
2656
2783
  adjustOffset(delta: number): void;
2657
2784
  getOrder(bp: Breakpoint): number;
2658
2785
  setOrder(value: number | string): void;
2786
+ layoutControl(property: ColumnLayoutNumber): FormControl;
2787
+ get invalidLayoutLocations(): string;
2659
2788
  isHidden(bp: Breakpoint): boolean;
2660
2789
  toggleHidden(): void;
2661
2790
  copyToLarger(): void;