@praxisui/metadata-editor 1.0.0-beta.41 → 1.0.0-beta.43

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.
@@ -51,10 +51,10 @@ class ConfigRegistryService {
51
51
  count: props.length,
52
52
  }));
53
53
  }
54
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ConfigRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ConfigRegistryService, providedIn: 'root' });
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ConfigRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
55
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ConfigRegistryService, providedIn: 'root' });
56
56
  }
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ConfigRegistryService, decorators: [{
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ConfigRegistryService, decorators: [{
58
58
  type: Injectable,
59
59
  args: [{ providedIn: 'root' }]
60
60
  }] });
@@ -69,10 +69,10 @@ class ContextValidatorRegistryService {
69
69
  get(controlType) {
70
70
  return this.map.get(controlType) ?? [];
71
71
  }
72
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ContextValidatorRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
73
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ContextValidatorRegistryService, providedIn: 'root' });
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ContextValidatorRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
73
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ContextValidatorRegistryService, providedIn: 'root' });
74
74
  }
75
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: ContextValidatorRegistryService, decorators: [{
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ContextValidatorRegistryService, decorators: [{
76
76
  type: Injectable,
77
77
  args: [{ providedIn: 'root' }]
78
78
  }] });
@@ -182,10 +182,10 @@ class SchemaNormalizerService {
182
182
  getByPath(obj, path) {
183
183
  return path.split('.').reduce((acc, key) => (acc == null ? acc : acc[key]), obj);
184
184
  }
185
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SchemaNormalizerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
186
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SchemaNormalizerService, providedIn: 'root' });
185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: SchemaNormalizerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
186
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: SchemaNormalizerService, providedIn: 'root' });
187
187
  }
188
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: SchemaNormalizerService, decorators: [{
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: SchemaNormalizerService, decorators: [{
189
189
  type: Injectable,
190
190
  args: [{ providedIn: 'root' }]
191
191
  }] });
@@ -276,10 +276,10 @@ class DynamicFormFactoryService {
276
276
  }
277
277
  return result;
278
278
  }
279
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: DynamicFormFactoryService, deps: [{ token: i3.FormBuilder }, { token: ContextValidatorRegistryService }], target: i0.ɵɵFactoryTarget.Injectable });
280
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: DynamicFormFactoryService, providedIn: 'root' });
279
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicFormFactoryService, deps: [{ token: i3.FormBuilder }, { token: ContextValidatorRegistryService }], target: i0.ɵɵFactoryTarget.Injectable });
280
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicFormFactoryService, providedIn: 'root' });
281
281
  }
282
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: DynamicFormFactoryService, decorators: [{
282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicFormFactoryService, decorators: [{
283
283
  type: Injectable,
284
284
  args: [{ providedIn: 'root' }]
285
285
  }], ctorParameters: () => [{ type: i3.FormBuilder }, { type: ContextValidatorRegistryService }] });
@@ -305,10 +305,10 @@ class EditorComponentRegistryService {
305
305
  isRegistered(editorType) {
306
306
  return this.registry.has(editorType);
307
307
  }
308
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: EditorComponentRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
309
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: EditorComponentRegistryService, providedIn: 'root' });
308
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: EditorComponentRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
309
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: EditorComponentRegistryService, providedIn: 'root' });
310
310
  }
311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: EditorComponentRegistryService, decorators: [{
311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: EditorComponentRegistryService, decorators: [{
312
312
  type: Injectable,
313
313
  args: [{ providedIn: 'root' }]
314
314
  }] });
