@praxisui/visual-builder 9.0.5-rc.4 → 9.0.5-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -135,6 +135,7 @@ Boundary rules:
135
135
  - effects must be constrained by target property schemas and `RULE_PROPERTY_SCHEMA`
136
136
  - `dsl.roundTrip.validate` validates the JSON export/import path currently implemented by `RuleBuilderService`; form-config import remains supported but is not advertised as a round-trip export target by this operation
137
137
  - field-to-field comparisons are part of the supported visual subset; context-variable and function-result operands in field conditions remain planned until a canonical JSON Logic shape exists
138
+ - field operands wrapped by the canonical Praxis `coalesce` operator round-trip without semantic loss; the editor preserves that nullish-value transform while fields or operators are changed
138
139
  - component-specific configuration belongs to child component manifests
139
140
 
140
141
  ## Legacy Note
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-12T04:55:54.550Z",
3
+ "generatedAt": "2026-08-19T22:31:49.659Z",
4
4
  "packageName": "@praxisui/visual-builder",
5
- "packageVersion": "9.0.5-rc.4",
5
+ "packageVersion": "9.0.5-rc.40",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -1545,7 +1545,10 @@ class RuleBuilderService {
1545
1545
  return null;
1546
1546
  }
1547
1547
  return {
1548
- [operator]: [{ var: cfg.fieldName }, this.buildConditionRightOperand(cfg)],
1548
+ [operator]: [
1549
+ this.buildFieldOperand(cfg.fieldName, cfg.fieldValueTransform),
1550
+ this.buildConditionRightOperand(cfg),
1551
+ ],
1549
1552
  };
1550
1553
  }
