@praxisui/core 9.0.36 → 9.0.37

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.
@@ -8,13 +8,13 @@ import * as i1$3 from '@angular/common';
8
8
  import { Location, DOCUMENT, CommonModule } from '@angular/common';
9
9
  import { Router, ActivatedRoute } from '@angular/router';
10
10
  import * as i1$2 from '@angular/forms';
11
- import { Validators, FormGroup, FormControl, FormArray, FormsModule } from '@angular/forms';
11
+ import { Validators, FormGroup, FormControl, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
12
12
  import { MatSnackBar } from '@angular/material/snack-bar';
13
13
  import * as i1$1 from '@angular/material/icon';
14
14
  import { MatIconRegistry, MatIconModule } from '@angular/material/icon';
15
15
  import * as i2 from '@angular/material/button';
16
16
  import { MatButtonModule } from '@angular/material/button';
17
- import * as i3 from '@angular/material/form-field';
17
+ import * as i4 from '@angular/material/form-field';
18
18
  import { MatFormFieldModule } from '@angular/material/form-field';
19
19
  import * as i5 from '@angular/material/input';
20
20
  import { MatInputModule } from '@angular/material/input';
@@ -25,16 +25,19 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
25
25
  import * as i8 from '@angular/material/tooltip';
26
26
  import { MatTooltipModule } from '@angular/material/tooltip';
27
27
  import { DomSanitizer } from '@angular/platform-browser';
28
- import * as i4 from '@angular/material/menu';
28
+ import * as i4$1 from '@angular/material/menu';
29
29
  import { MatMenuModule } from '@angular/material/menu';
30
- import * as i3$1 from '@angular/material/progress-spinner';
30
+ import * as i3 from '@angular/material/progress-spinner';
31
31
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
32
- import * as i2$1 from '@angular/material/card';
33
- import { MatCardModule } from '@angular/material/card';
34
- import * as i8$1 from '@angular/material/chips';
35
- import { MatChipsModule } from '@angular/material/chips';
32
+ import * as i3$1 from '@angular/material/button-toggle';
33
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
34
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
36
35
  import * as i1$4 from '@angular/material/dialog';
37
36
  import { MAT_DIALOG_DATA, MatDialogModule, MatDialog } from '@angular/material/dialog';
37
+ import * as i8$1 from '@angular/material/chips';
38
+ import { MatChipsModule } from '@angular/material/chips';
39
+ import * as i2$1 from '@angular/material/card';
40
+ import { MatCardModule } from '@angular/material/card';
38
41
  import * as i1$5 from '@angular/material/tabs';
39
42
  import { MatTabsModule } from '@angular/material/tabs';
40
43
 
@@ -14488,6 +14491,51 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14488
14491
  'action.delete.label': 'Remover {{noun}}',
14489
14492
  'action.delete.tooltip': 'Remova {{noun}} do contexto selecionado.',
14490
14493
  'status.ready': 'Recurso relacionado pronto',
14494
+ 'editor.title': 'Apresentação do recurso relacionado',
14495
+ 'editor.description': 'Configure somente a moldura visual. A relação e seus dados continuam governados pelos metadados.',
14496
+ 'editor.shell.title': 'Apresentação',
14497
+ 'editor.shell.help': 'Textos e escolhas de exibição desta instância do outlet.',
14498
+ 'editor.field.title': 'Título',
14499
+ 'editor.field.subtitle': 'Subtítulo',
14500
+ 'editor.field.icon': 'Ícone',
14501
+ 'editor.field.icon.choose': 'Escolher ícone do outlet',
14502
+ 'editor.field.mode': 'Modo de exibição',
14503
+ 'editor.field.mode.inline': 'Em linha',
14504
+ 'editor.field.mode.openAction': 'Ação de abertura',
14505
+ 'editor.field.presentation': 'Apresentação ao abrir',
14506
+ 'editor.field.presentation.drawer': 'Painel lateral',
14507
+ 'editor.field.presentation.modal': 'Modal',
14508
+ 'editor.field.compact': 'Usar estados vazios e de carregamento compactos',
14509
+ 'editor.emptyState.title': 'Estado vazio',
14510
+ 'editor.emptyState.help': 'Sobrescreva somente a apresentação. Ações, templates e comportamento contextual permanecem intactos.',
14511
+ 'editor.emptyState.field.title': 'Título',
14512
+ 'editor.emptyState.field.message': 'Mensagem',
14513
+ 'editor.emptyState.field.description': 'Descrição',
14514
+ 'editor.emptyState.field.icon': 'Ícone',
14515
+ 'editor.emptyState.field.icon.choose': 'Escolher ícone do estado vazio',
14516
+ 'editor.emptyState.field.tone': 'Tom',
14517
+ 'editor.emptyState.field.variant': 'Variante',
14518
+ 'editor.emptyState.field.alignment': 'Alinhamento',
14519
+ 'editor.emptyState.field.density': 'Densidade',
14520
+ 'editor.emptyState.field.iconContainer': 'Contêiner do ícone',
14521
+ 'editor.value.derived': 'Usar padrão do runtime',
14522
+ 'editor.value.derived.short': 'Automático',
14523
+ 'editor.value.tone.neutral': 'Neutro',
14524
+ 'editor.value.tone.primary': 'Primário',
14525
+ 'editor.value.tone.secondary': 'Secundário',
14526
+ 'editor.value.variant.inline': 'Em linha',
14527
+ 'editor.value.variant.card': 'Cartão',
14528
+ 'editor.value.variant.panel': 'Painel',
14529
+ 'editor.value.variant.transparent': 'Transparente',
14530
+ 'editor.value.alignment.start': 'Início',
14531
+ 'editor.value.alignment.center': 'Centro',
14532
+ 'editor.value.density.compact': 'Compacta',
14533
+ 'editor.value.density.comfortable': 'Confortável',
14534
+ 'editor.value.iconContainer.none': 'Nenhum',
14535
+ 'editor.value.iconContainer.circle': 'Círculo',
14536
+ 'editor.value.iconContainer.soft': 'Suave',
14537
+ 'editor.boundary.title': 'A relação é somente leitura aqui',
14538
+ 'editor.boundary.description': 'Paths de recursos, vínculos com o pai, operações, filtros e a configuração da tabela filha permanecem com seus donos canônicos.',
14491
14539
  },
14492
14540
  'en-US': {
14493
14541
  'state.idle.title': 'Related resource not selected',
@@ -14514,6 +14562,51 @@ const RELATED_RESOURCE_OUTLET_I18N_CONFIG = {
14514
14562
  'action.delete.label': 'Remove {{noun}}',
14515
14563
  'action.delete.tooltip': 'Remove {{noun}} from the selected context.',
14516
14564
  'status.ready': 'Related resource ready',
14565
+ 'editor.title': 'Related resource presentation',
14566
+ 'editor.description': 'Configure only the visual shell. The relationship and its data remain governed by metadata.',
14567
+ 'editor.shell.title': 'Presentation',
14568
+ 'editor.shell.help': 'Copy and display choices for this outlet instance.',
14569
+ 'editor.field.title': 'Title',
14570
+ 'editor.field.subtitle': 'Subtitle',
14571
+ 'editor.field.icon': 'Icon',
14572
+ 'editor.field.icon.choose': 'Choose outlet icon',
14573
+ 'editor.field.mode': 'Display mode',
14574
+ 'editor.field.mode.inline': 'Inline',
14575
+ 'editor.field.mode.openAction': 'Open action',
14576
+ 'editor.field.presentation': 'Open presentation',
14577
+ 'editor.field.presentation.drawer': 'Drawer',
14578
+ 'editor.field.presentation.modal': 'Modal',
14579
+ 'editor.field.compact': 'Use compact empty and loading states',
14580
+ 'editor.emptyState.title': 'Empty state',
14581
+ 'editor.emptyState.help': 'Override presentation only. Actions, templates and contextual behavior remain untouched.',
14582
+ 'editor.emptyState.field.title': 'Title',
14583
+ 'editor.emptyState.field.message': 'Message',
14584
+ 'editor.emptyState.field.description': 'Description',
14585
+ 'editor.emptyState.field.icon': 'Icon',
14586
+ 'editor.emptyState.field.icon.choose': 'Choose empty-state icon',
14587
+ 'editor.emptyState.field.tone': 'Tone',
14588
+ 'editor.emptyState.field.variant': 'Variant',
14589
+ 'editor.emptyState.field.alignment': 'Alignment',
14590
+ 'editor.emptyState.field.density': 'Density',
14591
+ 'editor.emptyState.field.iconContainer': 'Icon container',
14592
+ 'editor.value.derived': 'Use runtime default',
14593
+ 'editor.value.derived.short': 'Auto',
14594
+ 'editor.value.tone.neutral': 'Neutral',
14595
+ 'editor.value.tone.primary': 'Primary',
14596
+ 'editor.value.tone.secondary': 'Secondary',
14597
+ 'editor.value.variant.inline': 'Inline',
14598
+ 'editor.value.variant.card': 'Card',
14599
+ 'editor.value.variant.panel': 'Panel',
14600
+ 'editor.value.variant.transparent': 'Transparent',
14601
+ 'editor.value.alignment.start': 'Start',
14602
+ 'editor.value.alignment.center': 'Center',
14603
+ 'editor.value.density.compact': 'Compact',
14604
+ 'editor.value.density.comfortable': 'Comfortable',
14605
+ 'editor.value.iconContainer.none': 'None',
14606
+ 'editor.value.iconContainer.circle': 'Circle',
14607
+ 'editor.value.iconContainer.soft': 'Soft',
14608
+ 'editor.boundary.title': 'Relationship is read-only here',
14609
+ 'editor.boundary.description': 'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.',
14517
14610
  },
14518
14611
  },
14519
14612
  },
@@ -27019,7 +27112,7 @@ class SurfaceOpenActionEditorComponent {
27019
27112
  </mat-form-field>
27020
27113
  </div>
27021
27114
  </div>
27022
- `, isInline: true, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-binding-remove{color:var(--md-sys-color-error)}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { 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"] }] });
27115
+ `, isInline: true, styles: [".surface-editor{display:grid;gap:14px;min-width:0}.surface-section{display:grid;gap:10px;min-width:0;padding:14px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.surface-section-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:0}.surface-section-title{font-size:12px;font-weight:700;letter-spacing:0;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant);margin-bottom:0}.surface-section-header .surface-section-title{margin-bottom:0}.surface-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:12px 16px;min-width:0}.surface-preset-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.surface-span-2{grid-column:span 2}.surface-span-all{width:100%;min-width:0}.surface-component-meta{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-component-title{font-weight:600;color:var(--md-sys-color-on-surface)}.surface-component-description,.surface-empty{color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-bindings{display:grid;gap:10px;min-width:0}.surface-binding-row{display:grid;grid-template-columns:minmax(min(220px,100%),1.15fr) minmax(min(240px,100%),1.25fr) minmax(128px,.55fr) auto;gap:10px;align-items:start;min-width:0;padding:10px;border-radius:8px;background:var(--md-sys-color-surface-container)}.surface-binding-row mat-form-field:nth-child(4){grid-column:1 / -2}.surface-binding-remove{color:var(--md-sys-color-error)}.surface-guidance{display:grid;gap:4px;padding:10px 12px;border-radius:8px;background:color-mix(in srgb,var(--md-sys-color-primary-container) 18%,transparent);color:var(--md-sys-color-on-surface-variant);font-size:12px;line-height:1.45}.surface-guidance__item{overflow-wrap:anywhere}.surface-guidance__item--primary{color:var(--md-sys-color-on-surface)}mat-form-field{width:100%;min-width:0}@media(max-width:960px){.surface-section{padding:12px}.surface-span-2{grid-column:1 / -1}.surface-binding-row{grid-template-columns:minmax(0,1fr)}.surface-binding-row mat-form-field:nth-child(4){grid-column:auto}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { 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"] }] });
27023
27116
  }
27024
27117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SurfaceOpenActionEditorComponent, decorators: [{
27025
27118
  type: Component,
@@ -27384,6 +27477,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
27384
27477
  type: Output
27385
27478
  }] } });
27386
27479
 
