@praxisui/page-builder 10.0.0-rc.11 → 10.0.0-rc.13
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/README.md
CHANGED
|
@@ -284,6 +284,8 @@ source fails closed.
|
|
|
284
284
|
- `enableAgenticAuthoring`, `agenticAuthoringProvider`, `agenticAuthoringModel`, `agenticAuthoringScope`
|
|
285
285
|
- `agenticAuthoringIncludeLlmDiagnostics`, `agenticAuthoringEnableStreaming`, `agenticAuthoringContextHints`
|
|
286
286
|
- `showPageLifecycleActions`, `canDeleteSavedPage`, `pageLifecycleBusy`
|
|
287
|
+
- `showGovernanceToolbar`: boolean flag to render a built-in top governance toolbar (with canvas title, layout persistence status badge, last saved time, factory reset button, and customization toggle), enabling 100% declarative page hosting without imperative toolbar boilerplate
|
|
288
|
+
- `governanceToolbarTitle`: optional string providing the canvas or dashboard title displayed in the governance toolbar
|
|
287
289
|
|
|
288
290
|
All omitted `authoringCapabilities` entries remain enabled for backward compatibility. The grant is
|
|
289
291
|
never written to `WidgetPageDefinition` and does not authorize AI operations; manifests, backend
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-14T09:51:43.880Z",
|
|
4
4
|
"packageName": "@praxisui/page-builder",
|
|
5
|
-
"packageVersion": "10.0.0-rc.
|
|
5
|
+
"packageVersion": "10.0.0-rc.13",
|
|
6
6
|
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
7
|
"sourceRegistryVersion": "1.0.0",
|
|
8
8
|
"componentCount": 1,
|
|
@@ -886,6 +886,23 @@ const PRAXIS_PAGE_BUILDER_EN_US = {
|
|
|
886
886
|
'praxis.pageBuilder.palette.badges.legacy.description': 'Retained for compatibility; avoid as the default for new canonical authoring.',
|
|
887
887
|
'praxis.pageBuilder.palette.badges.hostDemo.label': 'Host/demo',
|
|
888
888
|
'praxis.pageBuilder.palette.badges.hostDemo.description': 'Depends on host/demo semantics and may need governance before public reuse.',
|
|
889
|
+
'praxis.pageBuilder.governance.loading': 'Loading layout…',
|
|
890
|
+
'praxis.pageBuilder.governance.saving': 'Saving layout…',
|
|
891
|
+
'praxis.pageBuilder.governance.resetting': 'Restoring layout…',
|
|
892
|
+
'praxis.pageBuilder.governance.conflict': 'Save conflict. Reopen the page to load current version.',
|
|
893
|
+
'praxis.pageBuilder.governance.error': 'Could not confirm layout persistence.',
|
|
894
|
+
'praxis.pageBuilder.governance.customized': 'Custom layout saved',
|
|
895
|
+
'praxis.pageBuilder.governance.default': 'Default layout',
|
|
896
|
+
'praxis.pageBuilder.governance.defaultTitle': 'Governed Canvas',
|
|
897
|
+
'praxis.pageBuilder.governance.badge': 'Praxis Page Builder · Governed Canvas',
|
|
898
|
+
'praxis.pageBuilder.governance.savedAt': 'saved at',
|
|
899
|
+
'praxis.pageBuilder.governance.retry': 'Retry save',
|
|
900
|
+
'praxis.pageBuilder.governance.reload': 'Discard changes and reload',
|
|
901
|
+
'praxis.pageBuilder.governance.resetTitle': 'Reset to factory default layout and discard customizations',
|
|
902
|
+
'praxis.pageBuilder.governance.reset': 'Restore Factory Default',
|
|
903
|
+
'praxis.pageBuilder.governance.toggleTitle': 'Toggle layout and widget customization mode',
|
|
904
|
+
'praxis.pageBuilder.governance.finish': 'Finish Editing',
|
|
905
|
+
'praxis.pageBuilder.governance.customize': 'Customize Layout',
|
|
889
906
|
'praxis.pageBuilder.builderMode.editing': 'Editing',
|
|
890
907
|
'praxis.pageBuilder.builderMode.connections': 'Connections',
|
|
891
908
|
'praxis.pageBuilder.builderMode.ai': 'AI',
|
|
@@ -1964,6 +1981,23 @@ const PRAXIS_PAGE_BUILDER_PT_BR = {
|
|
|
1964
1981
|
'praxis.pageBuilder.palette.badges.legacy.description': 'Mantido por compatibilidade; evite como padrão em nova autoria canônica.',
|
|
1965
1982
|
'praxis.pageBuilder.palette.badges.hostDemo.label': 'Host/demo',
|
|
1966
1983
|
'praxis.pageBuilder.palette.badges.hostDemo.description': 'Depende de semântica do host/demo e pode exigir governança antes do reúso público.',
|
|
1984
|
+
'praxis.pageBuilder.governance.loading': 'Carregando layout…',
|
|
1985
|
+
'praxis.pageBuilder.governance.saving': 'Salvando layout…',
|
|
1986
|
+
'praxis.pageBuilder.governance.resetting': 'Restaurando layout…',
|
|
1987
|
+
'praxis.pageBuilder.governance.conflict': 'Conflito ao salvar. Reabra a página para carregar a versão atual.',
|
|
1988
|
+
'praxis.pageBuilder.governance.error': 'Não foi possível confirmar a persistência do layout.',
|
|
1989
|
+
'praxis.pageBuilder.governance.customized': 'Layout personalizado salvo',
|
|
1990
|
+
'praxis.pageBuilder.governance.default': 'Layout padrão',
|
|
1991
|
+
'praxis.pageBuilder.governance.defaultTitle': 'Canvas Governado',
|
|
1992
|
+
'praxis.pageBuilder.governance.badge': 'Praxis Page Builder · Canvas Governado',
|
|
1993
|
+
'praxis.pageBuilder.governance.savedAt': 'salvo às',
|
|
1994
|
+
'praxis.pageBuilder.governance.retry': 'Tentar salvar novamente',
|
|
1995
|
+
'praxis.pageBuilder.governance.reload': 'Descartar alterações e recarregar',
|
|
1996
|
+
'praxis.pageBuilder.governance.resetTitle': 'Reverter para o layout padrão de fábrica e descartar customizações desta persona',
|
|
1997
|
+
'praxis.pageBuilder.governance.reset': 'Restaurar Fábrica',
|
|
1998
|
+
'praxis.pageBuilder.governance.toggleTitle': 'Alternar modo de customização de layout e widgets',
|
|
1999
|
+
'praxis.pageBuilder.governance.finish': 'Concluir Edição',
|
|
2000
|
+
'praxis.pageBuilder.governance.customize': 'Customizar Layout',
|
|
1967
2001
|
'praxis.pageBuilder.builderMode.editing': 'Edição',
|
|
1968
2002
|
'praxis.pageBuilder.builderMode.connections': 'Conexões',
|
|
1969
2003
|
'praxis.pageBuilder.builderMode.ai': 'IA',
|
|
@@ -5463,10 +5497,52 @@ function deriveConnectionEditorGraph(page, options = {}) {
|
|
|
5463
5497
|
};
|
|
5464
5498
|
});
|
|
5465
5499
|
const statePaths = collectStatePaths(resolveStateValues(page?.state));
|
|
5500
|
+
const derivedStatePaths = Object.keys(page?.state?.derived ?? {})
|
|
5501
|
+
.map((path) => path.trim())
|
|
5502
|
+
.filter(Boolean);
|
|
5466
5503
|
const declaredStatePaths = new Set([
|
|
5467
|
-
...statePaths.map(path => `values:${path}`),
|
|
5468
|
-
...
|
|
5504
|
+
...statePaths.map((path) => `values:${path}`),
|
|
5505
|
+
...derivedStatePaths.map((path) => `derived:${path}`),
|
|
5506
|
+
...derivedStatePaths.map((path) => `values:${path}`),
|
|
5469
5507
|
]);
|
|
5508
|
+
for (const ds of page?.dataSources ?? []) {
|
|
5509
|
+
const baseTargetPath = (ds.targetStatePath || ds.id || '').trim();
|
|
5510
|
+
if (!baseTargetPath)
|
|
5511
|
+
continue;
|
|
5512
|
+
const candidatePaths = [baseTargetPath];
|
|
5513
|
+
const transform = ds.transform;
|
|
5514
|
+
if (transform && typeof transform === 'object' && 'kind' in transform) {
|
|
5515
|
+
const kind = transform['kind'];
|
|
5516
|
+
const totalField = transform['totalField'];
|
|
5517
|
+
if (kind === 'group-by-map' && typeof totalField === 'string' && totalField.trim()) {
|
|
5518
|
+
candidatePaths.push(`${baseTargetPath}.${totalField.trim()}`);
|
|
5519
|
+
}
|
|
5520
|
+
const mappings = transform['mappings'];
|
|
5521
|
+
if ((kind === 'group-by-map' || kind === 'timeseries-last') &&
|
|
5522
|
+
mappings &&
|
|
5523
|
+
typeof mappings === 'object' &&
|
|
5524
|
+
!Array.isArray(mappings)) {
|
|
5525
|
+
for (const mappedField of Object.values(mappings)) {
|
|
5526
|
+
if (typeof mappedField === 'string' && mappedField.trim()) {
|
|
5527
|
+
candidatePaths.push(`${baseTargetPath}.${mappedField.trim()}`);
|
|
5528
|
+
}
|
|
5529
|
+
}
|
|
5530
|
+
}
|
|
5531
|
+
}
|
|
5532
|
+
if (ds.fallbackValue && typeof ds.fallbackValue === 'object' && !Array.isArray(ds.fallbackValue)) {
|
|
5533
|
+
for (const subPath of collectStatePaths(ds.fallbackValue, baseTargetPath)) {
|
|
5534
|
+
candidatePaths.push(subPath);
|
|
5535
|
+
}
|
|
5536
|
+
}
|
|
5537
|
+
for (const dsPath of candidatePaths) {
|
|
5538
|
+
declaredStatePaths.add(`values:${dsPath}`);
|
|
5539
|
+
if (!statePaths.includes(dsPath)) {
|
|
5540
|
+
statePaths.push(dsPath);
|
|
5541
|
+
}
|
|
5542
|
+
}
|
|
5543
|
+
}
|
|
5544
|
+
const valuePorts = (statePaths.length || derivedStatePaths.length ? statePaths : [fallbackStatePath]).map((path) => statePort(path));
|
|
5545
|
+
const derivedPorts = derivedStatePaths.map((path) => statePort(path, { path, layer: 'derived', writable: false }));
|
|
5470
5546
|
const stateNode = {
|
|
5471
5547
|
id: CONNECTION_EDITOR_STATE_NODE_ID,
|
|
5472
5548
|
title: stateNodeTitle,
|
|
@@ -5474,9 +5550,9 @@ function deriveConnectionEditorGraph(page, options = {}) {
|
|
|
5474
5550
|
icon: 'account_tree',
|
|
5475
5551
|
x: center.x,
|
|
5476
5552
|
y: center.y,
|
|
5477
|
-
outputs:
|
|
5553
|
+
outputs: [...valuePorts, ...derivedPorts],
|
|
5478
5554
|
inputs: [],
|
|
5479
|
-
states:
|
|
5555
|
+
states: [...valuePorts, ...derivedPorts],
|
|
5480
5556
|
};
|
|
5481
5557
|
const actionIds = Array.from(new Set([
|
|
5482
5558
|
...(options.globalActionIds ?? []),
|
|
@@ -14515,6 +14591,7 @@ class PageConfigEditorComponent {
|
|
|
14515
14591
|
groupingControl = new FormControl('', { nonNullable: true });
|
|
14516
14592
|
deviceLayoutsControl = new FormControl('', { nonNullable: true });
|
|
14517
14593
|
stateValuesControl = new FormControl('', { nonNullable: true });
|
|
14594
|
+
dataSourcesControl = new FormControl('', { nonNullable: true });
|
|
14518
14595
|
groupingNodes = new FormArray([]);
|
|
14519
14596
|
schemaNodes = new FormArray([]);
|
|
14520
14597
|
derivedNodes = new FormArray([]);
|
|
@@ -14530,6 +14607,7 @@ class PageConfigEditorComponent {
|
|
|
14530
14607
|
lastGrouping = '';
|
|
14531
14608
|
lastDeviceLayouts = '';
|
|
14532
14609
|
lastStateValues = '';
|
|
14610
|
+
lastDataSources = '';
|
|
14533
14611
|
dirtySubject = new BehaviorSubject(false);
|
|
14534
14612
|
validSubject = new BehaviorSubject(true);
|
|
14535
14613
|
busySubject = new BehaviorSubject(false);
|
|
@@ -14577,6 +14655,9 @@ class PageConfigEditorComponent {
|
|
|
14577
14655
|
get stateValuesExample() {
|
|
14578
14656
|
return this.tx('editor.hints.stateValuesExample', 'e.g.: {"query":{"filter":{"year":2026}},"selection":{"department":"Finance"}}');
|
|
14579
14657
|
}
|
|
14658
|
+
get dataSourcesExample() {
|
|
14659
|
+
return this.tx('editor.hints.dataSourcesExample', 'e.g.: [{"id":"employees","kind":"remote-resource","resourcePath":"funcionarios","targetStatePath":"raw.employees"}]');
|
|
14660
|
+
}
|
|
14580
14661
|
get layoutPresetHint() {
|
|
14581
14662
|
return this.tx('editor.hints.layoutPreset', 'Choose an initial structural arrangement for the page. Then you can refine grouping and spans without losing layout intent.');
|
|
14582
14663
|
}
|
|
@@ -14641,6 +14722,7 @@ class PageConfigEditorComponent {
|
|
|
14641
14722
|
this.layoutError.set(null);
|
|
14642
14723
|
}
|
|
14643
14724
|
this.hydrateStateEditor(next?.state);
|
|
14725
|
+
this.hydrateDataSourcesEditor(next?.dataSources);
|
|
14644
14726
|
this.refreshPanelState(true);
|
|
14645
14727
|
});
|
|
14646
14728
|
this.paddingInlineControl.valueChanges
|
|
@@ -14703,6 +14785,12 @@ class PageConfigEditorComponent {
|
|
|
14703
14785
|
this.stateError.set(null);
|
|
14704
14786
|
this.refreshPanelState();
|
|
14705
14787
|
});
|
|
14788
|
+
this.dataSourcesControl.valueChanges
|
|
14789
|
+
.pipe(takeUntilDestroyed())
|
|
14790
|
+
.subscribe(() => {
|
|
14791
|
+
this.stateError.set(null);
|
|
14792
|
+
this.refreshPanelState();
|
|
14793
|
+
});
|
|
14706
14794
|
this.schemaNodes.valueChanges
|
|
14707
14795
|
.pipe(takeUntilDestroyed())
|
|
14708
14796
|
.subscribe(() => {
|
|
@@ -14782,6 +14870,7 @@ class PageConfigEditorComponent {
|
|
|
14782
14870
|
this.hydrateDeviceLayoutControls(next?.deviceLayouts);
|
|
14783
14871
|
this.layoutError.set(null);
|
|
14784
14872
|
this.hydrateStateEditor(next?.state);
|
|
14873
|
+
this.hydrateDataSourcesEditor(next?.dataSources);
|
|
14785
14874
|
this.refreshPanelState(true);
|
|
14786
14875
|
}
|
|
14787
14876
|
replaceGroupingNodes(grouping) {
|
|
@@ -14959,6 +15048,32 @@ class PageConfigEditorComponent {
|
|
|
14959
15048
|
this.replaceSchemaNodes(normalized.schema);
|
|
14960
15049
|
this.replaceDerivedNodes(normalized.derived);
|
|
14961
15050
|
}
|
|
15051
|
+
hydrateDataSourcesEditor(dataSources) {
|
|
15052
|
+
const hasEntries = Array.isArray(dataSources)
|
|
15053
|
+
? dataSources.length > 0
|
|
15054
|
+
: !!(dataSources && Object.keys(dataSources).length);
|
|
15055
|
+
const nextJson = hasEntries
|
|
15056
|
+
? JSON.stringify(dataSources, null, 2)
|
|
15057
|
+
: '';
|
|
15058
|
+
if (nextJson !== this.lastDataSources) {
|
|
15059
|
+
this.lastDataSources = nextJson;
|
|
15060
|
+
this.dataSourcesControl.setValue(nextJson, { emitEvent: false });
|
|
15061
|
+
this.stateError.set(null);
|
|
15062
|
+
}
|
|
15063
|
+
}
|
|
15064
|
+
buildDataSources() {
|
|
15065
|
+
const raw = this.dataSourcesControl.value.trim();
|
|
15066
|
+
if (!raw)
|
|
15067
|
+
return undefined;
|
|
15068
|
+
const parsed = this.parseJson(raw, {});
|
|
15069
|
+
if (parsed === null || typeof parsed !== 'object') {
|
|
15070
|
+
return null;
|
|
15071
|
+
}
|
|
15072
|
+
if (Array.isArray(parsed)) {
|
|
15073
|
+
return parsed.length ? parsed : undefined;
|
|
15074
|
+
}
|
|
15075
|
+
return Object.keys(parsed).length ? parsed : undefined;
|
|
15076
|
+
}
|
|
14962
15077
|
replaceSchemaNodes(schema) {
|
|
14963
15078
|
this.schemaNodes.clear({ emitEvent: false });
|
|
14964
15079
|
for (const [path, config] of Object.entries(schema || {})) {
|
|
@@ -14987,7 +15102,13 @@ class PageConfigEditorComponent {
|
|
|
14987
15102
|
}
|
|
14988
15103
|
createDerivedNodeGroup(seed) {
|
|
14989
15104
|
const config = seed?.config;
|
|
14990
|
-
const
|
|
15105
|
+
const isDirectJsonLogic = !!config
|
|
15106
|
+
&& typeof config === 'object'
|
|
15107
|
+
&& !Array.isArray(config)
|
|
15108
|
+
&& !('compute' in config);
|
|
15109
|
+
const compute = isDirectJsonLogic
|
|
15110
|
+
? { kind: 'json-logic', expression: config }
|
|
15111
|
+
: config?.compute;
|
|
14991
15112
|
const normalizedComputeKind = compute?.kind === 'operator' && compute.operator === 'template'
|
|
14992
15113
|
? 'template'
|
|
14993
15114
|
: compute?.kind || 'operator';
|
|
@@ -15008,7 +15129,7 @@ class PageConfigEditorComponent {
|
|
|
15008
15129
|
const templateValueConfig = this.describeValue(templateValue);
|
|
15009
15130
|
return new FormGroup({
|
|
15010
15131
|
path: new FormControl(seed?.path || '', { nonNullable: true, validators: [Validators.required] }),
|
|
15011
|
-
dependsOn: new FormControl((config?.dependsOn
|
|
15132
|
+
dependsOn: new FormControl((!isDirectJsonLogic && Array.isArray(config?.dependsOn) ? config.dependsOn : []).join(', '), { nonNullable: true }),
|
|
15012
15133
|
computeKind: new FormControl(normalizedComputeKind, { nonNullable: true }),
|
|
15013
15134
|
operator: new FormControl(compute?.kind === 'operator' ? compute.operator || 'merge-objects' : 'merge-objects', {
|
|
15014
15135
|
nonNullable: true,
|
|
@@ -15025,7 +15146,7 @@ class PageConfigEditorComponent {
|
|
|
15025
15146
|
templateMode: new FormControl(templateValueConfig.mode, { nonNullable: true }),
|
|
15026
15147
|
templateJson: new FormControl(templateValueConfig.json, { nonNullable: true }),
|
|
15027
15148
|
templateScalar: new FormControl(templateValueConfig.scalar, { nonNullable: true }),
|
|
15028
|
-
description: new FormControl(config?.description
|
|
15149
|
+
description: new FormControl(!isDirectJsonLogic && config?.description ? config.description : '', { nonNullable: true }),
|
|
15029
15150
|
});
|
|
15030
15151
|
}
|
|
15031
15152
|
buildState() {
|
|
@@ -15175,6 +15296,7 @@ class PageConfigEditorComponent {
|
|
|
15175
15296
|
const grouping = this.buildGrouping();
|
|
15176
15297
|
const deviceLayouts = this.buildDeviceLayouts();
|
|
15177
15298
|
const state = this.buildState();
|
|
15299
|
+
const dataSources = this.buildDataSources();
|
|
15178
15300
|
if (context === null) {
|
|
15179
15301
|
if (reportErrors) {
|
|
15180
15302
|
this.contextError.set(this.tx('editor.errors.invalidJson', 'Invalid JSON'));
|
|
@@ -15189,7 +15311,7 @@ class PageConfigEditorComponent {
|
|
|
15189
15311
|
}
|
|
15190
15312
|
return null;
|
|
15191
15313
|
}
|
|
15192
|
-
if (state === null) {
|
|
15314
|
+
if (state === null || dataSources === null) {
|
|
15193
15315
|
if (reportErrors) {
|
|
15194
15316
|
this.stateError.set(this.tx('editor.errors.invalidJson', 'Invalid JSON'));
|
|
15195
15317
|
this.activeTab.set('state');
|
|
@@ -15208,6 +15330,7 @@ class PageConfigEditorComponent {
|
|
|
15208
15330
|
deviceLayouts: deviceLayouts || undefined,
|
|
15209
15331
|
context: nextContext,
|
|
15210
15332
|
state: state || undefined,
|
|
15333
|
+
dataSources: dataSources || undefined,
|
|
15211
15334
|
};
|
|
15212
15335
|
}
|
|
15213
15336
|
applyShellPresetToContext(context, shellPreset) {
|
|
@@ -15933,6 +16056,23 @@ class PageConfigEditorComponent {
|
|
|
15933
16056
|
}
|
|
15934
16057
|
</div>
|
|
15935
16058
|
</div>
|
|
16059
|
+
<div class="state-card">
|
|
16060
|
+
<div class="state-card-head">
|
|
16061
|
+
<div>
|
|
16062
|
+
<div class="state-card-title">{{ tx('editor.state.dataSourcesTitle', 'Declarative Data Sources (JSON)') }}</div>
|
|
16063
|
+
<div class="state-card-copy">{{ tx('editor.state.dataSourcesCopy', 'Bind HTTP or resource endpoints directly into page state paths with reactive parameters.') }}</div>
|
|
16064
|
+
</div>
|
|
16065
|
+
</div>
|
|
16066
|
+
<mat-form-field appearance="outline" class="page-context">
|
|
16067
|
+
<mat-label>{{ tx('editor.state.dataSourcesJson', 'page.dataSources (JSON)') }}</mat-label>
|
|
16068
|
+
<textarea
|
|
16069
|
+
matInput
|
|
16070
|
+
rows="6"
|
|
16071
|
+
[formControl]="dataSourcesControl"
|
|
16072
|
+
[placeholder]="dataSourcesExample"
|
|
16073
|
+
></textarea>
|
|
16074
|
+
</mat-form-field>
|
|
16075
|
+
</div>
|
|
15936
16076
|
</div>
|
|
15937
16077
|
@if (stateError()) {
|
|
15938
16078
|
<div class="page-error" role="alert">{{ stateError() }}</div>
|
|
@@ -16532,6 +16672,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16532
16672
|
}
|
|
16533
16673
|
</div>
|
|
16534
16674
|
</div>
|
|
16675
|
+
<div class="state-card">
|
|
16676
|
+
<div class="state-card-head">
|
|
16677
|
+
<div>
|
|
16678
|
+
<div class="state-card-title">{{ tx('editor.state.dataSourcesTitle', 'Declarative Data Sources (JSON)') }}</div>
|
|
16679
|
+
<div class="state-card-copy">{{ tx('editor.state.dataSourcesCopy', 'Bind HTTP or resource endpoints directly into page state paths with reactive parameters.') }}</div>
|
|
16680
|
+
</div>
|
|
16681
|
+
</div>
|
|
16682
|
+
<mat-form-field appearance="outline" class="page-context">
|
|
16683
|
+
<mat-label>{{ tx('editor.state.dataSourcesJson', 'page.dataSources (JSON)') }}</mat-label>
|
|
16684
|
+
<textarea
|
|
16685
|
+
matInput
|
|
16686
|
+
rows="6"
|
|
16687
|
+
[formControl]="dataSourcesControl"
|
|
16688
|
+
[placeholder]="dataSourcesExample"
|
|
16689
|
+
></textarea>
|
|
16690
|
+
</mat-form-field>
|
|
16691
|
+
</div>
|
|
16535
16692
|
</div>
|
|
16536
16693
|
@if (stateError()) {
|
|
16537
16694
|
<div class="page-error" role="alert">{{ stateError() }}</div>
|
|
@@ -26056,6 +26213,8 @@ class DynamicPageBuilderComponent {
|
|
|
26056
26213
|
enableCustomization = false;
|
|
26057
26214
|
authoringCapabilities;
|
|
26058
26215
|
showSettingsButton = true;
|
|
26216
|
+
showGovernanceToolbar = false;
|
|
26217
|
+
governanceToolbarTitle;
|
|
26059
26218
|
pageIdentity;
|
|
26060
26219
|
componentInstanceId;
|
|
26061
26220
|
pageEditorComponent = DynamicPageConfigEditorComponent;
|
|
@@ -26090,7 +26249,29 @@ class DynamicPageBuilderComponent {
|
|
|
26090
26249
|
agenticAuthoringSharedRuleHandoff = new EventEmitter();
|
|
26091
26250
|
pageRestart = new EventEmitter();
|
|
26092
26251
|
savedPageDeleteRequested = new EventEmitter();
|
|
26252
|
+
customizationChange = new EventEmitter();
|
|
26093
26253
|
currentPage = signal({ widgets: [] }, ...(ngDevMode ? [{ debugName: "currentPage" }] : /* istanbul ignore next */ []));
|
|
26254
|
+
isCustomizing = signal(false, ...(ngDevMode ? [{ debugName: "isCustomizing" }] : /* istanbul ignore next */ []));
|
|
26255
|
+
governancePersistence = signal({ status: 'idle', customized: false }, ...(ngDevMode ? [{ debugName: "governancePersistence" }] : /* istanbul ignore next */ []));
|
|
26256
|
+
isLayoutCustomized = computed(() => this.governancePersistence().customized, ...(ngDevMode ? [{ debugName: "isLayoutCustomized" }] : /* istanbul ignore next */ []));
|
|
26257
|
+
isGovernanceBusy = computed(() => ['loading', 'saving', 'resetting'].includes(this.governancePersistence().status), ...(ngDevMode ? [{ debugName: "isGovernanceBusy" }] : /* istanbul ignore next */ []));
|
|
26258
|
+
governancePersistenceLabel = computed(() => {
|
|
26259
|
+
switch (this.governancePersistence().status) {
|
|
26260
|
+
case 'loading': return this.tx('governance.loading', 'Carregando layout…');
|
|
26261
|
+
case 'saving': return this.tx('governance.saving', 'Salvando layout…');
|
|
26262
|
+
case 'resetting': return this.tx('governance.resetting', 'Restaurando layout…');
|
|
26263
|
+
case 'error': return this.governancePersistence().errorKind === 'conflict'
|
|
26264
|
+
? this.tx('governance.conflict', 'Conflito ao salvar. Reabra a página para carregar a versão atual.')
|
|
26265
|
+
: this.tx('governance.error', 'Não foi possível confirmar a persistência do layout.');
|
|
26266
|
+
default: return this.isLayoutCustomized()
|
|
26267
|
+
? this.tx('governance.customized', 'Layout personalizado salvo')
|
|
26268
|
+
: this.tx('governance.default', 'Layout padrão');
|
|
26269
|
+
}
|
|
26270
|
+
}, ...(ngDevMode ? [{ debugName: "governancePersistenceLabel" }] : /* istanbul ignore next */ []));
|
|
26271
|
+
governanceLastSavedAt = computed(() => {
|
|
26272
|
+
const saved = this.governancePersistence().savedAt;
|
|
26273
|
+
return saved ? new Date(saved).toLocaleTimeString('pt-BR') : null;
|
|
26274
|
+
}, ...(ngDevMode ? [{ debugName: "governanceLastSavedAt" }] : /* istanbul ignore next */ []));
|
|
26094
26275
|
hasPageWidgets = computed(() => (this.currentPage().widgets || []).length > 0, ...(ngDevMode ? [{ debugName: "hasPageWidgets" }] : /* istanbul ignore next */ []));
|
|
26095
26276
|
hasRecommendedConnectionSuggestion = computed(() => deriveConnectionEditorSuggestions(deriveConnectionEditorGraph(this.currentPage()), 5)
|
|
26096
26277
|
.some((suggestion) => suggestion.reason === 'row-selection-to-id'), ...(ngDevMode ? [{ debugName: "hasRecommendedConnectionSuggestion" }] : /* istanbul ignore next */ []));
|
|
@@ -26235,6 +26416,11 @@ class DynamicPageBuilderComponent {
|
|
|
26235
26416
|
&& !agenticScopeChange.isFirstChange()
|
|
26236
26417
|
&& agenticScopeChange.previousValue !== agenticScopeChange.currentValue);
|
|
26237
26418
|
if (authoringOwnerChanged) {
|
|
26419
|
+
if (this.isCustomizing()) {
|
|
26420
|
+
this.isCustomizing.set(false);
|
|
26421
|
+
this.customizationChange.emit(false);
|
|
26422
|
+
}
|
|
26423
|
+
this.governancePersistence.set({ status: 'idle', customized: false });
|
|
26238
26424
|
this.resetAgenticAuthoringSessionState(this.resolveAgenticAuthoringSessionId(pageIdentityChange?.previousValue ?? this.pageIdentity, componentInstanceChange?.previousValue ?? this.componentInstanceId));
|
|
26239
26425
|
}
|
|
26240
26426
|
else if (changes['pageLifecycleResetRevision'] && !changes['pageLifecycleResetRevision'].isFirstChange()) {
|
|
@@ -26255,8 +26441,26 @@ class DynamicPageBuilderComponent {
|
|
|
26255
26441
|
this.agenticTurnCancel$.complete();
|
|
26256
26442
|
this.observabilityMetricsSubscription.unsubscribe();
|
|
26257
26443
|
}
|
|
26444
|
+
toggleGovernanceCustomization() {
|
|
26445
|
+
if (!this.isGovernanceBusy()) {
|
|
26446
|
+
const next = !this.isCustomizing();
|
|
26447
|
+
this.isCustomizing.set(next);
|
|
26448
|
+
if (!next) {
|
|
26449
|
+
if (this.previewMode()) {
|
|
26450
|
+
this.previewMode.set(false);
|
|
26451
|
+
}
|
|
26452
|
+
this.connectionsViewerOpen.set(false);
|
|
26453
|
+
}
|
|
26454
|
+
this.customizationChange.emit(next);
|
|
26455
|
+
}
|
|
26456
|
+
}
|
|
26457
|
+
isCustomizationEnabled() {
|
|
26458
|
+
return this.showGovernanceToolbar
|
|
26459
|
+
? this.isCustomizing() && this.governancePersistence().status !== 'error' && this.governancePersistence().status !== 'loading'
|
|
26460
|
+
: !!this.enableCustomization;
|
|
26461
|
+
}
|
|
26258
26462
|
showSettings() {
|
|
26259
|
-
return
|
|
26463
|
+
return this.isCustomizationEnabled() && !this.previewMode();
|
|
26260
26464
|
}
|
|
26261
26465
|
canInsertWidgets() {
|
|
26262
26466
|
return this.showSettings() && this.isAuthoringCapabilityEnabled('insertWidgets');
|
|
@@ -26273,7 +26477,7 @@ class DynamicPageBuilderComponent {
|
|
|
26273
26477
|
return this.hasPageWidgets() && this.isAuthoringCapabilityEnabled('preview');
|
|
26274
26478
|
}
|
|
26275
26479
|
canUseAgenticAuthoring() {
|
|
26276
|
-
return
|
|
26480
|
+
return this.isCustomizationEnabled()
|
|
26277
26481
|
&& this.enableAgenticAuthoring
|
|
26278
26482
|
&& this.isAuthoringCapabilityEnabled('agentic');
|
|
26279
26483
|
}
|
|
@@ -26340,10 +26544,12 @@ class DynamicPageBuilderComponent {
|
|
|
26340
26544
|
resetPersistedPage(defaultPage) {
|
|
26341
26545
|
if (!this.runtimeAutoPersist())
|
|
26342
26546
|
return;
|
|
26343
|
-
this.
|
|
26547
|
+
const fallback = defaultPage || this.parsePage(this.page) || { widgets: [] };
|
|
26548
|
+
this.runtime?.resetPersistedPage(fallback);
|
|
26344
26549
|
}
|
|
26345
26550
|
onRuntimePersistenceChange(state) {
|
|
26346
26551
|
this.runtimePersistenceStatus = state.status;
|
|
26552
|
+
this.governancePersistence.set(state);
|
|
26347
26553
|
this.persistenceChange.emit(state);
|
|
26348
26554
|
}
|
|
26349
26555
|
onRuntimePageChange(next) {
|
|
@@ -26771,7 +26977,7 @@ class DynamicPageBuilderComponent {
|
|
|
26771
26977
|
return {
|
|
26772
26978
|
page: this.currentPage(),
|
|
26773
26979
|
context: this.context,
|
|
26774
|
-
enableCustomization: this.
|
|
26980
|
+
enableCustomization: this.isCustomizationEnabled(),
|
|
26775
26981
|
showSettingsButton: this.showSettingsButton,
|
|
26776
26982
|
strictValidation: this.strictValidation,
|
|
26777
26983
|
pageIdentity: this.pageIdentity,
|
|
@@ -27134,7 +27340,7 @@ class DynamicPageBuilderComponent {
|
|
|
27134
27340
|
}
|
|
27135
27341
|
syncAgenticAuthoringSession(visibility = null) {
|
|
27136
27342
|
if (!this.enableAgenticAuthoring
|
|
27137
|
-
|| !this.
|
|
27343
|
+
|| !this.isCustomizationEnabled()
|
|
27138
27344
|
|| !this.isAuthoringCapabilityEnabled('agentic'))
|
|
27139
27345
|
return;
|
|
27140
27346
|
if (!this.agenticAuthoringOpen() && !this.hasAgenticAuthoringSession())
|
|
@@ -29057,7 +29263,7 @@ class DynamicPageBuilderComponent {
|
|
|
29057
29263
|
if (applied.success) {
|
|
29058
29264
|
this.recordAgenticLocalPreview(snapshot);
|
|
29059
29265
|
this.agenticAuthoringMaterializationPending.set(true);
|
|
29060
|
-
if (this.
|
|
29266
|
+
if (this.isCustomizationEnabled()) {
|
|
29061
29267
|
this.enterPreviewMode();
|
|
29062
29268
|
}
|
|
29063
29269
|
}
|
|
@@ -29103,7 +29309,7 @@ class DynamicPageBuilderComponent {
|
|
|
29103
29309
|
try {
|
|
29104
29310
|
await adapter.restoreSnapshot(entry.snapshot);
|
|
29105
29311
|
this.agenticAuthoringMaterializationPending.set(this.agenticLocalPreviewHistoryTruncated || this.agenticLocalPreviewHistory.length > 0);
|
|
29106
|
-
if (this.
|
|
29312
|
+
if (this.isCustomizationEnabled()) {
|
|
29107
29313
|
this.enterPreviewMode();
|
|
29108
29314
|
}
|
|
29109
29315
|
return { success: true };
|
|
@@ -30059,15 +30265,78 @@ class DynamicPageBuilderComponent {
|
|
|
30059
30265
|
return resolvePraxisPageBuilderText(this.i18n, key, fallback);
|
|
30060
30266
|
}
|
|
30061
30267
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, deps: [{ token: i1.MatDialog }, { token: SETTINGS_PANEL_BRIDGE, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
30062
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", authoringDocument: "authoringDocument", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { persistenceChange: "persistenceChange", pageChange: "pageChange", pageAuthoringChange: "pageAuthoringChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested" }, providers: [
|
|
30268
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicPageBuilderComponent, isStandalone: true, selector: "praxis-dynamic-page-builder", inputs: { page: "page", context: "context", strictValidation: "strictValidation", autoPersist: "autoPersist", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showSettingsButton: "showSettingsButton", showGovernanceToolbar: "showGovernanceToolbar", governanceToolbarTitle: "governanceToolbarTitle", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", pageEditorComponent: "pageEditorComponent", componentPaletteAllowedWidgetIds: "componentPaletteAllowedWidgetIds", componentPaletteAllowedWidgetTags: "componentPaletteAllowedWidgetTags", componentPaletteAllowedPresetIds: "componentPaletteAllowedPresetIds", enableAgenticAuthoring: "enableAgenticAuthoring", agenticAuthoringProvider: "agenticAuthoringProvider", agenticAuthoringModel: "agenticAuthoringModel", agenticAuthoringApiKey: "agenticAuthoringApiKey", agenticAuthoringComponentId: "agenticAuthoringComponentId", agenticAuthoringScope: "agenticAuthoringScope", agenticAuthoringEtag: "agenticAuthoringEtag", agenticAuthoringIncludeLlmDiagnostics: "agenticAuthoringIncludeLlmDiagnostics", agenticAuthoringEnableStreaming: "agenticAuthoringEnableStreaming", agenticAuthoringVoiceInputMode: "agenticAuthoringVoiceInputMode", agenticAuthoringContextHints: "agenticAuthoringContextHints", authoringDocument: "authoringDocument", showPageLifecycleActions: "showPageLifecycleActions", canDeleteSavedPage: "canDeleteSavedPage", pageLifecycleBusy: "pageLifecycleBusy", pageLifecycleResetRevision: "pageLifecycleResetRevision" }, outputs: { persistenceChange: "persistenceChange", pageChange: "pageChange", pageAuthoringChange: "pageAuthoringChange", widgetEvent: "widgetEvent", pageSaveRequested: "pageSaveRequested", agenticAuthoringApplied: "agenticAuthoringApplied", agenticAuthoringSharedRuleHandoff: "agenticAuthoringSharedRuleHandoff", pageRestart: "pageRestart", savedPageDeleteRequested: "savedPageDeleteRequested", customizationChange: "customizationChange" }, providers: [
|
|
30063
30269
|
providePraxisPageBuilderI18n(),
|
|
30064
30270
|
{ provide: DYNAMIC_PAGE_SHELL_EDITOR, useValue: WidgetShellEditorComponent },
|
|
30065
30271
|
], viewQueries: [{ propertyName: "runtime", first: true, predicate: ["runtime"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
30066
30272
|
<div
|
|
30067
30273
|
class="builder-shell"
|
|
30068
30274
|
[class.builder-shell--agentic-review-rail]="agenticAuthoringReviewRailActive()"
|
|
30069
|
-
[class.builder-shell--bottom-toolbar]="
|
|
30275
|
+
[class.builder-shell--bottom-toolbar]="showSettings() && !connectionsViewerOpen()"
|
|
30070
30276
|
>
|
|
30277
|
+
@if (showGovernanceToolbar) {
|
|
30278
|
+
<header class="builder-governance-toolbar" data-testid="page-builder-governance-toolbar" [attr.data-testid]="'dashboard-governance-toolbar'">
|
|
30279
|
+
<div class="builder-governance-brand">
|
|
30280
|
+
<div class="builder-governance-status-indicator">
|
|
30281
|
+
<span class="builder-governance-dot-pulse"></span>
|
|
30282
|
+
<span class="builder-governance-title">{{ governanceToolbarTitle || tx('governance.defaultTitle', 'Canvas Governado') }}</span>
|
|
30283
|
+
</div>
|
|
30284
|
+
|
|
30285
|
+
<span class="builder-governance-badge">
|
|
30286
|
+
<span class="material-symbols-outlined">dashboard_customize</span>
|
|
30287
|
+
{{ tx('governance.badge', 'Praxis Page Builder · Canvas Governado') }}
|
|
30288
|
+
</span>
|
|
30289
|
+
|
|
30290
|
+
<div class="builder-governance-persistence" data-testid="dashboard-layout-status" role="status"
|
|
30291
|
+
aria-live="polite" aria-atomic="true"
|
|
30292
|
+
[class.customized]="isLayoutCustomized()" [class.governed]="!isLayoutCustomized()">
|
|
30293
|
+
<span>{{ governancePersistenceLabel() }}</span>
|
|
30294
|
+
@if (governancePersistence().status === 'saved' && governanceLastSavedAt(); as saved) {
|
|
30295
|
+
<span class="builder-governance-saved-time">· {{ tx('governance.savedAt', 'salvo às') }} {{ saved }}</span>
|
|
30296
|
+
}
|
|
30297
|
+
</div>
|
|
30298
|
+
</div>
|
|
30299
|
+
|
|
30300
|
+
<div class="builder-governance-actions">
|
|
30301
|
+
@if (governancePersistence().status === 'error' && governancePersistence().operation === 'save' && governancePersistence().errorKind !== 'conflict') {
|
|
30302
|
+
<button type="button" class="builder-governance-btn" data-testid="retry-layout-btn"
|
|
30303
|
+
(click)="saveCurrentPage()">
|
|
30304
|
+
{{ tx('governance.retry', 'Tentar salvar novamente') }}
|
|
30305
|
+
</button>
|
|
30306
|
+
}
|
|
30307
|
+
@if (governancePersistence().status === 'error') {
|
|
30308
|
+
<button type="button" class="builder-governance-btn" data-testid="reload-layout-btn"
|
|
30309
|
+
(click)="reloadPersistedPage(currentPage())">
|
|
30310
|
+
{{ tx('governance.reload', 'Descartar alterações e recarregar') }}
|
|
30311
|
+
</button>
|
|
30312
|
+
}
|
|
30313
|
+
@if (isCustomizing() && isLayoutCustomized()) {
|
|
30314
|
+
<button type="button" class="builder-governance-btn builder-governance-btn--reset" data-testid="reset-layout-btn"
|
|
30315
|
+
(click)="resetPersistedPage()"
|
|
30316
|
+
[title]="tx('governance.resetTitle', 'Reverter para o layout padrão de fábrica e descartar customizações desta persona')">
|
|
30317
|
+
<span class="material-symbols-outlined">restart_alt</span>
|
|
30318
|
+
<span>{{ tx('governance.reset', 'Restaurar Fábrica') }}</span>
|
|
30319
|
+
</button>
|
|
30320
|
+
}
|
|
30321
|
+
|
|
30322
|
+
<button
|
|
30323
|
+
type="button"
|
|
30324
|
+
class="builder-governance-toggle-btn"
|
|
30325
|
+
data-testid="toggle-customization-btn"
|
|
30326
|
+
[class.active]="isCustomizing()"
|
|
30327
|
+
(click)="toggleGovernanceCustomization()"
|
|
30328
|
+
[disabled]="isGovernanceBusy() || governancePersistence().status === 'error'"
|
|
30329
|
+
[attr.aria-pressed]="isCustomizing()"
|
|
30330
|
+
[title]="tx('governance.toggleTitle', 'Alternar modo de customização de layout e widgets')"
|
|
30331
|
+
>
|
|
30332
|
+
<span class="material-symbols-outlined">
|
|
30333
|
+
{{ isCustomizing() ? 'visibility' : 'dashboard_customize' }}
|
|
30334
|
+
</span>
|
|
30335
|
+
<span>{{ isCustomizing() ? tx('governance.finish', 'Concluir Edição') : tx('governance.customize', 'Customizar Layout') }}</span>
|
|
30336
|
+
</button>
|
|
30337
|
+
</div>
|
|
30338
|
+
</header>
|
|
30339
|
+
}
|
|
30071
30340
|
@if (uiCompositionAuthoringBlockingDiagnostics().length) {
|
|
30072
30341
|
<section
|
|
30073
30342
|
class="builder-authoring-lineage-alert"
|
|
@@ -30539,7 +30808,7 @@ class DynamicPageBuilderComponent {
|
|
|
30539
30808
|
}
|
|
30540
30809
|
|
|
30541
30810
|
<praxis-floating-toolbar
|
|
30542
|
-
[visible]="
|
|
30811
|
+
[visible]="isCustomizationEnabled()"
|
|
30543
30812
|
[canUndo]="false"
|
|
30544
30813
|
[canRedo]="false"
|
|
30545
30814
|
[showSave]="canSaveCurrentPage()"
|
|
@@ -30632,7 +30901,7 @@ class DynamicPageBuilderComponent {
|
|
|
30632
30901
|
}
|
|
30633
30902
|
</praxis-floating-toolbar>
|
|
30634
30903
|
</div>
|
|
30635
|
-
`, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "persistenceChange", "pageAuthoringChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
|
|
30904
|
+
`, isInline: true, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-governance-toolbar{display:flex;justify-content:space-between;align-items:center;padding:10px 18px;margin-bottom:16px;border-radius:14px;background:var(--surface-gradient, color-mix(in srgb, var(--md-sys-color-surface-container, #1e293b) 95%, transparent));border:1px solid var(--border, color-mix(in srgb, var(--md-sys-color-outline-variant, #334155) 60%, transparent));gap:16px;flex-wrap:wrap}.builder-governance-brand{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.builder-governance-status-indicator{display:inline-flex;align-items:center;gap:8px;padding:3px 10px;border-radius:9999px;background:color-mix(in srgb,var(--ready, #22c55e) 12%,transparent);border:1px solid color-mix(in srgb,var(--ready, #22c55e) 28%,transparent)}.builder-governance-dot-pulse{width:7px;height:7px;border-radius:50%;background:var(--ready, #22c55e);box-shadow:0 0 8px var(--ready, #22c55e);animation:builderGovernancePulse 2s infinite cubic-bezier(.4,0,.6,1)}.builder-governance-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ready, #22c55e)}.builder-governance-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:8px;background:color-mix(in srgb,var(--primary, #3b82f6) 12%,transparent);border:1px solid color-mix(in srgb,var(--primary, #3b82f6) 24%,transparent);font-size:11px;font-weight:600;color:var(--primary, #3b82f6)}.builder-governance-badge .material-symbols-outlined{font-size:14px}.builder-governance-persistence{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:9999px;font-size:11px;font-weight:600;letter-spacing:.02em;border:1px solid transparent;transition:all .2s ease}.builder-governance-persistence.governed{background:color-mix(in srgb,var(--muted, #64748b) 15%,transparent);border-color:color-mix(in srgb,var(--border, #334155) 80%,transparent);color:var(--muted-foreground, #94a3b8)}.builder-governance-persistence.customized{background:color-mix(in srgb,var(--primary, #3b82f6) 14%,transparent);border-color:color-mix(in srgb,var(--primary, #3b82f6) 35%,transparent);color:var(--primary, #3b82f6)}.builder-governance-persistence .builder-governance-saved-time{opacity:.75;font-weight:400}.builder-governance-actions{display:flex;align-items:center;gap:10px;margin-left:auto}.builder-governance-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;border-radius:9px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid var(--border, #334155);background:var(--surface, #1e293b);color:var(--foreground, #f8fafc);transition:all .15s ease}.builder-governance-btn:hover:not(:disabled){border-color:var(--primary, #3b82f6);background:color-mix(in srgb,var(--primary, #3b82f6) 10%,var(--surface, #1e293b))}.builder-governance-btn:disabled{opacity:.5;cursor:not-allowed}.builder-governance-btn--reset{border-color:color-mix(in srgb,var(--warning, #eab308) 40%,transparent);color:var(--warning, #eab308)}.builder-governance-btn--reset:hover:not(:disabled){border-color:var(--warning, #eab308);background:color-mix(in srgb,var(--warning, #eab308) 12%,transparent)}.builder-governance-btn .material-symbols-outlined,.builder-governance-toggle-btn .material-symbols-outlined{font-size:16px}.builder-governance-toggle-btn{display:inline-flex;align-items:center;gap:7px;padding:7px 15px;border-radius:9px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid var(--border, #334155);background:var(--surface, #1e293b);color:var(--foreground, #f8fafc);transition:all .2s cubic-bezier(.16,1,.3,1)}.builder-governance-toggle-btn:hover:not(:disabled){border-color:var(--primary, #3b82f6);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--primary, #3b82f6) 20%,transparent)}.builder-governance-toggle-btn.active{background:linear-gradient(135deg,var(--primary, #3b82f6),color-mix(in srgb,var(--primary, #3b82f6) 80%,black));border-color:var(--primary, #3b82f6);color:#fff;box-shadow:0 0 16px color-mix(in srgb,var(--primary, #3b82f6) 35%,transparent)}.builder-governance-toggle-btn:disabled{opacity:.5;cursor:not-allowed}@keyframes builderGovernancePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: DynamicWidgetPageComponent, selector: "praxis-dynamic-page", inputs: ["page", "context", "strictValidation", "enableCustomization", "authoringCapabilities", "showPageSettingsButton", "shellEditorComponent", "pageEditorComponent", "autoPersist", "pageIdentity", "componentInstanceId", "showWidgetAssistantButton"], outputs: ["pageChange", "persistenceChange", "pageAuthoringChange", "widgetEvent", "widgetSelectionChange", "widgetAssistantRequested", "widgetDiagnosticsChange"] }, { kind: "component", type: FloatingToolbarComponent, selector: "praxis-floating-toolbar", inputs: ["visible", "canUndo", "canRedo", "showSave", "showPreview", "showAdd", "showSettings", "editingEnabled", "previewActive", "connectionMode", "modeLabel", "addLabel", "saveLabel", "undoLabel", "redoLabel", "settingsLabel", "previewLabel", "exitPreviewLabel"], outputs: ["add", "undo", "redo", "settings", "preview", "save"] }, { kind: "component", type: ConnectionEditorComponent, selector: "praxis-connection-editor", inputs: ["open", "page"], outputs: ["pageChange", "focusWidget", "openPageSettings", "close"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }] });
|
|
30636
30905
|
}
|
|
30637
30906
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicPageBuilderComponent, decorators: [{
|
|
30638
30907
|
type: Component,
|
|
@@ -30652,8 +30921,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
30652
30921
|
<div
|
|
30653
30922
|
class="builder-shell"
|
|
30654
30923
|
[class.builder-shell--agentic-review-rail]="agenticAuthoringReviewRailActive()"
|
|
30655
|
-
[class.builder-shell--bottom-toolbar]="
|
|
30924
|
+
[class.builder-shell--bottom-toolbar]="showSettings() && !connectionsViewerOpen()"
|
|
30656
30925
|
>
|
|
30926
|
+
@if (showGovernanceToolbar) {
|
|
30927
|
+
<header class="builder-governance-toolbar" data-testid="page-builder-governance-toolbar" [attr.data-testid]="'dashboard-governance-toolbar'">
|
|
30928
|
+
<div class="builder-governance-brand">
|
|
30929
|
+
<div class="builder-governance-status-indicator">
|
|
30930
|
+
<span class="builder-governance-dot-pulse"></span>
|
|
30931
|
+
<span class="builder-governance-title">{{ governanceToolbarTitle || tx('governance.defaultTitle', 'Canvas Governado') }}</span>
|
|
30932
|
+
</div>
|
|
30933
|
+
|
|
30934
|
+
<span class="builder-governance-badge">
|
|
30935
|
+
<span class="material-symbols-outlined">dashboard_customize</span>
|
|
30936
|
+
{{ tx('governance.badge', 'Praxis Page Builder · Canvas Governado') }}
|
|
30937
|
+
</span>
|
|
30938
|
+
|
|
30939
|
+
<div class="builder-governance-persistence" data-testid="dashboard-layout-status" role="status"
|
|
30940
|
+
aria-live="polite" aria-atomic="true"
|
|
30941
|
+
[class.customized]="isLayoutCustomized()" [class.governed]="!isLayoutCustomized()">
|
|
30942
|
+
<span>{{ governancePersistenceLabel() }}</span>
|
|
30943
|
+
@if (governancePersistence().status === 'saved' && governanceLastSavedAt(); as saved) {
|
|
30944
|
+
<span class="builder-governance-saved-time">· {{ tx('governance.savedAt', 'salvo às') }} {{ saved }}</span>
|
|
30945
|
+
}
|
|
30946
|
+
</div>
|
|
30947
|
+
</div>
|
|
30948
|
+
|
|
30949
|
+
<div class="builder-governance-actions">
|
|
30950
|
+
@if (governancePersistence().status === 'error' && governancePersistence().operation === 'save' && governancePersistence().errorKind !== 'conflict') {
|
|
30951
|
+
<button type="button" class="builder-governance-btn" data-testid="retry-layout-btn"
|
|
30952
|
+
(click)="saveCurrentPage()">
|
|
30953
|
+
{{ tx('governance.retry', 'Tentar salvar novamente') }}
|
|
30954
|
+
</button>
|
|
30955
|
+
}
|
|
30956
|
+
@if (governancePersistence().status === 'error') {
|
|
30957
|
+
<button type="button" class="builder-governance-btn" data-testid="reload-layout-btn"
|
|
30958
|
+
(click)="reloadPersistedPage(currentPage())">
|
|
30959
|
+
{{ tx('governance.reload', 'Descartar alterações e recarregar') }}
|
|
30960
|
+
</button>
|
|
30961
|
+
}
|
|
30962
|
+
@if (isCustomizing() && isLayoutCustomized()) {
|
|
30963
|
+
<button type="button" class="builder-governance-btn builder-governance-btn--reset" data-testid="reset-layout-btn"
|
|
30964
|
+
(click)="resetPersistedPage()"
|
|
30965
|
+
[title]="tx('governance.resetTitle', 'Reverter para o layout padrão de fábrica e descartar customizações desta persona')">
|
|
30966
|
+
<span class="material-symbols-outlined">restart_alt</span>
|
|
30967
|
+
<span>{{ tx('governance.reset', 'Restaurar Fábrica') }}</span>
|
|
30968
|
+
</button>
|
|
30969
|
+
}
|
|
30970
|
+
|
|
30971
|
+
<button
|
|
30972
|
+
type="button"
|
|
30973
|
+
class="builder-governance-toggle-btn"
|
|
30974
|
+
data-testid="toggle-customization-btn"
|
|
30975
|
+
[class.active]="isCustomizing()"
|
|
30976
|
+
(click)="toggleGovernanceCustomization()"
|
|
30977
|
+
[disabled]="isGovernanceBusy() || governancePersistence().status === 'error'"
|
|
30978
|
+
[attr.aria-pressed]="isCustomizing()"
|
|
30979
|
+
[title]="tx('governance.toggleTitle', 'Alternar modo de customização de layout e widgets')"
|
|
30980
|
+
>
|
|
30981
|
+
<span class="material-symbols-outlined">
|
|
30982
|
+
{{ isCustomizing() ? 'visibility' : 'dashboard_customize' }}
|
|
30983
|
+
</span>
|
|
30984
|
+
<span>{{ isCustomizing() ? tx('governance.finish', 'Concluir Edição') : tx('governance.customize', 'Customizar Layout') }}</span>
|
|
30985
|
+
</button>
|
|
30986
|
+
</div>
|
|
30987
|
+
</header>
|
|
30988
|
+
}
|
|
30657
30989
|
@if (uiCompositionAuthoringBlockingDiagnostics().length) {
|
|
30658
30990
|
<section
|
|
30659
30991
|
class="builder-authoring-lineage-alert"
|
|
@@ -31125,7 +31457,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
31125
31457
|
}
|
|
31126
31458
|
|
|
31127
31459
|
<praxis-floating-toolbar
|
|
31128
|
-
[visible]="
|
|
31460
|
+
[visible]="isCustomizationEnabled()"
|
|
31129
31461
|
[canUndo]="false"
|
|
31130
31462
|
[canRedo]="false"
|
|
31131
31463
|
[showSave]="canSaveCurrentPage()"
|
|
@@ -31218,7 +31550,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
31218
31550
|
}
|
|
31219
31551
|
</praxis-floating-toolbar>
|
|
31220
31552
|
</div>
|
|
31221
|
-
`, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"] }]
|
|
31553
|
+
`, styles: [":host{display:block;position:relative;min-height:var(--pdx-page-builder-min-height, 420px)}.builder-shell{display:block;position:relative;min-height:inherit;height:100%;box-sizing:border-box}.builder-shell--bottom-toolbar{padding-block-end:calc(80px + env(safe-area-inset-bottom,0px))}.builder-shell:has(.pdx-shell.fullscreen) praxis-floating-toolbar{display:none}.builder-governance-toolbar{display:flex;justify-content:space-between;align-items:center;padding:10px 18px;margin-bottom:16px;border-radius:14px;background:var(--surface-gradient, color-mix(in srgb, var(--md-sys-color-surface-container, #1e293b) 95%, transparent));border:1px solid var(--border, color-mix(in srgb, var(--md-sys-color-outline-variant, #334155) 60%, transparent));gap:16px;flex-wrap:wrap}.builder-governance-brand{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.builder-governance-status-indicator{display:inline-flex;align-items:center;gap:8px;padding:3px 10px;border-radius:9999px;background:color-mix(in srgb,var(--ready, #22c55e) 12%,transparent);border:1px solid color-mix(in srgb,var(--ready, #22c55e) 28%,transparent)}.builder-governance-dot-pulse{width:7px;height:7px;border-radius:50%;background:var(--ready, #22c55e);box-shadow:0 0 8px var(--ready, #22c55e);animation:builderGovernancePulse 2s infinite cubic-bezier(.4,0,.6,1)}.builder-governance-title{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ready, #22c55e)}.builder-governance-badge{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:8px;background:color-mix(in srgb,var(--primary, #3b82f6) 12%,transparent);border:1px solid color-mix(in srgb,var(--primary, #3b82f6) 24%,transparent);font-size:11px;font-weight:600;color:var(--primary, #3b82f6)}.builder-governance-badge .material-symbols-outlined{font-size:14px}.builder-governance-persistence{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:9999px;font-size:11px;font-weight:600;letter-spacing:.02em;border:1px solid transparent;transition:all .2s ease}.builder-governance-persistence.governed{background:color-mix(in srgb,var(--muted, #64748b) 15%,transparent);border-color:color-mix(in srgb,var(--border, #334155) 80%,transparent);color:var(--muted-foreground, #94a3b8)}.builder-governance-persistence.customized{background:color-mix(in srgb,var(--primary, #3b82f6) 14%,transparent);border-color:color-mix(in srgb,var(--primary, #3b82f6) 35%,transparent);color:var(--primary, #3b82f6)}.builder-governance-persistence .builder-governance-saved-time{opacity:.75;font-weight:400}.builder-governance-actions{display:flex;align-items:center;gap:10px;margin-left:auto}.builder-governance-btn{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;border-radius:9px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid var(--border, #334155);background:var(--surface, #1e293b);color:var(--foreground, #f8fafc);transition:all .15s ease}.builder-governance-btn:hover:not(:disabled){border-color:var(--primary, #3b82f6);background:color-mix(in srgb,var(--primary, #3b82f6) 10%,var(--surface, #1e293b))}.builder-governance-btn:disabled{opacity:.5;cursor:not-allowed}.builder-governance-btn--reset{border-color:color-mix(in srgb,var(--warning, #eab308) 40%,transparent);color:var(--warning, #eab308)}.builder-governance-btn--reset:hover:not(:disabled){border-color:var(--warning, #eab308);background:color-mix(in srgb,var(--warning, #eab308) 12%,transparent)}.builder-governance-btn .material-symbols-outlined,.builder-governance-toggle-btn .material-symbols-outlined{font-size:16px}.builder-governance-toggle-btn{display:inline-flex;align-items:center;gap:7px;padding:7px 15px;border-radius:9px;font-size:12px;font-weight:600;cursor:pointer;border:1px solid var(--border, #334155);background:var(--surface, #1e293b);color:var(--foreground, #f8fafc);transition:all .2s cubic-bezier(.16,1,.3,1)}.builder-governance-toggle-btn:hover:not(:disabled){border-color:var(--primary, #3b82f6);transform:translateY(-1px);box-shadow:0 4px 12px color-mix(in srgb,var(--primary, #3b82f6) 20%,transparent)}.builder-governance-toggle-btn.active{background:linear-gradient(135deg,var(--primary, #3b82f6),color-mix(in srgb,var(--primary, #3b82f6) 80%,black));border-color:var(--primary, #3b82f6);color:#fff;box-shadow:0 0 16px color-mix(in srgb,var(--primary, #3b82f6) 35%,transparent)}.builder-governance-toggle-btn:disabled{opacity:.5;cursor:not-allowed}@keyframes builderGovernancePulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.85)}}.builder-authoring-lineage-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;margin:0 0 14px;padding:12px 14px;border:1px solid var(--md-sys-color-error, #b3261e);border-radius:10px;background:var(--md-sys-color-error-container, #f9dedc);color:var(--md-sys-color-on-error-container, #410e0b)}.builder-authoring-lineage-alert strong{display:block}.builder-authoring-lineage-alert p{margin:4px 0 0}.builder-authoring-lineage-alert ul{margin:8px 0 0;padding-inline-start:20px}@media(forced-colors:active){.builder-authoring-lineage-alert{border:2px solid CanvasText;background:Canvas;color:CanvasText}}.builder-premium-readiness{display:grid;grid-template-columns:minmax(220px,.72fr) minmax(0,1.28fr);gap:12px;width:100%;margin:0 0 14px;padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 72%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 10%,transparent),transparent 36%),color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 96%,transparent);color:var(--md-sys-color-on-surface, #1d1b20);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface, #1d1b20) 5%,transparent)}.builder-premium-readiness__header{display:flex;align-items:flex-start;gap:10px;min-width:0}.builder-premium-readiness__header strong{display:block;font-size:13px;line-height:1.25}.builder-premium-readiness__header p,.builder-premium-readiness__item p{margin:2px 0 0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;line-height:1.35}.builder-premium-readiness__icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1}.builder-premium-readiness__list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:8px;margin:0;padding:0;list-style:none}.builder-premium-readiness__item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low, #f7f2fa) 84%,transparent)}.builder-premium-readiness__item strong{display:block;font-size:12px;line-height:1.25}.builder-premium-readiness__action{appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:26px;margin-top:7px;padding:4px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 34%,transparent);border-radius:7px;background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 9%,var(--md-sys-color-surface, #fff));color:var(--md-sys-color-primary, #6750a4);cursor:pointer;font:inherit;font-size:11px;font-weight:700;line-height:1.2;text-align:left}.builder-premium-readiness__severity{width:8px;height:8px;margin-top:4px;border-radius:999px;background:var(--md-sys-color-primary, #6750a4)}.builder-premium-readiness__item[data-severity=warning] .builder-premium-readiness__severity{background:var(--praxis-warning, #b26a00)}.builder-premium-readiness__item[data-severity=error] .builder-premium-readiness__severity{background:var(--md-sys-color-error, #b3261e)}@media(max-width:760px){.builder-premium-readiness{grid-template-columns:1fr}}.agentic-diagnostics-panel{position:absolute;z-index:21;right:16px;width:min(520px,calc(100% - 32px));max-height:min(440px,calc(100% - 32px));overflow:auto;padding:12px;border:1px solid rgba(107,114,128,.28);border-radius:8px;background:#fffffff5;color:#111827;box-shadow:0 14px 36px #0000003d}.agentic-diagnostics-panel--collapsed{width:min(280px,calc(100% - 32px));max-height:58px;overflow:hidden;padding:10px 12px;pointer-events:auto}.agentic-diagnostics-panel__header{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:700}.agentic-diagnostics-panel__header-actions{display:flex;align-items:center;gap:8px}.agentic-diagnostics-panel__badge{padding:2px 6px;border:1px solid rgba(107,114,128,.28);border-radius:8px;font-size:11px;font-weight:600;color:#4b5563}.agentic-diagnostics-panel__toggle,.shared-rule-cockpit__toggle{appearance:none;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 84%,transparent);color:var(--md-sys-color-primary);cursor:pointer;font-size:11px;font-weight:700;line-height:1;padding:6px 9px;white-space:nowrap}.agentic-diagnostics-panel__description{margin:8px 0 10px;color:#4b5563;font-size:12px;line-height:1.4}.agentic-diagnostics-panel pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45;color:#1f2937}.agentic-diagnostics-panel__health{display:grid;gap:8px;margin-bottom:12px}.agentic-diagnostics-panel__health h3,.agentic-diagnostics-panel__health p{margin:0}.agentic-diagnostics-panel__health h3{font-size:13px}.agentic-diagnostics-panel__health p{color:#4b5563;font-size:11px}.agentic-diagnostics-panel__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0}.agentic-diagnostics-panel__metrics div{padding:8px;border-radius:8px;background:#f3f4f6}.agentic-diagnostics-panel__metrics dt{color:#4b5563;font-size:10px}.agentic-diagnostics-panel__metrics dd{margin:3px 0 0;font-size:14px;font-weight:700}.agentic-diagnostics-panel__health-table{width:100%;border-collapse:collapse;font-size:10px}.agentic-diagnostics-panel__health-table caption{margin-bottom:4px;text-align:left;font-weight:700}.agentic-diagnostics-panel__health-table th,.agentic-diagnostics-panel__health-table td{padding:5px 4px;border-bottom:1px solid #e5e7eb;text-align:left}.agentic-diagnostics-panel__raw summary{margin-bottom:8px;cursor:pointer;font-size:11px;font-weight:700}@media(max-width:520px){.agentic-diagnostics-panel__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}praxis-ai-assistant-shell{position:fixed;inset:0;z-index:140;pointer-events:none}@media(min-width:1100px){.builder-shell--agentic-review-rail{box-sizing:border-box;padding-right:464px}}.builder-shell__agentic-toggle{position:relative}.builder-shell__agentic-toggle--open,.builder-shell__agentic-toggle--minimized{outline:2px solid rgba(96,165,250,.52);outline-offset:2px}.builder-shell__agentic-toggle--minimized:after{content:\"\";position:absolute;top:6px;right:6px;width:8px;height:8px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#34d399}.builder-shell__connections-toggle--open{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 52%,transparent);outline-offset:2px}.builder-shell__connections-toggle{position:relative}.builder-shell__connections-toggle--recommended:not(.builder-shell__connections-toggle--open){outline:2px solid rgba(34,211,238,.48);outline-offset:2px}.builder-shell__connections-toggle-badge{position:absolute;top:5px;right:5px;width:9px;height:9px;border:2px solid var(--md-sys-color-surface, #111827);border-radius:999px;background:#22d3ee;box-shadow:0 0 0 3px #22d3ee2e}.shared-rule-cockpit{position:absolute;z-index:120;left:16px;bottom:88px;width:min(720px,calc(100% - 32px));max-height:min(560px,calc(100vh - 140px));padding:14px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 24%,transparent);border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary-container) 24%,var(--md-sys-color-surface-container-high) 76%),color-mix(in srgb,var(--md-sys-color-tertiary-container) 18%,var(--md-sys-color-surface-container) 82%));color:var(--md-sys-color-on-surface);box-shadow:0 18px 46px color-mix(in srgb,var(--md-sys-color-shadow, #000) 24%,transparent);overflow:auto;overscroll-behavior:contain}.shared-rule-cockpit--collapsed{width:min(360px,calc(100% - 32px));max-height:72px;overflow:hidden;padding:10px 12px}.shared-rule-cockpit__header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.shared-rule-cockpit__header-actions{display:flex;align-items:center;gap:8px}.shared-rule-cockpit__header div{display:grid;gap:2px}.shared-rule-cockpit__header strong{font-size:14px;line-height:1.2}.shared-rule-cockpit__header span{color:var(--md-sys-color-on-surface-variant);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__badge{flex:0 0 auto;max-width:220px;padding:3px 8px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 74%,transparent);color:var(--md-sys-color-primary);font-size:11px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shared-rule-cockpit__description,.shared-rule-cockpit__status,.shared-rule-cockpit__error{margin:10px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.shared-rule-cockpit__error{color:var(--md-sys-color-error);font-weight:600}.shared-rule-cockpit__actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.shared-rule-cockpit__facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:12px 0 0}.shared-rule-cockpit__facts div{min-width:0;padding:8px;border-radius:10px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 72%,transparent)}.shared-rule-cockpit__facts dt{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em}.shared-rule-cockpit__facts dd{margin:4px 0 0;color:var(--md-sys-color-on-surface);font-size:12px;overflow-wrap:anywhere}.shared-rule-cockpit__enforcement-matrix{display:grid;gap:10px;margin-top:12px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 58%,transparent)}.shared-rule-cockpit__matrix-header{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.shared-rule-cockpit__matrix-header div{display:grid;gap:2px}.shared-rule-cockpit__matrix-header strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__matrix-header span,.shared-rule-cockpit__matrix-source{color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-badge{flex:0 0 auto;padding:3px 8px;border-radius:999px;background:#16a34a1f;color:#166534;font-weight:800;white-space:nowrap}.shared-rule-cockpit__projection-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.shared-rule-cockpit__projection{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 52%,transparent);border-radius:11px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 82%,transparent)}.shared-rule-cockpit__projection[data-status=ready]{border-color:color-mix(in srgb,var(--md-sys-color-tertiary) 24%,transparent);background:color-mix(in srgb,var(--md-sys-color-tertiary-container) 32%,var(--md-sys-color-surface-container-low) 68%)}.shared-rule-cockpit__projection span{color:var(--md-sys-color-primary);font-size:10px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;overflow-wrap:anywhere}.shared-rule-cockpit__projection strong{color:var(--md-sys-color-on-surface);font-size:12px}.shared-rule-cockpit__projection small,.shared-rule-cockpit__projection em{color:var(--md-sys-color-on-surface-variant);font-size:11px;font-style:normal;overflow-wrap:anywhere}.shared-rule-cockpit__matrix-source{margin:0}.shared-rule-cockpit__timeline{display:grid;gap:8px;max-height:190px;margin:12px 0 0;padding:0;overflow:auto;list-style:none}.shared-rule-cockpit__timeline-item{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;padding:10px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 76%,transparent)}.shared-rule-cockpit__timeline-icon{display:grid;width:24px;height:24px;place-items:center;border-radius:999px;background:#1e40af1a;color:var(--md-sys-color-primary);font-family:Material Icons;font-size:16px;line-height:1}.shared-rule-cockpit__timeline-item strong{color:var(--md-sys-color-on-surface);font-size:12px;line-height:1.35}.shared-rule-cockpit__timeline-item p,.shared-rule-cockpit__timeline-item small,.shared-rule-cockpit__timeline-item time,.shared-rule-cockpit__timeline-empty{display:block;margin:3px 0 0;color:var(--md-sys-color-on-surface-variant);font-size:11px;line-height:1.35;overflow-wrap:anywhere}.shared-rule-cockpit__timeline-badge{display:inline-flex;margin-left:6px;padding:2px 6px;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-secondary-container) 42%,transparent);color:var(--md-sys-color-on-secondary-container);font-size:10px;font-weight:700}.shared-rule-cockpit__timeline-empty{padding:10px;border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest) 64%,transparent)}@media(max-width:720px){.shared-rule-cockpit{bottom:72px;max-height:calc(100vh - 112px)}.shared-rule-cockpit__facts,.shared-rule-cockpit__projection-grid{grid-template-columns:1fr}}\n"] }]
|
|
31222
31554
|
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: undefined, decorators: [{
|
|
31223
31555
|
type: Optional
|
|
31224
31556
|
}, {
|
|
@@ -31241,6 +31573,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
31241
31573
|
type: Input
|
|
31242
31574
|
}], showSettingsButton: [{
|
|
31243
31575
|
type: Input
|
|
31576
|
+
}], showGovernanceToolbar: [{
|
|
31577
|
+
type: Input
|
|
31578
|
+
}], governanceToolbarTitle: [{
|
|
31579
|
+
type: Input
|
|
31244
31580
|
}], pageIdentity: [{
|
|
31245
31581
|
type: Input
|
|
31246
31582
|
}], componentInstanceId: [{
|
|
@@ -31299,6 +31635,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
31299
31635
|
type: Output
|
|
31300
31636
|
}], savedPageDeleteRequested: [{
|
|
31301
31637
|
type: Output
|
|
31638
|
+
}], customizationChange: [{
|
|
31639
|
+
type: Output
|
|
31302
31640
|
}] } });
|
|
31303
31641
|
|
|
31304
31642
|
/** Metadata for Praxis Page Builder component */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/page-builder",
|
|
3
|
-
"version": "10.0.0-rc.
|
|
3
|
+
"version": "10.0.0-rc.13",
|
|
4
4
|
"description": "Page and widget builder utilities for Praxis UI (grid, dynamic widgets, editors).",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"@angular/forms": "^21.0.0",
|
|
9
9
|
"@angular/cdk": "^21.0.0",
|
|
10
10
|
"@angular/material": "^21.0.0",
|
|
11
|
-
"@praxisui/ai": "^10.0.0-rc.
|
|
12
|
-
"@praxisui/core": "^10.0.0-rc.
|
|
13
|
-
"@praxisui/settings-panel": "^10.0.0-rc.
|
|
11
|
+
"@praxisui/ai": "^10.0.0-rc.13",
|
|
12
|
+
"@praxisui/core": "^10.0.0-rc.13",
|
|
13
|
+
"@praxisui/settings-panel": "^10.0.0-rc.13",
|
|
14
14
|
"rxjs": "~7.8.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
@@ -1433,6 +1433,7 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
|
|
|
1433
1433
|
readonly groupingControl: FormControl<string>;
|
|
1434
1434
|
readonly deviceLayoutsControl: FormControl<string>;
|
|
1435
1435
|
readonly stateValuesControl: FormControl<string>;
|
|
1436
|
+
readonly dataSourcesControl: FormControl<string>;
|
|
1436
1437
|
readonly groupingNodes: FormArray<GroupingNodeGroup>;
|
|
1437
1438
|
readonly schemaNodes: FormArray<SchemaNodeGroup>;
|
|
1438
1439
|
readonly derivedNodes: FormArray<DerivedNodeGroup>;
|
|
@@ -1472,6 +1473,7 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
|
|
|
1472
1473
|
private lastGrouping;
|
|
1473
1474
|
private lastDeviceLayouts;
|
|
1474
1475
|
private lastStateValues;
|
|
1476
|
+
private lastDataSources;
|
|
1475
1477
|
private readonly dirtySubject;
|
|
1476
1478
|
private readonly validSubject;
|
|
1477
1479
|
private readonly busySubject;
|
|
@@ -1493,6 +1495,7 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
|
|
|
1493
1495
|
protected get selectedShellPresetLabel(): string;
|
|
1494
1496
|
protected get contextExample(): string;
|
|
1495
1497
|
protected get stateValuesExample(): string;
|
|
1498
|
+
protected get dataSourcesExample(): string;
|
|
1496
1499
|
protected get layoutPresetHint(): string;
|
|
1497
1500
|
protected get themePresetHint(): string;
|
|
1498
1501
|
protected get shellPresetHint(): string;
|
|
@@ -1532,6 +1535,8 @@ declare class PageConfigEditorComponent implements SettingsValueProvider$1 {
|
|
|
1532
1535
|
private patchDeviceLayoutForm;
|
|
1533
1536
|
private buildDeviceLayoutVariant;
|
|
1534
1537
|
private hydrateStateEditor;
|
|
1538
|
+
private hydrateDataSourcesEditor;
|
|
1539
|
+
private buildDataSources;
|
|
1535
1540
|
private replaceSchemaNodes;
|
|
1536
1541
|
private replaceDerivedNodes;
|
|
1537
1542
|
private createSchemaNodeGroup;
|
|
@@ -2343,6 +2348,8 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
|
|
|
2343
2348
|
enableCustomization: boolean;
|
|
2344
2349
|
authoringCapabilities?: PageBuilderAuthoringCapabilities | null;
|
|
2345
2350
|
showSettingsButton: boolean;
|
|
2351
|
+
showGovernanceToolbar: boolean;
|
|
2352
|
+
governanceToolbarTitle?: string;
|
|
2346
2353
|
pageIdentity?: PageIdentity;
|
|
2347
2354
|
componentInstanceId?: string;
|
|
2348
2355
|
pageEditorComponent: Type<any> | undefined;
|
|
@@ -2377,7 +2384,14 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
|
|
|
2377
2384
|
agenticAuthoringSharedRuleHandoff: EventEmitter<PageBuilderAgenticAuthoringSharedRuleHandoff>;
|
|
2378
2385
|
pageRestart: EventEmitter<void>;
|
|
2379
2386
|
savedPageDeleteRequested: EventEmitter<void>;
|
|
2387
|
+
customizationChange: EventEmitter<boolean>;
|
|
2380
2388
|
readonly currentPage: _angular_core.WritableSignal<WidgetPageDefinition>;
|
|
2389
|
+
readonly isCustomizing: _angular_core.WritableSignal<boolean>;
|
|
2390
|
+
readonly governancePersistence: _angular_core.WritableSignal<WidgetPagePersistenceState>;
|
|
2391
|
+
readonly isLayoutCustomized: _angular_core.Signal<boolean>;
|
|
2392
|
+
readonly isGovernanceBusy: _angular_core.Signal<boolean>;
|
|
2393
|
+
readonly governancePersistenceLabel: _angular_core.Signal<string>;
|
|
2394
|
+
readonly governanceLastSavedAt: _angular_core.Signal<string | null>;
|
|
2381
2395
|
readonly hasPageWidgets: _angular_core.Signal<boolean>;
|
|
2382
2396
|
readonly hasRecommendedConnectionSuggestion: _angular_core.Signal<boolean>;
|
|
2383
2397
|
readonly premiumReadinessIssues: _angular_core.Signal<PageBuilderPremiumReadinessIssue[]>;
|
|
@@ -2443,6 +2457,8 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
|
|
|
2443
2457
|
constructor(dialog: MatDialog, settingsPanel: SettingsPanelBridge | null);
|
|
2444
2458
|
ngOnChanges(changes: SimpleChanges): void;
|
|
2445
2459
|
ngOnDestroy(): void;
|
|
2460
|
+
toggleGovernanceCustomization(): void;
|
|
2461
|
+
isCustomizationEnabled(): boolean;
|
|
2446
2462
|
showSettings(): boolean;
|
|
2447
2463
|
canInsertWidgets(): boolean;
|
|
2448
2464
|
canOpenPageSettings(): boolean;
|
|
@@ -2461,7 +2477,7 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
|
|
|
2461
2477
|
/** Explicitly discard the local draft and reload the current identity's saved page. */
|
|
2462
2478
|
reloadPersistedPage(defaultPage: WidgetPageDefinition): void;
|
|
2463
2479
|
/** Clear the current identity's saved document after storage acknowledgement. */
|
|
2464
|
-
resetPersistedPage(defaultPage
|
|
2480
|
+
resetPersistedPage(defaultPage?: WidgetPageDefinition): void;
|
|
2465
2481
|
onRuntimePersistenceChange(state: WidgetPagePersistenceState): void;
|
|
2466
2482
|
onRuntimePageChange(next: WidgetPageDefinition): void;
|
|
2467
2483
|
onRuntimePageAuthoringChange(next: WidgetPageDefinition): void;
|
|
@@ -2731,7 +2747,7 @@ declare class DynamicPageBuilderComponent implements OnChanges, OnDestroy {
|
|
|
2731
2747
|
authoringSourceDiagnosticText(diagnostic: UiCompositionAuthoringSourceDiagnostic): string;
|
|
2732
2748
|
tx(key: string, fallback: string): string;
|
|
2733
2749
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DynamicPageBuilderComponent, [null, { optional: true; }]>;
|
|
2734
|
-
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; }; }, { "persistenceChange": "persistenceChange"; "pageChange": "pageChange"; "pageAuthoringChange": "pageAuthoringChange"; "widgetEvent": "widgetEvent"; "pageSaveRequested": "pageSaveRequested"; "agenticAuthoringApplied": "agenticAuthoringApplied"; "agenticAuthoringSharedRuleHandoff": "agenticAuthoringSharedRuleHandoff"; "pageRestart": "pageRestart"; "savedPageDeleteRequested": "savedPageDeleteRequested"; }, never, never, true, never>;
|
|
2750
|
+
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>;
|
|
2735
2751
|
}
|
|
2736
2752
|
|
|
2737
2753
|
/** Metadata for Praxis Page Builder component */
|