@praxisui/core 9.0.27 → 9.0.29

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, InjectionToken, Injectable, inject, Inject, Optional, SkipSelf, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, Input, Directive, input, booleanAttribute, ChangeDetectionStrategy, EventEmitter, Output, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, Injector, ElementRef, ChangeDetectorRef, HostListener, ViewChildren, ViewChild, output, effect } from '@angular/core';
2
+ import { Component, InjectionToken, Injectable, inject, Inject, Optional, SkipSelf, makeEnvironmentProviders, APP_INITIALIZER, signal, computed, DestroyRef, ENVIRONMENT_INITIALIZER, ErrorHandler, Input, Directive, input, booleanAttribute, ChangeDetectionStrategy, EventEmitter, Output, SecurityContext, ViewContainerRef, SimpleChange, ContentChild, HostBinding, Injector, ElementRef, ChangeDetectorRef, afterNextRender, HostListener, ViewChildren, ViewChild, output, effect } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpClient, HttpParams, HttpResponse, HttpContextToken, HTTP_INTERCEPTORS, withInterceptors } from '@angular/common/http';
5
5
  import { of, defer, throwError, from, EMPTY, BehaviorSubject, firstValueFrom, Subject, finalize as finalize$1, shareReplay as shareReplay$1, map as map$1, switchMap as switchMap$1, catchError as catchError$1, forkJoin } from 'rxjs';
@@ -37066,6 +37066,7 @@ class DynamicWidgetContextToolbarComponent {
37066
37066
  showShellSettings = false;
37067
37067
  shellSettingsLabel = '';
37068
37068
  shellSettingsTooltip = '';
37069
+ showRemove = true;
37069
37070
  moreActionsLabel = '';
37070
37071
  removeLabel = '';
37071
37072
  assistant = new EventEmitter();
@@ -37073,7 +37074,7 @@ class DynamicWidgetContextToolbarComponent {
37073
37074
  shellSettings = new EventEmitter();
37074
37075
  remove = new EventEmitter();
37075
37076
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetContextToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37076
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetContextToolbarComponent, isStandalone: true, selector: "praxis-dynamic-widget-context-toolbar", inputs: { toolbarLabel: "toolbarLabel", contextLabel: "contextLabel", contextTooltip: "contextTooltip", showAssistant: "showAssistant", assistantLabel: "assistantLabel", assistantTooltip: "assistantTooltip", showComponentSettings: "showComponentSettings", componentSettingsLabel: "componentSettingsLabel", componentSettingsTooltip: "componentSettingsTooltip", showShellSettings: "showShellSettings", shellSettingsLabel: "shellSettingsLabel", shellSettingsTooltip: "shellSettingsTooltip", moreActionsLabel: "moreActionsLabel", removeLabel: "removeLabel" }, outputs: { assistant: "assistant", componentSettings: "componentSettings", shellSettings: "shellSettings", remove: "remove" }, ngImport: i0, template: `
37077
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetContextToolbarComponent, isStandalone: true, selector: "praxis-dynamic-widget-context-toolbar", inputs: { toolbarLabel: "toolbarLabel", contextLabel: "contextLabel", contextTooltip: "contextTooltip", showAssistant: "showAssistant", assistantLabel: "assistantLabel", assistantTooltip: "assistantTooltip", showComponentSettings: "showComponentSettings", componentSettingsLabel: "componentSettingsLabel", componentSettingsTooltip: "componentSettingsTooltip", showShellSettings: "showShellSettings", shellSettingsLabel: "shellSettingsLabel", shellSettingsTooltip: "shellSettingsTooltip", showRemove: "showRemove", moreActionsLabel: "moreActionsLabel", removeLabel: "removeLabel" }, outputs: { assistant: "assistant", componentSettings: "componentSettings", shellSettings: "shellSettings", remove: "remove" }, ngImport: i0, template: `
37077
37078
  <div
37078
37079
  class="pdx-widget-context-toolbar"
37079
37080
  [class.pdx-widget-context-toolbar--with-context]="!!contextLabel"
@@ -37125,21 +37126,23 @@ class DynamicWidgetContextToolbarComponent {
37125
37126
  (click)="shellSettings.emit()"
37126
37127
  ></button>
37127
37128
  }
37128
- <button
37129
- praxisIconButton="ms:more_horiz"
37130
- size="dense"
37131
- type="button"
37132
- data-testid="dynamic-widget-more-actions"
37133
- [matTooltip]="moreActionsLabel"
37134
- [attr.aria-label]="moreActionsLabel"
37135
- [matMenuTriggerFor]="widgetContextMenu"
37136
- ></button>
37137
- <mat-menu #widgetContextMenu="matMenu">
37138
- <button mat-menu-item type="button" data-testid="dynamic-widget-remove" (click)="remove.emit()">
37139
- <mat-icon [praxisIcon]="'delete'"></mat-icon>
37140
- <span>{{ removeLabel }}</span>
37141
- </button>
37142
- </mat-menu>
37129
+ @if (showRemove) {
37130
+ <button
37131
+ praxisIconButton="ms:more_horiz"
37132
+ size="dense"
37133
+ type="button"
37134
+ data-testid="dynamic-widget-more-actions"
37135
+ [matTooltip]="moreActionsLabel"
37136
+ [attr.aria-label]="moreActionsLabel"
37137
+ [matMenuTriggerFor]="widgetContextMenu"
37138
+ ></button>
37139
+ <mat-menu #widgetContextMenu="matMenu">
37140
+ <button mat-menu-item type="button" data-testid="dynamic-widget-remove" (click)="remove.emit()">
37141
+ <mat-icon [praxisIcon]="'delete'"></mat-icon>
37142
+ <span>{{ removeLabel }}</span>
37143
+ </button>
37144
+ </mat-menu>
37145
+ }
37143
37146
  </div>
37144
37147
  `, isInline: true, styles: [".pdx-widget-context-toolbar{position:absolute;top:-19px;right:12px;z-index:4;display:inline-flex;align-items:center;gap:4px;min-height:34px;padding:2px 4px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,transparent);box-shadow:0 10px 28px #0f172a38,0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.pdx-widget-context-toolbar--with-context{border-radius:18px}.pdx-widget-context-toolbar__context{display:inline-flex;align-items:center;align-self:stretch;max-width:180px;padding:0 8px 0 10px;border-right:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 64%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.01em;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.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: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
37145
37148
  }
@@ -37203,21 +37206,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
37203
37206
  (click)="shellSettings.emit()"
37204
37207
  ></button>
37205
37208
  }
37206
- <button
37207
- praxisIconButton="ms:more_horiz"
37208
- size="dense"
37209
- type="button"
37210
- data-testid="dynamic-widget-more-actions"
37211
- [matTooltip]="moreActionsLabel"
37212
- [attr.aria-label]="moreActionsLabel"
37213
- [matMenuTriggerFor]="widgetContextMenu"
37214
- ></button>
37215
- <mat-menu #widgetContextMenu="matMenu">
37216
- <button mat-menu-item type="button" data-testid="dynamic-widget-remove" (click)="remove.emit()">
37217
- <mat-icon [praxisIcon]="'delete'"></mat-icon>
37218
- <span>{{ removeLabel }}</span>
37219
- </button>
37220
- </mat-menu>
37209
+ @if (showRemove) {
37210
+ <button
37211
+ praxisIconButton="ms:more_horiz"
37212
+ size="dense"
37213
+ type="button"
37214
+ data-testid="dynamic-widget-more-actions"
37215
+ [matTooltip]="moreActionsLabel"
37216
+ [attr.aria-label]="moreActionsLabel"
37217
+ [matMenuTriggerFor]="widgetContextMenu"
37218
+ ></button>
37219
+ <mat-menu #widgetContextMenu="matMenu">
37220
+ <button mat-menu-item type="button" data-testid="dynamic-widget-remove" (click)="remove.emit()">
37221
+ <mat-icon [praxisIcon]="'delete'"></mat-icon>
37222
+ <span>{{ removeLabel }}</span>
37223
+ </button>
37224
+ </mat-menu>
37225
+ }
37221
37226
  </div>
37222
37227
  `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".pdx-widget-context-toolbar{position:absolute;top:-19px;right:12px;z-index:4;display:inline-flex;align-items:center;gap:4px;min-height:34px;padding:2px 4px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 28%,var(--md-sys-color-outline-variant));border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,transparent);box-shadow:0 10px 28px #0f172a38,0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.pdx-widget-context-toolbar--with-context{border-radius:18px}.pdx-widget-context-toolbar__context{display:inline-flex;align-items:center;align-self:stretch;max-width:180px;padding:0 8px 0 10px;border-right:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 64%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:11px;font-weight:700;letter-spacing:.01em;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n"] }]
