@praxisui/visual-builder 9.0.0-beta.9 → 9.0.0-beta.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Inject, ChangeDetectionStrategy, Component, EventEmitter, ViewChild, Output, Input, Optional, inject } from '@angular/core';
2
+ import { Injectable, Inject, ChangeDetectionStrategy, Component, EventEmitter, ViewChild, Output, Input, Optional, inject, ENVIRONMENT_INITIALIZER } from '@angular/core';
3
3
  import * as i12$1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/forms';
6
6
  import { Validators, ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms';
7
- import * as i10$1 from '@angular/material/badge';
7
+ import * as i9$2 from '@angular/material/badge';
8
8
  import { MatBadgeModule } from '@angular/material/badge';
9
9
  import * as i5 from '@angular/material/button';
10
10
  import { MatButtonModule } from '@angular/material/button';
@@ -17,18 +17,18 @@ import * as i6 from '@angular/material/icon';
17
17
  import { MatIconModule } from '@angular/material/icon';
18
18
  import * as i8 from '@angular/material/list';
19
19
  import { MatListModule } from '@angular/material/list';
20
- import * as i7$2 from '@angular/material/menu';
20
+ import * as i6$2 from '@angular/material/menu';
21
21
  import { MatMenuModule } from '@angular/material/menu';
22
22
  import { MatSidenavModule } from '@angular/material/sidenav';
23
23
  import * as i4 from '@angular/material/snack-bar';
24
24
  import { MatSnackBarModule } from '@angular/material/snack-bar';
25
- import * as i5$2 from '@angular/material/toolbar';
25
+ import * as i4$2 from '@angular/material/toolbar';
26
26
  import { MatToolbarModule } from '@angular/material/toolbar';
27
27
  import * as i9 from '@angular/material/tooltip';
28
28
  import { MatTooltipModule } from '@angular/material/tooltip';
29
29
  import { BehaviorSubject, Subject, from, takeUntil as takeUntil$1, interval, Observable, of, throwError, combineLatest } from 'rxjs';
30
30
  import * as i1$2 from '@praxisui/core';
31
- import { RULE_PROPERTY_SCHEMA, providePraxisI18n, PraxisI18nService, PraxisIconDirective } from '@praxisui/core';
31
+ import { RULE_PROPERTY_SCHEMA, PraxisIconButtonComponent, providePraxisI18n, PraxisI18nService, ComponentMetadataRegistry, PraxisIconDirective } from '@praxisui/core';
32
32
  import * as i3$1 from '@praxisui/ai';
33
33
  import { AiRuleWizardDialogComponent } from '@praxisui/ai';
34
34
  import { map, takeUntil, debounceTime, distinctUntilChanged, switchMap, catchError, startWith } from 'rxjs/operators';
@@ -41,7 +41,7 @@ import * as i4$1 from '@angular/material/input';
41
41
  import { MatInputModule } from '@angular/material/input';
42
42
  import * as i3 from '@angular/material/select';
43
43
  import { MatSelectModule } from '@angular/material/select';
44
- import * as i7$1 from '@angular/material/checkbox';
44
+ import * as i6$1 from '@angular/material/checkbox';
45
45
  import { MatCheckboxModule } from '@angular/material/checkbox';
46
46
  import * as i11 from '@angular/material/slide-toggle';
47
47
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@@ -49,17 +49,17 @@ import * as i12 from '@angular/material/progress-bar';
49
49
  import { MatProgressBarModule } from '@angular/material/progress-bar';
50
50
  import * as i10 from '@angular/material/chips';
51
51
  import { MatChipsModule } from '@angular/material/chips';
52
- import * as i11$1 from '@angular/material/expansion';
52
+ import * as i10$1 from '@angular/material/expansion';
53
53
  import { MatExpansionModule } from '@angular/material/expansion';
54
54
  import * as i2$1 from '@angular/cdk/layout';
55
55
  import { Breakpoints } from '@angular/cdk/layout';
56
- import * as i8$1 from '@angular/material/button-toggle';
56
+ import * as i7$1 from '@angular/material/button-toggle';
57
57
  import { MatButtonToggleModule } from '@angular/material/button-toggle';
58
58
  import * as i7$3 from '@angular/material/stepper';
59
59
  import { MatStepperModule } from '@angular/material/stepper';
60
- import * as i12$2 from '@angular/cdk/drag-drop';
60
+ import * as i11$1 from '@angular/cdk/drag-drop';
61
61
  import { DragDropModule } from '@angular/cdk/drag-drop';
62
- import * as i8$2 from '@angular/material/datepicker';
62
+ import * as i7$2 from '@angular/material/datepicker';
63
63
  import { MatDatepickerModule } from '@angular/material/datepicker';
64
64
  import { MatNativeDateModule } from '@angular/material/core';
65
65
  import * as i11$2 from '@angular/material/autocomplete';
@@ -1003,7 +1003,7 @@ class RuleBuilderService {
1003
1003
  ...this.getInitialState(),
1004
1004
  isDirty: false,
1005
1005
  });
1006
- // Salva estado inicial para habilitar undo/redo desde a primeira ação
1006
+ // Salva estado inicial para habilitar undo/redo desde a primeira ação
1007
1007
  this.saveSnapshot('Estado inicial');
1008
1008
  }
1009
1009
  /**
@@ -1279,7 +1279,7 @@ class RuleBuilderService {
1279
1279
  parsed = typeof content === 'string' ? JSON.parse(content) : content;
1280
1280
  }
1281
1281
  catch (e) {
1282
- throw new Error(`Importação falhou: JSON inválido (${e?.message || e})`);
1282
+ throw new Error(`Importação falhou: JSON inválido (${e?.message || e})`);
1283
1283
  }
1284
1284
  if (!parsed || (typeof parsed === 'object' && !Object.keys(parsed).length)) {
1285
1285
  return;
@@ -1309,7 +1309,7 @@ class RuleBuilderService {
1309
1309
  }
1310
1310
  }
1311
1311
  }
1312
- throw new Error(`Formato de importação não suportado ou inválido: ${format}`);
1312
+ throw new Error(`Formato de importação não suportado ou inválido: ${format}`);
1313
1313
  }
1314
1314
  /**
1315
1315
  * Export rules to JSON payload
@@ -1328,11 +1328,11 @@ class RuleBuilderService {
1328
1328
  };
1329
1329
  if (this.containsPropertyRule()) {
1330
1330
  payload.warning =
1331
- 'Exportação de propertyRule é experimental e pode exigir revisão manual.';
1331
+ 'Exportação de propertyRule é experimental e pode exigir revisão manual.';
1332
1332
  }
1333
1333
  return JSON.stringify(payload, null, options?.prettyPrint ? 2 : undefined);
1334
1334
  }
1335
- throw new Error(`Formato de exportação não suportado: ${format}`);
1335
+ throw new Error(`Formato de exportação não suportado: ${format}`);
1336
1336
  }
1337
1337
  toSpecification() {
1338
1338
  return null;
@@ -1417,31 +1417,31 @@ class RuleBuilderService {
1417
1417
  }
1418
1418
  generateNodeLabel(type) {
1419
1419
  const labels = {
1420
- [RuleNodeType.FIELD_CONDITION]: 'Condição de campo',
1420
+ [RuleNodeType.FIELD_CONDITION]: 'Condição de campo',
1421
1421
  [RuleNodeType.PROPERTY_RULE]: 'Propriedade',
1422
1422
  [RuleNodeType.AND_GROUP]: 'Grupo E',
1423
1423
  [RuleNodeType.OR_GROUP]: 'Grupo OU',
1424
- [RuleNodeType.NOT_GROUP]: 'Grupo NÃO',
1424
+ [RuleNodeType.NOT_GROUP]: 'Grupo NÃO',
1425
1425
  [RuleNodeType.XOR_GROUP]: 'Grupo XOR',
1426
1426
  [RuleNodeType.IMPLIES_GROUP]: 'Implica',
1427
- [RuleNodeType.REQUIRED_IF]: 'Obrigatório se',
1428
- [RuleNodeType.VISIBLE_IF]: 'Visível se',
1427
+ [RuleNodeType.REQUIRED_IF]: 'Obrigatório se',
1428
+ [RuleNodeType.VISIBLE_IF]: 'Visível se',
1429
1429
  [RuleNodeType.DISABLED_IF]: 'Desabilitado se',
1430
1430
  [RuleNodeType.READONLY_IF]: 'Somente leitura se',
1431
1431
  [RuleNodeType.FOR_EACH]: 'Para cada item',
1432
- [RuleNodeType.UNIQUE_BY]: 'Único por campo',
1433
- [RuleNodeType.MIN_LENGTH]: 'Mínimo de itens',
1434
- [RuleNodeType.MAX_LENGTH]: 'Máximo de itens',
1432
+ [RuleNodeType.UNIQUE_BY]: 'Único por campo',
1433
+ [RuleNodeType.MIN_LENGTH]: 'Mínimo de itens',
1434
+ [RuleNodeType.MAX_LENGTH]: 'Máximo de itens',
1435
1435
  [RuleNodeType.IF_DEFINED]: 'Se definido',
1436
- [RuleNodeType.IF_NOT_NULL]: 'Se não for nulo',
1436
+ [RuleNodeType.IF_NOT_NULL]: 'Se não for nulo',
1437
1437
  [RuleNodeType.IF_EXISTS]: 'Se existir',
1438
- [RuleNodeType.WITH_DEFAULT]: 'Com valor padrão',
1439
- [RuleNodeType.FUNCTION_CALL]: 'Chamada de função',
1438
+ [RuleNodeType.WITH_DEFAULT]: 'Com valor padrão',
1439
+ [RuleNodeType.FUNCTION_CALL]: 'Chamada de função',
1440
1440
  [RuleNodeType.FIELD_TO_FIELD]: 'Campo para campo',
1441
1441
  [RuleNodeType.CONTEXTUAL]: 'Contextual',
1442
1442
  [RuleNodeType.AT_LEAST]: 'Pelo menos',
1443
1443
  [RuleNodeType.EXACTLY]: 'Exatamente',
1444
- [RuleNodeType.EXPRESSION]: 'Expressão',
1444
+ [RuleNodeType.EXPRESSION]: 'Expressão',
1445
1445
  [RuleNodeType.CONTEXTUAL_TEMPLATE]: 'Template contextual',
1446
1446
  [RuleNodeType.CUSTOM]: 'Personalizado',
1447
1447
  };
@@ -1471,8 +1471,8 @@ class RuleBuilderService {
1471
1471
  });
1472
1472
  }
1473
1473
  /**
1474
- * Constrói um array de FormLayoutRule a partir do estado atual do builder,
1475
- * focando em nós propertyRule ou nós com propriedades/targets definidos.
1474
+ * Constrói um array de FormLayoutRule a partir do estado atual do builder,
1475
+ * focando em nós propertyRule ou nós com propriedades/targets definidos.
1476
1476
  */
1477
1477
  exportFormRulesFromState(state) {
1478
1478
  const rules = [];
@@ -1486,7 +1486,7 @@ class RuleBuilderService {
1486
1486
  }
1487
1487
  }
1488
1488
  if (warnings.length) {
1489
- console.warn('[RuleBuilderService] Algumas propriedades foram removidas ou ajustadas durante a exportação de formRules:', warnings);
1489
+ console.warn('[RuleBuilderService] Algumas propriedades foram removidas ou ajustadas durante a exportação de formRules:', warnings);
1490
1490
  }
1491
1491
  return rules;
1492
1492
  }
@@ -1545,7 +1545,7 @@ class RuleBuilderService {
1545
1545
  return null;
1546
1546
  }
1547
1547
  return {
1548
- [operator]: [{ var: cfg.fieldName }, this.normalizeConditionValue(cfg.value)],
1548
+ [operator]: [{ var: cfg.fieldName }, this.buildConditionRightOperand(cfg)],
1549
1549
  };
1550
1550
  }