1551
1554
  if (node.type === RuleNodeType.AND_GROUP || node.type === RuleNodeType.OR_GROUP) {
@@ -1957,18 +1960,26 @@ class RuleBuilderService {
1957
1960
  return undefined;
1958
1961
  }
1959
1962
  const [left, right] = normalizedArgs;
1960
- if (!this.isVarExpression(left)) {
1963
+ const leftOperand = this.parseFieldOperand(left);
1964
+ if (!leftOperand) {
1961
1965
  return undefined;
1962
1966
  }
1963
1967
  const config = {
1964
1968
  type: 'fieldCondition',
1965
- fieldName: this.extractVarPath(left.var),
1969
+ fieldName: leftOperand.path,
1966
1970
  operator: builderOperator,
1967
1971
  value: right,
1968
1972
  };
1969
- if (this.isVarExpression(right)) {
1973
+ if (leftOperand.transform) {
1974
+ config['fieldValueTransform'] = leftOperand.transform;
1975
+ }
1976
+ const rightOperand = this.parseFieldOperand(right);
1977
+ if (rightOperand) {
1970
1978
  config['valueType'] = 'field';
1971
- config['compareToField'] = this.extractVarPath(right.var);
1979
+ config['compareToField'] = rightOperand.path;
1980
+ if (rightOperand.transform) {
1981
+ config['compareToFieldValueTransform'] = rightOperand.transform;
1982
+ }
1972
1983
  }
1973
1984
  return {
1974
1985
  id: v4(),
@@ -2091,10 +2102,34 @@ class RuleBuilderService {
2091
2102
  if (cfg['valueType'] === 'field' &&
2092
2103
  typeof cfg['compareToField'] === 'string' &&
2093
2104
  cfg['compareToField'].trim()) {
2094
- return { var: cfg['compareToField'].trim() };
2105
+ return this.buildFieldOperand(cfg['compareToField'].trim(), cfg['compareToFieldValueTransform']);
2095
2106
  }
2096
2107
  return this.normalizeConditionValue(cfg['value']);
2097
2108
  }
2109
+ buildFieldOperand(path, transform) {
2110
+ const variable = { var: path };
2111
+ return transform === 'coalesce' ? { coalesce: [variable] } : variable;
2112
+ }
2113
+ parseFieldOperand(value) {
2114
+ if (this.isVarExpression(value)) {
2115
+ return { path: this.extractVarPath(value.var) };
2116
+ }
2117
+ if (!value ||
2118
+ typeof value !== 'object' ||
2119
+ Array.isArray(value) ||
2120
+ !('coalesce' in value)) {
2121
+ return null;
2122
+ }
2123
+ const args = value.coalesce;
2124
+ const normalizedArgs = Array.isArray(args) ? args : [args];
2125
+ if (normalizedArgs.length !== 1 || !this.isVarExpression(normalizedArgs[0])) {
2126
+ return null;
2127
+ }
2128
+ return {
2129
+ path: this.extractVarPath(normalizedArgs[0].var),
2130
+ transform: 'coalesce',
2131
+ };
2132
+ }
2098
2133
  isJsonLogicExpressionCandidate(value) {
2099
2134
  return !!value && typeof value === 'object' && !Array.isArray(value);
2100
2135
  }
@@ -4755,6 +4790,7 @@ class PropertyEffectEditorComponent {
4755
4790
  size="dense"
4756
4791
  matSuffix
4757
4792
  type="button"
4793
+ [attr.aria-label]="getDefinition(entry.property)?.description"
4758
4794
  [matTooltip]="getDefinition(entry.property)?.description"
4759
4795
  matTooltipPosition="above"
4760
4796
  >
@@ -5073,6 +5109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5073
5109
  size="dense"
5074
5110
  matSuffix
5075
5111
  type="button"
5112
+ [attr.aria-label]="getDefinition(entry.property)?.description"
5076
5113
  [matTooltip]="getDefinition(entry.property)?.description"
5077
5114
  matTooltipPosition="above"
5078
5115
  >
@@ -5463,6 +5500,8 @@ class FieldConditionEditorComponent {
5463
5500
  valueType,
5464
5501
  compareToField: valueType === 'field' ? formValue.compareToField : '',
5465
5502
  contextVariable: '',
5503
+ fieldValueTransform: this.config?.fieldValueTransform,
5504
+ compareToFieldValueTransform: valueType === 'field' ? this.config?.compareToFieldValueTransform : undefined,
5466
5505
  };
5467
5506
  this.configChanged.emit(config);
5468
5507
  }
@@ -5847,6 +5886,7 @@ class FieldConditionEditorComponent {
5847
5886
  size="dense"
5848
5887
  matSuffix
5849
5888
  type="button"
5889
+ [attr.aria-label]="selectedField?.description"
5850
5890
  [matTooltip]="selectedField?.description"
5851
5891
  matTooltipPosition="above"
5852
5892
  >
@@ -5901,15 +5941,18 @@ class FieldConditionEditorComponent {
5901
5941
  formControlName="value"
5902
5942
  [placeholder]="getValuePlaceholder()"
5903
5943
  />
5904
- <button
5905
- praxisIconButton="help_outline"
5906
- size="dense"
5907
- matSuffix
5908
- type="button"
5909
- [matTooltip]="getValueHint()"
5910
- matTooltipPosition="above"
5911
- >
5912
- </button>
5944
+ @if (getValueHint()) {
5945
+ <button
5946
+ praxisIconButton="help_outline"
5947
+ size="dense"
5948
+ matSuffix
5949
+ type="button"
5950
+ [attr.aria-label]="getValueHint()"
5951
+ [matTooltip]="getValueHint()"
5952
+ matTooltipPosition="above"
5953
+ >
5954
+ </button>
5955
+ }
5913
5956
  </mat-form-field>
5914
5957
  }
5915
5958
  @if (isBooleanField()) {
@@ -6059,7 +6102,7 @@ class FieldConditionEditorComponent {
6059
6102
  </div>
6060
6103
  }
6061
6104
  </form>
6062
- `, isInline: true, styles: [".field-condition-form{display:flex;flex-direction:column;gap:8px;min-width:300px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:8px 10px;overflow:visible}.condition-row-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px}.condition-title{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--md-sys-color-on-surface)}.compact-grid{gap:12px}.condition-row{display:grid;grid-template-columns:minmax(180px,2fr) minmax(140px,1.5fr) minmax(220px,3fr) auto;gap:12px 4px;align-items:center}.compact-field{width:100%}.value-inline{display:grid;grid-template-columns:1.2fr 2fr;gap:8px;align-items:center}.value-field{width:100%}.field-option,.context-option,.function-option{display:flex;align-items:center;gap:8px;width:100%}.field-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.field-label{flex:1;font-weight:500}.field-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.select-search-container{position:sticky;top:0;z-index:1;background:var(--md-sys-color-surface-container-lowest, #fff);padding:8px 16px;border-bottom:1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,.12))}.search-input-field{width:100%}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.no-results{font-style:italic;font-size:13px;text-align:center}.field-info{flex:1;display:flex;flex-direction:column;line-height:1.2;overflow:hidden}.field-name{font-size:10px;opacity:.6}.variable-name{font-family:monospace;font-weight:500;color:var(--md-sys-color-secondary)}.variable-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.function-name{font-weight:500;color:var(--md-sys-color-tertiary)}.function-desc{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.boolean-inline{display:flex;align-items:center;padding:4px 0}.condition-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:8px 12px;border-left:4px solid var(--md-sys-color-primary);margin-top:2px}.preview-label{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant);margin-bottom:2px}.preview-text{font-family:monospace;font-size:14px;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface);padding:6px 8px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.error-row{display:inline-flex;align-items:center;gap:6px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border:1px solid var(--md-sys-color-error);border-radius:8px;padding:4px 10px;font-size:12px;min-height:32px}@media(max-width:1024px){.condition-row{grid-template-columns:repeat(2,minmax(180px,1fr))}.value-inline{grid-template-columns:1fr}}@media(max-width:768px){.condition-row{grid-template-columns:1fr}}.no-fields-hint{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--md-sys-color-on-surface-variant);padding:8px 0}:host ::ng-deep .mat-mdc-select-panel{scrollbar-width:thin;scrollbar-color:var(--md-sys-color-on-surface-variant) transparent}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar{width:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-on-surface-variant);border-radius:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-track{background-color:transparent}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.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: "directive", type: i3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i3.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4$1.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: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6$1.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: MatDatepickerModule }, { kind: "component", type: i7$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6105
+ `, isInline: true, styles: [".field-condition-form{display:flex;flex-direction:column;gap:8px;width:100%;min-width:0;max-width:100%;box-sizing:border-box;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:8px 10px;overflow:visible}.condition-row-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px}.condition-title{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--md-sys-color-on-surface)}.compact-grid{gap:12px}.condition-row{display:grid;grid-template-columns:minmax(180px,2fr) minmax(140px,1.5fr) minmax(220px,3fr) auto;gap:12px 4px;align-items:center;min-width:0}.condition-row>*,.value-inline,.compact-field,.value-field{min-width:0;max-width:100%}.compact-field{width:100%}.value-inline{display:grid;grid-template-columns:1.2fr 2fr;gap:8px;align-items:center}.value-field{width:100%}.field-option,.context-option,.function-option{display:flex;align-items:center;gap:8px;width:100%}.field-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.field-label{flex:1;font-weight:500}.field-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.select-search-container{position:sticky;top:0;z-index:1;background:var(--md-sys-color-surface-container-lowest, #fff);padding:8px 16px;border-bottom:1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,.12))}.search-input-field{width:100%}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.no-results{font-style:italic;font-size:13px;text-align:center}.field-info{flex:1;display:flex;flex-direction:column;line-height:1.2;overflow:hidden}.field-name{font-size:10px;opacity:.6}.variable-name{font-family:monospace;font-weight:500;color:var(--md-sys-color-secondary)}.variable-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.function-name{font-weight:500;color:var(--md-sys-color-tertiary)}.function-desc{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.boolean-inline{display:flex;align-items:center;padding:4px 0}.condition-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:8px 12px;border-left:4px solid var(--md-sys-color-primary);margin-top:2px}.preview-label{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant);margin-bottom:2px}.preview-text{font-family:monospace;font-size:14px;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface);padding:6px 8px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.error-row{display:inline-flex;align-items:center;gap:6px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border:1px solid var(--md-sys-color-error);border-radius:8px;padding:4px 10px;font-size:12px;min-height:32px}@media(max-width:1024px){.condition-row{grid-template-columns:repeat(2,minmax(180px,1fr))}.value-inline{grid-template-columns:1fr}}@media(max-width:768px){.condition-row{grid-template-columns:1fr}}.no-fields-hint{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--md-sys-color-on-surface-variant);padding:8px 0}:host ::ng-deep .mat-mdc-select-panel{scrollbar-width:thin;scrollbar-color:var(--md-sys-color-on-surface-variant) transparent}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar{width:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-on-surface-variant);border-radius:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-track{background-color:transparent}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3.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: "directive", type: i3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i3.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4$1.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: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6$1.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: MatDatepickerModule }, { kind: "component", type: i7$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7$2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6063
6106
  }
6064
6107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: FieldConditionEditorComponent, decorators: [{
6065
6108
  type: Component,
@@ -6144,6 +6187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6144
6187
  size="dense"
6145
6188
  matSuffix
6146
6189
  type="button"
6190
+ [attr.aria-label]="selectedField?.description"
6147
6191
  [matTooltip]="selectedField?.description"
6148
6192
  matTooltipPosition="above"
6149
6193
  >
@@ -6198,15 +6242,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6198
6242
  formControlName="value"
6199
6243
  [placeholder]="getValuePlaceholder()"
6200
6244
  />
6201
- <button
6202
- praxisIconButton="help_outline"
6203
- size="dense"
6204
- matSuffix
6205
- type="button"
6206
- [matTooltip]="getValueHint()"
6207
- matTooltipPosition="above"
6208
- >
6209
- </button>
6245
+ @if (getValueHint()) {
6246
+ <button
6247
+ praxisIconButton="help_outline"
6248
+ size="dense"
6249
+ matSuffix
6250
+ type="button"
6251
+ [attr.aria-label]="getValueHint()"
6252
+ [matTooltip]="getValueHint()"
6253
+ matTooltipPosition="above"
6254
+ >
6255
+ </button>
6256
+ }
6210
6257
  </mat-form-field>
6211
6258
  }
6212
6259
  @if (isBooleanField()) {
@@ -6356,7 +6403,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6356
6403
  </div>
6357
6404
  }
6358
6405
  </form>
6359
- `, styles: [".field-condition-form{display:flex;flex-direction:column;gap:8px;min-width:300px;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:8px 10px;overflow:visible}.condition-row-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px}.condition-title{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--md-sys-color-on-surface)}.compact-grid{gap:12px}.condition-row{display:grid;grid-template-columns:minmax(180px,2fr) minmax(140px,1.5fr) minmax(220px,3fr) auto;gap:12px 4px;align-items:center}.compact-field{width:100%}.value-inline{display:grid;grid-template-columns:1.2fr 2fr;gap:8px;align-items:center}.value-field{width:100%}.field-option,.context-option,.function-option{display:flex;align-items:center;gap:8px;width:100%}.field-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.field-label{flex:1;font-weight:500}.field-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.select-search-container{position:sticky;top:0;z-index:1;background:var(--md-sys-color-surface-container-lowest, #fff);padding:8px 16px;border-bottom:1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,.12))}.search-input-field{width:100%}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.no-results{font-style:italic;font-size:13px;text-align:center}.field-info{flex:1;display:flex;flex-direction:column;line-height:1.2;overflow:hidden}.field-name{font-size:10px;opacity:.6}.variable-name{font-family:monospace;font-weight:500;color:var(--md-sys-color-secondary)}.variable-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.function-name{font-weight:500;color:var(--md-sys-color-tertiary)}.function-desc{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.boolean-inline{display:flex;align-items:center;padding:4px 0}.condition-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:8px 12px;border-left:4px solid var(--md-sys-color-primary);margin-top:2px}.preview-label{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant);margin-bottom:2px}.preview-text{font-family:monospace;font-size:14px;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface);padding:6px 8px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.error-row{display:inline-flex;align-items:center;gap:6px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border:1px solid var(--md-sys-color-error);border-radius:8px;padding:4px 10px;font-size:12px;min-height:32px}@media(max-width:1024px){.condition-row{grid-template-columns:repeat(2,minmax(180px,1fr))}.value-inline{grid-template-columns:1fr}}@media(max-width:768px){.condition-row{grid-template-columns:1fr}}.no-fields-hint{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--md-sys-color-on-surface-variant);padding:8px 0}:host ::ng-deep .mat-mdc-select-panel{scrollbar-width:thin;scrollbar-color:var(--md-sys-color-on-surface-variant) transparent}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar{width:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-on-surface-variant);border-radius:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-track{background-color:transparent}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
6406
+ `, styles: [".field-condition-form{display:flex;flex-direction:column;gap:8px;width:100%;min-width:0;max-width:100%;box-sizing:border-box;background:var(--md-sys-color-surface-container-low);border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:8px 10px;overflow:visible}.condition-row-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:4px}.condition-title{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:var(--md-sys-color-on-surface)}.compact-grid{gap:12px}.condition-row{display:grid;grid-template-columns:minmax(180px,2fr) minmax(140px,1.5fr) minmax(220px,3fr) auto;gap:12px 4px;align-items:center;min-width:0}.condition-row>*,.value-inline,.compact-field,.value-field{min-width:0;max-width:100%}.compact-field{width:100%}.value-inline{display:grid;grid-template-columns:1.2fr 2fr;gap:8px;align-items:center}.value-field{width:100%}.field-option,.context-option,.function-option{display:flex;align-items:center;gap:8px;width:100%}.field-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.field-label{flex:1;font-weight:500}.field-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.select-search-container{position:sticky;top:0;z-index:1;background:var(--md-sys-color-surface-container-lowest, #fff);padding:8px 16px;border-bottom:1px solid var(--md-sys-color-outline-variant, rgba(0,0,0,.12))}.search-input-field{width:100%}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.no-results{font-style:italic;font-size:13px;text-align:center}.field-info{flex:1;display:flex;flex-direction:column;line-height:1.2;overflow:hidden}.field-name{font-size:10px;opacity:.6}.variable-name{font-family:monospace;font-weight:500;color:var(--md-sys-color-secondary)}.variable-type{font-size:11px;color:var(--md-sys-color-on-surface-variant);background:var(--md-sys-color-surface-container);padding:2px 6px;border-radius:4px}.function-name{font-weight:500;color:var(--md-sys-color-tertiary)}.function-desc{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.boolean-inline{display:flex;align-items:center;padding:4px 0}.condition-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:8px 12px;border-left:4px solid var(--md-sys-color-primary);margin-top:2px}.preview-label{font-size:12px;font-weight:500;color:var(--md-sys-color-on-surface-variant);margin-bottom:2px}.preview-text{font-family:monospace;font-size:14px;color:var(--md-sys-color-on-surface);background:var(--md-sys-color-surface);padding:6px 8px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.error-row{display:inline-flex;align-items:center;gap:6px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border:1px solid var(--md-sys-color-error);border-radius:8px;padding:4px 10px;font-size:12px;min-height:32px}@media(max-width:1024px){.condition-row{grid-template-columns:repeat(2,minmax(180px,1fr))}.value-inline{grid-template-columns:1fr}}@media(max-width:768px){.condition-row{grid-template-columns:1fr}}.no-fields-hint{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--md-sys-color-on-surface-variant);padding:8px 0}:host ::ng-deep .mat-mdc-select-panel{scrollbar-width:thin;scrollbar-color:var(--md-sys-color-on-surface-variant) transparent}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar{width:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-thumb{background-color:var(--md-sys-color-on-surface-variant);border-radius:8px}:host ::ng-deep .mat-mdc-select-panel::-webkit-scrollbar-track{background-color:transparent}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
6360
6407
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { config: [{
6361
6408
  type: Input
6362
6409
  }], fieldSchemas: [{
@@ -10029,7 +10076,7 @@ class RuleNodeComponent {
10029
10076
  </div>
10030
10077
  }
10031
10078
  </div>
10032
- `, isInline: true, styles: [":host{--vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,.08));--vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,.18));--vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,.32))}.rule-node-container{position:relative;margin-bottom:8px}.rule-node{min-width:300px;border:1px solid var(--md-sys-color-outline-variant);cursor:pointer;transition:all .2s ease;position:relative;border-radius:8px}.rule-node:hover{border-color:var(--md-sys-color-primary);box-shadow:0 4px 8px var(--vb-shadow-low-color)}.rule-node.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.rule-node-container.has-errors .rule-node{border-color:var(--md-sys-color-error)}.node-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant)}.node-type{display:flex;align-items:center;gap:8px}.type-icon{font-size:20px;width:20px;height:20px}.type-icon.field-condition{color:var(--md-sys-color-primary)}.type-icon.boolean-group{color:var(--md-sys-color-secondary)}.type-icon.conditional-validator{color:var(--md-sys-color-tertiary)}.type-icon.collection-validation{color:var(--md-sys-color-error)}.type-label{font-weight:500;font-size:14px}.node-actions{display:flex;align-items:center;gap:4px}.error-badge{color:var(--md-sys-color-error);font-size:18px}.node-content{padding:12px}.field-condition-content,.boolean-group-content,.conditional-validator-content,.collection-validation-content{min-height:60px}.group-operator{display:flex;justify-content:center}.operator-select{width:120px}.metadata-preview{margin-top:12px;padding-top:12px;border-top:1px solid var(--md-sys-color-outline)}.metadata-chips{margin-bottom:8px}.metadata-chip{font-size:11px;height:20px}.code-chip{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.tag-chip{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.metadata-message{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.validation-errors{border-top:1px solid var(--md-sys-color-error);background:var(--md-sys-color-error-container);padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}.validation-error:last-child{margin-bottom:0}.validation-error.error{color:var(--md-sys-color-on-error-container)}.validation-error.warning{color:var(--md-sys-color-secondary)}.error-icon{font-size:14px;width:14px;height:14px}.children-container{margin-left:24px;position:relative}.children-connector{position:absolute;left:-12px;top:0;width:12px;height:24px}.connector-line{width:2px;height:100%;background:var(--md-sys-color-outline);margin-left:10px}.children-list{padding-left:12px;border-left:2px solid var(--md-sys-color-outline)}.child-wrapper{position:relative}.child-connector{display:flex;flex-direction:column;align-items:center;margin:8px 0}.child-connector .connector-line{width:2px;height:12px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary);padding:2px 6px;border-radius:8px;font-size:10px;font-weight:600;margin-top:-1px}.add-child-area{display:flex;justify-content:center;margin-top:16px;padding:8px;border:1px dashed var(--md-sys-color-outline);border-radius:8px;background:var(--md-sys-color-surface-variant)}.add-child-button{color:var(--md-sys-color-primary)}.level-1{margin-left:20px}.level-2{margin-left:40px}.level-3{margin-left:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.children-list.cdk-drop-list-dragging .child-wrapper:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.delete-action{color:var(--md-sys-color-error)}\n"], dependencies: [{ kind: "component", type: RuleNodeComponent, selector: "praxis-rule-node", inputs: ["node", "nodes", "fieldSchemas", "level", "isSelected", "validationErrors"], outputs: ["nodeClicked", "nodeUpdated", "nodeDeleted", "childAdded", "childMoved"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i3.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: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6$2.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: i6$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6$2.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: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i9$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i11$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: FieldConditionEditorComponent, selector: "praxis-field-condition-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }, { kind: "component", type: ConditionalValidatorEditorComponent, selector: "praxis-conditional-validator-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }, { kind: "component", type: CollectionValidatorEditorComponent, selector: "praxis-collection-validator-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10079
+ `, isInline: true, styles: [":host{--vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,.08));--vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,.18));--vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,.32))}.rule-node-container{position:relative;margin-bottom:8px;min-width:0;max-width:100%}.rule-node{width:100%;min-width:0;max-width:100%;box-sizing:border-box;border:1px solid var(--md-sys-color-outline-variant);cursor:pointer;transition:all .2s ease;position:relative;border-radius:8px}.rule-node:hover{border-color:var(--md-sys-color-primary);box-shadow:0 4px 8px var(--vb-shadow-low-color)}.rule-node.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.rule-node-container.has-errors .rule-node{border-color:var(--md-sys-color-error)}.node-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant)}.node-type{display:flex;align-items:center;gap:8px}.type-icon{font-size:20px;width:20px;height:20px}.type-icon.field-condition{color:var(--md-sys-color-primary)}.type-icon.boolean-group{color:var(--md-sys-color-secondary)}.type-icon.conditional-validator{color:var(--md-sys-color-tertiary)}.type-icon.collection-validation{color:var(--md-sys-color-error)}.type-label{font-weight:500;font-size:14px}.node-actions{display:flex;align-items:center;gap:4px}.error-badge{color:var(--md-sys-color-error);font-size:18px}.node-content{padding:12px}.field-condition-content,.boolean-group-content,.conditional-validator-content,.collection-validation-content{min-height:60px}.group-operator{display:flex;justify-content:center}.operator-select{width:120px}.metadata-preview{margin-top:12px;padding-top:12px;border-top:1px solid var(--md-sys-color-outline)}.metadata-chips{margin-bottom:8px}.metadata-chip{font-size:11px;height:20px}.code-chip{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.tag-chip{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.metadata-message{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.validation-errors{border-top:1px solid var(--md-sys-color-error);background:var(--md-sys-color-error-container);padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}.validation-error:last-child{margin-bottom:0}.validation-error.error{color:var(--md-sys-color-on-error-container)}.validation-error.warning{color:var(--md-sys-color-secondary)}.error-icon{font-size:14px;width:14px;height:14px}.children-container{margin-left:24px;position:relative}.children-connector{position:absolute;left:-12px;top:0;width:12px;height:24px}.connector-line{width:2px;height:100%;background:var(--md-sys-color-outline);margin-left:10px}.children-list{padding-left:12px;border-left:2px solid var(--md-sys-color-outline)}.child-wrapper{position:relative}.child-connector{display:flex;flex-direction:column;align-items:center;margin:8px 0}.child-connector .connector-line{width:2px;height:12px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary);padding:2px 6px;border-radius:8px;font-size:10px;font-weight:600;margin-top:-1px}.add-child-area{display:flex;justify-content:center;margin-top:16px;padding:8px;border:1px dashed var(--md-sys-color-outline);border-radius:8px;background:var(--md-sys-color-surface-variant)}.add-child-button{color:var(--md-sys-color-primary)}.level-1{margin-left:20px}.level-2{margin-left:40px}.level-3{margin-left:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.children-list.cdk-drop-list-dragging .child-wrapper:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.delete-action{color:var(--md-sys-color-error)}\n"], dependencies: [{ kind: "component", type: RuleNodeComponent, selector: "praxis-rule-node", inputs: ["node", "nodes", "fieldSchemas", "level", "isSelected", "validationErrors"], outputs: ["nodeClicked", "nodeUpdated", "nodeDeleted", "childAdded", "childMoved"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i3.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: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6$2.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: i6$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6$2.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: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i9$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i11$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: FieldConditionEditorComponent, selector: "praxis-field-condition-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }, { kind: "component", type: ConditionalValidatorEditorComponent, selector: "praxis-conditional-validator-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }, { kind: "component", type: CollectionValidatorEditorComponent, selector: "praxis-collection-validator-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10033
10080
  }
10034
10081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleNodeComponent, decorators: [{
10035
10082
  type: Component,
@@ -10316,7 +10363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10316
10363
  </div>
10317
10364
  }
10318
10365
  </div>
10319
- `, styles: [":host{--vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,.08));--vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,.18));--vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,.32))}.rule-node-container{position:relative;margin-bottom:8px}.rule-node{min-width:300px;border:1px solid var(--md-sys-color-outline-variant);cursor:pointer;transition:all .2s ease;position:relative;border-radius:8px}.rule-node:hover{border-color:var(--md-sys-color-primary);box-shadow:0 4px 8px var(--vb-shadow-low-color)}.rule-node.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.rule-node-container.has-errors .rule-node{border-color:var(--md-sys-color-error)}.node-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant)}.node-type{display:flex;align-items:center;gap:8px}.type-icon{font-size:20px;width:20px;height:20px}.type-icon.field-condition{color:var(--md-sys-color-primary)}.type-icon.boolean-group{color:var(--md-sys-color-secondary)}.type-icon.conditional-validator{color:var(--md-sys-color-tertiary)}.type-icon.collection-validation{color:var(--md-sys-color-error)}.type-label{font-weight:500;font-size:14px}.node-actions{display:flex;align-items:center;gap:4px}.error-badge{color:var(--md-sys-color-error);font-size:18px}.node-content{padding:12px}.field-condition-content,.boolean-group-content,.conditional-validator-content,.collection-validation-content{min-height:60px}.group-operator{display:flex;justify-content:center}.operator-select{width:120px}.metadata-preview{margin-top:12px;padding-top:12px;border-top:1px solid var(--md-sys-color-outline)}.metadata-chips{margin-bottom:8px}.metadata-chip{font-size:11px;height:20px}.code-chip{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.tag-chip{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.metadata-message{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.validation-errors{border-top:1px solid var(--md-sys-color-error);background:var(--md-sys-color-error-container);padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}.validation-error:last-child{margin-bottom:0}.validation-error.error{color:var(--md-sys-color-on-error-container)}.validation-error.warning{color:var(--md-sys-color-secondary)}.error-icon{font-size:14px;width:14px;height:14px}.children-container{margin-left:24px;position:relative}.children-connector{position:absolute;left:-12px;top:0;width:12px;height:24px}.connector-line{width:2px;height:100%;background:var(--md-sys-color-outline);margin-left:10px}.children-list{padding-left:12px;border-left:2px solid var(--md-sys-color-outline)}.child-wrapper{position:relative}.child-connector{display:flex;flex-direction:column;align-items:center;margin:8px 0}.child-connector .connector-line{width:2px;height:12px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary);padding:2px 6px;border-radius:8px;font-size:10px;font-weight:600;margin-top:-1px}.add-child-area{display:flex;justify-content:center;margin-top:16px;padding:8px;border:1px dashed var(--md-sys-color-outline);border-radius:8px;background:var(--md-sys-color-surface-variant)}.add-child-button{color:var(--md-sys-color-primary)}.level-1{margin-left:20px}.level-2{margin-left:40px}.level-3{margin-left:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.children-list.cdk-drop-list-dragging .child-wrapper:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.delete-action{color:var(--md-sys-color-error)}\n"] }]
10366
+ `, styles: [":host{--vb-shadow-low-color: var(--sicoob-shadow-low, rgba(0,0,0,.08));--vb-shadow-medium-color: var(--sicoob-shadow-medium, rgba(0,0,0,.18));--vb-shadow-high-color: var(--sicoob-shadow-high, rgba(0,0,0,.32))}.rule-node-container{position:relative;margin-bottom:8px;min-width:0;max-width:100%}.rule-node{width:100%;min-width:0;max-width:100%;box-sizing:border-box;border:1px solid var(--md-sys-color-outline-variant);cursor:pointer;transition:all .2s ease;position:relative;border-radius:8px}.rule-node:hover{border-color:var(--md-sys-color-primary);box-shadow:0 4px 8px var(--vb-shadow-low-color)}.rule-node.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.rule-node-container.has-errors .rule-node{border-color:var(--md-sys-color-error)}.node-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;border-bottom:1px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant)}.node-type{display:flex;align-items:center;gap:8px}.type-icon{font-size:20px;width:20px;height:20px}.type-icon.field-condition{color:var(--md-sys-color-primary)}.type-icon.boolean-group{color:var(--md-sys-color-secondary)}.type-icon.conditional-validator{color:var(--md-sys-color-tertiary)}.type-icon.collection-validation{color:var(--md-sys-color-error)}.type-label{font-weight:500;font-size:14px}.node-actions{display:flex;align-items:center;gap:4px}.error-badge{color:var(--md-sys-color-error);font-size:18px}.node-content{padding:12px}.field-condition-content,.boolean-group-content,.conditional-validator-content,.collection-validation-content{min-height:60px}.group-operator{display:flex;justify-content:center}.operator-select{width:120px}.metadata-preview{margin-top:12px;padding-top:12px;border-top:1px solid var(--md-sys-color-outline)}.metadata-chips{margin-bottom:8px}.metadata-chip{font-size:11px;height:20px}.code-chip{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.tag-chip{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.metadata-message{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.validation-errors{border-top:1px solid var(--md-sys-color-error);background:var(--md-sys-color-error-container);padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;margin-bottom:4px;font-size:12px}.validation-error:last-child{margin-bottom:0}.validation-error.error{color:var(--md-sys-color-on-error-container)}.validation-error.warning{color:var(--md-sys-color-secondary)}.error-icon{font-size:14px;width:14px;height:14px}.children-container{margin-left:24px;position:relative}.children-connector{position:absolute;left:-12px;top:0;width:12px;height:24px}.connector-line{width:2px;height:100%;background:var(--md-sys-color-outline);margin-left:10px}.children-list{padding-left:12px;border-left:2px solid var(--md-sys-color-outline)}.child-wrapper{position:relative}.child-connector{display:flex;flex-direction:column;align-items:center;margin:8px 0}.child-connector .connector-line{width:2px;height:12px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary);padding:2px 6px;border-radius:8px;font-size:10px;font-weight:600;margin-top:-1px}.add-child-area{display:flex;justify-content:center;margin-top:16px;padding:8px;border:1px dashed var(--md-sys-color-outline);border-radius:8px;background:var(--md-sys-color-surface-variant)}.add-child-button{color:var(--md-sys-color-primary)}.level-1{margin-left:20px}.level-2{margin-left:40px}.level-3{margin-left:60px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.children-list.cdk-drop-list-dragging .child-wrapper:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.delete-action{color:var(--md-sys-color-error)}\n"] }]
10320
10367
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { node: [{
10321
10368
  type: Input
10322
10369
  }], nodes: [{
@@ -10702,7 +10749,7 @@ class RuleCanvasComponent {
10702
10749
  }
10703
10750
  </div>
10704
10751
  </div>
10705
- `, isInline: true, styles: [":host{display:block;height:100%}.rule-canvas{position:relative;height:100%;width:100%;background:var(--md-sys-color-surface);border:none;border-radius:0;padding:8px 10px;transition:all .3s ease;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:auto;gap:6px}.rule-canvas.drag-over{border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.condition-validation-panel{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);flex-shrink:0}.condition-validation-panel.blocking{border-color:color-mix(in srgb,var(--md-sys-color-error) 54%,transparent);background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,transparent);color:var(--md-sys-color-on-error-container)}.condition-validation-panel mat-icon{font-size:20px;width:20px;height:20px;color:var(--md-sys-color-error);flex:0 0 auto}.condition-validation-panel strong{display:block;font-size:13px;line-height:1.25;font-weight:600}.condition-validation-panel p{margin:2px 0 0;font-size:12px;line-height:1.35;color:inherit}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;text-align:center}.empty-state-content{max-width:400px}.empty-icon{font-size:64px;width:64px;height:64px;color:var(--md-sys-color-on-surface-variant);margin-bottom:16px}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface);font-weight:500}.empty-state p{margin:0 0 24px;color:var(--md-sys-color-on-surface-variant);line-height:1.4}.empty-state-content.condition-only>p:not(.condition-only-copy){display:none}.rule-tree{display:flex;flex-direction:column;gap:10px;flex:1}.root-rule-container{position:relative;padding-bottom:8px}.root-connector{position:absolute;left:12px;top:100%;height:16px;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;pointer-events:none}.connector-line{width:2px;height:16px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600;margin-top:-8px;pointer-events:all}.drop-zone-overlay{position:absolute;inset:0;background:var(--md-sys-color-primary-container);border:3px dashed var(--md-sys-color-primary);border-radius:12px;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-authoring-hover, 300);animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:.6}50%{opacity:1}}.drop-zone-content{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--md-sys-color-primary);font-weight:500}.drop-zone-content mat-icon{font-size:48px;width:48px;height:48px}.floating-add-menu{position:absolute;bottom:24px;right:24px;z-index:var(--praxis-layer-authoring-toolbar, 340)}.main-add-button{transition:transform .3s ease}.floating-add-menu.expanded .main-add-button{transform:rotate(45deg)}.add-menu-options{position:absolute;bottom:64px;right:0;display:flex;flex-direction:column;gap:8px;animation:slideUp .3s ease}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.add-option-button{animation:fadeIn .3s ease;animation-fill-mode:both}.add-option-button:nth-child(1){animation-delay:.1s}.add-option-button:nth-child(2){animation-delay:.15s}.add-option-button:nth-child(3){animation-delay:.2s}.add-option-button:nth-child(4){animation-delay:.25s}.add-option-button:nth-child(5){animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@media(max-width:768px){.rule-canvas{padding:16px}.floating-add-menu{bottom:16px;right:16px}}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.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.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "component", type: RuleNodeComponent, selector: "praxis-rule-node", inputs: ["node", "nodes", "fieldSchemas", "level", "isSelected", "validationErrors"], outputs: ["nodeClicked", "nodeUpdated", "nodeDeleted", "childAdded", "childMoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10752
+ `, isInline: true, styles: [":host{display:block;min-width:0;max-width:100%;height:100%}.rule-canvas{position:relative;height:100%;width:100%;min-width:0;max-width:100%;background:var(--md-sys-color-surface);border:none;border-radius:0;padding:8px 10px;transition:all .3s ease;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:auto;gap:6px}.rule-canvas.drag-over{border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.condition-validation-panel{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);flex-shrink:0}.condition-validation-panel.blocking{border-color:color-mix(in srgb,var(--md-sys-color-error) 54%,transparent);background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,transparent);color:var(--md-sys-color-on-error-container)}.condition-validation-panel mat-icon{font-size:20px;width:20px;height:20px;color:var(--md-sys-color-error);flex:0 0 auto}.condition-validation-panel strong{display:block;font-size:13px;line-height:1.25;font-weight:600}.condition-validation-panel p{margin:2px 0 0;font-size:12px;line-height:1.35;color:inherit}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;text-align:center}.empty-state-content{max-width:400px}.empty-icon{font-size:64px;width:64px;height:64px;color:var(--md-sys-color-on-surface-variant);margin-bottom:16px}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface);font-weight:500}.empty-state p{margin:0 0 24px;color:var(--md-sys-color-on-surface-variant);line-height:1.4}.empty-state-content.condition-only>p:not(.condition-only-copy){display:none}.rule-tree{display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;box-sizing:border-box;gap:10px;flex:1}.root-rule-container{position:relative;width:100%;min-width:0;max-width:100%;box-sizing:border-box;padding-bottom:8px}.root-connector{position:absolute;left:12px;top:100%;height:16px;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;pointer-events:none}.connector-line{width:2px;height:16px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600;margin-top:-8px;pointer-events:all}.drop-zone-overlay{position:absolute;inset:0;background:var(--md-sys-color-primary-container);border:3px dashed var(--md-sys-color-primary);border-radius:12px;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-authoring-hover, 300);animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:.6}50%{opacity:1}}.drop-zone-content{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--md-sys-color-primary);font-weight:500}.drop-zone-content mat-icon{font-size:48px;width:48px;height:48px}.floating-add-menu{position:absolute;bottom:24px;right:24px;z-index:var(--praxis-layer-authoring-toolbar, 340)}.main-add-button{transition:transform .3s ease}.floating-add-menu.expanded .main-add-button{transform:rotate(45deg)}.add-menu-options{position:absolute;bottom:64px;right:0;display:flex;flex-direction:column;gap:8px;animation:slideUp .3s ease}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.add-option-button{animation:fadeIn .3s ease;animation-fill-mode:both}.add-option-button:nth-child(1){animation-delay:.1s}.add-option-button:nth-child(2){animation-delay:.15s}.add-option-button:nth-child(3){animation-delay:.2s}.add-option-button:nth-child(4){animation-delay:.25s}.add-option-button:nth-child(5){animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@media(max-width:768px){.rule-canvas{padding:16px}.floating-add-menu{bottom:16px;right:16px}}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.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.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i5.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "component", type: RuleNodeComponent, selector: "praxis-rule-node", inputs: ["node", "nodes", "fieldSchemas", "level", "isSelected", "validationErrors"], outputs: ["nodeClicked", "nodeUpdated", "nodeDeleted", "childAdded", "childMoved"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10706
10753
  }
10707
10754
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleCanvasComponent, decorators: [{
10708
10755
  type: Component,
@@ -10827,7 +10874,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10827
10874
  }
10828
10875
  </div>
10829
10876
  </div>
10830
- `, styles: [":host{display:block;height:100%}.rule-canvas{position:relative;height:100%;width:100%;background:var(--md-sys-color-surface);border:none;border-radius:0;padding:8px 10px;transition:all .3s ease;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:auto;gap:6px}.rule-canvas.drag-over{border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.condition-validation-panel{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);flex-shrink:0}.condition-validation-panel.blocking{border-color:color-mix(in srgb,var(--md-sys-color-error) 54%,transparent);background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,transparent);color:var(--md-sys-color-on-error-container)}.condition-validation-panel mat-icon{font-size:20px;width:20px;height:20px;color:var(--md-sys-color-error);flex:0 0 auto}.condition-validation-panel strong{display:block;font-size:13px;line-height:1.25;font-weight:600}.condition-validation-panel p{margin:2px 0 0;font-size:12px;line-height:1.35;color:inherit}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;text-align:center}.empty-state-content{max-width:400px}.empty-icon{font-size:64px;width:64px;height:64px;color:var(--md-sys-color-on-surface-variant);margin-bottom:16px}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface);font-weight:500}.empty-state p{margin:0 0 24px;color:var(--md-sys-color-on-surface-variant);line-height:1.4}.empty-state-content.condition-only>p:not(.condition-only-copy){display:none}.rule-tree{display:flex;flex-direction:column;gap:10px;flex:1}.root-rule-container{position:relative;padding-bottom:8px}.root-connector{position:absolute;left:12px;top:100%;height:16px;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;pointer-events:none}.connector-line{width:2px;height:16px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600;margin-top:-8px;pointer-events:all}.drop-zone-overlay{position:absolute;inset:0;background:var(--md-sys-color-primary-container);border:3px dashed var(--md-sys-color-primary);border-radius:12px;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-authoring-hover, 300);animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:.6}50%{opacity:1}}.drop-zone-content{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--md-sys-color-primary);font-weight:500}.drop-zone-content mat-icon{font-size:48px;width:48px;height:48px}.floating-add-menu{position:absolute;bottom:24px;right:24px;z-index:var(--praxis-layer-authoring-toolbar, 340)}.main-add-button{transition:transform .3s ease}.floating-add-menu.expanded .main-add-button{transform:rotate(45deg)}.add-menu-options{position:absolute;bottom:64px;right:0;display:flex;flex-direction:column;gap:8px;animation:slideUp .3s ease}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.add-option-button{animation:fadeIn .3s ease;animation-fill-mode:both}.add-option-button:nth-child(1){animation-delay:.1s}.add-option-button:nth-child(2){animation-delay:.15s}.add-option-button:nth-child(3){animation-delay:.2s}.add-option-button:nth-child(4){animation-delay:.25s}.add-option-button:nth-child(5){animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@media(max-width:768px){.rule-canvas{padding:16px}.floating-add-menu{bottom:16px;right:16px}}\n"] }]
10877
+ `, styles: [":host{display:block;min-width:0;max-width:100%;height:100%}.rule-canvas{position:relative;height:100%;width:100%;min-width:0;max-width:100%;background:var(--md-sys-color-surface);border:none;border-radius:0;padding:8px 10px;transition:all .3s ease;box-sizing:border-box;display:flex;flex-direction:column;overflow-y:auto;gap:6px}.rule-canvas.drag-over{border:1px solid var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.condition-validation-panel{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);flex-shrink:0}.condition-validation-panel.blocking{border-color:color-mix(in srgb,var(--md-sys-color-error) 54%,transparent);background:color-mix(in srgb,var(--md-sys-color-error-container) 72%,transparent);color:var(--md-sys-color-on-error-container)}.condition-validation-panel mat-icon{font-size:20px;width:20px;height:20px;color:var(--md-sys-color-error);flex:0 0 auto}.condition-validation-panel strong{display:block;font-size:13px;line-height:1.25;font-weight:600}.condition-validation-panel p{margin:2px 0 0;font-size:12px;line-height:1.35;color:inherit}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;text-align:center}.empty-state-content{max-width:400px}.empty-icon{font-size:64px;width:64px;height:64px;color:var(--md-sys-color-on-surface-variant);margin-bottom:16px}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface);font-weight:500}.empty-state p{margin:0 0 24px;color:var(--md-sys-color-on-surface-variant);line-height:1.4}.empty-state-content.condition-only>p:not(.condition-only-copy){display:none}.rule-tree{display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;box-sizing:border-box;gap:10px;flex:1}.root-rule-container{position:relative;width:100%;min-width:0;max-width:100%;box-sizing:border-box;padding-bottom:8px}.root-connector{position:absolute;left:12px;top:100%;height:16px;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;pointer-events:none}.connector-line{width:2px;height:16px;background:var(--md-sys-color-outline)}.connector-operator{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);padding:2px 6px;border-radius:10px;font-size:10px;font-weight:600;margin-top:-8px;pointer-events:all}.drop-zone-overlay{position:absolute;inset:0;background:var(--md-sys-color-primary-container);border:3px dashed var(--md-sys-color-primary);border-radius:12px;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-authoring-hover, 300);animation:pulse 1s infinite}@keyframes pulse{0%,to{opacity:.6}50%{opacity:1}}.drop-zone-content{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--md-sys-color-primary);font-weight:500}.drop-zone-content mat-icon{font-size:48px;width:48px;height:48px}.floating-add-menu{position:absolute;bottom:24px;right:24px;z-index:var(--praxis-layer-authoring-toolbar, 340)}.main-add-button{transition:transform .3s ease}.floating-add-menu.expanded .main-add-button{transform:rotate(45deg)}.add-menu-options{position:absolute;bottom:64px;right:0;display:flex;flex-direction:column;gap:8px;animation:slideUp .3s ease}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.add-option-button{animation:fadeIn .3s ease;animation-fill-mode:both}.add-option-button:nth-child(1){animation-delay:.1s}.add-option-button:nth-child(2){animation-delay:.15s}.add-option-button:nth-child(3){animation-delay:.2s}.add-option-button:nth-child(4){animation-delay:.25s}.add-option-button:nth-child(5){animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}@media(max-width:768px){.rule-canvas{padding:16px}.floating-add-menu{bottom:16px;right:16px}}\n"] }]
10831
10878
  }], ctorParameters: () => [{ type: i1$2.PraxisI18nService, decorators: [{
10832
10879
  type: Optional
10833
10880
  }] }], propDecorators: { conditionOnly: [{
@@ -13767,7 +13814,7 @@ class RuleEditorComponent {
13767
13814
  (change)="onFileSelected($event)"
13768
13815
  />
13769
13816
  </div>
13770
- `, isInline: true, styles: [".rule-editor-container{--_pvb-editor-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-editor-accent-soft: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);--_pvb-editor-surface: var(--md-sys-color-surface, var(--sicoob-background-primary));--_pvb-editor-surface-low: var(--md-sys-color-surface-container-low, var(--sicoob-background-secondary));--_pvb-editor-surface-strong: var(--md-sys-color-surface-container, var(--sicoob-background-tertiary));--_pvb-editor-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-editor-text: var(--md-sys-color-on-surface, var(--sicoob-text-default));--_pvb-editor-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;height:100%;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-editor-accent) 12%,transparent) 0%,transparent 32%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-editor-surface-low) 96%,black 4%),color-mix(in srgb,var(--_pvb-editor-surface) 98%,black 2%));overflow:hidden;position:relative;color:var(--_pvb-editor-text)}.rule-editor-container.embedded{height:100%}.condition-only-editor{display:flex;flex-direction:column;height:100%;min-height:360px;overflow:hidden}.condition-only-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%)}.condition-only-header h3{margin:0;font-size:16px;font-weight:600}.condition-only-header p{margin:4px 0 0;font-size:12px;color:var(--_pvb-editor-text-soft)}.condition-only-canvas{flex:1;min-height:0}.builder-shell-header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:54px;padding:0 18px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%);flex-shrink:0}.shell-brand{display:flex;align-items:center;gap:10px;min-width:0}.shell-menu{margin-right:2px}.brand-mark{width:32px;height:32px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-editor-accent) 24%,transparent)}.brand-mark mat-icon{display:flex;align-items:center;justify-content:center;font-size:18px;width:18px;height:18px;color:var(--_pvb-editor-accent)}.brand-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.brand-title{font-size:14px;font-weight:700}.brand-breadcrumb{font-size:12px;color:var(--_pvb-editor-text-soft)}.shell-nav{display:inline-flex;align-items:center;gap:10px;padding:4px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);border:1px solid color-mix(in srgb,var(--_pvb-editor-border) 56%,transparent)}.nav-pill{min-width:96px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--_pvb-editor-text-soft);font:inherit;font-size:13px;cursor:default}.nav-pill.active{color:var(--_pvb-editor-text);background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_pvb-editor-accent) 34%,transparent)}.shell-status{display:flex;align-items:center;gap:6px}.unsaved-indicator{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--_pvb-editor-text);margin-right:6px}.unsaved-dot{width:8px;height:8px;border-radius:999px;background:#f0b429;box-shadow:0 0 12px #f0b42973}.danger-action{color:var(--md-sys-color-error)}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height:0;min-width:0;transition:grid-template-columns .2s ease}.editor-content-grid.list-closed{grid-template-columns:0 1fr}.rule-list-panel{border-right:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);display:flex;flex-direction:column;overflow:hidden;min-width:0}.rule-definition-panel{background:radial-gradient(circle at 50% 0%,color-mix(in srgb,var(--_pvb-editor-accent) 8%,transparent) 0%,transparent 26%),transparent;overflow:hidden;display:flex;flex-direction:column;position:relative;min-height:0;min-width:0;flex:1}.empty-state,.unsupported-node{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--_pvb-editor-text-soft);gap:16px;text-align:center;padding:32px}.empty-state mat-icon,.unsupported-node mat-icon{font-size:64px;width:64px;height:64px;opacity:.9;color:var(--_pvb-editor-accent)}.status-bar{height:32px;background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 92%,black 8%);border-top:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:12px;color:var(--_pvb-editor-text-soft);flex-shrink:0}.status-left,.status-center{display:flex;align-items:center;gap:8px}.validation-status{display:flex;align-items:center;gap:4px}.validation-status.error{color:var(--md-sys-color-error)}.validation-status.success{color:var(--md-sys-color-tertiary)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.debug-panel{position:absolute;top:0;right:0;bottom:0;width:400px;background:var(--_pvb-editor-surface);border-left:1px solid var(--_pvb-editor-border);box-shadow:-2px 0 8px #0000001a;z-index:var(--praxis-layer-authoring-toolbar, 340);display:flex;flex-direction:column}.debug-header{padding:8px 16px;border-bottom:1px solid var(--_pvb-editor-border);display:flex;align-items:center;justify-content:space-between;background:var(--_pvb-editor-surface-strong)}.debug-content{flex:1;overflow:auto;padding:16px;font-family:monospace;font-size:12px}@media(max-width:1180px){.builder-shell-header{flex-wrap:wrap;justify-content:flex-start;padding:10px 14px}.shell-nav{order:3;width:100%;justify-content:center}.shell-status{margin-left:auto}}@media(max-width:720px){.editor-content-grid,.editor-content-grid.list-closed{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(360px,1fr);overflow-y:auto}.rule-list-panel{max-height:min(360px,48vh);border-right:0;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent)}.rule-definition-panel{min-height:360px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.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: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i9$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6$2.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: i6$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: RuleListComponent, selector: "praxis-rule-list", inputs: ["rules", "selectedRuleId", "nodeMap", "validationErrors"], outputs: ["ruleSelected", "ruleDeleted", "ruleDuplicated", "ruleAdded", "aiRequested"] }, { kind: "component", type: RuleDefinitionComponent, selector: "praxis-rule-definition", inputs: ["ruleNode", "fieldSchemas", "targetSchemas", "propertySchema"], outputs: ["ruleChanged"] }, { kind: "component", type: RuleCanvasComponent, selector: "praxis-rule-canvas", inputs: ["conditionOnly", "state", "fieldSchemas", "validationErrors"], outputs: ["nodeSelected", "nodeAdded", "nodeUpdated", "nodeRemoved"] }, { kind: "pipe", type: i12$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13817
+ `, isInline: true, styles: [":host{display:block;min-width:0;max-width:100%}.rule-editor-container{--_pvb-editor-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-editor-accent-soft: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);--_pvb-editor-surface: var(--md-sys-color-surface, var(--sicoob-background-primary));--_pvb-editor-surface-low: var(--md-sys-color-surface-container-low, var(--sicoob-background-secondary));--_pvb-editor-surface-strong: var(--md-sys-color-surface-container, var(--sicoob-background-tertiary));--_pvb-editor-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-editor-text: var(--md-sys-color-on-surface, var(--sicoob-text-default));--_pvb-editor-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;box-sizing:border-box;height:100%;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-editor-accent) 12%,transparent) 0%,transparent 32%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-editor-surface-low) 96%,black 4%),color-mix(in srgb,var(--_pvb-editor-surface) 98%,black 2%));overflow:hidden;position:relative;color:var(--_pvb-editor-text)}.rule-editor-container.embedded{height:100%}.condition-only-editor{display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;height:100%;min-height:360px;overflow:hidden}.condition-only-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%)}.condition-only-header h3{margin:0;font-size:16px;font-weight:600}.condition-only-header p{margin:4px 0 0;font-size:12px;color:var(--_pvb-editor-text-soft)}.condition-only-canvas{flex:1;width:100%;min-width:0;max-width:100%;min-height:0}.builder-shell-header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:54px;padding:0 18px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%);flex-shrink:0}.shell-brand{display:flex;align-items:center;gap:10px;min-width:0}.shell-menu{margin-right:2px}.brand-mark{width:32px;height:32px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-editor-accent) 24%,transparent)}.brand-mark mat-icon{display:flex;align-items:center;justify-content:center;font-size:18px;width:18px;height:18px;color:var(--_pvb-editor-accent)}.brand-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.brand-title{font-size:14px;font-weight:700}.brand-breadcrumb{font-size:12px;color:var(--_pvb-editor-text-soft)}.shell-nav{display:inline-flex;align-items:center;gap:10px;padding:4px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);border:1px solid color-mix(in srgb,var(--_pvb-editor-border) 56%,transparent)}.nav-pill{min-width:96px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--_pvb-editor-text-soft);font:inherit;font-size:13px;cursor:default}.nav-pill.active{color:var(--_pvb-editor-text);background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_pvb-editor-accent) 34%,transparent)}.shell-status{display:flex;align-items:center;gap:6px}.unsaved-indicator{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--_pvb-editor-text);margin-right:6px}.unsaved-dot{width:8px;height:8px;border-radius:999px;background:#f0b429;box-shadow:0 0 12px #f0b42973}.danger-action{color:var(--md-sys-color-error)}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height:0;min-width:0;transition:grid-template-columns .2s ease}.editor-content-grid.list-closed{grid-template-columns:0 1fr}.rule-list-panel{border-right:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);display:flex;flex-direction:column;overflow:hidden;min-width:0}.rule-definition-panel{background:radial-gradient(circle at 50% 0%,color-mix(in srgb,var(--_pvb-editor-accent) 8%,transparent) 0%,transparent 26%),transparent;overflow:hidden;display:flex;flex-direction:column;position:relative;min-height:0;min-width:0;flex:1}.empty-state,.unsupported-node{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--_pvb-editor-text-soft);gap:16px;text-align:center;padding:32px}.empty-state mat-icon,.unsupported-node mat-icon{font-size:64px;width:64px;height:64px;opacity:.9;color:var(--_pvb-editor-accent)}.status-bar{height:32px;background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 92%,black 8%);border-top:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:12px;color:var(--_pvb-editor-text-soft);flex-shrink:0}.status-left,.status-center{display:flex;align-items:center;gap:8px}.validation-status{display:flex;align-items:center;gap:4px}.validation-status.error{color:var(--md-sys-color-error)}.validation-status.success{color:var(--md-sys-color-tertiary)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.debug-panel{position:absolute;top:0;right:0;bottom:0;width:400px;background:var(--_pvb-editor-surface);border-left:1px solid var(--_pvb-editor-border);box-shadow:-2px 0 8px #0000001a;z-index:var(--praxis-layer-authoring-toolbar, 340);display:flex;flex-direction:column}.debug-header{padding:8px 16px;border-bottom:1px solid var(--_pvb-editor-border);display:flex;align-items:center;justify-content:space-between;background:var(--_pvb-editor-surface-strong)}.debug-content{flex:1;overflow:auto;padding:16px;font-family:monospace;font-size:12px}@media(max-width:1180px){.builder-shell-header{flex-wrap:wrap;justify-content:flex-start;padding:10px 14px}.shell-nav{order:3;width:100%;justify-content:center}.shell-status{margin-left:auto}}@media(max-width:720px){.editor-content-grid,.editor-content-grid.list-closed{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(360px,1fr);overflow-y:auto}.rule-list-panel{max-height:min(360px,48vh);border-right:0;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent)}.rule-definition-panel{min-height:360px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.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: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatBadgeModule }, { kind: "directive", type: i9$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6$2.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: i6$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: RuleListComponent, selector: "praxis-rule-list", inputs: ["rules", "selectedRuleId", "nodeMap", "validationErrors"], outputs: ["ruleSelected", "ruleDeleted", "ruleDuplicated", "ruleAdded", "aiRequested"] }, { kind: "component", type: RuleDefinitionComponent, selector: "praxis-rule-definition", inputs: ["ruleNode", "fieldSchemas", "targetSchemas", "propertySchema"], outputs: ["ruleChanged"] }, { kind: "component", type: RuleCanvasComponent, selector: "praxis-rule-canvas", inputs: ["conditionOnly", "state", "fieldSchemas", "validationErrors"], outputs: ["nodeSelected", "nodeAdded", "nodeUpdated", "nodeRemoved"] }, { kind: "pipe", type: i12$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13771
13818
  }
13772
13819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleEditorComponent, decorators: [{
13773
13820
  type: Component,
@@ -13992,7 +14039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13992
14039
  (change)="onFileSelected($event)"
13993
14040
  />
13994
14041
  </div>
13995
- `, styles: [".rule-editor-container{--_pvb-editor-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-editor-accent-soft: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);--_pvb-editor-surface: var(--md-sys-color-surface, var(--sicoob-background-primary));--_pvb-editor-surface-low: var(--md-sys-color-surface-container-low, var(--sicoob-background-secondary));--_pvb-editor-surface-strong: var(--md-sys-color-surface-container, var(--sicoob-background-tertiary));--_pvb-editor-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-editor-text: var(--md-sys-color-on-surface, var(--sicoob-text-default));--_pvb-editor-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;height:100%;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-editor-accent) 12%,transparent) 0%,transparent 32%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-editor-surface-low) 96%,black 4%),color-mix(in srgb,var(--_pvb-editor-surface) 98%,black 2%));overflow:hidden;position:relative;color:var(--_pvb-editor-text)}.rule-editor-container.embedded{height:100%}.condition-only-editor{display:flex;flex-direction:column;height:100%;min-height:360px;overflow:hidden}.condition-only-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%)}.condition-only-header h3{margin:0;font-size:16px;font-weight:600}.condition-only-header p{margin:4px 0 0;font-size:12px;color:var(--_pvb-editor-text-soft)}.condition-only-canvas{flex:1;min-height:0}.builder-shell-header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:54px;padding:0 18px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%);flex-shrink:0}.shell-brand{display:flex;align-items:center;gap:10px;min-width:0}.shell-menu{margin-right:2px}.brand-mark{width:32px;height:32px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-editor-accent) 24%,transparent)}.brand-mark mat-icon{display:flex;align-items:center;justify-content:center;font-size:18px;width:18px;height:18px;color:var(--_pvb-editor-accent)}.brand-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.brand-title{font-size:14px;font-weight:700}.brand-breadcrumb{font-size:12px;color:var(--_pvb-editor-text-soft)}.shell-nav{display:inline-flex;align-items:center;gap:10px;padding:4px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);border:1px solid color-mix(in srgb,var(--_pvb-editor-border) 56%,transparent)}.nav-pill{min-width:96px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--_pvb-editor-text-soft);font:inherit;font-size:13px;cursor:default}.nav-pill.active{color:var(--_pvb-editor-text);background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_pvb-editor-accent) 34%,transparent)}.shell-status{display:flex;align-items:center;gap:6px}.unsaved-indicator{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--_pvb-editor-text);margin-right:6px}.unsaved-dot{width:8px;height:8px;border-radius:999px;background:#f0b429;box-shadow:0 0 12px #f0b42973}.danger-action{color:var(--md-sys-color-error)}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height:0;min-width:0;transition:grid-template-columns .2s ease}.editor-content-grid.list-closed{grid-template-columns:0 1fr}.rule-list-panel{border-right:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);display:flex;flex-direction:column;overflow:hidden;min-width:0}.rule-definition-panel{background:radial-gradient(circle at 50% 0%,color-mix(in srgb,var(--_pvb-editor-accent) 8%,transparent) 0%,transparent 26%),transparent;overflow:hidden;display:flex;flex-direction:column;position:relative;min-height:0;min-width:0;flex:1}.empty-state,.unsupported-node{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--_pvb-editor-text-soft);gap:16px;text-align:center;padding:32px}.empty-state mat-icon,.unsupported-node mat-icon{font-size:64px;width:64px;height:64px;opacity:.9;color:var(--_pvb-editor-accent)}.status-bar{height:32px;background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 92%,black 8%);border-top:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:12px;color:var(--_pvb-editor-text-soft);flex-shrink:0}.status-left,.status-center{display:flex;align-items:center;gap:8px}.validation-status{display:flex;align-items:center;gap:4px}.validation-status.error{color:var(--md-sys-color-error)}.validation-status.success{color:var(--md-sys-color-tertiary)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.debug-panel{position:absolute;top:0;right:0;bottom:0;width:400px;background:var(--_pvb-editor-surface);border-left:1px solid var(--_pvb-editor-border);box-shadow:-2px 0 8px #0000001a;z-index:var(--praxis-layer-authoring-toolbar, 340);display:flex;flex-direction:column}.debug-header{padding:8px 16px;border-bottom:1px solid var(--_pvb-editor-border);display:flex;align-items:center;justify-content:space-between;background:var(--_pvb-editor-surface-strong)}.debug-content{flex:1;overflow:auto;padding:16px;font-family:monospace;font-size:12px}@media(max-width:1180px){.builder-shell-header{flex-wrap:wrap;justify-content:flex-start;padding:10px 14px}.shell-nav{order:3;width:100%;justify-content:center}.shell-status{margin-left:auto}}@media(max-width:720px){.editor-content-grid,.editor-content-grid.list-closed{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(360px,1fr);overflow-y:auto}.rule-list-panel{max-height:min(360px,48vh);border-right:0;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent)}.rule-definition-panel{min-height:360px}}\n"] }]
14042
+ `, styles: [":host{display:block;min-width:0;max-width:100%}.rule-editor-container{--_pvb-editor-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-editor-accent-soft: color-mix(in srgb, var(--_pvb-editor-accent) 16%, transparent);--_pvb-editor-surface: var(--md-sys-color-surface, var(--sicoob-background-primary));--_pvb-editor-surface-low: var(--md-sys-color-surface-container-low, var(--sicoob-background-secondary));--_pvb-editor-surface-strong: var(--md-sys-color-surface-container, var(--sicoob-background-tertiary));--_pvb-editor-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-editor-text: var(--md-sys-color-on-surface, var(--sicoob-text-default));--_pvb-editor-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;box-sizing:border-box;height:100%;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-editor-accent) 12%,transparent) 0%,transparent 32%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-editor-surface-low) 96%,black 4%),color-mix(in srgb,var(--_pvb-editor-surface) 98%,black 2%));overflow:hidden;position:relative;color:var(--_pvb-editor-text)}.rule-editor-container.embedded{height:100%}.condition-only-editor{display:flex;flex-direction:column;width:100%;min-width:0;max-width:100%;height:100%;min-height:360px;overflow:hidden}.condition-only-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%)}.condition-only-header h3{margin:0;font-size:16px;font-weight:600}.condition-only-header p{margin:4px 0 0;font-size:12px;color:var(--_pvb-editor-text-soft)}.condition-only-canvas{flex:1;width:100%;min-width:0;max-width:100%;min-height:0}.builder-shell-header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:54px;padding:0 18px;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 94%,black 6%);flex-shrink:0}.shell-brand{display:flex;align-items:center;gap:10px;min-width:0}.shell-menu{margin-right:2px}.brand-mark{width:32px;height:32px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-editor-accent) 24%,transparent)}.brand-mark mat-icon{display:flex;align-items:center;justify-content:center;font-size:18px;width:18px;height:18px;color:var(--_pvb-editor-accent)}.brand-copy{display:flex;flex-direction:column;gap:2px;min-width:0}.brand-title{font-size:14px;font-weight:700}.brand-breadcrumb{font-size:12px;color:var(--_pvb-editor-text-soft)}.shell-nav{display:inline-flex;align-items:center;gap:10px;padding:4px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);border:1px solid color-mix(in srgb,var(--_pvb-editor-border) 56%,transparent)}.nav-pill{min-width:96px;height:34px;border:0;border-radius:10px;background:transparent;color:var(--_pvb-editor-text-soft);font:inherit;font-size:13px;cursor:default}.nav-pill.active{color:var(--_pvb-editor-text);background:color-mix(in srgb,var(--_pvb-editor-accent) 16%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--_pvb-editor-accent) 34%,transparent)}.shell-status{display:flex;align-items:center;gap:6px}.unsaved-indicator{display:inline-flex;align-items:center;gap:8px;font-size:13px;color:var(--_pvb-editor-text);margin-right:6px}.unsaved-dot{width:8px;height:8px;border-radius:999px;background:#f0b429;box-shadow:0 0 12px #f0b42973}.danger-action{color:var(--md-sys-color-error)}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height:0;min-width:0;transition:grid-template-columns .2s ease}.editor-content-grid.list-closed{grid-template-columns:0 1fr}.rule-list-panel{border-right:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);background:color-mix(in srgb,var(--_pvb-editor-surface-low) 94%,black 6%);display:flex;flex-direction:column;overflow:hidden;min-width:0}.rule-definition-panel{background:radial-gradient(circle at 50% 0%,color-mix(in srgb,var(--_pvb-editor-accent) 8%,transparent) 0%,transparent 26%),transparent;overflow:hidden;display:flex;flex-direction:column;position:relative;min-height:0;min-width:0;flex:1}.empty-state,.unsupported-node{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--_pvb-editor-text-soft);gap:16px;text-align:center;padding:32px}.empty-state mat-icon,.unsupported-node mat-icon{font-size:64px;width:64px;height:64px;opacity:.9;color:var(--_pvb-editor-accent)}.status-bar{height:32px;background:color-mix(in srgb,var(--_pvb-editor-surface-strong) 92%,black 8%);border-top:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent);display:flex;align-items:center;justify-content:space-between;padding:0 16px;font-size:12px;color:var(--_pvb-editor-text-soft);flex-shrink:0}.status-left,.status-center{display:flex;align-items:center;gap:8px}.validation-status{display:flex;align-items:center;gap:4px}.validation-status.error{color:var(--md-sys-color-error)}.validation-status.success{color:var(--md-sys-color-tertiary)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.debug-panel{position:absolute;top:0;right:0;bottom:0;width:400px;background:var(--_pvb-editor-surface);border-left:1px solid var(--_pvb-editor-border);box-shadow:-2px 0 8px #0000001a;z-index:var(--praxis-layer-authoring-toolbar, 340);display:flex;flex-direction:column}.debug-header{padding:8px 16px;border-bottom:1px solid var(--_pvb-editor-border);display:flex;align-items:center;justify-content:space-between;background:var(--_pvb-editor-surface-strong)}.debug-content{flex:1;overflow:auto;padding:16px;font-family:monospace;font-size:12px}@media(max-width:1180px){.builder-shell-header{flex-wrap:wrap;justify-content:flex-start;padding:10px 14px}.shell-nav{order:3;width:100%;justify-content:center}.shell-status{margin-left:auto}}@media(max-width:720px){.editor-content-grid,.editor-content-grid.list-closed{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(360px,1fr);overflow-y:auto}.rule-list-panel{max-height:min(360px,48vh);border-right:0;border-bottom:1px solid color-mix(in srgb,var(--_pvb-editor-border) 74%,transparent)}.rule-definition-panel{min-height:360px}}\n"] }]
13996
14043
  }], ctorParameters: () => [{ type: RuleBuilderService }, { type: FieldSchemaService }, { type: i3$1.AiResponseValidatorService }, { type: i4.MatSnackBar }, { type: i1.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i1$2.PraxisI18nService, decorators: [{
13997
14044
  type: Optional
13998
14045
  }] }], propDecorators: { embedded: [{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/visual-builder",
3
- "version": "9.0.5-rc.4",
3
+ "version": "9.0.5-rc.40",
4
4
  "description": "Visual rule and expression builder for Praxis UI with JSON Logic authoring, validation and context variables.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -8,10 +8,10 @@
8
8
  "@angular/cdk": "^21.0.0",
9
9
  "@angular/material": "^21.0.0",
10
10
  "@angular/forms": "^21.0.0",
11
- "@praxisui/settings-panel": "^9.0.5-rc.4",
12
- "@praxisui/ai": "^9.0.5-rc.4",
13
- "@praxisui/core": "^9.0.5-rc.4",
14
- "@praxisui/metadata-editor": "^9.0.5-rc.4",
11
+ "@praxisui/settings-panel": "^9.0.5-rc.40",
12
+ "@praxisui/ai": "^9.0.5-rc.40",
13
+ "@praxisui/core": "^9.0.5-rc.40",
14
+ "@praxisui/metadata-editor": "^9.0.5-rc.40",
15
15
  "rxjs": "~7.8.0"
16
16
  },
17
17
  "dependencies": {
@@ -42,6 +42,7 @@ interface SpecificationMetadata {
42
42
  * Value types for rule configuration
43
43
  */
44
44
  type ValueType = 'literal' | 'field' | 'context' | 'function';
45
+ type FieldOperandTransform = 'coalesce';
45
46
  /**
46
47
  * Valid comparison operators supported by the visual builder
47
48
  */
@@ -112,6 +113,10 @@ interface FieldConditionConfig {
112
113
  valueType?: ValueType;
113
114
  /** Field to compare against (for field-to-field comparisons) */
114
115
  compareToField?: string;
116
+ /** Canonical JSON Logic transform applied to the left field operand. */
117
+ fieldValueTransform?: FieldOperandTransform;
118
+ /** Canonical JSON Logic transform applied to a field-valued right operand. */
119
+ compareToFieldValueTransform?: FieldOperandTransform;
115
120
  /** Context variable to use as value */
116
121
  contextVariable?: string;
117
122
  /** Optional metadata for error messages and UI hints */
@@ -1304,6 +1309,8 @@ declare class RuleBuilderService {
1304
1309
  private jsonLogicOperatorToBuilderOperator;
1305
1310
  private normalizeConditionValue;
1306
1311
  private buildConditionRightOperand;
1312
+ private buildFieldOperand;
1313
+ private parseFieldOperand;
1307
1314
  private isJsonLogicExpressionCandidate;
1308
1315
  private isVarExpression;
1309
1316
  private extractVarPath;
@@ -2958,4 +2965,4 @@ declare class RuleListComponent {
2958
2965
  }
2959
2966
 
2960
2967
  export { ArrayFieldAnalyzer, CollectionValidatorEditorComponent, ConditionalValidatorEditorComponent, ConditionalValidatorType, ConfigurationError, ContextError, ContextManagementService, ConversionError, ErrorCategory, ErrorHandler, ErrorSeverity, ExportDialogComponent, ExportIntegrationService, ExpressionError, FIELD_TYPE_OPERATORS, FieldConditionEditorComponent, FieldSchemaService, FieldType, InternalError, JsonViewerComponent, MetadataEditorComponent, OPERATOR_LABELS, PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST, PRAXIS_VISUAL_BUILDER_COMPONENT_METADATA, PraxisVisualBuilder, RegistryError, RuleBuilderService, RuleCanvasComponent, RuleEditorComponent, RuleListComponent, RuleNodeComponent, RuleNodeRegistryService, RuleNodeType, RuleTemplateService, RuleValidationService, TemplateEditorDialogComponent, TemplateGalleryComponent, TemplatePreviewDialogComponent, ValidationError as VBValidationError, ValidationCategory, ValidationSeverity, VisualBuilderError, VisualRuleBuilderComponent, WebhookIntegrationService, createError, getArrayItemFieldPaths, globalErrorHandler, isArrayFieldSchema, providePraxisVisualBuilderMetadata };
2961
- export type { ArrayCollectionValidationRule, ArrayFieldSchema, ArrayValidationContext, ArrayValidationError, BooleanGroupConfig, CardinalityConfig, CircularReference, CleanupResult, CollectionValidationConfig, CollectionValidatorConfig, ConditionalValidatorConfig, ConditionalValidatorPreview, ContextEntry, ContextScope, ContextValue, ContextVariable, ContextualConfig, ContextualTemplateConfig, CustomConfig, CustomFunction, DocumentationLink, EnhancedFieldSchema, ErrorInfo, ErrorStatistics, ExportDialogData, ExportFormat, ExportOptions, ExportResult, ExpressionConfig, ExternalSystemConfig, FieldConditionConfig, FieldFormat, FieldOption, FieldSchema, FieldSchemaContext, FieldToFieldConfig, FieldUIConfig, FunctionCallConfig, FunctionParameter, ImportOptions, IntegrationEndpoint, IntegrationResult, MemoryStats, OptionalFieldConfig, PropertyRuleConfig, RegistryIntegrityResult, RegistryValidationResult, RuleBuilderConfig, RuleBuilderSnapshot, RuleBuilderState, RuleContextProvider, RuleFunctionRegistry, RuleNode, RuleNodeConfig, RuleNodeTree, RuleNodeTypeString, RuleTemplate, RuleValidationResult, SpecificationMetadata, TemplateApplicationResult, TemplateCategory, TemplateDisplayMode, TemplateEditorDialogData, TemplateEditorResult, TemplateMetadata, TemplatePreviewDialogData, TemplateSearchCriteria, TemplateSortOption, TemplateStats, TemplateValidationResult, ValidComparisonOperator, ValidationConfig, ValidationContext, ValidationError$1 as ValidationError, ValidationIssue, ValidationResult, ValidationRule, ValueType, VisualBuilderMode, WebhookConfig, WebhookDelivery, WebhookEvent, WebhookStats };
2968
+ export type { ArrayCollectionValidationRule, ArrayFieldSchema, ArrayValidationContext, ArrayValidationError, BooleanGroupConfig, CardinalityConfig, CircularReference, CleanupResult, CollectionValidationConfig, CollectionValidatorConfig, ConditionalValidatorConfig, ConditionalValidatorPreview, ContextEntry, ContextScope, ContextValue, ContextVariable, ContextualConfig, ContextualTemplateConfig, CustomConfig, CustomFunction, DocumentationLink, EnhancedFieldSchema, ErrorInfo, ErrorStatistics, ExportDialogData, ExportFormat, ExportOptions, ExportResult, ExpressionConfig, ExternalSystemConfig, FieldConditionConfig, FieldFormat, FieldOperandTransform, FieldOption, FieldSchema, FieldSchemaContext, FieldToFieldConfig, FieldUIConfig, FunctionCallConfig, FunctionParameter, ImportOptions, IntegrationEndpoint, IntegrationResult, MemoryStats, OptionalFieldConfig, PropertyRuleConfig, RegistryIntegrityResult, RegistryValidationResult, RuleBuilderConfig, RuleBuilderSnapshot, RuleBuilderState, RuleContextProvider, RuleFunctionRegistry, RuleNode, RuleNodeConfig, RuleNodeTree, RuleNodeTypeString, RuleTemplate, RuleValidationResult, SpecificationMetadata, TemplateApplicationResult, TemplateCategory, TemplateDisplayMode, TemplateEditorDialogData, TemplateEditorResult, TemplateMetadata, TemplatePreviewDialogData, TemplateSearchCriteria, TemplateSortOption, TemplateStats, TemplateValidationResult, ValidComparisonOperator, ValidationConfig, ValidationContext, ValidationError$1 as ValidationError, ValidationIssue, ValidationResult, ValidationRule, ValueType, VisualBuilderMode, WebhookConfig, WebhookDelivery, WebhookEvent, WebhookStats };