@praxisui/page-builder 10.0.0-rc.4 → 10.0.0-rc.41

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.
@@ -2,7 +2,7 @@ import { MatDialogRef, MatDialog } from '@angular/material/dialog';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { EventEmitter, OnInit, WritableSignal, InjectionToken, Provider, OnChanges, OnDestroy, Type, SimpleChanges } from '@angular/core';
4
4
  import * as _praxisui_core from '@praxisui/core';
5
- import { ComponentDocMeta, WidgetShellConfig, ComponentMetadataRegistry, PraxisI18nService, SettingsEditorSection, EndpointRef, PraxisTextValue, WidgetShellPresetCategory, CompositionLink, WidgetShellAction, WidgetPageAuthoringCapabilities, PortContract, ComponentPortPathSegment, LinkIntent, WidgetPageDefinition, SurfaceOpenActionEditorComponent, TransformKind, TransformPipeline, SurfaceOpenPayload, WidgetPageDeviceKind, SettingsValueProvider as SettingsValueProvider$1, WidgetShellPresetDefinition, WidgetPageCanvasLayout, WidgetPageGroupingDefinition, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, PageIdentity, WidgetStateNode, WidgetDerivedStateNode, AiCapability, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, WidgetPageDeviceLayouts, WidgetPageSlotAssignments, WidgetPageStateInput, WidgetInstance, TransformOutputHint, TransformSemanticKind, ConfigAuthoringSource, DomainKnowledgeChangeSetRequest, DomainKnowledgeChangeSet, DomainKnowledgeChangeSetTimelineResponse, DomainKnowledgeChangeSetFilters, DomainKnowledgeValidationResponse, DomainKnowledgeStatusTransitionRequest, DomainRuleIntakeRequest, DomainRuleIntakeResponse, DomainRuleDefinitionRequest, DomainRuleDefinition, DomainRuleSimulationRequest, DomainRuleSimulationResponse, DomainRuleStatusTransitionRequest, DomainRulePublicationRequest, DomainRulePublicationResponse, DomainRuleMaterializationFilters, DomainRuleMaterialization, DomainRuleTimelineResponse, PraxisRuntimeComponentObservationEnvelope, ComponentContextPack, ComponentAuthoringManifest, DiagnosticRecord, NestedPortCatalogRegistry, CompositionValidatorService, ApiUrlEntry, DynamicWidgetPageComponent, ConfigDocument, WidgetEventEnvelope, ObservabilityAgenticTurnMetrics, SettingsPanelBridge, ObservabilityAgenticTurnMetricBucket, RichTimelineItem } from '@praxisui/core';
5
+ import { ComponentDocMeta, WidgetShellConfig, ComponentMetadataRegistry, PraxisI18nService, SettingsEditorSection, EndpointRef, PraxisTextValue, WidgetShellPresetCategory, CompositionLink, WidgetShellAction, WidgetPageAuthoringCapabilities, PortContract, ComponentPortPathSegment, LinkIntent, WidgetPageDefinition, SurfaceOpenActionEditorComponent, TransformKind, TransformPipeline, SurfaceOpenPayload, WidgetPageDeviceKind, SettingsValueProvider as SettingsValueProvider$1, WidgetShellPresetDefinition, WidgetPageCanvasLayout, DiscoveredResourceOption, FieldDefinition, WidgetPageGroupingDefinition, WidgetPageDataSourceDefinition, WidgetPageDataSourceKind, WidgetPageDataSourceMethod, WidgetPageDataSourceErrorPolicy, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, PageIdentity, WidgetStateNode, WidgetDerivedStateNode, AiCapability, AiCapabilityCategory, AiCapabilityCatalog, AiValueKind, WidgetPageDeviceLayouts, WidgetPageSlotAssignments, WidgetPageStateInput, WidgetInstance, TransformOutputHint, TransformSemanticKind, ConfigAuthoringSource, DomainKnowledgeChangeSetRequest, DomainKnowledgeChangeSet, DomainKnowledgeChangeSetTimelineResponse, DomainKnowledgeChangeSetFilters, DomainKnowledgeValidationResponse, DomainKnowledgeStatusTransitionRequest, DomainRuleIntakeRequest, DomainRuleIntakeResponse, DomainRuleDefinitionRequest, DomainRuleDefinition, DomainRuleSimulationRequest, DomainRuleSimulationResponse, DomainRuleStatusTransitionRequest, DomainRulePublicationRequest, DomainRulePublicationResponse, DomainRuleMaterializationFilters, DomainRuleMaterialization, DomainRuleTimelineResponse, PraxisRuntimeComponentObservationEnvelope, ComponentContextPack, ComponentAuthoringManifest, DiagnosticRecord, NestedPortCatalogRegistry, CompositionValidatorService, ApiUrlEntry, DynamicWidgetPageComponent, ConfigDocument, WidgetPagePersistenceState, WidgetEventEnvelope, ObservabilityAgenticTurnMetrics, SettingsPanelBridge, ObservabilityAgenticTurnMetricBucket, RichTimelineItem, PageAuthoringDocument, UiLayoutLayerClass, UiLayoutAssignmentSelector, PageDocumentDiagnostic, PageSourceReference, UiLayoutPageChildSource, UiLayoutTarget, PageCatalogEntry, NavigationGroupsAuthoringDocument, RuntimeNavigationMenuNode, PageCreationCommand, UiLayoutLifecycleHttpReceipt, PageCreationReceipt, PageCatalogReadOptions, PageCatalogResponse, UiLayoutLifecycleNotModifiedReceipt, PublishedPageReadResponse, UiLayoutDraftReceipt, UiLayoutDraftWorkspaceReceipt, UiLayoutReleaseReviewReceipt, UiLayoutReleaseHeadReceipt, UiLayoutRevisionCommand, UiLayoutRevisionCommandResult, UiLayoutAssignmentCommand, UiLayoutAssignmentCommandResult, UiLayoutFreezeReleaseCommand, UiLayoutFreezeReleaseCommandResult, UiLayoutReasonCommand, UiLayoutHeadWriteCondition, UiLayoutReleaseReferenceCommand, GovernedPagePreviewMaterialization, PageChildDocumentValidators, GovernedPagePreviewWidgetAdapters, UiLayoutLifecycleService, NavigationGroupAuthoringEntry, EffectiveUiLayoutService, PageNavigationBinding, PageNavigationBindingUpdateOptions } from '@praxisui/core';
6
6
  import * as rxjs from 'rxjs';
7
7
  import { BehaviorSubject, Observable } from 'rxjs';
8
8
  import { FormGroup, FormControl, FormArray, AbstractControl } from '@angular/forms';
@@ -66,23 +66,58 @@ declare class FloatingToolbarComponent {
66
66
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FloatingToolbarComponent, "praxis-floating-toolbar", never, { "visible": { "alias": "visible"; "required": false; }; "canUndo": { "alias": "canUndo"; "required": false; }; "canRedo": { "alias": "canRedo"; "required": false; }; "showSave": { "alias": "showSave"; "required": false; }; "showPreview": { "alias": "showPreview"; "required": false; }; "showAdd": { "alias": "showAdd"; "required": false; }; "showSettings": { "alias": "showSettings"; "required": false; }; "editingEnabled": { "alias": "editingEnabled"; "required": false; }; "previewActive": { "alias": "previewActive"; "required": false; }; "connectionMode": { "alias": "connectionMode"; "required": false; }; "modeLabel": { "alias": "modeLabel"; "required": false; }; "addLabel": { "alias": "addLabel"; "required": false; }; "saveLabel": { "alias": "saveLabel"; "required": false; }; "undoLabel": { "alias": "undoLabel"; "required": false; }; "redoLabel": { "alias": "redoLabel"; "required": false; }; "settingsLabel": { "alias": "settingsLabel"; "required": false; }; "previewLabel": { "alias": "previewLabel"; "required": false; }; "exitPreviewLabel": { "alias": "exitPreviewLabel"; "required": false; }; }, { "add": "add"; "undo": "undo"; "redo": "redo"; "settings": "settings"; "preview": "preview"; "save": "save"; }, never, ["[pdx-toolbar-extra]"], true, never>;
67
67
  }
68
68
 
69
+ /**
70
+ * Canonical payload emitted when a component or preset is selected from the Page Builder palette.
71
+ */
69
72
  interface ComponentPaletteSelection {
70
73
  componentId: string;
71
74
  presetId?: string;
72
75
  inputs?: Record<string, unknown>;
73
76
  shell?: WidgetShellConfig;
77
+ colSpan?: number;
78
+ }
79
+ /**
80
+ * Staged item inside the batch composition tray with live grid coordinate simulation.
81
+ */
82
+ interface QueuedPaletteItem {
83
+ queueId: string;
84
+ entryKey: string;
85
+ title: string;
86
+ icon: string;
87
+ selection: ComponentPaletteSelection;
88
+ effectiveCols: number;
89
+ effectiveRows: number;
90
+ rowPreview: number;
91
+ colStartPreview: number;
92
+ colEndPreview: number;
93
+ }
94
+ interface PaletteExistingCanvasItem {
95
+ row: number;
96
+ col: number;
97
+ colSpan: number;
98
+ rowSpan: number;
74
99
  }
100
+ /**
101
+ * Dialog input contract for `ComponentPaletteDialogComponent`.
102
+ * Supports single insertion, continuous (`keepOpen`) insertion, and atomic batch (`onInsertBatch`) composition.
103
+ */
75
104
  interface ComponentPaletteData {
76
105
  title?: string;
77
106
  allowedWidgetIds?: string[];
78
107
  allowedWidgetTags?: string[];
79
108
  allowedPresetIds?: string[];
80
109
  predicate?: (m: ComponentDocMeta) => boolean;
110
+ canvasColumns?: number;
111
+ existingCanvasItems?: PaletteExistingCanvasItem[];
112
+ onInsert?: (selection: ComponentPaletteSelection) => void;
113
+ onInsertBatch?: (selections: ComponentPaletteSelection[]) => void;
81
114
  }