37223
37228
  }], propDecorators: { toolbarLabel: [{
@@ -37244,6 +37249,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
37244
37249
  type: Input
37245
37250
  }], shellSettingsTooltip: [{
37246
37251
  type: Input
37252
+ }], showRemove: [{
37253
+ type: Input
37247
37254
  }], moreActionsLabel: [{
37248
37255
  type: Input
37249
37256
  }], removeLabel: [{
@@ -37483,6 +37490,8 @@ class DynamicWidgetPageComponent {
37483
37490
  strictValidation = true;
37484
37491
  /** Enables lightweight editing affordances (shell + page layout). */
37485
37492
  enableCustomization = false;
37493
+ /** Optional host grant that narrows the available authoring operations. */
37494
+ authoringCapabilities;
37486
37495
  /** Shows page settings button when edit mode is enabled. */
37487
37496
  showPageSettingsButton = true;
37488
37497
  /** Optional editor component override for widget shell settings. */
@@ -37584,7 +37593,7 @@ class DynamicWidgetPageComponent {
37584
37593
  widgetLoaders;
37585
37594
  constructor() {
37586
37595
  this.registerRuntimeComponentObservationProvider();
37587
- this.observeHostWidth();
37596
+ afterNextRender({ read: () => this.observeHostWidth() });
37588
37597
  }
37589
37598
  ngOnDestroy() {
37590
37599
  this.destroyed = true;
@@ -37598,6 +37607,7 @@ class DynamicWidgetPageComponent {
37598
37607
  if (changes['page'] ||
37599
37608
  changes['context'] ||
37600
37609
  changes['enableCustomization'] ||
37610
+ changes['authoringCapabilities'] ||
37601
37611
  changes['pageIdentity']) {
37602
37612
  this.widgetShellRenderCache.clear();
37603
37613
  const parsed = this.parsePage(this.page);
@@ -38866,10 +38876,21 @@ class DynamicWidgetPageComponent {
38866
38876
  }
38867
38877
  return `widget:${fromKey}:${output}:${timestamp}:${sequence}`;
38868
38878
  }
38879
+ canCustomizeCanvas() {
38880
+ return this.isAuthoringCapabilityEnabled('canvas');
38881
+ }
38882
+ canOpenPageSettings() {
38883
+ return this.isAuthoringCapabilityEnabled('pageSettings')
38884
+ && this.showPageSettingsButton
38885
+ && !!(this.pageEditorComponent || this.defaultPageEditor);
38886
+ }
38869
38887
  canOpenWidgetShellSettings() {
38870
- return !!(this.shellEditorComponent || this.defaultShellEditor);
38888
+ return this.isWidgetShellCapabilityEnabled()
38889
+ && !!(this.shellEditorComponent || this.defaultShellEditor);
38871
38890
  }
38872
38891
  canOpenWidgetComponentSettings(key) {
38892
+ if (!this.isAuthoringCapabilityEnabled('widgetInputs'))
38893
+ return false;
38873
38894
  const page = this.pageDefinition || this.parsePage(this.page);
38874
38895
  const widget = page?.widgets?.find((candidate) => candidate.key === key);
38875
38896
  if (!widget)
@@ -38877,6 +38898,38 @@ class DynamicWidgetPageComponent {
38877
38898
  const metadata = this.componentMetadata?.get(widget.definition?.id || '');
38878
38899
  return !!metadata?.configEditor?.component;
38879
38900
  }
38901
+ canRemoveWidgets() {
38902
+ return this.isAuthoringCapabilityEnabled('widgetRemoval');
38903
+ }
38904
+ canRequestWidgetAssistant() {
38905
+ return this.enableCustomization && this.showWidgetAssistantButton;
38906
+ }
38907
+ canSelectWidgets() {
38908
+ return this.enableCustomization && (this.canCustomizeCanvas()
38909
+ || this.canOpenWidgetShellSettings()
38910
+ || this.isAuthoringCapabilityEnabled('widgetInputs')
38911
+ || this.canRemoveWidgets()
38912
+ || this.canRequestWidgetAssistant());
38913
+ }
38914
+ isAuthoringCapabilityEnabled(capability) {
38915
+ return this.enableCustomization
38916
+ && this.authoringCapabilities?.[capability] !== false;
38917
+ }
38918
+ isWidgetShellCapabilityEnabled() {
38919
+ return this.isWidgetShellCapabilityEnabledFor('identity')
38920
+ || this.isWidgetShellCapabilityEnabledFor('appearance')
38921
+ || this.isWidgetShellCapabilityEnabledFor('actions');
38922
+ }
38923
+ isWidgetShellCapabilityEnabledFor(capability) {
38924
+ if (!this.enableCustomization)
38925
+ return false;
38926
+ const widgetShell = this.authoringCapabilities?.widgetShell;
38927
+ if (widgetShell === false)
38928
+ return false;
38929
+ if (!widgetShell || widgetShell === true)
38930
+ return true;
38931
+ return widgetShell[capability] !== false;
38932
+ }
38880
38933
  componentSettingsLabel() {
38881
38934
  return this.t('controls.componentSettings', 'Configurar conteúdo');
38882
38935
  }
@@ -38896,6 +38949,8 @@ class DynamicWidgetPageComponent {
38896
38949
  return this.t('controls.widgetAssistantTooltip', 'Abrir o assistente Praxis com contexto deste widget');
38897
38950
  }
38898
38951
  requestWidgetAssistant(widgetKey) {
38952
+ if (!this.canRequestWidgetAssistant())
38953
+ return;
38899
38954
  this.selectWidget(widgetKey);
38900
38955
  this.widgetAssistantRequested.emit(widgetKey);
38901
38956
  }
@@ -38920,7 +38975,8 @@ class DynamicWidgetPageComponent {
38920
38975
  });
38921
38976
  }
38922
38977
  shouldRenderWidgetContextOverlay(widget) {
38923
- return (this.enableCustomization && !this.hasVisibleWidgetShellHeader(widget));
38978
+ return (this.hasWidgetContextAuthoringActions(widget)
38979
+ && !this.hasVisibleWidgetShellHeader(widget));
38924
38980
  }
38925
38981
  widgetShellForRender(widget) {
38926
38982
  if (!this.shouldProjectWidgetHeaderActions(widget)) {
@@ -38964,7 +39020,14 @@ class DynamicWidgetPageComponent {
38964
39020
  return metadata?.friendlyName || componentId || widget.key;
38965
39021
  }
38966
39022
  shouldProjectWidgetHeaderActions(widget) {
38967
- return this.enableCustomization && this.hasVisibleWidgetShellHeader(widget);
39023
+ return this.hasWidgetContextAuthoringActions(widget)
39024
+ && this.hasVisibleWidgetShellHeader(widget);
39025
+ }
39026
+ hasWidgetContextAuthoringActions(widget) {
39027
+ return this.canRequestWidgetAssistant()
39028
+ || this.canOpenWidgetComponentSettings(widget.key)
39029
+ || this.canOpenWidgetShellSettings()
39030
+ || this.canRemoveWidgets();
38968
39031
  }
38969
39032
  hasVisibleWidgetShellHeader(widget) {
38970
39033
  const shell = widget.shell;
@@ -38989,7 +39052,7 @@ class DynamicWidgetPageComponent {
38989
39052
  }
38990
39053
  buildProjectedWidgetShellActions(widget) {
38991
39054
  const actions = [];
38992
- if (this.showWidgetAssistantButton) {
39055
+ if (this.canRequestWidgetAssistant()) {
38993
39056
  actions.push({
38994
39057
  id: 'widget-assistant',
38995
39058
  label: this.widgetAssistantLabel(),
@@ -39019,14 +39082,16 @@ class DynamicWidgetPageComponent {
39019
39082
  placement: 'header',
39020
39083
  });
39021
39084
  }
39022
- actions.push({
39023
- id: 'widget-remove',
39024
- label: this.widgetRemoveLabel(),
39025
- tooltip: this.widgetRemoveLabel(),
39026
- icon: 'delete',
39027
- variant: 'icon',
39028
- placement: 'header',
39029
- });
39085
+ if (this.canRemoveWidgets()) {
39086
+ actions.push({
39087
+ id: 'widget-remove',
39088
+ label: this.widgetRemoveLabel(),
39089
+ tooltip: this.widgetRemoveLabel(),
39090
+ icon: 'delete',
39091
+ variant: 'icon',
39092
+ placement: 'header',
39093
+ });
39094
+ }
39030
39095
  return actions;
39031
39096
  }
39032
39097
  widgetShellActionSignature(actions) {
@@ -39084,6 +39149,8 @@ class DynamicWidgetPageComponent {
39084
39149
  this.cancelCanvasInteractionForWidget(fromKey);
39085
39150
  }
39086
39151
  if (evt.id === 'widget-assistant') {
39152
+ if (!this.canRequestWidgetAssistant())
39153
+ return;
39087
39154
  this.requestWidgetAssistant(fromKey);
39088
39155
  return;
39089
39156
  }
@@ -39239,6 +39306,8 @@ class DynamicWidgetPageComponent {
39239
39306
  return path.split('.').reduce((acc, key) => acc?.[key], ctx);
39240
39307
  }
39241
39308
  openWidgetShellSettings(key) {
39309
+ if (!this.canOpenWidgetShellSettings())
39310
+ return;
39242
39311
  if (!this.settingsPanel)
39243
39312
  return;
39244
39313
  const editor = this.shellEditorComponent || this.defaultShellEditor;
@@ -39260,6 +39329,7 @@ class DynamicWidgetPageComponent {
39260
39329
  widgetType: widget.definition?.id,
39261
39330
  presets: uiShell?.presets || null,
39262
39331
  pagePreset: uiShell?.preset || null,
39332
+ authoringCapabilities: this.authoringCapabilities,
39263
39333
  },
39264
39334
  },
39265
39335
  });
@@ -39267,6 +39337,8 @@ class DynamicWidgetPageComponent {
39267
39337
  ref.saved$.subscribe((result) => this.applyWidgetShell(key, result, true));
39268
39338
  }
39269
39339
  async openWidgetComponentSettings(key) {
39340
+ if (!this.canOpenWidgetComponentSettings(key))
39341
+ return;
39270
39342
  if (!this.settingsPanel) {
39271
39343
  this.dispatchWidgetComponentSettingsToRuntime(key);
39272
39344
  return;
@@ -39423,6 +39495,8 @@ class DynamicWidgetPageComponent {
39423
39495
  this.applyPageUpdate({ ...page, widgets }, persist);
39424
39496
  }
39425
39497
  async confirmAndRemoveWidget(widgetKey) {
39498
+ if (!this.canRemoveWidgets())
39499
+ return;
39426
39500
  const page = this.ensurePageDefinition();
39427
39501
  const widget = page.widgets.find((item) => item.key === widgetKey);
39428
39502
  if (!widget) {
@@ -39551,6 +39625,8 @@ class DynamicWidgetPageComponent {
39551
39625
  return (endpoint.kind === 'component-port' && endpoint.ref.widget === widgetKey);
39552
39626
  }
39553
39627
  openPageSettings() {
39628
+ if (!this.canOpenPageSettings())
39629
+ return;
39554
39630
  if (!this.settingsPanel)
39555
39631
  return;
39556
39632
  const editor = this.pageEditorComponent || this.defaultPageEditor;
@@ -39568,6 +39644,7 @@ class DynamicWidgetPageComponent {
39568
39644
  layout: page.layout || null,
39569
39645
  presets: uiShell?.presets || null,
39570
39646
  pagePreset: uiShell?.preset || null,
39647
+ authoringCapabilities: this.authoringCapabilities,
39571
39648
  },
39572
39649
  },
39573
39650
  });
@@ -39578,9 +39655,16 @@ class DynamicWidgetPageComponent {
39578
39655
  if (!result)
39579
39656
  return;
39580
39657
  const page = this.ensurePageDefinition();
39581
- const widgets = page.widgets.map((w) => w.key === key ? { ...w, shell: result.shell ?? null } : w);
39658
+ const widgets = page.widgets.map((w) => w.key === key
39659
+ ? {
39660
+ ...w,
39661
+ shell: this.constrainWidgetShellResult(w.shell, result.shell),
39662
+ }
39663
+ : w);
39582
39664
  let context = page.context || {};
39583
- if (result.applyToAll && result.pagePreset) {
39665
+ if (this.isWidgetShellCapabilityEnabledFor('pagePreset') &&
39666
+ result.applyToAll &&
39667
+ result.pagePreset) {
39584
39668
  const ui = { ...context.ui };
39585
39669
  const shell = { ...(ui?.shell || {}) };
39586
39670
  shell.preset = result.pagePreset;
@@ -39589,6 +39673,41 @@ class DynamicWidgetPageComponent {
39589
39673
  }
39590
39674
  this.applyPageUpdate({ ...page, widgets, context }, persist);
39591
39675
  }
39676
+ constrainWidgetShellResult(original, proposed) {
39677
+ const next = proposed ? { ...proposed } : {};
39678
+ if (!this.isWidgetShellCapabilityEnabledFor('identity')) {
39679
+ this.restoreWidgetShellFields(next, original, [
39680
+ 'kind',
39681
+ 'preset',
39682
+ 'icon',
39683
+ 'title',
39684
+ 'subtitle',
39685
+ 'showHeader',
39686
+ 'windowActions',
39687
+ 'collapsed',
39688
+ 'expanded',
39689
+ 'fullscreen',
39690
+ ]);
39691
+ }
39692
+ if (!this.isWidgetShellCapabilityEnabledFor('appearance')) {
39693
+ this.restoreWidgetShellFields(next, original, [
39694
+ 'bodyLayout',
39695
+ 'appearance',
39696
+ ]);
39697
+ }
39698
+ if (!this.isWidgetShellCapabilityEnabledFor('actions')) {
39699
+ this.restoreWidgetShellFields(next, original, ['actions']);
39700
+ }
39701
+ return Object.keys(next).length ? next : undefined;
39702
+ }
39703
+ restoreWidgetShellFields(target, source, fields) {
39704
+ for (const field of fields) {
39705
+ delete target[field];
39706
+ if (source && Object.prototype.hasOwnProperty.call(source, field)) {
39707
+ Object.assign(target, { [field]: source[field] });
39708
+ }
39709
+ }
39710
+ }
39592
39711
  applyPageLayout(result, persist) {
39593
39712
  if (!result)
39594
39713
  return;
@@ -39756,6 +39875,11 @@ class DynamicWidgetPageComponent {
39756
39875
  onWindowResize() {
39757
39876
  if (!this.pageDefinition)
39758
39877
  return;
39878
+ const measuredWidth = this.measureHostWidth();
39879
+ if (this.updateContainerWidth(measuredWidth))
39880
+ return;
39881
+ if (this.containerWidth)
39882
+ return;
39759
39883
  this.applyResponsivePresentation(this.pageDefinition, this.pageDefinition.widgets || [], this.pageRuntime);
39760
39884
  }
39761
39885
  onCanvasPointerMove(event) {
@@ -40041,25 +40165,35 @@ class DynamicWidgetPageComponent {
40041
40165
  : fallback;
40042
40166
  }
40043
40167
  observeHostWidth() {
40168
+ if (this.destroyed)
40169
+ return;
40170
+ this.updateContainerWidth(this.measureHostWidth());
40044
40171
  const ResizeObserverCtor = globalThis.ResizeObserver;
40045
40172
  if (typeof ResizeObserverCtor !== 'function') {
40046
40173
  return;
40047
40174
  }
40048
40175
  this.hostResizeObserver = new ResizeObserverCtor((entries) => {
40049
- const width = entries[0]?.contentRect.width;
40050
- if (!Number.isFinite(width)
40051
- || width <= 0
40052
- || Math.abs(width - (this.containerWidth || 0)) < 0.5) {
40053
- return;
40054
- }
40055
- this.containerWidth = width;
40056
- if (this.pageDefinition) {
40057
- this.applyResponsivePresentation(this.pageDefinition, this.pageDefinition.widgets || [], this.pageRuntime);
40058
- this.changeDetector.markForCheck();
40059
- }
40176
+ this.updateContainerWidth(entries[0]?.contentRect.width);
40060
40177
  });
40061
40178
  this.hostResizeObserver.observe(this.hostElement.nativeElement);
40062
40179
  }
40180
+ measureHostWidth() {
40181
+ return this.hostElement.nativeElement.getBoundingClientRect().width;
40182
+ }
40183
+ updateContainerWidth(width) {
40184
+ if (!Number.isFinite(width)
40185
+ || !width
40186
+ || width <= 0
40187
+ || Math.abs(width - (this.containerWidth || 0)) < 0.5) {
40188
+ return false;
40189
+ }
40190
+ this.containerWidth = width;
40191
+ if (this.pageDefinition) {
40192
+ this.applyResponsivePresentation(this.pageDefinition, this.pageDefinition.widgets || [], this.pageRuntime);
40193
+ this.changeDetector.markForCheck();
40194
+ }
40195
+ return true;
40196
+ }
40063
40197
  isCanvasMode() {
40064
40198
  return !!this.canvas;
40065
40199
  }
@@ -40082,7 +40216,7 @@ class DynamicWidgetPageComponent {
40082
40216
  link.from.ref.direction === 'output');
40083
40217
  }
40084
40218
  selectWidget(widgetKey) {
40085
- if (!this.enableCustomization)
40219
+ if (!this.canSelectWidgets())
40086
40220
  return;
40087
40221
  if (this.selectedWidgetKeyState() !== widgetKey) {
40088
40222
  this.selectedWidgetKeyState.set(widgetKey);
@@ -40132,13 +40266,17 @@ class DynamicWidgetPageComponent {
40132
40266
  return this.canvasPreviewInvalidState();
40133
40267
  }
40134
40268
  startCanvasDrag(widgetKey, event) {
40269
+ if (!this.canCustomizeCanvas())
40270
+ return;
40135
40271
  this.startCanvasInteraction(widgetKey, event, 'drag');
40136
40272
  }
40137
40273
  startCanvasResize(widgetKey, handle, event) {
40274
+ if (!this.canCustomizeCanvas())
40275
+ return;
40138
40276
  this.startCanvasInteraction(widgetKey, event, 'resize', handle);
40139
40277
  }
40140
40278
  onCanvasHandleKeydown(widgetKey, kind, event) {
40141
- if (!this.enableCustomization || !this.isCanvasMode())
40279
+ if (!this.canCustomizeCanvas() || !this.isCanvasMode())
40142
40280
  return;
40143
40281
  this.selectCanvasWidget(widgetKey);
40144
40282
  const horizontal = event.key === 'ArrowLeft' || event.key === 'ArrowRight';
@@ -40156,7 +40294,7 @@ class DynamicWidgetPageComponent {
40156
40294
  }, true, this.canvasAnnouncement(kind, widgetKey), this.blockedCanvasAnnouncement(kind), kind);
40157
40295
  }
40158
40296
  onCanvasResizeHandleKeydown(widgetKey, handle, event) {
40159
- if (!this.enableCustomization || !this.isCanvasMode())
40297
+ if (!this.canCustomizeCanvas() || !this.isCanvasMode())
40160
40298
  return;
40161
40299
  this.selectCanvasWidget(widgetKey);
40162
40300
  const horizontal = event.key === 'ArrowLeft' || event.key === 'ArrowRight';
@@ -40231,7 +40369,7 @@ class DynamicWidgetPageComponent {
40231
40369
  });
40232
40370
  }
40233
40371
  startCanvasInteraction(widgetKey, event, kind, resizeHandle) {
40234
- if (!this.enableCustomization || !this.isCanvasMode())
40372
+ if (!this.canCustomizeCanvas() || !this.isCanvasMode())
40235
40373
  return;
40236
40374
  if (this.isCanvasOverlayInteraction(event))
40237
40375
  return;
@@ -41011,7 +41149,7 @@ class DynamicWidgetPageComponent {
41011
41149
  throw new Error('DynamicWidgetPageComponent no longer accepts `page.connections`. Use `composition.links` only.');
41012
41150
  }
41013
41151
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41014
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetPageComponent, isStandalone: true, selector: "praxis-dynamic-page", inputs: { page: "page", context: "context", strictValidation: "strictValidation", enableCustomization: "enableCustomization", showPageSettingsButton: "showPageSettingsButton", shellEditorComponent: "shellEditorComponent", pageEditorComponent: "pageEditorComponent", autoPersist: "autoPersist", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", showWidgetAssistantButton: "showWidgetAssistantButton" }, outputs: { pageChange: "pageChange", widgetEvent: "widgetEvent", widgetSelectionChange: "widgetSelectionChange", widgetAssistantRequested: "widgetAssistantRequested", widgetDiagnosticsChange: "widgetDiagnosticsChange" }, host: { listeners: { "window:resize": "onWindowResize()", "window:pointermove": "onCanvasPointerMove($event)", "window:pointerup": "onCanvasPointerUp($event)", "window:pointercancel": "onCanvasPointerCancel($event)" } }, providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], viewQueries: [{ propertyName: "pageCanvasHost", first: true, predicate: ["pageCanvasHost"], descendants: true }, { propertyName: "widgetLoaders", predicate: ["widgetLoader"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
41152
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: DynamicWidgetPageComponent, isStandalone: true, selector: "praxis-dynamic-page", inputs: { page: "page", context: "context", strictValidation: "strictValidation", enableCustomization: "enableCustomization", authoringCapabilities: "authoringCapabilities", showPageSettingsButton: "showPageSettingsButton", shellEditorComponent: "shellEditorComponent", pageEditorComponent: "pageEditorComponent", autoPersist: "autoPersist", pageIdentity: "pageIdentity", componentInstanceId: "componentInstanceId", showWidgetAssistantButton: "showWidgetAssistantButton" }, outputs: { pageChange: "pageChange", widgetEvent: "widgetEvent", widgetSelectionChange: "widgetSelectionChange", widgetAssistantRequested: "widgetAssistantRequested", widgetDiagnosticsChange: "widgetDiagnosticsChange" }, host: { listeners: { "window:resize": "onWindowResize()", "window:pointermove": "onCanvasPointerMove($event)", "window:pointerup": "onCanvasPointerUp($event)", "window:pointercancel": "onCanvasPointerCancel($event)" } }, providers: [providePraxisI18nConfig(DYNAMIC_WIDGET_PAGE_I18N_CONFIG)], viewQueries: [{ propertyName: "pageCanvasHost", first: true, predicate: ["pageCanvasHost"], descendants: true }, { propertyName: "widgetLoaders", predicate: ["widgetLoader"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
41015
41153
  <div
41016
41154
  class="pdx-page-wrapper"
41017
41155
  [class.editing]="enableCustomization"
@@ -41020,7 +41158,7 @@ class DynamicWidgetPageComponent {
41020
41158
  [attr.data-motion]="pageThemeMotion"
41021
41159
  [ngStyle]="pageThemeTokenStyle"
41022
41160
  >
41023
- @if (enableCustomization && showPageSettingsButton) {
41161
+ @if (canOpenPageSettings()) {
41024
41162
  <button
41025
41163
  class="pdx-page-settings"
41026
41164
  praxisIconButton="ms:settings"
@@ -41045,15 +41183,15 @@ class DynamicWidgetPageComponent {
41045
41183
  <div
41046
41184
  class="pdx-widget pdx-widget--canvas"
41047
41185
  [attr.data-widget-key]="w.key"
41048
- [class.pdx-widget--interactive]="enableCustomization"
41186
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41049
41187
  [class.pdx-widget--selected]="
41050
- enableCustomization && isWidgetSelected(w.key)
41188
+ canSelectWidgets() && isWidgetSelected(w.key)
41051
41189
  "
41052
41190
  [class.pdx-widget--canvas-selected]="
41053
- enableCustomization && isWidgetSelected(w.key)
41191
+ canCustomizeCanvas() && isWidgetSelected(w.key)
41054
41192
  "
41055
41193
  [class.pdx-widget--canvas-blocked]="
41056
- enableCustomization && isCanvasWidgetBlocked(w.key)
41194
+ canCustomizeCanvas() && isCanvasWidgetBlocked(w.key)
41057
41195
  "
41058
41196
  [class]="widgetClassName(w)"
41059
41197
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41063,7 +41201,7 @@ class DynamicWidgetPageComponent {
41063
41201
  (click)="selectWidgetFromHostEvent(w.key, $event)"
41064
41202
  (focusin)="selectWidgetFromHostEvent(w.key, $event)"
41065
41203
  >
41066
- @if (enableCustomization) {
41204
+ @if (canCustomizeCanvas()) {
41067
41205
  @for (handle of canvasResizeHandles; track handle.id) {
41068
41206
  <button
41069
41207
  class="pdx-canvas-resize"
@@ -41084,7 +41222,7 @@ class DynamicWidgetPageComponent {
41084
41222
  <praxis-widget-shell
41085
41223
  [shell]="widgetShellForRender(w)"
41086
41224
  [context]="mergedContext"
41087
- [dragSurfaceEnabled]="enableCustomization && isCanvasMode()"
41225
+ [dragSurfaceEnabled]="canCustomizeCanvas() && isCanvasMode()"
41088
41226
  [dragSurfaceLabel]="dragWidgetLabel()"
41089
41227
  (action)="onShellAction(w.key, $event)"
41090
41228
  (dragSurfacePointerDown)="startCanvasDrag(w.key, $event)"
@@ -41108,7 +41246,7 @@ class DynamicWidgetPageComponent {
41108
41246
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41109
41247
  [contextLabel]="widgetContextLabel(w)"
41110
41248
  [contextTooltip]="widgetContextTooltip(w)"
41111
- [showAssistant]="showWidgetAssistantButton"
41249
+ [showAssistant]="canRequestWidgetAssistant()"
41112
41250
  [assistantLabel]="widgetAssistantLabel()"
41113
41251
  [assistantTooltip]="widgetAssistantTooltip()"
41114
41252
  [showComponentSettings]="
@@ -41120,6 +41258,7 @@ class DynamicWidgetPageComponent {
41120
41258
  [shellSettingsLabel]="widgetSettingsLabel()"
41121
41259
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41122
41260
  [moreActionsLabel]="moreWidgetActionsLabel()"
41261
+ [showRemove]="canRemoveWidgets()"
41123
41262
  [removeLabel]="widgetRemoveLabel()"
41124
41263
  (assistant)="requestWidgetAssistant(w.key)"
41125
41264
  (componentSettings)="openWidgetComponentSettings(w.key)"
@@ -41186,11 +41325,9 @@ class DynamicWidgetPageComponent {
41186
41325
  <div
41187
41326
  class="pdx-widget"
41188
41327
  [attr.data-widget-key]="w.key"
41189
- [class.pdx-widget--interactive]="
41190
- enableCustomization
41191
- "
41328
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41192
41329
  [class.pdx-widget--selected]="
41193
- enableCustomization && isWidgetSelected(w.key)
41330
+ canSelectWidgets() && isWidgetSelected(w.key)
41194
41331
  "
41195
41332
  [class]="w.renderClassName || w.className || ''"
41196
41333
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41223,7 +41360,7 @@ class DynamicWidgetPageComponent {
41223
41360
  "
41224
41361
  [contextLabel]="widgetContextLabel(w)"
41225
41362
  [contextTooltip]="widgetContextTooltip(w)"
41226
- [showAssistant]="showWidgetAssistantButton"
41363
+ [showAssistant]="canRequestWidgetAssistant()"
41227
41364
  [assistantLabel]="widgetAssistantLabel()"
41228
41365
  [assistantTooltip]="widgetAssistantTooltip()"
41229
41366
  [showComponentSettings]="
@@ -41241,6 +41378,7 @@ class DynamicWidgetPageComponent {
41241
41378
  [shellSettingsLabel]="widgetSettingsLabel()"
41242
41379
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41243
41380
  [moreActionsLabel]="moreWidgetActionsLabel()"
41381
+ [showRemove]="canRemoveWidgets()"
41244
41382
  [removeLabel]="widgetRemoveLabel()"
41245
41383
  (assistant)="requestWidgetAssistant(w.key)"
41246
41384
  (componentSettings)="
@@ -41267,9 +41405,9 @@ class DynamicWidgetPageComponent {
41267
41405
  <div
41268
41406
  class="pdx-widget"
41269
41407
  [attr.data-widget-key]="w.key"
41270
- [class.pdx-widget--interactive]="enableCustomization"
41408
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41271
41409
  [class.pdx-widget--selected]="
41272
- enableCustomization && isWidgetSelected(w.key)
41410
+ canSelectWidgets() && isWidgetSelected(w.key)
41273
41411
  "
41274
41412
  [class]="widgetClassName(w)"
41275
41413
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41298,7 +41436,7 @@ class DynamicWidgetPageComponent {
41298
41436
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41299
41437
  [contextLabel]="widgetContextLabel(w)"
41300
41438
  [contextTooltip]="widgetContextTooltip(w)"
41301
- [showAssistant]="showWidgetAssistantButton"
41439
+ [showAssistant]="canRequestWidgetAssistant()"
41302
41440
  [assistantLabel]="widgetAssistantLabel()"
41303
41441
  [assistantTooltip]="widgetAssistantTooltip()"
41304
41442
  [showComponentSettings]="
@@ -41312,6 +41450,7 @@ class DynamicWidgetPageComponent {
41312
41450
  [shellSettingsLabel]="widgetSettingsLabel()"
41313
41451
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41314
41452
  [moreActionsLabel]="moreWidgetActionsLabel()"
41453
+ [showRemove]="canRemoveWidgets()"
41315
41454
  [removeLabel]="widgetRemoveLabel()"
41316
41455
  (assistant)="requestWidgetAssistant(w.key)"
41317
41456
  (componentSettings)="
@@ -41332,9 +41471,9 @@ class DynamicWidgetPageComponent {
41332
41471
  <div
41333
41472
  class="pdx-widget"
41334
41473
  [attr.data-widget-key]="w.key"
41335
- [class.pdx-widget--interactive]="enableCustomization"
41474
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41336
41475
  [class.pdx-widget--selected]="
41337
- enableCustomization && isWidgetSelected(w.key)
41476
+ canSelectWidgets() && isWidgetSelected(w.key)
41338
41477
  "
41339
41478
  [class]="widgetClassName(w)"
41340
41479
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41363,7 +41502,7 @@ class DynamicWidgetPageComponent {
41363
41502
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41364
41503
  [contextLabel]="widgetContextLabel(w)"
41365
41504
  [contextTooltip]="widgetContextTooltip(w)"
41366
- [showAssistant]="showWidgetAssistantButton"
41505
+ [showAssistant]="canRequestWidgetAssistant()"
41367
41506
  [assistantLabel]="widgetAssistantLabel()"
41368
41507
  [assistantTooltip]="widgetAssistantTooltip()"
41369
41508
  [showComponentSettings]="
@@ -41375,6 +41514,7 @@ class DynamicWidgetPageComponent {
41375
41514
  [shellSettingsLabel]="widgetSettingsLabel()"
41376
41515
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41377
41516
  [moreActionsLabel]="moreWidgetActionsLabel()"
41517
+ [showRemove]="canRemoveWidgets()"
41378
41518
  [removeLabel]="widgetRemoveLabel()"
41379
41519
  (assistant)="requestWidgetAssistant(w.key)"
41380
41520
  (componentSettings)="openWidgetComponentSettings(w.key)"
@@ -41392,7 +41532,7 @@ class DynamicWidgetPageComponent {
41392
41532
  </div>
41393
41533
  }
41394
41534
  </div>
41395
- `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-page-wrapper{position:relative;display:block;background:var(--pdx-page-bg, transparent);color:var(--pdx-page-color, inherit)}.pdx-page{display:grid;gap:var(--pdx-page-gap, 12px);grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-wrapper.editing .pdx-page--canvas{padding-block-start:var(--pdx-canvas-context-toolbar-safe-area, 22px);padding-block-end:22px;padding-inline:22px;box-sizing:border-box}.pdx-page-settings{position:sticky;top:8px;z-index:2;color:inherit;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:52px;height:44px;margin-left:-26px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-22px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-22px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:44px;height:52px;margin-top:-26px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-22px;cursor:ew-resize}.pdx-canvas-resize--west{left:-22px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:44px;height:44px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-22px;right:-22px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-22px;left:-22px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-22px;right:-22px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-22px;left:-22px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: DynamicWidgetContextToolbarComponent, selector: "praxis-dynamic-widget-context-toolbar", inputs: ["toolbarLabel", "contextLabel", "contextTooltip", "showAssistant", "assistantLabel", "assistantTooltip", "showComponentSettings", "componentSettingsLabel", "componentSettingsTooltip", "showShellSettings", "shellSettingsLabel", "shellSettingsTooltip", "moreActionsLabel", "removeLabel"], outputs: ["assistant", "componentSettings", "shellSettings", "remove"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: WidgetShellComponent, selector: "praxis-widget-shell", inputs: ["shell", "context", "dragSurfaceEnabled", "dragSurfaceLabel"], outputs: ["action", "dragSurfacePointerDown", "dragSurfaceKeydown"] }] });
41535
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-page-wrapper{position:relative;display:block;background:var(--pdx-page-bg, transparent);color:var(--pdx-page-color, inherit)}.pdx-page{display:grid;gap:var(--pdx-page-gap, 12px);grid-template-columns:minmax(0,1fr)}.pdx-page--canvas{align-items:start;grid-auto-flow:dense}.pdx-page-wrapper.editing .pdx-page--canvas{padding-block-start:var(--pdx-canvas-context-toolbar-safe-area, 22px);padding-block-end:22px;padding-inline:22px;box-sizing:border-box}.pdx-page-settings{position:sticky;top:8px;z-index:2;color:inherit;margin-bottom:6px}.pdx-widget{position:relative;background:var(--pfx-surface, transparent);border-radius:6px;min-width:0;min-height:0}.pdx-widget--interactive{cursor:pointer}.pdx-widget--selected:before{content:\"\";position:absolute;inset:0;border:1px dashed color-mix(in srgb,var(--md-sys-color-primary) 34%,transparent);border-radius:14px;pointer-events:none;z-index:1;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent),0 8px 20px color-mix(in srgb,var(--md-sys-color-primary) 6%,transparent)}.pdx-widget--canvas{align-self:stretch;--pdx-resize-gradient-horizontal: linear-gradient( 90deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-vertical: linear-gradient( 180deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-se: linear-gradient( 135deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-resize-gradient-diagonal-sw: linear-gradient( 225deg, color-mix(in srgb, var(--md-sys-color-primary) 94%, white 6%), color-mix(in srgb, var(--md-sys-color-tertiary) 90%, white 10%), color-mix(in srgb, var(--md-sys-color-secondary) 88%, white 12%) );--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-widget--canvas:after{content:\"\";position:absolute;inset:0;padding:2px;border-radius:14px;background:var(--pdx-active-resize-gradient);opacity:0;pointer-events:none;transition:opacity .14s ease,filter .14s ease;filter:saturate(1.02) drop-shadow(0 0 5px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude}.pdx-widget--canvas-selected:before,.pdx-widget--canvas-blocked:before{content:\"\";position:absolute;inset:0;border-radius:14px;pointer-events:none;z-index:1;transition:opacity .14s ease,box-shadow .14s ease,border-color .14s ease}.pdx-widget--canvas-blocked:before{border:1px solid color-mix(in srgb,var(--md-sys-color-error) 74%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 20%,transparent),0 10px 24px color-mix(in srgb,var(--md-sys-color-error) 12%,transparent)}.pdx-widget--canvas:has(.pdx-canvas-resize:hover):after,.pdx-widget--canvas:has(.pdx-canvas-resize:focus-visible):after{opacity:.82}.pdx-widget--canvas:has(.pdx-canvas-resize--north:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-horizontal)}.pdx-widget--canvas:has(.pdx-canvas-resize--east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-vertical)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-east:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-west:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-sw)}.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--north-west:focus-visible),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:hover),.pdx-widget--canvas:has(.pdx-canvas-resize--south-east:focus-visible){--pdx-active-resize-gradient: var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize{position:absolute;z-index:7;border:0;padding:0;margin:0;background:transparent;touch-action:none;cursor:pointer;opacity:0;pointer-events:none;transform:scale(.94);transition:opacity .14s ease,transform .14s ease,filter .14s ease;filter:saturate(.9)}.pdx-widget--canvas:hover .pdx-canvas-resize,.pdx-widget--canvas:focus-within .pdx-canvas-resize,.pdx-widget--canvas-selected .pdx-canvas-resize{opacity:.88;pointer-events:auto;transform:scale(1);filter:saturate(1)}.pdx-widget--canvas:has(.pdx-shell.expanded) .pdx-canvas-resize,.pdx-widget--canvas:has(.pdx-shell.fullscreen) .pdx-canvas-resize{opacity:0;pointer-events:none;transform:scale(.94)}.pdx-canvas-resize-grip{display:block;width:9px;height:9px;border-radius:999px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 42%,var(--md-sys-color-outline-variant) 58%);background:color-mix(in srgb,var(--md-sys-color-surface) 92%,var(--md-sys-color-primary) 8%);box-shadow:0 1px 4px color-mix(in srgb,var(--md-sys-color-shadow) 10%,transparent);transition:transform .14s ease,border-color .14s ease,background .14s ease,box-shadow .14s ease}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:color-mix(in srgb,var(--md-sys-color-primary) 58%,var(--md-sys-color-outline-variant) 42%);background:color-mix(in srgb,var(--md-sys-color-surface) 84%,var(--md-sys-color-primary) 16%);box-shadow:0 2px 7px color-mix(in srgb,var(--md-sys-color-primary) 14%,transparent);transform:scale(1.04)}.pdx-canvas-resize--north,.pdx-canvas-resize--south{left:50%;width:52px;height:44px;margin-left:-26px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north{top:-22px;cursor:ns-resize}.pdx-canvas-resize--south{bottom:-22px;cursor:ns-resize}.pdx-canvas-resize--east,.pdx-canvas-resize--west{top:50%;width:44px;height:52px;margin-top:-26px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--east{right:-22px;cursor:ew-resize}.pdx-canvas-resize--west{left:-22px;cursor:ew-resize}.pdx-canvas-resize--north-east,.pdx-canvas-resize--north-west,.pdx-canvas-resize--south-east,.pdx-canvas-resize--south-west{width:44px;height:44px;display:flex;align-items:center;justify-content:center}.pdx-canvas-resize--north-east{top:-22px;right:-22px;cursor:nesw-resize}.pdx-canvas-resize--north-west{top:-22px;left:-22px;cursor:nwse-resize}.pdx-canvas-resize--south-east{bottom:-22px;right:-22px;cursor:nwse-resize}.pdx-canvas-resize--south-west{bottom:-22px;left:-22px;cursor:nesw-resize}.pdx-canvas-snap-preview{position:relative;align-self:stretch;border-radius:12px;pointer-events:none;z-index:0;background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent),color-mix(in srgb,var(--md-sys-color-tertiary) 12%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 42%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 55%,transparent);animation:pdx-snap-preview-pulse .48s ease-out infinite alternate}.pdx-canvas-snap-preview:before,.pdx-canvas-snap-preview:after{content:\"\";position:absolute;border-radius:999px;background:color-mix(in srgb,var(--md-sys-color-primary) 82%,var(--md-sys-color-tertiary) 18%);opacity:.72}.pdx-canvas-snap-preview:before{inset:0 auto 0 0;width:3px}.pdx-canvas-snap-preview:after{inset:0 0 auto;height:3px}.pdx-canvas-snap-preview--invalid{background:linear-gradient(135deg,color-mix(in srgb,var(--md-sys-color-error) 18%,transparent),color-mix(in srgb,var(--md-sys-color-error-container) 22%,transparent));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-sys-color-error) 58%,transparent),inset 0 0 0 2px color-mix(in srgb,var(--md-sys-color-surface) 40%,transparent)}.pdx-canvas-snap-preview--invalid:before,.pdx-canvas-snap-preview--invalid:after{background:color-mix(in srgb,var(--md-sys-color-error) 86%,var(--md-sys-color-error-container) 14%)}.pdx-canvas-resize:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{border-color:transparent;box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 20%,transparent),var(--mat-elevation-level3)}.pdx-canvas-resize--north:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-horizontal)}.pdx-canvas-resize--east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-vertical)}.pdx-canvas-resize--north-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-east:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-west:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-sw)}.pdx-canvas-resize--north-west:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--north-west:focus-visible .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:hover .pdx-canvas-resize-grip,.pdx-canvas-resize--south-east:focus-visible .pdx-canvas-resize-grip{background:var(--pdx-resize-gradient-diagonal-se)}.pdx-canvas-resize:hover .pdx-canvas-resize-grip,.pdx-canvas-resize:focus-visible .pdx-canvas-resize-grip{transform:scale(1.08)}@keyframes pdx-snap-preview-pulse{0%{opacity:.72;transform:scale(.996)}to{opacity:1;transform:scale(1)}}.pdx-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.pdx-group{display:grid;gap:12px;grid-column:1 / -1;padding:12px;border-radius:16px;background:color-mix(in srgb,var(--md-sys-color-surface-container-low) 76%,transparent);border:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent)}.pdx-group--hero{padding:16px;background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary-container) 42%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-low) 86%,transparent))}.pdx-group--rail{align-self:start}.pdx-group-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.pdx-group-title{font-size:.95rem;font-weight:600;color:var(--md-sys-color-on-surface)}.pdx-group-content{display:grid;gap:12px}.pdx-group-content--stack{grid-template-columns:minmax(0,1fr)}.pdx-group-content--row{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.pdx-group-content--grid{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.pdx-group-tabs{display:grid;gap:12px}.pdx-tabs-header{display:flex;flex-wrap:wrap;gap:8px}.pdx-tab-chip{appearance:none;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest);color:var(--md-sys-color-on-surface);border-radius:999px;padding:8px 12px;font:inherit;cursor:pointer}.pdx-tab-chip.active{border-color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary-container) 78%,transparent);color:var(--md-sys-color-on-primary-container)}.pdx-page-wrapper.editing .pdx-widget-settings{opacity:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: DynamicWidgetContextToolbarComponent, selector: "praxis-dynamic-widget-context-toolbar", inputs: ["toolbarLabel", "contextLabel", "contextTooltip", "showAssistant", "assistantLabel", "assistantTooltip", "showComponentSettings", "componentSettingsLabel", "componentSettingsTooltip", "showShellSettings", "shellSettingsLabel", "shellSettingsTooltip", "showRemove", "moreActionsLabel", "removeLabel"], outputs: ["assistant", "componentSettings", "shellSettings", "remove"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: WidgetShellComponent, selector: "praxis-widget-shell", inputs: ["shell", "context", "dragSurfaceEnabled", "dragSurfaceLabel"], outputs: ["action", "dragSurfacePointerDown", "dragSurfaceKeydown"] }] });
41396
41536
  }
41397
41537
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetPageComponent, decorators: [{
41398
41538
  type: Component,
@@ -41413,7 +41553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41413
41553
  [attr.data-motion]="pageThemeMotion"
41414
41554
  [ngStyle]="pageThemeTokenStyle"
41415
41555
  >
41416
- @if (enableCustomization && showPageSettingsButton) {
41556
+ @if (canOpenPageSettings()) {
41417
41557
  <button
41418
41558
  class="pdx-page-settings"
41419
41559
  praxisIconButton="ms:settings"
@@ -41438,15 +41578,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41438
41578
  <div
41439
41579
  class="pdx-widget pdx-widget--canvas"
41440
41580
  [attr.data-widget-key]="w.key"
41441
- [class.pdx-widget--interactive]="enableCustomization"
41581
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41442
41582
  [class.pdx-widget--selected]="
41443
- enableCustomization && isWidgetSelected(w.key)
41583
+ canSelectWidgets() && isWidgetSelected(w.key)
41444
41584
  "
41445
41585
  [class.pdx-widget--canvas-selected]="
41446
- enableCustomization && isWidgetSelected(w.key)
41586
+ canCustomizeCanvas() && isWidgetSelected(w.key)
41447
41587
  "
41448
41588
  [class.pdx-widget--canvas-blocked]="
41449
- enableCustomization && isCanvasWidgetBlocked(w.key)
41589
+ canCustomizeCanvas() && isCanvasWidgetBlocked(w.key)
41450
41590
  "
41451
41591
  [class]="widgetClassName(w)"
41452
41592
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41456,7 +41596,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41456
41596
  (click)="selectWidgetFromHostEvent(w.key, $event)"
41457
41597
  (focusin)="selectWidgetFromHostEvent(w.key, $event)"
41458
41598
  >
41459
- @if (enableCustomization) {
41599
+ @if (canCustomizeCanvas()) {
41460
41600
  @for (handle of canvasResizeHandles; track handle.id) {
41461
41601
  <button
41462
41602
  class="pdx-canvas-resize"
@@ -41477,7 +41617,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41477
41617
  <praxis-widget-shell
41478
41618
  [shell]="widgetShellForRender(w)"
41479
41619
  [context]="mergedContext"
41480
- [dragSurfaceEnabled]="enableCustomization && isCanvasMode()"
41620
+ [dragSurfaceEnabled]="canCustomizeCanvas() && isCanvasMode()"
41481
41621
  [dragSurfaceLabel]="dragWidgetLabel()"
41482
41622
  (action)="onShellAction(w.key, $event)"
41483
41623
  (dragSurfacePointerDown)="startCanvasDrag(w.key, $event)"
@@ -41501,7 +41641,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41501
41641
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41502
41642
  [contextLabel]="widgetContextLabel(w)"
41503
41643
  [contextTooltip]="widgetContextTooltip(w)"
41504
- [showAssistant]="showWidgetAssistantButton"
41644
+ [showAssistant]="canRequestWidgetAssistant()"
41505
41645
  [assistantLabel]="widgetAssistantLabel()"
41506
41646
  [assistantTooltip]="widgetAssistantTooltip()"
41507
41647
  [showComponentSettings]="
@@ -41513,6 +41653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41513
41653
  [shellSettingsLabel]="widgetSettingsLabel()"
41514
41654
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41515
41655
  [moreActionsLabel]="moreWidgetActionsLabel()"
41656
+ [showRemove]="canRemoveWidgets()"
41516
41657
  [removeLabel]="widgetRemoveLabel()"
41517
41658
  (assistant)="requestWidgetAssistant(w.key)"
41518
41659
  (componentSettings)="openWidgetComponentSettings(w.key)"
@@ -41579,11 +41720,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41579
41720
  <div
41580
41721
  class="pdx-widget"
41581
41722
  [attr.data-widget-key]="w.key"
41582
- [class.pdx-widget--interactive]="
41583
- enableCustomization
41584
- "
41723
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41585
41724
  [class.pdx-widget--selected]="
41586
- enableCustomization && isWidgetSelected(w.key)
41725
+ canSelectWidgets() && isWidgetSelected(w.key)
41587
41726
  "
41588
41727
  [class]="w.renderClassName || w.className || ''"
41589
41728
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41616,7 +41755,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41616
41755
  "
41617
41756
  [contextLabel]="widgetContextLabel(w)"
41618
41757
  [contextTooltip]="widgetContextTooltip(w)"
41619
- [showAssistant]="showWidgetAssistantButton"
41758
+ [showAssistant]="canRequestWidgetAssistant()"
41620
41759
  [assistantLabel]="widgetAssistantLabel()"
41621
41760
  [assistantTooltip]="widgetAssistantTooltip()"
41622
41761
  [showComponentSettings]="
@@ -41634,6 +41773,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41634
41773
  [shellSettingsLabel]="widgetSettingsLabel()"
41635
41774
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41636
41775
  [moreActionsLabel]="moreWidgetActionsLabel()"
41776
+ [showRemove]="canRemoveWidgets()"
41637
41777
  [removeLabel]="widgetRemoveLabel()"
41638
41778
  (assistant)="requestWidgetAssistant(w.key)"
41639
41779
  (componentSettings)="
@@ -41660,9 +41800,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41660
41800
  <div
41661
41801
  class="pdx-widget"
41662
41802
  [attr.data-widget-key]="w.key"
41663
- [class.pdx-widget--interactive]="enableCustomization"
41803
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41664
41804
  [class.pdx-widget--selected]="
41665
- enableCustomization && isWidgetSelected(w.key)
41805
+ canSelectWidgets() && isWidgetSelected(w.key)
41666
41806
  "
41667
41807
  [class]="widgetClassName(w)"
41668
41808
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41691,7 +41831,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41691
41831
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41692
41832
  [contextLabel]="widgetContextLabel(w)"
41693
41833
  [contextTooltip]="widgetContextTooltip(w)"
41694
- [showAssistant]="showWidgetAssistantButton"
41834
+ [showAssistant]="canRequestWidgetAssistant()"
41695
41835
  [assistantLabel]="widgetAssistantLabel()"
41696
41836
  [assistantTooltip]="widgetAssistantTooltip()"
41697
41837
  [showComponentSettings]="
@@ -41705,6 +41845,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41705
41845
  [shellSettingsLabel]="widgetSettingsLabel()"
41706
41846
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41707
41847
  [moreActionsLabel]="moreWidgetActionsLabel()"
41848
+ [showRemove]="canRemoveWidgets()"
41708
41849
  [removeLabel]="widgetRemoveLabel()"
41709
41850
  (assistant)="requestWidgetAssistant(w.key)"
41710
41851
  (componentSettings)="
@@ -41725,9 +41866,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41725
41866
  <div
41726
41867
  class="pdx-widget"
41727
41868
  [attr.data-widget-key]="w.key"
41728
- [class.pdx-widget--interactive]="enableCustomization"
41869
+ [class.pdx-widget--interactive]="canSelectWidgets()"
41729
41870
  [class.pdx-widget--selected]="
41730
- enableCustomization && isWidgetSelected(w.key)
41871
+ canSelectWidgets() && isWidgetSelected(w.key)
41731
41872
  "
41732
41873
  [class]="widgetClassName(w)"
41733
41874
  [style.gridColumn]="widgetGridColumn(w)"
@@ -41756,7 +41897,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41756
41897
  [toolbarLabel]="widgetContextToolbarLabel(w.key)"
41757
41898
  [contextLabel]="widgetContextLabel(w)"
41758
41899
  [contextTooltip]="widgetContextTooltip(w)"
41759
- [showAssistant]="showWidgetAssistantButton"
41900
+ [showAssistant]="canRequestWidgetAssistant()"
41760
41901
  [assistantLabel]="widgetAssistantLabel()"
41761
41902
  [assistantTooltip]="widgetAssistantTooltip()"
41762
41903
  [showComponentSettings]="
@@ -41768,6 +41909,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41768
41909
  [shellSettingsLabel]="widgetSettingsLabel()"
41769
41910
  [shellSettingsTooltip]="widgetSettingsTooltip()"
41770
41911
  [moreActionsLabel]="moreWidgetActionsLabel()"
41912
+ [showRemove]="canRemoveWidgets()"
41771
41913
  [removeLabel]="widgetRemoveLabel()"
41772
41914
  (assistant)="requestWidgetAssistant(w.key)"
41773
41915
  (componentSettings)="openWidgetComponentSettings(w.key)"
@@ -41797,6 +41939,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
41797
41939
  type: Input
41798
41940
  }], enableCustomization: [{
41799
41941
  type: Input
41942
+ }], authoringCapabilities: [{
41943
+ type: Input
41800
41944
  }], showPageSettingsButton: [{
41801
41945
  type: Input
41802
41946
  }], shellEditorComponent: [{
@@ -41867,6 +42011,11 @@ const PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA = {
41867
42011
  type: 'boolean',
41868
42012
  description: 'Habilita affordances de edição na página.',
41869
42013
  },
42014
+ {
42015
+ name: 'authoringCapabilities',
42016
+ type: 'WidgetPageAuthoringCapabilities',
42017
+ description: 'Restringe granularmente as operações de authoring permitidas pelo host.',
42018
+ },
41870
42019
  {
41871
42020
  name: 'showPageSettingsButton',
41872
42021
  type: 'boolean',