1551
1551
  if (node.type === RuleNodeType.AND_GROUP || node.type === RuleNodeType.OR_GROUP) {
@@ -1624,7 +1624,7 @@ class RuleBuilderService {
1624
1624
  const id = (rawRule && (rawRule.id || rawRule.name)) || `#${index + 1}`;
1625
1625
  const ruleErrorsStart = errors.length;
1626
1626
  if (!rawRule || typeof rawRule !== 'object') {
1627
- errors.push(`Regra ${id}: valor inválido (esperado objeto)`);
1627
+ errors.push(`Regra ${id}: valor inválido (esperado objeto)`);
1628
1628
  return;
1629
1629
  }
1630
1630
  const rawTargets = Array.isArray(rawRule.targets) && rawRule.targets.length
@@ -1634,16 +1634,16 @@ class RuleBuilderService {
1634
1634
  : [];
1635
1635
  const { targets, targetType } = this.normalizeTargets(rawTargets, rawRule.targetType);
1636
1636
  if (!targets.length) {
1637
- errors.push(`Regra ${id}: targets obrigatórios ausentes`);
1637
+ errors.push(`Regra ${id}: targets obrigatórios ausentes`);
1638
1638
  return;
1639
1639
  }
1640
1640
  if (!allowedTargets.has(targetType)) {
1641
- errors.push(`Regra ${id}: targetType inválido "${rawRule.targetType || targetType}"`);
1641
+ errors.push(`Regra ${id}: targetType inválido "${rawRule.targetType || targetType}"`);
1642
1642
  return;
1643
1643
  }
1644
1644
  const effect = rawRule.effect;
1645
1645
  if (!effect || typeof effect !== 'object') {
1646
- errors.push(`Regra ${id}: effect ausente ou inválido`);
1646
+ errors.push(`Regra ${id}: effect ausente ou inválido`);
1647
1647
  return;
1648
1648
  }
1649
1649
  const condition = this.normalizeJsonLogicCondition(effect.condition);
@@ -1654,7 +1654,7 @@ class RuleBuilderService {
1654
1654
  const propertiesWhenFalse = this.sanitizeRuleProperties(targetType, effect.propertiesWhenFalse, errors, `regra ${id} (propertiesWhenFalse)`, true);
1655
1655
  if (Object.keys(properties).length === 0 &&
1656
1656
  Object.keys(propertiesWhenFalse).length === 0) {
1657
- errors.push(`Regra ${id}: nenhuma propriedade válida encontrada`);
1657
+ errors.push(`Regra ${id}: nenhuma propriedade válida encontrada`);
1658
1658
  }
1659
1659
  if (errors.length === ruleErrorsStart) {
1660
1660
  normalized.push({
@@ -1672,7 +1672,7 @@ class RuleBuilderService {
1672
1672
  }
1673
1673
  });
1674
1674
  if (errors.length) {
1675
- throw new Error(`FormRules inválidos: ${errors.join('; ')}`);
1675
+ throw new Error(`FormRules inválidos: ${errors.join('; ')}`);
1676
1676
  }
1677
1677
  return normalized;
1678
1678
  }
@@ -1687,7 +1687,7 @@ class RuleBuilderService {
1687
1687
  const def = defMap.get(name);
1688
1688
  if (!def) {
1689
1689
  if (strict || collector) {
1690
- collector?.push(`${context}: propriedade "${name}" não é permitida para ${targetType}`);
1690
+ collector?.push(`${context}: propriedade "${name}" não é permitida para ${targetType}`);
1691
1691
  }
1692
1692
  return acc;
1693
1693
  }
@@ -1696,14 +1696,14 @@ class RuleBuilderService {
1696
1696
  acc[name] = coerced.value;
1697
1697
  }
1698
1698
  else if (strict || collector) {
1699
- collector?.push(`${context}: valor inválido para "${name}" (esperado ${def.type}, recebido ${typeof value})`);
1699
+ collector?.push(`${context}: valor inválido para "${name}" (esperado ${def.type}, recebido ${typeof value})`);
1700
1700
  }
1701
1701
  return acc;
1702
1702
  }, {});
1703
1703
  }
1704
1704
  coerceRulePropertyValue(def, value) {
1705
1705
  if (value === null) {
1706
- // null mantém semântica de remover override
1706
+ // null mantém semântica de remover override
1707
1707
  return { ok: true, value: null };
1708
1708
  }
1709
1709
  switch (def.type) {
@@ -1735,10 +1735,19 @@ class RuleBuilderService {
1735
1735
  return { ok: true, value: this.sanitizeStructuredValue(def.name, value) };
1736
1736
  }
1737
1737
  return { ok: false };
1738
+ case 'array':
1739
+ return Array.isArray(value)
1740
+ ? { ok: true, value: this.sanitizeStructuredArray(def.name, value) }
1741
+ : { ok: false };
1738
1742
  default:
1739
1743
  return { ok: false };
1740
1744
  }
1741
1745
  }
1746
+ sanitizeStructuredArray(name, value) {
1747
+ return value.map((item) => item && typeof item === 'object' && !Array.isArray(item)
1748
+ ? this.sanitizeStructuredValue(name, item)
1749
+ : item);
1750
+ }
1742
1751
  sanitizeStructuredValue(name, value) {
1743
1752
  if (name === 'options') {
1744
1753
  const normalizeItems = (items) => items
@@ -1951,15 +1960,20 @@ class RuleBuilderService {
1951
1960
  if (!this.isVarExpression(left)) {
1952
1961
  return undefined;
1953
1962
  }
1963
+ const config = {
1964
+ type: 'fieldCondition',
1965
+ fieldName: this.extractVarPath(left.var),
1966
+ operator: builderOperator,
1967
+ value: right,
1968
+ };
1969
+ if (this.isVarExpression(right)) {
1970
+ config['valueType'] = 'field';
1971
+ config['compareToField'] = this.extractVarPath(right.var);
1972
+ }
1954
1973
  return {
1955
1974
  id: v4(),
1956
1975
  type: RuleNodeType.FIELD_CONDITION,
1957
- config: {
1958
- type: 'fieldCondition',
1959
- fieldName: this.extractVarPath(left.var),
1960
- operator: builderOperator,
1961
- value: right,
1962
- },
1976
+ config: config,
1963
1977
  };
1964
1978
  }
1965
1979
  parseJsonLogicChild(child) {
@@ -2073,6 +2087,14 @@ class RuleBuilderService {
2073
2087
  }
2074
2088
  return value;
2075
2089
  }
2090
+ buildConditionRightOperand(cfg) {
2091
+ if (cfg['valueType'] === 'field' &&
2092
+ typeof cfg['compareToField'] === 'string' &&
2093
+ cfg['compareToField'].trim()) {
2094
+ return { var: cfg['compareToField'].trim() };
2095
+ }
2096
+ return this.normalizeConditionValue(cfg['value']);
2097
+ }
2076
2098
  isJsonLogicExpressionCandidate(value) {
2077
2099
  return !!value && typeof value === 'object' && !Array.isArray(value);
2078
2100
  }
@@ -2228,13 +2250,17 @@ class RuleBuilderService {
2228
2250
  this.addValidationError(errors, `field-condition:compare-field:${node.id}`, 'Escolha o campo usado na comparacao.', 'error', node.id);
2229
2251
  return;
2230
2252
  }
2231
- if (cfg.valueType === 'context' &&
2232
- (!cfg.contextVariable || typeof cfg.contextVariable !== 'string')) {
2233
- this.addValidationError(errors, `field-condition:context:${node.id}`, 'Escolha a variavel de contexto usada na comparacao.', 'error', node.id);
2253
+ if (cfg.valueType === 'context') {
2254
+ this.addValidationError(errors, `field-condition:context:${node.id}`, 'Comparação com variável de contexto ainda não possui serialização JSON Logic canônica.', 'error', node.id);
2255
+ return;
2256
+ }
2257
+ if (cfg.valueType === 'function') {
2258
+ this.addValidationError(errors, `field-condition:function:${node.id}`, 'Comparação com chamada de função ainda não possui serialização JSON Logic canônica.', 'error', node.id);
2234
2259
  return;
2235
2260
  }
2236
2261
  if (cfg.valueType !== 'field' &&
2237
2262
  cfg.valueType !== 'context' &&
2263
+ cfg.valueType !== 'function' &&
2238
2264
  !Object.prototype.hasOwnProperty.call(cfg, 'value')) {
2239
2265
  this.addValidationError(errors, `field-condition:value:${node.id}`, 'Informe o valor da condicao.', 'error', node.id);
2240
2266
  }
@@ -2310,7 +2336,7 @@ class RuleBuilderService {
2310
2336
  return null;
2311
2337
  if (input.type)
2312
2338
  return input;
2313
- // Inferência básica de tipos de especificação comuns
2339
+ // Inferência básica de tipos de especificação comuns
2314
2340
  // Campo simples: { field, operator, value }
2315
2341
  if (input.field && input.operator !== undefined) {
2316
2342
  return { type: 'field', ...input };
@@ -3397,14 +3423,13 @@ class ExportDialogComponent {
3397
3423
  placeholder="Leave empty for auto-generated"
3398
3424
  />
3399
3425
  <button
3400
- mat-icon-button
3426
+ praxisIconButton="help_outline"
3427
+ size="dense"
3401
3428
  matSuffix
3402
- class="help-icon-button"
3403
3429
  type="button"
3404
3430
  [matTooltip]="'Will be auto-generated if not specified'"
3405
3431
  matTooltipPosition="above"
3406
3432
  >
3407
- <mat-icon>help_outline</mat-icon>
3408
3433
  </button>
3409
3434
  </mat-form-field>
3410
3435
  </div>
@@ -3742,10 +3767,11 @@ class ExportDialogComponent {
3742
3767
  <input matInput [value]="shareResult.url" readonly />
3743
3768
  <button
3744
3769
  matSuffix
3745
- mat-icon-button
3770
+ praxisIconButton="content_copy"
3771
+ size="dense"
3772
+ aria-label="Copy share URL"
3746
3773
  (click)="copyShareUrl()"
3747
3774
  >
3748
- <mat-icon>content_copy</mat-icon>
3749
3775
  </button>
3750
3776
  </mat-form-field>
3751
3777
  </div>
@@ -3821,7 +3847,7 @@ class ExportDialogComponent {
3821
3847
  </mat-progress-bar>
3822
3848
  }
3823
3849
  </div>
3824
- `, isInline: true, styles: [".export-dialog{width:800px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column}.dialog-header{display:flex;align-items:center;gap:8px;font-weight:500}.dialog-content{flex:1;overflow:auto;max-height:calc(80vh - 120px)}.tab-content{padding:16px 0;min-height:0;max-height:calc(80vh - 180px);overflow-y:auto}.section{margin-bottom:24px}.section-title{margin:0 0 16px;color:var(--md-sys-color-primary);font-size:16px;font-weight:500}.format-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:16px}.format-card{cursor:pointer;transition:all .2s ease;border:2px solid transparent}.format-card:hover{border-color:var(--md-sys-color-primary-container);box-shadow:0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.format-card.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.format-description{font-size:13px;color:var(--md-sys-color-on-surface-variant);margin:8px 0;min-height:40px}.format-features{display:flex;gap:4px;flex-wrap:wrap}.options-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:16px}.full-width{width:100%}.batch-formats{margin-top:16px}.export-results,.integration-results{margin-top:24px}.result-panel{margin-bottom:8px}.success-icon{color:var(--md-sys-color-tertiary)}.error-icon{color:var(--md-sys-color-error)}.result-details{padding:16px 0}.detail-row{margin-bottom:8px;font-size:14px}.action-buttons{display:flex;gap:8px;margin-top:16px}.error-details{color:var(--md-sys-color-error)}.error-item{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);padding:8px;border-radius:4px;margin-bottom:4px}.system-info{margin-top:16px}.info-card{background:var(--md-sys-color-surface-variant)}.system-details,.integration-result{margin-bottom:16px}.success-card{border-left:4px solid var(--md-sys-color-tertiary)}.error-card{border-left:4px solid var(--md-sys-color-error)}.sharing-form{max-width:400px}.share-card{margin-top:16px;border-left:4px solid var(--md-sys-color-primary)}.share-url{margin-bottom:16px}.dialog-actions{display:flex;justify-content:space-between;align-items:center;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);position:sticky;bottom:0;background:var(--md-sys-color-surface);border-top:1px solid var(--md-sys-color-outline-variant);z-index:2}.dialog-actions .action-buttons{display:flex;gap:8px}.progress-bar{position:absolute;bottom:0;left:0;right:0}@media(max-width:768px){.export-dialog{width:100vw;height:100vh;max-width:none;max-height:none}.format-grid,.options-grid{grid-template-columns:1fr}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "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.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: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: MatTabsModule }, { kind: "component", type: i7.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i7.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$1.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5$1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { 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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i11$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i11$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i11$1.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "pipe", type: i12$1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3850
+ `, isInline: true, styles: [".export-dialog{width:800px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column}.dialog-header{display:flex;align-items:center;gap:8px;font-weight:500}.dialog-content{flex:1;overflow:auto;max-height:calc(80vh - 120px)}.tab-content{padding:16px 0;min-height:0;max-height:calc(80vh - 180px);overflow-y:auto}.section{margin-bottom:24px}.section-title{margin:0 0 16px;color:var(--md-sys-color-primary);font-size:16px;font-weight:500}.format-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:16px}.format-card{cursor:pointer;transition:all .2s ease;border:2px solid transparent}.format-card:hover{border-color:var(--md-sys-color-primary-container);box-shadow:0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.format-card.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.format-description{font-size:13px;color:var(--md-sys-color-on-surface-variant);margin:8px 0;min-height:40px}.format-features{display:flex;gap:4px;flex-wrap:wrap}.options-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:16px}.full-width{width:100%}.batch-formats{margin-top:16px}.export-results,.integration-results{margin-top:24px}.result-panel{margin-bottom:8px}.success-icon{color:var(--md-sys-color-tertiary)}.error-icon{color:var(--md-sys-color-error)}.result-details{padding:16px 0}.detail-row{margin-bottom:8px;font-size:14px}.action-buttons{display:flex;gap:8px;margin-top:16px}.error-details{color:var(--md-sys-color-error)}.error-item{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);padding:8px;border-radius:4px;margin-bottom:4px}.system-info{margin-top:16px}.info-card{background:var(--md-sys-color-surface-variant)}.system-details,.integration-result{margin-bottom:16px}.success-card{border-left:4px solid var(--md-sys-color-tertiary)}.error-card{border-left:4px solid var(--md-sys-color-error)}.sharing-form{max-width:400px}.share-card{margin-top:16px;border-left:4px solid var(--md-sys-color-primary)}.share-url{margin-bottom:16px}.dialog-actions{display:flex;justify-content:space-between;align-items:center;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);position:sticky;bottom:0;background:var(--md-sys-color-surface);border-top:1px solid var(--md-sys-color-outline-variant);z-index:2}.dialog-actions .action-buttons{display:flex;gap:8px}.progress-bar{position:absolute;bottom:0;left:0;right:0}@media(max-width:768px){.export-dialog{width:100vw;height:100vh;max-width:none;max-height:none}.format-grid,.options-grid{grid-template-columns:1fr}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.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: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i7.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i7.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$1.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5$1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { 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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i10$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10$1.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "pipe", type: i12$1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3825
3851
  }
3826
3852
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ExportDialogComponent, decorators: [{
3827
3853
  type: Component,
@@ -3832,6 +3858,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
3832
3858
  MatDialogModule,
3833
3859
  MatButtonModule,
3834
3860
  MatIconModule,
3861
+ PraxisIconButtonComponent,
3835
3862
  MatTabsModule,
3836
3863
  MatFormFieldModule,
3837
3864
  MatInputModule,
@@ -3939,14 +3966,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
3939
3966
  placeholder="Leave empty for auto-generated"
3940
3967
  />
3941
3968
  <button
3942
- mat-icon-button
3969
+ praxisIconButton="help_outline"
3970
+ size="dense"
3943
3971
  matSuffix
3944
- class="help-icon-button"
3945
3972
  type="button"
3946
3973
  [matTooltip]="'Will be auto-generated if not specified'"
3947
3974
  matTooltipPosition="above"
3948
3975
  >
3949
- <mat-icon>help_outline</mat-icon>
3950
3976
  </button>
3951
3977
  </mat-form-field>
3952
3978
  </div>
@@ -4284,10 +4310,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4284
4310
  <input matInput [value]="shareResult.url" readonly />
4285
4311
  <button
4286
4312
  matSuffix
4287
- mat-icon-button
4313
+ praxisIconButton="content_copy"
4314
+ size="dense"
4315
+ aria-label="Copy share URL"
4288
4316
  (click)="copyShareUrl()"
4289
4317
  >
4290
- <mat-icon>content_copy</mat-icon>
4291
4318
  </button>
4292
4319
  </mat-form-field>
4293
4320
  </div>
@@ -4363,7 +4390,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4363
4390
  </mat-progress-bar>
4364
4391
  }
4365
4392
  </div>
4366
- `, styles: [".export-dialog{width:800px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column}.dialog-header{display:flex;align-items:center;gap:8px;font-weight:500}.dialog-content{flex:1;overflow:auto;max-height:calc(80vh - 120px)}.tab-content{padding:16px 0;min-height:0;max-height:calc(80vh - 180px);overflow-y:auto}.section{margin-bottom:24px}.section-title{margin:0 0 16px;color:var(--md-sys-color-primary);font-size:16px;font-weight:500}.format-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:16px}.format-card{cursor:pointer;transition:all .2s ease;border:2px solid transparent}.format-card:hover{border-color:var(--md-sys-color-primary-container);box-shadow:0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.format-card.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.format-description{font-size:13px;color:var(--md-sys-color-on-surface-variant);margin:8px 0;min-height:40px}.format-features{display:flex;gap:4px;flex-wrap:wrap}.options-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:16px}.full-width{width:100%}.batch-formats{margin-top:16px}.export-results,.integration-results{margin-top:24px}.result-panel{margin-bottom:8px}.success-icon{color:var(--md-sys-color-tertiary)}.error-icon{color:var(--md-sys-color-error)}.result-details{padding:16px 0}.detail-row{margin-bottom:8px;font-size:14px}.action-buttons{display:flex;gap:8px;margin-top:16px}.error-details{color:var(--md-sys-color-error)}.error-item{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);padding:8px;border-radius:4px;margin-bottom:4px}.system-info{margin-top:16px}.info-card{background:var(--md-sys-color-surface-variant)}.system-details,.integration-result{margin-bottom:16px}.success-card{border-left:4px solid var(--md-sys-color-tertiary)}.error-card{border-left:4px solid var(--md-sys-color-error)}.sharing-form{max-width:400px}.share-card{margin-top:16px;border-left:4px solid var(--md-sys-color-primary)}.share-url{margin-bottom:16px}.dialog-actions{display:flex;justify-content:space-between;align-items:center;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);position:sticky;bottom:0;background:var(--md-sys-color-surface);border-top:1px solid var(--md-sys-color-outline-variant);z-index:2}.dialog-actions .action-buttons{display:flex;gap:8px}.progress-bar{position:absolute;bottom:0;left:0;right:0}@media(max-width:768px){.export-dialog{width:100vw;height:100vh;max-width:none;max-height:none}.format-grid,.options-grid{grid-template-columns:1fr}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
4393
+ `, styles: [".export-dialog{width:800px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column}.dialog-header{display:flex;align-items:center;gap:8px;font-weight:500}.dialog-content{flex:1;overflow:auto;max-height:calc(80vh - 120px)}.tab-content{padding:16px 0;min-height:0;max-height:calc(80vh - 180px);overflow-y:auto}.section{margin-bottom:24px}.section-title{margin:0 0 16px;color:var(--md-sys-color-primary);font-size:16px;font-weight:500}.format-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;margin-bottom:16px}.format-card{cursor:pointer;transition:all .2s ease;border:2px solid transparent}.format-card:hover{border-color:var(--md-sys-color-primary-container);box-shadow:0 4px 8px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.format-card.selected{border-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.format-description{font-size:13px;color:var(--md-sys-color-on-surface-variant);margin:8px 0;min-height:40px}.format-features{display:flex;gap:4px;flex-wrap:wrap}.options-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:16px}.full-width{width:100%}.batch-formats{margin-top:16px}.export-results,.integration-results{margin-top:24px}.result-panel{margin-bottom:8px}.success-icon{color:var(--md-sys-color-tertiary)}.error-icon{color:var(--md-sys-color-error)}.result-details{padding:16px 0}.detail-row{margin-bottom:8px;font-size:14px}.action-buttons{display:flex;gap:8px;margin-top:16px}.error-details{color:var(--md-sys-color-error)}.error-item{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);padding:8px;border-radius:4px;margin-bottom:4px}.system-info{margin-top:16px}.info-card{background:var(--md-sys-color-surface-variant)}.system-details,.integration-result{margin-bottom:16px}.success-card{border-left:4px solid var(--md-sys-color-tertiary)}.error-card{border-left:4px solid var(--md-sys-color-error)}.sharing-form{max-width:400px}.share-card{margin-top:16px;border-left:4px solid var(--md-sys-color-primary)}.share-url{margin-bottom:16px}.dialog-actions{display:flex;justify-content:space-between;align-items:center;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);position:sticky;bottom:0;background:var(--md-sys-color-surface);border-top:1px solid var(--md-sys-color-outline-variant);z-index:2}.dialog-actions .action-buttons{display:flex;gap:8px}.progress-bar{position:absolute;bottom:0;left:0;right:0}@media(max-width:768px){.export-dialog{width:100vw;height:100vh;max-width:none;max-height:none}.format-grid,.options-grid{grid-template-columns:1fr}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
4367
4394
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
4368
4395
  type: Inject,
4369
4396
  args: [MAT_DIALOG_DATA]
@@ -4434,12 +4461,12 @@ class PropertyEffectEditorComponent {
4434
4461
  clearValue(entry, branch) {
4435
4462
  if (branch === 'true') {
4436
4463
  entry.value = null;
4437
- entry.jsonValue = entry.type === 'object' ? '' : entry.value;
4464
+ entry.jsonValue = this.isStructuredJsonType(entry.type) ? '' : entry.value;
4438
4465
  entry.error = undefined;
4439
4466
  }
4440
4467
  else {
4441
4468
  entry.valueWhenFalse = null;
4442
- entry.jsonValueWhenFalse = entry.type === 'object' ? '' : entry.valueWhenFalse;
4469
+ entry.jsonValueWhenFalse = this.isStructuredJsonType(entry.type) ? '' : entry.valueWhenFalse;
4443
4470
  entry.errorWhenFalse = undefined;
4444
4471
  }
4445
4472
  this.emitChange();
@@ -4457,8 +4484,8 @@ class PropertyEffectEditorComponent {
4457
4484
  entry.type = def.type;
4458
4485
  entry.value = def.type === 'boolean' ? true : undefined;
4459
4486
  entry.valueWhenFalse = undefined;
4460
- entry.jsonValue = def.type === 'object' ? '' : undefined;
4461
- entry.jsonValueWhenFalse = def.type === 'object' ? '' : undefined;
4487
+ entry.jsonValue = this.isStructuredJsonType(def.type) ? '' : undefined;
4488
+ entry.jsonValueWhenFalse = this.isStructuredJsonType(def.type) ? '' : undefined;
4462
4489
  }
4463
4490
  entry.error = undefined;
4464
4491
  entry.errorWhenFalse = undefined;
@@ -4509,11 +4536,11 @@ class PropertyEffectEditorComponent {
4509
4536
  return;
4510
4537
  const entry = this.createEntry(def);
4511
4538
  entry.property = name;
4512
- entry.value = def.type === 'object' ? undefined : props[name];
4513
- entry.valueWhenFalse = def.type === 'object' ? undefined : propsFalse[name];
4514
- entry.jsonValue = def.type === 'object' ? this.stringifyValue(props[name]) : undefined;
4539
+ entry.value = this.isStructuredJsonType(def.type) ? undefined : props[name];
4540
+ entry.valueWhenFalse = this.isStructuredJsonType(def.type) ? undefined : propsFalse[name];
4541
+ entry.jsonValue = this.isStructuredJsonType(def.type) ? this.stringifyValue(props[name]) : undefined;
4515
4542
  entry.jsonValueWhenFalse =
4516
- def.type === 'object' ? this.stringifyValue(propsFalse[name]) : undefined;
4543
+ this.isStructuredJsonType(def.type) ? this.stringifyValue(propsFalse[name]) : undefined;
4517
4544
  entries.push(entry);
4518
4545
  });
4519
4546
  if (!entries.length && this.properties.length) {
@@ -4532,8 +4559,8 @@ class PropertyEffectEditorComponent {
4532
4559
  type: def.type,
4533
4560
  value: def.type === 'boolean' ? true : undefined,
4534
4561
  valueWhenFalse: undefined,
4535
- jsonValue: def.type === 'object' ? '' : undefined,
4536
- jsonValueWhenFalse: def.type === 'object' ? '' : undefined,
4562
+ jsonValue: this.isStructuredJsonType(def.type) ? '' : undefined,
4563
+ jsonValueWhenFalse: this.isStructuredJsonType(def.type) ? '' : undefined,
4537
4564
  };
4538
4565
  }
4539
4566
  buildConfigFromEntries() {
@@ -4561,7 +4588,7 @@ class PropertyEffectEditorComponent {
4561
4588
  }
4562
4589
  normalizeValue(entry, branch) {
4563
4590
  const type = entry.type;
4564
- const raw = type === 'object'
4591
+ const raw = this.isStructuredJsonType(type)
4565
4592
  ? branch === 'true'
4566
4593
  ? entry.jsonValue
4567
4594
  : entry.jsonValueWhenFalse
@@ -4593,8 +4620,9 @@ class PropertyEffectEditorComponent {
4593
4620
  }
4594
4621
  case 'string':
4595
4622
  return { ok: true, value: String(raw) };
4623
+ case 'array':
4596
4624
  default: {
4597
- const parsedResult = this.parseObject(raw, entry.property);
4625
+ const parsedResult = this.parseObject(raw, entry.property, type === 'array' ? 'array' : 'object');
4598
4626
  if (!parsedResult.ok) {
4599
4627
  return { ok: false, error: parsedResult.error || 'JSON inválido' };
4600
4628
  }
@@ -4602,7 +4630,7 @@ class PropertyEffectEditorComponent {
4602
4630
  }
4603
4631
  }
4604
4632
  }
4605
- parseObject(raw, propertyName) {
4633
+ parseObject(raw, propertyName, expectedType = 'object') {
4606
4634
  let value = raw;
4607
4635
  if (typeof raw === 'string') {
4608
4636
  try {
@@ -4612,6 +4640,11 @@ class PropertyEffectEditorComponent {
4612
4640
  return { ok: false, error: 'JSON inválido' };
4613
4641
  }
4614
4642
  }
4643
+ if (expectedType === 'array') {
4644
+ return Array.isArray(value)
4645
+ ? { ok: true, value }
4646
+ : { ok: false, error: 'Informe uma lista' };
4647
+ }
4615
4648
  if (propertyName === 'options') {
4616
4649
  if (Array.isArray(value)) {
4617
4650
  return { ok: true, value: { items: value } };
@@ -4635,6 +4668,9 @@ class PropertyEffectEditorComponent {
4635
4668
  return '';
4636
4669
  }
4637
4670
  }
4671
+ isStructuredJsonType(type) {
4672
+ return type === 'object' || type === 'array';
4673
+ }
4638
4674
  signature(config) {
4639
4675
  try {
4640
4676
  return JSON.stringify(config || {});
@@ -4666,7 +4702,7 @@ class PropertyEffectEditorComponent {
4666
4702
  </div>
4667
4703
  }
4668
4704
 
4669
- @for (entry of entries; track entry; let i = $index) {
4705
+ @for (entry of entries; track $index; let i = $index) {
4670
4706
  <div
4671
4707
  class="property-card"
4672
4708
  [attr.data-testid]="'property-effect-entry-' + i"
@@ -4690,8 +4726,7 @@ class PropertyEffectEditorComponent {
4690
4726
  (click)="$event.stopPropagation()"
4691
4727
  autocomplete="off">
4692
4728
  @if (searchControl.value) {
4693
- <button matSuffix mat-icon-button aria-label="Limpar" (click)="clearSearch($event)">
4694
- <mat-icon>close</mat-icon>
4729
+ <button matSuffix praxisIconButton="close" size="dense" aria-label="Limpar" (click)="clearSearch($event)">
4695
4730
  </button>
4696
4731
  }
4697
4732
  </mat-form-field>
@@ -4716,25 +4751,24 @@ class PropertyEffectEditorComponent {
4716
4751
  </mat-select>
4717
4752
  @if (getDefinition(entry.property)?.description) {
4718
4753
  <button
4719
- mat-icon-button
4754
+ praxisIconButton="help_outline"
4755
+ size="dense"
4720
4756
  matSuffix
4721
- class="help-icon-button"
4722
4757
  type="button"
4723
4758
  [matTooltip]="getDefinition(entry.property)?.description"
4724
4759
  matTooltipPosition="above"
4725
4760
  >
4726
- <mat-icon>help_outline</mat-icon>
4727
4761
  </button>
4728
4762
  }
4729
4763
  </mat-form-field>
4730
4764
  <button
4731
- mat-icon-button
4732
- color="warn"
4765
+ praxisIconButton="delete"
4766
+ size="dense"
4767
+ class="danger-action"
4733
4768
  (click)="removeEntry(i)"
4734
4769
  [disabled]="entries.length === 1 && !canAddEntry()"
4735
4770
  matTooltip="Remover propriedade"
4736
4771
  >
4737
- <mat-icon>delete</mat-icon>
4738
4772
  </button>
4739
4773
  </div>
4740
4774
  @if (entry.property) {
@@ -4743,12 +4777,12 @@ class PropertyEffectEditorComponent {
4743
4777
  <div class="value-label">
4744
4778
  Valor quando verdadeiro
4745
4779
  <button
4746
- mat-icon-button
4780
+ praxisIconButton="backspace"
4781
+ size="dense"
4747
4782
  type="button"
4748
4783
  (click)="clearValue(entry, 'true')"
4749
4784
  matTooltip="Limpar (usa padrão / null)"
4750
4785
  >
4751
- <mat-icon>backspace</mat-icon>
4752
4786
  </button>
4753
4787
  </div>
4754
4788
  @switch (entry.type) {
@@ -4836,12 +4870,12 @@ class PropertyEffectEditorComponent {
4836
4870
  <div class="value-label">
4837
4871
  Valor quando falso (opcional)
4838
4872
  <button
4839
- mat-icon-button
4873
+ praxisIconButton="backspace"
4874
+ size="dense"
4840
4875
  type="button"
4841
4876
  (click)="clearValue(entry, 'false')"
4842
4877
  matTooltip="Limpar (usa padrão / null)"
4843
4878
  >
4844
- <mat-icon>backspace</mat-icon>
4845
4879
  </button>
4846
4880
  </div>
4847
4881
  @switch (entry.type) {
@@ -4948,7 +4982,7 @@ class PropertyEffectEditorComponent {
4948
4982
  </div>
4949
4983
  }
4950
4984
  </div>
4951
- `, isInline: true, styles: [".property-effect-editor{display:flex;flex-direction:column;gap:16px}.header{display:flex;align-items:center;justify-content:space-between;gap:8px}.title{font-weight:600}.property-card{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-row{display:flex;gap:8px;align-items:center}.field{flex:1}.value-columns{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));margin-top:12px}.value-block{display:flex;flex-direction:column;gap:8px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.value-label{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.preview{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.preview-title{font-size:14px;font-weight:600;margin-bottom:8px}.preview-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.preview-pane{border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;padding:8px;background:var(--md-sys-color-surface-container)}.pane-label{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:4px}pre{margin:0;background:transparent;font-size:12px;line-height:1.4}.empty{color:var(--md-sys-color-on-surface-variant);font-size:13px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:6px}.w-100{width:100%}.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}.option-content{display:flex;flex-direction:column;line-height:1.2;padding:4px 0}.option-label{font-weight:500}.option-id{font-size:11px;opacity:.6}.no-results{font-style:italic;font-size:13px;text-align:center}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { 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: 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "pipe", type: i12$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4985
+ `, isInline: true, styles: [".property-effect-editor{display:flex;flex-direction:column;gap:16px}.header{display:flex;align-items:center;justify-content:space-between;gap:8px}.title{font-weight:600}.property-card{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-row{display:flex;gap:8px;align-items:center}.field{flex:1}.value-columns{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));margin-top:12px}.value-block{display:flex;flex-direction:column;gap:8px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.value-label{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.preview{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.preview-title{font-size:14px;font-weight:600;margin-bottom:8px}.preview-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.preview-pane{border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;padding:8px;background:var(--md-sys-color-surface-container)}.pane-label{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:4px}pre{margin:0;background:transparent;font-size:12px;line-height:1.4}.empty{color:var(--md-sys-color-on-surface-variant);font-size:13px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:6px}.w-100{width:100%}.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}.option-content{display:flex;flex-direction:column;line-height:1.2;padding:4px 0}.option-label{font-weight:500}.option-id{font-size:11px;opacity:.6}.no-results{font-style:italic;font-size:13px;text-align:center}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { 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: 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i7$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "pipe", type: i12$1.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4952
4986
  }
4953
4987
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PropertyEffectEditorComponent, decorators: [{
4954
4988
  type: Component,
@@ -4963,6 +4997,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4963
4997
  MatIconModule,
4964
4998
  MatTooltipModule,
4965
4999
  MatButtonToggleModule,
5000
+ PraxisIconButtonComponent,
4966
5001
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
4967
5002
  <div class="property-effect-editor" data-testid="property-effect-editor">
4968
5003
  <div class="header">
@@ -4985,7 +5020,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4985
5020
  </div>
4986
5021
  }
4987
5022
 
4988
- @for (entry of entries; track entry; let i = $index) {
5023
+ @for (entry of entries; track $index; let i = $index) {
4989
5024
  <div
4990
5025
  class="property-card"
4991
5026
  [attr.data-testid]="'property-effect-entry-' + i"
@@ -5009,8 +5044,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5009
5044
  (click)="$event.stopPropagation()"
5010
5045
  autocomplete="off">
5011
5046
  @if (searchControl.value) {
5012
- <button matSuffix mat-icon-button aria-label="Limpar" (click)="clearSearch($event)">
5013
- <mat-icon>close</mat-icon>
5047
+ <button matSuffix praxisIconButton="close" size="dense" aria-label="Limpar" (click)="clearSearch($event)">
5014
5048
  </button>
5015
5049
  }
5016
5050
  </mat-form-field>
@@ -5035,25 +5069,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5035
5069
  </mat-select>
5036
5070
  @if (getDefinition(entry.property)?.description) {
5037
5071
  <button
5038
- mat-icon-button
5072
+ praxisIconButton="help_outline"
5073
+ size="dense"
5039
5074
  matSuffix
5040
- class="help-icon-button"
5041
5075
  type="button"
5042
5076
  [matTooltip]="getDefinition(entry.property)?.description"
5043
5077
  matTooltipPosition="above"
5044
5078
  >
5045
- <mat-icon>help_outline</mat-icon>
5046
5079
  </button>
5047
5080
  }
5048
5081
  </mat-form-field>
5049
5082
  <button
5050
- mat-icon-button
5051
- color="warn"
5083
+ praxisIconButton="delete"
5084
+ size="dense"
5085
+ class="danger-action"
5052
5086
  (click)="removeEntry(i)"
5053
5087
  [disabled]="entries.length === 1 && !canAddEntry()"
5054
5088
  matTooltip="Remover propriedade"
5055
5089
  >
5056
- <mat-icon>delete</mat-icon>
5057
5090
  </button>
5058
5091
  </div>
5059
5092
  @if (entry.property) {
@@ -5062,12 +5095,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5062
5095
  <div class="value-label">
5063
5096
  Valor quando verdadeiro
5064
5097
  <button
5065
- mat-icon-button
5098
+ praxisIconButton="backspace"
5099
+ size="dense"
5066
5100
  type="button"
5067
5101
  (click)="clearValue(entry, 'true')"
5068
5102
  matTooltip="Limpar (usa padrão / null)"
5069
5103
  >
5070
- <mat-icon>backspace</mat-icon>
5071
5104
  </button>
5072
5105
  </div>
5073
5106
  @switch (entry.type) {
@@ -5155,12 +5188,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5155
5188
  <div class="value-label">
5156
5189
  Valor quando falso (opcional)
5157
5190
  <button
5158
- mat-icon-button
5191
+ praxisIconButton="backspace"
5192
+ size="dense"
5159
5193
  type="button"
5160
5194
  (click)="clearValue(entry, 'false')"
5161
5195
  matTooltip="Limpar (usa padrão / null)"
5162
5196
  >
5163
- <mat-icon>backspace</mat-icon>
5164
5197
  </button>
5165
5198
  </div>
5166
5199
  @switch (entry.type) {
@@ -5267,7 +5300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5267
5300
  </div>
5268
5301
  }
5269
5302
  </div>
5270
- `, styles: [".property-effect-editor{display:flex;flex-direction:column;gap:16px}.header{display:flex;align-items:center;justify-content:space-between;gap:8px}.title{font-weight:600}.property-card{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-row{display:flex;gap:8px;align-items:center}.field{flex:1}.value-columns{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));margin-top:12px}.value-block{display:flex;flex-direction:column;gap:8px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.value-label{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.preview{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.preview-title{font-size:14px;font-weight:600;margin-bottom:8px}.preview-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.preview-pane{border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;padding:8px;background:var(--md-sys-color-surface-container)}.pane-label{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:4px}pre{margin:0;background:transparent;font-size:12px;line-height:1.4}.empty{color:var(--md-sys-color-on-surface-variant);font-size:13px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:6px}.w-100{width:100%}.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}.option-content{display:flex;flex-direction:column;line-height:1.2;padding:4px 0}.option-label{font-weight:500}.option-id{font-size:11px;opacity:.6}.no-results{font-style:italic;font-size:13px;text-align:center}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
5303
+ `, styles: [".property-effect-editor{display:flex;flex-direction:column;gap:16px}.header{display:flex;align-items:center;justify-content:space-between;gap:8px}.title{font-weight:600}.property-card{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-row{display:flex;gap:8px;align-items:center}.field{flex:1}.value-columns{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));margin-top:12px}.value-block{display:flex;flex-direction:column;gap:8px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-low)}.value-label{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.preview{border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.preview-title{font-size:14px;font-weight:600;margin-bottom:8px}.preview-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.preview-pane{border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;padding:8px;background:var(--md-sys-color-surface-container)}.pane-label{font-size:12px;color:var(--md-sys-color-on-surface-variant);margin-bottom:4px}pre{margin:0;background:transparent;font-size:12px;line-height:1.4}.empty{color:var(--md-sys-color-on-surface-variant);font-size:13px;padding:8px;border:1px dashed var(--md-sys-color-outline-variant);border-radius:6px}.w-100{width:100%}.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}.option-content{display:flex;flex-direction:column;line-height:1.2;padding:4px 0}.option-label{font-weight:500}.option-id{font-size:11px;opacity:.6}.no-results{font-style:italic;font-size:13px;text-align:center}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
5271
5304
  }], propDecorators: { properties: [{
5272
5305
  type: Input
5273
5306
  }], initialConfig: [{
@@ -5279,6 +5312,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
5279
5312
  args: ['searchInput']
5280
5313
  }] } });
5281
5314
 
5315
+ const VISUAL_SAFE_OPERATORS = new Set([
5316
+ 'equals',
5317
+ 'notEquals',
5318
+ 'greaterThan',
5319
+ 'greaterThanOrEqual',
5320
+ 'lessThan',
5321
+ 'lessThanOrEqual',
5322
+ 'contains',
5323
+ 'startsWith',
5324
+ 'endsWith',
5325
+ 'in',
5326
+ ]);
5282
5327
  class FieldConditionEditorComponent {
5283
5328
  fb;
5284
5329
  config = null;
@@ -5384,34 +5429,40 @@ class FieldConditionEditorComponent {
5384
5429
  const normalizedFieldName = this.normalizeFieldName(this.config.fieldName);
5385
5430
  const resolvedField = this.resolveFieldSchema(normalizedFieldName) || null;
5386
5431
  const formFieldName = resolvedField?.name || normalizedFieldName;
5432
+ const valueType = this.normalizeValueTypeForVisualEditor(this.config.valueType);
5387
5433
  this.conditionForm.patchValue({
5388
5434
  fieldName: formFieldName || '',
5389
5435
  operator: normalizedOperator || '',
5390
- value: this.config.value !== undefined ? this.config.value : '',
5391
- valueType: this.config.valueType || 'literal',
5392
- compareToField: this.config.compareToField || '',
5393
- contextVariable: this.config.contextVariable || '',
5436
+ value: valueType === 'literal' && this.config.value !== undefined
5437
+ ? this.config.value
5438
+ : '',
5439
+ valueType,
5440
+ compareToField: valueType === 'field' ? this.config.compareToField || '' : '',
5441
+ contextVariable: '',
5442
+ functionName: '',
5394
5443
  });
5444
+ this.valueType = valueType;
5395
5445
  if (formFieldName) {
5396
5446
  this.onFieldChanged(formFieldName);
5397
5447
  }
5398
5448
  const opCtrl = this.conditionForm.get('operator');
5399
5449
  if (opCtrl) {
5400
- this.selectedOperator = opCtrl.value;
5450
+ this.selectedOperator = opCtrl.value || null;
5401
5451
  }
5402
5452
  }
5403
5453
  emitConfigChange() {
5404
5454
  if (!this.conditionForm.valid)
5405
5455
  return;
5406
5456
  const formValue = this.conditionForm.value;
5457
+ const valueType = this.normalizeValueTypeForVisualEditor(formValue.valueType);
5407
5458
  const config = {
5408
5459
  type: 'fieldCondition',
5409
5460
  fieldName: formValue.fieldName,
5410
5461
  operator: formValue.operator,
5411
- value: this.processValue(formValue.value),
5412
- valueType: formValue.valueType,
5413
- compareToField: formValue.compareToField,
5414
- contextVariable: formValue.contextVariable,
5462
+ value: valueType === 'literal' ? this.processValue(formValue.value) : null,
5463
+ valueType,
5464
+ compareToField: valueType === 'field' ? formValue.compareToField : '',
5465
+ contextVariable: '',
5415
5466
  };
5416
5467
  this.configChanged.emit(config);
5417
5468
  }
@@ -5487,6 +5538,9 @@ class FieldConditionEditorComponent {
5487
5538
  return operator;
5488
5539
  }
5489
5540
  }
5541
+ normalizeValueTypeForVisualEditor(valueType) {
5542
+ return valueType === 'field' ? 'field' : 'literal';
5543
+ }
5490
5544
  // Template methods
5491
5545
  getFieldIcon(type) {
5492
5546
  const icons = {
@@ -5644,8 +5698,7 @@ class FieldConditionEditorComponent {
5644
5698
  }
5645
5699
  this.selectedField = resolvedField;
5646
5700
  if (this.selectedField) {
5647
- this.availableOperators =
5648
- FIELD_TYPE_OPERATORS[this.selectedField.type] || [];
5701
+ this.availableOperators = (FIELD_TYPE_OPERATORS[this.selectedField.type] || []).filter((operator) => VISUAL_SAFE_OPERATORS.has(operator));
5649
5702
  // Reset operator if not compatible
5650
5703
  const currentOperator = this.conditionForm.get('operator')?.value;
5651
5704
  if (currentOperator &&
@@ -5664,9 +5717,10 @@ class FieldConditionEditorComponent {
5664
5717
  this.conditionForm.patchValue({ value: '' });
5665
5718
  }
5666
5719
  onValueTypeChanged(event) {
5667
- this.valueType = event.value;
5720
+ this.valueType = this.normalizeValueTypeForVisualEditor(event.value);
5668
5721
  // Reset related fields
5669
5722
  this.conditionForm.patchValue({
5723
+ valueType: this.valueType,
5670
5724
  value: '',
5671
5725
  compareToField: '',
5672
5726
  contextVariable: '',
@@ -5689,6 +5743,11 @@ class FieldConditionEditorComponent {
5689
5743
  const valueType = this.conditionForm.get('valueType')?.value;
5690
5744
  const valueControl = this.conditionForm.get('value');
5691
5745
  const valueProvided = valueControl && valueControl.value !== undefined && valueControl.value !== '';
5746
+ const normalizedValueType = this.normalizeValueTypeForVisualEditor(valueType);
5747
+ if (valueType !== normalizedValueType) {
5748
+ errors.push('Tipo de valor disponivel apenas por JSON avancado');
5749
+ return errors;
5750
+ }
5692
5751
  switch (valueType) {
5693
5752
  case 'literal':
5694
5753
  if (!valueProvided) {
@@ -5745,8 +5804,7 @@ class FieldConditionEditorComponent {
5745
5804
  (click)="$event.stopPropagation()"
5746
5805
  autocomplete="off">
5747
5806
  @if (searchControl.value) {
5748
- <button matSuffix mat-icon-button aria-label="Limpar" (click)="clearSearch($event)">
5749
- <mat-icon>close</mat-icon>
5807
+ <button matSuffix praxisIconButton="close" size="dense" aria-label="Limpar" (click)="clearSearch($event)">
5750
5808
  </button>
5751
5809
  }
5752
5810
  </mat-form-field>
@@ -5785,14 +5843,13 @@ class FieldConditionEditorComponent {
5785
5843
  </mat-select>
5786
5844
  @if (selectedField?.description) {
5787
5845
  <button
5788
- mat-icon-button
5846
+ praxisIconButton="help_outline"
5847
+ size="dense"
5789
5848
  matSuffix
5790
- class="help-icon-button"
5791
5849
  type="button"
5792
5850
  [matTooltip]="selectedField?.description"
5793
5851
  matTooltipPosition="above"
5794
5852
  >
5795
- <mat-icon>help_outline</mat-icon>
5796
5853
  </button>
5797
5854
  }
5798
5855
  </mat-form-field>
@@ -5825,8 +5882,8 @@ class FieldConditionEditorComponent {
5825
5882
  >
5826
5883
  <mat-option value="literal">Valor digitado</mat-option>
5827
5884
  <mat-option value="field">Outro campo</mat-option>
5828
- <mat-option value="context">Variável de contexto</mat-option>
5829
- <mat-option value="function">Chamada de função</mat-option>
5885
+ <mat-option value="context" disabled>Contexto (JSON-only)</mat-option>
5886
+ <mat-option value="function" disabled>Função (JSON-only)</mat-option>
5830
5887
  </mat-select>
5831
5888
  </mat-form-field>
5832
5889
  @switch (valueType) {
@@ -5845,14 +5902,13 @@ class FieldConditionEditorComponent {
5845
5902
  [placeholder]="getValuePlaceholder()"
5846
5903
  />
5847
5904
  <button
5848
- mat-icon-button
5905
+ praxisIconButton="help_outline"
5906
+ size="dense"
5849
5907
  matSuffix
5850
- class="help-icon-button"
5851
5908
  type="button"
5852
5909
  [matTooltip]="getValueHint()"
5853
5910
  matTooltipPosition="above"
5854
5911
  >
5855
- <mat-icon>help_outline</mat-icon>
5856
5912
  </button>
5857
5913
  </mat-form-field>
5858
5914
  }
@@ -5978,15 +6034,6 @@ class FieldConditionEditorComponent {
5978
6034
  </div>
5979
6035
  }
5980
6036
 
5981
- <!-- Ações -->
5982
- <div class="actions-col">
5983
- <button mat-icon-button type="button" aria-label="Duplicar" matTooltip="Duplicar (placeholder)">
5984
- <mat-icon>content_copy</mat-icon>
5985
- </button>
5986
- <button mat-icon-button type="button" aria-label="Excluir" matTooltip="Excluir (placeholder)">
5987
- <mat-icon>delete</mat-icon>
5988
- </button>
5989
- </div>
5990
6037
  </div>
5991
6038
 
5992
6039
  @if (!hasFieldOptions()) {
@@ -6012,7 +6059,7 @@ class FieldConditionEditorComponent {
6012
6059
  </div>
6013
6060
  }
6014
6061
  </form>
6015
- `, 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%}.actions-col{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center}.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}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: 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: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: MatCheckboxModule }, { kind: "component", type: i7$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: i8$2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8$2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8$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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
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 });
6016
6063
  }
6017
6064
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: FieldConditionEditorComponent, decorators: [{
6018
6065
  type: Component,
@@ -6028,7 +6075,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6028
6075
  MatNativeDateModule,
6029
6076
  MatChipsModule,
6030
6077
  MatAutocompleteModule,
6031
- MatTooltipModule
6078
+ MatTooltipModule,
6079
+ PraxisIconButtonComponent,
6032
6080
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
6033
6081
  <form [formGroup]="conditionForm" class="field-condition-form compact-grid">
6034
6082
  <div class="condition-row">
@@ -6053,8 +6101,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6053
6101
  (click)="$event.stopPropagation()"
6054
6102
  autocomplete="off">
6055
6103
  @if (searchControl.value) {
6056
- <button matSuffix mat-icon-button aria-label="Limpar" (click)="clearSearch($event)">
6057
- <mat-icon>close</mat-icon>
6104
+ <button matSuffix praxisIconButton="close" size="dense" aria-label="Limpar" (click)="clearSearch($event)">
6058
6105
  </button>
6059
6106
  }
6060
6107
  </mat-form-field>
@@ -6093,14 +6140,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6093
6140
  </mat-select>
6094
6141
  @if (selectedField?.description) {
6095
6142
  <button
6096
- mat-icon-button
6143
+ praxisIconButton="help_outline"
6144
+ size="dense"
6097
6145
  matSuffix
6098
- class="help-icon-button"
6099
6146
  type="button"
6100
6147
  [matTooltip]="selectedField?.description"
6101
6148
  matTooltipPosition="above"
6102
6149
  >
6103
- <mat-icon>help_outline</mat-icon>
6104
6150
  </button>
6105
6151
  }
6106
6152
  </mat-form-field>
@@ -6133,8 +6179,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6133
6179
  >
6134
6180
  <mat-option value="literal">Valor digitado</mat-option>
6135
6181
  <mat-option value="field">Outro campo</mat-option>
6136
- <mat-option value="context">Variável de contexto</mat-option>
6137
- <mat-option value="function">Chamada de função</mat-option>
6182
+ <mat-option value="context" disabled>Contexto (JSON-only)</mat-option>
6183
+ <mat-option value="function" disabled>Função (JSON-only)</mat-option>
6138
6184
  </mat-select>
6139
6185
  </mat-form-field>
6140
6186
  @switch (valueType) {
@@ -6153,14 +6199,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6153
6199
  [placeholder]="getValuePlaceholder()"
6154
6200
  />
6155
6201
  <button
6156
- mat-icon-button
6202
+ praxisIconButton="help_outline"
6203
+ size="dense"
6157
6204
  matSuffix
6158
- class="help-icon-button"
6159
6205
  type="button"
6160
6206
  [matTooltip]="getValueHint()"
6161
6207
  matTooltipPosition="above"
6162
6208
  >
6163
- <mat-icon>help_outline</mat-icon>
6164
6209
  </button>
6165
6210
  </mat-form-field>
6166
6211
  }
@@ -6286,15 +6331,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6286
6331
  </div>
6287
6332
  }
6288
6333
 
6289
- <!-- Ações -->
6290
- <div class="actions-col">
6291
- <button mat-icon-button type="button" aria-label="Duplicar" matTooltip="Duplicar (placeholder)">
6292
- <mat-icon>content_copy</mat-icon>
6293
- </button>
6294
- <button mat-icon-button type="button" aria-label="Excluir" matTooltip="Excluir (placeholder)">
6295
- <mat-icon>delete</mat-icon>
6296
- </button>
6297
- </div>
6298
6334
  </div>
6299
6335
 
6300
6336
  @if (!hasFieldOptions()) {
@@ -6320,7 +6356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
6320
6356
  </div>
6321
6357
  }
6322
6358
  </form>
6323
- `, 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%}.actions-col{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center}.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}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
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"] }]
6324
6360
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { config: [{
6325
6361
  type: Input
6326
6362
  }], fieldSchemas: [{
@@ -6699,132 +6735,132 @@ const PRAXIS_VISUAL_BUILDER_EN_US = {
6699
6735
 
6700
6736
  const PRAXIS_VISUAL_BUILDER_PT_BR = {
6701
6737
  'praxis.visualBuilder.expression.title': 'Editor de expressoes legadas',
6702
- 'praxis.visualBuilder.expression.tooltip.format': 'Formatar expressão',
6703
- 'praxis.visualBuilder.expression.tooltip.validate': 'Validar expressão',
6738
+ 'praxis.visualBuilder.expression.tooltip.format': 'Formatar expressão',
6739
+ 'praxis.visualBuilder.expression.tooltip.validate': 'Validar expressão',
6704
6740
  'praxis.visualBuilder.expression.tooltip.help': 'Ajuda e exemplos',
6705
6741
  'praxis.visualBuilder.expression.label.rules': 'Texto legado da regra',
6706
- 'praxis.visualBuilder.expression.validationTitle': 'Resultados da validação',
6742
+ 'praxis.visualBuilder.expression.validationTitle': 'Resultados da validação',
6707
6743
  'praxis.visualBuilder.expression.validationIssues': 'Pontos a corrigir:',
6708
6744
  'praxis.visualBuilder.expression.lineColumn': 'Linha {{line}}, Coluna {{column}}',
6709
- 'praxis.visualBuilder.expression.suggestion': 'Sugestão:',
6745
+ 'praxis.visualBuilder.expression.suggestion': 'Sugestão:',
6710
6746
  'praxis.visualBuilder.expression.performance': 'Desempenho:',
6711
- 'praxis.visualBuilder.expression.parseTime': 'Tempo de análise:',
6747
+ 'praxis.visualBuilder.expression.parseTime': 'Tempo de análise:',
6712
6748
  'praxis.visualBuilder.expression.complexity': 'Complexidade:',
6713
- 'praxis.visualBuilder.expression.generatedSpec': 'Especificação gerada:',
6714
- 'praxis.visualBuilder.expression.quickReference': 'Referência rápida',
6749
+ 'praxis.visualBuilder.expression.generatedSpec': 'Especificação gerada:',
6750
+ 'praxis.visualBuilder.expression.quickReference': 'Referência rápida',
6715
6751
  'praxis.visualBuilder.expression.tab.operators': 'Operadores',
6716
- 'praxis.visualBuilder.expression.tab.functions': 'Funções',
6717
- 'praxis.visualBuilder.expression.tab.variables': 'Variáveis',
6718
- 'praxis.visualBuilder.expression.variablesScope': 'Variáveis ({{scope}})',
6719
- 'praxis.visualBuilder.expression.menu.toggleReference': 'Mostrar/ocultar referência rápida',
6752
+ 'praxis.visualBuilder.expression.tab.functions': 'Funções',
6753
+ 'praxis.visualBuilder.expression.tab.variables': 'Variáveis',
6754
+ 'praxis.visualBuilder.expression.variablesScope': 'Variáveis ({{scope}})',
6755
+ 'praxis.visualBuilder.expression.menu.toggleReference': 'Mostrar/ocultar referência rápida',
6720
6756
  'praxis.visualBuilder.expression.menu.examples': 'Ver exemplos',
6721
- 'praxis.visualBuilder.expression.menu.docs': 'Documentação',
6757
+ 'praxis.visualBuilder.expression.menu.docs': 'Documentação',
6722
6758
  'praxis.visualBuilder.expression.placeholder': 'Digite o texto das regras (ex.: ${idade} > 18 && status == "ativo")',
6723
- 'praxis.visualBuilder.expression.group.logical': 'Operadores lógicos',
6724
- 'praxis.visualBuilder.expression.group.comparison': 'Operadores de comparação',
6725
- 'praxis.visualBuilder.expression.op.and': 'E (AND) lógico',
6726
- 'praxis.visualBuilder.expression.op.or': 'OU (OR) lógico',
6727
- 'praxis.visualBuilder.expression.op.not': 'NÃO (NOT) lógico',
6759
+ 'praxis.visualBuilder.expression.group.logical': 'Operadores lógicos',
6760
+ 'praxis.visualBuilder.expression.group.comparison': 'Operadores de comparação',
6761
+ 'praxis.visualBuilder.expression.op.and': 'E (AND) lógico',
6762
+ 'praxis.visualBuilder.expression.op.or': 'OU (OR) lógico',
6763
+ 'praxis.visualBuilder.expression.op.not': 'NÃO (NOT) lógico',
6728
6764
  'praxis.visualBuilder.expression.op.xor': 'OU exclusivo (XOR)',
6729
- 'praxis.visualBuilder.expression.op.implies': 'Implica (se... então...)',
6765
+ 'praxis.visualBuilder.expression.op.implies': 'Implica (se... então...)',
6730
6766
  'praxis.visualBuilder.expression.op.eq': 'Igual a',
6731
6767
  'praxis.visualBuilder.expression.op.neq': 'Diferente de',
6732
6768
  'praxis.visualBuilder.expression.op.lt': 'Menor que',
6733
6769
  'praxis.visualBuilder.expression.op.lte': 'Menor ou igual',
6734
6770
  'praxis.visualBuilder.expression.op.gt': 'Maior que',
6735
6771
  'praxis.visualBuilder.expression.op.gte': 'Maior ou igual',
6736
- 'praxis.visualBuilder.expression.op.in': 'Contém o valor',
6737
- 'praxis.visualBuilder.expression.group.textFunctions': 'Funções de texto',
6738
- 'praxis.visualBuilder.expression.group.listFunctions': 'Funções para listas',
6739
- 'praxis.visualBuilder.expression.group.conditionalFunctions': 'Funções condicionais',
6740
- 'praxis.visualBuilder.expression.fn.contains': 'Verifica se o campo contém o valor',
6741
- 'praxis.visualBuilder.expression.fn.startsWith': 'Verifica se o campo começa com o prefixo',
6772
+ 'praxis.visualBuilder.expression.op.in': 'Contém o valor',
6773
+ 'praxis.visualBuilder.expression.group.textFunctions': 'Funções de texto',
6774
+ 'praxis.visualBuilder.expression.group.listFunctions': 'Funções para listas',
6775
+ 'praxis.visualBuilder.expression.group.conditionalFunctions': 'Funções condicionais',
6776
+ 'praxis.visualBuilder.expression.fn.contains': 'Verifica se o campo contém o valor',
6777
+ 'praxis.visualBuilder.expression.fn.startsWith': 'Verifica se o campo começa com o prefixo',
6742
6778
  'praxis.visualBuilder.expression.fn.endsWith': 'Verifica se o campo termina com o sufixo',
6743
6779
  'praxis.visualBuilder.expression.fn.forEach': 'Todos os itens devem seguir a regra',
6744
- 'praxis.visualBuilder.expression.fn.uniqueBy': 'Os itens devem ser únicos pelo campo',
6745
- 'praxis.visualBuilder.expression.fn.minLength': 'Tamanho mínimo da lista',
6746
- 'praxis.visualBuilder.expression.fn.maxLength': 'Tamanho máximo da lista',
6747
- 'praxis.visualBuilder.expression.fn.requiredIf': 'Campo obrigatório quando a condição é verdadeira',
6748
- 'praxis.visualBuilder.expression.fn.visibleIf': 'Campo visível quando a condição é verdadeira',
6749
- 'praxis.visualBuilder.expression.fn.disabledIf': 'Campo desabilitado quando a condição é verdadeira',
6750
- 'praxis.visualBuilder.expression.fn.readonlyIf': 'Campo somente leitura quando a condição é verdadeira',
6751
- 'praxis.visualBuilder.expression.error.parse': 'Erro ao interpretar a expressão',
6752
- 'praxis.visualBuilder.expression.error.validation': 'Erro de validação',
6753
- 'praxis.visualBuilder.expression.hint.startTyping': 'Comece a digitar para ver sugestões...',
6754
- 'praxis.visualBuilder.expression.hint.valid': 'Expressão válida (complexidade {{complexity}})',
6780
+ 'praxis.visualBuilder.expression.fn.uniqueBy': 'Os itens devem ser únicos pelo campo',
6781
+ 'praxis.visualBuilder.expression.fn.minLength': 'Tamanho mínimo da lista',
6782
+ 'praxis.visualBuilder.expression.fn.maxLength': 'Tamanho máximo da lista',
6783
+ 'praxis.visualBuilder.expression.fn.requiredIf': 'Campo obrigatório quando a condição é verdadeira',
6784
+ 'praxis.visualBuilder.expression.fn.visibleIf': 'Campo visível quando a condição é verdadeira',
6785
+ 'praxis.visualBuilder.expression.fn.disabledIf': 'Campo desabilitado quando a condição é verdadeira',
6786
+ 'praxis.visualBuilder.expression.fn.readonlyIf': 'Campo somente leitura quando a condição é verdadeira',
6787
+ 'praxis.visualBuilder.expression.error.parse': 'Erro ao interpretar a expressão',
6788
+ 'praxis.visualBuilder.expression.error.validation': 'Erro de validação',
6789
+ 'praxis.visualBuilder.expression.hint.startTyping': 'Comece a digitar para ver sugestões...',
6790
+ 'praxis.visualBuilder.expression.hint.valid': 'Expressão válida (complexidade {{complexity}})',
6755
6791
  'praxis.visualBuilder.expression.hint.fixItems': '{{count}} ponto(s) para corrigir',
6756
6792
  'praxis.visualBuilder.expression.hint.validating': 'Validando...',
6757
- 'praxis.visualBuilder.expression.summary.valid': 'Expressão válida e pronta para uso',
6793
+ 'praxis.visualBuilder.expression.summary.valid': 'Expressão válida e pronta para uso',
6758
6794
  'praxis.visualBuilder.expression.summary.issues': '{{errors}} erro(s), {{warnings}} aviso(s)',
6759
6795
  'praxis.visualBuilder.expression.operatorSuggestion': 'Operador {{value}}',
6760
6796
  'praxis.visualBuilder.expression.keywordSuggestion': 'Palavra-chave {{value}}',
6761
6797
  'praxis.visualBuilder.conditionalValidator.label.validatorType': 'Tipo de validador',
6762
6798
  'praxis.visualBuilder.conditionalValidator.label.targetField': 'Campo alvo',
6763
- 'praxis.visualBuilder.conditionalValidator.label.logicOperator': 'Operador lógico',
6799
+ 'praxis.visualBuilder.conditionalValidator.label.logicOperator': 'Operador lógico',
6764
6800
  'praxis.visualBuilder.conditionalValidator.label.errorMessage': 'Mensagem de erro personalizada',
6765
- 'praxis.visualBuilder.conditionalValidator.label.animation': 'Animação ao ocultar/exibir',
6766
- 'praxis.visualBuilder.conditionalValidator.label.disabledStyle': 'Aparência quando desabilitado',
6801
+ 'praxis.visualBuilder.conditionalValidator.label.animation': 'Animação ao ocultar/exibir',
6802
+ 'praxis.visualBuilder.conditionalValidator.label.disabledStyle': 'Aparência quando desabilitado',
6767
6803
  'praxis.visualBuilder.conditionalValidator.label.disabledMessage': 'Mensagem ao desabilitar',
6768
- 'praxis.visualBuilder.conditionalValidator.label.readonlyStyle': 'Aparência em modo somente leitura',
6769
- 'praxis.visualBuilder.conditionalValidator.label.logic': 'Lógica:',
6770
- 'praxis.visualBuilder.conditionalValidator.type.requiredIf.label': 'Obrigatório se',
6771
- 'praxis.visualBuilder.conditionalValidator.type.requiredIf.description': 'Campo obrigatório quando a condição for atendida',
6772
- 'praxis.visualBuilder.conditionalValidator.type.visibleIf.label': 'Visível se',
6773
- 'praxis.visualBuilder.conditionalValidator.type.visibleIf.description': 'Campo aparece quando a condição for atendida',
6804
+ 'praxis.visualBuilder.conditionalValidator.label.readonlyStyle': 'Aparência em modo somente leitura',
6805
+ 'praxis.visualBuilder.conditionalValidator.label.logic': 'Lógica:',
6806
+ 'praxis.visualBuilder.conditionalValidator.type.requiredIf.label': 'Obrigatório se',
6807
+ 'praxis.visualBuilder.conditionalValidator.type.requiredIf.description': 'Campo obrigatório quando a condição for atendida',
6808
+ 'praxis.visualBuilder.conditionalValidator.type.visibleIf.label': 'Visível se',
6809
+ 'praxis.visualBuilder.conditionalValidator.type.visibleIf.description': 'Campo aparece quando a condição for atendida',
6774
6810
  'praxis.visualBuilder.conditionalValidator.type.disabledIf.label': 'Desabilitado se',
6775
- 'praxis.visualBuilder.conditionalValidator.type.disabledIf.description': 'Campo fica desabilitado quando a condição for atendida',
6811
+ 'praxis.visualBuilder.conditionalValidator.type.disabledIf.description': 'Campo fica desabilitado quando a condição for atendida',
6776
6812
  'praxis.visualBuilder.conditionalValidator.type.readonlyIf.label': 'Somente leitura se',
6777
- 'praxis.visualBuilder.conditionalValidator.type.readonlyIf.description': 'Campo fica somente leitura quando a condição for atendida',
6778
- 'praxis.visualBuilder.conditionalValidator.help.targetField': 'Escolha o campo que será afetado por esta regra',
6779
- 'praxis.visualBuilder.conditionalValidator.help.errorMessage': 'Substitui a mensagem padrão exibida ao usuário',
6780
- 'praxis.visualBuilder.conditionalValidator.section.condition': 'Configuração da condição',
6781
- 'praxis.visualBuilder.conditionalValidator.section.validation': 'Configurações de validação',
6782
- 'praxis.visualBuilder.conditionalValidator.section.uiBehavior': 'Configurações de comportamento da interface',
6783
- 'praxis.visualBuilder.conditionalValidator.section.preview': 'Pré-visualização',
6784
- 'praxis.visualBuilder.conditionalValidator.mode.simple': 'Condição simples',
6785
- 'praxis.visualBuilder.conditionalValidator.mode.advanced': 'Lógica avançada',
6786
- 'praxis.visualBuilder.conditionalValidator.logic.and': 'E (AND) - todas as condições precisam ser verdadeiras',
6787
- 'praxis.visualBuilder.conditionalValidator.logic.or': 'OU (OR) - qualquer condição pode ser verdadeira',
6788
- 'praxis.visualBuilder.conditionalValidator.logic.not': 'NÃO (NOT) - a condição precisa ser falsa',
6789
- 'praxis.visualBuilder.conditionalValidator.logic.xor': 'XOR - apenas uma condição pode ser verdadeira',
6790
- 'praxis.visualBuilder.conditionalValidator.action.addCondition': 'Adicionar condição',
6791
- 'praxis.visualBuilder.conditionalValidator.placeholder.errorMessage': 'Este campo é obrigatório',
6792
- 'praxis.visualBuilder.conditionalValidator.placeholder.disabledMessage': 'Este campo está desabilitado no momento',
6813
+ 'praxis.visualBuilder.conditionalValidator.type.readonlyIf.description': 'Campo fica somente leitura quando a condição for atendida',
6814
+ 'praxis.visualBuilder.conditionalValidator.help.targetField': 'Escolha o campo que será afetado por esta regra',
6815
+ 'praxis.visualBuilder.conditionalValidator.help.errorMessage': 'Substitui a mensagem padrão exibida ao usuário',
6816
+ 'praxis.visualBuilder.conditionalValidator.section.condition': 'Configuração da condição',
6817
+ 'praxis.visualBuilder.conditionalValidator.section.validation': 'Configurações de validação',
6818
+ 'praxis.visualBuilder.conditionalValidator.section.uiBehavior': 'Configurações de comportamento da interface',
6819
+ 'praxis.visualBuilder.conditionalValidator.section.preview': 'Pré-visualização',
6820
+ 'praxis.visualBuilder.conditionalValidator.mode.simple': 'Condição simples',
6821
+ 'praxis.visualBuilder.conditionalValidator.mode.advanced': 'Lógica avançada',
6822
+ 'praxis.visualBuilder.conditionalValidator.logic.and': 'E (AND) - todas as condições precisam ser verdadeiras',
6823
+ 'praxis.visualBuilder.conditionalValidator.logic.or': 'OU (OR) - qualquer condição pode ser verdadeira',
6824
+ 'praxis.visualBuilder.conditionalValidator.logic.not': 'NÃO (NOT) - a condição precisa ser falsa',
6825
+ 'praxis.visualBuilder.conditionalValidator.logic.xor': 'XOR - apenas uma condição pode ser verdadeira',
6826
+ 'praxis.visualBuilder.conditionalValidator.action.addCondition': 'Adicionar condição',
6827
+ 'praxis.visualBuilder.conditionalValidator.placeholder.errorMessage': 'Este campo é obrigatório',
6828
+ 'praxis.visualBuilder.conditionalValidator.placeholder.disabledMessage': 'Este campo está desabilitado no momento',
6793
6829
  'praxis.visualBuilder.conditionalValidator.option.validateOnChange': 'Validar ao alterar o campo',
6794
6830
  'praxis.visualBuilder.conditionalValidator.option.validateOnBlur': 'Validar ao sair do campo',
6795
- 'praxis.visualBuilder.conditionalValidator.option.showErrorImmediately': 'Exibir erro assim que a condição for atendida',
6796
- 'praxis.visualBuilder.conditionalValidator.option.hideLabel': 'Ocultar rótulo do campo quando escondido',
6797
- 'praxis.visualBuilder.conditionalValidator.option.preserveSpace': 'Preservar espaço ao esconder',
6831
+ 'praxis.visualBuilder.conditionalValidator.option.showErrorImmediately': 'Exibir erro assim que a condição for atendida',
6832
+ 'praxis.visualBuilder.conditionalValidator.option.hideLabel': 'Ocultar rótulo do campo quando escondido',
6833
+ 'praxis.visualBuilder.conditionalValidator.option.preserveSpace': 'Preservar espaço ao esconder',
6798
6834
  'praxis.visualBuilder.conditionalValidator.option.clearOnDisable': 'Limpar valor ao desabilitar',
6799
6835
  'praxis.visualBuilder.conditionalValidator.option.showDisabledMessage': 'Mostrar mensagem quando desabilitado',
6800
- 'praxis.visualBuilder.conditionalValidator.option.showReadonlyIndicator': 'Mostrar ícone indicando somente leitura',
6801
- 'praxis.visualBuilder.conditionalValidator.animation.none': 'Sem animação',
6802
- 'praxis.visualBuilder.conditionalValidator.animation.fade': 'Transição suave (fade)',
6836
+ 'praxis.visualBuilder.conditionalValidator.option.showReadonlyIndicator': 'Mostrar ícone indicando somente leitura',
6837
+ 'praxis.visualBuilder.conditionalValidator.animation.none': 'Sem animação',
6838
+ 'praxis.visualBuilder.conditionalValidator.animation.fade': 'Transição suave (fade)',
6803
6839
  'praxis.visualBuilder.conditionalValidator.animation.slide': 'Deslizante (vertical)',
6804
6840
  'praxis.visualBuilder.conditionalValidator.animation.scale': 'Crescer/encolher',
6805
- 'praxis.visualBuilder.conditionalValidator.disabledStyle.default': 'Padrão (cinza)',
6841
+ 'praxis.visualBuilder.conditionalValidator.disabledStyle.default': 'Padrão (cinza)',
6806
6842
  'praxis.visualBuilder.conditionalValidator.disabledStyle.faded': 'Esmaecido',
6807
6843
  'praxis.visualBuilder.conditionalValidator.disabledStyle.hidden': 'Ocultar totalmente',
6808
- 'praxis.visualBuilder.conditionalValidator.readonlyStyle.default': 'Padrão (não editável)',
6844
+ 'praxis.visualBuilder.conditionalValidator.readonlyStyle.default': 'Padrão (não editável)',
6809
6845
  'praxis.visualBuilder.conditionalValidator.readonlyStyle.display': 'Mostrar apenas o valor',
6810
6846
  'praxis.visualBuilder.conditionalValidator.readonlyStyle.bordered': 'Valor com borda',
6811
6847
  'praxis.visualBuilder.conditionalValidator.category.other': 'Outros',
6812
6848
  'praxis.visualBuilder.conditionalValidator.selectField': 'Selecione um campo',
6813
- 'praxis.visualBuilder.conditionalValidator.summary.incomplete': 'Complete as informações da regra para ver o resumo',
6814
- 'praxis.visualBuilder.conditionalValidator.summary.action.required': 'ficará obrigatório',
6815
- 'praxis.visualBuilder.conditionalValidator.summary.action.visible': 'ficará visível',
6816
- 'praxis.visualBuilder.conditionalValidator.summary.action.disabled': 'ficará desabilitado',
6817
- 'praxis.visualBuilder.conditionalValidator.summary.action.readonly': 'ficará somente leitura',
6818
- 'praxis.visualBuilder.conditionalValidator.summary.simpleCondition': 'quando a condição for atendida',
6819
- 'praxis.visualBuilder.conditionalValidator.summary.advancedCondition': 'quando as condições ({{operator}}) forem atendidas',
6820
- 'praxis.visualBuilder.conditionalValidator.summary.logicPreview.one': '{{operator}} com 1 condição',
6821
- 'praxis.visualBuilder.conditionalValidator.summary.logicPreview.other': '{{operator}} com {{count}} condições',
6849
+ 'praxis.visualBuilder.conditionalValidator.summary.incomplete': 'Complete as informações da regra para ver o resumo',
6850
+ 'praxis.visualBuilder.conditionalValidator.summary.action.required': 'ficará obrigatório',
6851
+ 'praxis.visualBuilder.conditionalValidator.summary.action.visible': 'ficará visível',
6852
+ 'praxis.visualBuilder.conditionalValidator.summary.action.disabled': 'ficará desabilitado',
6853
+ 'praxis.visualBuilder.conditionalValidator.summary.action.readonly': 'ficará somente leitura',
6854
+ 'praxis.visualBuilder.conditionalValidator.summary.simpleCondition': 'quando a condição for atendida',
6855
+ 'praxis.visualBuilder.conditionalValidator.summary.advancedCondition': 'quando as condições ({{operator}}) forem atendidas',
6856
+ 'praxis.visualBuilder.conditionalValidator.summary.logicPreview.one': '{{operator}} com 1 condição',
6857
+ 'praxis.visualBuilder.conditionalValidator.summary.logicPreview.other': '{{operator}} com {{count}} condições',
6822
6858
  'praxis.visualBuilder.conditionalValidator.error.validatorTypeRequired': 'Escolha o tipo de validador',
6823
- 'praxis.visualBuilder.conditionalValidator.error.targetFieldRequired': 'Informe o campo que será avaliado',
6824
- 'praxis.visualBuilder.conditionalValidator.error.conditionRequired': 'Adicione pelo menos uma condição',
6859
+ 'praxis.visualBuilder.conditionalValidator.error.targetFieldRequired': 'Informe o campo que será avaliado',
6860
+ 'praxis.visualBuilder.conditionalValidator.error.conditionRequired': 'Adicione pelo menos uma condição',
6825
6861
  'praxis.visualBuilder.ruleList.eyebrow': 'Regras',
6826
6862
  'praxis.visualBuilder.ruleList.title': 'Regras',
6827
- 'praxis.visualBuilder.ruleList.subtitle': 'Visibilidade, estilo e comportamento em um fluxo único.',
6863
+ 'praxis.visualBuilder.ruleList.subtitle': 'Visibilidade, estilo e comportamento em um fluxo único.',
6828
6864
  'praxis.visualBuilder.ruleList.headerCaption': 'ativas',
6829
6865
  'praxis.visualBuilder.ruleList.searchPlaceholder': 'Buscar regras...',
6830
6866
  'praxis.visualBuilder.ruleList.clearSearch': 'Limpar busca',
@@ -6833,11 +6869,11 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
6833
6869
  'praxis.visualBuilder.ruleList.aiButton': 'IA',
6834
6870
  'praxis.visualBuilder.ruleList.listAria': 'Lista de regras',
6835
6871
  'praxis.visualBuilder.ruleList.status.ready': 'Pronta',
6836
- 'praxis.visualBuilder.ruleList.status.valid': 'Válida',
6872
+ 'praxis.visualBuilder.ruleList.status.valid': 'Válida',
6837
6873
  'praxis.visualBuilder.ruleList.status.incomplete': 'Incompleta',
6838
6874
  'praxis.visualBuilder.ruleList.status.draft': 'Rascunho',
6839
6875
  'praxis.visualBuilder.ruleList.status.error': 'Com erro',
6840
- 'praxis.visualBuilder.ruleList.summary.validLabel': 'Válidas',
6876
+ 'praxis.visualBuilder.ruleList.summary.validLabel': 'Válidas',
6841
6877
  'praxis.visualBuilder.ruleList.summary.incompleteLabel': 'Pendentes',
6842
6878
  'praxis.visualBuilder.ruleList.summary.errorLabel': 'Com erro',
6843
6879
  'praxis.visualBuilder.ruleList.filter.all': 'Todas',
@@ -6848,12 +6884,12 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
6848
6884
  'praxis.visualBuilder.ruleList.noResults': 'Nenhuma regra encontrada.',
6849
6885
  'praxis.visualBuilder.ruleList.condition.with': 'Condicional',
6850
6886
  'praxis.visualBuilder.ruleList.condition.without': 'Sempre',
6851
- 'praxis.visualBuilder.ruleList.condition.configured': 'Expressão configurada',
6887
+ 'praxis.visualBuilder.ruleList.condition.configured': 'Expressão configurada',
6852
6888
  'praxis.visualBuilder.ruleList.targetType.fieldPlural': 'campos',
6853
- 'praxis.visualBuilder.ruleList.targetType.sectionPlural': 'seções',
6889
+ 'praxis.visualBuilder.ruleList.targetType.sectionPlural': 'seções',
6854
6890
  'praxis.visualBuilder.ruleList.targetType.rowPlural': 'linhas',
6855
6891
  'praxis.visualBuilder.ruleList.targetType.columnPlural': 'colunas',
6856
- 'praxis.visualBuilder.ruleList.targetType.actionPlural': 'ações',
6892
+ 'praxis.visualBuilder.ruleList.targetType.actionPlural': 'ações',
6857
6893
  'praxis.visualBuilder.ruleList.targetType.visualBlockPlural': 'blocos visuais',
6858
6894
  'praxis.visualBuilder.ruleList.target.none': 'Nenhum alvo',
6859
6895
  'praxis.visualBuilder.ruleList.summary.when': 'Quando',
@@ -6873,98 +6909,98 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
6873
6909
  'praxis.visualBuilder.ruleList.summary.draft': 'Comece escolhendo um alvo e definindo o efeito principal.',
6874
6910
  'praxis.visualBuilder.ruleList.summary.error': 'A regra precisa de ajuste antes de ser publicada.',
6875
6911
  'praxis.visualBuilder.ruleList.insight.target': 'Alvo principal',
6876
- 'praxis.visualBuilder.ruleList.insight.condition': 'Condição',
6912
+ 'praxis.visualBuilder.ruleList.insight.condition': 'Condição',
6877
6913
  'praxis.visualBuilder.ruleList.insight.effect': 'Efeito',
6878
6914
  'praxis.visualBuilder.ruleList.effect.pending': 'Sem efeito',
6879
6915
  'praxis.visualBuilder.ruleList.effect.whenFalse': 'quando falso',
6880
6916
  'praxis.visualBuilder.ruleList.effect.visibleOn': 'mostrar',
6881
6917
  'praxis.visualBuilder.ruleList.effect.visibleOff': 'ocultar',
6882
- 'praxis.visualBuilder.ruleList.effect.requiredOn': 'tornar obrigatório',
6918
+ 'praxis.visualBuilder.ruleList.effect.requiredOn': 'tornar obrigatório',
6883
6919
  'praxis.visualBuilder.ruleList.effect.requiredOff': 'tornar opcional',
6884
6920
  'praxis.visualBuilder.ruleList.effect.disabledOn': 'desabilitar',
6885
6921
  'praxis.visualBuilder.ruleList.effect.disabledOff': 'habilitar',
6886
6922
  'praxis.visualBuilder.ruleList.effect.set': 'definir',
6887
6923
  'praxis.visualBuilder.ruleList.time.now': 'Agora',
6888
- 'praxis.visualBuilder.ruleList.time.minute': 'min atrás',
6889
- 'praxis.visualBuilder.ruleList.time.minutes': 'min atrás',
6890
- 'praxis.visualBuilder.ruleList.time.hour': 'h atrás',
6891
- 'praxis.visualBuilder.ruleList.time.hours': 'h atrás',
6892
- 'praxis.visualBuilder.ruleList.time.day': 'dia atrás',
6893
- 'praxis.visualBuilder.ruleList.time.days': 'dias atrás',
6924
+ 'praxis.visualBuilder.ruleList.time.minute': 'min atrás',
6925
+ 'praxis.visualBuilder.ruleList.time.minutes': 'min atrás',
6926
+ 'praxis.visualBuilder.ruleList.time.hour': 'h atrás',
6927
+ 'praxis.visualBuilder.ruleList.time.hours': 'h atrás',
6928
+ 'praxis.visualBuilder.ruleList.time.day': 'dia atrás',
6929
+ 'praxis.visualBuilder.ruleList.time.days': 'dias atrás',
6894
6930
  'praxis.visualBuilder.target.title': 'Alvos',
6895
6931
  'praxis.visualBuilder.target.subtitle': 'Onde aplicar a regra',
6896
6932
  'praxis.visualBuilder.target.description': 'Escolha um tipo de alvo e selecione os itens que a regra vai afetar.',
6897
6933
  'praxis.visualBuilder.target.heroTitle': 'Selecione os alvos da regra',
6898
- 'praxis.visualBuilder.target.heroDescription': 'Defina onde esta regra será aplicada: campos, seções, linhas, colunas ou ações do formulário.',
6899
- 'praxis.visualBuilder.target.heroHint': 'Escolha um tipo de alvo e selecione os elementos específicos do formulário.',
6934
+ 'praxis.visualBuilder.target.heroDescription': 'Defina onde esta regra será aplicada: campos, seções, linhas, colunas ou ações do formulário.',
6935
+ 'praxis.visualBuilder.target.heroHint': 'Escolha um tipo de alvo e selecione os elementos específicos do formulário.',
6900
6936
  'praxis.visualBuilder.target.selectTitle': 'Selecionar alvos',
6901
- 'praxis.visualBuilder.target.searchPlaceholder': 'Filtrar por rótulo ou ID interno...',
6937
+ 'praxis.visualBuilder.target.searchPlaceholder': 'Filtrar por rótulo ou ID interno...',
6902
6938
  'praxis.visualBuilder.target.searchClear': 'Limpar busca',
6903
6939
  'praxis.visualBuilder.target.noResults': 'Nenhum alvo encontrado.',
6904
6940
  'praxis.visualBuilder.target.selectedLabel': 'Alvos selecionados',
6905
6941
  'praxis.visualBuilder.target.selectedSummary': 'selecionados',
6906
- 'praxis.visualBuilder.target.stats.available': 'disponíveis',
6942
+ 'praxis.visualBuilder.target.stats.available': 'disponíveis',
6907
6943
  'praxis.visualBuilder.target.stats.selected': 'selecionados',
6908
- 'praxis.visualBuilder.target.group.availableSingular': 'disponível',
6909
- 'praxis.visualBuilder.target.group.availablePlural': 'disponíveis',
6944
+ 'praxis.visualBuilder.target.group.availableSingular': 'disponível',
6945
+ 'praxis.visualBuilder.target.group.availablePlural': 'disponíveis',
6910
6946
  'praxis.visualBuilder.target.group.fields': 'Campos',
6911
6947
  'praxis.visualBuilder.target.meta.internalId': 'ID interno',
6912
- 'praxis.visualBuilder.target.meta.scope': 'do formulário',
6948
+ 'praxis.visualBuilder.target.meta.scope': 'do formulário',
6913
6949
  'praxis.visualBuilder.target.type.field.label': 'Campo',
6914
6950
  'praxis.visualBuilder.target.type.field.labelPlural': 'Campos',
6915
- 'praxis.visualBuilder.target.type.field.description': 'Campos específicos.',
6916
- 'praxis.visualBuilder.target.type.section.label': 'Seção',
6917
- 'praxis.visualBuilder.target.type.section.labelPlural': 'Seções',
6918
- 'praxis.visualBuilder.target.type.section.description': 'Seção inteira.',
6951
+ 'praxis.visualBuilder.target.type.field.description': 'Campos específicos.',
6952
+ 'praxis.visualBuilder.target.type.section.label': 'Seção',
6953
+ 'praxis.visualBuilder.target.type.section.labelPlural': 'Seções',
6954
+ 'praxis.visualBuilder.target.type.section.description': 'Seção inteira.',
6919
6955
  'praxis.visualBuilder.target.type.row.label': 'Linha',
6920
6956
  'praxis.visualBuilder.target.type.row.labelPlural': 'Linhas',
6921
6957
  'praxis.visualBuilder.target.type.row.description': 'Linha do layout.',
6922
6958
  'praxis.visualBuilder.target.type.column.label': 'Coluna',
6923
6959
  'praxis.visualBuilder.target.type.column.labelPlural': 'Colunas',
6924
6960
  'praxis.visualBuilder.target.type.column.description': 'Coluna do layout.',
6925
- 'praxis.visualBuilder.target.type.action.label': 'Ação',
6926
- 'praxis.visualBuilder.target.type.action.labelPlural': 'Ações',
6927
- 'praxis.visualBuilder.target.type.action.description': 'Botões de ação.',
6961
+ 'praxis.visualBuilder.target.type.action.label': 'Ação',
6962
+ 'praxis.visualBuilder.target.type.action.labelPlural': 'Ações',
6963
+ 'praxis.visualBuilder.target.type.action.description': 'Botões de ação.',
6928
6964
  'praxis.visualBuilder.target.type.visualBlock.label': 'Bloco visual',
6929
6965
  'praxis.visualBuilder.target.type.visualBlock.labelPlural': 'Blocos visuais',
6930
6966
  'praxis.visualBuilder.target.type.visualBlock.description': 'Bloco editorial no layout.',
6931
6967
  'praxis.visualBuilder.target.type.allPlural': 'Alvos',
6932
6968
  'praxis.visualBuilder.ruleDefinition.step1.title': 'Alvos',
6933
6969
  'praxis.visualBuilder.ruleDefinition.step1.subtitle': 'Onde aplicar',
6934
- 'praxis.visualBuilder.ruleDefinition.step1.question': 'Escolha onde essa regra entra em ação.',
6935
- 'praxis.visualBuilder.ruleDefinition.step2.title': 'Condição',
6970
+ 'praxis.visualBuilder.ruleDefinition.step1.question': 'Escolha onde essa regra entra em ação.',
6971
+ 'praxis.visualBuilder.ruleDefinition.step2.title': 'Condição',
6936
6972
  'praxis.visualBuilder.ruleDefinition.step2.subtitle': 'Quando executar',
6937
6973
  'praxis.visualBuilder.ruleDefinition.step2.question': 'Quando a regra deve ser aplicada?',
6938
6974
  'praxis.visualBuilder.ruleDefinition.step3.title': 'Efeitos',
6939
6975
  'praxis.visualBuilder.ruleDefinition.step3.subtitle': 'O que fazer',
6940
- 'praxis.visualBuilder.ruleDefinition.step3.question': 'O que deve acontecer quando a condição for satisfeita?',
6941
- 'praxis.visualBuilder.ruleDefinition.step4.title': 'Revisão',
6976
+ 'praxis.visualBuilder.ruleDefinition.step3.question': 'O que deve acontecer quando a condição for satisfeita?',
6977
+ 'praxis.visualBuilder.ruleDefinition.step4.title': 'Revisão',
6942
6978
  'praxis.visualBuilder.ruleDefinition.step4.subtitle': 'Confirmar regra',
6943
6979
  'praxis.visualBuilder.ruleDefinition.step4.question': 'Revise e confirme a regra',
6944
- 'praxis.visualBuilder.ruleDefinition.action.next': 'Próximo',
6980
+ 'praxis.visualBuilder.ruleDefinition.action.next': 'Próximo',
6945
6981
  'praxis.visualBuilder.ruleDefinition.action.previous': 'Anterior',
6946
6982
  'praxis.visualBuilder.ruleDefinition.action.cancel': 'Cancelar',
6947
6983
  'praxis.visualBuilder.ruleDefinition.action.reset': 'Resetar',
6948
6984
  'praxis.visualBuilder.ruleDefinition.action.save': 'Salvar regra',
6949
6985
  'praxis.visualBuilder.ruleDefinition.conditionMode.always': 'Sempre',
6950
6986
  'praxis.visualBuilder.ruleDefinition.conditionMode.visual': 'Visual',
6951
- 'praxis.visualBuilder.ruleDefinition.conditionWarning.tooltip': 'Altere o alvo ou ajuste os campos da condição para este contexto.',
6987
+ 'praxis.visualBuilder.ruleDefinition.conditionWarning.tooltip': 'Altere o alvo ou ajuste os campos da condição para este contexto.',
6952
6988
  'praxis.visualBuilder.ruleDefinition.conditionWarning.prefix': 'Campos fora do contexto atual',
6953
- 'praxis.visualBuilder.ruleDefinition.conditionWarning.suffix': 'Eles serão ignorados até você escolher campos compatíveis.',
6954
- 'praxis.visualBuilder.ruleDefinition.condition.alwaysHint': 'A regra será aplicada sempre.',
6989
+ 'praxis.visualBuilder.ruleDefinition.conditionWarning.suffix': 'Eles serão ignorados até você escolher campos compatíveis.',
6990
+ 'praxis.visualBuilder.ruleDefinition.condition.alwaysHint': 'A regra será aplicada sempre.',
6955
6991
  'praxis.visualBuilder.ruleDefinition.review.targets': 'Alvos selecionados',
6956
6992
  'praxis.visualBuilder.ruleDefinition.review.heroTitle': 'Resumo da regra',
6957
6993
  'praxis.visualBuilder.ruleDefinition.review.noTargets': 'Nenhum alvo selecionado.',
6958
- 'praxis.visualBuilder.ruleDefinition.review.condition': 'Condição',
6994
+ 'praxis.visualBuilder.ruleDefinition.review.condition': 'Condição',
6959
6995
  'praxis.visualBuilder.ruleDefinition.review.mode': 'Modo',
6960
- 'praxis.visualBuilder.ruleDefinition.review.alwaysMode': 'Sempre (sem condição)',
6996
+ 'praxis.visualBuilder.ruleDefinition.review.alwaysMode': 'Sempre (sem condição)',
6961
6997
  'praxis.visualBuilder.ruleDefinition.review.effects': 'Efeitos',
6962
6998
  'praxis.visualBuilder.ruleDefinition.review.whenFalse': 'Quando falso',
6963
- 'praxis.visualBuilder.ruleDefinition.review.whenFalseNone': 'Sem ação adicional',
6964
- 'praxis.visualBuilder.ruleDefinition.review.technical': 'Detalhes técnicos',
6965
- 'praxis.visualBuilder.ruleDefinition.review.conditionJson': 'JSON da condição',
6966
- 'praxis.visualBuilder.ruleDefinition.review.summary.always': 'sempre que o formulário estiver neste contexto',
6967
- 'praxis.visualBuilder.ruleDefinition.review.summary.conditional': 'quando a condição configurada for satisfeita',
6999
+ 'praxis.visualBuilder.ruleDefinition.review.whenFalseNone': 'Sem ação adicional',
7000
+ 'praxis.visualBuilder.ruleDefinition.review.technical': 'Detalhes técnicos',
7001
+ 'praxis.visualBuilder.ruleDefinition.review.conditionJson': 'JSON da condição',
7002
+ 'praxis.visualBuilder.ruleDefinition.review.summary.always': 'sempre que o formulário estiver neste contexto',
7003
+ 'praxis.visualBuilder.ruleDefinition.review.summary.conditional': 'quando a condição configurada for satisfeita',
6968
7004
  'praxis.visualBuilder.ruleDefinition.review.json': 'JSON da regra',
6969
7005
  'praxis.visualBuilder.ruleDefinition.review.effects.noneEditorial': 'Nenhum efeito principal definido',
6970
7006
  'praxis.visualBuilder.ruleDefinition.conditionDescription.always': 'Sempre',
@@ -6974,14 +7010,14 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
6974
7010
  'praxis.visualBuilder.ruleDefinition.effects.trueCount': 'efeito(s) verdadeiro(s)',
6975
7011
  'praxis.visualBuilder.ruleDefinition.effects.falseCount': 'efeito(s) falso(s)',
6976
7012
  'praxis.visualBuilder.ruleDefinition.targetType.fieldPlural': 'Campos',
6977
- 'praxis.visualBuilder.ruleDefinition.targetType.sectionPlural': 'Seções',
7013
+ 'praxis.visualBuilder.ruleDefinition.targetType.sectionPlural': 'Seções',
6978
7014
  'praxis.visualBuilder.ruleDefinition.targetType.rowPlural': 'Linhas',
6979
7015
  'praxis.visualBuilder.ruleDefinition.targetType.columnPlural': 'Colunas',
6980
- 'praxis.visualBuilder.ruleDefinition.targetType.actionPlural': 'Ações',
7016
+ 'praxis.visualBuilder.ruleDefinition.targetType.actionPlural': 'Ações',
6981
7017
  'praxis.visualBuilder.ruleDefinition.targetType.visualBlockPlural': 'Blocos visuais',
6982
7018
  'praxis.visualBuilder.ruleDefinition.effect.visibleOn': 'Mostrar os elementos selecionados',
6983
7019
  'praxis.visualBuilder.ruleDefinition.effect.visibleOff': 'Ocultar os elementos selecionados',
6984
- 'praxis.visualBuilder.ruleDefinition.effect.requiredOn': 'Tornar os campos obrigatórios',
7020
+ 'praxis.visualBuilder.ruleDefinition.effect.requiredOn': 'Tornar os campos obrigatórios',
6985
7021
  'praxis.visualBuilder.ruleDefinition.effect.requiredOff': 'Tornar os campos opcionais',
6986
7022
  'praxis.visualBuilder.ruleDefinition.effect.disabledOn': 'Desabilitar os elementos selecionados',
6987
7023
  'praxis.visualBuilder.ruleDefinition.effect.disabledOff': 'Habilitar os elementos selecionados',
@@ -6991,11 +7027,11 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
6991
7027
  'praxis.visualBuilder.ruleEditor.shell.breadcrumb': 'Editor de regras',
6992
7028
  'praxis.visualBuilder.ruleEditor.shell.nav.layout': 'Layout',
6993
7029
  'praxis.visualBuilder.ruleEditor.shell.nav.rules': 'Regras',
6994
- 'praxis.visualBuilder.ruleEditor.shell.nav.docs': 'Documentação',
6995
- 'praxis.visualBuilder.ruleEditor.shell.unsaved': 'Alterações não salvas',
7030
+ 'praxis.visualBuilder.ruleEditor.shell.nav.docs': 'Documentação',
7031
+ 'praxis.visualBuilder.ruleEditor.shell.unsaved': 'Alterações não salvas',
6996
7032
  'praxis.visualBuilder.ruleEditor.toolbar.collapseList': 'Recolher painel lateral',
6997
7033
  'praxis.visualBuilder.ruleEditor.toolbar.expandList': 'Expandir painel lateral',
6998
- 'praxis.visualBuilder.ruleEditor.toolbar.aiTooltip': 'Descreva sua regra e a IA monta o rascunho para você',
7034
+ 'praxis.visualBuilder.ruleEditor.toolbar.aiTooltip': 'Descreva sua regra e a IA monta o rascunho para você',
6999
7035
  'praxis.visualBuilder.ruleEditor.toolbar.newRule': 'Nova regra',
7000
7036
  'praxis.visualBuilder.ruleEditor.toolbar.aiButton': 'Criar com IA',
7001
7037
  'praxis.visualBuilder.ruleEditor.toolbar.undo': 'Desfazer',
@@ -7004,11 +7040,11 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
7004
7040
  'praxis.visualBuilder.ruleEditor.toolbar.export': 'Exportar',
7005
7041
  'praxis.visualBuilder.ruleEditor.toolbar.importTooltip': 'Importar regras',
7006
7042
  'praxis.visualBuilder.ruleEditor.toolbar.import': 'Importar',
7007
- 'praxis.visualBuilder.ruleEditor.toolbar.advanced': 'Mais opções',
7008
- 'praxis.visualBuilder.ruleEditor.toolbar.devOptions': 'Opções de desenvolvedor',
7043
+ 'praxis.visualBuilder.ruleEditor.toolbar.advanced': 'Mais opções',
7044
+ 'praxis.visualBuilder.ruleEditor.toolbar.devOptions': 'Opções de desenvolvedor',
7009
7045
  'praxis.visualBuilder.ruleEditor.hero.eyebrow': 'Builder visual',
7010
7046
  'praxis.visualBuilder.ruleEditor.hero.title': 'Construa regras com clareza visual',
7011
- 'praxis.visualBuilder.ruleEditor.hero.subtitle': 'Combine alvos, condições e efeitos em uma experiência guiada para usuários de negócio e usuários técnicos.',
7047
+ 'praxis.visualBuilder.ruleEditor.hero.subtitle': 'Combine alvos, condições e efeitos em uma experiência guiada para usuários de negócio e usuários técnicos.',
7012
7048
  'praxis.visualBuilder.ruleEditor.hero.progress': 'Progresso',
7013
7049
  'praxis.visualBuilder.ruleEditor.hero.progressOf': 'de',
7014
7050
  'praxis.visualBuilder.ruleEditor.hero.progressEmpty': '0 de 0',
@@ -7017,30 +7053,30 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
7017
7053
  'praxis.visualBuilder.ruleEditor.hero.healthError': 'Revisar',
7018
7054
  'praxis.visualBuilder.ruleEditor.hero.healthProgress': 'Em progresso',
7019
7055
  'praxis.visualBuilder.ruleEditor.hero.healthIdle': 'Em branco',
7020
- 'praxis.visualBuilder.ruleEditor.hero.selectedFallback': 'Regra em edição',
7056
+ 'praxis.visualBuilder.ruleEditor.hero.selectedFallback': 'Regra em edição',
7021
7057
  'praxis.visualBuilder.ruleEditor.hero.targetCount': 'alvo(s)',
7022
7058
  'praxis.visualBuilder.ruleEditor.hero.conditional': 'condicional',
7023
7059
  'praxis.visualBuilder.ruleEditor.hero.always': 'sempre ativa',
7024
7060
  'praxis.visualBuilder.ruleEditor.hero.effectCount': 'efeito(s)',
7025
- 'praxis.visualBuilder.ruleEditor.debug.show': 'Mostrar painel de depuração (debug)',
7026
- 'praxis.visualBuilder.ruleEditor.debug.hide': 'Ocultar painel de depuração (debug)',
7061
+ 'praxis.visualBuilder.ruleEditor.debug.show': 'Mostrar painel de depuração (debug)',
7062
+ 'praxis.visualBuilder.ruleEditor.debug.hide': 'Ocultar painel de depuração (debug)',
7027
7063
  'praxis.visualBuilder.ruleEditor.debug.clearAll': 'Limpar tudo',
7028
- 'praxis.visualBuilder.ruleEditor.debug.title': 'Estado de depuração (debug)',
7029
- 'praxis.visualBuilder.ruleEditor.unsupported.title': 'Tipo de regra não suportado',
7030
- 'praxis.visualBuilder.ruleEditor.unsupported.body': 'Este nó usa um formato legado. Remova e recrie como regra de propriedade.',
7064
+ 'praxis.visualBuilder.ruleEditor.debug.title': 'Estado de depuração (debug)',
7065
+ 'praxis.visualBuilder.ruleEditor.unsupported.title': 'Tipo de regra não suportado',
7066
+ 'praxis.visualBuilder.ruleEditor.unsupported.body': 'Este usa um formato legado. Remova e recrie como regra de propriedade.',
7031
7067
  'praxis.visualBuilder.ruleEditor.empty.title': 'Selecione uma regra ou crie uma nova',
7032
- 'praxis.visualBuilder.ruleEditor.empty.body': 'Monte regras visuais com alvo, condição e efeito em uma trilha guiada.',
7068
+ 'praxis.visualBuilder.ruleEditor.empty.body': 'Monte regras visuais com alvo, condição e efeito em uma trilha guiada.',
7033
7069
  'praxis.visualBuilder.ruleEditor.empty.cta': 'Criar regra',
7034
7070
  'praxis.visualBuilder.ruleEditor.status.rules': 'Regras',
7035
- 'praxis.visualBuilder.ruleEditor.status.unsaved': 'Não salvo',
7071
+ 'praxis.visualBuilder.ruleEditor.status.unsaved': 'Não salvo',
7036
7072
  'praxis.visualBuilder.ruleEditor.status.errors': 'erro(s)',
7037
- 'praxis.visualBuilder.ruleEditor.status.valid': 'Válido',
7073
+ 'praxis.visualBuilder.ruleEditor.status.valid': 'Válido',
7038
7074
  'praxis.visualBuilder.ruleEditor.confirm.clearAll': 'Tem certeza que deseja apagar todas as regras?',
7039
7075
  'praxis.visualBuilder.ruleEditor.confirm.removeRule': 'Remover esta regra?',
7040
7076
  'praxis.visualBuilder.ruleEditor.action.close': 'Fechar',
7041
7077
  'praxis.visualBuilder.ruleEditor.actionLabel.show': 'Mostrar',
7042
7078
  'praxis.visualBuilder.ruleEditor.actionLabel.hide': 'Ocultar',
7043
- 'praxis.visualBuilder.ruleEditor.actionLabel.require': 'Tornar obrigatório',
7079
+ 'praxis.visualBuilder.ruleEditor.actionLabel.require': 'Tornar obrigatório',
7044
7080
  'praxis.visualBuilder.ruleEditor.actionLabel.optional': 'Tornar opcional',
7045
7081
  'praxis.visualBuilder.ruleEditor.actionLabel.disable': 'Desabilitar',
7046
7082
  'praxis.visualBuilder.ruleEditor.actionLabel.enable': 'Habilitar',
@@ -7048,12 +7084,12 @@ const PRAXIS_VISUAL_BUILDER_PT_BR = {
7048
7084
  'praxis.visualBuilder.ruleEditor.label.ruleFor': 'Regra para',
7049
7085
  'praxis.visualBuilder.ruleEditor.label.targets': 'alvo(s)',
7050
7086
  'praxis.visualBuilder.ruleEditor.label.newWithoutTargets': 'Nova regra sem alvos',
7051
- 'praxis.visualBuilder.ruleEditor.label.withCondition': 'com condição',
7052
- 'praxis.visualBuilder.ruleEditor.validation.found': 'erro(s) de validação encontrado(s)',
7087
+ 'praxis.visualBuilder.ruleEditor.label.withCondition': 'com condição',
7088
+ 'praxis.visualBuilder.ruleEditor.validation.found': 'erro(s) de validação encontrado(s)',
7053
7089
  'praxis.visualBuilder.ruleEditor.validation.view': 'Ver',
7054
7090
  'praxis.visualBuilder.ruleEditor.newRule': 'Nova regra',
7055
- 'praxis.visualBuilder.ruleEditor.duplicateCopy': 'cópia',
7056
- 'praxis.visualBuilder.ruleEditor.import.success': 'Importação concluída',
7091
+ 'praxis.visualBuilder.ruleEditor.duplicateCopy': 'cópia',
7092
+ 'praxis.visualBuilder.ruleEditor.import.success': 'Importação concluída',
7057
7093
  'praxis.visualBuilder.ruleEditor.import.failure': 'Falha ao importar regras',
7058
7094
  'praxis.visualBuilder.ruleEditor.ai.applyError': 'Erro ao aplicar regra',
7059
7095
  'praxis.visualBuilder.ruleEditor.ai.draftPrefix': 'IA',
@@ -7570,14 +7606,13 @@ class ConditionalValidatorEditorComponent {
7570
7606
  }
7571
7607
  </mat-select>
7572
7608
  <button
7573
- mat-icon-button
7609
+ praxisIconButton="help_outline"
7610
+ size="dense"
7574
7611
  matSuffix
7575
- class="help-icon-button"
7576
7612
  type="button"
7577
7613
  [matTooltip]="t('conditionalValidator.help.targetField', 'Choose the field affected by this rule')"
7578
7614
  matTooltipPosition="above"
7579
7615
  >
7580
- <mat-icon>help_outline</mat-icon>
7581
7616
  </button>
7582
7617
  </mat-form-field>
7583
7618
  </div>
@@ -7645,12 +7680,12 @@ class ConditionalValidatorEditorComponent {
7645
7680
  <div class="condition-header">
7646
7681
  <span class="condition-number">{{ i + 1 }}</span>
7647
7682
  <button
7648
- mat-icon-button
7649
- color="warn"
7683
+ praxisIconButton="delete"
7684
+ size="dense"
7685
+ class="danger-action"
7650
7686
  (click)="removeCondition(i)"
7651
7687
  [disabled]="advancedConditions.length <= 1"
7652
7688
  >
7653
- <mat-icon>delete</mat-icon>
7654
7689
  </button>
7655
7690
  </div>
7656
7691
  <praxis-field-condition-editor
@@ -7693,14 +7728,13 @@ class ConditionalValidatorEditorComponent {
7693
7728
  [placeholder]="t('conditionalValidator.placeholder.errorMessage', 'This field is required')"
7694
7729
  />
7695
7730
  <button
7696
- mat-icon-button
7731
+ praxisIconButton="help_outline"
7732
+ size="dense"
7697
7733
  matSuffix
7698
- class="help-icon-button"
7699
7734
  type="button"
7700
7735
  [matTooltip]="t('conditionalValidator.help.errorMessage', 'Overrides the default message shown to the user')"
7701
7736
  matTooltipPosition="above"
7702
7737
  >
7703
- <mat-icon>help_outline</mat-icon>
7704
7738
  </button>
7705
7739
  </mat-form-field>
7706
7740
  <div class="validation-options">
@@ -7831,7 +7865,7 @@ class ConditionalValidatorEditorComponent {
7831
7865
  </div>
7832
7866
  }
7833
7867
  </form>
7834
- `, isInline: true, styles: [".conditional-validator-form{display:flex;flex-direction:column;gap:16px;width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-field-select{flex:1;min-width:200px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-trigger{display:inline-flex;align-items:center;gap:8px}.trigger-icon{font-size:18px}.trigger-label{font-weight:600}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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-variant);padding:2px 6px;border-radius:4px}.form-section{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-variant)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.condition-mode-selector{margin-bottom:16px}.simple-condition,.advanced-condition{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.logic-operator{width:100%;margin-bottom:16px}.conditions-list{display:flex;flex-direction:column;gap:12px}.condition-item{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-variant)}.condition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.condition-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.add-condition-button{align-self:flex-start}.validation-settings,.ui-settings{display:flex;flex-direction:column;gap:12px}.validation-options{display:flex;flex-direction:column;gap:8px}.error-message-input,.animation-select,.disabled-style-select,.readonly-style-select,.disabled-message-input{width:100%}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline)}.preview-logic{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-field-select{width:100%}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: 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.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: "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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7$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: MatChipsModule }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: FieldConditionEditorComponent, selector: "praxis-field-condition-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7868
+ `, isInline: true, styles: [".conditional-validator-form{display:flex;flex-direction:column;gap:16px;width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-field-select{flex:1;min-width:200px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-trigger{display:inline-flex;align-items:center;gap:8px}.trigger-icon{font-size:18px}.trigger-label{font-weight:600}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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-variant);padding:2px 6px;border-radius:4px}.form-section{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-variant)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.condition-mode-selector{margin-bottom:16px}.simple-condition,.advanced-condition{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.logic-operator{width:100%;margin-bottom:16px}.conditions-list{display:flex;flex-direction:column;gap:12px}.condition-item{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-variant)}.condition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.condition-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.add-condition-button{align-self:flex-start}.validation-settings,.ui-settings{display:flex;flex-direction:column;gap:12px}.validation-options{display:flex;flex-direction:column;gap:8px}.error-message-input,.animation-select,.disabled-style-select,.readonly-style-select,.disabled-message-input{width:100%}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline)}.preview-logic{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-field-select{width:100%}}.danger-action{color:var(--md-sys-color-error)}.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.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: "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: MatButtonToggleModule }, { kind: "directive", type: i7$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: 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: MatChipsModule }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "component", type: FieldConditionEditorComponent, selector: "praxis-field-condition-editor", inputs: ["config", "fieldSchemas"], outputs: ["configChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7835
7869
  }
7836
7870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ConditionalValidatorEditorComponent, decorators: [{
7837
7871
  type: Component,
@@ -7848,6 +7882,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
7848
7882
  MatTooltipModule,
7849
7883
  MatTabsModule,
7850
7884
  MatDividerModule,
7885
+ PraxisIconButtonComponent,
7851
7886
  FieldConditionEditorComponent
7852
7887
  ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [providePraxisVisualBuilderI18n()], template: `
7853
7888
  <form [formGroup]="validatorForm" class="conditional-validator-form">
@@ -7933,14 +7968,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
7933
7968
  }
7934
7969
  </mat-select>
7935
7970
  <button
7936
- mat-icon-button
7971
+ praxisIconButton="help_outline"
7972
+ size="dense"
7937
7973
  matSuffix
7938
- class="help-icon-button"
7939
7974
  type="button"
7940
7975
  [matTooltip]="t('conditionalValidator.help.targetField', 'Choose the field affected by this rule')"
7941
7976
  matTooltipPosition="above"
7942
7977
  >
7943
- <mat-icon>help_outline</mat-icon>
7944
7978
  </button>
7945
7979
  </mat-form-field>
7946
7980
  </div>
@@ -8008,12 +8042,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8008
8042
  <div class="condition-header">
8009
8043
  <span class="condition-number">{{ i + 1 }}</span>
8010
8044
  <button
8011
- mat-icon-button
8012
- color="warn"
8045
+ praxisIconButton="delete"
8046
+ size="dense"
8047
+ class="danger-action"
8013
8048
  (click)="removeCondition(i)"
8014
8049
  [disabled]="advancedConditions.length <= 1"
8015
8050
  >
8016
- <mat-icon>delete</mat-icon>
8017
8051
  </button>
8018
8052
  </div>
8019
8053
  <praxis-field-condition-editor
@@ -8056,14 +8090,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8056
8090
  [placeholder]="t('conditionalValidator.placeholder.errorMessage', 'This field is required')"
8057
8091
  />
8058
8092
  <button
8059
- mat-icon-button
8093
+ praxisIconButton="help_outline"
8094
+ size="dense"
8060
8095
  matSuffix
8061
- class="help-icon-button"
8062
8096
  type="button"
8063
8097
  [matTooltip]="t('conditionalValidator.help.errorMessage', 'Overrides the default message shown to the user')"
8064
8098
  matTooltipPosition="above"
8065
8099
  >
8066
- <mat-icon>help_outline</mat-icon>
8067
8100
  </button>
8068
8101
  </mat-form-field>
8069
8102
  <div class="validation-options">
@@ -8194,7 +8227,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
8194
8227
  </div>
8195
8228
  }
8196
8229
  </form>
8197
- `, styles: [".conditional-validator-form{display:flex;flex-direction:column;gap:16px;width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-field-select{flex:1;min-width:200px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-trigger{display:inline-flex;align-items:center;gap:8px}.trigger-icon{font-size:18px}.trigger-label{font-weight:600}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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-variant);padding:2px 6px;border-radius:4px}.form-section{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-variant)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.condition-mode-selector{margin-bottom:16px}.simple-condition,.advanced-condition{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.logic-operator{width:100%;margin-bottom:16px}.conditions-list{display:flex;flex-direction:column;gap:12px}.condition-item{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-variant)}.condition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.condition-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.add-condition-button{align-self:flex-start}.validation-settings,.ui-settings{display:flex;flex-direction:column;gap:12px}.validation-options{display:flex;flex-direction:column;gap:8px}.error-message-input,.animation-select,.disabled-style-select,.readonly-style-select,.disabled-message-input{width:100%}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline)}.preview-logic{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-field-select{width:100%}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
8230
+ `, styles: [".conditional-validator-form{display:flex;flex-direction:column;gap:16px;width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-field-select{flex:1;min-width:200px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-trigger{display:inline-flex;align-items:center;gap:8px}.trigger-icon{font-size:18px}.trigger-label{font-weight:600}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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-variant);padding:2px 6px;border-radius:4px}.form-section{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-variant)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.condition-mode-selector{margin-bottom:16px}.simple-condition,.advanced-condition{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.logic-operator{width:100%;margin-bottom:16px}.conditions-list{display:flex;flex-direction:column;gap:12px}.condition-item{border:1px solid var(--md-sys-color-outline);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-variant)}.condition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.condition-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.add-condition-button{align-self:flex-start}.validation-settings,.ui-settings{display:flex;flex-direction:column;gap:12px}.validation-options{display:flex;flex-direction:column;gap:8px}.error-message-input,.animation-select,.disabled-style-select,.readonly-style-select,.disabled-message-input{width:100%}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline)}.preview-logic{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-field-select{width:100%}}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
8198
8231
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }, { type: i1$2.PraxisI18nService, decorators: [{
8199
8232
  type: Optional
8200
8233
  }] }], propDecorators: { config: [{
@@ -8603,14 +8636,13 @@ class CollectionValidatorEditorComponent {
8603
8636
  }
8604
8637
  </mat-select>
8605
8638
  <button
8606
- mat-icon-button
8639
+ praxisIconButton="help_outline"
8640
+ size="dense"
8607
8641
  matSuffix
8608
- class="help-icon-button"
8609
8642
  type="button"
8610
8643
  [matTooltip]="'Select the array/collection field this validator applies to'"
8611
8644
  matTooltipPosition="above"
8612
8645
  >
8613
- <mat-icon>help_outline</mat-icon>
8614
8646
  </button>
8615
8647
  </mat-form-field>
8616
8648
  </div>
@@ -8631,14 +8663,13 @@ class CollectionValidatorEditorComponent {
8631
8663
  formControlName="itemVariable"
8632
8664
  placeholder="item">
8633
8665
  <button
8634
- mat-icon-button
8666
+ praxisIconButton="help_outline"
8667
+ size="dense"
8635
8668
  matSuffix
8636
- class="help-icon-button"
8637
8669
  type="button"
8638
8670
  [matTooltip]="'Variable name to reference each item (e.g., \\'item\\', \\'record\\')'"
8639
8671
  matTooltipPosition="above"
8640
8672
  >
8641
- <mat-icon>help_outline</mat-icon>
8642
8673
  </button>
8643
8674
  </mat-form-field>
8644
8675
  <mat-form-field appearance="outline" class="index-variable-input">
@@ -8647,14 +8678,13 @@ class CollectionValidatorEditorComponent {
8647
8678
  formControlName="indexVariable"
8648
8679
  placeholder="index">
8649
8680
  <button
8650
- mat-icon-button
8681
+ praxisIconButton="help_outline"
8682
+ size="dense"
8651
8683
  matSuffix
8652
- class="help-icon-button"
8653
8684
  type="button"
8654
8685
  [matTooltip]="'Variable name to reference item index (optional)'"
8655
8686
  matTooltipPosition="above"
8656
8687
  >
8657
- <mat-icon>help_outline</mat-icon>
8658
8688
  </button>
8659
8689
  </mat-form-field>
8660
8690
  </div>
@@ -8667,11 +8697,11 @@ class CollectionValidatorEditorComponent {
8667
8697
  [formGroupName]="i">
8668
8698
  <div class="rule-header">
8669
8699
  <span class="rule-number">{{ i + 1 }}</span>
8670
- <button mat-icon-button
8671
- color="warn"
8700
+ <button praxisIconButton="delete"
8701
+ size="dense"
8702
+ class="danger-action"
8672
8703
  (click)="removeItemValidationRule(i)"
8673
8704
  [disabled]="itemValidationRules.length <= 1">
8674
- <mat-icon>delete</mat-icon>
8675
8705
  </button>
8676
8706
  </div>
8677
8707
  <div class="rule-config">
@@ -8690,14 +8720,13 @@ class CollectionValidatorEditorComponent {
8690
8720
  formControlName="fieldPath"
8691
8721
  placeholder="item.propertyName">
8692
8722
  <button
8693
- mat-icon-button
8723
+ praxisIconButton="help_outline"
8724
+ size="dense"
8694
8725
  matSuffix
8695
- class="help-icon-button"
8696
8726
  type="button"
8697
8727
  [matTooltip]="'Path to the field within each item'"
8698
8728
  matTooltipPosition="above"
8699
8729
  >
8700
- <mat-icon>help_outline</mat-icon>
8701
8730
  </button>
8702
8731
  </mat-form-field>
8703
8732
  <mat-form-field appearance="outline" class="rule-message-input">
@@ -8742,11 +8771,11 @@ class CollectionValidatorEditorComponent {
8742
8771
  [formControlName]="i"
8743
8772
  placeholder="item.propertyName">
8744
8773
  </mat-form-field>
8745
- <button mat-icon-button
8746
- color="warn"
8774
+ <button praxisIconButton="delete"
8775
+ size="dense"
8776
+ class="danger-action"
8747
8777
  (click)="removeUniqueField(i)"
8748
8778
  [disabled]="uniqueByFields.length <= 1">
8749
- <mat-icon>delete</mat-icon>
8750
8779
  </button>
8751
8780
  </div>
8752
8781
  }
@@ -8795,14 +8824,13 @@ class CollectionValidatorEditorComponent {
8795
8824
  min="0"
8796
8825
  placeholder="0">
8797
8826
  <button
8798
- mat-icon-button
8827
+ praxisIconButton="help_outline"
8828
+ size="dense"
8799
8829
  matSuffix
8800
- class="help-icon-button"
8801
8830
  type="button"
8802
8831
  [matTooltip]="'Minimum number of items required'"
8803
8832
  matTooltipPosition="above"
8804
8833
  >
8805
- <mat-icon>help_outline</mat-icon>
8806
8834
  </button>
8807
8835
  </mat-form-field>
8808
8836
  }
@@ -8815,14 +8843,13 @@ class CollectionValidatorEditorComponent {
8815
8843
  min="1"
8816
8844
  placeholder="100">
8817
8845
  <button
8818
- mat-icon-button
8846
+ praxisIconButton="help_outline"
8847
+ size="dense"
8819
8848
  matSuffix
8820
- class="help-icon-button"
8821
8849
  type="button"
8822
8850
  [matTooltip]="'Maximum number of items allowed'"
8823
8851
  matTooltipPosition="above"
8824
8852
  >
8825
- <mat-icon>help_outline</mat-icon>
8826
8853
  </button>
8827
8854
  </mat-form-field>
8828
8855
  }
@@ -8918,14 +8945,13 @@ class CollectionValidatorEditorComponent {
8918
8945
  max="1000"
8919
8946
  placeholder="50">
8920
8947
  <button
8921
- mat-icon-button
8948
+ praxisIconButton="help_outline"
8949
+ size="dense"
8922
8950
  matSuffix
8923
- class="help-icon-button"
8924
8951
  type="button"
8925
8952
  [matTooltip]="'Number of items to validate at once'"
8926
8953
  matTooltipPosition="above"
8927
8954
  >
8928
- <mat-icon>help_outline</mat-icon>
8929
8955
  </button>
8930
8956
  </mat-form-field>
8931
8957
  <mat-checkbox formControlName="debounceValidation">
@@ -8990,7 +9016,7 @@ class CollectionValidatorEditorComponent {
8990
9016
  </div>
8991
9017
  }
8992
9018
  </form>
8993
- `, isInline: true, styles: [".collection-validator-form{display:flex;flex-direction:column;gap:16px;max-width:900px}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-collection-select{flex:1;min-width:250px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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}.form-section{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-container)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-title h5{margin:16px 0 8px;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.foreach-config,.unique-config,.length-config{display:flex;flex-direction:column;gap:16px}.item-schema-info{display:flex;gap:12px}.item-variable-input,.index-variable-input{flex:1}.validation-rules{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.validation-rule-item,.unique-field-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;margin-bottom:12px;background:var(--md-sys-color-surface-container)}.rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.rule-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.rule-config{display:flex;flex-direction:column;gap:8px}.unique-field-item{display:flex;align-items:center;gap:8px}.field-path-input{flex:1}.length-inputs{display:flex;gap:12px}.length-input{flex:1}.length-slider{margin:16px 0}.length-slider label{display:block;margin-bottom:8px;font-size:13px;font-weight:500}.length-options,.unique-options{display:flex;flex-direction:column;gap:12px}.advanced-options{background:var(--md-sys-color-secondary-container);border-color:var(--md-sys-color-secondary)}.advanced-config{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.validation-timing,.error-handling,.performance-options{display:flex;flex-direction:column;gap:8px}.validation-timing h5,.error-handling h5,.performance-options h5{margin:0 0 8px;font-size:12px;font-weight:600;color:var(--md-sys-color-secondary);text-transform:uppercase}.add-rule-button,.add-field-button{align-self:flex-start}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.preview-details{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:1024px){.advanced-config{grid-template-columns:1fr 1fr}}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-collection-select{width:100%}.item-schema-info,.length-inputs{flex-direction:column}.advanced-config{grid-template-columns:1fr}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { 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.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: "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: "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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: MatCheckboxModule }, { kind: "component", type: i7$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: MatChipsModule }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i9$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i9$1.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9019
+ `, isInline: true, styles: [".collection-validator-form{display:flex;flex-direction:column;gap:16px;max-width:900px}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-collection-select{flex:1;min-width:250px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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}.form-section{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-container)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-title h5{margin:16px 0 8px;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.foreach-config,.unique-config,.length-config{display:flex;flex-direction:column;gap:16px}.item-schema-info{display:flex;gap:12px}.item-variable-input,.index-variable-input{flex:1}.validation-rules{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.validation-rule-item,.unique-field-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;margin-bottom:12px;background:var(--md-sys-color-surface-container)}.rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.rule-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.rule-config{display:flex;flex-direction:column;gap:8px}.unique-field-item{display:flex;align-items:center;gap:8px}.field-path-input{flex:1}.length-inputs{display:flex;gap:12px}.length-input{flex:1}.length-slider{margin:16px 0}.length-slider label{display:block;margin-bottom:8px;font-size:13px;font-weight:500}.length-options,.unique-options{display:flex;flex-direction:column;gap:12px}.advanced-options{background:var(--md-sys-color-secondary-container);border-color:var(--md-sys-color-secondary)}.advanced-config{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.validation-timing,.error-handling,.performance-options{display:flex;flex-direction:column;gap:8px}.validation-timing h5,.error-handling h5,.performance-options h5{margin:0 0 8px;font-size:12px;font-weight:600;color:var(--md-sys-color-secondary);text-transform:uppercase}.add-rule-button,.add-field-button{align-self:flex-start}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.preview-details{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:1024px){.advanced-config{grid-template-columns:1fr 1fr}}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-collection-select{width:100%}.item-schema-info,.length-inputs{flex-direction:column}.advanced-config{grid-template-columns:1fr}}.danger-action{color:var(--md-sys-color-error)}.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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { 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.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: "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: "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: 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: MatChipsModule }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSliderModule }, { kind: "component", type: i9$1.MatSlider, selector: "mat-slider", inputs: ["disabled", "discrete", "showTickMarks", "min", "color", "disableRipple", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i9$1.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8994
9020
  }
8995
9021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CollectionValidatorEditorComponent, decorators: [{
8996
9022
  type: Component,
@@ -9006,7 +9032,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9006
9032
  MatTooltipModule,
9007
9033
  MatTabsModule,
9008
9034
  MatDividerModule,
9009
- MatSliderModule
9035
+ MatSliderModule,
9036
+ PraxisIconButtonComponent
9010
9037
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
9011
9038
  <form [formGroup]="collectionForm" class="collection-validator-form">
9012
9039
  <!-- Validator Type Selection -->
@@ -9070,14 +9097,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9070
9097
  }
9071
9098
  </mat-select>
9072
9099
  <button
9073
- mat-icon-button
9100
+ praxisIconButton="help_outline"
9101
+ size="dense"
9074
9102
  matSuffix
9075
- class="help-icon-button"
9076
9103
  type="button"
9077
9104
  [matTooltip]="'Select the array/collection field this validator applies to'"
9078
9105
  matTooltipPosition="above"
9079
9106
  >
9080
- <mat-icon>help_outline</mat-icon>
9081
9107
  </button>
9082
9108
  </mat-form-field>
9083
9109
  </div>
@@ -9098,14 +9124,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9098
9124
  formControlName="itemVariable"
9099
9125
  placeholder="item">
9100
9126
  <button
9101
- mat-icon-button
9127
+ praxisIconButton="help_outline"
9128
+ size="dense"
9102
9129
  matSuffix
9103
- class="help-icon-button"
9104
9130
  type="button"
9105
9131
  [matTooltip]="'Variable name to reference each item (e.g., \\'item\\', \\'record\\')'"
9106
9132
  matTooltipPosition="above"
9107
9133
  >
9108
- <mat-icon>help_outline</mat-icon>
9109
9134
  </button>
9110
9135
  </mat-form-field>
9111
9136
  <mat-form-field appearance="outline" class="index-variable-input">
@@ -9114,14 +9139,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9114
9139
  formControlName="indexVariable"
9115
9140
  placeholder="index">
9116
9141
  <button
9117
- mat-icon-button
9142
+ praxisIconButton="help_outline"
9143
+ size="dense"
9118
9144
  matSuffix
9119
- class="help-icon-button"
9120
9145
  type="button"
9121
9146
  [matTooltip]="'Variable name to reference item index (optional)'"
9122
9147
  matTooltipPosition="above"
9123
9148
  >
9124
- <mat-icon>help_outline</mat-icon>
9125
9149
  </button>
9126
9150
  </mat-form-field>
9127
9151
  </div>
@@ -9134,11 +9158,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9134
9158
  [formGroupName]="i">
9135
9159
  <div class="rule-header">
9136
9160
  <span class="rule-number">{{ i + 1 }}</span>
9137
- <button mat-icon-button
9138
- color="warn"
9161
+ <button praxisIconButton="delete"
9162
+ size="dense"
9163
+ class="danger-action"
9139
9164
  (click)="removeItemValidationRule(i)"
9140
9165
  [disabled]="itemValidationRules.length <= 1">
9141
- <mat-icon>delete</mat-icon>
9142
9166
  </button>
9143
9167
  </div>
9144
9168
  <div class="rule-config">
@@ -9157,14 +9181,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9157
9181
  formControlName="fieldPath"
9158
9182
  placeholder="item.propertyName">
9159
9183
  <button
9160
- mat-icon-button
9184
+ praxisIconButton="help_outline"
9185
+ size="dense"
9161
9186
  matSuffix
9162
- class="help-icon-button"
9163
9187
  type="button"
9164
9188
  [matTooltip]="'Path to the field within each item'"
9165
9189
  matTooltipPosition="above"
9166
9190
  >
9167
- <mat-icon>help_outline</mat-icon>
9168
9191
  </button>
9169
9192
  </mat-form-field>
9170
9193
  <mat-form-field appearance="outline" class="rule-message-input">
@@ -9209,11 +9232,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9209
9232
  [formControlName]="i"
9210
9233
  placeholder="item.propertyName">
9211
9234
  </mat-form-field>
9212
- <button mat-icon-button
9213
- color="warn"
9235
+ <button praxisIconButton="delete"
9236
+ size="dense"
9237
+ class="danger-action"
9214
9238
  (click)="removeUniqueField(i)"
9215
9239
  [disabled]="uniqueByFields.length <= 1">
9216
- <mat-icon>delete</mat-icon>
9217
9240
  </button>
9218
9241
  </div>
9219
9242
  }
@@ -9262,14 +9285,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9262
9285
  min="0"
9263
9286
  placeholder="0">
9264
9287
  <button
9265
- mat-icon-button
9288
+ praxisIconButton="help_outline"
9289
+ size="dense"
9266
9290
  matSuffix
9267
- class="help-icon-button"
9268
9291
  type="button"
9269
9292
  [matTooltip]="'Minimum number of items required'"
9270
9293
  matTooltipPosition="above"
9271
9294
  >
9272
- <mat-icon>help_outline</mat-icon>
9273
9295
  </button>
9274
9296
  </mat-form-field>
9275
9297
  }
@@ -9282,14 +9304,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9282
9304
  min="1"
9283
9305
  placeholder="100">
9284
9306
  <button
9285
- mat-icon-button
9307
+ praxisIconButton="help_outline"
9308
+ size="dense"
9286
9309
  matSuffix
9287
- class="help-icon-button"
9288
9310
  type="button"
9289
9311
  [matTooltip]="'Maximum number of items allowed'"
9290
9312
  matTooltipPosition="above"
9291
9313
  >
9292
- <mat-icon>help_outline</mat-icon>
9293
9314
  </button>
9294
9315
  </mat-form-field>
9295
9316
  }
@@ -9385,14 +9406,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9385
9406
  max="1000"
9386
9407
  placeholder="50">
9387
9408
  <button
9388
- mat-icon-button
9409
+ praxisIconButton="help_outline"
9410
+ size="dense"
9389
9411
  matSuffix
9390
- class="help-icon-button"
9391
9412
  type="button"
9392
9413
  [matTooltip]="'Number of items to validate at once'"
9393
9414
  matTooltipPosition="above"
9394
9415
  >
9395
- <mat-icon>help_outline</mat-icon>
9396
9416
  </button>
9397
9417
  </mat-form-field>
9398
9418
  <mat-checkbox formControlName="debounceValidation">
@@ -9457,7 +9477,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
9457
9477
  </div>
9458
9478
  }
9459
9479
  </form>
9460
- `, styles: [".collection-validator-form{display:flex;flex-direction:column;gap:16px;max-width:900px}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-collection-select{flex:1;min-width:250px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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}.form-section{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-container)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-title h5{margin:16px 0 8px;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.foreach-config,.unique-config,.length-config{display:flex;flex-direction:column;gap:16px}.item-schema-info{display:flex;gap:12px}.item-variable-input,.index-variable-input{flex:1}.validation-rules{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.validation-rule-item,.unique-field-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;margin-bottom:12px;background:var(--md-sys-color-surface-container)}.rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.rule-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.rule-config{display:flex;flex-direction:column;gap:8px}.unique-field-item{display:flex;align-items:center;gap:8px}.field-path-input{flex:1}.length-inputs{display:flex;gap:12px}.length-input{flex:1}.length-slider{margin:16px 0}.length-slider label{display:block;margin-bottom:8px;font-size:13px;font-weight:500}.length-options,.unique-options{display:flex;flex-direction:column;gap:12px}.advanced-options{background:var(--md-sys-color-secondary-container);border-color:var(--md-sys-color-secondary)}.advanced-config{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.validation-timing,.error-handling,.performance-options{display:flex;flex-direction:column;gap:8px}.validation-timing h5,.error-handling h5,.performance-options h5{margin:0 0 8px;font-size:12px;font-weight:600;color:var(--md-sys-color-secondary);text-transform:uppercase}.add-rule-button,.add-field-button{align-self:flex-start}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.preview-details{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:1024px){.advanced-config{grid-template-columns:1fr 1fr}}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-collection-select{width:100%}.item-schema-info,.length-inputs{flex-direction:column}.advanced-config{grid-template-columns:1fr}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
9480
+ `, styles: [".collection-validator-form{display:flex;flex-direction:column;gap:16px;max-width:900px}.form-row{display:flex;gap:12px;align-items:flex-start}.validator-type-select,.target-collection-select{flex:1;min-width:250px}.validator-option{display:flex;flex-direction:column;gap:4px}.validator-option mat-icon{align-self:flex-start;color:var(--md-sys-color-primary)}.validator-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.field-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}.form-section{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:16px;background:var(--md-sys-color-surface-container)}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-title h5{margin:16px 0 8px;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.foreach-config,.unique-config,.length-config{display:flex;flex-direction:column;gap:16px}.item-schema-info{display:flex;gap:12px}.item-variable-input,.index-variable-input{flex:1}.validation-rules{background:var(--md-sys-color-surface);border-radius:8px;padding:16px}.validation-rule-item,.unique-field-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;margin-bottom:12px;background:var(--md-sys-color-surface-container)}.rule-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.rule-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.rule-config{display:flex;flex-direction:column;gap:8px}.unique-field-item{display:flex;align-items:center;gap:8px}.field-path-input{flex:1}.length-inputs{display:flex;gap:12px}.length-input{flex:1}.length-slider{margin:16px 0}.length-slider label{display:block;margin-bottom:8px;font-size:13px;font-weight:500}.length-options,.unique-options{display:flex;flex-direction:column;gap:12px}.advanced-options{background:var(--md-sys-color-secondary-container);border-color:var(--md-sys-color-secondary)}.advanced-config{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px}.validation-timing,.error-handling,.performance-options{display:flex;flex-direction:column;gap:8px}.validation-timing h5,.error-handling h5,.performance-options h5{margin:0 0 8px;font-size:12px;font-weight:600;color:var(--md-sys-color-secondary);text-transform:uppercase}.add-rule-button,.add-field-button{align-self:flex-start}.preview-section{background:var(--md-sys-color-primary-container);border-color:var(--md-sys-color-primary)}.preview-content{display:flex;flex-direction:column;gap:8px}.preview-text{font-family:monospace;font-size:14px;background:var(--md-sys-color-surface);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant)}.preview-details{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.validation-messages{background:var(--md-sys-color-error-container);border-radius:4px;padding:8px 12px}.validation-error{display:flex;align-items:center;gap:6px;color:var(--md-sys-color-on-error-container);font-size:12px;margin-bottom:4px}.validation-error:last-child{margin-bottom:0}.validation-error mat-icon{font-size:14px;width:14px;height:14px}@media(max-width:1024px){.advanced-config{grid-template-columns:1fr 1fr}}@media(max-width:768px){.form-row{flex-direction:column}.validator-type-select,.target-collection-select{width:100%}.item-schema-info,.length-inputs{flex-direction:column}.advanced-config{grid-template-columns:1fr}}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
9461
9481
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { config: [{
9462
9482
  type: Input
9463
9483
  }], fieldSchemas: [{
@@ -9782,11 +9802,12 @@ class RuleNodeComponent {
9782
9802
 
9783
9803
  <!-- Node Menu -->
9784
9804
  <button
9785
- mat-icon-button
9805
+ praxisIconButton="more_vert"
9806
+ size="dense"
9807
+ aria-label="Ações da regra"
9786
9808
  [matMenuTriggerFor]="nodeMenu"
9787
9809
  (click)="$event.stopPropagation()"
9788
9810
  >
9789
- <mat-icon>more_vert</mat-icon>
9790
9811
  </button>
9791
9812
 
9792
9813
  <mat-menu #nodeMenu="matMenu">
@@ -9996,19 +10017,19 @@ class RuleNodeComponent {
9996
10017
  @if (canHaveChildren()) {
9997
10018
  <div class="add-child-area">
9998
10019
  <button
9999
- mat-icon-button
10000
- color="primary"
10020
+ praxisIconButton="add_circle"
10021
+ size="dense"
10022
+ aria-label="Adicionar regra filha"
10001
10023
  (click)="showAddChildMenu()"
10002
10024
  class="add-child-button"
10003
10025
  >
10004
- <mat-icon>add_circle</mat-icon>
10005
10026
  </button>
10006
10027
  </div>
10007
10028
  }
10008
10029
  </div>
10009
10030
  }
10010
10031
  </div>
10011
- `, 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: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: 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: i7$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: i7$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$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: i10$1.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: "ngmodule", type: DragDropModule }, { kind: "directive", type: i12$2.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: i12$2.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 });
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 });
10012
10033
  }
10013
10034
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleNodeComponent, decorators: [{
10014
10035
  type: Component,
@@ -10025,6 +10046,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10025
10046
  MatChipsModule,
10026
10047
  MatBadgeModule,
10027
10048
  MatDividerModule,
10049
+ PraxisIconButtonComponent,
10028
10050
  DragDropModule,
10029
10051
  FieldConditionEditorComponent,
10030
10052
  ConditionalValidatorEditorComponent,
@@ -10067,11 +10089,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10067
10089
 
10068
10090
  <!-- Node Menu -->
10069
10091
  <button
10070
- mat-icon-button
10092
+ praxisIconButton="more_vert"
10093
+ size="dense"
10094
+ aria-label="Ações da regra"
10071
10095
  [matMenuTriggerFor]="nodeMenu"
10072
10096
  (click)="$event.stopPropagation()"
10073
10097
  >
10074
- <mat-icon>more_vert</mat-icon>
10075
10098
  </button>
10076
10099
 
10077
10100
  <mat-menu #nodeMenu="matMenu">
@@ -10281,12 +10304,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10281
10304
  @if (canHaveChildren()) {
10282
10305
  <div class="add-child-area">
10283
10306
  <button
10284
- mat-icon-button
10285
- color="primary"
10307
+ praxisIconButton="add_circle"
10308
+ size="dense"
10309
+ aria-label="Adicionar regra filha"
10286
10310
  (click)="showAddChildMenu()"
10287
10311
  class="add-child-button"
10288
10312
  >
10289
- <mat-icon>add_circle</mat-icon>
10290
10313
  </button>
10291
10314
  </div>
10292
10315
  }
@@ -11151,11 +11174,11 @@ class TargetSelectorComponent {
11151
11174
  @if (searchControl.value) {
11152
11175
  <button
11153
11176
  matSuffix
11154
- mat-icon-button
11177
+ praxisIconButton="close"
11178
+ size="dense"
11155
11179
  [attr.aria-label]="t('target.searchClear', 'Limpar busca')"
11156
11180
  (click)="clearSearch($event)"
11157
11181
  >
11158
- <mat-icon>close</mat-icon>
11159
11182
  </button>
11160
11183
  }
11161
11184
  </mat-form-field>
@@ -11231,7 +11254,7 @@ class TargetSelectorComponent {
11231
11254
  </div>
11232
11255
  }
11233
11256
  </div>
11234
- `, isInline: true, styles: [".target-selector-container{--_pvb-target-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-target-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-target-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));--_pvb-target-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-target-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;gap:16px}.section-header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:12px 0 8px}.hero-icon{width:74px;height:74px;border-radius:20px;display:inline-flex;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--_pvb-target-accent) 24%,transparent);background:radial-gradient(circle at 30% 30%,color-mix(in srgb,var(--_pvb-target-accent) 22%,transparent) 0%,transparent 55%),color-mix(in srgb,var(--_pvb-target-surface) 98%,black 2%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 34px color-mix(in srgb,var(--_pvb-target-accent) 12%,transparent)}.hero-icon mat-icon{color:var(--_pvb-target-accent);font-size:30px;width:30px;height:30px}.section-title{font-weight:600;font-size:18px;color:var(--md-sys-color-on-surface)}.section-description{max-width:680px;font-size:14px;color:var(--_pvb-target-text-soft);line-height:1.5}.hero-pill{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:0 16px;border-radius:999px;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 72%,transparent);background:color-mix(in srgb,var(--_pvb-target-surface-strong) 96%,black 4%);font-size:12px;color:var(--_pvb-target-text-soft);box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.type-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(136px,1fr));gap:12px}.type-toggle{min-height:88px;height:100%;text-align:left;display:flex;align-items:center;justify-content:center;gap:10px;padding:14px 16px;line-height:1.3;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 72%,transparent);box-sizing:border-box;border-radius:16px;background:color-mix(in srgb,var(--_pvb-target-surface) 92%,black 8%);transition:border-color .22s ease,background .22s ease,transform .22s ease,box-shadow .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 12px 26px color-mix(in srgb,black 12%,transparent)}.type-toggle:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-target-accent) 36%,transparent)}.type-toggle.mat-button-toggle-checked{border-color:color-mix(in srgb,var(--_pvb-target-accent) 54%,transparent);background:color-mix(in srgb,var(--_pvb-target-accent) 12%,var(--_pvb-target-surface) 88%);box-shadow:inset 0 1px color-mix(in srgb,white 7%,transparent),0 18px 34px color-mix(in srgb,var(--_pvb-target-accent) 14%,transparent)}.type-text{display:flex;flex-direction:column;gap:2px;max-width:100%}.type-label{font-weight:600}.type-desc{font-size:12px;color:var(--_pvb-target-text-soft);line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.target-list-selector{margin-top:8px;border-top:1px solid color-mix(in srgb,var(--_pvb-target-border) 52%,transparent);padding-top:14px}.w-100{width:100%}.list-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:12px 0;flex-wrap:wrap}.list-title{font-weight:600}.list-stats{font-size:13px;color:var(--_pvb-target-text-soft);white-space:nowrap}.search-input-field{width:260px;align-self:center;display:flex;align-items:center}.search-input-field ::ng-deep .mat-mdc-text-field-wrapper{border-radius:14px;background:color-mix(in srgb,var(--_pvb-target-surface-strong) 94%,black 6%)}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.target-groups{display:flex;flex-direction:column;gap:12px;max-height:340px;overflow:auto;padding-right:4px}.card-list{display:flex;flex-direction:column;gap:8px}.target-card{display:flex;gap:12px;padding:12px 16px;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 78%,transparent);border-radius:14px;cursor:pointer;transition:border-color .22s ease,background .22s ease,transform .22s ease,box-shadow .22s ease;align-items:center;background:color-mix(in srgb,var(--_pvb-target-surface) 96%,black 4%);min-height:72px;box-shadow:inset 0 1px color-mix(in srgb,white 4%,transparent),0 10px 22px color-mix(in srgb,black 10%,transparent)}.target-card:hover{border-color:color-mix(in srgb,var(--_pvb-target-accent) 40%,transparent);transform:translateY(-1px);box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 16px 28px color-mix(in srgb,var(--_pvb-target-accent) 10%,transparent)}.target-card.selected{border-color:color-mix(in srgb,var(--_pvb-target-accent) 64%,transparent);background:color-mix(in srgb,var(--_pvb-target-accent) 12%,var(--_pvb-target-surface) 88%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 30px color-mix(in srgb,var(--_pvb-target-accent) 12%,transparent)}.card-icon{color:var(--_pvb-target-accent);filter:drop-shadow(0 0 10px color-mix(in srgb,var(--_pvb-target-accent) 16%,transparent))}.card-content{display:flex;flex-direction:column;gap:4px}.card-title{font-weight:600}.card-subtitle{font-size:13px;color:var(--_pvb-target-text-soft)}.card-meta{font-size:12px;color:var(--_pvb-target-text-soft)}.selected-wrapper{background:color-mix(in srgb,var(--_pvb-target-surface) 96%,black 4%);border:1px solid color-mix(in srgb,var(--_pvb-target-border) 78%,transparent);border-radius:14px;padding:12px 14px;display:flex;flex-direction:column;gap:8px;margin-top:12px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.selected-label{font-weight:600;font-size:13px;color:var(--md-sys-color-on-surface)}.selected-targets-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:2px}.chip-icon{margin-right:4px}.selected-summary{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px dashed color-mix(in srgb,var(--_pvb-target-border) 82%,transparent);border-radius:16px;font-size:13px;color:var(--md-sys-color-on-surface)}.no-results{font-style:italic;font-size:13px;text-align:center;padding:12px 0;color:var(--_pvb-target-text-soft)}.target-accordion .mat-expansion-panel-header{padding-top:8px;padding-bottom:8px}.target-accordion .mat-expansion-panel-body{padding-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { 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: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { 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: MatButtonToggleModule }, { kind: "directive", type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7$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: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i11$1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i11$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i11$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i11$1.MatExpansionPanelDescription, selector: "mat-panel-description" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11257
+ `, isInline: true, styles: [".target-selector-container{--_pvb-target-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-target-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-target-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));--_pvb-target-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-target-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));display:flex;flex-direction:column;gap:16px}.section-header{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;padding:12px 0 8px}.hero-icon{width:74px;height:74px;border-radius:20px;display:inline-flex;align-items:center;justify-content:center;border:1px solid color-mix(in srgb,var(--_pvb-target-accent) 24%,transparent);background:radial-gradient(circle at 30% 30%,color-mix(in srgb,var(--_pvb-target-accent) 22%,transparent) 0%,transparent 55%),color-mix(in srgb,var(--_pvb-target-surface) 98%,black 2%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 34px color-mix(in srgb,var(--_pvb-target-accent) 12%,transparent)}.hero-icon mat-icon{color:var(--_pvb-target-accent);font-size:30px;width:30px;height:30px}.section-title{font-weight:600;font-size:18px;color:var(--md-sys-color-on-surface)}.section-description{max-width:680px;font-size:14px;color:var(--_pvb-target-text-soft);line-height:1.5}.hero-pill{display:inline-flex;align-items:center;gap:8px;min-height:34px;padding:0 16px;border-radius:999px;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 72%,transparent);background:color-mix(in srgb,var(--_pvb-target-surface-strong) 96%,black 4%);font-size:12px;color:var(--_pvb-target-text-soft);box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.type-toggle-group{display:grid;grid-template-columns:repeat(auto-fit,minmax(136px,1fr));gap:12px}.type-toggle{min-height:88px;height:100%;text-align:left;display:flex;align-items:center;justify-content:center;gap:10px;padding:14px 16px;line-height:1.3;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 72%,transparent);box-sizing:border-box;border-radius:16px;background:color-mix(in srgb,var(--_pvb-target-surface) 92%,black 8%);transition:border-color .22s ease,background .22s ease,transform .22s ease,box-shadow .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 12px 26px color-mix(in srgb,black 12%,transparent)}.type-toggle:hover{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-target-accent) 36%,transparent)}.type-toggle.mat-button-toggle-checked{border-color:color-mix(in srgb,var(--_pvb-target-accent) 54%,transparent);background:color-mix(in srgb,var(--_pvb-target-accent) 12%,var(--_pvb-target-surface) 88%);box-shadow:inset 0 1px color-mix(in srgb,white 7%,transparent),0 18px 34px color-mix(in srgb,var(--_pvb-target-accent) 14%,transparent)}.type-text{display:flex;flex-direction:column;gap:2px;max-width:100%}.type-label{font-weight:600}.type-desc{font-size:12px;color:var(--_pvb-target-text-soft);line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.target-list-selector{margin-top:8px;border-top:1px solid color-mix(in srgb,var(--_pvb-target-border) 52%,transparent);padding-top:14px}.w-100{width:100%}.list-header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:12px 0;flex-wrap:wrap}.list-title{font-weight:600}.list-stats{font-size:13px;color:var(--_pvb-target-text-soft);white-space:nowrap}.search-input-field{width:260px;align-self:center;display:flex;align-items:center}.search-input-field ::ng-deep .mat-mdc-text-field-wrapper{border-radius:14px;background:color-mix(in srgb,var(--_pvb-target-surface-strong) 94%,black 6%)}.search-input-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.target-groups{display:flex;flex-direction:column;gap:12px;max-height:340px;overflow:auto;padding-right:4px}.card-list{display:flex;flex-direction:column;gap:8px}.target-card{display:flex;gap:12px;padding:12px 16px;border:1px solid color-mix(in srgb,var(--_pvb-target-border) 78%,transparent);border-radius:14px;cursor:pointer;transition:border-color .22s ease,background .22s ease,transform .22s ease,box-shadow .22s ease;align-items:center;background:color-mix(in srgb,var(--_pvb-target-surface) 96%,black 4%);min-height:72px;box-shadow:inset 0 1px color-mix(in srgb,white 4%,transparent),0 10px 22px color-mix(in srgb,black 10%,transparent)}.target-card:hover{border-color:color-mix(in srgb,var(--_pvb-target-accent) 40%,transparent);transform:translateY(-1px);box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 16px 28px color-mix(in srgb,var(--_pvb-target-accent) 10%,transparent)}.target-card.selected{border-color:color-mix(in srgb,var(--_pvb-target-accent) 64%,transparent);background:color-mix(in srgb,var(--_pvb-target-accent) 12%,var(--_pvb-target-surface) 88%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 30px color-mix(in srgb,var(--_pvb-target-accent) 12%,transparent)}.card-icon{color:var(--_pvb-target-accent);filter:drop-shadow(0 0 10px color-mix(in srgb,var(--_pvb-target-accent) 16%,transparent))}.card-content{display:flex;flex-direction:column;gap:4px}.card-title{font-weight:600}.card-subtitle{font-size:13px;color:var(--_pvb-target-text-soft)}.card-meta{font-size:12px;color:var(--_pvb-target-text-soft)}.selected-wrapper{background:color-mix(in srgb,var(--_pvb-target-surface) 96%,black 4%);border:1px solid color-mix(in srgb,var(--_pvb-target-border) 78%,transparent);border-radius:14px;padding:12px 14px;display:flex;flex-direction:column;gap:8px;margin-top:12px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.selected-label{font-weight:600;font-size:13px;color:var(--md-sys-color-on-surface)}.selected-targets-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-top:2px}.chip-icon{margin-right:4px}.selected-summary{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px dashed color-mix(in srgb,var(--_pvb-target-border) 82%,transparent);border-radius:16px;font-size:13px;color:var(--md-sys-color-on-surface)}.no-results{font-style:italic;font-size:13px;text-align:center;padding:12px 0;color:var(--_pvb-target-text-soft)}.target-accordion .mat-expansion-panel-header{padding-top:8px;padding-bottom:8px}.target-accordion .mat-expansion-panel-body{padding-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { 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: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "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: MatButtonToggleModule }, { kind: "directive", type: i7$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: 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: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i10$1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10$1.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11235
11258
  }
11236
11259
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TargetSelectorComponent, decorators: [{
11237
11260
  type: Component,
@@ -11247,7 +11270,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11247
11270
  MatButtonToggleModule,
11248
11271
  MatCheckboxModule,
11249
11272
  MatTooltipModule,
11250
- MatExpansionModule
11273
+ MatExpansionModule,
11274
+ PraxisIconButtonComponent
11251
11275
  ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [providePraxisVisualBuilderI18n()], template: `
11252
11276
  <div class="target-selector-container">
11253
11277
  <div class="section-header">
@@ -11310,11 +11334,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11310
11334
  @if (searchControl.value) {
11311
11335
  <button
11312
11336
  matSuffix
11313
- mat-icon-button
11337
+ praxisIconButton="close"
11338
+ size="dense"
11314
11339
  [attr.aria-label]="t('target.searchClear', 'Limpar busca')"
11315
11340
  (click)="clearSearch($event)"
11316
11341
  >
11317
- <mat-icon>close</mat-icon>
11318
11342
  </button>
11319
11343
  }
11320
11344
  </mat-form-field>
@@ -12126,6 +12150,7 @@ class RuleDefinitionComponent {
12126
12150
  <button
12127
12151
  mat-stroked-button
12128
12152
  type="button"
12153
+ data-testid="rule-definition-previous"
12129
12154
  (click)="goPrevious()"
12130
12155
  [disabled]="selectedStepIndex === 0"
12131
12156
  >
@@ -12135,6 +12160,7 @@ class RuleDefinitionComponent {
12135
12160
  mat-flat-button
12136
12161
  color="primary"
12137
12162
  type="button"
12163
+ [attr.data-testid]="selectedStepIndex === 3 ? 'rule-definition-save' : 'rule-definition-next'"
12138
12164
  (click)="goNext()"
12139
12165
  [disabled]="!canAdvance()"
12140
12166
  >
@@ -12143,7 +12169,7 @@ class RuleDefinitionComponent {
12143
12169
  </div>
12144
12170
  </div>
12145
12171
  </div>
12146
- `, isInline: true, styles: [".rule-definition-container{--_pvb-definition-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-definition-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-definition-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));--_pvb-definition-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-definition-success: var(--md-sys-color-tertiary, #2dcc8f);--_pvb-definition-shadow: color-mix(in srgb, var(--_pvb-definition-accent) 18%, transparent);display:flex;flex-direction:column;gap:8px;padding:6px 16px 12px;overflow-y:auto;height:100%;min-height:0;flex:1;box-sizing:border-box;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-definition-accent) 8%,transparent) 0%,transparent 34%),var(--_pvb-definition-surface)}.rule-canvas-wrapper{width:100%;min-height:0;margin:0}.rule-stepper{background:transparent;flex:1}.wizard-progress{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));align-items:center;gap:10px;padding:6px 0 14px}.wizard-progress.mobile{grid-template-columns:1fr}.progress-step{display:flex;align-items:center;gap:12px;min-height:62px;padding:10px 12px;border-radius:18px;border:1px solid transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);text-align:left;transition:background .22s ease,border-color .22s ease,box-shadow .22s ease,color .22s ease,transform .22s ease}.progress-step:disabled{cursor:default;opacity:1}.progress-step:not(:disabled){cursor:pointer}.progress-step:not(:disabled):hover{transform:translateY(-1px);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 82%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent)}.progress-step.is-current{background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 90%,black 10%);border-color:color-mix(in srgb,var(--_pvb-definition-accent) 34%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-definition-accent) 12%,transparent),0 16px 36px color-mix(in srgb,var(--_pvb-definition-shadow) 28%,transparent);color:var(--md-sys-color-on-surface)}.progress-step.is-complete{color:var(--md-sys-color-on-surface)}.progress-step.is-pending{color:var(--md-sys-color-on-surface-variant)}.progress-step-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:36px;height:36px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 52%,transparent);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 94%,black 6%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.progress-step.is-current .progress-step-icon{background:color-mix(in srgb,var(--_pvb-definition-accent) 14%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-accent) 42%,transparent);color:var(--_pvb-definition-accent);box-shadow:inset 0 1px color-mix(in srgb,white 8%,transparent),0 0 18px color-mix(in srgb,var(--_pvb-definition-accent) 18%,transparent)}.progress-step.is-complete .progress-step-icon{background:color-mix(in srgb,var(--_pvb-definition-success) 16%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-success) 46%,transparent);color:var(--_pvb-definition-success);box-shadow:0 0 18px color-mix(in srgb,var(--_pvb-definition-success) 18%,transparent)}.progress-step-copy{display:flex;flex-direction:column;gap:3px;min-width:0}.progress-step-title{font-size:14px;font-weight:600;color:inherit}.progress-step-subtitle{font-size:11px;line-height:1.2;color:var(--md-sys-color-on-surface-variant)}.progress-connector{height:1px;background:color-mix(in srgb,var(--_pvb-definition-border) 44%,transparent);margin:0 -2px;position:relative;overflow:hidden}.progress-connector.active{background:color-mix(in srgb,var(--_pvb-definition-success) 54%,transparent)}.progress-connector.active:after{content:\"\";position:absolute;inset:-1px auto -1px -20%;width:36%;background:linear-gradient(90deg,transparent 0%,color-mix(in srgb,var(--_pvb-definition-success) 54%,white 16%) 50%,transparent 100%);animation:pvbProgressPulse 2.6s ease-in-out infinite}.panel-content{display:flex;flex-direction:column;gap:12px;padding:0}.mode-selector{margin-bottom:12px;display:flex;justify-content:flex-start}.small-toggles ::ng-deep .mat-button-toggle-label-content{line-height:32px!important;padding:0 12px!important;font-size:13px}.step-question{font-weight:600;font-size:16px;color:var(--md-sys-color-on-surface);margin-top:8px;margin-bottom:8px}.step-label-stack{display:inline-flex;flex-direction:column;gap:2px;line-height:1.1}.step-label-main{font-size:14px;font-weight:600}.step-label-sub{font-size:11px;color:var(--md-sys-color-on-surface-variant)}.step-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;padding-left:0}.step-footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px 0 0;margin-top:8px;border-top:1px solid color-mix(in srgb,var(--_pvb-definition-border) 52%,transparent);position:sticky;bottom:0;z-index:2;background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-definition-surface) 2%,transparent),color-mix(in srgb,var(--_pvb-definition-surface) 96%,black 4%) 36%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.footer-actions-left,.footer-actions-right{display:flex;align-items:center;gap:10px}.step-footer button[mat-stroked-button],.step-footer button[mat-button],.step-footer button[mat-flat-button]{min-height:40px;border-radius:12px}.step-footer button[mat-flat-button]{min-width:108px;box-shadow:0 10px 24px color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent)}.step-footer button[mat-flat-button]:not([disabled]){animation:pvbPrimaryGlow 2.8s ease-in-out infinite}.condition-warning{display:flex;align-items:flex-start;gap:8px;padding:12px;margin-bottom:12px;border:1px solid var(--md-sys-color-error);border-radius:10px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);font-size:13px}.visual-editor-box{height:auto;min-height:0;border:1px solid var(--_pvb-definition-border);border-radius:12px;overflow:visible;box-shadow:none}.w-100{width:100%}.always-hint{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.review-block{display:flex;flex-direction:column;gap:8px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);box-shadow:inset 0 1px color-mix(in srgb,white 4%,transparent)}.review-title{font-weight:600}.review-hero{display:flex;flex-direction:column;gap:8px;padding:16px 18px;border-radius:18px;border:1px solid color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent);background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-definition-accent) 12%,var(--_pvb-definition-surface-strong) 88%),color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%));box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 42px color-mix(in srgb,var(--_pvb-definition-shadow) 14%,transparent)}.review-hero-title{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant)}.review-hero-body{font-size:16px;line-height:1.5;font-weight:500}.review-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.review-block.highlight{grid-column:span 3}.review-kicker{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--md-sys-color-on-surface-variant)}.review-body{font-size:14px;line-height:1.5}.code-block{font-family:Roboto Mono,monospace;font-size:12px;padding:8px;border-radius:8px;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);border:1px solid var(--_pvb-definition-border);white-space:pre-wrap;word-break:break-word}.muted{color:var(--md-sys-color-on-surface-variant);font-size:13px}.pill{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-definition-accent) 10%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 78%,transparent);font-size:13px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.technical-details{border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent);border-radius:14px;padding:12px 14px;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%)}.technical-details summary{cursor:pointer;font-weight:600}.technical-details[open]{display:flex;flex-direction:column;gap:12px}.review-block.compact{padding:0;border:0;background:transparent}.condition-panel{width:100%;margin-left:0}.condition-editor{border:1px solid var(--_pvb-definition-border);border-radius:12px;padding:10px;box-shadow:none;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);width:100%;min-height:unset;overflow:visible}.manual-editor-box ::ng-deep .mat-mdc-form-field-flex{border-radius:8px}::ng-deep .mat-horizontal-stepper-header-container{display:none}::ng-deep .mat-horizontal-content-container{padding:2px 0 0}@media(max-width:768px){.review-grid{grid-template-columns:1fr}.review-block.highlight{grid-column:span 1}.step-footer{flex-direction:column;align-items:stretch}.footer-actions-left,.footer-actions-right{width:100%;justify-content:space-between}.progress-connector{display:none}}@keyframes pvbPrimaryGlow{0%,to{box-shadow:0 10px 24px color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent)}50%{box-shadow:0 14px 30px color-mix(in srgb,var(--_pvb-definition-accent) 28%,transparent),0 0 0 1px color-mix(in srgb,var(--_pvb-definition-accent) 16%,transparent)}}@keyframes pvbProgressPulse{0%{transform:translate(0);opacity:0}18%{opacity:1}to{transform:translate(340%);opacity:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: MatExpansionModule }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i8$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i8$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { 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: MatStepperModule }, { kind: "component", type: i7$3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i7$3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i7$3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i7$3.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "component", type: TargetSelectorComponent, selector: "praxis-target-selector", inputs: ["fieldSchemas", "targetSchemas", "initialType", "initialSelection"], outputs: ["selectionChanged"] }, { kind: "component", type: PropertyEffectEditorComponent, selector: "praxis-property-effect-editor", inputs: ["properties", "initialConfig"], outputs: ["configChanged"] }, { 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 });
12172
+ `, isInline: true, styles: [".rule-definition-container{--_pvb-definition-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-definition-surface: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-definition-surface-strong: var(--md-sys-color-surface-container, var(--md-sys-color-surface));--_pvb-definition-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-definition-success: var(--md-sys-color-tertiary, #2dcc8f);--_pvb-definition-shadow: color-mix(in srgb, var(--_pvb-definition-accent) 18%, transparent);display:flex;flex-direction:column;gap:8px;padding:6px 16px 12px;overflow-y:auto;height:100%;min-height:0;flex:1;box-sizing:border-box;background:radial-gradient(circle at top center,color-mix(in srgb,var(--_pvb-definition-accent) 8%,transparent) 0%,transparent 34%),var(--_pvb-definition-surface)}.rule-canvas-wrapper{width:100%;min-height:0;margin:0}.rule-stepper{background:transparent;flex:1}.wizard-progress{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));align-items:center;gap:10px;padding:6px 0 14px}.wizard-progress.mobile{grid-template-columns:1fr}.progress-step{display:flex;align-items:center;gap:12px;min-height:62px;padding:10px 12px;border-radius:18px;border:1px solid transparent;background:transparent;color:var(--md-sys-color-on-surface-variant);text-align:left;transition:background .22s ease,border-color .22s ease,box-shadow .22s ease,color .22s ease,transform .22s ease}.progress-step:disabled{cursor:default;opacity:1}.progress-step:not(:disabled){cursor:pointer}.progress-step:not(:disabled):hover{transform:translateY(-1px);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 82%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent)}.progress-step.is-current{background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 90%,black 10%);border-color:color-mix(in srgb,var(--_pvb-definition-accent) 34%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-definition-accent) 12%,transparent),0 16px 36px color-mix(in srgb,var(--_pvb-definition-shadow) 28%,transparent);color:var(--md-sys-color-on-surface)}.progress-step.is-complete{color:var(--md-sys-color-on-surface)}.progress-step.is-pending{color:var(--md-sys-color-on-surface-variant)}.progress-step-icon{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:36px;height:36px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 52%,transparent);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 94%,black 6%);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.progress-step.is-current .progress-step-icon{background:color-mix(in srgb,var(--_pvb-definition-accent) 14%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-accent) 42%,transparent);color:var(--_pvb-definition-accent);box-shadow:inset 0 1px color-mix(in srgb,white 8%,transparent),0 0 18px color-mix(in srgb,var(--_pvb-definition-accent) 18%,transparent)}.progress-step.is-complete .progress-step-icon{background:color-mix(in srgb,var(--_pvb-definition-success) 16%,transparent);border-color:color-mix(in srgb,var(--_pvb-definition-success) 46%,transparent);color:var(--_pvb-definition-success);box-shadow:0 0 18px color-mix(in srgb,var(--_pvb-definition-success) 18%,transparent)}.progress-step-copy{display:flex;flex-direction:column;gap:3px;min-width:0}.progress-step-title{font-size:14px;font-weight:600;color:inherit}.progress-step-subtitle{font-size:11px;line-height:1.2;color:var(--md-sys-color-on-surface-variant)}.progress-connector{height:1px;background:color-mix(in srgb,var(--_pvb-definition-border) 44%,transparent);margin:0 -2px;position:relative;overflow:hidden}.progress-connector.active{background:color-mix(in srgb,var(--_pvb-definition-success) 54%,transparent)}.progress-connector.active:after{content:\"\";position:absolute;inset:-1px auto -1px -20%;width:36%;background:linear-gradient(90deg,transparent 0%,color-mix(in srgb,var(--_pvb-definition-success) 54%,white 16%) 50%,transparent 100%);animation:pvbProgressPulse 2.6s ease-in-out infinite}.panel-content{display:flex;flex-direction:column;gap:12px;padding:0}.mode-selector{margin-bottom:12px;display:flex;justify-content:flex-start}.small-toggles ::ng-deep .mat-button-toggle-label-content{line-height:32px!important;padding:0 12px!important;font-size:13px}.step-question{font-weight:600;font-size:16px;color:var(--md-sys-color-on-surface);margin-top:8px;margin-bottom:8px}.step-label-stack{display:inline-flex;flex-direction:column;gap:2px;line-height:1.1}.step-label-main{font-size:14px;font-weight:600}.step-label-sub{font-size:11px;color:var(--md-sys-color-on-surface-variant)}.step-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;padding-left:0}.step-footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px 0 0;margin-top:8px;border-top:1px solid color-mix(in srgb,var(--_pvb-definition-border) 52%,transparent);position:sticky;bottom:0;z-index:2;background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-definition-surface) 2%,transparent),color-mix(in srgb,var(--_pvb-definition-surface) 96%,black 4%) 36%);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.footer-actions-left,.footer-actions-right{display:flex;align-items:center;gap:10px}.step-footer button[mat-stroked-button],.step-footer button[mat-button],.step-footer button[mat-flat-button]{min-height:40px;border-radius:12px}.step-footer button[mat-flat-button]{min-width:108px;box-shadow:0 10px 24px color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent)}.step-footer button[mat-flat-button]:not([disabled]){animation:pvbPrimaryGlow 2.8s ease-in-out infinite}.condition-warning{display:flex;align-items:flex-start;gap:8px;padding:12px;margin-bottom:12px;border:1px solid var(--md-sys-color-error);border-radius:10px;background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);font-size:13px}.visual-editor-box{height:auto;min-height:0;border:1px solid var(--_pvb-definition-border);border-radius:12px;overflow:visible;box-shadow:none}.w-100{width:100%}.always-hint{font-size:13px;color:var(--md-sys-color-on-surface-variant)}.review-block{display:flex;flex-direction:column;gap:8px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent);background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);box-shadow:inset 0 1px color-mix(in srgb,white 4%,transparent)}.review-title{font-weight:600}.review-hero{display:flex;flex-direction:column;gap:8px;padding:16px 18px;border-radius:18px;border:1px solid color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent);background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-definition-accent) 12%,var(--_pvb-definition-surface-strong) 88%),color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%));box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 18px 42px color-mix(in srgb,var(--_pvb-definition-shadow) 14%,transparent)}.review-hero-title{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--md-sys-color-on-surface-variant)}.review-hero-body{font-size:16px;line-height:1.5;font-weight:500}.review-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.review-block.highlight{grid-column:span 3}.review-kicker{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--md-sys-color-on-surface-variant)}.review-body{font-size:14px;line-height:1.5}.code-block{font-family:Roboto Mono,monospace;font-size:12px;padding:8px;border-radius:8px;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);border:1px solid var(--_pvb-definition-border);white-space:pre-wrap;word-break:break-word}.muted{color:var(--md-sys-color-on-surface-variant);font-size:13px}.pill{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:14px;background:color-mix(in srgb,var(--_pvb-definition-accent) 10%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 78%,transparent);font-size:13px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.technical-details{border:1px solid color-mix(in srgb,var(--_pvb-definition-border) 72%,transparent);border-radius:14px;padding:12px 14px;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%)}.technical-details summary{cursor:pointer;font-weight:600}.technical-details[open]{display:flex;flex-direction:column;gap:12px}.review-block.compact{padding:0;border:0;background:transparent}.condition-panel{width:100%;margin-left:0}.condition-editor{border:1px solid var(--_pvb-definition-border);border-radius:12px;padding:10px;box-shadow:none;background:color-mix(in srgb,var(--_pvb-definition-surface-strong) 96%,black 4%);width:100%;min-height:unset;overflow:visible}.manual-editor-box ::ng-deep .mat-mdc-form-field-flex{border-radius:8px}::ng-deep .mat-horizontal-stepper-header-container{display:none}::ng-deep .mat-horizontal-content-container{padding:2px 0 0}@media(max-width:768px){.review-grid{grid-template-columns:1fr}.review-block.highlight{grid-column:span 1}.step-footer{flex-direction:column;align-items:stretch}.footer-actions-left,.footer-actions-right{width:100%;justify-content:space-between}.progress-connector{display:none}}@keyframes pvbPrimaryGlow{0%,to{box-shadow:0 10px 24px color-mix(in srgb,var(--_pvb-definition-accent) 22%,transparent)}50%{box-shadow:0 14px 30px color-mix(in srgb,var(--_pvb-definition-accent) 28%,transparent),0 0 0 1px color-mix(in srgb,var(--_pvb-definition-accent) 16%,transparent)}}@keyframes pvbProgressPulse{0%{transform:translate(0);opacity:0}18%{opacity:1}to{transform:translate(340%);opacity:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: MatExpansionModule }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i7$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { 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: MatStepperModule }, { kind: "component", type: i7$3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i7$3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i7$3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i7$3.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "component", type: TargetSelectorComponent, selector: "praxis-target-selector", inputs: ["fieldSchemas", "targetSchemas", "initialType", "initialSelection"], outputs: ["selectionChanged"] }, { kind: "component", type: PropertyEffectEditorComponent, selector: "praxis-property-effect-editor", inputs: ["properties", "initialConfig"], outputs: ["configChanged"] }, { 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 });
12147
12173
  }
12148
12174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleDefinitionComponent, decorators: [{
12149
12175
  type: Component,
@@ -12428,6 +12454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12428
12454
  <button
12429
12455
  mat-stroked-button
12430
12456
  type="button"
12457
+ data-testid="rule-definition-previous"
12431
12458
  (click)="goPrevious()"
12432
12459
  [disabled]="selectedStepIndex === 0"
12433
12460
  >
@@ -12437,6 +12464,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12437
12464
  mat-flat-button
12438
12465
  color="primary"
12439
12466
  type="button"
12467
+ [attr.data-testid]="selectedStepIndex === 3 ? 'rule-definition-save' : 'rule-definition-next'"
12440
12468
  (click)="goNext()"
12441
12469
  [disabled]="!canAdvance()"
12442
12470
  >
@@ -12779,11 +12807,11 @@ class RuleListComponent {
12779
12807
  @if (searchTerm) {
12780
12808
  <button
12781
12809
  matSuffix
12782
- mat-icon-button
12810
+ praxisIconButton="close"
12811
+ size="dense"
12783
12812
  [attr.aria-label]="t('ruleList.clearSearch', 'Limpar busca')"
12784
12813
  (click)="searchTerm = ''"
12785
12814
  >
12786
- <mat-icon>close</mat-icon>
12787
12815
  </button>
12788
12816
  }
12789
12817
  </mat-form-field>
@@ -12886,23 +12914,22 @@ class RuleListComponent {
12886
12914
  </div>
12887
12915
  <div class="card-actions">
12888
12916
  <button
12889
- mat-icon-button
12917
+ praxisIconButton="content_copy"
12918
+ size="dense"
12890
12919
  class="card-action"
12891
12920
  (click)="onDuplicate(item, $event)"
12892
12921
  [matTooltip]="t('ruleList.duplicate', 'Duplicar regra')"
12893
12922
  [attr.aria-label]="t('ruleList.duplicate', 'Duplicar regra')"
12894
12923
  >
12895
- <mat-icon>content_copy</mat-icon>
12896
12924
  </button>
12897
12925
  <button
12898
- mat-icon-button
12899
- color="warn"
12900
- class="card-action"
12926
+ praxisIconButton="delete"
12927
+ size="dense"
12928
+ class="card-action danger-action"
12901
12929
  (click)="onDelete(item, $event)"
12902
12930
  [matTooltip]="t('ruleList.remove', 'Remover regra')"
12903
12931
  [attr.aria-label]="t('ruleList.remove', 'Remover regra')"
12904
12932
  >
12905
- <mat-icon>delete</mat-icon>
12906
12933
  </button>
12907
12934
  </div>
12908
12935
  </div>
@@ -12937,7 +12964,7 @@ class RuleListComponent {
12937
12964
  </div>
12938
12965
  }
12939
12966
  </div>
12940
- `, isInline: true, styles: [":host{--_pvb-list-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-list-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--_pvb-list-surface-strong: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-list-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-list-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));--_pvb-list-success: var(--md-sys-color-primary, var(--_pvb-list-accent));--_pvb-list-warning: var(--md-sys-color-tertiary, #ffb347);--_pvb-list-error: var(--md-sys-color-error, #ff5f5f);display:flex;flex-direction:column;border-right:1px solid var(--md-sys-color-outline-variant);background:radial-gradient(circle at top left,color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent) 0%,transparent 34%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-surface-strong) 94%,black 6%),color-mix(in srgb,var(--_pvb-list-surface) 96%,black 4%));overflow:hidden;min-width:0;color:var(--md-sys-color-on-surface)}.panel-header{padding:18px 18px 12px;display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 84%,transparent)}.panel-heading{display:flex;flex-direction:column;gap:4px}.eyebrow{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--_pvb-list-accent)}.panel-header h3{margin:0;font-size:18px;font-weight:600}.header-badge-stack{display:flex;flex-direction:column;align-items:center}.header-badge{min-width:34px;height:34px;padding:0 10px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 92%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 22%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 72%,var(--md-sys-color-on-surface) 28%);font-size:13px;font-weight:700}.search-box{padding:0 18px}.w-100,.search-box mat-form-field{width:100%}.search-box ::ng-deep .mat-mdc-text-field-wrapper{background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);border-radius:14px}.search-box ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-row{display:flex;flex-wrap:wrap;gap:8px;padding:10px 18px 0}.filter-chip{min-height:30px;border-radius:999px!important;font-size:12px;color:var(--_pvb-list-text-soft);border-color:color-mix(in srgb,var(--_pvb-list-border) 74%,transparent)!important}.filter-chip.active{color:var(--_pvb-list-accent);background:color-mix(in srgb,var(--_pvb-list-accent) 10%,transparent);border-color:color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent)!important}.panel-actions{padding:12px 18px 14px;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.new-rule-button{min-height:42px;border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent),color-mix(in srgb,var(--_pvb-list-accent) 16%,transparent))!important;border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 44%,transparent);color:var(--_pvb-list-accent)!important;font-weight:700}.ai-rule-button{min-width:52px;min-height:42px;border-radius:12px!important;border-color:color-mix(in srgb,var(--_pvb-list-accent) 28%,transparent)!important;color:var(--_pvb-list-accent)!important;padding:0 12px!important}.list-content{flex:1;overflow-y:auto;padding:0 10px 14px}mat-list{padding:0}.rule-list-item{padding:0;margin-bottom:10px;cursor:pointer;height:auto!important;min-height:0}::ng-deep .rule-list-item .mdc-list-item__content{width:100%;padding:0!important}.rule-card{width:100%;display:flex;flex-direction:column;gap:10px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-list-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);transition:border-color .22s ease,transform .22s ease,box-shadow .22s ease,background .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 10px 24px color-mix(in srgb,black 18%,transparent)}.rule-card.has-error{border-color:color-mix(in srgb,var(--_pvb-list-error) 30%,transparent)}.rule-list-item:hover .rule-card{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-list-accent) 34%,transparent);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 16px 30px color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent)}.rule-list-item.selected .rule-card{border-color:color-mix(in srgb,var(--_pvb-list-accent) 68%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent),0 16px 34px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-accent) 10%,var(--_pvb-list-surface-strong) 90%),color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%))}.rule-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.rule-card-title-group{display:flex;flex-direction:column;gap:10px;min-width:0;flex:1}.rule-title-line{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.rule-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;width:fit-content}.rule-status.valid{color:var(--_pvb-list-success)}.rule-status.incomplete{color:var(--_pvb-list-warning)}.rule-status.draft{color:var(--_pvb-list-text-soft)}.rule-status.error{color:var(--_pvb-list-error)}.status-dot{width:8px;height:8px;border-radius:999px;background:currentColor}.card-actions{display:flex;align-items:center;gap:2px}.card-action{opacity:.72;width:30px;height:30px;transition:transform .18s ease,opacity .18s ease,color .18s ease}.card-action:hover{transform:translateY(-1px) scale(1.02);opacity:1}.rule-card-meta{display:flex;flex-wrap:wrap;gap:8px}.meta-pill{display:inline-flex;align-items:center;min-height:24px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 82%,var(--md-sys-color-on-surface) 18%);font-size:12px;box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.meta-pill.subtle{background:color-mix(in srgb,var(--_pvb-list-border) 16%,transparent);color:var(--_pvb-list-text-soft)}.rule-summary{font-size:12px;line-height:1.45;color:var(--_pvb-list-text-soft)}.rule-tags{display:flex;flex-wrap:wrap;gap:6px}.rule-card-footer{display:flex;justify-content:flex-end;align-items:center;min-height:18px}.rule-time{font-size:12px;color:var(--_pvb-list-text-soft);letter-spacing:.01em}.tag{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent);color:var(--_pvb-list-accent);font-size:11px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.rule-name{font-weight:600;font-size:15px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}.empty-list{padding:28px 18px;text-align:center;color:var(--_pvb-list-text-soft);font-size:13px;line-height:1.5}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i12$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatChipsModule }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: MatListModule }, { kind: "component", type: i8.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i8.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12967
+ `, isInline: true, styles: [":host{--_pvb-list-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-list-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--_pvb-list-surface-strong: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-list-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-list-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));--_pvb-list-success: var(--md-sys-color-primary, var(--_pvb-list-accent));--_pvb-list-warning: var(--md-sys-color-tertiary, #ffb347);--_pvb-list-error: var(--md-sys-color-error, #ff5f5f);display:flex;flex-direction:column;border-right:1px solid var(--md-sys-color-outline-variant);background:radial-gradient(circle at top left,color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent) 0%,transparent 34%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-surface-strong) 94%,black 6%),color-mix(in srgb,var(--_pvb-list-surface) 96%,black 4%));overflow:hidden;min-width:0;color:var(--md-sys-color-on-surface)}.panel-header{padding:18px 18px 12px;display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 84%,transparent)}.panel-heading{display:flex;flex-direction:column;gap:4px}.eyebrow{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--_pvb-list-accent)}.panel-header h3{margin:0;font-size:18px;font-weight:600}.header-badge-stack{display:flex;flex-direction:column;align-items:center}.header-badge{min-width:34px;height:34px;padding:0 10px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 92%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 22%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 72%,var(--md-sys-color-on-surface) 28%);font-size:13px;font-weight:700}.search-box{padding:0 18px}.w-100,.search-box mat-form-field{width:100%}.search-box ::ng-deep .mat-mdc-text-field-wrapper{background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);border-radius:14px}.search-box ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-row{display:flex;flex-wrap:wrap;gap:8px;padding:10px 18px 0}.filter-chip{min-height:30px;border-radius:999px!important;font-size:12px;color:var(--_pvb-list-text-soft);border-color:color-mix(in srgb,var(--_pvb-list-border) 74%,transparent)!important}.filter-chip.active{color:var(--_pvb-list-accent);background:color-mix(in srgb,var(--_pvb-list-accent) 10%,transparent);border-color:color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent)!important}.panel-actions{padding:12px 18px 14px;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.new-rule-button{min-height:42px;border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent),color-mix(in srgb,var(--_pvb-list-accent) 16%,transparent))!important;border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 44%,transparent);color:var(--_pvb-list-accent)!important;font-weight:700}.ai-rule-button{min-width:52px;min-height:42px;border-radius:12px!important;border-color:color-mix(in srgb,var(--_pvb-list-accent) 28%,transparent)!important;color:var(--_pvb-list-accent)!important;padding:0 12px!important}.list-content{flex:1;overflow-y:auto;padding:0 10px 14px}mat-list{padding:0}.rule-list-item{padding:0;margin-bottom:10px;cursor:pointer;height:auto!important;min-height:0}::ng-deep .rule-list-item .mdc-list-item__content{width:100%;padding:0!important}.rule-card{width:100%;display:flex;flex-direction:column;gap:10px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-list-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);transition:border-color .22s ease,transform .22s ease,box-shadow .22s ease,background .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 10px 24px color-mix(in srgb,black 18%,transparent)}.rule-card.has-error{border-color:color-mix(in srgb,var(--_pvb-list-error) 30%,transparent)}.rule-list-item:hover .rule-card{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-list-accent) 34%,transparent);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 16px 30px color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent)}.rule-list-item.selected .rule-card{border-color:color-mix(in srgb,var(--_pvb-list-accent) 68%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent),0 16px 34px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-accent) 10%,var(--_pvb-list-surface-strong) 90%),color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%))}.rule-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.rule-card-title-group{display:flex;flex-direction:column;gap:10px;min-width:0;flex:1}.rule-title-line{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.rule-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;width:fit-content}.rule-status.valid{color:var(--_pvb-list-success)}.rule-status.incomplete{color:var(--_pvb-list-warning)}.rule-status.draft{color:var(--_pvb-list-text-soft)}.rule-status.error{color:var(--_pvb-list-error)}.status-dot{width:8px;height:8px;border-radius:999px;background:currentColor}.card-actions{display:flex;align-items:center;gap:2px}.card-action{opacity:.72;transition:transform .18s ease,opacity .18s ease,color .18s ease}.danger-action{color:var(--md-sys-color-error)}.card-action:hover{transform:translateY(-1px) scale(1.02);opacity:1}.rule-card-meta{display:flex;flex-wrap:wrap;gap:8px}.meta-pill{display:inline-flex;align-items:center;min-height:24px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 82%,var(--md-sys-color-on-surface) 18%);font-size:12px;box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.meta-pill.subtle{background:color-mix(in srgb,var(--_pvb-list-border) 16%,transparent);color:var(--_pvb-list-text-soft)}.rule-summary{font-size:12px;line-height:1.45;color:var(--_pvb-list-text-soft)}.rule-tags{display:flex;flex-wrap:wrap;gap:6px}.rule-card-footer{display:flex;justify-content:flex-end;align-items:center;min-height:18px}.rule-time{font-size:12px;color:var(--_pvb-list-text-soft);letter-spacing:.01em}.tag{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent);color:var(--_pvb-list-accent);font-size:11px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.rule-name{font-weight:600;font-size:15px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}.empty-list{padding:28px 18px;text-align:center;color:var(--_pvb-list-text-soft);font-size:13px;line-height:1.5}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i12$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: MatChipsModule }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: MatListModule }, { kind: "component", type: i8.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i8.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { 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 });
12941
12968
  }
12942
12969
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleListComponent, decorators: [{
12943
12970
  type: Component,
@@ -12951,6 +12978,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12951
12978
  MatInputModule,
12952
12979
  MatListModule,
12953
12980
  MatTooltipModule,
12981
+ PraxisIconButtonComponent,
12954
12982
  ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [providePraxisVisualBuilderI18n()], host: { class: 'rule-list-panel' }, template: `
12955
12983
  <div class="panel-header">
12956
12984
  <div class="panel-heading">
@@ -12974,11 +13002,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12974
13002
  @if (searchTerm) {
12975
13003
  <button
12976
13004
  matSuffix
12977
- mat-icon-button
13005
+ praxisIconButton="close"
13006
+ size="dense"
12978
13007
  [attr.aria-label]="t('ruleList.clearSearch', 'Limpar busca')"
12979
13008
  (click)="searchTerm = ''"
12980
13009
  >
12981
- <mat-icon>close</mat-icon>
12982
13010
  </button>
12983
13011
  }
12984
13012
  </mat-form-field>
@@ -13081,23 +13109,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13081
13109
  </div>
13082
13110
  <div class="card-actions">
13083
13111
  <button
13084
- mat-icon-button
13112
+ praxisIconButton="content_copy"
13113
+ size="dense"
13085
13114
  class="card-action"
13086
13115
  (click)="onDuplicate(item, $event)"
13087
13116
  [matTooltip]="t('ruleList.duplicate', 'Duplicar regra')"
13088
13117
  [attr.aria-label]="t('ruleList.duplicate', 'Duplicar regra')"
13089
13118
  >
13090
- <mat-icon>content_copy</mat-icon>
13091
13119
  </button>
13092
13120
  <button
13093
- mat-icon-button
13094
- color="warn"
13095
- class="card-action"
13121
+ praxisIconButton="delete"
13122
+ size="dense"
13123
+ class="card-action danger-action"
13096
13124
  (click)="onDelete(item, $event)"
13097
13125
  [matTooltip]="t('ruleList.remove', 'Remover regra')"
13098
13126
  [attr.aria-label]="t('ruleList.remove', 'Remover regra')"
13099
13127
  >
13100
- <mat-icon>delete</mat-icon>
13101
13128
  </button>
13102
13129
  </div>
13103
13130
  </div>
@@ -13132,7 +13159,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13132
13159
  </div>
13133
13160
  }
13134
13161
  </div>
13135
- `, styles: [":host{--_pvb-list-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-list-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--_pvb-list-surface-strong: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-list-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-list-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));--_pvb-list-success: var(--md-sys-color-primary, var(--_pvb-list-accent));--_pvb-list-warning: var(--md-sys-color-tertiary, #ffb347);--_pvb-list-error: var(--md-sys-color-error, #ff5f5f);display:flex;flex-direction:column;border-right:1px solid var(--md-sys-color-outline-variant);background:radial-gradient(circle at top left,color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent) 0%,transparent 34%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-surface-strong) 94%,black 6%),color-mix(in srgb,var(--_pvb-list-surface) 96%,black 4%));overflow:hidden;min-width:0;color:var(--md-sys-color-on-surface)}.panel-header{padding:18px 18px 12px;display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 84%,transparent)}.panel-heading{display:flex;flex-direction:column;gap:4px}.eyebrow{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--_pvb-list-accent)}.panel-header h3{margin:0;font-size:18px;font-weight:600}.header-badge-stack{display:flex;flex-direction:column;align-items:center}.header-badge{min-width:34px;height:34px;padding:0 10px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 92%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 22%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 72%,var(--md-sys-color-on-surface) 28%);font-size:13px;font-weight:700}.search-box{padding:0 18px}.w-100,.search-box mat-form-field{width:100%}.search-box ::ng-deep .mat-mdc-text-field-wrapper{background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);border-radius:14px}.search-box ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-row{display:flex;flex-wrap:wrap;gap:8px;padding:10px 18px 0}.filter-chip{min-height:30px;border-radius:999px!important;font-size:12px;color:var(--_pvb-list-text-soft);border-color:color-mix(in srgb,var(--_pvb-list-border) 74%,transparent)!important}.filter-chip.active{color:var(--_pvb-list-accent);background:color-mix(in srgb,var(--_pvb-list-accent) 10%,transparent);border-color:color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent)!important}.panel-actions{padding:12px 18px 14px;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.new-rule-button{min-height:42px;border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent),color-mix(in srgb,var(--_pvb-list-accent) 16%,transparent))!important;border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 44%,transparent);color:var(--_pvb-list-accent)!important;font-weight:700}.ai-rule-button{min-width:52px;min-height:42px;border-radius:12px!important;border-color:color-mix(in srgb,var(--_pvb-list-accent) 28%,transparent)!important;color:var(--_pvb-list-accent)!important;padding:0 12px!important}.list-content{flex:1;overflow-y:auto;padding:0 10px 14px}mat-list{padding:0}.rule-list-item{padding:0;margin-bottom:10px;cursor:pointer;height:auto!important;min-height:0}::ng-deep .rule-list-item .mdc-list-item__content{width:100%;padding:0!important}.rule-card{width:100%;display:flex;flex-direction:column;gap:10px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-list-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);transition:border-color .22s ease,transform .22s ease,box-shadow .22s ease,background .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 10px 24px color-mix(in srgb,black 18%,transparent)}.rule-card.has-error{border-color:color-mix(in srgb,var(--_pvb-list-error) 30%,transparent)}.rule-list-item:hover .rule-card{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-list-accent) 34%,transparent);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 16px 30px color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent)}.rule-list-item.selected .rule-card{border-color:color-mix(in srgb,var(--_pvb-list-accent) 68%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent),0 16px 34px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-accent) 10%,var(--_pvb-list-surface-strong) 90%),color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%))}.rule-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.rule-card-title-group{display:flex;flex-direction:column;gap:10px;min-width:0;flex:1}.rule-title-line{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.rule-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;width:fit-content}.rule-status.valid{color:var(--_pvb-list-success)}.rule-status.incomplete{color:var(--_pvb-list-warning)}.rule-status.draft{color:var(--_pvb-list-text-soft)}.rule-status.error{color:var(--_pvb-list-error)}.status-dot{width:8px;height:8px;border-radius:999px;background:currentColor}.card-actions{display:flex;align-items:center;gap:2px}.card-action{opacity:.72;width:30px;height:30px;transition:transform .18s ease,opacity .18s ease,color .18s ease}.card-action:hover{transform:translateY(-1px) scale(1.02);opacity:1}.rule-card-meta{display:flex;flex-wrap:wrap;gap:8px}.meta-pill{display:inline-flex;align-items:center;min-height:24px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 82%,var(--md-sys-color-on-surface) 18%);font-size:12px;box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.meta-pill.subtle{background:color-mix(in srgb,var(--_pvb-list-border) 16%,transparent);color:var(--_pvb-list-text-soft)}.rule-summary{font-size:12px;line-height:1.45;color:var(--_pvb-list-text-soft)}.rule-tags{display:flex;flex-wrap:wrap;gap:6px}.rule-card-footer{display:flex;justify-content:flex-end;align-items:center;min-height:18px}.rule-time{font-size:12px;color:var(--_pvb-list-text-soft);letter-spacing:.01em}.tag{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent);color:var(--_pvb-list-accent);font-size:11px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.rule-name{font-weight:600;font-size:15px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}.empty-list{padding:28px 18px;text-align:center;color:var(--_pvb-list-text-soft);font-size:13px;line-height:1.5}\n"] }]
13162
+ `, styles: [":host{--_pvb-list-accent: var(--md-sys-color-primary, var(--sicoob-primary-default));--_pvb-list-surface: var(--md-sys-color-surface-container-lowest, var(--md-sys-color-surface));--_pvb-list-surface-strong: var(--md-sys-color-surface-container-low, var(--md-sys-color-surface));--_pvb-list-border: var(--md-sys-color-outline-variant, var(--sicoob-stroke-medium));--_pvb-list-text-soft: var(--md-sys-color-on-surface-variant, var(--sicoob-text-subtle));--_pvb-list-success: var(--md-sys-color-primary, var(--_pvb-list-accent));--_pvb-list-warning: var(--md-sys-color-tertiary, #ffb347);--_pvb-list-error: var(--md-sys-color-error, #ff5f5f);display:flex;flex-direction:column;border-right:1px solid var(--md-sys-color-outline-variant);background:radial-gradient(circle at top left,color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent) 0%,transparent 34%),linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-surface-strong) 94%,black 6%),color-mix(in srgb,var(--_pvb-list-surface) 96%,black 4%));overflow:hidden;min-width:0;color:var(--md-sys-color-on-surface)}.panel-header{padding:18px 18px 12px;display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 84%,transparent)}.panel-heading{display:flex;flex-direction:column;gap:4px}.eyebrow{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--_pvb-list-accent)}.panel-header h3{margin:0;font-size:18px;font-weight:600}.header-badge-stack{display:flex;flex-direction:column;align-items:center}.header-badge{min-width:34px;height:34px;padding:0 10px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--_pvb-list-surface-strong) 92%,transparent);border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 22%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 72%,var(--md-sys-color-on-surface) 28%);font-size:13px;font-weight:700}.search-box{padding:0 18px}.w-100,.search-box mat-form-field{width:100%}.search-box ::ng-deep .mat-mdc-text-field-wrapper{background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);border-radius:14px}.search-box ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.filter-row{display:flex;flex-wrap:wrap;gap:8px;padding:10px 18px 0}.filter-chip{min-height:30px;border-radius:999px!important;font-size:12px;color:var(--_pvb-list-text-soft);border-color:color-mix(in srgb,var(--_pvb-list-border) 74%,transparent)!important}.filter-chip.active{color:var(--_pvb-list-accent);background:color-mix(in srgb,var(--_pvb-list-accent) 10%,transparent);border-color:color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent)!important}.panel-actions{padding:12px 18px 14px;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px}.new-rule-button{min-height:42px;border-radius:12px;background:linear-gradient(135deg,color-mix(in srgb,var(--_pvb-list-accent) 30%,transparent),color-mix(in srgb,var(--_pvb-list-accent) 16%,transparent))!important;border:1px solid color-mix(in srgb,var(--_pvb-list-accent) 44%,transparent);color:var(--_pvb-list-accent)!important;font-weight:700}.ai-rule-button{min-width:52px;min-height:42px;border-radius:12px!important;border-color:color-mix(in srgb,var(--_pvb-list-accent) 28%,transparent)!important;color:var(--_pvb-list-accent)!important;padding:0 12px!important}.list-content{flex:1;overflow-y:auto;padding:0 10px 14px}mat-list{padding:0}.rule-list-item{padding:0;margin-bottom:10px;cursor:pointer;height:auto!important;min-height:0}::ng-deep .rule-list-item .mdc-list-item__content{width:100%;padding:0!important}.rule-card{width:100%;display:flex;flex-direction:column;gap:10px;padding:14px;border-radius:14px;border:1px solid color-mix(in srgb,var(--_pvb-list-border) 68%,transparent);background:color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%);transition:border-color .22s ease,transform .22s ease,box-shadow .22s ease,background .22s ease;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent),0 10px 24px color-mix(in srgb,black 18%,transparent)}.rule-card.has-error{border-color:color-mix(in srgb,var(--_pvb-list-error) 30%,transparent)}.rule-list-item:hover .rule-card{transform:translateY(-1px);border-color:color-mix(in srgb,var(--_pvb-list-accent) 34%,transparent);box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent),0 16px 30px color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent)}.rule-list-item.selected .rule-card{border-color:color-mix(in srgb,var(--_pvb-list-accent) 68%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent),0 16px 34px color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--_pvb-list-accent) 10%,var(--_pvb-list-surface-strong) 90%),color-mix(in srgb,var(--_pvb-list-surface-strong) 96%,black 4%))}.rule-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.rule-card-title-group{display:flex;flex-direction:column;gap:10px;min-width:0;flex:1}.rule-title-line{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.rule-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;width:fit-content}.rule-status.valid{color:var(--_pvb-list-success)}.rule-status.incomplete{color:var(--_pvb-list-warning)}.rule-status.draft{color:var(--_pvb-list-text-soft)}.rule-status.error{color:var(--_pvb-list-error)}.status-dot{width:8px;height:8px;border-radius:999px;background:currentColor}.card-actions{display:flex;align-items:center;gap:2px}.card-action{opacity:.72;transition:transform .18s ease,opacity .18s ease,color .18s ease}.danger-action{color:var(--md-sys-color-error)}.card-action:hover{transform:translateY(-1px) scale(1.02);opacity:1}.rule-card-meta{display:flex;flex-wrap:wrap;gap:8px}.meta-pill{display:inline-flex;align-items:center;min-height:24px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 14%,transparent);color:color-mix(in srgb,var(--_pvb-list-accent) 82%,var(--md-sys-color-on-surface) 18%);font-size:12px;box-shadow:inset 0 1px color-mix(in srgb,white 6%,transparent)}.meta-pill.subtle{background:color-mix(in srgb,var(--_pvb-list-border) 16%,transparent);color:var(--_pvb-list-text-soft)}.rule-summary{font-size:12px;line-height:1.45;color:var(--_pvb-list-text-soft)}.rule-tags{display:flex;flex-wrap:wrap;gap:6px}.rule-card-footer{display:flex;justify-content:flex-end;align-items:center;min-height:18px}.rule-time{font-size:12px;color:var(--_pvb-list-text-soft);letter-spacing:.01em}.tag{display:inline-flex;align-items:center;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--_pvb-list-accent) 12%,transparent);color:var(--_pvb-list-accent);font-size:11px;box-shadow:inset 0 1px color-mix(in srgb,white 5%,transparent)}.rule-name{font-weight:600;font-size:15px;line-height:1.2;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}.empty-list{padding:28px 18px;text-align:center;color:var(--_pvb-list-text-soft);font-size:13px;line-height:1.5}\n"] }]
13136
13163
  }], ctorParameters: () => [{ type: i1$2.PraxisI18nService, decorators: [{
13137
13164
  type: Optional
13138
13165
  }] }], propDecorators: { rules: [{
@@ -13548,12 +13575,12 @@ class RuleEditorComponent {
13548
13575
  <div class="builder-shell-header">
13549
13576
  <div class="shell-brand">
13550
13577
  <button
13551
- mat-icon-button
13578
+ [praxisIconButton]="isListPanelOpen ? 'menu_open' : 'menu'"
13579
+ size="dense"
13552
13580
  class="shell-menu"
13553
13581
  (click)="toggleListPanel()"
13554
13582
  [matTooltip]="isListPanelOpen ? t('ruleEditor.toolbar.collapseList', 'Collapse side panel') : t('ruleEditor.toolbar.expandList', 'Expand side panel')"
13555
13583
  >
13556
- <mat-icon>{{ isListPanelOpen ? 'menu_open' : 'menu' }}</mat-icon>
13557
13584
  </button>
13558
13585
  <div class="brand-mark">
13559
13586
  <mat-icon>rule</mat-icon>
@@ -13577,18 +13604,16 @@ class RuleEditorComponent {
13577
13604
  <span>{{ t('ruleEditor.shell.unsaved', 'Unsaved changes') }}</span>
13578
13605
  </div>
13579
13606
  }
13580
- <button mat-icon-button [disabled]="!canUndo" (click)="undo()" [matTooltip]="t('ruleEditor.toolbar.undo', 'Undo')">
13581
- <mat-icon>undo</mat-icon>
13607
+ <button praxisIconButton="undo" size="dense" [disabled]="!canUndo" (click)="undo()" [matTooltip]="t('ruleEditor.toolbar.undo', 'Undo')">
13582
13608
  </button>
13583
- <button mat-icon-button [disabled]="!canRedo" (click)="redo()" [matTooltip]="t('ruleEditor.toolbar.redo', 'Redo')">
13584
- <mat-icon>redo</mat-icon>
13609
+ <button praxisIconButton="redo" size="dense" [disabled]="!canRedo" (click)="redo()" [matTooltip]="t('ruleEditor.toolbar.redo', 'Redo')">
13585
13610
  </button>
13586
13611
  <button
13587
- mat-icon-button
13612
+ praxisIconButton="more_horiz"
13613
+ size="dense"
13588
13614
  [matMenuTriggerFor]="devMenu"
13589
13615
  [matTooltip]="t('ruleEditor.toolbar.advanced', 'More options')"
13590
13616
  >
13591
- <mat-icon>more_horiz</mat-icon>
13592
13617
  </button>
13593
13618
  </div>
13594
13619
  </div>
@@ -13627,8 +13652,7 @@ class RuleEditorComponent {
13627
13652
  <h3>{{ t('ruleEditor.conditionOnly.title', 'Condicao') }}</h3>
13628
13653
  <p>{{ t('ruleEditor.conditionOnly.subtitle', 'Monte apenas a expressao JSON Logic da condicao.') }}</p>
13629
13654
  </div>
13630
- <button mat-icon-button (click)="clearRules()" [matTooltip]="t('ruleEditor.debug.clearAll', 'Clear all')">
13631
- <mat-icon>delete_forever</mat-icon>
13655
+ <button praxisIconButton="delete_forever" size="compact" class="danger-action" (click)="clearRules()" [matTooltip]="t('ruleEditor.debug.clearAll', 'Clear all')">
13632
13656
  </button>
13633
13657
  </div>
13634
13658
  }
@@ -13726,8 +13750,7 @@ class RuleEditorComponent {
13726
13750
  <div class="debug-panel">
13727
13751
  <div class="debug-header">
13728
13752
  <h3>{{ t('ruleEditor.debug.title', 'Debug state') }}</h3>
13729
- <button mat-icon-button (click)="showDebugPanel = false">
13730
- <mat-icon>close</mat-icon>
13753
+ <button praxisIconButton="close" size="compact" (click)="showDebugPanel = false">
13731
13754
  </button>
13732
13755
  </div>
13733
13756
  <div class="debug-content">
@@ -13744,7 +13767,7 @@ class RuleEditorComponent {
13744
13767
  (change)="onFileSelected($event)"
13745
13768
  />
13746
13769
  </div>
13747
- `, 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}.builder-shell-header button[mat-icon-button]{width:36px;height:36px;line-height:36px;padding:8px}.builder-shell-header button[mat-icon-button] mat-icon{font-size:20px;width:20px;height:20px;line-height:20px}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height: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}.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;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}}\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: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: i10$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$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: i7$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$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: 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 });
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 });
13748
13771
  }
13749
13772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RuleEditorComponent, decorators: [{
13750
13773
  type: Component,
@@ -13763,6 +13786,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13763
13786
  MatDialogModule,
13764
13787
  MatBadgeModule,
13765
13788
  MatMenuModule,
13789
+ PraxisIconButtonComponent,
13766
13790
  RuleListComponent,
13767
13791
  RuleDefinitionComponent,
13768
13792
  RuleCanvasComponent,
@@ -13776,12 +13800,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13776
13800
  <div class="builder-shell-header">
13777
13801
  <div class="shell-brand">
13778
13802
  <button
13779
- mat-icon-button
13803
+ [praxisIconButton]="isListPanelOpen ? 'menu_open' : 'menu'"
13804
+ size="dense"
13780
13805
  class="shell-menu"
13781
13806
  (click)="toggleListPanel()"
13782
13807
  [matTooltip]="isListPanelOpen ? t('ruleEditor.toolbar.collapseList', 'Collapse side panel') : t('ruleEditor.toolbar.expandList', 'Expand side panel')"
13783
13808
  >
13784
- <mat-icon>{{ isListPanelOpen ? 'menu_open' : 'menu' }}</mat-icon>
13785
13809
  </button>
13786
13810
  <div class="brand-mark">
13787
13811
  <mat-icon>rule</mat-icon>
@@ -13805,18 +13829,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13805
13829
  <span>{{ t('ruleEditor.shell.unsaved', 'Unsaved changes') }}</span>
13806
13830
  </div>
13807
13831
  }
13808
- <button mat-icon-button [disabled]="!canUndo" (click)="undo()" [matTooltip]="t('ruleEditor.toolbar.undo', 'Undo')">
13809
- <mat-icon>undo</mat-icon>
13832
+ <button praxisIconButton="undo" size="dense" [disabled]="!canUndo" (click)="undo()" [matTooltip]="t('ruleEditor.toolbar.undo', 'Undo')">
13810
13833
  </button>
13811
- <button mat-icon-button [disabled]="!canRedo" (click)="redo()" [matTooltip]="t('ruleEditor.toolbar.redo', 'Redo')">
13812
- <mat-icon>redo</mat-icon>
13834
+ <button praxisIconButton="redo" size="dense" [disabled]="!canRedo" (click)="redo()" [matTooltip]="t('ruleEditor.toolbar.redo', 'Redo')">
13813
13835
  </button>
13814
13836
  <button
13815
- mat-icon-button
13837
+ praxisIconButton="more_horiz"
13838
+ size="dense"
13816
13839
  [matMenuTriggerFor]="devMenu"
13817
13840
  [matTooltip]="t('ruleEditor.toolbar.advanced', 'More options')"
13818
13841
  >
13819
- <mat-icon>more_horiz</mat-icon>
13820
13842
  </button>
13821
13843
  </div>
13822
13844
  </div>
@@ -13855,8 +13877,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13855
13877
  <h3>{{ t('ruleEditor.conditionOnly.title', 'Condicao') }}</h3>
13856
13878
  <p>{{ t('ruleEditor.conditionOnly.subtitle', 'Monte apenas a expressao JSON Logic da condicao.') }}</p>
13857
13879
  </div>
13858
- <button mat-icon-button (click)="clearRules()" [matTooltip]="t('ruleEditor.debug.clearAll', 'Clear all')">
13859
- <mat-icon>delete_forever</mat-icon>
13880
+ <button praxisIconButton="delete_forever" size="compact" class="danger-action" (click)="clearRules()" [matTooltip]="t('ruleEditor.debug.clearAll', 'Clear all')">
13860
13881
  </button>
13861
13882
  </div>
13862
13883
  }
@@ -13954,8 +13975,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13954
13975
  <div class="debug-panel">
13955
13976
  <div class="debug-header">
13956
13977
  <h3>{{ t('ruleEditor.debug.title', 'Debug state') }}</h3>
13957
- <button mat-icon-button (click)="showDebugPanel = false">
13958
- <mat-icon>close</mat-icon>
13978
+ <button praxisIconButton="close" size="compact" (click)="showDebugPanel = false">
13959
13979
  </button>
13960
13980
  </div>
13961
13981
  <div class="debug-content">
@@ -13972,7 +13992,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13972
13992
  (change)="onFileSelected($event)"
13973
13993
  />
13974
13994
  </div>
13975
- `, 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}.builder-shell-header button[mat-icon-button]{width:36px;height:36px;line-height:36px;padding:8px}.builder-shell-header button[mat-icon-button] mat-icon{font-size:20px;width:20px;height:20px;line-height:20px}.editor-content-grid{display:grid;grid-template-columns:360px 1fr;flex:1;overflow:hidden;min-height: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}.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;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}}\n"] }]
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"] }]
13976
13996
  }], ctorParameters: () => [{ type: RuleBuilderService }, { type: FieldSchemaService }, { type: i3$1.AiResponseValidatorService }, { type: i4.MatSnackBar }, { type: i1.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i1$2.PraxisI18nService, decorators: [{
13977
13997
  type: Optional
13978
13998
  }] }], propDecorators: { embedded: [{
@@ -14075,6 +14095,62 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
14075
14095
  type: Output
14076
14096
  }] } });
14077
14097
 
14098
+ /** Metadata for Praxis Visual Builder component */
14099
+ const PRAXIS_VISUAL_BUILDER_COMPONENT_METADATA = {
14100
+ id: 'praxis-visual-builder',
14101
+ selector: 'praxis-visual-builder',
14102
+ component: PraxisVisualBuilder,
14103
+ friendlyName: 'Praxis Visual Builder',
14104
+ description: 'Visual rule builder with JSON Logic authoring and governed compatibility for legacy payloads.',
14105
+ inputs: [
14106
+ {
14107
+ name: 'config',
14108
+ type: 'RuleBuilderConfig | null',
14109
+ label: 'Configuracao',
14110
+ description: 'Configuracao do builder (schemas, templates, UI e validacoes).',
14111
+ },
14112
+ {
14113
+ name: 'initialRules',
14114
+ type: 'any',
14115
+ label: 'Regras iniciais',
14116
+ description: 'Estado inicial de regras para carregar no editor.',
14117
+ },
14118
+ ],
14119
+ outputs: [
14120
+ {
14121
+ name: 'rulesChanged',
14122
+ type: 'RuleBuilderState',
14123
+ label: 'Regras alteradas',
14124
+ description: 'Disparado quando o grafo/estado de regras e alterado.',
14125
+ },
14126
+ {
14127
+ name: 'exportRequested',
14128
+ type: 'ExportOptions',
14129
+ label: 'Exportacao solicitada',
14130
+ description: 'Disparado quando o usuario solicita exportacao.',
14131
+ },
14132
+ {
14133
+ name: 'importRequested',
14134
+ type: 'ImportOptions',
14135
+ label: 'Importacao solicitada',
14136
+ description: 'Disparado quando o usuario solicita importacao.',
14137
+ },
14138
+ ],
14139
+ tags: ['widget', 'rules', 'configurable'],
14140
+ lib: '@praxisui/visual-builder',
14141
+ };
14142
+ /** Provider para auto-registrar metadados do componente Visual Builder. */
14143
+ function providePraxisVisualBuilderMetadata() {
14144
+ return {
14145
+ provide: ENVIRONMENT_INITIALIZER,
14146
+ multi: true,
14147
+ useFactory: (registry) => () => {
14148
+ registry.register(PRAXIS_VISUAL_BUILDER_COMPONENT_METADATA);
14149
+ },
14150
+ deps: [ComponentMetadataRegistry],
14151
+ };
14152
+ }
14153
+
14078
14154
  const nodeAddSchema = {
14079
14155
  type: 'object',
14080
14156
  required: ['nodeId', 'nodeType'],
@@ -14164,7 +14240,6 @@ const variableAddSchema = {
14164
14240
  name: { type: 'string' },
14165
14241
  scope: { type: 'string' },
14166
14242
  type: { enum: ['string', 'number', 'boolean', 'object', 'array'] },
14167
- valueType: { enum: ['literal', 'field', 'context', 'function'] },
14168
14243
  defaultValue: {},
14169
14244
  description: { type: 'string' },
14170
14245
  },
@@ -14221,7 +14296,7 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14221
14296
  editableTargets: [
14222
14297
  { kind: 'node', resolver: 'rule-node-by-id', description: 'Visual rule graph node keyed by stable RuleNode.id.' },
14223
14298
  { kind: 'edge', resolver: 'rule-node-edge-by-source-target', description: 'Parent-child or semantic graph edge between existing rule nodes.' },
14224
- { kind: 'variable', resolver: 'context-variable-by-name-scope', description: 'Context variable available to rule conditions and contextual nodes.' },
14299
+ { kind: 'variable', resolver: 'context-variable-by-name-scope', description: 'Context variable governed by ContextManagementService for contextual/template flows; visual field-condition references are not authorable until a canonical JSON Logic shape exists.' },
14225
14300
  { kind: 'condition', resolver: 'json-logic-condition-by-node', description: 'JSON Logic condition attached to a node or represented by condition nodes.' },
14226
14301
  { kind: 'effect', resolver: 'property-effect-by-node', description: 'Targeted property effect persisted as propertyRule/FormLayoutRule semantics.' },
14227
14302
  { kind: 'dslDocument', resolver: 'rule-builder-json-logic-document', description: 'Serialized JSON Logic/form-config document produced from the visual model.' },
@@ -14350,7 +14425,7 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14350
14425
  identityKeys: ['scope', 'name'],
14351
14426
  inputSchema: variableAddSchema,
14352
14427
  failureModes: ['duplicate-variable', 'scope-not-found', 'variable-type-invalid', 'context-token-conflict'],
14353
- description: 'Adds a governed context variable that can be referenced by contextual and field condition nodes.',
14428
+ description: 'Adds a governed context variable to ContextManagementService for contextual/template flows. Field-condition references stay unsupported until a canonical JSON Logic shape exists.',
14354
14429
  } }],
14355
14430
  validators: ['variable-id-unique', 'variable-scope-exists', 'context-variable-reference-valid', 'dsl-round-trip-stable'],
14356
14431
  affectedPaths: ['RuleBuilderConfig.contextVariables', 'ContextManagementService'],
@@ -14372,7 +14447,7 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14372
14447
  identityKeys: ['nodeId'],
14373
14448
  inputSchema: conditionSetSchema,
14374
14449
  failureModes: ['node-not-found', 'json-logic-invalid', 'unsupported-operator', 'visual-parse-failed', 'dsl-round-trip-failed'],
14375
- description: 'Sets a canonical JSON Logic condition and proves it can parse back into the visual graph.',
14450
+ description: 'Sets a canonical JSON Logic condition within the runtime-supported visual subset and proves it can parse back into the visual graph.',
14376
14451
  } }],
14377
14452
  validators: ['json-logic-valid', 'condition-operators-supported', 'condition-fields-known', 'dsl-round-trip-stable'],
14378
14453
  affectedPaths: ['RuleBuilderState.nodes[].config.condition', 'RuleBuilderState.currentJSON'],
@@ -14439,10 +14514,10 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14439
14514
  { validatorId: 'destructive-removal-confirmed', level: 'error', code: 'VISUAL_BUILDER_DESTRUCTIVE_REMOVAL_CONFIRMED', description: 'Destructive node or edge removal requires explicit confirmation.' },
14440
14515
  { validatorId: 'variable-id-unique', level: 'error', code: 'VISUAL_BUILDER_VARIABLE_ID_UNIQUE', description: 'Context variable name and scope must be unique.' },
14441
14516
  { validatorId: 'variable-scope-exists', level: 'error', code: 'VISUAL_BUILDER_VARIABLE_SCOPE_EXISTS', description: 'Context variable scope must exist in ContextManagementService before variables are added.' },
14442
- { validatorId: 'context-variable-reference-valid', level: 'error', code: 'VISUAL_BUILDER_CONTEXT_VARIABLE_VALID', description: 'Context variable references must resolve to declared variables.' },
14517
+ { validatorId: 'context-variable-reference-valid', level: 'error', code: 'VISUAL_BUILDER_CONTEXT_VARIABLE_VALID', description: 'Contextual/template variable references must resolve to declared variables.' },
14443
14518
  { validatorId: 'json-logic-valid', level: 'error', code: 'VISUAL_BUILDER_JSON_LOGIC_VALID', description: 'Conditions must be valid JSON Logic objects, not JavaScript or legacy textual DSL.' },
14444
14519
  { validatorId: 'condition-operators-supported', level: 'error', code: 'VISUAL_BUILDER_CONDITION_OPERATORS_SUPPORTED', description: 'Condition operators must be supported by visual parsing and export.' },
14445
- { validatorId: 'condition-fields-known', level: 'error', code: 'VISUAL_BUILDER_CONDITION_FIELDS_KNOWN', description: 'Condition field references must resolve to configured field schemas or context variables.' },
14520
+ { validatorId: 'condition-fields-known', level: 'error', code: 'VISUAL_BUILDER_CONDITION_FIELDS_KNOWN', description: 'Condition field references must resolve to configured field schemas; field-to-field comparisons use JSON Logic var operands.' },
14446
14521
  { validatorId: 'effect-targets-exist', level: 'error', code: 'VISUAL_BUILDER_EFFECT_TARGETS_EXIST', description: 'Effect targets must exist in configured target schemas.' },
14447
14522
  { validatorId: 'effect-properties-governed', level: 'error', code: 'VISUAL_BUILDER_EFFECT_PROPERTIES_GOVERNED', description: 'Effect properties must be allowed for the target type.' },
14448
14523
  { validatorId: 'effect-values-valid', level: 'error', code: 'VISUAL_BUILDER_EFFECT_VALUES_VALID', description: 'Effect property values must satisfy target property schema types.' },
@@ -14451,11 +14526,11 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14451
14526
  ],
14452
14527
  roundTripRequirements: [
14453
14528
  'RuleBuilderState is the visual source of truth; JSON export must import back without semantic drift.',
14454
- 'RuleNode.id and context variable scope/name are canonical identities; array indexes are not canonical identities.',
14529
+ 'RuleNode.id and context variable scope/name are canonical identities for their own surfaces; array indexes are not canonical identities.',
14455
14530
  'Edges must reference existing nodes and must not create cycles in hierarchical rule graphs.',
14456
14531
  'Conditions are canonical JSON Logic objects. JavaScript expressions and legacy textual DSL must not be introduced as persisted authoring payloads.',
14457
14532
  'Effects must be constrained by target property schemas and RULE_PROPERTY_SCHEMA so exported FormLayoutRule payloads stay deterministic.',
14458
- 'Component-specific configuration belongs to child component manifests; visual-builder owns graph, JSON Logic, variables and property-effect orchestration.',
14533
+ 'Component-specific configuration belongs to child component manifests; visual-builder owns graph, supported JSON Logic, context-variable registry and property-effect orchestration.',
14459
14534
  ],
14460
14535
  examples: [
14461
14536
  { id: 'add-field-condition', request: 'Add a condition that age is greater than 18.', operationId: 'node.add', params: { nodeId: 'age-gt-18', nodeType: 'fieldCondition', label: 'Age over 18', config: { type: 'fieldCondition', fieldName: 'age', operator: 'gt', value: 18 } }, isPositive: true },
@@ -14463,7 +14538,7 @@ const PRAXIS_VISUAL_BUILDER_AUTHORING_MANIFEST = {
14463
14538
  { id: 'configure-node', request: 'Rename the eligibility rule and mark it expanded.', operationId: 'node.configure', params: { nodeId: 'eligibility', label: 'Eligibility rule', expanded: true }, isPositive: true },
14464
14539
  { id: 'connect-edge', request: 'Make the age condition a child of the AND group.', operationId: 'edge.connect', params: { sourceNodeId: 'eligibility-and', targetNodeId: 'age-gt-18', edgeKind: 'child' }, isPositive: true },
14465
14540
  { id: 'remove-edge', request: 'Disconnect the age condition from the AND group.', operationId: 'edge.remove', params: { sourceNodeId: 'eligibility-and', targetNodeId: 'age-gt-18', edgeKind: 'child' }, isPositive: true },
14466
- { id: 'add-variable', request: 'Add a global variable for current tenant.', operationId: 'variable.add', params: { name: 'tenantId', scope: 'global', type: 'string', valueType: 'context', description: 'Current tenant id' }, isPositive: true },
14541
+ { id: 'add-variable', request: 'Add a global variable for current tenant.', operationId: 'variable.add', params: { name: 'tenantId', scope: 'global', type: 'string', description: 'Current tenant id' }, isPositive: true },
14467
14542
  { id: 'set-condition', request: 'Set this condition to require country equal Brazil.', operationId: 'condition.set', params: { nodeId: 'country-br', condition: { '===': [{ var: 'country' }, 'BR'] }, source: 'jsonLogic' }, isPositive: true },
14468
14543
  { id: 'set-effect', request: 'Make the salary field readonly when the condition is true.', operationId: 'effect.set', params: { nodeId: 'salary-readonly', targetType: 'field', targets: ['salary'], properties: { readonly: true } }, isPositive: true },
14469
14544
  { id: 'validate-round-trip', request: 'Validate that this graph exports and imports without drift.', operationId: 'dsl.roundTrip.validate', params: { format: 'json', requireStableIds: true, compareMode: 'semantic' }, isPositive: true },
@@ -17017,11 +17092,13 @@ class MetadataEditorComponent {
17017
17092
  </div>
17018
17093
  </div>
17019
17094
  <div class="header-actions">
17020
- <button mat-icon-button
17021
- [color]="hasUnsavedChanges ? 'warn' : 'primary'"
17095
+ <button
17096
+ [praxisIconButton]="hasUnsavedChanges ? 'edit' : 'check_circle'"
17097
+ size="compact"
17098
+ [class.danger-action]="hasUnsavedChanges"
17099
+ [attr.aria-label]="hasUnsavedChanges ? 'Há alterações não salvas' : 'Tudo salvo'"
17022
17100
  [matTooltip]="hasUnsavedChanges ? 'Há alterações não salvas' : 'Tudo salvo'"
17023
17101
  [disabled]="!hasUnsavedChanges">
17024
- <mat-icon [praxisIcon]="hasUnsavedChanges ? 'edit' : 'check_circle'"></mat-icon>
17025
17102
  </button>
17026
17103
  </div>
17027
17104
  </div>
@@ -17037,14 +17114,13 @@ class MetadataEditorComponent {
17037
17114
  formControlName="code"
17038
17115
  placeholder="REGRA_001">
17039
17116
  <button
17040
- mat-icon-button
17117
+ praxisIconButton="help_outline"
17118
+ size="dense"
17041
17119
  matSuffix
17042
- class="help-icon-button"
17043
17120
  type="button"
17044
17121
  [matTooltip]="'Identificador único desta regra'"
17045
17122
  matTooltipPosition="above"
17046
17123
  >
17047
- <mat-icon>help_outline</mat-icon>
17048
17124
  </button>
17049
17125
  </mat-form-field>
17050
17126
  <!-- Message -->
@@ -17056,14 +17132,13 @@ class MetadataEditorComponent {
17056
17132
  placeholder="Texto que será mostrado ao usuário">
17057
17133
  </textarea>
17058
17134
  <button
17059
- mat-icon-button
17135
+ praxisIconButton="help_outline"
17136
+ size="dense"
17060
17137
  matSuffix
17061
- class="help-icon-button"
17062
17138
  type="button"
17063
17139
  [matTooltip]="'Mensagem exibida quando a regra for acionada'"
17064
17140
  matTooltipPosition="above"
17065
17141
  >
17066
- <mat-icon>help_outline</mat-icon>
17067
17142
  </button>
17068
17143
  </mat-form-field>
17069
17144
  <!-- Tag -->
@@ -17081,14 +17156,13 @@ class MetadataEditorComponent {
17081
17156
  }
17082
17157
  </mat-autocomplete>
17083
17158
  <button
17084
- mat-icon-button
17159
+ praxisIconButton="help_outline"
17160
+ size="dense"
17085
17161
  matSuffix
17086
- class="help-icon-button"
17087
17162
  type="button"
17088
17163
  [matTooltip]="'Categoria para organizar regras semelhantes'"
17089
17164
  matTooltipPosition="above"
17090
17165
  >
17091
- <mat-icon>help_outline</mat-icon>
17092
17166
  </button>
17093
17167
  </mat-form-field>
17094
17168
  <!-- Description -->
@@ -17100,14 +17174,13 @@ class MetadataEditorComponent {
17100
17174
  placeholder="Explique o objetivo e quando aplicar esta regra">
17101
17175
  </textarea>
17102
17176
  <button
17103
- mat-icon-button
17177
+ praxisIconButton="help_outline"
17178
+ size="dense"
17104
17179
  matSuffix
17105
- class="help-icon-button"
17106
17180
  type="button"
17107
17181
  [matTooltip]="'Texto interno para documentação'"
17108
17182
  matTooltipPosition="above"
17109
17183
  >
17110
- <mat-icon>help_outline</mat-icon>
17111
17184
  </button>
17112
17185
  </mat-form-field>
17113
17186
  <!-- Priority -->
@@ -17147,14 +17220,13 @@ class MetadataEditorComponent {
17147
17220
  </mat-option>
17148
17221
  </mat-select>
17149
17222
  <button
17150
- mat-icon-button
17223
+ praxisIconButton="help_outline"
17224
+ size="dense"
17151
17225
  matSuffix
17152
- class="help-icon-button"
17153
17226
  type="button"
17154
17227
  [matTooltip]="'Define a prioridade e a experiência para o usuário'"
17155
17228
  matTooltipPosition="above"
17156
17229
  >
17157
- <mat-icon>help_outline</mat-icon>
17158
17230
  </button>
17159
17231
  </mat-form-field>
17160
17232
  </div>
@@ -17337,11 +17409,11 @@ class MetadataEditorComponent {
17337
17409
  [formGroupName]="i">
17338
17410
  <div class="property-header">
17339
17411
  <span class="property-number">{{ i + 1 }}</span>
17340
- <button mat-icon-button
17341
- color="warn"
17412
+ <button praxisIconButton="delete"
17413
+ size="dense"
17414
+ class="danger-action"
17342
17415
  (click)="removeCustomProperty(i)"
17343
17416
  [disabled]="customProperties.length <= 0">
17344
- <mat-icon>delete</mat-icon>
17345
17417
  </button>
17346
17418
  </div>
17347
17419
  <div class="property-form">
@@ -17407,14 +17479,13 @@ class MetadataEditorComponent {
17407
17479
  placeholder='{"===": [{"var": "form.status"}, "premium"]}'>
17408
17480
  </textarea>
17409
17481
  <button
17410
- mat-icon-button
17482
+ praxisIconButton="help_outline"
17483
+ size="dense"
17411
17484
  matSuffix
17412
- class="help-icon-button"
17413
17485
  type="button"
17414
17486
  [matTooltip]="'Expressão que define quando aplicar estes metadados'"
17415
17487
  matTooltipPosition="above"
17416
17488
  >
17417
- <mat-icon>help_outline</mat-icon>
17418
17489
  </button>
17419
17490
  </mat-form-field>
17420
17491
  <mat-form-field appearance="outline" class="fallback-input">
@@ -17468,10 +17539,10 @@ class MetadataEditorComponent {
17468
17539
  [formControlName]="i"
17469
17540
  placeholder="https://docs.example.com">
17470
17541
  </mat-form-field>
17471
- <button mat-icon-button
17472
- color="warn"
17542
+ <button praxisIconButton="delete"
17543
+ size="dense"
17544
+ class="danger-action"
17473
17545
  (click)="removeDocumentationLink(i)">
17474
- <mat-icon>delete</mat-icon>
17475
17546
  </button>
17476
17547
  </div>
17477
17548
  }
@@ -17513,7 +17584,7 @@ class MetadataEditorComponent {
17513
17584
  </div>
17514
17585
  </div>
17515
17586
  }
17516
- `, isInline: true, styles: [".metadata-editor-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--md-sys-color-surface-container);border-bottom:1px solid var(--md-sys-color-outline-variant)}.node-info{display:flex;align-items:center;gap:12px}.node-icon{font-size:24px;width:24px;height:24px;color:var(--md-sys-color-primary)}.node-details{display:flex;flex-direction:column}.node-title{margin:0;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-subtitle{margin:0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.header-actions{display:flex;gap:8px}.metadata-form{flex:1;overflow:auto;padding:16px}.tab-content{padding:16px 0;display:flex;flex-direction:column;gap:16px}.full-width{width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.form-row>*{flex:1}.config-panel{margin-bottom:16px}.panel-content{padding:16px;display:flex;flex-direction:column;gap:16px}.priority-option,.icon-option{display:flex;align-items:center;gap:8px}.priority-option small,.icon-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.toggle-options,.display-options,.animation-options{display:flex;flex-direction:column;gap:8px}.custom-properties{display:flex;flex-direction:column;gap:12px}.custom-property-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.property-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.property-form{display:flex;gap:8px}.property-key,.property-value{flex:2}.property-type{flex:1}.conditional-config{display:flex;flex-direction:column;gap:12px}.conditional-rules{display:flex;flex-direction:column;gap:12px;padding:12px;background:var(--md-sys-color-surface);border-radius:8px;border:1px solid var(--md-sys-color-outline-variant)}.documentation-links{display:flex;flex-direction:column;gap:8px}.documentation-links h5{margin:0;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.doc-link-item{display:flex;gap:8px;align-items:center}.link-title,.link-url{flex:1}.add-property-button,.add-link-button{align-self:flex-start}.preview-section{margin-top:24px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.preview-title{display:flex;align-items:center;gap:8px;margin:0;padding:12px 16px;background:var(--md-sys-color-primary-container);border-bottom:1px solid var(--md-sys-color-outline-variant);font-size:14px;font-weight:500}.preview-content{padding:16px;background:var(--md-sys-color-surface)}.preview-json{font-family:Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface);margin:0;white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant);max-height:200px;overflow-y:auto}.empty-state{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.empty-state-content{max-width:300px}.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;color:var(--md-sys-color-on-surface-variant);line-height:1.4}@media(max-width:768px){.form-row,.property-form{flex-direction:column}.doc-link-item{flex-direction:column;align-items:stretch}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { 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.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: "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: "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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatChipsModule }, { 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: MatTabsModule }, { kind: "component", type: i7.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i7.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i11$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i11$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i11$1.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i11$2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11$2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: i12$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17587
+ `, isInline: true, styles: [".metadata-editor-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--md-sys-color-surface-container);border-bottom:1px solid var(--md-sys-color-outline-variant)}.node-info{display:flex;align-items:center;gap:12px}.node-icon{font-size:24px;width:24px;height:24px;color:var(--md-sys-color-primary)}.node-details{display:flex;flex-direction:column}.node-title{margin:0;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-subtitle{margin:0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.header-actions{display:flex;gap:8px}.metadata-form{flex:1;overflow:auto;padding:16px}.tab-content{padding:16px 0;display:flex;flex-direction:column;gap:16px}.full-width{width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.form-row>*{flex:1}.config-panel{margin-bottom:16px}.panel-content{padding:16px;display:flex;flex-direction:column;gap:16px}.priority-option,.icon-option{display:flex;align-items:center;gap:8px}.priority-option small,.icon-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.toggle-options,.display-options,.animation-options{display:flex;flex-direction:column;gap:8px}.custom-properties{display:flex;flex-direction:column;gap:12px}.custom-property-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.property-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.property-form{display:flex;gap:8px}.property-key,.property-value{flex:2}.property-type{flex:1}.conditional-config{display:flex;flex-direction:column;gap:12px}.conditional-rules{display:flex;flex-direction:column;gap:12px;padding:12px;background:var(--md-sys-color-surface);border-radius:8px;border:1px solid var(--md-sys-color-outline-variant)}.documentation-links{display:flex;flex-direction:column;gap:8px}.documentation-links h5{margin:0;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.doc-link-item{display:flex;gap:8px;align-items:center}.link-title,.link-url{flex:1}.add-property-button,.add-link-button{align-self:flex-start}.preview-section{margin-top:24px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.preview-title{display:flex;align-items:center;gap:8px;margin:0;padding:12px 16px;background:var(--md-sys-color-primary-container);border-bottom:1px solid var(--md-sys-color-outline-variant);font-size:14px;font-weight:500}.preview-content{padding:16px;background:var(--md-sys-color-surface)}.preview-json{font-family:Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface);margin:0;white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant);max-height:200px;overflow-y:auto}.empty-state{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.empty-state-content{max-width:300px}.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;color:var(--md-sys-color-on-surface-variant);line-height:1.4}@media(max-width:768px){.form-row,.property-form{flex-direction:column}.doc-link-item{flex-direction:column;align-items:stretch}}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { 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: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { 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.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: "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: "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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatChipsModule }, { 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: MatTabsModule }, { kind: "component", type: i7.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i7.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i10$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10$1.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i11$2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11$2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "pipe", type: i12$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17517
17588
  }
17518
17589
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: MetadataEditorComponent, decorators: [{
17519
17590
  type: Component,
@@ -17525,6 +17596,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17525
17596
  MatInputModule,
17526
17597
  MatButtonModule,
17527
17598
  MatIconModule,
17599
+ PraxisIconButtonComponent,
17528
17600
  PraxisIconDirective,
17529
17601
  MatCheckboxModule,
17530
17602
  MatChipsModule,
@@ -17547,11 +17619,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17547
17619
  </div>
17548
17620
  </div>
17549
17621
  <div class="header-actions">
17550
- <button mat-icon-button
17551
- [color]="hasUnsavedChanges ? 'warn' : 'primary'"
17622
+ <button
17623
+ [praxisIconButton]="hasUnsavedChanges ? 'edit' : 'check_circle'"
17624
+ size="compact"
17625
+ [class.danger-action]="hasUnsavedChanges"
17626
+ [attr.aria-label]="hasUnsavedChanges ? 'Há alterações não salvas' : 'Tudo salvo'"
17552
17627
  [matTooltip]="hasUnsavedChanges ? 'Há alterações não salvas' : 'Tudo salvo'"
17553
17628
  [disabled]="!hasUnsavedChanges">
17554
- <mat-icon [praxisIcon]="hasUnsavedChanges ? 'edit' : 'check_circle'"></mat-icon>
17555
17629
  </button>
17556
17630
  </div>
17557
17631
  </div>
@@ -17567,14 +17641,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17567
17641
  formControlName="code"
17568
17642
  placeholder="REGRA_001">
17569
17643
  <button
17570
- mat-icon-button
17644
+ praxisIconButton="help_outline"
17645
+ size="dense"
17571
17646
  matSuffix
17572
- class="help-icon-button"
17573
17647
  type="button"
17574
17648
  [matTooltip]="'Identificador único desta regra'"
17575
17649
  matTooltipPosition="above"
17576
17650
  >
17577
- <mat-icon>help_outline</mat-icon>
17578
17651
  </button>
17579
17652
  </mat-form-field>
17580
17653
  <!-- Message -->
@@ -17586,14 +17659,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17586
17659
  placeholder="Texto que será mostrado ao usuário">
17587
17660
  </textarea>
17588
17661
  <button
17589
- mat-icon-button
17662
+ praxisIconButton="help_outline"
17663
+ size="dense"
17590
17664
  matSuffix
17591
- class="help-icon-button"
17592
17665
  type="button"
17593
17666
  [matTooltip]="'Mensagem exibida quando a regra for acionada'"
17594
17667
  matTooltipPosition="above"
17595
17668
  >
17596
- <mat-icon>help_outline</mat-icon>
17597
17669
  </button>
17598
17670
  </mat-form-field>
17599
17671
  <!-- Tag -->
@@ -17611,14 +17683,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17611
17683
  }
17612
17684
  </mat-autocomplete>
17613
17685
  <button
17614
- mat-icon-button
17686
+ praxisIconButton="help_outline"
17687
+ size="dense"
17615
17688
  matSuffix
17616
- class="help-icon-button"
17617
17689
  type="button"
17618
17690
  [matTooltip]="'Categoria para organizar regras semelhantes'"
17619
17691
  matTooltipPosition="above"
17620
17692
  >
17621
- <mat-icon>help_outline</mat-icon>
17622
17693
  </button>
17623
17694
  </mat-form-field>
17624
17695
  <!-- Description -->
@@ -17630,14 +17701,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17630
17701
  placeholder="Explique o objetivo e quando aplicar esta regra">
17631
17702
  </textarea>
17632
17703
  <button
17633
- mat-icon-button
17704
+ praxisIconButton="help_outline"
17705
+ size="dense"
17634
17706
  matSuffix
17635
- class="help-icon-button"
17636
17707
  type="button"
17637
17708
  [matTooltip]="'Texto interno para documentação'"
17638
17709
  matTooltipPosition="above"
17639
17710
  >
17640
- <mat-icon>help_outline</mat-icon>
17641
17711
  </button>
17642
17712
  </mat-form-field>
17643
17713
  <!-- Priority -->
@@ -17677,14 +17747,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17677
17747
  </mat-option>
17678
17748
  </mat-select>
17679
17749
  <button
17680
- mat-icon-button
17750
+ praxisIconButton="help_outline"
17751
+ size="dense"
17681
17752
  matSuffix
17682
- class="help-icon-button"
17683
17753
  type="button"
17684
17754
  [matTooltip]="'Define a prioridade e a experiência para o usuário'"
17685
17755
  matTooltipPosition="above"
17686
17756
  >
17687
- <mat-icon>help_outline</mat-icon>
17688
17757
  </button>
17689
17758
  </mat-form-field>
17690
17759
  </div>
@@ -17867,11 +17936,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17867
17936
  [formGroupName]="i">
17868
17937
  <div class="property-header">
17869
17938
  <span class="property-number">{{ i + 1 }}</span>
17870
- <button mat-icon-button
17871
- color="warn"
17939
+ <button praxisIconButton="delete"
17940
+ size="dense"
17941
+ class="danger-action"
17872
17942
  (click)="removeCustomProperty(i)"
17873
17943
  [disabled]="customProperties.length <= 0">
17874
- <mat-icon>delete</mat-icon>
17875
17944
  </button>
17876
17945
  </div>
17877
17946
  <div class="property-form">
@@ -17937,14 +18006,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17937
18006
  placeholder='{"===": [{"var": "form.status"}, "premium"]}'>
17938
18007
  </textarea>
17939
18008
  <button
17940
- mat-icon-button
18009
+ praxisIconButton="help_outline"
18010
+ size="dense"
17941
18011
  matSuffix
17942
- class="help-icon-button"
17943
18012
  type="button"
17944
18013
  [matTooltip]="'Expressão que define quando aplicar estes metadados'"
17945
18014
  matTooltipPosition="above"
17946
18015
  >
17947
- <mat-icon>help_outline</mat-icon>
17948
18016
  </button>
17949
18017
  </mat-form-field>
17950
18018
  <mat-form-field appearance="outline" class="fallback-input">
@@ -17998,10 +18066,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
17998
18066
  [formControlName]="i"
17999
18067
  placeholder="https://docs.example.com">
18000
18068
  </mat-form-field>
18001
- <button mat-icon-button
18002
- color="warn"
18069
+ <button praxisIconButton="delete"
18070
+ size="dense"
18071
+ class="danger-action"
18003
18072
  (click)="removeDocumentationLink(i)">
18004
- <mat-icon>delete</mat-icon>
18005
18073
  </button>
18006
18074
  </div>
18007
18075
  }
@@ -18043,7 +18111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
18043
18111
  </div>
18044
18112
  </div>
18045
18113
  }
18046
- `, styles: [".metadata-editor-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--md-sys-color-surface-container);border-bottom:1px solid var(--md-sys-color-outline-variant)}.node-info{display:flex;align-items:center;gap:12px}.node-icon{font-size:24px;width:24px;height:24px;color:var(--md-sys-color-primary)}.node-details{display:flex;flex-direction:column}.node-title{margin:0;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-subtitle{margin:0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.header-actions{display:flex;gap:8px}.metadata-form{flex:1;overflow:auto;padding:16px}.tab-content{padding:16px 0;display:flex;flex-direction:column;gap:16px}.full-width{width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.form-row>*{flex:1}.config-panel{margin-bottom:16px}.panel-content{padding:16px;display:flex;flex-direction:column;gap:16px}.priority-option,.icon-option{display:flex;align-items:center;gap:8px}.priority-option small,.icon-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.toggle-options,.display-options,.animation-options{display:flex;flex-direction:column;gap:8px}.custom-properties{display:flex;flex-direction:column;gap:12px}.custom-property-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.property-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.property-form{display:flex;gap:8px}.property-key,.property-value{flex:2}.property-type{flex:1}.conditional-config{display:flex;flex-direction:column;gap:12px}.conditional-rules{display:flex;flex-direction:column;gap:12px;padding:12px;background:var(--md-sys-color-surface);border-radius:8px;border:1px solid var(--md-sys-color-outline-variant)}.documentation-links{display:flex;flex-direction:column;gap:8px}.documentation-links h5{margin:0;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.doc-link-item{display:flex;gap:8px;align-items:center}.link-title,.link-url{flex:1}.add-property-button,.add-link-button{align-self:flex-start}.preview-section{margin-top:24px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.preview-title{display:flex;align-items:center;gap:8px;margin:0;padding:12px 16px;background:var(--md-sys-color-primary-container);border-bottom:1px solid var(--md-sys-color-outline-variant);font-size:14px;font-weight:500}.preview-content{padding:16px;background:var(--md-sys-color-surface)}.preview-json{font-family:Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface);margin:0;white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant);max-height:200px;overflow-y:auto}.empty-state{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.empty-state-content{max-width:300px}.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;color:var(--md-sys-color-on-surface-variant);line-height:1.4}@media(max-width:768px){.form-row,.property-form{flex-direction:column}.doc-link-item{flex-direction:column;align-items:stretch}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
18114
+ `, styles: [".metadata-editor-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--md-sys-color-surface-container);border-bottom:1px solid var(--md-sys-color-outline-variant)}.node-info{display:flex;align-items:center;gap:12px}.node-icon{font-size:24px;width:24px;height:24px;color:var(--md-sys-color-primary)}.node-details{display:flex;flex-direction:column}.node-title{margin:0;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-subtitle{margin:0;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.header-actions{display:flex;gap:8px}.metadata-form{flex:1;overflow:auto;padding:16px}.tab-content{padding:16px 0;display:flex;flex-direction:column;gap:16px}.full-width{width:100%}.form-row{display:flex;gap:12px;align-items:flex-start}.form-row>*{flex:1}.config-panel{margin-bottom:16px}.panel-content{padding:16px;display:flex;flex-direction:column;gap:16px}.priority-option,.icon-option{display:flex;align-items:center;gap:8px}.priority-option small,.icon-option small{color:var(--md-sys-color-on-surface-variant);font-size:11px}.toggle-options,.display-options,.animation-options{display:flex;flex-direction:column;gap:8px}.custom-properties{display:flex;flex-direction:column;gap:12px}.custom-property-item{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;padding:12px;background:var(--md-sys-color-surface)}.property-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.property-number{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary);border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}.property-form{display:flex;gap:8px}.property-key,.property-value{flex:2}.property-type{flex:1}.conditional-config{display:flex;flex-direction:column;gap:12px}.conditional-rules{display:flex;flex-direction:column;gap:12px;padding:12px;background:var(--md-sys-color-surface);border-radius:8px;border:1px solid var(--md-sys-color-outline-variant)}.documentation-links{display:flex;flex-direction:column;gap:8px}.documentation-links h5{margin:0;font-size:13px;font-weight:500;color:var(--md-sys-color-primary)}.doc-link-item{display:flex;gap:8px;align-items:center}.link-title,.link-url{flex:1}.add-property-button,.add-link-button{align-self:flex-start}.preview-section{margin-top:24px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.preview-title{display:flex;align-items:center;gap:8px;margin:0;padding:12px 16px;background:var(--md-sys-color-primary-container);border-bottom:1px solid var(--md-sys-color-outline-variant);font-size:14px;font-weight:500}.preview-content{padding:16px;background:var(--md-sys-color-surface)}.preview-json{font-family:Courier New,monospace;font-size:12px;color:var(--md-sys-color-on-surface);margin:0;white-space:pre-wrap;background:var(--md-sys-color-surface-container);padding:12px;border-radius:4px;border:1px solid var(--md-sys-color-outline-variant);max-height:200px;overflow-y:auto}.empty-state{display:flex;align-items:center;justify-content:center;height:100%;text-align:center}.empty-state-content{max-width:300px}.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;color:var(--md-sys-color-on-surface-variant);line-height:1.4}@media(max-width:768px){.form-row,.property-form{flex-direction:column}.doc-link-item{flex-direction:column;align-items:stretch}}.danger-action{color:var(--md-sys-color-error)}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
18047
18115
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { selectedNode: [{
18048
18116
  type: Input
18049
18117
  }], metadataUpdated: [{
@@ -18220,37 +18288,40 @@ class JsonViewerComponent {
18220
18288
  <mat-divider vertical></mat-divider>
18221
18289
 
18222
18290
  <!-- Actions -->
18223
- <button mat-icon-button
18291
+ <button praxisIconButton="auto_fix_high"
18292
+ size="dense"
18293
+ aria-label="Format JSON"
18224
18294
  [disabled]="!editable"
18225
18295
  (click)="formatJson()"
18226
18296
  matTooltip="Format JSON">
18227
- <mat-icon [praxisIcon]="'auto_fix_high'"></mat-icon>
18228
18297
  </button>
18229
18298
 
18230
- <button mat-icon-button
18299
+ <button praxisIconButton="check_circle"
18300
+ size="dense"
18301
+ aria-label="Validate JSON"
18231
18302
  [disabled]="!editable"
18232
18303
  (click)="validateJson()"
18233
18304
  matTooltip="Validate JSON">
18234
- <mat-icon [praxisIcon]="'check_circle'"></mat-icon>
18235
18305
  </button>
18236
18306
 
18237
- <button mat-icon-button
18307
+ <button praxisIconButton="save"
18308
+ size="dense"
18309
+ aria-label="Apply Changes"
18238
18310
  [disabled]="!editable || !hasChanges"
18239
18311
  (click)="applyChanges()"
18240
18312
  matTooltip="Apply Changes">
18241
- <mat-icon [praxisIcon]="'save'"></mat-icon>
18242
18313
  </button>
18243
18314
 
18244
- <button mat-icon-button
18315
+ <button praxisIconButton="undo"
18316
+ size="dense"
18317
+ aria-label="Discard Changes"
18245
18318
  [disabled]="!editable || !hasChanges"
18246
18319
  (click)="discardChanges()"
18247
18320
  matTooltip="Discard Changes">
18248
- <mat-icon [praxisIcon]="'undo'"></mat-icon>
18249
18321
  </button>
18250
18322
 
18251
18323
  <!-- More Actions Menu -->
18252
- <button mat-icon-button [matMenuTriggerFor]="moreMenu">
18253
- <mat-icon [praxisIcon]="'more_vert'"></mat-icon>
18324
+ <button praxisIconButton="more_vert" size="dense" aria-label="More actions" [matMenuTriggerFor]="moreMenu">
18254
18325
  </button>
18255
18326
 
18256
18327
  <mat-menu #moreMenu="matMenu">
@@ -18340,13 +18411,14 @@ class JsonViewerComponent {
18340
18411
  </div>
18341
18412
  </div>
18342
18413
  </div>
18343
- `, isInline: true, styles: [".json-viewer-container{display:flex;flex-direction:column;height:100%;overflow:hidden;min-width:0}.json-toolbar{flex-shrink:0;padding:0 16px}.toolbar-title{display:flex;align-items:center;gap:8px;font-weight:500}.toolbar-spacer{flex:1}.toolbar-actions{display:flex;align-items:center;gap:8px}.toolbar-actions .mat-mdc-icon-button{color:var(--md-sys-color-on-primary)}.toolbar-actions .mat-mdc-icon-button:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.toolbar-actions .mat-mdc-icon-button:disabled{color:var(--md-sys-color-on-surface);opacity:.38}.validation-status{display:flex;align-items:center;gap:4px;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:500}.validation-status.valid{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.validation-status.invalid{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.editor-container{flex:1;position:relative;overflow:hidden;min-width:0}.json-editor{position:relative;height:100%;display:flex;min-width:0;width:100%}.json-textarea{flex:1;width:100%;border:none;outline:none;resize:none;font-family:Courier New,monospace;font-size:14px;line-height:1.5;padding:16px;background:var(--md-sys-color-surface, #f5f7fb);color:var(--md-sys-color-on-surface, #0f172a);caret-color:var(--md-sys-color-on-surface, #0f172a);white-space:pre;overflow-wrap:normal;overflow:auto;box-sizing:border-box}.json-textarea.has-line-numbers{padding-left:60px}.json-textarea.word-wrap{white-space:pre-wrap;overflow-wrap:break-word}.json-textarea:read-only{background:var(--md-sys-color-surface-container, #e7edf7);color:var(--md-sys-color-on-surface, #0f172a)}.line-numbers-panel{position:absolute;left:0;top:0;width:50px;height:100%;background:var(--md-sys-color-surface-container);border-right:1px solid var(--md-sys-color-outline-variant);padding:16px 8px;font-family:Courier New,monospace;font-size:14px;line-height:1.5;color:var(--md-sys-color-on-surface-variant);text-align:right;overflow:hidden;-webkit-user-select:none;user-select:none}.line-numbers-panel .line-number{height:21px}.readonly-overlay{position:absolute;top:8px;right:8px;z-index:100}.readonly-message{display:flex;align-items:center;gap:4px;background:var(--md-sys-color-surface-container);padding:4px 8px;border-radius:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant);box-shadow:0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.readonly-message mat-icon{font-size:14px;width:14px;height:14px}.status-bar{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;background:var(--md-sys-color-surface-container);border-top:1px solid var(--md-sys-color-outline-variant);font-size:12px;color:var(--md-sys-color-on-surface-variant);flex-shrink:0}.status-left,.status-center,.status-right{display:flex;align-items:center;gap:12px}.validation-error{display:flex;align-items:center;gap:4px;color:var(--md-sys-color-error)}.validation-error mat-icon{font-size:14px;width:14px;height:14px}.language-mode{font-family:monospace;font-weight:600}.unsaved-indicator{color:var(--md-sys-color-primary);font-weight:700;font-size:16px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { 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: MatToolbarModule }, { kind: "component", type: i5$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$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: i7$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$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: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18414
+ `, isInline: true, styles: [".json-viewer-container{display:flex;flex-direction:column;height:100%;overflow:hidden;min-width:0}.json-toolbar{flex-shrink:0;padding:0 16px}.toolbar-title{display:flex;align-items:center;gap:8px;font-weight:500}.toolbar-spacer{flex:1}.toolbar-actions{display:flex;align-items:center;gap:8px}.toolbar-actions .praxis-icon-button{color:var(--md-sys-color-on-primary)}.toolbar-actions .praxis-icon-button:hover{color:var(--md-sys-color-on-primary-container)}.toolbar-actions .praxis-icon-button:disabled{color:var(--md-sys-color-on-surface)}.validation-status{display:flex;align-items:center;gap:4px;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:500}.validation-status.valid{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.validation-status.invalid{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.editor-container{flex:1;position:relative;overflow:hidden;min-width:0}.json-editor{position:relative;height:100%;display:flex;min-width:0;width:100%}.json-textarea{flex:1;width:100%;border:none;outline:none;resize:none;font-family:Courier New,monospace;font-size:14px;line-height:1.5;padding:16px;background:var(--md-sys-color-surface, #f5f7fb);color:var(--md-sys-color-on-surface, #0f172a);caret-color:var(--md-sys-color-on-surface, #0f172a);white-space:pre;overflow-wrap:normal;overflow:auto;box-sizing:border-box}.json-textarea.has-line-numbers{padding-left:60px}.json-textarea.word-wrap{white-space:pre-wrap;overflow-wrap:break-word}.json-textarea:read-only{background:var(--md-sys-color-surface-container, #e7edf7);color:var(--md-sys-color-on-surface, #0f172a)}.line-numbers-panel{position:absolute;left:0;top:0;width:50px;height:100%;background:var(--md-sys-color-surface-container);border-right:1px solid var(--md-sys-color-outline-variant);padding:16px 8px;font-family:Courier New,monospace;font-size:14px;line-height:1.5;color:var(--md-sys-color-on-surface-variant);text-align:right;overflow:hidden;-webkit-user-select:none;user-select:none}.line-numbers-panel .line-number{height:21px}.readonly-overlay{position:absolute;top:8px;right:8px;z-index:100}.readonly-message{display:flex;align-items:center;gap:4px;background:var(--md-sys-color-surface-container);padding:4px 8px;border-radius:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant);box-shadow:0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.readonly-message mat-icon{font-size:14px;width:14px;height:14px}.status-bar{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;background:var(--md-sys-color-surface-container);border-top:1px solid var(--md-sys-color-outline-variant);font-size:12px;color:var(--md-sys-color-on-surface-variant);flex-shrink:0}.status-left,.status-center,.status-right{display:flex;align-items:center;gap:12px}.validation-error{display:flex;align-items:center;gap:4px;color:var(--md-sys-color-error)}.validation-error mat-icon{font-size:14px;width:14px;height:14px}.language-mode{font-family:monospace;font-weight:600}.unsaved-indicator{color:var(--md-sys-color-primary);font-weight:700;font-size:16px}\n"], dependencies: [{ 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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { 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: MatToolbarModule }, { kind: "component", type: i4$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { 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: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
18344
18415
  }
18345
18416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: JsonViewerComponent, decorators: [{
18346
18417
  type: Component,
18347
18418
  args: [{ selector: 'praxis-json-viewer', standalone: true, imports: [
18348
18419
  MatButtonModule,
18349
18420
  MatIconModule,
18421
+ PraxisIconButtonComponent,
18350
18422
  PraxisIconDirective,
18351
18423
  MatTooltipModule,
18352
18424
  MatToolbarModule,
@@ -18374,37 +18446,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
18374
18446
  <mat-divider vertical></mat-divider>
18375
18447
 
18376
18448
  <!-- Actions -->
18377
- <button mat-icon-button
18449
+ <button praxisIconButton="auto_fix_high"
18450
+ size="dense"
18451
+ aria-label="Format JSON"
18378
18452
  [disabled]="!editable"
18379
18453
  (click)="formatJson()"
18380
18454
  matTooltip="Format JSON">
18381
- <mat-icon [praxisIcon]="'auto_fix_high'"></mat-icon>
18382
18455
  </button>
18383
18456
 
18384
- <button mat-icon-button
18457
+ <button praxisIconButton="check_circle"
18458
+ size="dense"
18459
+ aria-label="Validate JSON"
18385
18460
  [disabled]="!editable"
18386
18461
  (click)="validateJson()"
18387
18462
  matTooltip="Validate JSON">
18388
- <mat-icon [praxisIcon]="'check_circle'"></mat-icon>
18389
18463
  </button>
18390
18464
 
18391
- <button mat-icon-button
18465
+ <button praxisIconButton="save"
18466
+ size="dense"
18467
+ aria-label="Apply Changes"
18392
18468
  [disabled]="!editable || !hasChanges"
18393
18469
  (click)="applyChanges()"
18394
18470
  matTooltip="Apply Changes">
18395
- <mat-icon [praxisIcon]="'save'"></mat-icon>
18396
18471
  </button>
18397
18472
 
18398
- <button mat-icon-button
18473
+ <button praxisIconButton="undo"
18474
+ size="dense"
18475
+ aria-label="Discard Changes"
18399
18476
  [disabled]="!editable || !hasChanges"
18400
18477
  (click)="discardChanges()"
18401
18478
  matTooltip="Discard Changes">
18402
- <mat-icon [praxisIcon]="'undo'"></mat-icon>
18403
18479
  </button>
18404
18480
 
18405
18481
  <!-- More Actions Menu -->
18406
- <button mat-icon-button [matMenuTriggerFor]="moreMenu">
18407
- <mat-icon [praxisIcon]="'more_vert'"></mat-icon>
18482
+ <button praxisIconButton="more_vert" size="dense" aria-label="More actions" [matMenuTriggerFor]="moreMenu">
18408
18483
  </button>
18409
18484
 
18410
18485
  <mat-menu #moreMenu="matMenu">
@@ -18494,7 +18569,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
18494
18569
  </div>
18495
18570
  </div>
18496
18571
  </div>
18497
- `, styles: [".json-viewer-container{display:flex;flex-direction:column;height:100%;overflow:hidden;min-width:0}.json-toolbar{flex-shrink:0;padding:0 16px}.toolbar-title{display:flex;align-items:center;gap:8px;font-weight:500}.toolbar-spacer{flex:1}.toolbar-actions{display:flex;align-items:center;gap:8px}.toolbar-actions .mat-mdc-icon-button{color:var(--md-sys-color-on-primary)}.toolbar-actions .mat-mdc-icon-button:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.toolbar-actions .mat-mdc-icon-button:disabled{color:var(--md-sys-color-on-surface);opacity:.38}.validation-status{display:flex;align-items:center;gap:4px;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:500}.validation-status.valid{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.validation-status.invalid{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.editor-container{flex:1;position:relative;overflow:hidden;min-width:0}.json-editor{position:relative;height:100%;display:flex;min-width:0;width:100%}.json-textarea{flex:1;width:100%;border:none;outline:none;resize:none;font-family:Courier New,monospace;font-size:14px;line-height:1.5;padding:16px;background:var(--md-sys-color-surface, #f5f7fb);color:var(--md-sys-color-on-surface, #0f172a);caret-color:var(--md-sys-color-on-surface, #0f172a);white-space:pre;overflow-wrap:normal;overflow:auto;box-sizing:border-box}.json-textarea.has-line-numbers{padding-left:60px}.json-textarea.word-wrap{white-space:pre-wrap;overflow-wrap:break-word}.json-textarea:read-only{background:var(--md-sys-color-surface-container, #e7edf7);color:var(--md-sys-color-on-surface, #0f172a)}.line-numbers-panel{position:absolute;left:0;top:0;width:50px;height:100%;background:var(--md-sys-color-surface-container);border-right:1px solid var(--md-sys-color-outline-variant);padding:16px 8px;font-family:Courier New,monospace;font-size:14px;line-height:1.5;color:var(--md-sys-color-on-surface-variant);text-align:right;overflow:hidden;-webkit-user-select:none;user-select:none}.line-numbers-panel .line-number{height:21px}.readonly-overlay{position:absolute;top:8px;right:8px;z-index:100}.readonly-message{display:flex;align-items:center;gap:4px;background:var(--md-sys-color-surface-container);padding:4px 8px;border-radius:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant);box-shadow:0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.readonly-message mat-icon{font-size:14px;width:14px;height:14px}.status-bar{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;background:var(--md-sys-color-surface-container);border-top:1px solid var(--md-sys-color-outline-variant);font-size:12px;color:var(--md-sys-color-on-surface-variant);flex-shrink:0}.status-left,.status-center,.status-right{display:flex;align-items:center;gap:12px}.validation-error{display:flex;align-items:center;gap:4px;color:var(--md-sys-color-error)}.validation-error mat-icon{font-size:14px;width:14px;height:14px}.language-mode{font-family:monospace;font-weight:600}.unsaved-indicator{color:var(--md-sys-color-primary);font-weight:700;font-size:16px}\n"] }]
18572
+ `, styles: [".json-viewer-container{display:flex;flex-direction:column;height:100%;overflow:hidden;min-width:0}.json-toolbar{flex-shrink:0;padding:0 16px}.toolbar-title{display:flex;align-items:center;gap:8px;font-weight:500}.toolbar-spacer{flex:1}.toolbar-actions{display:flex;align-items:center;gap:8px}.toolbar-actions .praxis-icon-button{color:var(--md-sys-color-on-primary)}.toolbar-actions .praxis-icon-button:hover{color:var(--md-sys-color-on-primary-container)}.toolbar-actions .praxis-icon-button:disabled{color:var(--md-sys-color-on-surface)}.validation-status{display:flex;align-items:center;gap:4px;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:500}.validation-status.valid{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.validation-status.invalid{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.validation-status mat-icon{font-size:16px;width:16px;height:16px}.editor-container{flex:1;position:relative;overflow:hidden;min-width:0}.json-editor{position:relative;height:100%;display:flex;min-width:0;width:100%}.json-textarea{flex:1;width:100%;border:none;outline:none;resize:none;font-family:Courier New,monospace;font-size:14px;line-height:1.5;padding:16px;background:var(--md-sys-color-surface, #f5f7fb);color:var(--md-sys-color-on-surface, #0f172a);caret-color:var(--md-sys-color-on-surface, #0f172a);white-space:pre;overflow-wrap:normal;overflow:auto;box-sizing:border-box}.json-textarea.has-line-numbers{padding-left:60px}.json-textarea.word-wrap{white-space:pre-wrap;overflow-wrap:break-word}.json-textarea:read-only{background:var(--md-sys-color-surface-container, #e7edf7);color:var(--md-sys-color-on-surface, #0f172a)}.line-numbers-panel{position:absolute;left:0;top:0;width:50px;height:100%;background:var(--md-sys-color-surface-container);border-right:1px solid var(--md-sys-color-outline-variant);padding:16px 8px;font-family:Courier New,monospace;font-size:14px;line-height:1.5;color:var(--md-sys-color-on-surface-variant);text-align:right;overflow:hidden;-webkit-user-select:none;user-select:none}.line-numbers-panel .line-number{height:21px}.readonly-overlay{position:absolute;top:8px;right:8px;z-index:100}.readonly-message{display:flex;align-items:center;gap:4px;background:var(--md-sys-color-surface-container);padding:4px 8px;border-radius:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant);box-shadow:0 2px 4px var(--vb-shadow-low-color, rgba(0,0,0,.1))}.readonly-message mat-icon{font-size:14px;width:14px;height:14px}.status-bar{display:flex;justify-content:space-between;align-items:center;padding:4px 16px;background:var(--md-sys-color-surface-container);border-top:1px solid var(--md-sys-color-outline-variant);font-size:12px;color:var(--md-sys-color-on-surface-variant);flex-shrink:0}.status-left,.status-center,.status-right{display:flex;align-items:center;gap:12px}.validation-error{display:flex;align-items:center;gap:4px;color:var(--md-sys-color-error)}.validation-error mat-icon{font-size:14px;width:14px;height:14px}.language-mode{font-family:monospace;font-weight:600}.unsaved-indicator{color:var(--md-sys-color-primary);font-weight:700;font-size:16px}\n"] }]
18498
18573
  }], ctorParameters: () => [{ type: i4.MatSnackBar }], propDecorators: { json: [{
18499
18574
  type: Input
18500
18575
  }], editable: [{
@@ -19005,14 +19080,13 @@ class TemplateEditorDialogComponent {
19005
19080
  (matChipInputTokenEnd)="addTag($event)">
19006
19081
  </mat-chip-grid>
19007
19082
  <button
19008
- mat-icon-button
19083
+ praxisIconButton="help_outline"
19084
+ size="dense"
19009
19085
  matSuffix
19010
- class="help-icon-button"
19011
19086
  type="button"
19012
19087
  [matTooltip]="'Tags help organize and find templates. Press Enter to add.'"
19013
19088
  matTooltipPosition="above"
19014
19089
  >
19015
- <mat-icon>help_outline</mat-icon>
19016
19090
  </button>
19017
19091
  </mat-form-field>
19018
19092
  </div>
@@ -19085,14 +19159,13 @@ class TemplateEditorDialogComponent {
19085
19159
  (matChipInputTokenEnd)="addRequiredField($event)">
19086
19160
  </mat-chip-grid>
19087
19161
  <button
19088
- mat-icon-button
19162
+ praxisIconButton="help_outline"
19163
+ size="dense"
19089
19164
  matSuffix
19090
- class="help-icon-button"
19091
19165
  type="button"
19092
19166
  [matTooltip]="'Field names that must exist for the template to work correctly'"
19093
19167
  matTooltipPosition="above"
19094
19168
  >
19095
- <mat-icon>help_outline</mat-icon>
19096
19169
  </button>
19097
19170
  </mat-form-field>
19098
19171
  </div>
@@ -19163,14 +19236,13 @@ class TemplateEditorDialogComponent {
19163
19236
  formControlName="version"
19164
19237
  placeholder="1.0.0">
19165
19238
  <button
19166
- mat-icon-button
19239
+ praxisIconButton="help_outline"
19240
+ size="dense"
19167
19241
  matSuffix
19168
- class="help-icon-button"
19169
19242
  type="button"
19170
19243
  [matTooltip]="'Semantic version (major.minor.patch)'"
19171
19244
  matTooltipPosition="above"
19172
19245
  >
19173
- <mat-icon>help_outline</mat-icon>
19174
19246
  </button>
19175
19247
  </mat-form-field>
19176
19248
  </div>
@@ -19249,7 +19321,7 @@ class TemplateEditorDialogComponent {
19249
19321
  </button>
19250
19322
  </div>
19251
19323
  </div>
19252
- `, isInline: true, styles: [".template-editor-dialog{min-width:600px;max-width:800px;max-height:90vh}.dialog-title{display:flex;align-items:center;gap:8px;margin:0;padding:24px 24px 0;font-size:20px;font-weight:500}.dialog-content{padding:16px 24px;max-height:calc(90vh - 120px);overflow-y:auto}.step-form{padding:16px 0;min-height:400px}.form-row{display:flex;gap:16px;margin-bottom:16px}.name-field,.category-field{flex:1}.description-field,.tags-input,.required-fields-input,.example-field,.organization-field{width:100%}.icon-field,.version-field,.author-name,.author-email{flex:1}.category-option,.icon-option{display:flex;align-items:center;gap:8px}.tags-section,.required-fields-section,.template-variables-section,.author-section,.example-section{margin-bottom:24px}.tags-section h4,.author-section h5,.example-section h5,.required-fields-section h5,.template-variables-section h5{margin:0 0 8px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-header{margin-bottom:16px}.section-header h4{margin:0 0 4px;font-size:16px;font-weight:500}.section-description,.field-description{margin:0;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.rules-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:16px;margin-bottom:24px}.preview-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-count{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.nodes-tree{max-height:200px;overflow-y:auto}.tree-node{border-left:2px solid transparent;padding:8px 0 8px 16px}.tree-node.root-node{border-left-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.node-content{display:flex;align-items:center;gap:8px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-size:13px}.node-type-chip{font-size:10px;height:18px;line-height:18px}.detected-variables{margin-top:8px}.no-variables{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;margin:8px 0}.step-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:24px;padding-top:16px;border-top:1px solid var(--md-sys-color-outline-variant)}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}::ng-deep .mat-stepper-horizontal{margin-top:8px}::ng-deep .mat-step-header{pointer-events:none}::ng-deep .mat-step-header.cdk-keyboard-focused,::ng-deep .mat-step-header.cdk-program-focused,::ng-deep .mat-step-header:hover{background-color:transparent}@media(max-width:768px){.template-editor-dialog{min-width:320px;max-width:95vw}.form-row{flex-direction:column}.name-field,.category-field,.icon-field,.version-field,.author-name,.author-email{flex:none;width:100%}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"], dependencies: [{ kind: "ngmodule", type: 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.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { 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: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: 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.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i10.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { 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: MatStepperModule }, { kind: "component", type: i7$3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "component", type: i7$3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i7$3.MatStepperNext, selector: "button[matStepperNext]" }, { kind: "directive", type: i7$3.MatStepperPrevious, selector: "button[matStepperPrevious]" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19324
+ `, isInline: true, styles: [".template-editor-dialog{min-width:600px;max-width:800px;max-height:90vh}.dialog-title{display:flex;align-items:center;gap:8px;margin:0;padding:24px 24px 0;font-size:20px;font-weight:500}.dialog-content{padding:16px 24px;max-height:calc(90vh - 120px);overflow-y:auto}.step-form{padding:16px 0;min-height:400px}.form-row{display:flex;gap:16px;margin-bottom:16px}.name-field,.category-field{flex:1}.description-field,.tags-input,.required-fields-input,.example-field,.organization-field{width:100%}.icon-field,.version-field,.author-name,.author-email{flex:1}.category-option,.icon-option{display:flex;align-items:center;gap:8px}.tags-section,.required-fields-section,.template-variables-section,.author-section,.example-section{margin-bottom:24px}.tags-section h4,.author-section h5,.example-section h5,.required-fields-section h5,.template-variables-section h5{margin:0 0 8px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-header{margin-bottom:16px}.section-header h4{margin:0 0 4px;font-size:16px;font-weight:500}.section-description,.field-description{margin:0;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.rules-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:16px;margin-bottom:24px}.preview-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-count{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.nodes-tree{max-height:200px;overflow-y:auto}.tree-node{border-left:2px solid transparent;padding:8px 0 8px 16px}.tree-node.root-node{border-left-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.node-content{display:flex;align-items:center;gap:8px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-size:13px}.node-type-chip{font-size:10px;height:18px;line-height:18px}.detected-variables{margin-top:8px}.no-variables{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;margin:8px 0}.step-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:24px;padding-top:16px;border-top:1px solid var(--md-sys-color-outline-variant)}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}::ng-deep .mat-stepper-horizontal{margin-top:8px}::ng-deep .mat-step-header{pointer-events:none}::ng-deep .mat-step-header.cdk-keyboard-focused,::ng-deep .mat-step-header.cdk-program-focused,::ng-deep .mat-step-header:hover{background-color:transparent}@media(max-width:768px){.template-editor-dialog{min-width:320px;max-width:95vw}.form-row{flex-direction:column}.name-field,.category-field,.icon-field,.version-field,.author-name,.author-email{flex:none;width:100%}}.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.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { 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: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { 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.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i10.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { 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: MatStepperModule }, { kind: "component", type: i7$3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "component", type: i7$3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i7$3.MatStepperNext, selector: "button[matStepperNext]" }, { kind: "directive", type: i7$3.MatStepperPrevious, selector: "button[matStepperPrevious]" }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatSnackBarModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19253
19325
  }
19254
19326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TemplateEditorDialogComponent, decorators: [{
19255
19327
  type: Component,
@@ -19261,6 +19333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
19261
19333
  MatSelectModule,
19262
19334
  MatButtonModule,
19263
19335
  MatIconModule,
19336
+ PraxisIconButtonComponent,
19264
19337
  MatChipsModule,
19265
19338
  MatTooltipModule,
19266
19339
  MatStepperModule,
@@ -19356,14 +19429,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
19356
19429
  (matChipInputTokenEnd)="addTag($event)">
19357
19430
  </mat-chip-grid>
19358
19431
  <button
19359
- mat-icon-button
19432
+ praxisIconButton="help_outline"
19433
+ size="dense"
19360
19434
  matSuffix
19361
- class="help-icon-button"
19362
19435
  type="button"
19363
19436
  [matTooltip]="'Tags help organize and find templates. Press Enter to add.'"
19364
19437
  matTooltipPosition="above"
19365
19438
  >
19366
- <mat-icon>help_outline</mat-icon>
19367
19439
  </button>
19368
19440
  </mat-form-field>
19369
19441
  </div>
@@ -19436,14 +19508,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
19436
19508
  (matChipInputTokenEnd)="addRequiredField($event)">
19437
19509
  </mat-chip-grid>
19438
19510
  <button
19439
- mat-icon-button
19511
+ praxisIconButton="help_outline"
19512
+ size="dense"
19440
19513
  matSuffix
19441
- class="help-icon-button"
19442
19514
  type="button"
19443
19515
  [matTooltip]="'Field names that must exist for the template to work correctly'"
19444
19516
  matTooltipPosition="above"
19445
19517
  >
19446
- <mat-icon>help_outline</mat-icon>
19447
19518
  </button>
19448
19519
  </mat-form-field>
19449
19520
  </div>
@@ -19514,14 +19585,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
19514
19585
  formControlName="version"
19515
19586
  placeholder="1.0.0">
19516
19587
  <button
19517
- mat-icon-button
19588
+ praxisIconButton="help_outline"
19589
+ size="dense"
19518
19590
  matSuffix
19519
- class="help-icon-button"
19520
19591
  type="button"
19521
19592
  [matTooltip]="'Semantic version (major.minor.patch)'"
19522
19593
  matTooltipPosition="above"
19523
19594
  >
19524
- <mat-icon>help_outline</mat-icon>
19525
19595
  </button>
19526
19596
  </mat-form-field>
19527
19597
  </div>
@@ -19600,7 +19670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
19600
19670
  </button>
19601
19671
  </div>
19602
19672
  </div>
19603
- `, styles: [".template-editor-dialog{min-width:600px;max-width:800px;max-height:90vh}.dialog-title{display:flex;align-items:center;gap:8px;margin:0;padding:24px 24px 0;font-size:20px;font-weight:500}.dialog-content{padding:16px 24px;max-height:calc(90vh - 120px);overflow-y:auto}.step-form{padding:16px 0;min-height:400px}.form-row{display:flex;gap:16px;margin-bottom:16px}.name-field,.category-field{flex:1}.description-field,.tags-input,.required-fields-input,.example-field,.organization-field{width:100%}.icon-field,.version-field,.author-name,.author-email{flex:1}.category-option,.icon-option{display:flex;align-items:center;gap:8px}.tags-section,.required-fields-section,.template-variables-section,.author-section,.example-section{margin-bottom:24px}.tags-section h4,.author-section h5,.example-section h5,.required-fields-section h5,.template-variables-section h5{margin:0 0 8px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-header{margin-bottom:16px}.section-header h4{margin:0 0 4px;font-size:16px;font-weight:500}.section-description,.field-description{margin:0;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.rules-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:16px;margin-bottom:24px}.preview-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-count{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.nodes-tree{max-height:200px;overflow-y:auto}.tree-node{border-left:2px solid transparent;padding:8px 0 8px 16px}.tree-node.root-node{border-left-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.node-content{display:flex;align-items:center;gap:8px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-size:13px}.node-type-chip{font-size:10px;height:18px;line-height:18px}.detected-variables{margin-top:8px}.no-variables{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;margin:8px 0}.step-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:24px;padding-top:16px;border-top:1px solid var(--md-sys-color-outline-variant)}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}::ng-deep .mat-stepper-horizontal{margin-top:8px}::ng-deep .mat-step-header{pointer-events:none}::ng-deep .mat-step-header.cdk-keyboard-focused,::ng-deep .mat-step-header.cdk-program-focused,::ng-deep .mat-step-header:hover{background-color:transparent}@media(max-width:768px){.template-editor-dialog{min-width:320px;max-width:95vw}.form-row{flex-direction:column}.name-field,.category-field,.icon-field,.version-field,.author-name,.author-email{flex:none;width:100%}}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;margin-right:-4px}.help-icon-button mat-icon{font-size:18px;width:18px;height:18px}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
19673
+ `, styles: [".template-editor-dialog{min-width:600px;max-width:800px;max-height:90vh}.dialog-title{display:flex;align-items:center;gap:8px;margin:0;padding:24px 24px 0;font-size:20px;font-weight:500}.dialog-content{padding:16px 24px;max-height:calc(90vh - 120px);overflow-y:auto}.step-form{padding:16px 0;min-height:400px}.form-row{display:flex;gap:16px;margin-bottom:16px}.name-field,.category-field{flex:1}.description-field,.tags-input,.required-fields-input,.example-field,.organization-field{width:100%}.icon-field,.version-field,.author-name,.author-email{flex:1}.category-option,.icon-option{display:flex;align-items:center;gap:8px}.tags-section,.required-fields-section,.template-variables-section,.author-section,.example-section{margin-bottom:24px}.tags-section h4,.author-section h5,.example-section h5,.required-fields-section h5,.template-variables-section h5{margin:0 0 8px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.section-header{margin-bottom:16px}.section-header h4{margin:0 0 4px;font-size:16px;font-weight:500}.section-description,.field-description{margin:0;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.rules-preview{background:var(--md-sys-color-surface-container);border-radius:8px;padding:16px;margin-bottom:24px}.preview-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:14px;font-weight:500;color:var(--md-sys-color-on-surface)}.node-count{font-weight:400;color:var(--md-sys-color-on-surface-variant)}.nodes-tree{max-height:200px;overflow-y:auto}.tree-node{border-left:2px solid transparent;padding:8px 0 8px 16px}.tree-node.root-node{border-left-color:var(--md-sys-color-primary);background:var(--md-sys-color-primary-container)}.node-content{display:flex;align-items:center;gap:8px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-size:13px}.node-type-chip{font-size:10px;height:18px;line-height:18px}.detected-variables{margin-top:8px}.no-variables{font-size:12px;color:var(--md-sys-color-on-surface-variant);font-style:italic;margin:8px 0}.step-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:24px;padding-top:16px;border-top:1px solid var(--md-sys-color-outline-variant)}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}::ng-deep .mat-stepper-horizontal{margin-top:8px}::ng-deep .mat-step-header{pointer-events:none}::ng-deep .mat-step-header.cdk-keyboard-focused,::ng-deep .mat-step-header.cdk-program-focused,::ng-deep .mat-step-header:hover{background-color:transparent}@media(max-width:768px){.template-editor-dialog{min-width:320px;max-width:95vw}.form-row{flex-direction:column}.name-field,.category-field,.icon-field,.version-field,.author-name,.author-email{flex:none;width:100%}}.mat-mdc-form-field-icon-suffix{align-self:center}\n"] }]
19604
19674
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
19605
19675
  type: Inject,
19606
19676
  args: [MAT_DIALOG_DATA]
@@ -19957,7 +20027,7 @@ class TemplatePreviewDialogComponent {
19957
20027
  </button>
19958
20028
  </div>
19959
20029
  </div>
19960
- `, isInline: true, styles: [".template-preview-dialog{min-width:500px;max-width:700px}.dialog-title{padding:24px 24px 0;margin:0}.title-content{display:flex;align-items:center;gap:12px;margin-bottom:8px}.title-content mat-icon{font-size:32px;width:32px;height:32px;color:var(--md-sys-color-primary)}.title-text h2{margin:0;font-size:24px;font-weight:500}.template-category{margin:4px 0 0;font-size:14px;color:var(--md-sys-color-on-surface-variant);text-transform:capitalize}.title-actions{display:flex;justify-content:flex-end;margin-bottom:16px}.complexity-chip{font-size:11px}.complexity-simple{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.complexity-medium{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.complexity-complex{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.dialog-content{padding:16px 24px;max-height:70vh;overflow-y:auto}.template-info h3,.template-metadata h3,.rule-structure h3,.required-fields h3,.example-usage h3{margin:0 0 12px;font-size:16px;font-weight:500;color:var(--md-sys-color-primary)}.template-description{margin:0 0 16px;line-height:1.5}.template-tags h4{margin:0 0 8px;font-size:14px;font-weight:500}.tag-chip{margin-right:4px;margin-bottom:4px}.metadata-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;margin-bottom:16px}.metadata-item{display:flex;align-items:center;gap:8px;padding:8px;background:var(--md-sys-color-surface-variant);border-radius:8px}.metadata-item mat-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.metadata-item .label{font-weight:500;color:var(--md-sys-color-on-surface)}.metadata-item .value{color:var(--md-sys-color-on-surface-variant)}.structure-container{margin-top:8px}.root-node-panel{margin-bottom:8px}.node-details{padding:0 16px 16px}.tree-node{margin-bottom:8px;padding:8px;border-left:2px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant);border-radius:4px}.node-content{display:flex;align-items:center;gap:8px;margin-bottom:4px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-weight:500}.node-type-chip{font-size:10px;height:20px;line-height:20px}.node-config{margin-top:4px}.config-preview{font-size:11px;margin:0;padding:4px 8px;background:var(--md-sys-color-surface);border-radius:4px;border:1px solid var(--md-sys-color-outline);overflow-x:auto}.required-field-chip{margin-right:4px;margin-bottom:4px}.fields-note{margin:12px 0 0;font-size:13px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.example-content{background:var(--md-sys-color-surface-variant);border-radius:8px;padding:16px}.example-code{margin:0;font-family:Courier New,monospace;font-size:12px;line-height:1.4;overflow-x:auto}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}mat-divider{margin:16px 0}@media(max-width:768px){.template-preview-dialog{min-width:320px;max-width:95vw}.metadata-grid{grid-template-columns:1fr}.title-content{flex-direction:column;align-items:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { 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: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i11$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i11$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i11$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i11$1.MatExpansionPanelDescription, selector: "mat-panel-description" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20030
+ `, isInline: true, styles: [".template-preview-dialog{min-width:500px;max-width:700px}.dialog-title{padding:24px 24px 0;margin:0}.title-content{display:flex;align-items:center;gap:12px;margin-bottom:8px}.title-content mat-icon{font-size:32px;width:32px;height:32px;color:var(--md-sys-color-primary)}.title-text h2{margin:0;font-size:24px;font-weight:500}.template-category{margin:4px 0 0;font-size:14px;color:var(--md-sys-color-on-surface-variant);text-transform:capitalize}.title-actions{display:flex;justify-content:flex-end;margin-bottom:16px}.complexity-chip{font-size:11px}.complexity-simple{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.complexity-medium{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.complexity-complex{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.dialog-content{padding:16px 24px;max-height:70vh;overflow-y:auto}.template-info h3,.template-metadata h3,.rule-structure h3,.required-fields h3,.example-usage h3{margin:0 0 12px;font-size:16px;font-weight:500;color:var(--md-sys-color-primary)}.template-description{margin:0 0 16px;line-height:1.5}.template-tags h4{margin:0 0 8px;font-size:14px;font-weight:500}.tag-chip{margin-right:4px;margin-bottom:4px}.metadata-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;margin-bottom:16px}.metadata-item{display:flex;align-items:center;gap:8px;padding:8px;background:var(--md-sys-color-surface-variant);border-radius:8px}.metadata-item mat-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.metadata-item .label{font-weight:500;color:var(--md-sys-color-on-surface)}.metadata-item .value{color:var(--md-sys-color-on-surface-variant)}.structure-container{margin-top:8px}.root-node-panel{margin-bottom:8px}.node-details{padding:0 16px 16px}.tree-node{margin-bottom:8px;padding:8px;border-left:2px solid var(--md-sys-color-outline);background:var(--md-sys-color-surface-variant);border-radius:4px}.node-content{display:flex;align-items:center;gap:8px;margin-bottom:4px}.node-icon{font-size:16px;width:16px;height:16px;color:var(--md-sys-color-primary)}.node-label{flex:1;font-weight:500}.node-type-chip{font-size:10px;height:20px;line-height:20px}.node-config{margin-top:4px}.config-preview{font-size:11px;margin:0;padding:4px 8px;background:var(--md-sys-color-surface);border-radius:4px;border:1px solid var(--md-sys-color-outline);overflow-x:auto}.required-field-chip{margin-right:4px;margin-bottom:4px}.fields-note{margin:12px 0 0;font-size:13px;color:var(--md-sys-color-on-surface-variant);font-style:italic}.example-content{background:var(--md-sys-color-surface-variant);border-radius:8px;padding:16px}.example-code{margin:0;font-family:Courier New,monospace;font-size:12px;line-height:1.4;overflow-x:auto}.dialog-actions{padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);display:flex;align-items:center;gap:8px}.actions-spacer{flex:1}mat-divider{margin:16px 0}@media(max-width:768px){.template-preview-dialog{min-width:320px;max-width:95vw}.metadata-grid{grid-template-columns:1fr}.title-content{flex-direction:column;align-items:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: 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: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { 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: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i10$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10$1.MatExpansionPanelDescription, selector: "mat-panel-description" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19961
20031
  }
19962
20032
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TemplatePreviewDialogComponent, decorators: [{
19963
20033
  type: Component,
@@ -20623,11 +20693,12 @@ class TemplateGalleryComponent {
20623
20693
  </button>
20624
20694
 
20625
20695
  <button
20626
- mat-icon-button
20696
+ praxisIconButton="view_module"
20697
+ size="dense"
20698
+ aria-label="View options"
20627
20699
  [matMenuTriggerFor]="viewMenu"
20628
20700
  matTooltip="View options"
20629
20701
  >
20630
- <mat-icon [praxisIcon]="'view_module'"></mat-icon>
20631
20702
  </button>
20632
20703
 
20633
20704
  <mat-menu #viewMenu="matMenu">
@@ -20861,11 +20932,12 @@ class TemplateGalleryComponent {
20861
20932
  <mat-card-subtitle>{{ template.category }}</mat-card-subtitle>
20862
20933
  <div class="card-actions">
20863
20934
  <button
20864
- mat-icon-button
20935
+ praxisIconButton="more_vert"
20936
+ size="dense"
20937
+ aria-label="Template actions"
20865
20938
  [matMenuTriggerFor]="templateMenu"
20866
20939
  (click)="$event.stopPropagation()"
20867
20940
  >
20868
- <mat-icon>more_vert</mat-icon>
20869
20941
  </button>
20870
20942
  <mat-menu #templateMenu="matMenu">
20871
20943
  <button mat-menu-item (click)="applyTemplate(template)">
@@ -21030,10 +21102,11 @@ class TemplateGalleryComponent {
21030
21102
  Preview
21031
21103
  </button>
21032
21104
  <button
21033
- mat-icon-button
21105
+ praxisIconButton="more_vert"
21106
+ size="dense"
21107
+ aria-label="Template actions"
21034
21108
  [matMenuTriggerFor]="listTemplateMenu"
21035
21109
  >
21036
- <mat-icon>more_vert</mat-icon>
21037
21110
  </button>
21038
21111
  <mat-menu #listTemplateMenu="matMenu">
21039
21112
  <button mat-menu-item (click)="editTemplate(template)">
@@ -21072,18 +21145,20 @@ class TemplateGalleryComponent {
21072
21145
  </div>
21073
21146
  <div class="compact-actions">
21074
21147
  <button
21075
- mat-icon-button
21148
+ praxisIconButton="play_arrow"
21149
+ size="dense"
21150
+ aria-label="Apply template"
21076
21151
  (click)="applyTemplate(template)"
21077
21152
  matTooltip="Apply template"
21078
21153
  >
21079
- <mat-icon>play_arrow</mat-icon>
21080
21154
  </button>
21081
21155
  <button
21082
- mat-icon-button
21156
+ praxisIconButton="preview"
21157
+ size="dense"
21158
+ aria-label="Preview template"
21083
21159
  (click)="previewTemplate(template)"
21084
21160
  matTooltip="Preview template"
21085
21161
  >
21086
- <mat-icon>preview</mat-icon>
21087
21162
  </button>
21088
21163
  </div>
21089
21164
  </div>
@@ -21108,7 +21183,7 @@ class TemplateGalleryComponent {
21108
21183
  </div>
21109
21184
  </div>
21110
21185
  </div>
21111
- `, 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))}.template-gallery{display:flex;flex-direction:column;height:100%;background:var(--md-sys-color-background)}.gallery-header{background:var(--md-sys-color-surface);border-bottom:1px solid var(--md-sys-color-outline);padding:16px 24px}.header-content{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.title-section{flex:1}.gallery-title{display:flex;align-items:center;gap:8px;margin:0;font-size:24px;font-weight:500;color:var(--md-sys-color-on-surface)}.gallery-subtitle{margin:4px 0 0 32px;color:var(--md-sys-color-on-surface-variant);font-size:14px}.header-actions{display:flex;gap:8px;align-items:center}.stats-bar{display:flex;gap:24px;padding:12px 0;border-top:1px solid var(--md-sys-color-outline)}.stat-item{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.stat-item mat-icon{font-size:16px;width:16px;height:16px}.search-section{padding:16px 24px;background:var(--md-sys-color-surface-variant);border-bottom:1px solid var(--md-sys-color-outline)}.search-form{display:flex;flex-direction:column;gap:16px}.search-row{display:flex;gap:16px;align-items:flex-start}.search-input{flex:2;min-width:300px}.category-select,.complexity-select,.sort-select{flex:1;min-width:150px}.category-option{display:flex;align-items:center;gap:8px;width:100%}.tags-section{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.tags-label{font-size:13px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.tags-list{flex:1}.active-filters{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 0;border-top:1px solid var(--md-sys-color-outline)}.filters-label{font-size:13px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.filter-chips{flex:1}.clear-all-button{font-size:12px}.recently-used-section{padding:16px 24px}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.template-count{font-size:14px;font-weight:400;color:var(--md-sys-color-on-surface-variant)}.recent-templates{display:flex;gap:12px;flex-wrap:wrap}.recent-template-button{display:flex;align-items:center;gap:8px;padding:8px 16px}.templates-section{flex:1;padding:0 24px 24px;overflow:auto}.templates-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.view-toggle{display:flex;align-items:center;gap:8px}.templates-container{min-height:200px}.templates-container.grid-view{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:16px}.template-grid-card{height:fit-content;transition:transform .2s ease,box-shadow .2s ease}.template-grid-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.template-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.card-actions{margin-left:auto}.template-description{font-size:14px;line-height:1.4;margin:0 0 12px;color:var(--md-sys-color-on-surface-variant)}.template-tags{margin-bottom:12px}.template-tag{font-size:11px;height:20px;line-height:20px}.more-tags{background:var(--md-sys-color-surface-variant);color:var(--md-sys-color-on-surface-variant)}.template-metadata{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:12px}.metadata-item{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.metadata-item mat-icon{font-size:14px;width:14px;height:14px}.template-preview{margin-top:12px;padding:8px;background:var(--md-sys-color-surface-variant);border-radius:4px}.preview-header{display:flex;align-items:center;gap:4px;font-size:12px;font-weight:500;margin-bottom:8px;color:var(--md-sys-color-on-surface-variant)}.preview-header mat-icon{font-size:14px;width:14px;height:14px}.node-tree{font-size:11px;font-family:monospace}.root-node{padding:2px 0;color:var(--md-sys-color-on-surface)}.templates-container.list-view{display:flex;flex-direction:column;gap:8px}.template-list-card{padding:12px 16px}.list-card-content{display:flex;justify-content:space-between;align-items:center;gap:16px}.template-info{flex:1;display:flex;flex-direction:column;gap:8px}.template-header{display:flex;align-items:center;gap:12px}.template-details{flex:1}.template-name{margin:0;font-size:16px;font-weight:500}.template-meta{display:flex;gap:8px;align-items:center}.category-badge,.complexity-badge{font-size:11px;padding:2px 6px;border-radius:12px;background:var(--md-sys-color-surface-variant);color:var(--md-sys-color-on-surface-variant)}.complexity-simple{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.complexity-medium{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.complexity-complex{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.usage-count{font-size:11px;color:var(--md-sys-color-on-surface-variant)}.template-actions{display:flex;gap:8px;align-items:center}.templates-container.compact-view{display:flex;flex-direction:column;gap:4px}.template-compact-card{padding:8px 12px;border:1px solid var(--md-sys-color-outline);border-radius:4px;background:var(--md-sys-color-surface)}.compact-content{display:flex;align-items:center;gap:12px}.compact-icon{color:var(--md-sys-color-primary)}.compact-info{flex:1;display:flex;flex-direction:column}.compact-name{font-size:14px;font-weight:500}.compact-category{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.compact-actions{display:flex;gap:4px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;color:var(--md-sys-color-on-surface-variant)}.empty-icon{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--md-sys-color-outline)}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface)}.empty-state p{margin:0 0 16px;max-width:400px}@media(max-width:1024px){.templates-container.grid-view{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.search-row{flex-wrap:wrap}.search-input{flex:1 1 100%}}@media(max-width:768px){.header-content{flex-direction:column;gap:16px;align-items:flex-start}.templates-container.grid-view{grid-template-columns:1fr}.stats-bar{flex-wrap:wrap;gap:12px}.gallery-subtitle{margin-left:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.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: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5$1.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i5$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$1.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5$1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { 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.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", 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: 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: "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.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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i10.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7$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: i7$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7$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: MatBadgeModule }, { kind: "directive", type: i10$1.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "pipe", type: i12$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21186
+ `, 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))}.template-gallery{display:flex;flex-direction:column;height:100%;background:var(--md-sys-color-background)}.gallery-header{background:var(--md-sys-color-surface);border-bottom:1px solid var(--md-sys-color-outline);padding:16px 24px}.header-content{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.title-section{flex:1}.gallery-title{display:flex;align-items:center;gap:8px;margin:0;font-size:24px;font-weight:500;color:var(--md-sys-color-on-surface)}.gallery-subtitle{margin:4px 0 0 32px;color:var(--md-sys-color-on-surface-variant);font-size:14px}.header-actions{display:flex;gap:8px;align-items:center}.stats-bar{display:flex;gap:24px;padding:12px 0;border-top:1px solid var(--md-sys-color-outline)}.stat-item{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--md-sys-color-on-surface-variant)}.stat-item mat-icon{font-size:16px;width:16px;height:16px}.search-section{padding:16px 24px;background:var(--md-sys-color-surface-variant);border-bottom:1px solid var(--md-sys-color-outline)}.search-form{display:flex;flex-direction:column;gap:16px}.search-row{display:flex;gap:16px;align-items:flex-start}.search-input{flex:2;min-width:300px}.category-select,.complexity-select,.sort-select{flex:1;min-width:150px}.category-option{display:flex;align-items:center;gap:8px;width:100%}.tags-section{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.tags-label{font-size:13px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.tags-list{flex:1}.active-filters{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 0;border-top:1px solid var(--md-sys-color-outline)}.filters-label{font-size:13px;font-weight:500;color:var(--md-sys-color-on-surface-variant)}.filter-chips{flex:1}.clear-all-button{font-size:12px}.recently-used-section{padding:16px 24px}.section-title{display:flex;align-items:center;gap:8px;margin:0 0 16px;font-size:16px;font-weight:500;color:var(--md-sys-color-on-surface)}.template-count{font-size:14px;font-weight:400;color:var(--md-sys-color-on-surface-variant)}.recent-templates{display:flex;gap:12px;flex-wrap:wrap}.recent-template-button{display:flex;align-items:center;gap:8px;padding:8px 16px}.templates-section{flex:1;padding:0 24px 24px;overflow:auto}.templates-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.view-toggle{display:flex;align-items:center;gap:8px}.templates-container{min-height:200px}.templates-container.grid-view{display:grid;grid-template-columns:repeat(auto-fill,minmax(350px,1fr));gap:16px}.template-grid-card{height:fit-content;transition:transform .2s ease,box-shadow .2s ease}.template-grid-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px var(--vb-shadow-medium-color)}.template-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}.card-actions{margin-left:auto}.template-description{font-size:14px;line-height:1.4;margin:0 0 12px;color:var(--md-sys-color-on-surface-variant)}.template-tags{margin-bottom:12px}.template-tag{font-size:11px;height:20px;line-height:20px}.more-tags{background:var(--md-sys-color-surface-variant);color:var(--md-sys-color-on-surface-variant)}.template-metadata{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:12px}.metadata-item{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.metadata-item mat-icon{font-size:14px;width:14px;height:14px}.template-preview{margin-top:12px;padding:8px;background:var(--md-sys-color-surface-variant);border-radius:4px}.preview-header{display:flex;align-items:center;gap:4px;font-size:12px;font-weight:500;margin-bottom:8px;color:var(--md-sys-color-on-surface-variant)}.preview-header mat-icon{font-size:14px;width:14px;height:14px}.node-tree{font-size:11px;font-family:monospace}.root-node{padding:2px 0;color:var(--md-sys-color-on-surface)}.templates-container.list-view{display:flex;flex-direction:column;gap:8px}.template-list-card{padding:12px 16px}.list-card-content{display:flex;justify-content:space-between;align-items:center;gap:16px}.template-info{flex:1;display:flex;flex-direction:column;gap:8px}.template-header{display:flex;align-items:center;gap:12px}.template-details{flex:1}.template-name{margin:0;font-size:16px;font-weight:500}.template-meta{display:flex;gap:8px;align-items:center}.category-badge,.complexity-badge{font-size:11px;padding:2px 6px;border-radius:12px;background:var(--md-sys-color-surface-variant);color:var(--md-sys-color-on-surface-variant)}.complexity-simple{background:var(--md-sys-color-tertiary-container);color:var(--md-sys-color-on-tertiary-container)}.complexity-medium{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container)}.complexity-complex{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container)}.usage-count{font-size:11px;color:var(--md-sys-color-on-surface-variant)}.template-actions{display:flex;gap:8px;align-items:center}.templates-container.compact-view{display:flex;flex-direction:column;gap:4px}.template-compact-card{padding:8px 12px;border:1px solid var(--md-sys-color-outline);border-radius:4px;background:var(--md-sys-color-surface)}.compact-content{display:flex;align-items:center;gap:12px}.compact-icon{color:var(--md-sys-color-primary)}.compact-info{flex:1;display:flex;flex-direction:column}.compact-name{font-size:14px;font-weight:500}.compact-category{font-size:12px;color:var(--md-sys-color-on-surface-variant)}.compact-actions{display:flex;gap:4px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center;color:var(--md-sys-color-on-surface-variant)}.empty-icon{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:var(--md-sys-color-outline)}.empty-state h3{margin:0 0 8px;color:var(--md-sys-color-on-surface)}.empty-state p{margin:0 0 16px;max-width:400px}@media(max-width:1024px){.templates-container.grid-view{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.search-row{flex-wrap:wrap}.search-input{flex:1 1 100%}}@media(max-width:768px){.header-content{flex-direction:column;gap:16px;align-items:flex-start}.templates-container.grid-view{grid-template-columns:1fr}.stats-bar{flex-wrap:wrap;gap:12px}.gallery-subtitle{margin-left:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.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: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i5$1.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i5$1.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i5$1.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: i5$1.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i5$1.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i5$1.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: i5$1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { 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: 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: "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.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: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { 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.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i10.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { 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: MatTabsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatSnackBarModule }, { 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: MatBadgeModule }, { kind: "directive", type: i9$2.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: PraxisIconButtonComponent, selector: "button[praxisIconButton]", inputs: ["praxisIconButton", "size", "appearance", "presentation", "pressed", "busy"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "pipe", type: i12$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
21112
21187
  }
21113
21188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: TemplateGalleryComponent, decorators: [{
21114
21189
  type: Component,
@@ -21132,6 +21207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21132
21207
  MatExpansionModule,
21133
21208
  MatDividerModule,
21134
21209
  MatSlideToggleModule,
21210
+ PraxisIconButtonComponent,
21135
21211
  PraxisIconDirective,
21136
21212
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
21137
21213
  <div class="template-gallery">
@@ -21169,11 +21245,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21169
21245
  </button>
21170
21246
 
21171
21247
  <button
21172
- mat-icon-button
21248
+ praxisIconButton="view_module"
21249
+ size="dense"
21250
+ aria-label="View options"
21173
21251
  [matMenuTriggerFor]="viewMenu"
21174
21252
  matTooltip="View options"
21175
21253
  >
21176
- <mat-icon [praxisIcon]="'view_module'"></mat-icon>
21177
21254
  </button>
21178
21255
 
21179
21256
  <mat-menu #viewMenu="matMenu">
@@ -21407,11 +21484,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21407
21484
  <mat-card-subtitle>{{ template.category }}</mat-card-subtitle>
21408
21485
  <div class="card-actions">
21409
21486
  <button
21410
- mat-icon-button
21487
+ praxisIconButton="more_vert"
21488
+ size="dense"
21489
+ aria-label="Template actions"
21411
21490
  [matMenuTriggerFor]="templateMenu"
21412
21491
  (click)="$event.stopPropagation()"
21413
21492
  >
21414
- <mat-icon>more_vert</mat-icon>
21415
21493
  </button>
21416
21494
  <mat-menu #templateMenu="matMenu">
21417
21495
  <button mat-menu-item (click)="applyTemplate(template)">
@@ -21576,10 +21654,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21576
21654
  Preview
21577
21655
  </button>
21578
21656
  <button
21579
- mat-icon-button
21657
+ praxisIconButton="more_vert"
21658
+ size="dense"
21659
+ aria-label="Template actions"
21580
21660
  [matMenuTriggerFor]="listTemplateMenu"
21581
21661
  >
21582
- <mat-icon>more_vert</mat-icon>
21583
21662
  </button>
21584
21663
  <mat-menu #listTemplateMenu="matMenu">
21585
21664
  <button mat-menu-item (click)="editTemplate(template)">
@@ -21618,18 +21697,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21618
21697
  </div>
21619
21698
  <div class="compact-actions">
21620
21699
  <button
21621
- mat-icon-button
21700
+ praxisIconButton="play_arrow"
21701
+ size="dense"
21702
+ aria-label="Apply template"
21622
21703
  (click)="applyTemplate(template)"
21623
21704
  matTooltip="Apply template"
21624
21705
  >
21625
- <mat-icon>play_arrow</mat-icon>
21626
21706
  </button>
21627
21707
  <button
21628
- mat-icon-button
21708
+ praxisIconButton="preview"
21709
+ size="dense"
21710
+ aria-label="Preview template"
21629
21711
  (click)="previewTemplate(template)"
21630
21712
  matTooltip="Preview template"
21631
21713
  >
21632
- <mat-icon>preview</mat-icon>
21633
21714
  </button>
21634
21715
  </div>
21635
21716
  </div>
@@ -21674,4 +21755,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
21674
21755
  * Generated bundle index. Do not edit.
21675
21756
  */
21676
21757
 
21677
- 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, 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 };
21758
+ 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 };