115
+ type PaletteCategory = 'all' | 'widget' | 'preset' | 'field';
82
116
  interface ComponentPaletteEntry {
83
117
  key: string;
84
118
  componentId: string;
85
119
  presetId?: string;
120
+ category: Exclude<PaletteCategory, 'all'>;
86
121
  title: string;
87
122
  description: string;
88
123
  icon: string;
@@ -97,21 +132,67 @@ interface ComponentPaletteBadge {
97
132
  tone: 'ready' | 'info' | 'warning' | 'neutral';
98
133
  description: string;
99
134
  }
135
+ /**
136
+ * Studio Component Palette Dialog for the Praxis Page Builder.
137
+ *
138
+ * Provides three enterprise authoring modes:
139
+ * 1. **Single Insertion**: Immediate selection and dialog dismissal (`Enter` or card click).
140
+ * 2. **Continuous Multi-Insert (`keepOpen`)**: Inserts directly onto the canvas without closing the dialog.
141
+ * 3. **Batch Staging (`batchMode`)**: Stages multiple components with live grid coordinate preview (`L·C`)
142
+ * and commits them atomically via `onInsertBatch`.
143
+ *
144
+ * Automatically prioritizes governed page-level widgets and presets ahead of primitive form field controls
145
+ * and exposes quick category filter pills for large enterprise catalogs.
146
+ */
100
147
  declare class ComponentPaletteDialogComponent implements OnInit {
101
148
  private dialogRef;
102
149
  private registry;
103
150
  private i18n;
104
151
  data?: ComponentPaletteData | undefined;
105
152
  private readonly hostElement;
153
+ private queueSeq;
106
154
  query: _angular_core.WritableSignal<string>;
155
+ readonly selectedCategory: _angular_core.WritableSignal<PaletteCategory>;
156
+ readonly selectedColSpan: _angular_core.WritableSignal<number | undefined>;
157
+ readonly batchMode: _angular_core.WritableSignal<boolean>;
158
+ readonly keepOpen: _angular_core.WritableSignal<boolean>;
159
+ readonly insertedCount: _angular_core.WritableSignal<number>;
160
+ readonly queuedItems: _angular_core.WritableSignal<QueuedPaletteItem[]>;
161
+ readonly canvasColumns: _angular_core.Signal<number>;
162
+ readonly stagedRowCount: _angular_core.Signal<number>;
163
+ readonly spanOptions: _angular_core.Signal<readonly {
164
+ label: string;
165
+ value: number | undefined;
166
+ }[]>;
167
+ private readonly cycleSpans;
107
168
  private all;
169
+ private allowedCatalog;
170
+ readonly categoryOptions: _angular_core.Signal<readonly {
171
+ id: PaletteCategory;
172
+ label: string;
173
+ count: number;
174
+ }[]>;
175
+ readonly hasMultipleCategories: _angular_core.Signal<boolean>;
108
176
  filtered: _angular_core.Signal<ComponentPaletteEntry[]>;
109
177
  density: _angular_core.Signal<"roomy" | "dense" | "normal">;
110
178
  constructor(dialogRef: MatDialogRef<ComponentPaletteDialogComponent, ComponentPaletteSelection>, registry: ComponentMetadataRegistry, i18n: PraxisI18nService, data?: ComponentPaletteData | undefined);
111
179
  ngOnInit(): void;
180
+ toggleBatchMode(): void;
181
+ toggleKeepOpen(): void;
182
+ private buildPayload;
183
+ private resolveEffectiveCols;
184
+ private resolveEffectiveRows;
185
+ private recomputeQueueCoordinates;
186
+ enqueue(entry: ComponentPaletteEntry, event?: Event): void;
187
+ cycleQueuedItemColSpan(queueId: string): void;
188
+ removeQueuedItem(queueId: string): void;
189
+ clearQueue(): void;
190
+ commitBatch(): void;
112
191
  select(entry: ComponentPaletteEntry): void;
113
192
  handleSearchKeydown(event: KeyboardEvent): void;
114
- handleCardKeydown(event: KeyboardEvent, index: number): void;
193
+ clearSearch(): void;
194
+ resetFilters(): void;
195
+ handleCardKeydown(event: KeyboardEvent, index: number, entry?: ComponentPaletteEntry): void;
115
196
  trackById: (_: number, entry: ComponentPaletteEntry) => string;
116
197
  getPreview(entry: ComponentPaletteEntry): string;
117
198
  tx(key: string, fallback: string): string;
@@ -119,7 +200,9 @@ declare class ComponentPaletteDialogComponent implements OnInit {
119
200
  private paletteCards;
120
201
  private searchInput;
121
202
  private _adjustSizeEffect;
203
+ private applyStructuralConstraints;
122
204
  private applyFilters;
205
+ private isFieldMetadata;
123
206
  private buildEntries;
124
207
  private buildBadges;
125
208
  private buildBadgeSearchText;
@@ -214,6 +297,7 @@ declare class WidgetShellEditorComponent implements SettingsValueProvider {
214
297
  cardBorderStyle: FormControl<string>;
215
298
  cardRadius: FormControl<string>;
216
299
  cardShadow: FormControl<string>;
300
+ interactionHighlight: FormControl<"" | "standard" | "gradient">;
217
301
  cardFilter: FormControl<string>;
218
302
  cardFallbackBg: FormControl<string>;
219
303
  headerBg: FormControl<string>;
@@ -344,7 +428,7 @@ interface ConnectionEditorNode {
344
428
  states: ConnectionEditorPort[];
345
429
  }
346
430
  type ConnectionEditorDiagnosticSeverity = 'error' | 'warning';
347
- type ConnectionEditorDiagnosticCode = 'endpoint-widget-missing' | 'endpoint-unresolved' | 'endpoint-not-declared' | 'nested-path-terminal-missing' | 'nested-path-not-declared' | 'state-path-not-declared' | 'feedback-cycle-unguarded' | 'feedback-cycle-guarded';
431
+ type ConnectionEditorDiagnosticCode = 'endpoint-widget-missing' | 'endpoint-unresolved' | 'endpoint-not-declared' | 'nested-path-terminal-missing' | 'nested-path-not-declared' | 'state-path-not-declared' | 'feedback-cycle-unguarded' | 'feedback-cycle-guarded' | 'competing-query-owner';
348
432
  interface ConnectionEditorDiagnostic {
349
433
  code: ConnectionEditorDiagnosticCode;
350
434
  severity: ConnectionEditorDiagnosticSeverity;
@@ -1091,8 +1175,68 @@ declare class CanvasConstraintEditorModel {
1091
1175
  width: number;
1092
1176
  height: number;
1093
1177
  };
1178
+ private resolveFriendlyWidgetTitle;
1179
+ }
1180
+ /**
1181
+ * Canonical presentation model for identifying a widget instance across authoring surfaces
1182
+ * (State/Measure Binder, Quick Geometry, Arrangement Review, Canvas Limits, and Filter Ownership).
1183
+ */
1184
+ interface WidgetEditorPresentation {
1185
+ /** Unique technical key of the widget instance in the page draft. */
1186
+ key: string;
1187
+ /** Human-readable title resolved from authored shell, inputs, rich-content AST, or disambiguated type. */
1188
+ title: string;
1189
+ /** Contextual subtitle, structural summary, resource path, or component type label. */
1190
+ description: string;
1191
+ /** Material icon identifier representing the widget instance or its component family. */
1192
+ icon: string;
1193
+ /** Localized or friendly label of the widget's component type. */
1194
+ typeLabel: string;
1195
+ /** Canonical component identifier (e.g. `praxis-rich-content`, `praxis-table`). */
1196
+ componentId: string;
1094
1197
  }
1095
1198
 
1199
+ interface GuidedDataSourceQueryConfig {
1200
+ mode: 'group-by' | 'timeseries' | 'collection';
1201
+ groupByField?: string;
1202
+ metricField?: string;
1203
+ metricOp?: 'count' | 'sum' | 'avg' | 'min' | 'max';
1204
+ period?: 'day' | 'week' | 'month' | 'year';
1205
+ pageSize?: number;
1206
+ }
1207
+ interface GuidedDataSourceTransformConfig {
1208
+ kind: 'group-by-map' | 'timeseries-last' | 'path';
1209
+ path?: string;
1210
+ mappingsText?: string;
1211
+ totalField?: string;
1212
+ weightedAverageField?: string;
1213
+ weightedAverageDecimals?: number;
1214
+ ratioTargetField?: string;
1215
+ ratioNumeratorField?: string;
1216
+ ratioDenominatorField?: string;
1217
+ ratioScale?: number;
1218
+ ratioDecimals?: number;
1219
+ }
1220
+ interface GuidedDerivedMeasureConfig {
1221
+ targetPath: string;
1222
+ kind: 'ratio-percent' | 'weighted-average' | 'format-value' | 'template';
1223
+ numeratorPath?: string;
1224
+ denominatorPath?: string;
1225
+ sourcePath?: string;
1226
+ decimals?: number;
1227
+ format?: 'percent' | 'number' | 'currency';
1228
+ templateExpression?: string;
1229
+ }
1230
+ interface CollectionScreenComposerConfig {
1231
+ resourcePath: string;
1232
+ title: string;
1233
+ groupByField: string;
1234
+ includeHeader: boolean;
1235
+ includeIndicators: boolean;
1236
+ filterMode: 'table-integrated' | 'external-filter-bar';
1237
+ collectionKind: 'table' | 'list';
1238
+ detailSurface: 'none' | 'drawer' | 'modal';
1239
+ }
1096
1240
  type EditorTabId$1 = 'canvas' | 'grouping' | 'devices' | 'context' | 'state' | 'limits';
1097
1241
  type DeviceKey = 'desktop' | 'tablet' | 'mobile';
1098
1242
  type GroupingNodeGroup$1 = FormGroup<{
@@ -1105,6 +1249,21 @@ type GroupingNodeGroup$1 = FormGroup<{
1105
1249
  side: FormControl<string>;
1106
1250
  tabsJson: FormControl<string>;
1107
1251
  }>;
1252
+ type DataSourceNodeGroup$1 = FormGroup<{
1253
+ id: FormControl<string>;
1254
+ kind: FormControl<string>;
1255
+ resourcePath: FormControl<string>;
1256
+ endpointKey: FormControl<string>;
1257
+ method: FormControl<string>;
1258
+ targetStatePath: FormControl<string>;
1259
+ errorPolicy: FormControl<string>;
1260
+ refreshIntervalMs: FormControl<number | null>;
1261
+ autoFetch: FormControl<string>;
1262
+ description: FormControl<string>;
1263
+ queryJson: FormControl<string>;
1264
+ transformJson: FormControl<string>;
1265
+ fallbackJson: FormControl<string>;
1266
+ }>;
1108
1267
  type DeviceVariantForm = FormGroup<{
1109
1268
  columns: FormControl<number | null>;
1110
1269
  rowUnit: FormControl<string>;
@@ -1186,6 +1345,7 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1186
1345
  key: string;
1187
1346
  number: number;
1188
1347
  label: string;
1348
+ widgetKey?: string;
1189
1349
  col: number;
1190
1350
  row: number;
1191
1351
  colSpan: number;
@@ -1228,6 +1388,8 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1228
1388
  readonly shellPresetControl: FormControl<string>;
1229
1389
  readonly contextControl: FormControl<string>;
1230
1390
  readonly stateControl: FormControl<string>;
1391
+ readonly dataSourcesControl: FormControl<string>;
1392
+ readonly dataSourceNodes: FormArray<DataSourceNodeGroup$1>;
1231
1393
  readonly groupingNodes: FormArray<GroupingNodeGroup$1>;
1232
1394
  readonly deviceForms: Record<DeviceKey, DeviceVariantForm>;
1233
1395
  readonly isDirty$: BehaviorSubject<boolean>;
@@ -1242,22 +1404,63 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1242
1404
  readonly canvasLimits: CanvasConstraintEditorModel;
1243
1405
  readonly limitsTargetControl: FormControl<number>;
1244
1406
  readonly limitsError: WritableSignal<string | null>;
1407
+ readonly previousAdjustableHeights: WritableSignal<{
1408
+ key: string;
1409
+ title: string;
1410
+ scope: string;
1411
+ scopeLabel: string;
1412
+ heightPx: number;
1413
+ }[]>;
1245
1414
  readonly limitsErrorMatcher: {
1246
1415
  isErrorState: (control: FormControl | null) => boolean;
1247
1416
  };
1248
1417
  private readonly injectedData;
1249
1418
  readonly isHostedInSettingsPanel: boolean;
1419
+ private readonly destroyRef;
1250
1420
  private readonly i18n;
1421
+ private readonly componentRegistry;
1422
+ private readonly resourceDiscovery;
1423
+ private readonly dataSourceRuntime;
1424
+ private readonly stateRuntime;
1251
1425
  private pageInput;
1252
1426
  private snapshot;
1253
1427
  readonly stackedDevices: Set<DeviceKey>;
1254
1428
  readonly activeDevice: WritableSignal<DeviceKey>;
1255
1429
  private hydrating;
1430
+ private syncingDataSources;
1431
+ private guidedDataSourcesInvalid;
1256
1432
  private renderedCandidate;
1257
1433
  private renderedValidationFingerprint;
1434
+ private stagedWidgets;
1435
+ private stagedComposition;
1436
+ readonly composerResourcePathControl: FormControl<string>;
1437
+ readonly composerTitleControl: FormControl<string>;
1438
+ readonly composerGroupFieldControl: FormControl<string>;
1439
+ readonly composerIncludeHeaderControl: FormControl<boolean>;
1440
+ readonly composerIncludeIndicatorsControl: FormControl<boolean>;
1441
+ readonly composerFilterModeControl: FormControl<"table-integrated" | "external-filter-bar">;
1442
+ readonly composerCollectionKindControl: FormControl<"table" | "list">;
1443
+ readonly composerDetailSurfaceControl: FormControl<"none" | "modal" | "drawer">;
1444
+ readonly composerMessage: WritableSignal<string>;
1445
+ readonly composerSelectedResource: WritableSignal<DiscoveredResourceOption | null>;
1446
+ readonly composerSchemaFields: WritableSignal<FieldDefinition[]>;
1447
+ private composerSchemaPath;
1448
+ private composerSchemaSub?;
1449
+ private lastAutoComposerTitle;
1450
+ readonly binderTokenControl: FormControl<string>;
1451
+ readonly binderWidgetControl: FormControl<string>;
1452
+ readonly binderInputPathControl: FormControl<string>;
1453
+ readonly binderMessage: WritableSignal<string>;
1454
+ readonly derivedPathControl: FormControl<string>;
1455
+ readonly derivedKindControl: FormControl<"template" | "format-value" | "ratio-percent" | "weighted-average">;
1456
+ readonly derivedNumeratorControl: FormControl<string>;
1457
+ readonly derivedDenominatorControl: FormControl<string>;
1458
+ readonly derivedFormatControl: FormControl<"number" | "boolean" | "integer" | "percent" | "currency">;
1459
+ readonly derivedDecimalsControl: FormControl<number>;
1258
1460
  private readonly tabOrder;
1259
1461
  constructor();
1260
1462
  ngOnInit(): void;
1463
+ ngOnDestroy(): void;
1261
1464
  get selectedTabIndex(): number;
1262
1465
  get isConfigurationValid(): boolean;
1263
1466
  get hasPendingChanges(): boolean;
@@ -1265,6 +1468,17 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1265
1468
  get dirtyStateLabel(): string;
1266
1469
  get nonLimitError(): string | null;
1267
1470
  get limitsSummaryError(): string | null;
1471
+ get blockedGeometryWidgets(): Array<{
1472
+ targetIndex: number;
1473
+ key: string;
1474
+ title: string;
1475
+ scope: string;
1476
+ scopeLabel: string;
1477
+ heightPx: number | null;
1478
+ message: string;
1479
+ }>;
1480
+ navigateToBlockedLimit(targetIndex?: number): void;
1481
+ switchBlockedWidgetsToAutoHeight(): void;
1268
1482
  get selectedLayoutPresetLabel(): string;
1269
1483
  get selectedThemePresetLabel(): string;
1270
1484
  get selectedLayoutPresetEntry(): LayoutPresetEntry | null;
@@ -1285,6 +1499,112 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1285
1499
  private stackedCanvas;
1286
1500
  addGroupingNode(seed?: WidgetPageGroupingDefinition): void;
1287
1501
  removeGroupingNode(index: number): void;
1502
+ private readonly groupingSelectedKeysCache;
1503
+ groupingSelectedWidgetKeys(index: number): string[];
1504
+ groupingSelectedWidgetsLabel(index: number): string;
1505
+ groupingSelectedWidgetIcon(index: number): string;
1506
+ onGroupingWidgetSelectionChange(index: number, selectedKeys: readonly string[]): void;
1507
+ addDataSourceNode(seed?: Partial<WidgetPageDataSourceDefinition>): void;
1508
+ removeDataSourceNode(index: number): void;
1509
+ dataSourceLabel(index: number): string;
1510
+ applyGuidedDataSourceQuery(index: number, config: GuidedDataSourceQueryConfig): void;
1511
+ applyGuidedDataSourceTransform(index: number, config: GuidedDataSourceTransformConfig): void;
1512
+ getDataSourcePreview(index: number): {
1513
+ status: 'ok' | 'error';
1514
+ sourceKind: 'live' | 'sample';
1515
+ value?: unknown;
1516
+ formattedJson?: string;
1517
+ error?: string;
1518
+ tokens: string[];
1519
+ };
1520
+ resolveEndpointKey(rawKey?: string | null): any;
1521
+ addGuidedDerivedMeasure(config?: Partial<GuidedDerivedMeasureConfig>): boolean;
1522
+ getDerivedStatePreview(): {
1523
+ entries: Array<{
1524
+ key: string;
1525
+ value: unknown;
1526
+ formattedValue: string;
1527
+ token: string;
1528
+ }>;
1529
+ diagnostics: string[];
1530
+ };
1531
+ availableStateBindingTokens(): string[];
1532
+ bindablePageWidgets(): WidgetEditorPresentation[];
1533
+ selectedBinderWidget(): WidgetEditorPresentation | null;
1534
+ selectedBinderWidgetInputSuggestions(): string[];
1535
+ readonly binderDeclarativePipes: readonly ["| number", "| round:1", "| percent:1", "| currency:\"BRL\"", "| currencyCompact:\"BRL\"", "| dateTime", "| default:0", "| uppercase"];
1536
+ private static readonly ALLOWED_DECLARATIVE_PIPES;
1537
+ selectBinderInputPathSuggestion(path: string): void;
1538
+ selectBinderTokenSuggestion(token: string): void;
1539
+ appendBinderTokenPipe(pipeSegment: string): void;
1540
+ hasInvalidDeclarativePipe(rawExpression?: string | null): boolean;
1541
+ binderTokenPipeError(): string | null;
1542
+ binderTokenLivePreview(): string | null;
1543
+ invalidWidgetStateBindingPipes(): Array<{
1544
+ widgetKey: string;
1545
+ widgetTitle: string;
1546
+ inputPath: string;
1547
+ expression: string;
1548
+ }>;
1549
+ loadStateBindingIntoForm(binding: {
1550
+ widgetKey: string;
1551
+ inputPath: string;
1552
+ token?: string;
1553
+ expression?: string;
1554
+ }): void;
1555
+ widgetIconForKey(widgetKey: string): string;
1556
+ bindStateTokenToWidget(widgetKey?: string, inputPath?: string, stateToken?: string): boolean;
1557
+ currentWidgetStateBindings(): Array<{
1558
+ widgetKey: string;
1559
+ widgetTitle: string;
1560
+ inputPath: string;
1561
+ token: string;
1562
+ }>;
1563
+ resolveStateTokenPreview(rawToken: string): string | null;
1564
+ private resolveStateTokenMatch;
1565
+ unboundWidgetStatePlaceholders(): Array<{
1566
+ widgetKey: string;
1567
+ widgetTitle: string;
1568
+ placeholder: string;
1569
+ suggestedInputPath: string;
1570
+ }>;
1571
+ selectUnboundPlaceholder(item: {
1572
+ widgetKey: string;
1573
+ placeholder: string;
1574
+ suggestedInputPath: string;
1575
+ }): void;
1576
+ unbindStateTokenFromWidget(widgetKey: string, inputPath: string): boolean;
1577
+ autoBindWidgetStatePlaceholders(): number;
1578
+ onComposerResourceSelected(entry: DiscoveredResourceOption | null): void;
1579
+ private syncDefaultComposerGroupField;
1580
+ filteredComposerGroupFieldOptions(): FieldDefinition[];
1581
+ getComposerFieldTypeBadge(field: FieldDefinition | null | undefined): string;
1582
+ getComposerFieldDescription(field: FieldDefinition | null | undefined): string;
1583
+ private loadComposerSchemaFields;
1584
+ private resolveGroupByMappings;
1585
+ composeCollectionScreen(overrides?: Partial<CollectionScreenComposerConfig>): WidgetPageDefinition | null;
1586
+ quickCanvasWidgets(): Array<{
1587
+ key: string;
1588
+ label: string;
1589
+ icon: string;
1590
+ description: string;
1591
+ col: number;
1592
+ row: number;
1593
+ colSpan: number;
1594
+ rowSpan: number;
1595
+ }>;
1596
+ setWidgetCanvasSpan(widgetKey: string, colSpan: number, rowSpan?: number): void;
1597
+ duplicateFilterOwners(): Array<{
1598
+ tableKey: string;
1599
+ tableTitle: string;
1600
+ externalSourceKeys: string[];
1601
+ externalSourceLabels: string[];
1602
+ linkIds: string[];
1603
+ }>;
1604
+ consolidateFilterOwnership(tableKey: string, mode: 'keep-table-toolbar' | 'keep-external-link'): void;
1605
+ private resolveWidgetPresentation;
1606
+ private resolveWidgetTitle;
1607
+ private isFilterLinkTargetingWidget;
1288
1608
  layoutPresetSummary(preset: LayoutPresetEntry): string;
1289
1609
  slotsSummary(preset: LayoutPresetEntry): string;
1290
1610
  requiredSlotsSummary(preset: LayoutPresetEntry): string;
@@ -1294,6 +1614,7 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1294
1614
  tx(key: string, fallback: string): string;
1295
1615
  shellPresetLabel(preset: WidgetShellPresetDefinition): string;
1296
1616
  limitsTargetLabel(index: number): string;
1617
+ limitsTargetIcon(index: number): string;
1297
1618
  limitFieldError(control: FormControl<number | null>): string;
1298
1619
  private draftFingerprint;
1299
1620
  limitsGeometryLabel(): string;
@@ -1304,6 +1625,14 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1304
1625
  protected refreshRenderedValidation(): void;
1305
1626
  private createDeviceVariantForm;
1306
1627
  private createGroupingNodeGroup;
1628
+ private createDataSourceNodeGroup;
1629
+ private replaceDataSourceNodes;
1630
+ private buildDataSourcesFromNodes;
1631
+ syncStateValuesFromDataSources(): number;
1632
+ private ensureDataSourceTargetPathsInStateValues;
1633
+ private syncDataSourcesJsonFromNodes;
1634
+ private syncDataSourceNodesFromJson;
1635
+ private inferPageResourcePath;
1307
1636
  private hydrate;
1308
1637
  private replaceGroupingNodes;
1309
1638
  private buildCurrentPage;
@@ -1316,13 +1645,20 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1316
1645
  private invalidate;
1317
1646
  private refreshPanelState;
1318
1647
  get layoutPresetOptions(): WidgetPageDefinition['layoutPresetOptions'];
1648
+ private effectivePageInput;
1649
+ private readEffectiveWidgets;
1319
1650
  private currentPageInput;
1320
1651
  private parsePage;
1321
1652
  private parseJson;
1322
1653
  private parseRecordJson;
1654
+ private parseDataSourcesJson;
1655
+ private isValidDataSourceTransform;
1656
+ private validateDataSourceEntry;
1657
+ private isValidDataSourcesPayload;
1323
1658
  private parseGroupingTabs;
1324
1659
  private parseGroupingOverrides;
1325
1660
  private parseWidgetOverrides;
1661
+ private validateWidgetOverrides;
1326
1662
  private isGroupingTab;
1327
1663
  private isGroupingOverride;
1328
1664
  private isWidgetOverride;
@@ -1337,6 +1673,17 @@ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueP
1337
1673
  private applyShellPresetToContext;
1338
1674
  private lookupPresetLabel;
1339
1675
  private defaultCanvas;
1676
+ private parseKeyValuePairs;
1677
+ private buildSamplePayloadForDataSource;
1678
+ private collectStateTokensForValue;
1679
+ private assignNestedValue;
1680
+ private readNestedValue;
1681
+ private deleteNestedValue;
1682
+ private isPlaceholderBoundInContext;
1683
+ private collectTemplatePlaceholdersRecursive;
1684
+ private collectWidgetBindingsRecursive;
1685
+ private collectInvalidWidgetPipesRecursive;
1686
+ private humanizeResourceTitle;
1340
1687
  private clone;
1341
1688
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicPageConfigEditorComponent, never>;
1342
1689
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicPageConfigEditorComponent, "praxis-dynamic-page-config-editor", never, { "page": { "alias": "page"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "presets": { "alias": "presets"; "required": false; }; "pagePreset": { "alias": "pagePreset"; "required": false; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
@@ -1408,11 +1755,29 @@ type GroupingNodeGroup = FormGroup<{
1408
1755
  side: FormControl<string>;
1409
1756
  tabsJson: FormControl<string>;
1410
1757
  }>;
1758
+ type DataSourceNodeGroup = FormGroup<{
1759
+ id: FormControl<string>;
1760
+ kind: FormControl<string>;
1761
+ resourcePath: FormControl<string>;
1762
+ endpointKey: FormControl<string>;
1763
+ method: FormControl<string>;
1764
+ targetStatePath: FormControl<string>;
1765
+ errorPolicy: FormControl<string>;
1766
+ refreshIntervalMs: FormControl<number | null>;
1767
+ autoFetch: FormControl<string>;
1768
+ queryJson: FormControl<string>;
1769
+ transformJson: FormControl<string>;
1770
+ fallbackJson: FormControl<string>;
1771
+ description: FormControl<string>;
1772
+ }>;
1411
1773
  declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1412
1774
  protected readonly derivedOperators: readonly ["merge-objects", "pick", "omit"];
1413
1775
  protected readonly mergeStrategies: readonly ["replace", "merge", "append", "remove-keys"];
1414
1776
  protected readonly valueModes: readonly ["json", "string", "number", "boolean", "null"];
1415
1777
  protected readonly groupingKinds: readonly ["section", "tabs", "hero", "rail"];
1778
+ protected readonly dataSourceKinds: WidgetPageDataSourceKind[];
1779
+ protected readonly dataSourceMethods: WidgetPageDataSourceMethod[];
1780
+ protected readonly dataSourceErrorPolicies: WidgetPageDataSourceErrorPolicy[];
1416
1781
  protected readonly layoutPresetEntries: Array<(typeof BUILTIN_PAGE_LAYOUT_PRESETS)[string]>;
1417
1782
  protected readonly themePresetEntries: Array<(typeof BUILTIN_PAGE_THEME_PRESETS)[string]>;
1418
1783
  readonly page: _angular_core.InputSignal<string | PageDefinition | null>;
@@ -1432,9 +1797,11 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1432
1797
  readonly groupingControl: FormControl<string>;
1433
1798
  readonly deviceLayoutsControl: FormControl<string>;
1434
1799
  readonly stateValuesControl: FormControl<string>;
1800
+ readonly dataSourcesControl: FormControl<string>;
1435
1801
  readonly groupingNodes: FormArray<GroupingNodeGroup>;
1436
1802
  readonly schemaNodes: FormArray<SchemaNodeGroup>;
1437
1803
  readonly derivedNodes: FormArray<DerivedNodeGroup>;
1804
+ readonly dataSourceNodes: FormArray<DataSourceNodeGroup>;
1438
1805
  readonly deviceDesktopForm: FormGroup<{
1439
1806
  orientation: FormControl<string>;
1440
1807
  columns: FormControl<number | null>;
@@ -1471,6 +1838,8 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1471
1838
  private lastGrouping;
1472
1839
  private lastDeviceLayouts;
1473
1840
  private lastStateValues;
1841
+ private lastDataSources;
1842
+ private dataSourcesEditSource;
1474
1843
  private readonly dirtySubject;
1475
1844
  private readonly validSubject;
1476
1845
  private readonly busySubject;
@@ -1492,6 +1861,7 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1492
1861
  protected get selectedShellPresetLabel(): string;
1493
1862
  protected get contextExample(): string;
1494
1863
  protected get stateValuesExample(): string;
1864
+ protected get dataSourcesExample(): string;
1495
1865
  protected get layoutPresetHint(): string;
1496
1866
  protected get themePresetHint(): string;
1497
1867
  protected get shellPresetHint(): string;
@@ -1515,6 +1885,8 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1515
1885
  config?: WidgetDerivedStateNode;
1516
1886
  }): void;
1517
1887
  removeDerivedNode(index: number): void;
1888
+ addDataSourceNode(seed?: WidgetPageDataSourceDefinition): void;
1889
+ removeDataSourceNode(index: number): void;
1518
1890
  addGroupingNode(seed?: WidgetPageGroupingDefinition): void;
1519
1891
  removeGroupingNode(index: number): void;
1520
1892
  setActiveTab(tab: EditorTabId): void;
@@ -1526,11 +1898,24 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
1526
1898
  private stringifyGroupingWidgetKeys;
1527
1899
  private buildGrouping;
1528
1900
  private hydrateDeviceLayoutControls;
1901
+ private deviceOverridesError;
1529
1902
  private buildDeviceLayouts;
1530
1903
  private createDeviceLayoutForm;
1531
1904
  private patchDeviceLayoutForm;
1532
1905
  private buildDeviceLayoutVariant;
1533
1906
  private hydrateStateEditor;
1907
+ private hydrateDataSourcesEditor;
1908
+ private normalizeDataSourcesArray;
1909
+ private replaceDataSourceNodes;
1910
+ private createDataSourceNodeGroup;
1911
+ private syncDataSourceNodesFromControl;
1912
+ private syncDataSourcesControlFromNodes;
1913
+ private isPlainRecord;
1914
+ private isValidDataSourceTransform;
1915
+ private validateDataSourceEntry;
1916
+ private isValidDataSourcesPayload;
1917
+ private buildDataSourcesFromNodes;
1918
+ private buildDataSources;
1534
1919
  private replaceSchemaNodes;
1535
1920
  private replaceDerivedNodes;
1536
1921
  private createSchemaNodeGroup;
@@ -2153,7 +2538,7 @@ type BuilderCanvasLayout = {
2153
2538
  rowUnit?: string;
2154
2539
  gap?: string;
2155
2540
  autoRows?: 'fixed' | 'content';
2156
- collisionPolicy?: 'block' | 'swap';
2541
+ collisionPolicy?: 'block' | 'swap' | 'push-down';
2157
2542
  items: Record<string, BuilderCanvasItem>;
2158
2543
  };
2159
2544
  type BuilderPageDefinition = Omit<WidgetPageDefinition, 'widgets'> & {
@@ -2267,20 +2652,6 @@ interface AgenticAuthoringQuickReply extends PraxisAssistantShellQuickReply {
2267
2652
  kind: string;
2268
2653
  }
2269
2654
  type AgenticAuthoringPanelLayout = PraxisAssistantShellLayout;
2270
- type PageBuilderPremiumReadinessSeverity = 'info' | 'warning' | 'error';
2271
- type PageBuilderPremiumReadinessActionKind = 'open-page-settings' | 'open-connections' | 'open-widget-config' | 'focus-widget';
2272
- interface PageBuilderPremiumReadinessAction {
2273
- kind: PageBuilderPremiumReadinessActionKind;
2274
- label: string;
2275
- widgetKey?: string;
2276
- }
2277
- interface PageBuilderPremiumReadinessIssue {
2278
- id: string;
2279
- severity: PageBuilderPremiumReadinessSeverity;
2280
- title: string;
2281
- description: string;
2282
- action?: PageBuilderPremiumReadinessAction;
2283
- }
2284
2655
  type SharedRuleCockpitAction = 'definition' | 'simulation' | 'approve' | 'activate' | 'publication' | 'materializations' | 'timeline' | 'enforcement';
2285
2656
  type ProjectKnowledgeCockpitAction = 'change-set' | 'validate' | 'approve' | 'reject' | 'apply' | 'readback';
2286
2657
  interface SharedRuleEnforcementSummary {
@@ -2333,14 +2704,18 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2333
2704
  private readonly observabilityDashboard;
2334
2705
  private readonly runtimeObservationRegistry;
2335
2706
  private readonly agenticAuthoringOptions;
2707
+ private readonly customizationMode;
2336
2708
  runtime?: DynamicWidgetPageComponent;
2337
2709
  page?: WidgetPageDefinition | string;
2338
2710
  context?: Record<string, unknown> | null;
2339
2711
  strictValidation: boolean;
2712
+ /** Opt in to Core persistence; hosts managing their own documents leave this disabled. */
2340
2713
  autoPersist: boolean;
2341
2714
  enableCustomization: boolean;
2342
2715
  authoringCapabilities?: PageBuilderAuthoringCapabilities | null;
2343
2716
  showSettingsButton: boolean;
2717
+ showGovernanceToolbar: boolean;
2718
+ governanceToolbarTitle?: string;
2344
2719
  pageIdentity?: PageIdentity;
2345
2720
  componentInstanceId?: string;
2346
2721
  pageEditorComponent: Type<any> | undefined;
@@ -2364,6 +2739,8 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2364
2739
  canDeleteSavedPage: boolean;
2365
2740
  pageLifecycleBusy: boolean;
2366
2741
  pageLifecycleResetRevision: number | string | null;
2742
+ readonly persistenceChange: _angular_core.OutputEmitterRef<WidgetPagePersistenceState>;
2743
+ private runtimePersistenceStatus;
2367
2744
  pageChange: EventEmitter<WidgetPageDefinition>;
2368
2745
  /** Emits only explicit visual authoring operations, never runtime state changes. */
2369
2746
  readonly pageAuthoringChange: _angular_core.OutputEmitterRef<WidgetPageDefinition>;
@@ -2373,10 +2750,16 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2373
2750
  agenticAuthoringSharedRuleHandoff: EventEmitter<PageBuilderAgenticAuthoringSharedRuleHandoff>;
2374
2751
  pageRestart: EventEmitter<void>;
2375
2752
  savedPageDeleteRequested: EventEmitter<void>;
2753
+ customizationChange: EventEmitter<boolean>;
2376
2754
  readonly currentPage: _angular_core.WritableSignal<WidgetPageDefinition>;
2755
+ readonly isCustomizing: _angular_core.WritableSignal<boolean>;
2756
+ readonly governancePersistence: _angular_core.WritableSignal<WidgetPagePersistenceState>;
2757
+ readonly isLayoutCustomized: _angular_core.Signal<boolean>;
2758
+ readonly isGovernanceBusy: _angular_core.Signal<boolean>;
2759
+ readonly governancePersistenceLabel: _angular_core.Signal<string>;
2760
+ readonly governanceLastSavedAt: _angular_core.Signal<string | null>;
2377
2761
  readonly hasPageWidgets: _angular_core.Signal<boolean>;
2378
2762
  readonly hasRecommendedConnectionSuggestion: _angular_core.Signal<boolean>;
2379
- readonly premiumReadinessIssues: _angular_core.Signal<PageBuilderPremiumReadinessIssue[]>;
2380
2763
  readonly connectionsViewerOpen: _angular_core.WritableSignal<boolean>;
2381
2764
  readonly agenticAuthoringOpen: _angular_core.WritableSignal<boolean>;
2382
2765
  readonly agenticAuthoringPrompt: _angular_core.WritableSignal<string>;
@@ -2439,19 +2822,28 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2439
2822
  constructor(dialog: MatDialog, settingsPanel: SettingsPanelBridge | null);
2440
2823
  ngOnChanges(changes: SimpleChanges): void;
2441
2824
  ngOnDestroy(): void;
2825
+ toggleGovernanceCustomization(): void;
2826
+ isCustomizationEnabled(): boolean;
2442
2827
  showSettings(): boolean;
2443
2828
  canInsertWidgets(): boolean;
2444
2829
  canOpenPageSettings(): boolean;
2445
2830
  canEditConnections(): boolean;
2446
2831
  canPreviewPage(): boolean;
2447
2832
  canUseAgenticAuthoring(): boolean;
2448
- canRunPremiumReadinessAction(action: PageBuilderPremiumReadinessAction): boolean;
2449
2833
  canUsePageLifecycle(): boolean;
2450
2834
  private isAuthoringCapabilityEnabled;
2451
2835
  isPreviewMode(): boolean;
2452
2836
  runtimePage(): WidgetPageDefinition;
2453
2837
  runtimeAuthoringCapabilities(): PageBuilderAuthoringCapabilities;
2454
2838
  builderModeLabel(): string;
2839
+ /** Governed documents and agentic previews retain their explicit host/apply lifecycle. */
2840
+ runtimeAutoPersist(): boolean;
2841
+ /** Explicitly discard the local draft and reload the current identity's saved page. */
2842
+ reloadPersistedPage(defaultPage?: WidgetPageDefinition): void;
2843
+ /** Clear the current identity's saved document after storage acknowledgement. */
2844
+ resetPersistedPage(defaultPage?: WidgetPageDefinition): void;
2845
+ onRuntimePersistenceChange(state: WidgetPagePersistenceState): void;
2846
+ private syncShellPageGovernance;
2455
2847
  onRuntimePageChange(next: WidgetPageDefinition): void;
2456
2848
  onRuntimePageAuthoringChange(next: WidgetPageDefinition): void;
2457
2849
  onRuntimeWidgetEvent(event: WidgetEventEnvelope): void;
@@ -2474,17 +2866,14 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2474
2866
  connectionsToggleLabel(): string;
2475
2867
  onAddComponent(): void;
2476
2868
  addWidget(selection: string | ComponentPaletteSelection): void;
2869
+ addWidgets(selections: ReadonlyArray<string | ComponentPaletteSelection>): string[];
2870
+ private appendWidgetToDraft;
2477
2871
  private layoutHintsFor;
2478
2872
  openPageSettings(): void;
2873
+ /** Retries the current persisted draft, including an intentionally empty page. */
2874
+ retryPersistedPage(): void;
2479
2875
  saveCurrentPage(): void;
2480
2876
  canSaveCurrentPage(): boolean;
2481
- private evaluatePremiumReadiness;
2482
- runPremiumReadinessAction(issue: PageBuilderPremiumReadinessIssue): void;
2483
- private isPremiumReadinessCandidate;
2484
- private hasDisconnectedOperationalWidgets;
2485
- private latePrimaryChartKey;
2486
- private usesLocalAnalyticData;
2487
- private isAnalyticWidget;
2488
2877
  applyConfigFromAdapter(config: PageBuilderConfig): void;
2489
2878
  private createAdapterHost;
2490
2879
  toggleAgenticAuthoring(): void;
@@ -2718,7 +3107,7 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
2718
3107
  authoringSourceDiagnosticText(diagnostic: UiCompositionAuthoringSourceDiagnostic): string;
2719
3108
  tx(key: string, fallback: string): string;
2720
3109
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicPageBuilderComponent, [null, { optional: true; }]>;
2721
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicPageBuilderComponent, "praxis-dynamic-page-builder", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoPersist": { "alias": "autoPersist"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapabilities": { "alias": "authoringCapabilities"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; "componentPaletteAllowedWidgetIds": { "alias": "componentPaletteAllowedWidgetIds"; "required": false; }; "componentPaletteAllowedWidgetTags": { "alias": "componentPaletteAllowedWidgetTags"; "required": false; }; "componentPaletteAllowedPresetIds": { "alias": "componentPaletteAllowedPresetIds"; "required": false; }; "enableAgenticAuthoring": { "alias": "enableAgenticAuthoring"; "required": false; }; "agenticAuthoringProvider": { "alias": "agenticAuthoringProvider"; "required": false; }; "agenticAuthoringModel": { "alias": "agenticAuthoringModel"; "required": false; }; "agenticAuthoringApiKey": { "alias": "agenticAuthoringApiKey"; "required": false; }; "agenticAuthoringComponentId": { "alias": "agenticAuthoringComponentId"; "required": false; }; "agenticAuthoringScope": { "alias": "agenticAuthoringScope"; "required": false; }; "agenticAuthoringEtag": { "alias": "agenticAuthoringEtag"; "required": false; }; "agenticAuthoringIncludeLlmDiagnostics": { "alias": "agenticAuthoringIncludeLlmDiagnostics"; "required": false; }; "agenticAuthoringEnableStreaming": { "alias": "agenticAuthoringEnableStreaming"; "required": false; }; "agenticAuthoringVoiceInputMode": { "alias": "agenticAuthoringVoiceInputMode"; "required": false; }; "agenticAuthoringContextHints": { "alias": "agenticAuthoringContextHints"; "required": false; }; "authoringDocument": { "alias": "authoringDocument"; "required": false; }; "showPageLifecycleActions": { "alias": "showPageLifecycleActions"; "required": false; }; "canDeleteSavedPage": { "alias": "canDeleteSavedPage"; "required": false; }; "pageLifecycleBusy": { "alias": "pageLifecycleBusy"; "required": false; }; "pageLifecycleResetRevision": { "alias": "pageLifecycleResetRevision"; "required": false; }; }, { "pageChange": "pageChange"; "pageAuthoringChange": "pageAuthoringChange"; "widgetEvent": "widgetEvent"; "pageSaveRequested": "pageSaveRequested"; "agenticAuthoringApplied": "agenticAuthoringApplied"; "agenticAuthoringSharedRuleHandoff": "agenticAuthoringSharedRuleHandoff"; "pageRestart": "pageRestart"; "savedPageDeleteRequested": "savedPageDeleteRequested"; }, never, never, true, never>;
3110
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DynamicPageBuilderComponent, "praxis-dynamic-page-builder", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "autoPersist": { "alias": "autoPersist"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "authoringCapabilities": { "alias": "authoringCapabilities"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "showGovernanceToolbar": { "alias": "showGovernanceToolbar"; "required": false; }; "governanceToolbarTitle": { "alias": "governanceToolbarTitle"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; "componentPaletteAllowedWidgetIds": { "alias": "componentPaletteAllowedWidgetIds"; "required": false; }; "componentPaletteAllowedWidgetTags": { "alias": "componentPaletteAllowedWidgetTags"; "required": false; }; "componentPaletteAllowedPresetIds": { "alias": "componentPaletteAllowedPresetIds"; "required": false; }; "enableAgenticAuthoring": { "alias": "enableAgenticAuthoring"; "required": false; }; "agenticAuthoringProvider": { "alias": "agenticAuthoringProvider"; "required": false; }; "agenticAuthoringModel": { "alias": "agenticAuthoringModel"; "required": false; }; "agenticAuthoringApiKey": { "alias": "agenticAuthoringApiKey"; "required": false; }; "agenticAuthoringComponentId": { "alias": "agenticAuthoringComponentId"; "required": false; }; "agenticAuthoringScope": { "alias": "agenticAuthoringScope"; "required": false; }; "agenticAuthoringEtag": { "alias": "agenticAuthoringEtag"; "required": false; }; "agenticAuthoringIncludeLlmDiagnostics": { "alias": "agenticAuthoringIncludeLlmDiagnostics"; "required": false; }; "agenticAuthoringEnableStreaming": { "alias": "agenticAuthoringEnableStreaming"; "required": false; }; "agenticAuthoringVoiceInputMode": { "alias": "agenticAuthoringVoiceInputMode"; "required": false; }; "agenticAuthoringContextHints": { "alias": "agenticAuthoringContextHints"; "required": false; }; "authoringDocument": { "alias": "authoringDocument"; "required": false; }; "showPageLifecycleActions": { "alias": "showPageLifecycleActions"; "required": false; }; "canDeleteSavedPage": { "alias": "canDeleteSavedPage"; "required": false; }; "pageLifecycleBusy": { "alias": "pageLifecycleBusy"; "required": false; }; "pageLifecycleResetRevision": { "alias": "pageLifecycleResetRevision"; "required": false; }; }, { "persistenceChange": "persistenceChange"; "pageChange": "pageChange"; "pageAuthoringChange": "pageAuthoringChange"; "widgetEvent": "widgetEvent"; "pageSaveRequested": "pageSaveRequested"; "agenticAuthoringApplied": "agenticAuthoringApplied"; "agenticAuthoringSharedRuleHandoff": "agenticAuthoringSharedRuleHandoff"; "pageRestart": "pageRestart"; "savedPageDeleteRequested": "savedPageDeleteRequested"; "customizationChange": "customizationChange"; }, never, never, true, never>;
2722
3111
  }
2723
3112
 
2724
3113
  /** Metadata for Praxis Page Builder component */
@@ -2726,5 +3115,402 @@ declare const PRAXIS_PAGE_BUILDER_COMPONENT_METADATA: ComponentDocMeta;
2726
3115
  /** Provider para auto-registrar metadados do componente Page Builder. */
2727
3116
  declare function providePraxisPageBuilderMetadata(): Provider;
2728
3117
 
2729
- export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionEditorComponent, DynamicPageBuilderComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_COMPONENT_CONTEXT_PACK, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST, PRAXIS_PAGE_BUILDER_COMPONENT_METADATA, PageBuilderAgenticAuthoringService, PageConfigEditorComponent, TileToolbarComponent, UiCompositionResourcePreflightService, WidgetShellEditorComponent, clearWidgetAiCatalogs, compileUiCompositionPlan, getPageAiCatalog, getWidgetAiCapabilities, preflightUiCompositionPlan, preflightUiCompositionPlanResources, providePageBuilderWidgetAiCatalogs, providePraxisPageBuilderMetadata, registerWidgetAiCatalog, registerWidgetAiCatalogs, resolveUiCompositionPlanTemplate, validateUiCompositionPlan, verifyUiCompositionAuthoringSource };
2730
- export type { Capability, CapabilityCatalog, CapabilityCategory, ComponentPaletteData, ComponentPaletteSelection, ConfirmDialogData, PageBuilderAgenticAuthoringAttachmentSummary, PageBuilderAgenticAuthoringCandidate, PageBuilderAgenticAuthoringComponentCapabilitiesResult, PageBuilderAgenticAuthoringComponentCapability, PageBuilderAgenticAuthoringComponentCapabilityCatalog, PageBuilderAgenticAuthoringComponentCapabilityExample, PageBuilderAgenticAuthoringComponentFieldAlias, PageBuilderAgenticAuthoringConversationMessage, PageBuilderAgenticAuthoringGateResult, PageBuilderAgenticAuthoringIntentResolutionRequest, PageBuilderAgenticAuthoringIntentResolutionResult, PageBuilderAgenticAuthoringOptions, PageBuilderAgenticAuthoringPendingClarification, PageBuilderAgenticAuthoringPromptRequest, PageBuilderAgenticAuthoringProvider, PageBuilderAgenticAuthoringQuickReply, PageBuilderAgenticAuthoringResourceCandidatesRequest, PageBuilderAgenticAuthoringResourceCandidatesResult, PageBuilderAgenticAuthoringSharedRuleHandoff, PageBuilderAgenticAuthoringTarget, PageBuilderAgenticAuthoringTurnStreamConnectionError, PageBuilderAgenticAuthoringTurnStreamEvent, PageBuilderAgenticAuthoringTurnStreamRequest, PageBuilderAgenticAuthoringTurnStreamStartResponse, PageBuilderApplyRequest, PageBuilderApplyResult, PageBuilderAuthoringCapabilities, PageBuilderCompiledFormPatch, PageBuilderMinimalFormPlanResult, PageBuilderPreviewDiagnostics, PageBuilderPreviewResult, PageBuilderProjectKnowledgeAudit, UiCompositionAuthoringSourceDiagnostic, UiCompositionAuthoringSourceDiagnosticCode, UiCompositionAuthoringSourceVerification, UiCompositionAuthoringSourceVerificationContext, UiCompositionPlan, UiCompositionPlanAuthoringInput, UiCompositionPlanAuthoringSource, UiCompositionPlanBinding, UiCompositionPlanCompileResult, UiCompositionPlanComponentPortEndpoint, UiCompositionPlanContextScope, UiCompositionPlanContextScopeTarget, UiCompositionPlanContextValue, UiCompositionPlanDiagnostic, UiCompositionPlanEndpoint, UiCompositionPlanGlobalActionEndpoint, UiCompositionPlanGlobalActionSourceEndpoint, UiCompositionPlanInputSource, UiCompositionPlanPreflightResult, UiCompositionPlanSelectCase, UiCompositionPlanSelectionSync, UiCompositionPlanSelectionSyncMapping, UiCompositionPlanSourceEndpoint, UiCompositionPlanStateEndpoint, UiCompositionPlanTargetEndpoint, UiCompositionPlanTemplateMaterialization, UiCompositionPlanTemplateRef, UiCompositionPlanTemplateReference, UiCompositionPlanTemplateResolutionResult, UiCompositionPlanTemplateRevision, UiCompositionPlanTransform, UiCompositionPlanTransformOutput, UiCompositionPlanWidget, UiCompositionResourceSchemaRequest, UiCompositionResourceSchemaResolution, UiCompositionResourceSchemaResolver, ValueKind };
3118
+ /**
3119
+ * Type guard that verifies if an item is a canonical ComponentDocMeta.
3120
+ */
3121
+ declare function isComponentDocMeta(value: unknown): value is ComponentDocMeta;
3122
+ /**
3123
+ * Convenient provider factory for registering widgets in the Page Builder host.
3124
+ *
3125
+ * Accepts a list of either Angular `Provider` entries (such as `providePraxisListMetadata()`)
3126
+ * or direct `ComponentDocMeta` definitions (such as `PRAXIS_LIST_COMPONENT_METADATA`).
3127
+ * Any `ComponentDocMeta` passed will be automatically registered with the
3128
+ * `ComponentMetadataRegistry` during environment initialization.
3129
+ */
3130
+ declare function providePraxisPageBuilderWidgets(widgets?: Array<Provider | ComponentDocMeta>): Provider[];
3131
+
3132
+ /** Transient UI intent, not the Config POST /pages DTO or a publication document. */
3133
+ interface PageSaveAsRequest {
3134
+ readonly creationKey: string;
3135
+ readonly definition: WidgetPageDefinition;
3136
+ readonly presentation: PageAuthoringDocument['config']['presentation'];
3137
+ readonly menuLabel: string;
3138
+ }
3139
+ /** Returned only after the adapter confirms the page/menu and an openable host route. */
3140
+ interface PageSaveAsResult {
3141
+ readonly pageId: string;
3142
+ readonly routePath: string;
3143
+ }
3144
+ /** No default storage. The adapter owns admission, identity allocation, persistence and routing. */
3145
+ interface PageSaveAsAdapter {
3146
+ save(request: PageSaveAsRequest): Promise<PageSaveAsResult>;
3147
+ }
3148
+
3149
+ /** Reusable save-as journey. Feed save() only from the builder's pageSaveRequested event. */
3150
+ declare class PraxisPageSaveAsComponent {
3151
+ readonly adapter: _angular_core.InputSignal<PageSaveAsAdapter>;
3152
+ /** Monotonic host view/session identity; UI invalidation only, never an authorization grant. */
3153
+ readonly contextKey: _angular_core.InputSignal<string>;
3154
+ readonly canSave: _angular_core.InputSignal<boolean>;
3155
+ readonly initialTitle: _angular_core.InputSignal<string>;
3156
+ readonly initialMenuLabel: _angular_core.InputSignal<string>;
3157
+ readonly initialIcon: _angular_core.InputSignal<string>;
3158
+ readonly titleMaxLength: _angular_core.InputSignal<number>;
3159
+ readonly menuMaxLength: _angular_core.InputSignal<number>;
3160
+ readonly saveRequested: _angular_core.OutputEmitterRef<void>;
3161
+ readonly saved: _angular_core.OutputEmitterRef<PageSaveAsResult>;
3162
+ readonly saveFailed: _angular_core.OutputEmitterRef<unknown>;
3163
+ readonly busy: _angular_core.WritableSignal<boolean>;
3164
+ readonly choosingIcon: _angular_core.WritableSignal<boolean>;
3165
+ readonly result: _angular_core.WritableSignal<PageSaveAsResult | null>;
3166
+ readonly error: _angular_core.WritableSignal<boolean>;
3167
+ readonly iconError: _angular_core.WritableSignal<boolean>;
3168
+ readonly title: FormControl<string>;
3169
+ readonly menu: FormControl<string>;
3170
+ readonly icon: _angular_core.WritableSignal<string>;
3171
+ private readonly i18n;
3172
+ private readonly picker;
3173
+ private generation;
3174
+ private attempt?;
3175
+ private destroyed;
3176
+ constructor();
3177
+ text(key: string): string;
3178
+ destination(): {
3179
+ label: string;
3180
+ icon: string;
3181
+ };
3182
+ clearResult(): void;
3183
+ requestSave(): void;
3184
+ chooseIcon(): Promise<void>;
3185
+ save(definition: WidgetPageDefinition): Promise<void>;
3186
+ private available;
3187
+ private current;
3188
+ private limit;
3189
+ private validIcon;
3190
+ private localRoute;
3191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisPageSaveAsComponent, never>;
3192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisPageSaveAsComponent, "praxis-page-save-as", never, { "adapter": { "alias": "adapter"; "required": true; "isSignal": true; }; "contextKey": { "alias": "contextKey"; "required": true; "isSignal": true; }; "canSave": { "alias": "canSave"; "required": false; "isSignal": true; }; "initialTitle": { "alias": "initialTitle"; "required": false; "isSignal": true; }; "initialMenuLabel": { "alias": "initialMenuLabel"; "required": false; "isSignal": true; }; "initialIcon": { "alias": "initialIcon"; "required": false; "isSignal": true; }; "titleMaxLength": { "alias": "titleMaxLength"; "required": false; "isSignal": true; }; "menuMaxLength": { "alias": "menuMaxLength"; "required": false; "isSignal": true; }; }, { "saveRequested": "saveRequested"; "saved": "saved"; "saveFailed": "saveFailed"; }, never, never, true, never>;
3193
+ }
3194
+
3195
+ /** Copies the current local authoring snapshot. Allocation/provenance belongs to the destination adapter. */
3196
+ declare class PraxisPageCopyActionComponent {
3197
+ readonly page: _angular_core.InputSignal<WidgetPageDefinition | undefined>;
3198
+ readonly canCopy: _angular_core.InputSignal<boolean>;
3199
+ readonly copyRequested: _angular_core.OutputEmitterRef<WidgetPageDefinition>;
3200
+ readonly error: _angular_core.WritableSignal<boolean>;
3201
+ private readonly i18n;
3202
+ text(key: string): string;
3203
+ copy(): void;
3204
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PraxisPageCopyActionComponent, never>;
3205
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PraxisPageCopyActionComponent, "praxis-page-copy-action", never, { "page": { "alias": "page"; "required": false; "isSignal": true; }; "canCopy": { "alias": "canCopy"; "required": false; "isSignal": true; }; }, { "copyRequested": "copyRequested"; }, never, never, true, never>;
3206
+ }
3207
+
3208
+ interface GovernedPageCapabilities {
3209
+ readonly canAuthorPages: boolean;
3210
+ readonly canSubmitForReview: boolean;
3211
+ readonly canApproveReleases: boolean;
3212
+ readonly canPublishReleases: boolean;
3213
+ readonly canManageNavigationGroups: boolean;
3214
+ }
3215
+ declare const GOVERNED_PAGE_CAPABILITY_KEYS: Readonly<{
3216
+ authorPages: "praxis.config.pages.author";
3217
+ submitForReview: "praxis.config.pages.submit";
3218
+ approveReleases: "praxis.config.pages.approve";
3219
+ publishReleases: "praxis.config.pages.publish";
3220
+ manageNavigationGroups: "praxis.config.navigation.manage";
3221
+ }>;
3222
+ /**
3223
+ * Derives governed page capabilities from canonical server-issued capability keys.
3224
+ * Never fabricates approval or publication authority when a capability is absent.
3225
+ */
3226
+ declare function deriveGovernedPageCapabilities(grantedCapabilities: Iterable<string> | null | undefined): GovernedPageCapabilities;
3227
+ type GovernedPageReadResult<T> = UiLayoutLifecycleHttpReceipt<T> | UiLayoutLifecycleNotModifiedReceipt;
3228
+ interface GovernedPagePersistenceAdapter {
3229
+ readonly mode: 'corporate';
3230
+ createPage(command: PageCreationCommand): Promise<UiLayoutLifecycleHttpReceipt<PageCreationReceipt>>;
3231
+ readPageByCreationKey(creationKey: string): Promise<UiLayoutLifecycleHttpReceipt<PageCreationReceipt>>;
3232
+ readPageCatalog(options?: PageCatalogReadOptions): Promise<PageCatalogResponse>;
3233
+ readPublishedPage(pageId: string, ifNoneMatch?: string): Promise<GovernedPageReadResult<PublishedPageReadResponse>>;
3234
+ readDraftByCreationKey(target: UiLayoutTarget, creationKey: string): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutDraftReceipt>>;
3235
+ readDraft(target: UiLayoutTarget, draftId: string, ifNoneMatch?: string): Promise<GovernedPageReadResult<UiLayoutDraftWorkspaceReceipt>>;
3236
+ readReview(target: UiLayoutTarget, releaseId: string, ifNoneMatch?: string): Promise<GovernedPageReadResult<UiLayoutReleaseReviewReceipt>>;
3237
+ readHead(target: UiLayoutTarget, ifNoneMatch?: string): Promise<GovernedPageReadResult<UiLayoutReleaseHeadReceipt>>;
3238
+ createDraft(target: UiLayoutTarget, idempotencyKey: string): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutDraftWorkspaceReceipt>>;
3239
+ createRevision(target: UiLayoutTarget, draftId: string, draftEtag: string, command: UiLayoutRevisionCommand): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutRevisionCommandResult>>;
3240
+ createAssignment(target: UiLayoutTarget, draftId: string, draftEtag: string, command: UiLayoutAssignmentCommand): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutAssignmentCommandResult>>;
3241
+ freezeRelease(target: UiLayoutTarget, draftId: string, draftEtag: string, command: UiLayoutFreezeReleaseCommand): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutFreezeReleaseCommandResult>>;
3242
+ submit(target: UiLayoutTarget, releaseId: string, reviewEtag: string): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutReleaseReviewReceipt>>;
3243
+ approve(target: UiLayoutTarget, releaseId: string, reviewEtag: string, command: UiLayoutReasonCommand): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutReleaseReviewReceipt>>;
3244
+ publish(target: UiLayoutTarget, condition: UiLayoutHeadWriteCondition, command: UiLayoutReleaseReferenceCommand): Promise<UiLayoutLifecycleHttpReceipt<UiLayoutReleaseHeadReceipt>>;
3245
+ }
3246
+ declare function createCorporateGovernedPagePersistenceAdapter(lifecycle: Pick<UiLayoutLifecycleService, 'createPage' | 'readPageByCreationKey' | 'readPageCatalog' | 'readPublishedPage' | 'readDraftByCreationKey' | 'readDraft' | 'readReview' | 'readHead' | 'createDraft' | 'createRevision' | 'createAssignment' | 'freezeRelease' | 'submit' | 'approve' | 'publish'>): GovernedPagePersistenceAdapter;
3247
+ /**
3248
+ * Explicit local/sandbox Save-As adapter contract.
3249
+ * Never simulates corporate review/approval/release states in the browser.
3250
+ */
3251
+ interface GovernedPageLocalSaveAdapter extends PageSaveAsAdapter {
3252
+ readonly mode: 'local';
3253
+ }
3254
+ declare function createLocalPageSaveAsAdapter(handler: (request: PageSaveAsRequest) => Promise<PageSaveAsResult>): GovernedPageLocalSaveAdapter;
3255
+ type GovernedPageOperationKind = 'create-page' | 'import-legacy-page' | 'save-revision' | 'assign-scope' | 'freeze-release' | 'submit-review' | 'approve-release' | 'publish-release';
3256
+ declare const LEGACY_PUBLISHED_PAGE_STORAGE_PREFIX: "published-page:";
3257
+ interface GovernedPageLegacyExportArtifact {
3258
+ readonly schemaVersion: '1.0.0';
3259
+ readonly kind: 'legacy-published-page-export';
3260
+ readonly storageKey: string;
3261
+ readonly pageId: string;
3262
+ readonly routePath: `/pages/${string}`;
3263
+ readonly compatible: boolean;
3264
+ readonly diagnostics: readonly PageDocumentDiagnostic[];
3265
+ readonly rawPayload: unknown;
3266
+ }
3267
+ interface GovernedPageLegacyInspectionResult {
3268
+ readonly storageKey: string;
3269
+ readonly pageId: string;
3270
+ readonly routePath: `/pages/${string}`;
3271
+ readonly target: UiLayoutTarget;
3272
+ readonly compatible: boolean;
3273
+ readonly source: PageSourceReference | null;
3274
+ readonly childSources: readonly UiLayoutPageChildSource[];
3275
+ readonly authoringDocument: PageAuthoringDocument | null;
3276
+ readonly diagnostics: readonly PageDocumentDiagnostic[];
3277
+ readonly exportableArtifact: GovernedPageLegacyExportArtifact;
3278
+ }
3279
+ interface GovernedPageLegacyImportRequest {
3280
+ readonly pageId: string;
3281
+ readonly rawPayload: unknown;
3282
+ readonly source?: PageSourceReference;
3283
+ readonly childSources?: readonly UiLayoutPageChildSource[];
3284
+ readonly reason?: string;
3285
+ readonly idempotencyKey?: string;
3286
+ }
3287
+ interface GovernedPageUncertainOperation {
3288
+ readonly operation: GovernedPageOperationKind;
3289
+ readonly attemptKey: string;
3290
+ readonly creationKey?: string;
3291
+ readonly commandRef?: string;
3292
+ readonly draftId?: string;
3293
+ readonly releaseId?: string;
3294
+ readonly source?: PageSourceReference | null;
3295
+ readonly childSources?: readonly UiLayoutPageChildSource[];
3296
+ readonly occurredAt: string;
3297
+ }
3298
+ interface GovernedPageWorkflowError {
3299
+ readonly code: 'CAPABILITY_DENIED' | 'CONTEXT_OBSOLETE' | 'COMMAND_OUTCOME_UNCERTAIN' | 'OPERATION_FENCED' | 'PRECONDITION_FAILED' | 'CONFLICT' | 'VALIDATION_FAILED' | 'PREVIEW_UNCERTIFIED' | 'ETAG_NOT_PROGRESSED' | 'DRAFT_NOT_LOADED' | 'RELEASE_NOT_FROZEN' | 'TRANSPORT_ERROR';
3300
+ readonly message: string;
3301
+ readonly diagnostics?: readonly PageDocumentDiagnostic[];
3302
+ readonly status?: number;
3303
+ }
3304
+ interface GovernedPageWorkflowSnapshot {
3305
+ readonly contextGeneration: number;
3306
+ readonly contextKey: string;
3307
+ readonly pageId: string | null;
3308
+ readonly rootTarget: UiLayoutTarget | null;
3309
+ readonly source: PageSourceReference | null;
3310
+ readonly draftWorkspace: UiLayoutDraftWorkspaceReceipt | null;
3311
+ readonly draftEtag: string | null;
3312
+ readonly workingDocument: PageAuthoringDocument | null;
3313
+ readonly baselineDocument: PageAuthoringDocument | null;
3314
+ readonly publishedSnapshot: PublishedPageReadResponse | null;
3315
+ readonly publishedEtag: string | null;
3316
+ readonly childSources: readonly UiLayoutPageChildSource[];
3317
+ readonly reviewReceipt: UiLayoutReleaseReviewReceipt | null;
3318
+ readonly reviewEtag: string | null;
3319
+ readonly headReceipt: UiLayoutReleaseHeadReceipt | null;
3320
+ readonly headEtag: string | null;
3321
+ readonly preview: GovernedPagePreviewMaterialization | null;
3322
+ readonly dirty: boolean;
3323
+ readonly busy: boolean;
3324
+ readonly capabilities: GovernedPageCapabilities;
3325
+ readonly fencedOperations: Readonly<Record<string, GovernedPageUncertainOperation>>;
3326
+ readonly lastError: GovernedPageWorkflowError | null;
3327
+ }
3328
+ interface GovernedPageWorkflowControllerConfig {
3329
+ readonly persistence: GovernedPagePersistenceAdapter;
3330
+ readonly childValidators?: PageChildDocumentValidators;
3331
+ readonly previewAdapters?: GovernedPagePreviewWidgetAdapters;
3332
+ readonly initialCapabilities?: GovernedPageCapabilities;
3333
+ readonly initialContextKey?: string;
3334
+ readonly idGenerator?: () => string;
3335
+ }
3336
+ interface GovernedPageCreateNativeRequest {
3337
+ readonly creationKey?: string;
3338
+ readonly title: string;
3339
+ readonly sourceId: string;
3340
+ readonly revision: string;
3341
+ }
3342
+ interface GovernedPageCopyPublishedRequest {
3343
+ readonly creationKey?: string;
3344
+ readonly title: string;
3345
+ readonly sourcePageId: string;
3346
+ }
3347
+ interface GovernedPageAssignmentInput {
3348
+ readonly layerClass: UiLayoutLayerClass;
3349
+ readonly selector: UiLayoutAssignmentSelector;
3350
+ readonly priority?: number;
3351
+ readonly contributionKey?: string;
3352
+ }
3353
+ interface GovernedPageSubmitOptions {
3354
+ readonly reason?: string;
3355
+ readonly assignment?: GovernedPageAssignmentInput;
3356
+ }
3357
+ interface GovernedPageNavigationSnapshot {
3358
+ readonly epoch: number;
3359
+ readonly contextKey: string;
3360
+ readonly catalogEntries: readonly PageCatalogEntry[];
3361
+ readonly groupsDocument: NavigationGroupsAuthoringDocument;
3362
+ readonly menuNodes: readonly RuntimeNavigationMenuNode[];
3363
+ readonly expandedGroupIds: readonly string[];
3364
+ readonly loading: boolean;
3365
+ readonly diagnostics: readonly PageDocumentDiagnostic[];
3366
+ readonly fencedAttempts: Readonly<Record<string, string>>;
3367
+ readonly lastError: string | null;
3368
+ }
3369
+
3370
+ declare const DEFAULT_CORPORATE_NAVIGATION_GROUPS_TARGET: UiLayoutTarget;
3371
+ interface GovernedPageNavigationControllerConfig {
3372
+ readonly persistence: GovernedPagePersistenceAdapter;
3373
+ readonly effectiveLayoutService?: Pick<EffectiveUiLayoutService, 'resolve'> | null;
3374
+ readonly observeTargetDocument?: (target: UiLayoutTarget) => Observable<Record<string, unknown> | null>;
3375
+ readonly navigationGroupsTarget?: UiLayoutTarget;
3376
+ readonly registeredNamespace?: string;
3377
+ readonly allowedIcons?: Iterable<string>;
3378
+ readonly pageSize?: number;
3379
+ readonly maxItemsPerLevel?: number;
3380
+ readonly initialContextKey?: string;
3381
+ readonly idGenerator?: () => string;
3382
+ }
3383
+ interface GovernedNavigationGroupPublishInput {
3384
+ readonly entry: NavigationGroupAuthoringEntry;
3385
+ readonly draftCreationKey?: string;
3386
+ readonly revisionCommandRef?: string;
3387
+ readonly assignmentCommandRef?: string;
3388
+ readonly freezeCommandRef?: string;
3389
+ readonly reason?: string;
3390
+ readonly layerClass?: UiLayoutLayerClass;
3391
+ readonly selector: UiLayoutAssignmentSelector;
3392
+ readonly priority?: number;
3393
+ readonly contributionKey?: string;
3394
+ }
3395
+ declare class GovernedPageNavigationController {
3396
+ private readonly persistence;
3397
+ private readonly observeTargetDoc?;
3398
+ private readonly navigationGroupsTarget;
3399
+ private readonly registeredNamespace;
3400
+ private readonly allowedIcons;
3401
+ private readonly pageSize;
3402
+ private readonly maxItemsPerLevel;
3403
+ private readonly idGenerator;
3404
+ private epoch;
3405
+ private contextKey;
3406
+ private groupsSub;
3407
+ private readonly pageSubs;
3408
+ private readonly pageDocuments;
3409
+ private readonly expandedGroups;
3410
+ private readonly fencedAttempts;
3411
+ private latestGroupsDoc;
3412
+ private latestCatalogEntries;
3413
+ private readonly stateSubject;
3414
+ readonly snapshot$: Observable<GovernedPageNavigationSnapshot>;
3415
+ constructor(config: GovernedPageNavigationControllerConfig);
3416
+ get snapshot(): GovernedPageNavigationSnapshot;
3417
+ setContextKey(nextContextKey: string): void;
3418
+ invalidate(): void;
3419
+ destroy(): void;
3420
+ refresh(): Promise<GovernedPageNavigationSnapshot>;
3421
+ toggleGroupExpanded(groupId: string): void;
3422
+ clearFencedAttempt(attemptKey: string): void;
3423
+ upsertAndPublishNavigationGroup(input: GovernedNavigationGroupPublishInput): Promise<NavigationGroupsAuthoringDocument>;
3424
+ private readAllCatalogEntries;
3425
+ private hydrateCatalogPages;
3426
+ private bindGroupsObservation;
3427
+ private bindPageObservation;
3428
+ private reobserveGroupChildren;
3429
+ private recomputeProjection;
3430
+ private isStale;
3431
+ private teardownSubscriptions;
3432
+ private publishSnapshot;
3433
+ }
3434
+
3435
+ declare const DEFAULT_GOVERNED_PAGE_CHILD_VALIDATORS: PageChildDocumentValidators;
3436
+ declare const DEFAULT_GOVERNED_PAGE_PREVIEW_ADAPTERS: GovernedPagePreviewWidgetAdapters;
3437
+ /**
3438
+ * Inspects a legacy `published-page:<uuid>` payload against the closed P0 governed page profile.
3439
+ * Validates page source, authoring document structure, and child widget sources while preserving
3440
+ * an exportable artifact for incompatible legacy records.
3441
+ */
3442
+ declare function inspectLegacyPublishedPagePayload(request: GovernedPageLegacyImportRequest, childValidators?: PageChildDocumentValidators): GovernedPageLegacyInspectionResult;
3443
+ declare class GovernedPageWorkflowController {
3444
+ private readonly persistence;
3445
+ private readonly childValidators;
3446
+ private readonly previewAdapters;
3447
+ private readonly idGenerator;
3448
+ private contextGeneration;
3449
+ private contextKey;
3450
+ private readonly fencedOperations;
3451
+ private readonly childSourcesByWidgetId;
3452
+ private readonly stateSubject;
3453
+ readonly snapshot$: Observable<GovernedPageWorkflowSnapshot>;
3454
+ constructor(config: GovernedPageWorkflowControllerConfig);
3455
+ get snapshot(): GovernedPageWorkflowSnapshot;
3456
+ setCapabilities(capabilities: GovernedPageCapabilities): void;
3457
+ /**
3458
+ * Advances monotonic context generation on context switch (including A -> B -> A),
3459
+ * invalidating any in-flight callbacks from previous generations.
3460
+ */
3461
+ setContextKey(nextContextKey: string): void;
3462
+ destroy(): void;
3463
+ createNativePage(request: GovernedPageCreateNativeRequest): Promise<PageCreationReceipt>;
3464
+ copyPublishedPage(request: GovernedPageCopyPublishedRequest): Promise<PageCreationReceipt>;
3465
+ /**
3466
+ * Explicitly imports a compatible legacy `published-page:<uuid>` record into a governed draft
3467
+ * preserving the `/pages/<uuid>` address (`{ componentType: 'praxis-dynamic-page', componentId: pageId }`).
3468
+ * Never fabricates approval or publication state and never deletes legacy storage keys.
3469
+ */
3470
+ importLegacyPublishedPage(request: GovernedPageLegacyImportRequest): Promise<GovernedPageWorkflowSnapshot>;
3471
+ openDraftWorkspace(pageId: string, draftId: string, options?: {
3472
+ source?: PageSourceReference | null;
3473
+ }): Promise<GovernedPageWorkflowSnapshot>;
3474
+ updateWorkingDocument(nextDocument: PageAuthoringDocument): PageAuthoringDocument;
3475
+ updatePresentation(presentation: PageAuthoringDocument['config']['presentation']): PageAuthoringDocument;
3476
+ upsertNavigationBinding(binding: PageNavigationBinding, options?: PageNavigationBindingUpdateOptions): PageAuthoringDocument;
3477
+ /**
3478
+ * Updates a child widget's inputs inside the page's authoring document and
3479
+ * records its governed child source so child widgets remain under page authorship.
3480
+ */
3481
+ updateChildWidgetInputs(widgetKey: string, inputs: Record<string, unknown>, childSource?: UiLayoutPageChildSource): PageAuthoringDocument;
3482
+ buildInteractivePreview(baseContext?: Record<string, unknown>): GovernedPagePreviewMaterialization;
3483
+ saveDraftRevision(reason?: string): Promise<GovernedPageWorkflowSnapshot>;
3484
+ assignScope(input: GovernedPageAssignmentInput): Promise<GovernedPageWorkflowSnapshot>;
3485
+ saveAndSubmitForReview(options?: GovernedPageSubmitOptions): Promise<GovernedPageWorkflowSnapshot>;
3486
+ approveRelease(reason?: string): Promise<GovernedPageWorkflowSnapshot>;
3487
+ publishRelease(reason?: string): Promise<GovernedPageWorkflowSnapshot>;
3488
+ approveAndPublish(reason?: string): Promise<GovernedPageWorkflowSnapshot>;
3489
+ /**
3490
+ * Reconciles a fenced operation after an ambiguous network failure (`COMMAND_OUTCOME_UNCERTAIN`)
3491
+ * using the canonical read endpoints before unlocking retries.
3492
+ */
3493
+ reconcileUncertainOperation(attemptKey: string): Promise<GovernedPageWorkflowSnapshot>;
3494
+ /**
3495
+ * Reloads server state after a 409 Conflict or 412 Precondition Failed response.
3496
+ */
3497
+ reloadAfterConflict(): Promise<GovernedPageWorkflowSnapshot>;
3498
+ private executePageCreation;
3499
+ private applyDraftWorkspaceReceipt;
3500
+ private refreshPublishedAndLifecycleMetadata;
3501
+ private requireCapability;
3502
+ private requireWorkingDocument;
3503
+ private requireLoadedDraft;
3504
+ private assertNotFenced;
3505
+ private isStale;
3506
+ private assertActiveContext;
3507
+ private handleOperationError;
3508
+ private fail;
3509
+ private isLifecycleContractErrorLike;
3510
+ private isWorkflowError;
3511
+ private setBusy;
3512
+ private publishSnapshot;
3513
+ }
3514
+
3515
+ export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionEditorComponent, DEFAULT_CORPORATE_NAVIGATION_GROUPS_TARGET, DEFAULT_GOVERNED_PAGE_CHILD_VALIDATORS, DEFAULT_GOVERNED_PAGE_PREVIEW_ADAPTERS, DynamicPageBuilderComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, GOVERNED_PAGE_CAPABILITY_KEYS, GovernedPageNavigationController, GovernedPageWorkflowController, LEGACY_PUBLISHED_PAGE_STORAGE_PREFIX, PAGE_BUILDER_AGENTIC_AUTHORING_OPTIONS, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_COMPONENT_CONTEXT_PACK, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, PRAXIS_PAGE_BUILDER_AUTHORING_MANIFEST, PRAXIS_PAGE_BUILDER_COMPONENT_METADATA, PageBuilderAgenticAuthoringService, PageConfigEditorComponent, PraxisPageCopyActionComponent, PraxisPageSaveAsComponent, TileToolbarComponent, UiCompositionResourcePreflightService, WidgetShellEditorComponent, clearWidgetAiCatalogs, compileUiCompositionPlan, createCorporateGovernedPagePersistenceAdapter, createLocalPageSaveAsAdapter, deriveGovernedPageCapabilities, getPageAiCatalog, getWidgetAiCapabilities, inspectLegacyPublishedPagePayload, isComponentDocMeta, preflightUiCompositionPlan, preflightUiCompositionPlanResources, providePageBuilderWidgetAiCatalogs, providePraxisPageBuilderMetadata, providePraxisPageBuilderWidgets, registerWidgetAiCatalog, registerWidgetAiCatalogs, resolveUiCompositionPlanTemplate, validateUiCompositionPlan, verifyUiCompositionAuthoringSource };
3516
+ export type { Capability, CapabilityCatalog, CapabilityCategory, CollectionScreenComposerConfig, ComponentPaletteData, ComponentPaletteSelection, ConfirmDialogData, GovernedNavigationGroupPublishInput, GovernedPageAssignmentInput, GovernedPageCapabilities, GovernedPageCopyPublishedRequest, GovernedPageCreateNativeRequest, GovernedPageLegacyExportArtifact, GovernedPageLegacyImportRequest, GovernedPageLegacyInspectionResult, GovernedPageLocalSaveAdapter, GovernedPageNavigationControllerConfig, GovernedPageNavigationSnapshot, GovernedPageOperationKind, GovernedPagePersistenceAdapter, GovernedPageReadResult, GovernedPageSubmitOptions, GovernedPageUncertainOperation, GovernedPageWorkflowControllerConfig, GovernedPageWorkflowError, GovernedPageWorkflowSnapshot, GuidedDataSourceQueryConfig, GuidedDataSourceTransformConfig, GuidedDerivedMeasureConfig, PageBuilderAgenticAuthoringAttachmentSummary, PageBuilderAgenticAuthoringCandidate, PageBuilderAgenticAuthoringComponentCapabilitiesResult, PageBuilderAgenticAuthoringComponentCapability, PageBuilderAgenticAuthoringComponentCapabilityCatalog, PageBuilderAgenticAuthoringComponentCapabilityExample, PageBuilderAgenticAuthoringComponentFieldAlias, PageBuilderAgenticAuthoringConversationMessage, PageBuilderAgenticAuthoringGateResult, PageBuilderAgenticAuthoringIntentResolutionRequest, PageBuilderAgenticAuthoringIntentResolutionResult, PageBuilderAgenticAuthoringOptions, PageBuilderAgenticAuthoringPendingClarification, PageBuilderAgenticAuthoringPromptRequest, PageBuilderAgenticAuthoringProvider, PageBuilderAgenticAuthoringQuickReply, PageBuilderAgenticAuthoringResourceCandidatesRequest, PageBuilderAgenticAuthoringResourceCandidatesResult, PageBuilderAgenticAuthoringSharedRuleHandoff, PageBuilderAgenticAuthoringTarget, PageBuilderAgenticAuthoringTurnStreamConnectionError, PageBuilderAgenticAuthoringTurnStreamEvent, PageBuilderAgenticAuthoringTurnStreamRequest, PageBuilderAgenticAuthoringTurnStreamStartResponse, PageBuilderApplyRequest, PageBuilderApplyResult, PageBuilderAuthoringCapabilities, PageBuilderCompiledFormPatch, PageBuilderMinimalFormPlanResult, PageBuilderPreviewDiagnostics, PageBuilderPreviewResult, PageBuilderProjectKnowledgeAudit, PageSaveAsAdapter, PageSaveAsRequest, PageSaveAsResult, PaletteCategory, PaletteExistingCanvasItem, QueuedPaletteItem, UiCompositionAuthoringSourceDiagnostic, UiCompositionAuthoringSourceDiagnosticCode, UiCompositionAuthoringSourceVerification, UiCompositionAuthoringSourceVerificationContext, UiCompositionPlan, UiCompositionPlanAuthoringInput, UiCompositionPlanAuthoringSource, UiCompositionPlanBinding, UiCompositionPlanCompileResult, UiCompositionPlanComponentPortEndpoint, UiCompositionPlanContextScope, UiCompositionPlanContextScopeTarget, UiCompositionPlanContextValue, UiCompositionPlanDiagnostic, UiCompositionPlanEndpoint, UiCompositionPlanGlobalActionEndpoint, UiCompositionPlanGlobalActionSourceEndpoint, UiCompositionPlanInputSource, UiCompositionPlanPreflightResult, UiCompositionPlanSelectCase, UiCompositionPlanSelectionSync, UiCompositionPlanSelectionSyncMapping, UiCompositionPlanSourceEndpoint, UiCompositionPlanStateEndpoint, UiCompositionPlanTargetEndpoint, UiCompositionPlanTemplateMaterialization, UiCompositionPlanTemplateRef, UiCompositionPlanTemplateReference, UiCompositionPlanTemplateResolutionResult, UiCompositionPlanTemplateRevision, UiCompositionPlanTransform, UiCompositionPlanTransformOutput, UiCompositionPlanWidget, UiCompositionResourceSchemaRequest, UiCompositionResourceSchemaResolution, UiCompositionResourceSchemaResolver, ValueKind };