@praxisui/table-rule-builder 1.0.0-beta.43 → 1.0.0-beta.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -20,8 +20,12 @@ Peers (Angular v20): `@angular/core`, `@angular/common`, `@angular/forms`, `@ang
|
|
|
20
20
|
## Exportações (resumo)
|
|
21
21
|
|
|
22
22
|
- `RuleEffectsPanelComponent` — painel standalone para editar efeitos (estilo, layout, ícone/badge, fundo, animação e tooltip)
|
|
23
|
-
- `toCellClassAndStyle(effects)` — converte o modelo em `{ classList, style }` para renderização em células/linhas
|
|
23
|
+
- `toCellClassAndStyle(effects, options?)` — converte o modelo em `{ classList, style }` para renderização em células/linhas (`includeAnimationPreview: false` evita leak de classes de preview no payload persistido)
|
|
24
24
|
- `DEFAULT_EFFECT_PRESETS` — presets prontos de efeitos
|
|
25
25
|
- Presets de animação semânticos com aliases (resolução interna e serialização fail-closed para evitar overrides implícitos)
|
|
26
|
-
- Contrato runtime atual: animação é suportada em `rowConditionalRenderers
|
|
26
|
+
- Contrato runtime atual: animação é suportada em `rowConditionalRenderers` e `columns[].conditionalRenderers` (com precedência `rule.animation > rule.renderer.animation` e first-match por efeito real).
|
|
27
27
|
- Tipos: `RuleEffectDefinition`, `RuleScope`
|
|
28
|
+
|
|
29
|
+
## Testes
|
|
30
|
+
|
|
31
|
+
- Target oficial no workspace: `ng test praxis-table-rule-builder --watch=false --browsers=ChromeHeadless`
|
|
@@ -1065,6 +1065,7 @@ class RuleEffectsPanelComponent {
|
|
|
1065
1065
|
}
|
|
1066
1066
|
computeCellClass(v) {
|
|
1067
1067
|
const anim = this.resolvePreviewAnimation(v);
|
|
1068
|
+
const allowAnimation = this.isPreviewAnimationAllowed();
|
|
1068
1069
|
const triggerHover = anim.trigger === 'onHover';
|
|
1069
1070
|
const triggerAppear = anim.trigger === 'onAppear';
|
|
1070
1071
|
const triggerChange = anim.trigger === 'onChange'
|
|
@@ -1079,12 +1080,16 @@ class RuleEffectsPanelComponent {
|
|
|
1079
1080
|
const active = (triggerHover && this.isHovering) ||
|
|
1080
1081
|
triggerAppear ||
|
|
1081
1082
|
triggerChange; // we don’t track changes here, preview is always ‘changed’
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
[`anim--${anim.intensity}`]: !!anim.type && !!anim.enabled && active,
|
|
1085
|
-
[repeatClass]: !!anim.type && !!anim.enabled && active,
|
|
1086
|
-
'icon--overlay': v?.iconBadge?.icon && v?.iconBadge?.iconPos === 'overlay',
|
|
1083
|
+
const out = {
|
|
1084
|
+
'icon--overlay': !!v?.iconBadge?.icon && v?.iconBadge?.iconPos === 'overlay',
|
|
1087
1085
|
};
|
|
1086
|
+
if (!allowAnimation || !anim.type || !anim.enabled || !active) {
|
|
1087
|
+
return out;
|
|
1088
|
+
}
|
|
1089
|
+
out[`anim--${anim.type}`] = true;
|
|
1090
|
+
out[`anim--${anim.intensity}`] = true;
|
|
1091
|
+
out[repeatClass] = true;
|
|
1092
|
+
return out;
|
|
1088
1093
|
}
|
|
1089
1094
|
resolvePreviewAnimation(v) {
|
|
1090
1095
|
const resolved = resolveRuleAnimationConfig(v?.animation);
|
|
@@ -1099,6 +1104,17 @@ class RuleEffectsPanelComponent {
|
|
|
1099
1104
|
intensity: 'normal',
|
|
1100
1105
|
};
|
|
1101
1106
|
}
|
|
1107
|
+
isPreviewAnimationAllowed() {
|
|
1108
|
+
try {
|
|
1109
|
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
|
|
1110
|
+
return true;
|
|
1111
|
+
}
|
|
1112
|
+
return !window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
1113
|
+
}
|
|
1114
|
+
catch {
|
|
1115
|
+
return true;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1102
1118
|
badgeBackground(v) {
|
|
1103
1119
|
const s = v?.iconBadge;
|
|
1104
1120
|
if (!s?.badgeText)
|
|
@@ -1168,7 +1184,7 @@ class RuleEffectsPanelComponent {
|
|
|
1168
1184
|
return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : undefined;
|
|
1169
1185
|
}
|
|
1170
1186
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: RuleEffectsPanelComponent, deps: [{ token: i1.FormBuilder }, { token: EffectRegistryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1171
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: RuleEffectsPanelComponent, isStandalone: true, selector: "praxis-rule-effects-panel", inputs: { scope: "scope", value: "value" }, outputs: { valueChange: "valueChange", apply: "apply", reset: "reset" }, ngImport: i0, template: "<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pr\u00E9-visualiza\u00E7\u00E3o e se\u00E7\u00E3o avan\u00E7ada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva \u2014 Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar pre\u00E7os altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n", styles: [".rulefx{background:linear-gradient(180deg,#171b24,#1e2431);border-radius:14px;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);box-shadow:0 6px 24px #00000047;padding:12px}.rulefx__header{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px;margin-bottom:8px}.rulefx__title{margin:0;font-size:1.05rem}.rulefx__subtitle{margin:0;opacity:.75;font-size:.9rem}.rulefx__actions{display:inline-flex;gap:8px;align-items:center}.rulefx__ribbon{display:flex;gap:6px;padding:8px;border-radius:10px;background:linear-gradient(180deg,#202636,#1c2230);margin-bottom:8px}.ribbon__tab{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;background:transparent;color:#e7ecf6;cursor:pointer;border:none}.ribbon__tab.is-active{background:linear-gradient(180deg,#2a3550,#243149);box-shadow:inset 0 0 0 1px #ffffff0a}.rulefx__quickbar{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:10px;background:linear-gradient(180deg,#202637,#1c2230);margin-bottom:10px}.rulefx__body{display:grid;grid-template-columns:1fr 320px;gap:12px}.rulefx__preview{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px;background:linear-gradient(180deg,#202637,#1c2230)}.preview__title{font-weight:600;margin-bottom:8px}.preview__cell{display:inline-flex;align-items:center;gap:8px;padding:10px 12px;border-radius:12px;background:#35d07f14;border:1px solid rgba(53,208,127,.25)}.preview__icon{font-size:18px;line-height:1}.preview__badge{font-size:.75rem;border-radius:999px;padding:2px 8px;border:1px solid transparent}.preview__hint{opacity:.7;font-size:.85rem;margin:8px 0 0}.rulefx__advanced .advanced__grid{display:grid;grid-template-columns:1fr;gap:8px}.rulefx__advanced .textctl{display:grid;gap:6px}.rulefx__advanced input[type=text]{background:#151a24;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:8px 10px}.anim--once{animation-iteration-count:1}.anim--loop{animation-iteration-count:infinite}.anim--count{animation-iteration-count:3}.anim--subtle{--pfx-preview-scale-peak: 1.01;--pfx-preview-min-opacity: .7;--pfx-preview-slide-distance: 2px;--pfx-preview-border-strength: .18}.anim--normal{--pfx-preview-scale-peak: 1.03;--pfx-preview-min-opacity: .45;--pfx-preview-slide-distance: 6px;--pfx-preview-border-strength: .3}.anim--strong{--pfx-preview-scale-peak: 1.05;--pfx-preview-min-opacity: .25;--pfx-preview-slide-distance: 8px;--pfx-preview-border-strength: .42}.anim--pulse{animation-name:pfxPulse;animation-duration:.8s;animation-timing-function:ease-in-out}.anim--blink{animation-name:pfxBlink;animation-duration:.7s}.anim--grow{animation-name:pfxGrow;animation-duration:.4s}.anim--fade{animation-name:pfxFade;animation-duration:.6s}.anim--slide-in{animation-name:pfxSlideIn;animation-duration:.3s}.anim--border-pulse{animation-name:pfxBorderPulse;animation-duration:.9s}@keyframes pfxPulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-preview-scale-peak, 1.03))}to{transform:scale(1)}}@keyframes pfxBlink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-preview-min-opacity, .25)}}@keyframes pfxGrow{0%{transform:scale(.96)}to{transform:scale(1)}}@keyframes pfxFade{0%{opacity:0}to{opacity:1}}@keyframes pfxSlideIn{0%{transform:translateY(var(--pfx-preview-slide-distance, 6px));opacity:0}to{transform:translateY(0);opacity:1}}@keyframes pfxBorderPulse{0%,to{box-shadow:inset 0 0 #d32f2f00}50%{box-shadow:inset 0 0 0 2px rgba(211,47,47,var(--pfx-preview-border-strength, .3))}}.icon--overlay{position:relative}.icon--overlay .preview__icon{position:absolute;left:6px;top:6px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.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: MatButtonToggleModule }, { kind: "component", type: EstiloEditorComponent, selector: "praxis-effects-estilo-editor", inputs: ["group"] }, { kind: "component", type: LayoutEditorComponent, selector: "praxis-effects-layout-editor", inputs: ["group"] }, { kind: "component", type: IconeBadgeEditorComponent, selector: "praxis-effects-icone-badge-editor", inputs: ["group"] }, { kind: "component", type: FundoEditorComponent, selector: "praxis-effects-fundo-editor", inputs: ["group"] }, { kind: "component", type: AnimacaoEditorComponent, selector: "praxis-effects-animacao-editor", inputs: ["group"] }, { kind: "component", type: TooltipEditorComponent, selector: "praxis-effects-tooltip-editor", inputs: ["group"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1187
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: RuleEffectsPanelComponent, isStandalone: true, selector: "praxis-rule-effects-panel", inputs: { scope: "scope", value: "value" }, outputs: { valueChange: "valueChange", apply: "apply", reset: "reset" }, ngImport: i0, template: "<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pr\u00E9-visualiza\u00E7\u00E3o e se\u00E7\u00E3o avan\u00E7ada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva \u2014 Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar pre\u00E7os altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n", styles: [".rulefx{background:linear-gradient(180deg,#171b24,#1e2431);border-radius:14px;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);box-shadow:0 6px 24px #00000047;padding:12px}.rulefx__header{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px;margin-bottom:8px}.rulefx__title{margin:0;font-size:1.05rem}.rulefx__subtitle{margin:0;opacity:.75;font-size:.9rem}.rulefx__actions{display:inline-flex;gap:8px;align-items:center}.rulefx__ribbon{display:flex;gap:6px;padding:8px;border-radius:10px;background:linear-gradient(180deg,#202636,#1c2230);margin-bottom:8px}.ribbon__tab{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;background:transparent;color:#e7ecf6;cursor:pointer;border:none}.ribbon__tab.is-active{background:linear-gradient(180deg,#2a3550,#243149);box-shadow:inset 0 0 0 1px #ffffff0a}.rulefx__quickbar{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:10px;background:linear-gradient(180deg,#202637,#1c2230);margin-bottom:10px}.rulefx__body{display:grid;grid-template-columns:1fr 320px;gap:12px}.rulefx__preview{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px;background:linear-gradient(180deg,#202637,#1c2230)}.preview__title{font-weight:600;margin-bottom:8px}.preview__cell{display:inline-flex;align-items:center;gap:8px;padding:10px 12px;border-radius:12px;background:#35d07f14;border:1px solid rgba(53,208,127,.25)}.preview__icon{font-size:18px;line-height:1}.preview__badge{font-size:.75rem;border-radius:999px;padding:2px 8px;border:1px solid transparent}.preview__hint{opacity:.7;font-size:.85rem;margin:8px 0 0}.rulefx__advanced .advanced__grid{display:grid;grid-template-columns:1fr;gap:8px}.rulefx__advanced .textctl{display:grid;gap:6px}.rulefx__advanced input[type=text]{background:#151a24;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:8px 10px}.anim--once{animation-iteration-count:1}.anim--loop{animation-iteration-count:infinite}.anim--count{animation-iteration-count:3}.anim--subtle{--pfx-preview-scale-peak: 1.01;--pfx-preview-min-opacity: .7;--pfx-preview-slide-distance: 2px;--pfx-preview-border-strength: .18}.anim--normal{--pfx-preview-scale-peak: 1.03;--pfx-preview-min-opacity: .45;--pfx-preview-slide-distance: 6px;--pfx-preview-border-strength: .3}.anim--strong{--pfx-preview-scale-peak: 1.05;--pfx-preview-min-opacity: .25;--pfx-preview-slide-distance: 8px;--pfx-preview-border-strength: .42}.anim--pulse{animation-name:pfxPulse;animation-duration:.8s;animation-timing-function:ease-in-out}.anim--blink{animation-name:pfxBlink;animation-duration:.7s}.anim--grow{animation-name:pfxGrow;animation-duration:.4s}.anim--fade{animation-name:pfxFade;animation-duration:.6s}.anim--slide-in{animation-name:pfxSlideIn;animation-duration:.3s}.anim--border-pulse{animation-name:pfxBorderPulse;animation-duration:.9s}@keyframes pfxPulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-preview-scale-peak, 1.03))}to{transform:scale(1)}}@keyframes pfxBlink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-preview-min-opacity, .25)}}@keyframes pfxGrow{0%{transform:scale(.96)}to{transform:scale(1)}}@keyframes pfxFade{0%{opacity:0}to{opacity:1}}@keyframes pfxSlideIn{0%{transform:translateY(var(--pfx-preview-slide-distance, 6px));opacity:0}to{transform:translateY(0);opacity:1}}@keyframes pfxBorderPulse{0%,to{box-shadow:inset 0 0 #d32f2f00}50%{box-shadow:inset 0 0 0 2px rgba(211,47,47,var(--pfx-preview-border-strength, .3))}}.icon--overlay{position:relative}.icon--overlay .preview__icon{position:absolute;left:6px;top:6px}@media(prefers-reduced-motion:reduce){.preview__cell{animation:none!important;transition:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.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.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.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: MatButtonToggleModule }, { kind: "component", type: EstiloEditorComponent, selector: "praxis-effects-estilo-editor", inputs: ["group"] }, { kind: "component", type: LayoutEditorComponent, selector: "praxis-effects-layout-editor", inputs: ["group"] }, { kind: "component", type: IconeBadgeEditorComponent, selector: "praxis-effects-icone-badge-editor", inputs: ["group"] }, { kind: "component", type: FundoEditorComponent, selector: "praxis-effects-fundo-editor", inputs: ["group"] }, { kind: "component", type: AnimacaoEditorComponent, selector: "praxis-effects-animacao-editor", inputs: ["group"] }, { kind: "component", type: TooltipEditorComponent, selector: "praxis-effects-tooltip-editor", inputs: ["group"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1172
1188
|
}
|
|
1173
1189
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: RuleEffectsPanelComponent, decorators: [{
|
|
1174
1190
|
type: Component,
|
|
@@ -1188,7 +1204,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
1188
1204
|
FundoEditorComponent,
|
|
1189
1205
|
AnimacaoEditorComponent,
|
|
1190
1206
|
TooltipEditorComponent,
|
|
1191
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pr\u00E9-visualiza\u00E7\u00E3o e se\u00E7\u00E3o avan\u00E7ada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva \u2014 Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar pre\u00E7os altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n", styles: [".rulefx{background:linear-gradient(180deg,#171b24,#1e2431);border-radius:14px;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);box-shadow:0 6px 24px #00000047;padding:12px}.rulefx__header{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px;margin-bottom:8px}.rulefx__title{margin:0;font-size:1.05rem}.rulefx__subtitle{margin:0;opacity:.75;font-size:.9rem}.rulefx__actions{display:inline-flex;gap:8px;align-items:center}.rulefx__ribbon{display:flex;gap:6px;padding:8px;border-radius:10px;background:linear-gradient(180deg,#202636,#1c2230);margin-bottom:8px}.ribbon__tab{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;background:transparent;color:#e7ecf6;cursor:pointer;border:none}.ribbon__tab.is-active{background:linear-gradient(180deg,#2a3550,#243149);box-shadow:inset 0 0 0 1px #ffffff0a}.rulefx__quickbar{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:10px;background:linear-gradient(180deg,#202637,#1c2230);margin-bottom:10px}.rulefx__body{display:grid;grid-template-columns:1fr 320px;gap:12px}.rulefx__preview{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px;background:linear-gradient(180deg,#202637,#1c2230)}.preview__title{font-weight:600;margin-bottom:8px}.preview__cell{display:inline-flex;align-items:center;gap:8px;padding:10px 12px;border-radius:12px;background:#35d07f14;border:1px solid rgba(53,208,127,.25)}.preview__icon{font-size:18px;line-height:1}.preview__badge{font-size:.75rem;border-radius:999px;padding:2px 8px;border:1px solid transparent}.preview__hint{opacity:.7;font-size:.85rem;margin:8px 0 0}.rulefx__advanced .advanced__grid{display:grid;grid-template-columns:1fr;gap:8px}.rulefx__advanced .textctl{display:grid;gap:6px}.rulefx__advanced input[type=text]{background:#151a24;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:8px 10px}.anim--once{animation-iteration-count:1}.anim--loop{animation-iteration-count:infinite}.anim--count{animation-iteration-count:3}.anim--subtle{--pfx-preview-scale-peak: 1.01;--pfx-preview-min-opacity: .7;--pfx-preview-slide-distance: 2px;--pfx-preview-border-strength: .18}.anim--normal{--pfx-preview-scale-peak: 1.03;--pfx-preview-min-opacity: .45;--pfx-preview-slide-distance: 6px;--pfx-preview-border-strength: .3}.anim--strong{--pfx-preview-scale-peak: 1.05;--pfx-preview-min-opacity: .25;--pfx-preview-slide-distance: 8px;--pfx-preview-border-strength: .42}.anim--pulse{animation-name:pfxPulse;animation-duration:.8s;animation-timing-function:ease-in-out}.anim--blink{animation-name:pfxBlink;animation-duration:.7s}.anim--grow{animation-name:pfxGrow;animation-duration:.4s}.anim--fade{animation-name:pfxFade;animation-duration:.6s}.anim--slide-in{animation-name:pfxSlideIn;animation-duration:.3s}.anim--border-pulse{animation-name:pfxBorderPulse;animation-duration:.9s}@keyframes pfxPulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-preview-scale-peak, 1.03))}to{transform:scale(1)}}@keyframes pfxBlink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-preview-min-opacity, .25)}}@keyframes pfxGrow{0%{transform:scale(.96)}to{transform:scale(1)}}@keyframes pfxFade{0%{opacity:0}to{opacity:1}}@keyframes pfxSlideIn{0%{transform:translateY(var(--pfx-preview-slide-distance, 6px));opacity:0}to{transform:translateY(0);opacity:1}}@keyframes pfxBorderPulse{0%,to{box-shadow:inset 0 0 #d32f2f00}50%{box-shadow:inset 0 0 0 2px rgba(211,47,47,var(--pfx-preview-border-strength, .3))}}.icon--overlay{position:relative}.icon--overlay .preview__icon{position:absolute;left:6px;top:6px}\n"] }]
|
|
1207
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pr\u00E9-visualiza\u00E7\u00E3o e se\u00E7\u00E3o avan\u00E7ada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva \u2014 Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar pre\u00E7os altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n", styles: [".rulefx{background:linear-gradient(180deg,#171b24,#1e2431);border-radius:14px;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);box-shadow:0 6px 24px #00000047;padding:12px}.rulefx__header{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px;margin-bottom:8px}.rulefx__title{margin:0;font-size:1.05rem}.rulefx__subtitle{margin:0;opacity:.75;font-size:.9rem}.rulefx__actions{display:inline-flex;gap:8px;align-items:center}.rulefx__ribbon{display:flex;gap:6px;padding:8px;border-radius:10px;background:linear-gradient(180deg,#202636,#1c2230);margin-bottom:8px}.ribbon__tab{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:10px;background:transparent;color:#e7ecf6;cursor:pointer;border:none}.ribbon__tab.is-active{background:linear-gradient(180deg,#2a3550,#243149);box-shadow:inset 0 0 0 1px #ffffff0a}.rulefx__quickbar{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:10px;background:linear-gradient(180deg,#202637,#1c2230);margin-bottom:10px}.rulefx__body{display:grid;grid-template-columns:1fr 320px;gap:12px}.rulefx__preview{border:1px solid rgba(255,255,255,.08);border-radius:12px;padding:12px;background:linear-gradient(180deg,#202637,#1c2230)}.preview__title{font-weight:600;margin-bottom:8px}.preview__cell{display:inline-flex;align-items:center;gap:8px;padding:10px 12px;border-radius:12px;background:#35d07f14;border:1px solid rgba(53,208,127,.25)}.preview__icon{font-size:18px;line-height:1}.preview__badge{font-size:.75rem;border-radius:999px;padding:2px 8px;border:1px solid transparent}.preview__hint{opacity:.7;font-size:.85rem;margin:8px 0 0}.rulefx__advanced .advanced__grid{display:grid;grid-template-columns:1fr;gap:8px}.rulefx__advanced .textctl{display:grid;gap:6px}.rulefx__advanced input[type=text]{background:#151a24;color:#e7ecf6;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:8px 10px}.anim--once{animation-iteration-count:1}.anim--loop{animation-iteration-count:infinite}.anim--count{animation-iteration-count:3}.anim--subtle{--pfx-preview-scale-peak: 1.01;--pfx-preview-min-opacity: .7;--pfx-preview-slide-distance: 2px;--pfx-preview-border-strength: .18}.anim--normal{--pfx-preview-scale-peak: 1.03;--pfx-preview-min-opacity: .45;--pfx-preview-slide-distance: 6px;--pfx-preview-border-strength: .3}.anim--strong{--pfx-preview-scale-peak: 1.05;--pfx-preview-min-opacity: .25;--pfx-preview-slide-distance: 8px;--pfx-preview-border-strength: .42}.anim--pulse{animation-name:pfxPulse;animation-duration:.8s;animation-timing-function:ease-in-out}.anim--blink{animation-name:pfxBlink;animation-duration:.7s}.anim--grow{animation-name:pfxGrow;animation-duration:.4s}.anim--fade{animation-name:pfxFade;animation-duration:.6s}.anim--slide-in{animation-name:pfxSlideIn;animation-duration:.3s}.anim--border-pulse{animation-name:pfxBorderPulse;animation-duration:.9s}@keyframes pfxPulse{0%{transform:scale(1)}50%{transform:scale(var(--pfx-preview-scale-peak, 1.03))}to{transform:scale(1)}}@keyframes pfxBlink{0%,49%{opacity:1}50%,to{opacity:var(--pfx-preview-min-opacity, .25)}}@keyframes pfxGrow{0%{transform:scale(.96)}to{transform:scale(1)}}@keyframes pfxFade{0%{opacity:0}to{opacity:1}}@keyframes pfxSlideIn{0%{transform:translateY(var(--pfx-preview-slide-distance, 6px));opacity:0}to{transform:translateY(0);opacity:1}}@keyframes pfxBorderPulse{0%,to{box-shadow:inset 0 0 #d32f2f00}50%{box-shadow:inset 0 0 0 2px rgba(211,47,47,var(--pfx-preview-border-strength, .3))}}.icon--overlay{position:relative}.icon--overlay .preview__icon{position:absolute;left:6px;top:6px}@media(prefers-reduced-motion:reduce){.preview__cell{animation:none!important;transition:none!important}}\n"] }]
|
|
1192
1208
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: EffectRegistryService }], propDecorators: { scope: [{
|
|
1193
1209
|
type: Input
|
|
1194
1210
|
}], value: [{
|
|
@@ -1201,9 +1217,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
|
|
|
1201
1217
|
type: Output
|
|
1202
1218
|
}] } });
|
|
1203
1219
|
|
|
1204
|
-
function toCellClassAndStyle(effect) {
|
|
1220
|
+
function toCellClassAndStyle(effect, options) {
|
|
1205
1221
|
const classList = [];
|
|
1206
1222
|
const style = {};
|
|
1223
|
+
const includeAnimationPreview = options?.includeAnimationPreview !== false;
|
|
1207
1224
|
// Advanced class and inline style
|
|
1208
1225
|
if (effect.cssClass)
|
|
1209
1226
|
classList.push(effect.cssClass);
|
|
@@ -1268,7 +1285,7 @@ function toCellClassAndStyle(effect) {
|
|
|
1268
1285
|
classList.push('icon--overlay');
|
|
1269
1286
|
// Animation
|
|
1270
1287
|
const anim = resolveRuleAnimationConfig(effect.animation);
|
|
1271
|
-
if (anim) {
|
|
1288
|
+
if (anim && includeAnimationPreview) {
|
|
1272
1289
|
classList.push(`anim--${anim.type}`);
|
|
1273
1290
|
classList.push(`anim--${anim.intensity}`);
|
|
1274
1291
|
if (anim.repeat === 'loop' || anim.repeat === 'infinite') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-table-rule-builder.mjs","sources":["../../../projects/praxis-table-rule-builder/src/lib/effects/animation-presets.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/presets/default-presets.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/estilo-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/layout-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/icone-badge-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/fundo-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/animacao-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/tooltip-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/services/effect-registry.service.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/rule-effects-panel.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/rule-effects-panel.component.html","../../../projects/praxis-table-rule-builder/src/lib/effects/apply-effects.util.ts","../../../projects/praxis-table-rule-builder/src/praxisui-table-rule-builder.ts"],"sourcesContent":["import type {\n RuleAnimationIntensity,\n RuleAnimationRepeat,\n RuleAnimationTrigger,\n RuleAnimationType,\n RuleEffectDefinition,\n} from './models/rule-effects.model';\n\nexport type CanonicalRuleAnimationPreset =\n | 'info-soft'\n | 'success-confirm'\n | 'warning-attention'\n | 'critical-alert'\n | 'audit-review'\n | 'sync-pending';\n\nexport interface RuleAnimationPresetConfig {\n type: RuleAnimationType;\n trigger: RuleAnimationTrigger;\n repeat: RuleAnimationRepeat;\n durationMs: number;\n intensity: RuleAnimationIntensity;\n}\n\nexport interface ResolvedRuleAnimationConfig {\n enabled: boolean;\n type: RuleAnimationType;\n trigger: RuleAnimationTrigger;\n repeat: RuleAnimationRepeat;\n durationMs?: number;\n delayMs?: number;\n intensity: RuleAnimationIntensity;\n}\n\nconst RULE_ANIMATION_TYPE_SET = new Set<RuleAnimationType>([\n 'pulse',\n 'blink',\n 'grow',\n 'fade',\n 'slide-in',\n 'border-pulse',\n]);\n\nconst RULE_ANIMATION_INTENSITY_SET = new Set<RuleAnimationIntensity>([\n 'subtle',\n 'normal',\n 'strong',\n]);\n\nexport const RULE_ANIMATION_PRESETS: Record<\n CanonicalRuleAnimationPreset,\n RuleAnimationPresetConfig\n> = {\n 'info-soft': {\n type: 'fade',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 520,\n intensity: 'subtle',\n },\n 'success-confirm': {\n type: 'grow',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 420,\n intensity: 'normal',\n },\n 'warning-attention': {\n type: 'pulse',\n trigger: 'onAppear',\n repeat: 3,\n durationMs: 800,\n intensity: 'normal',\n },\n 'critical-alert': {\n type: 'border-pulse',\n trigger: 'onChange',\n repeat: 'loop',\n durationMs: 920,\n intensity: 'strong',\n },\n 'audit-review': {\n type: 'slide-in',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 560,\n intensity: 'normal',\n },\n 'sync-pending': {\n type: 'blink',\n trigger: 'onAppear',\n repeat: 'loop',\n durationMs: 900,\n intensity: 'subtle',\n },\n};\n\nexport const RULE_ANIMATION_PRESET_ALIASES: Record<\n string,\n CanonicalRuleAnimationPreset\n> = {\n 'sla-warning': 'warning-attention',\n 'sla-breach': 'critical-alert',\n 'risk-elevated': 'warning-attention',\n 'risk-critical': 'critical-alert',\n 'audit-warning': 'audit-review',\n 'sync-warning': 'sync-pending',\n};\n\nconst RULE_ANIMATION_PRESET_KEYS = new Set<string>(\n Object.keys(RULE_ANIMATION_PRESETS),\n);\n\nfunction hasMeaningfulAnimationOverride(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n return true;\n}\n\nfunction pickAnimationOverride<T>(override: T | undefined, fallback: T | undefined): T | undefined {\n return hasMeaningfulAnimationOverride(override) ? override : fallback;\n}\n\nfunction normalizeAnimationType(value: unknown): RuleAnimationType | null {\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase() as RuleAnimationType;\n return RULE_ANIMATION_TYPE_SET.has(normalized) ? normalized : null;\n}\n\nfunction normalizeAnimationTrigger(value: unknown): RuleAnimationTrigger {\n const normalized = String(value ?? '').trim().toLowerCase();\n if (normalized === 'onchange' || normalized === 'change') return 'onChange';\n if (normalized === 'onhover' || normalized === 'hover') return 'onHover';\n if (normalized === 'onconditionenter') return 'onConditionEnter';\n if (normalized === 'onconditionexit') return 'onConditionExit';\n if (normalized === 'ondatarefresh') return 'onDataRefresh';\n return 'onAppear';\n}\n\nfunction normalizeAnimationRepeat(value: unknown): RuleAnimationRepeat {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.max(1, Math.round(value));\n }\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase();\n if (normalized === 'loop') return 'loop';\n if (normalized === 'infinite') return 'infinite';\n if (/^\\d+$/.test(normalized)) {\n return Math.max(1, Number.parseInt(normalized, 10));\n }\n return 'once';\n}\n\nfunction normalizeAnimationIntensity(value: unknown): RuleAnimationIntensity {\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase() as RuleAnimationIntensity;\n return RULE_ANIMATION_INTENSITY_SET.has(normalized) ? normalized : 'normal';\n}\n\nfunction toNonNegativeMs(value: unknown): number | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string' && !value.trim()) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : undefined;\n}\n\nexport function resolveRuleAnimationPresetKey(\n rawPreset: unknown,\n): CanonicalRuleAnimationPreset | null {\n const normalized = String(rawPreset ?? '').trim().toLowerCase();\n if (!normalized) return null;\n if (RULE_ANIMATION_PRESET_KEYS.has(normalized)) {\n return normalized as CanonicalRuleAnimationPreset;\n }\n return RULE_ANIMATION_PRESET_ALIASES[normalized] || null;\n}\n\nexport function resolveRuleAnimationPreset(\n rawPreset: unknown,\n): RuleAnimationPresetConfig | null {\n const key = resolveRuleAnimationPresetKey(rawPreset);\n return key ? RULE_ANIMATION_PRESETS[key] : null;\n}\n\nexport function resolveRuleAnimationConfig(\n animation: RuleEffectDefinition['animation'] | undefined,\n): ResolvedRuleAnimationConfig | null {\n const enabled = animation?.enabled !== false;\n if (!enabled) return null;\n const preset = resolveRuleAnimationPreset(animation?.preset);\n const type = normalizeAnimationType(\n pickAnimationOverride(animation?.type, preset?.type),\n );\n if (!type) return null;\n return {\n enabled: true,\n type,\n trigger: normalizeAnimationTrigger(\n pickAnimationOverride(animation?.trigger, preset?.trigger),\n ),\n repeat: normalizeAnimationRepeat(\n pickAnimationOverride(animation?.repeat, preset?.repeat),\n ),\n durationMs: toNonNegativeMs(\n pickAnimationOverride(animation?.durationMs, preset?.durationMs),\n ),\n delayMs: toNonNegativeMs(animation?.delayMs),\n intensity: normalizeAnimationIntensity(\n pickAnimationOverride(animation?.intensity, preset?.intensity),\n ),\n };\n}\n","import { RuleEffectDefinition } from '../models/rule-effects.model';\n\nexport const DEFAULT_EFFECT_PRESETS: Record<string, RuleEffectDefinition> = {\n aprovado: {\n scope: 'row',\n estilo: { color: '#eafff5', bold: true },\n iconBadge: {\n icon: 'check_circle',\n iconColor: '#35D07F',\n iconPos: 'before',\n badgeText: 'Aprovado',\n badgeStyle: 'soft',\n badgeColor: '#2a8455',\n },\n background: { color: 'rgba(53,208,127,0.08)' },\n layout: { border: 'left', borderColor: '#35D07F', borderWidth: 3 },\n animation: { preset: 'success-confirm' },\n },\n alerta: {\n scope: 'row',\n estilo: { color: '#fff8e1', bold: true },\n iconBadge: {\n icon: 'warning',\n iconColor: '#FFC107',\n iconPos: 'before',\n badgeText: 'Atenção',\n badgeStyle: 'outline',\n badgeColor: '#FFC107',\n },\n background: { color: 'rgba(255,193,7,0.12)' },\n animation: { preset: 'warning-attention' },\n },\n erro: {\n scope: 'row',\n estilo: { color: '#ffeaea', bold: true },\n iconBadge: {\n icon: 'error',\n iconColor: '#EF5350',\n iconPos: 'before',\n badgeText: 'Erro',\n badgeStyle: 'solid',\n badgeColor: '#EF5350',\n },\n background: { color: 'rgba(239,83,80,0.10)' },\n animation: { preset: 'critical-alert' },\n },\n info: {\n scope: 'row',\n iconBadge: { icon: 'info', iconColor: '#64B5F6', iconPos: 'before' },\n background: { color: 'rgba(100,181,246,0.10)' },\n animation: { preset: 'info-soft' },\n },\n};\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSliderModule } from '@angular/material/slider';\n\n@Component({\n selector: 'praxis-effects-estilo-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonToggleModule,\n MatIconModule,\n MatSliderModule,\n ],\n template: `\n <div class=\"estilo-grid\" role=\"group\" aria-label=\"Editor de estilo\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do texto</mat-label>\n <input matInput type=\"text\" formControlName=\"color\" placeholder=\"#E7ECF6\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor de fundo do texto</mat-label>\n <input matInput type=\"text\" formControlName=\"bgColor\" placeholder=\"#122033\" />\n </mat-form-field>\n\n <div class=\"toggles\">\n <mat-button-toggle-group multiple>\n <mat-button-toggle [checked]=\"group.get('bold')?.value\" (change)=\"group.get('bold')?.setValue($event.source.checked)\" aria-label=\"Negrito\">\n <mat-icon>format_bold</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle [checked]=\"group.get('italic')?.value\" (change)=\"group.get('italic')?.setValue($event.source.checked)\" aria-label=\"Itálico\">\n <mat-icon>format_italic</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle [checked]=\"group.get('underline')?.value\" (change)=\"group.get('underline')?.setValue($event.source.checked)\" aria-label=\"Sublinhado\">\n <mat-icon>format_underlined</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Transformação</mat-label>\n <select matNativeControl formControlName=\"transform\" aria-label=\"Transformação do texto\">\n <option [ngValue]=\"null\">Nenhuma</option>\n <option value=\"uppercase\">MAIÚSCULAS</option>\n <option value=\"lowercase\">minúsculas</option>\n <option value=\"capitalize\">Capitalizar</option>\n </select>\n </mat-form-field>\n\n <div class=\"sliders\">\n <label class=\"slider\">\n <span>Opacidade</span>\n <mat-slider min=\"0\" max=\"1\" step=\"0.05\" [displayWith]=\"formatOpacity\">\n <input matSliderThumb formControlName=\"opacity\" />\n </mat-slider>\n </label>\n <label class=\"slider\">\n <span>Tamanho</span>\n <mat-slider min=\"-2\" max=\"2\" step=\"1\">\n <input matSliderThumb formControlName=\"fontScale\" />\n </mat-slider>\n </label>\n </div>\n </div>\n `,\n styles: [\n `\n .estilo-grid { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 12px; align-items: start; }\n .toggles { display:flex; align-items:center; gap: 8px; }\n .sliders { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; }\n .slider { display:flex; flex-direction: column; gap: 6px; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EstiloEditorComponent {\n @Input() group!: FormGroup;\n // Public for template (strictTemplates): used by mat-slider\n formatOpacity(v: number | null): string { return (v ?? 0).toFixed(2); }\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-effects-layout-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonToggleModule, MatIconModule],\n template: `\n <div class=\"layout-grid\" role=\"group\" aria-label=\"Editor de layout\" [formGroup]=\"group\">\n <div class=\"borders\">\n <span class=\"lbl\">Borda</span>\n <mat-button-toggle-group [value]=\"group.get('border')?.value\" (change)=\"group.get('border')?.setValue($event.value)\" aria-label=\"Borda\">\n <mat-button-toggle value=\"none\"><mat-icon>crop_free</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"left\"><mat-icon>border_left</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"right\"><mat-icon>border_right</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"top\"><mat-icon>border_top</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"bottom\"><mat-icon>border_bottom</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"all\"><mat-icon>border_all</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor da borda</mat-label>\n <input matInput type=\"text\" formControlName=\"borderColor\" placeholder=\"#487BFF\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Espessura</mat-label>\n <input matInput type=\"number\" formControlName=\"borderWidth\" placeholder=\"2\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Padding</mat-label>\n <input matInput type=\"number\" formControlName=\"padding\" placeholder=\"6\" />\n </mat-form-field>\n\n <div class=\"align\">\n <span class=\"lbl\">Alinhamento</span>\n <mat-button-toggle-group [value]=\"group.get('align')?.value\" (change)=\"group.get('align')?.setValue($event.value)\" aria-label=\"Alinhamento\">\n <mat-button-toggle value=\"start\"><mat-icon>format_align_left</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"center\"><mat-icon>format_align_center</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"end\"><mat-icon>format_align_right</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Elevação (sombra)</mat-label>\n <input matInput type=\"number\" formControlName=\"elevation\" placeholder=\"6\" />\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .layout-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .borders, .align { display:flex; align-items:center; gap:8px; }\n .lbl { font-size:.85rem; opacity:.8; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-effects-icone-badge-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonToggleModule, MatIconModule],\n template: `\n <div class=\"icone-grid\" role=\"group\" aria-label=\"Editor de ícone e badge\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone (mat-icon)</mat-label>\n <input matInput type=\"text\" formControlName=\"icon\" placeholder=\"check_circle\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do ícone</mat-label>\n <input matInput type=\"text\" formControlName=\"iconColor\" placeholder=\"#35D07F\" />\n </mat-form-field>\n\n <div class=\"pos\">\n <span class=\"lbl\">Posição do ícone</span>\n <mat-button-toggle-group [value]=\"group.get('iconPos')?.value\" (change)=\"group.get('iconPos')?.setValue($event.value)\" aria-label=\"Posição do ícone\">\n <mat-button-toggle value=\"before\">Antes</mat-button-toggle>\n <mat-button-toggle value=\"after\">Depois</mat-button-toggle>\n <mat-button-toggle value=\"overlay\">Sobreposto</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto do badge</mat-label>\n <input matInput type=\"text\" formControlName=\"badgeText\" placeholder=\"Aprovado\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do badge</mat-label>\n <input matInput type=\"text\" formControlName=\"badgeColor\" placeholder=\"#2a8455\" />\n </mat-form-field>\n\n <div class=\"variant\">\n <span class=\"lbl\">Estilo</span>\n <mat-button-toggle-group [value]=\"group.get('badgeStyle')?.value\" (change)=\"group.get('badgeStyle')?.setValue($event.value)\" aria-label=\"Estilo do badge\">\n <mat-button-toggle value=\"solid\">Sólido</mat-button-toggle>\n <mat-button-toggle value=\"soft\">Suave</mat-button-toggle>\n <mat-button-toggle value=\"outline\">Contorno</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n `,\n styles: [\n `\n .icone-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .pos, .variant { display:flex; align-items:center; gap:8px; }\n .lbl { font-size:.85rem; opacity:.8; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconeBadgeEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSliderModule } from '@angular/material/slider';\n\n@Component({\n selector: 'praxis-effects-fundo-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatSliderModule],\n template: `\n <div class=\"fundo-grid\" role=\"group\" aria-label=\"Editor de fundo\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <input matInput type=\"text\" formControlName=\"color\" placeholder=\"#122033\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full\">\n <mat-label>Gradient CSS</mat-label>\n <input matInput type=\"text\" formControlName=\"gradient\" placeholder=\"linear-gradient(180deg, #202637, #1c2230)\" />\n </mat-form-field>\n\n <label class=\"slider\">\n <span>Transparência</span>\n <mat-slider min=\"0\" max=\"100\" step=\"5\">\n <input matSliderThumb formControlName=\"alpha\" />\n </mat-slider>\n </label>\n <label class=\"slider\">\n <span>Desfoque (px)</span>\n <mat-slider min=\"0\" max=\"20\" step=\"1\">\n <input matSliderThumb formControlName=\"blur\" />\n </mat-slider>\n </label>\n </div>\n `,\n styles: [\n `\n .fundo-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .full { grid-column: 1 / -1; }\n .slider { display:flex; flex-direction: column; gap: 6px; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FundoEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'praxis-effects-animacao-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\n template: `\n <div class=\"anim-grid\" role=\"group\" aria-label=\"Editor de animação\" [formGroup]=\"group\">\n <label class=\"anim-toggle\">\n <input type=\"checkbox\" formControlName=\"enabled\" />\n <span>Ativar animação</span>\n </label>\n <mat-form-field appearance=\"outline\">\n <mat-label>Preset</mat-label>\n <select matNativeControl formControlName=\"preset\" aria-label=\"Preset de animação\">\n <option value=\"\">Sem preset</option>\n <option value=\"info-soft\">Info Soft</option>\n <option value=\"success-confirm\">Success Confirm</option>\n <option value=\"warning-attention\">Warning Attention</option>\n <option value=\"critical-alert\">Critical Alert</option>\n <option value=\"audit-review\">Audit Review</option>\n <option value=\"sync-pending\">Sync Pending</option>\n <option value=\"sla-warning\">SLA Warning (alias)</option>\n <option value=\"sla-breach\">SLA Breach (alias)</option>\n <option value=\"risk-elevated\">Risk Elevated (alias)</option>\n <option value=\"risk-critical\">Risk Critical (alias)</option>\n <option value=\"audit-warning\">Audit Warning (alias)</option>\n <option value=\"sync-warning\">Sync Warning (alias)</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <select matNativeControl formControlName=\"type\" aria-label=\"Tipo de animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"pulse\">Pulse</option>\n <option value=\"blink\">Blink</option>\n <option value=\"grow\">Grow</option>\n <option value=\"fade\">Fade</option>\n <option value=\"slide-in\">Slide In</option>\n <option value=\"border-pulse\">Border Pulse</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Duração (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"durationMs\" placeholder=\"Preset/default\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"delayMs\" placeholder=\"Opcional\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Disparo</mat-label>\n <select matNativeControl formControlName=\"trigger\" aria-label=\"Disparo da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"onChange\">Ao mudar</option>\n <option value=\"onAppear\">Ao aparecer</option>\n <option value=\"onHover\">Ao passar o mouse</option>\n <option value=\"onConditionEnter\">Ao entrar na condição</option>\n <option value=\"onConditionExit\">Ao sair da condição</option>\n <option value=\"onDataRefresh\">Ao atualizar dados</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Repetição</mat-label>\n <select matNativeControl formControlName=\"repeat\" aria-label=\"Repetição da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"once\">Uma vez</option>\n <option value=\"loop\">Loop</option>\n <option value=\"infinite\">Infinito</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Intensidade</mat-label>\n <select matNativeControl formControlName=\"intensity\" aria-label=\"Intensidade da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"subtle\">Sutil</option>\n <option value=\"normal\">Normal</option>\n <option value=\"strong\">Forte</option>\n </select>\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .anim-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .anim-toggle {\n grid-column: 1 / -1;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: inherit;\n font-size: 0.9rem;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AnimacaoEditorComponent { @Input() group!: FormGroup; }\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'praxis-effects-tooltip-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\n template: `\n <div class=\"tooltip-grid\" role=\"group\" aria-label=\"Editor de tooltip\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\" class=\"full\">\n <mat-label>Texto</mat-label>\n <input matInput type=\"text\" formControlName=\"text\" placeholder=\"Detalhes da célula\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição</mat-label>\n <select matNativeControl formControlName=\"position\" aria-label=\"Posição do tooltip\">\n <option value=\"top\">Topo</option>\n <option value=\"right\">Direita</option>\n <option value=\"bottom\">Baixo</option>\n <option value=\"left\">Esquerda</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do fundo</mat-label>\n <input matInput type=\"text\" formControlName=\"bgColor\" placeholder=\"#2E3142\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"delayMs\" placeholder=\"300\" />\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .tooltip-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .full { grid-column: 1 / -1; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TooltipEditorComponent { @Input() group!: FormGroup; }\n","import { Injectable } from '@angular/core';\n\nexport interface EffectEditorPlugin {\n id: 'estilo' | 'layout' | 'icone' | 'fundo' | 'animacao' | 'tooltip';\n label: string;\n icon: string;\n order: number;\n loadComponent?: () => Promise<any>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EffectRegistryService {\n private plugins: EffectEditorPlugin[] = [];\n\n register(plugin: EffectEditorPlugin) {\n if (this.plugins.find((p) => p.id === plugin.id)) return; // avoid duplicates\n this.plugins.push(plugin);\n this.plugins.sort((a, b) => a.order - b.order);\n }\n\n list(): EffectEditorPlugin[] {\n return this.plugins.slice();\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { auditTime, takeUntil } from 'rxjs/operators';\n\nimport { RuleEffectDefinition, RuleScope } from './models/rule-effects.model';\nimport { resolveRuleAnimationConfig } from './animation-presets';\nimport { DEFAULT_EFFECT_PRESETS } from './presets/default-presets';\nimport { EffectRegistryService } from './services/effect-registry.service';\n\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\n\nimport { EstiloEditorComponent } from './editors/estilo-editor.component';\nimport { LayoutEditorComponent } from './editors/layout-editor.component';\nimport { IconeBadgeEditorComponent } from './editors/icone-badge-editor.component';\nimport { FundoEditorComponent } from './editors/fundo-editor.component';\nimport { AnimacaoEditorComponent } from './editors/animacao-editor.component';\nimport { TooltipEditorComponent } from './editors/tooltip-editor.component';\n\n@Component({\n selector: 'praxis-rule-effects-panel',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatMenuModule,\n MatButtonToggleModule,\n EstiloEditorComponent,\n LayoutEditorComponent,\n IconeBadgeEditorComponent,\n FundoEditorComponent,\n AnimacaoEditorComponent,\n TooltipEditorComponent,\n ],\n templateUrl: './rule-effects-panel.component.html',\n styleUrls: ['./rule-effects-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RuleEffectsPanelComponent implements OnInit, OnDestroy {\n private static readonly DEFAULT_ANIMATION_FORM_VALUE = {\n enabled: true,\n preset: '',\n type: '',\n durationMs: null,\n trigger: '',\n repeat: '',\n delayMs: null,\n intensity: '',\n } as const;\n\n // i18n-friendly labels map\n labels: Record<string, string> = {\n 'panel.title': 'C. Efeitos',\n 'panel.subtitle': 'Configure estilos e elementos visuais quando a regra for verdadeira',\n 'tabs.estilo': 'Estilo',\n 'tabs.layout': 'Layout',\n 'tabs.icone': 'Ícone / Badge',\n 'tabs.fundo': 'Fundo',\n 'tabs.animacao': 'Animação',\n 'tabs.tooltip': 'Tooltip',\n 'preview.title': 'Pré-visualização',\n 'preview.hint': 'As mudanças acima refletem o estilo aplicado quando a condição é verdadeira.',\n 'advanced.title': 'Avançado',\n 'advanced.description': 'Descrição',\n 'actions.apply': 'Aplicar',\n 'actions.reset': 'Redefinir',\n 'presets.label': 'Presets',\n };\n t(key: string): string { return this.labels[key] ?? key; }\n\n @Input() scope: RuleScope = 'row';\n private _value?: RuleEffectDefinition;\n @Input() set value(v: RuleEffectDefinition | undefined) {\n this._value = v;\n if (v && this.effectsForm) this.patchForm(v);\n }\n get value() { return this._value; }\n\n @Output() valueChange = new EventEmitter<RuleEffectDefinition>();\n @Output() apply = new EventEmitter<void>();\n @Output() reset = new EventEmitter<void>();\n\n activeTab: 'estilo' | 'layout' | 'icone' | 'fundo' | 'animacao' | 'tooltip' = 'estilo';\n effectsForm!: FormGroup;\n destroy$ = new Subject<void>();\n\n isHovering = false;\n\n readonly tabOrder: Array<typeof this.activeTab> = ['estilo', 'layout', 'icone', 'fundo', 'animacao', 'tooltip'];\n\n constructor(private fb: FormBuilder, private registry: EffectRegistryService) {}\n\n ngOnInit() {\n // Register built-in editors for the registry (extensible)\n this.registry.register({ id: 'estilo', icon: 'text_format', label: this.t('tabs.estilo'), order: 1 });\n this.registry.register({ id: 'layout', icon: 'view_quilt', label: this.t('tabs.layout'), order: 2 });\n this.registry.register({ id: 'icone', icon: 'verified', label: this.t('tabs.icone'), order: 3 });\n this.registry.register({ id: 'fundo', icon: 'gradient', label: this.t('tabs.fundo'), order: 4 });\n this.registry.register({ id: 'animacao', icon: 'animation', label: this.t('tabs.animacao'), order: 5 });\n this.registry.register({ id: 'tooltip', icon: 'info', label: this.t('tabs.tooltip'), order: 6 });\n\n this.effectsForm = this.fb.group({\n description: [''],\n estilo: this.fb.group({\n color: ['#ffffff'],\n bgColor: [''],\n bold: [false],\n italic: [false],\n underline: [false],\n transform: [null],\n opacity: [1],\n fontScale: [0],\n }),\n layout: this.fb.group({\n border: ['none'],\n borderColor: ['#487BFF'],\n borderWidth: [2],\n padding: [6],\n align: ['start'],\n elevation: [6],\n }),\n iconBadge: this.fb.group({\n icon: ['check_circle'],\n iconColor: ['#35D07F'],\n iconPos: ['before'],\n badgeText: [''],\n badgeStyle: ['soft'],\n badgeColor: ['#2a8455'],\n }),\n background: this.fb.group({\n color: ['#122033'],\n gradient: [''],\n alpha: [0],\n blur: [0],\n }),\n animation: this.fb.group({\n enabled: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.enabled],\n preset: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.preset],\n type: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.type],\n durationMs: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.durationMs],\n trigger: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.trigger],\n repeat: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.repeat],\n delayMs: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.delayMs],\n intensity: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.intensity],\n }),\n tooltip: this.fb.group({\n text: [''],\n position: ['bottom'],\n bgColor: ['#2E3142'],\n delayMs: [300],\n }),\n cssClass: [''],\n inlineStyle: [''],\n });\n\n this.effectsForm.valueChanges\n .pipe(auditTime(200), takeUntil(this.destroy$))\n .subscribe((formValue) => {\n this.valueChange.emit(this.toEffectDefinitionForEmit(formValue as any));\n });\n\n if (this._value) this.patchForm(this._value);\n }\n\n patchForm(v: RuleEffectDefinition) {\n const animationGroup = this.effectsForm.get('animation') as FormGroup | null;\n if (animationGroup) {\n animationGroup.reset(\n RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE,\n { emitEvent: false },\n );\n }\n this.effectsForm.patchValue(v as any, { emitEvent: false });\n }\n\n setTab(tab: typeof this.activeTab) {\n this.activeTab = tab;\n }\n\n applyPreset(key: string) {\n const preset = DEFAULT_EFFECT_PRESETS[key];\n if (!preset) return;\n const merged: RuleEffectDefinition = { ...preset, scope: this.scope } as RuleEffectDefinition;\n this.patchForm(merged);\n this.valueChange.emit(this.toEffectDefinitionForEmit(this.effectsForm.value as any));\n }\n\n onApply() {\n this.apply.emit();\n }\n\n onReset() {\n this.effectsForm.reset();\n this.reset.emit();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Typed subgroup getters for strict template type checking\n get estiloGroup(): FormGroup { return this.effectsForm.get('estilo') as FormGroup; }\n get layoutGroup(): FormGroup { return this.effectsForm.get('layout') as FormGroup; }\n get iconBadgeGroup(): FormGroup { return this.effectsForm.get('iconBadge') as FormGroup; }\n get backgroundGroup(): FormGroup { return this.effectsForm.get('background') as FormGroup; }\n get animationGroup(): FormGroup { return this.effectsForm.get('animation') as FormGroup; }\n get tooltipGroup(): FormGroup { return this.effectsForm.get('tooltip') as FormGroup; }\n\n // Safe access for template — avoids TS casts in templates\n get formValue(): RuleEffectDefinition {\n const v = (this.effectsForm?.value || {}) as any;\n return { scope: this.scope, ...v } as RuleEffectDefinition;\n }\n\n // A11y: keyboard navigation for tabs\n onTabsKeydown(event: KeyboardEvent) {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n event.preventDefault();\n const idx = this.tabOrder.indexOf(this.activeTab);\n const next = event.key === 'ArrowRight' ? (idx + 1) % this.tabOrder.length : (idx - 1 + this.tabOrder.length) % this.tabOrder.length;\n this.activeTab = this.tabOrder[next];\n }\n\n onHoverPreview(over: boolean) {\n this.isHovering = over;\n }\n\n // Preview helpers\n public computeTextStyle(v: RuleEffectDefinition): any {\n const s = v?.estilo || {};\n const size = s.fontScale ? `calc(1rem + ${s.fontScale * 0.1}rem)` : '1rem';\n const transform = s.transform ?? 'none';\n return {\n color: s.color || null,\n fontWeight: s.bold ? 600 : 400,\n fontStyle: s.italic ? 'italic' : 'normal',\n textDecoration: s.underline ? 'underline' : 'none',\n opacity: s.opacity ?? 1,\n fontSize: size,\n textTransform:\n transform === 'uppercase'\n ? 'uppercase'\n : transform === 'lowercase'\n ? 'lowercase'\n : transform === 'capitalize'\n ? 'capitalize'\n : 'none',\n } as any;\n }\n\n public computeCellStyle(v: RuleEffectDefinition): any {\n const b = v?.background || {};\n const ly = v?.layout || {};\n const bg = b.gradient ? b.gradient : (b.color || 'transparent');\n const alpha = (b.alpha ?? 0) / 100;\n const bgWithAlpha = b.color ? `color-mix(in srgb, ${b.color} ${100 - alpha * 100}%, transparent)` : bg;\n\n const borderColor = ly.borderColor || 'transparent';\n const borderWidth = (ly.borderWidth ?? 0) + 'px';\n const borderStyle = ly.border === 'none' ? 'none' : `${borderWidth} solid ${borderColor}`;\n\n const base: any = {\n background: bgWithAlpha,\n filter: b.blur ? `blur(${b.blur}px)` : 'none',\n padding: (ly.padding ?? 6) + 'px',\n boxShadow: ly.elevation ? `0 ${Math.min(ly.elevation, 24)}px ${Math.min(ly.elevation, 24)}px rgba(0,0,0,.25)` : 'none',\n justifyContent: ly.align === 'center' ? 'center' : ly.align === 'end' ? 'flex-end' : 'flex-start',\n };\n\n if (ly.border === 'all') base.border = borderStyle;\n if (ly.border === 'left') base.borderLeft = borderStyle;\n if (ly.border === 'right') base.borderRight = borderStyle;\n if (ly.border === 'top') base.borderTop = borderStyle;\n if (ly.border === 'bottom') base.borderBottom = borderStyle;\n\n return base;\n }\n\n public computeCellClass(v: RuleEffectDefinition): any {\n const anim = this.resolvePreviewAnimation(v);\n const triggerHover = anim.trigger === 'onHover';\n const triggerAppear = anim.trigger === 'onAppear';\n const triggerChange =\n anim.trigger === 'onChange'\n || anim.trigger === 'onConditionEnter'\n || anim.trigger === 'onConditionExit'\n || anim.trigger === 'onDataRefresh';\n const repeatClass =\n anim.repeat === 'loop' || anim.repeat === 'infinite'\n ? 'anim--loop'\n : typeof anim.repeat === 'number' && Number.isFinite(anim.repeat) && anim.repeat > 1\n ? 'anim--count'\n : 'anim--once';\n const active =\n (triggerHover && this.isHovering) ||\n triggerAppear ||\n triggerChange; // we don’t track changes here, preview is always ‘changed’\n return {\n [`anim--${anim.type}`]: !!anim.type && !!anim.enabled && active,\n [`anim--${anim.intensity}`]: !!anim.type && !!anim.enabled && active,\n [repeatClass]: !!anim.type && !!anim.enabled && active,\n 'icon--overlay': v?.iconBadge?.icon && v?.iconBadge?.iconPos === 'overlay',\n };\n }\n\n private resolvePreviewAnimation(v: RuleEffectDefinition): {\n enabled: boolean;\n type: string;\n trigger: string;\n repeat: string | number;\n intensity: string;\n } {\n const resolved = resolveRuleAnimationConfig(v?.animation);\n if (resolved) {\n return resolved;\n }\n return {\n enabled: false,\n type: '',\n trigger: 'onAppear',\n repeat: 'once',\n intensity: 'normal',\n };\n }\n\n public badgeBackground(v: RuleEffectDefinition): string | null {\n const s = v?.iconBadge;\n if (!s?.badgeText) return null;\n if (s.badgeStyle === 'solid') return s.badgeColor || '#444';\n if (s.badgeStyle === 'soft') return `linear-gradient(180deg, ${s.badgeColor || '#444'}, #00000055)`;\n if (s.badgeStyle === 'outline') return 'transparent';\n return null;\n }\n\n public badgeBorder(v: RuleEffectDefinition): string | null {\n const s = v?.iconBadge;\n return s?.badgeStyle === 'outline' ? s.badgeColor || '#777' : '#0000';\n }\n\n private toEffectDefinitionForEmit(formValue: any): RuleEffectDefinition {\n const value: RuleEffectDefinition = { scope: this.scope, ...(formValue || {}) } as RuleEffectDefinition;\n const normalizedAnimation = this.normalizeAnimationForEmit((formValue || {}).animation);\n if (normalizedAnimation) {\n value.animation = normalizedAnimation;\n } else {\n delete (value as any).animation;\n }\n return value;\n }\n\n private normalizeAnimationForEmit(\n animation: RuleEffectDefinition['animation'] | undefined,\n ): RuleEffectDefinition['animation'] | undefined {\n if (!animation) return undefined;\n const normalized: NonNullable<RuleEffectDefinition['animation']> = {};\n if (animation.enabled === false) {\n normalized.enabled = false;\n }\n\n const preset = String(animation.preset ?? '').trim();\n if (preset) normalized.preset = preset as any;\n\n const type = String(animation.type ?? '').trim();\n if (type) normalized.type = type as any;\n\n const trigger = String(animation.trigger ?? '').trim();\n if (trigger) normalized.trigger = trigger as any;\n\n const repeat = animation.repeat;\n if (\n repeat !== undefined\n && repeat !== null\n && (typeof repeat !== 'string' || repeat.trim() !== '')\n ) {\n normalized.repeat = repeat;\n }\n\n const durationMs = this.toNonNegativeMs(animation.durationMs);\n if (durationMs !== undefined) normalized.durationMs = durationMs;\n\n const delayMs = this.toNonNegativeMs(animation.delayMs);\n if (delayMs !== undefined) normalized.delayMs = delayMs;\n\n const intensity = String(animation.intensity ?? '').trim();\n if (intensity) normalized.intensity = intensity as any;\n\n return Object.keys(normalized).length ? normalized : undefined;\n }\n\n private toNonNegativeMs(value: unknown): number | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string' && !value.trim()) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : undefined;\n }\n}\n","<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pré-visualização e seção avançada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva — Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar preços altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n","import { RuleEffectDefinition } from './models/rule-effects.model';\nimport { resolveRuleAnimationConfig } from './animation-presets';\n\nexport function toCellClassAndStyle(effect: RuleEffectDefinition): {\n classList: string[];\n style: Record<string, string>;\n} {\n const classList: string[] = [];\n const style: Record<string, string> = {};\n\n // Advanced class and inline style\n if (effect.cssClass) classList.push(effect.cssClass);\n if (effect.inlineStyle) style['cssText'] = effect.inlineStyle;\n\n // Background\n const b = effect.background || {};\n const ly = effect.layout || {};\n const bg = b.gradient ? b.gradient : (b.color || 'transparent');\n const alpha = (b.alpha ?? 0) / 100;\n const bgWithAlpha = b.color ? `color-mix(in srgb, ${b.color} ${100 - alpha * 100}%, transparent)` : bg;\n style['background'] = bgWithAlpha;\n if (b.blur) style['filter'] = `blur(${b.blur}px)`;\n\n // Layout\n if (ly.padding != null) style['padding'] = `${ly.padding}px`;\n if (ly.elevation) style['box-shadow'] = `0 ${Math.min(ly.elevation, 24)}px ${Math.min(ly.elevation, 24)}px rgba(0,0,0,.25)`;\n if (ly.align) style['justify-content'] = ly.align === 'center' ? 'center' : ly.align === 'end' ? 'flex-end' : 'flex-start';\n const borderColor = ly.borderColor || 'transparent';\n const borderWidth = (ly.borderWidth ?? 0) + 'px';\n const borderStyle = ly.border === 'none' ? 'none' : `${borderWidth} solid ${borderColor}`;\n switch (ly.border) {\n case 'all': style['border'] = borderStyle; break;\n case 'left': style['border-left'] = borderStyle; break;\n case 'right': style['border-right'] = borderStyle; break;\n case 'top': style['border-top'] = borderStyle; break;\n case 'bottom': style['border-bottom'] = borderStyle; break;\n }\n\n // Text (estilo)\n const s = effect.estilo || {};\n if (s.color) style['color'] = s.color;\n if (s.bgColor) style['background-color'] = s.bgColor;\n if (s.bold) style['font-weight'] = '600';\n if (s.italic) style['font-style'] = 'italic';\n if (s.underline) style['text-decoration'] = 'underline';\n if (s.opacity != null) style['opacity'] = String(s.opacity);\n if (s.transform) style['text-transform'] = s.transform;\n if (s.fontScale && s.fontScale !== 0) style['font-size'] = `calc(1rem + ${s.fontScale * 0.1}rem)`;\n\n // Icon overlay class\n if (effect.iconBadge?.iconPos === 'overlay') classList.push('icon--overlay');\n\n // Animation\n const anim = resolveRuleAnimationConfig(effect.animation);\n if (anim) {\n classList.push(`anim--${anim.type}`);\n classList.push(`anim--${anim.intensity}`);\n if (anim.repeat === 'loop' || anim.repeat === 'infinite') {\n classList.push('anim--loop');\n } else if (typeof anim.repeat === 'number' && Number.isFinite(anim.repeat) && anim.repeat > 1) {\n classList.push('anim--count');\n style['animation-iteration-count'] = String(Math.round(anim.repeat));\n } else {\n classList.push('anim--once');\n }\n if (anim.durationMs) style['animation-duration'] = `${anim.durationMs}ms`;\n if (anim.delayMs) style['animation-delay'] = `${anim.delayMs}ms`;\n }\n\n return { classList, style };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i2.EffectRegistryService","i3","i6"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"praxisui-table-rule-builder.mjs","sources":["../../../projects/praxis-table-rule-builder/src/lib/effects/animation-presets.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/presets/default-presets.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/estilo-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/layout-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/icone-badge-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/fundo-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/animacao-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/editors/tooltip-editor.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/services/effect-registry.service.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/rule-effects-panel.component.ts","../../../projects/praxis-table-rule-builder/src/lib/effects/rule-effects-panel.component.html","../../../projects/praxis-table-rule-builder/src/lib/effects/apply-effects.util.ts","../../../projects/praxis-table-rule-builder/src/praxisui-table-rule-builder.ts"],"sourcesContent":["import type {\n RuleAnimationIntensity,\n RuleAnimationRepeat,\n RuleAnimationTrigger,\n RuleAnimationType,\n RuleEffectDefinition,\n} from './models/rule-effects.model';\n\nexport type CanonicalRuleAnimationPreset =\n | 'info-soft'\n | 'success-confirm'\n | 'warning-attention'\n | 'critical-alert'\n | 'audit-review'\n | 'sync-pending';\n\nexport interface RuleAnimationPresetConfig {\n type: RuleAnimationType;\n trigger: RuleAnimationTrigger;\n repeat: RuleAnimationRepeat;\n durationMs: number;\n intensity: RuleAnimationIntensity;\n}\n\nexport interface ResolvedRuleAnimationConfig {\n enabled: boolean;\n type: RuleAnimationType;\n trigger: RuleAnimationTrigger;\n repeat: RuleAnimationRepeat;\n durationMs?: number;\n delayMs?: number;\n intensity: RuleAnimationIntensity;\n}\n\nconst RULE_ANIMATION_TYPE_SET = new Set<RuleAnimationType>([\n 'pulse',\n 'blink',\n 'grow',\n 'fade',\n 'slide-in',\n 'border-pulse',\n]);\n\nconst RULE_ANIMATION_INTENSITY_SET = new Set<RuleAnimationIntensity>([\n 'subtle',\n 'normal',\n 'strong',\n]);\n\nexport const RULE_ANIMATION_PRESETS: Record<\n CanonicalRuleAnimationPreset,\n RuleAnimationPresetConfig\n> = {\n 'info-soft': {\n type: 'fade',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 520,\n intensity: 'subtle',\n },\n 'success-confirm': {\n type: 'grow',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 420,\n intensity: 'normal',\n },\n 'warning-attention': {\n type: 'pulse',\n trigger: 'onAppear',\n repeat: 3,\n durationMs: 800,\n intensity: 'normal',\n },\n 'critical-alert': {\n type: 'border-pulse',\n trigger: 'onChange',\n repeat: 'loop',\n durationMs: 920,\n intensity: 'strong',\n },\n 'audit-review': {\n type: 'slide-in',\n trigger: 'onAppear',\n repeat: 'once',\n durationMs: 560,\n intensity: 'normal',\n },\n 'sync-pending': {\n type: 'blink',\n trigger: 'onAppear',\n repeat: 'loop',\n durationMs: 900,\n intensity: 'subtle',\n },\n};\n\nexport const RULE_ANIMATION_PRESET_ALIASES: Record<\n string,\n CanonicalRuleAnimationPreset\n> = {\n 'sla-warning': 'warning-attention',\n 'sla-breach': 'critical-alert',\n 'risk-elevated': 'warning-attention',\n 'risk-critical': 'critical-alert',\n 'audit-warning': 'audit-review',\n 'sync-warning': 'sync-pending',\n};\n\nconst RULE_ANIMATION_PRESET_KEYS = new Set<string>(\n Object.keys(RULE_ANIMATION_PRESETS),\n);\n\nfunction hasMeaningfulAnimationOverride(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.trim().length > 0;\n return true;\n}\n\nfunction pickAnimationOverride<T>(override: T | undefined, fallback: T | undefined): T | undefined {\n return hasMeaningfulAnimationOverride(override) ? override : fallback;\n}\n\nfunction normalizeAnimationType(value: unknown): RuleAnimationType | null {\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase() as RuleAnimationType;\n return RULE_ANIMATION_TYPE_SET.has(normalized) ? normalized : null;\n}\n\nfunction normalizeAnimationTrigger(value: unknown): RuleAnimationTrigger {\n const normalized = String(value ?? '').trim().toLowerCase();\n if (normalized === 'onchange' || normalized === 'change') return 'onChange';\n if (normalized === 'onhover' || normalized === 'hover') return 'onHover';\n if (normalized === 'onconditionenter') return 'onConditionEnter';\n if (normalized === 'onconditionexit') return 'onConditionExit';\n if (normalized === 'ondatarefresh') return 'onDataRefresh';\n return 'onAppear';\n}\n\nfunction normalizeAnimationRepeat(value: unknown): RuleAnimationRepeat {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.max(1, Math.round(value));\n }\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase();\n if (normalized === 'loop') return 'loop';\n if (normalized === 'infinite') return 'infinite';\n if (/^\\d+$/.test(normalized)) {\n return Math.max(1, Number.parseInt(normalized, 10));\n }\n return 'once';\n}\n\nfunction normalizeAnimationIntensity(value: unknown): RuleAnimationIntensity {\n const normalized = String(value ?? '')\n .trim()\n .toLowerCase() as RuleAnimationIntensity;\n return RULE_ANIMATION_INTENSITY_SET.has(normalized) ? normalized : 'normal';\n}\n\nfunction toNonNegativeMs(value: unknown): number | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string' && !value.trim()) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : undefined;\n}\n\nexport function resolveRuleAnimationPresetKey(\n rawPreset: unknown,\n): CanonicalRuleAnimationPreset | null {\n const normalized = String(rawPreset ?? '').trim().toLowerCase();\n if (!normalized) return null;\n if (RULE_ANIMATION_PRESET_KEYS.has(normalized)) {\n return normalized as CanonicalRuleAnimationPreset;\n }\n return RULE_ANIMATION_PRESET_ALIASES[normalized] || null;\n}\n\nexport function resolveRuleAnimationPreset(\n rawPreset: unknown,\n): RuleAnimationPresetConfig | null {\n const key = resolveRuleAnimationPresetKey(rawPreset);\n return key ? RULE_ANIMATION_PRESETS[key] : null;\n}\n\nexport function resolveRuleAnimationConfig(\n animation: RuleEffectDefinition['animation'] | undefined,\n): ResolvedRuleAnimationConfig | null {\n const enabled = animation?.enabled !== false;\n if (!enabled) return null;\n const preset = resolveRuleAnimationPreset(animation?.preset);\n const type = normalizeAnimationType(\n pickAnimationOverride(animation?.type, preset?.type),\n );\n if (!type) return null;\n return {\n enabled: true,\n type,\n trigger: normalizeAnimationTrigger(\n pickAnimationOverride(animation?.trigger, preset?.trigger),\n ),\n repeat: normalizeAnimationRepeat(\n pickAnimationOverride(animation?.repeat, preset?.repeat),\n ),\n durationMs: toNonNegativeMs(\n pickAnimationOverride(animation?.durationMs, preset?.durationMs),\n ),\n delayMs: toNonNegativeMs(animation?.delayMs),\n intensity: normalizeAnimationIntensity(\n pickAnimationOverride(animation?.intensity, preset?.intensity),\n ),\n };\n}\n","import { RuleEffectDefinition } from '../models/rule-effects.model';\n\nexport const DEFAULT_EFFECT_PRESETS: Record<string, RuleEffectDefinition> = {\n aprovado: {\n scope: 'row',\n estilo: { color: '#eafff5', bold: true },\n iconBadge: {\n icon: 'check_circle',\n iconColor: '#35D07F',\n iconPos: 'before',\n badgeText: 'Aprovado',\n badgeStyle: 'soft',\n badgeColor: '#2a8455',\n },\n background: { color: 'rgba(53,208,127,0.08)' },\n layout: { border: 'left', borderColor: '#35D07F', borderWidth: 3 },\n animation: { preset: 'success-confirm' },\n },\n alerta: {\n scope: 'row',\n estilo: { color: '#fff8e1', bold: true },\n iconBadge: {\n icon: 'warning',\n iconColor: '#FFC107',\n iconPos: 'before',\n badgeText: 'Atenção',\n badgeStyle: 'outline',\n badgeColor: '#FFC107',\n },\n background: { color: 'rgba(255,193,7,0.12)' },\n animation: { preset: 'warning-attention' },\n },\n erro: {\n scope: 'row',\n estilo: { color: '#ffeaea', bold: true },\n iconBadge: {\n icon: 'error',\n iconColor: '#EF5350',\n iconPos: 'before',\n badgeText: 'Erro',\n badgeStyle: 'solid',\n badgeColor: '#EF5350',\n },\n background: { color: 'rgba(239,83,80,0.10)' },\n animation: { preset: 'critical-alert' },\n },\n info: {\n scope: 'row',\n iconBadge: { icon: 'info', iconColor: '#64B5F6', iconPos: 'before' },\n background: { color: 'rgba(100,181,246,0.10)' },\n animation: { preset: 'info-soft' },\n },\n};\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSliderModule } from '@angular/material/slider';\n\n@Component({\n selector: 'praxis-effects-estilo-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonToggleModule,\n MatIconModule,\n MatSliderModule,\n ],\n template: `\n <div class=\"estilo-grid\" role=\"group\" aria-label=\"Editor de estilo\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do texto</mat-label>\n <input matInput type=\"text\" formControlName=\"color\" placeholder=\"#E7ECF6\" />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor de fundo do texto</mat-label>\n <input matInput type=\"text\" formControlName=\"bgColor\" placeholder=\"#122033\" />\n </mat-form-field>\n\n <div class=\"toggles\">\n <mat-button-toggle-group multiple>\n <mat-button-toggle [checked]=\"group.get('bold')?.value\" (change)=\"group.get('bold')?.setValue($event.source.checked)\" aria-label=\"Negrito\">\n <mat-icon>format_bold</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle [checked]=\"group.get('italic')?.value\" (change)=\"group.get('italic')?.setValue($event.source.checked)\" aria-label=\"Itálico\">\n <mat-icon>format_italic</mat-icon>\n </mat-button-toggle>\n <mat-button-toggle [checked]=\"group.get('underline')?.value\" (change)=\"group.get('underline')?.setValue($event.source.checked)\" aria-label=\"Sublinhado\">\n <mat-icon>format_underlined</mat-icon>\n </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Transformação</mat-label>\n <select matNativeControl formControlName=\"transform\" aria-label=\"Transformação do texto\">\n <option [ngValue]=\"null\">Nenhuma</option>\n <option value=\"uppercase\">MAIÚSCULAS</option>\n <option value=\"lowercase\">minúsculas</option>\n <option value=\"capitalize\">Capitalizar</option>\n </select>\n </mat-form-field>\n\n <div class=\"sliders\">\n <label class=\"slider\">\n <span>Opacidade</span>\n <mat-slider min=\"0\" max=\"1\" step=\"0.05\" [displayWith]=\"formatOpacity\">\n <input matSliderThumb formControlName=\"opacity\" />\n </mat-slider>\n </label>\n <label class=\"slider\">\n <span>Tamanho</span>\n <mat-slider min=\"-2\" max=\"2\" step=\"1\">\n <input matSliderThumb formControlName=\"fontScale\" />\n </mat-slider>\n </label>\n </div>\n </div>\n `,\n styles: [\n `\n .estilo-grid { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 12px; align-items: start; }\n .toggles { display:flex; align-items:center; gap: 8px; }\n .sliders { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; }\n .slider { display:flex; flex-direction: column; gap: 6px; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EstiloEditorComponent {\n @Input() group!: FormGroup;\n // Public for template (strictTemplates): used by mat-slider\n formatOpacity(v: number | null): string { return (v ?? 0).toFixed(2); }\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-effects-layout-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonToggleModule, MatIconModule],\n template: `\n <div class=\"layout-grid\" role=\"group\" aria-label=\"Editor de layout\" [formGroup]=\"group\">\n <div class=\"borders\">\n <span class=\"lbl\">Borda</span>\n <mat-button-toggle-group [value]=\"group.get('border')?.value\" (change)=\"group.get('border')?.setValue($event.value)\" aria-label=\"Borda\">\n <mat-button-toggle value=\"none\"><mat-icon>crop_free</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"left\"><mat-icon>border_left</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"right\"><mat-icon>border_right</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"top\"><mat-icon>border_top</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"bottom\"><mat-icon>border_bottom</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"all\"><mat-icon>border_all</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor da borda</mat-label>\n <input matInput type=\"text\" formControlName=\"borderColor\" placeholder=\"#487BFF\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Espessura</mat-label>\n <input matInput type=\"number\" formControlName=\"borderWidth\" placeholder=\"2\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Padding</mat-label>\n <input matInput type=\"number\" formControlName=\"padding\" placeholder=\"6\" />\n </mat-form-field>\n\n <div class=\"align\">\n <span class=\"lbl\">Alinhamento</span>\n <mat-button-toggle-group [value]=\"group.get('align')?.value\" (change)=\"group.get('align')?.setValue($event.value)\" aria-label=\"Alinhamento\">\n <mat-button-toggle value=\"start\"><mat-icon>format_align_left</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"center\"><mat-icon>format_align_center</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"end\"><mat-icon>format_align_right</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Elevação (sombra)</mat-label>\n <input matInput type=\"number\" formControlName=\"elevation\" placeholder=\"6\" />\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .layout-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .borders, .align { display:flex; align-items:center; gap:8px; }\n .lbl { font-size:.85rem; opacity:.8; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\n\n@Component({\n selector: 'praxis-effects-icone-badge-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonToggleModule, MatIconModule],\n template: `\n <div class=\"icone-grid\" role=\"group\" aria-label=\"Editor de ícone e badge\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone (mat-icon)</mat-label>\n <input matInput type=\"text\" formControlName=\"icon\" placeholder=\"check_circle\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do ícone</mat-label>\n <input matInput type=\"text\" formControlName=\"iconColor\" placeholder=\"#35D07F\" />\n </mat-form-field>\n\n <div class=\"pos\">\n <span class=\"lbl\">Posição do ícone</span>\n <mat-button-toggle-group [value]=\"group.get('iconPos')?.value\" (change)=\"group.get('iconPos')?.setValue($event.value)\" aria-label=\"Posição do ícone\">\n <mat-button-toggle value=\"before\">Antes</mat-button-toggle>\n <mat-button-toggle value=\"after\">Depois</mat-button-toggle>\n <mat-button-toggle value=\"overlay\">Sobreposto</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <mat-label>Texto do badge</mat-label>\n <input matInput type=\"text\" formControlName=\"badgeText\" placeholder=\"Aprovado\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do badge</mat-label>\n <input matInput type=\"text\" formControlName=\"badgeColor\" placeholder=\"#2a8455\" />\n </mat-form-field>\n\n <div class=\"variant\">\n <span class=\"lbl\">Estilo</span>\n <mat-button-toggle-group [value]=\"group.get('badgeStyle')?.value\" (change)=\"group.get('badgeStyle')?.setValue($event.value)\" aria-label=\"Estilo do badge\">\n <mat-button-toggle value=\"solid\">Sólido</mat-button-toggle>\n <mat-button-toggle value=\"soft\">Suave</mat-button-toggle>\n <mat-button-toggle value=\"outline\">Contorno</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n </div>\n `,\n styles: [\n `\n .icone-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .pos, .variant { display:flex; align-items:center; gap:8px; }\n .lbl { font-size:.85rem; opacity:.8; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IconeBadgeEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSliderModule } from '@angular/material/slider';\n\n@Component({\n selector: 'praxis-effects-fundo-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatSliderModule],\n template: `\n <div class=\"fundo-grid\" role=\"group\" aria-label=\"Editor de fundo\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <input matInput type=\"text\" formControlName=\"color\" placeholder=\"#122033\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"full\">\n <mat-label>Gradient CSS</mat-label>\n <input matInput type=\"text\" formControlName=\"gradient\" placeholder=\"linear-gradient(180deg, #202637, #1c2230)\" />\n </mat-form-field>\n\n <label class=\"slider\">\n <span>Transparência</span>\n <mat-slider min=\"0\" max=\"100\" step=\"5\">\n <input matSliderThumb formControlName=\"alpha\" />\n </mat-slider>\n </label>\n <label class=\"slider\">\n <span>Desfoque (px)</span>\n <mat-slider min=\"0\" max=\"20\" step=\"1\">\n <input matSliderThumb formControlName=\"blur\" />\n </mat-slider>\n </label>\n </div>\n `,\n styles: [\n `\n .fundo-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .full { grid-column: 1 / -1; }\n .slider { display:flex; flex-direction: column; gap: 6px; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FundoEditorComponent {\n @Input() group!: FormGroup;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'praxis-effects-animacao-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\n template: `\n <div class=\"anim-grid\" role=\"group\" aria-label=\"Editor de animação\" [formGroup]=\"group\">\n <label class=\"anim-toggle\">\n <input type=\"checkbox\" formControlName=\"enabled\" />\n <span>Ativar animação</span>\n </label>\n <mat-form-field appearance=\"outline\">\n <mat-label>Preset</mat-label>\n <select matNativeControl formControlName=\"preset\" aria-label=\"Preset de animação\">\n <option value=\"\">Sem preset</option>\n <option value=\"info-soft\">Info Soft</option>\n <option value=\"success-confirm\">Success Confirm</option>\n <option value=\"warning-attention\">Warning Attention</option>\n <option value=\"critical-alert\">Critical Alert</option>\n <option value=\"audit-review\">Audit Review</option>\n <option value=\"sync-pending\">Sync Pending</option>\n <option value=\"sla-warning\">SLA Warning (alias)</option>\n <option value=\"sla-breach\">SLA Breach (alias)</option>\n <option value=\"risk-elevated\">Risk Elevated (alias)</option>\n <option value=\"risk-critical\">Risk Critical (alias)</option>\n <option value=\"audit-warning\">Audit Warning (alias)</option>\n <option value=\"sync-warning\">Sync Warning (alias)</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <select matNativeControl formControlName=\"type\" aria-label=\"Tipo de animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"pulse\">Pulse</option>\n <option value=\"blink\">Blink</option>\n <option value=\"grow\">Grow</option>\n <option value=\"fade\">Fade</option>\n <option value=\"slide-in\">Slide In</option>\n <option value=\"border-pulse\">Border Pulse</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Duração (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"durationMs\" placeholder=\"Preset/default\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"delayMs\" placeholder=\"Opcional\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Disparo</mat-label>\n <select matNativeControl formControlName=\"trigger\" aria-label=\"Disparo da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"onChange\">Ao mudar</option>\n <option value=\"onAppear\">Ao aparecer</option>\n <option value=\"onHover\">Ao passar o mouse</option>\n <option value=\"onConditionEnter\">Ao entrar na condição</option>\n <option value=\"onConditionExit\">Ao sair da condição</option>\n <option value=\"onDataRefresh\">Ao atualizar dados</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Repetição</mat-label>\n <select matNativeControl formControlName=\"repeat\" aria-label=\"Repetição da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"once\">Uma vez</option>\n <option value=\"loop\">Loop</option>\n <option value=\"infinite\">Infinito</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Intensidade</mat-label>\n <select matNativeControl formControlName=\"intensity\" aria-label=\"Intensidade da animação\">\n <option value=\"\">Padrão do preset</option>\n <option value=\"subtle\">Sutil</option>\n <option value=\"normal\">Normal</option>\n <option value=\"strong\">Forte</option>\n </select>\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .anim-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .anim-toggle {\n grid-column: 1 / -1;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: inherit;\n font-size: 0.9rem;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AnimacaoEditorComponent { @Input() group!: FormGroup; }\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\n@Component({\n selector: 'praxis-effects-tooltip-editor',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\n template: `\n <div class=\"tooltip-grid\" role=\"group\" aria-label=\"Editor de tooltip\" [formGroup]=\"group\">\n <mat-form-field appearance=\"outline\" class=\"full\">\n <mat-label>Texto</mat-label>\n <input matInput type=\"text\" formControlName=\"text\" placeholder=\"Detalhes da célula\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição</mat-label>\n <select matNativeControl formControlName=\"position\" aria-label=\"Posição do tooltip\">\n <option value=\"top\">Topo</option>\n <option value=\"right\">Direita</option>\n <option value=\"bottom\">Baixo</option>\n <option value=\"left\">Esquerda</option>\n </select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do fundo</mat-label>\n <input matInput type=\"text\" formControlName=\"bgColor\" placeholder=\"#2E3142\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay (ms)</mat-label>\n <input matInput type=\"number\" formControlName=\"delayMs\" placeholder=\"300\" />\n </mat-form-field>\n </div>\n `,\n styles: [\n `\n .tooltip-grid { display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:12px; align-items:center; }\n .full { grid-column: 1 / -1; }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TooltipEditorComponent { @Input() group!: FormGroup; }\n","import { Injectable } from '@angular/core';\n\nexport interface EffectEditorPlugin {\n id: 'estilo' | 'layout' | 'icone' | 'fundo' | 'animacao' | 'tooltip';\n label: string;\n icon: string;\n order: number;\n loadComponent?: () => Promise<any>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class EffectRegistryService {\n private plugins: EffectEditorPlugin[] = [];\n\n register(plugin: EffectEditorPlugin) {\n if (this.plugins.find((p) => p.id === plugin.id)) return; // avoid duplicates\n this.plugins.push(plugin);\n this.plugins.sort((a, b) => a.order - b.order);\n }\n\n list(): EffectEditorPlugin[] {\n return this.plugins.slice();\n }\n}\n\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { auditTime, takeUntil } from 'rxjs/operators';\n\nimport { RuleEffectDefinition, RuleScope } from './models/rule-effects.model';\nimport { resolveRuleAnimationConfig } from './animation-presets';\nimport { DEFAULT_EFFECT_PRESETS } from './presets/default-presets';\nimport { EffectRegistryService } from './services/effect-registry.service';\n\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\n\nimport { EstiloEditorComponent } from './editors/estilo-editor.component';\nimport { LayoutEditorComponent } from './editors/layout-editor.component';\nimport { IconeBadgeEditorComponent } from './editors/icone-badge-editor.component';\nimport { FundoEditorComponent } from './editors/fundo-editor.component';\nimport { AnimacaoEditorComponent } from './editors/animacao-editor.component';\nimport { TooltipEditorComponent } from './editors/tooltip-editor.component';\n\n@Component({\n selector: 'praxis-rule-effects-panel',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatMenuModule,\n MatButtonToggleModule,\n EstiloEditorComponent,\n LayoutEditorComponent,\n IconeBadgeEditorComponent,\n FundoEditorComponent,\n AnimacaoEditorComponent,\n TooltipEditorComponent,\n ],\n templateUrl: './rule-effects-panel.component.html',\n styleUrls: ['./rule-effects-panel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RuleEffectsPanelComponent implements OnInit, OnDestroy {\n private static readonly DEFAULT_ANIMATION_FORM_VALUE = {\n enabled: true,\n preset: '',\n type: '',\n durationMs: null,\n trigger: '',\n repeat: '',\n delayMs: null,\n intensity: '',\n } as const;\n\n // i18n-friendly labels map\n labels: Record<string, string> = {\n 'panel.title': 'C. Efeitos',\n 'panel.subtitle': 'Configure estilos e elementos visuais quando a regra for verdadeira',\n 'tabs.estilo': 'Estilo',\n 'tabs.layout': 'Layout',\n 'tabs.icone': 'Ícone / Badge',\n 'tabs.fundo': 'Fundo',\n 'tabs.animacao': 'Animação',\n 'tabs.tooltip': 'Tooltip',\n 'preview.title': 'Pré-visualização',\n 'preview.hint': 'As mudanças acima refletem o estilo aplicado quando a condição é verdadeira.',\n 'advanced.title': 'Avançado',\n 'advanced.description': 'Descrição',\n 'actions.apply': 'Aplicar',\n 'actions.reset': 'Redefinir',\n 'presets.label': 'Presets',\n };\n t(key: string): string { return this.labels[key] ?? key; }\n\n @Input() scope: RuleScope = 'row';\n private _value?: RuleEffectDefinition;\n @Input() set value(v: RuleEffectDefinition | undefined) {\n this._value = v;\n if (v && this.effectsForm) this.patchForm(v);\n }\n get value() { return this._value; }\n\n @Output() valueChange = new EventEmitter<RuleEffectDefinition>();\n @Output() apply = new EventEmitter<void>();\n @Output() reset = new EventEmitter<void>();\n\n activeTab: 'estilo' | 'layout' | 'icone' | 'fundo' | 'animacao' | 'tooltip' = 'estilo';\n effectsForm!: FormGroup;\n destroy$ = new Subject<void>();\n\n isHovering = false;\n\n readonly tabOrder: Array<typeof this.activeTab> = ['estilo', 'layout', 'icone', 'fundo', 'animacao', 'tooltip'];\n\n constructor(private fb: FormBuilder, private registry: EffectRegistryService) {}\n\n ngOnInit() {\n // Register built-in editors for the registry (extensible)\n this.registry.register({ id: 'estilo', icon: 'text_format', label: this.t('tabs.estilo'), order: 1 });\n this.registry.register({ id: 'layout', icon: 'view_quilt', label: this.t('tabs.layout'), order: 2 });\n this.registry.register({ id: 'icone', icon: 'verified', label: this.t('tabs.icone'), order: 3 });\n this.registry.register({ id: 'fundo', icon: 'gradient', label: this.t('tabs.fundo'), order: 4 });\n this.registry.register({ id: 'animacao', icon: 'animation', label: this.t('tabs.animacao'), order: 5 });\n this.registry.register({ id: 'tooltip', icon: 'info', label: this.t('tabs.tooltip'), order: 6 });\n\n this.effectsForm = this.fb.group({\n description: [''],\n estilo: this.fb.group({\n color: ['#ffffff'],\n bgColor: [''],\n bold: [false],\n italic: [false],\n underline: [false],\n transform: [null],\n opacity: [1],\n fontScale: [0],\n }),\n layout: this.fb.group({\n border: ['none'],\n borderColor: ['#487BFF'],\n borderWidth: [2],\n padding: [6],\n align: ['start'],\n elevation: [6],\n }),\n iconBadge: this.fb.group({\n icon: ['check_circle'],\n iconColor: ['#35D07F'],\n iconPos: ['before'],\n badgeText: [''],\n badgeStyle: ['soft'],\n badgeColor: ['#2a8455'],\n }),\n background: this.fb.group({\n color: ['#122033'],\n gradient: [''],\n alpha: [0],\n blur: [0],\n }),\n animation: this.fb.group({\n enabled: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.enabled],\n preset: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.preset],\n type: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.type],\n durationMs: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.durationMs],\n trigger: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.trigger],\n repeat: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.repeat],\n delayMs: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.delayMs],\n intensity: [RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE.intensity],\n }),\n tooltip: this.fb.group({\n text: [''],\n position: ['bottom'],\n bgColor: ['#2E3142'],\n delayMs: [300],\n }),\n cssClass: [''],\n inlineStyle: [''],\n });\n\n this.effectsForm.valueChanges\n .pipe(auditTime(200), takeUntil(this.destroy$))\n .subscribe((formValue) => {\n this.valueChange.emit(this.toEffectDefinitionForEmit(formValue as any));\n });\n\n if (this._value) this.patchForm(this._value);\n }\n\n patchForm(v: RuleEffectDefinition) {\n const animationGroup = this.effectsForm.get('animation') as FormGroup | null;\n if (animationGroup) {\n animationGroup.reset(\n RuleEffectsPanelComponent.DEFAULT_ANIMATION_FORM_VALUE,\n { emitEvent: false },\n );\n }\n this.effectsForm.patchValue(v as any, { emitEvent: false });\n }\n\n setTab(tab: typeof this.activeTab) {\n this.activeTab = tab;\n }\n\n applyPreset(key: string) {\n const preset = DEFAULT_EFFECT_PRESETS[key];\n if (!preset) return;\n const merged: RuleEffectDefinition = { ...preset, scope: this.scope } as RuleEffectDefinition;\n this.patchForm(merged);\n this.valueChange.emit(this.toEffectDefinitionForEmit(this.effectsForm.value as any));\n }\n\n onApply() {\n this.apply.emit();\n }\n\n onReset() {\n this.effectsForm.reset();\n this.reset.emit();\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // Typed subgroup getters for strict template type checking\n get estiloGroup(): FormGroup { return this.effectsForm.get('estilo') as FormGroup; }\n get layoutGroup(): FormGroup { return this.effectsForm.get('layout') as FormGroup; }\n get iconBadgeGroup(): FormGroup { return this.effectsForm.get('iconBadge') as FormGroup; }\n get backgroundGroup(): FormGroup { return this.effectsForm.get('background') as FormGroup; }\n get animationGroup(): FormGroup { return this.effectsForm.get('animation') as FormGroup; }\n get tooltipGroup(): FormGroup { return this.effectsForm.get('tooltip') as FormGroup; }\n\n // Safe access for template — avoids TS casts in templates\n get formValue(): RuleEffectDefinition {\n const v = (this.effectsForm?.value || {}) as any;\n return { scope: this.scope, ...v } as RuleEffectDefinition;\n }\n\n // A11y: keyboard navigation for tabs\n onTabsKeydown(event: KeyboardEvent) {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n event.preventDefault();\n const idx = this.tabOrder.indexOf(this.activeTab);\n const next = event.key === 'ArrowRight' ? (idx + 1) % this.tabOrder.length : (idx - 1 + this.tabOrder.length) % this.tabOrder.length;\n this.activeTab = this.tabOrder[next];\n }\n\n onHoverPreview(over: boolean) {\n this.isHovering = over;\n }\n\n // Preview helpers\n public computeTextStyle(v: RuleEffectDefinition): any {\n const s = v?.estilo || {};\n const size = s.fontScale ? `calc(1rem + ${s.fontScale * 0.1}rem)` : '1rem';\n const transform = s.transform ?? 'none';\n return {\n color: s.color || null,\n fontWeight: s.bold ? 600 : 400,\n fontStyle: s.italic ? 'italic' : 'normal',\n textDecoration: s.underline ? 'underline' : 'none',\n opacity: s.opacity ?? 1,\n fontSize: size,\n textTransform:\n transform === 'uppercase'\n ? 'uppercase'\n : transform === 'lowercase'\n ? 'lowercase'\n : transform === 'capitalize'\n ? 'capitalize'\n : 'none',\n } as any;\n }\n\n public computeCellStyle(v: RuleEffectDefinition): any {\n const b = v?.background || {};\n const ly = v?.layout || {};\n const bg = b.gradient ? b.gradient : (b.color || 'transparent');\n const alpha = (b.alpha ?? 0) / 100;\n const bgWithAlpha = b.color ? `color-mix(in srgb, ${b.color} ${100 - alpha * 100}%, transparent)` : bg;\n\n const borderColor = ly.borderColor || 'transparent';\n const borderWidth = (ly.borderWidth ?? 0) + 'px';\n const borderStyle = ly.border === 'none' ? 'none' : `${borderWidth} solid ${borderColor}`;\n\n const base: any = {\n background: bgWithAlpha,\n filter: b.blur ? `blur(${b.blur}px)` : 'none',\n padding: (ly.padding ?? 6) + 'px',\n boxShadow: ly.elevation ? `0 ${Math.min(ly.elevation, 24)}px ${Math.min(ly.elevation, 24)}px rgba(0,0,0,.25)` : 'none',\n justifyContent: ly.align === 'center' ? 'center' : ly.align === 'end' ? 'flex-end' : 'flex-start',\n };\n\n if (ly.border === 'all') base.border = borderStyle;\n if (ly.border === 'left') base.borderLeft = borderStyle;\n if (ly.border === 'right') base.borderRight = borderStyle;\n if (ly.border === 'top') base.borderTop = borderStyle;\n if (ly.border === 'bottom') base.borderBottom = borderStyle;\n\n return base;\n }\n\n public computeCellClass(v: RuleEffectDefinition): any {\n const anim = this.resolvePreviewAnimation(v);\n const allowAnimation = this.isPreviewAnimationAllowed();\n const triggerHover = anim.trigger === 'onHover';\n const triggerAppear = anim.trigger === 'onAppear';\n const triggerChange =\n anim.trigger === 'onChange'\n || anim.trigger === 'onConditionEnter'\n || anim.trigger === 'onConditionExit'\n || anim.trigger === 'onDataRefresh';\n const repeatClass =\n anim.repeat === 'loop' || anim.repeat === 'infinite'\n ? 'anim--loop'\n : typeof anim.repeat === 'number' && Number.isFinite(anim.repeat) && anim.repeat > 1\n ? 'anim--count'\n : 'anim--once';\n const active =\n (triggerHover && this.isHovering) ||\n triggerAppear ||\n triggerChange; // we don’t track changes here, preview is always ‘changed’\n const out: Record<string, boolean> = {\n 'icon--overlay': !!v?.iconBadge?.icon && v?.iconBadge?.iconPos === 'overlay',\n };\n if (!allowAnimation || !anim.type || !anim.enabled || !active) {\n return out;\n }\n out[`anim--${anim.type}`] = true;\n out[`anim--${anim.intensity}`] = true;\n out[repeatClass] = true;\n return out;\n }\n\n private resolvePreviewAnimation(v: RuleEffectDefinition): {\n enabled: boolean;\n type: string;\n trigger: string;\n repeat: string | number;\n intensity: string;\n } {\n const resolved = resolveRuleAnimationConfig(v?.animation);\n if (resolved) {\n return resolved;\n }\n return {\n enabled: false,\n type: '',\n trigger: 'onAppear',\n repeat: 'once',\n intensity: 'normal',\n };\n }\n\n private isPreviewAnimationAllowed(): boolean {\n try {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return true;\n }\n return !window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n } catch {\n return true;\n }\n }\n\n public badgeBackground(v: RuleEffectDefinition): string | null {\n const s = v?.iconBadge;\n if (!s?.badgeText) return null;\n if (s.badgeStyle === 'solid') return s.badgeColor || '#444';\n if (s.badgeStyle === 'soft') return `linear-gradient(180deg, ${s.badgeColor || '#444'}, #00000055)`;\n if (s.badgeStyle === 'outline') return 'transparent';\n return null;\n }\n\n public badgeBorder(v: RuleEffectDefinition): string | null {\n const s = v?.iconBadge;\n return s?.badgeStyle === 'outline' ? s.badgeColor || '#777' : '#0000';\n }\n\n private toEffectDefinitionForEmit(formValue: any): RuleEffectDefinition {\n const value: RuleEffectDefinition = { scope: this.scope, ...(formValue || {}) } as RuleEffectDefinition;\n const normalizedAnimation = this.normalizeAnimationForEmit((formValue || {}).animation);\n if (normalizedAnimation) {\n value.animation = normalizedAnimation;\n } else {\n delete (value as any).animation;\n }\n return value;\n }\n\n private normalizeAnimationForEmit(\n animation: RuleEffectDefinition['animation'] | undefined,\n ): RuleEffectDefinition['animation'] | undefined {\n if (!animation) return undefined;\n const normalized: NonNullable<RuleEffectDefinition['animation']> = {};\n if (animation.enabled === false) {\n normalized.enabled = false;\n }\n\n const preset = String(animation.preset ?? '').trim();\n if (preset) normalized.preset = preset as any;\n\n const type = String(animation.type ?? '').trim();\n if (type) normalized.type = type as any;\n\n const trigger = String(animation.trigger ?? '').trim();\n if (trigger) normalized.trigger = trigger as any;\n\n const repeat = animation.repeat;\n if (\n repeat !== undefined\n && repeat !== null\n && (typeof repeat !== 'string' || repeat.trim() !== '')\n ) {\n normalized.repeat = repeat;\n }\n\n const durationMs = this.toNonNegativeMs(animation.durationMs);\n if (durationMs !== undefined) normalized.durationMs = durationMs;\n\n const delayMs = this.toNonNegativeMs(animation.delayMs);\n if (delayMs !== undefined) normalized.delayMs = delayMs;\n\n const intensity = String(animation.intensity ?? '').trim();\n if (intensity) normalized.intensity = intensity as any;\n\n return Object.keys(normalized).length ? normalized : undefined;\n }\n\n private toNonNegativeMs(value: unknown): number | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string' && !value.trim()) return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) && parsed >= 0 ? Math.round(parsed) : undefined;\n }\n}\n","<div class=\"rulefx\">\n <header class=\"rulefx__header\">\n <h3 class=\"rulefx__title\">{{ t('panel.title') }}</h3>\n <p class=\"rulefx__subtitle\">{{ t('panel.subtitle') }}</p>\n <div class=\"rulefx__actions\">\n <button mat-stroked-button [matMenuTriggerFor]=\"presetsMenu\" [attr.aria-label]=\"t('presets.label')\">\n <mat-icon>bookmarks</mat-icon>\n {{ t('presets.label') }}\n </button>\n <mat-menu #presetsMenu=\"matMenu\">\n <button mat-menu-item (click)=\"applyPreset('aprovado')\"><mat-icon>check_circle</mat-icon> Aprovado</button>\n <button mat-menu-item (click)=\"applyPreset('alerta')\"><mat-icon>warning</mat-icon> Alerta</button>\n <button mat-menu-item (click)=\"applyPreset('erro')\"><mat-icon>error</mat-icon> Erro</button>\n <button mat-menu-item (click)=\"applyPreset('info')\"><mat-icon>info</mat-icon> Info</button>\n </mat-menu>\n <button mat-flat-button color=\"primary\" (click)=\"onApply()\" [attr.aria-label]=\"t('actions.apply')\" [matTooltip]=\"t('actions.apply')\" matTooltipPosition=\"below\">\n <mat-icon>done</mat-icon>\n {{ t('actions.apply') }}\n </button>\n <button mat-stroked-button (click)=\"onReset()\" [attr.aria-label]=\"t('actions.reset')\" [matTooltip]=\"t('actions.reset')\" matTooltipPosition=\"below\">\n <mat-icon>restart_alt</mat-icon>\n {{ t('actions.reset') }}\n </button>\n </div>\n </header>\n\n <!-- Ribbon com seis categorias -->\n <nav\n class=\"rulefx__ribbon\"\n aria-label=\"Categorias de efeitos\"\n role=\"tablist\"\n (keydown)=\"onTabsKeydown($event)\"\n >\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'estilo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'estilo'\"\n [attr.tabindex]=\"activeTab === 'estilo' ? 0 : -1\"\n (click)=\"setTab('estilo')\"\n [matTooltip]=\"t('tabs.estilo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">text_format</span>\n <span>{{ t('tabs.estilo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'layout'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'layout'\"\n [attr.tabindex]=\"activeTab === 'layout' ? 0 : -1\"\n (click)=\"setTab('layout')\"\n [matTooltip]=\"t('tabs.layout')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">view_quilt</span>\n <span>{{ t('tabs.layout') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'icone'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'icone'\"\n [attr.tabindex]=\"activeTab === 'icone' ? 0 : -1\"\n (click)=\"setTab('icone')\"\n [matTooltip]=\"t('tabs.icone')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">verified</span>\n <span>{{ t('tabs.icone') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'fundo'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'fundo'\"\n [attr.tabindex]=\"activeTab === 'fundo' ? 0 : -1\"\n (click)=\"setTab('fundo')\"\n [matTooltip]=\"t('tabs.fundo')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">gradient</span>\n <span>{{ t('tabs.fundo') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'animacao'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'animacao'\"\n [attr.tabindex]=\"activeTab === 'animacao' ? 0 : -1\"\n (click)=\"setTab('animacao')\"\n [matTooltip]=\"t('tabs.animacao')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">animation</span>\n <span>{{ t('tabs.animacao') }}</span>\n </button>\n <button\n class=\"ribbon__tab\"\n [class.is-active]=\"activeTab === 'tooltip'\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === 'tooltip'\"\n [attr.tabindex]=\"activeTab === 'tooltip' ? 0 : -1\"\n (click)=\"setTab('tooltip')\"\n [matTooltip]=\"t('tabs.tooltip')\"\n matTooltipPosition=\"below\"\n >\n <span class=\"material-icons\">info</span>\n <span>{{ t('tabs.tooltip') }}</span>\n </button>\n </nav>\n\n <!-- Quickbar contextual -->\n <section class=\"rulefx__quickbar\" aria-live=\"polite\" *ngIf=\"effectsForm\">\n <ng-container [ngSwitch]=\"activeTab\">\n <ng-container *ngSwitchCase=\"'estilo'\">\n <praxis-effects-estilo-editor [group]=\"estiloGroup\"></praxis-effects-estilo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'layout'\">\n <praxis-effects-layout-editor [group]=\"layoutGroup\"></praxis-effects-layout-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'icone'\">\n <praxis-effects-icone-badge-editor [group]=\"iconBadgeGroup\"></praxis-effects-icone-badge-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fundo'\">\n <praxis-effects-fundo-editor [group]=\"backgroundGroup\"></praxis-effects-fundo-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'animacao'\">\n <praxis-effects-animacao-editor [group]=\"animationGroup\"></praxis-effects-animacao-editor>\n </ng-container>\n <ng-container *ngSwitchCase=\"'tooltip'\">\n <praxis-effects-tooltip-editor [group]=\"tooltipGroup\"></praxis-effects-tooltip-editor>\n </ng-container>\n </ng-container>\n </section>\n\n <!-- Pré-visualização e seção avançada -->\n <section class=\"rulefx__body\">\n <div class=\"rulefx__preview\">\n <div class=\"preview__title\">{{ t('preview.title') }}</div>\n\n <div\n class=\"preview__cell\"\n [ngStyle]=\"computeCellStyle(formValue)\"\n [ngClass]=\"computeCellClass(formValue)\"\n (mouseenter)=\"onHoverPreview(true)\"\n (mouseleave)=\"onHoverPreview(false)\"\n >\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'before'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n\n <span class=\"preview__text\" [ngStyle]=\"computeTextStyle(formValue)\">\n Joana Silva — Ativo desde 2019\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.badgeText\"\n class=\"preview__badge\"\n [ngStyle]=\"{ 'background': badgeBackground(formValue), 'border-color': badgeBorder(formValue) }\"\n >\n {{ formValue.iconBadge?.badgeText }}\n </span>\n\n <span\n *ngIf=\"formValue.iconBadge?.icon && formValue.iconBadge?.iconPos === 'after'\"\n class=\"material-icons preview__icon\"\n [style.color]=\"formValue.iconBadge?.iconColor\"\n >\n {{ formValue.iconBadge?.icon }}\n </span>\n </div>\n\n <p class=\"preview__hint\">{{ t('preview.hint') }}</p>\n </div>\n\n <div class=\"rulefx__advanced\">\n <details class=\"advanced__section\">\n <summary>{{ t('advanced.title') }}</summary>\n <div class=\"advanced__grid\" [formGroup]=\"effectsForm\">\n <label class=\"textctl\">\n <span>{{ t('advanced.description') }}</span>\n <input type=\"text\" formControlName=\"description\" placeholder=\"ex.: Destacar preços altos\" />\n </label>\n <label class=\"textctl\">\n <span>Classe CSS</span>\n <input type=\"text\" formControlName=\"cssClass\" placeholder=\"ex.: praxis-cell--alert\" />\n </label>\n <label class=\"textctl\">\n <span>Estilo inline</span>\n <input type=\"text\" formControlName=\"inlineStyle\" placeholder=\"ex.: text-shadow: 0 0 8px rgba(0,255,163,.5)\" />\n </label>\n </div>\n </details>\n </div>\n </section>\n</div>\n","import { RuleEffectDefinition } from './models/rule-effects.model';\nimport { resolveRuleAnimationConfig } from './animation-presets';\n\nexport function toCellClassAndStyle(\n effect: RuleEffectDefinition,\n options?: {\n includeAnimationPreview?: boolean;\n },\n): {\n classList: string[];\n style: Record<string, string>;\n} {\n const classList: string[] = [];\n const style: Record<string, string> = {};\n const includeAnimationPreview = options?.includeAnimationPreview !== false;\n\n // Advanced class and inline style\n if (effect.cssClass) classList.push(effect.cssClass);\n if (effect.inlineStyle) style['cssText'] = effect.inlineStyle;\n\n // Background\n const b = effect.background || {};\n const ly = effect.layout || {};\n const bg = b.gradient ? b.gradient : (b.color || 'transparent');\n const alpha = (b.alpha ?? 0) / 100;\n const bgWithAlpha = b.color ? `color-mix(in srgb, ${b.color} ${100 - alpha * 100}%, transparent)` : bg;\n style['background'] = bgWithAlpha;\n if (b.blur) style['filter'] = `blur(${b.blur}px)`;\n\n // Layout\n if (ly.padding != null) style['padding'] = `${ly.padding}px`;\n if (ly.elevation) style['box-shadow'] = `0 ${Math.min(ly.elevation, 24)}px ${Math.min(ly.elevation, 24)}px rgba(0,0,0,.25)`;\n if (ly.align) style['justify-content'] = ly.align === 'center' ? 'center' : ly.align === 'end' ? 'flex-end' : 'flex-start';\n const borderColor = ly.borderColor || 'transparent';\n const borderWidth = (ly.borderWidth ?? 0) + 'px';\n const borderStyle = ly.border === 'none' ? 'none' : `${borderWidth} solid ${borderColor}`;\n switch (ly.border) {\n case 'all': style['border'] = borderStyle; break;\n case 'left': style['border-left'] = borderStyle; break;\n case 'right': style['border-right'] = borderStyle; break;\n case 'top': style['border-top'] = borderStyle; break;\n case 'bottom': style['border-bottom'] = borderStyle; break;\n }\n\n // Text (estilo)\n const s = effect.estilo || {};\n if (s.color) style['color'] = s.color;\n if (s.bgColor) style['background-color'] = s.bgColor;\n if (s.bold) style['font-weight'] = '600';\n if (s.italic) style['font-style'] = 'italic';\n if (s.underline) style['text-decoration'] = 'underline';\n if (s.opacity != null) style['opacity'] = String(s.opacity);\n if (s.transform) style['text-transform'] = s.transform;\n if (s.fontScale && s.fontScale !== 0) style['font-size'] = `calc(1rem + ${s.fontScale * 0.1}rem)`;\n\n // Icon overlay class\n if (effect.iconBadge?.iconPos === 'overlay') classList.push('icon--overlay');\n\n // Animation\n const anim = resolveRuleAnimationConfig(effect.animation);\n if (anim && includeAnimationPreview) {\n classList.push(`anim--${anim.type}`);\n classList.push(`anim--${anim.intensity}`);\n if (anim.repeat === 'loop' || anim.repeat === 'infinite') {\n classList.push('anim--loop');\n } else if (typeof anim.repeat === 'number' && Number.isFinite(anim.repeat) && anim.repeat > 1) {\n classList.push('anim--count');\n style['animation-iteration-count'] = String(Math.round(anim.repeat));\n } else {\n classList.push('anim--once');\n }\n if (anim.durationMs) style['animation-duration'] = `${anim.durationMs}ms`;\n if (anim.delayMs) style['animation-delay'] = `${anim.delayMs}ms`;\n }\n\n return { classList, style };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4","i2.EffectRegistryService","i3","i6"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -119,6 +119,7 @@ declare class RuleEffectsPanelComponent implements OnInit, OnDestroy {
|
|
|
119
119
|
computeCellStyle(v: RuleEffectDefinition): any;
|
|
120
120
|
computeCellClass(v: RuleEffectDefinition): any;
|
|
121
121
|
private resolvePreviewAnimation;
|
|
122
|
+
private isPreviewAnimationAllowed;
|
|
122
123
|
badgeBackground(v: RuleEffectDefinition): string | null;
|
|
123
124
|
badgeBorder(v: RuleEffectDefinition): string | null;
|
|
124
125
|
private toEffectDefinitionForEmit;
|
|
@@ -130,7 +131,9 @@ declare class RuleEffectsPanelComponent implements OnInit, OnDestroy {
|
|
|
130
131
|
|
|
131
132
|
declare const DEFAULT_EFFECT_PRESETS: Record<string, RuleEffectDefinition>;
|
|
132
133
|
|
|
133
|
-
declare function toCellClassAndStyle(effect: RuleEffectDefinition
|
|
134
|
+
declare function toCellClassAndStyle(effect: RuleEffectDefinition, options?: {
|
|
135
|
+
includeAnimationPreview?: boolean;
|
|
136
|
+
}): {
|
|
134
137
|
classList: string[];
|
|
135
138
|
style: Record<string, string>;
|
|
136
139
|
};
|
package/package.json
CHANGED