@praxisui/page-builder 10.0.0-rc.12 → 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-13T20:53:39.090Z",
3
+ "generatedAt": "2026-10-14T09:51:43.880Z",
4
4
  "packageName": "@praxisui/page-builder",
5
- "packageVersion": "10.0.0-rc.12",
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
- ...Object.keys(page?.state?.derived ?? {}).map(path => `derived:${path}`),
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: (statePaths.length ? statePaths : [fallbackStatePath]).slice(0, 6).map((path) => statePort(path)),
5553
+ outputs: [...valuePorts, ...derivedPorts],
5478
5554
  inputs: [],
5479
- states: (statePaths.length ? statePaths : [fallbackStatePath]).slice(0, 6).map((path) => statePort(path)),
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 compute = config?.compute;
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 || []).join(', '), { nonNullable: true }),
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 || '', { nonNullable: true }),
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 !!this.enableCustomization && !this.previewMode();
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 !!this.enableCustomization
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.runtime?.resetPersistedPage(defaultPage);
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.enableCustomization,
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.enableCustomization
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.enableCustomization) {
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.enableCustomization) {
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]="enableCustomization && !connectionsViewerOpen()"
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]="!!enableCustomization"
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]="enableCustomization && !connectionsViewerOpen()"
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]="!!enableCustomization"
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.12",
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",
12
- "@praxisui/core": "^10.0.0-rc.12",
13
- "@praxisui/settings-panel": "^10.0.0-rc.12",
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: WidgetPageDefinition): void;
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 */