@praxisui/page-builder 3.0.0-beta.6 → 3.0.0-beta.8

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/index.d.ts CHANGED
@@ -1,14 +1,13 @@
1
1
  import { MatDialogRef, MatDialog } from '@angular/material/dialog';
2
2
  import * as i0 from '@angular/core';
3
- import { EventEmitter, OnInit, OnChanges, SimpleChanges, InjectionToken, Provider, ElementRef } from '@angular/core';
4
- import { ComponentDocMeta, ComponentMetadataRegistry, GridPageDefinition, GridWidgetInstance, WidgetConnection, WidgetShellConfig, WidgetShellAction, WidgetPageOrientation, WidgetPageDefinition, WidgetPageLayout, AiCapabilityCategory, AiValueKind, AiCapability, AiCapabilityCatalog, WidgetPageStateInput, PageIdentity, ConnectionManagerService, AsyncConfigStorage, ComponentKeyService, SettingsPanelBridge, WidgetShellActionEvent } from '@praxisui/core';
3
+ import { EventEmitter, OnInit, OnChanges, SimpleChanges, WritableSignal, InjectionToken, Provider, Type } from '@angular/core';
4
+ import { ComponentDocMeta, ComponentMetadataRegistry, CompositionLink, DiagnosticRecord, SettingsValueProvider, WidgetPageDefinition, WidgetInstance, WidgetConnection, WidgetShellConfig, WidgetShellAction, WidgetPageGroupingDefinition, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, PageIdentity, WidgetStateNode, WidgetDerivedStateNode, AiCapabilityCategory, AiValueKind, AiCapability, AiCapabilityCatalog, WidgetPageStateInput, DynamicWidgetPageComponent, SettingsPanelBridge } from '@praxisui/core';
5
5
  export { WidgetShellComponent } from '@praxisui/core';
6
6
  import { MatSnackBar } from '@angular/material/snack-bar';
7
7
  import * as rxjs from 'rxjs';
8
+ import { BehaviorSubject } from 'rxjs';
8
9
  import { FormGroup, FormControl, FormArray } from '@angular/forms';
9
- import { SettingsValueProvider } from '@praxisui/settings-panel';
10
- import { GridsterConfig, GridsterItem } from 'angular-gridster2';
11
- import { Router, ActivatedRoute } from '@angular/router';
10
+ import { SettingsValueProvider as SettingsValueProvider$1 } from '@praxisui/settings-panel';
12
11
 
13
12
  declare const PLACEHOLDER = 1;
14
13
 
@@ -79,13 +78,26 @@ declare class ComponentPaletteDialogComponent implements OnInit {
79
78
  static ɵcmp: i0.ɵɵComponentDeclaration<ComponentPaletteDialogComponent, "praxis-component-palette-dialog", never, {}, {}, never, never, true, never>;
80
79
  }
81
80
 
