@praxisui/dynamic-form 9.0.67 → 9.0.68-rc.1

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.67",
3
+ "version": "9.0.68-rc.1",
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.67",
13
- "@praxisui/dynamic-fields": "^9.0.67",
14
- "@praxisui/metadata-editor": "^9.0.67",
15
- "@praxisui/rich-content": "^9.0.67",
16
- "@praxisui/settings-panel": "^9.0.67",
17
- "@praxisui/visual-builder": "^9.0.67",
18
- "@praxisui/core": "^9.0.67",
12
+ "@praxisui/ai": "^9.0.68-rc.1",
13
+ "@praxisui/dynamic-fields": "^9.0.68-rc.1",
14
+ "@praxisui/metadata-editor": "^9.0.68-rc.1",
15
+ "@praxisui/rich-content": "^9.0.68-rc.1",
16
+ "@praxisui/settings-panel": "^9.0.68-rc.1",
17
+ "@praxisui/visual-builder": "^9.0.68-rc.1",
18
+ "@praxisui/core": "^9.0.68-rc.1",
19
19
  "rxjs": "^7.8.0"
20
20
  },
21
21
  "dependencies": {
@@ -498,3 +498,14 @@ Correcao: e diff estrutural para UX do painel, nao auditoria de negocio.
498
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
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
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`
@@ -1127,3 +1127,14 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
1127
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
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
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,8 @@ 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;
578
580
  /** true: presentation in view; false: fields; null/absent: inherit layout policy. */
579
581
  presentationModeGlobal?: boolean | null;
580
582
  }
@@ -631,6 +633,7 @@ interface DynamicFormApplyPlan {
631
633
  rebindMode?: boolean;
632
634
  clearMode?: boolean;
633
635
  clearPresentationMode?: boolean;
636
+ clearEmptyState?: boolean;
634
637
  rebuildForm?: boolean;
635
638
  refreshPresentation?: boolean;
636
639
  clearPresentation?: boolean;
@@ -658,6 +661,7 @@ interface DynamicFormConfigPatchChangeEvent {
658
661
  mode?: DynamicFormMode;
659
662
  presentationModeGlobal?: boolean | null;
660
663
  presentation?: DynamicFormPresentationSnapshot | null;
664
+ emptyState?: PraxisDynamicFormEmptyState | null;
661
665
  };
662
666
  }
663
667
  /**
@@ -963,9 +967,20 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
963
967
  private ruleApplicationDiagnosticsSignature;
964
968
  private pendingEntityId;
965
969
  private loadedEntityId;
970
+ private entitySelectionCleared;
966
971
  private hydratedEntityId;
967
972
  private loadedEntityData;
968
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;
969
984
  private schemaCache;
970
985
  private lastSchemaMeta?;
971
986
  private readonly schemaMetaPersistenceQueues;
@@ -976,6 +991,7 @@ declare class PraxisDynamicForm implements OnInit, OnChanges, OnDestroy {
976
991
  private schemaRootReactiveDeterminations;
977
992
  private schemaRootOperationId;
978
993
  private destroy$;
994
+ private readonly entityReadCancel$;
979
995
  private isDestroyed;
980
996
  private formValueChangesSubscription;
981
997
  private readonly submitFieldErrorSubscriptions;
@@ -1590,6 +1606,10 @@ declare class JsonConfigEditorComponent implements OnInit, OnDestroy {
1590
1606
  getCurrentConfig(): FormConfig | null;
1591
1607
  getCurrentDocument(): DynamicFormAuthoringDocument | null;
1592
1608
  hasChanges(): boolean;
1609
+ diagnosticMessage(diagnostic: {
1610
+ code: string;
1611
+ message: string;
1612
+ }): string;
1593
1613
  private validateJson;
1594
1614
  private updateValidationState;
1595
1615
  insertHooksTemplate(): void;
@@ -1690,6 +1710,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1690
1710
  };
1691
1711
  private initialConfig;
1692
1712
  private initialDocument;
1713
+ private appliedDocument?;
1693
1714
  private readonly openedWithCanonicalDocument;
1694
1715
  readonly runtimeContext?: DynamicFormRuntimeContext;
1695
1716
  readonly runtimeContract?: DynamicFormResolvedRuntimeContract;
@@ -1703,6 +1724,18 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1703
1724
  get isPresentationMode(): boolean;
1704
1725
  supportsPresentationSettings: boolean;
1705
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>;
1706
1739
  get displayMode(): 'automatic' | 'fields' | 'presentation';
1707
1740
  onDisplayModeChange(value: 'automatic' | 'fields' | 'presentation'): void;
1708
1741
  get displayModeHint(): string;
@@ -1748,6 +1781,11 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1748
1781
  private globalActionValidationIssues;
1749
1782
  private readonly i18n;
1750
1783
  readonly globalActionCatalog: GlobalActionCatalogEntry[];
1784
+ private readonly invalidSurfaceDrafts;
1785
+ get hasInvalidSurfaceDraft(): boolean;
1786
+ onSurfaceDraftValidity(source: {
1787
+ discardInvalidDrafts(): void;
1788
+ }, valid: boolean): void;
1751
1789
  isDirty$: BehaviorSubject<boolean>;
1752
1790
  isValid$: BehaviorSubject<boolean>;
1753
1791
  isBusy$: BehaviorSubject<boolean>;
@@ -1762,6 +1800,7 @@ declare class PraxisDynamicFormConfigEditor implements SettingsValueProvider, On
1762
1800
  constructor(storage: AsyncConfigStorage, configService: FormConfigService, settingsPanel: SettingsPanelService, cdr: ChangeDetectorRef, globalActionCatalogSource?: ReadonlyArray<GlobalActionCatalogEntry[]>, injectedData?: any);
1763
1801
  ngOnInit(): void;
1764
1802
  reset(): void;
1803
+ acceptAppliedValue(value: unknown): void;
1765
1804
  updateDirtyState(reason?: string): void;
1766
1805
  getSettingsValue(): any;
1767
1806
  onSave(): any;
@@ -2032,6 +2071,12 @@ declare class LayoutEditorComponent implements OnInit {
2032
2071
  configChange: EventEmitter<FormConfig>;
2033
2072
  paletteCollapsed: boolean;
2034
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;
2035
2080
  private readonly layoutService;
2036
2081
  private readonly settingsPanel;
2037
2082
  private readonly i18n;
@@ -2069,6 +2114,7 @@ declare class LayoutEditorComponent implements OnInit {
2069
2114
  /**
2070
2115
  * Fields that are not yet placed in any section/column of the layout.
2071
2116
  */
2117
+ get hasEligibleApiFields(): boolean;
2072
2118
  get availableFields(): FieldMetadata[];
2073
2119
  t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
2074
2120
  get columnDropListIds(): string[];
@@ -2080,6 +2126,7 @@ declare class LayoutEditorComponent implements OnInit {
2080
2126
  selectSection(sectionIndex: number): void;
2081
2127
  selectRow(sectionIndex: number, rowIndex: number): void;
2082
2128
  selectColumn(sectionIndex: number, rowIndex: number, columnIndex: number): void;
2129
+ openFieldMoveDialog(event: EditFieldEvent): void;
2083
2130
  dropField({ event }: FieldDropEvent): void;
2084
2131
  private getColumnLayoutItemByIndex;
2085
2132
  private getColumnTargetByIndex;
@@ -2105,6 +2152,7 @@ declare class LayoutEditorComponent implements OnInit {
2105
2152
  moveVisualBlock(event: MoveVisualBlockEvent): void;
2106
2153
  moveVisualBlockToColumn(event: MoveVisualBlockToColumnEvent): void;
2107
2154
  removeVisualBlock(event: VisualBlockEvent): void;
2155
+ private focusVisualBlockSelectionAfterRender;
2108
2156
  private emitNewConfig;
2109
2157
  onApplyStyleToAll(patch: Partial<FormSection>): void;
2110
2158
  trackBySection(index: number, s: FormSection & {
@@ -2199,10 +2247,10 @@ declare class RowConfiguratorComponent implements OnChanges {
2199
2247
  trackLayoutItem(_: number, item: FormLayoutItem): string;
2200
2248
  hasColumnContent(column: FormColumn): boolean;
2201
2249
  getVisualBlockLabel(item: FormLayoutItem): string;
2202
- private findRichContentLabel;
2203
- private findRichNodeLabel;
2250
+ formatGap(value: number | null | undefined): string;
2204
2251
  t(key: string, params?: Record<string, string | number | boolean | null | undefined>): string;
2205
2252
  getFieldLabel(field: FieldMetadata): string;
2253
+ onVisualBlockKeydown(columnIndex: number, item: FormLayoutItem, event: Event, edit: boolean): void;
2206
2254
  selectVisualBlock(columnIndex: number, item: FormLayoutItem, event: Event): void;
2207
2255
  openVisualBlockEditor(columnIndex: number, item: FormLayoutItem, event: Event): void;
2208
2256
  moveVisualBlockItem(columnIndex: number, item: FormLayoutItem, direction: -1 | 1, event: Event): void;
@@ -2213,8 +2261,13 @@ declare class RowConfiguratorComponent implements OnChanges {
2213
2261
  selectRow(): void;
2214
2262
  openColumnConfig(index: number): void;
2215
2263
  selectColumn(index: number, event: MouseEvent): void;
2216
- 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;
2217
2266
  openFieldEditor(fieldName: string, columnIndex: number, event: Event): void;
2267
+ readonly columnPresets: {
2268
+ label: string;
2269
+ spans: number[];
2270
+ }[];
2218
2271
  openRowMenu(): void;
2219
2272
  onMenuClosed(): void;
2220
2273
  onDropEnter(index: number): void;
@@ -2234,7 +2287,7 @@ declare class RowConfiguratorComponent implements OnChanges {
2234
2287
  addFieldToColumn(index: number): void;
2235
2288
  getColumnId(index: number): string;
2236
2289
  private generateId;
2237
- applyPreset(spansMd: number[]): void;
2290
+ applyPreset(spans: number[]): void;
2238
2291
  getColumnClass(column: any): string;
2239
2292
  getSpanClasses(column: any): string[];
2240
2293
  getColumnClassList(column: any): string;
@@ -2249,6 +2302,9 @@ declare class RowConfiguratorComponent implements OnChanges {
2249
2302
  clearRowGap(): void;
2250
2303
  hasMultipleColumns(): boolean;
2251
2304
  getSpanTotal(bp?: Breakpoint): number;
2305
+ private participatesInRowGuidance;
2306
+ private getOccupiedRowUnits;
2307
+ getRowSpaceGuidance(): string | null;
2252
2308
  getOffsetFor(column: any, bp?: Breakpoint): number;
2253
2309
  setOffset(columnIndex: number, value: number): void;
2254
2310
  adjustOffset(columnIndex: number, delta: number): void;
@@ -2259,6 +2315,8 @@ declare class RowConfiguratorComponent implements OnChanges {
2259
2315
 
2260
2316
  declare class FieldConfiguratorComponent {
2261
2317
  private readonly registry;
2318
+ private readonly i18n;
2319
+ get hiddenLabel(): string;
2262
2320
  field: FieldMetadata;
2263
2321
  private readonly categoryByType;
2264
2322
  private resolveEditorialMeta;
@@ -2274,7 +2332,10 @@ declare class FieldConfiguratorComponent {
2274
2332
 
2275
2333
  interface PraxisDynamicFormWidgetEditorInputs {
2276
2334
  config?: FormConfig | null;
2335
+ layoutPolicy?: DynamicFormLayoutPolicy | null;
2336
+ configPersistenceStrategy?: 'local-first' | 'input-first';
2277
2337
  mode?: DynamicFormMode;
2338
+ emptyState?: PraxisDynamicFormEmptyState | null;
2278
2339
  presentationModeGlobal?: boolean | null;
2279
2340
  presentation?: DynamicFormPresentationSnapshot | null;
2280
2341
  formId?: string;
@@ -2291,23 +2352,32 @@ interface PraxisDynamicFormWidgetEditorValue {
2291
2352
  declare class PraxisDynamicFormWidgetConfigEditor implements SettingsValueProvider, AfterViewInit, OnDestroy {
2292
2353
  inputs: PraxisDynamicFormWidgetEditorInputs | null;
2293
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>;
2294
2359
  formEditor?: PraxisDynamicFormConfigEditor;
2295
2360
  readonly isDirty$: BehaviorSubject<boolean>;
2296
2361
  readonly isValid$: BehaviorSubject<boolean>;
2297
2362
  readonly isBusy$: BehaviorSubject<boolean>;
2298
2363
  private readonly subscription;
2299
2364
  private initialEditorConfig?;
2365
+ private sourceDraft?;
2366
+ get configurationSource(): 'local-first' | 'input-first';
2367
+ changeConfigurationSource(value: string): void;
2368
+ private updateDirtyState;
2300
2369
  private readonly cdr;
2301
2370
  ngAfterViewInit(): void;
2302
2371
  ngOnDestroy(): void;
2303
2372
  getSettingsValue(): PraxisDynamicFormWidgetEditorValue;
2304
2373
  onSave(): PraxisDynamicFormWidgetEditorValue;
2374
+ acceptAppliedValue(value: unknown): void;
2305
2375
  reset(): void;
2306
2376
  private initializeChildEditor;
2307
2377
  private buildValue;
2308
2378
  private createDocumentFromInputs;
2309
2379
  static ɵfac: i0.ɵɵFactoryDeclaration<PraxisDynamicFormWidgetConfigEditor, never>;
2310
- 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>;
2311
2381
  }
2312
2382
 
2313
2383
  /** Metadata for PraxisDynamicForm component */
@@ -2525,6 +2595,9 @@ declare class SectionEditorComponent implements OnInit, AfterViewInit, OnDestroy
2525
2595
  value: string;
2526
2596
  label: string;
2527
2597
  }>;
2598
+ private readonly invalidSurfaceDrafts;
2599
+ get hasInvalidSurfaceDraft(): boolean;
2600
+ onSurfaceDraftValidity(source: SurfaceOpenActionEditorComponent, valid: boolean): void;
2528
2601
  isDirty$: BehaviorSubject<boolean>;
2529
2602
  isValid$: BehaviorSubject<boolean>;
2530
2603
  isBusy$: BehaviorSubject<boolean>;
@@ -2645,10 +2718,27 @@ declare class RowEditorComponent implements OnInit, OnDestroy, SettingsValueProv
2645
2718
  static ɵcmp: i0.ɵɵComponentDeclaration<RowEditorComponent, "praxis-row-editor", never, {}, {}, never, never, true, never>;
2646
2719
  }
2647
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
+
2648
2737
  declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueProvider {
2649
2738
  private fb;
2650
2739
  private data;
2651
2740
  form: FormGroup;
2741
+ readonly gridParts: number[];
2652
2742
  breakpoints: Breakpoint[];
2653
2743
  previewBreakpoint: Breakpoint;
2654
2744
  column: FormColumn;
@@ -2661,7 +2751,24 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
2661
2751
  private readonly i18n;
2662
2752
  constructor(fb: FormBuilder, data: {
2663
2753
  column: FormColumn;
2754
+ fieldMetadata?: FieldMetadata[];
2664
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;
2665
2772
  ngOnInit(): void;
2666
2773
  ngOnDestroy(): void;
2667
2774
  private applyChanges;
@@ -2676,6 +2783,8 @@ declare class ColumnEditorComponent implements OnInit, OnDestroy, SettingsValueP
2676
2783
  adjustOffset(delta: number): void;
2677
2784
  getOrder(bp: Breakpoint): number;
2678
2785
  setOrder(value: number | string): void;
2786
+ layoutControl(property: ColumnLayoutNumber): FormControl;
2787
+ get invalidLayoutLocations(): string;
2679
2788
  isHidden(bp: Breakpoint): boolean;
2680
2789
  toggleHidden(): void;
2681
2790
  copyToLarger(): void;