@@ -349,8 +349,8 @@ class RegexHelpDialogComponent {
349
349
  choose(pattern) {
350
350
  this.dialogRef.close(pattern);
351
351
  }
352
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: RegexHelpDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
353
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.4", type: RegexHelpDialogComponent, isStandalone: true, selector: "praxis-regex-help-dialog", ngImport: i0, template: `
352
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: RegexHelpDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
353
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: RegexHelpDialogComponent, isStandalone: true, selector: "praxis-regex-help-dialog", ngImport: i0, template: `
354
354
  <h2 mat-dialog-title>Modelos de Expressões Regulares</h2>
355
355
  <div mat-dialog-content>
356
356
  <p>Selecione um dos modelos abaixo para preencher o campo ou use como base:</p>
@@ -373,7 +373,7 @@ class RegexHelpDialogComponent {
373
373
  </div>
374
374
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i2.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i2.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i2.MatListItemLine, selector: "[matListItemLine]" }, { kind: "directive", type: i2.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "ngmodule", type: MatButtonModule }] });
375
375
  }
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: RegexHelpDialogComponent, decorators: [{
376
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: RegexHelpDialogComponent, decorators: [{
377
377
  type: Component,
378
378
  args: [{
379
379
  selector: 'praxis-regex-help-dialog',
@@ -683,8 +683,8 @@ class DynamicEditorRendererComponent {
683
683
  this.form?.markAsDirty();
684
684
  }
685
685
  }
686
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: DynamicEditorRendererComponent, deps: [{ token: i1.MatDialog }, { token: i2$1.IconPickerService }], target: i0.ɵɵFactoryTarget.Component });
687
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.4", type: DynamicEditorRendererComponent, isStandalone: true, selector: "praxis-dynamic-editor-renderer", inputs: { properties: "properties", form: "form" }, usesOnChanges: true, ngImport: i0, template: `
686
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicEditorRendererComponent, deps: [{ token: i1.MatDialog }, { token: i2$1.IconPickerService }], target: i0.ɵɵFactoryTarget.Component });
687
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: DynamicEditorRendererComponent, isStandalone: true, selector: "praxis-dynamic-editor-renderer", inputs: { properties: "properties", form: "form" }, usesOnChanges: true, ngImport: i0, template: `
688
688
  <ng-template #item let-field="field" let-index="index" let-content="content">
689
689
  <div class="editor-item" [attr.data-control-type]="field.controlType">
690
690
  <ng-container [ngTemplateOutlet]="content"></ng-container>
@@ -755,7 +755,7 @@ class DynamicEditorRendererComponent {
755
755
  </div>
756
756
  `, isInline: true, styles: [":host{display:block}.editor-surface{padding:8px 0 2px;border-radius:12px;background:transparent}.section-accordion{display:block}.section-card{margin:6px 0 8px;border-radius:12px;border:1px solid var(--md-sys-color-outline-variant);overflow:hidden}.section-card.mat-expanded{border-color:var(--md-sys-color-primary);box-shadow:0 2px 10px #0000000d}.section-card .mat-expansion-panel-body{background:var(--md-sys-color-surface-container-low)}.section-header{background:var(--md-sys-color-surface-container-low);border-bottom:1px solid var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));padding:2px 8px;min-height:32px;display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-header .mat-expansion-panel-header-title,.section-header .mat-expansion-panel-header-description{display:flex;align-items:center;color:var(--md-sys-color-on-surface)}.section-title{display:inline-flex;align-items:center;gap:6px;font-weight:600;letter-spacing:.2px;color:var(--md-sys-color-on-surface);font-size:.9rem;line-height:1.2}.section-icon{color:var(--md-sys-color-primary, var(--md-sys-color-primary, #3f51b5));opacity:.9}.editor-row{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;margin-bottom:8px}.editor-row>praxis-field-shell{flex:1 1 100%;min-width:280px}.editor-row praxis-field-shell .mat-mdc-form-field{width:100%;margin-bottom:8px}.editor-row.row-inline>praxis-field-shell{flex:0 0 auto}.editor-row.row-2>praxis-field-shell{flex:1 1 calc(50% - 12px);min-width:260px}.editor-row.row-3>praxis-field-shell{flex:1 1 calc(33.333% - 12px);min-width:220px}.editor-row>praxis-field-shell[data-field-name=controlType],.editor-row>praxis-field-shell[data-field-name=label],.editor-row>praxis-field-shell[data-field-name=placeholder]{flex:1 1 calc(50% - 12px);min-width:300px}praxis-field-shell[data-field-name=label] .mdc-floating-label,praxis-field-shell[data-field-name=placeholder] .mdc-floating-label{font-weight:600}.editor-row>praxis-field-shell[data-field-name=prefix],.editor-row>praxis-field-shell[data-field-name=suffix]{flex:0 0 200px;min-width:160px}.editor-row>praxis-field-shell[data-field-name=prefixIcon],.editor-row>praxis-field-shell[data-field-name=suffixIcon],.editor-row>praxis-field-shell[data-field-name=prefixIconColor],.editor-row>praxis-field-shell[data-field-name=suffixIconColor]{flex:1 1 auto;min-width:160px}.editor-item{display:flex;align-items:flex-start;gap:4px}.editor-item>ng-container,.editor-item>praxis-field-shell{flex:1;min-width:0}.actions-container{display:flex;align-items:center;gap:0;margin-top:12px;flex-shrink:0}.decorator-btn{position:static;color:var(--md-sys-color-primary, #3f51b5);opacity:.6;transform:scale(.8);width:32px;height:32px;line-height:32px;padding:0}.decorator-btn:hover{opacity:1}.icon-picker-btn,.hint-btn,.hint-btn.has-icon-picker{right:auto}.editor-row .mat-mdc-form-field-subscript-wrapper mat-hint{display:none!important}.editor-row .mat-mdc-form-field-subscript-wrapper mat-error{display:block!important}praxis-field-shell[data-field-name=showCharCount] .mdc-switch{transform:scale(1.05)}praxis-field-shell[data-field-name=showCharCount] .mat-mdc-slide-toggle{font-weight:600}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint{display:flex;align-items:center;gap:8px;background:var(--md-sys-color-tertiary-container);border:1px solid var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary-container);padding:8px 10px;border-radius:6px;line-height:1.3;white-space:normal}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-hint:before{content:\"\\26a0\\fe0f\";display:inline-block}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field-subscript-wrapper{margin-top:6px;margin-bottom:10px;min-height:auto}praxis-field-shell[data-field-name=controlType] .mat-mdc-form-field{margin-bottom:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: DynamicFieldLoaderDirective, selector: "[dynamicFieldLoader]", inputs: ["fields", "formGroup", "enableExternalControlBinding", "itemTemplate", "debugTrace", "debugTraceLabel", "readonlyMode", "disabledMode", "presentationMode", "visible", "canvasMode"], outputs: ["componentsCreated", "fieldCreated", "fieldDestroyed", "renderError", "canvasMouseEnter", "canvasMouseLeave", "canvasClick"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { 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"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], encapsulation: i0.ViewEncapsulation.None });