82
- declare class ConnectionBuilderComponent implements OnInit, OnChanges {
81
+ type AuthoringCanonicalLinkDiagnostic = Pick<DiagnosticRecord, 'code' | 'severity' | 'message'>;
82
+ type AuthoringCanonicalLinkReadModel = CompositionLink & {
83
+ /** Convenience alias for authoring surfaces while the template still reads `source` directly. */
84
+ source: 'legacy-widget-connection' | 'native-composition-link';
85
+ diagnostics: AuthoringCanonicalLinkDiagnostic[];
86
+ };
87
+
88
+ type EndpointOption = {
89
+ value: string;
90
+ label: string;
91
+ kind: 'primary' | 'derived';
92
+ description?: string;
93
+ };
94
+ declare class ConnectionBuilderComponent implements OnInit, OnChanges, SettingsValueProvider {
83
95
  private dialog;
84
96
  private registry;
85
97
  private snack;
86
- page?: GridPageDefinition | string;
87
- widgets?: GridWidgetInstance[];
88
- pageChange: EventEmitter<GridPageDefinition>;
98
+ page?: WidgetPageDefinition | string;
99
+ widgets?: WidgetInstance[];
100
+ pageChange: EventEmitter<WidgetPageDefinition>;
89
101
  private originalSnapshot;
90
102
  showOnlyIssues: boolean;
91
103
  showFriendly: boolean;
@@ -94,7 +106,11 @@ declare class ConnectionBuilderComponent implements OnInit, OnChanges {
94
106
  sortBy: 'from' | 'to';
95
107
  mapPlaceholder: string;
96
108
  connections: i0.WritableSignal<WidgetConnection[]>;
97
- selectedIndex: i0.WritableSignal<number>;
109
+ private readonly selectedConnectionRef;
110
+ stateOptions: i0.WritableSignal<EndpointOption[]>;
111
+ readonly isDirty$: BehaviorSubject<boolean>;
112
+ readonly isValid$: BehaviorSubject<boolean>;
113
+ readonly isBusy$: BehaviorSubject<boolean>;
98
114
  readonly filteredConnections: i0.Signal<WidgetConnection[]>;
99
115
  readonly groupedConnections: i0.Signal<{
100
116
  label: string;
@@ -103,8 +119,10 @@ declare class ConnectionBuilderComponent implements OnInit, OnChanges {
103
119
  constructor(dialog: MatDialog, registry: ComponentMetadataRegistry, snack: MatSnackBar);
104
120
  ngOnInit(): void;
105
121
  ngOnChanges(changes: SimpleChanges): void;
106
- isExpanded(i: number): boolean;
107
- toggleExpanded(i: number, ev?: Event): void;
122
+ isExpanded(connection: WidgetConnection): boolean;
123
+ isSelected(connection: WidgetConnection): boolean;
124
+ toggleExpanded(connection: WidgetConnection, ev?: Event): void;
125
+ selectedIndex(): number;
108
126
  setSortBy(v: 'from' | 'to'): void;
109
127
  onGroupByChange(): void;
110
128
  toggleShowOnlyIssues(): void;
@@ -127,6 +145,16 @@ declare class ConnectionBuilderComponent implements OnInit, OnChanges {
127
145
  componentIconForKey(key: string): string;
128
146
  private widgetTypeByKey;
129
147
  selectedConnection(): WidgetConnection | undefined;
148
+ selectedCanonicalLink(): AuthoringCanonicalLinkReadModel | undefined;
149
+ canonicalLinkForConnection(connection: WidgetConnection): AuthoringCanonicalLinkReadModel;
150
+ persistedSummary(connection: WidgetConnection): string;
151
+ canonicalSummary(canonicalLink: AuthoringCanonicalLinkReadModel): string;
152
+ canonicalDiagnosticsSummary(canonicalLink: AuthoringCanonicalLinkReadModel): string;
153
+ observedTargetPreview(connection: WidgetConnection): string;
154
+ selectedSourceKind(): 'widget' | 'state';
155
+ setSelectedSourceKind(kind: 'widget' | 'state'): void;
156
+ selectedTargetKind(): 'widget' | 'state';
157
+ setSelectedTargetKind(kind: 'widget' | 'state'): void;
130
158
  selectedSourcePrimaryValue(): string;
131
159
  setSelectedSourcePrimaryValue(value: string): void;
132
160
  selectedSourceSecondaryValue(): string;
@@ -139,20 +167,57 @@ declare class ConnectionBuilderComponent implements OnInit, OnChanges {
139
167
  setSelectedMapValue(value: string): void;
140
168
  showSelectedSourceSecondary(): boolean;
141
169
  showSelectedTargetSecondary(): boolean;
170
+ availableOutputsForSelectedWidget(): string[];
171
+ availableInputsForSelectedWidget(): string[];
172
+ availableStateOptions(): EndpointOption[];
173
+ stateOptionLabel(path: string): string;
174
+ stateOptionIcon(path: string): string;
175
+ widgetOptions(): Array<{
176
+ key: string;
177
+ label: string;
178
+ }>;
142
179
  private applyFilters;
143
180
  private applyGrouping;
144
181
  private groupByKey;
145
182
  private sortList;
146
183
  createNew(): void;
147
- startEdit(index: number, _c: WidgetConnection): void;
148
- startEditByConn(c: WidgetConnection): void;
149
- duplicateConnection(index: number): void;
150
- removeConnection(index: number): void;
184
+ startEdit(_index: number, connection: WidgetConnection): void;
185
+ startEditByConn(connection: WidgetConnection): void;
186
+ duplicateConnection(connection: WidgetConnection): void;
187
+ removeConnection(connection: WidgetConnection): void;
151
188
  connectionStatus(c: WidgetConnection): 'ok' | 'warn' | 'err';
152
- onSave(): void;
153
- openDiagramFor(_c: WidgetConnection): void;
189
+ getSettingsValue(): WidgetPageDefinition;
190
+ reset(): void;
191
+ onSave(): WidgetPageDefinition;
192
+ openDiagramFor(_connection: WidgetConnection): void;
154
193
  openDiagramFullscreen(): void;
155
194
  private parsePage;
195
+ private availableOutputsForWidget;
196
+ private availableInputsForWidget;
197
+ private metadataPortDescription;
198
+ private metadataPortsForWidget;
199
+ private metadataPortForWidget;
200
+ private metadataPorts;
201
+ private widgetMetadataForKey;
202
+ private widgetInputLabelForKey;
203
+ private observedInputDescriptionForWidget;
204
+ private widgetInputOptionsForKey;
205
+ private observedInputOptionsForWidget;
206
+ private collectObservedInputPaths;
207
+ private describeObservedInput;
208
+ private previewValue;
209
+ private widgetByKey;
210
+ private refreshStateOptions;
211
+ private collectStateOptions;
212
+ private normalizeState;
213
+ private collectPaths;
214
+ private buildPageWithConnections;
215
+ private replaceConnections;
216
+ private commitConnections;
217
+ private syncSelection;
218
+ private refreshPanelState;
219
+ private refreshValidity;
220
+ private clone;
156
221
  static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionBuilderComponent, never>;
157
222
  static ɵcmp: i0.ɵɵComponentDeclaration<ConnectionBuilderComponent, "praxis-connection-builder", never, { "page": { "alias": "page"; "required": false; }; "widgets": { "alias": "widgets"; "required": false; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
158
223
  }
@@ -191,7 +256,7 @@ type SetInputPreset = {
191
256
  icon?: string;
192
257
  values: SetInputValueOption[];
193
258
  };
194
- declare class WidgetShellEditorComponent implements SettingsValueProvider {
259
+ declare class WidgetShellEditorComponent implements SettingsValueProvider$1 {
195
260
  private registry?;
196
261
  form: FormGroup<{
197
262
  kind: FormControl<"none" | "dashboard-card">;
@@ -289,64 +354,318 @@ declare class WidgetShellEditorComponent implements SettingsValueProvider {
289
354
  static ɵcmp: i0.ɵɵComponentDeclaration<WidgetShellEditorComponent, "praxis-widget-shell-editor", never, {}, {}, never, never, true, never>;
290
355
  }
291
356
 
292
- type DynamicPageEditorInputs = {
293
- page?: WidgetPageDefinition | null;
294
- layout?: WidgetPageLayout | null;
295
- presets?: Record<string, WidgetShellConfig['appearance']> | null;
357
+ type EditorTabId$1 = 'canvas' | 'grouping' | 'devices' | 'context' | 'state';
358
+ type DeviceKey = 'desktop' | 'tablet' | 'mobile';
359
+ type GroupingNodeGroup$1 = FormGroup<{
360
+ kind: FormControl<string>;
361
+ id: FormControl<string>;
362
+ label: FormControl<string>;
363
+ widgetKeysCsv: FormControl<string>;
364
+ layout: FormControl<string>;
365
+ emphasis: FormControl<string>;
366
+ side: FormControl<string>;
367
+ tabsJson: FormControl<string>;
368
+ }>;
369
+ type DeviceVariantForm = FormGroup<{
370
+ columns: FormControl<number | null>;
371
+ rowUnit: FormControl<string>;
372
+ gap: FormControl<string>;
373
+ autoRows: FormControl<'fixed' | 'content' | ''>;
374
+ groupingOverrides: FormControl<string>;
375
+ widgetOverrides: FormControl<string>;
376
+ }>;
377
+ declare class DynamicPageConfigEditorComponent implements OnInit, SettingsValueProvider {
378
+ set page(value: WidgetPageDefinition | string | null | undefined);
379
+ layout?: unknown;
380
+ presets?: unknown;
296
381
  pagePreset?: string | null;
382
+ pageChange: EventEmitter<WidgetPageDefinition>;
383
+ readonly layoutPresetEntries: {
384
+ id: string;
385
+ label: string;
386
+ }[];
387
+ readonly themePresetEntries: {
388
+ id: string;
389
+ label: string;
390
+ }[];
391
+ readonly shellPresetEntries: {
392
+ id: string;
393
+ label: string;
394
+ }[];
395
+ readonly deviceKeys: DeviceKey[];
396
+ readonly deviceLabels: Record<DeviceKey, string>;
397
+ readonly canvasColumnsControl: FormControl<number>;
398
+ readonly canvasRowUnitControl: FormControl<string>;
399
+ readonly canvasGapControl: FormControl<string>;
400
+ readonly canvasAutoRowsControl: FormControl<"fixed" | "content">;
401
+ readonly layoutPresetControl: FormControl<string>;
402
+ readonly themePresetControl: FormControl<string>;
403
+ readonly shellPresetControl: FormControl<string>;
404
+ readonly contextControl: FormControl<string>;
405
+ readonly stateControl: FormControl<string>;
406
+ readonly groupingNodes: FormArray<GroupingNodeGroup$1>;
407
+ readonly deviceForms: Record<DeviceKey, DeviceVariantForm>;
408
+ readonly isDirty$: BehaviorSubject<boolean>;
409
+ readonly isValid$: BehaviorSubject<boolean>;
410
+ readonly isBusy$: BehaviorSubject<boolean>;
411
+ readonly activeTab: WritableSignal<EditorTabId$1>;
412
+ readonly canvasError: WritableSignal<string | null>;
413
+ readonly groupingError: WritableSignal<string | null>;
414
+ readonly contextError: WritableSignal<string | null>;
415
+ readonly stateError: WritableSignal<string | null>;
416
+ readonly deviceError: WritableSignal<string | null>;
417
+ private readonly injectedData;
418
+ private pageInput;
419
+ private snapshot;
420
+ private hydrating;
421
+ private readonly tabOrder;
422
+ constructor();
423
+ ngOnInit(): void;
424
+ get selectedTabIndex(): number;
425
+ get isConfigurationValid(): boolean;
426
+ get hasPendingChanges(): boolean;
427
+ get validationStateLabel(): string;
428
+ get dirtyStateLabel(): string;
429
+ get selectedLayoutPresetLabel(): string;
430
+ get selectedThemePresetLabel(): string;
431
+ get canvasSummaryLabel(): string;
432
+ onSelectedTabIndexChange(index: number): void;
433
+ getSettingsValue(): WidgetPageDefinition | null;
434
+ onSave(): WidgetPageDefinition | null;
435
+ reset(): void;
436
+ addGroupingNode(seed?: WidgetPageGroupingDefinition): void;
437
+ removeGroupingNode(index: number): void;
438
+ private createDeviceVariantForm;
439
+ private createGroupingNodeGroup;
440
+ private hydrate;
441
+ private replaceGroupingNodes;
442
+ private buildCurrentPage;
443
+ private buildGrouping;
444
+ private buildDeviceLayouts;
445
+ private invalidate;
446
+ private refreshPanelState;
447
+ private currentPageInput;
448
+ private parsePage;
449
+ private parseJson;
450
+ private parseRecordJson;
451
+ private parseGroupingTabs;
452
+ private parseGroupingOverrides;
453
+ private parseWidgetOverrides;
454
+ private isGroupingTab;
455
+ private isGroupingOverride;
456
+ private isWidgetOverride;
457
+ private isPlainObject;
458
+ private hasDuplicateIds;
459
+ private hasDuplicateStrings;
460
+ private stringify;
461
+ private stringifyGroupingWidgetKeys;
462
+ private extractShellPreset;
463
+ private removeShellPresetFromContext;
464
+ private applyShellPresetToContext;
465
+ private lookupPresetLabel;
466
+ private defaultCanvas;
467
+ private clone;
468
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicPageConfigEditorComponent, never>;
469
+ static ɵcmp: i0.ɵɵ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>;
470
+ }
471
+
472
+ type LegacyGridOptions = {
473
+ cols?: number;
474
+ rowHeight?: number;
475
+ gap?: number;
297
476
  };
298
- type DynamicPageEditorResult = {
299
- layout: WidgetPageLayout | null;
300
- pagePreset: string;
301
- fullPage?: WidgetPageDefinition;
477
+ type PageDefinition = WidgetPageDefinition & {
478
+ options?: LegacyGridOptions;
302
479
  };
303
- declare class DynamicPageConfigEditorComponent implements SettingsValueProvider {
304
- form: FormGroup<{
305
- pagePreset: FormControl<string>;
306
- orientation: FormControl<WidgetPageOrientation>;
307
- columns: FormControl<number>;
480
+ type EditorTabId = 'layout' | 'grouping' | 'devices' | 'state' | 'context';
481
+ type SchemaNodeGroup = FormGroup<{
482
+ path: FormControl<string>;
483
+ type: FormControl<string>;
484
+ initialMode: FormControl<string>;
485
+ initialJson: FormControl<string>;
486
+ initialScalar: FormControl<string>;
487
+ persist: FormControl<string>;
488
+ mergeStrategy: FormControl<string>;
489
+ description: FormControl<string>;
490
+ }>;
491
+ type DerivedNodeGroup = FormGroup<{
492
+ path: FormControl<string>;
493
+ dependsOn: FormControl<string>;
494
+ computeKind: FormControl<string>;
495
+ operator: FormControl<string>;
496
+ sourcePath: FormControl<string>;
497
+ keysCsv: FormControl<string>;
498
+ expression: FormControl<string>;
499
+ transformerId: FormControl<string>;
500
+ options: FormControl<string>;
501
+ templateMode: FormControl<string>;
502
+ templateJson: FormControl<string>;
503
+ templateScalar: FormControl<string>;
504
+ description: FormControl<string>;
505
+ }>;
506
+ type GroupingNodeGroup = FormGroup<{
507
+ kind: FormControl<string>;
508
+ id: FormControl<string>;
509
+ label: FormControl<string>;
510
+ widgetKeysCsv: FormControl<string>;
511
+ layout: FormControl<string>;
512
+ emphasis: FormControl<string>;
513
+ side: FormControl<string>;
514
+ tabsJson: FormControl<string>;
515
+ }>;
516
+ declare class PageConfigEditorComponent implements SettingsValueProvider {
517
+ protected readonly derivedOperators: readonly ["merge-objects", "pick", "omit"];
518
+ protected readonly mergeStrategies: readonly ["replace", "merge", "append", "remove-keys"];
519
+ protected readonly valueModes: readonly ["json", "string", "number", "boolean", "null"];
520
+ protected readonly groupingKinds: readonly ["section", "tabs", "hero", "rail"];
521
+ protected readonly layoutPresetEntries: Array<(typeof BUILTIN_PAGE_LAYOUT_PRESETS)[string]>;
522
+ protected readonly themePresetEntries: Array<(typeof BUILTIN_PAGE_THEME_PRESETS)[string]>;
523
+ readonly page: i0.InputSignal<string | PageDefinition | null>;
524
+ readonly identity: i0.InputSignal<PageIdentity | null>;
525
+ readonly layoutCompatOptions: i0.InputSignal<any>;
526
+ readonly pageChange: i0.OutputEmitterRef<PageDefinition>;
527
+ readonly form: FormGroup<{
528
+ cols: FormControl<number | null>;
529
+ rowHeight: FormControl<number | null>;
530
+ gap: FormControl<number | null>;
531
+ }>;
532
+ readonly contextControl: FormControl<string>;
533
+ readonly shellPresetControl: FormControl<string>;
534
+ readonly layoutPresetControl: FormControl<string>;
535
+ readonly themePresetControl: FormControl<string>;
536
+ readonly groupingControl: FormControl<string>;
537
+ readonly deviceLayoutsControl: FormControl<string>;
538
+ readonly stateValuesControl: FormControl<string>;
539
+ readonly groupingNodes: FormArray<GroupingNodeGroup>;
540
+ readonly schemaNodes: FormArray<SchemaNodeGroup>;
541
+ readonly derivedNodes: FormArray<DerivedNodeGroup>;
542
+ readonly deviceDesktopForm: FormGroup<{
543
+ orientation: FormControl<string>;
544
+ columns: FormControl<number | null>;
545
+ gap: FormControl<string>;
546
+ breakpointsJson: FormControl<string>;
547
+ groupingOverridesJson: FormControl<string>;
548
+ widgetOverridesJson: FormControl<string>;
549
+ }>;
550
+ readonly deviceTabletForm: FormGroup<{
551
+ orientation: FormControl<string>;
552
+ columns: FormControl<number | null>;
308
553
  gap: FormControl<string>;
309
- bpSm: FormControl<number>;
310
- bpMd: FormControl<number>;
311
- bpLg: FormControl<number>;
312
- bpXl: FormControl<number>;
554
+ breakpointsJson: FormControl<string>;
555
+ groupingOverridesJson: FormControl<string>;
556
+ widgetOverridesJson: FormControl<string>;
557
+ }>;
558
+ readonly deviceMobileForm: FormGroup<{
559
+ orientation: FormControl<string>;
560
+ columns: FormControl<number | null>;
561
+ gap: FormControl<string>;
562
+ breakpointsJson: FormControl<string>;
563
+ groupingOverridesJson: FormControl<string>;
564
+ widgetOverridesJson: FormControl<string>;
565
+ }>;
566
+ readonly contextError: i0.WritableSignal<string | null>;
567
+ readonly layoutError: i0.WritableSignal<string | null>;
568
+ readonly stateError: i0.WritableSignal<string | null>;
569
+ readonly activeTab: i0.WritableSignal<EditorTabId>;
570
+ readonly shellPresetEntries: Array<{
571
+ id: string;
572
+ label: string;
313
573
  }>;
314
- jsonControl: FormControl<string>;
315
- private readonly initialLayout;
574
+ private lastContext;
575
+ private lastGrouping;
576
+ private lastDeviceLayouts;
577
+ private lastStateValues;
316
578
  private readonly dirtySubject;
317
579
  private readonly validSubject;
318
580
  private readonly busySubject;
319
- isDirty$: rxjs.Observable<boolean>;
320
- isValid$: rxjs.Observable<boolean>;
321
- isBusy$: rxjs.Observable<boolean>;
322
581
  private snapshot;
323
- presetOptions: Array<{
324
- id: string;
325
- label: string;
326
- }>;
327
- private pagePreset;
328
- private currentFullConfig;
329
- private activeTab;
330
- constructor(data?: DynamicPageEditorInputs | null);
331
- onTabChange(index: number): void;
332
- getSettingsValue(): DynamicPageEditorResult;
333
- formatJson(): void;
334
- onSave(): DynamicPageEditorResult;
582
+ private readonly tabOrder;
583
+ private readonly i18n;
584
+ private readonly injectedData;
585
+ readonly isDirty$: rxjs.Observable<boolean>;
586
+ readonly isValid$: rxjs.Observable<boolean>;
587
+ readonly isBusy$: rxjs.Observable<boolean>;
588
+ protected readonly embeddedInSettingsPanel: boolean;
589
+ get selectedTabIndex(): number;
590
+ protected get hasPendingChanges(): boolean;
591
+ protected get isConfigurationValid(): boolean;
592
+ protected get validationStateLabel(): string;
593
+ protected get dirtyStateLabel(): string;
594
+ protected get selectedLayoutPresetLabel(): string;
595
+ protected get selectedThemePresetLabel(): string;
596
+ protected get selectedShellPresetLabel(): string;
597
+ protected get contextExample(): string;
598
+ protected get stateValuesExample(): string;
599
+ protected get layoutPresetHint(): string;
600
+ protected get themePresetHint(): string;
601
+ protected get shellPresetHint(): string;
602
+ protected get tabsJsonHint(): string;
603
+ protected get breakpointsHint(): string;
604
+ protected get groupingOverridesHint(): string;
605
+ protected get widgetOverridesHint(): string;
606
+ protected get schemaInitialHint(): string;
607
+ protected get templateJsonHint(): string;
608
+ protected get transformerOptionsHint(): string;
609
+ constructor();
610
+ protected tx(key: string, fallback: string): string;
611
+ addSchemaNode(seed?: {
612
+ path?: string;
613
+ config?: WidgetStateNode;
614
+ }): void;
615
+ removeSchemaNode(index: number): void;
616
+ addDerivedNode(seed?: {
617
+ path?: string;
618
+ config?: WidgetDerivedStateNode;
619
+ }): void;
620
+ removeDerivedNode(index: number): void;
621
+ addGroupingNode(seed?: WidgetPageGroupingDefinition): void;
622
+ removeGroupingNode(index: number): void;
623
+ setActiveTab(tab: EditorTabId): void;
624
+ onSelectedTabIndexChange(index: number): void;
625
+ apply(): void;
335
626
  reset(): void;
336
- private updateValidity;
337
- private updateStateFromForm;
338
- private applyLayoutToForm;
339
- private toggleGridControls;
340
- private syncJsonFromState;
341
- private extractPreset;
342
- private snapshotValue;
343
- private formatPresetLabel;
344
- static ɵfac: i0.ɵɵFactoryDeclaration<DynamicPageConfigEditorComponent, [{ optional: true; }]>;
345
- static ɵcmp: i0.ɵɵComponentDeclaration<DynamicPageConfigEditorComponent, "praxis-dynamic-page-config-editor", never, {}, {}, never, never, true, never>;
627
+ private replaceGroupingNodes;
628
+ private createGroupingNodeGroup;
629
+ private stringifyGroupingWidgetKeys;
630
+ private buildGrouping;
631
+ private hydrateDeviceLayoutControls;
632
+ private buildDeviceLayouts;
633
+ private createDeviceLayoutForm;
634
+ private patchDeviceLayoutForm;
635
+ private buildDeviceLayoutVariant;
636
+ private hydrateStateEditor;
637
+ private replaceSchemaNodes;
638
+ private replaceDerivedNodes;
639
+ private createSchemaNodeGroup;
640
+ private createDerivedNodeGroup;
641
+ private buildState;
642
+ private buildSchema;
643
+ private buildDerived;
644
+ private normalizeState;
645
+ getSettingsValue(): PageDefinition | null;
646
+ onSave(): PageDefinition | null;
647
+ private lookupPresetLabel;
648
+ private currentPageInput;
649
+ private extractShellPreset;
650
+ private buildCurrentPage;
651
+ private applyShellPresetToContext;
652
+ private refreshPanelState;
653
+ private parsePage;
654
+ private parseContext;
655
+ private parseGrouping;
656
+ private parseDeviceLayouts;
657
+ private parseJson;
658
+ private parseValueInput;
659
+ private describeValue;
660
+ private buildOperatorOptions;
661
+ private buildOptions;
662
+ private clone;
663
+ static ɵfac: i0.ɵɵFactoryDeclaration<PageConfigEditorComponent, never>;
664
+ static ɵcmp: i0.ɵɵComponentDeclaration<PageConfigEditorComponent, "praxis-page-config-editor", never, { "page": { "alias": "page"; "required": false; "isSignal": true; }; "identity": { "alias": "identity"; "required": false; "isSignal": true; }; "layoutCompatOptions": { "alias": "layoutCompatOptions"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
346
665
  }
347
666
 
348
667
  /**
349
- * Capabilities catalog for Dynamic Gridster Page (GridPageDefinition + inputs).
668
+ * Capabilities catalog for the canonical dynamic page builder/runtime.
350
669
  */
351
670
 
352
671
  declare module '@praxisui/core' {
@@ -368,70 +687,42 @@ interface CapabilityCatalog extends AiCapabilityCatalog {
368
687
  }
369
688
  declare const PAGE_BUILDER_AI_CAPABILITIES: CapabilityCatalog;
370
689
 
690
+ type LegacyLayoutOptions = {
691
+ cols?: number;
692
+ rowHeight?: number;
693
+ gap?: number;
694
+ };
695
+ type PageBuilderLayoutOptions = Partial<LegacyLayoutOptions>;
371
696
  type PageBuilderConfig = {
372
697
  page?: BuilderPageDefinition;
373
698
  context?: Record<string, unknown> | null;
374
699
  enableCustomization?: boolean;
375
700
  showSettingsButton?: boolean;
376
701
  strictValidation?: boolean;
377
- gridsterOptions?: Partial<GridsterConfig>;
702
+ layoutOptions?: PageBuilderLayoutOptions;
378
703
  pageIdentity?: PageIdentity;
379
704
  };
380
- interface PageBuilderHost {
381
- page?: BuilderPageDefinition | string;
382
- context?: Record<string, unknown> | null;
383
- enableCustomization: boolean;
384
- showSettingsButton: boolean;
385
- strictValidation: boolean;
386
- gridsterOptions?: Partial<GridsterConfig>;
387
- pageIdentity?: PageIdentity;
388
- applyConfigFromAdapter(config: PageBuilderConfig): void;
389
- }
390
- type BuilderPageDefinition = GridPageDefinition & {
705
+ type BuilderWidgetInstance = WidgetInstance;
706
+ type BuilderCanvasItem = {
707
+ col: number;
708
+ row: number;
709
+ colSpan: number;
710
+ rowSpan: number;
711
+ };
712
+ type BuilderCanvasLayout = {
713
+ mode: 'grid';
714
+ columns: number;
715
+ rowUnit?: string;
716
+ gap?: string;
717
+ autoRows?: 'fixed' | 'content';
718
+ items: Record<string, BuilderCanvasItem>;
719
+ };
720
+ type BuilderPageDefinition = Omit<WidgetPageDefinition, 'widgets'> & {
721
+ widgets: BuilderWidgetInstance[];
722
+ canvas?: BuilderCanvasLayout;
391
723
  state?: WidgetPageStateInput;
392
724
  connections?: WidgetConnection[];
393
725
  };
394
- type PatchResult = {
395
- success: boolean;
396
- warnings?: string[];
397
- error?: string;
398
- };
399
- declare class PageBuilderAiAdapter {
400
- private host;
401
- private registry?;
402
- componentName: string;
403
- componentId: string;
404
- componentType: string;
405
- constructor(host: PageBuilderHost, registry?: ComponentMetadataRegistry | undefined);
406
- getCurrentConfig(): PageBuilderConfig;
407
- getCapabilities(): AiCapability[];
408
- getRuntimeState(): Record<string, unknown>;
409
- createSnapshot(): PageBuilderConfig;
410
- restoreSnapshot(snapshot: PageBuilderConfig): Promise<void>;
411
- applyPatch(patch: Partial<PageBuilderConfig>, _intent?: string): Promise<PatchResult>;
412
- private applyConfig;
413
- private parsePage;
414
- private normalizePageForAi;
415
- private normalizeConfigForRuntime;
416
- private normalizePageForRuntime;
417
- private normalizePatch;
418
- private mergeWidgets;
419
- private mergeConnections;
420
- private ensureLayoutFromLegacy;
421
- private ensureLegacyLayout;
422
- private layoutFromLegacy;
423
- private getWidgetKey;
424
- private generateWidgetKey;
425
- private connectionKey;
426
- private gridsterFromPageOptions;
427
- private mergeRuntimeGridsterOptions;
428
- private pageOptionsFromGridster;
429
- private pickGridsterOptions;
430
- private buildComponentCatalog;
431
- private pickNumber;
432
- private coerceNumber;
433
- private clone;
434
- }
435
726
 
436
727
  declare function registerWidgetAiCatalog(widgetId: string, catalog: AiCapabilityCatalog): void;
437
728
  declare function registerWidgetAiCatalogs(entries: Record<string, AiCapabilityCatalog>): void;
@@ -450,179 +741,40 @@ declare const PAGE_BUILDER_WIDGET_AI_CATALOGS: InjectionToken<Record<string, AiC
450
741
 
451
742
  declare function providePageBuilderWidgetAiCatalogs(): Provider;
452
743
 
453
- interface GraphNode {
454
- id: string;
455
- label: string;
456
- icon?: string;
457
- type: string;
458
- parentId?: string | null;
459
- collapsed?: boolean;
460
- bounds: {
461
- x: number;
462
- y: number;
463
- width: number;
464
- height: number;
465
- };
466
- ports: GraphPort[];
467
- }
468
- interface GraphPort {
469
- id: string;
470
- label: string;
471
- kind: 'input' | 'output';
472
- /** For inputs that map into deep paths (e.g. Tabs internals) */
473
- path?: string;
474
- /** Optional description (from metadata) for tooltips */
475
- description?: string;
476
- anchor: {
477
- x: number;
478
- y: number;
479
- };
480
- }
481
- interface GraphEdgeMeta {
482
- map?: string;
483
- transform?: string;
484
- bindingOrder?: string[];
485
- routerMode?: 'auto' | 'elbow' | 'bezier' | 'straight';
486
- }
487
- interface GraphEdge {
488
- id: string;
489
- from: {
490
- nodeId: string;
491
- portId: string;
492
- };
493
- to: {
494
- nodeId: string;
495
- portId: string;
496
- };
497
- label?: string;
498
- meta?: GraphEdgeMeta;
499
- }
500
-
501
- type StatefulGridPageDefinition = GridPageDefinition & {
502
- state?: WidgetPageStateInput;
503
- };
504
- declare class GraphMapperService {
505
- private registry;
506
- constructor(registry: ComponentMetadataRegistry);
507
- private isWidgetSource;
508
- private isWidgetTarget;
509
- /** Build nodes and edges for a given page definition and widgets. */
510
- mapToGraph(page: StatefulGridPageDefinition | undefined, widgets: GridWidgetInstance[]): {
511
- nodes: GraphNode[];
512
- edges: GraphEdge[];
513
- };
514
- private ensureStateNode;
515
- private normalizeState;
516
- private ensurePort;
517
- /**
518
- * Parse dot-path for Tabs internals. Supported:
519
- * - inputs.config.tabs[<i>].widgets[<j>].inputs.<input>
520
- * - inputs.config.nav.links[<i>].widgets[<j>].inputs.<input>
521
- */
522
- parseTabsPath(path: string | undefined): {
523
- kind: 'group' | 'nav';
524
- index: number;
525
- widgetIndex: number;
526
- input: string;
527
- } | null;
528
- static ɵfac: i0.ɵɵFactoryDeclaration<GraphMapperService, never>;
529
- static ɵprov: i0.ɵɵInjectableDeclaration<GraphMapperService>;
530
- }
531
-
532
- type ItemWithKey = GridsterItem & {
533
- __key__: string;
534
- };
535
- declare class DynamicGridsterPageComponent implements OnChanges, PageBuilderHost {
536
- private conn;
537
- private router;
538
- private host;
744
+ declare class DynamicPageBuilderComponent implements OnChanges {
539
745
  private dialog;
540
- private graphMapper;
541
- private registry;
542
- private storage;
543
- private componentKeys;
544
- private tableConfigEditor;
545
- private stepperConfigEditor;
546
746
  private settingsPanel;
547
- private route;
548
- page?: GridPageDefinition | string;
549
- context?: Record<string, any> | null;
747
+ runtime?: DynamicWidgetPageComponent;
748
+ page?: WidgetPageDefinition | string;
749
+ context?: Record<string, unknown> | null;
550
750
  strictValidation: boolean;
551
- gridsterOptions?: Partial<GridsterConfig>;
552
- /** Shows settings button and enables in-place editing affordances */
553
751
  enableCustomization: boolean;
554
- /** When true, shows small floating settings fab; if false, rely on bottom toolbar */
555
752
  showSettingsButton: boolean;
556
- /** Optional identity; if not provided, will derive routePath from current Router URL */
557
753
  pageIdentity?: PageIdentity;
558
- /** Optional instance key for pages rendered multiple times */
559
754
  componentInstanceId?: string;
560
- layoutChange: EventEmitter<GridWidgetInstance[]>;
561
- pageChange: EventEmitter<GridPageDefinition>;
562
- mergedContext: Record<string, any>;
563
- private selectedKey;
564
- private widgets;
565
- private readonly globalActions;
566
- items: i0.WritableSignal<ItemWithKey[]>;
567
- interacting: boolean;
568
- overlayEnabled: boolean;
569
- private appliedPersisted;
570
- aiAdapter: PageBuilderAiAdapter;
571
- options: GridsterConfig;
572
- trackItem: (_: number, it: ItemWithKey) => string;
573
- constructor(conn: ConnectionManagerService, router: Router, host: ElementRef<HTMLElement>, dialog: MatDialog, graphMapper: GraphMapperService, registry: ComponentMetadataRegistry, storage: AsyncConfigStorage, componentKeys: ComponentKeyService, tableConfigEditor: any, stepperConfigEditor: any, settingsPanel: SettingsPanelBridge | null, route: ActivatedRoute | null);
574
- applyConfigFromAdapter(next: PageBuilderConfig): void;
755
+ pageEditorComponent: Type<any> | undefined;
756
+ pageChange: EventEmitter<WidgetPageDefinition>;
757
+ readonly currentPage: i0.WritableSignal<WidgetPageDefinition>;
758
+ private previewMode;
759
+ constructor(dialog: MatDialog, settingsPanel: SettingsPanelBridge | null);
575
760
  ngOnChanges(changes: SimpleChanges): void;
576
- private parsePage;
577
- private gridsterFromPageOptions;
578
- private enrichWithInheritedInputs;
579
- private applyWidgetInputs;
580
- private ensureComponentInstanceId;
581
- private widgetToItem;
582
- computeTileDomId(key: string): string;
583
- isSelected(key: string): boolean;
584
- getWidgetType(key: string): string | undefined;
585
- getWidgetDef(key: string): any;
586
- getWidgetShell(key: string): any;
587
- onTileClick(key: string, ev: MouseEvent): void;
588
- onItemChanged(item: GridsterItem): void;
761
+ showSettings(): boolean;
762
+ onRuntimePageChange(next: WidgetPageDefinition): void;
589
763
  togglePreview(): void;
590
- confirmRemoveWidget(key: string): void;
591
- removeWidget(key: string): void;
592
764
  onAddComponent(): void;
593
765
  addWidget(type: string): void;
594
- createWidgetKey(type: string): string;
595
- openWidgetSettings(key: string): void;
596
- openWidgetShellSettings(key: string): void;
597
766
  openConnectionsGraph(): void;
598
767
  openConnectionsBuilder(): void;
599
- openConnectionsEditor(): Promise<void>;
768
+ openConnectionsEditor(): void;
600
769
  openPageSettings(): void;
601
- private derivePageIdentity;
602
- savePage(): void;
603
- private applyPage;
604
- private loadPersistedPage;
605
- onWidgetEvent(fromKey: string, evt: {
606
- output?: string;
607
- payload?: any;
608
- }): void;
609
- onShellAction(fromKey: string, evt: WidgetShellActionEvent): void;
610
- private handleSetInputCommand;
611
- private maybeExecuteMappedAction;
612
- private maybeExecuteGlobalCommand;
613
- private resolveActionPayload;
614
- private resolveTemplate;
615
- private lookup;
616
- private applyWidgetShell;
617
- private applyPageShellPreset;
618
- private applyEditShellActions;
619
- showSettings(): boolean;
620
- private storageKey;
621
- private componentKeyId;
622
- private buildPageScopeId;
623
- static ɵfac: i0.ɵɵFactoryDeclaration<DynamicGridsterPageComponent, [null, null, null, null, null, null, null, null, { optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
624
- static ɵcmp: i0.ɵɵComponentDeclaration<DynamicGridsterPageComponent, "praxis-dynamic-gridster-page", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "gridsterOptions": { "alias": "gridsterOptions"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; }, { "layoutChange": "layoutChange"; "pageChange": "pageChange"; }, never, never, true, never>;
770
+ saveCurrentPage(): void;
771
+ private parsePage;
772
+ private clonePage;
773
+ private buildAuthoringReadPage;
774
+ private buildAuthoringReadWidgets;
775
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicPageBuilderComponent, [null, { optional: true; }]>;
776
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicPageBuilderComponent, "praxis-dynamic-page-builder", never, { "page": { "alias": "page"; "required": false; }; "context": { "alias": "context"; "required": false; }; "strictValidation": { "alias": "strictValidation"; "required": false; }; "enableCustomization": { "alias": "enableCustomization"; "required": false; }; "showSettingsButton": { "alias": "showSettingsButton"; "required": false; }; "pageIdentity": { "alias": "pageIdentity"; "required": false; }; "componentInstanceId": { "alias": "componentInstanceId"; "required": false; }; "pageEditorComponent": { "alias": "pageEditorComponent"; "required": false; }; }, { "pageChange": "pageChange"; }, never, never, true, never>;
625
777
  }
626
778
 
627
- export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionBuilderComponent, DynamicGridsterPageComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, TileToolbarComponent, WidgetShellEditorComponent, clearWidgetAiCatalogs, getPageAiCatalog, getWidgetAiCapabilities, providePageBuilderWidgetAiCatalogs, registerWidgetAiCatalog, registerWidgetAiCatalogs };
779
+ export { ComponentPaletteDialogComponent, ConfirmDialogComponent, ConnectionBuilderComponent, DynamicPageBuilderComponent, DynamicPageConfigEditorComponent, FloatingToolbarComponent, PAGE_BUILDER_AI_CAPABILITIES, PAGE_BUILDER_WIDGET_AI_CATALOGS, PLACEHOLDER, PageConfigEditorComponent, TileToolbarComponent, WidgetShellEditorComponent, clearWidgetAiCatalogs, getPageAiCatalog, getWidgetAiCapabilities, providePageBuilderWidgetAiCatalogs, registerWidgetAiCatalog, registerWidgetAiCatalogs };
628
780
  export type { Capability, CapabilityCatalog, CapabilityCategory, ComponentPaletteData, ConfirmDialogData, ValueKind };