27480
+ class ComponentAuthoringManifestProjectionError extends Error {
27481
+ name = 'ComponentAuthoringManifestProjectionError';
27482
+ code;
27483
+ path;
27484
+ constructor(code, path, message) {
27485
+ super(message);
27486
+ this.code = code;
27487
+ this.path = path;
27488
+ }
27489
+ }
27490
+ /**
27491
+ * Materializa um manifesto filho sem copiar ou redefinir operações do owner.
27492
+ *
27493
+ * A função é deliberadamente fail-closed: toda referência deve existir na fonte,
27494
+ * e a closure de targets, validators e examples precisa permanecer executável.
27495
+ */
27496
+ function projectComponentAuthoringManifest(source, projection) {
27497
+ assertProjectionIdentity(source, projection);
27498
+ assertSourceIdentitiesUnique(source);
27499
+ assertReferenceListNotEmpty(projection.runtimeInputNames, 'runtimeInputNames');
27500
+ assertReferenceListNotEmpty(projection.operationIds, 'operationIds');
27501
+ assertUniqueReferences(projection.runtimeInputNames, 'runtimeInputNames');
27502
+ assertUniqueReferences(projection.operationIds, 'operationIds');
27503
+ assertUniqueReferences(projection.roundTripRequirements ?? [], 'roundTripRequirements');
27504
+ const runtimeInputs = selectByStableId(source.runtimeInputs, projection.runtimeInputNames, (input) => input.name, 'runtimeInputNames', 'AUTHORING_MANIFEST_PROJECTION_RUNTIME_INPUT_MISSING');
27505
+ const operations = selectByStableId(source.operations, projection.operationIds, (operation) => operation.operationId, 'operationIds', 'AUTHORING_MANIFEST_PROJECTION_OPERATION_MISSING');
27506
+ const editableTargets = closeEditableTargets(source.editableTargets, operations);
27507
+ const validators = closeValidators(source.validators, operations);
27508
+ const examples = closeExamples(source.examples, operations);
27509
+ const roundTripRequirements = selectRoundTripRequirements(source.roundTripRequirements ?? [], projection.roundTripRequirements ?? []);
27510
+ return cloneManifestValue({
27511
+ schemaVersion: source.schemaVersion,
27512
+ componentId: projection.componentId.trim(),
27513
+ ownerPackage: source.ownerPackage,
27514
+ configSchemaId: source.configSchemaId,
27515
+ manifestVersion: projection.manifestVersion.trim(),
27516
+ runtimeInputs,
27517
+ editableTargets,
27518
+ operations,
27519
+ validators,
27520
+ ...(roundTripRequirements.length ? { roundTripRequirements } : {}),
27521
+ examples,
27522
+ });
27523
+ }
27524
+ function assertSourceIdentitiesUnique(source) {
27525
+ assertSourceCollectionIdentitiesUnique(source.runtimeInputs, (input) => input.name, 'source.runtimeInputs', 'name');
27526
+ assertSourceCollectionIdentitiesUnique(source.operations, (operation) => operation.operationId, 'source.operations', 'operationId');
27527
+ assertSourceCollectionIdentitiesUnique(source.editableTargets, (target) => target.kind, 'source.editableTargets', 'kind');
27528
+ assertSourceCollectionIdentitiesUnique(source.validators, (validator) => validator.validatorId, 'source.validators', 'validatorId');
27529
+ assertSourceCollectionIdentitiesUnique(source.examples, (example) => example.id, 'source.examples', 'id');
27530
+ }
27531
+ function assertSourceCollectionIdentitiesUnique(items, identity, path, identityProperty) {
27532
+ const seen = new Set();
27533
+ items.forEach((item, index) => {
27534
+ const stableId = identity(item)?.trim();
27535
+ if (!stableId) {
27536
+ fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', `${path}[${index}].${identityProperty}`, 'Source manifest stable identities must be non-empty.');
27537
+ }
27538
+ if (seen.has(stableId)) {
27539
+ fail('AUTHORING_MANIFEST_PROJECTION_SOURCE_ID_DUPLICATE', `${path}[${index}].${identityProperty}`, `Duplicate source manifest identity ${stableId}.`);
27540
+ }
27541
+ seen.add(stableId);
27542
+ });
27543
+ }
27544
+ function assertReferenceListNotEmpty(references, path) {
27545
+ if (!references.length) {
27546
+ fail('AUTHORING_MANIFEST_PROJECTION_EMPTY_REFERENCE_LIST', path, 'Required projection reference lists must not be empty.');
27547
+ }
27548
+ }
27549
+ function assertProjectionIdentity(source, projection) {
27550
+ if (projection.sourceComponentId !== source.componentId) {
27551
+ fail('AUTHORING_MANIFEST_PROJECTION_SOURCE_MISMATCH', 'sourceComponentId', `Expected sourceComponentId ${source.componentId}, received ${projection.sourceComponentId}.`);
27552
+ }
27553
+ if (!projection.componentId?.trim()) {
27554
+ fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', 'componentId', 'Projected componentId must be a non-empty canonical id.');
27555
+ }
27556
+ if (!projection.manifestVersion?.trim()) {
27557
+ fail('AUTHORING_MANIFEST_PROJECTION_ID_INVALID', 'manifestVersion', 'Projected manifestVersion must be non-empty.');
27558
+ }
27559
+ }
27560
+ function assertUniqueReferences(references, path) {
27561
+ const seen = new Set();
27562
+ references.forEach((reference, index) => {
27563
+ const normalized = reference?.trim();
27564
+ if (!normalized || seen.has(normalized)) {
27565
+ fail('AUTHORING_MANIFEST_PROJECTION_DUPLICATE_REFERENCE', `${path}[${index}]`, normalized
27566
+ ? `Duplicate stable reference ${normalized}.`
27567
+ : 'Stable references must be non-empty.');
27568
+ }
27569
+ seen.add(normalized);
27570
+ });
27571
+ }
27572
+ function selectByStableId(source, references, identity, path, missingCode) {
27573
+ const sourceById = new Map(source.map((item) => [identity(item), item]));
27574
+ return references.map((reference, index) => {
27575
+ const resolved = sourceById.get(reference);
27576
+ if (!resolved) {
27577
+ fail(missingCode, `${path}[${index}]`, `Stable reference ${reference} does not exist in the source manifest.`);
27578
+ }
27579
+ return resolved;
27580
+ });
27581
+ }
27582
+ function closeEditableTargets(sourceTargets, operations) {
27583
+ const targetKinds = unique(operations
27584
+ .map((operation) => operation.target?.kind ?? operation.targetKind)
27585
+ .filter((kind) => !!kind));
27586
+ return selectByStableId(sourceTargets, targetKinds, (target) => target.kind, 'source.editableTargets', 'AUTHORING_MANIFEST_PROJECTION_TARGET_MISSING');
27587
+ }
27588
+ function closeValidators(sourceValidators, operations) {
27589
+ const validatorIds = unique(operations.flatMap((operation) => operation.validators ?? []));
27590
+ return selectByStableId(sourceValidators, validatorIds, (validator) => validator.validatorId, 'source.validators', 'AUTHORING_MANIFEST_PROJECTION_VALIDATOR_MISSING');
27591
+ }
27592
+ function closeExamples(sourceExamples, operations) {
27593
+ const operationIds = new Set(operations.map((operation) => operation.operationId));
27594
+ const examples = sourceExamples.filter((example) => operationIds.has(example.operationId));
27595
+ if (!examples.length) {
27596
+ fail('AUTHORING_MANIFEST_PROJECTION_EXAMPLE_MISSING', 'source.examples', 'The projected operations have no source examples.');
27597
+ }
27598
+ if (!examples.some((example) => example.isPositive !== false)) {
27599
+ fail('AUTHORING_MANIFEST_PROJECTION_POSITIVE_EXAMPLE_MISSING', 'source.examples', 'The projected operations require at least one positive source example.');
27600
+ }
27601
+ if (!examples.some((example) => example.isPositive === false)) {
27602
+ fail('AUTHORING_MANIFEST_PROJECTION_NEGATIVE_EXAMPLE_MISSING', 'source.examples', 'The projected operations require at least one negative source example.');
27603
+ }
27604
+ return examples;
27605
+ }
27606
+ function selectRoundTripRequirements(sourceRequirements, projectedRequirements) {
27607
+ return selectByStableId(sourceRequirements, projectedRequirements, (requirement) => requirement, 'roundTripRequirements', 'AUTHORING_MANIFEST_PROJECTION_ROUND_TRIP_REQUIREMENT_MISSING');
27608
+ }
27609
+ function unique(values) {
27610
+ return [...new Set(values)];
27611
+ }
27612
+ function fail(code, path, message) {
27613
+ throw new ComponentAuthoringManifestProjectionError(code, path, message);
27614
+ }
27615
+ function cloneManifestValue(value) {
27616
+ if (Array.isArray(value)) {
27617
+ return value.map((item) => cloneManifestValue(item));
27618
+ }
27619
+ if (value && typeof value === 'object') {
27620
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, cloneManifestValue(item)]));
27621
+ }
27622
+ return value;
27623
+ }
27624
+
27387
27625
  /**
27388
27626
  * Catálogo de capacidades genéricas de FieldMetadata para uso da IA.
27389
27627
  * Baseado em projects/praxis-core/src/lib/models/component-metadata.interface.ts
@@ -32983,7 +33221,7 @@ class WidgetShellComponent {
32983
33221
  @if (expanded || fullscreen) {
32984
33222
  <div class="pdx-shell-backdrop" (click)="closeOverlay()"></div>
32985
33223
  }
32986
- `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}@media(max-width:640px){.pdx-shell-header,.pdx-shell-title{align-items:flex-start}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical}.pdx-shell-title-text,.pdx-shell-subtitle{-webkit-line-clamp:2}.pdx-shell-actions{flex:0 0 auto}}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed:not(.praxis-icon-button){color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
33224
+ `, isInline: true, styles: [":host{display:block;height:100%}:host(.pdx-widget-shell-collapsed){height:auto}.pdx-shell{position:relative;height:100%;display:flex;flex-direction:column}.pdx-shell.no-shell{background:transparent;border:none;border-radius:0;box-shadow:none}.pdx-shell.dashboard{background:var(--pdx-shell-card-bg, var(--pdx-dashboard-card-bg, var(--md-sys-color-surface-container-low)));border:1px solid var(--pdx-shell-card-border, var(--pdx-dashboard-card-border, var(--md-sys-color-outline-variant)));border-radius:var(--pdx-shell-card-radius, 12px);box-shadow:var(--pdx-shell-card-shadow, 0 4px 12px rgba(15, 23, 42, .06));overflow:hidden}.pdx-shell-header{display:flex;align-items:center;gap:10px;padding:8px 10px 7px;border-bottom:1px solid var(--pdx-shell-header-border, var(--md-sys-color-outline-variant));background:var(--pdx-shell-header-bg, var(--md-sys-color-surface-container))}.pdx-shell-header--drag-enabled{cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.pdx-shell-header--drag-enabled:active{cursor:grabbing}.pdx-shell-header--drag-enabled:focus-visible{outline:2px solid color-mix(in srgb,var(--md-sys-color-primary) 72%,white 28%);outline-offset:-2px}.pdx-shell-title{display:flex;align-items:center;gap:8px;min-width:0;flex:1;color:var(--pdx-shell-title-color, inherit)}.pdx-shell-title mat-icon{color:var(--pdx-shell-icon-color, currentColor)}.pdx-shell-text{min-width:0}.pdx-shell-title-text{font-weight:var(--pdx-shell-title-weight, 600);font-size:var(--pdx-shell-title-size, 13px);line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-subtitle{font-size:var(--pdx-shell-subtitle-size, 11px);opacity:.75;color:var(--pdx-shell-subtitle-color, currentColor);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pdx-shell-actions,.pdx-shell-window-actions{display:flex;align-items:center;gap:4px}.pdx-shell-window-actions{margin-left:auto}@media(max-width:640px){.pdx-shell-header,.pdx-shell-title{align-items:flex-start}.pdx-shell-text{display:grid;gap:2px}.pdx-shell-title-text,.pdx-shell-subtitle{display:-webkit-box;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical}.pdx-shell-title-text,.pdx-shell-subtitle{-webkit-line-clamp:2}.pdx-shell-actions{flex:0 0 auto}}.pdx-action-outlined{border:1px solid var(--md-sys-color-outline-variant);border-radius:999px;padding:0 10px}.pdx-action-text{padding:0 8px}.pdx-shell-action--pressed:not(.praxis-icon-button){color:var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent)}.pdx-action-label{font-size:12px;font-weight:500}.pdx-shell-body{flex:1;min-height:0;padding:var(--pdx-shell-body-padding, 8px 10px 10px 10px);background:var(--pdx-shell-body-bg, transparent);color:var(--pdx-shell-body-color, inherit)}.pdx-shell.no-shell .pdx-shell-body{padding:0}.pdx-shell-body.hidden{display:none}.pdx-shell.collapsed{height:auto}.pdx-shell.collapsed .pdx-shell-header{border-bottom-color:transparent}.pdx-shell.body-fill .pdx-shell-body,.pdx-shell.body-scroll .pdx-shell-body,.pdx-shell.expanded .pdx-shell-body,.pdx-shell.fullscreen .pdx-shell-body{overflow:auto;display:flex;flex-direction:column;min-height:0}.pdx-shell.collapsed .pdx-shell-body{display:none}.pdx-shell.body-fill .pdx-shell-body{overflow:hidden}.pdx-shell.body-scroll .pdx-shell-body{overflow:auto}.pdx-shell.body-fill .pdx-shell-body>*,.pdx-shell.body-scroll .pdx-shell-body>*,.pdx-shell.expanded .pdx-shell-body>*,.pdx-shell.fullscreen .pdx-shell-body>*{flex:1 1 auto;min-height:0;width:100%}.pdx-shell.expanded{position:fixed;top:10vh;left:50%;width:min(920px,92vw);height:min(640px,82vh);transform:translate(-50%);z-index:var(--praxis-layer-widget-shell-expanded, 1290);box-shadow:var(--mat-elevation-level8)}.pdx-shell.fullscreen{position:fixed;inset:0;width:auto;height:auto;transform:none;border-radius:0;z-index:var(--praxis-layer-widget-shell-fullscreen, 1291);box-shadow:var(--mat-elevation-level8)}.pdx-shell-backdrop{position:fixed;inset:0;z-index:var(--praxis-layer-widget-shell-backdrop, 1280);background:#0000008c;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "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$1.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$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
32987
33225
  }
32988
33226
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: WidgetShellComponent, decorators: [{
32989
33227
  type: Component,
@@ -37486,7 +37724,7 @@ class DynamicWidgetContextToolbarComponent {
37486
37724
  </mat-menu>
37487
37725
  }
37488
37726
  </div>
37489
- `, 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 });
37727
+ `, 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$1.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$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.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 });
37490
37728
  }
37491
37729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: DynamicWidgetContextToolbarComponent, decorators: [{
37492
37730
  type: Component,
@@ -39700,7 +39938,7 @@ class DynamicWidgetPageComponent {
39700
39938
  this.dispatchWidgetComponentSettingsToRuntime(key);
39701
39939
  return;
39702
39940
  }
39703
- const page = this.materializeRuntimeInputsForWidget(this.ensurePageDefinition(), key);
39941
+ const page = this.ensurePageDefinition();
39704
39942
  const widget = page.widgets.find((w) => w.key === key);
39705
39943
  if (!widget)
39706
39944
  return;
@@ -39711,9 +39949,12 @@ class DynamicWidgetPageComponent {
39711
39949
  return;
39712
39950
  }
39713
39951
  const persistedInputs = this.cloneStateValues(widget.definition.inputs || {});
39952
+ const materializedInputs = metadata.configEditor?.contextResolver
39953
+ ? this.readMaterializedInputsForWidget(metadata, key)
39954
+ : undefined;
39714
39955
  const requestId = ++this.nextConfigEditorContextRequestId;
39715
39956
  this.configEditorContextRequests.set(key, requestId);
39716
- const contextResult = await this.resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs);
39957
+ const contextResult = await this.resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs, materializedInputs);
39717
39958
  if (this.configEditorContextRequests.get(key) !== requestId) {
39718
39959
  return;
39719
39960
  }
@@ -39736,7 +39977,7 @@ class DynamicWidgetPageComponent {
39736
39977
  ref.applied$.subscribe((result) => this.applyWidgetComponentInputs(key, result, false));
39737
39978
  ref.saved$.subscribe((result) => this.applyWidgetComponentInputs(key, result, true));
39738
39979
  }
39739
- async resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs) {
39980
+ async resolveWidgetConfigEditorContext(metadata, page, widget, key, persistedInputs, materializedInputs) {
39740
39981
  const resolver = metadata.configEditor?.contextResolver;
39741
39982
  if (!resolver) {
39742
39983
  return {};
@@ -39747,6 +39988,11 @@ class DynamicWidgetPageComponent {
39747
39988
  widgetKey: key,
39748
39989
  widgetType: widget.definition?.id,
39749
39990
  persistedInputs: this.cloneStateValues(persistedInputs),
39991
+ ...(materializedInputs
39992
+ ? {
39993
+ materializedInputs: this.cloneStateValues(materializedInputs),
39994
+ }
39995
+ : {}),
39750
39996
  page: this.cloneStateValues(page),
39751
39997
  widget: this.cloneStateValues(widget),
39752
39998
  metadata,
@@ -39783,39 +40029,22 @@ class DynamicWidgetPageComponent {
39783
40029
  !Array.isArray(value) &&
39784
40030
  ('context' in value || 'diagnostics' in value));
39785
40031
  }
39786
- materializeRuntimeInputsForWidget(page, key) {
40032
+ readMaterializedInputsForWidget(metadata, key) {
39787
40033
  const normalizedKey = String(key || '').trim();
39788
40034
  if (!normalizedKey) {
39789
- return page;
39790
- }
39791
- const widget = page.widgets?.find((candidate) => candidate.key === normalizedKey);
39792
- if (!widget) {
39793
- return page;
40035
+ return undefined;
39794
40036
  }
39795
- const inputNames = this.componentMetadata
39796
- ?.get(widget.definition?.id || '')
39797
- ?.inputs?.map((input) => input.name)
40037
+ const inputNames = metadata.inputs
40038
+ ?.map((input) => input.name)
39798
40039
  ?.filter((name) => typeof name === 'string' && !!name.trim()) || [];
39799
40040
  if (!inputNames.length) {
39800
- return page;
40041
+ return undefined;
39801
40042
  }
39802
40043
  const loader = this.findWidgetLoader(normalizedKey);
39803
- const materializedInputs = loader?.materializedInputSnapshot(inputNames) || {};
39804
- if (!Object.keys(materializedInputs).length) {
39805
- return page;
39806
- }
39807
- const result = this.applyWidgetInputPatchToPage(page, normalizedKey, {
39808
- sourceComponentId: widget.definition?.id,
39809
- output: 'runtimeInputSnapshot',
39810
- payload: {
39811
- inputPatch: materializedInputs,
39812
- },
39813
- });
39814
- if (!result.changed) {
39815
- return page;
40044
+ if (!loader) {
40045
+ return undefined;
39816
40046
  }
39817
- this.applyPageUpdate(result.page, true, undefined, true, true);
39818
- return result.page;
40047
+ return this.cloneStateValues(loader.materializedInputSnapshot(inputNames));
39819
40048
  }
39820
40049
  findWidgetLoader(key) {
39821
40050
  return this.widgetLoaders?.find((loader) => loader.ownerWidgetKey === key);
@@ -43370,7 +43599,7 @@ class PraxisRelatedResourceOutletComponent {
43370
43599
  </div>
43371
43600
  }
43372
43601
  </section>
43373
- `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { 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: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
43602
+ `, isInline: true, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"], dependencies: [{ kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { 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: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
43374
43603
  }
43375
43604
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletComponent, decorators: [{
43376
43605
  type: Component,
@@ -43424,6 +43653,1145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
43424
43653
  `, styles: [":host{display:block;min-width:0}.pdx-related-outlet{display:block;min-width:0;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__state{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--pdx-related-outlet-gap, 12px);min-height:var(--pdx-related-outlet-min-height, 64px);padding:var(--pdx-related-outlet-padding, 12px);border:1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, .16));border-radius:var(--pdx-related-outlet-radius, 8px);background:var(--md-sys-color-surface-container-low, var(--md-sys-color-surface, transparent))}.pdx-related-outlet--compact .pdx-related-outlet__state{min-height:var(--pdx-related-outlet-compact-min-height, 48px);padding:var(--pdx-related-outlet-compact-padding, 8px 10px)}.pdx-related-outlet__state--ready{border-color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__icon{display:inline-grid;place-items:center;width:32px;height:32px;color:var(--md-sys-color-primary, currentColor)}.pdx-related-outlet__state--busy .pdx-related-outlet__icon{color:var(--md-sys-color-secondary, currentColor)}.pdx-related-outlet__copy{display:grid;gap:2px;min-width:0}.pdx-related-outlet__copy h3,.pdx-related-outlet__copy p{margin:0}.pdx-related-outlet__copy h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.25rem system-ui);color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet__copy p{font:var(--md-sys-typescale-body-small, 400 .82rem/1.15rem system-ui);color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:600px){.pdx-related-outlet__state{grid-template-columns:auto minmax(0,1fr)}.pdx-related-outlet__state button{grid-column:1 / -1;justify-self:start}}\n"] }]
43425
43654
  }], ctorParameters: () => [], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], surfaceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceId", required: false }] }], surfaceCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceCatalog", required: false }] }], discoverySource: [{ type: i0.Input, args: [{ isSignal: true, alias: "discoverySource", required: false }] }], parentLinks: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentLinks", required: false }] }], apiEndpointKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiEndpointKey", required: false }] }], apiUrlEntry: [{ type: i0.Input, args: [{ isSignal: true, alias: "apiUrlEntry", required: false }] }], parentRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentRecord", required: false }] }], parentResourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourceId", required: false }] }], parentIdentity: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentIdentity", required: false }] }], parentResourcePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentResourcePath", required: false }] }], presentation: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentation", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], tableId: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableId", required: false }] }], tableConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableConfig", required: false }] }], enableCustomization: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableCustomization", required: false }] }], authoringCapability: [{ type: i0.Input, args: [{ isSignal: true, alias: "authoringCapability", required: false }] }], emptyState: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyState", required: false }] }], queryContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryContext", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], stateReason: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateReason", required: false }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }], strictValidation: [{ type: i0.Input, args: [{ isSignal: true, alias: "strictValidation", required: false }] }], ownerWidgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "ownerWidgetKey", required: false }] }], surfaceOpen: [{ type: i0.Output, args: ["surfaceOpen"] }], widgetEvent: [{ type: i0.Output, args: ["widgetEvent"] }], resourceEvent: [{ type: i0.Output, args: ["resourceEvent"] }] } });
43426
43655
 
43656
+ const DEFAULT_ICONS = [
43657
+ 'search', 'close', 'check', 'add', 'remove', 'delete', 'edit', 'save', 'cancel', 'warning', 'error', 'info', 'help',
43658
+ 'face', 'person', 'account_circle', 'people', 'group', 'settings', 'home', 'menu', 'more_horiz', 'more_vert', 'refresh', 'arrow_back', 'arrow_forward', 'expand_more', 'expand_less', 'open_in_full', 'fullscreen', 'open_in_new',
43659
+ 'star', 'star_half', 'star_border', 'favorite', 'favorite_border', 'thumb_up', 'thumb_down', 'share', 'send', 'ios_share', 'download', 'upload', 'file_upload', 'file_download',
43660
+ 'shopping_cart', 'shopping_bag', 'store', 'storefront', 'local_mall', 'local_offer', 'attach_money', 'money', 'payments', 'price_change', 'receipt', 'receipt_long', 'request_quote', 'point_of_sale', 'credit_card', 'payment',
43661
+ 'event', 'date_range', 'schedule', 'alarm', 'watch_later', 'pending_actions',
43662
+ 'location_on', 'location_city', 'map', 'public', 'language', 'place', 'pin_drop', 'route', 'near_me', 'navigation', 'layers', 'terrain',
43663
+ 'email', 'call', 'phone', 'chat', 'forum', 'mark_email_unread', 'mark_chat_unread',
43664
+ 'wifi', 'bluetooth', 'cloud', 'cloud_upload', 'cloud_download', 'cloud_done', 'cloud_queue', 'cloud_sync', 'backup', 'bolt', 'lock', 'lock_open', 'visibility', 'visibility_off', 'vpn_key', 'key', 'fingerprint', 'shield', 'security', 'admin_panel_settings', 'privacy_tip', 'policy', 'verified',
43665
+ 'label', 'bookmark', 'book', 'description', 'article', 'note', 'assignment', 'assignment_turned_in', 'assignment_ind', 'grading', 'subject',
43666
+ 'home_max', 'home_work', 'dashboard', 'analytics', 'assessment', 'insert_chart', 'bar_chart', 'show_chart', 'timeline', 'insights', 'pie_chart', 'donut_large', 'donut_small',
43667
+ 'inventory', 'inventory_2', 'list', 'reorder', 'filter_list', 'sort', 'tune', 'settings_applications', 'build', 'build_circle', 'construction', 'bug_report', 'code', 'terminal', 'data_object', 'dataset', 'storage',
43668
+ 'rule', 'rule_folder', 'folder', 'folder_open', 'create_new_folder', 'drive_file_move', 'drive_file_rename_outline',
43669
+ 'text_fields', 'title', 'format_bold', 'format_italic', 'format_underlined', 'format_list_bulleted', 'format_list_numbered', 'insert_link', 'link', 'attach_file', 'attachment',
43670
+ 'image', 'photo', 'photo_camera', 'collections', 'slideshow', 'movie', 'videocam', 'play_arrow', 'pause', 'stop', 'fast_forward', 'fast_rewind', 'skip_next', 'skip_previous', 'volume_up', 'volume_off', 'equalizer', 'music_note', 'library_music',
43671
+ 'notifications', 'notifications_active', 'notifications_off', 'do_not_disturb',
43672
+ 'airplanemode_active', 'train', 'directions_car', 'directions_bus', 'directions_bike', 'directions_walk', 'directions_boat', 'local_taxi',
43673
+ ];
43674
+ class PraxisIconPickerComponent {
43675
+ data;
43676
+ dialogRef;
43677
+ value;
43678
+ icons = DEFAULT_ICONS;
43679
+ selected = new EventEmitter();
43680
+ cancel = new EventEmitter();
43681
+ searchInput;
43682
+ query = '';
43683
+ filtered = [];
43684
+ selectedFamily = 'mi';
43685
+ constructor(data, dialogRef) {
43686
+ this.data = data;
43687
+ this.dialogRef = dialogRef;
43688
+ if (data) {
43689
+ this.value = data.value;
43690
+ if (Array.isArray(data.icons) && data.icons.length)
43691
+ this.icons = data.icons;
43692
+ const fam = this.familyFromValue(this.value);
43693
+ if (fam) {
43694
+ this.selectedFamily = fam.family;
43695
+ this.value = fam.name;
43696
+ }
43697
+ }
43698
+ this.query = (this.value || '').trim();
43699
+ this.onFilter();
43700
+ }
43701
+ onFilter() {
43702
+ const q = (this.query || '').trim().toLowerCase();
43703
+ this.filtered = !q ? [...this.icons] : this.icons.filter(i => i.toLowerCase().includes(q));
43704
+ }
43705
+ choose(icon) {
43706
+ const val = this.buildValue(icon);
43707
+ this.value = icon;
43708
+ if (this.dialogRef)
43709
+ this.dialogRef.close(val);
43710
+ else
43711
+ this.selected.emit(val);
43712
+ }
43713
+ onEsc(ev) {
43714
+ if (this.dialogRef) {
43715
+ ev.stopPropagation();
43716
+ ev.preventDefault();
43717
+ this.onCancel();
43718
+ }
43719
+ }
43720
+ onGlobalKey(ev) {
43721
+ if (ev.key !== '/')
43722
+ return;
43723
+ const target = ev.target;
43724
+ const tag = (target?.tagName || '').toLowerCase();
43725
+ if (tag === 'input' || tag === 'textarea' || target?.isContentEditable) {
43726
+ return;
43727
+ }
43728
+ ev.preventDefault();
43729
+ this.focusSearch();
43730
+ }
43731
+ confirmTyped() {
43732
+ const name = (this.query || '').trim();
43733
+ if (!name)
43734
+ return;
43735
+ const val = this.buildValue(name);
43736
+ if (this.dialogRef)
43737
+ this.dialogRef.close(val);
43738
+ else
43739
+ this.selected.emit(val);
43740
+ }
43741
+ isSelectedIcon(icon) {
43742
+ return (this.value || '').trim() === icon;
43743
+ }
43744
+ onFamilyChange(val) {
43745
+ const v = (typeof val === 'string' && val) ? val : 'mi';
43746
+ this.selectedFamily = v;
43747
+ }
43748
+ clear() {
43749
+ this.value = '';
43750
+ if (this.dialogRef)
43751
+ this.dialogRef.close('');
43752
+ else
43753
+ this.selected.emit('');
43754
+ }
43755
+ onCancel() {
43756
+ if (this.dialogRef)
43757
+ this.dialogRef.close(undefined);
43758
+ else
43759
+ this.cancel.emit();
43760
+ }
43761
+ // Helpers for family/prefix handling
43762
+ buildValue(name) {
43763
+ const n = (name || '').trim();
43764
+ if (!n)
43765
+ return n;
43766
+ const fam = this.selectedFamily === 'ms' ? 'mso' : this.selectedFamily;
43767
+ return fam === 'mi' ? n : `${fam}:${n}`;
43768
+ }
43769
+ previewValue() {
43770
+ return this.buildValue((this.query || '').trim());
43771
+ }
43772
+ iconClassForFamily(fam) {
43773
+ if (fam === 'ms' || fam === 'mso')
43774
+ return 'material-symbols-outlined';
43775
+ if (fam === 'msr')
43776
+ return 'material-symbols-rounded';
43777
+ if (fam === 'mss')
43778
+ return 'material-symbols-sharp';
43779
+ return 'material-icons';
43780
+ }
43781
+ focusSearch() {
43782
+ this.searchInput?.nativeElement?.focus();
43783
+ }
43784
+ familyFromValue(v) {
43785
+ const s = (v || '').trim();
43786
+ const i = s.indexOf(':');
43787
+ if (i <= 0)
43788
+ return null;
43789
+ const p = s.slice(0, i).toLowerCase();
43790
+ const name = s.slice(i + 1).trim();
43791
+ if (p === 'ms' || p === 'mso')
43792
+ return { family: 'mso', name };
43793
+ if (p === 'msr')
43794
+ return { family: 'msr', name };
43795
+ if (p === 'mss')
43796
+ return { family: 'mss', name };
43797
+ return { family: 'mi', name };
43798
+ }
43799
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, deps: [{ token: MAT_DIALOG_DATA, optional: true }, { token: i1$4.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
43800
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisIconPickerComponent, isStandalone: true, selector: "praxis-icon-picker", inputs: { value: "value", icons: "icons" }, outputs: { selected: "selected", cancel: "cancel" }, host: { listeners: { "document:keydown.escape": "onEsc($event)", "document:keydown": "onGlobalKey($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
43801
+ <div class="pip-root">
43802
+ <div class="pip-head">
43803
+ <mat-form-field appearance="outline" class="pip-search">
43804
+ <mat-label>Buscar ícone</mat-label>
43805
+ <input
43806
+ #searchInput
43807
+ matInput
43808
+ [(ngModel)]="query"
43809
+ placeholder="ex.: star, schedule"
43810
+ (ngModelChange)="onFilter()"
43811
+ (keydown.enter)="confirmTyped()"
43812
+ />
43813
+ </mat-form-field>
43814
+ <button mat-stroked-button color="primary" (click)="clear()">
43815
+ <mat-icon>backspace</mat-icon>
43816
+ <span>Limpar</span>
43817
+ </button>
43818
+ <a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
43819
+ <mat-icon>open_in_new</mat-icon>
43820
+ <span>Material Icons</span>
43821
+ </a>
43822
+ <span class="pip-spacer"></span>
43823
+ <div class="pip-family" role="group" aria-label="Estilo do ícone">
43824
+ <mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
43825
+ <mat-chip-option value="mi">Icons</mat-chip-option>
43826
+ <mat-chip-option value="mso">Outlined</mat-chip-option>
43827
+ <mat-chip-option value="msr">Rounded</mat-chip-option>
43828
+ <mat-chip-option value="mss">Sharp</mat-chip-option>
43829
+ </mat-chip-listbox>
43830
+ </div>
43831
+ @if (dialogRef) {
43832
+ <button mat-stroked-button (click)="onCancel()">Cancelar</button>
43833
+ }
43834
+ </div>
43835
+ <div class="pip-hint muted">
43836
+ Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
43837
+ </div>
43838
+ <div class="pip-stats">
43839
+ <span>{{ filtered.length }} resultado(s)</span>
43840
+ <span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
43841
+ </div>
43842
+ <div class="pip-body" role="grid" aria-label="Ícones disponíveis">
43843
+ @for (ic of filtered; track ic) {
43844
+ <button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
43845
+ <mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
43846
+ <span class="pip-name">{{ ic }}</span>
43847
+ </button>
43848
+ }
43849
+ </div>
43850
+ @if (!filtered.length) {
43851
+ <div class="pip-empty">
43852
+ Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
43853
+ </div>
43854
+ }
43855
+ <div class="pip-footer">
43856
+ <button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
43857
+ <mat-icon>check</mat-icon>
43858
+ Usar nome digitado
43859
+ </button>
43860
+ @if (query.trim()) {
43861
+ <span class="pip-typed">{{ previewValue() }}</span>
43862
+ }
43863
+ </div>
43864
+ </div>
43865
+ `, isInline: true, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8$1.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8$1.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
43866
+ }
43867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, decorators: [{
43868
+ type: Component,
43869
+ args: [{ selector: 'praxis-icon-picker', standalone: true, imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, MatChipsModule, MatDialogModule, MatTooltipModule], template: `
43870
+ <div class="pip-root">
43871
+ <div class="pip-head">
43872
+ <mat-form-field appearance="outline" class="pip-search">
43873
+ <mat-label>Buscar ícone</mat-label>
43874
+ <input
43875
+ #searchInput
43876
+ matInput
43877
+ [(ngModel)]="query"
43878
+ placeholder="ex.: star, schedule"
43879
+ (ngModelChange)="onFilter()"
43880
+ (keydown.enter)="confirmTyped()"
43881
+ />
43882
+ </mat-form-field>
43883
+ <button mat-stroked-button color="primary" (click)="clear()">
43884
+ <mat-icon>backspace</mat-icon>
43885
+ <span>Limpar</span>
43886
+ </button>
43887
+ <a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
43888
+ <mat-icon>open_in_new</mat-icon>
43889
+ <span>Material Icons</span>
43890
+ </a>
43891
+ <span class="pip-spacer"></span>
43892
+ <div class="pip-family" role="group" aria-label="Estilo do ícone">
43893
+ <mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
43894
+ <mat-chip-option value="mi">Icons</mat-chip-option>
43895
+ <mat-chip-option value="mso">Outlined</mat-chip-option>
43896
+ <mat-chip-option value="msr">Rounded</mat-chip-option>
43897
+ <mat-chip-option value="mss">Sharp</mat-chip-option>
43898
+ </mat-chip-listbox>
43899
+ </div>
43900
+ @if (dialogRef) {
43901
+ <button mat-stroked-button (click)="onCancel()">Cancelar</button>
43902
+ }
43903
+ </div>
43904
+ <div class="pip-hint muted">
43905
+ Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
43906
+ </div>
43907
+ <div class="pip-stats">
43908
+ <span>{{ filtered.length }} resultado(s)</span>
43909
+ <span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
43910
+ </div>
43911
+ <div class="pip-body" role="grid" aria-label="Ícones disponíveis">
43912
+ @for (ic of filtered; track ic) {
43913
+ <button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
43914
+ <mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
43915
+ <span class="pip-name">{{ ic }}</span>
43916
+ </button>
43917
+ }
43918
+ </div>
43919
+ @if (!filtered.length) {
43920
+ <div class="pip-empty">
43921
+ Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
43922
+ </div>
43923
+ }
43924
+ <div class="pip-footer">
43925
+ <button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
43926
+ <mat-icon>check</mat-icon>
43927
+ Usar nome digitado
43928
+ </button>
43929
+ @if (query.trim()) {
43930
+ <span class="pip-typed">{{ previewValue() }}</span>
43931
+ }
43932
+ </div>
43933
+ </div>
43934
+ `, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"] }]
43935
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
43936
+ type: Optional
43937
+ }, {
43938
+ type: Inject,
43939
+ args: [MAT_DIALOG_DATA]
43940
+ }] }, { type: i1$4.MatDialogRef, decorators: [{
43941
+ type: Optional
43942
+ }] }], propDecorators: { value: [{
43943
+ type: Input
43944
+ }], icons: [{
43945
+ type: Input
43946
+ }], selected: [{
43947
+ type: Output
43948
+ }], cancel: [{
43949
+ type: Output
43950
+ }], searchInput: [{
43951
+ type: ViewChild,
43952
+ args: ['searchInput']
43953
+ }], onEsc: [{
43954
+ type: HostListener,
43955
+ args: ['document:keydown.escape', ['$event']]
43956
+ }], onGlobalKey: [{
43957
+ type: HostListener,
43958
+ args: ['document:keydown', ['$event']]
43959
+ }] } });
43960
+
43961
+ class IconPickerService {
43962
+ dialog = inject(MatDialog);
43963
+ settings = inject(SETTINGS_PANEL_BRIDGE, { optional: true });
43964
+ openDialog(opts) {
43965
+ const ref = this.dialog.open(PraxisIconPickerComponent, {
43966
+ width: '720px',
43967
+ data: { value: opts?.value, icons: opts?.icons },
43968
+ });
43969
+ return ref.afterClosed().toPromise();
43970
+ }
43971
+ async openPanel(opts) {
43972
+ const id = opts?.id || 'icon-picker';
43973
+ const title = opts?.title || 'Escolher ícone';
43974
+ if (!this.settings) {
43975
+ // Fallback to dialog-only mode when bridge is not available
43976
+ return this.openDialog({ value: opts?.value, icons: opts?.icons });
43977
+ }
43978
+ const ref = this.settings.open({ id: `praxis-icon-picker:${id}`, title, content: { component: PraxisIconPickerComponent, inputs: { value: opts?.value, icons: opts?.icons } } });
43979
+ return new Promise((resolve) => {
43980
+ let resolved = false;
43981
+ ref.applied$.subscribe((val) => { if (!resolved) {
43982
+ resolved = true;
43983
+ resolve(val);
43984
+ } });
43985
+ ref.saved$.subscribe((val) => { if (!resolved) {
43986
+ resolved = true;
43987
+ resolve(val);
43988
+ } });
43989
+ });
43990
+ }
43991
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
43992
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, providedIn: 'root' });
43993
+ }
43994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, decorators: [{
43995
+ type: Injectable,
43996
+ args: [{ providedIn: 'root' }]
43997
+ }] });
43998
+
43999
+ const EMPTY_FORM_VALUE = {
44000
+ title: '',
44001
+ subtitle: '',
44002
+ icon: '',
44003
+ mode: 'inline',
44004
+ presentation: 'drawer',
44005
+ compact: false,
44006
+ emptyState: {
44007
+ title: '',
44008
+ message: '',
44009
+ description: '',
44010
+ icon: '',
44011
+ tone: '',
44012
+ variant: '',
44013
+ alignment: '',
44014
+ density: '',
44015
+ iconContainer: '',
44016
+ },
44017
+ };
44018
+ const EMPTY_STATE_TEXT_FIELDS = ['title', 'message', 'description', 'icon'];
44019
+ const EMPTY_STATE_ENUM_FIELDS = [
44020
+ 'tone',
44021
+ 'variant',
44022
+ 'alignment',
44023
+ 'density',
44024
+ 'iconContainer',
44025
+ ];
44026
+ class PraxisRelatedResourceOutletConfigEditorComponent {
44027
+ inputs = input(null, ...(ngDevMode ? [{ debugName: "inputs" }] : /* istanbul ignore next */ []));
44028
+ widgetKey = input(undefined, ...(ngDevMode ? [{ debugName: "widgetKey" }] : /* istanbul ignore next */ []));
44029
+ widgetType = input(undefined, ...(ngDevMode ? [{ debugName: "widgetType" }] : /* istanbul ignore next */ []));
44030
+ form = new FormGroup({
44031
+ title: new FormControl('', { nonNullable: true }),
44032
+ subtitle: new FormControl('', { nonNullable: true }),
44033
+ icon: new FormControl('', { nonNullable: true }),
44034
+ mode: new FormControl('inline', { nonNullable: true }),
44035
+ presentation: new FormControl('drawer', { nonNullable: true }),
44036
+ compact: new FormControl(false, { nonNullable: true }),
44037
+ emptyState: new FormGroup({
44038
+ title: new FormControl('', { nonNullable: true }),
44039
+ message: new FormControl('', { nonNullable: true }),
44040
+ description: new FormControl('', { nonNullable: true }),
44041
+ icon: new FormControl('', { nonNullable: true }),
44042
+ tone: new FormControl('', { nonNullable: true }),
44043
+ variant: new FormControl('', { nonNullable: true }),
44044
+ alignment: new FormControl('', { nonNullable: true }),
44045
+ density: new FormControl('', { nonNullable: true }),
44046
+ iconContainer: new FormControl('', { nonNullable: true }),
44047
+ }),
44048
+ });
44049
+ isDirty$ = new BehaviorSubject(false);
44050
+ isValid$ = new BehaviorSubject(true);
44051
+ isBusy$ = new BehaviorSubject(false);
44052
+ i18n = inject(PraxisI18nService);
44053
+ iconPicker = inject(IconPickerService);
44054
+ persistedInputs = {};
44055
+ baselineFormValue = structuredClone(EMPTY_FORM_VALUE);
44056
+ constructor() {
44057
+ this.form.valueChanges
44058
+ .pipe(takeUntilDestroyed())
44059
+ .subscribe(() => this.publishState());
44060
+ effect(() => {
44061
+ this.initialize(this.inputs());
44062
+ });
44063
+ }
44064
+ getSettingsValue() {
44065
+ return { inputs: this.buildInputs() };
44066
+ }
44067
+ onSave() {
44068
+ return this.getSettingsValue();
44069
+ }
44070
+ reset() {
44071
+ this.form.reset(structuredClone(this.baselineFormValue), { emitEvent: false });
44072
+ this.publishState();
44073
+ }
44074
+ async selectIcon(target) {
44075
+ const control = target === 'outlet'
44076
+ ? this.form.controls.icon
44077
+ : this.form.controls.emptyState.controls.icon;
44078
+ const selected = await this.iconPicker.openDialog({ value: control.value });
44079
+ if (selected !== undefined) {
44080
+ control.setValue(selected);
44081
+ }
44082
+ }
44083
+ t(key, fallback) {
44084
+ return this.i18n.t(key, undefined, fallback, RELATED_RESOURCE_OUTLET_I18N_NAMESPACE);
44085
+ }
44086
+ initialize(inputs) {
44087
+ this.persistedInputs = structuredClone(inputs ?? {});
44088
+ this.baselineFormValue = this.readFormValue(this.persistedInputs);
44089
+ this.form.reset(structuredClone(this.baselineFormValue), { emitEvent: false });
44090
+ this.publishState();
44091
+ }
44092
+ readFormValue(inputs) {
44093
+ const emptyState = this.objectValue(inputs['emptyState']);
44094
+ return {
44095
+ title: this.stringValue(inputs['title']),
44096
+ subtitle: this.stringValue(inputs['subtitle']),
44097
+ icon: this.stringValue(inputs['icon']),
44098
+ mode: inputs['mode'] === 'open-action' ? 'open-action' : 'inline',
44099
+ presentation: inputs['presentation'] === 'modal' ? 'modal' : 'drawer',
44100
+ compact: inputs['compact'] === true,
44101
+ emptyState: {
44102
+ title: this.stringValue(emptyState['title']),
44103
+ message: this.stringValue(emptyState['message']),
44104
+ description: this.stringValue(emptyState['description']),
44105
+ icon: this.stringValue(emptyState['icon']),
44106
+ tone: this.enumValue(emptyState['tone'], ['neutral', 'primary', 'secondary']),
44107
+ variant: this.enumValue(emptyState['variant'], ['card', 'inline', 'panel', 'transparent']),
44108
+ alignment: this.enumValue(emptyState['alignment'], ['start', 'center']),
44109
+ density: this.enumValue(emptyState['density'], ['compact', 'comfortable']),
44110
+ iconContainer: this.enumValue(emptyState['iconContainer'], ['none', 'circle', 'soft']),
44111
+ },
44112
+ };
44113
+ }
44114
+ buildInputs() {
44115
+ const next = structuredClone(this.persistedInputs);
44116
+ const current = this.form.getRawValue();
44117
+ this.applyTextChange(next, 'title', current.title, this.baselineFormValue.title);
44118
+ this.applyTextChange(next, 'subtitle', current.subtitle, this.baselineFormValue.subtitle);
44119
+ this.applyTextChange(next, 'icon', current.icon, this.baselineFormValue.icon);
44120
+ this.applyDefaultedChange(next, 'mode', current.mode, this.baselineFormValue.mode, 'inline');
44121
+ this.applyDefaultedChange(next, 'presentation', current.presentation, this.baselineFormValue.presentation, 'drawer');
44122
+ this.applyDefaultedChange(next, 'compact', current.compact, this.baselineFormValue.compact, false);
44123
+ this.applyEmptyStateChanges(next, current.emptyState);
44124
+ return next;
44125
+ }
44126
+ applyEmptyStateChanges(inputs, current) {
44127
+ const baseline = this.baselineFormValue.emptyState;
44128
+ const changed = EMPTY_STATE_TEXT_FIELDS.some((field) => current[field] !== baseline[field])
44129
+ || EMPTY_STATE_ENUM_FIELDS.some((field) => current[field] !== baseline[field]);
44130
+ if (!changed) {
44131
+ return;
44132
+ }
44133
+ const existing = this.objectValue(inputs['emptyState']);
44134
+ const next = structuredClone(existing);
44135
+ for (const field of EMPTY_STATE_TEXT_FIELDS) {
44136
+ this.applyTextChange(next, field, current[field], baseline[field]);
44137
+ }
44138
+ for (const field of EMPTY_STATE_ENUM_FIELDS) {
44139
+ if (current[field] === baseline[field]) {
44140
+ continue;
44141
+ }
44142
+ if (current[field]) {
44143
+ next[field] = current[field];
44144
+ }
44145
+ else {
44146
+ delete next[field];
44147
+ }
44148
+ }
44149
+ if (Object.keys(next).length > 0) {
44150
+ inputs['emptyState'] = next;
44151
+ }
44152
+ else {
44153
+ delete inputs['emptyState'];
44154
+ }
44155
+ }
44156
+ applyTextChange(target, field, current, baseline) {
44157
+ if (current === baseline) {
44158
+ return;
44159
+ }
44160
+ const value = current.trim();
44161
+ if (value) {
44162
+ target[field] = value;
44163
+ }
44164
+ else {
44165
+ delete target[field];
44166
+ }
44167
+ }
44168
+ applyDefaultedChange(target, field, current, baseline, defaultValue) {
44169
+ if (current === baseline) {
44170
+ return;
44171
+ }
44172
+ if (current === defaultValue && !Object.prototype.hasOwnProperty.call(this.persistedInputs, field)) {
44173
+ delete target[field];
44174
+ return;
44175
+ }
44176
+ target[field] = current;
44177
+ }
44178
+ publishState() {
44179
+ this.isDirty$.next(JSON.stringify(this.form.getRawValue()) !== JSON.stringify(this.baselineFormValue));
44180
+ this.isValid$.next(this.form.valid);
44181
+ }
44182
+ objectValue(value) {
44183
+ return value && typeof value === 'object' && !Array.isArray(value)
44184
+ ? value
44185
+ : {};
44186
+ }
44187
+ stringValue(value) {
44188
+ return typeof value === 'string' ? value : '';
44189
+ }
44190
+ enumValue(value, allowed) {
44191
+ return typeof value === 'string' && allowed.includes(value) ? value : '';
44192
+ }
44193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletConfigEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.14", type: PraxisRelatedResourceOutletConfigEditorComponent, isStandalone: true, selector: "praxis-related-resource-outlet-config-editor", inputs: { inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null }, widgetKey: { classPropertyName: "widgetKey", publicName: "widgetKey", isSignal: true, isRequired: false, transformFunction: null }, widgetType: { classPropertyName: "widgetType", publicName: "widgetType", isSignal: true, isRequired: false, transformFunction: null } }, providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], ngImport: i0, template: `
44195
+ <form
44196
+ class="pdx-related-outlet-editor"
44197
+ [formGroup]="form"
44198
+ data-testid="related-resource-outlet-config-editor"
44199
+ >
44200
+ <header class="pdx-related-outlet-editor__header">
44201
+ <span class="pdx-related-outlet-editor__header-icon" aria-hidden="true">
44202
+ <mat-icon fontIcon="account_tree" />
44203
+ </span>
44204
+ <span>
44205
+ <strong>{{ t('editor.title', 'Related resource presentation') }}</strong>
44206
+ <small>
44207
+ {{
44208
+ t(
44209
+ 'editor.description',
44210
+ 'Configure only the visual shell. The relationship and its data remain governed by metadata.'
44211
+ )
44212
+ }}
44213
+ </small>
44214
+ </span>
44215
+ </header>
44216
+
44217
+ <section class="pdx-related-outlet-editor__section" aria-labelledby="related-outlet-shell-title">
44218
+ <div class="pdx-related-outlet-editor__section-heading">
44219
+ <h3 id="related-outlet-shell-title">{{ t('editor.shell.title', 'Presentation') }}</h3>
44220
+ <p>{{ t('editor.shell.help', 'Copy and display choices for this outlet instance.') }}</p>
44221
+ </div>
44222
+
44223
+ <div class="pdx-related-outlet-editor__fields">
44224
+ <mat-form-field appearance="outline">
44225
+ <mat-label>{{ t('editor.field.title', 'Title') }}</mat-label>
44226
+ <input matInput formControlName="title" />
44227
+ </mat-form-field>
44228
+
44229
+ <mat-form-field appearance="outline">
44230
+ <mat-label>{{ t('editor.field.icon', 'Icon') }}</mat-label>
44231
+ <input matInput formControlName="icon" />
44232
+ <button
44233
+ mat-icon-button
44234
+ matSuffix
44235
+ type="button"
44236
+ (click)="selectIcon('outlet')"
44237
+ [attr.aria-label]="t('editor.field.icon.choose', 'Choose outlet icon')"
44238
+ >
44239
+ <mat-icon fontIcon="apps" />
44240
+ </button>
44241
+ </mat-form-field>
44242
+
44243
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44244
+ <mat-label>{{ t('editor.field.subtitle', 'Subtitle') }}</mat-label>
44245
+ <textarea matInput formControlName="subtitle" rows="2"></textarea>
44246
+ </mat-form-field>
44247
+ </div>
44248
+
44249
+ <div class="pdx-related-outlet-editor__choice-grid">
44250
+ <fieldset>
44251
+ <legend>{{ t('editor.field.mode', 'Display mode') }}</legend>
44252
+ <mat-button-toggle-group
44253
+ formControlName="mode"
44254
+ hideSingleSelectionIndicator
44255
+ [attr.aria-label]="t('editor.field.mode', 'Display mode')"
44256
+ >
44257
+ <mat-button-toggle value="inline">
44258
+ <mat-icon fontIcon="table_rows" aria-hidden="true" />
44259
+ {{ t('editor.field.mode.inline', 'Inline') }}
44260
+ </mat-button-toggle>
44261
+ <mat-button-toggle value="open-action">
44262
+ <mat-icon fontIcon="open_in_new" aria-hidden="true" />
44263
+ {{ t('editor.field.mode.openAction', 'Open action') }}
44264
+ </mat-button-toggle>
44265
+ </mat-button-toggle-group>
44266
+ </fieldset>
44267
+
44268
+ <fieldset>
44269
+ <legend>{{ t('editor.field.presentation', 'Open presentation') }}</legend>
44270
+ <mat-button-toggle-group
44271
+ formControlName="presentation"
44272
+ hideSingleSelectionIndicator
44273
+ [attr.aria-label]="t('editor.field.presentation', 'Open presentation')"
44274
+ >
44275
+ <mat-button-toggle value="drawer">
44276
+ <mat-icon fontIcon="view_sidebar" aria-hidden="true" />
44277
+ {{ t('editor.field.presentation.drawer', 'Drawer') }}
44278
+ </mat-button-toggle>
44279
+ <mat-button-toggle value="modal">
44280
+ <mat-icon fontIcon="web_asset" aria-hidden="true" />
44281
+ {{ t('editor.field.presentation.modal', 'Modal') }}
44282
+ </mat-button-toggle>
44283
+ </mat-button-toggle-group>
44284
+ </fieldset>
44285
+ </div>
44286
+
44287
+ </section>
44288
+
44289
+ <section
44290
+ class="pdx-related-outlet-editor__section"
44291
+ formGroupName="emptyState"
44292
+ aria-labelledby="related-outlet-empty-state-title"
44293
+ >
44294
+ <div class="pdx-related-outlet-editor__section-heading">
44295
+ <h3 id="related-outlet-empty-state-title">{{ t('editor.emptyState.title', 'Empty state') }}</h3>
44296
+ <p>
44297
+ {{
44298
+ t(
44299
+ 'editor.emptyState.help',
44300
+ 'Override presentation only. Actions, templates and contextual behavior remain untouched.'
44301
+ )
44302
+ }}
44303
+ </p>
44304
+ </div>
44305
+
44306
+ <div class="pdx-related-outlet-editor__fields">
44307
+ <mat-form-field appearance="outline">
44308
+ <mat-label>{{ t('editor.emptyState.field.title', 'Title') }}</mat-label>
44309
+ <input matInput formControlName="title" />
44310
+ </mat-form-field>
44311
+
44312
+ <mat-form-field appearance="outline">
44313
+ <mat-label>{{ t('editor.emptyState.field.icon', 'Icon') }}</mat-label>
44314
+ <input matInput formControlName="icon" />
44315
+ <button
44316
+ mat-icon-button
44317
+ matSuffix
44318
+ type="button"
44319
+ (click)="selectIcon('emptyState')"
44320
+ [attr.aria-label]="t('editor.emptyState.field.icon.choose', 'Choose empty-state icon')"
44321
+ >
44322
+ <mat-icon fontIcon="apps" />
44323
+ </button>
44324
+ </mat-form-field>
44325
+
44326
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44327
+ <mat-label>{{ t('editor.emptyState.field.message', 'Message') }}</mat-label>
44328
+ <input matInput formControlName="message" />
44329
+ </mat-form-field>
44330
+
44331
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44332
+ <mat-label>{{ t('editor.emptyState.field.description', 'Description') }}</mat-label>
44333
+ <textarea matInput formControlName="description" rows="2"></textarea>
44334
+ </mat-form-field>
44335
+
44336
+ </div>
44337
+
44338
+ <div class="pdx-related-outlet-editor__appearance-grid">
44339
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44340
+ <legend>{{ t('editor.emptyState.field.tone', 'Tone') }}</legend>
44341
+ <mat-button-toggle-group
44342
+ formControlName="tone"
44343
+ hideSingleSelectionIndicator
44344
+ [attr.aria-label]="t('editor.emptyState.field.tone', 'Tone')"
44345
+ >
44346
+ <mat-button-toggle value="">
44347
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44348
+ {{ t('editor.value.derived.short', 'Auto') }}
44349
+ </mat-button-toggle>
44350
+ <mat-button-toggle value="neutral">
44351
+ <mat-icon fontIcon="contrast" aria-hidden="true" />
44352
+ {{ t('editor.value.tone.neutral', 'Neutral') }}
44353
+ </mat-button-toggle>
44354
+ <mat-button-toggle value="primary">
44355
+ <mat-icon fontIcon="stars" aria-hidden="true" />
44356
+ {{ t('editor.value.tone.primary', 'Primary') }}
44357
+ </mat-button-toggle>
44358
+ <mat-button-toggle value="secondary">
44359
+ <mat-icon fontIcon="palette" aria-hidden="true" />
44360
+ {{ t('editor.value.tone.secondary', 'Secondary') }}
44361
+ </mat-button-toggle>
44362
+ </mat-button-toggle-group>
44363
+ </fieldset>
44364
+
44365
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__appearance-cluster--wide">
44366
+ <legend>{{ t('editor.emptyState.field.variant', 'Variant') }}</legend>
44367
+ <mat-button-toggle-group
44368
+ formControlName="variant"
44369
+ hideSingleSelectionIndicator
44370
+ [attr.aria-label]="t('editor.emptyState.field.variant', 'Variant')"
44371
+ >
44372
+ <mat-button-toggle value="">
44373
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44374
+ {{ t('editor.value.derived.short', 'Auto') }}
44375
+ </mat-button-toggle>
44376
+ <mat-button-toggle value="inline">
44377
+ <mat-icon fontIcon="view_stream" aria-hidden="true" />
44378
+ {{ t('editor.value.variant.inline', 'Inline') }}
44379
+ </mat-button-toggle>
44380
+ <mat-button-toggle value="card">
44381
+ <mat-icon fontIcon="crop_square" aria-hidden="true" />
44382
+ {{ t('editor.value.variant.card', 'Card') }}
44383
+ </mat-button-toggle>
44384
+ <mat-button-toggle value="panel">
44385
+ <mat-icon fontIcon="view_agenda" aria-hidden="true" />
44386
+ {{ t('editor.value.variant.panel', 'Panel') }}
44387
+ </mat-button-toggle>
44388
+ <mat-button-toggle value="transparent">
44389
+ <mat-icon fontIcon="layers_clear" aria-hidden="true" />
44390
+ {{ t('editor.value.variant.transparent', 'Transparent') }}
44391
+ </mat-button-toggle>
44392
+ </mat-button-toggle-group>
44393
+ </fieldset>
44394
+
44395
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44396
+ <legend>{{ t('editor.emptyState.field.alignment', 'Alignment') }}</legend>
44397
+ <mat-button-toggle-group
44398
+ formControlName="alignment"
44399
+ hideSingleSelectionIndicator
44400
+ [attr.aria-label]="t('editor.emptyState.field.alignment', 'Alignment')"
44401
+ >
44402
+ <mat-button-toggle value="">
44403
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44404
+ {{ t('editor.value.derived.short', 'Auto') }}
44405
+ </mat-button-toggle>
44406
+ <mat-button-toggle value="start">
44407
+ <mat-icon fontIcon="format_align_left" aria-hidden="true" />
44408
+ {{ t('editor.value.alignment.start', 'Start') }}
44409
+ </mat-button-toggle>
44410
+ <mat-button-toggle value="center">
44411
+ <mat-icon fontIcon="format_align_center" aria-hidden="true" />
44412
+ {{ t('editor.value.alignment.center', 'Center') }}
44413
+ </mat-button-toggle>
44414
+ </mat-button-toggle-group>
44415
+ </fieldset>
44416
+
44417
+ <div class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__density-cluster">
44418
+ <fieldset>
44419
+ <legend>{{ t('editor.emptyState.field.density', 'Density') }}</legend>
44420
+ <mat-button-toggle-group
44421
+ formControlName="density"
44422
+ hideSingleSelectionIndicator
44423
+ [attr.aria-label]="t('editor.emptyState.field.density', 'Density')"
44424
+ >
44425
+ <mat-button-toggle value="">
44426
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44427
+ {{ t('editor.value.derived.short', 'Auto') }}
44428
+ </mat-button-toggle>
44429
+ <mat-button-toggle value="compact">
44430
+ <mat-icon fontIcon="density_small" aria-hidden="true" />
44431
+ {{ t('editor.value.density.compact', 'Compact') }}
44432
+ </mat-button-toggle>
44433
+ <mat-button-toggle value="comfortable">
44434
+ <mat-icon fontIcon="density_medium" aria-hidden="true" />
44435
+ {{ t('editor.value.density.comfortable', 'Comfortable') }}
44436
+ </mat-button-toggle>
44437
+ </mat-button-toggle-group>
44438
+ </fieldset>
44439
+ <mat-slide-toggle [formControl]="form.controls.compact">
44440
+ {{ t('editor.field.compact', 'Use compact empty and loading states') }}
44441
+ </mat-slide-toggle>
44442
+ </div>
44443
+
44444
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44445
+ <legend>{{ t('editor.emptyState.field.iconContainer', 'Icon container') }}</legend>
44446
+ <mat-button-toggle-group
44447
+ formControlName="iconContainer"
44448
+ hideSingleSelectionIndicator
44449
+ [attr.aria-label]="t('editor.emptyState.field.iconContainer', 'Icon container')"
44450
+ >
44451
+ <mat-button-toggle value="">
44452
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44453
+ {{ t('editor.value.derived.short', 'Auto') }}
44454
+ </mat-button-toggle>
44455
+ <mat-button-toggle value="none">
44456
+ <mat-icon fontIcon="block" aria-hidden="true" />
44457
+ {{ t('editor.value.iconContainer.none', 'None') }}
44458
+ </mat-button-toggle>
44459
+ <mat-button-toggle value="circle">
44460
+ <mat-icon fontIcon="circle" aria-hidden="true" />
44461
+ {{ t('editor.value.iconContainer.circle', 'Circle') }}
44462
+ </mat-button-toggle>
44463
+ <mat-button-toggle value="soft">
44464
+ <mat-icon fontIcon="blur_on" aria-hidden="true" />
44465
+ {{ t('editor.value.iconContainer.soft', 'Soft') }}
44466
+ </mat-button-toggle>
44467
+ </mat-button-toggle-group>
44468
+ </fieldset>
44469
+ </div>
44470
+ </section>
44471
+
44472
+ <aside class="pdx-related-outlet-editor__boundary" role="note">
44473
+ <mat-icon fontIcon="lock" aria-hidden="true" />
44474
+ <span>
44475
+ <strong>{{ t('editor.boundary.title', 'Relationship is read-only here') }}</strong>
44476
+ <small>
44477
+ {{
44478
+ t(
44479
+ 'editor.boundary.description',
44480
+ 'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.'
44481
+ )
44482
+ }}
44483
+ </small>
44484
+ </span>
44485
+ </aside>
44486
+ </form>
44487
+ `, isInline: true, styles: [":host{display:block;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet-editor{display:grid;gap:var(--pdx-spacing-lg, 24px);padding:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__header,.pdx-related-outlet-editor__boundary{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__header-icon{display:inline-grid;place-items:center;width:40px;height:40px;border-radius:var(--md-sys-shape-corner-medium, 12px);color:var(--md-sys-color-primary, currentColor);background:var(--md-sys-color-primary-container, transparent)}.pdx-related-outlet-editor__header strong,.pdx-related-outlet-editor__boundary strong,.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small{display:block}.pdx-related-outlet-editor__header strong{font:var(--md-sys-typescale-title-medium, 600 1rem/1.4 system-ui)}.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small,.pdx-related-outlet-editor__section-heading p{color:var(--md-sys-color-on-surface-variant, currentColor)}.pdx-related-outlet-editor__section{display:grid;gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__section-heading h3,.pdx-related-outlet-editor__section-heading p{margin:0}.pdx-related-outlet-editor__section-heading h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.3 system-ui)}.pdx-related-outlet-editor__section-heading p{margin-top:4px;font:var(--md-sys-typescale-body-small, 400 .82rem/1.35 system-ui)}.pdx-related-outlet-editor__fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__wide{grid-column:1 / -1}.pdx-related-outlet-editor__choice-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__appearance-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__appearance-cluster{display:grid;align-content:start;gap:var(--pdx-spacing-sm, 12px);min-width:0}.pdx-related-outlet-editor__appearance-cluster--wide{grid-column:1 / -1}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,132px),1fr))}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle{min-height:44px}.pdx-related-outlet-editor__density-cluster{gap:var(--pdx-spacing-md, 16px)}fieldset{min-width:0;margin:0;padding:0;border:0}legend{margin-bottom:8px;font:var(--md-sys-typescale-label-large, 500 .88rem/1.2 system-ui)}mat-button-toggle-group{width:100%}mat-button-toggle{flex:1 1 0}mat-button-toggle mat-icon{margin-right:6px}.pdx-related-outlet-editor__boundary{padding:var(--pdx-spacing-sm, 12px);border:1px solid var(--md-sys-color-outline-variant, currentColor);border-radius:var(--md-sys-shape-corner-medium, 12px);background:var(--md-sys-color-surface-container-low, transparent)}.pdx-related-outlet-editor__boundary mat-icon{color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:640px){.pdx-related-outlet-editor__fields,.pdx-related-outlet-editor__choice-grid{grid-template-columns:minmax(0,1fr)}.pdx-related-outlet-editor__wide{grid-column:auto}mat-button-toggle-group{display:grid}}@media(max-width:420px){.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{grid-template-columns:minmax(0,1fr)}}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i3$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i3$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44488
+ }
44489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRelatedResourceOutletConfigEditorComponent, decorators: [{
44490
+ type: Component,
44491
+ args: [{ selector: 'praxis-related-resource-outlet-config-editor', imports: [
44492
+ ReactiveFormsModule,
44493
+ MatButtonModule,
44494
+ MatButtonToggleModule,
44495
+ MatFormFieldModule,
44496
+ MatIconModule,
44497
+ MatInputModule,
44498
+ MatSlideToggleModule,
44499
+ ], providers: [providePraxisI18nConfig(RELATED_RESOURCE_OUTLET_I18N_CONFIG)], changeDetection: ChangeDetectionStrategy.OnPush, template: `
44500
+ <form
44501
+ class="pdx-related-outlet-editor"
44502
+ [formGroup]="form"
44503
+ data-testid="related-resource-outlet-config-editor"
44504
+ >
44505
+ <header class="pdx-related-outlet-editor__header">
44506
+ <span class="pdx-related-outlet-editor__header-icon" aria-hidden="true">
44507
+ <mat-icon fontIcon="account_tree" />
44508
+ </span>
44509
+ <span>
44510
+ <strong>{{ t('editor.title', 'Related resource presentation') }}</strong>
44511
+ <small>
44512
+ {{
44513
+ t(
44514
+ 'editor.description',
44515
+ 'Configure only the visual shell. The relationship and its data remain governed by metadata.'
44516
+ )
44517
+ }}
44518
+ </small>
44519
+ </span>
44520
+ </header>
44521
+
44522
+ <section class="pdx-related-outlet-editor__section" aria-labelledby="related-outlet-shell-title">
44523
+ <div class="pdx-related-outlet-editor__section-heading">
44524
+ <h3 id="related-outlet-shell-title">{{ t('editor.shell.title', 'Presentation') }}</h3>
44525
+ <p>{{ t('editor.shell.help', 'Copy and display choices for this outlet instance.') }}</p>
44526
+ </div>
44527
+
44528
+ <div class="pdx-related-outlet-editor__fields">
44529
+ <mat-form-field appearance="outline">
44530
+ <mat-label>{{ t('editor.field.title', 'Title') }}</mat-label>
44531
+ <input matInput formControlName="title" />
44532
+ </mat-form-field>
44533
+
44534
+ <mat-form-field appearance="outline">
44535
+ <mat-label>{{ t('editor.field.icon', 'Icon') }}</mat-label>
44536
+ <input matInput formControlName="icon" />
44537
+ <button
44538
+ mat-icon-button
44539
+ matSuffix
44540
+ type="button"
44541
+ (click)="selectIcon('outlet')"
44542
+ [attr.aria-label]="t('editor.field.icon.choose', 'Choose outlet icon')"
44543
+ >
44544
+ <mat-icon fontIcon="apps" />
44545
+ </button>
44546
+ </mat-form-field>
44547
+
44548
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44549
+ <mat-label>{{ t('editor.field.subtitle', 'Subtitle') }}</mat-label>
44550
+ <textarea matInput formControlName="subtitle" rows="2"></textarea>
44551
+ </mat-form-field>
44552
+ </div>
44553
+
44554
+ <div class="pdx-related-outlet-editor__choice-grid">
44555
+ <fieldset>
44556
+ <legend>{{ t('editor.field.mode', 'Display mode') }}</legend>
44557
+ <mat-button-toggle-group
44558
+ formControlName="mode"
44559
+ hideSingleSelectionIndicator
44560
+ [attr.aria-label]="t('editor.field.mode', 'Display mode')"
44561
+ >
44562
+ <mat-button-toggle value="inline">
44563
+ <mat-icon fontIcon="table_rows" aria-hidden="true" />
44564
+ {{ t('editor.field.mode.inline', 'Inline') }}
44565
+ </mat-button-toggle>
44566
+ <mat-button-toggle value="open-action">
44567
+ <mat-icon fontIcon="open_in_new" aria-hidden="true" />
44568
+ {{ t('editor.field.mode.openAction', 'Open action') }}
44569
+ </mat-button-toggle>
44570
+ </mat-button-toggle-group>
44571
+ </fieldset>
44572
+
44573
+ <fieldset>
44574
+ <legend>{{ t('editor.field.presentation', 'Open presentation') }}</legend>
44575
+ <mat-button-toggle-group
44576
+ formControlName="presentation"
44577
+ hideSingleSelectionIndicator
44578
+ [attr.aria-label]="t('editor.field.presentation', 'Open presentation')"
44579
+ >
44580
+ <mat-button-toggle value="drawer">
44581
+ <mat-icon fontIcon="view_sidebar" aria-hidden="true" />
44582
+ {{ t('editor.field.presentation.drawer', 'Drawer') }}
44583
+ </mat-button-toggle>
44584
+ <mat-button-toggle value="modal">
44585
+ <mat-icon fontIcon="web_asset" aria-hidden="true" />
44586
+ {{ t('editor.field.presentation.modal', 'Modal') }}
44587
+ </mat-button-toggle>
44588
+ </mat-button-toggle-group>
44589
+ </fieldset>
44590
+ </div>
44591
+
44592
+ </section>
44593
+
44594
+ <section
44595
+ class="pdx-related-outlet-editor__section"
44596
+ formGroupName="emptyState"
44597
+ aria-labelledby="related-outlet-empty-state-title"
44598
+ >
44599
+ <div class="pdx-related-outlet-editor__section-heading">
44600
+ <h3 id="related-outlet-empty-state-title">{{ t('editor.emptyState.title', 'Empty state') }}</h3>
44601
+ <p>
44602
+ {{
44603
+ t(
44604
+ 'editor.emptyState.help',
44605
+ 'Override presentation only. Actions, templates and contextual behavior remain untouched.'
44606
+ )
44607
+ }}
44608
+ </p>
44609
+ </div>
44610
+
44611
+ <div class="pdx-related-outlet-editor__fields">
44612
+ <mat-form-field appearance="outline">
44613
+ <mat-label>{{ t('editor.emptyState.field.title', 'Title') }}</mat-label>
44614
+ <input matInput formControlName="title" />
44615
+ </mat-form-field>
44616
+
44617
+ <mat-form-field appearance="outline">
44618
+ <mat-label>{{ t('editor.emptyState.field.icon', 'Icon') }}</mat-label>
44619
+ <input matInput formControlName="icon" />
44620
+ <button
44621
+ mat-icon-button
44622
+ matSuffix
44623
+ type="button"
44624
+ (click)="selectIcon('emptyState')"
44625
+ [attr.aria-label]="t('editor.emptyState.field.icon.choose', 'Choose empty-state icon')"
44626
+ >
44627
+ <mat-icon fontIcon="apps" />
44628
+ </button>
44629
+ </mat-form-field>
44630
+
44631
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44632
+ <mat-label>{{ t('editor.emptyState.field.message', 'Message') }}</mat-label>
44633
+ <input matInput formControlName="message" />
44634
+ </mat-form-field>
44635
+
44636
+ <mat-form-field appearance="outline" class="pdx-related-outlet-editor__wide">
44637
+ <mat-label>{{ t('editor.emptyState.field.description', 'Description') }}</mat-label>
44638
+ <textarea matInput formControlName="description" rows="2"></textarea>
44639
+ </mat-form-field>
44640
+
44641
+ </div>
44642
+
44643
+ <div class="pdx-related-outlet-editor__appearance-grid">
44644
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44645
+ <legend>{{ t('editor.emptyState.field.tone', 'Tone') }}</legend>
44646
+ <mat-button-toggle-group
44647
+ formControlName="tone"
44648
+ hideSingleSelectionIndicator
44649
+ [attr.aria-label]="t('editor.emptyState.field.tone', 'Tone')"
44650
+ >
44651
+ <mat-button-toggle value="">
44652
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44653
+ {{ t('editor.value.derived.short', 'Auto') }}
44654
+ </mat-button-toggle>
44655
+ <mat-button-toggle value="neutral">
44656
+ <mat-icon fontIcon="contrast" aria-hidden="true" />
44657
+ {{ t('editor.value.tone.neutral', 'Neutral') }}
44658
+ </mat-button-toggle>
44659
+ <mat-button-toggle value="primary">
44660
+ <mat-icon fontIcon="stars" aria-hidden="true" />
44661
+ {{ t('editor.value.tone.primary', 'Primary') }}
44662
+ </mat-button-toggle>
44663
+ <mat-button-toggle value="secondary">
44664
+ <mat-icon fontIcon="palette" aria-hidden="true" />
44665
+ {{ t('editor.value.tone.secondary', 'Secondary') }}
44666
+ </mat-button-toggle>
44667
+ </mat-button-toggle-group>
44668
+ </fieldset>
44669
+
44670
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__appearance-cluster--wide">
44671
+ <legend>{{ t('editor.emptyState.field.variant', 'Variant') }}</legend>
44672
+ <mat-button-toggle-group
44673
+ formControlName="variant"
44674
+ hideSingleSelectionIndicator
44675
+ [attr.aria-label]="t('editor.emptyState.field.variant', 'Variant')"
44676
+ >
44677
+ <mat-button-toggle value="">
44678
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44679
+ {{ t('editor.value.derived.short', 'Auto') }}
44680
+ </mat-button-toggle>
44681
+ <mat-button-toggle value="inline">
44682
+ <mat-icon fontIcon="view_stream" aria-hidden="true" />
44683
+ {{ t('editor.value.variant.inline', 'Inline') }}
44684
+ </mat-button-toggle>
44685
+ <mat-button-toggle value="card">
44686
+ <mat-icon fontIcon="crop_square" aria-hidden="true" />
44687
+ {{ t('editor.value.variant.card', 'Card') }}
44688
+ </mat-button-toggle>
44689
+ <mat-button-toggle value="panel">
44690
+ <mat-icon fontIcon="view_agenda" aria-hidden="true" />
44691
+ {{ t('editor.value.variant.panel', 'Panel') }}
44692
+ </mat-button-toggle>
44693
+ <mat-button-toggle value="transparent">
44694
+ <mat-icon fontIcon="layers_clear" aria-hidden="true" />
44695
+ {{ t('editor.value.variant.transparent', 'Transparent') }}
44696
+ </mat-button-toggle>
44697
+ </mat-button-toggle-group>
44698
+ </fieldset>
44699
+
44700
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44701
+ <legend>{{ t('editor.emptyState.field.alignment', 'Alignment') }}</legend>
44702
+ <mat-button-toggle-group
44703
+ formControlName="alignment"
44704
+ hideSingleSelectionIndicator
44705
+ [attr.aria-label]="t('editor.emptyState.field.alignment', 'Alignment')"
44706
+ >
44707
+ <mat-button-toggle value="">
44708
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44709
+ {{ t('editor.value.derived.short', 'Auto') }}
44710
+ </mat-button-toggle>
44711
+ <mat-button-toggle value="start">
44712
+ <mat-icon fontIcon="format_align_left" aria-hidden="true" />
44713
+ {{ t('editor.value.alignment.start', 'Start') }}
44714
+ </mat-button-toggle>
44715
+ <mat-button-toggle value="center">
44716
+ <mat-icon fontIcon="format_align_center" aria-hidden="true" />
44717
+ {{ t('editor.value.alignment.center', 'Center') }}
44718
+ </mat-button-toggle>
44719
+ </mat-button-toggle-group>
44720
+ </fieldset>
44721
+
44722
+ <div class="pdx-related-outlet-editor__appearance-cluster pdx-related-outlet-editor__density-cluster">
44723
+ <fieldset>
44724
+ <legend>{{ t('editor.emptyState.field.density', 'Density') }}</legend>
44725
+ <mat-button-toggle-group
44726
+ formControlName="density"
44727
+ hideSingleSelectionIndicator
44728
+ [attr.aria-label]="t('editor.emptyState.field.density', 'Density')"
44729
+ >
44730
+ <mat-button-toggle value="">
44731
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44732
+ {{ t('editor.value.derived.short', 'Auto') }}
44733
+ </mat-button-toggle>
44734
+ <mat-button-toggle value="compact">
44735
+ <mat-icon fontIcon="density_small" aria-hidden="true" />
44736
+ {{ t('editor.value.density.compact', 'Compact') }}
44737
+ </mat-button-toggle>
44738
+ <mat-button-toggle value="comfortable">
44739
+ <mat-icon fontIcon="density_medium" aria-hidden="true" />
44740
+ {{ t('editor.value.density.comfortable', 'Comfortable') }}
44741
+ </mat-button-toggle>
44742
+ </mat-button-toggle-group>
44743
+ </fieldset>
44744
+ <mat-slide-toggle [formControl]="form.controls.compact">
44745
+ {{ t('editor.field.compact', 'Use compact empty and loading states') }}
44746
+ </mat-slide-toggle>
44747
+ </div>
44748
+
44749
+ <fieldset class="pdx-related-outlet-editor__appearance-cluster">
44750
+ <legend>{{ t('editor.emptyState.field.iconContainer', 'Icon container') }}</legend>
44751
+ <mat-button-toggle-group
44752
+ formControlName="iconContainer"
44753
+ hideSingleSelectionIndicator
44754
+ [attr.aria-label]="t('editor.emptyState.field.iconContainer', 'Icon container')"
44755
+ >
44756
+ <mat-button-toggle value="">
44757
+ <mat-icon fontIcon="auto_awesome" aria-hidden="true" />
44758
+ {{ t('editor.value.derived.short', 'Auto') }}
44759
+ </mat-button-toggle>
44760
+ <mat-button-toggle value="none">
44761
+ <mat-icon fontIcon="block" aria-hidden="true" />
44762
+ {{ t('editor.value.iconContainer.none', 'None') }}
44763
+ </mat-button-toggle>
44764
+ <mat-button-toggle value="circle">
44765
+ <mat-icon fontIcon="circle" aria-hidden="true" />
44766
+ {{ t('editor.value.iconContainer.circle', 'Circle') }}
44767
+ </mat-button-toggle>
44768
+ <mat-button-toggle value="soft">
44769
+ <mat-icon fontIcon="blur_on" aria-hidden="true" />
44770
+ {{ t('editor.value.iconContainer.soft', 'Soft') }}
44771
+ </mat-button-toggle>
44772
+ </mat-button-toggle-group>
44773
+ </fieldset>
44774
+ </div>
44775
+ </section>
44776
+
44777
+ <aside class="pdx-related-outlet-editor__boundary" role="note">
44778
+ <mat-icon fontIcon="lock" aria-hidden="true" />
44779
+ <span>
44780
+ <strong>{{ t('editor.boundary.title', 'Relationship is read-only here') }}</strong>
44781
+ <small>
44782
+ {{
44783
+ t(
44784
+ 'editor.boundary.description',
44785
+ 'Resource paths, parent bindings, operations, filters and child table configuration stay with their canonical owners.'
44786
+ )
44787
+ }}
44788
+ </small>
44789
+ </span>
44790
+ </aside>
44791
+ </form>
44792
+ `, styles: [":host{display:block;color:var(--md-sys-color-on-surface, currentColor)}.pdx-related-outlet-editor{display:grid;gap:var(--pdx-spacing-lg, 24px);padding:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__header,.pdx-related-outlet-editor__boundary{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__header-icon{display:inline-grid;place-items:center;width:40px;height:40px;border-radius:var(--md-sys-shape-corner-medium, 12px);color:var(--md-sys-color-primary, currentColor);background:var(--md-sys-color-primary-container, transparent)}.pdx-related-outlet-editor__header strong,.pdx-related-outlet-editor__boundary strong,.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small{display:block}.pdx-related-outlet-editor__header strong{font:var(--md-sys-typescale-title-medium, 600 1rem/1.4 system-ui)}.pdx-related-outlet-editor__header small,.pdx-related-outlet-editor__boundary small,.pdx-related-outlet-editor__section-heading p{color:var(--md-sys-color-on-surface-variant, currentColor)}.pdx-related-outlet-editor__section{display:grid;gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__section-heading h3,.pdx-related-outlet-editor__section-heading p{margin:0}.pdx-related-outlet-editor__section-heading h3{font:var(--md-sys-typescale-title-small, 600 .95rem/1.3 system-ui)}.pdx-related-outlet-editor__section-heading p{margin-top:4px;font:var(--md-sys-typescale-body-small, 400 .82rem/1.35 system-ui)}.pdx-related-outlet-editor__fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__wide{grid-column:1 / -1}.pdx-related-outlet-editor__choice-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--pdx-spacing-md, 16px)}.pdx-related-outlet-editor__appearance-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:var(--pdx-spacing-sm, 12px)}.pdx-related-outlet-editor__appearance-cluster{display:grid;align-content:start;gap:var(--pdx-spacing-sm, 12px);min-width:0}.pdx-related-outlet-editor__appearance-cluster--wide{grid-column:1 / -1}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,132px),1fr))}.pdx-related-outlet-editor__appearance-cluster mat-button-toggle{min-height:44px}.pdx-related-outlet-editor__density-cluster{gap:var(--pdx-spacing-md, 16px)}fieldset{min-width:0;margin:0;padding:0;border:0}legend{margin-bottom:8px;font:var(--md-sys-typescale-label-large, 500 .88rem/1.2 system-ui)}mat-button-toggle-group{width:100%}mat-button-toggle{flex:1 1 0}mat-button-toggle mat-icon{margin-right:6px}.pdx-related-outlet-editor__boundary{padding:var(--pdx-spacing-sm, 12px);border:1px solid var(--md-sys-color-outline-variant, currentColor);border-radius:var(--md-sys-shape-corner-medium, 12px);background:var(--md-sys-color-surface-container-low, transparent)}.pdx-related-outlet-editor__boundary mat-icon{color:var(--md-sys-color-on-surface-variant, currentColor)}@media(max-width:640px){.pdx-related-outlet-editor__fields,.pdx-related-outlet-editor__choice-grid{grid-template-columns:minmax(0,1fr)}.pdx-related-outlet-editor__wide{grid-column:auto}mat-button-toggle-group{display:grid}}@media(max-width:420px){.pdx-related-outlet-editor__appearance-cluster mat-button-toggle-group{grid-template-columns:minmax(0,1fr)}}\n"] }]
44793
+ }], ctorParameters: () => [], propDecorators: { inputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "inputs", required: false }] }], widgetKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "widgetKey", required: false }] }], widgetType: [{ type: i0.Input, args: [{ isSignal: true, alias: "widgetType", required: false }] }] } });
44794
+
43427
44795
  const PRAXIS_RELATED_RESOURCE_OUTLET_PORTS = [
43428
44796
  {
43429
44797
  id: 'parentResourceId',
@@ -43549,6 +44917,15 @@ const PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA = {
43549
44917
  { name: 'resourceEvent', type: 'PraxisResourceEvent', description: 'Promove eventos canonicos emitidos pelo widget filho materializado.' },
43550
44918
  ],
43551
44919
  ports: PRAXIS_RELATED_RESOURCE_OUTLET_PORTS,
44920
+ configEditor: {
44921
+ component: PraxisRelatedResourceOutletConfigEditorComponent,
44922
+ title: 'Related resource presentation',
44923
+ },
44924
+ authoringManifestRef: {
44925
+ componentId: 'praxis-related-resource-outlet',
44926
+ version: '1.0.0',
44927
+ source: 'PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST',
44928
+ },
43552
44929
  tags: ['resource', 'surface', 'related-resource', 'runtime', 'metadata-driven'],
43553
44930
  lib: '@praxisui/core',
43554
44931
  };
@@ -43563,6 +44940,297 @@ function providePraxisRelatedResourceOutletMetadata() {
43563
44940
  };
43564
44941
  }
43565
44942
 
44943
+ const nullableTextSchema = {
44944
+ oneOf: [{ type: 'string' }, { type: 'null' }],
44945
+ };
44946
+ const presentationValidators = [
44947
+ 'component-config-editor-respected',
44948
+ 'editor-round-trip-preserve',
44949
+ ];
44950
+ const PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST = {
44951
+ schemaVersion: '1.0.0',
44952
+ componentId: 'praxis-related-resource-outlet',
44953
+ ownerPackage: '@praxisui/core',
44954
+ configSchemaId: 'PraxisRelatedResourceOutletPresentationInputs',
44955
+ manifestVersion: '1.0.0',
44956
+ runtimeInputs: [
44957
+ { name: 'title', type: 'string | null', description: 'Optional visual title override.' },
44958
+ { name: 'subtitle', type: 'string | null', description: 'Optional visual subtitle override.' },
44959
+ { name: 'icon', type: 'string | null', description: 'Optional visual icon override.' },
44960
+ { name: 'mode', type: "'inline' | 'open-action'", allowedValues: ['inline', 'open-action'], description: 'Outlet display mode.' },
44961
+ { name: 'presentation', type: "'drawer' | 'modal'", allowedValues: ['drawer', 'modal'], description: 'Host-mediated presentation used by open-action mode.' },
44962
+ { name: 'compact', type: 'boolean', allowedValues: [true, false], description: 'Compact visual density for non-materialized states.' },
44963
+ {
44964
+ name: 'emptyState',
44965
+ type: 'PraxisRelatedResourceOutletEmptyStatePresentation',
44966
+ description: 'Closed presentation-only empty-state subset. Actions, templates and contexts are not authorable here.',
44967
+ },
44968
+ ],
44969
+ editableTargets: [
44970
+ {
44971
+ kind: 'relatedResourceOutletPresentation',
44972
+ resolver: 'component-config',
44973
+ description: 'Persisted visual shell inputs owned by the Related Resource Outlet config editor.',
44974
+ },
44975
+ {
44976
+ kind: 'relatedResourceOutletEmptyStatePresentation',
44977
+ resolver: 'component-config',
44978
+ description: 'Persisted presentation-only emptyState subset; opaque empty-state fields are preserved unchanged.',
44979
+ },
44980
+ ],
44981
+ operations: [
44982
+ {
44983
+ operationId: 'related-resource-outlet.presentation.set-title',
44984
+ title: 'Set related-resource title',
44985
+ description: 'Sets only the persisted visual title; relationship metadata and runtime context remain unchanged.',
44986
+ scope: 'global',
44987
+ targetKind: 'relatedResourceOutletPresentation',
44988
+ target: {
44989
+ kind: 'relatedResourceOutletPresentation',
44990
+ resolver: 'component-config',
44991
+ ambiguityPolicy: 'fail',
44992
+ required: false,
44993
+ },
44994
+ inputSchema: {
44995
+ type: 'object',
44996
+ additionalProperties: false,
44997
+ required: ['value'],
44998
+ properties: { value: nullableTextSchema },
44999
+ },
45000
+ effects: [{ kind: 'set-value', path: 'title', inputPath: 'value' }],
45001
+ destructive: false,
45002
+ requiresConfirmation: false,
45003
+ validators: presentationValidators,
45004
+ affectedPaths: ['title'],
45005
+ submissionImpact: 'visual-only',
45006
+ preconditions: ['component-config-loaded'],
45007
+ },
45008
+ {
45009
+ operationId: 'related-resource-outlet.presentation.set-subtitle',
45010
+ title: 'Set related-resource subtitle',
45011
+ description: 'Sets only the persisted visual subtitle; relationship metadata and runtime context remain unchanged.',
45012
+ scope: 'global',
45013
+ targetKind: 'relatedResourceOutletPresentation',
45014
+ target: {
45015
+ kind: 'relatedResourceOutletPresentation',
45016
+ resolver: 'component-config',
45017
+ ambiguityPolicy: 'fail',
45018
+ required: false,
45019
+ },
45020
+ inputSchema: {
45021
+ type: 'object',
45022
+ additionalProperties: false,
45023
+ required: ['value'],
45024
+ properties: { value: nullableTextSchema },
45025
+ },
45026
+ effects: [{ kind: 'set-value', path: 'subtitle', inputPath: 'value' }],
45027
+ destructive: false,
45028
+ requiresConfirmation: false,
45029
+ validators: presentationValidators,
45030
+ affectedPaths: ['subtitle'],
45031
+ submissionImpact: 'visual-only',
45032
+ preconditions: ['component-config-loaded'],
45033
+ },
45034
+ {
45035
+ operationId: 'related-resource-outlet.presentation.set-icon',
45036
+ title: 'Set related-resource icon',
45037
+ description: 'Sets only the persisted visual icon; relationship metadata and runtime context remain unchanged.',
45038
+ scope: 'global',
45039
+ targetKind: 'relatedResourceOutletPresentation',
45040
+ target: {
45041
+ kind: 'relatedResourceOutletPresentation',
45042
+ resolver: 'component-config',
45043
+ ambiguityPolicy: 'fail',
45044
+ required: false,
45045
+ },
45046
+ inputSchema: {
45047
+ type: 'object',
45048
+ additionalProperties: false,
45049
+ required: ['value'],
45050
+ properties: { value: nullableTextSchema },
45051
+ },
45052
+ effects: [{ kind: 'set-value', path: 'icon', inputPath: 'value' }],
45053
+ destructive: false,
45054
+ requiresConfirmation: false,
45055
+ validators: presentationValidators,
45056
+ affectedPaths: ['icon'],
45057
+ submissionImpact: 'visual-only',
45058
+ preconditions: ['component-config-loaded'],
45059
+ },
45060
+ {
45061
+ operationId: 'related-resource-outlet.presentation.set-mode',
45062
+ title: 'Set related-resource display mode',
45063
+ description: 'Selects inline rendering or a host-mediated open action without changing the relationship or its operation.',
45064
+ scope: 'global',
45065
+ targetKind: 'relatedResourceOutletPresentation',
45066
+ target: {
45067
+ kind: 'relatedResourceOutletPresentation',
45068
+ resolver: 'component-config',
45069
+ ambiguityPolicy: 'fail',
45070
+ required: false,
45071
+ },
45072
+ inputSchema: {
45073
+ type: 'object',
45074
+ additionalProperties: false,
45075
+ required: ['value'],
45076
+ properties: { value: { enum: ['inline', 'open-action'] } },
45077
+ },
45078
+ effects: [{ kind: 'set-value', path: 'mode', inputPath: 'value' }],
45079
+ destructive: false,
45080
+ requiresConfirmation: false,
45081
+ validators: presentationValidators,
45082
+ affectedPaths: ['mode'],
45083
+ submissionImpact: 'visual-only',
45084
+ preconditions: ['component-config-loaded'],
45085
+ },
45086
+ {
45087
+ operationId: 'related-resource-outlet.presentation.set-open-presentation',
45088
+ title: 'Set related-resource open presentation',
45089
+ description: 'Selects drawer or modal for the host-mediated open payload without changing target resource semantics.',
45090
+ scope: 'global',
45091
+ targetKind: 'relatedResourceOutletPresentation',
45092
+ target: {
45093
+ kind: 'relatedResourceOutletPresentation',
45094
+ resolver: 'component-config',
45095
+ ambiguityPolicy: 'fail',
45096
+ required: false,
45097
+ },
45098
+ inputSchema: {
45099
+ type: 'object',
45100
+ additionalProperties: false,
45101
+ required: ['value'],
45102
+ properties: { value: { enum: ['drawer', 'modal'] } },
45103
+ },
45104
+ effects: [{ kind: 'set-value', path: 'presentation', inputPath: 'value' }],
45105
+ destructive: false,
45106
+ requiresConfirmation: false,
45107
+ validators: presentationValidators,
45108
+ affectedPaths: ['presentation'],
45109
+ submissionImpact: 'visual-only',
45110
+ preconditions: ['component-config-loaded'],
45111
+ },
45112
+ {
45113
+ operationId: 'related-resource-outlet.presentation.set-compact',
45114
+ title: 'Set compact related-resource states',
45115
+ description: 'Changes only the visual density of non-materialized outlet states.',
45116
+ scope: 'global',
45117
+ targetKind: 'relatedResourceOutletPresentation',
45118
+ target: {
45119
+ kind: 'relatedResourceOutletPresentation',
45120
+ resolver: 'component-config',
45121
+ ambiguityPolicy: 'fail',
45122
+ required: false,
45123
+ },
45124
+ inputSchema: {
45125
+ type: 'object',
45126
+ additionalProperties: false,
45127
+ required: ['value'],
45128
+ properties: { value: { type: 'boolean' } },
45129
+ },
45130
+ effects: [{ kind: 'set-value', path: 'compact', inputPath: 'value' }],
45131
+ destructive: false,
45132
+ requiresConfirmation: false,
45133
+ validators: presentationValidators,
45134
+ affectedPaths: ['compact'],
45135
+ submissionImpact: 'visual-only',
45136
+ preconditions: ['component-config-loaded'],
45137
+ },
45138
+ {
45139
+ operationId: 'related-resource-outlet.presentation.configure-empty-state',
45140
+ title: 'Configure related-resource empty-state presentation',
45141
+ description: 'Merges only the closed presentation subset; actions, contexts, images, templates and unknown fields remain opaque.',
45142
+ scope: 'global',
45143
+ targetKind: 'relatedResourceOutletEmptyStatePresentation',
45144
+ target: {
45145
+ kind: 'relatedResourceOutletEmptyStatePresentation',
45146
+ resolver: 'component-config',
45147
+ ambiguityPolicy: 'fail',
45148
+ required: false,
45149
+ },
45150
+ inputSchema: {
45151
+ type: 'object',
45152
+ additionalProperties: false,
45153
+ minProperties: 1,
45154
+ properties: {
45155
+ title: nullableTextSchema,
45156
+ message: nullableTextSchema,
45157
+ description: nullableTextSchema,
45158
+ icon: nullableTextSchema,
45159
+ tone: { oneOf: [{ enum: ['neutral', 'primary', 'secondary'] }, { type: 'null' }] },
45160
+ variant: { oneOf: [{ enum: ['card', 'inline', 'panel', 'transparent'] }, { type: 'null' }] },
45161
+ alignment: { oneOf: [{ enum: ['start', 'center'] }, { type: 'null' }] },
45162
+ density: { oneOf: [{ enum: ['compact', 'comfortable'] }, { type: 'null' }] },
45163
+ iconContainer: { oneOf: [{ enum: ['none', 'circle', 'soft'] }, { type: 'null' }] },
45164
+ },
45165
+ },
45166
+ effects: [{ kind: 'merge-object', path: 'emptyState' }],
45167
+ destructive: false,
45168
+ requiresConfirmation: false,
45169
+ validators: presentationValidators,
45170
+ affectedPaths: [
45171
+ 'emptyState.title',
45172
+ 'emptyState.message',
45173
+ 'emptyState.description',
45174
+ 'emptyState.icon',
45175
+ 'emptyState.tone',
45176
+ 'emptyState.variant',
45177
+ 'emptyState.alignment',
45178
+ 'emptyState.density',
45179
+ 'emptyState.iconContainer',
45180
+ ],
45181
+ submissionImpact: 'visual-only',
45182
+ preconditions: ['component-config-loaded'],
45183
+ },
45184
+ ],
45185
+ validators: [
45186
+ {
45187
+ validatorId: 'component-config-editor-respected',
45188
+ level: 'error',
45189
+ code: 'RELATED_RESOURCE_OUTLET_CONFIG_EDITOR_RESPECTED',
45190
+ description: 'Only paths owned by the published config editor may be authored.',
45191
+ },
45192
+ {
45193
+ validatorId: 'editor-round-trip-preserve',
45194
+ level: 'error',
45195
+ code: 'RELATED_RESOURCE_OUTLET_EDITOR_ROUND_TRIP_PRESERVE',
45196
+ description: 'Save and reopen must preserve runtime, relationship, Table-owned and unknown persisted inputs without drift.',
45197
+ },
45198
+ ],
45199
+ roundTripRequirements: [
45200
+ 'Opening the editor must never materialize runtime inputs or mutate the persisted widget definition.',
45201
+ 'Apply, Save, Reset and Reopen must preserve every input outside the presentation-only editor boundary byte-for-byte.',
45202
+ 'parentResourceId, surfaceId, surface, parentRecord, queryContext, state, relationship semantics and tableConfig are never authorable by this manifest.',
45203
+ 'Unknown root inputs and unknown or behavior-bearing emptyState fields remain opaque and are preserved unchanged.',
45204
+ ],
45205
+ examples: [
45206
+ {
45207
+ id: 'set-related-resource-shell',
45208
+ request: 'Show the related participants inline with the title Participants and compact states.',
45209
+ operationId: 'related-resource-outlet.presentation.set-title',
45210
+ params: { value: 'Participants' },
45211
+ isPositive: true,
45212
+ },
45213
+ {
45214
+ id: 'set-related-resource-empty-state-copy',
45215
+ request: 'Use No participants yet as the empty-state title.',
45216
+ operationId: 'related-resource-outlet.presentation.configure-empty-state',
45217
+ params: { title: 'No participants yet' },
45218
+ isPositive: true,
45219
+ },
45220
+ {
45221
+ id: 'reject-related-resource-relationship-authoring',
45222
+ request: 'Change the child resource path, parent field, filter operation and tableConfig from this outlet editor.',
45223
+ operationId: 'related-resource-outlet.presentation.configure-empty-state',
45224
+ params: {
45225
+ childResourcePath: 'operations/participants',
45226
+ childParentField: 'missionId',
45227
+ tableConfig: { columns: [] },
45228
+ },
45229
+ isPositive: false,
45230
+ },
45231
+ ],
45232
+ };
45233
+
43566
45234
  class EmptyStateCardComponent {
43567
45235
  icon = 'tab';
43568
45236
  title = 'Sem configuração disponível';
@@ -43771,7 +45439,7 @@ class ResourceQuickConnectComponent {
43771
45439
  </small>
43772
45440
  }
43773
45441
  </div>
43774
- `, isInline: true, styles: [".pdx-quick-connect{display:grid;gap:12px;padding:12px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface)}.pdx-quick-connect__hint{color:var(--md-sys-color-on-surface-variant);font-size:.9rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
45442
+ `, isInline: true, styles: [".pdx-quick-connect{display:grid;gap:12px;padding:12px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface)}.pdx-quick-connect__hint{color:var(--md-sys-color-on-surface-variant);font-size:.9rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
43775
45443
  }
43776
45444
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ResourceQuickConnectComponent, decorators: [{
43777
45445
  type: Component,
@@ -43802,349 +45470,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
43802
45470
  type: Input
43803
45471
  }] } });
43804
45472
 
43805
- const DEFAULT_ICONS = [
43806
- 'search', 'close', 'check', 'add', 'remove', 'delete', 'edit', 'save', 'cancel', 'warning', 'error', 'info', 'help',
43807
- 'face', 'person', 'account_circle', 'people', 'group', 'settings', 'home', 'menu', 'more_horiz', 'more_vert', 'refresh', 'arrow_back', 'arrow_forward', 'expand_more', 'expand_less', 'open_in_full', 'fullscreen', 'open_in_new',
43808
- 'star', 'star_half', 'star_border', 'favorite', 'favorite_border', 'thumb_up', 'thumb_down', 'share', 'send', 'ios_share', 'download', 'upload', 'file_upload', 'file_download',
43809
- 'shopping_cart', 'shopping_bag', 'store', 'storefront', 'local_mall', 'local_offer', 'attach_money', 'money', 'payments', 'price_change', 'receipt', 'receipt_long', 'request_quote', 'point_of_sale', 'credit_card', 'payment',
43810
- 'event', 'date_range', 'schedule', 'alarm', 'watch_later', 'pending_actions',
43811
- 'location_on', 'location_city', 'map', 'public', 'language', 'place', 'pin_drop', 'route', 'near_me', 'navigation', 'layers', 'terrain',
43812
- 'email', 'call', 'phone', 'chat', 'forum', 'mark_email_unread', 'mark_chat_unread',
43813
- 'wifi', 'bluetooth', 'cloud', 'cloud_upload', 'cloud_download', 'cloud_done', 'cloud_queue', 'cloud_sync', 'backup', 'bolt', 'lock', 'lock_open', 'visibility', 'visibility_off', 'vpn_key', 'key', 'fingerprint', 'shield', 'security', 'admin_panel_settings', 'privacy_tip', 'policy', 'verified',
43814
- 'label', 'bookmark', 'book', 'description', 'article', 'note', 'assignment', 'assignment_turned_in', 'assignment_ind', 'grading', 'subject',
43815
- 'home_max', 'home_work', 'dashboard', 'analytics', 'assessment', 'insert_chart', 'bar_chart', 'show_chart', 'timeline', 'insights', 'pie_chart', 'donut_large', 'donut_small',
43816
- 'inventory', 'inventory_2', 'list', 'reorder', 'filter_list', 'sort', 'tune', 'settings_applications', 'build', 'build_circle', 'construction', 'bug_report', 'code', 'terminal', 'data_object', 'dataset', 'storage',
43817
- 'rule', 'rule_folder', 'folder', 'folder_open', 'create_new_folder', 'drive_file_move', 'drive_file_rename_outline',
43818
- 'text_fields', 'title', 'format_bold', 'format_italic', 'format_underlined', 'format_list_bulleted', 'format_list_numbered', 'insert_link', 'link', 'attach_file', 'attachment',
43819
- 'image', 'photo', 'photo_camera', 'collections', 'slideshow', 'movie', 'videocam', 'play_arrow', 'pause', 'stop', 'fast_forward', 'fast_rewind', 'skip_next', 'skip_previous', 'volume_up', 'volume_off', 'equalizer', 'music_note', 'library_music',
43820
- 'notifications', 'notifications_active', 'notifications_off', 'do_not_disturb',
43821
- 'airplanemode_active', 'train', 'directions_car', 'directions_bus', 'directions_bike', 'directions_walk', 'directions_boat', 'local_taxi',
43822
- ];
43823
- class PraxisIconPickerComponent {
43824
- data;
43825
- dialogRef;
43826
- value;
43827
- icons = DEFAULT_ICONS;
43828
- selected = new EventEmitter();
43829
- cancel = new EventEmitter();
43830
- searchInput;
43831
- query = '';
43832
- filtered = [];
43833
- selectedFamily = 'mi';
43834
- constructor(data, dialogRef) {
43835
- this.data = data;
43836
- this.dialogRef = dialogRef;
43837
- if (data) {
43838
- this.value = data.value;
43839
- if (Array.isArray(data.icons) && data.icons.length)
43840
- this.icons = data.icons;
43841
- const fam = this.familyFromValue(this.value);
43842
- if (fam) {
43843
- this.selectedFamily = fam.family;
43844
- this.value = fam.name;
43845
- }
43846
- }
43847
- this.query = (this.value || '').trim();
43848
- this.onFilter();
43849
- }
43850
- onFilter() {
43851
- const q = (this.query || '').trim().toLowerCase();
43852
- this.filtered = !q ? [...this.icons] : this.icons.filter(i => i.toLowerCase().includes(q));
43853
- }
43854
- choose(icon) {
43855
- const val = this.buildValue(icon);
43856
- this.value = icon;
43857
- if (this.dialogRef)
43858
- this.dialogRef.close(val);
43859
- else
43860
- this.selected.emit(val);
43861
- }
43862
- onEsc(ev) {
43863
- if (this.dialogRef) {
43864
- ev.stopPropagation();
43865
- ev.preventDefault();
43866
- this.onCancel();
43867
- }
43868
- }
43869
- onGlobalKey(ev) {
43870
- if (ev.key !== '/')
43871
- return;
43872
- const target = ev.target;
43873
- const tag = (target?.tagName || '').toLowerCase();
43874
- if (tag === 'input' || tag === 'textarea' || target?.isContentEditable) {
43875
- return;
43876
- }
43877
- ev.preventDefault();
43878
- this.focusSearch();
43879
- }
43880
- confirmTyped() {
43881
- const name = (this.query || '').trim();
43882
- if (!name)
43883
- return;
43884
- const val = this.buildValue(name);
43885
- if (this.dialogRef)
43886
- this.dialogRef.close(val);
43887
- else
43888
- this.selected.emit(val);
43889
- }
43890
- isSelectedIcon(icon) {
43891
- return (this.value || '').trim() === icon;
43892
- }
43893
- onFamilyChange(val) {
43894
- const v = (typeof val === 'string' && val) ? val : 'mi';
43895
- this.selectedFamily = v;
43896
- }
43897
- clear() {
43898
- this.value = '';
43899
- if (this.dialogRef)
43900
- this.dialogRef.close('');
43901
- else
43902
- this.selected.emit('');
43903
- }
43904
- onCancel() {
43905
- if (this.dialogRef)
43906
- this.dialogRef.close(undefined);
43907
- else
43908
- this.cancel.emit();
43909
- }
43910
- // Helpers for family/prefix handling
43911
- buildValue(name) {
43912
- const n = (name || '').trim();
43913
- if (!n)
43914
- return n;
43915
- const fam = this.selectedFamily === 'ms' ? 'mso' : this.selectedFamily;
43916
- return fam === 'mi' ? n : `${fam}:${n}`;
43917
- }
43918
- previewValue() {
43919
- return this.buildValue((this.query || '').trim());
43920
- }
43921
- iconClassForFamily(fam) {
43922
- if (fam === 'ms' || fam === 'mso')
43923
- return 'material-symbols-outlined';
43924
- if (fam === 'msr')
43925
- return 'material-symbols-rounded';
43926
- if (fam === 'mss')
43927
- return 'material-symbols-sharp';
43928
- return 'material-icons';
43929
- }
43930
- focusSearch() {
43931
- this.searchInput?.nativeElement?.focus();
43932
- }
43933
- familyFromValue(v) {
43934
- const s = (v || '').trim();
43935
- const i = s.indexOf(':');
43936
- if (i <= 0)
43937
- return null;
43938
- const p = s.slice(0, i).toLowerCase();
43939
- const name = s.slice(i + 1).trim();
43940
- if (p === 'ms' || p === 'mso')
43941
- return { family: 'mso', name };
43942
- if (p === 'msr')
43943
- return { family: 'msr', name };
43944
- if (p === 'mss')
43945
- return { family: 'mss', name };
43946
- return { family: 'mi', name };
43947
- }
43948
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, deps: [{ token: MAT_DIALOG_DATA, optional: true }, { token: i1$4.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
43949
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisIconPickerComponent, isStandalone: true, selector: "praxis-icon-picker", inputs: { value: "value", icons: "icons" }, outputs: { selected: "selected", cancel: "cancel" }, host: { listeners: { "document:keydown.escape": "onEsc($event)", "document:keydown": "onGlobalKey($event)" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: `
43950
- <div class="pip-root">
43951
- <div class="pip-head">
43952
- <mat-form-field appearance="outline" class="pip-search">
43953
- <mat-label>Buscar ícone</mat-label>
43954
- <input
43955
- #searchInput
43956
- matInput
43957
- [(ngModel)]="query"
43958
- placeholder="ex.: star, schedule"
43959
- (ngModelChange)="onFilter()"
43960
- (keydown.enter)="confirmTyped()"
43961
- />
43962
- </mat-form-field>
43963
- <button mat-stroked-button color="primary" (click)="clear()">
43964
- <mat-icon>backspace</mat-icon>
43965
- <span>Limpar</span>
43966
- </button>
43967
- <a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
43968
- <mat-icon>open_in_new</mat-icon>
43969
- <span>Material Icons</span>
43970
- </a>
43971
- <span class="pip-spacer"></span>
43972
- <div class="pip-family" role="group" aria-label="Estilo do ícone">
43973
- <mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
43974
- <mat-chip-option value="mi">Icons</mat-chip-option>
43975
- <mat-chip-option value="mso">Outlined</mat-chip-option>
43976
- <mat-chip-option value="msr">Rounded</mat-chip-option>
43977
- <mat-chip-option value="mss">Sharp</mat-chip-option>
43978
- </mat-chip-listbox>
43979
- </div>
43980
- @if (dialogRef) {
43981
- <button mat-stroked-button (click)="onCancel()">Cancelar</button>
43982
- }
43983
- </div>
43984
- <div class="pip-hint muted">
43985
- Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
43986
- </div>
43987
- <div class="pip-stats">
43988
- <span>{{ filtered.length }} resultado(s)</span>
43989
- <span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
43990
- </div>
43991
- <div class="pip-body" role="grid" aria-label="Ícones disponíveis">
43992
- @for (ic of filtered; track ic) {
43993
- <button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
43994
- <mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
43995
- <span class="pip-name">{{ ic }}</span>
43996
- </button>
43997
- }
43998
- </div>
43999
- @if (!filtered.length) {
44000
- <div class="pip-empty">
44001
- Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
44002
- </div>
44003
- }
44004
- <div class="pip-footer">
44005
- <button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
44006
- <mat-icon>check</mat-icon>
44007
- Usar nome digitado
44008
- </button>
44009
- @if (query.trim()) {
44010
- <span class="pip-typed">{{ previewValue() }}</span>
44011
- }
44012
- </div>
44013
- </div>
44014
- `, isInline: true, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: "ngmodule", type: MatChipsModule }, { kind: "component", type: i8$1.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i8$1.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
44015
- }
44016
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisIconPickerComponent, decorators: [{
44017
- type: Component,
44018
- args: [{ selector: 'praxis-icon-picker', standalone: true, imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, MatChipsModule, MatDialogModule, MatTooltipModule], template: `
44019
- <div class="pip-root">
44020
- <div class="pip-head">
44021
- <mat-form-field appearance="outline" class="pip-search">
44022
- <mat-label>Buscar ícone</mat-label>
44023
- <input
44024
- #searchInput
44025
- matInput
44026
- [(ngModel)]="query"
44027
- placeholder="ex.: star, schedule"
44028
- (ngModelChange)="onFilter()"
44029
- (keydown.enter)="confirmTyped()"
44030
- />
44031
- </mat-form-field>
44032
- <button mat-stroked-button color="primary" (click)="clear()">
44033
- <mat-icon>backspace</mat-icon>
44034
- <span>Limpar</span>
44035
- </button>
44036
- <a mat-stroked-button href="https://fonts.google.com/icons" target="_blank" rel="noopener noreferrer" matTooltip="Abrir Material Icons">
44037
- <mat-icon>open_in_new</mat-icon>
44038
- <span>Material Icons</span>
44039
- </a>
44040
- <span class="pip-spacer"></span>
44041
- <div class="pip-family" role="group" aria-label="Estilo do ícone">
44042
- <mat-chip-listbox [value]="selectedFamily" (change)="onFamilyChange($event.value)">
44043
- <mat-chip-option value="mi">Icons</mat-chip-option>
44044
- <mat-chip-option value="mso">Outlined</mat-chip-option>
44045
- <mat-chip-option value="msr">Rounded</mat-chip-option>
44046
- <mat-chip-option value="mss">Sharp</mat-chip-option>
44047
- </mat-chip-listbox>
44048
- </div>
44049
- @if (dialogRef) {
44050
- <button mat-stroked-button (click)="onCancel()">Cancelar</button>
44051
- }
44052
- </div>
44053
- <div class="pip-hint muted">
44054
- Dica: Se não encontrar aqui, abra o site oficial, copie o nome do ícone e cole na busca. Você pode confirmar o nome digitado mesmo que não esteja na lista.
44055
- </div>
44056
- <div class="pip-stats">
44057
- <span>{{ filtered.length }} resultado(s)</span>
44058
- <span class="pip-shortcut">Atalho: pressione / para focar a busca</span>
44059
- </div>
44060
- <div class="pip-body" role="grid" aria-label="Ícones disponíveis">
44061
- @for (ic of filtered; track ic) {
44062
- <button class="pip-item" (click)="choose(ic)" [class.selected]="isSelectedIcon(ic)" [attr.aria-label]="'Selecionar ícone ' + ic">
44063
- <mat-icon [ngClass]="iconClassForFamily(selectedFamily)">{{ ic }}</mat-icon>
44064
- <span class="pip-name">{{ ic }}</span>
44065
- </button>
44066
- }
44067
- </div>
44068
- @if (!filtered.length) {
44069
- <div class="pip-empty">
44070
- Nenhum ícone encontrado. Você pode usar o nome digitado mesmo assim.
44071
- </div>
44072
- }
44073
- <div class="pip-footer">
44074
- <button mat-flat-button color="primary" (click)="confirmTyped()" [disabled]="!query.trim()" aria-label="Usar nome digitado">
44075
- <mat-icon>check</mat-icon>
44076
- Usar nome digitado
44077
- </button>
44078
- @if (query.trim()) {
44079
- <span class="pip-typed">{{ previewValue() }}</span>
44080
- }
44081
- </div>
44082
- </div>
44083
- `, styles: [".pip-root{display:flex;flex-direction:column;min-width:340px;max-width:760px;max-height:80vh;overflow:hidden;padding:16px;color:var(--md-sys-color-on-surface)}.pip-head{display:flex;gap:12px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.pip-search{flex:1;min-width:180px}.pip-spacer{flex:1}.pip-body{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;padding:4px}.pip-item{display:flex;gap:10px;align-items:center;justify-content:flex-start;padding:10px;border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;background:var(--md-sys-color-surface);color:inherit;cursor:pointer;transition:background-color .18s ease,border-color .18s ease,box-shadow .18s ease}.pip-item:hover{background:var(--md-sys-color-surface-container)}.pip-item:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pip-item.selected{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px var(--md-sys-color-primary)}.pip-name{font-size:12px;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pip-hint{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin:-6px 0 8px}.pip-stats{display:flex;justify-content:space-between;gap:8px;font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:8px}.pip-shortcut{opacity:.9}.pip-empty{padding:12px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:10px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);margin-top:8px}.pip-footer{display:flex;gap:12px;align-items:center;margin-top:10px}.pip-typed{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface)}.pip-family{display:flex;align-items:center}.pip-family .mat-mdc-chip-listbox{min-width:260px}.pip-root .mat-icon{font-family:Material Icons,Material Symbols Outlined,Material Symbols Rounded,Material Symbols Sharp!important;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:currentColor}.material-symbols-outlined{font-family:Material Symbols Outlined;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-rounded{font-family:Material Symbols Rounded;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}.material-symbols-sharp{font-family:Material Symbols Sharp;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:\"liga\";-webkit-font-smoothing:antialiased;font-variation-settings:\"FILL\" 0,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24}\n"] }]
44084
- }], ctorParameters: () => [{ type: undefined, decorators: [{
44085
- type: Optional
44086
- }, {
44087
- type: Inject,
44088
- args: [MAT_DIALOG_DATA]
44089
- }] }, { type: i1$4.MatDialogRef, decorators: [{
44090
- type: Optional
44091
- }] }], propDecorators: { value: [{
44092
- type: Input
44093
- }], icons: [{
44094
- type: Input
44095
- }], selected: [{
44096
- type: Output
44097
- }], cancel: [{
44098
- type: Output
44099
- }], searchInput: [{
44100
- type: ViewChild,
44101
- args: ['searchInput']
44102
- }], onEsc: [{
44103
- type: HostListener,
44104
- args: ['document:keydown.escape', ['$event']]
44105
- }], onGlobalKey: [{
44106
- type: HostListener,
44107
- args: ['document:keydown', ['$event']]
44108
- }] } });
44109
-
44110
- class IconPickerService {
44111
- dialog = inject(MatDialog);
44112
- settings = inject(SETTINGS_PANEL_BRIDGE, { optional: true });
44113
- openDialog(opts) {
44114
- const ref = this.dialog.open(PraxisIconPickerComponent, {
44115
- width: '720px',
44116
- data: { value: opts?.value, icons: opts?.icons },
44117
- });
44118
- return ref.afterClosed().toPromise();
44119
- }
44120
- async openPanel(opts) {
44121
- const id = opts?.id || 'icon-picker';
44122
- const title = opts?.title || 'Escolher ícone';
44123
- if (!this.settings) {
44124
- // Fallback to dialog-only mode when bridge is not available
44125
- return this.openDialog({ value: opts?.value, icons: opts?.icons });
44126
- }
44127
- const ref = this.settings.open({ id: `praxis-icon-picker:${id}`, title, content: { component: PraxisIconPickerComponent, inputs: { value: opts?.value, icons: opts?.icons } } });
44128
- return new Promise((resolve) => {
44129
- let resolved = false;
44130
- ref.applied$.subscribe((val) => { if (!resolved) {
44131
- resolved = true;
44132
- resolve(val);
44133
- } });
44134
- ref.saved$.subscribe((val) => { if (!resolved) {
44135
- resolved = true;
44136
- resolve(val);
44137
- } });
44138
- });
44139
- }
44140
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
44141
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, providedIn: 'root' });
44142
- }
44143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: IconPickerService, decorators: [{
44144
- type: Injectable,
44145
- args: [{ providedIn: 'root' }]
44146
- }] });
44147
-
44148
45473
  /** Optional DI token used by SchemaViewer when input is not provided. */
44149
45474
  const SCHEMA_VIEWER_CONTEXT = new InjectionToken('SCHEMA_VIEWER_CONTEXT');
44150
45475
 
@@ -45059,4 +46384,4 @@ function provideHookWhitelist(allowed) {
45059
46384
  * Generated bundle index. Do not edit.
45060
46385
  */
45061
46386
 
45062
- export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };
46387
+ export { API_CONFIG_STORAGE_OPTIONS, API_URL, ASYNC_CONFIG_STORAGE, AllowedFileTypes, AnalyticsPresentationResolver, AnalyticsSchemaContractService, AnalyticsStatsRequestBuilderService, ApiConfigStorage, ApiEndpoint, BUILTIN_PAGE_LAYOUT_PRESETS, BUILTIN_PAGE_THEME_PRESETS, BUILTIN_SHELL_PRESETS, COMPONENT_METADATA_REGISTRY_I18N_CONFIG, COMPONENT_METADATA_REGISTRY_I18N_NAMESPACE, CONFIG_STORAGE, CONNECTION_STORAGE, ComponentAuthoringManifestProjectionError, ComponentKeyService, ComponentMetadataRegistry, ComponentRuntimeProfileService, CompositionRuntimeFacade, CompositionValidatorService, ConsoleLoggerSink, CrudOperationResolutionService, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, DEFAULT_JSON_LOGIC_OPERATORS, DEFAULT_TABLE_CONFIG, DOMAIN_CATALOG_COMPONENT_CONTEXT_PACK, DOMAIN_CATALOG_CONTEXT_HINT_SCHEMA_VERSION, DYNAMIC_PAGE_AI_CAPABILITIES, DYNAMIC_PAGE_COMPONENT_CONTEXT_PACK, DYNAMIC_PAGE_CONFIG_EDITOR, DYNAMIC_PAGE_SHELL_EDITOR, DefaultLoadingRenderer, DeferredAsyncConfigStorage, DomainCatalogService, DomainKnowledgeService, DomainRuleService, DynamicFormService, DynamicWidgetLoaderDirective, DynamicWidgetPageComponent, EDITORIAL_ALLOWED_CONTENT_FORMATS, EDITORIAL_COMPLIANCE_PRESETS, EDITORIAL_EXTERNAL_LINK_REL, EDITORIAL_FORM_TEMPLATE_CATALOG, EDITORIAL_HTML_ENABLED, EDITORIAL_MARKDOWN_IMAGES_ENABLED, EDITORIAL_SOLUTION_CATALOG, EDITORIAL_SOLUTION_PRESETS, EDITORIAL_THEME_PRESETS, EDITORIAL_WIDGET_CONVENTION_INPUTS, EDITORIAL_WIDGET_TAG, EMPLOYEE_ONBOARDING_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_EDITORIAL_TEMPLATE, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_SOLUTION, EMPLOYEE_ONBOARDING_GUIDED_EDITORIAL_TEMPLATE, EVENT_REGISTRATION_EDITORIAL_SOLUTION, EVENT_REGISTRATION_EDITORIAL_TEMPLATE, EmptyStateCardComponent, EnterpriseRuntimeContextService, ErrorMessageService, FIELD_METADATA_CAPABILITIES, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, FIELD_SELECTOR_REGISTRY_OVERRIDES, FORM_HOOKS, FORM_HOOKS_PRESETS, FORM_HOOKS_WHITELIST, FORM_HOOK_RESOLVERS, FieldControlType, FieldDataType, FieldSelectorRegistry, FormHooksRegistry, GLOBAL_ACTION_CATALOG, GLOBAL_ACTION_HANDLERS, GLOBAL_ACTION_UI_SCHEMAS, GLOBAL_ANALYTICS_SERVICE, GLOBAL_API_CLIENT, GLOBAL_CONFIG, GLOBAL_DIALOG_SERVICE, GLOBAL_ROUTE_GUARD_RESOLVER, GLOBAL_SURFACE_SERVICE, GLOBAL_TOAST_SERVICE, GenericCrudService, GlobalActionService, GlobalConfigService, INLINE_FILTER_ALIAS_TOKENS, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_SET, INLINE_FILTER_CONTROL_TYPE_VALUES, INLINE_FILTER_TOKEN_TO_BASE_CONTROL_TYPE, INLINE_FILTER_TOKEN_TO_CONTROL_TYPE, IconPickerService, IconPosition, IconSize, LOGGER_LEVEL_BY_ENV, LOGGER_LEVEL_PRIORITY, LoadingOrchestrator, LocalConnectionStorage, LocalStorageAsyncAdapter, LocalStorageCacheAdapter, LocalStorageConfigService, LoggerService, LoggerThrottleTracker, LoggerWarnOnceTracker, MemoryCacheAdapter, NestedPortCatalogService, NestedWidgetConfigAccessor, NumericFormat, OVERLAY_DECIDER_DEBUG, OVERLAY_DECISION_MATRIX, ObservabilityDashboardService, OverlayDeciderService, PRAXIS_ACTION_CONTROL_DEFAULTS, PRAXIS_ACTION_CONTROL_VARS, PRAXIS_COLLECTION_EXPORT_HTTP_OPTIONS, PRAXIS_COLLECTION_EXPORT_PROVIDER, PRAXIS_COLLECTION_SEARCH_DEFAULTS, PRAXIS_COLLECTION_SEARCH_VARS, PRAXIS_CORPORATE_SENSITIVE_KEYS, PRAXIS_DEFAULT_EXPORT_SECURITY_POLICY, PRAXIS_DEFAULT_OBSERVABILITY_ALERT_RULES, PRAXIS_DYNAMIC_PAGE_COMPONENT_METADATA, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_OPTIONS, PRAXIS_ENTERPRISE_RUNTIME_CONTEXT_READY, PRAXIS_EXPORT_FORMULA_PREFIXES, PRAXIS_EXPORT_SECURITY_POLICY, PRAXIS_FOOTER_LINKS_METADATA, PRAXIS_GLOBAL_ACTION_CATALOG, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_OPTIONS, PRAXIS_GLOBAL_CONFIG_BOOTSTRAP_READY, PRAXIS_GLOBAL_CONFIG_TENANT_RESOLVER, PRAXIS_HERO_BANNER_METADATA, PRAXIS_I18N_CONFIG, PRAXIS_I18N_TRANSLATOR, PRAXIS_JSON_LOGIC_OPERATORS, PRAXIS_LAYER_SCALE_DEFAULTS, PRAXIS_LAYER_SCALE_VARS, PRAXIS_LEGAL_NOTICE_METADATA, PRAXIS_LOADING_CTX, PRAXIS_LOADING_RENDERER, PRAXIS_LOGGER_CONFIG, PRAXIS_LOGGER_SINKS, PRAXIS_OBSERVABILITY_DASHBOARD_OPTIONS, PRAXIS_QUERY_FILTER_EXPRESSION_SCHEMA_VERSION, PRAXIS_RELATED_RESOURCE_OUTLET_AUTHORING_MANIFEST, PRAXIS_RELATED_RESOURCE_OUTLET_COMPONENT_METADATA, PRAXIS_RELATED_RESOURCE_OUTLET_PORTS, PRAXIS_RICH_TEXT_BLOCK_METADATA, PRAXIS_TABLE_DETAIL_INLINE_NODE_RESOLVERS, PRAXIS_TABLE_DETAIL_INLINE_RENDERERS, PRAXIS_TABLE_DETAIL_RESOURCE_RESOLVER, PRAXIS_TELEMETRY_TRANSPORT, PRAXIS_THEME_SURFACE_DEFAULTS, PRAXIS_THEME_SURFACE_VARS, PRAXIS_USER_CONTEXT_SUMMARY_METADATA, PRIVACY_CONSENT_EDITORIAL_SOLUTION, PRIVACY_CONSENT_EDITORIAL_TEMPLATE, PraxisCollectionExportService, PraxisCore, PraxisFooterLinksComponent, PraxisGlobalErrorHandler, PraxisHeroBannerComponent, PraxisHttpCollectionExportProvider, PraxisI18nService, PraxisIconButtonComponent, PraxisIconDirective, PraxisIconPickerComponent, PraxisJsonLogicError, PraxisJsonLogicService, PraxisLayerScaleStyleService, PraxisLegalNoticeComponent, PraxisLoadingInterceptor, PraxisRelatedResourceOutletComponent, PraxisRelatedResourceOutletConfigEditorComponent, PraxisResourceIdentityComponent, PraxisRichTextBlockComponent, PraxisRuntimeComponentObservationRegistryService, PraxisSurfaceHostComponent, PraxisUserContextSummaryComponent, RESOURCE_DISCOVERY_I18N_CONFIG, RESOURCE_DISCOVERY_I18N_NAMESPACE, RULE_PROPERTY_SCHEMA, RelatedResourceSurfaceResolverService, RemoteConfigStorage, ResourceActionOpenAdapterService, ResourceDiscoveryService, ResourceQuickConnectComponent, ResourceRecordOpenError, ResourceRecordOpenService, ResourceSurfaceOpenAdapterService, SCHEMA_VIEWER_CONTEXT, SETTINGS_PANEL_BRIDGE, SETTINGS_PANEL_DATA, STEPPER_CONFIG_EDITOR, SURFACE_DRAWER_BRIDGE, SURFACE_DRAWER_CONTENT_DATA, SURFACE_DRAWER_REF, SURFACE_NAVIGATION_I18N_CONFIG, SURFACE_NAVIGATION_I18N_NAMESPACE, SURFACE_OPEN_I18N_CONFIG, SURFACE_OPEN_I18N_NAMESPACE, SURFACE_OPEN_PRESETS, SchemaMetadataClient, SchemaNormalizerService, SchemaViewerComponent, SurfaceBindingRuntimeService, SurfaceNavigationError, SurfaceOpenActionEditorComponent, SurfaceOpenMaterializerService, SurfaceOutletRegistryService, TABLE_CONFIG_EDITOR, TableConfigService, TelemetryLoggerSink, TelemetryService, ValidationPattern, WidgetPageStateRuntimeService, WidgetShellComponent, applyLocalCustomizations$2 as applyLocalCustomizations, applyLocalCustomizations$1 as applyLocalFormCustomizations, assertPraxisCollectionExportArtifact, assertPraxisRuntimeComponentObservationSerializable, buildAngularValidators, buildApiUrl, buildBaseColumnFromDef, buildBaseFormField, buildFormConfigFromEditorialTemplate, buildHeaders, buildPageKey, buildPraxisActionControlCss, buildPraxisCollectionSearchCss, buildPraxisEffectDistinctKey, buildPraxisLayerScaleCss, buildPraxisThemeSurfaceCss, buildSchemaId, buildSchemaIdStorageKeySegment, buildValidatorsFromValidatorOptions, cancelIfCpfInvalidHook, clampRange, classifyEntityLookupResult, clonePraxisRuntimeComponentObservation, cloneTableConfig, cnpjAlphaValidator, collapseWhitespace, composeHeadersWithVersion, conditionalAsyncValidator, convertFormLayoutToConfig, createCorporateLoggerConfig, createCorporateObservabilityOptions, createCpfCnpjValidator, createDefaultFormConfig, createDefaultTableConfig, createEmptyFormConfig, createEmptyRichContentDocument, createFieldLayoutItem, createPersistedPage, customAsyncValidatorFn, customValidatorFn, debounceAsyncValidator, deepMerge, domainKnowledgeTimelineToRichContentDocument, domainRuleTimelineToRichContentDocument, ensureIds, ensureNoConflictsHookFactory, ensurePageIds, escapePraxisExportCell, evaluateFieldAccess, extractNormalizedError, fetchWithETag, fileTypeValidator, fillUndefined, generateId, getDefaultFormHints, getEditorialCompliancePresetById, getEditorialFormTemplateById, getEditorialFormTemplateCatalog, getEditorialSolutionById, getEditorialSolutionCatalog, getEditorialSolutionPresetById, getEditorialThemePresetById, getEssentialConfig, getFieldMetadataCapabilities, getFormColumnFieldNames, getFormLayoutFieldNames, getGlobalActionCatalog, getGlobalActionPayloadActualType, getGlobalActionPayloadTypeIssue, getGlobalActionUiSchema, getMissingGlobalActionPayloadKeys, getPraxisTableCellVisualizationConstraint, getPraxisTableCellVisualizationGuidance, getReferencedFieldMetadata, getRequiredGlobalActionPayloadKeys, getTextTransformer, hasMeaningfulGlobalActionPayloadValue, hasPraxisCollectionExportArtifact, interpolatePraxisTranslation, isAllowedEditorialContentFormat, isAllowedEditorialHref, isCssTextTransform, isDomainRuleSnapshotProblemResponse, isEditorialComponentMeta, isEntityLookupMultiplePayloadMode, isEntityLookupPayloadMode, isEntityLookupPayloadModeCompatible, isEntityLookupResultSelectable, isEntityLookupSinglePayloadMode, isFormLayoutItem, isGlobalActionRef, isInlineFilterControlType, isLookupDialogSize, isLookupFilterFieldType, isLookupFilterOperator, isPraxisI18nMessageDescriptor, isPraxisPresentationVisualizationTableSafe, isPraxisRuntimeGlobalActionEffect, isProgrammaticDateRangePreset, isRangeValidForFilter, isRequiredGlobalActionParamPayloadMissing, isRequiredGlobalActionPayloadMissing, isStaticDateRangePreset, isSurfaceNavigationError, isTableConfigV2, isValidFormConfig, isValidTableConfig, legacyCnpjValidator, legacyCpfValidator, logOnErrorHook, mapFieldDefinitionToMetadata, mapFieldDefinitionsToMetadata, matchFieldValidator, materializeFormLayoutFromMetadata, materializeResourceIdentity, maxFileSizeValidator, mergeFieldMetadata, mergePraxisI18nConfigs, mergeTableConfigs, migrateFormLayoutRule, migrateLegacyCompositionLink, migrateLegacyCompositionLinks, minWordsValidator, normalizeControlTypeKey, normalizeControlTypeToken, normalizeEditorialLink, normalizeEnd, normalizeFieldAccessMetadata, normalizeFieldConstraints, normalizeFieldPresentation, normalizeFormConfig, normalizeFormLayoutItems, normalizeFormMetadata, normalizeGlobalActionRef$1 as normalizeGlobalActionRef, normalizeLayoutPolicy, normalizeLookupFilterRequest, normalizePath, normalizePraxisDataQueryContext, normalizePraxisEffectPolicy, normalizePraxisPresentationVisualization, normalizePraxisQueryFilterExpression, normalizePraxisQueryFilterNode, normalizeReactiveDeterminations, normalizeResourceAvailabilityReasonCode, normalizeResourceIdentityContract, normalizeStart, normalizeSurfaceOperationContext, normalizeUnknownError, normalizeWidgetEventPath, notifySuccessHook, parseJsonResponseOrEmpty, praxisLoadingInterceptorFn, prefillFromContextHook, projectComponentAuthoringManifest, projectGroupedCommandPartialRows, provideDefaultFormHooks, provideFieldSelectorRegistryBase, provideFieldSelectorRegistryOverride, provideFieldSelectorRegistryRuntime, provideFormHookPresets, provideFormHooks, provideGlobalActionCatalog, provideGlobalActionHandler, provideGlobalConfig, provideGlobalConfigReady, provideGlobalConfigSeed, provideGlobalConfigTenant, provideHookResolvers, provideHookWhitelist, provideOverlayDecisionMatrix, providePraxisAnalyticsGlobalActions, providePraxisCollectionExportProvider, providePraxisDynamicPageMetadata, providePraxisEnterpriseRuntimeContext, providePraxisFooterLinksMetadata, providePraxisGlobalActionCatalog, providePraxisGlobalActions, providePraxisGlobalConfigBootstrap, providePraxisHeroBannerMetadata, providePraxisHttpCollectionExportProvider, providePraxisHttpLoading, providePraxisI18n, providePraxisI18nConfig, providePraxisI18nTranslator, providePraxisIconDefaults, providePraxisJsonLogicOperator, providePraxisJsonLogicOperatorOverride, providePraxisLegalNoticeMetadata, providePraxisLoadingDefaults, providePraxisLogging, providePraxisRelatedResourceOutletMetadata, providePraxisRichTextBlockMetadata, providePraxisToastGlobalActions, providePraxisUserContextSummaryMetadata, provideRemoteGlobalConfig, readPraxisExportValue, reconcileFilterConfig, reconcileFormConfig, reconcileTableConfig, registerPraxisRuntimeComponentObservation, removeDiacritics, renderPraxisPresentationVisualizationHtml, reportTelemetryHookFactory, requiredCheckedValidator, requiredPresenceValidator, resolveBuiltinPresets, resolveColumnTypeFromFieldDefinition, resolveControlTypeAlias, resolveDateRangeShortcutPreset, resolveDateRangeShortcutPresets, resolveDefaultValuePresentationFormat, resolveEntityLookupPayloadMode, resolveFieldPresentation, resolveGroupedCommandPartialRowSpans, resolveHidden, resolveInlineFilterControlType, resolveInlineFilterControlTypeToBaseControlType, resolveLoggerConfig, resolveObservabilityOptions, resolveOffset, resolveOrder, resolvePraxisCollectionExportItems, resolvePraxisExportFields, resolvePraxisExportScope, resolvePraxisFilterCriteria, resolvePraxisI18nDocument, resolveResourceAvailabilityReasonKey, resolveResourceIdentityContract, resolveSpan, resolveTextMaskFormat, resolveTextMaskFormatFromFieldDefinition, resolveValuePresentation, resolveValuePresentationLocale, serializeEntityLookupValueForPayload, serializeOptionSourceFilterRequest, serializePraxisCollectionToCsv, serializePraxisCollectionToExcel, serializePraxisCollectionToJson, slugify, staticDateRangePresetToPreset, stripMasksHook, supportsImplicitValuePresentation, syncWithServerMetadata, toCamel, toCapitalize, toKebab, toPascal, toSentenceCase, toSnake, toTitleCase, translateResourceAvailabilityReason, translateResourceDiscoveryText, translateSurfaceNavigationRejected, translateUnavailableWorkflowMessage, trim, uniqueAsyncValidator, urlValidator, validateGlobalActionRef, validateGlobalActionRefs, withFormConfigSections, withMessage, withPraxisHttpLoading };