757
757
  }
758
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: DynamicEditorRendererComponent, decorators: [{
758
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: DynamicEditorRendererComponent, decorators: [{
759
759
  type: Component,
760
760
  args: [{ selector: 'praxis-dynamic-editor-renderer', standalone: true, imports: [
761
761
  CommonModule,
@@ -3678,6 +3678,156 @@ function minLenLeMaxLen(group) {
3678
3678
  return null;
3679
3679
  }
3680
3680
 
3681
+ const HEX_PATTERN = /^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/i;
3682
+ function clampChannel(value) {
3683
+ return Math.max(0, Math.min(255, Math.round(value)));
3684
+ }
3685
+ function parseHexColor(raw) {
3686
+ const normalized = raw.trim();
3687
+ if (!HEX_PATTERN.test(normalized)) {
3688
+ return null;
3689
+ }
3690
+ const hex = normalized.slice(1);
3691
+ if (hex.length === 3 || hex.length === 4) {
3692
+ return {
3693
+ r: Number.parseInt(hex[0] + hex[0], 16),
3694
+ g: Number.parseInt(hex[1] + hex[1], 16),
3695
+ b: Number.parseInt(hex[2] + hex[2], 16),
3696
+ };
3697
+ }
3698
+ return {
3699
+ r: Number.parseInt(hex.slice(0, 2), 16),
3700
+ g: Number.parseInt(hex.slice(2, 4), 16),
3701
+ b: Number.parseInt(hex.slice(4, 6), 16),
3702
+ };
3703
+ }
3704
+ function parseRgbChannel(token) {
3705
+ const value = token.trim();
3706
+ if (!value.length)
3707
+ return null;
3708
+ if (value.endsWith('%')) {
3709
+ const pct = Number.parseFloat(value.slice(0, -1));
3710
+ if (!Number.isFinite(pct))
3711
+ return null;
3712
+ return clampChannel((pct / 100) * 255);
3713
+ }
3714
+ const numeric = Number.parseFloat(value);
3715
+ if (!Number.isFinite(numeric))
3716
+ return null;
3717
+ return clampChannel(numeric);
3718
+ }
3719
+ function parseRgbColor(raw) {
3720
+ const normalized = raw.trim().toLowerCase();
3721
+ if (!normalized.startsWith('rgb')) {
3722
+ return null;
3723
+ }
3724
+ const parts = normalized.match(/[\d.]+%?/g) ?? [];
3725
+ if (parts.length < 3) {
3726
+ return null;
3727
+ }
3728
+ const [rRaw, gRaw, bRaw] = parts;
3729
+ if (rRaw === undefined || gRaw === undefined || bRaw === undefined) {
3730
+ return null;
3731
+ }
3732
+ const r = parseRgbChannel(rRaw);
3733
+ const g = parseRgbChannel(gRaw);
3734
+ const b = parseRgbChannel(bRaw);
3735
+ if (r === null || g === null || b === null) {
3736
+ return null;
3737
+ }
3738
+ return { r, g, b };
3739
+ }
3740
+ function parseComputedRgbColor(raw) {
3741
+ if (typeof document === 'undefined') {
3742
+ return null;
3743
+ }
3744
+ const probe = document.createElement('span');
3745
+ probe.style.color = '';
3746
+ probe.style.color = raw;
3747
+ if (!probe.style.color) {
3748
+ return null;
3749
+ }
3750
+ const host = document.body ?? document.documentElement;
3751
+ let computed = probe.style.color;
3752
+ if (host) {
3753
+ host.appendChild(probe);
3754
+ try {
3755
+ computed = getComputedStyle(probe).color || computed;
3756
+ }
3757
+ finally {
3758
+ probe.remove();
3759
+ }
3760
+ }
3761
+ return parseRgbColor(computed) ?? parseHexColor(computed);
3762
+ }
3763
+ function normalizeCssColorToRgb(value) {
3764
+ const raw = String(value ?? '').trim();
3765
+ if (!raw.length) {
3766
+ return null;
3767
+ }
3768
+ return parseHexColor(raw) ?? parseRgbColor(raw) ?? parseComputedRgbColor(raw);
3769
+ }
3770
+ function relativeLuminance({ r, g, b }) {
3771
+ const normalize = (channel) => {
3772
+ const value = channel / 255;
3773
+ return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
3774
+ };
3775
+ return 0.2126 * normalize(r) + 0.7152 * normalize(g) + 0.0722 * normalize(b);
3776
+ }
3777
+ function contrastRatio(a, b) {
3778
+ const lumA = relativeLuminance(a);
3779
+ const lumB = relativeLuminance(b);
3780
+ const lighter = Math.max(lumA, lumB);
3781
+ const darker = Math.min(lumA, lumB);
3782
+ return (lighter + 0.05) / (darker + 0.05);
3783
+ }
3784
+ function gradientColorStopValidator(options) {
3785
+ const label = String(options.label || 'Cor').trim() || 'Cor';
3786
+ const compareWith = options.compareWith ?? [];
3787
+ const minContrastRatio = Math.max(1, Number(options.minContrastRatio ?? 1.4));
3788
+ return (control) => {
3789
+ const rawValue = String(control.value ?? '').trim();
3790
+ if (!rawValue.length) {
3791
+ return null;
3792
+ }
3793
+ const currentColor = normalizeCssColorToRgb(rawValue);
3794
+ if (!currentColor) {
3795
+ return {
3796
+ invalidColor: {
3797
+ message: `${label}: informe uma cor CSS valida (ex.: #22c55e).`,
3798
+ },
3799
+ };
3800
+ }
3801
+ const parent = control.parent;
3802
+ if (!parent || !compareWith.length) {
3803
+ return null;
3804
+ }
3805
+ for (const target of compareWith) {
3806
+ const siblingRaw = String(parent.get(target.field)?.value ?? '').trim();
3807
+ if (!siblingRaw.length) {
3808
+ continue;
3809
+ }
3810
+ const siblingColor = normalizeCssColorToRgb(siblingRaw);
3811
+ if (!siblingColor) {
3812
+ continue;
3813
+ }
3814
+ const ratio = contrastRatio(currentColor, siblingColor);
3815
+ if (ratio < minContrastRatio) {
3816
+ return {
3817
+ gradientContrast: {
3818
+ message: `${label}: contraste baixo com ${target.label} ` +
3819
+ `(${ratio.toFixed(2)}:1). Use ao menos ${minContrastRatio.toFixed(1)}:1.`,
3820
+ ratio,
3821
+ minContrastRatio,
3822
+ comparedField: target.field,
3823
+ },
3824
+ };
3825
+ }
3826
+ }
3827
+ return null;
3828
+ };
3829
+ }
3830
+
3681
3831
  function cloneProperty$6(prop) {
3682
3832
  return {
3683
3833
  ...prop,
@@ -3803,6 +3953,61 @@ const filterInlineDistanceRadiusProperties = [
3803
3953
  group: 'Aparencia',
3804
3954
  hint: 'Cor do glow ao redor do centro radial.',
3805
3955
  },
3956
+ {
3957
+ name: 'distanceGradientLowColor',
3958
+ label: 'Gradiente baixo',
3959
+ editorType: 'color',
3960
+ group: 'Aparencia',
3961
+ row: 'distance-gradient-colors',
3962
+ inline: true,
3963
+ hint: 'Cor para valores baixos (fallback padrao: verde).',
3964
+ validators: [
3965
+ gradientColorStopValidator({
3966
+ label: 'Gradiente baixo',
3967
+ compareWith: [{ field: 'distanceGradientMidColor', label: 'Gradiente medio' }],
3968
+ }),
3969
+ ],
3970
+ },
3971
+ {
3972
+ name: 'distanceGradientMidColor',
3973
+ label: 'Gradiente medio',
3974
+ editorType: 'color',
3975
+ group: 'Aparencia',
3976
+ row: 'distance-gradient-colors',
3977
+ inline: true,
3978
+ hint: 'Cor para valores medios (fallback padrao: amarelo/ambar).',
3979
+ validators: [
3980
+ gradientColorStopValidator({
3981
+ label: 'Gradiente medio',
3982
+ compareWith: [
3983
+ { field: 'distanceGradientLowColor', label: 'Gradiente baixo' },
3984
+ { field: 'distanceGradientHighColor', label: 'Gradiente alto' },
3985
+ ],
3986
+ }),
3987
+ ],
3988
+ },
3989
+ {
3990
+ name: 'distanceGradientHighColor',
3991
+ label: 'Gradiente alto',
3992
+ editorType: 'color',
3993
+ group: 'Aparencia',
3994
+ row: 'distance-gradient-colors',
3995
+ inline: true,
3996
+ hint: 'Cor para valores altos (fallback padrao: vermelho).',
3997
+ validators: [
3998
+ gradientColorStopValidator({
3999
+ label: 'Gradiente alto',
4000
+ compareWith: [{ field: 'distanceGradientMidColor', label: 'Gradiente medio' }],
4001
+ }),
4002
+ ],
4003
+ },
4004
+ {
4005
+ name: 'distanceRangeBandOpacity',
4006
+ label: 'Opacidade da faixa (0-1)',
4007
+ editorType: 'number',
4008
+ group: 'Aparencia',
4009
+ hint: 'Opcional. Sobrescreve a opacidade automatica da faixa radial no modo range.',
4010
+ },
3806
4011
  {
3807
4012
  name: 'materialDesign.density',
3808
4013
  label: 'Densidade',
@@ -3854,6 +4059,48 @@ const filterInlineRelativePeriodProperties = [
3854
4059
  editorType: 'checkbox',
3855
4060
  group: 'Formato/Comportamento',
3856
4061
  },
4062
+ {
4063
+ name: 'relativePeriodProgressGradientLowColor',
4064
+ label: 'Gradiente progresso (inicio)',
4065
+ editorType: 'color',
4066
+ group: 'Aparencia',
4067
+ hint: 'Cor inicial da barra de progresso relativa.',
4068
+ validators: [
4069
+ gradientColorStopValidator({
4070
+ label: 'Gradiente progresso (inicio)',
4071
+ compareWith: [{ field: 'relativePeriodProgressGradientMidColor', label: 'Gradiente progresso (meio)' }],
4072
+ }),
4073
+ ],
4074
+ },
4075
+ {
4076
+ name: 'relativePeriodProgressGradientMidColor',
4077
+ label: 'Gradiente progresso (meio)',
4078
+ editorType: 'color',
4079
+ group: 'Aparencia',
4080
+ hint: 'Cor intermediaria da barra de progresso relativa.',
4081
+ validators: [
4082
+ gradientColorStopValidator({
4083
+ label: 'Gradiente progresso (meio)',
4084
+ compareWith: [
4085
+ { field: 'relativePeriodProgressGradientLowColor', label: 'Gradiente progresso (inicio)' },
4086
+ { field: 'relativePeriodProgressGradientHighColor', label: 'Gradiente progresso (fim)' },
4087
+ ],
4088
+ }),
4089
+ ],
4090
+ },
4091
+ {
4092
+ name: 'relativePeriodProgressGradientHighColor',
4093
+ label: 'Gradiente progresso (fim)',
4094
+ editorType: 'color',
4095
+ group: 'Aparencia',
4096
+ hint: 'Cor final da barra de progresso relativa.',
4097
+ validators: [
4098
+ gradientColorStopValidator({
4099
+ label: 'Gradiente progresso (fim)',
4100
+ compareWith: [{ field: 'relativePeriodProgressGradientMidColor', label: 'Gradiente progresso (meio)' }],
4101
+ }),
4102
+ ],
4103
+ },
3857
4104
  {
3858
4105
  name: 'relativePeriodColumns',
3859
4106
  label: 'Colunas do grid',
@@ -3992,6 +4239,48 @@ const filterInlineSentimentProperties = [
3992
4239
  group: 'Aparencia',
3993
4240
  hint: 'Cores fallback usadas quando a opcao nao informar color.',
3994
4241
  },
4242
+ {
4243
+ name: 'sentimentGradientLowColor',
4244
+ label: 'Gradiente sentimento (inicio)',
4245
+ editorType: 'color',
4246
+ group: 'Aparencia',
4247
+ hint: 'Cor inicial do gradiente fallback de sentimento.',
4248
+ validators: [
4249
+ gradientColorStopValidator({
4250
+ label: 'Gradiente sentimento (inicio)',
4251
+ compareWith: [{ field: 'sentimentGradientMidColor', label: 'Gradiente sentimento (meio)' }],
4252
+ }),
4253
+ ],
4254
+ },
4255
+ {
4256
+ name: 'sentimentGradientMidColor',
4257
+ label: 'Gradiente sentimento (meio)',
4258
+ editorType: 'color',
4259
+ group: 'Aparencia',
4260
+ hint: 'Cor intermediaria do gradiente fallback de sentimento.',
4261
+ validators: [
4262
+ gradientColorStopValidator({
4263
+ label: 'Gradiente sentimento (meio)',
4264
+ compareWith: [
4265
+ { field: 'sentimentGradientLowColor', label: 'Gradiente sentimento (inicio)' },
4266
+ { field: 'sentimentGradientHighColor', label: 'Gradiente sentimento (fim)' },
4267
+ ],
4268
+ }),
4269
+ ],
4270
+ },
4271
+ {
4272
+ name: 'sentimentGradientHighColor',
4273
+ label: 'Gradiente sentimento (fim)',
4274
+ editorType: 'color',
4275
+ group: 'Aparencia',
4276
+ hint: 'Cor final do gradiente fallback de sentimento.',
4277
+ validators: [
4278
+ gradientColorStopValidator({
4279
+ label: 'Gradiente sentimento (fim)',
4280
+ compareWith: [{ field: 'sentimentGradientMidColor', label: 'Gradiente sentimento (meio)' }],
4281
+ }),
4282
+ ],
4283
+ },
3995
4284
  {
3996
4285
  name: 'sentimentShowBar',
3997
4286
  label: 'Mostrar barra de sentimento',
@@ -4362,6 +4651,48 @@ const filterInlinePipelineStatusProperties = [
4362
4651
  group: 'Aparencia',
4363
4652
  hint: 'Cores fallback quando a opcao nao informar color.',
4364
4653
  },
4654
+ {
4655
+ name: 'pipelineGradientLowColor',
4656
+ label: 'Gradiente pipeline (inicio)',
4657
+ editorType: 'color',
4658
+ group: 'Aparencia',
4659
+ hint: 'Cor inicial do gradiente fallback da barra/segmentos.',
4660
+ validators: [
4661
+ gradientColorStopValidator({
4662
+ label: 'Gradiente pipeline (inicio)',
4663
+ compareWith: [{ field: 'pipelineGradientMidColor', label: 'Gradiente pipeline (meio)' }],
4664
+ }),
4665
+ ],
4666
+ },
4667
+ {
4668
+ name: 'pipelineGradientMidColor',
4669
+ label: 'Gradiente pipeline (meio)',
4670
+ editorType: 'color',
4671
+ group: 'Aparencia',
4672
+ hint: 'Cor intermediaria do gradiente fallback da barra/segmentos.',
4673
+ validators: [
4674
+ gradientColorStopValidator({
4675
+ label: 'Gradiente pipeline (meio)',
4676
+ compareWith: [
4677
+ { field: 'pipelineGradientLowColor', label: 'Gradiente pipeline (inicio)' },
4678
+ { field: 'pipelineGradientHighColor', label: 'Gradiente pipeline (fim)' },
4679
+ ],
4680
+ }),
4681
+ ],
4682
+ },
4683
+ {
4684
+ name: 'pipelineGradientHighColor',
4685
+ label: 'Gradiente pipeline (fim)',
4686
+ editorType: 'color',
4687
+ group: 'Aparencia',
4688
+ hint: 'Cor final do gradiente fallback da barra/segmentos.',
4689
+ validators: [
4690
+ gradientColorStopValidator({
4691
+ label: 'Gradiente pipeline (fim)',
4692
+ compareWith: [{ field: 'pipelineGradientMidColor', label: 'Gradiente pipeline (meio)' }],
4693
+ }),
4694
+ ],
4695
+ },
4365
4696
  {
4366
4697
  name: 'pipelineEmptyStateText',
4367
4698
  label: 'Texto de estado vazio',
@@ -4542,6 +4873,48 @@ const filterInlineRatingProperties = [
4542
4873
  group: 'Aparência',
4543
4874
  hint: 'Cor para estrelas de notas altas (fallback: verde).',
4544
4875
  },
4876
+ {
4877
+ name: 'ratingGradientLowColor',
4878
+ label: 'Gradiente estrelas (inicio)',
4879
+ editorType: 'color',
4880
+ group: 'Aparência',
4881
+ hint: 'Cor inicial do gradiente aplicado na escala de estrelas.',
4882
+ validators: [
4883
+ gradientColorStopValidator({
4884
+ label: 'Gradiente estrelas (inicio)',
4885
+ compareWith: [{ field: 'ratingGradientMidColor', label: 'Gradiente estrelas (meio)' }],
4886
+ }),
4887
+ ],
4888
+ },
4889
+ {
4890
+ name: 'ratingGradientMidColor',
4891
+ label: 'Gradiente estrelas (meio)',
4892
+ editorType: 'color',
4893
+ group: 'Aparência',
4894
+ hint: 'Cor intermediaria do gradiente aplicado na escala de estrelas.',
4895
+ validators: [
4896
+ gradientColorStopValidator({
4897
+ label: 'Gradiente estrelas (meio)',
4898
+ compareWith: [
4899
+ { field: 'ratingGradientLowColor', label: 'Gradiente estrelas (inicio)' },
4900
+ { field: 'ratingGradientHighColor', label: 'Gradiente estrelas (fim)' },
4901
+ ],
4902
+ }),
4903
+ ],
4904
+ },
4905
+ {
4906
+ name: 'ratingGradientHighColor',
4907
+ label: 'Gradiente estrelas (fim)',
4908
+ editorType: 'color',
4909
+ group: 'Aparência',
4910
+ hint: 'Cor final do gradiente aplicado na escala de estrelas.',
4911
+ validators: [
4912
+ gradientColorStopValidator({
4913
+ label: 'Gradiente estrelas (fim)',
4914
+ compareWith: [{ field: 'ratingGradientMidColor', label: 'Gradiente estrelas (meio)' }],
4915
+ }),
4916
+ ],
4917
+ },
4545
4918
  {
4546
4919
  name: 'ratingBadgeColor',
4547
4920
  label: 'Cor ícone badges',
@@ -4735,6 +5108,48 @@ const filterInlineScorePriorityProperties = [
4735
5108
  group: 'Aparencia',
4736
5109
  hint: 'Cores usadas quando uma faixa nao informa color.',
4737
5110
  },
5111
+ {
5112
+ name: 'scoreGradientLowColor',
5113
+ label: 'Gradiente score (inicio)',
5114
+ editorType: 'color',
5115
+ group: 'Aparencia',
5116
+ hint: 'Cor inicial do gradiente fallback da trilha.',
5117
+ validators: [
5118
+ gradientColorStopValidator({
5119
+ label: 'Gradiente score (inicio)',
5120
+ compareWith: [{ field: 'scoreGradientMidColor', label: 'Gradiente score (meio)' }],
5121
+ }),
5122
+ ],
5123
+ },
5124
+ {
5125
+ name: 'scoreGradientMidColor',
5126
+ label: 'Gradiente score (meio)',
5127
+ editorType: 'color',
5128
+ group: 'Aparencia',
5129
+ hint: 'Cor intermediaria do gradiente fallback da trilha.',
5130
+ validators: [
5131
+ gradientColorStopValidator({
5132
+ label: 'Gradiente score (meio)',
5133
+ compareWith: [
5134
+ { field: 'scoreGradientLowColor', label: 'Gradiente score (inicio)' },
5135
+ { field: 'scoreGradientHighColor', label: 'Gradiente score (fim)' },
5136
+ ],
5137
+ }),
5138
+ ],
5139
+ },
5140
+ {
5141
+ name: 'scoreGradientHighColor',
5142
+ label: 'Gradiente score (fim)',
5143
+ editorType: 'color',
5144
+ group: 'Aparencia',
5145
+ hint: 'Cor final do gradiente fallback da trilha.',
5146
+ validators: [
5147
+ gradientColorStopValidator({
5148
+ label: 'Gradiente score (fim)',
5149
+ compareWith: [{ field: 'scoreGradientMidColor', label: 'Gradiente score (meio)' }],
5150
+ }),
5151
+ ],
5152
+ },
4738
5153
  {
4739
5154
  name: 'scoreValueFallbackColor',
4740
5155
  label: 'Cor fallback valor',
@@ -5621,8 +6036,8 @@ class FieldMetadataEditorComponent {
5621
6036
  if (value != null)
5622
6037
  this.onControlTypeChange(value);
5623
6038
  }
5624
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FieldMetadataEditorComponent, deps: [{ token: ConfigRegistryService }, { token: SchemaNormalizerService }, { token: DynamicFormFactoryService }, { token: ContextValidatorRegistryService }], target: i0.ɵɵFactoryTarget.Component });
5625
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.4", type: FieldMetadataEditorComponent, isStandalone: true, selector: "praxis-field-metadata-editor", inputs: { controlType: "controlType", seed: "seed" }, outputs: { applied: "applied", cancel: "cancel" }, ngImport: i0, template: `
6039
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: FieldMetadataEditorComponent, deps: [{ token: ConfigRegistryService }, { token: SchemaNormalizerService }, { token: DynamicFormFactoryService }, { token: ContextValidatorRegistryService }], target: i0.ɵɵFactoryTarget.Component });
6040
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: FieldMetadataEditorComponent, isStandalone: true, selector: "praxis-field-metadata-editor", inputs: { controlType: "controlType", seed: "seed" }, outputs: { applied: "applied", cancel: "cancel" }, ngImport: i0, template: `
5626
6041
  <div class="p-3" *ngIf="form">
5627
6042
  <praxis-dynamic-editor-renderer
5628
6043
  [properties]="normalizedProps"
@@ -5631,7 +6046,7 @@ class FieldMetadataEditorComponent {
5631
6046
  </div>
5632
6047
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: DynamicEditorRendererComponent, selector: "praxis-dynamic-editor-renderer", inputs: ["properties", "form"] }] });
5633
6048
  }
5634
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: FieldMetadataEditorComponent, decorators: [{
6049
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: FieldMetadataEditorComponent, decorators: [{
5635
6050
  type: Component,
5636
6051
  args: [{
5637
6052
  selector: 'praxis-field-metadata-editor',
@@ -5707,10 +6122,10 @@ class CascadeRulesService {
5707
6122
  dependencyValuePath: rule.dependencyValuePath || inferredValueKey || 'id',
5708
6123
  };
5709
6124
  }
5710
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: CascadeRulesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5711
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: CascadeRulesService, providedIn: 'root' });
6125
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CascadeRulesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
6126
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CascadeRulesService, providedIn: 'root' });
5712
6127
  }
5713
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: CascadeRulesService, decorators: [{
6128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CascadeRulesService, decorators: [{
5714
6129
  type: Injectable,
5715
6130
  args: [{ providedIn: 'root' }]
5716
6131
  }] });
@@ -6079,8 +6494,8 @@ class CascadeManagerTabComponent {
6079
6494
  }
6080
6495
  return [...new Set(suggestions)];
6081
6496
  }
6082
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: CascadeManagerTabComponent, deps: [{ token: CascadeRulesService }], target: i0.ɵɵFactoryTarget.Component });
6083
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.4", type: CascadeManagerTabComponent, isStandalone: true, selector: "praxis-cascade-manager-tab", inputs: { fields: "fields", connections: "connections" }, outputs: { apply: "apply", cancel: "cancel" }, usesOnChanges: true, ngImport: i0, template: `
6497
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CascadeManagerTabComponent, deps: [{ token: CascadeRulesService }], target: i0.ɵɵFactoryTarget.Component });
6498
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: CascadeManagerTabComponent, isStandalone: true, selector: "praxis-cascade-manager-tab", inputs: { fields: "fields", connections: "connections" }, outputs: { apply: "apply", cancel: "cancel" }, usesOnChanges: true, ngImport: i0, template: `
6084
6499
  <div class="cm-root">
6085
6500
  <!-- Left: Fields list -->
6086
6501
  <div class="cm-left">
@@ -6354,7 +6769,7 @@ class CascadeManagerTabComponent {
6354
6769
  </div>
6355
6770
  `, isInline: true, styles: [":host{display:block}.cm-root{display:grid;grid-template-columns:320px 1fr;gap:16px;min-height:420px}.cm-left{border-right:1px solid var(--md-sys-color-outline-variant);padding-right:8px}.cm-search{width:100%;margin-bottom:8px}.cm-right{padding-left:8px}.field-item{display:flex;align-items:center;justify-content:space-between;padding:8px 6px;cursor:pointer;border-radius:10px;transition:background .12s ease,border .12s ease;border:1px solid transparent}.field-item:hover{background:var(--md-sys-color-surface-container-high)}.field-item.selected{background:var(--md-sys-color-surface-container-highest);border-color:var(--md-sys-color-outline-variant)}.rule-badges{display:inline-flex;gap:6px}.rule-badge{font-size:11px;padding:2px 8px;border-radius:999px;font-weight:600}.b-active{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.b-manual{background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant)}.b-immediate{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.b-conflict{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.cm-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.rules-empty{opacity:.8;font-style:italic;padding:8px 0;color:var(--md-sys-color-on-surface-variant)}.rule-row{display:grid;grid-template-columns:1fr auto;align-items:center;padding:10px 0;border-bottom:1px dashed var(--md-sys-color-outline-variant)}.rule-actions button{margin-left:4px}.banner{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container);padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;margin-bottom:10px;display:flex;gap:8px;align-items:center}.import-panel{background:var(--md-sys-color-surface-container-high);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:10px;margin-bottom:10px}.full{width:100%}.form-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.form-grid{display:grid;gap:12px;padding:8px 0}.map-table{width:100%;border-collapse:collapse}.map-table th,.map-table td{padding:8px;border-bottom:1px dashed var(--md-sys-color-outline-variant)}.kbd{font-family:monospace;background:var(--md-sys-color-surface-container-highest);padding:0 6px;border-radius:4px;color:var(--md-sys-color-on-surface-variant)}.panel-surface{background:var(--md-sys-color-surface-container-high);border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;box-shadow:var(--md-sys-elevation-level1, none);margin-bottom:12px}.panel-stack{display:grid;gap:12px;margin:12px 0}.stack-panel{background:var(--md-sys-color-surface-container-high);border:1px solid var(--md-sys-color-outline-variant);border-radius:10px;box-shadow:var(--md-sys-elevation-level1, none)}.stack-panel .mat-expansion-panel-content{padding:0 16px 12px}.panel-header{display:flex;align-items:center;gap:8px}.preview-box{background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:8px;color:var(--md-sys-color-on-surface)}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.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: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.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: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i8$1.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: i8$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i11.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: i11.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i11.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: MatAutocompleteModule }, { kind: "component", type: i12.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i12.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i13.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i13.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i13.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
6356
6771
  }
6357
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.4", ngImport: i0, type: CascadeManagerTabComponent, decorators: [{
6772
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: CascadeManagerTabComponent, decorators: [{
6358
6773
  type: Component,
6359
6774
  args: [{ selector: 'praxis-cascade-manager-tab', standalone: true, imports: [
6360
6775
  CommonModule,