{"version":3,"file":"praxisui-table.mjs","sources":["../../../projects/praxis-table/src/lib/utils/action-utils.ts","../../../projects/praxis-table/src/lib/praxis-table-toolbar.ts","../../../projects/praxis-table/src/lib/json-config-editor/json-config-editor.component.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/formula-types.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/formula-generator.service.ts","../../../projects/praxis-table/src/lib/visual-formula-builder/visual-formula-builder.component.ts","../../../projects/praxis-table/src/lib/value-mapping-editor/value-mapping-editor.component.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatter-types.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatting.service.ts","../../../projects/praxis-table/src/lib/data-formatter/data-formatter.component.ts","../../../projects/praxis-table/src/lib/columns-config-editor/columns-config-editor.component.ts","../../../projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts","../../../projects/praxis-table/src/lib/toolbar-actions-editor/toolbar-actions-editor.component.ts","../../../projects/praxis-table/src/lib/messages-localization-editor/messages-localization-editor.component.ts","../../../projects/praxis-table/src/lib/filter-settings/filter-settings.component.ts","../../../projects/praxis-table/src/lib/filter-settings/filter-settings.component.html","../../../projects/praxis-table/src/lib/header-appearance-editor/header-appearance-editor.component.ts","../../../projects/praxis-table/src/lib/crud-integration-editor/crud-integration-editor.component.ts","../../../projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.ts","../../../projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.html","../../../projects/praxis-table/src/lib/rules-editor/components/table-config-toolbar.component.ts","../../../projects/praxis-table/src/lib/shared/column-type.util.ts","../../../projects/praxis-table/src/lib/rules-editor/services/operators-registry.service.ts","../../../projects/praxis-table/src/lib/rules-editor/services/rule-compiler.service.ts","../../../projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts","../../../projects/praxis-table/src/lib/praxis-table-config-editor.ts","../../../projects/praxis-table/src/lib/praxis-table-config-editor.html","../../../projects/praxis-table/src/lib/filter-drawer.adapter.ts","../../../projects/praxis-table/src/lib/services/filter-config.service.ts","../../../projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.ts","../../../projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.html","../../../projects/praxis-table/src/lib/services/table-defaults.provider.ts","../../../projects/praxis-table/src/lib/praxis-table.ts","../../../projects/praxis-table/src/lib/praxis-table.html","../../../projects/praxis-table/src/lib/rules-editor/dsl-extensions/json-dsl.extensions.ts","../../../projects/praxis-table/src/lib/rules-editor/dsl-extensions/date-dsl.extensions.ts","../../../projects/praxis-table/src/lib/praxis-table.metadata.ts","../../../projects/praxis-table/src/public-api.ts","../../../projects/praxis-table/src/praxisui-table.ts"],"sourcesContent":["export interface ActionLike {\n  action?: string;\n  id?: string;\n  // Campos históricos/comuns em diferentes configurações\n  code?: string;\n  key?: string;\n  name?: string;\n  type?: string;\n  // Suporte a inferência por ícone/rótulo\n  icon?: string;\n  label?: string;\n}\n\nfunction normalize(str?: string | null): string {\n  if (!str) return '';\n  return String(str).trim();\n}\n\nfunction fromCommonKeys(a: ActionLike): string | undefined {\n  return (\n    normalize(a.action) ||\n    normalize(a.id) ||\n    normalize(a.code) ||\n    normalize(a.key) ||\n    normalize(a.name) ||\n    normalize(a.type) ||\n    undefined\n  );\n}\n\nfunction iconToAction(icon?: string): string | undefined {\n  if (!icon) return undefined;\n  const i = icon.trim().toLowerCase();\n  // Mapeamento de ícones Material/SVG para ações canônicas\n  const map: Record<string, string> = {\n    delete: 'delete',\n    delete_outline: 'delete',\n    delete_forever: 'delete',\n    remove: 'delete',\n    trash: 'delete',\n    edit: 'edit',\n    create: 'edit',\n    mode_edit: 'edit',\n    visibility: 'view',\n    visibility_off: 'hide',\n    open_in_new: 'open',\n    launch: 'open',\n    add: 'add',\n    add_circle: 'add',\n    add_box: 'add',\n    save: 'save',\n    download: 'download',\n    file_download: 'download',\n    upload: 'upload',\n    file_upload: 'upload',\n    more_vert: 'more',\n    more_horiz: 'more',\n    info: 'info',\n    warning: 'warning',\n    block: 'block',\n    close: 'close',\n    cancel: 'cancel',\n    check: 'confirm',\n    done: 'confirm',\n    done_all: 'confirm',\n    content_copy: 'copy',\n    content_paste: 'paste',\n    restore: 'restore',\n    refresh: 'refresh',\n    search: 'search',\n    filter_list: 'filter',\n    settings: 'settings',\n  };\n  return map[i] || i; // fallback: usar o próprio nome do ícone\n}\n\nfunction labelToAction(label?: string): string | undefined {\n  if (!label) return undefined;\n  const l = label.trim().toLowerCase();\n  // Normalização simples de alguns rótulos comuns em pt/en\n  const map: Record<string, string> = {\n    excluir: 'delete',\n    deletar: 'delete',\n    remover: 'delete',\n    apagar: 'delete',\n    delete: 'delete',\n    remove: 'delete',\n    editar: 'edit',\n    edit: 'edit',\n    visualizar: 'view',\n    ver: 'view',\n    view: 'view',\n    salvar: 'save',\n    save: 'save',\n    baixar: 'download',\n    download: 'download',\n  };\n  return map[l] || l.replace(/\\s+/g, '-');\n}\n\nexport function getActionId(action: ActionLike): string {\n  // 1) Tentar pelas chaves padrão/históricas\n  const byKey = fromCommonKeys(action);\n  if (byKey) return byKey;\n\n  // 2) Inferir pelo ícone\n  const byIcon = iconToAction(action.icon);\n  if (byIcon) return byIcon;\n\n  // 3) Fallback para label\n  const byLabel = labelToAction(action.label);\n  if (byLabel) return byLabel;\n\n  // 4) Evitar string vazia\n  console.warn('[PraxisTable] getActionId: identificador desconhecido para ação', action);\n  return 'unknown';\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { TableConfig } from '@praxisui/core';\nimport { getActionId } from './utils/action-utils';\n\n@Component({\n  selector: 'praxis-table-toolbar',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatToolbarModule,\n    MatButtonModule,\n    MatIconModule,\n    PraxisIconDirective,\n    MatMenuModule,\n  ],\n  template: `\n    <mat-toolbar class=\"praxis-toolbar\">\n      <div class=\"toolbar-main\">\n        <ng-content select=\"[advancedFilter]\"></ng-content>\n        <ng-content select=\"[toolbar]\"></ng-content>\n      </div>\n\n      <div class=\"toolbar-actions\">\n        <span class=\"spacer\"></span>\n        <div class=\"actions-group\">\n          <ng-container *ngFor=\"let action of getStartActions()\">\n            <button\n              *ngIf=\"action.appearance === 'outlined'\"\n              class=\"action-btn\"\n              mat-stroked-button\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'elevated'\"\n              class=\"action-btn\"\n              mat-raised-button\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'text'\"\n              class=\"action-btn\"\n              mat-button\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'tonal'\"\n              class=\"action-btn pfx-tonal\"\n              mat-button\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"!action.appearance || action.appearance === 'filled'\"\n              class=\"action-btn\"\n              mat-flat-button\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n          </ng-container>\n          <ng-container *ngFor=\"let action of config?.toolbar?.actions\">\n            <button\n              *ngIf=\"action.appearance === 'outlined'\"\n              class=\"action-btn\"\n              mat-stroked-button\n              [color]=\"action.color\"\n              [disabled]=\"action.disabled\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'elevated'\"\n              class=\"action-btn\"\n              mat-raised-button\n              [color]=\"action.color\"\n              [disabled]=\"action.disabled\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'text'\"\n              class=\"action-btn\"\n              mat-button\n              [color]=\"action.color\"\n              [disabled]=\"action.disabled\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"action.appearance === 'tonal'\"\n              class=\"action-btn pfx-tonal\"\n              mat-button\n              [color]=\"action.color\"\n              [disabled]=\"action.disabled\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n            <button\n              *ngIf=\"!action.appearance || action.appearance === 'filled'\"\n              class=\"action-btn\"\n              mat-flat-button\n              [color]=\"action.color\"\n              [disabled]=\"action.disabled\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n          </ng-container>\n          <ng-container *ngIf=\"config?.actions?.bulk?.enabled\">\n            <button\n              class=\"action-btn\"\n              mat-button\n              *ngFor=\"let action of config?.actions?.bulk?.actions\"\n              [color]=\"action.color || 'primary'\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\">{{ action.icon }}</mat-icon>\n              {{ action.label }}\n            </button>\n          </ng-container>\n\n          <ng-container *ngIf=\"config?.export?.enabled\">\n            <button\n              class=\"action-btn\"\n              mat-button\n              [matMenuTriggerFor]=\"exportMenu\"\n            >\n              <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n            </button>\n            <mat-menu #exportMenu=\"matMenu\">\n              <button\n                mat-menu-item\n                *ngFor=\"let format of config?.export?.formats\"\n              >\n                <mat-icon [praxisIcon]=\"getExportIcon(format)\"></mat-icon>\n                {{ format.toUpperCase() }}\n              </button>\n            </mat-menu>\n          </ng-container>\n        </div>\n        <div class=\"end-actions\">\n          <ng-content select=\"[end-actions]\"></ng-content>\n          <!-- Reset preferences button slot -->\n          <button mat-icon-button aria-label=\"Reset table preferences\" (click)=\"reset.emit()\" matTooltip=\"Redefinir preferências da tabela\">\n            <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n          </button>\n        </div>\n\n        <div class=\"mobile-actions\">\n          <button\n            mat-icon-button\n            class=\"overflow-trigger\"\n            *ngIf=\"getOverflowActions().length\"\n            [matMenuTriggerFor]=\"overflowMenu\"\n          >\n            <mat-icon [praxisIcon]=\"'more_vert'\"></mat-icon>\n          </button>\n          <mat-menu #overflowMenu=\"matMenu\">\n            <button\n              mat-menu-item\n              *ngFor=\"let action of getOverflowActions()\"\n              (click)=\"emitToolbarAction($event, getActionId(action))\"\n            >\n              <mat-icon *ngIf=\"action.icon\" [praxisIcon]=\"action.icon\"></mat-icon>\n              {{ action.label }}\n            </button>\n          </mat-menu>\n\n          <ng-container *ngIf=\"config?.export?.enabled\">\n            <button mat-icon-button [matMenuTriggerFor]=\"mobileExportMenu\">\n              <mat-icon>download</mat-icon>\n            </button>\n            <mat-menu #mobileExportMenu=\"matMenu\">\n              <button\n                mat-menu-item\n                *ngFor=\"let format of config?.export?.formats\"\n              >\n                <mat-icon>{{ getExportIcon(format) }}</mat-icon>\n                {{ format.toUpperCase() }}\n              </button>\n            </mat-menu>\n          </ng-container>\n        </div>\n      </div>\n    </mat-toolbar>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n      :host(.debug-layout) .praxis-toolbar { outline: 2px solid #ff4d4f; }\n      :host(.debug-layout) .toolbar-main { outline: 1px dashed #3b82f6; }\n      :host(.debug-layout) .toolbar-actions { outline: 1px dashed #22c55e; }\n      .praxis-toolbar {\n        border-radius: 12px 12px 0 0;\n        background: transparent;\n        box-shadow: none;\n        padding: 8px 12px;\n        min-height: var(--pfx-filter-h, 44px);\n        display: flex;\n        flex-direction: row; /* mantém layout em linha em todas as larguras */\n        align-items: flex-start; /* permite que conteúdos com múltiplas linhas aumentem a altura */\n        gap: 8px;\n        flex-wrap: wrap; /* em telas menores, ações podem ir para a linha de baixo */\n      }\n\n      .toolbar-main {\n        display: flex;\n        align-items: stretch; /* deixa o conteúdo definir a altura */\n        min-width: 0; /* permite encolher sem overflow */\n        gap: 8px;\n        min-height: var(--pfx-filter-h, 44px);\n        flex: 1 0 100%; /* ocupa linha inteira quando precisar */\n      }\n\n      .toolbar-actions {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        min-height: var(--pfx-filter-h, 44px);\n        flex: 0 0 auto; /* apenas o necessário */\n      }\n\n      .actions-group {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .action-btn {\n        height: 40px;\n      }\n      /* Tonal custom style (M3-like) */\n      .pfx-tonal {\n        background: var(--mat-sys-secondary-container, color-mix(in srgb, currentColor 12%, transparent));\n        color: var(--mat-sys-on-secondary-container, currentColor);\n      }\n      .pfx-tonal:hover {\n        background: color-mix(in srgb, var(--mat-sys-secondary-container, currentColor) 90%, black 0%);\n      }\n\n      .mobile-actions {\n        display: none;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .overflow-trigger {\n        height: 40px;\n      }\n\n      .spacer { flex: 1 1 auto; min-width: 8px; }\n      .end-actions { display: flex; align-items: center; gap: 8px; }\n\n      @media (min-width: 1024px) {\n        .toolbar-actions { justify-content: flex-end; }\n        .toolbar-actions .spacer { display: none; }\n      }\n\n      @media (max-width: 1023px) {\n        .actions-group {\n          display: none;\n        }\n\n        .mobile-actions {\n          display: flex;\n        }\n\n        .toolbar-actions .spacer { flex: 1 1 auto; }\n      }\n    `,\n  ],\n  host: { '[class.debug-layout]': 'debugLayout' },\n})\nexport class PraxisTableToolbar {\n  @Input() config?: TableConfig;\n  @Input() debugLayout = false;\n  @Output() toolbarAction = new EventEmitter<{ action: string }>();\n  @Output() reset = new EventEmitter<void>();\n\n  readonly getActionId = getActionId;\n\n  emitToolbarAction(event: Event, action: string): void {\n    (event.target as HTMLElement).blur();\n    this.toolbarAction.emit({ action });\n  }\n\n  getStartActions() {\n    return (\n      this.config?.toolbar?.actions?.filter(\n        (action) => action.position === 'start',\n      ) || []\n    );\n  }\n\n  getOverflowActions() {\n    const start = this.getStartActions();\n    const toolbar = this.config?.toolbar?.actions?.filter(\n      (action) => action.position !== 'start',\n    );\n    const bulk = this.config?.actions?.bulk?.enabled\n      ? this.config.actions.bulk.actions\n      : [];\n    return [...(start || []), ...(toolbar || []), ...(bulk || [])];\n  }\n\n  getExportIcon(format: string): string {\n    switch (format.toLowerCase()) {\n      case 'excel':\n      case 'xlsx':\n        return 'grid_on';\n      case 'pdf':\n        return 'picture_as_pdf';\n      case 'csv':\n        return 'table_chart';\n      default:\n        return 'download';\n    }\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {MatButtonModule} from '@angular/material/button';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MatInputModule} from '@angular/material/input';\nimport {MatCardModule} from '@angular/material/card';\nimport {TableConfig} from '@praxisui/core';\nimport {debounceTime, Subject, takeUntil} from 'rxjs';\n\nexport interface JsonValidationResult {\n  isValid: boolean;\n  error?: string;\n  config?: TableConfig;\n}\n\nexport interface JsonEditorEvent {\n  type: 'apply' | 'format' | 'validation';\n  payload: JsonValidationResult;\n}\n\n@Component({\n  selector: 'json-config-editor',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatCardModule\n  ],\n  template: `\n    <div class=\"json-config-editor\">\n      <!-- Educational Card -->\n      <mat-card class=\"educational-card\">\n        <mat-card-header>\n          <mat-icon mat-card-avatar class=\"card-icon\">data_object</mat-icon>\n          <mat-card-title>Edição Avançada JSON</mat-card-title>\n        </mat-card-header>\n        <mat-card-content>\n          <p><strong>Para usuários avançados:</strong> Esta seção permite ajustar todas as configurações da tabela\n            diretamente via JSON. <strong>Atenção:</strong> Alterações aqui podem sobrescrever configurações\n            visuais nas outras abas.</p>\n        </mat-card-content>\n      </mat-card>\n\n      <!-- JSON Editor Section -->\n      <div class=\"json-editor-section\">\n        <div class=\"json-editor-toolbar\">\n          <button mat-button (click)=\"formatJson()\" [disabled]=\"!isValidJson\">\n            <mat-icon>format_align_left</mat-icon>\n            Formatar JSON\n          </button>\n          <button mat-button (click)=\"applyJsonChanges()\" [disabled]=\"!isValidJson\" color=\"primary\">\n            <mat-icon>check</mat-icon>\n            Aplicar JSON\n          </button>\n        </div>\n\n        <mat-form-field appearance=\"outline\" class=\"json-textarea-field\">\n          <mat-label>Configuração JSON</mat-label>\n          <textarea\n            matInput\n            [(ngModel)]=\"jsonText\"\n            (ngModelChange)=\"onJsonTextChange($event)\"\n            placeholder=\"Edite a configuração JSON aqui...\"\n            rows=\"20\"\n            spellcheck=\"false\"\n            class=\"json-textarea\">\n          </textarea>\n          <mat-hint *ngIf=\"isValidJson\" class=\"valid-hint\">JSON válido</mat-hint>\n          <mat-hint align=\"end\" *ngIf=\"isValidJson && unknownTopKeys.length\" class=\"valid-hint\" style=\"color: var(--mat-sys-secondary);\">\n            Aviso: chaves desconhecidas no topo — {{ unknownTopKeys.join(', ') }}\n          </mat-hint>\n          <mat-error *ngIf=\"!isValidJson && jsonText\">JSON inválido: {{ jsonError }}</mat-error>\n        </mat-form-field>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .json-config-editor {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n    }\n\n    .educational-card {\n      margin-bottom: 24px;\n      background-color: var(--mat-sys-surface-container-low);\n      border-left: 4px solid var(--mat-sys-primary);\n    }\n\n    .educational-card .mat-mdc-card-header {\n      padding-bottom: 8px;\n    }\n\n    .card-icon {\n      background-color: var(--mat-sys-primary-container);\n      color: var(--mat-sys-on-primary-container);\n      font-size: 20px;\n      width: 40px;\n      height: 40px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n\n    .educational-card .mat-mdc-card-title {\n      font-size: 1.1rem;\n      font-weight: 500;\n      color: var(--mat-sys-on-surface);\n    }\n\n    .educational-card .mat-mdc-card-content {\n      color: var(--mat-sys-on-surface-variant);\n      line-height: 1.5;\n    }\n\n    .json-editor-section {\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n    }\n\n    .json-editor-toolbar {\n      display: flex;\n      gap: 12px;\n      margin-bottom: 16px;\n      padding: 12px;\n      background-color: var(--mat-sys-surface-container-low);\n      border-radius: 8px;\n      border: 1px solid var(--mat-sys-outline-variant);\n    }\n\n    .json-textarea-field {\n      width: 100%;\n      flex: 1;\n    }\n\n    .json-textarea {\n      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n      font-size: 13px !important;\n      line-height: 1.4 !important;\n      height: 100% !important;\n      min-height: 300px !important;\n      white-space: pre !important;\n      overflow-wrap: normal !important;\n      overflow-x: auto !important;\n      resize: none !important;\n    }\n\n    .valid-hint {\n      color: var(--mat-sys-primary) !important;\n    }\n\n    /* Responsividade */\n    @media (max-width: 768px) {\n      .json-editor-toolbar {\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .json-textarea {\n        font-size: 12px !important;\n        min-height: 300px !important;\n      }\n    }\n  `]\n})\nexport class JsonConfigEditorComponent implements OnInit, OnDestroy {\n\n  @Input() config: TableConfig | null = null;\n  @Output() configChange = new EventEmitter<TableConfig>();\n  @Output() validationChange = new EventEmitter<JsonValidationResult>();\n  @Output() editorEvent = new EventEmitter<JsonEditorEvent>();\n\n  // JSON editing state\n  jsonText = '';\n  isValidJson = true;\n  jsonError = '';\n  unknownTopKeys: string[] = [];\n\n  // Subjects para cleanup e debouncing\n  private destroy$ = new Subject<void>();\n  private jsonTextChanges$ = new Subject<string>();\n\n  constructor(private cdr: ChangeDetectorRef) {\n    // Setup debounced JSON validation\n    this.jsonTextChanges$\n      .pipe(\n        debounceTime(300),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(text => {\n        this.validateJson(text);\n      });\n  }\n\n  ngOnInit(): void {\n    // Inicializar texto JSON com a configuração recebida\n    if (this.config) {\n      this.jsonText = JSON.stringify(this.config, null, 2);\n      this.validateJson(this.jsonText);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  onJsonTextChange(text: string): void {\n    this.jsonTextChanges$.next(text);\n  }\n\n  applyJsonChanges(): void {\n    if (!this.isValidJson) {\n      return;\n    }\n\n    try {\n      const newConfig = JSON.parse(this.jsonText) as TableConfig;\n\n      // Emitir a nova configuração\n      this.configChange.emit(newConfig);\n\n      // Emitir evento de aplicação\n      this.editorEvent.emit({\n        type: 'apply',\n        payload: {\n          isValid: true,\n          config: newConfig\n        }\n      });\n\n    } catch (error) {\n      const errorResult: JsonValidationResult = {\n        isValid: false,\n        error: 'Erro ao aplicar configuração JSON'\n      };\n\n      this.editorEvent.emit({\n        type: 'apply',\n        payload: errorResult\n      });\n    }\n  }\n\n  formatJson(): void {\n    if (!this.isValidJson) {\n      return;\n    }\n\n    try {\n      const parsed = JSON.parse(this.jsonText);\n      this.jsonText = JSON.stringify(parsed, null, 2);\n\n      // Emitir evento de formatação\n      this.editorEvent.emit({\n        type: 'format',\n        payload: {\n          isValid: true,\n          config: parsed as TableConfig\n        }\n      });\n\n      this.cdr.markForCheck();\n\n    } catch (error) {\n      this.editorEvent.emit({\n        type: 'format',\n        payload: {\n          isValid: false,\n          error: 'Erro ao formatar JSON'\n        }\n      });\n    }\n  }\n\n  /**\n   * Método público para atualizar o JSON externamente\n   */\n  updateJsonFromConfig(config: TableConfig): void {\n    this.jsonText = JSON.stringify(config, null, 2);\n    this.validateJson(this.jsonText);\n  }\n\n  /**\n   * Método público para obter a configuração atual validada\n   */\n  getCurrentConfig(): TableConfig | null {\n    if (!this.isValidJson) {\n      return null;\n    }\n\n    try {\n      return JSON.parse(this.jsonText) as TableConfig;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Método público para verificar se há alterações\n   */\n  hasChanges(): boolean {\n    if (!this.config) {\n      return false;\n    }\n\n    const currentConfig = this.getCurrentConfig();\n    if (!currentConfig) {\n      return false;\n    }\n\n    return JSON.stringify(this.config) !== JSON.stringify(currentConfig);\n  }\n\n  private validateJson(text: string): void {\n    const result: JsonValidationResult = {\n      isValid: false,\n      error: undefined,\n      config: undefined\n    };\n\n    if (!text.trim()) {\n      result.error = 'JSON não pode estar vazio';\n      this.updateValidationState(result);\n      return;\n    }\n\n    try {\n      const parsed = JSON.parse(text);\n\n      // Validação básica da estrutura TableConfig\n      if (typeof parsed !== 'object' || parsed === null) {\n        throw new Error('Configuração deve ser um objeto');\n      }\n\n      if (!Array.isArray(parsed.columns)) {\n        throw new Error('Campo \"columns\" deve ser um array');\n      }\n\n      // Validação adicional para campos críticos\n      if (parsed.gridOptions && typeof parsed.gridOptions !== 'object') {\n        throw new Error('Campo \"gridOptions\" deve ser um objeto');\n      }\n\n      if (parsed.toolbar && typeof parsed.toolbar !== 'object') {\n        throw new Error('Campo \"toolbar\" deve ser um objeto');\n      }\n\n      result.isValid = true;\n      result.config = parsed as TableConfig;\n      // Detect unknown top-level keys (non-blocking)\n      try {\n        const allowed = [\n          'meta','columns','behavior','appearance','toolbar','actions','export','messages','localization','data','theme','performance','plugins','accessibility','rowConditionalStyles'\n        ];\n        const keys = Object.keys(parsed || {});\n        this.unknownTopKeys = keys.filter((k) => !allowed.includes(k));\n      } catch { this.unknownTopKeys = []; }\n      this.updateValidationState(result);\n\n    } catch (error) {\n      result.error = error instanceof Error ? error.message : 'Erro de sintaxe JSON';\n      this.updateValidationState(result);\n    }\n  }\n\n  private updateValidationState(result: JsonValidationResult): void {\n    this.isValidJson = result.isValid;\n    this.jsonError = result.error || '';\n\n    // Emitir evento de validação\n    this.validationChange.emit(result);\n\n    // Emitir evento genérico do editor\n    this.editorEvent.emit({\n      type: 'validation',\n      payload: result\n    });\n\n    this.cdr.markForCheck();\n  }\n}\n","// Types and interfaces for the Visual Formula Builder\n\nexport type FormulaType = \n  | 'none' \n  | 'concatenation' \n  | 'arithmetic' \n  | 'nested_property' \n  | 'conditional_mapping' \n  | 'default_value';\n\nexport interface FieldSchema {\n  name: string;\n  label: string;\n  type: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array';\n  path?: string; // For nested properties like 'address.city'\n}\n\nexport interface FormulaDefinition {\n  type: FormulaType;\n  params: any;\n  _generatedExpression?: string; // Auto-generated safe JS expression\n}\n\n// Specific parameter interfaces for each formula type\nexport interface ConcatenationParams {\n  fields: string[];\n  separator: string;\n  ignoreEmpty: boolean;\n}\n\nexport interface ArithmeticParams {\n  operator: '+' | '-' | '*' | '/';\n  operand1: string | number; // Field name or constant\n  operand2: string | number; // Field name or constant\n}\n\nexport interface NestedPropertyParams {\n  propertyPath: string;\n  fallbackValue?: any;\n}\n\nexport interface ConditionalMappingParams {\n  conditionField: string;\n  comparisonValue: any;\n  trueValue: any;\n  falseValue: any;\n  operator?: '===' | '!=' | '>' | '<' | '>=' | '<=';\n}\n\nexport interface DefaultValueParams {\n  originalField: string;\n  defaultValue: any;\n}\n\n// Union type for all parameter types\nexport type FormulaParams = \n  | ConcatenationParams \n  | ArithmeticParams \n  | NestedPropertyParams \n  | ConditionalMappingParams \n  | DefaultValueParams;\n\n// Formula template definitions\nexport interface FormulaTemplate {\n  type: FormulaType;\n  label: string;\n  description: string;\n  icon: string;\n  parameterSchema: FormulaParameterSchema[];\n}\n\nexport interface FormulaParameterSchema {\n  key: string;\n  label: string;\n  type: 'field' | 'text' | 'number' | 'boolean' | 'select' | 'value_input';\n  required: boolean;\n  options?: { value: any; label: string }[];\n  placeholder?: string;\n  hint?: string;\n  valueType?: 'string' | 'number' | 'boolean' | 'any'; // For value_input type\n}\n\n// Default formula templates\nexport const FORMULA_TEMPLATES: FormulaTemplate[] = [\n  {\n    type: 'none',\n    label: 'Campo Direto',\n    description: 'Usar valor direto de um campo sem transformação',\n    icon: 'data_object',\n    parameterSchema: []\n  },\n  {\n    type: 'concatenation',\n    label: 'Concatenação de Campos',\n    description: 'Combinar múltiplos campos com um separador',\n    icon: 'merge',\n    parameterSchema: [\n      {\n        key: 'fields',\n        label: 'Campos para concatenar',\n        type: 'field',\n        required: true,\n        hint: 'Selecione os campos que deseja unir'\n      },\n      {\n        key: 'separator',\n        label: 'Separador',\n        type: 'text',\n        required: false,\n        placeholder: ' ',\n        hint: 'Texto usado para separar os campos'\n      },\n      {\n        key: 'ignoreEmpty',\n        label: 'Ignorar campos vazios',\n        type: 'boolean',\n        required: false,\n        hint: 'Não incluir campos vazios na concatenação'\n      }\n    ]\n  },\n  {\n    type: 'arithmetic',\n    label: 'Cálculo Numérico',\n    description: 'Realizar operações matemáticas simples',\n    icon: 'calculate',\n    parameterSchema: [\n      {\n        key: 'operand1',\n        label: 'Primeiro operando',\n        type: 'value_input',\n        valueType: 'number',\n        required: true,\n        hint: 'Campo numérico ou valor constante'\n      },\n      {\n        key: 'operator',\n        label: 'Operação',\n        type: 'select',\n        required: true,\n        options: [\n          { value: '+', label: 'Adição (+)' },\n          { value: '-', label: 'Subtração (-)' },\n          { value: '*', label: 'Multiplicação (×)' },\n          { value: '/', label: 'Divisão (÷)' }\n        ]\n      },\n      {\n        key: 'operand2',\n        label: 'Segundo operando',\n        type: 'value_input',\n        valueType: 'number',\n        required: true,\n        hint: 'Campo numérico ou valor constante'\n      }\n    ]\n  },\n  {\n    type: 'nested_property',\n    label: 'Propriedade Aninhada',\n    description: 'Acessar propriedades de objetos aninhados',\n    icon: 'account_tree',\n    parameterSchema: [\n      {\n        key: 'propertyPath',\n        label: 'Caminho da propriedade',\n        type: 'text',\n        required: true,\n        placeholder: 'ex: address.city',\n        hint: 'Use ponto (.) para navegar em objetos aninhados'\n      },\n      {\n        key: 'fallbackValue',\n        label: 'Valor padrão',\n        type: 'text',\n        required: false,\n        placeholder: 'N/A',\n        hint: 'Valor retornado se a propriedade não existir'\n      }\n    ]\n  },\n  {\n    type: 'conditional_mapping',\n    label: 'Mapeamento Condicional',\n    description: 'Retornar diferentes valores baseado em uma condição',\n    icon: 'swap_horizontal_circle',\n    parameterSchema: [\n      {\n        key: 'conditionField',\n        label: 'Campo de condição',\n        type: 'field',\n        required: true,\n        hint: 'Campo usado para comparação'\n      },\n      {\n        key: 'operator',\n        label: 'Operador',\n        type: 'select',\n        required: true,\n        options: [\n          { value: '===', label: 'Igual a (===)' },\n          { value: '!=', label: 'Diferente de (!=)' },\n          { value: '>', label: 'Maior que (>)' },\n          { value: '<', label: 'Menor que (<)' },\n          { value: '>=', label: 'Maior ou igual (>=)' },\n          { value: '<=', label: 'Menor ou igual (<=)' }\n        ]\n      },\n      {\n        key: 'comparisonValue',\n        label: 'Valor de comparação',\n        type: 'value_input',\n        valueType: 'any',\n        required: true,\n        hint: 'Valor para comparar com o campo'\n      },\n      {\n        key: 'trueValue',\n        label: 'Valor se verdadeiro',\n        type: 'value_input',\n        valueType: 'any',\n        required: true,\n        hint: 'Valor retornado quando a condição é verdadeira'\n      },\n      {\n        key: 'falseValue',\n        label: 'Valor se falso',\n        type: 'value_input',\n        valueType: 'any',\n        required: true,\n        hint: 'Valor retornado quando a condição é falsa'\n      }\n    ]\n  },\n  {\n    type: 'default_value',\n    label: 'Valor Padrão se Vazio',\n    description: 'Usar um valor padrão quando o campo estiver vazio',\n    icon: 'rule',\n    parameterSchema: [\n      {\n        key: 'originalField',\n        label: 'Campo original',\n        type: 'field',\n        required: true,\n        hint: 'Campo principal a ser verificado'\n      },\n      {\n        key: 'defaultValue',\n        label: 'Valor padrão',\n        type: 'value_input',\n        valueType: 'any',\n        required: true,\n        placeholder: 'N/A',\n        hint: 'Valor usado quando o campo estiver vazio'\n      }\n    ]\n  }\n];","import { Injectable } from '@angular/core';\nimport { \n  FormulaDefinition, \n  FormulaType, \n  ConcatenationParams, \n  ArithmeticParams, \n  NestedPropertyParams, \n  ConditionalMappingParams, \n  DefaultValueParams \n} from './formula-types';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class FormulaGeneratorService {\n\n  /**\n   * Generates a safe JavaScript expression from a formula definition\n   */\n  generateExpression(formula: FormulaDefinition): string {\n    switch (formula.type) {\n      case 'none':\n        return '';\n      case 'concatenation':\n        return this.generateConcatenationExpression(formula.params as ConcatenationParams);\n      case 'arithmetic':\n        return this.generateArithmeticExpression(formula.params as ArithmeticParams);\n      case 'nested_property':\n        return this.generateNestedPropertyExpression(formula.params as NestedPropertyParams);\n      case 'conditional_mapping':\n        return this.generateConditionalMappingExpression(formula.params as ConditionalMappingParams);\n      case 'default_value':\n        return this.generateDefaultValueExpression(formula.params as DefaultValueParams);\n      default:\n        return '';\n    }\n  }\n\n  /**\n   * Validates a formula definition\n   */\n  validateFormula(formula: FormulaDefinition): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (!formula.type || formula.type === 'none') {\n      return { valid: true, errors: [] };\n    }\n\n    switch (formula.type) {\n      case 'concatenation':\n        return this.validateConcatenationParams(formula.params as ConcatenationParams);\n      case 'arithmetic':\n        return this.validateArithmeticParams(formula.params as ArithmeticParams);\n      case 'nested_property':\n        return this.validateNestedPropertyParams(formula.params as NestedPropertyParams);\n      case 'conditional_mapping':\n        return this.validateConditionalMappingParams(formula.params as ConditionalMappingParams);\n      case 'default_value':\n        return this.validateDefaultValueParams(formula.params as DefaultValueParams);\n      default:\n        errors.push('Tipo de fórmula não reconhecido');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // Private expression generators\n  private generateConcatenationExpression(params: ConcatenationParams): string {\n    if (!params.fields || params.fields.length === 0) {\n      return '';\n    }\n\n    const separator = this.sanitizeStringValue(params.separator || ' ');\n    const fieldExpressions = params.fields.map(field => \n      `(rowData.${this.sanitizeFieldName(field)} || '')`\n    );\n    \n    if (params.ignoreEmpty) {\n      // Filter out empty values (null, undefined, empty string, whitespace-only)\n      return `[${fieldExpressions.join(', ')}].filter(v => v && String(v).trim() !== '').join('${separator}')`;\n    } else {\n      // Include empty values but convert them to empty strings (preserves field positions)\n      // However, use smart joining to avoid unwanted separators\n      return `[${fieldExpressions.join(', ')}].map(v => v || '').filter(v => v !== '').join('${separator}')`;\n    }\n  }\n\n  private generateArithmeticExpression(params: ArithmeticParams): string {\n    const operand1 = this.parseOperand(params.operand1);\n    const operand2 = this.parseOperand(params.operand2);\n    const operator = this.sanitizeOperator(params.operator);\n\n    return `(${operand1} ${operator} ${operand2})`;\n  }\n\n  private generateNestedPropertyExpression(params: NestedPropertyParams): string {\n    const safePath = this.generateSafePropertyPath(params.propertyPath);\n    const fallback = params.fallbackValue !== undefined \n      ? this.sanitizeStringValue(params.fallbackValue) \n      : 'null';\n\n    return `(${safePath} ?? '${fallback}')`;\n  }\n\n  private generateConditionalMappingExpression(params: ConditionalMappingParams): string {\n    const fieldAccess = `rowData.${this.sanitizeFieldName(params.conditionField)}`;\n    const operator = this.sanitizeOperator(params.operator || '===');\n    const comparisonValue = this.sanitizeValue(params.comparisonValue);\n    const trueValueFormatted = this.sanitizeValue(params.trueValue);\n    const falseValueFormatted = this.sanitizeValue(params.falseValue);\n\n    return `(${fieldAccess} ${operator} ${comparisonValue} ? ${trueValueFormatted} : ${falseValueFormatted})`;\n  }\n\n  private generateDefaultValueExpression(params: DefaultValueParams): string {\n    const fieldAccess = `rowData.${this.sanitizeFieldName(params.originalField)}`;\n    const defaultValueFormatted = this.sanitizeValue(params.defaultValue);\n\n    return `(${fieldAccess} || ${defaultValueFormatted})`;\n  }\n\n  // Private validation methods\n  private validateConcatenationParams(params: ConcatenationParams): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    \n    if (!params.fields || params.fields.length === 0) {\n      errors.push('Pelo menos um campo deve ser selecionado para concatenação');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  private validateArithmeticParams(params: ArithmeticParams): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    \n    if (!params.operand1) {\n      errors.push('Primeiro operando é obrigatório');\n    }\n    \n    if (!params.operand2) {\n      errors.push('Segundo operando é obrigatório');\n    }\n    \n    if (!params.operator) {\n      errors.push('Operador é obrigatório');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  private validateNestedPropertyParams(params: NestedPropertyParams): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    \n    if (!params.propertyPath) {\n      errors.push('Caminho da propriedade é obrigatório');\n    } else if (!this.isValidPropertyPath(params.propertyPath)) {\n      errors.push('Caminho da propriedade inválido');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  private validateConditionalMappingParams(params: ConditionalMappingParams): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    \n    if (!params.conditionField) {\n      errors.push('Campo de condição é obrigatório');\n    }\n    \n    if (params.comparisonValue === undefined || params.comparisonValue === '') {\n      errors.push('Valor de comparação é obrigatório');\n    }\n    \n    if (!params.trueValue) {\n      errors.push('Valor se verdadeiro é obrigatório');\n    }\n    \n    if (!params.falseValue) {\n      errors.push('Valor se falso é obrigatório');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  private validateDefaultValueParams(params: DefaultValueParams): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n    \n    if (!params.originalField) {\n      errors.push('Campo original é obrigatório');\n    }\n    \n    if (!params.defaultValue) {\n      errors.push('Valor padrão é obrigatório');\n    }\n\n    return { valid: errors.length === 0, errors };\n  }\n\n  // Utility methods for safe expression generation\n  private sanitizeFieldName(fieldName: string): string {\n    // Only allow alphanumeric characters, underscores, and dots\n    return fieldName.replace(/[^a-zA-Z0-9_.]/g, '');\n  }\n\n  private sanitizeStringValue(value: any): string {\n    if (value === null || value === undefined) {\n      return '';\n    }\n    // Escape single quotes and backslashes\n    return String(value).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n  }\n\n  private sanitizeValue(value: any): string {\n    if (typeof value === 'string') {\n      return `'${this.sanitizeStringValue(value)}'`;\n    } else if (typeof value === 'number') {\n      return String(value);\n    } else if (typeof value === 'boolean') {\n      return String(value);\n    } else {\n      return `'${this.sanitizeStringValue(value)}'`;\n    }\n  }\n\n  private sanitizeOperator(operator: string): string {\n    const allowedOperators = ['+', '-', '*', '/', '===', '!=', '>', '<', '>=', '<='];\n    return allowedOperators.includes(operator) ? operator : '===';\n  }\n\n  private parseOperand(operand: string | number): string {\n    if (typeof operand === 'number') {\n      return String(operand);\n    } else if (typeof operand === 'string') {\n      // Check if it's a number string\n      const numValue = parseFloat(operand);\n      if (!isNaN(numValue) && isFinite(numValue)) {\n        return String(numValue);\n      } else {\n        // Treat as field name\n        return `(rowData.${this.sanitizeFieldName(operand)} || 0)`;\n      }\n    }\n    return '0';\n  }\n\n  private generateSafePropertyPath(path: string): string {\n    const sanitizedPath = this.sanitizeFieldName(path);\n    const parts = sanitizedPath.split('.');\n    \n    if (parts.length === 1) {\n      return `rowData.${parts[0]}`;\n    }\n    \n    // Generate safe optional chaining\n    let safePath = 'rowData';\n    for (const part of parts) {\n      safePath += `?.${part}`;\n    }\n    \n    return safePath;\n  }\n\n  private isValidPropertyPath(path: string): boolean {\n    // Basic validation for property path\n    return /^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(path);\n  }\n\n  /**\n   * Get a sample data object for testing formulas\n   */\n  getSampleData(): any {\n    return {\n      id: 1,\n      firstName: 'João',\n      lastName: 'Silva',\n      email: 'joao.silva@example.com',\n      age: 30,\n      salary: 5000,\n      status: 'active',\n      address: {\n        city: 'São Paulo',\n        state: 'SP',\n        zipCode: '01234-567'\n      },\n      isActive: true,\n      lastLogin: new Date().toISOString(),\n      tags: ['employee', 'developer']\n    };\n  }\n\n  /**\n   * Test a formula with sample data\n   */\n  testFormula(formula: FormulaDefinition, sampleData?: any): { success: boolean; result?: any; error?: string } {\n    try {\n      const expression = this.generateExpression(formula);\n      if (!expression) {\n        return { success: true, result: null };\n      }\n\n      const testData = sampleData || this.getSampleData();\n      const testFunction = new Function('rowData', `return ${expression}`);\n      const result = testFunction(testData);\n\n      return { success: true, result };\n    } catch (error) {\n      return { \n        success: false, \n        error: error instanceof Error ? error.message : 'Erro desconhecido' \n      };\n    }\n  }\n}","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectorRef,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport {\n  MatCheckboxModule,\n  MatCheckboxChange,\n} from '@angular/material/checkbox';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport {\n  FormulaDefinition,\n  FieldSchema,\n  FormulaType,\n  FORMULA_TEMPLATES,\n  FormulaTemplate,\n  FormulaParameterSchema,\n} from './formula-types';\nimport { FormulaGeneratorService } from './formula-generator.service';\n\n@Component({\n  selector: 'visual-formula-builder',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatCardModule,\n    MatChipsModule,\n    MatTooltipModule,\n    MatExpansionModule,\n    MatDividerModule,\n    MatButtonToggleModule,\n    PraxisIconDirective,\n  ],\n  template: `\n    <div class=\"visual-formula-builder\">\n      <!-- Formula Type Selection -->\n      <mat-card class=\"formula-type-card\">\n        <mat-card-header class=\"compact-header\">\n          <mat-icon mat-card-avatar class=\"formula-icon\" [praxisIcon]=\"'functions'\"></mat-icon>\n          <mat-card-title>Construtor de Fórmulas</mat-card-title>\n          <mat-card-subtitle\n            >Configure como o valor da coluna será calculado</mat-card-subtitle\n          >\n        </mat-card-header>\n        <mat-card-content>\n          <mat-form-field appearance=\"outline\" class=\"formula-type-select\">\n            <mat-label>Tipo de Fórmula</mat-label>\n            <mat-select\n              [(ngModel)]=\"selectedFormulaType\"\n              (ngModelChange)=\"onFormulaTypeChange($event)\"\n            >\n              <mat-option\n                *ngFor=\"let template of formulaTemplates\"\n                [value]=\"template.type\"\n              >\n                <div class=\"formula-option\">\n                  <mat-icon class=\"option-icon\" [praxisIcon]=\"template.icon\"></mat-icon>\n                  <div class=\"option-content\">\n                    <span class=\"option-label\">{{ template.label }}</span>\n                    <span class=\"option-description\">{{\n                      template.description\n                    }}</span>\n                  </div>\n                </div>\n              </mat-option>\n            </mat-select>\n            <mat-hint>Selecione como o valor será calculado</mat-hint>\n          </mat-form-field>\n        </mat-card-content>\n      </mat-card>\n\n      <!-- Dynamic Parameter Builder -->\n      <mat-card\n        *ngIf=\"selectedTemplate && selectedTemplate.type !== 'none'\"\n        class=\"parameters-card\"\n      >\n        <mat-card-header class=\"compact-header\">\n          <mat-icon mat-card-avatar class=\"params-icon\">{{\n            selectedTemplate.icon\n          }}</mat-icon>\n          <mat-card-title>{{ selectedTemplate.label }}</mat-card-title>\n          <mat-card-subtitle>{{\n            selectedTemplate.description\n          }}</mat-card-subtitle>\n        </mat-card-header>\n        <mat-card-content>\n          <form class=\"parameters-form\">\n            <div\n              *ngFor=\"let paramSchema of selectedTemplate.parameterSchema\"\n              class=\"parameter-field\"\n            >\n              <!-- Field Selector -->\n              <mat-form-field\n                *ngIf=\"paramSchema.type === 'field'\"\n                appearance=\"outline\"\n                class=\"full-width\"\n              >\n                <mat-label>{{ paramSchema.label }}</mat-label>\n                <mat-select\n                  [(ngModel)]=\"currentParams[paramSchema.key]\"\n                  [name]=\"paramSchema.key\"\n                  [multiple]=\"isMultiSelectField(paramSchema.key)\"\n                  (ngModelChange)=\"onParameterChange()\"\n                >\n                  <mat-option\n                    *ngFor=\"let field of availableDataSchema\"\n                    [value]=\"field.name\"\n                  >\n                    <div class=\"field-option\">\n                      <mat-icon class=\"field-type-icon\">{{\n                        getFieldTypeIcon(field.type)\n                      }}</mat-icon>\n                      <div class=\"field-info\">\n                        <span class=\"field-label\">{{ field.label }}</span>\n                        <span class=\"field-name\">{{ field.name }}</span>\n                      </div>\n                    </div>\n                  </mat-option>\n                </mat-select>\n                <mat-hint>{{ paramSchema.hint }}</mat-hint>\n              </mat-form-field>\n\n              <!-- Text Input -->\n              <mat-form-field\n                *ngIf=\"paramSchema.type === 'text'\"\n                appearance=\"outline\"\n                class=\"full-width\"\n              >\n                <mat-label>{{ paramSchema.label }}</mat-label>\n                <input\n                  matInput\n                  [(ngModel)]=\"currentParams[paramSchema.key]\"\n                  [name]=\"paramSchema.key\"\n                  [placeholder]=\"paramSchema.placeholder || ''\"\n                  (ngModelChange)=\"onParameterChange()\"\n                />\n                <mat-hint>{{ paramSchema.hint }}</mat-hint>\n              </mat-form-field>\n\n              <!-- Number Input -->\n              <mat-form-field\n                *ngIf=\"paramSchema.type === 'number'\"\n                appearance=\"outline\"\n                class=\"full-width\"\n              >\n                <mat-label>{{ paramSchema.label }}</mat-label>\n                <input\n                  matInput\n                  type=\"number\"\n                  [(ngModel)]=\"currentParams[paramSchema.key]\"\n                  [name]=\"paramSchema.key\"\n                  [placeholder]=\"paramSchema.placeholder || ''\"\n                  (ngModelChange)=\"onParameterChange()\"\n                />\n                <mat-hint>{{ paramSchema.hint }}</mat-hint>\n              </mat-form-field>\n\n              <!-- Boolean Checkbox -->\n              <div\n                *ngIf=\"paramSchema.type === 'boolean'\"\n                class=\"checkbox-field\"\n              >\n                <mat-checkbox\n                  [(ngModel)]=\"currentParams[paramSchema.key]\"\n                  [name]=\"paramSchema.key\"\n                  (ngModelChange)=\"onParameterChange()\"\n                >\n                  {{ paramSchema.label }}\n                </mat-checkbox>\n                <div class=\"checkbox-hint\">{{ paramSchema.hint }}</div>\n              </div>\n\n              <!-- Select Dropdown -->\n              <mat-form-field\n                *ngIf=\"paramSchema.type === 'select'\"\n                appearance=\"outline\"\n                class=\"full-width\"\n              >\n                <mat-label>{{ paramSchema.label }}</mat-label>\n                <mat-select\n                  [(ngModel)]=\"currentParams[paramSchema.key]\"\n                  [name]=\"paramSchema.key\"\n                  (ngModelChange)=\"onParameterChange()\"\n                >\n                  <mat-option\n                    *ngFor=\"let option of paramSchema.options\"\n                    [value]=\"option.value\"\n                  >\n                    {{ option.label }}\n                  </mat-option>\n                </mat-select>\n                <mat-hint>{{ paramSchema.hint }}</mat-hint>\n              </mat-form-field>\n\n              <!-- Value Input - Field or Literal -->\n              <div\n                *ngIf=\"paramSchema.type === 'value_input'\"\n                class=\"value-input-container\"\n              >\n                <div class=\"value-input-selector\">\n                  <mat-button-toggle-group\n                    [value]=\"getValueInputMode(paramSchema.key)\"\n                    (valueChange)=\"\n                      onValueInputModeChange(paramSchema.key, $event)\n                    \"\n                    class=\"input-mode-toggle\"\n                  >\n                    <mat-button-toggle value=\"field\">\n                      <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n                      Campo\n                    </mat-button-toggle>\n                    <mat-button-toggle value=\"literal\">\n                      <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n                      Literal\n                    </mat-button-toggle>\n                  </mat-button-toggle-group>\n                </div>\n\n                <!-- Field Selection Mode -->\n                <mat-form-field\n                  *ngIf=\"getValueInputMode(paramSchema.key) === 'field'\"\n                  appearance=\"outline\"\n                  class=\"full-width\"\n                >\n                  <mat-label>{{ paramSchema.label }}</mat-label>\n                  <mat-select\n                    [value]=\"getValueInputValue(paramSchema.key)\"\n                    (valueChange)=\"\n                      onValueInputFieldChange(paramSchema.key, $event)\n                    \"\n                  >\n                    <mat-option\n                      *ngFor=\"let field of availableDataSchema\"\n                      [value]=\"field.name\"\n                    >\n                      <div class=\"field-option\">\n                        <mat-icon class=\"field-type-icon\">{{\n                          getFieldTypeIcon(field.type)\n                        }}</mat-icon>\n                        <div class=\"field-info\">\n                          <span class=\"field-label\">{{ field.label }}</span>\n                          <span class=\"field-name\">{{ field.name }}</span>\n                        </div>\n                      </div>\n                    </mat-option>\n                  </mat-select>\n                  <mat-hint>{{ paramSchema.hint }}</mat-hint>\n                </mat-form-field>\n\n                <!-- Literal Value Mode -->\n                <div\n                  *ngIf=\"getValueInputMode(paramSchema.key) === 'literal'\"\n                  class=\"literal-input-container\"\n                >\n                  <!-- String Input -->\n                  <mat-form-field\n                    *ngIf=\"\n                      paramSchema.valueType === 'string' ||\n                      paramSchema.valueType === 'any'\n                    \"\n                    appearance=\"outline\"\n                    class=\"full-width\"\n                  >\n                    <mat-label>{{ paramSchema.label }}</mat-label>\n                    <input\n                      matInput\n                      [value]=\"getValueInputValue(paramSchema.key)\"\n                      (input)=\"\n                        onValueInputLiteralChange(\n                          paramSchema.key,\n                          $any($event.target).value\n                        )\n                      \"\n                      [placeholder]=\"paramSchema.placeholder || ''\"\n                    />\n                    <mat-hint>{{ paramSchema.hint }}</mat-hint>\n                  </mat-form-field>\n\n                  <!-- Number Input -->\n                  <mat-form-field\n                    *ngIf=\"paramSchema.valueType === 'number'\"\n                    appearance=\"outline\"\n                    class=\"full-width\"\n                  >\n                    <mat-label>{{ paramSchema.label }}</mat-label>\n                    <input\n                      matInput\n                      type=\"number\"\n                      [value]=\"getValueInputValue(paramSchema.key)\"\n                      (input)=\"\n                        onValueInputLiteralChange(\n                          paramSchema.key,\n                          $any($event.target).value\n                        )\n                      \"\n                      [placeholder]=\"paramSchema.placeholder || ''\"\n                    />\n                    <mat-hint>{{ paramSchema.hint }}</mat-hint>\n                  </mat-form-field>\n\n                  <!-- Boolean Input -->\n                  <div\n                    *ngIf=\"paramSchema.valueType === 'boolean'\"\n                    class=\"checkbox-field\"\n                  >\n                    <mat-checkbox\n                      [checked]=\"getValueInputValue(paramSchema.key)\"\n                      (change)=\"\n                        onValueInputBooleanChange(paramSchema.key, $event)\n                      \"\n                    >\n                      {{ paramSchema.label }}\n                    </mat-checkbox>\n                    <div class=\"checkbox-hint\">{{ paramSchema.hint }}</div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </form>\n        </mat-card-content>\n      </mat-card>\n\n      <!-- Generated Expression Preview -->\n      <mat-card\n        *ngIf=\"generatedExpressionChange\"\n        class=\"expression-preview-card\"\n      >\n        <mat-card-header class=\"compact-header\">\n          <mat-icon mat-card-avatar class=\"preview-icon\" [praxisIcon]=\"'code'\"></mat-icon>\n          <mat-card-title>Expressão Gerada</mat-card-title>\n          <mat-card-subtitle\n            >Código JavaScript que será executado</mat-card-subtitle\n          >\n        </mat-card-header>\n        <mat-card-content>\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\n            <mat-label>Expressão JavaScript</mat-label>\n            <textarea\n              matInput\n              [value]=\"generatedExpressionChange\"\n              readonly\n              rows=\"3\"\n              class=\"expression-textarea\"\n            >\n            </textarea>\n            <mat-hint\n              >Esta expressão será avaliada para cada linha da tabela</mat-hint\n            >\n          </mat-form-field>\n        </mat-card-content>\n      </mat-card>\n\n      <!-- Formula Testing -->\n      <mat-expansion-panel *ngIf=\"generatedExpressionChange\" class=\"test-panel\">\n        <mat-expansion-panel-header>\n          <mat-panel-title>\n            <mat-icon [praxisIcon]=\"'science'\"></mat-icon>\n            Testar Fórmula\n          </mat-panel-title>\n          <mat-panel-description>\n            Teste a fórmula com dados de exemplo\n          </mat-panel-description>\n        </mat-expansion-panel-header>\n\n        <div class=\"test-content\">\n          <div class=\"test-actions\">\n            <button mat-raised-button color=\"primary\" (click)=\"testFormula()\">\n              <mat-icon [praxisIcon]=\"'play_arrow'\"></mat-icon>\n              Executar Teste\n            </button>\n            <button mat-button (click)=\"showSampleData = !showSampleData\">\n              <mat-icon [praxisIcon]=\"'data_object'\"></mat-icon>\n              {{ showSampleData ? 'Ocultar' : 'Ver' }} Dados de Teste\n            </button>\n          </div>\n\n          <mat-divider></mat-divider>\n\n          <!-- Sample Data Display -->\n          <div *ngIf=\"showSampleData\" class=\"sample-data-section\">\n            <h4>Dados de Exemplo:</h4>\n            <pre class=\"sample-data\">{{ sampleDataJson }}</pre>\n          </div>\n\n          <!-- Test Result -->\n          <div *ngIf=\"testResult\" class=\"test-result\">\n            <h4>Resultado do Teste:</h4>\n            <div *ngIf=\"testResult.success\" class=\"success-result\">\n              <mat-icon class=\"result-icon success\" [praxisIcon]=\"'check_circle'\"></mat-icon>\n              <span class=\"result-value\">{{\n                formatTestResult(testResult.result)\n              }}</span>\n            </div>\n            <div *ngIf=\"!testResult.success\" class=\"error-result\">\n              <mat-icon class=\"result-icon error\" [praxisIcon]=\"'error'\"></mat-icon>\n              <span class=\"error-message\">{{ testResult.error }}</span>\n            </div>\n          </div>\n\n          <!-- Validation Errors -->\n          <div *ngIf=\"validationErrors.length > 0\" class=\"validation-errors\">\n            <h4>Erros de Validação:</h4>\n            <mat-chip-set>\n              <mat-chip\n                *ngFor=\"let error of validationErrors\"\n                class=\"error-chip\"\n              >\n                <mat-icon matChipAvatar [praxisIcon]=\"'error'\"></mat-icon>\n                {{ error }}\n              </mat-chip>\n            </mat-chip-set>\n          </div>\n        </div>\n      </mat-expansion-panel>\n    </div>\n  `,\n  styles: [\n    `\n      :host { --vfb-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default))); --vfb-primary-container: var(--mat-sys-primary-container, color-mix(in srgb, var(--vfb-primary), transparent 85%)); --vfb-on-primary-container: var(--mat-sys-on-primary-container, #000); --vfb-surface-container-low: var(--mat-sys-surface-container-low, var(--md-sys-color-surface-container-low, var(--sicoob-bg-elev-1))); --vfb-surface-container: var(--mat-sys-surface-container, var(--md-sys-color-surface, var(--sicoob-bg-elev-1))); --vfb-outline: var(--mat-sys-outline, var(--md-sys-color-outline, var(--sicoob-stroke-medium))); --vfb-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%)); --vfb-error: var(--mat-sys-error, var(--md-sys-color-error, var(--sicoob-error-default))); --vfb-error-container: var(--mat-sys-error-container, color-mix(in srgb, var(--vfb-error), transparent 85%)); --vfb-on-error-container: var(--mat-sys-on-error-container, var(--vfb-error)); }\n      .visual-formula-builder {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .formula-type-card,\n      .parameters-card,\n      .expression-preview-card { background-color: var(--vfb-surface-container-low); }\n\n      .compact-header { padding-bottom: 8px; align-items: center; }\n      .compact-header .mat-mdc-card-title { font-size: 1.1rem; margin: 0; line-height: 1.2; }\n      .compact-header .mat-mdc-card-subtitle { font-size: .875rem; margin: 0; }\n      .compact-header .mat-mdc-card-avatar { align-self: center; }\n\n      .formula-icon,\n      .params-icon,\n      .preview-icon {\n        background-color: color-mix(in srgb, var(--vfb-primary), transparent 68%);\n        color: var(--vfb-primary);\n        border-radius: 50%;\n        width: 36px; height: 36px; font-size: 20px;\n        display: inline-flex; align-items: center; justify-content: center;\n      }\n\n      .formula-type-select {\n        width: 100%;\n      }\n\n      .formula-option {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 8px 0;\n      }\n\n      .option-icon { color: var(--vfb-primary); font-size: 20px; opacity: .95; }\n\n      .option-content {\n        display: flex;\n        flex-direction: column;\n      }\n\n      .option-label {\n        font-weight: 500;\n        font-size: 0.9rem;\n      }\n\n      .option-description { font-size: 0.8rem; color: var(--vfb-on-surface-variant); }\n\n      .parameters-form { display:flex; flex-direction:column; gap:16px; }\n\n      .parameter-field { display:flex; flex-direction:column; }\n\n      .full-width {\n        width: 100%;\n      }\n\n      .field-option {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .field-type-icon { font-size: 16px; color: var(--vfb-outline); }\n\n      .field-info {\n        display: flex;\n        flex-direction: column;\n      }\n\n      .field-label {\n        font-weight: 500;\n        font-size: 0.9rem;\n      }\n\n      .field-name { font-size: 0.8rem; color: var(--vfb-on-surface-variant); font-family: monospace; }\n\n      .checkbox-field {\n        padding: 8px 0;\n      }\n\n      .checkbox-hint { font-size: 0.75rem; color: var(--vfb-on-surface-variant); margin-top: 4px; margin-left: 32px; }\n\n      .expression-textarea {\n        font-family:\n          'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n        font-size: 13px !important;\n        line-height: 1.4 !important;\n      }\n\n      .test-panel {\n        margin-top: 8px;\n      }\n\n      .test-content {\n        padding: 16px 0;\n      }\n\n      .test-actions {\n        display: flex;\n        gap: 12px;\n        margin-bottom: 16px;\n      }\n\n      .sample-data-section {\n        margin: 16px 0;\n      }\n\n      .sample-data { background-color: var(--vfb-surface-container); padding: 12px; border-radius: 4px; font-size: 12px; overflow-x: auto; }\n\n      .test-result {\n        margin: 16px 0;\n      }\n\n      .success-result,\n      .error-result {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 12px;\n        border-radius: 4px;\n      }\n\n      .success-result { background-color: color-mix(in srgb, var(--vfb-primary), transparent 90%); color: var(--vfb-primary); }\n\n      .error-result { background-color: color-mix(in srgb, var(--vfb-error), transparent 90%); color: var(--vfb-error); }\n\n      .result-icon.success { color: var(--vfb-primary); }\n\n      .result-icon.error { color: var(--vfb-error); }\n\n      .result-value {\n        font-weight: 500;\n        font-family: monospace;\n      }\n\n      .validation-errors {\n        margin: 16px 0;\n      }\n\n      .error-chip { background-color: var(--vfb-error-container); color: var(--vfb-on-error-container); }\n\n      /* Value Input Styles */\n      .value-input-container {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n\n      .value-input-selector {\n        display: flex;\n        align-items: center;\n        margin-bottom: 8px;\n      }\n\n      .input-mode-toggle {\n        font-size: 0.875rem;\n      }\n\n      .input-mode-toggle .mat-button-toggle {\n        height: 36px;\n        display: flex;\n        align-items: center;\n        gap: 6px;\n      }\n\n      .literal-input-container {\n        width: 100%;\n      }\n\n      /* Responsive Design */\n      @media (max-width: 768px) {\n        .test-actions {\n          flex-direction: column;\n        }\n\n        .sample-data {\n          font-size: 10px;\n        }\n      }\n    `,\n  ],\n})\nexport class VisualFormulaBuilderComponent implements OnInit, OnChanges {\n  @Input() availableDataSchema: FieldSchema[] = [];\n  @Input() currentFormula?: FormulaDefinition;\n\n  @Output() formulaChange = new EventEmitter<FormulaDefinition>();\n  @Output() generatedExpressionChange = new EventEmitter<string>();\n\n  // Component state\n  formulaTemplates = FORMULA_TEMPLATES;\n  selectedFormulaType: FormulaType = 'none';\n  selectedTemplate?: FormulaTemplate;\n  currentParams: any = {};\n  generatedExpressionValue = '';\n  validationErrors: string[] = [];\n\n  // Value input tracking: maps parameter key to input mode and value\n  valueInputStates: {\n    [key: string]: { mode: 'field' | 'literal'; value: any };\n  } = {};\n\n  // Testing\n  showSampleData = false;\n  testResult?: { success: boolean; result?: any; error?: string };\n  sampleDataJson = '';\n\n  constructor(\n    private formulaGenerator: FormulaGeneratorService,\n    private cdr: ChangeDetectorRef,\n  ) {}\n\n  ngOnInit(): void {\n    this.sampleDataJson = JSON.stringify(\n      this.formulaGenerator.getSampleData(),\n      null,\n      2,\n    );\n    this.initializeFromCurrentFormula();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['currentFormula'] && !changes['currentFormula'].firstChange) {\n      this.initializeFromCurrentFormula();\n    }\n    if (changes['availableDataSchema']) {\n      this.cdr.markForCheck();\n    }\n  }\n\n  private initializeFromCurrentFormula(): void {\n    if (this.currentFormula) {\n      this.selectedFormulaType = this.currentFormula.type;\n      this.currentParams = { ...this.currentFormula.params };\n      this.updateSelectedTemplate();\n      this.generateAndEmitExpression();\n    }\n  }\n\n  onFormulaTypeChange(formulaType: FormulaType): void {\n    this.selectedFormulaType = formulaType;\n    this.currentParams = {};\n    this.updateSelectedTemplate();\n    this.generateAndEmitExpression();\n  }\n\n  private updateSelectedTemplate(): void {\n    this.selectedTemplate = this.formulaTemplates.find(\n      (t) => t.type === this.selectedFormulaType,\n    );\n    this.initializeValueInputStates();\n    this.cdr.markForCheck();\n  }\n\n  onParameterChange(): void {\n    this.generateAndEmitExpression();\n  }\n\n  private generateAndEmitExpression(): void {\n    const formula: FormulaDefinition = {\n      type: this.selectedFormulaType,\n      params: { ...this.currentParams },\n    };\n\n    // Validate formula\n    const validation = this.formulaGenerator.validateFormula(formula);\n    this.validationErrors = validation.errors;\n\n    // Generate expression\n    this.generatedExpressionValue = validation.valid\n      ? this.formulaGenerator.generateExpression(formula)\n      : '';\n\n    // Emit changes\n    this.formulaChange.emit(formula);\n    this.generatedExpressionChange.emit(this.generatedExpressionValue);\n\n    this.cdr.markForCheck();\n  }\n\n  get generatedExpression(): string {\n    return this.generatedExpressionValue;\n  }\n\n  isMultiSelectField(paramKey: string): boolean {\n    return paramKey === 'fields'; // Only 'fields' parameter supports multiple selection\n  }\n\n  getFieldTypeIcon(fieldType: string): string {\n    switch (fieldType) {\n      case 'string':\n        return 'text_fields';\n      case 'number':\n        return 'numbers';\n      case 'boolean':\n        return 'toggle_on';\n      case 'date':\n        return 'calendar_today';\n      case 'object':\n        return 'data_object';\n      case 'array':\n        return 'data_array';\n      default:\n        return 'help';\n    }\n  }\n\n  testFormula(): void {\n    if (!this.generatedExpressionValue) {\n      return;\n    }\n\n    const formula: FormulaDefinition = {\n      type: this.selectedFormulaType,\n      params: { ...this.currentParams },\n    };\n\n    this.testResult = this.formulaGenerator.testFormula(formula);\n    this.cdr.markForCheck();\n  }\n\n  formatTestResult(result: any): string {\n    if (result === null || result === undefined) {\n      return 'null';\n    }\n    if (typeof result === 'string') {\n      return `\"${result}\"`;\n    }\n    return String(result);\n  }\n\n  // Value Input Management Methods\n  getValueInputMode(paramKey: string): 'field' | 'literal' {\n    return this.valueInputStates[paramKey]?.mode || 'field';\n  }\n\n  getValueInputValue(paramKey: string): any {\n    return this.valueInputStates[paramKey]?.value || '';\n  }\n\n  onValueInputModeChange(paramKey: string, mode: 'field' | 'literal'): void {\n    if (!this.valueInputStates[paramKey]) {\n      this.valueInputStates[paramKey] = { mode, value: '' };\n    } else {\n      this.valueInputStates[paramKey].mode = mode;\n      // Reset value when switching modes\n      this.valueInputStates[paramKey].value = mode === 'field' ? '' : '';\n    }\n\n    // Update the actual parameter value\n    this.updateParameterFromValueInput(paramKey);\n  }\n\n  onValueInputFieldChange(paramKey: string, fieldName: string): void {\n    if (!this.valueInputStates[paramKey]) {\n      this.valueInputStates[paramKey] = { mode: 'field', value: fieldName };\n    } else {\n      this.valueInputStates[paramKey].value = fieldName;\n    }\n\n    this.updateParameterFromValueInput(paramKey);\n  }\n\n  onValueInputLiteralChange(paramKey: string, value: string): void {\n    const parsed =\n      !isNaN(Number(value)) && value.trim() !== '' ? Number(value) : value;\n\n    if (!this.valueInputStates[paramKey]) {\n      this.valueInputStates[paramKey] = { mode: 'literal', value: parsed };\n    } else {\n      this.valueInputStates[paramKey].value = parsed;\n    }\n\n    this.updateParameterFromValueInput(paramKey);\n  }\n\n  onValueInputBooleanChange(paramKey: string, change: MatCheckboxChange): void {\n    if (!this.valueInputStates[paramKey]) {\n      this.valueInputStates[paramKey] = {\n        mode: 'literal',\n        value: change.checked,\n      };\n    } else {\n      this.valueInputStates[paramKey].value = change.checked;\n    }\n\n    this.updateParameterFromValueInput(paramKey);\n  }\n\n  private updateParameterFromValueInput(paramKey: string): void {\n    const state = this.valueInputStates[paramKey];\n    if (state) {\n      // Store the value directly - the formula generator will handle field vs literal detection\n      this.currentParams[paramKey] = state.value;\n      this.generateAndEmitExpression();\n    }\n  }\n\n  private initializeValueInputStates(): void {\n    if (!this.selectedTemplate) return;\n\n    // Initialize value input states for value_input parameters\n    this.selectedTemplate.parameterSchema.forEach((schema) => {\n      if (schema.type === 'value_input') {\n        const currentValue = this.currentParams[schema.key];\n\n        if (currentValue !== undefined) {\n          // Try to determine if it's a field name or literal value\n          const isFieldName = this.availableDataSchema.some(\n            (field) => field.name === currentValue,\n          );\n\n          this.valueInputStates[schema.key] = {\n            mode: isFieldName ? 'field' : 'literal',\n            value: currentValue,\n          };\n        } else {\n          // Default to field mode\n          this.valueInputStates[schema.key] = {\n            mode: 'field',\n            value: '',\n          };\n        }\n      }\n    });\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectorRef,\n  ChangeDetectionStrategy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTableModule, MatTableDataSource } from '@angular/material/table';\nimport { MatCheckboxModule, MatCheckboxChange } from '@angular/material/checkbox';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\n\nexport interface ValueMappingPair {\n  key: string | number | boolean;\n  value: string;\n  keyInput: string; // For UI binding\n  hasError?: boolean;\n  errorMessage?: string;\n}\n\n@Component({\n  selector: 'value-mapping-editor',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatTableModule,\n    MatCheckboxModule,\n    MatTooltipModule,\n    MatExpansionModule,\n    MatDialogModule,\n    MatSnackBarModule\n  ],\n  template: `\n    <div class=\"value-mapping-editor\">\n      <!-- Header with Import/Export Actions -->\n      <div class=\"mapping-toolbar\">\n        <div class=\"toolbar-title\">\n          <mat-icon class=\"title-icon\">swap_horiz</mat-icon>\n          <h4>Mapeamento de Valores</h4>\n          @if (mappingPairs.length > 0) {\n            <span class=\"mapping-count\">\n              ({{ mappingPairs.length }} {{ mappingPairs.length === 1 ? 'definido' : 'definidos' }})\n            </span>\n          }\n        </div>\n\n        <div class=\"toolbar-actions\">\n          <button mat-stroked-button (click)=\"showImportDialog = true\"\n                  matTooltip=\"Importar mapeamentos de um arquivo JSON\">\n            <mat-icon>upload_file</mat-icon>\n            Importar JSON\n          </button>\n          <button mat-stroked-button (click)=\"exportToJson()\"\n                  [disabled]=\"mappingPairs.length === 0\"\n                  matTooltip=\"Exportar mapeamentos para um arquivo JSON\">\n            <mat-icon>download</mat-icon>\n            Exportar JSON\n          </button>\n        </div>\n      </div>\n\n      <!-- Mappings Table -->\n      <div class=\"mappings-container\">\n        <table mat-table [dataSource]=\"dataSource\" class=\"mappings-table\">\n\n          <!-- Key Column -->\n          <ng-container matColumnDef=\"key\">\n            <th mat-header-cell *matHeaderCellDef>{{ labelKey }}</th>\n            <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"key-cell\">\n\n              <!-- Text/Number Input -->\n              @if (keyInputType !== 'boolean') {\n                <mat-form-field appearance=\"outline\" class=\"key-input\">\n                  <input matInput\n                         [(ngModel)]=\"pair.keyInput\"\n                         [type]=\"keyInputType === 'number' ? 'number' : 'text'\"\n                         [placeholder]=\"getKeyPlaceholder()\"\n                         (ngModelChange)=\"onKeyChange(i, $event)\"\n                         [class.error-input]=\"pair.hasError\">\n                  @if (pair.hasError) {\n                    <mat-error>{{ pair.errorMessage }}</mat-error>\n                  }\n                </mat-form-field>\n              }\n\n              <!-- Boolean Checkbox -->\n              @if (keyInputType === 'boolean') {\n                <div class=\"boolean-key-container\">\n                  <mat-checkbox\n                    [checked]=\"isKeyTruthy(pair)\"\n                    (change)=\"onBooleanKeyChange(i, $event)\">\n                    {{ pair.key === true || pair.keyInput === 'true' ? 'Verdadeiro' : 'Falso' }}\n                  </mat-checkbox>\n                </div>\n              }\n            </td>\n          </ng-container>\n\n          <!-- Value Column -->\n          <ng-container matColumnDef=\"value\">\n            <th mat-header-cell *matHeaderCellDef>{{ labelValue }}</th>\n            <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"value-cell\">\n              <mat-form-field appearance=\"outline\" class=\"value-input\">\n                <input matInput\n                       [(ngModel)]=\"pair.value\"\n                       placeholder=\"Digite o texto de exibição\"\n                       (ngModelChange)=\"onValueChange(i, $event)\">\n              </mat-form-field>\n            </td>\n          </ng-container>\n\n          <!-- Actions Column -->\n          <ng-container matColumnDef=\"actions\">\n            <th mat-header-cell *matHeaderCellDef class=\"actions-header\">Ações</th>\n            <td mat-cell *matCellDef=\"let pair; let i = index\" class=\"actions-cell\">\n              <button mat-icon-button color=\"warn\"\n                      (click)=\"removePair(i)\"\n                      matTooltip=\"Remover mapeamento\">\n                <mat-icon>delete</mat-icon>\n              </button>\n            </td>\n          </ng-container>\n\n          <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n          <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n        </table>\n\n        <!-- Empty State -->\n        @if (mappingPairs.length === 0) {\n          <div class=\"empty-state\">\n            <mat-icon class=\"empty-icon\">swap_horiz</mat-icon>\n            <h4>Nenhum mapeamento definido</h4>\n            <p>Adicione mapeamentos para converter valores brutos em texto amigável</p>\n          </div>\n        }\n      </div>\n\n      <!-- Add New Mapping Button -->\n      <div class=\"add-mapping-section\">\n        <button mat-raised-button color=\"primary\"\n                (click)=\"addNewPair()\"\n                class=\"add-mapping-button\">\n          <mat-icon>add_circle_outline</mat-icon>\n          Adicionar Mapeamento\n        </button>\n      </div>\n\n      <!-- Import Dialog -->\n      @if (showImportDialog) {\n        <mat-expansion-panel class=\"import-panel\" [expanded]=\"true\">\n        <mat-expansion-panel-header>\n          <mat-panel-title>\n            <mat-icon>upload_file</mat-icon>\n            Importar JSON\n          </mat-panel-title>\n          <mat-panel-description>\n            Cole ou digite o JSON dos mapeamentos\n          </mat-panel-description>\n        </mat-expansion-panel-header>\n\n        <div class=\"import-content\">\n          <mat-form-field appearance=\"outline\" class=\"json-input\">\n            <mat-label>JSON dos Mapeamentos</mat-label>\n            <textarea matInput\n                      [(ngModel)]=\"importJsonText\"\n                      rows=\"8\"\n                      placeholder='{\"1\": \"Ativo\", \"0\": \"Inativo\"}'\n                      class=\"json-textarea\"></textarea>\n            <mat-hint>Cole um objeto JSON com pares chave-valor</mat-hint>\n          </mat-form-field>\n\n          <div class=\"import-actions\">\n            <button mat-button (click)=\"cancelImport()\">\n              Cancelar\n            </button>\n            <button mat-raised-button color=\"primary\"\n                    (click)=\"importFromJson()\"\n                    [disabled]=\"!importJsonText\">\n              <mat-icon>check</mat-icon>\n              Importar\n            </button>\n          </div>\n\n          @if (importError) {\n            <div class=\"import-error\">\n              <mat-icon>error</mat-icon>\n              {{ importError }}\n            </div>\n          }\n        </div>\n      </mat-expansion-panel>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      /* Bridge tokens to respect host app theme (Material/Sicoob) */\n      --vme-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default)));\n      --vme-surface: var(--mat-sys-surface, var(--md-sys-color-surface, var(--sicoob-bg-elev-1)));\n      --vme-surface-container: var(--mat-sys-surface-container, var(--sicoob-bg-elev-2));\n      --vme-on-surface: var(--mat-sys-on-surface, var(--sicoob-text-high));\n      --vme-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n      --vme-outline-variant: var(--mat-sys-outline-variant, var(--sicoob-stroke-medium));\n      --vme-error: var(--mat-sys-error, var(--sicoob-error-default));\n      --vme-error-container: var(--mat-sys-error-container, color-mix(in srgb, var(--sicoob-error-default), transparent 85%));\n      --vme-on-error-container: var(--mat-sys-on-error-container, var(--sicoob-error-default));\n    }\n    .value-mapping-editor {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n    }\n\n    .mapping-toolbar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 12px 0;\n      border-bottom: 1px solid var(--vme-outline-variant);\n    }\n\n    .toolbar-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .title-icon { color: var(--vme-primary); }\n\n    .toolbar-title h4 {\n      margin: 0;\n      font-size: 1rem;\n      font-weight: 500;\n    }\n\n    .mapping-count { color: var(--vme-on-surface-variant); font-size: 0.875rem; }\n\n    .toolbar-actions {\n      display: flex;\n      gap: 8px;\n    }\n\n    /* Theming for disabled export button (outlined) in dark/light */\n    .toolbar-actions .mat-mdc-outlined-button.mdc-button--disabled {\n      color: color-mix(in srgb, var(--vme-on-surface), transparent 40%);\n      border-color: color-mix(in srgb, var(--vme-outline-variant), transparent 20%);\n      background: color-mix(in srgb, var(--vme-surface-container), transparent 85%);\n    }\n    .toolbar-actions .mat-mdc-outlined-button.mdc-button--disabled .mat-icon {\n      color: color-mix(in srgb, var(--vme-on-surface), transparent 55%);\n    }\n\n    .mappings-container { min-height: 200px; border: 1px solid var(--vme-outline-variant); border-radius: 8px; overflow: hidden; background: var(--vme-surface); }\n\n    .mappings-table { width: 100%; }\n    .mappings-table .mat-mdc-header-row { background: var(--vme-surface-container); }\n    .mappings-table .mat-mdc-header-cell { color: var(--vme-on-surface); font-weight: 600; border-bottom-color: var(--vme-outline-variant); }\n\n    .key-cell,\n    .value-cell {\n      padding: 8px 12px;\n    }\n\n    .key-input,\n    .value-input {\n      width: 100%;\n    }\n\n    .key-input .mat-mdc-form-field-infix,\n    .value-input .mat-mdc-form-field-infix {\n      min-height: 40px;\n    }\n\n    .boolean-key-container {\n      display: flex;\n      align-items: center;\n      min-height: 40px;\n    }\n\n    .error-input { border-color: var(--vme-error) !important; }\n\n    .actions-header {\n      width: 80px;\n      text-align: center;\n    }\n\n    .actions-cell {\n      text-align: center;\n      padding: 8px;\n    }\n\n    .empty-state { display:flex; flex-direction:column; align-items:center; justify-content:center; padding:48px 24px; text-align:center; color: var(--vme-on-surface-variant); }\n\n    .empty-icon {\n      font-size: 48px;\n      width: 48px;\n      height: 48px;\n      margin-bottom: 16px;\n      opacity: 0.5;\n    }\n\n    .empty-state h4 {\n      margin: 0 0 8px 0;\n      font-weight: 500;\n    }\n\n    .empty-state p {\n      margin: 0;\n      font-size: 0.875rem;\n    }\n\n    .add-mapping-section {\n      display: flex;\n      justify-content: center;\n      padding: 16px 0;\n    }\n\n    .add-mapping-button {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n\n    .import-panel {\n      margin-top: 16px;\n    }\n\n    .import-content {\n      padding: 16px 0;\n    }\n\n    .json-input {\n      width: 100%;\n      margin-bottom: 16px;\n    }\n\n    .json-textarea {\n      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace !important;\n      font-size: 13px !important;\n      line-height: 1.4 !important;\n    }\n\n    .import-actions {\n      display: flex;\n      gap: 8px;\n      justify-content: flex-end;\n    }\n\n    .import-error { display:flex; align-items:center; gap:8px; margin-top:16px; padding:12px; background-color: var(--vme-error-container); color: var(--vme-on-error-container); border-radius:4px; font-size:.875rem; }\n\n    /* Responsive Design */\n    @media (max-width: 768px) {\n      .mapping-toolbar {\n        flex-direction: column;\n        gap: 12px;\n        align-items: stretch;\n      }\n\n      .toolbar-actions {\n        justify-content: center;\n      }\n\n      .mappings-table {\n        font-size: 0.875rem;\n      }\n\n      .key-input,\n      .value-input {\n        font-size: 0.875rem;\n      }\n    }\n  `]\n})\nexport class ValueMappingEditorComponent implements OnInit, OnChanges {\n\n  @Input() currentMapping: { [key: string | number]: string } = {};\n  @Input() keyInputType: 'text' | 'number' | 'boolean' = 'text';\n  @Input() labelKey: string = 'Valor Original';\n  @Input() labelValue: string = 'Valor Exibido';\n\n  @Output() mappingChange = new EventEmitter<{ [key: string | number]: string }>();\n\n  // Component state\n  mappingPairs: ValueMappingPair[] = [];\n  dataSource = new MatTableDataSource<ValueMappingPair>([]);\n  displayedColumns = ['key', 'value', 'actions'];\n\n  // Import/Export state\n  showImportDialog = false;\n  importJsonText = '';\n  importError = '';\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    private dialog: MatDialog,\n    private snackBar: MatSnackBar\n  ) {}\n\n  ngOnInit(): void {\n    this.initializeMappingPairs();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['currentMapping']) {\n      this.initializeMappingPairs();\n    }\n  }\n\n\n  private initializeMappingPairs(): void {\n    this.mappingPairs = Object.entries(this.currentMapping || {}).map(([key, value]) => ({\n      key: this.parseKeyByType(key),\n      value: value,\n      keyInput: String(key)\n    }));\n    this.updateDataSource();\n  }\n\n  private updateDataSource(): void {\n    console.log('🔄 updateDataSource() - Atualizando MatTable DataSource:', {\n      newDataLength: this.mappingPairs.length,\n      newData: [...this.mappingPairs]\n    });\n    \n    this.dataSource.data = [...this.mappingPairs];\n    \n    // 🔍 LOG: Verificar estado após atualização do DataSource\n    console.log('🔍 Estado após update do DataSource:', {\n      mappingPairsLength: this.mappingPairs.length,\n      dataSourceLength: this.dataSource.data.length,\n      shouldShowEmptyState: this.mappingPairs.length === 0,\n      shouldShowTable: this.mappingPairs.length > 0\n    });\n    \n    this.cdr.markForCheck();\n    \n    // 🔍 LOG: Forçar detecção adicional após markForCheck\n    setTimeout(() => {\n      console.log('🎯 Estado após ChangeDetection (async):', {\n        mappingPairsLength: this.mappingPairs.length,\n        dataSourceLength: this.dataSource.data.length,\n        DOMShouldUpdate: true\n      });\n    }, 10);\n    \n    console.log('✅ DataSource atualizado - Tabela será re-renderizada');\n  }\n\n  private parseKeyByType(key: string): string | number | boolean {\n    switch (this.keyInputType) {\n      case 'number':\n        const num = parseFloat(key);\n        return isNaN(num) ? key : num;\n      case 'boolean':\n        return key.toLowerCase() === 'true';\n      default:\n        return key;\n    }\n  }\n\n  isKeyTruthy(pair: ValueMappingPair): boolean {\n    return pair.key === true || pair.keyInput === 'true';\n  }\n\n\n  getKeyPlaceholder(): string {\n    switch (this.keyInputType) {\n      case 'number':\n        return 'Ex: 1, 2, 3';\n      case 'text':\n        return 'Ex: ACTIVE, PENDING';\n      default:\n        return 'Digite o valor';\n    }\n  }\n\n  addNewPair(): void {\n    const newPair: ValueMappingPair = {\n      key: this.keyInputType === 'boolean' ? false : (this.keyInputType === 'number' ? 0 : ''),\n      value: '',\n      keyInput: this.keyInputType === 'boolean' ? 'false' : (this.keyInputType === 'number' ? '0' : '')\n    };\n\n    this.mappingPairs.push(newPair);\n    this.updateDataSource();\n    this.validateAndEmitMapping();\n  }\n\n\n  removePair(index: number): void {\n    if (index >= 0 && index < this.mappingPairs.length) {\n      this.mappingPairs.splice(index, 1);\n      this.updateDataSource();\n      this.validateAndEmitMapping();\n    }\n  }\n\n  onKeyChange(index: number, value: string): void {\n    if (index >= 0 && index < this.mappingPairs.length) {\n      this.mappingPairs[index].keyInput = value;\n      this.mappingPairs[index].key = this.parseKeyByType(value);\n      this.validateAndEmitMapping();\n    }\n  }\n\n  onBooleanKeyChange(index: number, change: MatCheckboxChange): void {\n    if (index >= 0 && index < this.mappingPairs.length) {\n      this.mappingPairs[index].key = change.checked;\n      this.mappingPairs[index].keyInput = String(change.checked);\n      this.validateAndEmitMapping();\n    }\n  }\n\n  onValueChange(index: number, value: string): void {\n    if (index >= 0 && index < this.mappingPairs.length) {\n      this.mappingPairs[index].value = value;\n      this.validateAndEmitMapping();\n    }\n  }\n\n  private validateAndEmitMapping(): void {\n    // Clear previous errors\n    this.mappingPairs.forEach(pair => {\n      pair.hasError = false;\n      pair.errorMessage = '';\n    });\n\n    // Validate for duplicate keys\n    const keyMap = new Map<string, number[]>();\n    this.mappingPairs.forEach((pair, index) => {\n      const keyStr = String(pair.key);\n      if (!keyMap.has(keyStr)) {\n        keyMap.set(keyStr, []);\n      }\n      keyMap.get(keyStr)!.push(index);\n    });\n\n    // Mark duplicates\n    let hasErrors = false;\n    keyMap.forEach((indices, key) => {\n      if (indices.length > 1) {\n        indices.forEach(index => {\n          this.mappingPairs[index].hasError = true;\n          this.mappingPairs[index].errorMessage = 'Chave duplicada';\n          hasErrors = true;\n        });\n      }\n    });\n\n    // Validate empty keys/values\n    this.mappingPairs.forEach(pair => {\n      if (!pair.hasError) {\n        if (pair.keyInput.trim() === '' || pair.value.trim() === '') {\n          pair.hasError = true;\n          pair.errorMessage = 'Campo obrigatório';\n          hasErrors = true;\n        }\n      }\n    });\n\n    // Emit mapping if no errors\n    if (!hasErrors) {\n      const mapping: { [key: string | number]: string } = {};\n      this.mappingPairs.forEach(pair => {\n        if (pair.keyInput.trim() !== '' && pair.value.trim() !== '') {\n          mapping[String(pair.key)] = pair.value;\n        }\n      });\n      \n      this.mappingChange.emit(mapping);\n    }\n\n    // Update the visual state to show validation errors\n    this.cdr.markForCheck();\n  }\n\n  // Import/Export functionality\n  exportToJson(): void {\n    const mapping = this.currentMapping || {};\n    const jsonString = JSON.stringify(mapping, null, 2);\n\n    const blob = new Blob([jsonString], { type: 'application/json' });\n    const url = URL.createObjectURL(blob);\n\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'value-mapping.json';\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n\n    this.snackBar.open('Mapeamento exportado com sucesso', 'Fechar', {\n      duration: 3000\n    });\n  }\n\n  importFromJson(): void {\n    this.importError = '';\n\n    try {\n      const parsed = JSON.parse(this.importJsonText);\n\n      // Validate structure\n      if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n        throw new Error('JSON deve ser um objeto');\n      }\n\n      // Validate key-value pairs\n      for (const [key, value] of Object.entries(parsed)) {\n        if (typeof value !== 'string') {\n          throw new Error(`Valor para chave \"${key}\" deve ser uma string`);\n        }\n      }\n\n      // Update mapping\n      this.currentMapping = parsed;\n      this.initializeMappingPairs();\n      this.mappingChange.emit(this.currentMapping);\n\n      this.cancelImport();\n      this.snackBar.open('Mapeamento importado com sucesso', 'Fechar', {\n        duration: 3000\n      });\n\n    } catch (error) {\n      this.importError = error instanceof Error ? error.message : 'Erro ao importar JSON';\n      this.cdr.markForCheck();\n    }\n  }\n\n  cancelImport(): void {\n    this.showImportDialog = false;\n    this.importJsonText = '';\n    this.importError = '';\n    this.cdr.markForCheck();\n  }\n}\n","// Types and interfaces for the Data Formatter component\n\nexport type ColumnDataType = \n  | 'date' \n  | 'number' \n  | 'currency' \n  | 'percentage' \n  | 'string' \n  | 'boolean'\n  | 'custom';\n\n// Base interface for all formatter options\nexport interface FormatterConfig {\n  type: ColumnDataType;\n  options: any;\n}\n\n// Date formatting options\nexport interface DateFormatterOptions {\n  preset?: string; // 'short' | 'medium' | 'long' | 'full' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate' | 'shortTime' | 'mediumTime' | 'longTime' | 'fullTime' | 'short' | 'custom'\n  customFormat?: string; // For custom Angular DatePipe patterns like 'dd/MM/yyyy HH:mm:ss'\n}\n\n// Number formatting options\nexport interface NumberFormatterOptions {\n  decimalPlaces?: 'fixed' | 'variable'; // Fixed or variable decimal places\n  fixedDecimals?: number; // 0, 1, 2, 3, etc.\n  minDecimals?: number; // For variable: minimum decimals\n  maxDecimals?: number; // For variable: maximum decimals\n  thousandsSeparator?: boolean; // Show thousands separator\n  signDisplay?: 'auto' | 'always' | 'never' | 'exceptZero'; // Sign display preference\n}\n\n// Currency formatting options\nexport interface CurrencyFormatterOptions {\n  currencyCode?: string; // 'BRL', 'USD', 'EUR', etc.\n  currencySymbol?: string; // 'R$', '$', '€', etc.\n  symbolPosition?: 'before' | 'after'; // Symbol position\n  symbolSpacing?: boolean; // Space between symbol and value\n  decimalPlaces?: number; // Number of decimal places\n  thousandsSeparator?: boolean; // Show thousands separator\n}\n\n// Percentage formatting options\nexport interface PercentageFormatterOptions {\n  decimalPlaces?: number; // Number of decimal places\n  showSymbol?: boolean; // Display % symbol\n  multiplier?: boolean; // Multiply by 100 (true for 0.1234 -> 12.34%, false for 12.34 -> 12.34%)\n}\n\n// String formatting options\nexport interface StringFormatterOptions {\n  transform?: 'none' | 'uppercase' | 'lowercase' | 'titlecase' | 'capitalize';\n  truncate?: boolean; // Enable text truncation\n  maxLength?: number; // Maximum text length\n  truncateSuffix?: string; // Suffix for truncated text (e.g., '...')\n}\n\n// Boolean formatting options\nexport interface BooleanFormatterOptions {\n  display?: 'true-false' | 'yes-no' | 'active-inactive' | 'on-off' | 'enabled-disabled' | 'custom';\n  trueValue?: string; // Custom true display text\n  falseValue?: string; // Custom false display text\n}\n\n// Predefined format presets for common use cases\nexport interface FormatPreset {\n  label: string;\n  description: string;\n  value: string; // The format string that will be stored\n  example: string; // Example of formatted output\n}\n\n// Date format presets\nexport const DATE_PRESETS: FormatPreset[] = [\n  {\n    label: 'Data Curta',\n    description: 'Formato curto (01/01/2023)',\n    value: 'shortDate',\n    example: '01/12/2023'\n  },\n  {\n    label: 'Data Média',\n    description: 'Formato médio (01 Jan 2023)',\n    value: 'mediumDate',\n    example: '01 dez 2023'\n  },\n  {\n    label: 'Data Completa',\n    description: 'Formato completo (01 de Janeiro de 2023)',\n    value: 'longDate',\n    example: '01 de dezembro de 2023'\n  },\n  {\n    label: 'Data Extensa',\n    description: 'Formato extenso com dia da semana',\n    value: 'fullDate',\n    example: 'sexta-feira, 01 de dezembro de 2023'\n  },\n  {\n    label: 'Apenas Mês/Ano',\n    description: 'Apenas mês e ano (Dez/2023)',\n    value: 'MMM/yyyy',\n    example: 'dez/2023'\n  },\n  {\n    label: 'Hora Curta',\n    description: 'Apenas hora (14:30)',\n    value: 'shortTime',\n    example: '14:30'\n  },\n  {\n    label: 'Data e Hora',\n    description: 'Data e hora completas',\n    value: 'short',\n    example: '01/12/2023 14:30'\n  },\n  {\n    label: 'ISO 8601',\n    description: 'Formato internacional',\n    value: 'yyyy-MM-dd',\n    example: '2023-12-01'\n  }\n];\n\n// Number format presets\nexport const NUMBER_PRESETS: FormatPreset[] = [\n  {\n    label: 'Número Inteiro',\n    description: 'Sem casas decimais',\n    value: '1.0-0',\n    example: '1.234'\n  },\n  {\n    label: '1 Casa Decimal',\n    description: 'Uma casa decimal fixa',\n    value: '1.1-1',\n    example: '1.234,5'\n  },\n  {\n    label: '2 Casas Decimais',\n    description: 'Duas casas decimais fixas',\n    value: '1.2-2',\n    example: '1.234,56'\n  },\n  {\n    label: 'Até 3 Decimais',\n    description: 'Até três casas decimais variáveis',\n    value: '1.0-3',\n    example: '1.234,567'\n  },\n  {\n    label: 'Sem Separador',\n    description: 'Número simples sem formatação',\n    value: '1.0-0|nosep',\n    example: '1234'\n  }\n];\n\n// Currency presets\nexport const CURRENCY_PRESETS: FormatPreset[] = [\n  {\n    label: 'Real Brasileiro (R$)',\n    description: 'Moeda brasileira',\n    value: 'BRL|symbol|2',\n    example: 'R$ 1.234,56'\n  },\n  {\n    label: 'Dólar Americano (US$)',\n    description: 'Moeda americana',\n    value: 'USD|symbol|2',\n    example: 'US$ 1,234.56'\n  },\n  {\n    label: 'Euro (€)',\n    description: 'Moeda europeia',\n    value: 'EUR|symbol|2',\n    example: '€ 1.234,56'\n  },\n  {\n    label: 'Apenas Código',\n    description: 'Mostrar apenas código da moeda',\n    value: 'BRL|code|2',\n    example: '1.234,56 BRL'\n  }\n];\n\n// Percentage presets\nexport const PERCENTAGE_PRESETS: FormatPreset[] = [\n  {\n    label: 'Percentual Simples',\n    description: 'Sem casas decimais',\n    value: '1.0-0',\n    example: '12%'\n  },\n  {\n    label: '1 Casa Decimal',\n    description: 'Uma casa decimal',\n    value: '1.1-1',\n    example: '12,3%'\n  },\n  {\n    label: '2 Casas Decimais',\n    description: 'Duas casas decimais',\n    value: '1.2-2',\n    example: '12,34%'\n  }\n];\n\n// String transform presets\nexport const STRING_PRESETS: FormatPreset[] = [\n  {\n    label: 'Normal',\n    description: 'Sem transformação',\n    value: 'none',\n    example: 'Texto Normal'\n  },\n  {\n    label: 'MAIÚSCULAS',\n    description: 'Todas em maiúsculas',\n    value: 'uppercase',\n    example: 'TEXTO NORMAL'\n  },\n  {\n    label: 'minúsculas',\n    description: 'Todas em minúsculas',\n    value: 'lowercase',\n    example: 'texto normal'\n  },\n  {\n    label: 'Capitalizar',\n    description: 'Primeira letra de cada palavra',\n    value: 'titlecase',\n    example: 'Texto Normal'\n  },\n  {\n    label: 'Primeira Maiúscula',\n    description: 'Apenas a primeira letra',\n    value: 'capitalize',\n    example: 'Texto normal'\n  }\n];\n\n// Boolean display presets\nexport const BOOLEAN_PRESETS: FormatPreset[] = [\n  {\n    label: 'Verdadeiro / Falso',\n    description: 'Exibição padrão',\n    value: 'true-false',\n    example: 'Verdadeiro / Falso'\n  },\n  {\n    label: 'Sim / Não',\n    description: 'Formato pergunta',\n    value: 'yes-no',\n    example: 'Sim / Não'\n  },\n  {\n    label: 'Ativo / Inativo',\n    description: 'Formato status',\n    value: 'active-inactive',\n    example: 'Ativo / Inativo'\n  },\n  {\n    label: 'Ligado / Desligado',\n    description: 'Formato switch',\n    value: 'on-off',\n    example: 'Ligado / Desligado'\n  },\n  {\n    label: 'Habilitado / Desabilitado',\n    description: 'Formato permissão',\n    value: 'enabled-disabled',\n    example: 'Habilitado / Desabilitado'\n  }\n];","import { Inject, Injectable, LOCALE_ID } from '@angular/core';\nimport {\n  DatePipe,\n  DecimalPipe,\n  CurrencyPipe,\n  PercentPipe,\n  UpperCasePipe,\n  LowerCasePipe,\n  TitleCasePipe,\n} from '@angular/common';\nimport { ColumnDataType } from './data-formatter-types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class DataFormattingService {\n  private groupSeparator: string;\n  private decimalSeparator: string;\n\n  constructor(\n    private datePipe: DatePipe,\n    private decimalPipe: DecimalPipe,\n    private currencyPipe: CurrencyPipe,\n    private percentPipe: PercentPipe,\n    private upperCasePipe: UpperCasePipe,\n    private lowerCasePipe: LowerCasePipe,\n    private titleCasePipe: TitleCasePipe,\n    @Inject(LOCALE_ID) private locale: string,\n  ) {\n    const parts = new Intl.NumberFormat(this.locale).formatToParts(12345.6);\n    this.groupSeparator = parts.find((p) => p.type === 'group')?.value || ',';\n    this.decimalSeparator =\n      parts.find((p) => p.type === 'decimal')?.value || '.';\n  }\n\n  /**\n   * Apply formatting to a value based on column type and format string\n   */\n  formatValue(\n    value: any,\n    columnType: ColumnDataType,\n    formatString: string,\n  ): any {\n    if (value === null || value === undefined) {\n      return value;\n    }\n\n    try {\n      // Coerce value to expected type\n      const coercedValue = this.coerceValueToType(value, columnType);\n\n      // Apply formatting based on column type\n      switch (columnType) {\n        case 'date':\n          return this.formatDate(coercedValue, formatString);\n        case 'number':\n          return this.formatNumber(coercedValue, formatString);\n        case 'currency':\n          return this.formatCurrency(coercedValue, formatString);\n        case 'percentage':\n          return this.formatPercentage(coercedValue, formatString);\n        case 'string':\n          return this.formatString(coercedValue, formatString);\n        case 'boolean':\n          return this.formatBoolean(coercedValue, formatString);\n        default:\n          return value;\n      }\n    } catch (error) {\n      console.warn(\n        `Error formatting value ${value} with type ${columnType} and format ${formatString}:`,\n        error,\n      );\n      return value; // Return original value on error\n    }\n  }\n\n  /**\n   * Coerce value to the expected type for formatting\n   */\n  private coerceValueToType(value: any, columnType: ColumnDataType): any {\n    switch (columnType) {\n      case 'date':\n        if (value instanceof Date) return value;\n        if (typeof value === 'string' || typeof value === 'number') {\n          let date = new Date(value);\n          if (typeof value === 'string' && isNaN(date.getTime())) {\n            const parts = value.split(',');\n            if (parts.length === 3) {\n              const [year, month, day] = parts.map(Number);\n              date = new Date(year, month - 1, day);\n            }\n          }\n          return isNaN(date.getTime()) ? null : date;\n        }\n        if (Array.isArray(value)) {\n          const [\n            year,\n            month = 1,\n            day = 1,\n            hour = 0,\n            minute = 0,\n            second = 0,\n            millisecond = 0,\n          ] = value;\n          const date = new Date(\n            Number(year),\n            Number(month) - 1,\n            Number(day),\n            Number(hour),\n            Number(minute),\n            Number(second),\n            Number(millisecond),\n          );\n          return isNaN(date.getTime()) ? null : date;\n        }\n        return null;\n\n      case 'number':\n      case 'currency':\n      case 'percentage':\n        if (typeof value === 'number') return value;\n        if (typeof value === 'string') {\n          const normalized = value\n            .replace(new RegExp(`\\\\${this.groupSeparator}`, 'g'), '')\n            .replace(this.decimalSeparator, '.');\n          const num = parseFloat(normalized);\n          return isNaN(num) ? 0 : num;\n        }\n        return 0;\n\n      case 'boolean':\n        if (typeof value === 'boolean') return value;\n        if (typeof value === 'string') {\n          return value.toLowerCase() === 'true' || value === '1';\n        }\n        if (typeof value === 'number') {\n          return value !== 0;\n        }\n        return Boolean(value);\n\n      case 'string':\n        return String(value);\n\n      default:\n        return value;\n    }\n  }\n\n  /**\n   * Format date values\n   */\n  private formatDate(value: Date | null, formatString: string): string {\n    if (!value) return '';\n\n    // Handle custom formats and presets\n    try {\n      return this.datePipe.transform(value, formatString) || '';\n    } catch {\n      return this.datePipe.transform(value, 'shortDate') || '';\n    }\n  }\n\n  /**\n   * Format number values\n   */\n  private formatNumber(value: number, formatString: string): string {\n    if (formatString.includes('|nosep')) {\n      // No thousands separator\n      const format = formatString.replace('|nosep', '');\n      const formatted =\n        this.decimalPipe.transform(value, format, this.locale) ||\n        value.toString();\n      return this.removeGrouping(formatted);\n    }\n\n    return (\n      this.decimalPipe.transform(value, formatString, this.locale) ||\n      value.toString()\n    );\n  }\n\n  /**\n   * Format currency values\n   */\n  private formatCurrency(value: number, formatString: string): string {\n    // Accept both compact and detailed formats:\n    // - \"BRL\" → code only (defaults: symbol, 2 decimals)\n    // - \"USD|code|0\" → code + display + decimals\n    // - \"EUR|symbol|2|nosep\" → with grouping removal\n    const parts = (formatString || '').split('|').filter((p) => p != null && p !== '');\n\n    const currencyCode = (parts[0] || 'BRL').trim();\n    const displayRaw = (parts[1] || '').trim();\n    const decimalsRaw = (parts[2] || '').trim();\n    const noSep = parts.includes('nosep');\n\n    const display: 'code' | 'symbol' = displayRaw === 'code' ? 'code' : 'symbol';\n    const decimals = /^\\d+$/.test(decimalsRaw) ? decimalsRaw : '2';\n    const digitsInfo = `1.${decimals}-${decimals}`;\n\n    const formatted =\n      this.currencyPipe.transform(\n        value,\n        currencyCode,\n        display,\n        digitsInfo,\n        this.locale,\n      ) || value.toString();\n\n    return noSep ? this.removeGrouping(formatted) : formatted;\n  }\n\n  /**\n   * Format percentage values\n   */\n  private formatPercentage(value: number, formatString: string): string {\n    if (formatString.includes('|x100')) {\n      const format = formatString.replace('|x100', '');\n      const formatted =\n        this.decimalPipe.transform(value * 100, format, this.locale) ||\n        (value * 100).toString();\n      return `${formatted}%`;\n    }\n\n    return (\n      this.percentPipe.transform(value, formatString, this.locale) ||\n      value.toString()\n    );\n  }\n\n  private removeGrouping(value: string): string {\n    return value.replace(new RegExp(`\\\\${this.groupSeparator}`, 'g'), '');\n  }\n\n  /**\n   * Format string values\n   */\n  private formatString(value: string, formatString: string): string {\n    if (!formatString || formatString === 'none') {\n      return value;\n    }\n\n    let result = value;\n\n    // Parse format for truncation: \"uppercase|truncate|50|...\"\n    if (formatString.includes('|truncate|')) {\n      const parts = formatString.split('|');\n      const transform = parts[0];\n      const maxLength = parseInt(parts[2]) || 50;\n      const suffix = parts[3] || '...';\n\n      // Apply text transformation first\n      result = this.applyStringTransform(result, transform);\n\n      // Then apply truncation\n      if (result.length > maxLength) {\n        result = result.substring(0, maxLength) + suffix;\n      }\n    } else {\n      // Apply only text transformation\n      result = this.applyStringTransform(result, formatString);\n    }\n\n    return result;\n  }\n\n  /**\n   * Apply string transformations\n   */\n  private applyStringTransform(value: string, transform: string): string {\n    switch (transform) {\n      case 'uppercase':\n        return this.upperCasePipe.transform(value);\n      case 'lowercase':\n        return this.lowerCasePipe.transform(value);\n      case 'titlecase':\n        return this.titleCasePipe.transform(value);\n      case 'capitalize':\n        return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();\n      default:\n        return value;\n    }\n  }\n\n  /**\n   * Format boolean values\n   */\n  private formatBoolean(value: boolean, formatString: string): string {\n    if (formatString.startsWith('custom|')) {\n      const parts = formatString.split('|');\n      const trueValue = parts[1] || 'Verdadeiro';\n      const falseValue = parts[2] || 'Falso';\n      return value ? trueValue : falseValue;\n    }\n\n    const displays: { [key: string]: { true: string; false: string } } = {\n      'true-false': { true: 'Verdadeiro', false: 'Falso' },\n      'yes-no': { true: 'Sim', false: 'Não' },\n      'active-inactive': { true: 'Ativo', false: 'Inativo' },\n      'on-off': { true: 'Ligado', false: 'Desligado' },\n      'enabled-disabled': { true: 'Habilitado', false: 'Desabilitado' },\n    };\n\n    const display = displays[formatString] || displays['true-false'];\n    return value ? display.true : display.false;\n  }\n\n  /**\n   * Check if formatting is needed for a column\n   */\n  needsFormatting(columnType: ColumnDataType, formatString: string): boolean {\n    return !!(formatString && formatString.trim() && columnType !== 'custom');\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectorRef,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport {\n  ColumnDataType,\n  FormatterConfig,\n  DATE_PRESETS,\n  NUMBER_PRESETS,\n  CURRENCY_PRESETS,\n  PERCENTAGE_PRESETS,\n  STRING_PRESETS,\n  BOOLEAN_PRESETS,\n  FormatPreset,\n} from './data-formatter-types';\nimport { DataFormattingService } from './data-formatting.service';\n\n@Component({\n  selector: 'data-formatter',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatCheckboxModule,\n    MatCardModule,\n    MatDividerModule,\n    MatTooltipModule,\n    MatChipsModule,\n    PraxisIconDirective,\n  ],\n  template: `\n    <div class=\"data-formatter\">\n      <!-- Header -->\n      <div class=\"formatter-header\">\n        <mat-icon class=\"header-icon\" [praxisIcon]=\"getTypeIcon()\"></mat-icon>\n        <div class=\"header-content\">\n          <h4>Formatação de {{ getTypeLabel() }}</h4>\n          <p class=\"header-description\">{{ getTypeDescription() }}</p>\n        </div>\n      </div>\n\n      <!-- Date Formatting -->\n      <div *ngIf=\"columnType === 'date'\" class=\"format-section\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Formato de Data</mat-label>\n          <mat-select\n            [(ngModel)]=\"selectedPreset\"\n            (ngModelChange)=\"onPresetChange()\"\n          >\n            <mat-option\n              *ngFor=\"let preset of datePresets\"\n              [value]=\"preset.value\"\n            >\n              <div class=\"preset-option\">\n                <div class=\"preset-content\">\n                  <span class=\"preset-label\">{{ preset.label }}</span>\n                  <span class=\"preset-description\">{{\n                    preset.description\n                  }}</span>\n                </div>\n                <span class=\"preset-example\">{{ preset.example }}</span>\n              </div>\n            </mat-option>\n          </mat-select>\n          <mat-hint>Escolha um formato predefinido ou personalize</mat-hint>\n        </mat-form-field>\n\n        <mat-form-field\n          *ngIf=\"selectedPreset === 'custom'\"\n          appearance=\"outline\"\n          class=\"full-width\"\n        >\n          <mat-label>Formato Personalizado</mat-label>\n          <input\n            matInput\n            [(ngModel)]=\"customFormat\"\n            (ngModelChange)=\"onCustomFormatChange()\"\n            placeholder=\"dd/MM/yyyy HH:mm:ss\"\n            matTooltip=\"Use padrões do Angular DatePipe: dd, MM, yyyy, HH, mm, ss\"\n          />\n          <mat-hint>Ex: dd/MM/yyyy, HH:mm:ss, EEE dd/MM</mat-hint>\n        </mat-form-field>\n      </div>\n\n      <!-- Number Formatting -->\n      <div *ngIf=\"columnType === 'number'\" class=\"format-section\">\n        <div class=\"format-row\">\n          <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n            <mat-label>Casas Decimais</mat-label>\n            <mat-select\n              [(ngModel)]=\"decimalMode\"\n              (ngModelChange)=\"onDecimalModeChange()\"\n            >\n              <mat-option value=\"0\">Nenhuma (1.234)</mat-option>\n              <mat-option value=\"1\">1 fixa (1.234,5)</mat-option>\n              <mat-option value=\"2\">2 fixas (1.234,56)</mat-option>\n              <mat-option value=\"3\">3 fixas (1.234,567)</mat-option>\n              <mat-option value=\"variable\">Variável (0-3)</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <mat-checkbox\n            [(ngModel)]=\"thousandsSeparator\"\n            (ngModelChange)=\"onFormatOptionChange()\"\n            class=\"format-checkbox\"\n          >\n            Separador de milhares\n          </mat-checkbox>\n        </div>\n\n        <mat-form-field\n          *ngIf=\"decimalMode === 'variable'\"\n          appearance=\"outline\"\n          class=\"full-width\"\n        >\n          <mat-label>Faixa de Decimais</mat-label>\n          <mat-select\n            [(ngModel)]=\"variableRange\"\n            (ngModelChange)=\"onFormatOptionChange()\"\n          >\n            <mat-option value=\"0-1\">0 a 1 casa</mat-option>\n            <mat-option value=\"0-2\">0 a 2 casas</mat-option>\n            <mat-option value=\"0-3\">0 a 3 casas</mat-option>\n            <mat-option value=\"1-3\">1 a 3 casas</mat-option>\n          </mat-select>\n        </mat-form-field>\n      </div>\n\n      <!-- Currency Formatting -->\n      <div *ngIf=\"columnType === 'currency'\" class=\"format-section\">\n        <div class=\"format-row\">\n          <mat-form-field appearance=\"outline\" class=\"currency-select\">\n            <mat-label>Moeda</mat-label>\n            <mat-select\n              [(ngModel)]=\"currencyCode\"\n              (ngModelChange)=\"onFormatOptionChange()\"\n            >\n              <mat-option value=\"BRL\">Real Brasileiro (R$)</mat-option>\n              <mat-option value=\"USD\">Dólar Americano (US$)</mat-option>\n              <mat-option value=\"EUR\">Euro (€)</mat-option>\n              <mat-option value=\"GBP\">Libra Esterlina (£)</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n            <mat-label>Casas Decimais</mat-label>\n            <mat-select\n              [(ngModel)]=\"currencyDecimals\"\n              (ngModelChange)=\"onFormatOptionChange()\"\n            >\n              <mat-option value=\"0\">Nenhuma</mat-option>\n              <mat-option value=\"2\">2 casas</mat-option>\n              <mat-option value=\"3\">3 casas</mat-option>\n            </mat-select>\n          </mat-form-field>\n        </div>\n\n        <div class=\"format-row\">\n          <mat-checkbox\n            [(ngModel)]=\"currencySymbol\"\n            (ngModelChange)=\"onFormatOptionChange()\"\n            class=\"format-checkbox\"\n          >\n            Exibir símbolo da moeda\n          </mat-checkbox>\n\n          <mat-checkbox\n            [(ngModel)]=\"currencyThousands\"\n            (ngModelChange)=\"onFormatOptionChange()\"\n            class=\"format-checkbox\"\n          >\n            Separador de milhares\n          </mat-checkbox>\n        </div>\n      </div>\n\n      <!-- Percentage Formatting -->\n      <div *ngIf=\"columnType === 'percentage'\" class=\"format-section\">\n        <div class=\"format-row\">\n          <mat-form-field appearance=\"outline\" class=\"decimal-select\">\n            <mat-label>Casas Decimais</mat-label>\n            <mat-select\n              [(ngModel)]=\"percentageDecimals\"\n              (ngModelChange)=\"onFormatOptionChange()\"\n            >\n              <mat-option value=\"0\">Nenhuma (12%)</mat-option>\n              <mat-option value=\"1\">1 casa (12,3%)</mat-option>\n              <mat-option value=\"2\">2 casas (12,34%)</mat-option>\n              <mat-option value=\"3\">3 casas (12,345%)</mat-option>\n            </mat-select>\n          </mat-form-field>\n        </div>\n\n        <mat-checkbox\n          [(ngModel)]=\"percentageMultiplier\"\n          (ngModelChange)=\"onFormatOptionChange()\"\n          class=\"format-checkbox\"\n        >\n          Multiplicar por 100 (0.15 → 15%)\n        </mat-checkbox>\n      </div>\n\n      <!-- String Formatting -->\n      <div *ngIf=\"columnType === 'string'\" class=\"format-section\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Transformação de Texto</mat-label>\n          <mat-select\n            [(ngModel)]=\"stringTransform\"\n            (ngModelChange)=\"onFormatOptionChange()\"\n          >\n            <mat-option\n              *ngFor=\"let preset of stringPresets\"\n              [value]=\"preset.value\"\n            >\n              <div class=\"preset-option\">\n                <span class=\"preset-label\">{{ preset.label }}</span>\n                <span class=\"preset-example\">{{ preset.example }}</span>\n              </div>\n            </mat-option>\n          </mat-select>\n        </mat-form-field>\n\n        <div class=\"format-row\">\n          <mat-checkbox\n            [(ngModel)]=\"enableTruncate\"\n            (ngModelChange)=\"onTruncateToggle()\"\n            class=\"format-checkbox\"\n          >\n            Truncar texto longo\n          </mat-checkbox>\n        </div>\n\n        <div *ngIf=\"enableTruncate\" class=\"truncate-options\">\n          <div class=\"format-row\">\n            <mat-form-field appearance=\"outline\" class=\"truncate-length\">\n              <mat-label>Tamanho Máximo</mat-label>\n              <input\n                matInput\n                type=\"number\"\n                [(ngModel)]=\"truncateLength\"\n                (ngModelChange)=\"onFormatOptionChange()\"\n                [min]=\"1\"\n                [max]=\"500\"\n              />\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"truncate-suffix\">\n              <mat-label>Sufixo</mat-label>\n              <input\n                matInput\n                [(ngModel)]=\"truncateSuffix\"\n                (ngModelChange)=\"onFormatOptionChange()\"\n                placeholder=\"...\"\n              />\n            </mat-form-field>\n          </div>\n        </div>\n      </div>\n\n      <!-- Boolean Formatting -->\n      <div *ngIf=\"columnType === 'boolean'\" class=\"format-section\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Exibição de Valores</mat-label>\n          <mat-select\n            [(ngModel)]=\"booleanDisplay\"\n            (ngModelChange)=\"onBooleanDisplayChange()\"\n          >\n            <mat-option\n              *ngFor=\"let preset of booleanPresets\"\n              [value]=\"preset.value\"\n            >\n              <div class=\"preset-option\">\n                <span class=\"preset-label\">{{ preset.label }}</span>\n                <span class=\"preset-example\">{{ preset.example }}</span>\n              </div>\n            </mat-option>\n            <mat-option value=\"custom\">Personalizado</mat-option>\n          </mat-select>\n        </mat-form-field>\n\n        <div *ngIf=\"booleanDisplay === 'custom'\" class=\"custom-boolean\">\n          <div class=\"format-row\">\n            <mat-form-field appearance=\"outline\" class=\"boolean-value\">\n              <mat-label>Texto para Verdadeiro</mat-label>\n              <input\n                matInput\n                [(ngModel)]=\"customTrueValue\"\n                (ngModelChange)=\"onFormatOptionChange()\"\n                placeholder=\"Verdadeiro\"\n              />\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\" class=\"boolean-value\">\n              <mat-label>Texto para Falso</mat-label>\n              <input\n                matInput\n                [(ngModel)]=\"customFalseValue\"\n                (ngModelChange)=\"onFormatOptionChange()\"\n                placeholder=\"Falso\"\n              />\n            </mat-form-field>\n          </div>\n        </div>\n      </div>\n\n      <!-- Live Preview -->\n      <div *ngIf=\"previewValue\" class=\"preview-section\">\n        <mat-divider></mat-divider>\n        <div class=\"preview-content\">\n          <mat-icon class=\"preview-icon\" [praxisIcon]=\"'visibility'\"></mat-icon>\n          <div class=\"preview-text\">\n            <span class=\"preview-label\">Pré-visualização:</span>\n            <span class=\"preview-value\">{{ previewValue }}</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .data-formatter {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .formatter-header {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 16px 0;\n        border-bottom: 1px solid var(--mat-sys-outline-variant);\n      }\n\n      .header-icon {\n        font-size: 24px;\n        width: 24px;\n        height: 24px;\n        color: var(--mat-sys-primary);\n      }\n\n      .header-content h4 {\n        margin: 0 0 4px 0;\n        font-size: 1.1rem;\n        font-weight: 500;\n        color: var(--mat-sys-on-surface);\n      }\n\n      .header-description {\n        margin: 0;\n        font-size: 0.875rem;\n        color: var(--mat-sys-on-surface-variant);\n      }\n\n      .format-section {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .format-row {\n        display: flex;\n        gap: 16px;\n        align-items: center;\n        flex-wrap: wrap;\n      }\n\n      .full-width {\n        width: 100%;\n      }\n\n      .decimal-select,\n      .currency-select {\n        min-width: 200px;\n        flex: 1;\n      }\n\n      .truncate-length {\n        flex: 1;\n        min-width: 120px;\n      }\n\n      .truncate-suffix {\n        flex: 1;\n        min-width: 100px;\n      }\n\n      .boolean-value {\n        flex: 1;\n        min-width: 150px;\n      }\n\n      .format-checkbox {\n        margin-right: 16px;\n      }\n\n      .preset-option {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        width: 100%;\n        padding: 4px 0;\n      }\n\n      .preset-content {\n        display: flex;\n        flex-direction: column;\n        flex: 1;\n      }\n\n      .preset-label {\n        font-weight: 500;\n        font-size: 0.9rem;\n      }\n\n      .preset-description {\n        font-size: 0.8rem;\n        color: var(--mat-sys-on-surface-variant);\n      }\n\n      .preset-example {\n        font-family: monospace;\n        font-size: 0.8rem;\n        color: var(--mat-sys-primary);\n        background-color: var(--mat-sys-primary-container);\n        padding: 2px 6px;\n        border-radius: 4px;\n        margin-left: 8px;\n      }\n\n      .truncate-options {\n        margin-left: 24px;\n        padding-left: 16px;\n        border-left: 2px solid var(--mat-sys-outline-variant);\n      }\n\n      .custom-boolean {\n        margin-top: 8px;\n      }\n\n      .preview-section {\n        margin-top: 16px;\n      }\n\n      .preview-content {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 16px;\n        background-color: var(--mat-sys-surface-container);\n        border-radius: 8px;\n        margin-top: 16px;\n      }\n\n      .preview-icon {\n        color: var(--mat-sys-secondary);\n      }\n\n      .preview-text {\n        display: flex;\n        flex-direction: column;\n        gap: 4px;\n      }\n\n      .preview-label {\n        font-size: 0.875rem;\n        color: var(--mat-sys-on-surface-variant);\n      }\n\n      .preview-value {\n        font-family: monospace;\n        font-size: 1rem;\n        font-weight: 500;\n        color: var(--mat-sys-on-surface);\n        background-color: var(--mat-sys-surface-container-high);\n        padding: 8px 12px;\n        border-radius: 4px;\n        border: 1px solid var(--mat-sys-outline-variant);\n      }\n\n      /* Responsive Design */\n      @media (max-width: 768px) {\n        .format-row {\n          flex-direction: column;\n          align-items: stretch;\n        }\n\n        .decimal-select,\n        .currency-select,\n        .truncate-length,\n        .truncate-suffix,\n        .boolean-value {\n          min-width: unset;\n          width: 100%;\n        }\n\n        .format-checkbox {\n          margin-right: 0;\n          margin-bottom: 8px;\n        }\n      }\n    `,\n  ],\n})\nexport class DataFormatterComponent implements OnInit, OnChanges {\n  @Input() columnType: ColumnDataType = 'string';\n  @Input() currentFormat: string = '';\n\n  @Output() formatChange = new EventEmitter<string>();\n\n  // Preset data\n  datePresets = DATE_PRESETS;\n  numberPresets = NUMBER_PRESETS;\n  currencyPresets = CURRENCY_PRESETS;\n  percentagePresets = PERCENTAGE_PRESETS;\n  stringPresets = STRING_PRESETS;\n  booleanPresets = BOOLEAN_PRESETS;\n\n  // Date formatting state\n  selectedPreset = 'shortDate';\n  customFormat = '';\n\n  // Number formatting state\n  decimalMode = '2';\n  variableRange = '0-2';\n  thousandsSeparator = true;\n\n  // Currency formatting state\n  currencyCode = 'BRL';\n  currencyDecimals = '2';\n  currencySymbol = true;\n  currencyThousands = true;\n\n  // Percentage formatting state\n  percentageDecimals = '1';\n  percentageMultiplier = true;\n\n  // String formatting state\n  stringTransform = 'none';\n  enableTruncate = false;\n  truncateLength = 50;\n  truncateSuffix = '...';\n\n  // Boolean formatting state\n  booleanDisplay = 'true-false';\n  customTrueValue = 'Verdadeiro';\n  customFalseValue = 'Falso';\n\n  // Preview\n  previewValue = '';\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    private formattingService: DataFormattingService,\n  ) {}\n\n  ngOnInit(): void {\n    this.parseCurrentFormat();\n    this.generatePreview();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['currentFormat'] && !changes['currentFormat'].firstChange) {\n      this.parseCurrentFormat();\n    }\n    if (changes['columnType']) {\n      this.generatePreview();\n    }\n  }\n\n  getTypeIcon(): string {\n    switch (this.columnType) {\n      case 'date':\n        return 'calendar_today';\n      case 'number':\n        return 'numbers';\n      case 'currency':\n        return 'attach_money';\n      case 'percentage':\n        return 'percent';\n      case 'string':\n        return 'text_fields';\n      case 'boolean':\n        return 'toggle_on';\n      default:\n        return 'format_shapes';\n    }\n  }\n\n  getTypeLabel(): string {\n    switch (this.columnType) {\n      case 'date':\n        return 'Data';\n      case 'number':\n        return 'Número';\n      case 'currency':\n        return 'Moeda';\n      case 'percentage':\n        return 'Percentual';\n      case 'string':\n        return 'Texto';\n      case 'boolean':\n        return 'Booleano';\n      default:\n        return 'Dados';\n    }\n  }\n\n  getTypeDescription(): string {\n    switch (this.columnType) {\n      case 'date':\n        return 'Configure como as datas serão exibidas';\n      case 'number':\n        return 'Defina a formatação de números';\n      case 'currency':\n        return 'Configure a exibição de valores monetários';\n      case 'percentage':\n        return 'Formate a exibição de percentuais';\n      case 'string':\n        return 'Transforme a apresentação de texto';\n      case 'boolean':\n        return 'Escolha como exibir valores verdadeiro/falso';\n      default:\n        return 'Configure a formatação dos dados';\n    }\n  }\n\n  private parseCurrentFormat(): void {\n    if (!this.currentFormat) {\n      this.setDefaultValues();\n      return;\n    }\n\n    // Parse the current format based on column type\n    switch (this.columnType) {\n      case 'date':\n        this.parseDateFormat();\n        break;\n      case 'number':\n        this.parseNumberFormat();\n        break;\n      case 'currency':\n        this.parseCurrencyFormat();\n        break;\n      case 'percentage':\n        this.parsePercentageFormat();\n        break;\n      case 'string':\n        this.parseStringFormat();\n        break;\n      case 'boolean':\n        this.parseBooleanFormat();\n        break;\n    }\n\n    this.generatePreview();\n    this.cdr.markForCheck();\n  }\n\n  private setDefaultValues(): void {\n    switch (this.columnType) {\n      case 'date':\n        this.selectedPreset = 'shortDate';\n        break;\n      case 'number':\n        this.decimalMode = '2';\n        this.thousandsSeparator = true;\n        break;\n      case 'currency':\n        this.currencyCode = 'BRL';\n        this.currencyDecimals = '2';\n        break;\n      case 'percentage':\n        this.percentageDecimals = '1';\n        break;\n      case 'string':\n        this.stringTransform = 'none';\n        break;\n      case 'boolean':\n        this.booleanDisplay = 'true-false';\n        break;\n    }\n  }\n\n  private parseDateFormat(): void {\n    const presetMatch = this.datePresets.find(\n      (p) => p.value === this.currentFormat,\n    );\n    if (presetMatch) {\n      this.selectedPreset = presetMatch.value;\n    } else {\n      this.selectedPreset = 'custom';\n      this.customFormat = this.currentFormat;\n    }\n  }\n\n  private parseNumberFormat(): void {\n    // Parse format like \"1.2-2\" or \"1.0-3\"\n    const match = this.currentFormat.match(/1\\.(\\d+)-(\\d+)/);\n    if (match) {\n      const min = parseInt(match[1]);\n      const max = parseInt(match[2]);\n      if (min === max) {\n        this.decimalMode = min.toString();\n      } else {\n        this.decimalMode = 'variable';\n        this.variableRange = `${min}-${max}`;\n      }\n    }\n    this.thousandsSeparator = !this.currentFormat.includes('|nosep');\n  }\n\n  private parseCurrencyFormat(): void {\n    // Parse format like \"BRL|symbol|2\"\n    const parts = this.currentFormat.split('|');\n    if (parts.length >= 3) {\n      this.currencyCode = parts[0];\n      this.currencySymbol = parts[1] === 'symbol';\n      this.currencyDecimals = parts[2];\n      this.currencyThousands = !parts.includes('nosep');\n    }\n  }\n\n  private parsePercentageFormat(): void {\n    this.percentageMultiplier = this.currentFormat.includes('|x100');\n    const format = this.currentFormat.replace('|x100', '');\n    const match = format.match(/1\\.(\\d+)-(\\d+)/);\n    if (match) {\n      this.percentageDecimals = match[2];\n    }\n  }\n\n  private parseStringFormat(): void {\n    if (this.currentFormat.includes('|truncate|')) {\n      const parts = this.currentFormat.split('|');\n      this.stringTransform = parts[0];\n      this.enableTruncate = true;\n      this.truncateLength = parseInt(parts[2]) || 50;\n      this.truncateSuffix = parts[3] || '...';\n    } else {\n      this.stringTransform = this.currentFormat || 'none';\n    }\n  }\n\n  private parseBooleanFormat(): void {\n    if (this.currentFormat.includes('|custom|')) {\n      const parts = this.currentFormat.split('|');\n      this.booleanDisplay = 'custom';\n      this.customTrueValue = parts[2] || 'Verdadeiro';\n      this.customFalseValue = parts[3] || 'Falso';\n    } else {\n      this.booleanDisplay = this.currentFormat || 'true-false';\n    }\n  }\n\n  // Event handlers\n  onPresetChange(): void {\n    this.generateFormatString();\n  }\n\n  onCustomFormatChange(): void {\n    this.generateFormatString();\n  }\n\n  onDecimalModeChange(): void {\n    this.generateFormatString();\n  }\n\n  onFormatOptionChange(): void {\n    this.generateFormatString();\n  }\n\n  onTruncateToggle(): void {\n    this.generateFormatString();\n  }\n\n  onBooleanDisplayChange(): void {\n    this.generateFormatString();\n  }\n\n  private generateFormatString(): void {\n    let formatString = '';\n\n    switch (this.columnType) {\n      case 'date':\n        formatString =\n          this.selectedPreset === 'custom'\n            ? this.customFormat\n            : this.selectedPreset;\n        break;\n\n      case 'number':\n        if (this.decimalMode === 'variable') {\n          const [min, max] = this.variableRange.split('-');\n          formatString = `1.${min}-${max}`;\n        } else {\n          formatString = `1.${this.decimalMode}-${this.decimalMode}`;\n        }\n        if (!this.thousandsSeparator) {\n          formatString += '|nosep';\n        }\n        break;\n\n      case 'currency':\n        const symbolType = this.currencySymbol ? 'symbol' : 'code';\n        formatString = `${this.currencyCode}|${symbolType}|${this.currencyDecimals}`;\n        if (!this.currencyThousands) {\n          formatString += '|nosep';\n        }\n        break;\n\n      case 'percentage':\n        formatString = `1.${this.percentageDecimals}-${this.percentageDecimals}`;\n        if (this.percentageMultiplier) {\n          formatString += '|x100';\n        }\n        break;\n\n      case 'string':\n        formatString = this.stringTransform;\n        if (this.enableTruncate) {\n          formatString += `|truncate|${this.truncateLength}|${this.truncateSuffix}`;\n        }\n        break;\n\n      case 'boolean':\n        if (this.booleanDisplay === 'custom') {\n          formatString = `custom|${this.customTrueValue}|${this.customFalseValue}`;\n        } else {\n          formatString = this.booleanDisplay;\n        }\n        break;\n    }\n\n    this.formatChange.emit(formatString);\n    this.generatePreview();\n    this.cdr.markForCheck();\n  }\n\n  private generatePreview(): void {\n    // Generate a preview using the actual DataFormattingService for accuracy\n    const formatString = this.getCurrentFormatString();\n    if (!formatString) {\n      this.previewValue = '';\n      return;\n    }\n\n    const sampleValue = this.getSampleValue();\n    try {\n      this.previewValue = this.formattingService.formatValue(\n        sampleValue,\n        this.columnType,\n        formatString,\n      );\n    } catch (error) {\n      this.previewValue = 'Erro na formatação';\n      console.warn('Preview generation error:', error);\n    }\n  }\n\n  /**\n   * Get appropriate sample value for each data type\n   */\n  private getSampleValue(): any {\n    switch (this.columnType) {\n      case 'date':\n        return new Date(); // Current date and time\n      case 'number':\n        return 1234.5678;\n      case 'currency':\n        return 1234.56;\n      case 'percentage':\n        return this.percentageMultiplier ? 0.12345 : 12.345; // Depends on multiplier setting\n      case 'string':\n        return 'Exemplo de Texto Longo Para Demonstrar Formatação';\n      case 'boolean':\n        return true;\n      default:\n        return null;\n    }\n  }\n\n  /**\n   * Get the current format string based on component state\n   */\n  private getCurrentFormatString(): string {\n    switch (this.columnType) {\n      case 'date':\n        return this.selectedPreset === 'custom'\n          ? this.customFormat\n          : this.selectedPreset;\n      case 'number':\n        if (this.decimalMode === 'variable') {\n          const [min, max] = this.variableRange.split('-');\n          return `1.${min}-${max}${!this.thousandsSeparator ? '|nosep' : ''}`;\n        } else {\n          return `1.${this.decimalMode}-${this.decimalMode}${!this.thousandsSeparator ? '|nosep' : ''}`;\n        }\n      case 'currency':\n        const symbolType = this.currencySymbol ? 'symbol' : 'code';\n        return `${this.currencyCode}|${symbolType}|${this.currencyDecimals}${!this.currencyThousands ? '|nosep' : ''}`;\n      case 'percentage':\n        return `1.${this.percentageDecimals}-${this.percentageDecimals}${this.percentageMultiplier ? '|x100' : ''}`;\n      case 'string':\n        let format = this.stringTransform;\n        if (this.enableTruncate) {\n          format += `|truncate|${this.truncateLength}|${this.truncateSuffix}`;\n        }\n        return format;\n      case 'boolean':\n        if (this.booleanDisplay === 'custom') {\n          return `custom|${this.customTrueValue}|${this.customFalseValue}`;\n        } else {\n          return this.booleanDisplay;\n        }\n      default:\n        return '';\n    }\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ChangeDetectorRef,\n  ChangeDetectionStrategy,\n  DestroyRef,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport {\n  CdkDragDrop,\n  DragDropModule,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { TableConfig, ColumnDefinition, isTableConfigV2 } from '@praxisui/core';\nimport { Subject, debounceTime } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { VisualFormulaBuilderComponent } from '../visual-formula-builder/visual-formula-builder.component';\nimport {\n  FieldSchema,\n  FormulaDefinition,\n} from '../visual-formula-builder/formula-types';\nimport { ValueMappingEditorComponent } from '../value-mapping-editor/value-mapping-editor.component';\nimport { DataFormatterComponent } from '../data-formatter/data-formatter.component';\nimport { ColumnDataType } from '../data-formatter/data-formatter-types';\n\nexport interface ColumnChange {\n  type: 'add' | 'remove' | 'update' | 'reorder' | 'global';\n  columnIndex?: number;\n  column?: ColumnDefinition;\n  columns?: ColumnDefinition[];\n  fullConfig?: TableConfig;\n}\n\ninterface ExtendedColumnDefinition extends ColumnDefinition {\n  calculationType?: string;\n  calculationParams?: any;\n  _generatedValueGetter?: string;\n  valueMapping?: { [key: string | number]: string };\n  format?: string;\n  conditionalStyles?: any[]; // ConditionalStyle[];\n  cellClassCondition?: any;\n  resizable?: boolean;\n  filterable?: boolean;\n}\n\n@Component({\n  selector: 'columns-config-editor',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrls: ['./columns-config-editor.component.scss'],\n  imports: [\n    CommonModule,\n    FormsModule,\n    MatButtonModule,\n    MatIconModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatCardModule,\n    MatCheckboxModule,\n    MatButtonToggleModule,\n    MatSelectModule,\n    MatListModule,\n    MatDividerModule,\n    MatTooltipModule,\n    MatExpansionModule,\n    MatBadgeModule,\n    MatSlideToggleModule,\n    DragDropModule,\n    VisualFormulaBuilderComponent,\n    ValueMappingEditorComponent,\n    DataFormatterComponent,\n  ],\n  template: `\n    <div class=\"columns-config-editor\">\n      <!-- Educational Card - Compact -->\n      <mat-card class=\"educational-card compact\">\n        <mat-card-content class=\"compact-content\">\n          <div class=\"compact-header\">\n            <mat-icon class=\"inline-icon\">table_chart</mat-icon>\n            <h4>Personalização de Colunas</h4>\n          </div>\n          <p>\n            Configure visibilidade, cabeçalhos, largura e propriedades de cada\n            coluna.\n          </p>\n        </mat-card-content>\n      </mat-card>\n\n      <!-- Global Configuration Accordion -->\n      <mat-accordion class=\"global-config-accordion\">\n        <mat-expansion-panel class=\"global-config-panel\" [expanded]=\"true\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"panel-icon\">tune</mat-icon>\n              Configurações Globais\n            </mat-panel-title>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-panel-content\">\n            <div class=\"config-layout\">\n              <!-- Visibility Controls -->\n              <div class=\"config-group\">\n                <div class=\"control-section\">\n                  <label class=\"control-label\">\n                    Visibilidade\n                    <span class=\"control-status\"\n                      >({{ getVisibleColumnsCount() }}/{{\n                        columns.length\n                      }}\n                      visíveis)</span\n                    >\n                  </label>\n                  <mat-button-toggle-group\n                    [(ngModel)]=\"visibilityState\"\n                    (ngModelChange)=\"onVisibilityChange($event)\"\n                    class=\"visibility-toggle-group\"\n                  >\n                    <mat-button-toggle\n                      value=\"all\"\n                      [disabled]=\"areAllColumnsVisible()\"\n                    >\n                      <mat-icon>visibility</mat-icon>\n                      <span>Todas</span>\n                    </mat-button-toggle>\n                    <mat-button-toggle\n                      value=\"none\"\n                      [disabled]=\"areAllColumnsHidden()\"\n                    >\n                      <mat-icon>visibility_off</mat-icon>\n                      <span>Nenhuma</span>\n                    </mat-button-toggle>\n                  </mat-button-toggle-group>\n                </div>\n              </div>\n\n              <!-- Alignment Controls -->\n              <div class=\"config-group\">\n                <div class=\"control-section\">\n                  <label class=\"control-label\">Alinhamento Padrão</label>\n                  <mat-button-toggle-group\n                    [(ngModel)]=\"globalAlignment\"\n                    (ngModelChange)=\"applyGlobalAlignment($event)\"\n                    class=\"alignment-toggle-group\"\n                  >\n                    <mat-button-toggle value=\"left\" matTooltip=\"Esquerda\">\n                      <mat-icon>format_align_left</mat-icon>\n                    </mat-button-toggle>\n                    <mat-button-toggle value=\"center\" matTooltip=\"Centro\">\n                      <mat-icon>format_align_center</mat-icon>\n                    </mat-button-toggle>\n                    <mat-button-toggle value=\"right\" matTooltip=\"Direita\">\n                      <mat-icon>format_align_right</mat-icon>\n                    </mat-button-toggle>\n                  </mat-button-toggle-group>\n                </div>\n              </div>\n\n              <!-- Feature Options -->\n              <div class=\"config-group features-group\">\n                <div class=\"control-section\">\n                  <label class=\"control-label\">Recursos</label>\n                  <div class=\"features-grid\">\n                    <mat-checkbox\n                      [(ngModel)]=\"globalSortableEnabled\"\n                      (ngModelChange)=\"applyGlobalSortable($event)\"\n                      class=\"feature-checkbox\"\n                    >\n                      Ordenação\n                    </mat-checkbox>\n\n                    @if (isV2Config) {\n                      <mat-checkbox\n                        [(ngModel)]=\"globalResizable\"\n                        (ngModelChange)=\"applyGlobalResizable($event)\"\n                        class=\"feature-checkbox\"\n                      >\n                        Redimensionáveis\n                      </mat-checkbox>\n\n                      <mat-checkbox\n                        [(ngModel)]=\"globalStickyEnabled\"\n                        (ngModelChange)=\"applyGlobalSticky($event)\"\n                        class=\"feature-checkbox\"\n                      >\n                        Fixar colunas\n                      </mat-checkbox>\n                    }\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n      </mat-accordion>\n\n      <!-- Master-Detail Layout -->\n      <div class=\"master-detail-layout\">\n        <!-- Master: Columns List -->\n        <div class=\"master-panel\">\n          <div class=\"list-header\">\n            <h3>Colunas ({{ columns.length }})</h3>\n            <button\n              mat-fab\n              color=\"primary\"\n              class=\"add-column-fab\"\n              (click)=\"addNewColumn()\"\n              matTooltip=\"Adicionar Coluna Calculada\"\n            >\n              <mat-icon>functions</mat-icon>\n            </button>\n          </div>\n\n          <div\n            class=\"columns-list-container\"\n            cdkDropList\n            (cdkDropListDropped)=\"onColumnReorder($event)\"\n          >\n            <mat-list class=\"columns-list\">\n              @for (column of columns; track column.field; let i = $index) {\n                <mat-list-item\n                  [class.selected]=\"selectedColumnIndex === i\"\n                  (click)=\"selectColumn(i)\"\n                  cdkDrag\n                  class=\"column-item\"\n                >\n                  <div class=\"column-item-content\" cdkDragHandle>\n                    <div class=\"column-main-info\">\n                      <div class=\"column-header\">\n                        <mat-icon class=\"drag-handle\">drag_handle</mat-icon>\n                        <div class=\"column-text-info\">\n                          <span\n                            class=\"column-title\"\n                            [matTooltip]=\"column.field\"\n                            matTooltipPosition=\"below\"\n                          >\n                            {{ column.header || column.field }}\n                          </span>\n                          <span class=\"column-field\">{{ column.field }}</span>\n                        </div>\n                        <div class=\"column-indicators\">\n                          <mat-icon\n                            class=\"column-type-icon\"\n                            [matTooltip]=\"\n                              isCalculatedColumn(column)\n                                ? 'Coluna Calculada'\n                                : 'Campo da API'\n                            \"\n                          >\n                            {{\n                              isCalculatedColumn(column)\n                                ? 'functions'\n                                : 'data_object'\n                            }}\n                          </mat-icon>\n                          <mat-icon\n                            class=\"mapping-indicator-icon\"\n                            [matBadge]=\"getMappingCount(column)\"\n                            [matBadgeHidden]=\"getMappingCount(column) === 0\"\n                            matBadgeColor=\"accent\"\n                            matBadgeSize=\"small\"\n                            [matTooltip]=\"getMappingTooltip(column)\"\n                            aria-hidden=\"false\"\n                            [attr.aria-label]=\"\n                              getMappingCount(column) > 0\n                                ? getMappingTooltip(column)\n                                : null\n                            \"\n                          >\n                            swap_horiz\n                          </mat-icon>\n                          <mat-icon\n                            *ngIf=\"column?.renderer?.type as rType\"\n                            class=\"renderer-indicator-icon\"\n                            [matTooltip]=\"'Renderer ativo: ' + rType\"\n                          >\n                            {{ rType === 'icon' ? 'photo_filter' : (rType === 'image' ? 'image' : 'sell') }}\n                          </mat-icon>\n                          <mat-checkbox\n                            [(ngModel)]=\"column.visible\"\n                            (ngModelChange)=\"onColumnPropertyChange()\"\n                            (click)=\"$event.stopPropagation()\"\n                            class=\"visibility-checkbox\"\n                            matTooltip=\"Visível na tabela\"\n                          >\n                          </mat-checkbox>\n                        </div>\n                      </div>\n                    </div>\n\n                    <button\n                      mat-icon-button\n                      color=\"warn\"\n                      class=\"remove-button\"\n                      (click)=\"removeColumn(i, $event)\"\n                      matTooltip=\"Remover Coluna\"\n                    >\n                      <mat-icon>delete</mat-icon>\n                    </button>\n                  </div>\n                </mat-list-item>\n              }\n            </mat-list>\n          </div>\n        </div>\n\n        <mat-divider [vertical]=\"true\" class=\"panel-divider\"></mat-divider>\n\n        <!-- Detail: Column Editor -->\n        <div class=\"detail-panel\">\n          @if (selectedColumnIndex === -1) {\n            <div class=\"no-selection-message\">\n              <mat-icon>table_chart</mat-icon>\n              <h3>Selecione uma coluna</h3>\n              <p>Escolha uma coluna da lista para editar suas propriedades</p>\n            </div>\n          }\n\n          @if (selectedColumn) {\n            <div class=\"column-editor\">\n              <div class=\"editor-header\">\n                <h3 class=\"editor-title\">\n                  Editando: {{ selectedColumn.header || selectedColumn.field }}\n                </h3>\n              </div>\n\n              <form class=\"column-form\">\n                <!-- Basic Properties Row -->\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Campo (field)</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.field\"\n                      name=\"field\"\n                      [readonly]=\"isExistingColumn(selectedColumn)\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    />\n                    <mat-hint>Nome técnico do campo</mat-hint>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\" class=\"header-input\">\n                    <mat-label>Cabeçalho (header)</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.header\"\n                      name=\"header\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    />\n                    <mat-hint>Texto exibido no cabeçalho</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <!-- Visibility and Alignment Row -->\n                <div class=\"form-row\">\n                  <div class=\"checkbox-group\">\n                    <mat-checkbox\n                      [(ngModel)]=\"selectedColumn.visible\"\n                      name=\"visible\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      Coluna Visível\n                    </mat-checkbox>\n                  </div>\n\n                  <div class=\"alignment-group\">\n                    <label class=\"control-label\">Alinhamento</label>\n                    <mat-button-toggle-group\n                      [(ngModel)]=\"selectedColumn.align\"\n                      name=\"align\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      <mat-button-toggle value=\"left\">\n                        <mat-icon>format_align_left</mat-icon>\n                      </mat-button-toggle>\n                      <mat-button-toggle value=\"center\">\n                        <mat-icon>format_align_center</mat-icon>\n                      </mat-button-toggle>\n                      <mat-button-toggle value=\"right\">\n                        <mat-icon>format_align_right</mat-icon>\n                      </mat-button-toggle>\n                    </mat-button-toggle-group>\n                  </div>\n                </div>\n\n                <!-- Width and Advanced Row -->\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"width-input\">\n                    <mat-label>Largura</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.width\"\n                      name=\"width\"\n                      placeholder=\"auto\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    />\n                    <mat-hint>Ex: 100px, 10%, auto</mat-hint>\n                  </mat-form-field>\n\n                  <div class=\"checkbox-group\">\n                    <mat-checkbox\n                      [(ngModel)]=\"selectedColumn.sortable\"\n                      name=\"sortable\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      Ordenável\n                    </mat-checkbox>\n                  </div>\n\n                  <div class=\"checkbox-group\" *ngIf=\"isV2Config\">\n                    <mat-checkbox\n                      [(ngModel)]=\"selectedColumn.resizable\"\n                      name=\"resizable\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      Redimensionável\n                    </mat-checkbox>\n                  </div>\n\n                  <div class=\"checkbox-group\">\n                    <mat-checkbox\n                      [(ngModel)]=\"selectedColumn.filterable\"\n                      name=\"filterable\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      Filtrável\n                    </mat-checkbox>\n                  </div>\n                </div>\n\n                <!-- Data Type Row -->\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"data-type-input\">\n                    <mat-label>Tipo de Dados</mat-label>\n                    <mat-select\n                      [(ngModel)]=\"selectedColumnDataType\"\n                      (ngModelChange)=\"onDataTypeChange($event)\"\n                      name=\"dataType\"\n                    >\n                      <mat-option value=\"string\">\n                        <mat-icon>text_fields</mat-icon>\n                        Texto\n                      </mat-option>\n                      <mat-option value=\"number\">\n                        <mat-icon>numbers</mat-icon>\n                        Número\n                      </mat-option>\n                      <mat-option value=\"currency\">\n                        <mat-icon>attach_money</mat-icon>\n                        Moeda\n                      </mat-option>\n                      <mat-option value=\"percentage\">\n                        <mat-icon>percent</mat-icon>\n                        Percentual\n                      </mat-option>\n                      <mat-option value=\"date\">\n                        <mat-icon>calendar_today</mat-icon>\n                        Data\n                      </mat-option>\n                      <mat-option value=\"boolean\">\n                        <mat-icon>toggle_on</mat-icon>\n                        Booleano\n                      </mat-option>\n                    </mat-select>\n                    <mat-hint>Define como os dados serão formatados</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <!-- Sticky Position Row -->\n                <div class=\"form-row\">\n                  <div class=\"sticky-group\">\n                    <label class=\"control-label\">Posição Fixa</label>\n                    <mat-button-toggle-group\n                      [(ngModel)]=\"selectedColumn.sticky\"\n                      name=\"sticky\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                    >\n                      <mat-button-toggle [value]=\"null\"\n                        >Nenhum</mat-button-toggle\n                      >\n                      <mat-button-toggle value=\"start\"\n                        >Início</mat-button-toggle\n                      >\n                      <mat-button-toggle value=\"end\">Fim</mat-button-toggle>\n                    </mat-button-toggle-group>\n                    <div class=\"hint\" style=\"opacity:.75; margin-top:6px;\">\n                      Fixar colunas no início/fim ajuda a manter ações/identificação visíveis.\n                    </div>\n                  </div>\n                </div>\n\n                <!-- Sorting Backend Field Row -->\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Campo de ordenação (backend)</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.sortField\"\n                      name=\"sortField\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                      placeholder=\"ex.: codigo, dataCriacao\"\n                    />\n                    <mat-hint>Use quando o campo de ordenação difere do field</mat-hint>\n                  </mat-form-field>\n                </div>\n\n                <!-- Header/Cell Overrides Row -->\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Classe do cabeçalho</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.headerCssClass\"\n                      name=\"headerCssClass\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                      placeholder=\"ex.: pfx-header--muted\"\n                    />\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Estilo do cabeçalho (CSS)</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.headerStyle\"\n                      name=\"headerStyle\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                      placeholder=\"ex.: background:#f8f9fb;\"\n                    />\n                  </mat-form-field>\n                </div>\n                <div class=\"form-row\">\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Classe da célula</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.cssClass\"\n                      name=\"cssClass\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                      placeholder=\"ex.: pfx-cell--warning\"\n                    />\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"field-input\">\n                    <mat-label>Estilo da célula (CSS)</mat-label>\n                    <input\n                      matInput\n                      [(ngModel)]=\"selectedColumn.style\"\n                      name=\"style\"\n                      (ngModelChange)=\"onColumnPropertyChange()\"\n                      placeholder=\"ex.: color:#555;\"\n                    />\n                  </mat-form-field>\n                </div>\n\n                <!-- Visual Formula Builder for Calculated Columns -->\n                @if (isCalculatedColumn(selectedColumn)) {\n                  <div class=\"form-section\">\n                    <mat-divider></mat-divider>\n                    <div class=\"formula-builder-section\">\n                      <visual-formula-builder\n                        [availableDataSchema]=\"availableDataSchema\"\n                        [currentFormula]=\"getColumnFormula(selectedColumn)\"\n                        (formulaChange)=\"onFormulaChange($event)\"\n                        (generatedExpressionChange)=\"\n                          onGeneratedExpressionChange($event)\n                        \"\n                      >\n                      </visual-formula-builder>\n                    </div>\n                  </div>\n                }\n\n                <!-- Value Mapping Editor -->\n                <div class=\"form-section\">\n                  <mat-divider></mat-divider>\n                  <mat-expansion-panel class=\"mapping-expansion-panel\">\n                    <mat-expansion-panel-header>\n                      <mat-panel-title>\n                        <mat-icon>swap_horiz</mat-icon>\n                        Mapeamento de Valores\n                      </mat-panel-title>\n                      <mat-panel-description>\n                        {{ getMappingPanelDescription(selectedColumn) }}\n                      </mat-panel-description>\n                    </mat-expansion-panel-header>\n\n                    <div class=\"mapping-panel-content\">\n                      <value-mapping-editor\n                        [currentMapping]=\"getColumnMapping(selectedColumn)\"\n                        [keyInputType]=\"getColumnKeyInputType(selectedColumn)\"\n                        [labelKey]=\"'Valor Original'\"\n                        [labelValue]=\"'Valor Exibido'\"\n                        (mappingChange)=\"onMappingChange($event)\"\n                      >\n                      </value-mapping-editor>\n                    </div>\n                  </mat-expansion-panel>\n                </div>\n\n                <!-- Data Formatting Editor -->\n                @if (showDataFormatter(selectedColumn)) {\n                  <div class=\"form-section\">\n                    <mat-divider></mat-divider>\n                    <mat-expansion-panel class=\"formatter-expansion-panel\">\n                      <mat-expansion-panel-header>\n                        <mat-panel-title>\n                          <mat-icon>{{\n                            getFormatterIcon(selectedColumn)\n                          }}</mat-icon>\n                          Formatação de Exibição\n                        </mat-panel-title>\n                        <mat-panel-description>\n                          {{ getFormatterPanelDescription(selectedColumn) }}\n                        </mat-panel-description>\n                      </mat-expansion-panel-header>\n\n                      <div class=\"formatter-panel-content\">\n                        <data-formatter\n                          [columnType]=\"getColumnDataType(selectedColumn)\"\n                          [currentFormat]=\"getColumnFormat(selectedColumn)\"\n                          (formatChange)=\"onFormatChange($event)\"\n                        >\n                        </data-formatter>\n                      </div>\n                    </mat-expansion-panel>\n                  </div>\n                }\n\n                <!-- Cell Renderer (Phase 1) -->\n                <div class=\"form-section\">\n                  <mat-divider></mat-divider>\n                  <mat-expansion-panel>\n                    <mat-expansion-panel-header>\n                      <mat-panel-title>\n                        <mat-icon>photo_filter</mat-icon>\n                        Renderização da Célula\n                      </mat-panel-title>\n                      <mat-panel-description>\n                        Ícone, imagem ou badge no lugar do texto\n                      </mat-panel-description>\n                    </mat-expansion-panel-header>\n\n                    <div class=\"renderer-grid\">\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Modo de renderização</mat-label>\n                        <mat-select [(ngModel)]=\"uiRendererType\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererTypeChange($event)\" (closed)=\"onRendererModeClosed()\">\n                          <mat-option [value]=\"null\">Texto padrão</mat-option>\n                          <mat-option value=\"icon\">Ícone</mat-option>\n                          <mat-option value=\"image\">Imagem</mat-option>\n                          <mat-option value=\"badge\">Badge</mat-option>\n                          <mat-option value=\"link\">Link</mat-option>\n                          <mat-option value=\"button\">Botão</mat-option>\n                          <mat-option value=\"chip\">Chip</mat-option>\n                          <mat-option value=\"progress\">Progresso</mat-option>\n                          <mat-option value=\"avatar\">Avatar</mat-option>\n                          <mat-option value=\"toggle\">Toggle</mat-option>\n                          <mat-option value=\"menu\">Menu</mat-option>\n                          <mat-option value=\"html\">HTML</mat-option>\n                          <mat-option value=\"compose\">Compor (vários)</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <div class=\"renderer-config\" style=\"grid-column: 1/-1; margin-top: 8px;\">\n                        <mat-slide-toggle [(ngModel)]=\"uiRendererConditional\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onToggleRendererConditional($event)\">\n                          Modo condicional (expressão)\n                        </mat-slide-toggle>\n                        <mat-form-field appearance=\"outline\" *ngIf=\"uiRendererConditional\" style=\"width:100%; margin-top:8px;\">\n                          <mat-label>Expressão do modo (retorna 'icon' | 'image' | 'badge')</mat-label>\n                          <input matInput [ngModel]=\"getRendererTypeExpr()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererTypeExpr($event)\" placeholder=\"= row.hasAvatar ? 'image' : 'icon'\" />\n                          <mat-hint>Use '= ...' para expressão. Ex.: = row.severity &gt;= 7 ? 'badge' : null</mat-hint>\n                        </mat-form-field>\n                      </div>\n\n                      <!-- Icon configuration -->\n                      @if (uiRendererType === 'icon') {\n                        <div class=\"renderer-config\">\n                          <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Nome do ícone (fixo)</mat-label>\n                            <input matInput [value]=\"getRendererIconName()\" (input)=\"setRendererIconName($any($event.target).value)\" placeholder=\"ex.: mi:check_circle, edit\" />\n                            <mat-hint>Material Symbols (mi:...)</mat-hint>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do ícone (row.campo)</mat-label>\n                            <input matInput [value]=\"getRendererIconNameField()\" (input)=\"setRendererIconNameField($any($event.target).value)\" placeholder=\"ex.: statusIcon\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Selecionar campo do ícone</mat-label>\n                            <mat-select [ngModel]=\"getRendererIconNameField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererIconNameField($event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n                                {{ f.label || f.name }} — {{ f.name }}\n                              </mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Cor</mat-label>\n                            <mat-select [value]=\"getRendererIconColor()\" (valueChange)=\"setRendererIconColor($event)\">\n                              <mat-option value=\"\">Padrão</mat-option>\n                              <mat-option value=\"primary\">Primary</mat-option>\n                              <mat-option value=\"accent\">Accent</mat-option>\n                              <mat-option value=\"warn\">Warn</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Tamanho (px)</mat-label>\n                            <input matInput type=\"number\" [value]=\"getRendererIconSize()\" (input)=\"setRendererIconSize($any($event.target).valueAsNumber)\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Image configuration -->\n                      @if (uiRendererType === 'image') {\n                        <div class=\"renderer-config\">\n                          <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>URL da imagem (fixo)</mat-label>\n                            <input matInput [value]=\"getRendererImageSrc()\" (input)=\"setRendererImageSrc($any($event.target).value)\" placeholder=\"https://...\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo da URL</mat-label>\n                            <input matInput [value]=\"getRendererImageSrcField()\" (input)=\"setRendererImageSrcField($any($event.target).value)\" placeholder=\"ex.: avatarUrl\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Selecionar campo da URL</mat-label>\n                            <mat-select [ngModel]=\"getRendererImageSrcField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererImageSrcField($event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n                                {{ f.label || f.name }} — {{ f.name }}\n                              </mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>ALT (fixo)</mat-label>\n                            <input matInput [value]=\"getRendererImageAlt()\" (input)=\"setRendererImageAlt($any($event.target).value)\" placeholder=\"Texto alternativo\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do ALT</mat-label>\n                            <input matInput [value]=\"getRendererImageAltField()\" (input)=\"setRendererImageAltField($any($event.target).value)\" placeholder=\"ex.: name\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Selecionar campo do ALT</mat-label>\n                            <mat-select [ngModel]=\"getRendererImageAltField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererImageAltField($event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n                                {{ f.label || f.name }} — {{ f.name }}\n                              </mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Largura (px)</mat-label>\n                            <input matInput type=\"number\" [value]=\"getRendererImageWidth()\" (input)=\"setRendererImageWidth($any($event.target).valueAsNumber)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Altura (px)</mat-label>\n                            <input matInput type=\"number\" [value]=\"getRendererImageHeight()\" (input)=\"setRendererImageHeight($any($event.target).valueAsNumber)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Forma</mat-label>\n                            <mat-select [value]=\"getRendererImageShape()\" (valueChange)=\"setRendererImageShape($event)\">\n                              <mat-option value=\"square\">Quadrado</mat-option>\n                              <mat-option value=\"rounded\">Arredondado</mat-option>\n                              <mat-option value=\"circle\">Circular</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Fit</mat-label>\n                            <mat-select [value]=\"getRendererImageFit()\" (valueChange)=\"setRendererImageFit($event)\">\n                              <mat-option value=\"cover\">Cover</mat-option>\n                              <mat-option value=\"contain\">Contain</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-slide-toggle [checked]=\"getRendererImageLazy()\" (change)=\"setRendererImageLazy($event.checked)\">Lazy loading</mat-slide-toggle>\n                        </div>\n                      }\n\n                      <!-- Badge configuration -->\n                      @if (uiRendererType === 'badge') {\n                        <div class=\"renderer-config\">\n                          <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Texto (fixo)</mat-label>\n                            <input matInput [value]=\"getRendererBadgeText()\" (input)=\"setRendererBadgeText($any($event.target).value)\" placeholder=\"ex.: Ativo\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do texto</mat-label>\n                            <input matInput [value]=\"getRendererBadgeTextField()\" (input)=\"setRendererBadgeTextField($any($event.target).value)\" placeholder=\"ex.: statusText\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Selecionar campo do texto</mat-label>\n                            <mat-select [ngModel]=\"getRendererBadgeTextField()\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererBadgeTextField($event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">\n                                {{ f.label || f.name }} — {{ f.name }}\n                              </mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Cor</mat-label>\n                            <mat-select [value]=\"getRendererBadgeColor()\" (valueChange)=\"setRendererBadgeColor($event)\">\n                              <mat-option value=\"primary\">Primary</mat-option>\n                              <mat-option value=\"accent\">Accent</mat-option>\n                              <mat-option value=\"warn\">Warn</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Variante</mat-label>\n                            <mat-select [value]=\"getRendererBadgeVariant()\" (valueChange)=\"setRendererBadgeVariant($event)\">\n                              <mat-option value=\"filled\">Preenchido</mat-option>\n                              <mat-option value=\"outlined\">Contornado</mat-option>\n                              <mat-option value=\"soft\">Suave</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ícone (opcional)</mat-label>\n                            <input matInput [value]=\"getRendererBadgeIcon()\" (input)=\"setRendererBadgeIcon($any($event.target).value)\" placeholder=\"ex.: mi:check, check\" />\n                            <mat-hint>Material Symbols (mi:...)</mat-hint>\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Link configuration -->\n                      @if (uiRendererType === 'link') {\n                        <div class=\"renderer-config\">\n                          <mat-slide-toggle [(ngModel)]=\"onlyVisibleRendererFields\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"onRendererFieldToggleChange()\">Somente colunas exibidas</mat-slide-toggle>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Texto</mat-label>\n                            <input matInput [value]=\"getRendererProp('link','text') || ''\" (input)=\"setRendererProp('link','text',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do texto</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('link','textField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('link','textField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>URL</mat-label>\n                            <input matInput [value]=\"getRendererProp('link','href') || ''\" (input)=\"setRendererProp('link','href',$any($event.target).value)\" placeholder=\"https://... ou mailto:...\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo da URL</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('link','hrefField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('link','hrefField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Target</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('link','target') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('link','target',$event)\">\n                              <mat-option [value]=\"null\">(padrão)</mat-option>\n                              <mat-option value=\"_blank\">_blank</mat-option>\n                              <mat-option value=\"_self\">_self</mat-option>\n                              <mat-option value=\"_parent\">_parent</mat-option>\n                              <mat-option value=\"_top\">_top</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>rel</mat-label>\n                            <input matInput [value]=\"getRendererProp('link','rel') || ''\" (input)=\"setRendererProp('link','rel',$any($event.target).value)\" placeholder=\"noopener noreferrer\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Button configuration -->\n                      @if (uiRendererType === 'button') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Rótulo</mat-label>\n                            <input matInput [value]=\"getRendererProp('button','label') || ''\" (input)=\"setRendererProp('button','label',$any($event.target).value)\" placeholder=\"Editar\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do rótulo</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('button','labelField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('button','labelField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ícone</mat-label>\n                            <input matInput [value]=\"getRendererProp('button','icon') || ''\" (input)=\"setRendererProp('button','icon',$any($event.target).value)\" placeholder=\"mi:edit\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Cor</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('button','color') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('button','color',$event)\">\n                              <mat-option [value]=\"null\">(default)</mat-option>\n                              <mat-option value=\"primary\">Primary</mat-option>\n                              <mat-option value=\"accent\">Accent</mat-option>\n                              <mat-option value=\"warn\">Warn</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Variante</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('button','variant') || 'filled'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('button','variant',$event)\">\n                              <mat-option value=\"filled\">Preenchido</mat-option>\n                              <mat-option value=\"outlined\">Contornado</mat-option>\n                              <mat-option value=\"text\">Texto</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Tamanho</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('button','size') || 'md'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('button','size',$event)\">\n                              <mat-option value=\"sm\">Pequeno</mat-option>\n                              <mat-option value=\"md\">Médio</mat-option>\n                              <mat-option value=\"lg\">Grande</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>aria-label</mat-label>\n                            <input matInput [value]=\"getRendererProp('button','ariaLabel') || ''\" (input)=\"setRendererProp('button','ariaLabel',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Condição de desabilitar (DSL)</mat-label>\n                            <input matInput [value]=\"getRendererProp('button','disabledCondition') || ''\" (input)=\"setRendererProp('button','disabledCondition',$any($event.target).value)\" placeholder=\"status == 'Inativo'\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ação (id)</mat-label>\n                            <input matInput [value]=\"(getRendererProp('button','action')?.id) || ''\" (input)=\"setRendererProp('button','action.id',$any($event.target).value)\" placeholder=\"edit, view, delete, ...\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Chip configuration -->\n                      @if (uiRendererType === 'chip') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Texto</mat-label>\n                            <input matInput [value]=\"getRendererProp('chip','text') || ''\" (input)=\"setRendererProp('chip','text',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do texto</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('chip','textField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('chip','textField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Cor</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('chip','color') || 'primary'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('chip','color',$event)\">\n                              <mat-option value=\"primary\">Primary</mat-option>\n                              <mat-option value=\"accent\">Accent</mat-option>\n                              <mat-option value=\"warn\">Warn</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ícone</mat-label>\n                            <input matInput [value]=\"getRendererProp('chip','icon') || ''\" (input)=\"setRendererProp('chip','icon',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Variante</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('chip','variant') || 'filled'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('chip','variant',$event)\">\n                              <mat-option value=\"filled\">Preenchido</mat-option>\n                              <mat-option value=\"outlined\">Contornado</mat-option>\n                              <mat-option value=\"soft\">Suave</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Progress configuration -->\n                      @if (uiRendererType === 'progress') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Expressão de valor (0–100)</mat-label>\n                            <input matInput [value]=\"getRendererProp('progress','valueExpr') || ''\" (input)=\"setRendererProp('progress','valueExpr',$any($event.target).value)\" placeholder=\"= row.percentComplete\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Cor</mat-label>\n                            <input matInput [value]=\"getRendererProp('progress','color') || ''\" (input)=\"setRendererProp('progress','color',$any($event.target).value)\" placeholder=\"#3f51b5\" />\n                          </mat-form-field>\n                          <mat-slide-toggle [checked]=\"!!getRendererProp('progress','showLabel')\" (change)=\"setRendererProp('progress','showLabel',$event.checked)\">Mostrar label</mat-slide-toggle>\n                        </div>\n                      }\n\n                      <!-- Avatar configuration -->\n                      @if (uiRendererType === 'avatar') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Src</mat-label>\n                            <input matInput [value]=\"getRendererProp('avatar','src') || ''\" (input)=\"setRendererProp('avatar','src',$any($event.target).value)\" placeholder=\"https://...\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do src</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('avatar','srcField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('avatar','srcField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Alt</mat-label>\n                            <input matInput [value]=\"getRendererProp('avatar','alt') || ''\" (input)=\"setRendererProp('avatar','alt',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do alt</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('avatar','altField') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('avatar','altField',$event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Iniciais (expr)</mat-label>\n                            <input matInput [value]=\"getRendererProp('avatar','initialsExpr') || ''\" (input)=\"setRendererProp('avatar','initialsExpr',$any($event.target).value)\" placeholder=\"= row.name.split(' ').map(p=>p[0]).join('').toUpperCase()\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Forma</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('avatar','shape') || 'square'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('avatar','shape',$event)\">\n                              <mat-option value=\"square\">Quadrado</mat-option>\n                              <mat-option value=\"rounded\">Arredondado</mat-option>\n                              <mat-option value=\"circle\">Circular</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Tamanho (px)</mat-label>\n                            <input matInput type=\"number\" [value]=\"getRendererProp('avatar','size') || 32\" (input)=\"setRendererProp('avatar','size',$any($event.target).valueAsNumber)\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Toggle configuration -->\n                      @if (uiRendererType === 'toggle') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Estado (expr)</mat-label>\n                            <input matInput [value]=\"getRendererProp('toggle','stateExpr') || ''\" (input)=\"setRendererProp('toggle','stateExpr',$any($event.target).value)\" placeholder=\"= !!row.enabled\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>aria-label</mat-label>\n                            <input matInput [value]=\"getRendererProp('toggle','ariaLabel') || ''\" (input)=\"setRendererProp('toggle','ariaLabel',$any($event.target).value)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Condição de desabilitar (DSL)</mat-label>\n                            <input matInput [value]=\"getRendererProp('toggle','disabledCondition') || ''\" (input)=\"setRendererProp('toggle','disabledCondition',$any($event.target).value)\" placeholder=\"status == 'Inativo'\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ação (id)</mat-label>\n                            <input matInput [value]=\"(getRendererProp('toggle','action')?.id) || ''\" (input)=\"setRendererProp('toggle','action.id',$any($event.target).value)\" placeholder=\"toggle-enabled\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Menu configuration -->\n                      @if (uiRendererType === 'menu') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\" style=\"grid-column: 1/-1;\">\n                            <mat-label>Itens (expr → array)</mat-label>\n                            <input matInput [value]=\"getRendererProp('menu','itemsExpr') || ''\" (input)=\"setRendererProp('menu','itemsExpr',$any($event.target).value)\" placeholder=\"= row.menuItems\" />\n                            <mat-hint>items: Array de &#123; label, id, icon?, visibleCondition? &#125;</mat-hint>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>aria-label</mat-label>\n                            <input matInput [value]=\"getRendererProp('menu','ariaLabel') || ''\" (input)=\"setRendererProp('menu','ariaLabel',$any($event.target).value)\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- HTML configuration -->\n                      @if (uiRendererType === 'html') {\n                        <div class=\"renderer-config\">\n                          <mat-form-field appearance=\"outline\" style=\"grid-column: 1/-1;\">\n                            <mat-label>Template HTML</mat-label>\n                            <textarea matInput rows=\"3\" [ngModel]=\"getRendererProp('html','template') || ''\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('html','template',$event)\" placeholder=\"<b>[[name]]</b>\"></textarea>\n                            <mat-hint>Tokens [[campo]] serão substituídos; conteúdo sanitizado.</mat-hint>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Sanitização</mat-label>\n                            <mat-select [ngModel]=\"getRendererProp('html','sanitize') || 'strict'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setRendererProp('html','sanitize',$event)\">\n                              <mat-option value=\"strict\">Rígida</mat-option>\n                              <mat-option value=\"basic\">Básica</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Fallback vazio</mat-label>\n                            <input matInput [value]=\"getRendererProp('html','emptyFallback') || ''\" (input)=\"setRendererProp('html','emptyFallback',$any($event.target).value)\" />\n                          </mat-form-field>\n                        </div>\n                      }\n\n                      <!-- Compose configuration -->\n                      @if (uiRendererType === 'compose') {\n                        <div class=\"renderer-config\" style=\"grid-column: 1/-1;\">\n                          <div style=\"display:flex; gap:8px; flex-wrap:wrap;\">\n                            <button mat-stroked-button (click)=\"addComposeItem('icon')\">Adicionar Ícone</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('text')\" disabled>Adicionar Texto</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('link')\">Adicionar Link</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('badge')\">Adicionar Badge</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('chip')\">Adicionar Chip</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('progress')\">Adicionar Progresso</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('avatar')\">Adicionar Avatar</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('button')\">Adicionar Botão</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('toggle')\">Adicionar Toggle</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('menu')\">Adicionar Menu</button>\n                            <button mat-stroked-button (click)=\"addComposeItem('html')\">Adicionar HTML</button>\n                          </div>\n                          <div cdkDropList (cdkDropListDropped)=\"onComposeReorder($event)\" style=\"display:grid; gap:8px; margin-top:12px;\">\n                            <div *ngFor=\"let it of getComposeItemsUI(); let i = index\" class=\"compose-item\" cdkDrag [class.selected]=\"composeSelectedIndex === i\" (click)=\"selectComposeItem(i)\" style=\"display:flex; align-items:center; gap:8px; padding:8px; border:1px solid var(--mat-sys-outline-variant); border-radius:6px; cursor:pointer;\">\n                              <mat-icon cdkDragHandle>drag_handle</mat-icon>\n                              <span class=\"chip\">{{ it.type }}</span>\n                              <span style=\"opacity:.7;\">{{ it.summary }}</span>\n                              <span class=\"spacer\"></span>\n                              <button mat-icon-button (click)=\"duplicateComposeItem(i); $event.stopPropagation();\"><mat-icon>content_copy</mat-icon></button>\n                              <button mat-icon-button color=\"warn\" (click)=\"removeComposeItem(i); $event.stopPropagation();\"><mat-icon>delete</mat-icon></button>\n                            </div>\n                          </div>\n                          <div style=\"display:grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap:12px; margin-top:12px;\">\n                            <mat-form-field appearance=\"outline\">\n                              <mat-label>Direção</mat-label>\n                              <mat-select [ngModel]=\"getComposeLayoutProp('direction') || 'row'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setComposeLayoutProp('direction', $event)\">\n                                <mat-option value=\"row\">Linha</mat-option>\n                                <mat-option value=\"column\">Coluna</mat-option>\n                              </mat-select>\n                            </mat-form-field>\n                            <mat-form-field appearance=\"outline\">\n                              <mat-label>Gap (px)</mat-label>\n                              <input matInput type=\"number\" [ngModel]=\"getComposeLayoutProp('gap') || 6\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setComposeLayoutProp('gap', $event)\" />\n                            </mat-form-field>\n                            <mat-form-field appearance=\"outline\">\n                              <mat-label>Alinhamento</mat-label>\n                              <mat-select [ngModel]=\"getComposeLayoutProp('align') || 'start'\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setComposeLayoutProp('align', $event)\">\n                                <mat-option value=\"start\">Início</mat-option>\n                                <mat-option value=\"center\">Centro</mat-option>\n                                <mat-option value=\"end\">Fim</mat-option>\n                              </mat-select>\n                            </mat-form-field>\n                            <mat-slide-toggle [ngModel]=\"!!getComposeLayoutProp('wrap')\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setComposeLayoutProp('wrap', $event)\">Quebrar linha (wrap)</mat-slide-toggle>\n                            <mat-slide-toggle [ngModel]=\"!!getComposeLayoutProp('ellipsis')\" [ngModelOptions]=\"{standalone: true}\" (ngModelChange)=\"setComposeLayoutProp('ellipsis', $event)\">Ellipsis</mat-slide-toggle>\n                          </div>\n                        </div>\n                      }\n\n                      <!-- Validation + Actions + Preview -->\n                      <div class=\"renderer-actions\" style=\"grid-column: 1 / -1;\">\n                        <button mat-raised-button color=\"primary\" (click)=\"onApplyRenderer()\" [disabled]=\"!rendererIsValid\">\n                          Aplicar\n                        </button>\n                        <button mat-stroked-button color=\"warn\" (click)=\"onDiscardRenderer()\">\n                          Descartar\n                        </button>\n                        <button mat-stroked-button (click)=\"onExportRendererJson()\" [disabled]=\"!hasSelectedRenderer()\">\n                          Exportar\n                        </button>\n                        <button mat-stroked-button (click)=\"onImportRendererJson()\">\n                          Importar\n                        </button>\n                        <mat-slide-toggle [(ngModel)]=\"rendererPreviewEnabled\" [ngModelOptions]=\"{standalone: true}\">\n                          Pré-visualizar\n                        </mat-slide-toggle>\n                      </div>\n\n                      <div class=\"renderer-errors\" *ngIf=\"rendererValidationErrors.length\" style=\"grid-column: 1/-1;\">\n                        <div><strong>Corrija antes de aplicar:</strong></div>\n                        <ul style=\"margin:6px 0 0 18px; padding:0;\">\n                          <li *ngFor=\"let err of rendererValidationErrors\">{{ err }}</li>\n                        </ul>\n                      </div>\n\n                      <div class=\"renderer-preview\" *ngIf=\"rendererPreviewEnabled\" style=\"grid-column: 1/-1;\">\n                        <div style=\"display:flex; align-items:center; gap:8px; margin-bottom:6px;\">\n                          <mat-icon>visibility</mat-icon>\n                          <div style=\"opacity:.75;\">Pré-visualização (amostras)</div>\n                        </div>\n                        <div class=\"renderer-preview-list\">\n                          <ng-container *ngFor=\"let row of previewRows; trackBy: trackByIdx\">\n                            <ng-container [ngSwitch]=\"getPreviewRendererType(row)\">\n                              <ng-container *ngSwitchCase=\"'icon'\">\n                                <mat-icon [ngStyle]=\"getPreviewIconStyle(row)\" [color]=\"getPreviewIconColor(row) || null\">{{ getPreviewIconName(row) }}</mat-icon>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'image'\">\n                                <img class=\"pfx-cell-image\" [src]=\"getPreviewImageSrc(row) || ''\" [attr.alt]=\"getPreviewImageAlt(row) || ''\" [style.width.px]=\"getPreviewImageWidth()\" [style.height.px]=\"getPreviewImageHeight()\" [class.shape-rounded]=\"getPreviewImageShape() === 'rounded'\" [class.shape-circle]=\"getPreviewImageShape() === 'circle'\" [style.object-fit]=\"getPreviewImageFit() || 'cover'\" />\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'badge'\">\n                                <span class=\"pfx-badge\" [ngClass]=\"getPreviewBadgeClasses(row)\">\n                                  <mat-icon *ngIf=\"getPreviewBadgeIcon(row) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon>\n                                  <span class=\"pfx-badge-text\">{{ getPreviewBadgeText(row) }}</span>\n                                </span>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'link'\">\n                                <a class=\"pfx-link\" [attr.href]=\"getPreviewLinkHref(row) || null\" (click)=\"$event.preventDefault()\">{{ getPreviewLinkText(row) || '(link)' }}</a>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'button'\">\n                                <button mat-stroked-button>\n                                  <mat-icon *ngIf=\"getPreviewButtonIcon() as bi\">{{ bi }}</mat-icon>\n                                  {{ getPreviewButtonLabel(row) || 'Botão' }}\n                                </button>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'chip'\">\n                                <span class=\"pfx-chip\" [ngClass]=\"getPreviewChipClasses()\">\n                                  <span class=\"pfx-chip-text\">{{ getPreviewChipText(row) || 'Chip' }}</span>\n                                </span>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'progress'\">\n                                <div class=\"pfx-progress\"><div class=\"pfx-progress-bar\" [style.width.%]=\"getPreviewProgressValue(row)\"></div></div>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'avatar'\">\n                                <ng-container *ngIf=\"getPreviewAvatarSrc(row) as asrc; else prevInitials\">\n                                  <img class=\"pfx-avatar\" [src]=\"asrc\" [ngStyle]=\"getPreviewAvatarStyle()\" [class.shape-rounded]=\"getPreviewAvatarShape() === 'rounded'\" [class.shape-circle]=\"getPreviewAvatarShape() === 'circle'\" />\n                                </ng-container>\n                                <ng-template #prevInitials>\n                                  <span class=\"pfx-avatar pfx-avatar--initials\" [ngStyle]=\"getPreviewAvatarStyle()\" [class.shape-rounded]=\"getPreviewAvatarShape() === 'rounded'\" [class.shape-circle]=\"getPreviewAvatarShape() === 'circle'\">{{ getPreviewAvatarInitials(row) || 'AB' }}</span>\n                                </ng-template>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'toggle'\">\n                                <mat-slide-toggle [checked]=\"getPreviewToggleState(row)\"></mat-slide-toggle>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'menu'\">\n                                <span class=\"pfx-chip pfx-chip--outlined\">menu({{ getPreviewMenuCount(row) }})</span>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'html'\">\n                                <span [innerHTML]=\"getPreviewHtml(row)\"></span>\n                              </ng-container>\n                              <ng-container *ngSwitchCase=\"'compose'\">\n                                <span class=\"pfx-compose\">\n                                  <span class=\"pfx-chip pfx-chip--outlined\" *ngFor=\"let it of getComposeItemsUI()\">{{ it.type }}</span>\n                                </span>\n                              </ng-container>\n                              <ng-container *ngSwitchDefault>\n                                <span style=\"opacity:.6\">(texto)</span>\n                              </ng-container>\n                            </ng-container>\n                          </ng-container>\n                        </div>\n                      </div>\n                      </div>\n                  </mat-expansion-panel>\n                </div>\n\n                <!-- Conditional Overrides -->\n                <div class=\"form-section\">\n                  <mat-divider></mat-divider>\n                  <mat-expansion-panel>\n                    <mat-expansion-panel-header>\n                      <mat-panel-title>\n                        <mat-icon>rule</mat-icon>\n                        Overrides Condicionais\n                      </mat-panel-title>\n                      <mat-panel-description>\n                        Regras para substituir o renderer por condição (first‑match wins)\n                      </mat-panel-description>\n                    </mat-expansion-panel-header>\n\n                    <div style=\"display:flex; gap:8px; align-items:center; margin-bottom:8px;\">\n                      <button mat-stroked-button color=\"primary\" (click)=\"addConditionalOverride()\"><mat-icon>add</mat-icon> Adicionar Override</button>\n                    </div>\n                    <div cdkDropList (cdkDropListDropped)=\"onConditionalOverrideReorder($event)\" style=\"display:grid; gap:8px;\">\n                      <div *ngFor=\"let ov of getConditionalOverrides(); let i = index\" class=\"cond-ov-item\" cdkDrag [class.selected]=\"condOverridesSelectedIndex === i\" (click)=\"selectConditionalOverride(i)\" style=\"display:flex; align-items:center; gap:8px; padding:8px; border:1px solid var(--mat-sys-outline-variant); border-radius:6px; cursor:pointer;\">\n                        <mat-icon cdkDragHandle>drag_handle</mat-icon>\n                        <mat-slide-toggle [(ngModel)]=\"ov.enabled\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"onColumnPropertyChange()\">Ativo</mat-slide-toggle>\n                        <span class=\"chip\">{{ ov.renderer?.type || '(tipo)' }}</span>\n                        <span style=\"opacity:.7;\">{{ ov.description || ov.condition }}</span>\n                        <span class=\"spacer\"></span>\n                        <button mat-icon-button (click)=\"duplicateConditionalOverride(i); $event.stopPropagation();\" matTooltip=\"Duplicar\"><mat-icon>content_copy</mat-icon></button>\n                        <button mat-icon-button (click)=\"exportOverrideJson(i); $event.stopPropagation();\" matTooltip=\"Exportar\"><mat-icon>ios_share</mat-icon></button>\n                        <button mat-icon-button (click)=\"importOverrideJson(i); $event.stopPropagation();\" matTooltip=\"Importar\"><mat-icon>download</mat-icon></button>\n                        <button mat-icon-button color=\"warn\" (click)=\"removeConditionalOverride(i); $event.stopPropagation();\" matTooltip=\"Remover\"><mat-icon>delete</mat-icon></button>\n                      </div>\n                    </div>\n\n                    <!-- Editor do override selecionado (simplificado) -->\n                    <div *ngIf=\"getConditionalOverrides()[condOverridesSelectedIndex] as selectedOv\" style=\"display:grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap:12px; margin-top:12px;\">\n                      <mat-form-field appearance=\"outline\" style=\"grid-column: 1 / -1;\">\n                        <mat-label>Condição (DSL)</mat-label>\n                        <input matInput [ngModel]=\"selectedOv.condition\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"selectedOv.condition = $event; onColumnPropertyChange();\" placeholder=\"status == 'Ativo'\" />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Tipo</mat-label>\n                        <mat-select [ngModel]=\"selectedOv.renderer?.type || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"onOverrideTypeChange(selectedOv, $event)\">\n                          <mat-option [value]=\"''\">(manter atual)</mat-option>\n                          <mat-option value=\"icon\">Ícone</mat-option>\n                          <mat-option value=\"image\">Imagem</mat-option>\n                          <mat-option value=\"badge\">Badge</mat-option>\n                          <mat-option value=\"link\">Link</mat-option>\n                          <mat-option value=\"button\">Botão</mat-option>\n                          <mat-option value=\"chip\">Chip</mat-option>\n                          <mat-option value=\"progress\">Progresso</mat-option>\n                          <mat-option value=\"avatar\">Avatar</mat-option>\n                          <mat-option value=\"toggle\">Toggle</mat-option>\n                          <mat-option value=\"menu\">Menu</mat-option>\n                          <mat-option value=\"html\">HTML</mat-option>\n                          <mat-option value=\"compose\">Compose</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <!-- Form simplificado por tipo mais comum (ícone/imagem/badge) -->\n                      <ng-container [ngSwitch]=\"selectedOv.renderer?.type\">\n                        <ng-container *ngSwitchCase=\"'icon'\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Ícone (name)</mat-label>\n                            <input matInput [ngModel]=\"getOverrideField('renderer.icon.name') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.icon.name', $event)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do ícone</mat-label>\n                            <mat-select [ngModel]=\"getOverrideField('renderer.icon.nameField') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.icon.nameField', $event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                        </ng-container>\n                        <ng-container *ngSwitchCase=\"'image'\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Src</mat-label>\n                            <input matInput [ngModel]=\"getOverrideField('renderer.image.src') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.image.src', $event)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do src</mat-label>\n                            <mat-select [ngModel]=\"getOverrideField('renderer.image.srcField') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.image.srcField', $event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                        </ng-container>\n                        <ng-container *ngSwitchCase=\"'badge'\">\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Texto</mat-label>\n                            <input matInput [ngModel]=\"getOverrideField('renderer.badge.text') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.badge.text', $event)\" />\n                          </mat-form-field>\n                          <mat-form-field appearance=\"outline\">\n                            <mat-label>Campo do texto</mat-label>\n                            <mat-select [ngModel]=\"getOverrideField('renderer.badge.textField') || ''\" [ngModelOptions]=\"{standalone:true}\" (ngModelChange)=\"setOverrideField('renderer.badge.textField', $event)\">\n                              <mat-option *ngFor=\"let f of rendererFieldOptions\" [value]=\"f.name\">{{ f.label || f.name }} — {{ f.name }}</mat-option>\n                            </mat-select>\n                          </mat-form-field>\n                        </ng-container>\n                      </ng-container>\n                    </div>\n                  </mat-expansion-panel>\n                </div>\n              </form>\n            </div>\n          }\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class ColumnsConfigEditorComponent implements OnInit, OnDestroy {\n  @Input() config: TableConfig = { columns: [] };\n  @Output() configChange = new EventEmitter<TableConfig>();\n  @Output() columnChange = new EventEmitter<ColumnChange>();\n\n  // Component state\n  columns: ExtendedColumnDefinition[] = [];\n  selectedColumnIndex = -1;\n  selectedColumn: ExtendedColumnDefinition | null = null;\n  isV2Config = false;\n\n  // Formula builder data\n  availableDataSchema: FieldSchema[] = [];\n\n  // Style rules integration\n  currentFieldSchemas: FieldSchema[] = [];\n  sampleTableData: any[] = [];\n\n  // Global settings\n  globalSortableEnabled = true;\n  globalAlignment: 'left' | 'center' | 'right' | null = null;\n  visibilityState: 'all' | 'none' | null = null;\n\n  // V2 specific features\n  globalResizable = false;\n  globalStickyEnabled = false;\n\n  // Race condition prevention\n  private operationInProgress = false;\n  private columnOperationSubject = new Subject<() => void>();\n\n  // Dependency injection\n  private readonly destroyRef = inject(DestroyRef);\n\n  // Cleanup\n  private destroy$ = new Subject<void>();\n\n  // Renderer field picker state\n  onlyVisibleRendererFields = true;\n  uiRendererType: 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose' | null = null;\n  private _rendererApplyTimer: any = null;\n  rendererFieldOptions: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n  uiRendererConditional = false;\n\n  // Conditional Renderer Overrides (UI state)\n  condOverridesSelectedIndex = -1;\n  getConditionalOverrides(): any[] {\n    const col: any = this.selectedColumn as any;\n    const arr = Array.isArray(col?.conditionalRenderers) ? col.conditionalRenderers : [];\n    return arr;\n  }\n  ensureConditionalOverrides(): any[] {\n    if (!this.selectedColumn) return [];\n    const col: any = this.selectedColumn as any;\n    if (!Array.isArray(col.conditionalRenderers)) col.conditionalRenderers = [];\n    return col.conditionalRenderers;\n  }\n  addConditionalOverride(): void {\n    const list = this.ensureConditionalOverrides();\n    list.push({ condition: \"status == 'Ativo'\", renderer: { type: 'badge', badge: { text: 'Ativo', color: 'primary' } }, description: 'Exemplo', enabled: true });\n    this.condOverridesSelectedIndex = list.length - 1;\n    this.onColumnPropertyChange();\n  }\n  removeConditionalOverride(index: number): void {\n    const list = this.ensureConditionalOverrides();\n    if (index < 0 || index >= list.length) return;\n    list.splice(index, 1);\n    if (this.condOverridesSelectedIndex >= list.length) this.condOverridesSelectedIndex = list.length - 1;\n    this.onColumnPropertyChange();\n  }\n  duplicateConditionalOverride(index: number): void {\n    const list = this.ensureConditionalOverrides();\n    const it = list[index]; if (!it) return;\n    list.splice(index + 1, 0, JSON.parse(JSON.stringify(it)));\n    this.condOverridesSelectedIndex = index + 1;\n    this.onColumnPropertyChange();\n  }\n  onConditionalOverrideReorder(event: any): void {\n    const list = this.ensureConditionalOverrides();\n    const prev = event.previousIndex, curr = event.currentIndex;\n    if (prev === curr || prev < 0 || curr < 0 || prev >= list.length || curr >= list.length) return;\n    const [moved] = list.splice(prev, 1);\n    list.splice(curr, 0, moved);\n    this.condOverridesSelectedIndex = curr;\n    this.onColumnPropertyChange();\n  }\n  selectConditionalOverride(index: number): void { this.condOverridesSelectedIndex = index; }\n  // Simple getters/setters for override editing\n  getOverrideField(path: string): any {\n    const it = this.getConditionalOverrides()[this.condOverridesSelectedIndex];\n    if (!it) return undefined;\n    try { return path.split('.').reduce((o, k) => (o ? o[k] : undefined), it); } catch { return undefined; }\n  }\n  setOverrideField(path: string, value: any): void {\n    const list = this.ensureConditionalOverrides();\n    const it = list[this.condOverridesSelectedIndex];\n    if (!it) return;\n    const parts = path.split('.');\n    let ref = it;\n    for (let i = 0; i < parts.length - 1; i++) { const k = parts[i]; ref[k] = ref[k] || {}; ref = ref[k]; }\n    ref[parts[parts.length - 1]] = value;\n    this.onColumnPropertyChange();\n  }\n  onOverrideTypeChange(ov: any, val: string): void {\n    if (!ov) return;\n    ov.renderer = ov.renderer || {};\n    ov.renderer.type = val;\n    this.onColumnPropertyChange();\n  }\n  // Import/Export for override.renderer\n  exportOverrideJson(index: number): void {\n    const it = this.getConditionalOverrides()[index];\n    const json = JSON.stringify(it?.renderer || {}, null, 2);\n    try { if ((navigator as any)?.clipboard?.writeText) (navigator as any).clipboard.writeText(json); } catch {}\n  }\n  importOverrideJson(index: number): void {\n    const list = this.ensureConditionalOverrides();\n    const it = list[index]; if (!it) return;\n    let input = '';\n    try { if ((window as any)?.prompt) input = (window as any).prompt('Cole o JSON do renderer (override)', '{}') || ''; } catch {}\n    if (!input) return;\n    try {\n      const parsed = JSON.parse(input);\n      const sanitized = this.sanitizeRenderer(parsed);\n      it.renderer = sanitized || {};\n      this.onColumnPropertyChange();\n      this.validateRenderer();\n    } catch {}\n  }\n  // Renderer apply/preview state\n  rendererValidationErrors: string[] = [];\n  rendererIsValid = true;\n  rendererPreviewEnabled = true;\n  private rendererAppliedSnapshot: any = null;\n  previewRows: any[] = [];\n\n  private refreshRendererFieldOptions(): void {\n    const options: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n    try {\n      const schema = (this.currentFieldSchemas?.length ? this.currentFieldSchemas : this.availableDataSchema) || [];\n      const visibleSet = new Set(\n        (this.columns || [])\n          .filter((c) => c && (c as any).visible !== false)\n          .map((c) => c.field),\n      );\n      const pushUnique = (name: string, label?: string, type?: string) => {\n        if (!name) return;\n        if (!options.some((o) => o.name === name)) {\n          options.push({ name, label: label || name, type, isVisible: visibleSet.has(name) });\n        }\n      };\n      schema.forEach((f: any) => pushUnique(f?.name, f?.label || f?.name, f?.type));\n      (this.columns || []).forEach((c) => pushUnique(c.field, c.header || c.field, (c as any)?.type));\n    } catch {}\n    const filtered = this.onlyVisibleRendererFields ? options.filter((o) => o.isVisible) : options;\n    this.rendererFieldOptions = filtered.sort((a, b) => {\n      if (a.isVisible !== b.isVisible) return a.isVisible ? -1 : 1;\n      const la = (a.label || a.name).toLowerCase();\n      const lb = (b.label || b.name).toLowerCase();\n      return la.localeCompare(lb);\n    });\n  }\n\n  getRendererFieldOptions(): Array<{ name: string; label: string; type?: string; isVisible: boolean }> {\n    const options: Array<{ name: string; label: string; type?: string; isVisible: boolean }> = [];\n    try {\n      const schema = (this.currentFieldSchemas?.length ? this.currentFieldSchemas : this.availableDataSchema) || [];\n      const visibleSet = new Set(\n        (this.columns || [])\n          .filter((c) => c && (c as any).visible !== false)\n          .map((c) => c.field),\n      );\n      const pushUnique = (name: string, label?: string, type?: string) => {\n        if (!name) return;\n        if (!options.some((o) => o.name === name)) {\n          options.push({ name, label: label || name, type, isVisible: visibleSet.has(name) });\n        }\n      };\n      schema.forEach((f: any) => pushUnique(f?.name, f?.label || f?.name, f?.type));\n      (this.columns || []).forEach((c) => pushUnique(c.field, c.header || c.field, (c as any)?.type));\n    } catch {}\n    const filtered = this.onlyVisibleRendererFields ? options.filter((o) => o.isVisible) : options;\n    return filtered.sort((a, b) => {\n      if (a.isVisible !== b.isVisible) return a.isVisible ? -1 : 1;\n      const la = (a.label || a.name).toLowerCase();\n      const lb = (b.label || b.name).toLowerCase();\n      return la.localeCompare(lb);\n    });\n  }\n\n  // Public hook for template toggles\n  onRendererFieldToggleChange(): void {\n    try {\n      this.refreshRendererFieldOptions();\n      this.cdr.markForCheck();\n    } catch {}\n  }\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    // private tableRuleEngine: TableRuleEngineService,\n    // private fieldSchemaAdapter: FieldSchemaAdapter\n  ) {}\n\n  ngOnInit(): void {\n    this.isV2Config = isTableConfigV2(this.config);\n\n    if (this.config?.columns) {\n      // Deep clone columns to avoid mutating the @Input() config by reference\n      this.columns = (this.config.columns || []).map((col) =>\n        JSON.parse(JSON.stringify(col)),\n      ) as ExtendedColumnDefinition[];\n      this.updateGlobalSettings();\n      this.generateAvailableDataSchema();\n      this.refreshRendererFieldOptions();\n      this.generateSampleData();\n      // this.initializeStyleRules();\n    }\n\n    // Setup debounced column operations to prevent race conditions\n    this.columnOperationSubject\n      .pipe(debounceTime(100), takeUntilDestroyed(this.destroyRef))\n      .subscribe((operation) => {\n        try { console.debug('[ColumnsEditor] scheduledOp:begin'); } catch {}\n        this.operationInProgress = true;\n        try {\n          operation();\n        } finally {\n          this.operationInProgress = false;\n          try { console.debug('[ColumnsEditor] scheduledOp:end'); } catch {}\n        }\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private updateGlobalSettings(): void {\n    // Check if all columns have sortable enabled\n    this.globalSortableEnabled = this.columns.every(\n      (col) => col.sortable !== false,\n    );\n\n    // Check if all columns have the same alignment\n    const alignments = this.columns.map((col) => col.align).filter(Boolean);\n    const uniqueAlignments = [...new Set(alignments)];\n    this.globalAlignment =\n      uniqueAlignments.length === 1 ? (uniqueAlignments[0] as any) : null;\n\n    // Update visibility state\n    this.updateVisibilityState();\n\n    // V2 specific global settings\n    if (this.isV2Config) {\n      this.globalResizable = this.columns.every(\n        (col) => (col as any).resizable !== false,\n      );\n      this.globalStickyEnabled = this.columns.some(\n        (col) => (col as any).sticky === true,\n      );\n    }\n  }\n\n  private updateVisibilityState(): void {\n    if (this.areAllColumnsVisible()) {\n      this.visibilityState = 'all';\n    } else if (this.areAllColumnsHidden()) {\n      this.visibilityState = 'none';\n    } else {\n      this.visibilityState = null;\n    }\n  }\n\n  // Visibility Helper Methods\n  getVisibleColumnsCount(): number {\n    return this.columns.filter((col) => col.visible).length;\n  }\n\n  areAllColumnsVisible(): boolean {\n    return this.columns.length > 0 && this.columns.every((col) => col.visible);\n  }\n\n  areAllColumnsHidden(): boolean {\n    return this.columns.length > 0 && this.columns.every((col) => !col.visible);\n  }\n\n  onVisibilityChange(state: 'all' | 'none'): void {\n    if (state === 'all') {\n      this.showAllColumns();\n    } else if (state === 'none') {\n      this.hideAllColumns();\n    }\n  }\n\n  // Global Actions\n  showAllColumns(): void {\n    this.columns.forEach((column) => (column.visible = true));\n    this.updateVisibilityState();\n    this.emitConfigChange('global');\n  }\n\n  hideAllColumns(): void {\n    this.columns.forEach((column) => (column.visible = false));\n    this.updateVisibilityState();\n    this.emitConfigChange('global');\n  }\n\n  applyGlobalSortable(enabled: boolean): void {\n    this.columns.forEach((column) => {\n      if (!this.isColumnExplicitlySet(column, 'sortable')) {\n        column.sortable = enabled;\n      }\n    });\n    this.emitConfigChange('global');\n  }\n\n  applyGlobalAlignment(alignment: 'left' | 'center' | 'right'): void {\n    this.columns.forEach((column) => {\n      if (!this.isColumnExplicitlySet(column, 'align')) {\n        column.align = alignment;\n      }\n    });\n    this.emitConfigChange('global');\n  }\n\n  // V2 Global Actions\n  applyGlobalResizable(enabled: boolean): void {\n    if (this.isV2Config) {\n      this.columns.forEach((column) => {\n        if (!this.isColumnExplicitlySet(column, 'resizable')) {\n          (column as any).resizable = enabled;\n        }\n      });\n      this.emitConfigChange('global');\n    }\n  }\n\n  applyGlobalSticky(enabled: boolean): void {\n    if (this.isV2Config) {\n      this.columns.forEach((column) => {\n        (column as any).sticky = enabled;\n      });\n      this.emitConfigChange('global');\n    }\n  }\n\n  private isColumnExplicitlySet(\n    column: ExtendedColumnDefinition,\n    property: keyof ExtendedColumnDefinition | string,\n  ): boolean {\n    // In a real implementation, you might track which properties were explicitly set\n    // For now, we'll assume all are explicit if they differ from default\n    return false;\n  }\n\n  // Column Selection\n  selectColumn(index: number): void {\n    // Validate index\n    if (index < -1 || index >= this.columns.length) {\n      console.warn('Invalid column index for selection:', index);\n      index = -1;\n    }\n\n    this.selectedColumnIndex = index;\n    this.selectedColumn =\n      index >= 0 && index < this.columns.length ? this.columns[index] : null;\n    // Sync UI renderer type when selection changes\n    this.uiRendererType = this.getRendererType(this.selectedColumn);\n    this.uiRendererConditional = !!((this.selectedColumn as any)?.renderer?.typeExpr);\n    // snapshot current renderer for discard\n    this.rendererAppliedSnapshot = this.selectedColumn ? this._deepClone((this.selectedColumn as any).renderer) : null;\n    this.validateRenderer();\n    this.ensurePreviewRows();\n    this.refreshRendererFieldOptions();\n    this.cdr.markForCheck();\n  }\n\n  // Column Management\n  addNewColumn(): void {\n    if (this.operationInProgress) return;\n\n    this.columnOperationSubject.next(() => {\n      // Generate unique field name\n      let fieldIndex = this.columns.length + 1;\n      let fieldName = `calculatedField${fieldIndex}`;\n\n      // Ensure field name is unique\n      while (this.columns.some((col) => col.field === fieldName)) {\n        fieldIndex++;\n        fieldName = `calculatedField${fieldIndex}`;\n      }\n\n      const newColumn: ExtendedColumnDefinition = {\n        field: fieldName,\n        header: `Nova Coluna Calculada ${fieldIndex}`,\n        visible: true,\n        align: 'left',\n        sortable: true,\n        order: this.columns.length,\n        type: 'string',\n        _isApiField: false,\n        calculationType: 'none',\n        calculationParams: {},\n        _generatedValueGetter: '',\n      };\n\n      this.columns = [...this.columns, newColumn];\n      this.selectColumn(this.columns.length - 1);\n      this.emitConfigChange('add');\n    });\n  }\n\n  removeColumn(index: number, event: Event): void {\n    event.stopPropagation();\n\n    if (this.operationInProgress) return;\n\n    // Validate bounds\n    if (index < 0 || index >= this.columns.length) {\n      console.warn('Invalid column index for removal:', index);\n      return;\n    }\n\n    this.columnOperationSubject.next(() => {\n      // Create new array without the removed column\n      this.columns = this.columns.filter((_, i) => i !== index);\n\n      // Update orders\n      this.updateColumnOrders();\n\n      // Adjust selection properly\n      if (this.selectedColumnIndex === index) {\n        // Column being removed was selected - clear selection\n        this.selectedColumnIndex = -1;\n        this.selectedColumn = null;\n      } else if (this.selectedColumnIndex > index) {\n        // Selected column is after removed column - adjust index\n        this.selectedColumnIndex--;\n        // Ensure the selected column reference is updated\n        if (\n          this.selectedColumnIndex >= 0 &&\n          this.selectedColumnIndex < this.columns.length\n        ) {\n          this.selectedColumn = this.columns[this.selectedColumnIndex];\n        } else {\n          // Safety check - clear selection if index is invalid\n          this.selectedColumnIndex = -1;\n          this.selectedColumn = null;\n        }\n      }\n      // If selectedColumnIndex < index, no adjustment needed\n\n      this.emitConfigChange('remove');\n      this.cdr.markForCheck();\n    });\n  }\n\n  onColumnReorder(event: CdkDragDrop<ExtendedColumnDefinition[]>): void {\n    if (\n      event.previousIndex === event.currentIndex ||\n      this.operationInProgress\n    ) {\n      return;\n    }\n\n    // Validate indices\n    if (\n      event.previousIndex < 0 ||\n      event.previousIndex >= this.columns.length ||\n      event.currentIndex < 0 ||\n      event.currentIndex >= this.columns.length\n    ) {\n      console.warn(\n        'Invalid indices for reorder:',\n        event.previousIndex,\n        event.currentIndex,\n      );\n      return;\n    }\n\n    this.columnOperationSubject.next(() => {\n      // Create a new array to avoid direct mutation\n      const newColumns = [...this.columns];\n      moveItemInArray(newColumns, event.previousIndex, event.currentIndex);\n      this.columns = newColumns;\n\n      this.updateColumnOrders();\n\n      // Update selection index if needed\n      let newSelectedIndex = this.selectedColumnIndex;\n\n      if (this.selectedColumnIndex === event.previousIndex) {\n        // The selected item was moved\n        newSelectedIndex = event.currentIndex;\n      } else if (event.previousIndex < event.currentIndex) {\n        // Item moved forward\n        if (\n          this.selectedColumnIndex > event.previousIndex &&\n          this.selectedColumnIndex <= event.currentIndex\n        ) {\n          newSelectedIndex--;\n        }\n      } else {\n        // Item moved backward\n        if (\n          this.selectedColumnIndex >= event.currentIndex &&\n          this.selectedColumnIndex < event.previousIndex\n        ) {\n          newSelectedIndex++;\n        }\n      }\n\n      // Update selection with validation\n      if (newSelectedIndex !== this.selectedColumnIndex) {\n        this.selectedColumnIndex = newSelectedIndex;\n        if (\n          this.selectedColumnIndex >= 0 &&\n          this.selectedColumnIndex < this.columns.length\n        ) {\n          this.selectedColumn = this.columns[this.selectedColumnIndex];\n        }\n      }\n\n      this.emitConfigChange('reorder');\n      this.cdr.markForCheck();\n    });\n  }\n\n  private updateColumnOrders(): void {\n    this.columns.forEach((column, index) => {\n      column.order = index;\n    });\n  }\n\n  // Column Property Changes\n  onColumnPropertyChange(): void {\n    if (this.operationInProgress) {\n      try { console.debug('[ColumnsEditor] onColumnPropertyChange:skipped (opInProgress)'); } catch {}\n      return;\n    }\n    try { console.debug('[ColumnsEditor] onColumnPropertyChange:schedule'); } catch {}\n    this.columnOperationSubject.next(() => {\n      try { console.debug('[ColumnsEditor] onColumnPropertyChange:execute'); } catch {}\n      this.updateVisibilityState();\n      this.emitConfigChange('update');\n      // this.updateFieldSchemasForStyleRules();\n      try { console.debug('[ColumnsEditor] onColumnPropertyChange:done'); } catch {}\n    });\n  }\n\n  isExistingColumn(column: ColumnDefinition): boolean {\n    // Columns are considered existing (from API/schema) if they have the _isApiField flag\n    // This provides a more robust way to identify API columns vs calculated columns\n    return column._isApiField === true;\n  }\n\n  isCalculatedColumn(column: ColumnDefinition): boolean {\n    // Simplified logic: A column is calculated if:\n    // 1. It was created manually in the editor (_isApiField === false), OR\n    // 2. It's an API field but has a formula applied to it\n\n    if (column._isApiField !== true) {\n      // Column created manually in editor - always calculated\n      return true;\n    }\n\n    // API field with applied formula/calculation\n    const extendedColumn = column as any;\n    return (\n      !!(\n        extendedColumn.calculationType &&\n        extendedColumn.calculationType !== 'none'\n      ) ||\n      !!(column._generatedValueGetter && column._generatedValueGetter.trim())\n    );\n  }\n\n  hasValueGetterError(column: ColumnDefinition): boolean {\n    const valueGetter = (column as any).valueGetter;\n    if (!valueGetter || typeof valueGetter !== 'string') {\n      return false;\n    }\n\n    // Basic JavaScript syntax validation\n    try {\n      // Create a function to test syntax without executing\n      new Function('rowData', `return ${valueGetter}`);\n      return false;\n    } catch {\n      return true;\n    }\n  }\n\n  // Formula Builder Integration\n  private generateAvailableDataSchema(): void {\n    // Generate schema from API fields only\n    this.availableDataSchema = this.columns\n      .filter((col) => col._isApiField === true) // Only use columns from API schema\n      .map((col) => ({\n        name: col.field,\n        label: col.header || col.field,\n        type: this.mapColumnTypeToFieldType(\n          (col._originalApiType || col.type || 'string') as ColumnDataType,\n        ),\n        path: col.field,\n      }));\n\n    // If no API fields are available yet, add some common examples for the formula builder\n    if (this.availableDataSchema.length === 0) {\n      this.availableDataSchema.push(\n        { name: 'id', label: 'ID', type: 'number', path: 'id' },\n        { name: 'name', label: 'Nome', type: 'string', path: 'name' },\n        { name: 'email', label: 'Email', type: 'string', path: 'email' },\n        { name: 'status', label: 'Status', type: 'string', path: 'status' },\n        { name: 'isActive', label: 'Ativo', type: 'boolean', path: 'isActive' },\n        {\n          name: 'createdAt',\n          label: 'Data de Criação',\n          type: 'date',\n          path: 'createdAt',\n        },\n        { name: 'price', label: 'Preço', type: 'number', path: 'price' },\n      );\n    }\n  }\n\n  /**\n   * Map ColumnDataType to FieldSchema type\n   */\n  private mapColumnTypeToFieldType(\n    columnType: ColumnDataType,\n  ): 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array' {\n    switch (columnType) {\n      case 'number':\n      case 'currency':\n      case 'percentage':\n        return 'number';\n      case 'date':\n        return 'date';\n      case 'boolean':\n        return 'boolean';\n      case 'string':\n      case 'custom':\n      default:\n        return 'string';\n    }\n  }\n\n  getColumnFormula(\n    column: ColumnDefinition | null,\n  ): FormulaDefinition | undefined {\n    if (!column) return undefined;\n\n    const extendedColumn = column as any;\n    return {\n      type: extendedColumn.calculationType || 'none',\n      params: extendedColumn.calculationParams || {},\n    };\n  }\n\n  onFormulaChange(formula: FormulaDefinition): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n    // Verify column still exists in array\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    this.selectedColumn.calculationType = formula.type;\n    this.selectedColumn.calculationParams = formula.params;\n    this.onColumnPropertyChange();\n  }\n\n  onGeneratedExpressionChange(expression: string): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n    // Verify column still exists\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    this.selectedColumn._generatedValueGetter = expression;\n    this.onColumnPropertyChange();\n  }\n\n  // Value Mapping Management\n  getMappingCount(column: ColumnDefinition): number {\n    const extendedColumn = column as any;\n    return extendedColumn.valueMapping\n      ? Object.keys(extendedColumn.valueMapping).length\n      : 0;\n  }\n\n  getMappingTooltip(column: ColumnDefinition): string {\n    const count = this.getMappingCount(column);\n    if (count === 0) {\n      return 'Sem mapeamentos definidos';\n    } else if (count === 1) {\n      return '1 mapeamento definido';\n    } else {\n      return `${count} mapeamentos definidos`;\n    }\n  }\n\n  getMappingPanelDescription(column: ColumnDefinition | null): string {\n    if (!column) return 'Nenhuma coluna selecionada';\n\n    const count = this.getMappingCount(column);\n    if (count === 0) {\n      return 'Converter valores brutos em texto amigável';\n    } else if (count === 1) {\n      return '1 mapeamento definido';\n    } else {\n      return `${count} mapeamentos definidos`;\n    }\n  }\n\n  getColumnMapping(column: ColumnDefinition | null): {\n    [key: string | number]: string;\n  } {\n    // Important: return a stable reference. Returning a new `{}` on each\n    // change detection causes the child component (ValueMappingEditor)\n    // to see an @Input change and reset its internal state.\n    if (!column) return this._emptyMappingRef;\n\n    const extendedColumn = column as any;\n    if (!extendedColumn.valueMapping) {\n      // Lazily initialize once to keep the same reference across checks\n      extendedColumn.valueMapping = {} as { [key: string | number]: string };\n    }\n    return extendedColumn.valueMapping;\n  }\n\n  // =============================\n  // Renderer helpers (Phase 1)\n  // =============================\n  getRendererType(col: ColumnDefinition | null): 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | null {\n    return (col as any)?.renderer?.type || null;\n  }\n  onRendererTypeChange(type: 'icon' | 'image' | 'badge' | null): void {\n    try {\n      console.debug('[ColumnsEditor] rendererTypeChange:start', {\n        type,\n        selectedIndex: this.selectedColumnIndex,\n        opInProgress: this.operationInProgress,\n      });\n    } catch {}\n    this.uiRendererType = type;\n    // Apenas armazena escolha; aplicaremos quando o overlay fechar\n    // (onRendererModeClosed) para evitar travar o fechamento do menu.\n    try {\n      console.debug('[ColumnsEditor] rendererTypeChange:end', {\n        type,\n        selectedIndex: this.selectedColumnIndex,\n      });\n    } catch {}\n  }\n\n  onRendererModeClosed(): void {\n    // Aplicar mudança do modo de renderização ao modelo e emitir update\n    const type = this.uiRendererType;\n    try {\n      console.debug('[ColumnsEditor] rendererMode:closed', { type });\n    } catch {}\n    if (!this.selectedColumn) return;\n    const current = this.getRendererType(this.selectedColumn);\n    if (current === type) return;\n    if (!type) {\n      delete (this.selectedColumn as any).renderer;\n    } else {\n      (this.selectedColumn as any).renderer = { type } as any;\n    }\n    // Defer the config emission slightly to let the overlay finish closing\n    try { console.debug('[ColumnsEditor] rendererMode:applyScheduled'); } catch {}\n    setTimeout(() => {\n      try { console.debug('[ColumnsEditor] rendererMode:applyEmit'); } catch {}\n      this.onColumnPropertyChange();\n    }, 150);\n  }\n\n  onToggleRendererConditional(enabled: boolean): void {\n    this.uiRendererConditional = enabled;\n    if (!this.selectedColumn) return;\n    const col: any = this.selectedColumn as any;\n    col.renderer = col.renderer || { type: this.uiRendererType || 'icon' };\n    if (enabled) {\n      col.renderer.typeExpr = col.renderer.typeExpr || \"= 'icon'\";\n    } else {\n      delete col.renderer.typeExpr;\n    }\n    this.onColumnPropertyChange();\n  }\n\n  getRendererTypeExpr(): string {\n    return String(((this.selectedColumn as any)?.renderer?.typeExpr as any) || '');\n  }\n  setRendererTypeExpr(val: string): void {\n    if (!this.selectedColumn) return;\n    const col: any = this.selectedColumn as any;\n    col.renderer = col.renderer || { type: this.uiRendererType || 'icon' };\n    col.renderer.typeExpr = val;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  // Icon\n  getRendererIconName(): string {\n    return (this.selectedColumn as any)?.renderer?.icon?.name || '';\n  }\n  setRendererIconName(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('icon');\n    (this.selectedColumn as any).renderer.icon.name = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererIconNameField(): string {\n    return (this.selectedColumn as any)?.renderer?.icon?.nameField || '';\n  }\n  setRendererIconNameField(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('icon');\n    (this.selectedColumn as any).renderer.icon.nameField = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererIconColor(): string {\n    return (this.selectedColumn as any)?.renderer?.icon?.color || '';\n  }\n  setRendererIconColor(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('icon');\n    (this.selectedColumn as any).renderer.icon.color = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererIconSize(): number | null {\n    return (this.selectedColumn as any)?.renderer?.icon?.size ?? null;\n  }\n  setRendererIconSize(v: number): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('icon');\n    (this.selectedColumn as any).renderer.icon.size = v || undefined;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  // Image\n  getRendererImageSrc(): string {\n    return (this.selectedColumn as any)?.renderer?.image?.src || '';\n  }\n  setRendererImageSrc(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.src = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageSrcField(): string {\n    return (this.selectedColumn as any)?.renderer?.image?.srcField || '';\n  }\n  setRendererImageSrcField(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.srcField = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageAlt(): string {\n    return (this.selectedColumn as any)?.renderer?.image?.alt || '';\n  }\n  setRendererImageAlt(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.alt = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageAltField(): string {\n    return (this.selectedColumn as any)?.renderer?.image?.altField || '';\n  }\n  setRendererImageAltField(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.altField = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageWidth(): number | null {\n    return (this.selectedColumn as any)?.renderer?.image?.width ?? null;\n  }\n  setRendererImageWidth(v: number): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.width = v || undefined;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageHeight(): number | null {\n    return (this.selectedColumn as any)?.renderer?.image?.height ?? null;\n  }\n  setRendererImageHeight(v: number): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.height = v || undefined;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageShape(): 'square' | 'rounded' | 'circle' | '' {\n    return ((this.selectedColumn as any)?.renderer?.image?.shape as any) || '';\n  }\n  setRendererImageShape(v: any): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.shape = v || undefined;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageFit(): 'cover' | 'contain' | '' {\n    return ((this.selectedColumn as any)?.renderer?.image?.fit as any) || '';\n  }\n  setRendererImageFit(v: any): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.fit = v || undefined;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererImageLazy(): boolean {\n    return !!(this.selectedColumn as any)?.renderer?.image?.lazy;\n  }\n  setRendererImageLazy(v: boolean): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('image');\n    (this.selectedColumn as any).renderer.image.lazy = !!v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  // Badge\n  getRendererBadgeText(): string {\n    return (this.selectedColumn as any)?.renderer?.badge?.text || '';\n  }\n  setRendererBadgeText(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('badge');\n    (this.selectedColumn as any).renderer.badge.text = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererBadgeTextField(): string {\n    return (this.selectedColumn as any)?.renderer?.badge?.textField || '';\n  }\n  setRendererBadgeTextField(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('badge');\n    (this.selectedColumn as any).renderer.badge.textField = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererBadgeColor(): string {\n    return (this.selectedColumn as any)?.renderer?.badge?.color || 'primary';\n  }\n  setRendererBadgeColor(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('badge');\n    (this.selectedColumn as any).renderer.badge.color = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererBadgeVariant(): string {\n    return (this.selectedColumn as any)?.renderer?.badge?.variant || 'filled';\n  }\n  setRendererBadgeVariant(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('badge');\n    (this.selectedColumn as any).renderer.badge.variant = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  getRendererBadgeIcon(): string {\n    return (this.selectedColumn as any)?.renderer?.badge?.icon || '';\n  }\n  setRendererBadgeIcon(v: string): void {\n    if (!this.selectedColumn) return;\n    this.ensureRenderer('badge');\n    (this.selectedColumn as any).renderer.badge.icon = v;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  private ensureRenderer(kind: 'icon' | 'image' | 'badge'): void {\n    if (!this.selectedColumn) return;\n    const col: any = this.selectedColumn as any;\n    col.renderer = col.renderer || { type: kind };\n    col.renderer.type = kind;\n    if (kind === 'icon') col.renderer.icon = col.renderer.icon || {};\n    if (kind === 'image') col.renderer.image = col.renderer.image || {};\n    if (kind === 'badge') col.renderer.badge = col.renderer.badge || {};\n  }\n\n  // Generic renderer accessors for Phase 2\n  private _ensureKind(kind: string): any {\n    if (!this.selectedColumn) return null;\n    const col: any = this.selectedColumn as any;\n    col.renderer = col.renderer || { type: kind };\n    col.renderer.type = kind;\n    col.renderer[kind] = col.renderer[kind] || {};\n    return col.renderer[kind];\n  }\n  getRendererProp(kind: string, path: string): any {\n    try {\n      const base = (this.selectedColumn as any)?.renderer?.[kind] || {};\n      return path.split('.').reduce((o, k) => (o ? o[k] : undefined), base);\n    } catch { return undefined; }\n  }\n  setRendererProp(kind: string, path: string, value: any): void {\n    if (!this.selectedColumn) return;\n    const obj = this._ensureKind(kind);\n    const parts = path.split('.');\n    let ref = obj;\n    for (let i = 0; i < parts.length - 1; i++) {\n      const k = parts[i];\n      ref[k] = ref[k] || {};\n      ref = ref[k];\n    }\n    ref[parts[parts.length - 1]] = value;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  // =============================\n  // Renderer: validation/apply/import/export/preview\n  // =============================\n  private _deepClone<T>(obj: T): T {\n    try { return JSON.parse(JSON.stringify(obj)) as T; } catch { return obj as any; }\n  }\n\n  hasSelectedRenderer(): boolean {\n    const r = (this.selectedColumn as any)?.renderer;\n    return !!(r && r.type);\n  }\n\n  onApplyRenderer(): void {\n    this.validateRenderer();\n    if (!this.rendererIsValid) return;\n    // snapshot current as applied\n    this.rendererAppliedSnapshot = this.selectedColumn ? this._deepClone((this.selectedColumn as any).renderer) : null;\n    // emit change explicitly\n    this.onColumnPropertyChange();\n  }\n\n  onDiscardRenderer(): void {\n    if (!this.selectedColumn) return;\n    const col: any = this.selectedColumn as any;\n    if (this.rendererAppliedSnapshot) {\n      col.renderer = this._deepClone(this.rendererAppliedSnapshot);\n      this.uiRendererType = col.renderer?.type || null;\n      this.uiRendererConditional = !!col.renderer?.typeExpr;\n    } else {\n      delete col.renderer;\n      this.uiRendererType = null;\n      this.uiRendererConditional = false;\n    }\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n\n  async onExportRendererJson(): Promise<void> {\n    const r = (this.selectedColumn as any)?.renderer || null;\n    const json = JSON.stringify(r || {}, null, 2);\n    try {\n      if (typeof navigator !== 'undefined' && (navigator as any).clipboard?.writeText) {\n        await (navigator as any).clipboard.writeText(json);\n      }\n    } catch {}\n  }\n\n  onImportRendererJson(): void {\n    let input = '';\n    try {\n      if (typeof window !== 'undefined' && (window as any).prompt) {\n        input = (window as any).prompt('Cole o JSON do renderer', '{\\n  \"type\": \"icon\",\\n  \"icon\": { \"name\": \"check\" }\\n}') || '';\n      }\n    } catch {}\n    if (!input || !this.selectedColumn) return;\n    try {\n      const parsed = JSON.parse(input);\n      const sanitized = this.sanitizeRenderer(parsed);\n      (this.selectedColumn as any).renderer = sanitized as any;\n      this.uiRendererType = sanitized?.type || null;\n      this.uiRendererConditional = !!sanitized?.typeExpr;\n      this.onColumnPropertyChange();\n      this.validateRenderer();\n    } catch (e) {\n      // ignore invalid JSON\n    }\n  }\n\n  private sanitizeRenderer(input: any): any {\n    if (!input || typeof input !== 'object') return undefined;\n    const out: any = {};\n    const t = input.type;\n    if (\n      t === 'icon' || t === 'image' || t === 'badge' || t === 'link' || t === 'button' || t === 'chip' || t === 'progress' || t === 'avatar' || t === 'toggle' || t === 'menu' || t === 'html' || t === 'compose'\n    ) out.type = t; else return undefined;\n    if (input.typeExpr) out.typeExpr = input.typeExpr;\n    if (t === 'icon' && input.icon) {\n      out.icon = {};\n      if (typeof input.icon.name === 'string') out.icon.name = input.icon.name;\n      if (typeof input.icon.nameField === 'string') out.icon.nameField = input.icon.nameField;\n      if (typeof input.icon.color === 'string') out.icon.color = input.icon.color;\n      if (typeof input.icon.size === 'number') out.icon.size = input.icon.size;\n      if (typeof input.icon.ariaLabel === 'string') out.icon.ariaLabel = input.icon.ariaLabel;\n    }\n    if (t === 'image' && input.image) {\n      out.image = {};\n      ['src','srcField','alt','altField'].forEach((k) => { if (typeof input.image[k] === 'string') out.image[k] = input.image[k]; });\n      ['width','height'].forEach((k) => { if (typeof input.image[k] === 'number') out.image[k] = input.image[k]; });\n      if (input.image.shape === 'square' || input.image.shape === 'rounded' || input.image.shape === 'circle') out.image.shape = input.image.shape;\n      if (input.image.fit === 'cover' || input.image.fit === 'contain') out.image.fit = input.image.fit;\n      out.image.lazy = !!input.image.lazy;\n    }\n    if (t === 'badge' && input.badge) {\n      out.badge = {};\n      if (typeof input.badge.text === 'string') out.badge.text = input.badge.text;\n      if (typeof input.badge.textField === 'string') out.badge.textField = input.badge.textField;\n      if (typeof input.badge.color === 'string') out.badge.color = input.badge.color;\n      if (['filled','outlined','soft'].includes(input.badge.variant)) out.badge.variant = input.badge.variant;\n      if (typeof input.badge.icon === 'string') out.badge.icon = input.badge.icon;\n    }\n    if (t === 'link' && input.link) {\n      out.link = {};\n      ['text','textField','href','hrefField','rel'].forEach((k) => { if (typeof input.link[k] === 'string') out.link[k] = input.link[k]; });\n      if (['_blank','_self','_parent','_top'].includes(input.link.target)) out.link.target = input.link.target;\n    }\n    if (t === 'button' && input.button) {\n      out.button = {};\n      ['label','labelField','icon','color','ariaLabel','disabledCondition'].forEach((k) => { if (typeof input.button[k] === 'string') out.button[k] = input.button[k]; });\n      if (['filled','outlined','text'].includes(input.button.variant)) out.button.variant = input.button.variant;\n      if (['sm','md','lg'].includes(input.button.size)) out.button.size = input.button.size;\n      if (input.button.action && typeof input.button.action.id === 'string') out.button.action = { id: input.button.action.id, payloadExpr: typeof input.button.action.payloadExpr === 'string' ? input.button.action.payloadExpr : undefined };\n    }\n    if (t === 'chip' && input.chip) {\n      out.chip = {};\n      ['text','textField','color','icon'].forEach((k) => { if (typeof input.chip[k] === 'string') out.chip[k] = input.chip[k]; });\n      if (['filled','outlined','soft'].includes(input.chip.variant)) out.chip.variant = input.chip.variant;\n    }\n    if (t === 'progress' && input.progress) {\n      out.progress = {};\n      if (typeof input.progress.valueExpr === 'string' || (typeof input.progress.valueExpr === 'object' && typeof input.progress.valueExpr.expr === 'string')) out.progress.valueExpr = input.progress.valueExpr;\n      if (typeof input.progress.color === 'string') out.progress.color = input.progress.color;\n      out.progress.showLabel = !!input.progress.showLabel;\n    }\n    if (t === 'avatar' && input.avatar) {\n      out.avatar = {};\n      ['src','srcField','alt','altField','initialsExpr'].forEach((k) => { if (typeof input.avatar[k] === 'string') out.avatar[k] = input.avatar[k]; });\n      if (['square','rounded','circle'].includes(input.avatar.shape)) out.avatar.shape = input.avatar.shape;\n      if (typeof input.avatar.size === 'number') out.avatar.size = input.avatar.size;\n    }\n    if (t === 'toggle' && input.toggle) {\n      out.toggle = {};\n      if (typeof input.toggle.stateExpr === 'string' || (typeof input.toggle.stateExpr === 'object' && typeof input.toggle.stateExpr.expr === 'string')) out.toggle.stateExpr = input.toggle.stateExpr;\n      if (typeof input.toggle.disabledCondition === 'string') out.toggle.disabledCondition = input.toggle.disabledCondition;\n      if (typeof input.toggle.ariaLabel === 'string') out.toggle.ariaLabel = input.toggle.ariaLabel;\n      if (input.toggle.action && typeof input.toggle.action.id === 'string') out.toggle.action = { id: input.toggle.action.id, payloadExpr: typeof input.toggle.action.payloadExpr === 'string' ? input.toggle.action.payloadExpr : undefined };\n    }\n    if (t === 'menu' && input.menu) {\n      out.menu = {};\n      if (typeof input.menu.itemsExpr === 'string' || (typeof input.menu.itemsExpr === 'object' && typeof input.menu.itemsExpr.expr === 'string')) out.menu.itemsExpr = input.menu.itemsExpr;\n      if (typeof input.menu.ariaLabel === 'string') out.menu.ariaLabel = input.menu.ariaLabel;\n    }\n    if (t === 'html' && input.html) {\n      out.html = {};\n      if (typeof input.html.template === 'string') out.html.template = input.html.template;\n      if (['strict','basic'].includes(input.html.sanitize)) out.html.sanitize = input.html.sanitize;\n      if (typeof input.html.emptyFallback === 'string') out.html.emptyFallback = input.html.emptyFallback;\n    }\n    if (t === 'compose' && input.compose) {\n      const itemsIn: any[] = Array.isArray(input.compose.items) ? input.compose.items.slice(0, 7) : [];\n      const itemsOut: any[] = [];\n      for (const it of itemsIn) {\n        const s = this.sanitizeRenderer({ type: it?.type, [it?.type || '']: it?.[it?.type || ''] });\n        if (s) {\n          const o: any = { type: s.type };\n          if (s.icon) o.icon = s.icon;\n          if (s.image) o.image = s.image;\n          if (s.badge) o.badge = s.badge;\n          if (s.link) o.link = s.link;\n          if (s.button) o.button = s.button;\n          if (s.chip) o.chip = s.chip;\n          if (s.progress) o.progress = s.progress;\n          if (s.avatar) o.avatar = s.avatar;\n          if (s.toggle) o.toggle = s.toggle;\n          if (s.menu) o.menu = s.menu;\n          if (s.html) o.html = s.html;\n          itemsOut.push(o);\n        }\n      }\n      out.compose = { items: itemsOut };\n      if (input.compose.layout && typeof input.compose.layout === 'object') {\n        const l = input.compose.layout;\n        const layout: any = {};\n        if (l.direction === 'row' || l.direction === 'column') layout.direction = l.direction;\n        if (typeof l.gap === 'number') layout.gap = l.gap;\n        if (['start','center','end'].includes(l.align)) layout.align = l.align;\n        layout.wrap = !!l.wrap;\n        layout.ellipsis = !!l.ellipsis;\n        out.compose.layout = layout;\n      }\n    }\n    return out;\n  }\n\n  private ensurePreviewRows(): void {\n    if (!this.sampleTableData || this.sampleTableData.length === 0) this.generateSampleData();\n    this.previewRows = (this.sampleTableData || []).slice(0, 3);\n  }\n\n  private evalValueExpr(raw: any, row: any, expect: 'string'|'number'|'boolean'): any {\n    try {\n      if (raw == null) return null;\n      if (typeof raw === 'object' && typeof raw.expr === 'string') {\n        // eslint-disable-next-line no-new-func\n        const fn = new Function('row', '\"use strict\"; return (' + raw.expr + ');');\n        const val = fn(row);\n        return this._coerceExpected(val, expect);\n      }\n      if (typeof raw === 'string') {\n        const m = raw.match(/^\\s*=(.*)$/s);\n        if (m) {\n          const expr = m[1];\n          // eslint-disable-next-line no-new-func\n          const fn = new Function('row', '\"use strict\"; return (' + expr + ');');\n          const val = fn(row);\n          return this._coerceExpected(val, expect);\n        }\n      }\n      return null;\n    } catch { return null; }\n  }\n\n  private evalArrayExpr(raw: any, row: any): any[] | null {\n    try {\n      if (raw == null) return null;\n      if (typeof raw === 'object' && typeof raw.expr === 'string') {\n        // eslint-disable-next-line no-new-func\n        const fn = new Function('row', '\"use strict\"; return (' + raw.expr + ');');\n        const val = fn(row);\n        return Array.isArray(val) ? val : null;\n      }\n      if (typeof raw === 'string') {\n        const m = raw.match(/^\\s*=(.*)$/s);\n        if (m) {\n          const expr = m[1];\n          // eslint-disable-next-line no-new-func\n          const fn = new Function('row', '\"use strict\"; return (' + expr + ');');\n          const val = fn(row);\n          return Array.isArray(val) ? val : null;\n        }\n      }\n      return null;\n    } catch { return null; }\n  }\n\n  private _coerceExpected(val: any, expect: 'string'|'number'|'boolean') {\n    if (val == null) return null;\n    switch (expect) {\n      case 'string': return String(val);\n      case 'number': return typeof val === 'number' ? val : Number(val);\n      case 'boolean': return typeof val === 'boolean' ? val : !!val;\n    }\n  }\n\n  private getNested(row: any, path: string): any {\n    try { return path.split('.').reduce((o, k) => (o ? o[k] : undefined), row); } catch { return undefined; }\n  }\n\n  // Preview type resolution (supports typeExpr)\n  getPreviewRendererType(row: any): 'icon'|'image'|'badge'|'link'|'button'|'chip'|'progress'|'avatar'|'toggle'|'menu'|'html'|'compose'|null {\n    const col: any = this.selectedColumn as any;\n    const rend: any = col?.renderer || null;\n    if (rend && rend.typeExpr) {\n      const t = this.evalValueExpr(rend.typeExpr, row, 'string') as string | null;\n      if (t === 'icon' || t === 'image' || t === 'badge' || t === 'link' || t === 'button' || t === 'chip' || t === 'progress' || t === 'avatar' || t === 'toggle' || t === 'menu' || t === 'html' || t === 'compose') return t as any;\n      if (t === 'text' || t === 'none') return null;\n    }\n    return (rend?.type as any) || null;\n  }\n\n  getPreviewIconName(row: any): string | null {\n    const cfg = (this.selectedColumn as any)?.renderer?.icon;\n    if (!cfg) return null;\n    const raw = cfg.name as any;\n    const fromField = cfg.nameField ? this.getNested(row, cfg.nameField) : undefined;\n    const evaluated = this.evalValueExpr(raw, row, 'string');\n    if (evaluated != null && evaluated !== '') return String(evaluated);\n    if (fromField != null && fromField !== '') return String(fromField);\n    if (typeof raw === 'string') return raw;\n    return null;\n  }\n  getPreviewIconColor(row: any): string | null {\n    const raw = (this.selectedColumn as any)?.renderer?.icon?.color as any;\n    const evaluated = this.evalValueExpr(raw, row, 'string');\n    return (evaluated as any) || (typeof raw === 'string' ? raw : null);\n  }\n  getPreviewIconStyle(row: any): Record<string,string> | null {\n    const raw = (this.selectedColumn as any)?.renderer?.icon?.size as any;\n    const size = this.evalValueExpr(raw, row, 'number') as number | undefined;\n    return size ? { fontSize: `${size}px`, width: `${size}px`, height: `${size}px` } : null;\n  }\n\n  getPreviewImageSrc(row: any): string | null {\n    const cfg = (this.selectedColumn as any)?.renderer?.image;\n    if (!cfg) return null;\n    const src = cfg.srcField ? this.getNested(row, cfg.srcField) : cfg.src;\n    if (typeof src !== 'string') return null;\n    if (/^\\s*javascript:/i.test(src)) return null;\n    return src;\n  }\n  getPreviewImageAlt(row: any): string | null {\n    const cfg = (this.selectedColumn as any)?.renderer?.image;\n    if (!cfg) return null;\n    return (cfg.altField ? this.getNested(row, cfg.altField) : cfg.alt) || null;\n  }\n  getPreviewImageWidth(): number | null { return ((this.selectedColumn as any)?.renderer?.image?.width as any) || null; }\n  getPreviewImageHeight(): number | null { return ((this.selectedColumn as any)?.renderer?.image?.height as any) || null; }\n  getPreviewImageShape(): 'square'|'rounded'|'circle'|undefined { return ((this.selectedColumn as any)?.renderer?.image?.shape as any) || undefined; }\n  getPreviewImageFit(): 'cover'|'contain'|undefined { return ((this.selectedColumn as any)?.renderer?.image?.fit as any) || undefined; }\n\n  getPreviewBadgeText(row: any): string | null {\n    const cfg = (this.selectedColumn as any)?.renderer?.badge;\n    if (!cfg) return null;\n    const text = cfg.textField ? this.getNested(row, cfg.textField) : cfg.text;\n    return text != null ? String(text) : null;\n  }\n  getPreviewBadgeIcon(_row: any): string | null { return ((this.selectedColumn as any)?.renderer?.badge?.icon as any) || null; }\n  getPreviewBadgeClasses(_row: any): string[] {\n    const cfg = (this.selectedColumn as any)?.renderer?.badge;\n    if (!cfg) return [];\n    const out: string[] = [];\n    const variant = (cfg.variant as any) || 'filled';\n    const color = ((cfg.color as any) || '').toLowerCase();\n    if (variant === 'outlined') out.push('pfx-badge--outlined');\n    else if (variant === 'soft') out.push(`pfx-badge--soft-${color || 'primary'}`);\n    else out.push(`pfx-badge--filled-${color || 'primary'}`);\n    return out;\n  }\n\n  // New types preview helpers\n  getPreviewLinkText(row: any): string {\n    const lk = (this.selectedColumn as any)?.renderer?.link;\n    if (!lk) return '';\n    const text = lk.textField ? this.getNested(row, lk.textField) : lk.text;\n    return (text != null ? String(text) : '') || '';\n  }\n  getPreviewLinkHref(row: any): string | null {\n    const lk = (this.selectedColumn as any)?.renderer?.link;\n    if (!lk) return null;\n    const href = lk.hrefField ? this.getNested(row, lk.hrefField) : lk.href;\n    if (typeof href !== 'string') return null;\n    if (!/^(https?:|mailto:)/i.test(href)) return null;\n    return href;\n  }\n  getPreviewButtonLabel(row: any): string { const bt = (this.selectedColumn as any)?.renderer?.button; const v = bt?.labelField ? this.getNested(row, bt.labelField) : bt?.label; return (v != null ? String(v) : '') || ''; }\n  getPreviewButtonIcon(): string | null { return ((this.selectedColumn as any)?.renderer?.button?.icon as any) || null; }\n  getPreviewChipText(row: any): string | null { const cp = (this.selectedColumn as any)?.renderer?.chip; const t = cp?.textField ? this.getNested(row, cp.textField) : cp?.text; return t != null ? String(t) : null; }\n  getPreviewChipClasses(): string[] { const cp = (this.selectedColumn as any)?.renderer?.chip; if (!cp) return []; const v = cp.variant || 'filled'; const c = (cp.color || 'primary').toLowerCase(); return v === 'outlined' ? ['pfx-chip--outlined'] : (v === 'soft' ? [`pfx-chip--soft-${c}`] : [`pfx-chip--filled-${c}`]); }\n  getPreviewProgressValue(row: any): number { const pg = (this.selectedColumn as any)?.renderer?.progress; if (!pg?.valueExpr) return 0; const v = this.evalValueExpr(pg.valueExpr, row, 'number'); const n = typeof v === 'number' ? v : Number(v); if (!isFinite(n)) return 0; return Math.max(0, Math.min(100, n)); }\n  getPreviewAvatarSrc(row: any): string | null { const av = (this.selectedColumn as any)?.renderer?.avatar; if (!av) return null; const src = av.srcField ? this.getNested(row, av.srcField) : av.src; if (typeof src !== 'string') return null; if (/^\\s*javascript:/i.test(src)) return null; return src; }\n  getPreviewAvatarInitials(row: any): string { const av = (this.selectedColumn as any)?.renderer?.avatar; const v = this.evalValueExpr(av?.initialsExpr, row, 'string'); return (v != null ? String(v) : '') || ''; }\n  getPreviewAvatarStyle(): Record<string,string> { const s = Number(((this.selectedColumn as any)?.renderer?.avatar?.size as any) || 32); const size = isFinite(s) ? Math.max(8, Math.min(128, s)) : 32; return { width: `${size}px`, height: `${size}px` }; }\n  getPreviewAvatarShape(): 'square'|'rounded'|'circle'|undefined { return ((this.selectedColumn as any)?.renderer?.avatar?.shape as any) || undefined; }\n  getPreviewToggleState(row: any): boolean { const tg = (this.selectedColumn as any)?.renderer?.toggle; const v = this.evalValueExpr(tg?.stateExpr, row, 'boolean'); return !!v; }\n  getPreviewMenuCount(row: any): number { const mn = (this.selectedColumn as any)?.renderer?.menu; const arr = this.evalArrayExpr(mn?.itemsExpr, row) || []; return arr.length || 0; }\n  getPreviewHtml(row: any): string { const ht = (this.selectedColumn as any)?.renderer?.html; if (!ht?.template) return String(ht?.emptyFallback || ''); return String(ht.template).replace(/\\[\\[([A-Za-z0-9_\\.]+)\\]\\]/g, (_m: string, g1: string) => { const v = this.getNested(row, g1); return String(v ?? ''); }); }\n\n  trackByIdx = (_: number, item: any) => this.previewRows.indexOf(item);\n\n  private validateRenderer(): void {\n    const errs: string[] = [];\n    const col: any = this.selectedColumn as any;\n    const r: any = col?.renderer || null;\n    if (!r || !r.type) {\n      // no renderer -> valid\n      this.rendererValidationErrors = [];\n      this.rendererIsValid = true;\n      this.cdr.markForCheck();\n      return;\n    }\n    if (!['icon','image','badge','link','button','chip','progress','avatar','toggle','menu','html'].includes(r.type)) errs.push('Tipo inválido.');\n    // typeExpr validation\n    if (r.typeExpr) {\n      const row = this.previewRows?.[0] || {};\n      const t = this.evalValueExpr(r.typeExpr, row, 'string');\n      if (t == null) errs.push('typeExpr inválido ou com erro.');\n      else if (!['icon','image','badge','link','button','chip','progress','avatar','toggle','menu','html','none','text'].includes(String(t))) errs.push('typeExpr deve retornar um tipo válido ou none.');\n    }\n    if (r.type === 'icon') {\n      const ic = r.icon || {};\n      if (!ic.name && !ic.nameField) errs.push('Ícone: defina name ou nameField.');\n      if (ic.size != null) {\n        const s = Number(ic.size);\n        if (!(s >= 8 && s <= 64)) errs.push('Ícone: size deve estar entre 8 e 64.');\n      }\n      if (ic.color != null && String(ic.color).trim() === '') errs.push('Ícone: color não pode ser vazio.');\n    }\n    if (r.type === 'image') {\n      const im = r.image || {};\n      if (!im.src && !im.srcField) errs.push('Imagem: defina src ou srcField.');\n      if (typeof im.src === 'string' && /^\\s*javascript:/i.test(im.src)) errs.push('Imagem: src com protocolo inválido.');\n      ['width','height'].forEach((k) => { if (im[k] != null && Number(im[k]) <= 0) errs.push(`Imagem: ${k} deve ser positivo.`); });\n      if (im.shape && !['square','rounded','circle'].includes(im.shape)) errs.push('Imagem: shape inválido.');\n      if (im.fit && !['cover','contain'].includes(im.fit)) errs.push('Imagem: fit inválido.');\n    }\n    if (r.type === 'badge') {\n      const bd = r.badge || {};\n      if (!bd.text && !bd.textField) errs.push('Badge: defina text ou textField.');\n      if (bd.variant && !['filled','outlined','soft'].includes(bd.variant)) errs.push('Badge: variant inválido.');\n    }\n    if (r.type === 'link') {\n      const lk = r.link || {};\n      if (!lk.href && !lk.hrefField) errs.push('Link: defina href ou hrefField.');\n      if (typeof lk.href === 'string' && !/^(https?:|mailto:)/i.test(lk.href)) errs.push('Link: href deve ser http(s) ou mailto.');\n    }\n    if (r.type === 'button') {\n      const bt = r.button || {};\n      if (!bt.label && !bt.labelField) errs.push('Botão: defina label ou labelField.');\n      if (!bt.action || !bt.action.id) errs.push('Botão: defina action.id.');\n      if (bt.variant && !['filled','outlined','text'].includes(bt.variant)) errs.push('Botão: variant inválido.');\n      if (bt.size && !['sm','md','lg'].includes(bt.size)) errs.push('Botão: size inválido.');\n    }\n    if (r.type === 'chip') {\n      const cp = r.chip || {};\n      if (!cp.text && !cp.textField) errs.push('Chip: defina text ou textField.');\n      if (cp.variant && !['filled','outlined','soft'].includes(cp.variant)) errs.push('Chip: variant inválido.');\n    }\n    if (r.type === 'progress') {\n      const pg = r.progress || {};\n      if (!pg.valueExpr) errs.push('Progresso: defina valueExpr.');\n      const row = this.previewRows?.[0] || {};\n      const v = this.evalValueExpr(pg.valueExpr, row, 'number');\n      const n = typeof v === 'number' ? v : Number(v);\n      if (!isFinite(n) || n < 0 || n > 100) errs.push('Progresso: valueExpr deve resultar em 0–100.');\n    }\n    if (r.type === 'avatar') {\n      const av = r.avatar || {};\n      if (!av.src && !av.srcField && !av.initialsExpr) errs.push('Avatar: defina src/srcField ou initialsExpr.');\n      if (typeof av.src === 'string' && /^\\s*javascript:/i.test(av.src)) errs.push('Avatar: src inválido.');\n      if (av.size != null && Number(av.size) <= 0) errs.push('Avatar: size deve ser positivo.');\n      if (av.shape && !['square','rounded','circle'].includes(av.shape)) errs.push('Avatar: shape inválido.');\n    }\n    if (r.type === 'toggle') {\n      const tg = r.toggle || {};\n      if (!tg.stateExpr) errs.push('Toggle: defina stateExpr.');\n      if (!tg.action || !tg.action.id) errs.push('Toggle: defina action.id.');\n    }\n    if (r.type === 'menu') {\n      const mn = r.menu || {};\n      if (!mn.itemsExpr) errs.push('Menu: defina itemsExpr.');\n      const row = this.previewRows?.[0] || {};\n      const list = this.evalArrayExpr(mn.itemsExpr, row);\n      if (!Array.isArray(list)) errs.push('Menu: itemsExpr deve resultar em array.');\n    }\n    if (r.type === 'html') {\n      const ht = r.html || {};\n      if (!ht.template || String(ht.template).trim() === '') errs.push('HTML: defina template.');\n      const bad = String(ht.template).match(/\\son[a-z]+\\s*=/i);\n      if (bad) errs.push('HTML: atributos on* não são permitidos no template.');\n    }\n    if (r.type === 'compose') {\n      const items: any[] = Array.isArray(r.compose?.items) ? r.compose.items : [];\n      if (!items.length) errs.push('Compose: adicione pelo menos 1 item.');\n      if (items.length > 7) errs.push('Compose: máximo de 7 itens.');\n      // validate each item by calling sanitize then checking minimal presence\n      for (const it of items) {\n        const s = this.sanitizeRenderer({ type: it?.type, [it?.type || '']: it?.[it?.type || ''] });\n        if (!s) { errs.push('Compose: item inválido.'); continue; }\n        // copy item-specific checks\n        if (s.type === 'icon') {\n          const ic = s.icon || {};\n          if (!ic.name && !ic.nameField) errs.push('Compose/Icon: defina name ou nameField.');\n        } else if (s.type === 'image') {\n          const im = s.image || {};\n          if (!im.src && !im.srcField) errs.push('Compose/Image: defina src ou srcField.');\n          if (typeof im.src === 'string' && /^\\s*javascript:/i.test(im.src)) errs.push('Compose/Image: src inválido.');\n        } else if (s.type === 'badge') {\n          const bd = s.badge || {};\n          if (!bd.text && !bd.textField) errs.push('Compose/Badge: defina text ou textField.');\n        } else if (s.type === 'link') {\n          const lk = s.link || {};\n          if (!lk.href && !lk.hrefField) errs.push('Compose/Link: defina href ou hrefField.');\n          if (typeof lk.href === 'string' && !/^(https?:|mailto:)/i.test(lk.href)) errs.push('Compose/Link: href inválido.');\n        } else if (s.type === 'button') {\n          const bt = s.button || {};\n          if (!bt.label && !bt.labelField) errs.push('Compose/Button: defina label/labelField.');\n          if (!bt.action || !bt.action.id) errs.push('Compose/Button: defina action.id.');\n        } else if (s.type === 'progress') {\n          const pg = s.progress || {};\n          if (!pg.valueExpr) errs.push('Compose/Progress: valueExpr obrigatório.');\n        } else if (s.type === 'avatar') {\n          const av = s.avatar || {};\n          if (!av.src && !av.srcField && !av.initialsExpr) errs.push('Compose/Avatar: defina src/srcField ou initialsExpr.');\n          if (typeof av.src === 'string' && /^\\s*javascript:/i.test(av.src)) errs.push('Compose/Avatar: src inválido.');\n        } else if (s.type === 'toggle') {\n          const tg = s.toggle || {};\n          if (!tg.stateExpr) errs.push('Compose/Toggle: defina stateExpr.');\n          if (!tg.action || !tg.action.id) errs.push('Compose/Toggle: defina action.id.');\n        } else if (s.type === 'menu') {\n          const mn = s.menu || {};\n          if (!mn.itemsExpr) errs.push('Compose/Menu: defina itemsExpr.');\n        } else if (s.type === 'html') {\n          const ht = s.html || {};\n          if (!ht.template || String(ht.template).trim() === '') errs.push('Compose/HTML: defina template.');\n        }\n      }\n    }\n    this.rendererValidationErrors = errs;\n    this.rendererIsValid = errs.length === 0;\n    this.cdr.markForCheck();\n  }\n\n  // Shared empty mapping reference used when no column is selected\n  private readonly _emptyMappingRef: { [key: string | number]: string } = Object.freeze({});\n\n  // Compose state & helpers\n  composeSelectedIndex: number = -1;\n  private ensureCompose(): any {\n    if (!this.selectedColumn) return null;\n    const col: any = this.selectedColumn as any;\n    col.renderer = col.renderer || { type: 'compose' };\n    col.renderer.type = 'compose';\n    col.renderer.compose = col.renderer.compose || { items: [], layout: { direction: 'row', gap: 6, align: 'start', wrap: false, ellipsis: false } };\n    if (!Array.isArray(col.renderer.compose.items)) col.renderer.compose.items = [];\n    return col.renderer.compose;\n  }\n  getComposeItemsUI(): Array<{ type: string; summary: string; raw: any }>{\n    const comp = this.ensureCompose();\n    const items: any[] = (comp?.items || []).slice(0, 7);\n    return items.map((it) => ({ type: it?.type || 'unknown', summary: this.getComposeItemSummary(it), raw: it }));\n  }\n  private getComposeItemSummary(it: any): string {\n    switch (it?.type) {\n      case 'icon': return it?.icon?.name || it?.icon?.nameField || 'ícone';\n      case 'image': return it?.image?.src || it?.image?.srcField || 'imagem';\n      case 'badge': return it?.badge?.text || it?.badge?.textField || 'badge';\n      case 'link': return it?.link?.text || it?.link?.href || it?.link?.hrefField || 'link';\n      case 'button': return it?.button?.label || it?.button?.labelField || it?.button?.action?.id || 'botão';\n      case 'chip': return it?.chip?.text || it?.chip?.textField || 'chip';\n      case 'progress': return 'progress';\n      case 'avatar': return it?.avatar?.src || it?.avatar?.srcField || 'avatar';\n      case 'toggle': return it?.toggle?.action?.id || 'toggle';\n      case 'menu': return 'menu';\n      case 'html': return 'html';\n      default: return 'item';\n    }\n  }\n  addComposeItem(kind: string): void {\n    const comp = this.ensureCompose();\n    if (!comp) return;\n    const items: any[] = comp.items || (comp.items = []);\n    if (items.length >= 7) return;\n    const it: any = { type: kind };\n    if (kind === 'icon') it.icon = {};\n    if (kind === 'image') it.image = {};\n    if (kind === 'badge') it.badge = {};\n    if (kind === 'link') it.link = {};\n    if (kind === 'button') it.button = {};\n    if (kind === 'chip') it.chip = {};\n    if (kind === 'progress') it.progress = { valueExpr: \"= 50\" };\n    if (kind === 'avatar') it.avatar = {};\n    if (kind === 'toggle') it.toggle = { stateExpr: \"= false\" } as any;\n    if (kind === 'menu') it.menu = { itemsExpr: \"= []\" } as any;\n    if (kind === 'html') it.html = { template: '' };\n    items.push(it);\n    this.composeSelectedIndex = items.length - 1;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  removeComposeItem(index: number): void {\n    const comp = this.ensureCompose();\n    if (!comp) return;\n    if (index < 0 || index >= comp.items.length) return;\n    comp.items.splice(index, 1);\n    if (this.composeSelectedIndex >= comp.items.length) this.composeSelectedIndex = comp.items.length - 1;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  duplicateComposeItem(index: number): void {\n    const comp = this.ensureCompose();\n    if (!comp) return;\n    const it = comp.items[index];\n    if (!it) return;\n    const copy = JSON.parse(JSON.stringify(it));\n    comp.items.splice(index + 1, 0, copy);\n    this.composeSelectedIndex = index + 1;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  onComposeReorder(event: any): void {\n    const comp = this.ensureCompose();\n    if (!comp) return;\n    const items = comp.items;\n    const prev = event.previousIndex; const curr = event.currentIndex;\n    if (prev === curr || prev < 0 || curr < 0 || prev >= items.length || curr >= items.length) return;\n    const [moved] = items.splice(prev, 1);\n    items.splice(curr, 0, moved);\n    this.composeSelectedIndex = curr;\n    this.onColumnPropertyChange();\n    this.validateRenderer();\n  }\n  selectComposeItem(index: number): void { this.composeSelectedIndex = index; }\n  getComposeLayoutProp(key: string): any { return (this.ensureCompose()?.layout || {})[key]; }\n  setComposeLayoutProp(key: string, value: any): void { const comp = this.ensureCompose(); if (!comp) return; comp.layout = comp.layout || {}; comp.layout[key] = value; this.onColumnPropertyChange(); }\n  private getSelectedComposeItem(): any { const comp = this.ensureCompose(); if (!comp) return null; return comp.items?.[this.composeSelectedIndex] || null; }\n\n  getColumnKeyInputType(\n    column: ColumnDefinition | null,\n  ): 'text' | 'number' | 'boolean' {\n    if (!column) return 'text';\n\n    // Try to infer from column field name\n    const fieldName = column.field.toLowerCase();\n\n    if (\n      fieldName.includes('id') ||\n      fieldName.includes('count') ||\n      fieldName.includes('price') ||\n      fieldName.includes('quantity') ||\n      fieldName.includes('amount') ||\n      fieldName.includes('number')\n    ) {\n      return 'number';\n    }\n\n    if (\n      fieldName.includes('active') ||\n      fieldName.includes('enabled') ||\n      fieldName.includes('visible') ||\n      fieldName.includes('is')\n    ) {\n      return 'boolean';\n    }\n\n    return 'text';\n  }\n\n  onMappingChange(mapping: { [key: string | number]: string }): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) {\n      return;\n    }\n\n    // Verify column still exists\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    this.selectedColumn.valueMapping = mapping;\n    this.onColumnPropertyChange();\n  }\n\n  get selectedColumnDataType(): ColumnDataType {\n    return this.getColumnDataType(this.selectedColumn);\n  }\n  set selectedColumnDataType(value: ColumnDataType) {\n    this.onDataTypeChange(value);\n  }\n\n  // Data Formatting Management\n  getColumnDataType(column: ColumnDefinition | null): ColumnDataType {\n    if (!column) return 'string';\n\n    // Priority order: user-configured type > original API type > field name inference\n\n    // 1. Use the user-configured type if available (highest priority)\n    if (column.type) {\n      return column.type;\n    }\n\n    // 2. For API fields, use the original API type as fallback\n    if (column._isApiField && column._originalApiType) {\n      return column._originalApiType as ColumnDataType;\n    }\n\n    // 3. Try to infer from column field name (last resort)\n    return this.inferFieldTypeFromFieldName(column.field);\n  }\n\n  /**\n   * Infer column data type from field name patterns (shared logic with PraxisTable)\n   */\n  private inferFieldTypeFromFieldName(fieldName: string): ColumnDataType {\n    const lowercaseName = fieldName.toLowerCase();\n\n    // Date/time patterns - more specific patterns first\n    if (\n      lowercaseName.endsWith('date') ||\n      lowercaseName.endsWith('time') ||\n      lowercaseName.endsWith('at') ||\n      lowercaseName.startsWith('date') ||\n      lowercaseName === 'created' ||\n      lowercaseName === 'updated' ||\n      lowercaseName === 'modified' ||\n      lowercaseName.includes('timestamp')\n    ) {\n      return 'date';\n    }\n\n    // Boolean patterns - most specific first to avoid conflicts\n    if (\n      lowercaseName.startsWith('is_') ||\n      lowercaseName.startsWith('has_') ||\n      lowercaseName.startsWith('can_') ||\n      lowercaseName.startsWith('should_') ||\n      lowercaseName === 'active' ||\n      lowercaseName === 'enabled' ||\n      lowercaseName === 'visible' ||\n      lowercaseName === 'deleted' ||\n      lowercaseName === 'archived' ||\n      lowercaseName.endsWith('_flag') ||\n      lowercaseName.endsWith('_enabled') ||\n      lowercaseName.endsWith('_active')\n    ) {\n      return 'boolean';\n    }\n\n    // Currency/money patterns - exclude common false positives\n    if (\n      (lowercaseName.includes('price') ||\n        lowercaseName.includes('amount') ||\n        lowercaseName.includes('cost') ||\n        lowercaseName.includes('salary') ||\n        lowercaseName.includes('wage') ||\n        lowercaseName.includes('fee') ||\n        (lowercaseName.includes('value') &&\n          !lowercaseName.includes('id') &&\n          !lowercaseName.includes('key'))) &&\n      !lowercaseName.includes('count') &&\n      !lowercaseName.includes('type')\n    ) {\n      return 'currency';\n    }\n\n    // Percentage patterns - be more specific\n    if (\n      lowercaseName.includes('percent') ||\n      lowercaseName.endsWith('_rate') ||\n      lowercaseName.endsWith('_ratio') ||\n      lowercaseName.endsWith('_pct') ||\n      (lowercaseName.includes('rate') &&\n        !lowercaseName.includes('created') &&\n        !lowercaseName.includes('updated')) ||\n      lowercaseName.endsWith('_score')\n    ) {\n      return 'percentage';\n    }\n\n    // Number patterns - exclude common false positives like string IDs\n    if (\n      (lowercaseName.endsWith('_id') && lowercaseName !== 'id') || // composite IDs might be strings\n      lowercaseName === 'id' ||\n      lowercaseName.includes('count') ||\n      lowercaseName.includes('quantity') ||\n      lowercaseName.includes('number') ||\n      lowercaseName.includes('total') ||\n      lowercaseName.includes('sum') ||\n      lowercaseName.includes('age') ||\n      lowercaseName.includes('weight') ||\n      lowercaseName.includes('height') ||\n      lowercaseName.includes('size') ||\n      lowercaseName.endsWith('_num') ||\n      lowercaseName.endsWith('_number')\n    ) {\n      return 'number';\n    }\n\n    // Default to string for ambiguous cases\n    return 'string';\n  }\n\n  onDataTypeChange(dataType: ColumnDataType): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n    // Verify column still exists\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    // Store the user-selected type in the standard 'type' property\n    this.selectedColumn.type = dataType;\n\n    // Clear existing format when changing data type\n    this.selectedColumn.format = '';\n\n    this.onColumnPropertyChange();\n  }\n\n  showDataFormatter(column: ColumnDefinition | null): boolean {\n    if (!column) return false;\n\n    // Don't show formatter for calculated columns (they can use custom formatting)\n    if (this.isCalculatedColumn(column)) {\n      return false;\n    }\n\n    const dataType = this.getColumnDataType(column);\n    return dataType !== 'custom';\n  }\n\n  getFormatterIcon(column: ColumnDefinition | null): string {\n    const dataType = this.getColumnDataType(column);\n    switch (dataType) {\n      case 'date':\n        return 'calendar_today';\n      case 'number':\n        return 'numbers';\n      case 'currency':\n        return 'attach_money';\n      case 'percentage':\n        return 'percent';\n      case 'string':\n        return 'text_fields';\n      case 'boolean':\n        return 'toggle_on';\n      default:\n        return 'format_shapes';\n    }\n  }\n\n  getFormatterPanelDescription(column: ColumnDefinition | null): string {\n    if (!column) return 'Nenhuma coluna selecionada';\n\n    const dataType = this.getColumnDataType(column);\n    const hasFormat = this.getColumnFormat(column).length > 0;\n\n    if (hasFormat) {\n      return 'Formatação personalizada aplicada';\n    }\n\n    switch (dataType) {\n      case 'date':\n        return 'Configure como as datas são exibidas';\n      case 'number':\n        return 'Defina a formatação de números';\n      case 'currency':\n        return 'Configure valores monetários';\n      case 'percentage':\n        return 'Formate percentuais';\n      case 'string':\n        return 'Transforme a apresentação de texto';\n      case 'boolean':\n        return 'Escolha exibição de verdadeiro/falso';\n      default:\n        return 'Configure a formatação dos dados';\n    }\n  }\n\n  getColumnFormat(column: ColumnDefinition | null): string {\n    if (!column) return '';\n\n    const extendedColumn = column as any;\n    return extendedColumn.format || '';\n  }\n\n  onFormatChange(format: string): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n    // Verify column still exists\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    this.selectedColumn.format = format;\n    if (!this.selectedColumn.type) {\n      this.selectedColumn.type = this.selectedColumnDataType;\n    }\n    this.onColumnPropertyChange();\n  }\n\n  // Data Synchronization\n  private emitConfigChange(changeType: ColumnChange['type']): void {\n    if (!this.config) return;\n\n    // Deep clone columns to prevent external mutations\n    const clonedColumns = this.columns.map((col) => ({ ...col }));\n\n    const updatedConfig: TableConfig = {\n      ...this.config,\n      columns: clonedColumns,\n    };\n\n    // Avoid feedback loops: if nothing effectively changed, don't emit\n    try {\n      const prev = JSON.stringify(this.config.columns || []);\n      const next = JSON.stringify(clonedColumns || []);\n      if (prev === next && changeType === 'update') {\n        return;\n      }\n    } catch {}\n\n    this.configChange.emit(updatedConfig);\n\n    this.columnChange.emit({\n      type: changeType,\n      columns: clonedColumns,\n      columnIndex: this.selectedColumnIndex,\n      column:\n        this.selectedColumnIndex >= 0\n          ? { ...this.columns[this.selectedColumnIndex] }\n          : undefined,\n      fullConfig: updatedConfig,\n    });\n\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Public method to update columns from external source\n   */\n  updateColumnsFromConfig(config: TableConfig): void {\n    if (!config) return;\n\n    this.isV2Config = isTableConfigV2(config);\n\n    if (config.columns && Array.isArray(config.columns)) {\n      this.columns = [...config.columns] as ExtendedColumnDefinition[];\n      this.updateGlobalSettings();\n      this.generateAvailableDataSchema();\n\n      // Reset selection if current selection is invalid\n      if (\n        this.selectedColumnIndex >= this.columns.length ||\n        this.selectedColumnIndex < 0\n      ) {\n        this.selectColumn(-1);\n      } else {\n        // Re-select to ensure reference is updated\n        this.selectColumn(this.selectedColumnIndex);\n      }\n\n      this.cdr.markForCheck();\n    }\n  }\n\n  /**\n   * Public method to get current columns\n   */\n  getCurrentColumns(): ExtendedColumnDefinition[] {\n    return [...this.columns];\n  }\n\n  // Style Rules Integration Methods\n  private initializeStyleRules(): void {\n    // Convert table config to field schemas for the rule builder\n    // const fallbackConfig: TableConfig = { columns: this.columns };\n    // this.currentFieldSchemas = this.fieldSchemaAdapter.adaptTableConfigToFieldSchema(\n    //   !isTableConfigV2(this.config) ? fallbackConfig : this.config\n    // );\n    // Generate sample data for preview (in real app, this would come from actual data)\n    // this.generateSampleData();\n  }\n\n  private generateSampleData(): void {\n    // Generate realistic sample data based on columns\n    this.sampleTableData = [];\n\n    for (let i = 0; i < 5; i++) {\n      const sampleRow: any = {};\n\n      this.columns.forEach((column) => {\n        const fieldName = column.field;\n        const dataType = this.getColumnDataType(column);\n\n        // Generate sample values based on data type and field name\n        switch (dataType) {\n          case 'number':\n            if (fieldName.toLowerCase().includes('id')) {\n              sampleRow[fieldName] = i + 1;\n            } else if (fieldName.toLowerCase().includes('age')) {\n              sampleRow[fieldName] = 25 + Math.floor(Math.random() * 40);\n            } else {\n              sampleRow[fieldName] = Math.floor(Math.random() * 1000);\n            }\n            break;\n\n          case 'currency':\n            sampleRow[fieldName] = (Math.random() * 10000).toFixed(2);\n            break;\n\n          case 'percentage':\n            sampleRow[fieldName] = (Math.random() * 100).toFixed(1);\n            break;\n\n          case 'date':\n            const date = new Date();\n            date.setDate(date.getDate() - Math.floor(Math.random() * 365));\n            sampleRow[fieldName] = date.toISOString().split('T')[0];\n            break;\n\n          case 'boolean':\n            sampleRow[fieldName] = Math.random() > 0.5;\n            break;\n\n          default: // string\n            if (fieldName.toLowerCase().includes('name')) {\n              sampleRow[fieldName] = `Nome ${i + 1}`;\n            } else if (fieldName.toLowerCase().includes('status')) {\n              const statuses = ['Ativo', 'Inativo', 'Pendente', 'Cancelado'];\n              sampleRow[fieldName] =\n                statuses[Math.floor(Math.random() * statuses.length)];\n            } else if (fieldName.toLowerCase().includes('email')) {\n              sampleRow[fieldName] = `usuario${i + 1}@exemplo.com`;\n            } else {\n              sampleRow[fieldName] = `Valor ${i + 1}`;\n            }\n            break;\n        }\n      });\n\n      this.sampleTableData.push(sampleRow);\n    }\n  }\n\n  getStyleRulesPanelDescription(column: ColumnDefinition | null): string {\n    if (!column) return 'Nenhuma coluna selecionada';\n\n    const extendedColumn = column as any;\n    const rulesCount = extendedColumn.conditionalStyles\n      ? extendedColumn.conditionalStyles.length\n      : 0;\n\n    if (rulesCount === 0) {\n      return 'Configure formatação condicional baseada em regras';\n    } else if (rulesCount === 1) {\n      return '1 regra de estilo definida';\n    } else {\n      return `${rulesCount} regras de estilo definidas`;\n    }\n  }\n\n  onConditionalStylesChanged(styles: any[]): void {\n    if (!this.selectedColumn || this.selectedColumnIndex < 0) return;\n\n    // Verify column still exists\n    if (\n      this.selectedColumnIndex >= this.columns.length ||\n      this.columns[this.selectedColumnIndex] !== this.selectedColumn\n    ) {\n      console.warn('Selected column reference is stale');\n      this.selectColumn(-1);\n      return;\n    }\n\n    this.selectedColumn.conditionalStyles = styles;\n\n    // Compile rules for execution in the table\n    // if (styles.length > 0) {\n    //   this.selectedColumn.cellClassCondition = this.tableRuleEngine.compileConditionalStyles(styles);\n    // } else {\n    //   delete this.selectedColumn.cellClassCondition;\n    // }\n\n    this.onColumnPropertyChange();\n  }\n\n  onRuleValidated(event: { ruleId: string; result: any }): void {\n    // Handle rule validation results - could show feedback to user\n    console.log('Rule validated:', event);\n  }\n\n  // Update field schemas when columns change\n  private updateFieldSchemasForStyleRules(): void {\n    // this.currentFieldSchemas = this.fieldSchemaAdapter.adaptTableConfigToFieldSchema({ columns: this.columns });\n    // this.generateSampleData();\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  FormsModule,\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { TableConfig, isTableConfigV2 } from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { distinctUntilChanged } from 'rxjs/operators';\n\nexport interface BehaviorConfigChange {\n  type:\n    | 'pagination'\n    | 'sorting'\n    | 'filtering'\n    | 'selection'\n    | 'interaction'\n    | 'general';\n  property: string;\n  value: any;\n  fullConfig: TableConfig;\n}\n\n@Component({\n  selector: 'behavior-config-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatExpansionModule,\n    MatIconModule,\n    MatTooltipModule,\n    MatDividerModule,\n    MatButtonModule,\n  ],\n  template: `\n    <div class=\"behavior-config-container\">\n      <form [formGroup]=\"behaviorForm\">\n        <!-- Paginação -->\n        <mat-expansion-panel expanded>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">table_rows</mat-icon>\n              Paginação\n            </mat-panel-title>\n            <mat-panel-description>\n              Configure como os dados são divididos em páginas\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"paginationEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar paginação\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"behaviorForm.get('paginationEnabled')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Itens por página</mat-label>\n                <input\n                  matInput\n                  type=\"number\"\n                  formControlName=\"pageSize\"\n                  min=\"1\"\n                  max=\"100\"\n                />\n                <mat-hint>Número de registros exibidos por página</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Opções de tamanho de página</mat-label>\n                <input\n                  matInput\n                  formControlName=\"pageSizeOptions\"\n                  placeholder=\"5, 10, 25, 50\"\n                />\n                <mat-hint>Valores separados por vírgula</mat-hint>\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"showFirstLastButtons\"\n                class=\"toggle-field\"\n              >\n                Mostrar botões primeira/última página\n              </mat-slide-toggle>\n\n              <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n                <mat-label>Estratégia de paginação</mat-label>\n                <mat-select formControlName=\"paginationStrategy\">\n                  <mat-option value=\"client\">Cliente (dados locais)</mat-option>\n                  <mat-option value=\"server\"\n                    >Servidor (paginação remota)</mat-option\n                  >\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n                <mat-label>Posição do paginator</mat-label>\n                <mat-select formControlName=\"paginationPosition\">\n                  <mat-option value=\"top\">Topo</mat-option>\n                  <mat-option value=\"bottom\">Base</mat-option>\n                  <mat-option value=\"both\">Ambos</mat-option>\n                </mat-select>\n                <mat-hint>Paginator no topo/baixo/ambos</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n                <mat-label>Estilo do paginator</mat-label>\n                <mat-select formControlName=\"paginationStyle\">\n                  <mat-option value=\"default\">Padrão</mat-option>\n                  <mat-option value=\"compact\">Compacto</mat-option>\n                </mat-select>\n                <mat-hint>Compacto para densidade alta</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Ordenação -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">sort</mat-icon>\n              Ordenação\n            </mat-panel-title>\n            <mat-panel-description>\n              Controle como as colunas podem ser ordenadas\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"sortingEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar ordenação\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"behaviorForm.get('sortingEnabled')?.value && isV2\"\n            >\n              <mat-slide-toggle\n                formControlName=\"multiSort\"\n                class=\"toggle-field\"\n              >\n                Ordenação múltipla\n                <mat-icon\n                  class=\"info-icon\"\n                  matTooltip=\"Permite ordenar por múltiplas colunas simultaneamente\"\n                >\n                  info_outline\n                </mat-icon>\n              </mat-slide-toggle>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Estratégia de ordenação</mat-label>\n                <mat-select formControlName=\"sortingStrategy\">\n                  <mat-option value=\"client\"\n                    >Cliente (ordenação local)</mat-option\n                  >\n                  <mat-option value=\"server\"\n                    >Servidor (ordenação remota)</mat-option\n                  >\n                </mat-select>\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"allowClearSort\"\n                class=\"toggle-field\"\n              >\n                Permitir limpar ordenação\n              </mat-slide-toggle>\n\n              <!-- Default sort (single entry for now) -->\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Ordenação inicial — coluna</mat-label>\n                <mat-select formControlName=\"defaultSortField\">\n                  <mat-option *ngFor=\"let c of (config?.columns || [])\" [value]=\"c.field\">{{ c.header || c.field }}</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Direção</mat-label>\n                <mat-select formControlName=\"defaultSortDirection\">\n                  <mat-option value=\"asc\">Ascendente</mat-option>\n                  <mat-option value=\"desc\">Descendente</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Filtragem -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">filter_list</mat-icon>\n              Filtragem\n            </mat-panel-title>\n            <mat-panel-description>\n              Configure opções de busca e filtros\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"filteringEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar filtragem\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"behaviorForm.get('filteringEnabled')?.value\"\n            >\n              <div *ngIf=\"isV2\">\n                <mat-slide-toggle\n                  formControlName=\"columnFiltersEnabled\"\n                  class=\"toggle-field\"\n                >\n                  Filtros por coluna\n                  <mat-icon\n                    class=\"info-icon\"\n                    matTooltip=\"Adiciona filtros individuais em cada coluna\"\n                  >\n                    info_outline\n                  </mat-icon>\n                </mat-slide-toggle>\n\n                <mat-slide-toggle\n                  formControlName=\"advancedFiltersEnabled\"\n                  class=\"toggle-field\"\n                >\n                  Filtros avançados\n                  <mat-icon\n                    class=\"info-icon\"\n                    matTooltip=\"Editor visual de queries complexas\"\n                  >\n                    info_outline\n                  </mat-icon>\n                </mat-slide-toggle>\n\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Tempo de debounce (ms)</mat-label>\n                  <input\n                    matInput\n                    type=\"number\"\n                    formControlName=\"filterDebounce\"\n                    min=\"0\"\n                    max=\"2000\"\n                  />\n                  <mat-hint>Atraso antes de aplicar filtros</mat-hint>\n                </mat-form-field>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Seleção -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">check_box</mat-icon>\n              Seleção\n            </mat-panel-title>\n            <mat-panel-description>\n              Configure seleção de linhas para ações em lote\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"selectionEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar seleção\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"behaviorForm.get('selectionEnabled')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Tipo de seleção</mat-label>\n                <mat-select formControlName=\"selectionType\">\n                  <mat-option value=\"single\">Única</mat-option>\n                  <mat-option value=\"multiple\">Múltipla</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n                <mat-label>Modo de seleção</mat-label>\n                <mat-select formControlName=\"selectionMode\">\n                  <mat-option value=\"checkbox\">Checkbox</mat-option>\n                  <mat-option value=\"row\">Clique na linha</mat-option>\n                  <mat-option value=\"both\">Ambos</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"allowSelectAll\"\n                class=\"toggle-field\"\n                *ngIf=\"behaviorForm.get('selectionType')?.value === 'multiple'\"\n              >\n                Botão selecionar todos\n              </mat-slide-toggle>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Interação (V2 only) -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">touch_app</mat-icon>\n              Interação\n            </mat-panel-title>\n            <mat-panel-description>\n              Configure comportamentos de interação do usuário\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-slide-toggle\n                formControlName=\"rowClickEnabled\"\n                class=\"toggle-field\"\n              >\n                Ação ao clicar na linha\n              </mat-slide-toggle>\n\n              <mat-form-field\n                appearance=\"outline\"\n                *ngIf=\"behaviorForm.get('rowClickEnabled')?.value\"\n              >\n                <mat-label>Ação do clique</mat-label>\n                <mat-select formControlName=\"rowClickAction\">\n                  <mat-option value=\"view\">Visualizar</mat-option>\n                  <mat-option value=\"edit\">Editar</mat-option>\n                  <mat-option value=\"select\">Selecionar</mat-option>\n                  <mat-option value=\"custom\">Personalizada</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"rowDoubleClickEnabled\"\n                class=\"toggle-field\"\n              >\n                Ação ao duplo clique\n              </mat-slide-toggle>\n\n              <mat-form-field\n                appearance=\"outline\"\n                *ngIf=\"behaviorForm.get('rowDoubleClickEnabled')?.value\"\n              >\n                <mat-label>Ação do duplo clique</mat-label>\n                <mat-select formControlName=\"rowDoubleClickAction\">\n                  <mat-option value=\"edit\">Editar</mat-option>\n                  <mat-option value=\"view\">Visualizar</mat-option>\n                  <mat-option value=\"custom\">Personalizada</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"hoverEnabled\"\n                class=\"toggle-field\"\n              >\n                Efeitos de hover\n              </mat-slide-toggle>\n\n              <mat-slide-toggle\n                formControlName=\"keyboardEnabled\"\n                class=\"toggle-field\"\n              >\n                Navegação por teclado\n                <mat-icon\n                  class=\"info-icon\"\n                  matTooltip=\"Permite navegação com setas e atalhos\"\n                >\n                  info_outline\n                </mat-icon>\n              </mat-slide-toggle>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Virtualização -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">view_agenda</mat-icon>\n              Virtualização\n            </mat-panel-title>\n            <mat-panel-description>\n              Melhora performance em grandes listas\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          <div class=\"config-section\">\n            <mat-slide-toggle formControlName=\"virtEnabled\" class=\"toggle-field\">\n              Habilitar virtualização\n            </mat-slide-toggle>\n            <div class=\"config-fields\" *ngIf=\"behaviorForm.get('virtEnabled')?.value\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Altura da linha (px)</mat-label>\n                <input matInput type=\"number\" formControlName=\"virtItemHeight\" min=\"24\" max=\"96\" />\n                <mat-hint>Requer altura de linha previsível</mat-hint>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Buffer (itens)</mat-label>\n                <input matInput type=\"number\" formControlName=\"virtBufferSize\" min=\"0\" max=\"200\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Altura mínima do container (px)</mat-label>\n                <input matInput type=\"number\" formControlName=\"virtMinHeight\" min=\"120\" max=\"2000\" />\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Estratégia</mat-label>\n                <mat-select formControlName=\"virtStrategy\">\n                  <mat-option value=\"fixed\">Fixa</mat-option>\n                  <mat-option value=\"dynamic\">Dinâmica</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n            <div class=\"hint\" style=\"opacity:.75; margin-top:6px;\">\n              Virtualização melhora performance em grandes listas; requer altura previsível.\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Aparência rápida -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">density_medium</mat-icon>\n              Aparência rápida\n            </mat-panel-title>\n            <mat-panel-description>\n              Densidade e linhas de grade\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Densidade</mat-label>\n                <mat-select formControlName=\"density\">\n                  <mat-option value=\"compact\">Compacta</mat-option>\n                  <mat-option value=\"comfortable\">Confortável</mat-option>\n                  <mat-option value=\"spacious\">Espaçosa</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <mat-slide-toggle formControlName=\"showRowBorders\" class=\"toggle-field\">\n                Mostrar linhas horizontais\n              </mat-slide-toggle>\n              <mat-slide-toggle formControlName=\"showColumnBorders\" class=\"toggle-field\">\n                Mostrar linhas verticais\n              </mat-slide-toggle>\n            </div>\n          </div>\n        </mat-expansion-panel>\n      </form>\n    </div>\n  `,\n  styles: [\n    `\n      .behavior-config-container {\n        width: 100%;\n        padding: 8px;\n      }\n\n      .config-section {\n        padding: 16px;\n      }\n\n      .config-fields {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        margin-top: 16px;\n      }\n\n      .toggle-field {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .section-icon {\n        margin-right: 8px;\n        color: var(--mat-sys-primary);\n      }\n\n      .info-icon {\n        font-size: 18px;\n        width: 18px;\n        height: 18px;\n        color: var(--mat-sys-on-surface-variant);\n        cursor: help;\n      }\n\n      mat-form-field {\n        width: 100%;\n      }\n\n      mat-expansion-panel {\n        margin-bottom: 8px;\n        border-radius: 8px;\n        overflow: hidden;\n      }\n\n      mat-expansion-panel-header {\n        min-height: 56px;\n      }\n\n      mat-panel-description {\n        color: var(--mat-sys-on-surface-variant);\n      }\n    `,\n  ],\n})\nexport class BehaviorConfigEditorComponent implements OnInit, OnDestroy {\n  @Input() config: TableConfig = { columns: [] };\n  // Opcional: informa se há recurso remoto para ajustar defaults\n  @Input() resourcePath?: string;\n  @Output() configChange = new EventEmitter<TableConfig>();\n  @Output() behaviorChange = new EventEmitter<BehaviorConfigChange>();\n\n  behaviorForm!: FormGroup;\n  isV2 = false;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(private fb: FormBuilder) {}\n\n  ngOnInit(): void {\n    this.isV2 = isTableConfigV2(this.config);\n    this.initializeForm();\n    this.setupFormListeners();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private initializeForm(): void {\n    // Use type guards to safely access properties\n    const v1Config = this.isV2 ? null : (this.config as any);\n    const gridOptions = v1Config?.gridOptions || {};\n    const pagination = gridOptions.pagination || {};\n\n    // Build form with values from config\n    this.behaviorForm = this.fb.group({\n      // Pagination\n      paginationEnabled: [!!gridOptions.pagination],\n      pageSize: [pagination.pageSize || 10],\n      pageSizeOptions: [\n        this.arrayToString(pagination.pageSizeOptions || [5, 10, 25, 50]),\n      ],\n      showFirstLastButtons: [pagination.showFirstLastButtons !== false],\n      // Default adaptado: se houver resourcePath e não houver override, usar 'server'\n      paginationStrategy: [this.resourcePath ? 'server' : 'client'], // V2 only\n      paginationPosition: ['bottom'],\n      paginationStyle: ['default'],\n\n      // Sorting\n      sortingEnabled: [gridOptions.sortable !== false],\n      multiSort: [false], // V2 only\n      sortingStrategy: ['client'], // V2 only\n      allowClearSort: [true], // V2 only\n      defaultSortField: [''],\n      defaultSortDirection: ['asc'],\n\n      // Filtering\n      filteringEnabled: [!!gridOptions.filterable],\n      columnFiltersEnabled: [false], // V2 only\n      advancedFiltersEnabled: [false], // V2 only\n      filterDebounce: [300], // V2 only\n\n      // Selection\n      selectionEnabled: [!!v1Config?.selection?.enabled],\n      selectionType: [v1Config?.selection?.type || 'single'],\n      selectionMode: ['checkbox'], // V2 only\n      allowSelectAll: [true],\n\n      // Interaction (V2 only)\n      rowClickEnabled: [false],\n      rowClickAction: ['view'],\n      rowDoubleClickEnabled: [false],\n      rowDoubleClickAction: ['edit'],\n      hoverEnabled: [true],\n      keyboardEnabled: [false],\n\n      // Virtualization (V2 only)\n      virtEnabled: [false],\n      virtItemHeight: [48],\n      virtBufferSize: [10],\n      virtMinHeight: [200],\n      virtStrategy: ['fixed'],\n\n      // Quick appearance (V2 only)\n      density: ['comfortable'],\n      showRowBorders: [true],\n      showColumnBorders: [false],\n    });\n\n    // If V2, load advanced settings\n    if (this.isV2) {\n      const v2Config = this.config as TableConfig;\n      const behavior = v2Config.behavior || {};\n\n      if (behavior.pagination) {\n        this.behaviorForm.patchValue({\n          paginationEnabled: behavior.pagination.enabled !== false,\n          pageSize: behavior.pagination.pageSize || 10,\n          pageSizeOptions: this.arrayToString(\n            behavior.pagination.pageSizeOptions || [5, 10, 25, 50],\n          ),\n          showFirstLastButtons:\n            behavior.pagination.showFirstLastButtons !== false,\n          // Se a estratégia não estiver definida, respeitar contexto de resourcePath\n          paginationStrategy:\n            (behavior.pagination as any).strategy ?? (this.resourcePath ? 'server' : 'client'),\n          paginationPosition: behavior.pagination.position || 'bottom',\n          paginationStyle: behavior.pagination.style || 'default',\n        });\n      }\n\n      if (behavior.sorting) {\n        this.behaviorForm.patchValue({\n          sortingEnabled: behavior.sorting.enabled !== false,\n          multiSort: behavior.sorting.multiSort || false,\n          sortingStrategy: behavior.sorting.strategy || 'client',\n          allowClearSort: behavior.sorting.allowClearSort !== false,\n          defaultSortField: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.column : behavior.sorting.defaultSort?.column) || '',\n          defaultSortDirection: (Array.isArray(behavior.sorting.defaultSort) ? behavior.sorting.defaultSort[0]?.direction : behavior.sorting.defaultSort?.direction) || 'asc',\n        });\n      }\n\n      if (behavior.filtering) {\n        this.behaviorForm.patchValue({\n          filteringEnabled: behavior.filtering.enabled !== false,\n          columnFiltersEnabled:\n            behavior.filtering.columnFilters?.enabled || false,\n          advancedFiltersEnabled:\n            behavior.filtering.advancedFilters?.enabled || false,\n          filterDebounce: behavior.filtering.debounceTime || 300,\n        });\n      }\n\n      if (behavior.selection) {\n        this.behaviorForm.patchValue({\n          selectionEnabled: behavior.selection.enabled || false,\n          selectionType: behavior.selection.type || 'single',\n          selectionMode: behavior.selection.mode || 'checkbox',\n          allowSelectAll: behavior.selection.allowSelectAll !== false,\n        });\n      }\n\n      if (behavior.interaction) {\n        this.behaviorForm.patchValue({\n          rowClickEnabled: behavior.interaction.rowClick?.enabled || false,\n          rowClickAction: behavior.interaction.rowClick?.action || 'view',\n          rowDoubleClickEnabled:\n            behavior.interaction.rowDoubleClick?.enabled || false,\n          rowDoubleClickAction: behavior.interaction.rowDoubleClick?.action || 'edit',\n          hoverEnabled: behavior.interaction.hover?.enabled !== false,\n          keyboardEnabled: behavior.interaction.keyboard?.enabled || false,\n        });\n      }\n\n      // Virtualization: prefer behavior.virtualization; fallback to performance.virtualization\n      const virt = behavior.virtualization || (v2Config.performance?.virtualization as any);\n      if (virt) {\n        this.behaviorForm.patchValue({\n          virtEnabled: !!virt.enabled,\n          virtItemHeight: virt.itemHeight ?? 48,\n          virtBufferSize: virt.bufferSize ?? 10,\n          virtMinHeight: virt.minContainerHeight ?? 200,\n          virtStrategy: virt.strategy || 'fixed',\n        });\n      }\n\n      // Quick appearance\n      const app = v2Config.appearance || ({} as any);\n      this.behaviorForm.patchValue({\n        density: app.density || 'comfortable',\n        showRowBorders: app.borders?.showRowBorders !== false,\n        showColumnBorders: !!app.borders?.showColumnBorders,\n      });\n    }\n  }\n\n  private setupFormListeners(): void {\n    this.behaviorForm.valueChanges\n      .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n      .subscribe((values) => {\n        this.updateConfig(values);\n      });\n  }\n\n  /**\n   * Applies current form values to the configuration immediately.\n   * Useful to flush pending changes before external save operations.\n   */\n  applyFormChanges(): void {\n    if (this.behaviorForm) {\n      this.updateConfig(this.behaviorForm.value);\n    }\n  }\n\n  private updateConfig(values: any): void {\n    const updatedConfig = { ...this.config };\n\n    if (this.isV2) {\n      // Update V2 config structure\n      const v2Config = updatedConfig as TableConfig;\n\n      v2Config.behavior = v2Config.behavior || {};\n\n      // Pagination\n      v2Config.behavior.pagination = {\n        enabled: values.paginationEnabled,\n        pageSize: values.pageSize,\n        pageSizeOptions: this.stringToArray(values.pageSizeOptions),\n        showFirstLastButtons: values.showFirstLastButtons,\n        strategy: values.paginationStrategy,\n        showPageNumbers: true,\n        showPageInfo: true,\n        position: values.paginationPosition || 'bottom',\n        style: values.paginationStyle || 'default',\n      };\n\n      // Sorting\n      v2Config.behavior.sorting = {\n        enabled: values.sortingEnabled,\n        multiSort: values.multiSort,\n        strategy: values.sortingStrategy,\n        allowClearSort: values.allowClearSort,\n        showSortIndicators: true,\n        indicatorPosition: 'end',\n      };\n      const dfField = (values.defaultSortField || '').trim();\n      const dfDir = values.defaultSortDirection;\n      if (dfField) {\n        if (values.multiSort) {\n          (v2Config.behavior.sorting as any).defaultSort = [{ column: dfField, direction: dfDir }];\n        } else {\n          (v2Config.behavior.sorting as any).defaultSort = { column: dfField, direction: dfDir };\n        }\n      } else {\n        (v2Config.behavior.sorting as any).defaultSort = undefined;\n      }\n\n      // Filtering\n      v2Config.behavior.filtering = {\n        enabled: values.filteringEnabled,\n        columnFilters: {\n          enabled: values.columnFiltersEnabled,\n          defaultType: 'text',\n          position: 'header',\n        },\n        advancedFilters: {\n          enabled: values.advancedFiltersEnabled,\n          queryBuilder: true,\n          savePresets: true,\n        },\n        strategy: 'client',\n        debounceTime: values.filterDebounce,\n      };\n\n      // Selection\n      v2Config.behavior.selection = {\n        enabled: values.selectionEnabled,\n        type: values.selectionType,\n        mode: values.selectionMode,\n        allowSelectAll: values.allowSelectAll,\n        checkboxPosition: 'start',\n        persistSelection: false,\n        persistOnDataUpdate: false,\n      };\n\n      // Interaction\n      v2Config.behavior.interaction = {\n        rowClick: {\n          enabled: values.rowClickEnabled,\n          action: values.rowClickAction,\n        },\n        rowDoubleClick: {\n          enabled: values.rowDoubleClickEnabled,\n          action: values.rowDoubleClickAction,\n        },\n        hover: {\n          enabled: values.hoverEnabled,\n          highlightRow: true,\n          showActionsOnHover: false,\n        },\n        keyboard: {\n          enabled: values.keyboardEnabled,\n          arrowNavigation: true,\n          spaceSelection: true,\n        },\n      };\n\n      // Virtualization\n      v2Config.behavior.virtualization = {\n        enabled: values.virtEnabled,\n        itemHeight: values.virtItemHeight,\n        bufferSize: values.virtBufferSize,\n        minContainerHeight: values.virtMinHeight,\n        strategy: values.virtStrategy,\n      };\n\n      // Quick appearance\n      v2Config.appearance = (v2Config.appearance || ({} as any)) as any;\n      (v2Config.appearance as any).density = values.density;\n      (v2Config.appearance as any).borders = {\n        ...((v2Config.appearance as any).borders || {}),\n        showRowBorders: values.showRowBorders,\n        showColumnBorders: values.showColumnBorders,\n      } as any;\n    } else {\n      // Update V1 config structure\n      const v1UpdatedConfig = updatedConfig as any;\n      v1UpdatedConfig.gridOptions = v1UpdatedConfig.gridOptions || {};\n\n      if (values.paginationEnabled) {\n        v1UpdatedConfig.gridOptions.pagination = {\n          pageSize: values.pageSize,\n          pageSizeOptions: this.stringToArray(values.pageSizeOptions),\n          showFirstLastButtons: values.showFirstLastButtons,\n        };\n      } else {\n        delete v1UpdatedConfig.gridOptions.pagination;\n      }\n\n      v1UpdatedConfig.gridOptions.sortable = values.sortingEnabled;\n      v1UpdatedConfig.gridOptions.filterable = values.filteringEnabled;\n\n      if (values.selectionEnabled) {\n        (updatedConfig as any).selection = {\n          enabled: true,\n          type: values.selectionType,\n        };\n      } else {\n        delete (updatedConfig as any).selection;\n      }\n    }\n\n    this.configChange.emit(updatedConfig);\n  }\n\n  private arrayToString(arr: number[]): string {\n    return arr.join(', ');\n  }\n\n  private stringToArray(str: string): number[] {\n    return str\n      .split(',')\n      .map((s) => parseInt(s.trim()))\n      .filter((n) => !isNaN(n));\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  FormsModule,\n  ReactiveFormsModule,\n  FormBuilder,\n  FormGroup,\n  FormArray,\n} from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatListModule } from '@angular/material/list';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatMenuModule } from '@angular/material/menu';\nimport {\n  DragDropModule,\n  CdkDragDrop,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { TableConfig, IconPickerService, PraxisIconDirective } from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface ToolbarAction {\n  id: string;\n  label: string;\n  icon?: string;\n  type: 'button' | 'icon' | 'fab' | 'menu';\n  color?: 'primary' | 'accent' | 'warn';\n  /** Aparência do botão Material: filled (flat), outlined (stroked), elevated (raised), text, tonal */\n  appearance?: 'filled' | 'outlined' | 'elevated' | 'text' | 'tonal';\n  action: string;\n  position: 'start' | 'end';\n  order?: number;\n  disabled?: boolean;\n  visible?: boolean;\n  shortcut?: string;\n  tooltip?: string;\n  visibleWhen?: string;\n  children?: ToolbarAction[];\n}\n\nexport interface RowAction {\n  id: string;\n  label: string;\n  icon: string;\n  action: string;\n  color?: 'primary' | 'accent' | 'warn';\n  tooltip?: string;\n  requiresConfirmation?: boolean;\n  autoDelete?: boolean;\n  separator?: boolean;\n  conditional?: string; // Expressão para mostrar/ocultar\n}\n\nexport interface BulkAction {\n  id: string;\n  label: string;\n  icon: string;\n  action: string;\n  color?: 'primary' | 'accent' | 'warn';\n  tooltip?: string;\n  requiresConfirmation?: boolean;\n  autoDelete?: boolean;\n  minSelections?: number;\n  maxSelections?: number;\n}\n\nexport interface ToolbarActionsChange {\n  type: 'toolbar' | 'rowActions' | 'bulkActions' | 'export';\n  property: string;\n  value: any;\n  fullConfig: TableConfig;\n}\n\n@Component({\n  selector: 'toolbar-actions-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatExpansionModule,\n    MatIconModule,\n    MatTooltipModule,\n    MatDividerModule,\n    MatButtonModule,\n    MatListModule,\n    MatChipsModule,\n    MatMenuModule,\n    DragDropModule,\n    PraxisIconDirective,\n  ],\n  template: `\n    <div class=\"toolbar-actions-container\">\n      <form [formGroup]=\"toolbarForm\">\n        <!-- Barra de Ferramentas -->\n        <mat-expansion-panel expanded>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">build</mat-icon>\n              Barra de Ferramentas\n            </mat-panel-title>\n            <mat-panel-description>\n              Configure a barra superior da tabela\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"toolbarVisible\"\n              class=\"toggle-field\"\n            >\n              Mostrar barra de ferramentas\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"toolbarForm.get('toolbarVisible')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Título da barra</mat-label>\n                <input\n                  matInput\n                  formControlName=\"toolbarTitle\"\n                  placeholder=\"Ex: Gerenciar Usuários\"\n                />\n                <mat-hint>Título exibido na barra de ferramentas</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Subtítulo</mat-label>\n                <input\n                  matInput\n                  formControlName=\"toolbarSubtitle\"\n                  placeholder=\"Ex: Lista completa de usuários do sistema\"\n                />\n                <mat-hint>Texto de apoio abaixo do título</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Posição</mat-label>\n                <mat-select formControlName=\"toolbarPosition\">\n                  <mat-option value=\"top\">Acima da tabela</mat-option>\n                  <mat-option value=\"bottom\">Abaixo da tabela</mat-option>\n                  <mat-option value=\"both\">Ambos</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Altura da barra (px)</mat-label>\n                <input\n                  matInput\n                  type=\"number\"\n                  formControlName=\"toolbarHeight\"\n                  min=\"40\"\n                  max=\"120\"\n                />\n                <mat-hint>Altura em pixels da barra de ferramentas</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Ações da Toolbar -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">add_circle</mat-icon>\n              Ações da Toolbar\n            </mat-panel-title>\n            <mat-panel-description>\n              Botões e menus personalizados na barra\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <!-- Atalho rápido: Botão Adicionar (create) -->\n            <div class=\"quick-add\">\n              <mat-slide-toggle formControlName=\"addButtonEnabled\" class=\"toggle-field\">\n                Exibir botão \"Adicionar\"\n              </mat-slide-toggle>\n\n              <div class=\"config-fields\" *ngIf=\"toolbarForm.get('addButtonEnabled')?.value\">\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Label</mat-label>\n                  <input matInput formControlName=\"addButtonLabel\" />\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Ícone</mat-label>\n                  <span matPrefix *ngIf=\"toolbarForm.value.addButtonIcon\">\n                    <mat-icon aria-hidden=\"true\">{{ toolbarForm.value.addButtonIcon }}</mat-icon>\n                  </span>\n                  <input matInput formControlName=\"addButtonIcon\" placeholder=\"ex.: add, add_circle\" />\n                  <mat-hint>Material Symbols (mi:...)\n                  </mat-hint>\n                  <button mat-icon-button matSuffix type=\"button\" (click)=\"pickAddButtonIcon()\" matTooltip=\"Escolher ícone\">\n                    <mat-icon>search</mat-icon>\n                  </button>\n                  <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('addButtonIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.addButtonIcon\">\n                    <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n                  </button>\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Cor</mat-label>\n                  <mat-select formControlName=\"addButtonColor\">\n                    <mat-option value=\"primary\">Primary</mat-option>\n                    <mat-option value=\"accent\">Accent</mat-option>\n                    <mat-option value=\"warn\">Warn</mat-option>\n                  </mat-select>\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Posição</mat-label>\n                  <mat-select formControlName=\"addButtonPosition\">\n                    <mat-option value=\"start\">Início</mat-option>\n                    <mat-option value=\"end\">Fim</mat-option>\n                  </mat-select>\n                </mat-form-field>\n\n                <mat-form-field appearance=\"outline\">\n                  <mat-label>Aparência</mat-label>\n                  <mat-select formControlName=\"addButtonAppearance\">\n                    <mat-option value=\"filled\">Preenchido</mat-option>\n                    <mat-option value=\"outlined\">Contornado</mat-option>\n                    <mat-option value=\"elevated\">Elevado</mat-option>\n                    <mat-option value=\"text\">Texto</mat-option>\n                    <mat-option value=\"tonal\">Tonal</mat-option>\n                  </mat-select>\n                </mat-form-field>\n              </div>\n            </div>\n\n            <div class=\"actions-header\">\n              <button\n                mat-raised-button\n                color=\"primary\"\n                (click)=\"addToolbarAction()\"\n                type=\"button\"\n              >\n                <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n                Adicionar Ação\n              </button>\n              <button mat-stroked-button [matMenuTriggerFor]=\"toolbarTplMenu\" type=\"button\" style=\"margin-left:8px\">\n                <mat-icon [praxisIcon]=\"'bolt'\"></mat-icon>\n                Usar Template\n              </button>\n              <mat-menu #toolbarTplMenu=\"matMenu\">\n                <button mat-menu-item [matMenuTriggerFor]=\"toolbarCrudTpl\">\n                  <mat-icon [praxisIcon]=\"'add_circle'\"></mat-icon>\n                  <span>CRUD: botão Adicionar</span>\n                </button>\n              </mat-menu>\n              <mat-menu #toolbarCrudTpl=\"matMenu\">\n                <button mat-menu-item (click)=\"applyToolbarTemplate('crudAdd','replace')\">Aplicar (Substituir)</button>\n                <button mat-menu-item (click)=\"applyToolbarTemplate('crudAdd','merge')\">Mesclar (Manter e adicionar)</button>\n              </mat-menu>\n            </div>\n\n            <div\n              class=\"actions-list\"\n              cdkDropList\n              (cdkDropListDropped)=\"dropToolbarAction($event)\"\n            >\n              <div\n                class=\"action-item\"\n                *ngFor=\"let action of toolbarActions; let i = index\"\n                cdkDrag\n              >\n                <div class=\"action-header\" cdkDragHandle>\n                  <mat-icon class=\"drag-handle\" [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n                  <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n                  <span class=\"action-label\">{{\n                    action.label || 'Nova Ação'\n                  }}</span>\n                  <div class=\"action-controls\">\n                    <button\n                      mat-icon-button\n                      (click)=\"editToolbarAction(i)\"\n                      type=\"button\"\n                    >\n                      <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n                    </button>\n                    <button\n                      mat-icon-button\n                      (click)=\"removeToolbarAction(i)\"\n                      type=\"button\"\n                      color=\"warn\"\n                    >\n                      <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n                    </button>\n                  </div>\n                </div>\n\n                <div\n                  class=\"action-details\"\n                  *ngIf=\"editingToolbarActionIndex === i\"\n                >\n                  <div class=\"action-form\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>ID da ação</mat-label>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.id\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      />\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Label</mat-label>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.label\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      />\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Ícone</mat-label>\n                      <span matPrefix *ngIf=\"action.icon\">\n                        <mat-icon aria-hidden=\"true\" [praxisIcon]=\"action.icon\"></mat-icon>\n                      </span>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.icon\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        placeholder=\"ex.: add, edit, delete\"\n                      />\n                      <mat-hint>Material Symbols (mi:...)</mat-hint>\n                      <button mat-icon-button matSuffix type=\"button\" (click)=\"pickActionIcon(i)\" matTooltip=\"Escolher ícone\">\n                        <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n                      </button>\n                      <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateToolbarActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n                        <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n                      </button>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Tipo</mat-label>\n                      <mat-select\n                        [(ngModel)]=\"action.type\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      >\n                        <mat-option value=\"button\">Botão</mat-option>\n                        <mat-option value=\"menu\">Menu</mat-option>\n                        <mat-option value=\"toggle\">Toggle</mat-option>\n                        <mat-option value=\"input\">Input</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\" *ngIf=\"action.type === 'button'\">\n                      <mat-label>Aparência</mat-label>\n                      <mat-select\n                        [(ngModel)]=\"action.appearance\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      >\n                        <mat-option value=\"filled\">Preenchido</mat-option>\n                        <mat-option value=\"outlined\">Contornado</mat-option>\n                        <mat-option value=\"elevated\">Elevado</mat-option>\n                        <mat-option value=\"text\">Texto</mat-option>\n                        <mat-option value=\"tonal\">Tonal</mat-option>\n                      </mat-select>\n                      <mat-hint>Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom.</mat-hint>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Ação/Função</mat-label>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.action\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      />\n                      <mat-hint>Nome da função a ser chamada</mat-hint>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Posição</mat-label>\n                      <mat-select\n                        [(ngModel)]=\"action.position\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      >\n                        <mat-option value=\"start\">Início</mat-option>\n                        <mat-option value=\"center\">Centro</mat-option>\n                        <mat-option value=\"end\">Fim</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Cor</mat-label>\n                      <mat-select\n                        [(ngModel)]=\"action.color\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      >\n                        <mat-option value=\"\">Padrão</mat-option>\n                        <mat-option value=\"primary\">Primary</mat-option>\n                        <mat-option value=\"accent\">Accent</mat-option>\n                        <mat-option value=\"warn\">Warn</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Atalho de teclado</mat-label>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.shortcut\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        placeholder=\"Ex: Ctrl+N\"\n                      />\n                    </mat-form-field>\n\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Tooltip</mat-label>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.tooltip\"\n                        (ngModelChange)=\"updateToolbarActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                      />\n                    </mat-form-field>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Ações por Linha -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\" [praxisIcon]=\"'more_vert'\"></mat-icon>\n              Ações por Linha\n            </mat-panel-title>\n            <mat-panel-description>\n              Ações específicas para cada registro\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"rowActionsEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar ações por linha\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"toolbarForm.get('rowActionsEnabled')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Modo de exibição</mat-label>\n                <mat-select formControlName=\"rowActionsDisplay\">\n                  <mat-option value=\"menu\">Menu suspenso</mat-option>\n                  <mat-option value=\"buttons\">Botões individuais</mat-option>\n                  <mat-option value=\"hybrid\"\n                    >Híbrido (botões + menu)</mat-option\n                  >\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Quando mostrar</mat-label>\n                <mat-select formControlName=\"rowActionsTrigger\">\n                  <mat-option value=\"always\">Sempre visível</mat-option>\n                  <mat-option value=\"hover\">Apenas no hover</mat-option>\n                  <mat-option value=\"focus\">Apenas com foco</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Máximo de ações visíveis</mat-label>\n                <input\n                  matInput\n                  type=\"number\"\n                  formControlName=\"maxVisibleRowActions\"\n                  min=\"1\"\n                  max=\"5\"\n                />\n                <mat-hint>Demais ações ficam no menu \"Mais\"</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Largura da coluna de ações</mat-label>\n                <input matInput formControlName=\"rowActionsWidth\" placeholder=\"ex.: 96px, 6rem\" />\n                <mat-hint>Aplica no header e nas células</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Fixar coluna de ações</mat-label>\n                <mat-select formControlName=\"rowActionsSticky\">\n                  <mat-option [value]=\"null\">Nenhum</mat-option>\n                  <mat-option value=\"start\">Início</mat-option>\n                  <mat-option value=\"end\">Fim</mat-option>\n                </mat-select>\n                <mat-hint>Fixar coluna de ações (início/fim)</mat-hint>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Ícone do menu (três pontos)</mat-label>\n                <span matPrefix *ngIf=\"toolbarForm.value.rowActionsMenuIcon\">\n                  <mat-icon aria-hidden=\"true\" [praxisIcon]=\"toolbarForm.value.rowActionsMenuIcon\"></mat-icon>\n                </span>\n                <input matInput formControlName=\"rowActionsMenuIcon\" placeholder=\"ex.: more_vert, more_horiz\" />\n                <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowMenuIcon()\" matTooltip=\"Escolher ícone\">\n                  <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n                </button>\n                <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('rowActionsMenuIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.rowActionsMenuIcon\">\n                  <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n                </button>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Cor do botão do menu</mat-label>\n                <mat-select formControlName=\"rowActionsMenuButtonColor\">\n                  <mat-option value=\"basic\">Padrão</mat-option>\n                  <mat-option value=\"primary\">Primary</mat-option>\n                  <mat-option value=\"accent\">Accent</mat-option>\n                  <mat-option value=\"warn\">Warn</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <div class=\"subsection\" style=\"grid-column: 1 / -1;\">\n                <h4> Cabeçalho da coluna de ações </h4>\n                <div class=\"action-form\">\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Label</mat-label>\n                    <input matInput formControlName=\"rowActionsHeaderLabel\" placeholder=\"Ex.: Ações\" />\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Ícone</mat-label>\n                    <span matPrefix *ngIf=\"toolbarForm.value.rowActionsHeaderIcon\">\n                      <mat-icon aria-hidden=\"true\" [praxisIcon]=\"toolbarForm.value.rowActionsHeaderIcon\"></mat-icon>\n                    </span>\n                    <input matInput formControlName=\"rowActionsHeaderIcon\" placeholder=\"ex.: more_horiz, build\" />\n                    <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowHeaderIcon()\" matTooltip=\"Escolher ícone\">\n                      <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n                    </button>\n                    <button mat-icon-button matSuffix type=\"button\" (click)=\"toolbarForm.get('rowActionsHeaderIcon')?.setValue('')\" matTooltip=\"Limpar\" *ngIf=\"toolbarForm.value.rowActionsHeaderIcon\">\n                      <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n                    </button>\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Tooltip</mat-label>\n                    <input matInput formControlName=\"rowActionsHeaderTooltip\" placeholder=\"Ex.: Ações disponíveis\" />\n                  </mat-form-field>\n\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Alinhamento</mat-label>\n                    <mat-select formControlName=\"rowActionsHeaderAlign\">\n                      <mat-option value=\"start\">Início</mat-option>\n                      <mat-option value=\"center\">Centro</mat-option>\n                      <mat-option value=\"end\">Fim</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                </div>\n              </div>\n\n              <div class=\"actions-header\">\n                <button\n                  mat-raised-button\n                  color=\"primary\"\n                  (click)=\"addRowAction()\"\n                  type=\"button\"\n                >\n                  <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n                  Adicionar Ação de Linha\n                </button>\n                <button mat-stroked-button [matMenuTriggerFor]=\"rowTplMenu\" type=\"button\" style=\"margin-left:8px\">\n                  <mat-icon [praxisIcon]=\"'bolt'\"></mat-icon>\n                  Usar Template\n                </button>\n                <mat-menu #rowTplMenu=\"matMenu\">\n                  <button mat-menu-item [matMenuTriggerFor]=\"rowCrudTpl\">\n                    <mat-icon [praxisIcon]=\"'list'\"></mat-icon>\n                    <span>CRUD padrão (ver/editar/excluir)</span>\n                  </button>\n                  <button mat-menu-item [matMenuTriggerFor]=\"rowEditDeleteTpl\">\n                    <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n                    <span>Editar + Excluir</span>\n                  </button>\n                  <button mat-menu-item [matMenuTriggerFor]=\"rowViewOnlyTpl\">\n                    <mat-icon [praxisIcon]=\"'visibility'\"></mat-icon>\n                    <span>Apenas Visualizar</span>\n                  </button>\n                  <button mat-menu-item [matMenuTriggerFor]=\"rowCrudBulkTpl\">\n                    <mat-icon [praxisIcon]=\"'delete_sweep'\"></mat-icon>\n                    <span>CRUD + Excluir em Lote</span>\n                  </button>\n                </mat-menu>\n                <mat-menu #rowCrudTpl=\"matMenu\">\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('crud','replace')\">Aplicar (Substituir)</button>\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('crud','merge')\">Mesclar (Manter e adicionar)</button>\n                </mat-menu>\n                <mat-menu #rowEditDeleteTpl=\"matMenu\">\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('editDelete','replace')\">Aplicar (Substituir)</button>\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('editDelete','merge')\">Mesclar (Manter e adicionar)</button>\n                </mat-menu>\n                <mat-menu #rowViewOnlyTpl=\"matMenu\">\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('viewOnly','replace')\">Aplicar (Substituir)</button>\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('viewOnly','merge')\">Mesclar (Manter e adicionar)</button>\n                </mat-menu>\n                <mat-menu #rowCrudBulkTpl=\"matMenu\">\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('crudWithBulk','replace')\">Aplicar (Substituir)</button>\n                  <button mat-menu-item (click)=\"applyRowActionsTemplate('crudWithBulk','merge')\">Mesclar (Manter e adicionar)</button>\n                </mat-menu>\n              </div>\n\n              <div\n                class=\"actions-list\"\n                cdkDropList\n                (cdkDropListDropped)=\"dropRowAction($event)\"\n              >\n                <div\n                  class=\"action-item\"\n                  *ngFor=\"let action of rowActions; let i = index\"\n                  cdkDrag\n                >\n                  <div class=\"action-header\" cdkDragHandle>\n                    <mat-icon class=\"drag-handle\" [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n                    <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n                    <span class=\"action-label\">{{\n                      action.label || 'Nova Ação'\n                    }}</span>\n                    <div class=\"action-controls\">\n                      <button\n                        mat-icon-button\n                        (click)=\"editRowAction(i)\"\n                        type=\"button\"\n                      >\n                        <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n                      </button>\n                      <button\n                        mat-icon-button\n                        (click)=\"removeRowAction(i)\"\n                        type=\"button\"\n                        color=\"warn\"\n                      >\n                        <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n                      </button>\n                    </div>\n                  </div>\n\n                  <div\n                    class=\"action-details\"\n                    *ngIf=\"editingRowActionIndex === i\"\n                  >\n                    <div class=\"action-form\">\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>ID da ação</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.id\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Label</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.label\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Ícone</mat-label>\n                        <span matPrefix *ngIf=\"action.icon\">\n                          <mat-icon aria-hidden=\"true\" [praxisIcon]=\"action.icon\"></mat-icon>\n                        </span>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.icon\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                          placeholder=\"ex.: add, edit, delete\"\n                        />\n                        <mat-hint>Material Symbols (mi:...)</mat-hint>\n                        <button mat-icon-button matSuffix type=\"button\" (click)=\"pickRowActionIcon(i)\" matTooltip=\"Escolher ícone\">\n                          <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n                        </button>\n                        <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateRowActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n                          <mat-icon [praxisIcon]=\"'backspace'\"></mat-icon>\n                        </button>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Ação/Função</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.action\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Cor</mat-label>\n                        <mat-select\n                          [(ngModel)]=\"action.color\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        >\n                          <mat-option value=\"\">Padrão</mat-option>\n                          <mat-option value=\"primary\">Primary</mat-option>\n                          <mat-option value=\"accent\">Accent</mat-option>\n                          <mat-option value=\"warn\">Warn</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Tooltip</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.tooltip\"\n                          (ngModelChange)=\"updateRowActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-slide-toggle\n                        [(ngModel)]=\"action.requiresConfirmation\"\n                        (ngModelChange)=\"updateRowActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        class=\"toggle-field\"\n                      >\n                        Requer confirmação\n                      </mat-slide-toggle>\n\n                      <mat-slide-toggle\n                        *ngIf=\"action.action === 'delete'\"\n                        [(ngModel)]=\"action.autoDelete\"\n                        (ngModelChange)=\"updateRowActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        class=\"toggle-field\"\n                      >\n                        Excluir automaticamente\n                      </mat-slide-toggle>\n\n                      <mat-slide-toggle\n                        [(ngModel)]=\"action.separator\"\n                        (ngModelChange)=\"updateRowActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        class=\"toggle-field\"\n                      >\n                        Separador após esta ação\n                      </mat-slide-toggle>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Ações em Lote -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\" [praxisIcon]=\"'select_all'\"></mat-icon>\n              Ações em Lote\n            </mat-panel-title>\n            <mat-panel-description>\n              Ações para múltiplas seleções (V2 only)\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"bulkActionsEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar ações em lote\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"toolbarForm.get('bulkActionsEnabled')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Posição das ações em lote</mat-label>\n                <mat-select formControlName=\"bulkActionsPosition\">\n                  <mat-option value=\"toolbar\"\n                    >Na barra de ferramentas</mat-option\n                  >\n                  <mat-option value=\"floating\">Barra flutuante</mat-option>\n                  <mat-option value=\"bottom\">Barra inferior</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <div class=\"actions-header\">\n                <button\n                  mat-raised-button\n                  color=\"primary\"\n                  (click)=\"addBulkAction()\"\n                  type=\"button\"\n                >\n                  <mat-icon [praxisIcon]=\"'add'\"></mat-icon>\n                  Adicionar Ação em Lote\n                </button>\n              </div>\n\n              <div\n                class=\"actions-list\"\n                cdkDropList\n                (cdkDropListDropped)=\"dropBulkAction($event)\"\n              >\n                <div\n                  class=\"action-item\"\n                  *ngFor=\"let action of bulkActions; let i = index\"\n                  cdkDrag\n                >\n                  <div class=\"action-header\" cdkDragHandle>\n                    <mat-icon class=\"drag-handle\">drag_indicator</mat-icon>\n                    <mat-icon>{{ action.icon }}</mat-icon>\n                    <span class=\"action-label\">{{\n                      action.label || 'Nova Ação'\n                    }}</span>\n                    <div class=\"action-controls\">\n                      <button\n                        mat-icon-button\n                        (click)=\"editBulkAction(i)\"\n                        type=\"button\"\n                      >\n                        <mat-icon>edit</mat-icon>\n                      </button>\n                      <button\n                        mat-icon-button\n                        (click)=\"removeBulkAction(i)\"\n                        type=\"button\"\n                        color=\"warn\"\n                      >\n                        <mat-icon>delete</mat-icon>\n                      </button>\n                    </div>\n                  </div>\n\n                  <div\n                    class=\"action-details\"\n                    *ngIf=\"editingBulkActionIndex === i\"\n                  >\n                    <div class=\"action-form\">\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>ID da ação</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.id\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Label</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.label\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Ícone</mat-label>\n                        <span matPrefix *ngIf=\"action.icon\">\n                          <mat-icon aria-hidden=\"true\">{{ action.icon }}</mat-icon>\n                        </span>\n                      <input\n                        matInput\n                        [(ngModel)]=\"action.icon\"\n                        (ngModelChange)=\"updateBulkActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        placeholder=\"ex.: add, edit, delete\"\n                      />\n                      <mat-hint>Material Symbols (mi:...)</mat-hint>\n                        <button mat-icon-button matSuffix type=\"button\" (click)=\"pickBulkActionIcon(i)\" matTooltip=\"Escolher ícone\">\n                          <mat-icon>search</mat-icon>\n                        </button>\n                        <button mat-icon-button matSuffix type=\"button\" (click)=\"action.icon=''; updateBulkActions()\" matTooltip=\"Limpar\" *ngIf=\"action.icon\">\n                          <mat-icon>backspace</mat-icon>\n                        </button>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Ação/Função</mat-label>\n                        <input\n                          matInput\n                          [(ngModel)]=\"action.action\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Cor</mat-label>\n                        <mat-select\n                          [(ngModel)]=\"action.color\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                        >\n                          <mat-option value=\"\">Padrão</mat-option>\n                          <mat-option value=\"primary\">Primary</mat-option>\n                          <mat-option value=\"accent\">Accent</mat-option>\n                          <mat-option value=\"warn\">Warn</mat-option>\n                        </mat-select>\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Mínimo de seleções</mat-label>\n                        <input\n                          matInput\n                          type=\"number\"\n                          [(ngModel)]=\"action.minSelections\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                          min=\"1\"\n                        />\n                      </mat-form-field>\n\n                      <mat-form-field appearance=\"outline\">\n                        <mat-label>Máximo de seleções</mat-label>\n                        <input\n                          matInput\n                          type=\"number\"\n                          [(ngModel)]=\"action.maxSelections\"\n                          (ngModelChange)=\"updateBulkActions()\"\n                          [ngModelOptions]=\"{ standalone: true }\"\n                          min=\"1\"\n                        />\n                      </mat-form-field>\n\n                      <mat-slide-toggle\n                        [(ngModel)]=\"action.requiresConfirmation\"\n                        (ngModelChange)=\"updateBulkActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        class=\"toggle-field\"\n                      >\n                        Requer confirmação\n                      </mat-slide-toggle>\n\n                      <mat-slide-toggle\n                        *ngIf=\"action.action === 'delete'\"\n                        [(ngModel)]=\"action.autoDelete\"\n                        (ngModelChange)=\"updateBulkActions()\"\n                        [ngModelOptions]=\"{ standalone: true }\"\n                        class=\"toggle-field\"\n                      >\n                        Excluir automaticamente\n                      </mat-slide-toggle>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n\n        <!-- Exportação -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">download</mat-icon>\n              Exportação\n            </mat-panel-title>\n            <mat-panel-description>\n              Configurações de exportação de dados (V2 only)\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n\n          <div class=\"config-section\">\n            <mat-slide-toggle\n              formControlName=\"exportEnabled\"\n              class=\"toggle-field\"\n            >\n              Habilitar exportação\n            </mat-slide-toggle>\n\n            <div\n              class=\"config-fields\"\n              *ngIf=\"toolbarForm.get('exportEnabled')?.value\"\n            >\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Formatos disponíveis</mat-label>\n                <mat-select formControlName=\"exportFormats\" multiple>\n                  <mat-option value=\"excel\">Excel (.xlsx)</mat-option>\n                  <mat-option value=\"csv\">CSV</mat-option>\n                  <mat-option value=\"pdf\">PDF</mat-option>\n                  <mat-option value=\"json\">JSON</mat-option>\n                </mat-select>\n                <mat-hint\n                  >Segure Ctrl para selecionar múltiplos formatos</mat-hint\n                >\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Nome padrão do arquivo</mat-label>\n                <input\n                  matInput\n                  formControlName=\"exportFileName\"\n                  placeholder=\"dados-export\"\n                />\n              </mat-form-field>\n\n              <mat-slide-toggle\n                formControlName=\"exportIncludeHeaders\"\n                class=\"toggle-field\"\n              >\n                Incluir cabeçalhos\n              </mat-slide-toggle>\n\n              <mat-slide-toggle\n                formControlName=\"exportRespectFilters\"\n                class=\"toggle-field\"\n              >\n                Respeitar filtros aplicados\n              </mat-slide-toggle>\n\n              <mat-slide-toggle\n                formControlName=\"exportSelectedOnly\"\n                class=\"toggle-field\"\n              >\n                Apenas linhas selecionadas\n              </mat-slide-toggle>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Máximo de linhas</mat-label>\n                <input\n                  matInput\n                  type=\"number\"\n                  formControlName=\"exportMaxRows\"\n                  min=\"1\"\n                  max=\"100000\"\n                />\n                <mat-hint>Limite para evitar arquivos muito grandes</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n      </form>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        --tae-primary: var(--mat-sys-primary, var(--md-sys-color-primary, var(--sicoob-primary-default)));\n        --tae-surface: var(--mat-sys-surface, var(--md-sys-color-surface, var(--sicoob-bg-elev-1)));\n        --tae-surface-low: var(--mat-sys-surface-container-low, var(--sicoob-bg-elev-1));\n        --tae-surface-variant: var(--mat-sys-surface-variant, var(--sicoob-bg-elev-2));\n        --tae-outline-variant: var(--mat-sys-outline-variant, var(--sicoob-stroke-medium));\n        --tae-on-surface: var(--mat-sys-on-surface, var(--sicoob-text-high));\n        --tae-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n      }\n      .toolbar-actions-container {\n        width: 100%;\n        padding: 8px;\n      }\n\n      .config-section {\n        padding: 16px;\n      }\n\n      .config-fields {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        margin-top: 16px;\n      }\n\n      .nested-fields {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n        margin-left: 24px;\n        margin-top: 12px;\n        padding: 16px;\n        background-color: var(--tae-surface-variant);\n        border-radius: 8px;\n      }\n\n      .toggle-field {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .section-icon { margin-right: 8px; color: var(--tae-primary); }\n\n      .subsection {\n        margin-top: 24px;\n        padding: 16px;\n        border: 1px solid var(--tae-outline-variant);\n        border-radius: 8px;\n      }\n\n      .subsection h4 {\n        margin: 0 0 16px 0;\n        color: var(--tae-on-surface);\n        font-weight: 500;\n      }\n\n      .actions-header {\n        margin: 16px 0;\n        display: flex;\n        justify-content: flex-start;\n      }\n\n      .actions-list {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        min-height: 60px;\n      }\n\n      .action-item {\n        border: 1px solid var(--tae-outline-variant);\n        border-radius: 8px;\n        background-color: var(--tae-surface);\n        overflow: hidden;\n      }\n\n      .action-header {\n        display: flex;\n        align-items: center;\n        padding: 12px 16px;\n        background-color: var(--tae-surface-low);\n        cursor: move;\n      }\n\n      .drag-handle {\n        margin-right: 8px;\n        color: var(--tae-on-surface-variant);\n        cursor: grab;\n      }\n\n      .drag-handle:active {\n        cursor: grabbing;\n      }\n\n      .action-label {\n        flex: 1;\n        margin-left: 8px;\n        font-weight: 500;\n      }\n\n      .action-controls {\n        display: flex;\n        gap: 4px;\n      }\n\n      .action-details {\n        padding: 16px;\n        border-top: 1px solid var(--tae-outline-variant);\n        background-color: var(--tae-surface);\n      }\n\n      .action-form {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n        gap: 16px;\n      }\n\n      mat-form-field {\n        width: 100%;\n      }\n\n      mat-expansion-panel {\n        margin-bottom: 8px;\n        border-radius: 8px;\n        overflow: hidden;\n      }\n\n      mat-expansion-panel-header {\n        min-height: 56px;\n      }\n\n      mat-panel-description { color: var(--tae-on-surface-variant); }\n\n      .cdk-drag-preview {\n        box-sizing: border-box;\n        border-radius: 4px;\n        box-shadow:\n          0 5px 5px -3px rgba(0, 0, 0, 0.2),\n          0 8px 10px 1px rgba(0, 0, 0, 0.14),\n          0 3px 14px 2px rgba(0, 0, 0, 0.12);\n      }\n\n      .cdk-drag-placeholder {\n        opacity: 0;\n      }\n\n      .cdk-drag-animating {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n\n      .actions-list.cdk-drop-list-dragging\n        .action-item:not(.cdk-drag-placeholder) {\n        transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n      }\n    `,\n  ],\n})\nexport class ToolbarActionsEditorComponent\n  implements OnInit, OnDestroy, OnChanges\n{\n  @Input() config: TableConfig = { columns: [] };\n  @Output() configChange = new EventEmitter<TableConfig>();\n  @Output() toolbarActionsChange = new EventEmitter<ToolbarActionsChange>();\n\n  toolbarForm!: FormGroup;\n  isV2 = false;\n\n  // Actions arrays\n  toolbarActions: ToolbarAction[] = [];\n  rowActions: RowAction[] = [];\n  bulkActions: BulkAction[] = [];\n\n  // Editing state\n  editingToolbarActionIndex: number | null = null;\n  editingRowActionIndex: number | null = null;\n  editingBulkActionIndex: number | null = null;\n\n  private destroy$ = new Subject<void>();\n\n  constructor(private fb: FormBuilder, private iconPicker: IconPickerService) {}\n\n  ngOnInit(): void {\n    this.isV2 = true; // Always V2 in unified architecture\n    this.initializeForm();\n    this.setupFormListeners();\n    this.loadActionsFromConfig();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['config'] && this.toolbarForm) {\n      const toolbar = (this.config as any).toolbar || {};\n      this.toolbarForm.patchValue(\n        {\n          toolbarVisible: toolbar.visible || false,\n          toolbarTitle: toolbar.title || '',\n          toolbarSubtitle: toolbar.subtitle || '',\n          toolbarPosition: toolbar.position || 'top',\n          toolbarHeight: toolbar.height || 64,\n        },\n        { emitEvent: false },\n      );\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  private initializeForm(): void {\n    // Use type guards to safely access properties\n    const v1Config = this.isV2 ? null : (this.config as any);\n    const toolbar = v1Config?.toolbar || {};\n\n    this.toolbarForm = this.fb.group({\n      // Toolbar settings\n      toolbarVisible: [toolbar.visible || false],\n      toolbarTitle: [toolbar.title || ''],\n      toolbarSubtitle: [toolbar.subtitle || ''],\n      toolbarPosition: [toolbar.position || 'top'],\n      toolbarHeight: [toolbar.height || 64],\n\n      // Quick Add button controls\n      addButtonEnabled: [false],\n      addButtonLabel: ['Adicionar'],\n      addButtonIcon: ['add'],\n      addButtonColor: ['primary'],\n      addButtonPosition: ['end'],\n      addButtonAppearance: ['filled'],\n\n      // Row actions\n      rowActionsEnabled: [!!v1Config?.showActionsColumn],\n      rowActionsDisplay: ['menu'],\n      rowActionsTrigger: ['always'],\n      maxVisibleRowActions: [3],\n      // Row actions: column & header customization\n      rowActionsWidth: ['120px'],\n      rowActionsSticky: [null],\n      rowActionsMenuIcon: ['more_vert'],\n      rowActionsMenuButtonColor: ['basic'],\n      rowActionsHeaderLabel: [''],\n      rowActionsHeaderIcon: [''],\n      rowActionsHeaderTooltip: [''],\n      rowActionsHeaderAlign: ['end'],\n\n      // Bulk actions (V2 only)\n      bulkActionsEnabled: [false],\n      bulkActionsPosition: ['toolbar'],\n\n      // Export (V2 only)\n      exportEnabled: [false],\n      exportFormats: [['excel', 'csv']],\n      exportFileName: ['dados-export'],\n      exportIncludeHeaders: [true],\n      exportRespectFilters: [true],\n      exportSelectedOnly: [false],\n      exportMaxRows: [10000],\n    });\n\n    // If V2, load advanced settings\n    if (this.isV2) {\n      const v2Config = this.config as TableConfig;\n\n      if (v2Config.toolbar) {\n        this.toolbarForm.patchValue({\n          toolbarVisible: v2Config.toolbar.visible !== false,\n          toolbarTitle: v2Config.toolbar.title || '',\n          toolbarSubtitle: v2Config.toolbar.subtitle || '',\n          toolbarPosition: v2Config.toolbar.position || 'top',\n          toolbarHeight: v2Config.toolbar.layout?.height || 64,\n        });\n      }\n\n      if (v2Config.actions) {\n        const rowCfg = v2Config.actions.row;\n        const beh = rowCfg?.behavior;\n        const displayRaw = rowCfg?.display || 'menu';\n        const displayUI =\n          displayRaw === 'icons' && beh && beh.enabled !== false && beh.maxInline\n            ? 'hybrid'\n            : displayRaw;\n        this.toolbarForm.patchValue({\n          rowActionsEnabled: rowCfg?.enabled || false,\n          rowActionsDisplay: displayUI,\n          rowActionsTrigger: rowCfg?.trigger || 'always',\n          maxVisibleRowActions: rowCfg?.maxVisibleActions || 3,\n          rowActionsWidth: rowCfg?.width || '120px',\n          rowActionsSticky: (rowCfg as any)?.sticky ?? null,\n          rowActionsMenuIcon: rowCfg?.menuIcon || 'more_vert',\n          rowActionsMenuButtonColor: (rowCfg as any)?.menuButtonColor || 'basic',\n          rowActionsHeaderLabel: rowCfg?.header?.label || '',\n          rowActionsHeaderIcon: rowCfg?.header?.icon || '',\n          rowActionsHeaderTooltip: rowCfg?.header?.tooltip || '',\n          rowActionsHeaderAlign: rowCfg?.header?.align || 'end',\n          bulkActionsEnabled: v2Config.actions.bulk?.enabled || false,\n          bulkActionsPosition: v2Config.actions.bulk?.position || 'toolbar',\n        });\n      }\n\n      if (v2Config.export) {\n        this.toolbarForm.patchValue({\n          exportEnabled: v2Config.export.enabled || false,\n          exportFormats: v2Config.export.formats || ['excel', 'csv'],\n          exportFileName:\n            v2Config.export.general?.defaultFileName || 'dados-export',\n          exportIncludeHeaders:\n            v2Config.export.general?.includeHeaders !== false,\n          exportRespectFilters:\n            v2Config.export.general?.respectFilters !== false,\n          exportSelectedOnly:\n            v2Config.export.general?.selectedRowsOnly || false,\n          exportMaxRows: v2Config.export.general?.maxRows || 10000,\n        });\n      }\n\n      // Initialize Quick Add controls from existing actions\n      this.syncAddFormFromActions();\n    }\n  }\n\n  private setupFormListeners(): void {\n    this.toolbarForm.valueChanges\n      .pipe(debounceTime(300), distinctUntilChanged(), takeUntil(this.destroy$))\n      .subscribe((values) => {\n        this.updateConfig(values);\n      });\n\n    // Individual listeners to mutate toolbarActions from quick add controls\n    this.toolbarForm\n      .get('addButtonEnabled')!\n      .valueChanges.pipe(takeUntil(this.destroy$))\n      .subscribe((enabled) => {\n        if (enabled) {\n          this.ensureAddToolbarAction();\n        } else {\n          this.removeAddToolbarAction();\n        }\n        this.updateToolbarActions();\n      });\n    const addFields = ['addButtonLabel', 'addButtonIcon', 'addButtonColor', 'addButtonPosition', 'addButtonAppearance'];\n    addFields.forEach((f) => {\n      this.toolbarForm\n        .get(f)!\n        .valueChanges.pipe(takeUntil(this.destroy$))\n        .subscribe(() => {\n          if (this.toolbarForm.get('addButtonEnabled')?.value) {\n            this.ensureAddToolbarAction();\n            this.updateToolbarActions();\n          }\n        });\n    });\n  }\n\n  private loadActionsFromConfig(): void {\n    if (this.isV2) {\n      const v2Config = this.config as TableConfig;\n\n      // Load toolbar actions\n      if (v2Config.toolbar?.actions) {\n        this.toolbarActions = [...v2Config.toolbar.actions] as ToolbarAction[];\n      }\n\n      // Load row actions\n      if (v2Config.actions?.row?.actions) {\n        this.rowActions = [...v2Config.actions.row.actions] as RowAction[];\n      }\n\n      // Load bulk actions\n      if (v2Config.actions?.bulk?.actions) {\n        this.bulkActions = [...v2Config.actions.bulk.actions] as BulkAction[];\n      }\n    } else {\n      // Load V1 config\n      const v1Config = this.config as any;\n      if (v1Config.toolbar?.actions) {\n        this.toolbarActions = [...v1Config.toolbar.actions] as ToolbarAction[];\n      }\n      if (v1Config.rowActions) {\n        this.rowActions = [...v1Config.rowActions] as RowAction[];\n      }\n    }\n  }\n\n  private isAddLike(a: ToolbarAction | undefined): boolean {\n    if (!a) return false;\n    const n = (s?: string) => String(s || '').trim().toLowerCase();\n    const id = n((a as any).action || a.id);\n    const label = n(a.label);\n    const icon = n(a.icon);\n    return (\n      id === 'create' ||\n      id === 'add' ||\n      ['adicionar', 'novo', 'criar', 'incluir'].includes(label) ||\n      icon === 'add' ||\n      icon === 'add_circle' ||\n      icon === 'add_box'\n    );\n  }\n\n  private findAddToolbarIndex(): number {\n    return this.toolbarActions.findIndex((a) => this.isAddLike(a));\n  }\n\n  private ensureAddToolbarAction(): void {\n    const idx = this.findAddToolbarIndex();\n    const label = this.toolbarForm.get('addButtonLabel')?.value || 'Adicionar';\n    const icon = this.toolbarForm.get('addButtonIcon')?.value || 'add';\n    const color = this.toolbarForm.get('addButtonColor')?.value || 'primary';\n    const position = this.toolbarForm.get('addButtonPosition')?.value || 'end';\n    const appearance = (this.toolbarForm.get('addButtonAppearance')?.value as ToolbarAction['appearance']) || 'filled';\n    const action: ToolbarAction = {\n      id: 'add',\n      label,\n      icon,\n      type: 'button',\n      color,\n      appearance,\n      action: 'create',\n      position,\n    };\n    if (idx >= 0) {\n      this.toolbarActions[idx] = { ...this.toolbarActions[idx], ...action };\n    } else {\n      this.toolbarActions.push(action);\n    }\n  }\n\n  private removeAddToolbarAction(): void {\n    const idx = this.findAddToolbarIndex();\n    if (idx >= 0) {\n      this.toolbarActions.splice(idx, 1);\n    }\n  }\n\n  private syncAddFormFromActions(): void {\n    const idx = this.findAddToolbarIndex();\n    const enabled = idx >= 0;\n    this.toolbarForm.patchValue(\n      {\n        addButtonEnabled: enabled,\n        addButtonLabel: enabled ? this.toolbarActions[idx].label || 'Adicionar' : this.toolbarForm.get('addButtonLabel')?.value,\n        addButtonIcon: enabled ? this.toolbarActions[idx].icon || 'add' : this.toolbarForm.get('addButtonIcon')?.value,\n        addButtonColor: enabled ? (this.toolbarActions[idx] as any).color || 'primary' : this.toolbarForm.get('addButtonColor')?.value,\n        addButtonPosition: enabled ? this.toolbarActions[idx].position || 'end' : this.toolbarForm.get('addButtonPosition')?.value,\n        addButtonAppearance: enabled ? (this.toolbarActions[idx] as any).appearance || 'filled' : this.toolbarForm.get('addButtonAppearance')?.value,\n      },\n      { emitEvent: false },\n    );\n  }\n\n  private updateConfig(values: any): void {\n    const updatedConfig = { ...this.config };\n\n    if (this.isV2) {\n      // Update V2 config structure\n      const v2Config = updatedConfig as TableConfig;\n\n      // Toolbar\n      if (!v2Config.toolbar) {\n        v2Config.toolbar = {\n          visible: false,\n          position: 'top',\n        };\n      }\n      v2Config.toolbar.visible = values.toolbarVisible;\n      v2Config.toolbar.title = values.toolbarTitle;\n      v2Config.toolbar.subtitle = values.toolbarSubtitle;\n      v2Config.toolbar.position = values.toolbarPosition;\n\n      if (!v2Config.toolbar.layout) {\n        v2Config.toolbar.layout = {\n          alignment: 'space-between',\n          showSeparator: false,\n        };\n      }\n      v2Config.toolbar.layout.height = values.toolbarHeight;\n\n      v2Config.toolbar.actions = this.toolbarActions;\n\n      // Actions\n      v2Config.actions = v2Config.actions || {};\n      const mappedDisplay = values.rowActionsDisplay === 'hybrid' ? 'icons' : values.rowActionsDisplay;\n      v2Config.actions.row = {\n        enabled: values.rowActionsEnabled,\n        position: 'end',\n        width: values.rowActionsWidth || '120px',\n        sticky: values.rowActionsSticky ?? undefined,\n        actions: this.rowActions,\n        display: mappedDisplay,\n        trigger: values.rowActionsTrigger,\n        maxVisibleActions: values.maxVisibleRowActions,\n        menuIcon: values.rowActionsMenuIcon || 'more_vert',\n        menuButtonColor: values.rowActionsMenuButtonColor !== 'basic' ? values.rowActionsMenuButtonColor : undefined,\n        header: {\n          label: values.rowActionsHeaderLabel || undefined,\n          icon: values.rowActionsHeaderIcon || undefined,\n          tooltip: values.rowActionsHeaderTooltip || undefined,\n          align: values.rowActionsHeaderAlign || 'end',\n        },\n        behavior: {\n          enabled: true,\n          ...(values.rowActionsDisplay === 'hybrid'\n            ? { maxInline: 'auto' as const, autoStrategy: 'measure' as const }\n            : (v2Config.actions?.row?.behavior || {})),\n        },\n      } as any;\n\n      v2Config.actions.bulk = {\n        enabled: values.bulkActionsEnabled,\n        position: values.bulkActionsPosition,\n        actions: this.bulkActions,\n      };\n\n      // Export\n      v2Config.export = {\n        enabled: values.exportEnabled,\n        formats: values.exportFormats,\n        general: {\n          includeHeaders: values.exportIncludeHeaders,\n          respectFilters: values.exportRespectFilters,\n          selectedRowsOnly: values.exportSelectedOnly,\n          maxRows: values.exportMaxRows,\n          defaultFileName: values.exportFileName,\n          includeColumns: 'visible',\n          applyFormatting: true,\n        },\n      };\n    } else {\n      // Update V1 config structure\n      const v1UpdatedConfig = updatedConfig as any;\n\n      if (values.toolbarVisible) {\n        v1UpdatedConfig.toolbar = {\n          visible: true,\n          title: values.toolbarTitle,\n          actions: this.toolbarActions,\n        };\n      } else {\n        delete v1UpdatedConfig.toolbar;\n      }\n\n      v1UpdatedConfig.showActionsColumn = values.rowActionsEnabled;\n      v1UpdatedConfig.rowActions = this.rowActions;\n    }\n\n    this.configChange.emit(updatedConfig);\n  }\n\n  // Toolbar Actions Management\n  addToolbarAction(): void {\n    const newAction: ToolbarAction = {\n      id: `action-${Date.now()}`,\n      label: 'Nova Ação',\n      icon: 'add',\n      type: 'button',\n      action: 'newAction',\n      position: 'end',\n      order: this.toolbarActions.length,\n    };\n\n    this.toolbarActions.push(newAction);\n    this.editingToolbarActionIndex = this.toolbarActions.length - 1;\n    this.updateToolbarActions();\n  }\n\n  editToolbarAction(index: number): void {\n    this.editingToolbarActionIndex =\n      this.editingToolbarActionIndex === index ? null : index;\n  }\n\n  removeToolbarAction(index: number): void {\n    this.toolbarActions.splice(index, 1);\n    this.editingToolbarActionIndex = null;\n    this.updateToolbarActions();\n  }\n\n  dropToolbarAction(event: CdkDragDrop<ToolbarAction[]>): void {\n    moveItemInArray(\n      this.toolbarActions,\n      event.previousIndex,\n      event.currentIndex,\n    );\n    this.updateToolbarActions();\n  }\n\n  updateToolbarActions(): void {\n    // Update order based on array position\n    this.toolbarActions.forEach((action, index) => {\n      action.order = index;\n    });\n\n    const values = this.toolbarForm.value;\n    this.updateConfig(values);\n  }\n\n  // Row Actions Management\n  addRowAction(): void {\n    const newAction: RowAction = {\n      id: `row-action-${Date.now()}`,\n      label: 'Nova Ação',\n      icon: 'edit',\n      action: 'editRow',\n      autoDelete: false,\n    };\n\n    this.rowActions.push(newAction);\n    this.editingRowActionIndex = this.rowActions.length - 1;\n    this.updateRowActions();\n  }\n\n  editRowAction(index: number): void {\n    this.editingRowActionIndex =\n      this.editingRowActionIndex === index ? null : index;\n  }\n\n  removeRowAction(index: number): void {\n    this.rowActions.splice(index, 1);\n    this.editingRowActionIndex = null;\n    this.updateRowActions();\n  }\n\n  dropRowAction(event: CdkDragDrop<RowAction[]>): void {\n    moveItemInArray(this.rowActions, event.previousIndex, event.currentIndex);\n    this.updateRowActions();\n  }\n\n  updateRowActions(): void {\n    this.rowActions.forEach((a) => {\n      if (a.action !== 'delete') {\n        a.autoDelete = false;\n      }\n    });\n    const values = this.toolbarForm.value;\n    this.updateConfig(values);\n  }\n\n  // Bulk Actions Management\n  addBulkAction(): void {\n    const newAction: BulkAction = {\n      id: `bulk-action-${Date.now()}`,\n      label: 'Nova Ação em Lote',\n      icon: 'delete',\n      action: 'delete',\n      autoDelete: false,\n      minSelections: 1,\n    };\n\n    this.bulkActions.push(newAction);\n    this.editingBulkActionIndex = this.bulkActions.length - 1;\n    this.updateBulkActions();\n  }\n\n  editBulkAction(index: number): void {\n    this.editingBulkActionIndex =\n      this.editingBulkActionIndex === index ? null : index;\n  }\n\n  removeBulkAction(index: number): void {\n    this.bulkActions.splice(index, 1);\n    this.editingBulkActionIndex = null;\n    this.updateBulkActions();\n  }\n\n  dropBulkAction(event: CdkDragDrop<BulkAction[]>): void {\n    moveItemInArray(this.bulkActions, event.previousIndex, event.currentIndex);\n    this.updateBulkActions();\n  }\n\n  updateBulkActions(): void {\n    this.bulkActions.forEach((a) => {\n      if (a.action !== 'delete') {\n        a.autoDelete = false;\n      }\n    });\n    const values = this.toolbarForm.value;\n    this.updateConfig(values);\n  }\n\n  // =============================================================\n  // Templates (Presets) — Toolbar & Row Actions\n  // =============================================================\n\n  applyToolbarTemplate(tpl: 'crudAdd', mode: 'replace' | 'merge'): void {\n    const preset: ToolbarAction[] = [\n      {\n        id: 'add',\n        label: 'Adicionar',\n        icon: 'add',\n        type: 'button',\n        color: 'primary',\n        appearance: 'filled',\n        action: 'create',\n        position: 'end',\n      },\n    ];\n    if (mode === 'replace') {\n      this.toolbarActions = [...preset];\n    } else {\n      this.toolbarActions = this.mergeToolbarActions(this.toolbarActions, preset);\n    }\n    // Ensure toolbar visible\n    this.toolbarForm.patchValue({ toolbarVisible: true }, { emitEvent: false });\n    this.updateToolbarActions();\n  }\n\n  applyRowActionsTemplate(\n    tpl: 'crud' | 'editDelete' | 'viewOnly' | 'crudWithBulk',\n    mode: 'replace' | 'merge',\n  ): void {\n    const view: RowAction = {\n      id: 'view',\n      label: 'Visualizar',\n      icon: 'visibility',\n      action: 'view',\n    };\n    const edit: RowAction = {\n      id: 'edit',\n      label: 'Editar',\n      icon: 'edit',\n      action: 'edit',\n      color: 'primary',\n    };\n    const del: RowAction = {\n      id: 'delete',\n      label: 'Excluir',\n      icon: 'delete',\n      action: 'delete',\n      color: 'warn',\n      requiresConfirmation: true,\n      autoDelete: true,\n    };\n    const presets: Record<string, RowAction[]> = {\n      crud: [view, edit, del],\n      editDelete: [edit, del],\n      viewOnly: [view],\n      crudWithBulk: [view, edit, del],\n    } as const;\n    const incoming = presets[tpl];\n    if (mode === 'replace') {\n      this.rowActions = [...incoming];\n    } else {\n      this.rowActions = this.mergeRowActions(this.rowActions, incoming);\n    }\n    // Bulk delete when requested\n    if (tpl === 'crudWithBulk' && this.isV2) {\n      const bulkDel: BulkAction = {\n        id: 'bulkDelete',\n        label: 'Excluir Selecionados',\n        icon: 'delete',\n        action: 'delete',\n        color: 'warn',\n        requiresConfirmation: true,\n        autoDelete: true,\n        minSelections: 1,\n      };\n      this.toolbarForm.patchValue({ bulkActionsEnabled: true }, { emitEvent: false });\n      this.bulkActions = this.mergeBulkActions(this.bulkActions, [bulkDel]);\n      this.updateBulkActions();\n    }\n    // Encourage visible buttons, always on\n    this.toolbarForm.patchValue(\n      {\n        rowActionsEnabled: true,\n        rowActionsDisplay: 'buttons',\n        rowActionsTrigger: 'always',\n        maxVisibleRowActions: 3,\n      },\n      { emitEvent: false },\n    );\n    this.updateRowActions();\n  }\n\n  private mergeRowActions(base: RowAction[], add: RowAction[]): RowAction[] {\n    const byKey = (a: RowAction) => (a.action || a.id || '').toLowerCase();\n    const existing = new Map(base.map((a) => [byKey(a), a]));\n    for (const a of add) {\n      const key = byKey(a);\n      if (!existing.has(key)) existing.set(key, a);\n    }\n    return Array.from(existing.values());\n  }\n\n  private mergeToolbarActions(\n    base: ToolbarAction[],\n    add: ToolbarAction[],\n  ): ToolbarAction[] {\n    const byKey = (a: ToolbarAction) => (a.action || a.id || '').toLowerCase();\n    const existing = new Map(base.map((a) => [byKey(a), a]));\n    for (const a of add) {\n      const key = byKey(a);\n      if (!existing.has(key)) existing.set(key, a);\n    }\n    return Array.from(existing.values());\n  }\n\n  private mergeBulkActions(base: BulkAction[], add: BulkAction[]): BulkAction[] {\n    const byKey = (a: BulkAction) => (a.action || a.id || '').toLowerCase();\n    const existing = new Map(base.map((a) => [byKey(a), a]));\n    for (const a of add) {\n      const key = byKey(a);\n      if (!existing.has(key)) existing.set(key, a);\n    }\n    return Array.from(existing.values());\n  }\n\n  // Icon Picker integrations\n  async pickAddButtonIcon(): Promise<void> {\n    const current = this.toolbarForm.get('addButtonIcon')?.value;\n    const res = await this.iconPicker.openDialog({ value: current });\n    if (res !== undefined) {\n      this.toolbarForm.get('addButtonIcon')?.setValue(res);\n    }\n  }\n\n  async pickActionIcon(index: number): Promise<void> {\n    const a = this.toolbarActions[index];\n    const res = await this.iconPicker.openDialog({ value: a?.icon });\n    if (res !== undefined) {\n      this.toolbarActions[index] = { ...a, icon: res } as any;\n      this.updateToolbarActions();\n    }\n  }\n\n  async pickRowActionIcon(index: number): Promise<void> {\n    const a = this.rowActions[index];\n    const res = await this.iconPicker.openDialog({ value: a?.icon });\n    if (res !== undefined) {\n      this.rowActions[index] = { ...a, icon: res } as any;\n      this.updateRowActions();\n    }\n  }\n\n  async pickBulkActionIcon(index: number): Promise<void> {\n    const a = this.bulkActions[index];\n    const res = await this.iconPicker.openDialog({ value: a?.icon });\n    if (res !== undefined) {\n      this.bulkActions[index] = { ...a, icon: res } as any;\n      this.updateBulkActions();\n    }\n  }\n\n  async pickRowMenuIcon(): Promise<void> {\n    const current = this.toolbarForm.get('rowActionsMenuIcon')?.value;\n    const res = await this.iconPicker.openDialog({ value: current });\n    if (res !== undefined) {\n      this.toolbarForm.get('rowActionsMenuIcon')?.setValue(res);\n    }\n  }\n\n  async pickRowHeaderIcon(): Promise<void> {\n    const current = this.toolbarForm.get('rowActionsHeaderIcon')?.value;\n    const res = await this.iconPicker.openDialog({ value: current });\n    if (res !== undefined) {\n      this.toolbarForm.get('rowActionsHeaderIcon')?.setValue(res);\n    }\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatCardModule } from '@angular/material/card';\nimport { \n  TableConfig, \n  isTableConfigV2\n} from '@praxisui/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\nexport interface MessagesLocalizationChange {\n  type: 'messages' | 'localization' | 'formatting';\n  property: string;\n  value: any;\n  fullConfig: TableConfig;\n}\n\n@Component({\n  selector: 'messages-localization-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatExpansionModule,\n    MatIconModule,\n    MatTooltipModule,\n    MatDividerModule,\n    MatButtonModule,\n    MatTabsModule,\n    MatCardModule\n  ],\n  template: `\n    <div class=\"messages-localization-container\">\n      <form [formGroup]=\"messagesForm\">\n        \n        <!-- Mensagens de Estado -->\n        <mat-expansion-panel expanded>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">message</mat-icon>\n              Mensagens de Estado\n            </mat-panel-title>\n            <mat-panel-description>\n              Textos exibidos em diferentes estados da tabela\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Carregando dados</mat-label>\n                <input matInput formControlName=\"loadingMessage\" \n                       placeholder=\"Carregando...\">\n                <mat-hint>Mensagem exibida durante o carregamento</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Nenhum dado encontrado</mat-label>\n                <input matInput formControlName=\"emptyMessage\" \n                       placeholder=\"Nenhum dado disponível\">\n                <mat-hint>Mensagem quando não há registros</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Erro ao carregar</mat-label>\n                <input matInput formControlName=\"errorMessage\" \n                       placeholder=\"Erro ao carregar dados\">\n                <mat-hint>Mensagem de erro genérica</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Nenhum resultado</mat-label>\n                <input matInput formControlName=\"noResultsMessage\" \n                       placeholder=\"Nenhum resultado encontrado\">\n                <mat-hint>Mensagem quando filtros não retornam resultados</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\" *ngIf=\"isV2\">\n                <mat-label>Carregando mais</mat-label>\n                <input matInput formControlName=\"loadingMoreMessage\" \n                       placeholder=\"Carregando mais dados...\">\n                <mat-hint>Mensagem para carregamento incremental</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Mensagens de Ação -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">help</mat-icon>\n              Mensagens de Ação\n            </mat-panel-title>\n            <mat-panel-description>\n              Confirmações, sucessos e mensagens de erro\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <mat-tab-group>\n              <!-- Confirmações -->\n              <mat-tab label=\"Confirmações\">\n                <div class=\"tab-content\">\n                  <div class=\"config-fields\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Confirmação de exclusão</mat-label>\n                      <input matInput formControlName=\"deleteConfirmation\" \n                             placeholder=\"Tem certeza que deseja excluir este item?\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Confirmação de exclusão múltipla</mat-label>\n                      <input matInput formControlName=\"deleteMultipleConfirmation\" \n                             placeholder=\"Tem certeza que deseja excluir os itens selecionados?\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Confirmação de salvar</mat-label>\n                      <input matInput formControlName=\"saveConfirmation\" \n                             placeholder=\"Deseja salvar as alterações?\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Confirmação de cancelar</mat-label>\n                      <input matInput formControlName=\"cancelConfirmation\" \n                             placeholder=\"Deseja cancelar as alterações?\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Confirmação de exportação</mat-label>\n                      <input matInput formControlName=\"exportConfirmation\" \n                             placeholder=\"Deseja exportar os dados selecionados?\">\n                    </mat-form-field>\n                  </div>\n                </div>\n              </mat-tab>\n              \n              <!-- Sucessos -->\n              <mat-tab label=\"Sucessos\">\n                <div class=\"tab-content\">\n                  <div class=\"config-fields\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Salvo com sucesso</mat-label>\n                      <input matInput formControlName=\"saveSuccess\" \n                             placeholder=\"Item salvo com sucesso!\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Excluído com sucesso</mat-label>\n                      <input matInput formControlName=\"deleteSuccess\" \n                             placeholder=\"Item excluído com sucesso!\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Exportação concluída</mat-label>\n                      <input matInput formControlName=\"exportSuccess\" \n                             placeholder=\"Exportação concluída com sucesso!\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Importação concluída</mat-label>\n                      <input matInput formControlName=\"importSuccess\" \n                             placeholder=\"Importação concluída com sucesso!\">\n                    </mat-form-field>\n                  </div>\n                </div>\n              </mat-tab>\n              \n              <!-- Progresso -->\n              <mat-tab label=\"Progresso\">\n                <div class=\"tab-content\">\n                  <div class=\"config-fields\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Excluindo...</mat-label>\n                      <input matInput formControlName=\"deleteProgress\" \n                             placeholder=\"Removendo...\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Excluindo (múltiplos)...</mat-label>\n                      <input matInput formControlName=\"deleteMultipleProgress\" \n                             placeholder=\"Removendo...\">\n                    </mat-form-field>\n                  </div>\n                </div>\n              </mat-tab>\n\n              <!-- Erros -->\n              <mat-tab label=\"Erros\">\n                <div class=\"tab-content\">\n                  <div class=\"config-fields\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Erro ao salvar</mat-label>\n                      <input matInput formControlName=\"saveError\" \n                             placeholder=\"Erro ao salvar item\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Erro ao excluir</mat-label>\n                      <input matInput formControlName=\"deleteError\" \n                             placeholder=\"Erro ao excluir item\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Erro na exportação</mat-label>\n                      <input matInput formControlName=\"exportError\" \n                             placeholder=\"Erro na exportação\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Erro de rede</mat-label>\n                      <input matInput formControlName=\"networkError\" \n                             placeholder=\"Erro de conexão\">\n                    </mat-form-field>\n                    \n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>Erro de permissão</mat-label>\n                      <input matInput formControlName=\"permissionError\" \n                             placeholder=\"Sem permissão para esta ação\">\n                    </mat-form-field>\n                  </div>\n                </div>\n              </mat-tab>\n            </mat-tab-group>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Localização -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">language</mat-icon>\n              Configurações de Localização\n            </mat-panel-title>\n            <mat-panel-description>\n              Idioma, região e formatação\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Idioma/Região</mat-label>\n                <mat-select formControlName=\"locale\">\n                  <mat-option value=\"pt-BR\">Português (Brasil)</mat-option>\n                  <mat-option value=\"en-US\">English (US)</mat-option>\n                  <mat-option value=\"en-GB\">English (UK)</mat-option>\n                  <mat-option value=\"es-ES\">Español</mat-option>\n                  <mat-option value=\"fr-FR\">Français</mat-option>\n                  <mat-option value=\"de-DE\">Deutsch</mat-option>\n                  <mat-option value=\"it-IT\">Italiano</mat-option>\n                  <mat-option value=\"ja-JP\">日本語</mat-option>\n                  <mat-option value=\"zh-CN\">中文</mat-option>\n                </mat-select>\n                <mat-hint>Define o idioma e região para formatação</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Direção do texto</mat-label>\n                <mat-select formControlName=\"direction\">\n                  <mat-option value=\"ltr\">Esquerda para direita (LTR)</mat-option>\n                  <mat-option value=\"rtl\">Direita para esquerda (RTL)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Primeiro dia da semana</mat-label>\n                <mat-select formControlName=\"firstDayOfWeek\">\n                  <mat-option value=\"0\">Domingo</mat-option>\n                  <mat-option value=\"1\">Segunda-feira</mat-option>\n                  <mat-option value=\"6\">Sábado</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-slide-toggle formControlName=\"relativeTime\" class=\"toggle-field\">\n                Usar tempo relativo\n                <mat-icon class=\"info-icon\" matTooltip=\"Ex: 'há 2 horas' ao invés de horário específico\">\n                  info_outline\n                </mat-icon>\n              </mat-slide-toggle>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Formatação de Data e Hora -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">schedule</mat-icon>\n              Formatação de Data e Hora\n            </mat-panel-title>\n            <mat-panel-description>\n              Padrões de exibição de datas e horários\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Formato de data</mat-label>\n                <mat-select formControlName=\"dateFormat\">\n                  <mat-option value=\"dd/MM/yyyy\">dd/MM/yyyy (31/12/2023)</mat-option>\n                  <mat-option value=\"MM/dd/yyyy\">MM/dd/yyyy (12/31/2023)</mat-option>\n                  <mat-option value=\"yyyy-MM-dd\">yyyy-MM-dd (2023-12-31)</mat-option>\n                  <mat-option value=\"dd-MM-yyyy\">dd-MM-yyyy (31-12-2023)</mat-option>\n                  <mat-option value=\"dd.MM.yyyy\">dd.MM.yyyy (31.12.2023)</mat-option>\n                  <mat-option value=\"MMM dd, yyyy\">MMM dd, yyyy (Dec 31, 2023)</mat-option>\n                  <mat-option value=\"MMMM dd, yyyy\">MMMM dd, yyyy (December 31, 2023)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Formato de hora</mat-label>\n                <mat-select formControlName=\"timeFormat\">\n                  <mat-option value=\"HH:mm:ss\">HH:mm:ss (24h)</mat-option>\n                  <mat-option value=\"HH:mm\">HH:mm (24h)</mat-option>\n                  <mat-option value=\"hh:mm:ss a\">hh:mm:ss a (12h)</mat-option>\n                  <mat-option value=\"hh:mm a\">hh:mm a (12h)</mat-option>\n                  <mat-option value=\"h:mm a\">h:mm a (12h)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Formato de data e hora</mat-label>\n                <input matInput formControlName=\"dateTimeFormat\" \n                       placeholder=\"dd/MM/yyyy HH:mm:ss\">\n                <mat-hint>Combinação dos formatos de data e hora</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Formatação de Números -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">pin</mat-icon>\n              Formatação de Números\n            </mat-panel-title>\n            <mat-panel-description>\n              Separadores, moeda e precisão decimal\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Separador decimal</mat-label>\n                <mat-select formControlName=\"decimalSeparator\">\n                  <mat-option value=\",\">, (vírgula)</mat-option>\n                  <mat-option value=\".\">. (ponto)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Separador de milhares</mat-label>\n                <mat-select formControlName=\"thousandsSeparator\">\n                  <mat-option value=\".\">. (ponto)</mat-option>\n                  <mat-option value=\",\">, (vírgula)</mat-option>\n                  <mat-option value=\" \"> (espaço)</mat-option>\n                  <mat-option value=\"\">(nenhum)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Precisão decimal padrão</mat-label>\n                <input matInput type=\"number\" formControlName=\"defaultPrecision\" \n                       min=\"0\" max=\"10\">\n                <mat-hint>Número padrão de casas decimais</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Sinal negativo</mat-label>\n                <mat-select formControlName=\"negativeSign\">\n                  <mat-option value=\"-\">- (hífen)</mat-option>\n                  <mat-option value=\"−\">− (menos matemático)</mat-option>\n                  <mat-option value=\"()\">(parênteses)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Posição do sinal negativo</mat-label>\n                <mat-select formControlName=\"negativeSignPosition\">\n                  <mat-option value=\"before\">Antes do número</mat-option>\n                  <mat-option value=\"after\">Depois do número</mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Formatação de Moeda -->\n        <mat-expansion-panel>\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">attach_money</mat-icon>\n              Formatação de Moeda\n            </mat-panel-title>\n            <mat-panel-description>\n              Símbolo, posição e formato monetário\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Código da moeda</mat-label>\n                <mat-select formControlName=\"currencyCode\">\n                  <mat-option value=\"BRL\">BRL (Real Brasileiro)</mat-option>\n                  <mat-option value=\"USD\">USD (Dólar Americano)</mat-option>\n                  <mat-option value=\"EUR\">EUR (Euro)</mat-option>\n                  <mat-option value=\"GBP\">GBP (Libra Esterlina)</mat-option>\n                  <mat-option value=\"JPY\">JPY (Iene)</mat-option>\n                  <mat-option value=\"CAD\">CAD (Dólar Canadense)</mat-option>\n                  <mat-option value=\"AUD\">AUD (Dólar Australiano)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Símbolo da moeda</mat-label>\n                <input matInput formControlName=\"currencySymbol\" \n                       placeholder=\"R$\">\n                <mat-hint>Símbolo exibido junto aos valores</mat-hint>\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Posição do símbolo</mat-label>\n                <mat-select formControlName=\"currencyPosition\">\n                  <mat-option value=\"before\">Antes (R$ 100,00)</mat-option>\n                  <mat-option value=\"after\">Depois (100,00 R$)</mat-option>\n                </mat-select>\n              </mat-form-field>\n              \n              <mat-slide-toggle formControlName=\"currencySpacing\" class=\"toggle-field\">\n                Espaço entre símbolo e valor\n              </mat-slide-toggle>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Precisão decimal (moeda)</mat-label>\n                <input matInput type=\"number\" formControlName=\"currencyPrecision\" \n                       min=\"0\" max=\"4\">\n                <mat-hint>Casas decimais para valores monetários</mat-hint>\n              </mat-form-field>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n        <!-- Validação -->\n        <mat-expansion-panel *ngIf=\"isV2\">\n          <mat-expansion-panel-header>\n            <mat-panel-title>\n              <mat-icon class=\"section-icon\">rule</mat-icon>\n              Mensagens de Validação\n            </mat-panel-title>\n            <mat-panel-description>\n              Textos para validação de formulários (V2 only)\n            </mat-panel-description>\n          </mat-expansion-panel-header>\n          \n          <div class=\"config-section\">\n            <div class=\"config-fields\">\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Campo obrigatório</mat-label>\n                <input matInput formControlName=\"requiredField\" \n                       placeholder=\"Este campo é obrigatório\">\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Valor inválido</mat-label>\n                <input matInput formControlName=\"invalidValue\" \n                       placeholder=\"Valor inválido\">\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Muito longo</mat-label>\n                <input matInput formControlName=\"tooLong\" \n                       placeholder=\"Valor muito longo\">\n              </mat-form-field>\n              \n              <mat-form-field appearance=\"outline\">\n                <mat-label>Muito curto</mat-label>\n                <input matInput formControlName=\"tooShort\" \n                       placeholder=\"Valor muito curto\">\n              </mat-form-field>\n              \n              <div class=\"subsection\">\n                <h4>Validações por Tipo</h4>\n                <div class=\"config-fields\">\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>E-mail inválido</mat-label>\n                    <input matInput formControlName=\"invalidEmail\" \n                           placeholder=\"E-mail inválido\">\n                  </mat-form-field>\n                  \n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>URL inválida</mat-label>\n                    <input matInput formControlName=\"invalidUrl\" \n                           placeholder=\"URL inválida\">\n                  </mat-form-field>\n                  \n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Deve ser um número</mat-label>\n                    <input matInput formControlName=\"mustBeNumber\" \n                           placeholder=\"Deve ser um número\">\n                  </mat-form-field>\n                  \n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>Data inválida</mat-label>\n                    <input matInput formControlName=\"invalidDate\" \n                           placeholder=\"Data inválida\">\n                  </mat-form-field>\n                </div>\n              </div>\n            </div>\n          </div>\n        </mat-expansion-panel>\n        \n      </form>\n    </div>\n  `,\n  styles: [`\n    .messages-localization-container {\n      width: 100%;\n      padding: 8px;\n    }\n    \n    .config-section {\n      padding: 16px;\n    }\n    \n    .config-fields {\n      display: flex;\n      flex-direction: column;\n      gap: 16px;\n      margin-top: 16px;\n    }\n    \n    .toggle-field {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    \n    .section-icon {\n      margin-right: 8px;\n      color: var(--mat-sys-primary);\n    }\n    \n    .info-icon {\n      font-size: 18px;\n      width: 18px;\n      height: 18px;\n      color: var(--mat-sys-on-surface-variant);\n      cursor: help;\n    }\n    \n    .subsection {\n      margin-top: 24px;\n      padding: 16px;\n      border: 1px solid var(--mat-sys-outline-variant);\n      border-radius: 8px;\n    }\n    \n    .subsection h4 {\n      margin: 0 0 16px 0;\n      color: var(--mat-sys-on-surface);\n      font-weight: 500;\n    }\n    \n    .tab-content {\n      padding: 16px 0;\n    }\n    \n    mat-form-field {\n      width: 100%;\n    }\n    \n    mat-expansion-panel {\n      margin-bottom: 8px;\n      border-radius: 8px;\n      overflow: hidden;\n    }\n    \n    mat-expansion-panel-header {\n      min-height: 56px;\n    }\n    \n    mat-panel-description {\n      color: var(--mat-sys-on-surface-variant);\n    }\n    \n    mat-tab-group {\n      margin-top: 16px;\n    }\n  `]\n})\nexport class MessagesLocalizationEditorComponent implements OnInit, OnDestroy {\n  @Input() config: TableConfig = { columns: [] };\n  @Output() configChange = new EventEmitter<TableConfig>();\n  @Output() messagesLocalizationChange = new EventEmitter<MessagesLocalizationChange>();\n  \n  messagesForm!: FormGroup;\n  isV2 = false;\n  \n  private destroy$ = new Subject<void>();\n  \n  constructor(private fb: FormBuilder) {}\n  \n  ngOnInit(): void {\n    this.isV2 = isTableConfigV2(this.config);\n    this.initializeForm();\n    this.setupFormListeners();\n  }\n  \n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n  \n  private initializeForm(): void {\n    // Use type guards to safely access properties\n    const v1Config = this.isV2 ? null : this.config as any;\n    const messages = v1Config?.messages || {};\n    \n    this.messagesForm = this.fb.group({\n      // State messages\n      loadingMessage: [messages.loading || 'Carregando...'],\n      emptyMessage: [messages.empty || 'Nenhum dado disponível'],\n      errorMessage: [messages.error || 'Erro ao carregar dados'],\n      noResultsMessage: [messages.noResults || 'Nenhum resultado encontrado'],\n      loadingMoreMessage: ['Carregando mais dados...'],\n      \n      // Action messages - Confirmations\n      deleteConfirmation: ['Tem certeza que deseja excluir este item?'],\n      deleteMultipleConfirmation: ['Tem certeza que deseja excluir os itens selecionados?'],\n      saveConfirmation: ['Deseja salvar as alterações?'],\n      cancelConfirmation: ['Deseja cancelar as alterações?'],\n      exportConfirmation: ['Deseja exportar os dados selecionados?'],\n      \n      // Action messages - Success\n      saveSuccess: ['Item salvo com sucesso!'],\n      deleteSuccess: ['Item excluído com sucesso!'],\n      exportSuccess: ['Exportação concluída com sucesso!'],\n      importSuccess: ['Importação concluída com sucesso!'],\n      \n      // Action messages - Progress\n      deleteProgress: ['Removendo...'],\n      deleteMultipleProgress: ['Removendo...'],\n      \n      // Action messages - Errors\n      saveError: ['Erro ao salvar item'],\n      deleteError: ['Erro ao excluir item'],\n      exportError: ['Erro na exportação'],\n      networkError: ['Erro de conexão'],\n      permissionError: ['Sem permissão para esta ação'],\n      \n      // Localization\n      locale: ['pt-BR'],\n      direction: ['ltr'],\n      firstDayOfWeek: [0],\n      relativeTime: [true],\n      \n      // Date/Time formatting\n      dateFormat: ['dd/MM/yyyy'],\n      timeFormat: ['HH:mm:ss'],\n      dateTimeFormat: ['dd/MM/yyyy HH:mm:ss'],\n      \n      // Number formatting\n      decimalSeparator: [','],\n      thousandsSeparator: ['.'],\n      defaultPrecision: [2],\n      negativeSign: ['-'],\n      negativeSignPosition: ['before'],\n      \n      // Currency formatting\n      currencyCode: ['BRL'],\n      currencySymbol: ['R$'],\n      currencyPosition: ['before'],\n      currencySpacing: [true],\n      currencyPrecision: [2],\n      \n      // Validation messages (V2 only)\n      requiredField: ['Este campo é obrigatório'],\n      invalidValue: ['Valor inválido'],\n      tooLong: ['Valor muito longo'],\n      tooShort: ['Valor muito curto'],\n      invalidEmail: ['E-mail inválido'],\n      invalidUrl: ['URL inválida'],\n      mustBeNumber: ['Deve ser um número'],\n      invalidDate: ['Data inválida']\n    });\n    \n    // If V2, load advanced settings\n    if (this.isV2) {\n      const v2Config = this.config as TableConfig;\n      \n      if (v2Config.messages) {\n        this.messagesForm.patchValue({\n          loadingMessage: v2Config.messages.states?.loading || 'Carregando...',\n          emptyMessage: v2Config.messages.states?.empty || 'Nenhum dado disponível',\n          errorMessage: v2Config.messages.states?.error || 'Erro ao carregar dados',\n          noResultsMessage: v2Config.messages.states?.noResults || 'Nenhum resultado encontrado',\n          loadingMoreMessage: v2Config.messages.states?.loadingMore || 'Carregando mais dados...',\n          \n          // Action messages\n          deleteConfirmation: v2Config.messages.actions?.confirmations?.delete || 'Tem certeza que deseja excluir este item?',\n          deleteMultipleConfirmation: v2Config.messages.actions?.confirmations?.deleteMultiple || 'Tem certeza que deseja excluir os itens selecionados?',\n          saveConfirmation: v2Config.messages.actions?.confirmations?.save || 'Deseja salvar as alterações?',\n          cancelConfirmation: v2Config.messages.actions?.confirmations?.cancel || 'Deseja cancelar as alterações?',\n          exportConfirmation: v2Config.messages.actions?.confirmations?.export || 'Deseja exportar os dados selecionados?',\n          \n          saveSuccess: v2Config.messages.actions?.success?.save || 'Item salvo com sucesso!',\n          deleteSuccess: v2Config.messages.actions?.success?.delete || 'Item excluído com sucesso!',\n          exportSuccess: v2Config.messages.actions?.success?.export || 'Exportação concluída com sucesso!',\n          importSuccess: v2Config.messages.actions?.success?.import || 'Importação concluída com sucesso!',\n          \n          deleteProgress: v2Config.messages.actions?.progress?.delete || 'Removendo...',\n          deleteMultipleProgress: v2Config.messages.actions?.progress?.deleteMultiple || 'Removendo...',\n          \n          saveError: v2Config.messages.actions?.errors?.save || 'Erro ao salvar item',\n          deleteError: v2Config.messages.actions?.errors?.delete || 'Erro ao excluir item',\n          exportError: v2Config.messages.actions?.errors?.export || 'Erro na exportação',\n          networkError: v2Config.messages.actions?.errors?.network || 'Erro de conexão',\n          permissionError: v2Config.messages.actions?.errors?.permission || 'Sem permissão para esta ação',\n          \n          // Validation messages\n          requiredField: v2Config.messages.validation?.required || 'Este campo é obrigatório',\n          invalidValue: v2Config.messages.validation?.invalid || 'Valor inválido',\n          tooLong: v2Config.messages.validation?.tooLong || 'Valor muito longo',\n          tooShort: v2Config.messages.validation?.tooShort || 'Valor muito curto',\n          invalidEmail: v2Config.messages.validation?.types?.email || 'E-mail inválido',\n          invalidUrl: v2Config.messages.validation?.types?.url || 'URL inválida',\n          mustBeNumber: v2Config.messages.validation?.types?.number || 'Deve ser um número',\n          invalidDate: v2Config.messages.validation?.types?.date || 'Data inválida'\n        });\n      }\n      \n      if (v2Config.localization) {\n        this.messagesForm.patchValue({\n          locale: v2Config.localization.locale || 'pt-BR',\n          direction: v2Config.localization.direction || 'ltr',\n          firstDayOfWeek: v2Config.localization.dateTime?.firstDayOfWeek ?? 0,\n          relativeTime: v2Config.localization.dateTime?.relativeTime !== false,\n          \n          dateFormat: v2Config.localization.dateTime?.dateFormat || 'dd/MM/yyyy',\n          timeFormat: v2Config.localization.dateTime?.timeFormat || 'HH:mm:ss',\n          dateTimeFormat: v2Config.localization.dateTime?.dateTimeFormat || 'dd/MM/yyyy HH:mm:ss',\n          \n          decimalSeparator: v2Config.localization.number?.decimalSeparator || ',',\n          thousandsSeparator: v2Config.localization.number?.thousandsSeparator || '.',\n          defaultPrecision: v2Config.localization.number?.defaultPrecision ?? 2,\n          negativeSign: v2Config.localization.number?.negativeSign || '-',\n          negativeSignPosition: v2Config.localization.number?.negativeSignPosition || 'before',\n          \n          currencyCode: v2Config.localization.currency?.code || 'BRL',\n          currencySymbol: v2Config.localization.currency?.symbol || 'R$',\n          currencyPosition: v2Config.localization.currency?.position || 'before',\n          currencySpacing: v2Config.localization.currency?.spacing !== false,\n          currencyPrecision: v2Config.localization.currency?.precision ?? 2\n        });\n      }\n    }\n  }\n  \n  private setupFormListeners(): void {\n    this.messagesForm.valueChanges\n      .pipe(\n        debounceTime(300),\n        distinctUntilChanged(),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(values => {\n        this.updateConfig(values);\n      });\n  }\n  \n  private updateConfig(values: any): void {\n    const updatedConfig = { ...this.config };\n    \n    if (this.isV2) {\n      // Update V2 config structure\n      const v2Config = updatedConfig as TableConfig;\n      \n      // Messages\n      v2Config.messages = {\n        states: {\n          loading: values.loadingMessage,\n          empty: values.emptyMessage,\n          error: values.errorMessage,\n          noResults: values.noResultsMessage,\n          loadingMore: values.loadingMoreMessage\n        },\n        actions: {\n          confirmations: {\n            delete: values.deleteConfirmation,\n            deleteMultiple: values.deleteMultipleConfirmation,\n            save: values.saveConfirmation,\n            cancel: values.cancelConfirmation,\n            export: values.exportConfirmation\n          },\n          success: {\n            save: values.saveSuccess,\n            delete: values.deleteSuccess,\n            export: values.exportSuccess,\n            import: values.importSuccess\n          },\n          progress: {\n            delete: values.deleteProgress,\n            deleteMultiple: values.deleteMultipleProgress,\n          },\n          errors: {\n            save: values.saveError,\n            delete: values.deleteError,\n            export: values.exportError,\n            network: values.networkError,\n            permission: values.permissionError\n          }\n        },\n        validation: {\n          required: values.requiredField,\n          invalid: values.invalidValue,\n          tooLong: values.tooLong,\n          tooShort: values.tooShort,\n          types: {\n            email: values.invalidEmail,\n            url: values.invalidUrl,\n            number: values.mustBeNumber,\n            date: values.invalidDate\n          }\n        }\n      };\n      \n      // Localization\n      v2Config.localization = {\n        locale: values.locale,\n        direction: values.direction,\n        dateTime: {\n          dateFormat: values.dateFormat,\n          timeFormat: values.timeFormat,\n          dateTimeFormat: values.dateTimeFormat,\n          firstDayOfWeek: values.firstDayOfWeek,\n          relativeTime: values.relativeTime\n        },\n        number: {\n          decimalSeparator: values.decimalSeparator,\n          thousandsSeparator: values.thousandsSeparator,\n          defaultPrecision: values.defaultPrecision,\n          negativeSign: values.negativeSign,\n          negativeSignPosition: values.negativeSignPosition\n        },\n        currency: {\n          code: values.currencyCode,\n          symbol: values.currencySymbol,\n          position: values.currencyPosition,\n          spacing: values.currencySpacing,\n          precision: values.currencyPrecision\n        },\n        formatting: {\n          percentageFormat: '#0.00%',\n          fileSizeFormat: 'binary'\n        }\n      };\n      \n    } else {\n      // Update V1 config structure\n      const v1UpdatedConfig = updatedConfig as any;\n      v1UpdatedConfig.messages = {\n        loading: values.loadingMessage,\n        empty: values.emptyMessage,\n        error: values.errorMessage,\n        noResults: values.noResultsMessage\n      };\n    }\n    \n    this.configChange.emit(updatedConfig);\n  }\n}\n","import {\n  Component,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  Output,\n  EventEmitter,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  FormBuilder,\n  FormControl,\n  FormGroup,\n  ReactiveFormsModule,\n  Validators,\n  FormsModule,\n} from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { FieldMetadata, CONFIG_STORAGE, ConfigStorage } from '@praxisui/core';\nimport { SETTINGS_PANEL_DATA } from '@praxisui/settings-panel';\nimport { FilterConfig } from '../services/filter-config.service';\nimport { Observable, of } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatListModule } from '@angular/material/list';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { FilterTag } from '../components/praxis-filter/praxis-filter.component';\nimport { MatSnackBar } from '@angular/material/snack-bar';\n// (single import already declared above)\n\n@Component({\n  selector: 'filter-settings',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    FormsModule,\n    MatTabsModule,\n    MatFormFieldModule,\n    MatSelectModule,\n    MatInputModule,\n    MatCheckboxModule,\n    MatListModule,\n    MatButtonModule,\n    MatIconModule,\n    PraxisIconDirective,\n    DragDropModule,\n  ],\n  templateUrl: './filter-settings.component.html',\n  styleUrls: ['./filter-settings.component.scss'],\n})\nexport class FilterSettingsComponent implements OnChanges {\n  @Input() metadata: FieldMetadata[] = [];\n  @Input() settings: FilterConfig | undefined;\n  @Input() configKey?: string;\n  @Output() settingsChange = new EventEmitter<FilterConfig>();\n\n  form: FormGroup<{\n    quickField: FormControl<string | null>;\n    alwaysVisibleFields: FormControl<string[]>;\n    placeholder: FormControl<string>;\n    showAdvanced: FormControl<boolean>;\n    mode: FormControl<'auto' | 'filter' | 'card'>;\n    changeDebounceMs: FormControl<number>;\n    allowSaveTags: FormControl<boolean>;\n    // Tag theming (M3-style knobs)\n    tagColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n    tagVariant: FormControl<'filled' | 'outlined'>;\n    tagButtonColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n    // Action buttons theming\n    actionsButtonColor: FormControl<'primary' | 'accent' | 'warn' | 'basic'>;\n    actionsVariant: FormControl<'standard' | 'outlined'>;\n    // New layout/UX controls\n    placeBooleansInActions: FormControl<boolean>;\n    showToggleLabels: FormControl<boolean>;\n    alwaysMinWidth: FormControl<number>;\n    alwaysColsMd: FormControl<number>;\n    alwaysColsLg: FormControl<number>;\n    autoSummary: FormControl<boolean>;\n    confirmTagDelete: FormControl<boolean>;\n    debugLayout: FormControl<boolean>;\n    overlayVariant: FormControl<'card' | 'frosted'>;\n    overlayBackdrop: FormControl<boolean>;\n    advancedOpenMode: FormControl<'overlay' | 'modal' | 'drawer'>;\n    showQuickFallback: FormControl<boolean>;\n  }>;\n\n  /**\n   * Emits true when form has changes and is valid, enabling the save button\n   */\n  canSave$: Observable<boolean>;\n\n  // SettingsPanel contract: state observables to control buttons enablement\n  isDirty$: Observable<boolean>;\n  isValid$: Observable<boolean>;\n  isBusy$: Observable<boolean>;\n\n  private initialSettings: FilterConfig = {};\n  // Storage (injected) used to clear filter preferences\n  private readonly storage = inject<ConfigStorage>(CONFIG_STORAGE);\n\n  // Optional data provided by SettingsPanelService when opened as panel\n  private readonly injectedData = inject(SETTINGS_PANEL_DATA, {\n    optional: true,\n  }) as { metadata?: FieldMetadata[]; settings?: FilterConfig; configKey?: string; dto?: Record<string, any> } | null;\n  /** Clears persisted preferences for this filter, falling back to globals. */\n  resetPreferences(): void {\n    const key = this.configKey;\n    if (!key) return;\n    try {\n      this.storage.clearConfig('filter-config:' + key);\n      this.storage.clearConfig(key); // DTO persisted\n      this.form.markAsPristine();\n      (inject(MatSnackBar) as MatSnackBar).open('Preferências do filtro redefinidas', undefined, { duration: 2000 });\n    } catch {}\n  }\n\n  constructor(private fb: FormBuilder) {\n    this.form = this.fb.group({\n      quickField: this.fb.control<string | null>(null),\n      alwaysVisibleFields: this.fb.nonNullable.control<string[]>([]),\n      placeholder: this.fb.nonNullable.control(''),\n      showAdvanced: this.fb.nonNullable.control(false),\n      mode: this.fb.nonNullable.control<'auto' | 'filter' | 'card'>('auto'),\n      changeDebounceMs: this.fb.nonNullable.control(300, {\n        validators: [Validators.min(100), Validators.max(1000)],\n      }),\n      allowSaveTags: this.fb.nonNullable.control(false),\n      // theming for tags\n      tagColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('primary'),\n      tagVariant: this.fb.nonNullable.control<'filled' | 'outlined'>('filled'),\n      tagButtonColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('basic'),\n      actionsButtonColor: this.fb.nonNullable.control<'primary' | 'accent' | 'warn' | 'basic'>('basic'),\n      actionsVariant: this.fb.nonNullable.control<'standard' | 'outlined'>('standard'),\n      placeBooleansInActions: this.fb.nonNullable.control(true),\n      showToggleLabels: this.fb.nonNullable.control(true),\n      alwaysMinWidth: this.fb.nonNullable.control(300, {\n        validators: [Validators.min(240), Validators.max(480)],\n      }),\n      alwaysColsMd: this.fb.nonNullable.control(2, {\n        validators: [Validators.min(1), Validators.max(3)],\n      }),\n      alwaysColsLg: this.fb.nonNullable.control(3, {\n        validators: [Validators.min(1), Validators.max(4)],\n      }),\n      autoSummary: this.fb.nonNullable.control(false),\n      confirmTagDelete: this.fb.nonNullable.control(true),\n      debugLayout: this.fb.nonNullable.control(false),\n      overlayVariant: this.fb.nonNullable.control<'card' | 'frosted'>('card'),\n      overlayBackdrop: this.fb.nonNullable.control(true),\n      advancedOpenMode: this.fb.nonNullable.control<'overlay' | 'modal' | 'drawer'>('overlay'),\n      showQuickFallback: this.fb.nonNullable.control(false),\n    });\n\n    this.canSave$ = this.form.valueChanges.pipe(\n      map(() => this.form.dirty && this.form.valid),\n      startWith(false),\n    );\n\n    // Expose state observables expected by SettingsPanel\n    this.isDirty$ = this.form.valueChanges.pipe(\n      map(() => this.form.dirty),\n      startWith(false),\n    );\n    this.isValid$ = this.form.statusChanges.pipe(\n      map(() => this.form.valid),\n      startWith(this.form.valid),\n    );\n    this.isBusy$ = of(false);\n\n    this.form.valueChanges\n      .pipe(\n        map(() => this.getSettingsValue()),\n        takeUntilDestroyed(),\n      )\n      .subscribe((cfg) => this.settingsChange.emit(cfg));\n\n    // If opened inside Settings Panel, seed inputs from injected data\n    if (this.injectedData) {\n      if (this.injectedData.metadata) {\n        this.metadata = this.injectedData.metadata;\n      }\n      if (this.injectedData.settings) {\n        this.settings = this.injectedData.settings;\n        this.initialSettings = { ...this.injectedData.settings };\n        this.form.reset({\n          quickField: this.injectedData.settings.quickField ?? null,\n          alwaysVisibleFields: this.injectedData.settings.alwaysVisibleFields ?? [],\n          placeholder: this.injectedData.settings.placeholder ?? '',\n          showAdvanced: this.injectedData.settings.showAdvanced ?? false,\n          mode: this.injectedData.settings.mode ?? 'auto',\n          changeDebounceMs: this.clampDebounce(\n            this.injectedData.settings.changeDebounceMs,\n          ),\n          allowSaveTags: this.injectedData.settings.allowSaveTags ?? false,\n          tagColor: (this.injectedData.settings as any).tagColor ?? 'primary',\n          tagVariant: (this.injectedData.settings as any).tagVariant ?? 'filled',\n          tagButtonColor: (this.injectedData.settings as any).tagButtonColor ?? 'basic',\n          actionsButtonColor: (this.injectedData.settings as any).actionsButtonColor ?? 'basic',\n          actionsVariant: (this.injectedData.settings as any).actionsVariant ?? 'standard',\n          placeBooleansInActions: this.injectedData.settings.placeBooleansInActions ?? true,\n          showToggleLabels: this.injectedData.settings.showToggleLabels ?? true,\n          alwaysMinWidth: this.clampMinWidth(this.injectedData.settings.alwaysMinWidth),\n          alwaysColsMd: this.clampColsMd(this.injectedData.settings.alwaysColsMd),\n          alwaysColsLg: this.clampColsLg(this.injectedData.settings.alwaysColsLg),\n          autoSummary: this.injectedData.settings.autoSummary ?? false,\n          confirmTagDelete: this.injectedData.settings.confirmTagDelete ?? true,\n          debugLayout: this.injectedData.settings.debugLayout ?? false,\n          overlayVariant: (this.injectedData.settings as any).overlayVariant ?? 'card',\n          overlayBackdrop: (this.injectedData.settings as any).overlayBackdrop ?? true,\n          advancedOpenMode: (this.injectedData.settings as any).advancedOpenMode ?? 'overlay',\n          showQuickFallback: (this.injectedData.settings as any).showQuickFallback ?? false,\n        });\n      }\n      if (this.injectedData.configKey) {\n        this.configKey = this.injectedData.configKey;\n        this.loadTags();\n      }\n    }\n  }\n\n  // ================= TAGS MANAGEMENT =================\n  tags: FilterTag[] = [];\n  exportJson = '';\n  newTagLabel = '';\n  newTagPatchText = '';\n\n  private tagsKey(): string | null {\n    return this.configKey ? `${this.configKey}:tags` : null;\n  }\n\n  loadTags(): void {\n    const key = this.tagsKey();\n    if (!key) return;\n    const stored = this.storage.loadConfig<FilterTag[]>(key);\n    this.tags = Array.isArray(stored) ? [...stored] : [];\n    this.exportJson = JSON.stringify(this.tags, null, 2);\n  }\n\n  saveTags(): void {\n    const key = this.tagsKey();\n    if (!key) return;\n    this.storage.saveConfig(key, this.tags);\n    this.exportJson = JSON.stringify(this.tags, null, 2);\n  }\n\n  clearTags(): void {\n    this.tags = [];\n    this.saveTags();\n  }\n\n  removeTag(index: number): void {\n    this.tags.splice(index, 1);\n    this.saveTags();\n  }\n\n  renameTag(index: number, value: string): void {\n    const v = (value || '').trim();\n    if (!v) return;\n    this.tags[index] = { ...this.tags[index], label: v };\n    this.saveTags();\n  }\n\n  importTags(): void {\n    try {\n      const parsed = JSON.parse(this.exportJson);\n      this.tags = Array.isArray(parsed) ? parsed : [];\n      this.saveTags();\n    } catch {\n      // ignore JSON errors; keep previous value\n    }\n  }\n\n  addTag(): void {\n    const label = (this.newTagLabel || '').trim();\n    if (!label) return;\n    let patch: Record<string, any> = {};\n    const raw = (this.newTagPatchText || '').trim();\n    if (raw) {\n      try { patch = JSON.parse(raw); } catch { patch = {}; }\n    }\n    const tag: FilterTag = { id: Date.now().toString(), label, patch };\n    this.tags.push(tag);\n    this.newTagLabel = '';\n    this.newTagPatchText = '';\n    this.saveTags();\n  }\n\n  addTagFromCurrent(): void {\n    const dto = this.injectedData?.dto;\n    const label = prompt('Tag label', this.newTagLabel || '') || '';\n    if (!label) return;\n    const tag: FilterTag = { id: Date.now().toString(), label, patch: { ...(dto || {}) } };\n    this.tags.push(tag);\n    this.saveTags();\n  }\n\n  dropAlwaysVisible(event: CdkDragDrop<string[]>): void {\n    const ctrl = this.form.controls.alwaysVisibleFields;\n    const arr = [...(ctrl.value || [])];\n    moveItemInArray(arr, event.previousIndex, event.currentIndex);\n    ctrl.setValue(arr);\n  }\n\n  // ================= THEME PRESETS =================\n  presets = [\n    {\n      key: 'minimalOutlined',\n      label: 'Minimal Outlined',\n      values: {\n        tagColor: 'basic',\n        tagVariant: 'outlined',\n        tagButtonColor: 'basic',\n        actionsButtonColor: 'basic',\n        actionsVariant: 'outlined',\n      } as Partial<FilterConfig>,\n    },\n    {\n      key: 'primaryFilled',\n      label: 'Primary Filled',\n      values: {\n        tagColor: 'primary',\n        tagVariant: 'filled',\n        tagButtonColor: 'primary',\n        actionsButtonColor: 'primary',\n        actionsVariant: 'standard',\n      } as Partial<FilterConfig>,\n    },\n    {\n      key: 'accentSoft',\n      label: 'Accent Soft',\n      values: {\n        tagColor: 'accent',\n        tagVariant: 'filled',\n        tagButtonColor: 'accent',\n        actionsButtonColor: 'accent',\n        actionsVariant: 'outlined',\n      } as Partial<FilterConfig>,\n    },\n    {\n      key: 'warnHighlight',\n      label: 'Warn Highlight',\n      values: {\n        tagColor: 'warn',\n        tagVariant: 'filled',\n        tagButtonColor: 'warn',\n        actionsButtonColor: 'warn',\n        actionsVariant: 'standard',\n      } as Partial<FilterConfig>,\n    },\n  ];\n\n  applyPreset(key: string): void {\n    const p = this.presets.find((x) => x.key === key);\n    if (!p) return;\n    this.form.patchValue(p.values as any);\n  }\n\n  // Template helpers\n  getFieldLabel(name: string): string {\n    const m = (this.metadata || []).find((x) => x?.name === name);\n    return (m?.label as string) || name;\n  }\n\n  hasCurrentDto(): boolean {\n    return !!this.injectedData?.dto;\n  }\n\n  renameTagPrompt(index: number): void {\n    const current = this.tags[index]?.label ?? '';\n    const v = window.prompt('New label', current);\n    if (v != null) this.renameTag(index, v);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['settings'] && this.settings) {\n      this.initialSettings = { ...this.settings };\n      this.form.reset({\n        quickField: this.settings.quickField ?? null,\n        alwaysVisibleFields: this.settings.alwaysVisibleFields ?? [],\n        placeholder: this.settings.placeholder ?? '',\n        showAdvanced: this.settings.showAdvanced ?? false,\n        mode: this.settings.mode ?? 'auto',\n        changeDebounceMs: this.clampDebounce(this.settings.changeDebounceMs),\n        allowSaveTags: this.settings.allowSaveTags ?? false,\n        tagColor: (this.settings as any).tagColor ?? 'primary',\n        tagVariant: (this.settings as any).tagVariant ?? 'filled',\n        tagButtonColor: (this.settings as any).tagButtonColor ?? 'basic',\n        actionsButtonColor: (this.settings as any).actionsButtonColor ?? 'basic',\n        actionsVariant: (this.settings as any).actionsVariant ?? 'standard',\n        placeBooleansInActions: this.settings.placeBooleansInActions ?? true,\n        showToggleLabels: this.settings.showToggleLabels ?? true,\n        alwaysMinWidth: this.clampMinWidth(this.settings.alwaysMinWidth),\n        alwaysColsMd: this.clampColsMd(this.settings.alwaysColsMd),\n        alwaysColsLg: this.clampColsLg(this.settings.alwaysColsLg),\n        autoSummary: this.settings.autoSummary ?? false,\n        confirmTagDelete: this.settings.confirmTagDelete ?? true,\n        debugLayout: this.settings.debugLayout ?? false,\n        overlayVariant: (this.settings as any).overlayVariant ?? 'card',\n        overlayBackdrop: (this.settings as any).overlayBackdrop ?? true,\n        advancedOpenMode: (this.settings as any).advancedOpenMode ?? 'overlay',\n      });\n    }\n  }\n\n  getSettingsValue(): FilterConfig {\n    const value = this.form.getRawValue();\n    const quickField = value.quickField || undefined;\n    const alwaysVisibleFields = value.alwaysVisibleFields;\n    return {\n      quickField,\n      alwaysVisibleFields: alwaysVisibleFields.length\n        ? alwaysVisibleFields\n        : undefined,\n      placeholder: value.placeholder || undefined,\n      showAdvanced: value.showAdvanced ?? undefined,\n      mode: value.mode !== 'auto' ? value.mode : undefined,\n      changeDebounceMs:\n        value.changeDebounceMs !== 300 ? value.changeDebounceMs : undefined,\n      allowSaveTags: value.allowSaveTags ? true : undefined,\n      tagColor: value.tagColor !== 'primary' ? value.tagColor : undefined,\n      tagVariant: value.tagVariant !== 'filled' ? value.tagVariant : undefined,\n      tagButtonColor:\n        value.tagButtonColor !== 'basic' ? value.tagButtonColor : undefined,\n      actionsButtonColor:\n        value.actionsButtonColor !== 'basic' ? value.actionsButtonColor : undefined,\n      actionsVariant:\n        value.actionsVariant !== 'standard' ? value.actionsVariant : undefined,\n      placeBooleansInActions:\n        value.placeBooleansInActions !== true ? value.placeBooleansInActions : undefined,\n      showToggleLabels:\n        value.showToggleLabels !== true ? value.showToggleLabels : undefined,\n      alwaysMinWidth:\n        value.alwaysMinWidth !== 300 ? value.alwaysMinWidth : undefined,\n      alwaysColsMd: value.alwaysColsMd !== 2 ? value.alwaysColsMd : undefined,\n      alwaysColsLg: value.alwaysColsLg !== 3 ? value.alwaysColsLg : undefined,\n      autoSummary: value.autoSummary ? true : undefined,\n      confirmTagDelete:\n        value.confirmTagDelete !== true ? value.confirmTagDelete : undefined,\n      debugLayout: value.debugLayout ? true : undefined,\n      overlayVariant: value.overlayVariant !== 'card' ? value.overlayVariant : undefined,\n      overlayBackdrop: value.overlayBackdrop !== true ? value.overlayBackdrop : undefined,\n      advancedOpenMode: value.advancedOpenMode !== 'overlay' ? value.advancedOpenMode : undefined,\n      showQuickFallback: value.showQuickFallback ? true : undefined,\n    };\n  }\n\n  reset(): void {\n    this.form.reset({\n      quickField: this.initialSettings.quickField ?? null,\n      alwaysVisibleFields: this.initialSettings.alwaysVisibleFields ?? [],\n      placeholder: this.initialSettings.placeholder ?? '',\n      showAdvanced: this.initialSettings.showAdvanced ?? false,\n      mode: this.initialSettings.mode ?? 'auto',\n      changeDebounceMs: this.clampDebounce(\n        this.initialSettings.changeDebounceMs,\n      ),\n      allowSaveTags: this.initialSettings.allowSaveTags ?? false,\n      tagColor: (this.initialSettings as any).tagColor ?? 'primary',\n      tagVariant: (this.initialSettings as any).tagVariant ?? 'filled',\n      tagButtonColor: (this.initialSettings as any).tagButtonColor ?? 'basic',\n      actionsButtonColor: (this.initialSettings as any).actionsButtonColor ?? 'basic',\n      actionsVariant: (this.initialSettings as any).actionsVariant ?? 'standard',\n      placeBooleansInActions: this.initialSettings.placeBooleansInActions ?? true,\n      showToggleLabels: this.initialSettings.showToggleLabels ?? true,\n      alwaysMinWidth: this.clampMinWidth(this.initialSettings.alwaysMinWidth),\n      alwaysColsMd: this.clampColsMd(this.initialSettings.alwaysColsMd),\n      alwaysColsLg: this.clampColsLg(this.initialSettings.alwaysColsLg),\n      autoSummary: this.initialSettings.autoSummary ?? false,\n      confirmTagDelete: this.initialSettings.confirmTagDelete ?? true,\n      debugLayout: this.initialSettings.debugLayout ?? false,\n      overlayVariant: (this.initialSettings as any).overlayVariant ?? 'card',\n      overlayBackdrop: (this.initialSettings as any).overlayBackdrop ?? true,\n      advancedOpenMode: (this.initialSettings as any).advancedOpenMode ?? 'overlay',\n      showQuickFallback: (this.initialSettings as any).showQuickFallback ?? false,\n    });\n  }\n\n  private clampDebounce(value?: number): number {\n    const v = value ?? 300;\n    return Math.min(1000, Math.max(100, v));\n  }\n\n  private clampMinWidth(value?: number): number {\n    const v = value ?? 300;\n    return Math.min(480, Math.max(240, v));\n  }\n\n  private clampColsMd(value?: number): number {\n    const v = value ?? 2;\n    return Math.min(3, Math.max(1, v));\n  }\n\n  private clampColsLg(value?: number): number {\n    const v = value ?? 3;\n    return Math.min(4, Math.max(1, v));\n  }\n}\n","<form [formGroup]=\"form\">\n  <mat-tab-group>\n    <mat-tab label=\"Campo Rápido\">\n      <mat-form-field appearance=\"outline\" class=\"full-width\">\n        <mat-label>Quick Field</mat-label>\n        <mat-select formControlName=\"quickField\">\n          <mat-option [value]=\"meta.name\" *ngFor=\"let meta of metadata\">\n            {{ meta.label || meta.name }}\n          </mat-option>\n        </mat-select>\n      </mat-form-field>\n    </mat-tab>\n    <mat-tab label=\"Sempre Visíveis\">\n      <mat-form-field appearance=\"outline\" class=\"full-width\">\n        <mat-label>Always Visible Fields</mat-label>\n        <mat-select formControlName=\"alwaysVisibleFields\" multiple>\n          <mat-option [value]=\"meta.name\" *ngFor=\"let meta of metadata\">\n            {{ meta.label || meta.name }}\n          </mat-option>\n        </mat-select>\n      </mat-form-field>\n      <div class=\"options\">\n        <p><strong>Ordem (arraste para reordenar)</strong></p>\n        <div cdkDropList (cdkDropListDropped)=\"dropAlwaysVisible($event)\" class=\"dnd-list\">\n          <div class=\"dnd-item\" *ngFor=\"let name of form.controls.alwaysVisibleFields.value; let i = index\" cdkDrag>\n            <mat-icon [praxisIcon]=\"'drag_indicator'\"></mat-icon>\n            <span>{{ getFieldLabel(name) }}</span>\n          </div>\n        </div>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Layout\">\n      <div class=\"options\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Largura mínima (px)</mat-label>\n          <input matInput type=\"number\" formControlName=\"alwaysMinWidth\" min=\"240\" max=\"480\" />\n        </mat-form-field>\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Colunas ≥600px</mat-label>\n          <input matInput type=\"number\" formControlName=\"alwaysColsMd\" min=\"1\" max=\"3\" />\n        </mat-form-field>\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Colunas ≥960px</mat-label>\n          <input matInput type=\"number\" formControlName=\"alwaysColsLg\" min=\"1\" max=\"4\" />\n        </mat-form-field>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Alternadores\">\n      <div class=\"options\">\n        <mat-checkbox formControlName=\"placeBooleansInActions\">Colocar alternadores na área de ações</mat-checkbox>\n        <mat-checkbox formControlName=\"showToggleLabels\">Mostrar rótulos dos alternadores</mat-checkbox>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Opções\">\n      <div class=\"options\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Tema do overlay</mat-label>\n          <mat-select formControlName=\"overlayVariant\">\n            <mat-option value=\"card\">Card</mat-option>\n            <mat-option value=\"frosted\">Frosted</mat-option>\n          </mat-select>\n        </mat-form-field>\n        <mat-checkbox formControlName=\"overlayBackdrop\">Overlay com backdrop</mat-checkbox>\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Modo de abertura do Avançado</mat-label>\n          <mat-select formControlName=\"advancedOpenMode\">\n            <mat-option value=\"overlay\">Overlay (default)</mat-option>\n            <mat-option value=\"modal\">Modal</mat-option>\n            <mat-option value=\"drawer\">Drawer (right)</mat-option>\n          </mat-select>\n        </mat-form-field>\n        <mat-checkbox formControlName=\"showQuickFallback\">Mostrar \"Buscar\" quando não houver Quick</mat-checkbox>\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Placeholder da busca</mat-label>\n          <input matInput formControlName=\"placeholder\" placeholder=\"Ex.: Buscar por nome\" />\n        </mat-form-field>\n        <mat-checkbox formControlName=\"showAdvanced\"\n          >Mostrar Avançado</mat-checkbox\n        >\n        <mat-checkbox formControlName=\"autoSummary\">Ativar resumo automático</mat-checkbox>\n        <mat-checkbox formControlName=\"confirmTagDelete\">Confirmar exclusão de atalho</mat-checkbox>\n        <div class=\"options\">\n          <h4>Tema das tags</h4>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor da tag</mat-label>\n            <mat-select formControlName=\"tagColor\">\n              <mat-option value=\"primary\">Primary</mat-option>\n              <mat-option value=\"accent\">Accent</mat-option>\n              <mat-option value=\"warn\">Warn</mat-option>\n              <mat-option value=\"basic\">Basic</mat-option>\n            </mat-select>\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Variante da tag</mat-label>\n            <mat-select formControlName=\"tagVariant\">\n              <mat-option value=\"filled\">Filled</mat-option>\n              <mat-option value=\"outlined\">Outlined</mat-option>\n            </mat-select>\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor dos botões</mat-label>\n            <mat-select formControlName=\"tagButtonColor\">\n              <mat-option value=\"basic\">Basic</mat-option>\n              <mat-option value=\"primary\">Primary</mat-option>\n              <mat-option value=\"accent\">Accent</mat-option>\n              <mat-option value=\"warn\">Warn</mat-option>\n            </mat-select>\n          </mat-form-field>\n        </div>\n        <div class=\"options\">\n          <h4>Tema dos botões de ação</h4>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor dos botões</mat-label>\n            <mat-select formControlName=\"actionsButtonColor\">\n              <mat-option value=\"basic\">Basic</mat-option>\n              <mat-option value=\"primary\">Primary</mat-option>\n              <mat-option value=\"accent\">Accent</mat-option>\n              <mat-option value=\"warn\">Warn</mat-option>\n            </mat-select>\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Variante dos botões</mat-label>\n            <mat-select formControlName=\"actionsVariant\">\n              <mat-option value=\"standard\">Standard</mat-option>\n              <mat-option value=\"outlined\">Outlined</mat-option>\n            </mat-select>\n          </mat-form-field>\n        </div>\n        <div class=\"options\">\n          <h4>Predefinições de tema</h4>\n          <div class=\"preset-row\">\n            <button mat-stroked-button *ngFor=\"let p of presets\" (click)=\"applyPreset(p.key)\">{{ p.label }}</button>\n          </div>\n        </div>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"i18n\">\n      <div class=\"options\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Placeholder da busca</mat-label>\n          <input matInput [value]=\"settings?.placeholder || ''\" disabled />\n          <mat-hint>Placeholder do Campo Rápido (integra com i18n futuramente)</mat-hint>\n        </mat-form-field>\n        <!-- Espaço reservado para i18n granular, se necessário -->\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Atalhos\" *ngIf=\"configKey\">\n      <div class=\"options\">\n        <div class=\"tags-header\">\n          <span><strong>Atalhos salvos</strong></span>\n          <span class=\"spacer\"></span>\n          <button mat-stroked-button color=\"warn\" (click)=\"clearTags()\">Apagar tudo</button>\n        </div>\n        <div class=\"new-tag\">\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Rótulo do novo atalho</mat-label>\n            <input matInput [(ngModel)]=\"newTagLabel\" [ngModelOptions]=\"{standalone: true}\" />\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Patch (JSON, opcional)</mat-label>\n            <textarea matInput rows=\"3\" [(ngModel)]=\"newTagPatchText\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n          </mat-form-field>\n          <div>\n            <button mat-stroked-button color=\"primary\" (click)=\"addTag()\">Adicionar</button>\n            <button mat-stroked-button (click)=\"addTagFromCurrent()\" *ngIf=\"hasCurrentDto()\">Adicionar a partir dos filtros atuais</button>\n          </div>\n        </div>\n        <mat-list>\n          <mat-list-item *ngFor=\"let t of tags; index as i\">\n            <span matListItemTitle>{{ t.label }}</span>\n            <span matListItemLine>{{ t.id }}</span>\n            <button mat-icon-button (click)=\"removeTag(i)\" matTooltip=\"Delete\">\n              <mat-icon [praxisIcon]=\"'delete'\"></mat-icon>\n            </button>\n            <button mat-icon-button (click)=\"renameTagPrompt(i)\" matTooltip=\"Rename\">\n              <mat-icon [praxisIcon]=\"'edit'\"></mat-icon>\n            </button>\n          </mat-list-item>\n        </mat-list>\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Importar/Exportar JSON</mat-label>\n          <textarea matInput rows=\"6\" [(ngModel)]=\"exportJson\" [ngModelOptions]=\"{standalone: true}\"></textarea>\n        </mat-form-field>\n        <div>\n          <button mat-stroked-button color=\"primary\" (click)=\"importTags()\">Importar</button>\n          <button mat-stroked-button (click)=\"loadTags()\">Recarregar</button>\n          <button mat-stroked-button (click)=\"saveTags()\">Salvar</button>\n        </div>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Comportamento\">\n      <div class=\"options\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Modo</mat-label>\n          <mat-select formControlName=\"mode\">\n            <mat-option value=\"auto\">Auto</mat-option>\n            <mat-option value=\"filter\">Filter</mat-option>\n            <mat-option value=\"card\">Card</mat-option>\n          </mat-select>\n        </mat-form-field>\n        <mat-checkbox formControlName=\"allowSaveTags\"\n          >Permitir salvar atalhos</mat-checkbox\n        >\n        <mat-checkbox formControlName=\"debugLayout\">Mostrar depuração de layout</mat-checkbox>\n      </div>\n    </mat-tab>\n    <mat-tab label=\"Avançado\">\n      <div class=\"options\">\n        <mat-form-field appearance=\"outline\" class=\"full-width\">\n          <mat-label>Debounce de alterações (ms)</mat-label>\n          <input\n            matInput\n            type=\"number\"\n            formControlName=\"changeDebounceMs\"\n            min=\"100\"\n            max=\"1000\"\n          />\n          <mat-error *ngIf=\"form.controls.changeDebounceMs.invalid\">\n            Value must be between 100 and 1000\n          </mat-error>\n        </mat-form-field>\n        <div class=\"actions\">\n          <button mat-stroked-button color=\"warn\" (click)=\"resetPreferences()\">\n            <mat-icon [praxisIcon]=\"'restart_alt'\"></mat-icon>\n            Redefinir preferências do filtro\n          </button>\n        </div>\n      </div>\n    </mat-tab>\n  </mat-tab-group>\n</form>\n","import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TableConfig } from '@praxisui/core';\n\n@Component({\n  selector: 'header-appearance-editor',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatCardModule, MatIconModule],\n  template: `\n    <div class=\"header-editor\">\n      <mat-card>\n        <mat-card-header>\n          <mat-icon>view_headline</mat-icon>\n          <mat-card-title>Estilo do Cabeçalho</mat-card-title>\n        </mat-card-header>\n        <mat-card-content class=\"grid\">\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Altura do cabeçalho (px)</mat-label>\n            <input matInput type=\"number\" [(ngModel)]=\"headerHeight\" (ngModelChange)=\"emit()\" min=\"32\" max=\"96\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Padding do cabeçalho</mat-label>\n            <input matInput [(ngModel)]=\"headerPadding\" (ngModelChange)=\"emit()\" placeholder=\"12px 16px\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Tamanho da fonte</mat-label>\n            <input matInput [(ngModel)]=\"headerFontSize\" (ngModelChange)=\"emit()\" placeholder=\"14px\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Peso da fonte</mat-label>\n            <input matInput [(ngModel)]=\"headerFontWeight\" (ngModelChange)=\"emit()\" placeholder=\"600\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Espaçamento entre letras</mat-label>\n            <input matInput [(ngModel)]=\"letterSpacing\" (ngModelChange)=\"emit()\" placeholder=\".02em\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Transformação do texto</mat-label>\n            <mat-select [(ngModel)]=\"headerCase\" (ngModelChange)=\"emit()\">\n              <mat-option value=\"none\">Nenhuma</mat-option>\n              <mat-option value=\"uppercase\">MAIÚSCULAS</mat-option>\n              <mat-option value=\"lowercase\">minúsculas</mat-option>\n              <mat-option value=\"capitalize\">Capitalizar</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor de fundo do cabeçalho</mat-label>\n            <input matInput [(ngModel)]=\"headerBg\" (ngModelChange)=\"emit()\" placeholder=\"#003E4D\" />\n            <mat-hint>Use uma cor CSS válida (ex.: #003E4D)</mat-hint>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor do texto do cabeçalho</mat-label>\n            <input matInput [(ngModel)]=\"headerFg\" (ngModelChange)=\"emit()\" placeholder=\"#ffffff\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor da borda inferior do cabeçalho</mat-label>\n            <input matInput [(ngModel)]=\"headerBorder\" (ngModelChange)=\"emit()\" placeholder=\"#d5dae2\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Cor de fundo das linhas pares (zebra)</mat-label>\n            <input matInput [(ngModel)]=\"zebraBg\" (ngModelChange)=\"emit()\" placeholder=\"#f6f7f9\" />\n          </mat-form-field>\n        </mat-card-content>\n      </mat-card>\n    </div>\n  `,\n  styles: [`\n    .header-editor { display: block; }\n    .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px,1fr)); gap: 12px; }\n    mat-card-title { margin-left: 8px; }\n  `]\n})\nexport class HeaderAppearanceEditorComponent {\n  @Input() config!: TableConfig;\n  @Output() configChange = new EventEmitter<TableConfig>();\n\n  headerHeight?: number;\n  headerPadding?: string;\n  headerFontSize?: string;\n  headerFontWeight?: string | number;\n  letterSpacing?: string;\n  headerCase: 'none'|'uppercase'|'lowercase'|'capitalize' = 'none';\n  headerBg?: string;\n  headerFg?: string;\n  headerBorder?: string;\n  zebraBg?: string;\n\n  ngOnInit(): void {\n    const app: any = this.config?.appearance || {};\n    this.headerHeight = app.spacing?.headerHeight;\n    this.headerPadding = app.spacing?.headerPadding;\n    this.headerFontSize = app.typography?.headerFontSize;\n    this.headerFontWeight = app.typography?.headerFontWeight;\n    this.letterSpacing = app.typography?.letterSpacing;\n    this.headerCase = app.typography?.headerCase || 'none';\n    this.headerBg = app.colors?.headerBackground;\n    this.headerFg = app.colors?.headerTextColor;\n    this.zebraBg = app.colors?.alternateRowBackground;\n    this.headerBorder = app.borders?.specific?.header?.color || app.borders?.color;\n  }\n\n  emit(): void {\n    const next: TableConfig = {\n      ...(this.config || {}),\n      appearance: {\n        ...(this.config?.appearance || {}),\n        spacing: {\n          ...(this.config?.appearance?.spacing || {}),\n          headerHeight: this.headerHeight,\n          headerPadding: this.headerPadding,\n        },\n        typography: {\n          ...(this.config?.appearance?.typography || {}),\n          headerFontSize: this.headerFontSize,\n          headerFontWeight: this.headerFontWeight as any,\n          letterSpacing: this.letterSpacing,\n          headerCase: this.headerCase,\n        },\n        colors: {\n          ...(this.config?.appearance?.colors || {}),\n          headerBackground: this.headerBg,\n          headerTextColor: this.headerFg,\n          alternateRowBackground: this.zebraBg,\n        },\n        borders: {\n          ...(this.config?.appearance?.borders || {}),\n          specific: {\n            ...(this.config?.appearance?.borders?.specific || {}),\n            header: {\n              ...(this.config?.appearance?.borders?.specific?.header || {}),\n              color: this.headerBorder,\n            }\n          }\n        }\n      }\n    } as TableConfig;\n    this.config = next;\n    this.configChange.emit(next);\n  }\n}\n","import { Component, Input, OnInit, Inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CONFIG_STORAGE, ConfigStorage } from '@praxisui/core';\n\nexport interface CrudEditorContextLike {\n  tableId: string;\n  resourcePath?: string;\n  defaults?: {\n    openMode?: 'modal' | 'route' | 'drawer';\n    modal?: Record<string, any>;\n    back?: Record<string, any>;\n  };\n  actions?: Array<{\n    action: string;\n    label?: string;\n    formId?: string;\n    route?: string;\n    openMode?: 'modal' | 'route' | 'drawer';\n  }>;\n}\n\n@Component({\n  selector: 'crud-integration-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatSlideToggleModule,\n    MatExpansionModule,\n    MatIconModule,\n    MatButtonModule,\n    MatTooltipModule,\n  ],\n  template: `\n    <div class=\"crud-editor\">\n      <mat-expansion-panel [expanded]=\"true\">\n        <mat-expansion-panel-header>\n          <mat-panel-title>\n            <mat-icon class=\"section-icon\">settings</mat-icon>\n            Padrões do CRUD\n          </mat-panel-title>\n          <mat-panel-description>\n            Comportamento ao abrir formulários a partir da tabela\n          </mat-panel-description>\n        </mat-expansion-panel-header>\n\n        <div class=\"config-section\">\n          <div class=\"form-grid\" [formGroup]=\"defaultsForm\">\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Modo de abertura</mat-label>\n            <mat-select formControlName=\"openMode\">\n              <mat-option value=\"modal\">Modal</mat-option>\n              <mat-option value=\"route\">Rota</mat-option>\n              <mat-option value=\"drawer\">Gaveta (direita)</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <mat-slide-toggle formControlName=\"modal_closeOnSave\">Fechar ao salvar</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_rememberLastState\">Lembrar tamanho/estado</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_autoFocus\">Auto foco</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_restoreFocus\">Restaurar foco ao fechar</mat-slide-toggle>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Largura</mat-label>\n            <input matInput formControlName=\"modal_width\" placeholder=\"ex: 800px\" />\n            <mat-hint>Use px, %, vw. Ex: 800px, 90vw</mat-hint>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Altura</mat-label>\n            <input matInput formControlName=\"modal_height\" placeholder=\"ex: 90vh\" />\n            <mat-hint>Use px, %, vh. Ex: 600px, 90vh</mat-hint>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Breakpoint de fullscreen (px)</mat-label>\n            <input matInput type=\"number\" formControlName=\"modal_fullscreenBreakpoint\" />\n          </mat-form-field>\n\n          <mat-slide-toggle formControlName=\"modal_startMaximized\">Iniciar maximizado</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_canMaximize\">Permitir maximizar</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_disableCloseOnEsc\">Desabilitar fechar com ESC</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"modal_disableCloseOnBackdrop\">Desabilitar fechar com backdrop</mat-slide-toggle>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Estilo do backdrop</mat-label>\n            <mat-select formControlName=\"modal_backdropStyle\">\n              <mat-option [value]=\"''\">Padrão</mat-option>\n              <mat-option value=\"blur\">Blur</mat-option>\n              <mat-option value=\"dim\">Escurecido</mat-option>\n              <mat-option value=\"transparent\">Transparente</mat-option>\n            </mat-select>\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Margem ao maximizar (edgeGap px)</mat-label>\n            <input matInput type=\"number\" formControlName=\"modal_edgeGap\" />\n          </mat-form-field>\n\n          <mat-form-field appearance=\"outline\">\n            <mat-label>ReturnTo (padrão ao navegar)</mat-label>\n            <input matInput formControlName=\"back_returnTo\" placeholder=\"/minha-rota\" />\n          </mat-form-field>\n\n          <mat-slide-toggle formControlName=\"back_confirmOnDirty\">Confirmar ao sair com alterações</mat-slide-toggle>\n\n          <!-- Header (route mode) -->\n          <mat-slide-toggle formControlName=\"header_showBack\">Mostrar botão Voltar (rota)</mat-slide-toggle>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Texto do botão Voltar</mat-label>\n            <input matInput formControlName=\"header_backLabel\" placeholder=\"Voltar\" />\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\">\n            <mat-label>Variante do botão</mat-label>\n            <mat-select formControlName=\"header_variant\">\n              <mat-option value=\"ghost\">Ghost</mat-option>\n              <mat-option value=\"tonal\">Tonal</mat-option>\n              <mat-option value=\"outlined\">Outlined</mat-option>\n            </mat-select>\n          </mat-form-field>\n          <mat-slide-toggle formControlName=\"header_sticky\">Cabeçalho fixo (sticky)</mat-slide-toggle>\n          <mat-slide-toggle formControlName=\"header_divider\">Exibir divisor inferior</mat-slide-toggle>\n          </div>\n        </div>\n      </mat-expansion-panel>\n\n      <mat-expansion-panel *ngIf=\"actionsArray?.length\">\n        <mat-expansion-panel-header>\n          <mat-panel-title>\n            <mat-icon class=\"section-icon\">list</mat-icon>\n            Ações específicas\n          </mat-panel-title>\n          <mat-panel-description>\n            Sobrescrever modo de abertura por ação\n          </mat-panel-description>\n        </mat-expansion-panel-header>\n\n        <div class=\"config-section\">\n          <div class=\"actions-list\">\n            <div class=\"action-item\" *ngFor=\"let ctrl of actionForms.controls; let i = index\" [formGroup]=\"ctrl\">\n              <div class=\"action-row\">\n                <span class=\"action-name\">{{ ctrl.get('action')?.value }}</span>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>Modo</mat-label>\n                <mat-select formControlName=\"openMode\">\n                  <mat-option [value]=\"''\">Padrão</mat-option>\n                  <mat-option value=\"modal\">Modal</mat-option>\n                  <mat-option value=\"route\">Rota</mat-option>\n                  <mat-option value=\"drawer\">Gaveta (direita)</mat-option>\n                </mat-select>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>formId (se modal/gaveta)</mat-label>\n                <input matInput formControlName=\"formId\" placeholder=\"ex: employees-edit\" />\n                <mat-hint>Obrigatório quando modo = Modal ou Gaveta</mat-hint>\n                <mat-error *ngIf=\"(ctrl.get('openMode')?.value === 'modal' || ctrl.get('openMode')?.value === 'drawer') && ctrl.get('formId')?.enabled && !ctrl.get('formId')?.value\">\n                  Informe um formId para abrir em Modal/Gaveta\n                </mat-error>\n              </mat-form-field>\n\n              <mat-form-field appearance=\"outline\">\n                <mat-label>route (se rota)</mat-label>\n                <input matInput formControlName=\"route\" placeholder=\"ex: /employees/:id/edit\" />\n                <mat-hint>Obrigatório quando modo = Rota</mat-hint>\n                <mat-error *ngIf=\"ctrl.get('openMode')?.value === 'route' && ctrl.get('route')?.enabled && !ctrl.get('route')?.value\">\n                  Informe uma rota para abrir em Rota\n                </mat-error>\n              </mat-form-field>\n\n                <button mat-icon-button type=\"button\" (click)=\"resetActionOverride(i)\" aria-label=\"Resetar overrides\" matTooltip=\"Resetar overrides\">\n                  <mat-icon>restart_alt</mat-icon>\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </mat-expansion-panel>\n\n      <div class=\"hint\">\n        <button mat-stroked-button color=\"warn\" type=\"button\" (click)=\"resetAllOverrides()\">\n          <mat-icon>restart_alt</mat-icon>\n          Redefinir overrides de CRUD (todos)\n        </button>\n      </div>\n\n      <div class=\"hint\">As alterações são salvas junto com a ação \"Salvar\" do painel.</div>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        --cie-on-surface-variant: var(--mat-sys-on-surface-variant, color-mix(in srgb, var(--sicoob-text-high), transparent 40%));\n      }\n      .crud-editor { display: block; width: 100%; padding: 8px; }\n      .config-section { padding: 16px; }\n      .form-grid { display: grid; grid-template-columns: repeat(2, minmax(220px, 1fr)); gap: 12px; align-items: center; }\n      .form-grid .mat-mdc-form-field { width: 100%; }\n      .actions-list { display: flex; flex-direction: column; gap: 8px; }\n      .action-row { display: grid; grid-template-columns: 160px 160px 1fr 1fr; gap: 8px; align-items: center; }\n      .action-name { font-weight: 600; }\n      .hint { margin-top: 8px; color: var(--cie-on-surface-variant); }\n      .section-icon { margin-right: 8px; color: var(--mat-sys-primary); }\n      mat-form-field { width: 100%; }\n      mat-expansion-panel { margin-bottom: 8px; border-radius: 8px; overflow: hidden; }\n      mat-expansion-panel-header { min-height: 56px; }\n      mat-panel-description { color: var(--mat-sys-on-surface-variant); }\n    `,\n  ],\n})\nexport class CrudIntegrationEditorComponent implements OnInit {\n  @Input() tableId!: string;\n  @Input() crudContext?: CrudEditorContextLike;\n\n  defaultsForm!: FormGroup;\n  actionForms!: FormArray<FormGroup>;\n\n  constructor(\n    private fb: FormBuilder,\n    @Inject(CONFIG_STORAGE) private storage: ConfigStorage,\n  ) {}\n\n  ngOnInit(): void {\n    // Forms\n    this.defaultsForm = this.fb.group({\n      openMode: this.fb.control<'modal' | 'route' | 'drawer' | undefined>(undefined as any),\n      modal_closeOnSave: this.fb.control<boolean>(true),\n      modal_rememberLastState: this.fb.control<boolean>(false),\n      modal_autoFocus: this.fb.control<boolean>(true),\n      modal_restoreFocus: this.fb.control<boolean>(true),\n      modal_width: this.fb.control<string | undefined>(undefined),\n      modal_height: this.fb.control<string | undefined>(undefined),\n      modal_startMaximized: this.fb.control<boolean>(false),\n      modal_fullscreenBreakpoint: this.fb.control<number | null>(null),\n      modal_canMaximize: this.fb.control<boolean>(true),\n      modal_disableCloseOnEsc: this.fb.control<boolean>(false),\n      modal_disableCloseOnBackdrop: this.fb.control<boolean>(false),\n      modal_backdropStyle: this.fb.control<string | undefined>(undefined),\n      modal_edgeGap: this.fb.control<number | null>(null),\n      back_returnTo: this.fb.control<string | undefined>(undefined),\n      back_confirmOnDirty: this.fb.control<boolean>(true),\n\n      // Header (route mode)\n      header_showBack: this.fb.control<boolean>(true),\n      header_backLabel: this.fb.control<string | undefined>(undefined),\n      header_variant: this.fb.control<string>('ghost'),\n      header_sticky: this.fb.control<boolean>(true),\n      header_divider: this.fb.control<boolean>(true),\n    });\n    this.actionForms = this.fb.array<FormGroup>([]);\n\n    // Load overrides from storage, fallback to provided crudContext defaults\n    const key = this.getStorageKey();\n    const saved = (this.storage.loadConfig(key) as any) || {};\n    const defaults = saved.defaults || (this.crudContext?.defaults || {});\n    const modal = defaults.modal || {};\n    const back = defaults.back || {};\n    const header = defaults.header || {};\n\n    this.defaultsForm.patchValue({\n      openMode: defaults.openMode,\n      modal_closeOnSave: modal.closeOnSave ?? true,\n      modal_rememberLastState: modal.rememberLastState ?? false,\n      modal_autoFocus: modal.autoFocus ?? true,\n      modal_restoreFocus: modal.restoreFocus ?? true,\n      modal_width: modal.width,\n      modal_height: modal.height,\n      modal_startMaximized: !!modal.startMaximized,\n      modal_fullscreenBreakpoint: modal.fullscreenBreakpoint ?? null,\n      modal_canMaximize: modal.canMaximize ?? true,\n      modal_disableCloseOnEsc: !!modal.disableCloseOnEsc,\n      modal_disableCloseOnBackdrop: !!modal.disableCloseOnBackdrop,\n      modal_backdropStyle: modal.backdropStyle ?? '',\n      modal_edgeGap: modal.edgeGap ?? null,\n      back_returnTo: back.returnTo,\n      back_confirmOnDirty: back.confirmOnDirty ?? true,\n\n      header_showBack: header.showBack ?? true,\n      header_backLabel: header.backLabel,\n      header_variant: header.variant || 'ghost',\n      header_sticky: header.sticky ?? true,\n      header_divider: header.divider ?? true,\n    });\n\n    const actions = this.crudContext?.actions || [];\n    const overrides = saved.actions || {};\n    for (const a of actions) {\n      const ov = overrides[a.action] || {};\n      this.actionForms.push(\n        this.fb.group({\n          action: this.fb.control(a.action),\n          openMode: this.fb.control<string | undefined>(ov.openMode),\n          formId: this.fb.control<string | undefined>(ov.formId ?? a.formId),\n          route: this.fb.control<string | undefined>(ov.route ?? a.route),\n        }),\n      );\n    }\n\n    // Prefill sensible defaults when selecting Modal\n    this.defaultsForm.get('openMode')?.valueChanges.subscribe((mode) => {\n      if (mode === 'modal') {\n        const w = this.defaultsForm.get('modal_width');\n        const h = this.defaultsForm.get('modal_height');\n        if (!w?.value) w?.setValue('800px');\n        if (!h?.value) h?.setValue('90vh');\n      }\n    });\n\n    // Bind per-action control state to openMode\n    for (const grp of this.actionForms.controls) {\n      const update = () => this.updateActionControlsState(grp);\n      grp.get('openMode')?.valueChanges.subscribe(update);\n      update();\n    }\n  }\n\n  get actionFormsControls() {\n    return this.actionForms.controls;\n  }\n\n  get actionsArray(): any[] | undefined {\n    return this.crudContext?.actions;\n  }\n\n  saveOverrides(): void {\n    const key = this.getStorageKey();\n    const v = this.defaultsForm.value;\n    const defaults: any = {\n      openMode: v.openMode,\n      modal: {\n        closeOnSave: !!v.modal_closeOnSave,\n        rememberLastState: !!v.modal_rememberLastState,\n        autoFocus: !!v.modal_autoFocus,\n        restoreFocus: !!v.modal_restoreFocus,\n        width: v.modal_width,\n        height: v.modal_height,\n        startMaximized: v.modal_startMaximized,\n        fullscreenBreakpoint: v.modal_fullscreenBreakpoint ?? undefined,\n        canMaximize: v.modal_canMaximize,\n        disableCloseOnEsc: v.modal_disableCloseOnEsc,\n        disableCloseOnBackdrop: v.modal_disableCloseOnBackdrop,\n        backdropStyle: v.modal_backdropStyle || undefined,\n        edgeGap: v.modal_edgeGap ?? undefined,\n      },\n      back: {\n        returnTo: v.back_returnTo,\n        confirmOnDirty: v.back_confirmOnDirty,\n      },\n      header: {\n        showBack: v.header_showBack,\n        backLabel: v.header_backLabel || undefined,\n        variant: v.header_variant || 'ghost',\n        sticky: v.header_sticky,\n        divider: v.header_divider,\n      },\n    };\n    const actions: Record<string, any> = {};\n    for (const ctrl of this.actionForms.controls) {\n      const av = ctrl.value as any;\n      actions[av.action] = {\n        openMode: av.openMode || undefined,\n        formId: av.formId || undefined,\n        route: av.route || undefined,\n      };\n    }\n    const payload = { defaults, actions };\n    this.storage.saveConfig(key, payload);\n  }\n\n  resetAllOverrides(): void {\n    const key = this.getStorageKey();\n    try { this.storage.clearConfig(key); } catch {}\n    // Reset forms to initial state\n    this.defaultsForm.reset({\n      openMode: undefined,\n      modal_closeOnSave: true,\n      modal_rememberLastState: false,\n      modal_autoFocus: true,\n      modal_restoreFocus: true,\n      modal_width: undefined,\n      modal_height: undefined,\n      modal_startMaximized: false,\n      modal_fullscreenBreakpoint: null,\n      modal_canMaximize: true,\n      modal_disableCloseOnEsc: false,\n      modal_disableCloseOnBackdrop: false,\n      modal_backdropStyle: '',\n      modal_edgeGap: null,\n      back_returnTo: undefined,\n      back_confirmOnDirty: true,\n      header_showBack: true,\n      header_backLabel: undefined,\n      header_variant: 'ghost',\n      header_sticky: true,\n      header_divider: true,\n    });\n    for (const grp of this.actionForms.controls) {\n      grp.reset({ action: grp.get('action')?.value, openMode: undefined, formId: undefined, route: undefined });\n      this.updateActionControlsState(grp);\n    }\n  }\n\n  private getStorageKey(): string {\n    const id = this.crudContext?.tableId || this.tableId || 'default';\n    return `crud-overrides:${id}`;\n  }\n\n  private updateActionControlsState(grp: FormGroup): void {\n    const mode: string | undefined = grp.get('openMode')?.value;\n    const formId = grp.get('formId');\n    const route = grp.get('route');\n    if (!formId || !route) return;\n    if (mode === 'modal' || mode === 'drawer') {\n      formId.enable({ emitEvent: false });\n      formId.setValidators([Validators.required]);\n      route.disable({ emitEvent: false });\n      route.clearValidators();\n    } else if (mode === 'route') {\n      route.enable({ emitEvent: false });\n      route.setValidators([Validators.required]);\n      formId.disable({ emitEvent: false });\n      formId.clearValidators();\n    } else {\n      formId.enable({ emitEvent: false });\n      formId.clearValidators();\n      route.enable({ emitEvent: false });\n      route.clearValidators();\n    }\n    formId.updateValueAndValidity({ emitEvent: false });\n    route.updateValueAndValidity({ emitEvent: false });\n  }\n\n  resetActionOverride(index: number): void {\n    const grp = this.actionForms.at(index) as FormGroup;\n    grp.patchValue({ openMode: '', formId: undefined, route: undefined }, { emitEvent: false });\n    this.updateActionControlsState(grp);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\n\ntype DialogConfigLike = any; // keep loose to avoid cross-lib coupling\n\n@Component({\n  selector: 'confirm-dialog-appearance-editor',\n  standalone: true,\n  imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatSlideToggleModule, MatButtonModule, MatExpansionModule, MatIconModule, PraxisIconDirective],\n  templateUrl: './confirm-dialog-appearance-editor.component.html',\n  styleUrls: ['./confirm-dialog-appearance-editor.component.scss'],\n})\nexport class ConfirmDialogAppearanceEditorComponent {\n  @Input() config!: DialogConfigLike; // TableConfig (V2) or partial structure\n  @Output() configChange = new EventEmitter<DialogConfigLike>();\n\n  // Safe getter/setter to editedConfig.dialogs.confirm.delete\n  get deleteDialog(): any {\n    const dialogs = (this.config as any).dialogs || {};\n    const confirm = dialogs.confirm || {};\n    const del = confirm.delete || {};\n    return del;\n  }\n\n  // Size presets (defaults for quick selection)\n  readonly sizePresets: Record<string, { width?: string; height?: string; maxWidth?: string; maxHeight?: string }> = {\n    default: {},\n    sm: { width: '360px', maxWidth: '360px', maxHeight: '80vh' },\n    md: { width: '420px', maxWidth: '420px', maxHeight: '80vh' },\n    lg: { width: '640px', maxWidth: '640px', maxHeight: '80vh' },\n    xl: { width: '800px', maxWidth: '800px', maxHeight: '80vh' },\n    tall: { width: '640px', maxWidth: '640px', height: '70vh', maxHeight: '70vh' },\n    full: { width: '90vw', maxWidth: '90vw', height: '90vh', maxHeight: '90vh' },\n    fluid: { width: '100%', maxWidth: '100%', maxHeight: '80vh' },\n  };\n\n  get selectedSizePreset(): string {\n    const w = this.deleteDialog?.width as string | undefined;\n    if (!w) return 'default';\n    const match = Object.entries(this.sizePresets).find(([_, v]) => v.width === w);\n    return match?.[0] || 'default';\n  }\n\n  setSizePreset(preset: string): void {\n    const p = this.sizePresets[preset] || {};\n    if (p.width !== undefined) this.update('width', p.width);\n    if (p.maxWidth !== undefined) this.update('maxWidth', p.maxWidth);\n    if (p.height !== undefined) this.update('height', p.height);\n    if (p.maxHeight !== undefined) this.update('maxHeight', p.maxHeight);\n  }\n\n  getInheritedValue(field: 'width' | 'height' | 'maxHeight'): string | undefined {\n    const preset = this.selectedSizePreset;\n    if (!preset || preset === 'default') return undefined;\n    const v = this.sizePresets[preset]?.[field];\n    return v;\n  }\n\n  getPresetLabel(): string {\n    const p = this.selectedSizePreset;\n    switch (p) {\n      case 'sm': return 'sm (360px)';\n      case 'md': return 'md (420px)';\n      case 'lg': return 'lg (640px)';\n      case 'xl': return 'xl (800px)';\n      case 'tall': return 'tall (640px × 70vh)';\n      case 'full': return 'full (90vw × 90vh)';\n      case 'fluid': return 'fluid (100% × 80vh)';\n      default: return 'Herdar (preset global)';\n    }\n  }\n\n  resetOverrides(): void {\n    const next = { ...(this.config as any) };\n    // Remove apenas a seção de delete confirm overrides\n    if (next.dialogs?.confirm?.delete) {\n      const dlg = { ...(next.dialogs) };\n      const cnf = { ...(dlg.confirm) };\n      delete (cnf as any).delete;\n      dlg.confirm = cnf;\n      next.dialogs = dlg;\n    }\n    this.configChange.emit(next);\n  }\n\n  update(path: string, value: any): void {\n    const next = { ...(this.config as any) };\n    next.dialogs = { ...(next.dialogs || {}) };\n    next.dialogs.confirm = { ...(next.dialogs.confirm || {}) };\n    const curr = { ...(next.dialogs.confirm.delete || {}) };\n    // helper utils\n    const isEmpty = (v: any) => v === '' || v === undefined || v === null;\n    const ensureAnim = () => (curr.animation = { ...(curr.animation || {}) });\n    const ensureStyles = () => (curr.styles = { ...(curr.styles || {}) });\n    const ensurePos = () => (curr.position = { ...(curr.position || {}) });\n    const cleanup = () => {\n      if (curr.animation && Object.keys(curr.animation).length === 0) {\n        delete (curr as any).animation;\n      }\n      if (curr.styles && Object.keys(curr.styles).length === 0) {\n        delete (curr as any).styles;\n      }\n      if (curr.position && Object.keys(curr.position).length === 0) {\n        delete (curr as any).position;\n      }\n    };\n    // shallow set by path for known fields; delete key when value is empty to fallback to presets\n    switch (path) {\n      case 'themeColor':\n        if (isEmpty(value)) delete (curr as any).themeColor; else curr.themeColor = value;\n        break;\n      case 'width':\n        if (isEmpty(value)) delete (curr as any).width; else curr.width = value;\n        break;\n      case 'minWidth':\n        if (isEmpty(value)) delete (curr as any).minWidth; else curr.minWidth = value;\n        break;\n      case 'maxWidth':\n        if (isEmpty(value)) delete (curr as any).maxWidth; else curr.maxWidth = value;\n        break;\n      case 'height':\n        if (isEmpty(value)) delete (curr as any).height; else curr.height = value;\n        break;\n      case 'minHeight':\n        if (isEmpty(value)) delete (curr as any).minHeight; else curr.minHeight = value;\n        break;\n      case 'maxHeight':\n        if (isEmpty(value)) delete (curr as any).maxHeight; else curr.maxHeight = value;\n        break;\n      case 'actionsLayout':\n        if (isEmpty(value)) delete (curr as any).actionsLayout; else curr.actionsLayout = value;\n        break;\n      case 'animation.type':\n        if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).type; } else { ensureAnim(); (curr.animation as any).type = value; }\n        break;\n      case 'animation.direction':\n        if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).direction; } else { ensureAnim(); (curr.animation as any).direction = value; }\n        break;\n      case 'animation.duration': {\n        const num = isEmpty(value) ? undefined : Number(value);\n        if (num == null || Number.isNaN(num)) { if (curr.animation) delete (curr.animation as any).duration; }\n        else { ensureAnim(); (curr.animation as any).duration = num; }\n        break;\n      }\n      case 'animation.easing':\n        if (isEmpty(value)) { if (curr.animation) delete (curr.animation as any).easing; } else { ensureAnim(); (curr.animation as any).easing = value; }\n        break;\n      case 'disableClose':\n        if (isEmpty(value)) delete (curr as any).disableClose; else curr.disableClose = !!value;\n        break;\n      case 'hasBackdrop':\n        if (isEmpty(value)) delete (curr as any).hasBackdrop; else curr.hasBackdrop = !!value;\n        break;\n      case 'panelClass':\n        if (isEmpty(value)) delete (curr as any).panelClass; else curr.panelClass = value;\n        break;\n      case 'backdropClass':\n        if (isEmpty(value)) delete (curr as any).backdropClass; else curr.backdropClass = value;\n        break;\n      case 'zIndex': {\n        const num = isEmpty(value) ? undefined : Number(value);\n        if (num == null || Number.isNaN(num)) {\n          if ((curr as any).zIndex !== undefined) {\n            delete (curr as any).zIndex;\n          }\n        } else {\n          (curr as any).zIndex = num;\n        }\n        break;\n      }\n      case 'position.top':\n        if (isEmpty(value)) { if (curr.position) delete (curr.position as any).top; } else { ensurePos(); (curr.position as any).top = value; }\n        break;\n      case 'position.right':\n        if (isEmpty(value)) { if (curr.position) delete (curr.position as any).right; } else { ensurePos(); (curr.position as any).right = value; }\n        break;\n      case 'position.bottom':\n        if (isEmpty(value)) { if (curr.position) delete (curr.position as any).bottom; } else { ensurePos(); (curr.position as any).bottom = value; }\n        break;\n      case 'position.left':\n        if (isEmpty(value)) { if (curr.position) delete (curr.position as any).left; } else { ensurePos(); (curr.position as any).left = value; }\n        break;\n      case 'styles.containerShape':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).containerShape; } else { ensureStyles(); (curr.styles as any).containerShape = value; }\n        break;\n      case 'styles.actionsPadding':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).actionsPadding; } else { ensureStyles(); (curr.styles as any).actionsPadding = value; }\n        break;\n      case 'styles.contentPadding':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).contentPadding; } else { ensureStyles(); (curr.styles as any).contentPadding = value; }\n        break;\n      case 'styles.headlinePadding':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).headlinePadding; } else { ensureStyles(); (curr.styles as any).headlinePadding = value; }\n        break;\n      case 'styles.withActionsContentPadding':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).withActionsContentPadding; } else { ensureStyles(); (curr.styles as any).withActionsContentPadding = value; }\n        break;\n      case 'styles.containerColor':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).containerColor; } else { ensureStyles(); (curr.styles as any).containerColor = value; }\n        break;\n      case 'styles.subheadColor':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).subheadColor; } else { ensureStyles(); (curr.styles as any).subheadColor = value; }\n        break;\n      case 'styles.supportingTextColor':\n        if (isEmpty(value)) { if (curr.styles) delete (curr.styles as any).supportingTextColor; } else { ensureStyles(); (curr.styles as any).supportingTextColor = value; }\n        break;\n      default: break;\n    }\n    cleanup();\n    next.dialogs.confirm.delete = curr;\n    this.configChange.emit(next);\n  }\n}\n","<mat-accordion multi>\n  <mat-expansion-panel expanded>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon [praxisIcon]=\"'tune'\"></mat-icon>&nbsp;Aparência & Comportamento</mat-panel-title>\n      <mat-panel-description> Tema, alinhamento e herança de presets </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <p style=\"grid-column:1 / -1; opacity:.8; margin: 0 0 8px;\">\n        Precedência: <strong>preset global</strong> → <strong>variante (delete)</strong> → <strong>override local</strong> (esta aba). Campos em branco herdam o valor do preset selecionado.\n      </p>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Tema</mat-label>\n        <mat-select [ngModel]=\"deleteDialog.themeColor\" (ngModelChange)=\"update('themeColor', $event)\">\n          <mat-option [value]=\"undefined\">Padrão</mat-option>\n          <mat-option value=\"light\">Light</mat-option>\n          <mat-option value=\"dark\">Dark</mat-option>\n          <mat-option value=\"primary\">Primary</mat-option>\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Alinhamento das ações</mat-label>\n        <mat-select [ngModel]=\"deleteDialog.actionsLayout\" (ngModelChange)=\"update('actionsLayout', $event)\">\n          <mat-option value=\"start\">alinhado à esquerda</mat-option>\n          <mat-option value=\"center\">centralizado</mat-option>\n          <mat-option value=\"end\">alinhado à direita</mat-option>\n          <mat-option value=\"stretched\">estendido (preencher)</mat-option>\n        </mat-select>\n      </mat-form-field>\n      <mat-slide-toggle [ngModel]=\"deleteDialog.hasBackdrop\" (ngModelChange)=\"update('hasBackdrop', $event)\">Mostrar backdrop</mat-slide-toggle>\n      <mat-slide-toggle [ngModel]=\"deleteDialog.disableClose\" (ngModelChange)=\"update('disableClose', $event)\">Desabilitar fechar (ESC/clique)</mat-slide-toggle>\n    </div>\n  </mat-expansion-panel>\n\n  <mat-expansion-panel>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon [praxisIcon]=\"'aspect_ratio'\"></mat-icon>&nbsp;Dimensões</mat-panel-title>\n      <mat-panel-description> Largura/altura e limites </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Tamanho (preset)</mat-label>\n        <mat-select [ngModel]=\"selectedSizePreset\" (ngModelChange)=\"setSizePreset($event)\">\n          <mat-option value=\"default\">Herdar (preset global)</mat-option>\n          <mat-option value=\"sm\">sm (360px)</mat-option>\n          <mat-option value=\"md\">md (420px)</mat-option>\n          <mat-option value=\"lg\">lg (640px)</mat-option>\n          <mat-option value=\"xl\">xl (800px)</mat-option>\n          <mat-option value=\"tall\">tall (640px × 70vh)</mat-option>\n          <mat-option value=\"full\">full (90vw × 90vh)</mat-option>\n          <mat-option value=\"fluid\">fluid (100% × 80vh)</mat-option>\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Largura (width)</mat-label>\n        <input matInput [placeholder]=\"getInheritedValue('width') || 'ex.: 420px'\" [ngModel]=\"deleteDialog.width\" (ngModelChange)=\"update('width', $event)\" />\n        <mat-hint *ngIf=\"!deleteDialog.width && getInheritedValue('width')\">Herdado: {{ getInheritedValue('width') }}</mat-hint>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Altura (height)</mat-label>\n        <input matInput [placeholder]=\"getInheritedValue('height') || 'ex.: auto'\" [ngModel]=\"deleteDialog.height\" (ngModelChange)=\"update('height', $event)\" />\n        <mat-hint *ngIf=\"!deleteDialog.height && getInheritedValue('height')\">Herdado: {{ getInheritedValue('height') }}</mat-hint>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Largura mínima (minWidth)</mat-label><input matInput placeholder=\"ex.: 320px\" [ngModel]=\"deleteDialog.minWidth\" (ngModelChange)=\"update('minWidth', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Largura máxima (maxWidth)</mat-label><input matInput placeholder=\"ex.: 90vw\" [ngModel]=\"deleteDialog.maxWidth\" (ngModelChange)=\"update('maxWidth', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Altura mínima (minHeight)</mat-label><input matInput placeholder=\"ex.: 200px\" [ngModel]=\"deleteDialog.minHeight\" (ngModelChange)=\"update('minHeight', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Altura máxima (maxHeight)</mat-label><input matInput [placeholder]=\"getInheritedValue('maxHeight') || 'ex.: 80vh'\" [ngModel]=\"deleteDialog.maxHeight\" (ngModelChange)=\"update('maxHeight', $event)\" /></mat-form-field>\n    </div>\n  </mat-expansion-panel>\n\n  <mat-expansion-panel>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon>animation</mat-icon>&nbsp;Animação</mat-panel-title>\n      <mat-panel-description> Tipo, direção, duração </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Tipo</mat-label>\n        <mat-select [ngModel]=\"deleteDialog.animation?.type\" (ngModelChange)=\"update('animation.type', $event)\">\n          <mat-option [value]=\"undefined\">Padrão (translate)</mat-option>\n          <mat-option value=\"translate\">translate</mat-option>\n          <mat-option value=\"slide\">slide</mat-option>\n          <mat-option value=\"fade\">fade</mat-option>\n          <mat-option value=\"expand\">expand</mat-option>\n          <mat-option value=\"zoom\">zoom</mat-option>\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Direção</mat-label>\n        <mat-select [ngModel]=\"deleteDialog.animation?.direction\" (ngModelChange)=\"update('animation.direction', $event)\">\n          <mat-option [value]=\"undefined\">Padrão</mat-option>\n          <mat-option value=\"up\">para cima</mat-option>\n          <mat-option value=\"down\">para baixo</mat-option>\n          <mat-option value=\"left\">para a esquerda</mat-option>\n          <mat-option value=\"right\">para a direita</mat-option>\n        </mat-select>\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Duração (ms)</mat-label>\n        <input matInput type=\"number\" [ngModel]=\"deleteDialog.animation?.duration\" (ngModelChange)=\"update('animation.duration', $event)\" />\n      </mat-form-field>\n      <mat-form-field appearance=\"outline\">\n        <mat-label>Easing</mat-label>\n        <input matInput placeholder=\"cubic-bezier(...)\" [ngModel]=\"deleteDialog.animation?.easing\" (ngModelChange)=\"update('animation.easing', $event)\" />\n      </mat-form-field>\n    </div>\n  </mat-expansion-panel>\n\n  <mat-expansion-panel>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon>palette</mat-icon>&nbsp;Estilos (tokens)</mat-panel-title>\n      <mat-panel-description> Aparência do contêiner e conteúdo </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <mat-form-field appearance=\"outline\"><mat-label>Border radius (shape)</mat-label><input matInput placeholder=\"ex.: 12px\" [ngModel]=\"deleteDialog.styles?.containerShape\" (ngModelChange)=\"update('styles.containerShape', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Padding ações</mat-label><input matInput placeholder=\"12px 16px\" [ngModel]=\"deleteDialog.styles?.actionsPadding\" (ngModelChange)=\"update('styles.actionsPadding', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Padding conteúdo</mat-label><input matInput placeholder=\"16px\" [ngModel]=\"deleteDialog.styles?.contentPadding\" (ngModelChange)=\"update('styles.contentPadding', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Padding título</mat-label><input matInput placeholder=\"12px 16px\" [ngModel]=\"deleteDialog.styles?.headlinePadding\" (ngModelChange)=\"update('styles.headlinePadding', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Padding conteúdo (com ações)</mat-label><input matInput placeholder=\"16px\" [ngModel]=\"deleteDialog.styles?.withActionsContentPadding\" (ngModelChange)=\"update('styles.withActionsContentPadding', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Cor do contêiner</mat-label><input matInput placeholder=\"#262626\" [ngModel]=\"deleteDialog.styles?.containerColor\" (ngModelChange)=\"update('styles.containerColor', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Cor do título</mat-label><input matInput placeholder=\"#fff\" [ngModel]=\"deleteDialog.styles?.subheadColor\" (ngModelChange)=\"update('styles.subheadColor', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Cor do conteúdo</mat-label><input matInput placeholder=\"rgba(255,255,255,0.92)\" [ngModel]=\"deleteDialog.styles?.supportingTextColor\" (ngModelChange)=\"update('styles.supportingTextColor', $event)\" /></mat-form-field>\n    </div>\n  </mat-expansion-panel>\n\n  <mat-expansion-panel>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon>open_with</mat-icon>&nbsp;Posição</mat-panel-title>\n      <mat-panel-description> Offsets opcionais </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <mat-form-field appearance=\"outline\"><mat-label>Top</mat-label><input matInput placeholder=\"ex.: 10vh\" [ngModel]=\"deleteDialog.position?.top\" (ngModelChange)=\"update('position.top', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Right</mat-label><input matInput placeholder=\"ex.: 24px\" [ngModel]=\"deleteDialog.position?.right\" (ngModelChange)=\"update('position.right', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Bottom</mat-label><input matInput placeholder=\"ex.: 10vh\" [ngModel]=\"deleteDialog.position?.bottom\" (ngModelChange)=\"update('position.bottom', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Left</mat-label><input matInput placeholder=\"ex.: 24px\" [ngModel]=\"deleteDialog.position?.left\" (ngModelChange)=\"update('position.left', $event)\" /></mat-form-field>\n    </div>\n  </mat-expansion-panel>\n\n  <mat-expansion-panel>\n    <mat-expansion-panel-header>\n      <mat-panel-title><mat-icon>code</mat-icon>&nbsp;Classes & Avançado</mat-panel-title>\n      <mat-panel-description> CSS e z-index </mat-panel-description>\n    </mat-expansion-panel-header>\n    <div class=\"dialog-editor-grid\">\n      <mat-form-field appearance=\"outline\"><mat-label>Classe do painel</mat-label><input matInput placeholder=\"ex.: my-panel\" [ngModel]=\"deleteDialog.panelClass\" (ngModelChange)=\"update('panelClass', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>Classe do backdrop</mat-label><input matInput placeholder=\"ex.: my-backdrop\" [ngModel]=\"deleteDialog.backdropClass\" (ngModelChange)=\"update('backdropClass', $event)\" /></mat-form-field>\n      <mat-form-field appearance=\"outline\"><mat-label>z-index</mat-label><input matInput type=\"number\" placeholder=\"ex.: 1200\" [ngModel]=\"deleteDialog.zIndex\" (ngModelChange)=\"update('zIndex', $event)\" /></mat-form-field>\n      <div style=\"grid-column:1 / -1; display:flex; gap:8px; align-items:center; margin-top:8px;\">\n        <button mat-stroked-button color=\"primary\" (click)=\"resetOverrides()\">Resetar overrides</button>\n        <span style=\"opacity:.7\">Remove os valores locais para herdar do preset selecionado ou do preset global.</span>\n      </div>\n    </div>\n  </mat-expansion-panel>\n</mat-accordion>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@Component({\n  selector: 'pfx-table-config-toolbar',\n  standalone: true,\n  imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule],\n  template: `\n    <div class=\"pfx-tct\">\n      <div class=\"spacer\"></div>\n      <div class=\"actions\" role=\"toolbar\" [attr.aria-label]=\"ariaLabel || 'Ações'\">\n        <button mat-stroked-button (click)=\"export.emit()\" [attr.aria-label]=\"exportLabel\" [matTooltip]=\"exportLabel\">\n          <mat-icon>file_upload</mat-icon>\n          {{ exportLabel }}\n        </button>\n        <button mat-stroked-button (click)=\"import.emit()\" [attr.aria-label]=\"importLabel\" [matTooltip]=\"importLabel\">\n          <mat-icon>file_download</mat-icon>\n          {{ importLabel }}\n        </button>\n        <button mat-stroked-button (click)=\"reset.emit()\" [attr.aria-label]=\"resetLabel\" [matTooltip]=\"resetLabel\">\n          <mat-icon>refresh</mat-icon>\n          {{ resetLabelShort || resetLabel }}\n        </button>\n        <button mat-raised-button color=\"primary\" class=\"apply\" (click)=\"apply.emit()\" [disabled]=\"applyDisabled\" [attr.aria-label]=\"applyLabel\">\n          <mat-icon>done</mat-icon>\n          {{ applyLabel }}\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .pfx-tct { display:flex; align-items:center; gap: 8px; width: 100%; }\n      .actions { display:flex; gap: 8px; align-items:center; }\n      .spacer { flex: 1; }\n      /* compact primary action with subtle gradient */\n      .apply { color: #fff; background-image: linear-gradient(180deg, var(--mat-sys-primary, #3f51b5), var(--mat-sys-primary-fixed-dim, #2f3e8b)); }\n      .apply:disabled { background-image: none; }\n    `,\n  ],\n})\nexport class TableConfigToolbarComponent {\n  @Input() applyDisabled = false;\n  @Input() ariaLabel = 'Toolbar';\n  @Input() exportLabel = 'Exportar';\n  @Input() importLabel = 'Importar';\n  @Input() resetLabel = 'Redefinir rascunho';\n  @Input() resetLabelShort = 'Redefinir';\n  @Input() applyLabel = 'Aplicar';\n\n  @Output() export = new EventEmitter<void>();\n  @Output() import = new EventEmitter<void>();\n  @Output() reset = new EventEmitter<void>();\n  @Output() apply = new EventEmitter<void>();\n}\n\n","import type { ColumnDefinition } from '@praxisui/core';\n\n// Keep in sync with ColumnDataType used across the table module\nexport type ColumnDataType =\n  | 'string'\n  | 'number'\n  | 'date'\n  | 'boolean'\n  | 'currency'\n  | 'percentage'\n  | 'custom';\n\n/**\n * Derives the effective data type for a column using the same precedence\n * as ColumnsConfigEditor: user-configured `type` > original API type\n * (when `_isApiField` and `_originalApiType` exist) > heuristic by field name.\n */\nexport function getColumnDataType(column: ColumnDefinition | null): ColumnDataType {\n  if (!column) return 'string';\n\n  // 1) Explicit type from user config\n  if (column.type) return column.type as ColumnDataType;\n\n  // 2) Fallback to API original type when available\n  if ((column as any)._isApiField && (column as any)._originalApiType) {\n    return (column as any)._originalApiType as ColumnDataType;\n  }\n\n  // 3) Heuristic by field name\n  return inferFieldTypeFromFieldName(column.field);\n}\n\n/**\n * Heuristic used by the ColumnsConfigEditor to infer a type from the field name.\n */\nexport function inferFieldTypeFromFieldName(fieldName: string): ColumnDataType {\n  const lowercaseName = (fieldName || '').toLowerCase();\n\n  // Date/time patterns\n  if (\n    lowercaseName.endsWith('date') ||\n    lowercaseName.endsWith('time') ||\n    lowercaseName.endsWith('at') ||\n    lowercaseName.startsWith('date') ||\n    lowercaseName === 'created' ||\n    lowercaseName === 'updated' ||\n    lowercaseName === 'modified' ||\n    lowercaseName.includes('timestamp')\n  ) {\n    return 'date';\n  }\n\n  // Boolean patterns\n  if (\n    lowercaseName.startsWith('is_') ||\n    lowercaseName.startsWith('has_') ||\n    lowercaseName.startsWith('can_') ||\n    lowercaseName.startsWith('should_') ||\n    lowercaseName === 'active' ||\n    lowercaseName === 'enabled' ||\n    lowercaseName === 'visible' ||\n    lowercaseName === 'deleted' ||\n    lowercaseName === 'archived' ||\n    lowercaseName.endsWith('_flag') ||\n    lowercaseName.endsWith('_enabled') ||\n    lowercaseName.endsWith('_active')\n  ) {\n    return 'boolean';\n  }\n\n  // Currency/money patterns\n  if (\n    (lowercaseName.includes('price') ||\n      lowercaseName.includes('amount') ||\n      lowercaseName.includes('cost') ||\n      lowercaseName.includes('salary') ||\n      lowercaseName.includes('wage') ||\n      lowercaseName.includes('fee') ||\n      (lowercaseName.includes('value') &&\n        !lowercaseName.includes('id') &&\n        !lowercaseName.includes('key'))) &&\n    !lowercaseName.includes('count') &&\n    !lowercaseName.includes('type')\n  ) {\n    return 'currency';\n  }\n\n  // Percentage patterns\n  if (\n    lowercaseName.includes('percent') ||\n    lowercaseName.endsWith('_rate') ||\n    lowercaseName.endsWith('_ratio') ||\n    lowercaseName.endsWith('_pct') ||\n    (lowercaseName.includes('rate') &&\n      !lowercaseName.includes('created') &&\n      !lowercaseName.includes('updated')) ||\n    lowercaseName.endsWith('_score')\n  ) {\n    return 'percentage';\n  }\n\n  // Number patterns\n  if (\n    (lowercaseName.endsWith('_id') && lowercaseName !== 'id') ||\n    lowercaseName === 'id' ||\n    lowercaseName.includes('count') ||\n    lowercaseName.includes('quantity') ||\n    lowercaseName.includes('number') ||\n    lowercaseName.includes('total') ||\n    lowercaseName.includes('sum') ||\n    lowercaseName.includes('age') ||\n    lowercaseName.includes('weight') ||\n    lowercaseName.includes('height') ||\n    lowercaseName.includes('size') ||\n    lowercaseName.endsWith('_num') ||\n    lowercaseName.endsWith('_number')\n  ) {\n    return 'number';\n  }\n\n  return 'string';\n}\n\n","import { Injectable } from '@angular/core';\nimport type { ColumnDataType } from '../../shared/column-type.util';\n\nexport type OperatorKey =\n  // common\n  '==' | '!=' | '<' | '<=' | '>' | '>=' |\n  // string\n  'contains' | 'startsWith' | 'endsWith' | 'matches' | 'in' | 'not in' | 'is empty' | 'is not empty' |\n  // number/date\n  'between' | 'is today' | 'in last' | 'weekday is' |\n  // boolean\n  'is true' | 'is false' |\n  // array\n  'contains all' | 'contains any' | 'length ==' | 'length >' | 'length <' |\n  // json\n  'jsonPath matches' | 'has key' | 'key ==' |\n  // relational\n  'id ==' | 'id in' | 'has property';\n\nexport interface OperatorSpec {\n  key: OperatorKey;\n  label: string;\n  icon?: string;\n  description?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OperatorsRegistryService {\n  /** Returns the list of operator specs supported for a given data type. */\n  getForType(type: ColumnDataType | 'enum' | 'array' | 'json' | 'relational'): OperatorSpec[] {\n    switch (type) {\n      case 'string':\n        return this.stringOps;\n      case 'number':\n      case 'currency':\n      case 'percentage':\n        return this.numberOps;\n      case 'date':\n        return this.dateOps;\n      case 'boolean':\n        return this.booleanOps;\n      // enums/lists behave like string with in/not in\n      case 'enum':\n        return this.enumOps;\n      case 'array':\n        return this.arrayOps;\n      case 'json':\n        return this.jsonOps;\n      case 'relational':\n        return this.relationalOps;\n      default:\n        return this.stringOps;\n    }\n  }\n\n  get keys(): OperatorKey[] {\n    return [\n      '==','!=','<','<=','>','>=',\n      'contains','startsWith','endsWith','matches','in','not in','is empty','is not empty',\n      'between','is today','in last','weekday is','is true','is false',\n      'contains all','contains any','length ==','length >','length <',\n      'jsonPath matches','has key','key ==',\n      'id ==','id in','has property',\n    ];\n  }\n\n  private readonly stringOps: OperatorSpec[] = [\n    { key: '==', label: 'Igual a', icon: 'drag_handle' },\n    { key: '!=', label: 'Diferente de', icon: 'drag_handle' },\n    { key: 'contains', label: 'Contém', icon: 'filter_list' },\n    { key: 'startsWith', label: 'Começa com', icon: 'filter_list' },\n    { key: 'endsWith', label: 'Termina com', icon: 'filter_list' },\n    { key: 'matches', label: 'Regex', icon: 'code' },\n    { key: 'in', label: 'Em (lista)', icon: 'list' },\n    { key: 'not in', label: 'Fora (lista)', icon: 'block' },\n    { key: 'is empty', label: 'Vazio', icon: 'remove' },\n    { key: 'is not empty', label: 'Não vazio', icon: 'add' },\n  ];\n\n  private readonly numberOps: OperatorSpec[] = [\n    { key: '==', label: 'Igual a', icon: 'drag_handle' },\n    { key: '!=', label: 'Diferente de', icon: 'drag_handle' },\n    { key: '>', label: 'Maior que', icon: 'chevron_right' },\n    { key: '>=', label: 'Maior ou igual a', icon: 'chevron_right' },\n    { key: '<', label: 'Menor que', icon: 'chevron_left' },\n    { key: '<=', label: 'Menor ou igual a', icon: 'chevron_left' },\n    { key: 'between', label: 'Entre', icon: 'sync_alt' },\n    { key: 'in', label: 'Em (conjunto)', icon: 'list' },\n  ];\n\n  private readonly dateOps: OperatorSpec[] = [\n    { key: '==', label: 'Igual a', icon: 'drag_handle' },\n    { key: '!=', label: 'Diferente de', icon: 'drag_handle' },\n    { key: 'between', label: 'Entre datas', icon: 'calendar_today' },\n    { key: '>', label: 'Depois de', icon: 'chevron_right' },\n    { key: '<', label: 'Antes de', icon: 'chevron_left' },\n    { key: 'is today', label: 'É hoje', icon: 'today' },\n    { key: 'in last', label: 'Nos últimos', icon: 'history' },\n    { key: 'weekday is', label: 'Dia da semana', icon: 'event' },\n  ];\n\n  private readonly booleanOps: OperatorSpec[] = [\n    { key: 'is true', label: 'É verdadeiro', icon: 'toggle_on' },\n    { key: 'is false', label: 'É falso', icon: 'toggle_off' },\n  ];\n\n  private readonly enumOps: OperatorSpec[] = [\n    { key: '==', label: 'Igual a', icon: 'drag_handle' },\n    { key: '!=', label: 'Diferente de', icon: 'drag_handle' },\n    { key: 'in', label: 'Em (lista)', icon: 'list' },\n    { key: 'not in', label: 'Fora (lista)', icon: 'block' },\n  ];\n\n  private readonly arrayOps: OperatorSpec[] = [\n    { key: 'contains', label: 'Contém', icon: 'filter_list' },\n    { key: 'contains any', label: 'Contém qualquer', icon: 'filter_list' },\n    { key: 'contains all', label: 'Contém todos', icon: 'filter_list' },\n    { key: 'length ==', label: 'Tamanho igual a', icon: 'format_list_numbered' },\n    { key: 'length >', label: 'Tamanho maior que', icon: 'format_list_numbered' },\n    { key: 'length <', label: 'Tamanho menor que', icon: 'format_list_numbered' },\n  ];\n\n  private readonly jsonOps: OperatorSpec[] = [\n    { key: 'jsonPath matches', label: 'JSONPath (regex)', icon: 'code' },\n    { key: 'has key', label: 'Possui chave/caminho', icon: 'key' },\n    { key: 'key ==', label: 'Valor em caminho ==', icon: 'code' },\n  ];\n\n  private readonly relationalOps: OperatorSpec[] = [\n    { key: 'id ==', label: 'ID igual a', icon: 'person' },\n    { key: 'id in', label: 'IDs em (lista)', icon: 'group' },\n    { key: 'has property', label: 'Possui propriedade', icon: 'key' },\n    // join condition simples pode ser expresso com 'key ==' existente\n  ];\n}\n","import { Injectable } from '@angular/core';\n\nexport type GroupOp = 'AND' | 'OR' | 'NOT';\n\nexport interface RuleAtom {\n  field: string;\n  operator: string; // normalized operator key\n  // For between, provide value as { min, max }; for in/not in, provide an array\n  value?: any;\n  options?: Record<string, any>;\n}\n\nexport interface RuleGroup {\n  op: GroupOp;\n  conditions: RuleAtom[];\n  groups?: RuleGroup[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class RuleCompilerService {\n  /**\n   * Compiles a rule group into a single DSL expression string, adding\n   * parentheses according to grouping and operator precedence.\n   */\n  compileGroup(group: RuleGroup): string {\n    const parts: string[] = [];\n\n    for (const c of group.conditions || []) {\n      parts.push(this.compileAtom(c));\n    }\n\n    for (const g of group.groups || []) {\n      const nested = this.compileGroup(g);\n      if (nested.trim()) parts.push(`(${nested})`);\n    }\n\n    const joiner = group.op === 'AND' ? ' and ' : group.op === 'OR' ? ' or ' : ' and ';\n    let expr = parts.join(joiner);\n    if (group.op === 'NOT' && expr.trim()) {\n      expr = `not (${expr})`;\n    }\n    return expr;\n  }\n\n  /** Compiles a single rule atom to DSL. */\n  compileAtom(atom: RuleAtom): string {\n    const f = atom.field;\n    const op = (atom.operator || '').toLowerCase();\n    const v = atom.value;\n\n    switch (op) {\n      \n      case 'contains':\n      case 'startswith':\n      case 'endswith':\n        return `${op}(${f}, ${this.stringify(v)})`;\n      case 'matches':\n        return `matches(${f}, ${this.stringify(v)})`;\n      case 'in': {\n        const arr = Array.isArray(v) ? v : String(v ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n        const list = arr.map((x) => this.stringify(x)).join(', ');\n        return `${f} in [${list}]`;\n      }\n      case 'not in': {\n        const arr = Array.isArray(v) ? v : String(v ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n        const list = arr.map((x) => this.stringify(x)).join(', ');\n        return `not (${f} in [${list}])`;\n      }\n      case 'contains any': {\n        const arr = Array.isArray(v) ? v : String(v ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n        const parts = arr.map((x) => `contains(${f}, ${this.stringify(x)})`);\n        return parts.length ? parts.join(' or ') : '';\n      }\n      case 'contains all': {\n        const arr = Array.isArray(v) ? v : String(v ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n        const parts = arr.map((x) => `contains(${f}, ${this.stringify(x)})`);\n        return parts.length ? parts.join(' and ') : '';\n      }\n      case 'is empty':\n        return `(${f} == null or ${f} == '')`;\n      case 'is not empty':\n        return `(${f} != null and ${f} != '')`;\n      case 'between': {\n        const min = (v && (v.min ?? v[0])) ?? null;\n        const max = (v && (v.max ?? v[1])) ?? null;\n        if (min == null || max == null) return '';\n        const a = this.stringify(min);\n        const b = this.stringify(max);\n        return `(${f} >= ${a} and ${f} <= ${b})`;\n      }\n      case 'is today':\n        return `${f} == today()`;\n      case 'in last': {\n        const n = Number(v?.n ?? v);\n        const unit = String(v?.unit || '').toLowerCase() as 'days'|'weeks'|'months';\n        if (!isFinite(n) || !unit) return '';\n        return `(${f} >= dateAdd(today(), -${Math.abs(n)}, '${unit}') and ${f} <= now())`;\n      }\n      case 'weekday is': {\n        const arr = Array.isArray(v) ? v : [v].filter(Boolean);\n        const nums = arr.map((x) => Number(x)).filter((x) => isFinite(x));\n        if (!nums.length) return '';\n        return `dateFormat(${f}, 'E') in [${nums.join(', ')}]`;\n      }\n      case 'is true':\n        return `${f} == true`;\n      case 'is false':\n        return `${f} == false`;\n      case 'id ==': {\n        // jsonGet(field, '$.id') == ID\n        return `jsonGet(${f}, '$.id') == ${this.stringify(v)}`;\n      }\n      case 'id in': {\n        const arr = Array.isArray(v) ? v : String(v ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n        const list = arr.map((x) => this.stringify(x)).join(', ');\n        return `jsonGet(${f}, '$.id') in [${list}]`;\n      }\n      case 'has property': {\n        const path = typeof v === 'string' ? v : (v?.path ?? v?.key ?? '');\n        if (!path) return '';\n        return `hasJsonKey(${f}, ${this.stringify(path)})`;\n      }\n      \n      case 'length ==': {\n        const n = Number(v);\n        if (!isFinite(n)) return '';\n        return `exactly(${f}, ${n})`;\n      }\n      case 'length >': {\n        const n = Number(v);\n        if (!isFinite(n)) return '';\n        // length > n  => atLeast(n+1)\n        return `atLeast(${f}, ${n + 1})`;\n      }\n      case 'length <': {\n        const n = Number(v);\n        if (!isFinite(n)) return '';\n        // length < n => not atLeast(n)\n        return `not (atLeast(${f}, ${n}))`;\n      }\n      case 'jsonpath matches': {\n        const path = v?.path ?? v?.p ?? '';\n        const pattern = v?.pattern ?? v?.regex ?? '';\n        if (!path || !pattern) return '';\n        return `jsonPathMatches(${f}, ${this.stringify(path)}, ${this.stringify(pattern)})`;\n      }\n      case 'has key': {\n        const path = v?.path ?? v?.key ?? '';\n        if (!path) return '';\n        return `hasJsonKey(${f}, ${this.stringify(path)})`;\n      }\n      case 'key ==': {\n        const path = v?.path ?? '';\n        const expected = v?.expected ?? v?.value;\n        if (!path) return '';\n        return `jsonGet(${f}, ${this.stringify(path)}) == ${this.stringify(expected)}`;\n      }\n      case '==':\n      case '!=':\n      case '>':\n      case '>=':\n      case '<':\n      case '<=':\n        return `${f} ${op} ${this.stringify(v)}`;\n      default:\n        // Fail closed: emit empty to force validation to catch it\n        return '';\n    }\n  }\n\n  private stringify(v: any): string {\n    if (v == null || v === '') return 'null';\n    const n = Number(v);\n    if (typeof v === 'number' || (!isNaN(n) && isFinite(n) && String(v).trim() !== '')) return String(n);\n    const s = String(v);\n    if (s.toLowerCase() === 'true') return 'true';\n    if (s.toLowerCase() === 'false') return 'false';\n    return `'${s.replace(/'/g, \"\\\\'\")}'`;\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Optional,\n  \n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormGroup } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { TableConfigToolbarComponent } from './components/table-config-toolbar.component';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatListModule } from '@angular/material/list';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatNativeDateModule } from '@angular/material/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { DragDropModule, CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { RuleEffectsPanelComponent, RuleEffectDefinition, toCellClassAndStyle } from '@praxisui/table-rule-builder';\nimport { DslParser } from '@praxisui/specification';\nimport { TableConfig, ColumnDefinition, FieldDefinition, GenericCrudService, FieldMetadata, DynamicFormService, mapFieldDefinitionsToMetadata, FieldControlType } from '@praxisui/core';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { OperatorsRegistryService } from './services/operators-registry.service';\nimport { getColumnDataType } from '../shared/column-type.util';\nimport { RuleCompilerService, RuleGroup, RuleAtom } from './services/rule-compiler.service';\n\n  type RuleItem = {\n  condition: string;\n  cssClass?: string;\n  style?: Record<string, string>;\n  description?: string;\n  // Full visual effects definition (Panel C)\n  effects?: import('@praxisui/table-rule-builder').RuleEffectDefinition;\n  enabled?: boolean;\n};\n\n@Component({\n  selector: 'table-rules-editor',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    FormsModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    MatButtonModule,\n    MatIconModule,\n    MatButtonToggleModule,\n    MatSlideToggleModule,\n    MatListModule,\n    MatDividerModule,\n    MatTooltipModule,\n    MatDatepickerModule,\n    MatNativeDateModule,\n    MatChipsModule,\n    MatAutocompleteModule,\n    MatMenuModule,\n    MatTabsModule,\n    DragDropModule,\n    DynamicFieldLoaderDirective,\n    MatExpansionModule,\n    TableConfigToolbarComponent,\n    RuleEffectsPanelComponent,\n  ],\n  template: `\n    <div class=\"rules-editor\">\n      <mat-accordion multi>\n        <!-- Block A: Scope & Actions -->\n        <mat-expansion-panel class=\"block\" #blockA=\"matExpansionPanel\" [ngClass]=\"{ 'is-expanded': blockA.expanded }\" [expanded]=\"true\" [attr.role]=\"'region'\" [attr.aria-labelledby]=\"'re-block-a-title'\">\n          <mat-expansion-panel-header class=\"block-header\">\n            <mat-panel-title class=\"block-title\" id=\"re-block-a-title\"><mat-icon>tune</mat-icon> {{ t('Block A Title') }}</mat-panel-title>\n            <mat-panel-description class=\"block-subtitle\">{{ t('Block A Subtitle') }}</mat-panel-description>\n            <pfx-table-config-toolbar\n              (export)=\"onExportRules()\"\n              (import)=\"onImportRules()\"\n              (reset)=\"resetDraft()\"\n              (apply)=\"onApply()\"\n              [applyDisabled]=\"!isValid()\"\n              [exportLabel]=\"t('Export')\"\n              [importLabel]=\"t('Import')\"\n              [resetLabel]=\"t('Reset Draft')\"\n              [resetLabelShort]=\"t('Reset')\"\n              [applyLabel]=\"t('Apply')\"\n            ></pfx-table-config-toolbar>\n          </mat-expansion-panel-header>\n          <div class=\"block-body a-grid\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>{{ t('Scope') }}</mat-label>\n              <mat-select [(ngModel)]=\"scope\" (ngModelChange)=\"onScopeChange($event)\">\n                <mat-option value=\"row\">{{ t('Scope.Row') }}</mat-option>\n                <mat-option value=\"column\">{{ t('Scope.Column') }}</mat-option>\n              </mat-select>\n            </mat-form-field>\n            <mat-form-field *ngIf=\"scope === 'column'\" appearance=\"outline\">\n              <mat-label>{{ t('Scope.Column') }}</mat-label>\n              <mat-select [(ngModel)]=\"selectedColumnField\" (ngModelChange)=\"onColumnSelect($event)\">\n                <mat-option *ngFor=\"let f of columnFields\" [value]=\"f\">{{ f }}</mat-option>\n              </mat-select>\n            </mat-form-field>\n          </div>\n        </mat-expansion-panel>\n\n      <!-- Block B: When / Condition -->\n        <mat-expansion-panel class=\"block\" #blockB=\"matExpansionPanel\" [ngClass]=\"{ 'is-expanded': blockB.expanded }\" [expanded]=\"true\" [attr.role]=\"'region'\" [attr.aria-labelledby]=\"'re-block-b-title'\">\n          <mat-expansion-panel-header class=\"block-header\">\n            <mat-panel-title class=\"block-title\" id=\"re-block-b-title\"><mat-icon>rule</mat-icon> {{ t('Block B Title') }}</mat-panel-title>\n            <mat-panel-description class=\"block-subtitle\">{{ t('Block B Subtitle') }}</mat-panel-description>\n          </mat-expansion-panel-header>\n          <div class=\"block-body\">\n          <mat-tab-group class=\"mode-tabs\" [selectedIndex]=\"dslMode ? 1 : 0\" (selectedIndexChange)=\"dslMode = ($event === 1)\">\n            <mat-tab [label]=\"t('Visual')\">\n              <div class=\"basic-grid rules-grid\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>{{ t('Field') }}</mat-label>\n              <mat-select [(ngModel)]=\"basicField\" (ngModelChange)=\"rebuildCondition()\">\n                <mat-option *ngFor=\"let f of columnFields\" [value]=\"f\">{{ f }}</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <mat-form-field appearance=\"outline\">\n              <mat-label>{{ t('Operator') }}</mat-label>\n              <mat-select [(ngModel)]=\"basicOperator\" (ngModelChange)=\"rebuildCondition()\">\n                <mat-option *ngFor=\"let op of getOperatorsForField(basicField)\" [value]=\"op\">{{ op }}</mat-option>\n              </mat-select>\n            </mat-form-field>\n\n            <!-- Dynamic Value Host (from x-ui metadata) -->\n            <div class=\"value-host\" *ngIf=\"dynamicValueActive; else legacyEditors\">\n              <ng-container\n                dynamicFieldLoader\n                [fields]=\"dynamicValueMetas\"\n                [formGroup]=\"dynamicValueForm\">\n              </ng-container>\n            </div>\n\n            <!-- Fallback legacy editors by type/operator -->\n            <ng-template #legacyEditors>\n              <div class=\"value-host\">\n              <!-- Dynamic value editors by type/operator -->\n          <ng-container [ngSwitch]=\"basicFieldType\">\n            <!-- STRING / DEFAULT -->\n            <ng-container *ngSwitchCase=\"'string'\">\n              <ng-container *ngIf=\"!noValueOperator; else noValueTpl\">\n                <mat-form-field appearance=\"outline\" class=\"full\">\n                  <mat-label>{{ t('Value') }}</mat-label>\n                  <input matInput [(ngModel)]=\"basicValue\" (ngModelChange)=\"rebuildCondition()\" [placeholder]=\"i18nValuePlaceholder\" />\n                </mat-form-field>\n              </ng-container>\n            </ng-container>\n\n            <!-- NUMBER / CURRENCY / PERCENTAGE -->\n            <ng-container *ngSwitchCase=\"'number'\">\n              <ng-container *ngIf=\"basicOperator === 'between'; else numberSingleTpl\">\n                <div class=\"range-grid\">\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>{{ t('Minimum') }}</mat-label>\n                    <input matInput type=\"number\" [(ngModel)]=\"basicMin\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>{{ t('Maximum') }}</mat-label>\n                    <input matInput type=\"number\" [(ngModel)]=\"basicMax\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </div>\n              </ng-container>\n            </ng-container>\n            <ng-container *ngSwitchCase=\"'currency'\">\n              <ng-container *ngTemplateOutlet=\"numberSingleTpl\"></ng-container>\n            </ng-container>\n            <ng-container *ngSwitchCase=\"'percentage'\">\n              <ng-container *ngTemplateOutlet=\"numberSingleTpl\"></ng-container>\n            </ng-container>\n\n            <!-- DATE -->\n            <ng-container *ngSwitchCase=\"'date'\">\n              <ng-container [ngSwitch]=\"basicOperator\">\n                <ng-container *ngSwitchCase=\"'between'\">\n                  <div class=\"range-grid\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>{{ t('Start') }}</mat-label>\n                      <input matInput [matDatepicker]=\"pickerStart\" [(ngModel)]=\"basicDateStart\" (ngModelChange)=\"rebuildCondition()\" />\n                      <mat-datepicker #pickerStart></mat-datepicker>\n                    </mat-form-field>\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>{{ t('End') }}</mat-label>\n                      <input matInput [matDatepicker]=\"pickerEnd\" [(ngModel)]=\"basicDateEnd\" (ngModelChange)=\"rebuildCondition()\" />\n                      <mat-datepicker #pickerEnd></mat-datepicker>\n                    </mat-form-field>\n                  </div>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'is today'\">\n                  <ng-container *ngTemplateOutlet=\"noValueTpl\"></ng-container>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'in last'\">\n                  <div class=\"range-grid\">\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>{{ t('Count') }}</mat-label>\n                      <input matInput type=\"number\" [(ngModel)]=\"basicLastN\" (ngModelChange)=\"rebuildCondition()\" />\n                    </mat-form-field>\n                    <mat-form-field appearance=\"outline\">\n                      <mat-label>{{ t('Unit') }}</mat-label>\n                      <mat-select [(ngModel)]=\"basicLastUnit\" (ngModelChange)=\"rebuildCondition()\">\n                        <mat-option value=\"days\">{{ t('Days') }}</mat-option>\n                        <mat-option value=\"weeks\">{{ t('Weeks') }}</mat-option>\n                        <mat-option value=\"months\">{{ t('Months') }}</mat-option>\n                      </mat-select>\n                    </mat-form-field>\n                  </div>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'weekday is'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Weekdays') }}</mat-label>\n                    <mat-select [(ngModel)]=\"basicWeekdays\" (ngModelChange)=\"rebuildCondition()\" multiple>\n                      <mat-option *ngFor=\"let d of weekdayOptions\" [value]=\"d.value\">{{ d.label }}</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchDefault>\n                  <ng-container *ngTemplateOutlet=\"dateSingleTpl\"></ng-container>\n                </ng-container>\n              </ng-container>\n            </ng-container>\n\n            <!-- BOOLEAN -->\n            <ng-container *ngSwitchCase=\"'boolean'\">\n              <!-- uses operators 'is true' / 'is false' so no value field -->\n              <ng-container *ngTemplateOutlet=\"noValueTpl\"></ng-container>\n            </ng-container>\n\n            <!-- ENUM/LIST -->\n            <ng-container *ngSwitchCase=\"'enum'\">\n              <ng-container *ngIf=\"basicOperator === 'in' || basicOperator === 'not in'; else enumSingleTpl\">\n                <mat-form-field appearance=\"outline\" class=\"full\">\n                  <mat-label>{{ t('Values') }}</mat-label>\n                  <mat-select [(ngModel)]=\"basicEnumValues\" (ngModelChange)=\"rebuildCondition()\" multiple>\n                    <mat-option *ngFor=\"let o of enumOptions\" [value]=\"o.value\">{{ o.label }}</mat-option>\n                  </mat-select>\n                </mat-form-field>\n              </ng-container>\n            </ng-container>\n\n            <!-- ARRAY -->\n            <ng-container *ngSwitchCase=\"'array'\">\n              <ng-container [ngSwitch]=\"basicOperator\">\n                <ng-container *ngSwitchCase=\"'contains any'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('CSV Items') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicListCsv\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"a, b, c\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'contains all'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('CSV All Items') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicListCsv\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"a, b, c\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'length =='\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Length') }}</mat-label>\n                    <input matInput type=\"number\" [(ngModel)]=\"basicLength\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'length >'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Length') }}</mat-label>\n                    <input matInput type=\"number\" [(ngModel)]=\"basicLength\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'length <'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Length') }}</mat-label>\n                    <input matInput type=\"number\" [(ngModel)]=\"basicLength\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchDefault>\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Value') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicValue\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </ng-container>\n              </ng-container>\n            </ng-container>\n\n            <!-- RELATIONAL/LOOKUP -->\n            <ng-container *ngSwitchCase=\"'relational'\">\n              <ng-container [ngSwitch]=\"basicOperator\">\n                <!-- id == (single) -->\n                <ng-container *ngSwitchCase=\"'id =='\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Search') }}</mat-label>\n                    <input matInput [matAutocomplete]=\"relSingleAuto\" (input)=\"onRelSearch($event)\" />\n                    <mat-autocomplete #relSingleAuto=\"matAutocomplete\" (optionSelected)=\"onRelSelectSingle($event.option.value)\">\n                      <mat-option *ngFor=\"let opt of relationalOptions\" [value]=\"opt\">{{ opt.label }} [{{ opt.id }}]</mat-option>\n                    </mat-autocomplete>\n                  </mat-form-field>\n                  <div *ngIf=\"relationalSelected\" class=\"chips\">\n                    <span class=\"chip\">{{ relationalSelected.label }} [{{ relationalSelected.id }}]</span>\n                    <button mat-button (click)=\"clearRelSelection()\">{{ t('Clear') }}</button>\n                  </div>\n                </ng-container>\n                <!-- id in (multi) -->\n                <ng-container *ngSwitchCase=\"'id in'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Search') }}</mat-label>\n                    <input matInput [matAutocomplete]=\"relMultiAuto\" (input)=\"onRelSearch($event)\" />\n                    <mat-autocomplete #relMultiAuto=\"matAutocomplete\" (optionSelected)=\"onRelAddMulti($event.option.value)\">\n                      <mat-option *ngFor=\"let opt of relationalOptions\" [value]=\"opt\">{{ opt.label }} [{{ opt.id }}]</mat-option>\n                    </mat-autocomplete>\n                  </mat-form-field>\n                  <div class=\"chips\" *ngIf=\"relationalSelectedMulti.length\">\n                    <span class=\"chip\" *ngFor=\"let opt of relationalSelectedMulti; let i = index\">\n                      {{ opt.label }} [{{ opt.id }}]\n                      <button mat-icon-button (click)=\"removeRelMulti(i)\" [attr.aria-label]=\"t('Remove')\"><mat-icon>close</mat-icon></button>\n                    </span>\n                  </div>\n                </ng-container>\n                <!-- has property (path) -->\n                <ng-container *ngSwitchCase=\"'has property'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Relational Path') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicRelPath\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"$.id\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchDefault>\n                  <ng-container *ngTemplateOutlet=\"noValueTpl\"></ng-container>\n                </ng-container>\n              </ng-container>\n            </ng-container>\n\n            <!-- JSON -->\n            <ng-container *ngSwitchCase=\"'json'\">\n              <ng-container [ngSwitch]=\"basicOperator\">\n                <ng-container *ngSwitchCase=\"'jsonPath matches'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('JSON Path') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonPath\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"$.a.b[0]\" />\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Pattern') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonPattern\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"^admin$\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'has key'\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Key') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonKey\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"$.meta.etag\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'key =='\">\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('JSON Path') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonPath\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"$.user.name\" />\n                  </mat-form-field>\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('Expected Value') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonExpected\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"Alice\" />\n                  </mat-form-field>\n                </ng-container>\n                <ng-container *ngSwitchDefault>\n                  <mat-form-field appearance=\"outline\" class=\"full\">\n                    <mat-label>{{ t('JSON Path') }}</mat-label>\n                    <input matInput [(ngModel)]=\"basicJsonPath\" (ngModelChange)=\"rebuildCondition()\" />\n                  </mat-form-field>\n                </ng-container>\n              </ng-container>\n            </ng-container>\n\n            <!-- DEFAULT FALLBACK -->\n            <ng-container *ngSwitchDefault>\n              <ng-container *ngIf=\"!noValueOperator; else noValueTpl\">\n                <mat-form-field appearance=\"outline\" class=\"full\">\n                  <mat-label>Valor</mat-label>\n                  <input matInput [(ngModel)]=\"basicValue\" (ngModelChange)=\"rebuildCondition()\" [placeholder]=\"i18nValuePlaceholder\" />\n                </mat-form-field>\n              </ng-container>\n            </ng-container>\n          </ng-container>\n              </div>\n            </ng-template>\n              </div>\n\n          <!-- Group Builder (flat) -->\n          <div class=\"group-card\">\n            <div class=\"group-header\">\n              <h4>{{ t('Group') }}</h4>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>{{ t('Group Operator') }}</mat-label>\n                <mat-select [(ngModel)]=\"draftGroup.op\" (ngModelChange)=\"$any(this).updateDraftFromGroup()\">\n                  <mat-option value=\"AND\">AND</mat-option>\n                  <mat-option value=\"OR\">OR</mat-option>\n                  <mat-option value=\"NOT\">NOT</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <mat-form-field appearance=\"outline\">\n                <mat-label>{{ t('Target Group') }}</mat-label>\n                <mat-select [(ngModel)]=\"activeGroupTarget\">\n                  <mat-option [value]=\"'root'\">{{ t('Root Group') }}</mat-option>\n                  <mat-option *ngFor=\"let g of draftGroup.groups; let gi = index\" [value]=\"gi\">{{ t('Subgroup') }} #{{ gi + 1 }}</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <span class=\"spacer\"></span>\n              <mat-button-toggle-group class=\"group-actions\" multiple>\n                <mat-button-toggle (click)=\"$any(this).onAddOrUpdateAtom()\" [disabled]=\"!$any(this).canBuildAtom()\" [attr.aria-label]=\"editAtomIndex === -1 ? t('Add Condition') : t('Update Condition')\">\n                  <mat-icon>add</mat-icon>\n                  {{ editAtomIndex === -1 ? t('Add Condition') : t('Update Condition') }}\n                </mat-button-toggle>\n                <mat-button-toggle *ngIf=\"editAtomIndex !== -1\" (click)=\"$any(this).resetAtomEdit()\" [attr.aria-label]=\"t('Cancel')\">\n                  <mat-icon>close</mat-icon>\n                  {{ t('Cancel') }}\n                </mat-button-toggle>\n                <mat-button-toggle (click)=\"$any(this).clearGroup()\" [disabled]=\"!draftGroup.conditions.length\" [attr.aria-label]=\"t('Clear Group')\">\n                  <mat-icon>backspace</mat-icon>\n                  {{ t('Clear Group') }}\n                </mat-button-toggle>\n                <mat-button-toggle (click)=\"$any(this).addSubgroup()\" [attr.aria-label]=\"t('Add Subgroup')\">\n                  <mat-icon>control_point_duplicate</mat-icon>\n                  {{ t('Add Subgroup') }}\n                </mat-button-toggle>\n              </mat-button-toggle-group>\n            </div>\n            <div cdkDropList class=\"group-list\" (cdkDropListDropped)=\"$any(this).onDropCondition($event)\">\n              <div class=\"group-item\" *ngFor=\"let a of draftGroup.conditions; let i = index\" cdkDrag>\n                <div class=\"item-main\">\n                  <div class=\"drag-handle\" cdkDragHandle [attr.aria-label]=\"t('Reorder')\" matTooltip=\"{{ t('Reorder') }}\"><mat-icon>drag_indicator</mat-icon></div>\n                  <div class=\"expr\" [matTooltip]=\"$any(this).getAtomPreview(a)\">{{ $any(this).getAtomPreview(a) }}</div>\n                </div>\n                <div class=\"item-actions\">\n                  <button mat-icon-button (click)=\"$any(this).editAtom(i)\" [attr.aria-label]=\"t('Edit')\" matTooltip=\"{{ t('Edit') }}\"><mat-icon>edit</mat-icon></button>\n                  <button mat-icon-button color=\"warn\" (click)=\"$any(this).removeAtom(i)\" [attr.aria-label]=\"t('Remove')\" matTooltip=\"{{ t('Remove') }}\"><mat-icon>delete</mat-icon></button>\n                </div>\n              </div>\n            </div>\n            <!-- Subgroups summary -->\n            <div class=\"subgroups\" *ngIf=\"draftGroup.groups?.length\">\n              <div class=\"subgroup\" *ngFor=\"let sg of draftGroup.groups; let si = index\">\n                <div class=\"sub-header\">\n                  <span class=\"chip\">{{ t('Subgroup') }} #{{ si + 1 }}</span>\n                  <mat-form-field appearance=\"outline\">\n                    <mat-label>{{ t('Group Operator') }}</mat-label>\n                    <mat-select [(ngModel)]=\"sg.op\" (ngModelChange)=\"$any(this).updateDraftFromGroup()\">\n                      <mat-option value=\"AND\">AND</mat-option>\n                      <mat-option value=\"OR\">OR</mat-option>\n                      <mat-option value=\"NOT\">NOT</mat-option>\n                    </mat-select>\n                  </mat-form-field>\n                  <span class=\"spacer\"></span>\n                  <button mat-button color=\"warn\" (click)=\"$any(this).removeSubgroup(si)\" [attr.aria-label]=\"t('Remove Subgroup')\">{{ t('Remove Subgroup') }}</button>\n                </div>\n                <div class=\"sub-body\">\n                  <div class=\"expr\">{{ $any(this).getGroupPreview(sg) }}</div>\n                  <div class=\"meta\">\n                    <span class=\"chip\">{{ (sg.conditions.length || 0) }} {{ t('Conditions') }}</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class=\"group-footer\" *ngIf=\"draftGroup.conditions.length\">\n              <span class=\"chip\">{{ draftGroup.conditions.length }} {{ t('Conditions') }}</span>\n              <span class=\"chip\">{{ t('Group') }}: {{ draftGroup.op }}</span>\n            </div>\n          </div>\n\n            </mat-tab>\n            <mat-tab [label]=\"t('DSL')\">\n          <div class=\"dsl-box\">\n            <mat-form-field class=\"full\" appearance=\"outline\">\n              <mat-label>{{ t('Expression (DSL)') }}</mat-label>\n              <textarea matInput rows=\"3\" [(ngModel)]=\"draftCondition\" (ngModelChange)=\"validateDraft()\" placeholder=\"ex.: contains(status, 'Ativo') and price >= 100\"></textarea>\n              <mat-hint *ngIf=\"dslErrors.length === 0\">OK</mat-hint>\n            </mat-form-field>\n            <div *ngIf=\"dslErrors.length\" class=\"errors\" aria-live=\"assertive\" role=\"alert\">\n              <div><strong>{{ t('Expression Errors') }}:</strong></div>\n              <ul>\n                <li *ngFor=\"let e of dslErrors\">{{ e }}</li>\n              </ul>\n            </div>\n          </div>\n            </mat-tab>\n          </mat-tab-group>\n          </div>\n        </mat-expansion-panel>\n\n      <!-- Templates reused -->\n          <ng-template #numberSingleTpl>\n            <ng-container *ngIf=\"basicOperator === 'in' || basicOperator === 'not in'; else numberOneTpl\">\n              <mat-form-field appearance=\"outline\" class=\"full\">\n                <mat-label>{{ t('CSV Placeholder') }}</mat-label>\n                <input matInput [(ngModel)]=\"basicListCsv\" (ngModelChange)=\"rebuildCondition()\" placeholder=\"10, 20, 30\" />\n              </mat-form-field>\n            </ng-container>\n          </ng-template>\n          <ng-template #numberOneTpl>\n            <mat-form-field appearance=\"outline\" class=\"full\">\n              <mat-label>{{ t('Value') }}</mat-label>\n              <input matInput type=\"number\" [(ngModel)]=\"basicValue\" (ngModelChange)=\"rebuildCondition()\" />\n            </mat-form-field>\n          </ng-template>\n\n          <ng-template #dateSingleTpl>\n            <mat-form-field appearance=\"outline\" class=\"full\">\n              <mat-label>{{ t('Date') }}</mat-label>\n              <input matInput [matDatepicker]=\"picker\" [(ngModel)]=\"basicDate\" (ngModelChange)=\"rebuildCondition()\" />\n              <mat-datepicker #picker></mat-datepicker>\n            </mat-form-field>\n          </ng-template>\n\n          <ng-template #enumSingleTpl>\n            <mat-form-field appearance=\"outline\" class=\"full\">\n              <mat-label>{{ t('Value') }}</mat-label>\n              <mat-select [(ngModel)]=\"basicEnumValue\" (ngModelChange)=\"rebuildCondition()\">\n                <mat-option *ngFor=\"let o of enumOptions\" [value]=\"o.value\">{{ o.label }}</mat-option>\n              </mat-select>\n            </mat-form-field>\n          </ng-template>\n\n          <ng-template #noValueTpl>\n            <div class=\"no-value-hint\">{{ t('No Value Needed') }}</div>\n          </ng-template>\n\n      <!-- Block C: Effects -->\n      <mat-expansion-panel class=\"block\" #blockC=\"matExpansionPanel\" [ngClass]=\"{ 'is-expanded': blockC.expanded }\" [expanded]=\"true\" [attr.role]=\"'region'\" [attr.aria-labelledby]=\"'re-block-c-title'\">\n        <mat-expansion-panel-header class=\"block-header\">\n          <mat-panel-title class=\"block-title\" id=\"re-block-c-title\"><mat-icon>auto_fix_high</mat-icon> {{ t('Block C Title') }}</mat-panel-title>\n          <mat-panel-description class=\"block-subtitle\">{{ t('Block C Subtitle') }}</mat-panel-description>\n          <span class=\"spacer\"></span>\n          <button mat-stroked-button color=\"primary\" (click)=\"addOrUpdateRule()\" [disabled]=\"!canCommitDraft()\" [attr.aria-label]=\"editIndex === -1 ? t('Add Rule') : t('Update Rule')\">{{ editIndex === -1 ? t('Add Rule') : t('Update Rule') }}</button>\n          <button *ngIf=\"editIndex !== -1\" mat-button (click)=\"resetDraft()\" [attr.aria-label]=\"t('Cancel Edit')\">{{ t('Cancel Edit') }}</button>\n        </mat-expansion-panel-header>\n        <div class=\"block-body effects-grid\">\n          <!-- New visual rule effects panel (standalone) -->\n          <div style=\"grid-column: 1 / -1;\">\n            <praxis-rule-effects-panel\n              [scope]=\"scope\"\n              [value]=\"effectsValue\"\n              (valueChange)=\"onEffectsChange($event)\"\n            ></praxis-rule-effects-panel>\n          </div>\n          <!--\n          <mat-form-field appearance=\"outline\" *ngIf=\"false\">\n            <mat-label>{{ t('CSS Class') }}</mat-label>\n            <input matInput [(ngModel)]=\"draftCssClass\" (ngModelChange)=\"onDraftChange()\" placeholder=\"ex.: pfx-row--warn\" />\n          </mat-form-field>\n          <mat-form-field appearance=\"outline\" *ngIf=\"false\">\n            <mat-label>{{ t('Style') }}</mat-label>\n            <input matInput [(ngModel)]=\"draftStyleText\" (ngModelChange)=\"onDraftChange()\" placeholder=\"ex.: color: #d00; background-color: #fee;\" />\n          </mat-form-field>\n          -->\n          \n        </div>\n      </mat-expansion-panel>\n\n      <!-- Block D: Rules List -->\n      <mat-expansion-panel class=\"block\" #blockD=\"matExpansionPanel\" [ngClass]=\"{ 'is-expanded': blockD.expanded }\" [expanded]=\"true\" [attr.role]=\"'region'\" [attr.aria-labelledby]=\"'re-block-d-title'\">\n        <mat-expansion-panel-header class=\"block-header\">\n          <mat-panel-title class=\"block-title\" id=\"re-block-d-title\"><mat-icon>list_alt</mat-icon> {{ t('Block D Title') }} ({{ currentRules.length }})</mat-panel-title>\n          <mat-panel-description class=\"block-subtitle\">{{ t('Block D Subtitle') }}</mat-panel-description>\n          <span class=\"spacer\"></span>\n        </mat-expansion-panel-header>\n        <div class=\"block-body rules-list\">\n          <div class=\"rules-nav-chips\" *ngIf=\"currentRules?.length\">\n            <mat-chip-listbox [attr.aria-label]=\"t('Rules')\">\n              <mat-chip-option *ngFor=\"let r of currentRules; let i = index\" (click)=\"editRule(i)\" [selected]=\"editIndex === i\" [attr.aria-label]=\"t('Rule') + ' ' + (i+1)\">\n                {{ t('Rule') }} {{ i + 1 }}\n              </mat-chip-option>\n              <mat-chip (click)=\"resetDraft()\" color=\"primary\" selected>{{ t('Add Rule') }}</mat-chip>\n            </mat-chip-listbox>\n          </div>\n          <mat-list>\n            <mat-list-item *ngFor=\"let r of currentRules; let i = index\" class=\"rule-item\">\n              <div class=\"rule-content\">\n                <div class=\"rule-main\">\n                  <div class=\"rule-cond\" [matTooltip]=\"r.condition\">{{ r.condition }}</div>\n                  <div class=\"rule-effects\">\n                    <span *ngIf=\"r.cssClass\" class=\"chip\">{{ t('CSS Class') }}: {{ r.cssClass }}</span>\n                    <span *ngIf=\"r.style && objectKeys(r.style).length\" class=\"chip\">{{ t('Style') }}: {{ objectKeys(r.style).length }}</span>\n                    <span *ngIf=\"r.effects?.iconBadge?.icon\" class=\"chip\">{{ t('Icon') }}: {{ r.effects?.iconBadge?.icon }}</span>\n                    <span *ngIf=\"r.effects?.iconBadge?.badgeText\" class=\"chip\">{{ t('Badge') }}: {{ r.effects?.iconBadge?.badgeText }}</span>\n                    <span *ngIf=\"r.effects?.tooltip?.text\" class=\"chip\">{{ t('Tooltip') }}</span>\n                    <span *ngIf=\"r.effects?.animation?.type\" class=\"chip\">{{ t('Animation') }}: {{ r.effects?.animation?.type }}</span>\n                  </div>\n                </div>\n                <div class=\"rule-actions\">\n                  <mat-slide-toggle [(ngModel)]=\"r.enabled\" (ngModelChange)=\"onRuleToggle()\">{{ t('Active') }}</mat-slide-toggle>\n                  <button mat-icon-button (click)=\"duplicateRule(i)\" [attr.aria-label]=\"t('Duplicate')\" matTooltip=\"{{ t('Duplicate') }}\"><mat-icon>content_copy</mat-icon></button>\n                  <button mat-icon-button (click)=\"editRule(i)\" [attr.aria-label]=\"t('Edit')\" matTooltip=\"{{ t('Edit') }}\"><mat-icon>edit</mat-icon></button>\n                  <button mat-icon-button color=\"warn\" (click)=\"removeRule(i)\" [attr.aria-label]=\"t('Remove')\" matTooltip=\"{{ t('Remove') }}\"><mat-icon>delete</mat-icon></button>\n                </div>\n              </div>\n            </mat-list-item>\n          </mat-list>\n        </div>\n      </mat-expansion-panel>\n\n      \n      </mat-accordion>\n    </div>\n  `,\n  styles: [\n    `\n      .rules-editor { display: flex; flex-direction: column; gap: 12px; }\n      .block { border: 1px solid var(--mat-sys-outline-variant); border-radius: 12px; background: linear-gradient(180deg, var(--mat-sys-surface-container-low), var(--mat-sys-surface)); backdrop-filter: saturate(140%) blur(2px); transition: all .2s ease; }\n      .block.is-expanded { box-shadow: 0 6px 18px rgba(0,0,0,.08); }\n      .block-header { display:flex; align-items:center; gap: 8px; padding: 6px 12px; min-height: 40px; background: linear-gradient(180deg, var(--mat-sys-surface-container-low), var(--mat-sys-surface)); border-bottom: 1px solid var(--mat-sys-outline-variant); transition: all .2s ease; }\n      .block-title { font-weight: 600; font-size: .95rem; letter-spacing: .5px; display:flex; align-items:center; gap: 6px; }\n      .block-subtitle { opacity: .7; font-size: .8rem; margin-left: 8px; }\n      .block-body { padding: 12px; display: flex; flex-direction: column; gap: 12px; }\n      .a-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }\n      .mode-tabs { --mat-tab-header-inactive-label-text-color: var(--mat-sys-on-surface-variant); }\n      .basic-grid { display: grid; grid-template-columns: repeat(3, minmax(180px, 1fr)); gap: 12px; align-items: start; }\n      .rules-grid mat-form-field:nth-of-type(1) { grid-column: 1; }\n      .rules-grid mat-form-field:nth-of-type(2) { grid-column: 2; }\n      .rules-grid .value-host { grid-column: 3; min-width: 0; }\n      @media (max-width: 991.98px) { .basic-grid { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); } .rules-grid .value-host { grid-column: 1 / -1; } }\n      .basic-grid .mat-mdc-form-field .mdc-floating-label { font-size: .85rem; }\n      .spacer { flex: 1; }\n      .effects-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }\n      .quick-effects { display: block; }\n      .qe-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px; align-items: start; }\n      .qe-group { display:flex; flex-direction: column; gap: 6px; }\n      .qe-title { font-size: .85rem; opacity: .8; }\n      .qe-inline { display:flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n      .qe-presets { display: grid; grid-template-columns: repeat(auto-fill, minmax(32px, 1fr)); gap: 8px; align-items: center; max-width: 280px; }\n      .qe-presets .mat-mdc-icon-button.mat-mdc-button-base { justify-self: start; }\n      .qe-presets .mat-stroked-button { grid-column: 1 / -1; justify-self: start; }\n      /* compact, consistent icons */\n      .qe-inline .mat-mdc-icon-button.mat-mdc-button-base { width: 32px; height: 32px; padding: 0; }\n      .qe-inline .mat-mdc-icon-button .mat-icon { font-size: 18px; line-height: 32px; width: 18px; height: 18px; transition: all .2s ease; }\n      .qe-label { display:flex; gap: 6px; align-items: center; font-size: .85rem; }\n      .qe-number { width: 84px; padding: 6px; }\n      .qe-suffix { opacity: .7; }\n      .qe-select { width: 120px; }\n      .qe-text { min-width: 160px; padding: 6px; }\n      .qe-toggle-group { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n      .qe-desc { font-size: .8rem; opacity: .75; }\n      .effects-preview { grid-column: 1 / -1; }\n      .effects-preview-box { display: flex; align-items: center; gap: 8px; border: 1px dashed var(--mat-sys-outline-variant); border-radius: 6px; padding: 6px 8px; background: var(--mat-sys-surface-container-low); width: 100%; min-height: 36px; transition: all .2s ease; }\n      .pfx-badge-preview { display:inline-flex; align-items:center; gap:4px; padding: 2px 6px; border-radius: 999px; font-size: 12px; line-height: 16px; transition: all .2s ease; }\n      .pfx-badge-preview.v-filled.c-primary { background: rgba(63,81,181,.12); color: #3f51b5; }\n      .pfx-badge-preview.v-filled.c-accent { background: rgba(255,64,129,.12); color: #ff4081; }\n      .pfx-badge-preview.v-filled.c-warn { background: rgba(244,67,54,.12); color: #f44336; }\n      .pfx-badge-preview.v-outlined { border: 1px solid var(--mat-sys-outline-variant); }\n      .pfx-badge-preview.v-soft { background: var(--mat-sys-surface-container-highest); }\n      .dsl-box .full { width: 100%; }\n      .range-grid { display: grid; grid-template-columns: repeat(2, minmax(160px, 1fr)); gap: 12px; align-items: center; }\n      .no-value-hint { align-self: center; opacity: .7; font-size: .85rem; }\n      .errors { background: #fff4e5; color: #8a4b00; padding: 8px 12px; border: 1px solid #f1c27d; border-radius: 6px; }\n      .group-card { border: 1px solid var(--mat-sys-outline-variant); padding: 8px 12px; border-radius: 10px; display: flex; flex-direction: column; gap: 8px; background: var(--mat-sys-surface-container-lowest); transition: all .2s ease; }\n      .group-header { display:flex; gap: 8px; align-items: center; }\n      .group-actions { display:flex; gap: 8px; align-items:center; }\n      .group-list { display: grid; gap: 6px; }\n      .group-item { display:flex; align-items:center; justify-content: space-between; gap: 8px; padding: 6px 8px; border: 1px solid var(--mat-sys-outline-variant); border-radius: 6px; background: var(--mat-sys-surface-container-low); transition: all .2s ease; }\n      .item-main { display: flex; align-items: center; gap: 8px; }\n      .drag-handle { cursor: grab; opacity: .7; }\n      .expr { font-family: monospace; font-size: .85rem; }\n      .group-footer { display:flex; gap: 8px; align-items: center; }\n      .subgroups { display: grid; gap: 8px; margin-top: 8px; }\n      .subgroup { border: 1px dashed var(--mat-sys-outline-variant); border-radius: 6px; padding: 6px 8px; background: var(--mat-sys-surface-container-low); transition: all .2s ease; }\n      .sub-header { display:flex; align-items:center; gap: 8px; }\n      .sub-body { display:flex; align-items:center; justify-content: space-between; gap: 12px; }\n      .rules-list .list-header { padding: 4px 0; }\n      .rule-item .rule-content { display: flex; gap: 12px; align-items: center; justify-content: space-between; width: 100%; }\n      .rule-main { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n      .rule-cond { font-family: monospace; font-size: .9rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }\n      .chip { display: inline-block; padding: 2px 6px; border: 1px solid var(--mat-sys-outline-variant); border-radius: 10px; font-size: 12px; margin-right: 6px; }\n      .rule-actions { display: flex; gap: 6px; align-items: center; }\n      .preview { background: var(--mat-sys-surface-container-low); padding: 8px 12px; border: 1px solid var(--mat-sys-outline-variant); border-radius: 6px; }\n      .preview-rows { display: grid; gap: 6px; }\n      .p-row { display:flex; align-items:center; gap: 8px; }\n      .row-title { width: 72px; opacity: .7; }\n      .row-effects { display:flex; gap: 6px; flex-wrap: wrap; }\n      .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }\n      .rules-nav-chips { margin-bottom: 6px; }\n    `,\n  ],\n})\nexport class TableRulesEditorComponent implements OnChanges {\n  @Input() config: TableConfig = { columns: [] } as any;\n  \n  // Optional metadata for column-first UX enrichment\n  @Input() resourcePath?: string;\n  @Input() fields?: FieldDefinition[] | null = null;\n  @Input() i18nRules?: Partial<Record<string, string>>;\n  @Output() configChange = new EventEmitter<TableConfig>();\n\n  scope: 'row' | 'column' = 'row';\n  selectedColumnField: string | null = null;\n\n  draftCondition = '';\n  draftCssClass = '';\n  draftStyleText = '';\n  dslMode = false;\n  dslErrors: string[] = [];\n\n  editIndex = -1;\n\n  get currentRules(): RuleItem[] { return this.scope === 'row' ? this.rulesRow : this.rulesColumn; }\n  set currentRules(v: RuleItem[]) { if (this.scope === 'row') this.rulesRow = v; else this.rulesColumn = v; }\n\n  rulesRow: RuleItem[] = [];\n  rulesColumn: RuleItem[] = [];\n\n  \n  private parser = new DslParser<any>();\n\n  objectKeys = Object.keys;\n\n  // Dynamic Value Host (Reactive)\n  dynamicValueForm: FormGroup = new FormGroup({});\n  dynamicValueMetas: FieldMetadata[] = [];\n  // Effects Panel (C) state\n  effectsValue?: RuleEffectDefinition;\n  dynamicValueActive = false;\n  private dynamicValueSub?: any;\n\n  // Derived UI state for template (avoid direct method calls in template)\n  public basicFieldType: 'enum' | 'array' | 'json' | 'relational' | 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom' = 'string';\n  public noValueOperator: boolean = false;\n  public i18nValuePlaceholder: string = '';\n  public enumOptions: Array<{ value: any; label: string }> = [];\n\n  private updateDerivedUiProps(): void {\n    try {\n      this.basicFieldType = this.getFieldType(this.basicField);\n    } catch { this.basicFieldType = 'string'; }\n    try {\n      this.noValueOperator = this.isNoValueOperator(this.basicOperator);\n    } catch { this.noValueOperator = false; }\n    try {\n      this.i18nValuePlaceholder = this.getI18nValuePlaceholder();\n    } catch { this.i18nValuePlaceholder = 'valor'; }\n    try {\n      this.enumOptions = this.getEnumOptions(this.basicField);\n    } catch { this.enumOptions = []; }\n  }\n\n  // ---------------- Debug logging ----------------\n  /** Enable verbose console logging for debugging value editor behavior */\n  @Input() debugLogs = true; // allow enabling from parent if packaged as lib\n  @Input() debugLevel: 'log' | 'info' | 'debug' = 'log';\n  private dbg(...args: any[]): void {\n    if (!this.debugLogs) return;\n    try {\n      const prefix = '[TableRulesEditor]';\n      if (this.debugLevel === 'info' && console.info) console.info(prefix, ...args);\n      else if (this.debugLevel === 'debug' && console.debug) console.debug(prefix, ...args);\n      else console.log(prefix, ...args);\n    } catch {}\n  }\n\n  /** Log a summary table of field metadata and column info for diagnostics */\n  private logFieldMetasContext(): void {\n    try {\n      const names = this.columnFields;\n      const rows = names.map((name) => {\n        const col = (this.config?.columns || []).find((c) => c.field === name) as any;\n        const fd = (this.fields || [])?.find((f) => f.name === name) as any;\n        const meta = fd ? (mapFieldDefinitionsToMetadata([fd])[0] as any) : null;\n        const valueMapKeys = col?.valueMapping ? Object.keys(col.valueMapping) : [];\n        const options = fd?.options || meta?.options;\n        const optionsCount = Array.isArray(options) ? options.length : 0;\n        const optionsPreview = Array.isArray(options) ? options.slice(0, 3) : undefined;\n        return {\n          name,\n          colType: col?.type || col?._originalApiType,\n          hasValueMapping: !!col?.valueMapping,\n          valueMapSize: valueMapKeys?.length ?? 0,\n          fdType: fd?.type,\n          fdControl: fd?.controlType,\n          fdMultiple: !!fd?.multiple,\n          fdResourcePath: fd?.resourcePath || fd?.endpoint,\n          metaControl: meta?.controlType,\n          metaSearchable: !!meta?.searchable,\n          metaResourcePath: meta?.resourcePath,\n          optionLabelKey: meta?.optionLabelKey || fd?.optionLabelKey,\n          optionValueKey: meta?.optionValueKey || fd?.optionValueKey,\n          optionsCount,\n          optionsPreview,\n        };\n      });\n      this.dbg('fieldMetaCatalog', rows);\n      try { console.table?.(rows); } catch {}\n    } catch (e) {\n      this.dbg('logFieldMetasContext:error', e);\n    }\n  }\n\n  /** Log a focused view for a single field */\n  private logSingleFieldMeta(fieldName: string): void {\n    const col = (this.config?.columns || []).find((c) => c.field === fieldName) as any;\n    const fd = (this.fields || [])?.find((f) => f.name === fieldName) as any;\n    const meta = fd ? (mapFieldDefinitionsToMetadata([fd])[0] as any) : null;\n    const enumOpts = this.getEnumOptions(fieldName);\n    this.dbg('fieldMeta:selected', {\n      name: fieldName,\n      type: this.getFieldType(fieldName),\n      operators: this.getOperatorsForField(fieldName),\n      column: {\n        type: col?.type || col?._originalApiType,\n        hasValueMapping: !!col?.valueMapping,\n        valueMapSize: col?.valueMapping ? Object.keys(col.valueMapping).length : 0,\n      },\n      fieldDef: fd ? {\n        type: fd?.type,\n        controlType: fd?.controlType,\n        multiple: !!fd?.multiple,\n        resourcePath: fd?.resourcePath || fd?.endpoint,\n        optionsCount: Array.isArray(fd?.options) ? fd.options.length : 0,\n      } : null,\n      meta: meta ? {\n        controlType: meta?.controlType,\n        resourcePath: meta?.resourcePath,\n        searchable: !!meta?.searchable,\n        optionLabelKey: meta?.optionLabelKey,\n        optionValueKey: meta?.optionValueKey,\n        optionsCount: Array.isArray(meta?.options) ? meta.options.length : 0,\n      } : null,\n      enumOptionsPreview: enumOpts?.slice(0, 5),\n    });\n  }\n\n  private logFieldChoices(): void {\n    this.dbg('fieldChoices:update', { choices: this.columnFields });\n  }\n\n  // Default i18n dictionary (pt-BR)\n  i18nDefault: Record<string, string> = {\n    'Block A Title': 'A. Escopo e Ações',\n    'Block B Title': 'B. Quando',\n    'Block C Title': 'C. Efeitos',\n    'Block D Title': 'D. Regras',\n    'Block E Title': 'E. Pré-visualização',\n    'Block A Subtitle': 'Selecione o escopo e ações',\n    'Block B Subtitle': 'Defina a condição da regra',\n    'Block C Subtitle': 'Configure estilos e elementos visuais',\n    'Block D Subtitle': 'Gerencie a lista de regras',\n    'Block E Subtitle': 'Pré-visualize com dados de exemplo',\n    'Visual': 'Visual',\n    'DSL': 'DSL',\n    'OfWord': 'de',\n    'Reorder': 'Reordenar',\n    'Scope': 'Escopo',\n    'Scope.Row': 'Linha (global)',\n    'Scope.Column': 'Coluna',\n    'Field': 'Campo',\n    'Operator': 'Operador',\n    'Value': 'Valor',\n    'Group': 'Grupo de Condições',\n    'Conditions': 'condição(ões)',\n    'Group Operator': 'Operador do Grupo',\n    'Add Condition': 'Adicionar condição',\n    'Update Condition': 'Atualizar condição',\n    'Add Rule': 'Adicionar Regra',\n    'Update Rule': 'Atualizar Regra',\n    'Cancel': 'Cancelar',\n    'Cancel Edit': 'Cancelar edição',\n    'Clear Group': 'Limpar grupo',\n    'Test': 'Testar',\n    'Preview': 'Pré-visualizar',\n    'Preview Header': 'Pré-visualização',\n    'CSS Class': 'Classe CSS',\n    'Style': 'Estilo',\n    'Description': 'Descrição',\n    'Apply': 'Aplicar',\n    'Export': 'Exportar',\n    'Import': 'Importar',\n    'Advanced Mode (DSL)': 'Modo avançado (DSL)',\n    'Expression (DSL)': 'Expressão (DSL)',\n    'Expression Errors': 'Erros na expressão',\n    'No Effect': '(sem efeito)',\n    'No Value Needed': 'Este operador não requer valor.',\n    'Values': 'Valores',\n    'Date': 'Data',\n    'Start': 'Início',\n    'End': 'Fim',\n    'Minimum': 'Mínimo',\n    'Maximum': 'Máximo',\n    'CSV Placeholder': 'Lista (separado por vírgula)',\n    'CSV Items': 'Itens (CSV)',\n    'CSV All Items': 'Todos os itens (CSV)',\n    'Length': 'Tamanho',\n    'Count': 'Quantidade',\n    'Unit': 'Unidade',\n    'Days': 'Dias',\n    'Weeks': 'Semanas',\n    'Months': 'Meses',\n    'Weekdays': 'Dias da semana',\n    'JSON Path': 'Caminho JSON',\n    'Pattern': 'Padrão',\n    'Key': 'Chave',\n    'Expected Value': 'Valor esperado',\n    'Value Placeholder': 'valor',\n    'Affected Lines Summary': 'linhas afetadas',\n    'Duplicate': 'Duplicar',\n    'Edit': 'Editar',\n    'Remove': 'Remover',\n    'Reset Draft': 'Redefinir rascunho',\n    'Reset': 'Redefinir',\n    'Active': 'Ativo',\n    'Row': 'Linha',\n    'Rule': 'Regra',\n    'Rules': 'Regras',\n    'Search': 'Buscar',\n    'Clear': 'Limpar',\n    'Relational Path': 'Caminho relacional',\n    'Target Group': 'Grupo alvo',\n    'Root Group': 'Grupo raiz',\n    'Subgroup': 'Subgrupo',\n    'Add Subgroup': 'Adicionar subgrupo',\n    'Remove Subgroup': 'Remover subgrupo',\n    // Quick effects\n    'Presets': 'Presets',\n    'Preset.Success': 'Sucesso',\n    'Preset.Warning': 'Aviso',\n    'Preset.Error': 'Erro',\n    'Preset.Info': 'Info',\n    'Clear Effects': 'Limpar efeitos',\n    'Text Style': 'Estilo do texto',\n    'Text Presets': 'Presets de texto',\n    'Text Toolbar': 'Barra de texto',\n    'Text Presets Toolbar': 'Barra de presets de texto',\n    'Feedback Presets Toolbar': 'Presets de feedback',\n    'Text Effects Description': 'Define cor, peso e transformações do texto aplicadas quando a condição for verdadeira.',\n    'Muted': 'Suave',\n    'Subtle': 'Sutil',\n    'Emphasis': 'Ênfase',\n    'Strikethrough': 'Tachado',\n    'Uppercase': 'Maiúsculas',\n    'Lowercase': 'Minúsculas',\n    'Capitalize': 'Capitalizar',\n    'Small': 'Pequeno',\n    'Large': 'Grande',\n    'Decrease Size': 'Diminuir tamanho',\n    'Increase Size': 'Aumentar tamanho',\n    'Reset Text': 'Resetar texto',\n    'Bold': 'Negrito',\n    'Italic': 'Itálico',\n    'Underline': 'Sublinhado',\n    'Colors': 'Cores',\n    'Text Color': 'Cor do texto',\n    'Background Color': 'Cor de fundo',\n    'Font Size': 'Tamanho da fonte',\n    'Border': 'Borda',\n    'Icon': 'Ícone',\n    'Icon Name': 'Nome do ícone',\n    'Badge': 'Badge',\n    'Image': 'Imagem',\n    'Text': 'Texto',\n    'Alt': 'Alt',\n    'Order': 'Ordem',\n    'Value Position': 'Posição do valor',\n    'Before': 'Antes',\n    'Between 1': 'Entre (após o 1º)',\n    'Between 2': 'Entre (após o 2º)',\n    'After': 'Depois',\n    'Hidden': 'Oculto',\n    'Visual Order': 'Ordem dos visuais',\n    'Order.IconBadgeImage': 'Ícone → Badge → Imagem',\n    'Order.IconImageBadge': 'Ícone → Imagem → Badge',\n    'Order.BadgeIconImage': 'Badge → Ícone → Imagem',\n    'Order.BadgeImageIcon': 'Badge → Imagem → Ícone',\n    'Order.ImageIconBadge': 'Imagem → Ícone → Badge',\n    'Order.ImageBadgeIcon': 'Imagem → Badge → Ícone',\n    'More Options': 'Mais opções',\n    'Preset.IconValue': 'Ícone + Valor',\n    'Preset.ValueIcon': 'Valor + Ícone',\n    'Preset.IconValueImage': 'Ícone + Valor + Imagem',\n    'Preset.ImageValueIcon': 'Imagem + Valor + Ícone',\n    'Preset.BadgeValue': 'Badge + Valor',\n    'Preset.ValueBadge': 'Valor + Badge',\n    'Preset.ValueOnly': 'Apenas valor',\n    'TT.IconValue': 'Ícone + Valor: mostra o ícone seguido do texto da célula',\n    'TT.ValueIcon': 'Valor + Ícone: mostra o texto seguido do ícone',\n    'TT.IconValueImage': 'Ícone + Valor + Imagem: insere o valor entre ícone e imagem',\n    'TT.ImageValueIcon': 'Imagem + Valor + Ícone: insere o valor entre imagem e ícone',\n    'TT.BadgeValue': 'Badge + Valor: exibe badge seguido do valor',\n    'TT.ValueBadge': 'Valor + Badge: exibe valor seguido de badge',\n    'TT.ValueOnly': 'Apenas valor: oculta ícones/badges/imagens',\n    'Quick.ValueFirst': 'Valor primeiro',\n    'Quick.ValueAfterFirst': 'Valor após 1º',\n    'Quick.ValueAfterSecond': 'Valor após 2º',\n    'Quick.ValueLast': 'Valor no final',\n    'Quick.ValueHidden': 'Valor oculto',\n    'Layout': 'Layout',\n    'Gap': 'Espaçamento',\n    'Align': 'Alinhar',\n    'Wrap': 'Quebra linha',\n    'Ellipsis': 'Reticências',\n  };\n\n  t(key: string): string { return (this.i18nRules && this.i18nRules[key]) || this.i18nDefault[key] || key; }\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    private registry: OperatorsRegistryService,\n    private compiler: RuleCompilerService,\n    private dynamicForm: DynamicFormService,\n    @Optional() private crud?: GenericCrudService<any>,\n  ) {}\n\n  ngOnInit(): void {\n    this.initFromConfig();\n    if (this.scope === 'column' && !this.selectedColumnField && this.columnFields.length) this.selectedColumnField = this.columnFields[0];\n    this.updateDerivedUiProps();\n    this.dbg('ngOnInit', {\n      columnFields: this.columnFields,\n      hasFieldsMeta: Array.isArray(this.fields) ? this.fields.length : 0,\n      scope: this.scope,\n      selectedColumnField: this.selectedColumnField,\n    });\n    this.logFieldChoices();\n    this.logFieldMetasContext();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['config'] || changes['fields']) {\n      this.dbg('ngOnChanges', {\n        configChanged: !!changes['config'],\n        fieldsChanged: !!changes['fields'],\n        fieldsCount: Array.isArray(this.fields) ? this.fields.length : 0,\n      });\n      this.logFieldChoices();\n      this.logFieldMetasContext();\n    }\n  }\n\n  // Derived data\n  get columnFields(): string[] {\n    return (this.config?.columns || []).map((c) => c.field);\n  }\n\n  getOperatorsForField(fieldName: string | null): string[] {\n    if (!fieldName) return this.registry.keys;\n    const type = this.getFieldType(fieldName);\n    return this.registry.getForType(type as any).map((o) => o.key);\n  }\n\n  onScopeChange(_s: 'row'|'column'): void {\n    this.resetDraft();\n    if (this.scope === 'column' && !this.selectedColumnField && this.columnFields.length) {\n      this.selectedColumnField = this.columnFields[0];\n      this.loadColumnRules();\n    }\n    this.updateDerivedUiProps();\n    this.cdr.markForCheck();\n    this.dbg('onScopeChange', { scope: this.scope });\n    this.logFieldChoices();\n  }\n\n  onColumnSelect(_field: string): void {\n    this.loadColumnRules();\n    this.resetDraft();\n    this.refreshDynamicValueHost();\n    this.updateDerivedUiProps();\n    this.dbg('onColumnSelect', { field: _field, type: this.getFieldType(_field), operators: this.getOperatorsForField(_field) });\n    this.logFieldChoices();\n    this.logSingleFieldMeta(_field);\n  }\n\n  private initFromConfig(): void {\n    // Row rules\n    this.rulesRow = ((this.config as any).rowConditionalStyles || []).map((r: any) => ({ ...r, enabled: true }));\n    this.loadColumnRules();\n  }\n\n  private loadColumnRules(): void {\n    if (this.scope !== 'column') { this.rulesColumn = []; return; }\n    const col = (this.config?.columns || []).find((c) => c.field === this.selectedColumnField) as any;\n    this.rulesColumn = ((col?.conditionalStyles as any) || []).map((r: any) => ({ ...r, enabled: true }));\n  }\n\n  // Draft handling\n  rebuildCondition(): void {\n    if (!this.basicField || !this.basicOperator) return;\n    const field = this.basicField;\n    const op = this.basicOperator;\n    const type = this.getFieldType(field);\n\n    const toList = (csv: string | any[]): any[] => Array.isArray(csv)\n      ? csv\n      : String(csv || '').split(',').map((s) => s.trim()).filter(Boolean);\n\n    this.dbg('rebuildCondition:enter', { field, op, type });\n    switch (op) {\n      case 'contains':\n      case 'startsWith':\n      case 'endsWith':\n        this.draftCondition = `${op}(${field}, ${this.stringifyValue(this.basicValue)})`;\n        break;\n      case 'matches':\n        this.draftCondition = `matches(${field}, ${this.stringifyValue(this.basicValue)})`;\n        break;\n      case 'contains any': {\n        const arr = toList(this.basicListCsv);\n        const parts = arr.map((x) => `contains(${field}, ${this.stringifyValue(x)})`);\n        this.draftCondition = parts.length ? parts.join(' or ') : '';\n        break;\n      }\n      case 'contains all': {\n        const arr = toList(this.basicListCsv);\n        const parts = arr.map((x) => `contains(${field}, ${this.stringifyValue(x)})`);\n        this.draftCondition = parts.length ? parts.join(' and ') : '';\n        break;\n      }\n      case 'in': {\n        let arr: any[] = [];\n        if (type === 'enum') arr = this.basicEnumValues || [];\n        else if (type === 'number' || type === 'currency' || type === 'percentage') arr = toList(this.basicListCsv);\n        else arr = toList(this.basicValue);\n        const parts = arr.map((v) => this.stringifyValue(v));\n        this.draftCondition = `${field} in [${parts.join(', ')}]`;\n        break;\n      }\n      case 'not in': {\n        let arr: any[] = [];\n        if (type === 'enum') arr = this.basicEnumValues || [];\n        else if (type === 'number' || type === 'currency' || type === 'percentage') arr = toList(this.basicListCsv);\n        else arr = toList(this.basicValue);\n        const parts = arr.map((v) => this.stringifyValue(v));\n        this.draftCondition = `not (${field} in [${parts.join(', ')}])`;\n        break;\n      }\n      case 'is empty':\n        this.draftCondition = `(${field} == null or ${field} == '')`;\n        break;\n      case 'is not empty':\n        this.draftCondition = `(${field} != null and ${field} != '')`;\n        break;\n      case 'length ==': {\n        const n = Number(this.basicLength);\n        this.draftCondition = isFinite(n) ? `exactly(${field}, ${n})` : '';\n        break;\n      }\n      case 'length >': {\n        const n = Number(this.basicLength);\n        this.draftCondition = isFinite(n) ? `atLeast(${field}, ${n + 1})` : '';\n        break;\n      }\n      case 'length <': {\n        const n = Number(this.basicLength);\n        this.draftCondition = isFinite(n) ? `not (atLeast(${field}, ${n}))` : '';\n        break;\n      }\n      case 'id ==': {\n        const id = this.relationalSelected?.id;\n        this.draftCondition = (id !== undefined && id !== null) ? `jsonGet(${field}, '$.id') == ${this.stringifyValue(id)}` : '';\n        break;\n      }\n      case 'id in': {\n        const ids = (this.relationalSelectedMulti || []).map((o) => o.id);\n        const parts = ids.map((x) => this.stringifyValue(x));\n        this.draftCondition = parts.length ? `jsonGet(${field}, '$.id') in [${parts.join(', ')}]` : '';\n        break;\n      }\n      case 'has property': {\n        const p = (this.basicRelPath || '').trim();\n        this.draftCondition = p ? `hasJsonKey(${field}, ${this.stringifyValue(p)})` : '';\n        break;\n      }\n      case 'between': {\n        if (type === 'date') {\n          const a = this.toIsoDateString(this.basicDateStart);\n          const b = this.toIsoDateString(this.basicDateEnd);\n          if (a && b) this.draftCondition = `(${field} >= '${a}' and ${field} <= '${b}')`;\n          else this.draftCondition = '';\n        } else {\n          const min = this.basicMin;\n          const max = this.basicMax;\n          if (min !== '' && max !== '' && min != null && max != null) {\n            this.draftCondition = `(${field} >= ${this.stringifyValue(min)} and ${field} <= ${this.stringifyValue(max)})`;\n          } else this.draftCondition = '';\n        }\n        break;\n      }\n      case 'is true':\n        this.draftCondition = `${field} == true`;\n        break;\n      case 'is false':\n        this.draftCondition = `${field} == false`;\n        break;\n      case 'is today':\n        this.draftCondition = `${field} == today()`;\n        break;\n      case 'in last': {\n        const n = Number(this.basicLastN);\n        const unit = this.basicLastUnit || 'days';\n        if (isFinite(n)) {\n          const amt = -Math.abs(n);\n          this.draftCondition = `(${field} >= dateAdd(today(), ${amt}, '${unit}') and ${field} <= now())`;\n        } else this.draftCondition = '';\n        break;\n      }\n      case 'weekday is': {\n        const nums = (this.basicWeekdays || []).map((x) => Number(x)).filter((x) => isFinite(x));\n        this.draftCondition = nums.length ? `dateFormat(${field}, 'E') in [${nums.join(', ')}]` : '';\n        break;\n      }\n      case 'jsonPath matches': {\n        const p = (this.basicJsonPath || '').trim();\n        const pat = (this.basicJsonPattern || '').trim();\n        this.draftCondition = (p && pat) ? `jsonPathMatches(${field}, ${this.stringifyValue(p)}, ${this.stringifyValue(pat)})` : '';\n        break;\n      }\n      case 'has key': {\n        const p = (this.basicJsonKey || this.basicJsonPath || '').trim();\n        this.draftCondition = p ? `hasJsonKey(${field}, ${this.stringifyValue(p)})` : '';\n        break;\n      }\n      case 'key ==': {\n        const p = (this.basicJsonPath || '').trim();\n        if (!p) { this.draftCondition = ''; break; }\n        this.draftCondition = `jsonGet(${field}, ${this.stringifyValue(p)}) == ${this.stringifyValue(this.basicJsonExpected)}`;\n        break;\n      }\n      default: {\n        let val: any = this.basicValue;\n        if (type === 'date' && val instanceof Date) val = this.toIsoDateString(val);\n        if (type === 'enum' && (op === '==' || op === '!=')) val = this.basicEnumValue;\n        this.draftCondition = `${field} ${op} ${this.stringifyValue(val)}`;\n        break;\n      }\n    }\n    this.dbg('rebuildCondition:built', { expr: this.draftCondition });\n    if (this.draftGroup && this.draftGroup.conditions && this.draftGroup.conditions.length > 0) {\n      this.updateDraftFromGroup();\n    } else {\n      this.validateDraft();\n    }\n    // keep dynamic host and derived UI in sync when values change\n    try { this.refreshDynamicValueInitialValueOnly(); } catch {}\n    try { this.updateDerivedUiProps(); } catch {}\n  }\n\n  onDraftChange(): void { /* no-op (legacy styles removed) */ }\n\n  // Relational lookup helpers\n  onRelSearch(ev: any): void {\n    const term = String(ev?.target?.value ?? '').trim();\n    this.relationalOptions = [];\n    this.relSearchTerm = term;\n    this.fetchRelOptions(this.basicField, term);\n  }\n  clearRelSelection(): void {\n    this.relationalSelected = null;\n    this.rebuildCondition();\n  }\n  onRelSelectSingle(opt: any): void {\n    this.relationalSelected = opt || null;\n    this.rebuildCondition();\n  }\n  onRelAddMulti(opt: any): void {\n    if (!opt) return;\n    const exists = this.relationalSelectedMulti.some((o) => o.id === opt.id);\n    if (!exists) this.relationalSelectedMulti = [...this.relationalSelectedMulti, opt];\n    this.rebuildCondition();\n  }\n  removeRelMulti(i: number): void {\n    const next = [...this.relationalSelectedMulti];\n    next.splice(i, 1);\n    this.relationalSelectedMulti = next;\n    this.rebuildCondition();\n  }\n\n  private fetchRelOptions(fieldName: string, term: string): void {\n    try {\n      const cfg = this.getRelationalConfig(fieldName);\n      if (!cfg || !this.crud) return;\n      const cacheKey = `${fieldName}`;\n      if (!this.relCache.has(cacheKey)) this.relCache.set(cacheKey, new Map());\n      const fieldCache = this.relCache.get(cacheKey)!;\n      if (fieldCache.has(term)) {\n        this.relationalOptions = fieldCache.get(term)!;\n        this.cdr.markForCheck();\n        return;\n      }\n      (this.crud as any).configure?.(cfg.resourcePath);\n      const page$ = (this.crud as any).filter?.({\n        page: 0,\n        size: 100,\n        search: term,\n      });\n      if (!page$ || typeof page$.subscribe !== 'function') return;\n      page$.subscribe({\n        next: (res: any) => {\n          const content = res?.content || [];\n          const opts = content.map((row: any) => {\n            const id = row?.[cfg.valueField];\n            const labelRaw = row?.[cfg.displayField] ?? String(id ?? '');\n            const label = `${labelRaw}`;\n            return { id, label, raw: row };\n          });\n          fieldCache.set(term, opts);\n          this.relationalOptions = opts;\n          this.cdr.markForCheck();\n        },\n        error: () => {}\n      });\n    } catch {}\n  }\n\n  private getRelationalConfig(fieldName: string): { resourcePath: string; valueField: string; displayField: string } | null {\n    const fd = (this.fields || [])?.find((f) => f.name === fieldName) as any;\n    if (!fd) return null;\n    const resourcePath = fd.resourcePath || fd.endpoint;\n    if (!resourcePath) return null;\n    const valueField = fd.valueField || 'id';\n    const displayField = fd.displayField || fd.labelField || 'name';\n    return { resourcePath, valueField, displayField };\n  }\n\n  validateDraft(): void {\n    const errs: string[] = [];\n    const expr = (this.draftCondition || '').trim();\n    if (!expr) { this.dslErrors = ['Informe uma condição']; this.cdr.markForCheck(); return; }\n    // field allowlist\n    const identifiers = this.extractIdentifiers(expr);\n    const allowed = new Set(\n      this.columnFields.concat([\n        'and','or','not','xor','implies',\n        'contains','startsWith','endsWith','matches','atLeast','exactly','in',\n        'true','false','null',\n        // date/json helpers\n        'today','now','dateAdd','dateFormat','jsonGet','hasJsonKey','jsonPathMatches'\n      ])\n    );\n    for (const id of identifiers) {\n      if (!allowed.has(id)) errs.push(`Identificador não permitido: ${id}`);\n    }\n    // try parse with DSL parser\n    try { this.parser.parse(expr); } catch (e: any) { errs.push(e?.message || 'Erro ao validar DSL'); }\n    // styles handled pelo Painel C\n    this.dslErrors = errs;\n    this.cdr.markForCheck();\n  }\n\n  canCommitDraft(): boolean {\n    const exprOk = (this.draftCondition || '').trim().length > 0 && this.dslErrors.length === 0;\n    const hasPanelFx = this.effectsValue ? this.hasRuleEffectsValue(this.effectsValue) : false;\n    const hasEffect = hasPanelFx;\n    return exprOk && hasEffect;\n  }\n\n  addOrUpdateRule(): void {\n    if (!this.canCommitDraft()) return;\n    // Merge effects from panel C (class/style) and persist full effects for rehydration\n    let mergedCssClass: string | undefined = undefined;\n    let mergedStyle: Record<string,string> = {};\n    if (this.effectsValue) {\n      const fx = toCellClassAndStyle(this.effectsValue);\n      mergedStyle = { ...(fx.style || {}) } as Record<string,string>;\n      const cls = fx.classList?.join(' ').trim();\n      if (cls) mergedCssClass = cls;\n    }\n    const rule: RuleItem = {\n      condition: (this.draftCondition || '').trim(),\n      cssClass: mergedCssClass,\n      style: mergedStyle,\n      description: this.effectsValue?.description?.trim() || undefined,\n      effects: this.effectsValue,\n      enabled: true,\n    };\n    if (this.editIndex === -1) {\n      this.currentRules = [...this.currentRules, rule];\n    } else {\n      const next = [...this.currentRules];\n      next[this.editIndex] = rule;\n      this.currentRules = next;\n    }\n    this.resetDraft();\n  }\n\n  editRule(index: number): void {\n    this.editIndex = index;\n    const r = this.currentRules[index];\n    this.draftCondition = r.condition || '';\n    // Rehydrate effects into panel C when available; carry over description\n    if (r.effects) {\n      this.effectsValue = { ...r.effects, description: r.description ?? r.effects.description, scope: this.scope as any } as any;\n    } else {\n      this.effectsValue = { scope: this.scope as any, description: r.description || '' } as any;\n    }\n    this.dslMode = true;\n    this.validateDraft();\n  }\n\n  removeRule(index: number): void {\n    const next = [...this.currentRules];\n    next.splice(index, 1);\n    this.currentRules = next;\n    this.cdr.markForCheck();\n  }\n\n  duplicateRule(index: number): void {\n    const r = this.currentRules[index];\n    if (!r) return;\n    const copy: RuleItem = { ...r, enabled: true };\n    const next = [...this.currentRules];\n    next.splice(index + 1, 0, copy);\n    this.currentRules = next;\n    this.cdr.markForCheck();\n  }\n\n  onRuleToggle(): void {\n    this.cdr.markForCheck();\n  }\n\n  onApply(): void {\n    const cloned = JSON.parse(JSON.stringify(this.config || {}));\n    if (this.scope === 'row') {\n      cloned.rowConditionalStyles = this.rulesRow.filter((r) => r.enabled).map(({ enabled, ...rest }) => rest);\n      // Build row-level conditional renderers (tooltip/animation)\n      const fromEditorTag = '__fromRulesEditor';\n      const existingRowRens: any[] = Array.isArray((cloned as any).rowConditionalRenderers) ? (cloned as any).rowConditionalRenderers : [];\n      const keepRow = existingRowRens.filter((it) => !it || it[fromEditorTag] !== true);\n      const rowNewcomers: any[] = [];\n      for (const r of this.rulesRow) {\n        if (!r.enabled) continue;\n        const rr = this.buildRowRendererOverrideFromRule(r);\n        if (rr) { rr[fromEditorTag] = true; rowNewcomers.push(rr); }\n      }\n      (cloned as any).rowConditionalRenderers = [...keepRow, ...rowNewcomers];\n    } else {\n      const idx = (cloned.columns || []).findIndex((c: ColumnDefinition) => c.field === this.selectedColumnField);\n      if (idx >= 0) {\n        const col: any = cloned.columns[idx];\n        col.conditionalStyles = this.rulesColumn.filter((r) => r.enabled).map(({ enabled, ...rest }) => rest);\n        // Build conditionalRenderers from rules that have visual elements\n        const fromEditorTag = '__fromRulesEditor';\n        const existing: any[] = Array.isArray(col.conditionalRenderers) ? col.conditionalRenderers : [];\n        const keep = existing.filter((it) => !it || it[fromEditorTag] !== true);\n        const newcomers: any[] = [];\n        for (const r of this.rulesColumn) {\n          if (!r.enabled) continue;\n          const ren = this.buildRendererOverrideFromRule(r);\n          if (ren) { ren[fromEditorTag] = true; newcomers.push(ren); }\n        }\n        col.conditionalRenderers = [...keep, ...newcomers];\n      }\n    }\n    this.configChange.emit(cloned);\n  }\n\n  isValid(): boolean {\n    return this.dslErrors.length === 0;\n  }\n\n  onExportRules(): void {\n    const arr = this.currentRules.map(({ enabled, ...rest }) => rest);\n    const json = JSON.stringify(arr, null, 2);\n    try { if ((navigator as any)?.clipboard?.writeText) (navigator as any).clipboard.writeText(json); } catch {}\n  }\n\n  onImportRules(): void {\n    let input = '';\n    try { if ((window as any)?.prompt) { input = (window as any).prompt('Cole o JSON de regras', '[]') || ''; } } catch {}\n    if (!input) return;\n    try {\n      const parsed = JSON.parse(input);\n      if (!Array.isArray(parsed)) return;\n      const sanitized = parsed.map((r) => this.sanitizeRule(r)).filter(Boolean) as RuleItem[];\n      this.currentRules = sanitized.map((r) => ({ ...r, enabled: true }));\n      this.cdr.markForCheck();\n    } catch {}\n  }\n\n  private sanitizeRule(r: any): RuleItem | null {\n    if (!r || typeof r !== 'object') return null;\n    const cond = typeof r.condition === 'string' ? r.condition.trim() : '';\n    const desc = typeof r.description === 'string' ? r.description : undefined;\n    const effIn = r.effects && typeof r.effects === 'object' ? r.effects : null;\n    if (!cond || !effIn) return null;\n    // Ensure scope is aligned\n    const effects = { ...(effIn as any), scope: this.scope as any } as any;\n    // Derive class/style from effects\n    const derived = toCellClassAndStyle(effects);\n    const cssClass = (derived.classList && derived.classList.length) ? derived.classList.join(' ') : undefined;\n    const style = derived.style || {};\n    const tmp: RuleItem = { condition: cond, cssClass, style, description: desc, effects, enabled: true } as any;\n    // validate DSL\n    this.draftCondition = cond; this.validateDraft();\n    if (this.dslErrors.length) return null;\n    return tmp;\n  }\n\n  // sanitizeEffects removed — import expects effects only\n\n  // Styles removed — exclusively driven by Panel C effects\n  // Allowed CSS properties for conditional styles. Keep conservative and explicitly\n  // enumerate safe properties only. If extending, ensure value-level sanitization below.\n  // Styles handled by Panel C effects\n  \n\n  \n\n  // Legacy quick-effects removed; all visual configuration comes from Panel C effects\n\n  private buildRendererOverrideFromRule(r: RuleItem): any | null {\n    const eff = r.effects;\n    if (!eff) return null;\n    const hasIcon = !!eff.iconBadge?.icon;\n    const hasBadge = !!eff.iconBadge?.badgeText;\n    if (!hasIcon && !hasBadge && !eff.tooltip && !eff.animation) return null;\n    const makeIcon = () => ({ type: 'icon', icon: { name: eff.iconBadge?.icon, color: eff.iconBadge?.iconColor || undefined } });\n    const makeBadge = () => ({ type: 'badge', badge: { text: eff.iconBadge?.badgeText, color: eff.iconBadge?.badgeColor || 'primary', variant: (eff.iconBadge?.badgeStyle === 'solid' ? 'filled' : eff.iconBadge?.badgeStyle === 'outline' ? 'outlined' : 'soft') } });\n    const items: any[] = [];\n    if (eff.iconBadge?.iconPos === 'before') items.push(makeIcon());\n    if (hasBadge) items.push(makeBadge());\n    // text value\n    items.push({ type: 'value' });\n    if (eff.iconBadge?.iconPos === 'after') items.push(makeIcon());\n    const layout: any = { direction: 'row', gap: (eff.layout?.padding ?? 6), align: eff.layout?.align || 'start' };\n    const renderer: any = { type: 'compose', compose: { items, layout } };\n    if (eff.tooltip?.text) {\n      renderer.tooltip = { text: eff.tooltip.text, position: eff.tooltip.position || 'bottom', bgColor: eff.tooltip.bgColor || undefined, delayMs: eff.tooltip.delayMs || undefined };\n    }\n    if (eff.animation?.type) {\n      renderer.animation = { type: eff.animation.type, trigger: eff.animation.trigger || 'onAppear', repeat: eff.animation.repeat || 'once', durationMs: eff.animation.durationMs || undefined, delayMs: eff.animation.delayMs || undefined };\n    }\n    return { condition: r.condition, renderer, description: r.description || undefined, enabled: true };\n  }\n\n  private buildRowRendererOverrideFromRule(r: RuleItem): any | null {\n    const eff = r.effects;\n    if (!eff) return null;\n    const hasTooltip = !!eff.tooltip?.text?.trim();\n    const hasAnim = !!eff.animation?.type;\n    if (!hasTooltip && !hasAnim) return null;\n    const ren: any = { condition: r.condition, enabled: true };\n    if (hasTooltip) {\n      ren.tooltip = {\n        text: eff.tooltip!.text,\n        position: eff.tooltip!.position || 'bottom',\n        bgColor: eff.tooltip!.bgColor || undefined,\n        delayMs: eff.tooltip!.delayMs || undefined,\n      };\n    }\n    if (hasAnim) {\n      ren.animation = {\n        type: eff.animation!.type,\n        trigger: eff.animation!.trigger || 'onAppear',\n        repeat: eff.animation!.repeat || 'once',\n        durationMs: eff.animation!.durationMs || undefined,\n        delayMs: eff.animation!.delayMs || undefined,\n      };\n    }\n    return ren;\n  }\n\n  // Helpers\n  private stringifyValue(v: any): string {\n    if (v == null) return 'null';\n    const n = Number(v);\n    if (typeof v === 'number' || (!isNaN(n) && isFinite(n) && String(v).trim() !== '')) return String(n);\n    if (String(v).toLowerCase() === 'true') return 'true';\n    if (String(v).toLowerCase() === 'false') return 'false';\n    return `'${String(v).replace(/'/g, \"\\\\'\")}'`;\n  }\n\n  private extractIdentifiers(expr: string): string[] {\n    const ids = Array.from(expr.matchAll(/[A-Za-z_][A-Za-z0-9_]*/g)).map((m) => m[0]);\n    return Array.from(new Set(ids));\n  }\n\n  resetDraft(): void {\n    this.editIndex = -1;\n    this.dslMode = false;\n    this.draftCondition = '';\n    this.dslErrors = [];\n    this.draftCssClass = '';\n    this.draftStyleText = '';\n    // descrição e estilos agora vivem em effectsValue\n    this.draftGroup = { op: 'AND', conditions: [] };\n    this.editAtomIndex = -1;\n    this.basicField = this.columnFields[0] || '';\n    this.basicOperator = this.getOperatorsForField(this.basicField)[0] || '==';\n    this.basicValue = '';\n    this.basicMin = '';\n    this.basicMax = '';\n    this.basicListCsv = '';\n    this.basicDate = null;\n    this.basicDateStart = null;\n    this.basicDateEnd = null;\n    this.basicEnumValue = null;\n    this.basicEnumValues = [];\n    // efeitos visuais agora são controlados via effectsValue\n    this.refreshDynamicValueHost();\n    this.updateDerivedUiProps();\n    // reset effects panel value aligned with scope\n    this.effectsValue = { scope: (this.scope as any) } as RuleEffectDefinition;\n    this.dbg('resetDraft', {\n      initialField: this.basicField,\n      operator: this.basicOperator,\n      type: this.getFieldType(this.basicField),\n    });\n  }\n\n  // Basic builder state\n  basicField = '';\n  basicOperator = '==';\n  basicValue: any = '';\n  basicMin: any = '';\n  basicMax: any = '';\n  basicListCsv: string = '';\n  basicDate: Date | null = null;\n  basicDateStart: Date | null = null;\n  basicDateEnd: Date | null = null;\n  basicEnumValue: string | number | null = null;\n  basicEnumValues: Array<string | number> = [];\n  basicLength: number | null = null;\n  // Relational\n  relationalSelected: { id: any; label: string; raw: any } | null = null;\n  relationalSelectedMulti: Array<{ id: any; label: string; raw: any }> = [];\n  relationalOptions: Array<{ id: any; label: string; raw: any }> = [];\n  basicRelPath: string = '';\n  private relSearchTerm = '';\n  private relCache = new Map<string, Map<string, Array<{ id: any; label: string; raw: any }>>>();\n  // Advanced date operators\n  basicLastN: number | null = null;\n  basicLastUnit: 'days'|'weeks'|'months' = 'days';\n  basicWeekdays: number[] = [];\n  weekdayOptions = [\n    { value: 1, label: '1' }, { value: 2, label: '2' }, { value: 3, label: '3' },\n    { value: 4, label: '4' }, { value: 5, label: '5' }, { value: 6, label: '6' }, { value: 7, label: '7' },\n  ];\n  // JSON operators\n  basicJsonPath: string = '';\n  basicJsonPattern: string = '';\n  basicJsonKey: string = '';\n  basicJsonExpected: any = '';\n  // Group builder state\n  draftGroup: RuleGroup = { op: 'AND', conditions: [] };\n  editAtomIndex = -1;\n  activeGroupTarget: 'root' | number = 'root';\n\n  // Preview\n  // Panel C effects bindings\n  onEffectsChange(v: RuleEffectDefinition): void {\n    this.effectsValue = v;\n  }\n\n  private hasRuleEffectsValue(v: RuleEffectDefinition): boolean {\n    if (!v) return false;\n    const hasEstilo = !!v.estilo && Object.values(v.estilo).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const hasLayout = !!v.layout && Object.values(v.layout).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const hasIcon = !!v.iconBadge && Object.values(v.iconBadge).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const hasBg = !!v.background && Object.values(v.background).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const hasAnim = !!v.animation && Object.values(v.animation).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const hasTooltip = !!v.tooltip && Object.values(v.tooltip).some((x) => x !== undefined && x !== null && String(x) !== '');\n    const adv = !!(v.cssClass || v.inlineStyle);\n    return hasEstilo || hasLayout || hasIcon || hasBg || hasAnim || hasTooltip || adv;\n  }\n  /* Stray sample-generation block removed during refactor */\n\n  // Field helpers\n  getFieldType(fieldName: string | null): 'enum' | 'array' | 'json' | 'relational' | 'string' | 'number' | 'date' | 'boolean' | 'currency' | 'percentage' | 'custom' {\n    if (!fieldName) return 'string';\n    const col = (this.config?.columns || []).find((c) => c.field === fieldName) as any;\n    const fd = (this.fields || [])?.find((f) => f.name === fieldName);\n    const isEnum = !!(col?.valueMapping) || !!(fd && Array.isArray((fd as any).options) && (fd as any).options.length);\n    const isArray = !!(fd && (((fd as any).multiple === true) || ((fd as any).type === 'array')));\n    const isJson = !!(fd && (((fd as any).type === 'object') || ((fd as any).type === 'json')));\n    const isRel = !!(fd && ((fd as any).resourcePath || (fd as any).endpoint || (fd as any).valueField || (fd as any).displayField));\n    if (isEnum) return 'enum';\n    if (isArray) return 'array';\n    if (isJson) return 'json';\n    if (isRel) return 'relational';\n    return getColumnDataType(col || null);\n  }\n  getEnumOptions(fieldName: string | null): Array<{ value: any; label: string }> {\n    if (!fieldName) return [];\n    const col = (this.config?.columns || []).find((c) => c.field === fieldName) as any;\n    if (col?.valueMapping && typeof col.valueMapping === 'object') {\n      return Object.entries(col.valueMapping).map(([k, v]) => ({ value: isFinite(Number(k)) ? Number(k) : k, label: String(v) }));\n    }\n    const fd = (this.fields || [])?.find((f) => f.name === fieldName);\n    if (fd?.options && Array.isArray(fd.options)) {\n      return fd.options.map((o: any) => ({ value: o.key, label: o.value }));\n    }\n    return [];\n  }\n  isNoValueOperator(op: string): boolean {\n    return op === 'is true' || op === 'is false' || op === 'is empty' || op === 'is not empty' || op === 'is today';\n  }\n  getValuePlaceholder(): string { return this.basicOperator === 'in' || this.basicOperator === 'not in' ? 'a, b, c' : 'valor'; }\n  getI18nValuePlaceholder(): string { return this.basicOperator === 'in' || this.basicOperator === 'not in' ? this.t('CSV Placeholder') : this.t('Value Placeholder'); }\n\n  private toIsoDateString(d: Date | string | null): string {\n    if (!d) return '';\n    if (d instanceof Date && !isNaN(d.getTime())) {\n      return d.toISOString().slice(0, 10);\n    }\n    const dt = new Date(d);\n    return isNaN(dt.getTime()) ? String(d) : dt.toISOString().slice(0, 10);\n  }\n\n  // ---------------- Dynamic Value Host logic ----------------\n  public setDsl(v: boolean): void {\n    this.dslMode = v;\n    this.refreshDynamicValueHost();\n    this.dbg('setDsl', { dslMode: this.dslMode });\n  }\n\n  public onBasicFieldChange(_val: string): void {\n    this.rebuildCondition();\n    this.refreshDynamicValueHost();\n    this.dbg('onBasicFieldChange', { field: _val, type: this.getFieldType(_val), operator: this.basicOperator });\n    this.logSingleFieldMeta(_val);\n  }\n  public onBasicOperatorChange(_val: string): void {\n    this.rebuildCondition();\n    this.refreshDynamicValueHost();\n    this.dbg('onBasicOperatorChange', { operator: _val, field: this.basicField, type: this.getFieldType(this.basicField) });\n  }\n\n  private refreshDynamicValueInitialValueOnly(): void {\n    if (!this.dynamicValueActive) return;\n    const meta = this.dynamicValueMetas[0];\n    if (!meta) return;\n    const name = meta.name;\n    const ctrl = this.dynamicValueForm.get(name);\n    if (!ctrl) return;\n    // push current basic* value into reactive control without emitting\n    if (name === 'draftDateRange') {\n      const start = this.basicDateStart ? this.toIsoDateString(this.basicDateStart) : null;\n      const end = this.basicDateEnd ? this.toIsoDateString(this.basicDateEnd) : null;\n      ctrl.setValue(start || end ? { startDate: start, endDate: end } : null, { emitEvent: false });\n      this.dbg('refreshInitial:dateRange', { start, end });\n    } else {\n      const type = this.getFieldType(this.basicField);\n      if (this.basicOperator === 'in' || this.basicOperator === 'not in') {\n        const v = type === 'enum' ? (this.basicEnumValues || []) : (String(this.basicValue || '').split(',').map((s) => s.trim()).filter(Boolean));\n        ctrl.setValue(v, { emitEvent: false });\n        this.dbg('refreshInitial:list', { value: v });\n      } else if (type === 'enum') {\n        ctrl.setValue(this.basicEnumValue ?? null, { emitEvent: false });\n        this.dbg('refreshInitial:enum', { value: this.basicEnumValue });\n      } else if (type === 'date') {\n        const iso = this.basicValue instanceof Date ? this.toIsoDateString(this.basicValue) : this.basicValue;\n        ctrl.setValue(iso ?? null, { emitEvent: false });\n        this.dbg('refreshInitial:date', { iso });\n      } else {\n        ctrl.setValue(this.basicValue ?? null, { emitEvent: false });\n        this.dbg('refreshInitial:default', { value: this.basicValue });\n      }\n    }\n  }\n\n  public refreshDynamicValueHost(): void {\n    // clear previous subscription\n    try { this.dynamicValueSub?.unsubscribe?.(); } catch {}\n    this.dynamicValueSub = undefined;\n\n    // Hide in DSL mode or operators without values\n    if (this.dslMode || !this.basicField || this.isNoValueOperator(this.basicOperator)) {\n      this.dynamicValueActive = false;\n      this.dynamicValueMetas = [];\n      this.dbg('dynamicHost:disabled', { dslMode: this.dslMode, basicField: this.basicField, operator: this.basicOperator });\n      return;\n    }\n\n    const type = this.getFieldType(this.basicField);\n    // Special case: date between → date range control\n    if (this.basicOperator === 'between' && type === 'date') {\n      const meta: FieldMetadata = {\n        name: 'draftDateRange',\n        label: this.t('Value'),\n        controlType: (FieldControlType as any).DATE_RANGE,\n        startPlaceholder: this.t('Start'),\n        endPlaceholder: this.t('End'),\n      } as any;\n      this.dynamicValueMetas = [meta];\n      const ctrl = this.dynamicForm.createControlFromMetadata(meta as any);\n      this.dynamicValueForm.setControl(meta.name, ctrl);\n      // initial value from basic state\n      const start = this.basicDateStart ? this.toIsoDateString(this.basicDateStart) : null;\n      const end = this.basicDateEnd ? this.toIsoDateString(this.basicDateEnd) : null;\n      ctrl.setValue(start || end ? { startDate: start, endDate: end } : null, { emitEvent: false });\n      this.dynamicValueSub = ctrl.valueChanges.subscribe((v: any) => {\n        const s = v?.startDate ?? null;\n        const e = v?.endDate ?? null;\n        this.basicDateStart = s ? new Date(s) : null;\n        this.basicDateEnd = e ? new Date(e) : null;\n        this.rebuildCondition();\n      });\n      this.dynamicValueActive = true;\n      this.cdr.markForCheck();\n      this.dbg('dynamicHost:dateRange', { meta, start, end });\n      return;\n    }\n\n    // Resolve FieldDefinition → FieldMetadata for single-value or multi-value\n    const fd = (this.fields || [])?.find((f) => f.name === this.basicField);\n    if (!fd) { this.dynamicValueActive = false; this.dynamicValueMetas = []; this.dbg('dynamicHost:noFieldMeta', { field: this.basicField }); return; }\n    const meta0 = mapFieldDefinitionsToMetadata([fd])[0] as FieldMetadata;\n    const meta: FieldMetadata = { ...(meta0 as any), name: 'draftValue', label: this.t('Value') } as any;\n    // Enable multiple for in/not in\n    if (this.basicOperator === 'in' || this.basicOperator === 'not in') (meta as any).multiple = true;\n\n    this.dynamicValueMetas = [meta];\n    const ctrl = this.dynamicForm.createControlFromMetadata(meta as any);\n    this.dynamicValueForm.setControl(meta.name, ctrl);\n    // seed from basic state\n    this.refreshDynamicValueInitialValueOnly();\n    this.dynamicValueSub = ctrl.valueChanges.subscribe((val: any) => {\n      if (this.basicOperator === 'in' || this.basicOperator === 'not in') {\n        const t = this.getFieldType(this.basicField);\n        if (t === 'enum') this.basicEnumValues = Array.isArray(val) ? val : [];\n        else this.basicValue = Array.isArray(val) ? val.join(', ') : '';\n      } else {\n        const t = this.getFieldType(this.basicField);\n        if (t === 'enum') this.basicEnumValue = val;\n        else this.basicValue = val;\n      }\n      this.rebuildCondition();\n    });\n    this.dynamicValueActive = true;\n    this.cdr.markForCheck();\n    this.dbg('dynamicHost:meta', { field: this.basicField, operator: this.basicOperator, type, meta: { controlType: (meta as any).controlType, multiple: (meta as any).multiple } });\n  }\n\n  \n\n  // Group builder helpers\n  private buildAtomFromBasic(): RuleAtom | null {\n    if (!this.basicField || !this.basicOperator) return null;\n    const type = this.getFieldType(this.basicField);\n    const op = this.basicOperator;\n    let value: any = undefined;\n    switch (op) {\n      case 'contains':\n      case 'startsWith':\n      case 'endsWith':\n      case 'matches':\n        value = this.basicValue;\n        break;\n      case 'in':\n      case 'not in':\n        if (type === 'enum') value = this.basicEnumValues || [];\n        else if (type === 'number' || type === 'currency' || type === 'percentage') value = (this.basicListCsv || '').split(',').map((s) => s.trim()).filter(Boolean);\n        else value = (this.basicValue || '').split(',').map((s: string) => s.trim()).filter(Boolean);\n        break;\n      case 'contains any':\n      case 'contains all':\n        value = (this.basicListCsv || '').split(',').map((s) => s.trim()).filter(Boolean);\n        break;\n      case 'length ==':\n      case 'length >':\n      case 'length <':\n        if (this.basicLength == null || this.basicLength === undefined || isNaN(Number(this.basicLength))) return null;\n        value = Number(this.basicLength);\n        break;\n      case 'between':\n        if (type === 'date') {\n          const a = this.toIsoDateString(this.basicDateStart);\n          const b = this.toIsoDateString(this.basicDateEnd);\n          if (!a || !b) return null;\n          value = { min: a, max: b };\n        } else {\n          if (this.basicMin === '' || this.basicMax === '' || this.basicMin == null || this.basicMax == null) return null;\n          value = { min: this.basicMin, max: this.basicMax };\n        }\n        break;\n      case 'is today':\n        value = undefined;\n        break;\n      case 'in last': {\n        const n = Number(this.basicLastN);\n        if (!isFinite(n)) return null;\n        value = { n: Math.abs(n), unit: this.basicLastUnit };\n        break;\n      }\n      case 'weekday is': {\n        const days = (this.basicWeekdays || []).map((x) => Number(x)).filter((x) => isFinite(x));\n        if (!days.length) return null;\n        value = days;\n        break;\n      }\n      case 'jsonPath matches': {\n        const p = (this.basicJsonPath || '').trim();\n        const pat = (this.basicJsonPattern || '').trim();\n        if (!p || !pat) return null;\n        value = { path: p, pattern: pat };\n        break;\n      }\n      case 'has key': {\n        const p = (this.basicJsonKey || this.basicJsonPath || '').trim();\n        if (!p) return null;\n        value = { path: p };\n        break;\n      }\n      case 'key ==': {\n        const p = (this.basicJsonPath || '').trim();\n        if (!p) return null;\n        value = { path: p, value: this.basicJsonExpected };\n        break;\n      }\n      case 'is true':\n      case 'is false':\n      case 'is empty':\n      case 'is not empty':\n        value = undefined;\n        break;\n      default:\n        if (type === 'date' && this.basicValue instanceof Date) {\n          value = this.toIsoDateString(this.basicValue);\n        } else if (type === 'enum') {\n          value = this.basicEnumValue;\n        } else {\n          value = this.basicValue;\n        }\n        break;\n    }\n    return { field: this.basicField, operator: op, value };\n  }\n\n  public canBuildAtom(): boolean {\n    const atom = this.buildAtomFromBasic();\n    if (!atom) return false;\n    const expr = this.compiler.compileAtom(atom);\n    return !!expr;\n  }\n\n  public onAddOrUpdateAtom(): void {\n    const atom = this.buildAtomFromBasic();\n    if (!atom) return;\n    const target = this.getActiveGroupRef();\n    const next = [...(target.conditions || [])];\n    if (this.editAtomIndex === -1) next.push(atom); else next[this.editAtomIndex] = atom;\n    target.conditions = next;\n    this.updateDraftFromGroup();\n    this.resetAtomEdit();\n    this.focusAddCondition();\n  }\n\n  editAtom(index: number): void {\n    const a = this.draftGroup.conditions[index];\n    if (!a) return;\n    this.editAtomIndex = index;\n    this.basicField = a.field;\n    this.basicOperator = a.operator as any;\n    const type = this.getFieldType(a.field);\n    if (a.operator === 'between') {\n      if (type === 'date') {\n        try { this.basicDateStart = a.value?.min ? new Date(a.value.min) : null; } catch { this.basicDateStart = null; }\n        try { this.basicDateEnd = a.value?.max ? new Date(a.value.max) : null; } catch { this.basicDateEnd = null; }\n      } else {\n        this.basicMin = a.value?.min ?? '';\n        this.basicMax = a.value?.max ?? '';\n      }\n    } else if (a.operator === 'in' || a.operator === 'not in') {\n      if (type === 'enum') {\n        this.basicEnumValues = Array.isArray(a.value) ? a.value : [];\n      } else if (type === 'number' || type === 'currency' || type === 'percentage') {\n        const arr = Array.isArray(a.value) ? a.value : [];\n        this.basicListCsv = arr.join(', ');\n      } else {\n        const arr = Array.isArray(a.value) ? a.value : [];\n        this.basicValue = arr.join(', ');\n      }\n    } else if (type === 'enum') {\n      this.basicEnumValue = a.value ?? null;\n    } else if (type === 'date') {\n      try { this.basicValue = a.value ? new Date(a.value) : null; } catch { this.basicValue = null; }\n    } else {\n      this.basicValue = a.value ?? '';\n    }\n    this.cdr.markForCheck();\n  }\n\n  removeAtom(index: number): void {\n    const next = [...(this.draftGroup.conditions || [])];\n    next.splice(index, 1);\n    this.draftGroup = { ...this.draftGroup, conditions: next };\n    this.updateDraftFromGroup();\n  }\n\n  resetAtomEdit(): void {\n    this.editAtomIndex = -1;\n    // keep field/operator; clear input values\n    this.basicValue = '';\n    this.basicMin = '';\n    this.basicMax = '';\n    this.basicListCsv = '';\n    this.basicDate = null;\n    this.basicDateStart = null;\n    this.basicDateEnd = null;\n    this.basicEnumValue = null;\n    this.basicEnumValues = [];\n  }\n\n  private focusAddCondition(): void {\n    try { (document.getElementById('add-condition-btn') as HTMLButtonElement | null)?.focus(); } catch {}\n  }\n\n  clearGroup(): void {\n    this.draftGroup = { op: 'AND', conditions: [], groups: [] } as any;\n    this.activeGroupTarget = 'root';\n    this.updateDraftFromGroup();\n  }\n\n  onDropCondition(evt: CdkDragDrop<RuleAtom[]>): void {\n    const arr = [...(this.draftGroup.conditions || [])];\n    moveItemInArray(arr, evt.previousIndex, evt.currentIndex);\n    this.draftGroup = { ...this.draftGroup, conditions: arr };\n    this.updateDraftFromGroup();\n  }\n\n  public updateDraftFromGroup(): void {\n    if (!this.draftGroup.conditions.length) {\n      this.validateDraft();\n      return;\n    }\n    const expr = this.compiler.compileGroup(this.draftGroup);\n    this.draftCondition = expr;\n    this.validateDraft();\n  }\n\n  getAtomPreview(a: RuleAtom): string {\n    try { return this.compiler.compileAtom(a) || '(incompleta)'; } catch { return '(erro)'; }\n  }\n\n  addSubgroup(): void {\n    const groups = Array.isArray((this.draftGroup as any).groups) ? [...(this.draftGroup as any).groups] : [];\n    groups.push({ op: 'AND', conditions: [] });\n    (this.draftGroup as any).groups = groups;\n    this.activeGroupTarget = groups.length - 1 as any;\n    this.updateDraftFromGroup();\n  }\n\n  removeSubgroup(index: number): void {\n    const groups = Array.isArray((this.draftGroup as any).groups) ? [...(this.draftGroup as any).groups] : [];\n    if (index < 0 || index >= groups.length) return;\n    groups.splice(index, 1);\n    (this.draftGroup as any).groups = groups;\n    this.activeGroupTarget = 'root';\n    this.updateDraftFromGroup();\n  }\n\n  getGroupPreview(g: RuleGroup): string {\n    try { return this.compiler.compileGroup(g) || '(incompleto)'; } catch { return '(erro)'; }\n  }\n\n  private getActiveGroupRef(): RuleGroup {\n    if (this.activeGroupTarget === 'root') return this.draftGroup;\n    const idx = Number(this.activeGroupTarget);\n    if (!Array.isArray((this.draftGroup as any).groups)) (this.draftGroup as any).groups = [];\n    const groups = (this.draftGroup as any).groups as RuleGroup[];\n    if (!groups[idx]) groups[idx] = { op: 'AND', conditions: [] };\n    return groups[idx];\n  }\n}\n","import {\n  Component,\n  Inject,\n  OnInit,\n  OnDestroy,\n  ChangeDetectorRef,\n  Optional,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { FormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { TableConfig, isTableConfigV2, TableConfigService } from '@praxisui/core';\nimport {\n  SETTINGS_PANEL_DATA,\n  SETTINGS_PANEL_REF,\n  SettingsPanelRef,\n  SettingsValueProvider,\n} from '@praxisui/settings-panel';\nimport {\n  JsonConfigEditorComponent,\n  JsonValidationResult,\n  JsonEditorEvent,\n} from './json-config-editor/json-config-editor.component';\nimport {\n  ColumnsConfigEditorComponent,\n  ColumnChange,\n} from './columns-config-editor/columns-config-editor.component';\nimport {\n  BehaviorConfigEditorComponent,\n  BehaviorConfigChange,\n} from './behavior-config-editor/behavior-config-editor.component';\nimport {\n  ToolbarActionsEditorComponent,\n  ToolbarActionsChange,\n} from './toolbar-actions-editor/toolbar-actions-editor.component';\nimport {\n  MessagesLocalizationEditorComponent,\n  MessagesLocalizationChange,\n} from './messages-localization-editor/messages-localization-editor.component';\nimport { FilterSettingsComponent } from './filter-settings/filter-settings.component';\nimport { HeaderAppearanceEditorComponent } from './header-appearance-editor/header-appearance-editor.component';\nimport { FilterConfig } from './services/filter-config.service';\nimport { FieldMetadata, FieldControlType } from '@praxisui/core';\nimport { CrudIntegrationEditorComponent } from './crud-integration-editor/crud-integration-editor.component';\nimport { ConfirmDialogAppearanceEditorComponent } from './dialogs/confirm-dialog-appearance-editor.component';\nimport { TableRulesEditorComponent } from './rules-editor/table-rules-editor.component';\n\n@Component({\n  selector: 'praxis-table-config-editor',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatIconModule,\n    MatTabsModule,\n    FormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatSelectModule,\n    PraxisIconDirective,\n    JsonConfigEditorComponent,\n    ColumnsConfigEditorComponent,\n    BehaviorConfigEditorComponent,\n    HeaderAppearanceEditorComponent,\n    ToolbarActionsEditorComponent,\n    MessagesLocalizationEditorComponent,\n    FilterSettingsComponent,\n    CrudIntegrationEditorComponent,\n    ConfirmDialogAppearanceEditorComponent,\n    TableRulesEditorComponent,\n  ],\n  templateUrl: './praxis-table-config-editor.html',\n  styleUrls: ['./praxis-table-config-editor.scss'],\n  providers: [TableConfigService],\n})\nexport class PraxisTableConfigEditor\n  implements OnInit, OnDestroy, SettingsValueProvider\n{\n  @ViewChild(BehaviorConfigEditorComponent)\n  behaviorEditor?: BehaviorConfigEditorComponent;\n  // Disponível somente quando a tabela estiver em um contexto CRUD\n  @ViewChild('crudEditorRef') set crudEditorSetter(ref: any) {\n    this.crudEditor = ref;\n    if (ref && !this._crudSubscribed) {\n      this.subscribeCrudEditorChanges(ref);\n    }\n  }\n  private crudEditor?: any;\n  private _crudSubscribed = false;\n  sections = [\n    { id: 'connect', label: 'Conexão', icon: 'link' },\n    {\n      id: 'overview',\n      label: 'Visão Geral & Comportamento',\n      icon: 'tune',\n    },\n    { id: 'header', label: 'Cabeçalho', icon: 'view_headline' },\n    { id: 'columns', label: 'Colunas', icon: 'view_column' },\n    { id: 'rules', label: 'Regras', icon: 'rule' },\n    { id: 'toolbar', label: 'Barra de Ferramentas & Ações', icon: 'build' },\n    { id: 'filters', label: 'Filtros', icon: 'filter_alt' },\n    { id: 'messages', label: 'Mensagens & Localização', icon: 'chat' },\n    { id: 'dialogs', label: 'Diálogos', icon: 'dynamic_form' },\n    { id: 'json', label: 'JSON', icon: 'code' },\n  ];\n  activeSectionIndex = 0;\n  // Configurações\n  private originalConfig!: TableConfig;\n  editedConfig!: TableConfig;\n  // resourcePath para conexão rápida (fora do TableConfig)\n  resourcePath: string = '';\n  private initialResourcePath: string = '';\n  // idField (fora do TableConfig) – usado para resolver a chave primária no componente de Tabela standalone\n  idField: string = 'id';\n  private initialIdField: string = 'id';\n  // horizontalScroll (fora do TableConfig) – comportamento do componente\n  horizontalScroll: 'auto' | 'wrap' | 'none' = 'auto';\n  private initialHorizontalScroll: 'auto' | 'wrap' | 'none' = 'auto';\n  // Contexto CRUD (quando fornecido pelo painel)\n  crudContext?: {\n    tableId: string;\n    resourcePath?: string;\n    /** Nome do campo identificador do recurso (ex.: 'id', 'codigo'). */\n    idField?: string;\n    defaults?: {\n      openMode?: 'modal' | 'route';\n      modal?: Record<string, any>;\n      back?: Record<string, any>;\n    };\n    actions?: Array<{\n      action: string;\n      label?: string;\n      formId?: string;\n      route?: string;\n      openMode?: 'modal' | 'route';\n    }>;\n  };\n\n  // Informações do servidor recebidas do host (opcionais)\n  serverIdField?: string;\n  private serverSchemaHash?: string;\n  idFieldDiverges = false;\n  schemaHashDiverges = false;\n\n  // V2 specific configs for advanced editing\n  isV2Config = false;\n\n  // Estado do componente\n  canSave = false;\n  hasErrors = false;\n  hasSuccess = false;\n  statusMessage = '';\n  private isValidJson = true;\n\n  // Observables obrigatórios da interface SettingsValueProvider\n  isDirty$ = new BehaviorSubject<boolean>(false);\n  isValid$ = new BehaviorSubject<boolean>(true);\n  isBusy$ = new BehaviorSubject<boolean>(false);\n  columnMetas: FieldMetadata[] = [];\n  private hasCrudOverridesDirty = false;\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    private configService: TableConfigService,\n    @Inject(SETTINGS_PANEL_DATA) private panelData: any,\n    @Optional() @Inject(SETTINGS_PANEL_REF) private panelRef?: SettingsPanelRef,\n  ) {}\n\n  ngOnInit(): void {\n    try {\n      // Inicializar configurações (aceitar formatos: somente TableConfig OU { tableConfig, crudContext })\n      let config: TableConfig;\n      if (this.panelData && this.panelData.tableConfig) {\n        config = this.panelData.tableConfig as TableConfig;\n        this.crudContext = this.panelData.crudContext;\n      } else {\n        config = (this.panelData as TableConfig) || { columns: [] };\n        this.crudContext = undefined;\n      }\n      // Dados do servidor para divergência\n      this.serverIdField = (this.panelData?.serverIdField as string) || undefined;\n      this.serverSchemaHash = (this.panelData?.serverSchemaInfo?.schemaHash as string) || (this.panelData?.serverHash as string) || undefined;\n\n      // Inicializar resourcePath/idField (prioriza valor direto; fallback para crudContext/config.meta)\n      this.resourcePath = (this.panelData?.resourcePath as string) || this.crudContext?.resourcePath || '';\n      this.initialResourcePath = this.resourcePath;\n      this.idField = (this.panelData?.idField as string) || this.crudContext?.idField || (config?.meta as any)?.idField || 'id';\n      this.initialIdField = this.idField;\n      // horizontalScroll recebido do host (quando disponível)\n      const hs = (this.panelData?.horizontalScroll as 'auto'|'wrap'|'none') || 'auto';\n      this.horizontalScroll = hs;\n      this.initialHorizontalScroll = hs;\n\n      // Divergência: idField e serverHash\n      const cfgHash = (config?.meta as any)?.serverHash as string | undefined;\n      this.idFieldDiverges = !!(this.serverIdField && this.idField && this.serverIdField !== this.idField);\n      this.schemaHashDiverges = !!(this.serverSchemaHash && cfgHash && this.serverSchemaHash !== cfgHash);\n\n      // Validar configuração recebida\n      if (!config || typeof config !== 'object') {\n        console.error('PTABLE:config:invalid', config);\n        this.showError('Erro ao carregar configuração');\n        return;\n      }\n\n      console.debug(\n        '[PraxisTableConfigEditor] ngOnInit received config',\n        config,\n      );\n\n      // Normalizar ambas as configurações antes de armazenar para garantir comparação consistente\n      this.originalConfig = this.normalizeTableConfig(config);\n      this.editedConfig = this.normalizeTableConfig(config);\n\n      console.debug('[PraxisTableConfigEditor] ngOnInit normalized configs', {\n        original: this.originalConfig,\n        edited: this.editedConfig,\n      });\n\n      // Sempre usar V2 (arquitetura unificada)\n      this.isV2Config = true;\n\n      this.statusMessage = 'Pronto para configurar';\n\n      // Se houver contexto CRUD, inserir aba extra\n      if (this.crudContext) {\n        const exists = this.sections.some((s) => s.id === 'crud');\n        if (!exists) {\n          this.sections.splice(2, 0, {\n            id: 'crud',\n            label: 'Integração CRUD',\n            icon: 'open_in_new',\n          });\n        }\n      }\n\n      // Configurar estado inicial - detectar versão sem modificar editedConfig\n      this.updateConfigurationVersionInfo();\n      this.updateColumnMetas();\n\n      // updateCanSaveState deve mostrar que não há mudanças após a normalização inicial\n      this.updateCanSaveState();\n    } catch (error) {\n      console.error('PTABLE:config:init:error', error);\n      this.showError('Erro ao inicializar editor');\n    }\n  }\n\n  // Event handlers para o JsonConfigEditorComponent\n  onJsonConfigChange(newConfig: TableConfig): void {\n    console.debug(\n      '[PraxisTableConfigEditor] onJsonConfigChange received',\n      newConfig,\n    );\n    this.editedConfig = newConfig;\n\n    // Update state directly\n    this.updateConfigurationVersion();\n    this.updateCanSaveState();\n  }\n\n  onJsonValidationChange(result: JsonValidationResult): void {\n    this.isValidJson = result.isValid;\n    // Atualizar diretamente o observable de validação\n    this.isValid$.next(result.isValid);\n    this.updateCanSaveState();\n  }\n\n  onJsonEditorEvent(event: JsonEditorEvent): void {\n    switch (event.type) {\n      case 'apply':\n        if (event.payload.isValid && event.payload.config) {\n          this.showSuccess('Configuração JSON aplicada com sucesso!');\n        } else {\n          this.showError(\n            event.payload.error || 'Erro ao aplicar configuração JSON',\n          );\n        }\n        break;\n      case 'format':\n        if (event.payload.isValid) {\n          this.showSuccess('JSON formatado!');\n        } else {\n          this.showError(event.payload.error || 'Erro ao formatar JSON');\n        }\n        break;\n    }\n  }\n\n  // Event handlers para o ColumnsConfigEditorComponent\n  onColumnsConfigChange(newConfig: TableConfig): void {\n    // Normalize and short-circuit when nothing effectively changed to avoid loops\n    const normalizedNew = this.normalizeTableConfig(newConfig);\n    const normalizedCurrent = this.normalizeTableConfig(this.editedConfig);\n    if (this.deepEqual(normalizedCurrent, normalizedNew)) {\n      return;\n    }\n    console.debug('[PraxisTableConfigEditor] onColumnsConfigChange received', normalizedNew);\n    this.editedConfig = normalizedNew;\n    this.updateConfigurationVersion();\n    this.updateColumnMetas();\n    this.updateCanSaveState();\n  }\n\n  onColumnChange(change: ColumnChange): void {\n    // Update can save state when columns change\n    this.updateCanSaveState();\n\n    // Show feedback based on column change type\n    switch (change.type) {\n      case 'add':\n        this.showSuccess('Nova coluna adicionada');\n        break;\n      case 'remove':\n        this.showSuccess('Coluna removida');\n        break;\n      case 'reorder':\n        this.showSuccess('Colunas reordenadas');\n        break;\n      case 'global':\n        this.showSuccess('Configurações globais aplicadas');\n        break;\n      case 'update':\n        // Don't show message for every property update to avoid spam\n        break;\n    }\n  }\n\n  onFilterSettingsChange(cfg: FilterConfig): void {\n    // Prevent loops: only update when settings actually changed\n    const prevSettings =\n      this.editedConfig.behavior?.filtering?.advancedFilters?.settings || ({} as FilterConfig);\n\n    const equal = this.deepEqual(prevSettings, cfg);\n    if (equal) {\n      return;\n    }\n\n    // Create a new config object to ensure change detection\n    const newConfig: TableConfig = {\n      ...this.editedConfig,\n      behavior: {\n        ...this.editedConfig.behavior,\n        filtering: {\n          ...(this.editedConfig.behavior?.filtering || {\n            enabled: true,\n            strategy: 'client' as const,\n            debounceTime: 300,\n          }),\n          advancedFilters: {\n            ...(this.editedConfig.behavior?.filtering?.advancedFilters || {\n              enabled: false,\n            }),\n            settings: cfg,\n          },\n        },\n      },\n    } as TableConfig;\n\n    this.editedConfig = newConfig;\n    this.updateCanSaveState();\n  }\n\n  // Event handlers for TableRulesEditorComponent\n  onRulesConfigChange(newCfg: TableConfig): void {\n    const normalizedNew = this.normalizeTableConfig(newCfg);\n    const normalizedCurrent = this.normalizeTableConfig(this.editedConfig);\n    if (this.deepEqual(normalizedCurrent, normalizedNew)) {\n      return;\n    }\n    this.editedConfig = normalizedNew;\n    this.updateConfigurationVersion();\n    this.updateCanSaveState();\n  }\n\n  private updateColumnMetas(): void {\n    this.columnMetas = (this.editedConfig.columns || []).map((c) => ({\n      name: c.field,\n      label: c.header,\n      controlType: FieldControlType.INPUT,\n    }));\n  }\n\n  private updateCanSaveState(): void {\n    // Normalizar configurações antes da comparação para evitar falsos positivos\n    const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n    const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n\n    // Verificar se há alterações válidas usando comparação robusta\n    const resourceDirty = (this.resourcePath || '').trim() !== (this.initialResourcePath || '').trim();\n    const hasChanges = resourceDirty || !this.deepEqual(normalizedOriginal, normalizedEdited) || this.hasCrudOverridesDirty;\n    const isValid = this.isValidJson;\n    const canSave = hasChanges && isValid;\n\n    const debug = (typeof window !== 'undefined' && (window as any).DEBUG_PTABLE) === true;\n    if (debug) {\n      console.debug('[PraxisTableConfigEditor] updateCanSaveState', {\n        hasChanges,\n        isValid,\n        canSave,\n        originalConfigKeys: Object.keys(normalizedOriginal),\n        editedConfigKeys: Object.keys(normalizedEdited),\n      });\n    }\n\n    this.canSave = canSave;\n    // Emitir estados para o painel (habilitar/desabilitar botões)\n    try { this.isDirty$.next(hasChanges); } catch {}\n    try { this.isValid$.next(isValid); } catch {}\n\n    // Atualizar observables da interface SettingsValueProvider\n    this.isDirty$.next(hasChanges);\n    this.isValid$.next(isValid);\n    // isBusy$ será atualizado em operações específicas\n\n    this.cdr.markForCheck();\n  }\n\n  private subscribeCrudEditorChanges(ref: any): void {\n    try {\n      const markDirty = () => {\n        this.hasCrudOverridesDirty = true;\n        // Não alteramos editedConfig; apenas marcamos estado para habilitar salvar\n        this.updateCanSaveState();\n      };\n      if (ref?.defaultsForm?.valueChanges) {\n        ref.defaultsForm.valueChanges.subscribe(markDirty);\n      }\n      if (ref?.actionForms?.valueChanges) {\n        ref.actionForms.valueChanges.subscribe(markDirty);\n      }\n      // Também observar alterações por controle em caso de arrays dinâmicos\n      if (Array.isArray(ref?.actionForms?.controls)) {\n        for (const ctrl of ref.actionForms.controls) {\n          ctrl.valueChanges?.subscribe?.(markDirty);\n        }\n      }\n      this._crudSubscribed = true;\n    } catch {\n      // Se algo falhar, não bloqueia o editor\n    }\n  }\n\n  private showSuccess(message: string): void {\n    this.statusMessage = message;\n    this.hasSuccess = true;\n    this.hasErrors = false;\n    this.cdr.markForCheck();\n\n    setTimeout(() => {\n      this.clearMessages();\n    }, 3000);\n  }\n\n  private showError(message: string): void {\n    this.statusMessage = message;\n    this.hasErrors = true;\n    this.hasSuccess = false;\n    this.cdr.markForCheck();\n\n    setTimeout(() => {\n      this.clearMessages();\n    }, 5000);\n  }\n\n  private clearMessages(): void {\n    this.statusMessage = '';\n    this.hasSuccess = false;\n    this.hasErrors = false;\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Normaliza uma configuração de tabela para comparação consistente\n   * Remove propriedades undefined, ordena arrays e objetos de forma consistente\n   */\n  private normalizeTableConfig(config: TableConfig): TableConfig {\n    if (!config) {\n      return { columns: [] };\n    }\n\n    // Deep clone and normalize\n    const normalized = JSON.parse(\n      JSON.stringify(config, (key, value) => {\n        // Convert undefined to null for consistent comparison\n        if (value === undefined) {\n          return null;\n        }\n        return value;\n      }),\n    );\n\n    // Ensure required properties exist\n    if (!normalized.columns) {\n      normalized.columns = [];\n    }\n\n    // Sort columns by field name for consistent comparison\n    if (Array.isArray(normalized.columns)) {\n      normalized.columns.sort((a: any, b: any) =>\n        (a.field || '').localeCompare(b.field || ''),\n      );\n    }\n\n    // Normalize behavior section\n    if (normalized.behavior) {\n      // Remove empty nested objects\n      Object.keys(normalized.behavior).forEach((key) => {\n        if (\n          normalized.behavior[key] &&\n          typeof normalized.behavior[key] === 'object' &&\n          Object.keys(normalized.behavior[key]).length === 0\n        ) {\n          delete normalized.behavior[key];\n        }\n      });\n\n      // If behavior is empty, remove it\n      if (Object.keys(normalized.behavior).length === 0) {\n        delete normalized.behavior;\n      }\n    }\n\n    // Normalize filtering advanced settings\n    if (normalized.behavior?.filtering?.advancedFilters?.settings) {\n      const settings = normalized.behavior.filtering.advancedFilters.settings;\n\n      // Remove undefined/null values from settings\n      Object.keys(settings).forEach((key) => {\n        if (\n          settings[key] === undefined ||\n          settings[key] === null ||\n          settings[key] === ''\n        ) {\n          delete settings[key];\n        }\n      });\n\n      // Sort arrays consistently\n      if (Array.isArray(settings.alwaysVisibleFields)) {\n        settings.alwaysVisibleFields.sort();\n      }\n    }\n\n    return normalized;\n  }\n\n  /**\n   * Realiza comparação profunda de objetos, ignorando ordem de propriedades\n   */\n  private deepEqual(obj1: any, obj2: any): boolean {\n    if (obj1 === obj2) {\n      return true;\n    }\n\n    if (obj1 == null || obj2 == null) {\n      return obj1 === obj2;\n    }\n\n    if (typeof obj1 !== typeof obj2) {\n      return false;\n    }\n\n    if (typeof obj1 !== 'object') {\n      return obj1 === obj2;\n    }\n\n    if (Array.isArray(obj1) !== Array.isArray(obj2)) {\n      return false;\n    }\n\n    if (Array.isArray(obj1)) {\n      if (obj1.length !== obj2.length) {\n        return false;\n      }\n      for (let i = 0; i < obj1.length; i++) {\n        if (!this.deepEqual(obj1[i], obj2[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    const keys1 = Object.keys(obj1);\n    const keys2 = Object.keys(obj2);\n\n    if (keys1.length !== keys2.length) {\n      return false;\n    }\n\n    for (const key of keys1) {\n      if (!keys2.includes(key)) {\n        return false;\n      }\n      if (!this.deepEqual(obj1[key], obj2[key])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  getSettingsValue(): TableConfig {\n    console.debug('[PraxisTableConfigEditor] getSettingsValue', this.editedConfig);\n    // Retorna objeto estendido quando resourcePath foi definido\n    const trimmed = (this.resourcePath || '').trim();\n    const idKey = (this.idField || '').trim();\n    const hs = this.horizontalScroll || 'auto';\n    if (trimmed || idKey) {\n      const out: any = { ...(this.editedConfig as any) };\n      if (trimmed) out.__resourcePath__ = trimmed;\n      if (idKey) out.__idField__ = idKey;\n      if (hs) out.__horizontalScroll__ = hs;\n      return out as any;\n    }\n    // Ainda assim propague horizontalScroll mesmo sem resource/id\n    const out: any = { ...(this.editedConfig as any) };\n    out.__horizontalScroll__ = hs;\n    return out as any;\n  }\n\n  onResourcePathChange(val: string): void {\n    this.resourcePath = val ?? '';\n    // Mark dirty when resourcePath differs from initial\n    const resourceDirty = (this.resourcePath || '').trim() !== (this.initialResourcePath || '').trim();\n    // Update state without waiting for other changes\n    const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n    const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n    const cfgDirty = !this.deepEqual(normalizedOriginal, normalizedEdited);\n    const hasChanges = resourceDirty || cfgDirty;\n    this.isDirty$.next(hasChanges);\n    // keep validity as JSON validity for now\n    this.isValid$.next(this.isValidJson);\n    this.updateCanSaveState();\n  }\n\n  onIdFieldChange(val: string): void {\n    this.idField = (val || '').trim();\n    const idDirty = (this.idField || 'id').trim() !== (this.initialIdField || 'id').trim();\n    this.idFieldDiverges = !!(this.serverIdField && this.idField && this.serverIdField !== this.idField);\n    const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n    const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n    const cfgDirty = !this.deepEqual(normalizedOriginal, normalizedEdited);\n    this.isDirty$.next(idDirty || cfgDirty);\n    this.isValid$.next(this.isValidJson);\n    this.updateCanSaveState();\n  }\n\n  onHorizontalScrollChange(val: 'auto'|'wrap'|'none'): void {\n    this.horizontalScroll = (val || 'auto');\n    const hsDirty = (this.horizontalScroll || 'auto') !== (this.initialHorizontalScroll || 'auto');\n    const normalizedOriginal = this.normalizeTableConfig(this.originalConfig);\n    const normalizedEdited = this.normalizeTableConfig(this.editedConfig);\n    const cfgDirty = !this.deepEqual(normalizedOriginal, normalizedEdited);\n    this.isDirty$.next(hsDirty || cfgDirty || ((this.resourcePath || '').trim() !== (this.initialResourcePath || '').trim()) || ((this.idField||'id').trim() !== (this.initialIdField||'id').trim()));\n    this.isValid$.next(this.isValidJson);\n    this.updateCanSaveState();\n  }\n\n  // Ação: reconciliar chave primária com o servidor\n  onReconcileIdField(): void {\n    if (!this.serverIdField) return;\n    this.idField = this.serverIdField;\n    const meta: any = { ...(this.editedConfig.meta || {}) };\n    meta.idField = this.serverIdField;\n    meta.version = meta.version || '2.0.0';\n    const now = new Date().toISOString();\n    meta.updatedAt = now;\n    if (!meta.createdAt) meta.createdAt = now;\n    this.editedConfig = { ...(this.editedConfig as any), meta } as any;\n    this.idFieldDiverges = false;\n    this.updateCanSaveState();\n    this.showSuccess('Chave primária reconciliada com o servidor');\n  }\n\n  // Ação: aceitar hash de schema do servidor (somente metadado)\n  onAcceptServerHash(): void {\n    if (!this.serverSchemaHash) return;\n    const meta: any = { ...(this.editedConfig.meta || {}) };\n    meta.serverHash = this.serverSchemaHash;\n    meta.version = meta.version || '2.0.0';\n    const now = new Date().toISOString();\n    meta.updatedAt = now;\n    if (!meta.createdAt) meta.createdAt = now;\n    this.editedConfig = { ...(this.editedConfig as any), meta } as any;\n    this.schemaHashDiverges = false;\n    this.updateCanSaveState();\n    this.showSuccess('Metadados de schema atualizados');\n  }\n\n  \n\n  reset(): void {\n    this.onResetToDefaults();\n  }\n\n  onResetToDefaults(): void {\n    // Indicar que está processando\n    this.isBusy$.next(true);\n\n    try {\n      // Reset para configuração padrão unificada\n      const defaultConfig: TableConfig = {\n        columns: [],\n        behavior: {\n          sorting: {\n            enabled: true,\n            multiSort: false,\n            strategy: 'client',\n            showSortIndicators: true,\n            indicatorPosition: 'end',\n            allowClearSort: true,\n          },\n          filtering: {\n            enabled: false,\n            strategy: 'client',\n            debounceTime: 300,\n          },\n          pagination: {\n            enabled: true,\n            pageSize: 10,\n            pageSizeOptions: [5, 10, 25, 50],\n            showFirstLastButtons: true,\n            showPageNumbers: true,\n            showPageInfo: true,\n            position: 'bottom',\n            style: 'default',\n            strategy: 'client',\n          },\n        },\n        toolbar: {\n          visible: false,\n          position: 'top',\n        },\n      };\n\n      this.editedConfig = defaultConfig;\n      this.updateConfigurationVersion();\n      this.updateCanSaveState();\n      this.showSuccess('Configurações resetadas para padrão');\n    } finally {\n      this.isBusy$.next(false);\n    }\n  }\n\n  /**\n   * Called by the settings panel when the user chooses to persist changes.\n   *\n   * The returned configuration is sent back to the panel via\n   * `panelRef.save(returnedConfig)` and subsequently emitted on `saved$`.\n   * Returning the current `TableConfig` is therefore required for the table to\n   * apply the new settings.\n   */\n  onSave(): TableConfig | undefined {\n    this.behaviorEditor?.applyFormChanges();\n    // Persistir overrides do CRUD (se disponível)\n    if (this.crudEditor && typeof this.crudEditor.saveOverrides === 'function') {\n      try {\n        this.crudEditor.saveOverrides();\n        // Como as overrides foram salvas fora do TableConfig, limpar flag de dirty local\n        this.hasCrudOverridesDirty = false;\n      } catch (e) {\n        console.warn('[PraxisTableConfigEditor] CRUD overrides save failed', e);\n      }\n    }\n    if (!this.canSave) {\n      this.showError('Não há alterações válidas para salvar');\n      console.debug(\n        '[PraxisTableConfigEditor] onSave blocked - cannot save',\n        this.editedConfig,\n      );\n      return;\n    }\n\n    try {\n      // Indicar que está ocupado durante salvamento\n      this.isBusy$.next(true);\n\n      if (!this.editedConfig || !Array.isArray(this.editedConfig.columns)) {\n        throw new Error('Configuração inválida');\n      }\n\n      this.showSuccess('Configurações salvas com sucesso!');\n      // Recalcular estado de save após salvar overrides e config\n      this.updateCanSaveState();\n      const value = this.getSettingsValue();\n      console.debug(\n        '[PraxisTableConfigEditor] onSave returning value',\n        value,\n      );\n\n      // Importante: retornar o mesmo valor de getSettingsValue()\n      // para garantir que __resourcePath__ seja propagado pelo painel\n      return value as TableConfig;\n    } catch (error) {\n      this.showError('Configuração inválida. Verifique os campos.');\n      console.error('[PraxisTableConfigEditor] onSave error', error);\n      return;\n    } finally {\n      // Sempre restaurar estado não-ocupado\n      this.isBusy$.next(false);\n    }\n  }\n\n  /**\n   * Atualiza as flags de versão baseado na configuração atual\n   * Esta versão pode modificar a configuração, deve ser usada após mudanças\n   */\n  private updateConfigurationVersion(): void {\n    this.isV2Config = isTableConfigV2(this.editedConfig);\n\n    // Atualizar mensagem de status baseado na versão\n    if (this.isV2Config) {\n      this.statusMessage = 'Configuração V2 - Recursos avançados disponíveis';\n    }\n  }\n\n  /**\n   * Apenas detecta a versão da configuração sem modificá-la\n   * Usado durante inicialização para evitar marcar como dirty\n   */\n  private updateConfigurationVersionInfo(): void {\n    this.isV2Config = isTableConfigV2(this.editedConfig);\n\n    // Atualizar mensagem de status baseado na versão sem modificar a configuração\n    if (this.isV2Config) {\n      this.statusMessage = 'Configuração V2 - Recursos avançados disponíveis';\n    }\n  }\n\n  /**\n   * Retorna a configuração atual (unified architecture)\n   */\n  getV1Config(): TableConfig {\n    return this.editedConfig as TableConfig;\n  }\n\n  /**\n   * Legacy migration handler. In the unified architecture this is a no-op\n   * and simply refreshes the configuration version information.\n   */\n  onMigrateToV2(): void {\n    this.updateConfigurationVersion();\n  }\n\n  /**\n   * Verifica se um recurso está disponível na versão atual\n   */\n  isFeatureAvailable(feature: string): boolean {\n    // Direct feature check - no adapter needed in unified architecture\n    switch (feature) {\n      case 'multiSort':\n        return this.editedConfig.behavior?.sorting?.multiSort ?? false;\n      case 'bulkActions':\n        return this.editedConfig.actions?.bulk?.enabled ?? false;\n      case 'export':\n        return this.editedConfig.export?.enabled ?? false;\n      default:\n        return false;\n    }\n  }\n\n  // Event handlers para o BehaviorConfigEditorComponent\n  onBehaviorConfigChange(newConfig: TableConfig): void {\n    this.editedConfig = newConfig;\n    // Ensure toolbar is visible when advanced filters are enabled\n    const advancedEnabled =\n      this.editedConfig.behavior?.filtering?.advancedFilters?.enabled;\n    if (advancedEnabled) {\n      this.editedConfig.toolbar = {\n        ...this.editedConfig.toolbar,\n        position: this.editedConfig.toolbar?.position ?? 'top',\n        visible: true,\n      };\n    }\n    this.updateConfigurationVersion();\n    this.updateCanSaveState();\n  }\n\n  onBehaviorChange(change: BehaviorConfigChange): void {\n    // Show feedback based on behavior change type\n    switch (change.type) {\n      case 'pagination':\n        this.showSuccess('Configurações de paginação atualizadas');\n        break;\n      case 'sorting':\n        this.showSuccess('Configurações de ordenação atualizadas');\n        break;\n      case 'filtering':\n        this.showSuccess('Configurações de filtragem atualizadas');\n        break;\n      case 'selection':\n        this.showSuccess('Configurações de seleção atualizadas');\n        break;\n      case 'interaction':\n        this.showSuccess('Configurações de interação atualizadas');\n        break;\n    }\n  }\n\n  // Event handlers para o ToolbarActionsEditorComponent\n  onToolbarActionsConfigChange(newConfig: TableConfig): void {\n    this.editedConfig = newConfig;\n\n    // Update state directly\n    this.updateConfigurationVersion();\n    this.updateCanSaveState();\n  }\n\n  onToolbarActionsChange(change: ToolbarActionsChange): void {\n    // Show feedback based on toolbar action change type\n    switch (change.type) {\n      case 'toolbar':\n        this.showSuccess('Configurações de toolbar atualizadas');\n        break;\n      case 'rowActions':\n        this.showSuccess('Ações por linha atualizadas');\n        break;\n      case 'bulkActions':\n        this.showSuccess('Ações em lote atualizadas');\n        break;\n      case 'export':\n        this.showSuccess('Configurações de exportação atualizadas');\n        break;\n    }\n  }\n\n  // Event handlers para o MessagesLocalizationEditorComponent\n  onMessagesLocalizationConfigChange(newConfig: TableConfig): void {\n    this.editedConfig = newConfig;\n\n    // Update state directly\n    this.updateConfigurationVersion();\n    this.updateCanSaveState();\n  }\n\n  onMessagesLocalizationChange(change: MessagesLocalizationChange): void {\n    // Show feedback based on messages/localization change type\n    switch (change.type) {\n      case 'messages':\n        this.showSuccess('Mensagens atualizadas');\n        break;\n      case 'localization':\n        this.showSuccess('Configurações de localização atualizadas');\n        break;\n      case 'formatting':\n        this.showSuccess('Configurações de formatação atualizadas');\n        break;\n    }\n  }\n\n  ngOnDestroy(): void {\n    // Finalizar observables para evitar memory leaks\n    this.isDirty$.complete();\n    this.isValid$.complete();\n    this.isBusy$.complete();\n  }\n}\n","  <mat-tab-group class=\"config-tabs\" [(selectedIndex)]=\"activeSectionIndex\">\n    <mat-tab *ngFor=\"let section of sections\">\n      <ng-template mat-tab-label>\n        <mat-icon *ngIf=\"section.icon\" [praxisIcon]=\"section.icon\"></mat-icon>\n        <span>{{ section.label }}</span>\n      </ng-template>\n      <div class=\"tab-content\">\n        <ng-container [ngSwitch]=\"section.id\">\n          <div *ngSwitchCase=\"'connect'\" style=\"display:grid; gap:12px; padding: 8px; grid-template-columns: 1fr 240px; align-items: start;\">\n            <mat-form-field appearance=\"outline\">\n              <mat-label>Recurso</mat-label>\n              <input matInput [(ngModel)]=\"resourcePath\" (ngModelChange)=\"onResourcePathChange($event)\" placeholder=\"ex.: employees\" />\n              <mat-icon matSuffix>link</mat-icon>\n            </mat-form-field>\n            <mat-form-field appearance=\"outline\">\n              <mat-label>Chave primária</mat-label>\n              <input matInput [(ngModel)]=\"idField\" (ngModelChange)=\"onIdFieldChange($event)\" placeholder=\"ex.: id, uuid, codigo\" />\n              <mat-icon matSuffix>fingerprint</mat-icon>\n            </mat-form-field>\n            <small style=\"opacity:.75\">Defina o recurso da API e, se necessário, a chave primária</small>\n\n            <!-- Divergência: idField -->\n            <div *ngIf=\"idFieldDiverges\" style=\"grid-column: 1 / -1; padding: 8px 12px; border-radius: 6px; background: #fff4e5; color: #8a4b00; display:flex; align-items:center; gap: 8px;\">\n              <mat-icon>warning</mat-icon>\n              <div style=\"flex:1;\">\n                A chave primária no servidor diverge da configuração atual.\n                <span style=\"opacity:.85\">(config: {{ idField || 'id' }} | servidor: {{ serverIdField || 'id' }})</span>\n              </div>\n              <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"onReconcileIdField()\">Reconciliar</button>\n            </div>\n\n            <!-- Divergência: serverHash -->\n            <div *ngIf=\"schemaHashDiverges\" style=\"grid-column: 1 / -1; padding: 8px 12px; border-radius: 6px; background: #e6f4ff; color: #0b5aaa; display:flex; align-items:center; gap: 8px;\">\n              <mat-icon>info</mat-icon>\n              <div style=\"flex:1;\">\n                O schema no servidor foi atualizado desde a última sincronização.\n              </div>\n              <button mat-stroked-button color=\"primary\" type=\"button\" (click)=\"onAcceptServerHash()\">Atualizar metadados</button>\n            </div>\n          </div>\n\n          <div *ngSwitchCase=\"'overview'\" class=\"overview-grid\">\n            <div class=\"overview-row\">\n              <mat-form-field appearance=\"outline\" class=\"hs-field\">\n                <mat-label>Scroll Horizontal</mat-label>\n                <mat-select [(ngModel)]=\"horizontalScroll\" (ngModelChange)=\"onHorizontalScrollChange($event)\">\n                  <mat-option value=\"auto\">Auto (padrão)</mat-option>\n                  <mat-option value=\"wrap\">Wrap (quebrar linhas)</mat-option>\n                  <mat-option value=\"none\">Host controla</mat-option>\n                </mat-select>\n              </mat-form-field>\n              <div class=\"help small\">Controla como a tabela lida com largura horizontal e barra de rolagem.</div>\n            </div>\n            <behavior-config-editor\n              [config]=\"editedConfig\"\n              [resourcePath]=\"resourcePath\"\n              (configChange)=\"onBehaviorConfigChange($event)\"\n              (behaviorChange)=\"onBehaviorChange($event)\"\n            ></behavior-config-editor>\n          </div>\n\n          <columns-config-editor\n            *ngSwitchCase=\"'columns'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onColumnsConfigChange($event)\"\n            (columnChange)=\"onColumnChange($event)\"\n          ></columns-config-editor>\n\n          <table-rules-editor\n            *ngSwitchCase=\"'rules'\"\n            [config]=\"editedConfig\"\n            [resourcePath]=\"resourcePath\"\n            (configChange)=\"onRulesConfigChange($event)\"\n          ></table-rules-editor>\n\n          <header-appearance-editor\n            *ngSwitchCase=\"'header'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onColumnsConfigChange($event)\"\n          ></header-appearance-editor>\n\n          <toolbar-actions-editor\n            *ngSwitchCase=\"'toolbar'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onToolbarActionsConfigChange($event)\"\n            (toolbarActionsChange)=\"onToolbarActionsChange($event)\"\n          ></toolbar-actions-editor>\n\n          <!-- Aba extra para integrações CRUD (visível quando em contexto CRUD) -->\n          <crud-integration-editor\n            #crudEditorRef\n            *ngSwitchCase=\"'crud'\"\n            [tableId]=\"crudContext?.tableId || 'default'\"\n            [crudContext]=\"crudContext\"\n          ></crud-integration-editor>\n\n          <filter-settings\n            *ngSwitchCase=\"'filters'\"\n            [metadata]=\"columnMetas\"\n            [settings]=\"\n              editedConfig.behavior?.filtering?.advancedFilters?.settings\n            \"\n            (settingsChange)=\"onFilterSettingsChange($event)\"\n          ></filter-settings>\n\n          <messages-localization-editor\n            *ngSwitchCase=\"'messages'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onMessagesLocalizationConfigChange($event)\"\n            (messagesLocalizationChange)=\"\n              onMessagesLocalizationChange($event)\n            \"\n          ></messages-localization-editor>\n\n          <confirm-dialog-appearance-editor\n            *ngSwitchCase=\"'dialogs'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onJsonConfigChange($event)\"\n          ></confirm-dialog-appearance-editor>\n\n\n          <json-config-editor\n            *ngSwitchCase=\"'json'\"\n            [config]=\"editedConfig\"\n            (configChange)=\"onJsonConfigChange($event)\"\n            (editorEvent)=\"onJsonEditorEvent($event)\"\n          ></json-config-editor>\n        </ng-container>\n      </div>\n    </mat-tab>\n  </mat-tab-group>\n<div class=\"config-editor-status\" *ngIf=\"statusMessage\">\n  <span\n    class=\"status-text\"\n    [class.error]=\"hasErrors\"\n    [class.success]=\"hasSuccess\"\n    >{{ statusMessage }}</span\n  >\n</div>\n","import { InjectionToken } from '@angular/core';\n\nexport interface FilterDrawerOpenConfig {\n  resourcePath: string;\n  formId: string;\n  config: any; // FormConfig for PraxisFilterForm\n  initialDto?: Record<string, any>;\n  title?: string;\n  onSubmit(dto: Record<string, any>): void;\n  onClose?(): void;\n}\n\nexport interface FilterDrawerAdapter {\n  open(config: FilterDrawerOpenConfig): Promise<void> | void;\n}\n\nexport const FILTER_DRAWER_ADAPTER = new InjectionToken<FilterDrawerAdapter>('FILTER_DRAWER_ADAPTER');\n\n","import { Inject, Injectable } from '@angular/core';\nimport { ConfigStorage, CONFIG_STORAGE } from '@praxisui/core';\n\nexport type FilterConfig = {\n  quickField?: string;\n  alwaysVisibleFields?: string[];\n  placeholder?: string;\n  showAdvanced?: boolean;\n  mode?: 'auto' | 'filter' | 'card';\n  changeDebounceMs?: number;\n  allowSaveTags?: boolean;\n  // New layout/UX options\n  placeBooleansInActions?: boolean;\n  showToggleLabels?: boolean;\n  alwaysMinWidth?: number;\n  alwaysColsMd?: number;\n  alwaysColsLg?: number;\n  autoSummary?: boolean;\n  confirmTagDelete?: boolean;\n  debugLayout?: boolean;\n  /** Mostrar o campo \"Buscar\" (fallback) quando não houver Quick definido */\n  showQuickFallback?: boolean;\n  // Tag theming (M3-style knobs)\n  tagColor?: 'primary' | 'accent' | 'warn' | 'basic';\n  tagVariant?: 'filled' | 'outlined';\n  tagButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';\n  // Action buttons theming\n  actionsButtonColor?: 'primary' | 'accent' | 'warn' | 'basic';\n  actionsVariant?: 'standard' | 'outlined';\n  // Overlay appearance for Advanced Filter\n  overlayVariant?: 'card' | 'frosted';\n  overlayBackdrop?: boolean;\n  // Advanced panel open mode\n  advancedOpenMode?: 'overlay' | 'modal' | 'drawer';\n};\n\n@Injectable({ providedIn: 'root' })\nexport class FilterConfigService {\n  private readonly PREFIX = 'filter-config:';\n\n  constructor(@Inject(CONFIG_STORAGE) private storage: ConfigStorage) {}\n\n  /**\n   * Load a persisted filter configuration for the given key.\n   */\n  load(key: string): FilterConfig | undefined {\n    return (\n      this.storage.loadConfig<FilterConfig>(this.PREFIX + key) ?? undefined\n    );\n  }\n\n  /**\n   * Persist a filter configuration for the given key.\n   */\n  save(key: string, config: FilterConfig): void {\n    this.storage.saveConfig(this.PREFIX + key, config);\n  }\n}\n","import {\n  Component,\n  EventEmitter,\n  Inject,\n  Input,\n  OnChanges,\n  OnInit,\n  OnDestroy,\n  Output,\n  SimpleChanges,\n  DestroyRef,\n  TemplateRef,\n  ViewChild,\n  ChangeDetectorRef,\n  AfterViewInit,\n  HostListener,\n  ElementRef,\n  DoCheck,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormGroup, ReactiveFormsModule, AbstractControl } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatBadgeModule } from '@angular/material/badge';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatDialog } from '@angular/material/dialog';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { FILTER_DRAWER_ADAPTER, FilterDrawerAdapter } from '../../filter-drawer.adapter';\nimport { inject } from '@angular/core';\nimport {\n  GenericCrudService,\n  FieldMetadata,\n  FormConfig,\n  mapFieldDefinitionsToMetadata,\n  ConfigStorage,\n  CONFIG_STORAGE,\n  FieldControlType,\n  DynamicFormService,\n  SchemaMetadataClient,\n  LocalStorageCacheAdapter,\n  SchemaIdParams,\n  buildSchemaId,\n} from '@praxisui/core';\nimport { SchemaNormalizerService } from '@praxisui/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport {\n  FilterConfigService,\n  FilterConfig,\n} from '../../services/filter-config.service';\nimport { FilterSettingsComponent } from '../../filter-settings/filter-settings.component';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport { DynamicFieldLoaderDirective } from '@praxisui/dynamic-fields';\nimport { PraxisFilterForm } from '@praxisui/dynamic-form';\nimport { fetchWithETag } from '@praxisui/core';\nimport {\n  OverlayModule,\n  CdkOverlayOrigin,\n  ConnectedPosition,\n} from '@angular/cdk/overlay';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { Subject, of, Subscription } from 'rxjs';\nimport { catchError, debounceTime, map, take, takeUntil } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport type FilterTag = {\n  id: string;\n  label: string;\n  patch: Record<string, any>;\n};\nexport type I18n = {\n  searchPlaceholder: string;\n  advanced: string;\n  clear: string;\n  apply: string;\n  edit: string;\n  noData: string;\n  quickFieldNotFound: string;\n  // New i18n entries\n  saveAsShortcut: string;\n  removeShortcut: string;\n  renameShortcut: string;\n  deleteShortcutConfirm: string;\n  retry: string;\n  errorLoadingFilters: string;\n  settings: string;\n  save: string;\n  cancel: string;\n};\n\nconst DEFAULT_I18N: I18n = {\n  searchPlaceholder: 'Buscar',\n  advanced: 'Avançado',\n  clear: 'Limpar',\n  apply: 'Pesquisar',\n  edit: 'Editar filtro',\n  noData: 'Nenhum dado',\n  quickFieldNotFound: 'Campo não encontrado',\n  // New defaults\n  saveAsShortcut: 'Salvar como atalho',\n  removeShortcut: 'Remover atalho',\n  renameShortcut: 'Renomear atalho',\n  deleteShortcutConfirm: 'Remover atalho?',\n  retry: 'Tentar novamente',\n  errorLoadingFilters: 'Erro ao carregar filtros.',\n  settings: 'Configurações',\n  save: 'Salvar',\n  cancel: 'Cancelar',\n};\n\n@Component({\n  selector: 'praxis-filter',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MatFormFieldModule,\n    MatInputModule,\n    MatButtonModule,\n    MatChipsModule,\n    MatIconModule,\n    PraxisIconDirective,\n    MatBadgeModule,\n    MatProgressBarModule,\n    MatSnackBarModule,\n    MatTooltipModule,\n    DynamicFieldLoaderDirective,\n    PraxisFilterForm,\n    OverlayModule,\n    MatDialogModule,\n  ],\n  templateUrl: './praxis-filter.component.html',\n  styleUrls: ['./praxis-filter.component.scss'],\n  host: {\n    '[class.debug-layout]': 'debugLayout',\n    '[style.--pfx-always-min]': 'alwaysMinWidth + \"px\"',\n    '[style.--pfx-always-cols-md]': 'alwaysColsMd',\n    '[style.--pfx-always-cols-lg]': 'alwaysColsLg',\n  },\n})\n/**\n * Componente de filtro dinâmico para tabelas.\n *\n * Fluxo de dados\n * - Carrega o schema de filtro do backend (getFilterSchema).\n * - Normaliza para FieldMetadata via mapFieldDefinitionsToMetadata.\n * - Quick field: renderiza um campo dinâmico isolado e cria o FormControl via DynamicFormService,\n *   preservando validadores, mensagens e updateOn do metadata.\n * - Always visible: cria FormControls via DynamicFormService e propaga alterações ao DTO.\n * - Advanced: delega ao PraxisDynamicForm, que monta o FormGroup completo com validadores.\n *\n * Persistência e UX\n * - Preferências e valores persistidos via ConfigStorage (persistenceKey, tags, modo/placeholder).\n * - Debounce configurável (changeDebounceMs) para emissões de change/submit.\n */\nexport class PraxisFilter implements OnInit, OnChanges, AfterViewInit, OnDestroy, DoCheck {\n  @Input({ required: true }) resourcePath!: string;\n  @Input({ required: true }) formId!: string;\n  @Input() mode: 'auto' | 'filter' | 'card' = 'auto';\n  /** Controls outdated schema notifications visibility and channel (only effective in edit mode) */\n  @Input() notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both';\n  /** Snooze duration for schema outdated notifications (ms), only in edit mode */\n  @Input() snoozeMs = 24 * 60 * 60 * 1000; // 24h\n  /** Auto open settings when schema is detected as outdated (only in edit mode) */\n  @Input() autoOpenSettingsOnOutdated = false;\n  /** Enable edit mode (gates notifications) */\n  @Input() editModeEnabled = false;\n\n  @Input() value?: Record<string, any>;\n  @Input() quickField?: string;\n  @Input() alwaysVisibleFields?: string[] = [];\n  @Input() tags?: FilterTag[];\n  @Input() allowSaveTags?: boolean;\n  @Input() persistenceKey?: string;\n  @Input() i18n?: Partial<I18n>;\n  @Input() changeDebounceMs = 300;\n  /** Controla a exibição do botão de configurações dentro do filtro */\n  @Input() showFilterSettings = false;\n  /** Mostrar campo de busca genérico quando não houver Quick configurado */\n  @Input() showQuickFallback?: boolean;\n  /** Data used to render the summary card when mode resolves to 'card'. */\n  @Input() summary?: any;\n  /** Custom template to render the summary card; receives the summary as $implicit. */\n  @Input() summaryTemplate?: TemplateRef<any>;\n  /** Mapping functions to build the native summary card. */\n  @Input() summaryMap?: {\n    avatar?: (s: any) => string;\n    title: (s: any) => string;\n    subtitle?: (s: any) => string;\n    badges?: Array<(s: any) => string>;\n  };\n  /** When true and mode='auto', generates a summary from active filters if no summary is provided. */\n  @Input() autoSummary = false;\n  /** Exibir confirmação ao excluir atalho (tag) */\n  @Input() confirmTagDelete = true;\n  /** Debug visual de layout/alinhamento */\n  @Input() debugLayout = false;\n  /** Move toggles/booleans simples para a área de ações */\n  @Input() placeBooleansInActions = true;\n  /** Mostrar rótulos dos toggles na área de ações */\n  @Input() showToggleLabels = true;\n  /** Config da grade dos alwaysVisible */\n  @Input() alwaysMinWidth = 240; // px (largura mínima padrão por campo)\n  @Input() alwaysColsMd = 2;\n  @Input() alwaysColsLg = 3;\n  /** Tag theming */\n  @Input() tagColor: 'primary' | 'accent' | 'warn' | 'basic' = 'primary';\n  @Input() tagVariant: 'filled' | 'outlined' = 'filled';\n  @Input() tagButtonColor: 'primary' | 'accent' | 'warn' | 'basic' = 'basic';\n  /** Action buttons theming */\n  @Input() actionsButtonColor: 'primary' | 'accent' | 'warn' | 'basic' = 'basic';\n  @Input() actionsVariant: 'standard' | 'outlined' = 'standard';\n  /** Overlay appearance */\n  @Input() overlayVariant: 'card' | 'frosted' = 'card';\n  @Input() overlayBackdrop = true;\n  /** Advanced panel open mode */\n  @Input() advancedOpenMode: 'overlay' | 'modal' | 'drawer' = 'overlay';\n\n  @Output() submit = new EventEmitter<Record<string, any>>();\n  @Output() change = new EventEmitter<Record<string, any>>();\n  @Output() clear = new EventEmitter<void>();\n  @Output() modeChange = new EventEmitter<'filter' | 'card'>();\n  @Output() requestSearch = this.submit;\n  @Output() tagsChange = new EventEmitter<FilterTag[]>();\n  // Propaga metadados do schema usado (schemaId/serverHash/context)\n  @Output() metaChanged = new EventEmitter<{ schemaId: string; serverHash?: string; context: SchemaIdParams }>();\n  /** Emits whenever schema outdated state changes (can be used by host) */\n  @Output() schemaStatusChange = new EventEmitter<{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; formId?: string }>();\n\n  quickControl: FormControl<any> = new FormControl<string>('', { nonNullable: true });\n  quickForm = new FormGroup<Record<string, AbstractControl>>({});\n  alwaysForm = new FormGroup<Record<string, FormControl<unknown>>>({});\n  quickFieldMeta?: FieldMetadata;\n  // For DynamicFieldLoader: avoid array literal in template causing re-renders each CD tick\n  quickFieldMetaArray: FieldMetadata[] = [];\n  alwaysVisibleMetas: FieldMetadata[] = [];\n  toggleMetas: FieldMetadata[] = [];\n  advancedConfig?: FormConfig;\n  displayedTags: FilterTag[] = [];\n  private savedTags: FilterTag[] = [];\n  // Edição inline de tags\n  editingTagId?: string;\n  editingTagLabel = new FormControl<string>('', { nonNullable: true });\n  schemaLoading = false;\n  schemaError = false;\n  private schemaMetas?: FieldMetadata[];\n  private advancedChange$ = new Subject<Record<string, any>>();\n  private alwaysFormReset$ = new Subject<void>();\n  private dto: Record<string, any> = {};\n  modeState: 'filter' | 'card' = 'filter';\n  advancedOpen = false;\n  // Novo: validade do form avançado para UX\n  advancedValid = true;\n  activeFiltersCount = 0;\n  saving = false;\n  i18nLabels: I18n = DEFAULT_I18N;\n  placeholder?: string;\n  private configKey!: string;\n  private pendingQuickValue?: any; // valor inicial do quickControl a ser aplicado após a view inicializar\n  private autoSummaryData?: any;\n  private lastSchemaMeta?: { schemaId: string; serverHash?: string; context: SchemaIdParams };\n  // Outdated state and persistence helpers\n  schemaOutdated = false;\n\n  @ViewChild('anchorRef', { read: CdkOverlayOrigin }) anchorRef?: CdkOverlayOrigin;\n  @ViewChild('quickHostRef') quickHostRef?: ElementRef<HTMLElement>;\n\n  overlayOrigin?: CdkOverlayOrigin;\n  overlayWidth: number | string = 520;\n  // Novo: estado de mobile para layout do overlay\n  isMobile = false;\n  // A11y: id único para o título do diálogo\n  advancedTitleId = '';\n  // A11y: id único para o painel do diálogo (para aria-controls)\n  advancedPanelId = '';\n\n  // Quick field mode tracking\n  quickFieldMode: 'dynamic' | 'fallback' = 'fallback';\n\n  // Lifecycle control\n  private isViewInitialized = false;\n  private pendingQuickFieldSetup = false;\n  private isQuickFieldSetupInProgress = false;\n  // Debug trackers\n  private _dbgPrevQuickArrayRef: FieldMetadata[] | null = null;\n  private _dbgPrevAlwaysArrayRef: FieldMetadata[] | null = null;\n  private _dbgPrevToggleArrayRef: FieldMetadata[] | null = null;\n  private _dbgPrevQuickFormRef: FormGroup<Record<string, AbstractControl>> | null = null;\n  private _dbgPrevAlwaysFormRef: FormGroup<Record<string, FormControl<unknown>>> | null = null;\n  private _dbgDoCheckCount = 0;\n  private _dbgLastApplyMetasAt = 0;\n  private _dbgLastQuickComponentsAt = 0;\n  private _dbgLastAlwaysComponentsAt = 0;\n  private _dbgLastToggleComponentsAt = 0;\n  overlayPositions: ConnectedPosition[] = [\n    // Prefer abrir abaixo e alinhado à esquerda do campo\n    { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n    // Abaixo alinhado à direita (fallback quando espaço à direita é melhor)\n    { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },\n    // Acima alinhado à esquerda (quando não há espaço abaixo)\n    { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n    // Acima alinhado à direita\n    { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },\n  ];\n  // Subscriptions for dynamic debounce\n  private quickSub?: Subscription;\n  private advancedDebouncedSub?: Subscription;\n\n  private lastSubmitAt = 0;\n  // Observers for dynamic layout\n  private resizeObs?: ResizeObserver;\n  private mutationObs?: MutationObserver;\n  // Guard to avoid closing immediately after opening due to the same click event\n  private ignoreOutsideUntil = 0;\n  // Resolved preferences (inputs → global fallback)\n  private _resolvedPrefs: { notifyIfOutdated: 'inline'|'snackbar'|'both'|'none'; snoozeMs: number; autoOpenSettingsOnOutdated: boolean } = {\n    notifyIfOutdated: 'both',\n    snoozeMs: 24 * 60 * 60 * 1000,\n    autoOpenSettingsOnOutdated: false,\n  };\n\n  private resolveSchemaPrefs(): void {\n    const DEFAULTS = { notifyIfOutdated: 'both' as const, snoozeMs: 24 * 60 * 60 * 1000, autoOpenSettingsOnOutdated: false };\n    let out = {\n      notifyIfOutdated: (this.notifyIfOutdated as any) ?? DEFAULTS.notifyIfOutdated,\n      snoozeMs: typeof this.snoozeMs === 'number' ? this.snoozeMs : DEFAULTS.snoozeMs,\n      autoOpenSettingsOnOutdated: !!this.autoOpenSettingsOnOutdated,\n    };\n    const inputsAreDefaults = (this.notifyIfOutdated === DEFAULTS.notifyIfOutdated) && (this.snoozeMs === DEFAULTS.snoozeMs) && (this.autoOpenSettingsOnOutdated === DEFAULTS.autoOpenSettingsOnOutdated);\n    if (inputsAreDefaults) {\n      try {\n        const g = this.global.getSchemaPrefsGlobal?.();\n        if (g && typeof g === 'object') {\n          out = {\n            notifyIfOutdated: (g.notifyIfOutdated as any) ?? out.notifyIfOutdated,\n            snoozeMs: (typeof g.snoozeMs === 'number' ? g.snoozeMs : out.snoozeMs),\n            autoOpenSettingsOnOutdated: (typeof g.autoOpenSettingsOnOutdated === 'boolean' ? g.autoOpenSettingsOnOutdated : out.autoOpenSettingsOnOutdated),\n          };\n        }\n      } catch {}\n    }\n    this._resolvedPrefs = out;\n  }\n\n  constructor(\n    private crud: GenericCrudService<any>,\n    @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n    private destroyRef: DestroyRef,\n    private filterConfig: FilterConfigService,\n    private settingsPanel: SettingsPanelService,\n    private snackBar: MatSnackBar,\n    private dialog: MatDialog,\n    private cdr: ChangeDetectorRef,\n    private dynamicForm: DynamicFormService,\n    private schemaNormalizer: SchemaNormalizerService,\n  ) {}\n  private readonly global = inject(GlobalConfigService);\n  // Optional injection (adapter provided by host app)\n  private readonly filterDrawerAdapter = (() => {\n    try { return inject<FilterDrawerAdapter>(FILTER_DRAWER_ADAPTER); } catch { return undefined as any; }\n  })();\n\n  /** Decide se o bloco Quick deve ser exibido (heurística + preferência) */\n  showQuickBar(): boolean {\n    if (this.quickField || this.quickFieldMeta) return true;\n    if (this.showQuickFallback === true) return true;\n    const hasAlwaysCfg = Array.isArray(this.alwaysVisibleFields) && this.alwaysVisibleFields.length > 0;\n    if (!this.schemaMetas || this.schemaMetas.length === 0) {\n      return !hasAlwaysCfg;\n    }\n    const hasAlways = (this.alwaysVisibleMetas?.length || 0) > 0;\n    const hasToggles = (this.toggleMetas?.length || 0) > 0;\n    return !(hasAlways || hasToggles);\n  }\n\n  private loadSavedTagsFromStorage(): void {\n    try {\n      if (!this.configKey) return;\n      const key = `${this.configKey}:tags`;\n      const stored = this.configStorage.loadConfig<FilterTag[]>(key);\n      this.savedTags = Array.isArray(stored) ? [...stored] : [];\n      this.updateDisplayedTags();\n    } catch {}\n  }\n\n  ngOnInit(): void {\n    console.debug('[PFILTER] ngOnInit: config + state', { resourcePath: this.resourcePath, formId: this.formId });\n    this.resolveSchemaPrefs();\n    this.crud.configure(this.resourcePath);\n    this.configKey = this.persistenceKey ?? this.formId;\n    // Atribui id estável para o título do overlay (dialog)\n    this.advancedTitleId = `praxis-advanced-title-${this.formId || 'default'}`;\n    // Atribui id estável para o painel do overlay (dialog)\n    this.advancedPanelId = `praxis-advanced-panel-${this.formId || 'default'}`;\n    // Inicializa flag de mobile\n    this.isMobile = this.computeIsMobile();\n    const cfg = this.filterConfig.load(this.configKey);\n    // Guardar preferências de abertura avançada para aplicar após resolver o modo\n    const cfgShowAdvanced = cfg?.showAdvanced;\n    if (cfg) {\n      if (!this.quickField && cfg.quickField) {\n        this.quickField = cfg.quickField;\n      }\n      if (!this.alwaysVisibleFields?.length && cfg.alwaysVisibleFields) {\n        this.alwaysVisibleFields = cfg.alwaysVisibleFields;\n      }\n      if (!this.i18n?.searchPlaceholder && cfg.placeholder) {\n        this.placeholder = cfg.placeholder;\n      }\n      // Resolver mode antes de mexer em advancedOpen\n      if (this.mode === 'auto' && cfg.mode) {\n        this.mode = cfg.mode;\n      }\n      if (this.allowSaveTags === undefined && cfg.allowSaveTags !== undefined) {\n        this.allowSaveTags = cfg.allowSaveTags;\n      }\n      if (this.showQuickFallback === undefined && (cfg as any).showQuickFallback !== undefined) {\n        this.showQuickFallback = !!(cfg as any).showQuickFallback;\n      }\n      if (this.changeDebounceMs === 300 && cfg.changeDebounceMs !== undefined) {\n        this.changeDebounceMs = cfg.changeDebounceMs;\n      }\n      if (cfg.placeBooleansInActions !== undefined) {\n        this.placeBooleansInActions = cfg.placeBooleansInActions;\n      }\n      if (cfg.showToggleLabels !== undefined) {\n        this.showToggleLabels = cfg.showToggleLabels;\n      }\n      if (cfg.alwaysMinWidth !== undefined) {\n        this.alwaysMinWidth = cfg.alwaysMinWidth;\n      }\n      if (cfg.alwaysColsMd !== undefined) {\n        this.alwaysColsMd = cfg.alwaysColsMd;\n      }\n      if (cfg.alwaysColsLg !== undefined) {\n        this.alwaysColsLg = cfg.alwaysColsLg;\n      }\n      if (cfg.autoSummary !== undefined) {\n        this.autoSummary = cfg.autoSummary;\n      }\n      if (cfg.confirmTagDelete !== undefined) {\n        this.confirmTagDelete = cfg.confirmTagDelete;\n      }\n      if (cfg.debugLayout !== undefined) {\n        this.debugLayout = cfg.debugLayout;\n      }\n      if ((cfg as any).overlayVariant) this.overlayVariant = (cfg as any).overlayVariant as any;\n      if ((cfg as any).overlayBackdrop !== undefined) this.overlayBackdrop = !!(cfg as any).overlayBackdrop;\n      if (cfg.tagColor) this.tagColor = cfg.tagColor;\n      if (cfg.tagVariant) this.tagVariant = cfg.tagVariant;\n      if (cfg.tagButtonColor) this.tagButtonColor = cfg.tagButtonColor;\n      if (cfg.actionsButtonColor) this.actionsButtonColor = cfg.actionsButtonColor;\n      if (cfg.actionsVariant) this.actionsVariant = cfg.actionsVariant;\n    }\n    // Apply global defaults for filter UI when not specified in saved config or inputs\n    try {\n      const table = this.global.getTable();\n      const ui = (table as any)?.filteringUi as {\n        overlayVariant?: 'card'|'frosted'; overlayBackdrop?: boolean; advancedOpenMode?: 'overlay'|'modal'|'drawer'\n      } | undefined;\n      if (ui) {\n        const cfgAny: any = cfg || {};\n        const hasCfgVariant = cfgAny.overlayVariant !== undefined;\n        const hasCfgBackdrop = cfgAny.overlayBackdrop !== undefined;\n        const hasCfgOpenMode = cfgAny.advancedOpenMode !== undefined;\n\n        // If no local config persisted for a given key, always apply global\n        if (!hasCfgVariant && ui.overlayVariant) {\n          this.overlayVariant = ui.overlayVariant;\n        }\n        if (!hasCfgBackdrop && ui.overlayBackdrop !== undefined) {\n          this.overlayBackdrop = !!ui.overlayBackdrop;\n        }\n        if (!hasCfgOpenMode && ui.advancedOpenMode) {\n          this.advancedOpenMode = ui.advancedOpenMode;\n        }\n      }\n    } catch {}\n    this.mergeI18n();\n    if (this.allowSaveTags && this.configKey) {\n      const stored = this.configStorage.loadConfig<FilterTag[]>(\n        `${this.configKey}:tags`,\n      );\n      if (stored) {\n        this.savedTags = stored;\n      }\n    }\n    this.updateDisplayedTags();\n    // carregar filtros persistidos (DTO) usando configKey como fallback\n    const dtoKey = this.persistenceKey ?? this.configKey;\n    if (dtoKey) {\n      const saved = this.configStorage.loadConfig<Record<string, any>>(dtoKey);\n      if (saved) {\n        this.dto = { ...saved };\n        if (this.quickField && saved[this.quickField] !== undefined) {\n          this.pendingQuickValue = saved[this.quickField];\n        }\n      }\n    }\n    if (!Object.keys(this.dto).length && this.value) {\n      this.dto = { ...this.value };\n      if (this.quickField && this.value[this.quickField] !== undefined) {\n        this.pendingQuickValue = this.value[this.quickField];\n      }\n    }\n    this.activeFiltersCount = Object.keys(this.dto).length;\n    // Avaliar o modo primeiro\n    this.evaluateMode();\n    // Atualizar resumo automático conforme filtros iniciais\n    this.updateAutoSummary();\n    // Só então aplicar a preferência de advancedOpen conforme o modo efetivo\n    if (cfgShowAdvanced !== undefined) {\n      this.advancedOpen = cfgShowAdvanced;\n    }\n\n    // Bind subscriptions with current debounce\n    this.bindQuickControlChanges();\n    this.bindAdvancedDebounce();\n\n    // Lightweight server schema verification (ETag/If-None-Match). Will not download schema body when columns already exist.\n    this.verifyServerSchemaVersion().catch(() => {});\n    // Only load schema body when necessary for rendering (alwaysVisible fields at init).\n    if ((this.alwaysVisibleFields?.length || 0) > 0) {\n      console.debug('[PFILTER] ngOnInit: alwaysVisible present → loadSchema');\n      this.loadSchema();\n    }\n  }\n\n  ngAfterViewInit(): void {\n    // Define overlayOrigin e aplica valores iniciais após a view inicializar,\n    // usando setTimeout para evitar ExpressionChanged em bindings do MatFormField\n    setTimeout(() => {\n      this.overlayOrigin = this.anchorRef;\n      console.debug('[PFILTER] AfterViewInit: overlayOrigin set');\n      this.updateOverlayWidth();\n      if (this.pendingQuickValue !== undefined) {\n        this.quickControl.setValue(this.pendingQuickValue, { emitEvent: false });\n        this.pendingQuickValue = undefined;\n      }\n\n      // Mark view as initialized and trigger pending Quick Field setup\n      this.isViewInitialized = true;\n      if (this.pendingQuickFieldSetup && this.quickField && this.quickFieldMeta) {\n        this.pendingQuickFieldSetup = false;\n        this.setupQuickField().catch(error => {\n          console.error('[QuickField] Deferred setup failed, falling back to generic input:', error);\n          this.setupQuickFieldFallback();\n        });\n      }\n\n      // Observers to react to dynamic quick field changes\n      console.debug('[PFILTER] AfterViewInit: initDynamicObservers');\n      this.initDynamicObservers();\n\n      // Garante que o Angular processe as alterações imediatamente\n      this.cdr.detectChanges();\n      console.debug('[PFILTER] AfterViewInit: initial CD flushed');\n    });\n  }\n\n  @HostListener('window:resize') onWindowResize() {\n    this.isMobile = this.computeIsMobile();\n    this.updateOverlayWidth();\n  }\n\n  private initDynamicObservers(): void {\n    try {\n      const anchorEl = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n      const quickHostEl = this.quickHostRef?.nativeElement as HTMLElement | undefined;\n\n      // ResizeObserver (quando disponível) para largura do anchor/quick\n      const RO: any = (globalThis as any).ResizeObserver;\n      if (RO && !this.resizeObs) {\n        this.resizeObs = new RO(() => {\n          // Debounced by animation frame for safety\n          requestAnimationFrame(() => this.updateOverlayWidth());\n        });\n        if (anchorEl && this.resizeObs) this.resizeObs.observe(anchorEl);\n        if (quickHostEl && this.resizeObs) this.resizeObs.observe(quickHostEl);\n      }\n\n      // MutationObserver para mudanças estruturais no quick (campo dinâmico)\n      if (!this.mutationObs && quickHostEl) {\n        this.mutationObs = new MutationObserver(() => {\n          // Pequeno debounce natural via microtask\n          Promise.resolve().then(() => {\n            // Reatribui origem caso o anchor tenha sido recriado\n            this.overlayOrigin = this.anchorRef;\n            this.updateOverlayWidth();\n            this.cdr.detectChanges();\n          });\n        });\n        this.mutationObs.observe(quickHostEl, {\n          childList: true,\n          subtree: true,\n          attributes: true,\n        });\n      }\n    } catch {\n      // noop: ambiente sem suporte a observers\n    }\n  }\n\n  // Fecha o avançado ao pressionar ESC (exceto quando o foco está em um overlay filho — datepicker/select/etc.)\n  @HostListener('document:keydown', ['$event'])\n  onDocumentEscClose(event: KeyboardEvent): void {\n    if (event.key !== 'Escape' || !this.advancedOpen) return;\n    const target = event.target as HTMLElement | null;\n    if (this.isEventFromNestedOverlay(target)) return;\n    this.closeAdvanced();\n  }\n\n  private updateOverlayWidth(): void {\n    try {\n      if (this.isMobile) { this.overlayWidth = '100vw'; return; }\n      const anchor = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n      // Preferir a largura da barra completa para melhor alinhamento com ações\n      const bar = anchor?.closest?.('.praxis-filter-bar') as HTMLElement | null | undefined;\n      const el = (bar || anchor) as HTMLElement | undefined;\n    } catch { /* noop */ }\n  }\n\n  // Helper para detectar viewport mobile (mantido simples e sem SSR)\n  private computeIsMobile(): boolean {\n    try {\n      return typeof window !== 'undefined' && window.innerWidth <= 599;\n    } catch {\n      return false;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['resourcePath'] && !changes['resourcePath'].firstChange) {\n      console.debug('[PFILTER] ngOnChanges: resourcePath changed', { resourcePath: this.resourcePath });\n    }\n    if (changes['mode'] || changes['summary']) {\n      this.evaluateMode();\n    }\n    if (changes['tags'] && !changes['tags'].firstChange) {\n      this.updateDisplayedTags();\n    }\n    if (changes['resourcePath'] && !changes['resourcePath'].firstChange) {\n      console.debug('[PFILTER] ngOnChanges: reconfigure CRUD');\n      this.crud.configure(this.resourcePath);\n      this.quickControl.setValue('', { emitEvent: false });\n      this.dto = {};\n      this.clearPersisted();\n      this.schemaMetas = undefined;\n      // Verify lightweight on path changes; load schema body only if needed for rendering\n      this.verifyServerSchemaVersion().catch(() => {});\n      if ((this.alwaysVisibleFields?.length || 0) > 0) {\n        console.debug('[PFILTER] ngOnChanges: alwaysVisible present → loadSchema');\n        if (!this.schemaLoading) this.loadSchema();\n      }\n    }\n    if (\n      (changes['quickField'] && !changes['quickField'].firstChange) ||\n      (changes['alwaysVisibleFields'] &&\n        !changes['alwaysVisibleFields'].firstChange)\n    ) {\n      console.debug('[PFILTER] ngOnChanges: quickField/alwaysVisibleFields changed', {\n        quickField: this.quickField,\n        alwaysVisibleFields: this.alwaysVisibleFields,\n        hasSchema: !!this.schemaMetas,\n      });\n      if (this.schemaMetas) {\n        this.applySchemaMetas();\n      } else {\n        if (!this.schemaLoading) this.loadSchema();\n      }\n    }\n    if (changes['i18n']) {\n      this.mergeI18n();\n    }\n    if (changes['notifyIfOutdated'] || changes['snoozeMs'] || changes['autoOpenSettingsOnOutdated']) {\n      this.resolveSchemaPrefs();\n    }\n  }\n\n  openSettings(): void {\n    try {\n      const currentConfig = {\n        metadata: this.schemaMetas ?? [],\n        configKey: this.configKey,\n        dto: { ...this.dto },\n        settings: {\n          quickField: this.quickField,\n          alwaysVisibleFields: this.alwaysVisibleFields,\n          placeholder: this.placeholder,\n          showAdvanced: this.advancedOpen,\n          mode: this.mode,\n          allowSaveTags: this.allowSaveTags,\n          changeDebounceMs: this.changeDebounceMs,\n          placeBooleansInActions: this.placeBooleansInActions,\n          showToggleLabels: this.showToggleLabels,\n          alwaysMinWidth: this.alwaysMinWidth,\n          alwaysColsMd: this.alwaysColsMd,\n          alwaysColsLg: this.alwaysColsLg,\n          autoSummary: this.autoSummary,\n          confirmTagDelete: this.confirmTagDelete,\n          debugLayout: this.debugLayout,\n          tagColor: this.tagColor,\n          tagVariant: this.tagVariant,\n          tagButtonColor: this.tagButtonColor,\n          actionsButtonColor: this.actionsButtonColor,\n          actionsVariant: this.actionsVariant,\n          overlayVariant: this.overlayVariant,\n          overlayBackdrop: this.overlayBackdrop,\n        },\n      };\n\n      const ref = this.settingsPanel.open({\n        id: `filter.${this.configKey}`,\n        title: 'Configurações do Filtro',\n        content: { component: FilterSettingsComponent, inputs: currentConfig },\n      });\n\n      const applyChanges = (cfg: FilterConfig): void => {\n        this.quickField = cfg.quickField;\n        this.alwaysVisibleFields = cfg.alwaysVisibleFields ?? [];\n        this.placeholder = cfg.placeholder;\n        this.advancedOpen = cfg.showAdvanced ?? false;\n        this.mode = cfg.mode ?? 'auto';\n        const prevAllowSaveTags = this.allowSaveTags;\n        this.allowSaveTags = cfg.allowSaveTags;\n        const prevDebounce = this.changeDebounceMs;\n        this.changeDebounceMs = cfg.changeDebounceMs ?? 300;\n        // New\n        if (cfg.placeBooleansInActions !== undefined)\n          this.placeBooleansInActions = cfg.placeBooleansInActions;\n        if (cfg.showToggleLabels !== undefined)\n          this.showToggleLabels = cfg.showToggleLabels;\n        if (cfg.alwaysMinWidth !== undefined)\n          this.alwaysMinWidth = cfg.alwaysMinWidth;\n        if (cfg.alwaysColsMd !== undefined)\n          this.alwaysColsMd = cfg.alwaysColsMd;\n        if (cfg.alwaysColsLg !== undefined)\n          this.alwaysColsLg = cfg.alwaysColsLg;\n        if (cfg.autoSummary !== undefined)\n          this.autoSummary = cfg.autoSummary;\n        if (cfg.confirmTagDelete !== undefined)\n          this.confirmTagDelete = cfg.confirmTagDelete;\n        if (cfg.debugLayout !== undefined)\n          this.debugLayout = cfg.debugLayout;\n        if ((cfg as any).overlayVariant)\n          this.overlayVariant = (cfg as any).overlayVariant as any;\n        if ((cfg as any).overlayBackdrop !== undefined)\n          this.overlayBackdrop = !!(cfg as any).overlayBackdrop;\n        if ((cfg as any).advancedOpenMode)\n          this.advancedOpenMode = (cfg as any).advancedOpenMode as any;\n        if (cfg.tagColor) this.tagColor = cfg.tagColor;\n        if (cfg.tagVariant) this.tagVariant = cfg.tagVariant;\n        if (cfg.tagButtonColor) this.tagButtonColor = cfg.tagButtonColor;\n        if (cfg.actionsButtonColor) this.actionsButtonColor = cfg.actionsButtonColor;\n        if (cfg.actionsVariant) this.actionsVariant = cfg.actionsVariant;\n        this.mergeI18n();\n        this.applySchemaMetas();\n        this.updateDisplayedTags();\n        // If the user just enabled tag persistence, load saved tags immediately\n        if (this.allowSaveTags && !prevAllowSaveTags) {\n          this.loadSavedTagsFromStorage();\n        }\n        this.evaluateMode();\n        if (this.changeDebounceMs !== prevDebounce) {\n          this.bindQuickControlChanges();\n          this.bindAdvancedDebounce();\n        }\n      };\n\n      const persistConfig = (cfg: FilterConfig, message: string): void => {\n        this.saving = true;\n        try {\n          this.filterConfig.save(this.configKey, cfg);\n          this.snackBar.open(message, 'Fechar', { duration: 3000 });\n        } catch (err) {\n          console.error('PFILTER:config:save:error', err);\n          this.snackBar.open('Erro ao salvar configurações', 'Fechar', {\n            duration: 3000,\n          });\n        } finally {\n          this.saving = false;\n        }\n      };\n\n      const validateConfig = (cfg: FilterConfig): FilterConfig => {\n        // Se o schema ainda não foi carregado, não invalide o quickField nem os alwaysVisibleFields\n        if (!this.schemaMetas || this.schemaMetas.length === 0) {\n          return { ...cfg };\n        }\n        const names = new Set(this.schemaMetas.map((m) => m.name));\n        const quickField =\n          cfg.quickField && names.has(cfg.quickField)\n            ? cfg.quickField\n            : undefined;\n        const alwaysVisibleFields = cfg.alwaysVisibleFields?.filter((f) =>\n          names.has(f),\n        );\n        const clamp = {\n          minWidth: (v?: number) => {\n            if (v == null) return undefined as any;\n            return Math.min(480, Math.max(240, v));\n          },\n          colsMd: (v?: number) => {\n            if (v == null) return undefined as any;\n            return Math.min(3, Math.max(1, v));\n          },\n          colsLg: (v?: number) => {\n            if (v == null) return undefined as any;\n            return Math.min(4, Math.max(1, v));\n          },\n        };\n        return {\n          ...cfg,\n          quickField,\n          alwaysVisibleFields,\n          alwaysMinWidth: clamp.minWidth(cfg.alwaysMinWidth),\n          alwaysColsMd: clamp.colsMd(cfg.alwaysColsMd),\n          alwaysColsLg: clamp.colsLg(cfg.alwaysColsLg),\n          overlayVariant: (cfg as any).overlayVariant,\n          overlayBackdrop: (cfg as any).overlayBackdrop,\n        };\n      };\n\n      ref.applied$.pipe(take(1)).subscribe((cfg: FilterConfig) => {\n        const safe = validateConfig(cfg);\n        applyChanges(safe);\n        persistConfig(safe, 'Configurações aplicadas');\n        ref.close('save');\n      });\n\n      ref.saved$.pipe(take(1)).subscribe((cfg: FilterConfig) => {\n        const safe = validateConfig(cfg);\n        applyChanges(safe);\n        persistConfig(safe, 'Configurações salvas');\n      });\n    } catch (err) {\n      console.error('PFILTER:openSettings:error', err);\n      this.snackBar.open('Erro ao abrir configurações', 'Fechar', {\n        duration: 3000,\n      });\n    }\n  }\n\n  switchToFilter(): void {\n    if (this.modeState !== 'filter') {\n      this.modeState = 'filter';\n      this.modeChange.emit('filter');\n    }\n  }\n\n  createTag(label?: string): void {\n    if (!this.allowSaveTags) {\n      return;\n    }\n    const tagLabel =\n      label ?? (typeof prompt === 'function' ? prompt('Nome do atalho') : '');\n    if (!tagLabel) {\n      return;\n    }\n    const tag: FilterTag = {\n      id: Date.now().toString(),\n      label: tagLabel,\n      patch: { ...this.dto },\n    };\n    this.savedTags.push(tag);\n    this.persistTags();\n    this.updateDisplayedTags();\n    this.tagsChange.emit([...this.displayedTags]);\n  }\n\n  renameTag(tag: FilterTag, label?: string): void {\n    const newLabel = label ??\n      (typeof prompt === 'function'\n        ? prompt(this.i18nLabels.renameShortcut, tag.label)\n        : tag.label);\n    if (!newLabel || newLabel === tag.label) {\n      return;\n    }\n    tag.label = newLabel;\n    this.persistTags();\n    this.updateDisplayedTags();\n    this.tagsChange.emit([...this.displayedTags]);\n  }\n\n  deleteTag(tag: FilterTag): void {\n    if (this.confirmTagDelete && this.isUserTag(tag)) {\n      const ok = typeof confirm === 'function' ? confirm(this.i18nLabels.deleteShortcutConfirm) : true;\n      if (!ok) return;\n    }\n    this.savedTags = this.savedTags.filter((t) => t.id !== tag.id);\n    this.persistTags();\n    this.updateDisplayedTags();\n    this.tagsChange.emit([...this.displayedTags]);\n  }\n\n  // Métodos para edição inline de tags\n  startEditTag(tag: FilterTag, $event?: Event): void {\n    if ($event) $event.stopPropagation();\n    if (!this.isUserTag(tag)) return;\n    this.editingTagId = tag.id;\n    this.editingTagLabel.setValue(tag.label);\n  }\n  commitEditTag(tag: FilterTag, $event?: Event): void {\n    if ($event) $event.stopPropagation();\n    const value = this.editingTagLabel.value?.trim();\n    if (value && value !== tag.label) {\n      this.renameTag(tag, value);\n    }\n    this.editingTagId = undefined;\n  }\n  cancelEditTag($event?: Event): void {\n    if ($event) $event.stopPropagation();\n    this.editingTagId = undefined;\n  }\n\n  advancedForm?: FormGroup<Record<string, any>>;\n\n  // getFilterSchemaPath não é mais necessário, pois o serviço deriva o path via schemaUrl()\n\n  private buildFilteredSchemaContext(): SchemaIdParams & { baseUrl: string } {\n    // Derive path from schemaUrl (preserves prefixes) and ensure /filter suffix\n    const basePath = (this.crud.schemaUrl() || '').replace(/\\/+$/, '').replace(/\\/schemas$/, '');\n    let path = basePath ? `${basePath}/filter` : '';\n    if (!path) {\n      // Fallback path if schemaUrl is not available\n      path = `/${this.resourcePath.replace(/^\\/+|\\/+$/g, '')}/filter`;\n    }\n    // Operation and type for filter forms\n    const operation = 'post';\n    const schemaType: 'request' = 'request';\n    const baseUrl = this.crud.getSchemasFilteredBaseUrl();\n    let apiOrigin = '';\n    try { apiOrigin = new URL(baseUrl).origin; } catch {}\n    const tenant = this.global.getTenant();\n    const locale = (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined;\n    return { path, operation, schemaType, includeInternalSchemas: true, tenant, locale, baseUrl, apiOrigin };\n  }\n\n  private async loadSchemaViaClient(): Promise<FieldMetadata[]> {\n    const ctx = this.buildFilteredSchemaContext();\n    const client = new SchemaMetadataClient(new LocalStorageCacheAdapter({ ttlMs: 30 * 60 * 1000, maxEntries: 200 }));\n    const entry = await client.getSchema({\n      baseUrl: ctx.baseUrl,\n      path: ctx.path,\n      operation: ctx.operation,\n      schemaType: ctx.schemaType,\n      includeInternalSchemas: ctx.includeInternalSchemas,\n      tenant: ctx.tenant,\n      locale: ctx.locale,\n    });\n    const defs = this.schemaNormalizer.normalizeSchema(entry.schema);\n    const metas = mapFieldDefinitionsToMetadata(defs);\n    const schemaId = buildSchemaId(ctx);\n    this.lastSchemaMeta = { schemaId, serverHash: entry.schemaHash, context: ctx };\n    // Emit metadata to host\n    this.metaChanged.emit({ schemaId, serverHash: entry.schemaHash, context: ctx });\n    // Persist minimal meta for future verify-only calls\n    try {\n      const nowIso = new Date().toISOString();\n      this.configStorage.saveConfig(this.getSchemaMetaKey(), { serverHash: entry.schemaHash, lastVerifiedAt: nowIso });\n    } catch {}\n    return metas;\n  }\n\n  loadSchema(): void {\n    console.debug('[PFILTER] loadSchema: start');\n    if (this.schemaMetas) {\n      console.debug('[PFILTER] loadSchema: schema already present, applying metas');\n      this.applySchemaMetas();\n      return;\n    }\n    if (this.schemaLoading) {\n      console.debug('[PFILTER] loadSchema: already loading — skip');\n      return;\n    }\n\n    this.schemaLoading = true;\n    this.schemaError = false;\n    // Use SchemaMetadataClient with ETag/304 + schemaId context\n    this.loadSchemaViaClient()\n      .then((metas) => {\n        if (this.schemaError) return;\n        setTimeout(() => {\n          this.schemaLoading = false;\n          this.schemaMetas = metas;\n          console.debug('[PFILTER] loadSchema: metas received', { total: metas.length, names: metas.map(m => m.name) });\n          this.applySchemaMetas();\n        });\n      })\n      .catch((err) => {\n        console.error('PFILTER:schema:load:error', err);\n        setTimeout(() => {\n          this.schemaLoading = false;\n          this.schemaError = true;\n        });\n      });\n  }\n\n  private applySchemaMetas(): void {\n    this._dbgLastApplyMetasAt = Date.now();\n    console.debug('[PFILTER] applySchemaMetas: start', {\n      quickField: this.quickField,\n      alwaysVisibleFields: this.alwaysVisibleFields,\n      hasSchema: !!this.schemaMetas,\n      schemaCount: this.schemaMetas?.length ?? 0,\n    });\n    const metas = this.schemaMetas ?? [];\n    this.quickFieldMeta = undefined;\n    this.quickFieldMetaArray = [];\n    this.alwaysVisibleMetas = [];\n    this.toggleMetas = [];\n    this.alwaysFormReset$.next();\n    this.alwaysForm = new FormGroup<Record<string, FormControl<unknown>>>({});\n    this.advancedConfig = undefined;\n    if (this.quickField) {\n      const found = metas.find((m) => m.name === this.quickField);\n      if (found) {\n        this.quickFieldMeta = {\n          ...found,\n          density: 'compact',\n          updateOn: 'change',\n          materialDesign: { ...(found as any).materialDesign, floatLabel: 'always' },\n        } as FieldMetadata;\n        this.quickFieldMetaArray = [this.quickFieldMeta];\n        console.debug('[PFILTER] applySchemaMetas: quick field resolved', { name: this.quickFieldMeta.name, controlType: this.quickFieldMeta.controlType });\n        this.quickForm = new FormGroup<Record<string, AbstractControl>>({});\n        if (this.isViewInitialized) {\n          this.setupQuickField().catch(error => {\n            console.error('[QuickField] Setup failed, falling back to generic input:', error);\n            this.setupQuickFieldFallback();\n          });\n        } else {\n          this.pendingQuickFieldSetup = true;\n        }\n      } else {\n        console.debug('[PFILTER] applySchemaMetas: quick field not found in schema', { quickField: this.quickField });\n      }\n    } else {\n      // Ensure quick field array is cleared when quickField input is unset\n      this.quickFieldMetaArray = [];\n    }\n    const initialAlways = metas.filter((m) => this.alwaysVisibleFields?.includes(m.name));\n    const alwaysWithDensity = initialAlways.map((m) => ({\n      ...(m as any),\n      updateOn: 'change',\n      density: 'compact',\n      materialDesign: { ...((m as any).materialDesign || {}), floatLabel: 'always' },\n    })) as FieldMetadata[];\n    // Separar toggles (booleans simples) para a faixa de ações, se habilitado\n    const isToggle = (m: FieldMetadata) => (m as any).controlType === FieldControlType.TOGGLE;\n    if (this.placeBooleansInActions) {\n      const toggles = alwaysWithDensity.filter(isToggle);\n      this.toggleMetas = this.showToggleLabels\n        ? toggles\n        : toggles.map((m) => ({ ...(m as any), placeholder: m.label, label: '' } as FieldMetadata));\n      this.alwaysVisibleMetas = alwaysWithDensity.filter((m) => !isToggle(m));\n    } else {\n      this.alwaysVisibleMetas = alwaysWithDensity;\n      this.toggleMetas = [];\n    }\n    // Registrar controles para ambos os grupos dentro do mesmo FormGroup\n    console.debug('[PFILTER] applySchemaMetas: always/toggles', {\n      alwaysCount: this.alwaysVisibleMetas.length,\n      toggleCount: this.toggleMetas.length,\n      alwaysNames: this.alwaysVisibleMetas.map(m => m.name),\n      toggleNames: this.toggleMetas.map(m => m.name),\n    });\n    [...this.alwaysVisibleMetas, ...this.toggleMetas].forEach((m) => {\n      const ctrl = this.dynamicForm.createControlFromMetadata(m as any);\n      const initial = this.dto[m.name];\n      if (initial !== undefined) {\n        ctrl.setValue(initial, { emitEvent: false });\n      }\n      this.alwaysForm.addControl(m.name, ctrl as any);\n    });\n    console.debug('[PFILTER] applySchemaMetas: alwaysForm controls set', { controls: Object.keys(this.alwaysForm.controls) });\n    this.alwaysForm.valueChanges\n      .pipe(\n        debounceTime(this.changeDebounceMs),\n        takeUntil(this.alwaysFormReset$),\n        takeUntilDestroyed(this.destroyRef),\n      )\n      .subscribe((val) => this.advancedChange$.next(val));\n\n    let advancedMetas = metas\n      .filter((m) => m.name !== this.quickField && !this.alwaysVisibleFields?.includes(m.name))\n      .map((m) => ({ ...(m as any), updateOn: 'change' })) as FieldMetadata[];\n\n    // Quando o painel avançado abre em modal/gaveta, habilitar touchUi nos campos de data\n    if (this.advancedOpenMode === 'modal' || this.advancedOpenMode === 'drawer') {\n      advancedMetas = advancedMetas.map((m) => {\n        const ct = (m as any).controlType as string | undefined;\n        if (ct === 'date' || ct === 'dateRange' || ct === 'dateTime' || ct === 'dateTimeRange') {\n          return { ...(m as any), touchUi: true } as any;\n        }\n        return m;\n      });\n    }\n\n    if (advancedMetas.length) {\n      // Única linha com várias colunas: melhora responsividade via wrap no formulário filho\n      this.advancedConfig = {\n        sections: [\n          {\n            id: 'advanced',\n            rows: [\n              {\n                columns: advancedMetas.map((m) => ({ fields: [m.name] })),\n              },\n            ],\n          },\n        ],\n        fieldMetadata: advancedMetas,\n        metadata: this.lastSchemaMeta\n          ? {\n              schemaId: this.lastSchemaMeta.schemaId,\n              serverHash: this.lastSchemaMeta.serverHash,\n              schemaContext: this.lastSchemaMeta.context,\n            }\n          : undefined,\n      } as FormConfig;\n      console.debug('[PFILTER] applySchemaMetas: advancedConfig set', { count: advancedMetas.length, names: advancedMetas.map(m => m.name) });\n    }\n  }\n\n  // Debug: monitor unexpected identity changes triggering DFL\n  ngDoCheck(): void {\n    this._dbgDoCheckCount++;\n    const now = Date.now();\n    const sinceApply = now - this._dbgLastApplyMetasAt;\n\n    if (this._dbgPrevQuickArrayRef !== this.quickFieldMetaArray) {\n      console.debug('[PFILTER] DoCheck: quickFieldMetaArray ref changed', { sinceApplyMs: sinceApply, len: this.quickFieldMetaArray?.length ?? 0 });\n      this._dbgPrevQuickArrayRef = this.quickFieldMetaArray;\n    }\n    if (this._dbgPrevAlwaysArrayRef !== this.alwaysVisibleMetas) {\n      console.debug('[PFILTER] DoCheck: alwaysVisibleMetas ref changed', { sinceApplyMs: sinceApply, len: this.alwaysVisibleMetas?.length ?? 0 });\n      this._dbgPrevAlwaysArrayRef = this.alwaysVisibleMetas;\n    }\n    if (this._dbgPrevToggleArrayRef !== this.toggleMetas) {\n      console.debug('[PFILTER] DoCheck: toggleMetas ref changed', { sinceApplyMs: sinceApply, len: this.toggleMetas?.length ?? 0 });\n      this._dbgPrevToggleArrayRef = this.toggleMetas;\n    }\n    if (this._dbgPrevQuickFormRef !== this.quickForm) {\n      console.debug('[PFILTER] DoCheck: quickForm ref changed', { sinceApplyMs: sinceApply });\n      this._dbgPrevQuickFormRef = this.quickForm;\n    }\n    if (this._dbgPrevAlwaysFormRef !== this.alwaysForm) {\n      console.debug('[PFILTER] DoCheck: alwaysForm ref changed', { sinceApplyMs: sinceApply });\n      this._dbgPrevAlwaysFormRef = this.alwaysForm;\n    }\n  }\n\n  // DFL diagnostics from template bindings\n  onQuickComponents(map: Map<string, any>): void {\n    this._dbgLastQuickComponentsAt = Date.now();\n    console.debug('[PFILTER] Quick DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n  }\n  onQuickFieldCreated(ev: any): void {\n    console.debug('[PFILTER] Quick DFL fieldCreated', { name: ev?.field?.name, index: ev?.index });\n  }\n  onAlwaysComponents(map: Map<string, any>): void {\n    this._dbgLastAlwaysComponentsAt = Date.now();\n    console.debug('[PFILTER] Always DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n  }\n  onToggleComponents(map: Map<string, any>): void {\n    this._dbgLastToggleComponentsAt = Date.now();\n    console.debug('[PFILTER] Toggle DFL componentsCreated', { count: map?.size ?? 0, names: Array.from(map?.keys?.() || []) });\n  }\n\n  onAdvancedReady(event: { formGroup: FormGroup<Record<string, any>> }): void {\n    this.advancedForm = event.formGroup;\n    this.advancedForm.patchValue(this.dto, { emitEvent: false });\n    // Atualiza estado de validade inicial\n    this.advancedValid = this.advancedForm.valid;\n  }\n\n  onAdvancedChange(event: { formData: Record<string, any> }): void {\n    this.advancedChange$.next(event.formData);\n  }\n\n  // Novo: receber alterações de validade do form avançado\n  onAdvancedValidityChange(valid: boolean): void {\n    this.advancedValid = valid;\n  }\n\n  onAdvancedSubmit(event: { formData: Record<string, any> }): void {\n    // Bloquear submit se inválido\n    if (this.advancedForm && !this.advancedForm.valid) {\n      this.advancedForm.markAllAsTouched();\n      return;\n    }\n    // Mescla dados emitidos com quick e always\n    const advancedData = event?.formData ?? {};\n    const quickPatch = this.quickField ? { [this.quickField]: this.quickControl.value } : {};\n    const alwaysData = this.alwaysForm?.getRawValue?.() ?? {};\n    // Limpa valores vazios\n    const cleaned: Record<string, any> = {};\n    const assignClean = (src: Record<string, any>) => {\n      Object.keys(src || {}).forEach((k) => {\n        const v = (src as any)[k];\n        if (v !== '' && v !== null && v !== undefined) cleaned[k] = v;\n      });\n    };\n    assignClean(advancedData);\n    assignClean(quickPatch);\n    assignClean(alwaysData as any);\n    this.dto = cleaned;\n    this.activeFiltersCount = Object.keys(this.dto).length;\n    this.updateAutoSummary();\n    this.submit.emit({ ...this.dto });\n    this.persist();\n    if (this.mode === 'auto') this.evaluateMode();\n    // Fecha o overlay após aplicar\n    if (this.advancedOpen) {\n      this.closeAdvanced();\n    }\n  }\n\n  private closeAdvanced(): void {\n    this.advancedOpen = false;\n    this.anchorRef?.elementRef.nativeElement.focus();\n    this.saveConfig();\n  }\n\n  // =============================\n  // Auto Summary helpers\n  // =============================\n  get currentSummary(): any {\n    return this.summary ?? this.autoSummaryData;\n  }\n\n  get currentSummaryMap(): {\n    avatar?: (s: any) => string;\n    title: (s: any) => string;\n    subtitle?: (s: any) => string;\n    badges?: Array<(s: any) => string>;\n  } | undefined {\n    return this.summary ? this.summaryMap : (this.autoSummary ? this.defaultSummaryMap() : this.summaryMap);\n  }\n\n  private updateAutoSummary(): void {\n    if (!this.autoSummary) {\n      this.autoSummaryData = undefined;\n      return;\n    }\n    const entries = Object.entries(this.dto);\n    if (!entries.length) {\n      this.autoSummaryData = undefined;\n      return;\n    }\n    const maxBadges = 5;\n    const badges = entries.slice(0, maxBadges).map(([k, v]) => {\n      const label = this.getFieldLabel(k) || k;\n      return `${label}=${this.formatValueForBadge(k, v)}`;\n    });\n    const extra = entries.length > maxBadges ? ` +${entries.length - maxBadges}` : '';\n    if (entries.length > maxBadges) {\n      badges.push(`+${entries.length - maxBadges}`);\n    }\n    this.autoSummaryData = {\n      count: entries.length,\n      dto: { ...this.dto },\n      badges,\n      title: `${entries.length} filtro${entries.length > 1 ? 's' : ''} ativo${entries.length > 1 ? 's' : ''}` + extra,\n    };\n  }\n\n  private defaultSummaryMap() {\n    return {\n      title: (s: any) => s?.title || `${s?.count ?? 0} filtro${(s?.count ?? 0) > 1 ? 's' : ''} ativo${(s?.count ?? 0) > 1 ? 's' : ''}`,\n      subtitle: (_s: any) => '',\n      badges: (this.autoSummaryData?.badges as string[])?.map((b) => (() => b)) ?? [],\n    } as {\n      title: (s: any) => string;\n      subtitle?: (s: any) => string;\n      badges?: Array<(s: any) => string>;\n    };\n  }\n\n  /** Salva o estado atual dos filtros como um atalho (tag) do usuário */\n  saveCurrentAsTag(): void {\n    try {\n      const dto = { ...(this.advancedForm?.getRawValue?.() || this.dto || {}) };\n      if (!Object.keys(dto).length) return;\n      const label = prompt(this.i18nLabels.saveAsShortcut || 'Salvar como atalho', '') || '';\n      if (!label.trim()) return;\n      const tag: FilterTag = { id: Date.now().toString(), label: label.trim(), patch: dto } as any;\n      this.savedTags.push(tag);\n      this.persistTags();\n      this.updateDisplayedTags();\n    } catch {}\n  }\n\n  private formatValueForBadge(fieldName: string, v: any): string {\n    if (v === null || v === undefined) return '';\n    // Array: traduz item a item\n    if (Array.isArray(v)) return v.map((it) => this.formatValueForBadge(fieldName, it)).join(',');\n    // Try map via options (enum/select) when available\n    const opt = this.getOptionText(fieldName, v);\n    if (opt) return opt;\n    // Boolean in pt-BR\n    if (typeof v === 'boolean') return v ? 'Sim' : 'Não';\n    if (v instanceof Date) return v.toISOString().slice(0, 10);\n    if (typeof v === 'object') return JSON.stringify(v);\n    return String(v);\n  }\n\n  /**\n   * Resolve a user-friendly label for a filter key using the loaded FieldMetadata.\n   * Falls back to the key itself when metadata is not available.\n   */\n  private getFieldLabel(name: string): string | undefined {\n    // Prefer schemaMetas when available\n    const metas = this.schemaMetas || this.advancedConfig?.fieldMetadata || [];\n    try {\n      const found = metas.find((m: any) => m?.name === name);\n      return (found?.label as string | undefined) || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /** Resolve option display text from FieldMetadata.options, when present */\n  private getOptionText(name: string, value: any): string | undefined {\n    const metas = this.schemaMetas || this.advancedConfig?.fieldMetadata || [];\n    try {\n      const found = metas.find((m: any) => m?.name === name);\n      const opts: any[] | undefined = (found as any)?.options as any[] | undefined;\n      if (!opts || !opts.length) return undefined;\n      const match = opts.find((o: any) => (o?.value === value) || (String(o?.value) === String(value)));\n      return match?.text as string | undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  // Helper A11y: label do botão Avançado com contagem\n  getAdvancedAriaLabel(): string {\n    const count = this.activeFiltersCount || 0;\n    if (!count) return this.i18nLabels.advanced;\n    const plural = count > 1 ? 's' : '';\n    return `${this.i18nLabels.advanced}, ${count} filtro${plural} ativo${plural}`;\n  }\n\n  // =============================\n  // Schema verification (ETag) + persistence helpers\n  // =============================\n  private getSchemaMetaKey(): string {\n    const id = this.formId || 'default';\n    return `filter-schema-meta:${id}`;\n  }\n  private getOutdatedIgnoreKey(serverHash: string): string {\n    const id = this.formId || 'default';\n    return `schemaIgnore:${id}:${serverHash}`;\n  }\n  private getOutdatedSnoozeKey(serverHash: string): string {\n    const id = this.formId || 'default';\n    return `schemaSnooze:${id}:${serverHash}`;\n  }\n  private getOutdatedNotifiedKey(serverHash: string): string {\n    const id = this.formId || 'default';\n    return `schemaNotified:${id}:${serverHash}`;\n  }\n  private isOutdatedIgnored(serverHash?: string): boolean {\n    if (!serverHash) return false;\n    try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedIgnoreKey(serverHash)); } catch { return false; }\n  }\n  private getOutdatedSnoozeUntil(serverHash?: string): number | undefined {\n    if (!serverHash) return undefined;\n    try {\n      const v = this.configStorage.loadConfig<string>(this.getOutdatedSnoozeKey(serverHash));\n      if (!v) return undefined;\n      const t = Date.parse(v);\n      return isNaN(t) ? undefined : t;\n    } catch { return undefined; }\n  }\n  private setOutdatedSnooze(serverHash?: string, until?: Date): void {\n    if (!serverHash) return;\n    try {\n      if (!until) {\n        this.configStorage.clearConfig(this.getOutdatedSnoozeKey(serverHash));\n      } else {\n        this.configStorage.saveConfig(this.getOutdatedSnoozeKey(serverHash), until.toISOString());\n      }\n    } catch {}\n  }\n  private setOutdatedIgnore(serverHash?: string, val = true): void {\n    if (!serverHash) return;\n    try {\n      if (!val) this.configStorage.clearConfig(this.getOutdatedIgnoreKey(serverHash));\n      else this.configStorage.saveConfig(this.getOutdatedIgnoreKey(serverHash), true);\n    } catch {}\n  }\n  private setOutdatedNotified(serverHash?: string): void {\n    if (!serverHash) return;\n    try { this.configStorage.saveConfig(this.getOutdatedNotifiedKey(serverHash), true); } catch {}\n  }\n  private wasOutdatedNotified(serverHash?: string): boolean {\n    if (!serverHash) return false;\n    try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedNotifiedKey(serverHash)); } catch { return false; }\n  }\n\n  private async verifyServerSchemaVersion(): Promise<void> {\n    try {\n      if (!this.resourcePath || !this.formId) return;\n      // Build request to /schemas/filtered for filter (path=/.../filter, operation=post, schemaType=request)\n      const baseUrl = this.crud.getSchemasFilteredBaseUrl();\n      const basePath = (this.crud.schemaUrl() || '').replace(/\\/+$/, '').replace(/\\/schemas$/, '');\n      let path = basePath ? `${basePath}/filter` : `/${(this.resourcePath || '').replace(/^\\/+|\\/+$/g, '')}/filter`;\n      const u = new URL(baseUrl);\n      u.searchParams.set('path', path);\n      u.searchParams.set('operation', 'post');\n      u.searchParams.set('schemaType', 'request');\n      u.searchParams.set('includeInternalSchemas', 'true');\n\n      // Load previously persisted meta (serverHash)\n      const persistedMeta = (() => { try { return this.configStorage.loadConfig<any>(this.getSchemaMetaKey()); } catch { return undefined; } })();\n      const previousHash = (persistedMeta?.serverHash as string | undefined) || this.lastSchemaMeta?.serverHash;\n      // If we have no prior hash and no in-memory schema, skip verification to avoid an extra full GET.\n      // The initial loadSchema() will fetch the body and persist the hash.\n      if (!previousHash && !this.schemaMetas?.length) {\n        return;\n      }\n      const tenant = (() => { try { return this.global.getTenant(); } catch { return undefined; } })();\n      const locale = (() => { try { return (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined; } catch { return undefined; } })();\n\n      const res = await fetchWithETag({ url: u.toString(), schemaHash: previousHash, tenant, locale });\n      const nowIso = new Date().toISOString();\n      const metaToSave: any = { ...(persistedMeta || {}) };\n      metaToSave.lastVerifiedAt = nowIso;\n\n      if (res.status === 304) {\n        try { this.configStorage.saveConfig(this.getSchemaMetaKey(), metaToSave); } catch {}\n        if (this.schemaOutdated) this.schemaOutdated = false;\n        this.schemaStatusChange.emit({ outdated: false, serverHash: metaToSave.serverHash, lastVerifiedAt: metaToSave.lastVerifiedAt, formId: this.formId });\n        return;\n      }\n\n      // status === 200: server hash changed (or first verification without hash). Do not apply schema here.\n      const newHash = (res as any).schemaHash as string | undefined;\n      metaToSave.serverHash = newHash;\n      try { this.configStorage.saveConfig(this.getSchemaMetaKey(), metaToSave); } catch {}\n\n      // Only mark outdated when there was a previous base (hash or schemaMetas) and we are in edit mode\n      const hadBase = !!previousHash || !!this.schemaMetas?.length;\n      this.schemaOutdated = !!(this.editModeEnabled && hadBase);\n      this.schemaStatusChange.emit({ outdated: this.schemaOutdated, serverHash: newHash, lastVerifiedAt: metaToSave.lastVerifiedAt, formId: this.formId });\n\n      if (this.schemaOutdated) {\n        if (this._resolvedPrefs.autoOpenSettingsOnOutdated) {\n          this.openSettings();\n        } else {\n          this.maybeShowOutdatedSnack();\n        }\n      }\n    } catch {\n      // ignore verification errors; filter remains functional\n    }\n  }\n\n  private maybeShowOutdatedSnack(): void {\n    if (!this.editModeEnabled) return;\n    if (this._resolvedPrefs.notifyIfOutdated === 'none') return;\n    const serverHash = (this.configStorage.loadConfig<any>(this.getSchemaMetaKey()) || {})?.serverHash as string | undefined;\n    if (!serverHash || !this.schemaOutdated) return;\n    if (this.isOutdatedIgnored(serverHash)) return;\n    const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n    if (snoozeUntil && Date.now() < snoozeUntil) return;\n    if (!(this._resolvedPrefs.notifyIfOutdated === 'snackbar' || this._resolvedPrefs.notifyIfOutdated === 'both')) return;\n    if (this.wasOutdatedNotified(serverHash)) return;\n    try {\n      const ref = this.snackBar.open('O schema do servidor mudou.', 'Reconciliar', { duration: 8000 });\n      ref.onAction().subscribe(() => {\n        this.openSettings();\n      });\n      ref.afterDismissed().subscribe(() => {\n        // Snooze on dismiss\n        const until = new Date(Date.now() + Math.max(0, this._resolvedPrefs.snoozeMs || 0));\n        this.setOutdatedSnooze(serverHash, until);\n      });\n      this.setOutdatedNotified(serverHash);\n    } catch {}\n  }\n\n  // =============================================================================\n  // STANDALONE QUICK FIELD IMPLEMENTATION - SAFE ISOLATED METHODS\n  // =============================================================================\n\n  /**\n   * Sets up Quick Field creating a control from metadata and wiring it to quickForm.\n   * Falls back to generic input if creation fails.\n   */\n  private async setupQuickField(): Promise<void> {\n    // Prevent multiple concurrent setup operations\n    if (this.isQuickFieldSetupInProgress) {\n      console.debug('[QuickField] Setup already in progress, skipping duplicate call');\n      return;\n    }\n\n    if (!this.quickField || !this.quickFieldMeta) {\n      console.warn('[QuickField] Missing required dependencies (quickField or quickFieldMeta), using fallback');\n      this.ensureFallbackSetup();\n      return;\n    }\n\n    this.isQuickFieldSetupInProgress = true;\n\n    try {\n      console.info('[QuickField] Setting up dynamic field:', {\n        fieldName: this.quickField,\n        controlType: this.quickFieldMeta.controlType\n      });\n\n      // Create FormControl from metadata using DynamicFormService (preserves validators/updateOn)\n      const created = this.dynamicForm.createControlFromMetadata(this.quickFieldMeta as any);\n\n      // Remover verificação redundante e fazer cast seguro\n      const control = created as FormControl<any>;\n\n      const previousControl = this.quickControl;\n      this.quickControl = control;\n      this.quickFieldMode = 'dynamic';\n\n      // Replace control in quickForm\n      this.quickForm.removeControl(this.quickField);\n      this.quickForm.addControl(this.quickField, control);\n\n      if (previousControl && previousControl !== control) {\n        console.debug('[QuickField] Replaced previous FormControl reference');\n      }\n\n      if (this.pendingQuickValue !== undefined) {\n        this.applyPendingQuickValue(control);\n      }\n\n      // Reassinar assinaturas do quickControl com o debounce atual\n      this.bindQuickControlChanges();\n    } catch (error) {\n      console.error('[QuickField] Error setting up dynamic field, falling back to generic input:', error);\n      this.setupQuickFieldFallback();\n    } finally {\n      this.isQuickFieldSetupInProgress = false;\n    }\n  }\n\n  /**\n   * Ensures fallback setup happens only once, preventing multiple executions.\n   */\n  private ensureFallbackSetup(): void {\n    if (this.isQuickFieldSetupInProgress) {\n      console.debug('[QuickField] Fallback setup skipped - setup already in progress');\n      return;\n    }\n\n    if (this.quickFieldMode === 'fallback') {\n      console.debug('[QuickField] Already in fallback mode, skipping duplicate setup');\n      return;\n    }\n\n    this.setupQuickFieldFallback();\n  }\n\n  /**\n   * Fallback method - maintains current behavior with generic string input.\n   * This ensures the system continues working even if dynamic creation fails.\n   */\n  private setupQuickFieldFallback(): void {\n    console.info('[QuickField] Using fallback mode with generic string input');\n\n    // Use original logic - generic string FormControl\n    const previousControl = this.quickControl;\n    const newControl = new FormControl<string>('', { nonNullable: true });\n    this.quickControl = newControl;\n    this.quickFieldMode = 'fallback';\n\n    if (this.quickField) {\n      this.quickForm.removeControl(this.quickField);\n      this.quickForm.addControl(this.quickField, this.quickControl);\n\n      if (previousControl && previousControl !== newControl) {\n        console.debug('[QuickField] Cleaned up previous FormControl reference in fallback mode');\n      }\n\n      if (this.pendingQuickValue !== undefined) {\n        this.quickControl.setValue(this.pendingQuickValue, { emitEvent: false });\n        this.pendingQuickValue = undefined;\n      }\n\n      // Reassinar assinaturas do quickControl com o debounce atual\n      this.bindQuickControlChanges();\n    }\n  }\n\n  /**\n   * Applies pending quick value to typed control with proper conversion.\n   */\n  private applyPendingQuickValue(control: AbstractControl): void {\n    if (this.pendingQuickValue === undefined) return;\n\n    try {\n      const controlType = this.quickFieldMeta?.controlType;\n      let convertedValue: any = this.pendingQuickValue;\n\n      // Convert value to appropriate type only when necessary\n      if ((controlType === FieldControlType.DATE_INPUT || controlType === FieldControlType.DATE_PICKER)) {\n        if (typeof convertedValue === 'string') {\n          convertedValue = convertedValue ? new Date(convertedValue) : null;\n        }\n      } else if (controlType === FieldControlType.NUMERIC_TEXT_BOX || controlType === FieldControlType.CURRENCY_INPUT) {\n        if (typeof convertedValue === 'string') {\n          convertedValue = convertedValue ? parseFloat(convertedValue) : null;\n        }\n      } else if (controlType === FieldControlType.CHECKBOX) {\n        if (typeof convertedValue === 'string') {\n          convertedValue = convertedValue === 'true';\n        }\n      } else if (controlType === FieldControlType.MULTI_SELECT) {\n        convertedValue = Array.isArray(convertedValue) ? convertedValue : [convertedValue];\n      }\n\n      control.setValue(convertedValue, { emitEvent: false });\n      console.debug('[QuickField] Applied pending value:', { original: this.pendingQuickValue, converted: convertedValue });\n    } catch (error) {\n      console.error('[QuickField] Error applying pending value:', error);\n      control.setValue(this.pendingQuickValue, { emitEvent: false });\n    } finally {\n      this.pendingQuickValue = undefined;\n    }\n  }\n\n  // =============================\n  // QUICK FIELD UX HELPERS (icon, input type/mode)\n  // =============================\n  getQuickFieldIcon(): string {\n    const type = this.quickFieldMeta?.controlType;\n    switch (type) {\n      case FieldControlType.DATE_INPUT:\n      case FieldControlType.DATE_PICKER:\n        return 'event';\n      case FieldControlType.NUMERIC_TEXT_BOX:\n        return 'pin';\n      case FieldControlType.CURRENCY_INPUT:\n        return 'payments';\n      case FieldControlType.SELECT:\n      case FieldControlType.MULTI_SELECT:\n      case FieldControlType.AUTO_COMPLETE:\n        return 'filter_list';\n      case FieldControlType.CHECKBOX:\n        return 'check_box';\n      default:\n        return 'search';\n    }\n  }\n\n  getQuickInputType(): string {\n    const type = this.quickFieldMeta?.controlType;\n    if (type === FieldControlType.DATE_INPUT || type === FieldControlType.DATE_PICKER) {\n      return 'date';\n    }\n    if (type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT) {\n      return 'text'; // keep text to allow custom formatting; using number may block some locales\n    }\n    return 'text';\n  }\n\n  getQuickInputMode(): string | null {\n    const type = this.quickFieldMeta?.controlType;\n    if (type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT) {\n      return 'decimal';\n    }\n    return null;\n  }\n\n  ngOnDestroy(): void {\n    // Clear pending operations\n    this.pendingQuickFieldSetup = false;\n    this.isViewInitialized = false;\n    this.isQuickFieldSetupInProgress = false;\n    try { this.resizeObs?.disconnect?.(); } catch {}\n    try { this.mutationObs?.disconnect?.(); } catch {}\n\n    // Clear any pending quick value\n    this.pendingQuickValue = undefined;\n    this.quickSub?.unsubscribe();\n    this.advancedDebouncedSub?.unsubscribe();\n  }\n\n  // =============================\n  // Tag helpers\n  // =============================\n  isUserTag(tag: FilterTag): boolean {\n    return this.savedTags?.some((t) => t.id === tag.id) ?? false;\n  }\n\n  applyTag(tag: FilterTag): void {\n    if (!tag) return;\n    try {\n      // Atualiza DTO primeiro\n      this.dto = { ...(tag.patch ?? {}) };\n\n      // Quick field\n      if (this.quickField) {\n        const qv = this.dto[this.quickField];\n        this.quickControl.setValue(qv ?? '', { emitEvent: false });\n      }\n\n      // Always visible\n      Object.keys(this.dto).forEach((k) => {\n        const ctrl = this.alwaysForm.get(k);\n        if (ctrl) {\n          ctrl.setValue((this.dto as any)[k], { emitEvent: false });\n        }\n      });\n\n      // Advanced form (patch em lote)\n      this.advancedForm?.patchValue(this.dto, { emitEvent: false });\n\n      // Atualiza contadores/resumo e persiste\n      this.activeFiltersCount = Object.keys(this.dto).length;\n      this.updateAutoSummary();\n      this.persist();\n\n      // Dispara busca imediatamente ao aplicar atalho\n      this.submit.emit({ ...this.dto });\n      if (this.mode === 'auto') this.evaluateMode();\n    } catch (err) {\n      console.error('PFILTER:applyTag:error', err);\n    }\n  }\n\n  // =============================\n  // Quick field fallback input helpers\n  // =============================\n  onQuickNumericKeypress(event: KeyboardEvent): void {\n    const type = this.quickFieldMeta?.controlType;\n    const numeric = type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT;\n    if (!numeric) return;\n\n    const allowedChars = '0123456789.,-';\n    const key = event.key;\n    const isControl = key.length > 1 || event.ctrlKey || event.metaKey || event.altKey;\n    if (isControl) return;\n    if (!allowedChars.includes(key)) {\n      event.preventDefault();\n    }\n  }\n\n  onQuickBlurFormat(): void {\n    const type = this.quickFieldMeta?.controlType;\n    const numeric = type === FieldControlType.NUMERIC_TEXT_BOX || type === FieldControlType.CURRENCY_INPUT;\n    if (!numeric) return;\n    const raw = this.quickControl.value;\n    if (typeof raw === 'string') {\n      const trimmed = raw.trim();\n      this.quickControl.setValue(trimmed, { emitEvent: false });\n    }\n  }\n\n  // =============================\n  // Debounce bindings for quick/advanced changes\n  // =============================\n  private bindQuickControlChanges(): void {\n    // Recria a assinatura com o debounce atual\n    this.quickSub?.unsubscribe();\n    this.quickSub = this.quickControl.valueChanges\n      .pipe(debounceTime(this.changeDebounceMs), takeUntilDestroyed(this.destroyRef))\n      .subscribe((val) => {\n        if (this.quickField) {\n          if (val === undefined || val === null || val === '') {\n            delete this.dto[this.quickField];\n          } else {\n            this.dto[this.quickField] = val;\n          }\n        }\n        this.activeFiltersCount = Object.keys(this.dto).length;\n        this.updateAutoSummary();\n        this.change.emit({ ...this.dto });\n        this.persist();\n        if (this.mode === 'auto') this.evaluateMode();\n      });\n  }\n\n  private bindAdvancedDebounce(): void {\n    this.advancedDebouncedSub?.unsubscribe();\n    this.advancedDebouncedSub = this.advancedChange$\n      .pipe(debounceTime(this.changeDebounceMs), takeUntilDestroyed(this.destroyRef))\n      .subscribe((val) => {\n        const data = val ?? {};\n        Object.keys(data).forEach((key) => {\n          const value = (data as any)[key];\n          if (value === undefined || value === null || value === '') {\n            delete this.dto[key];\n          } else {\n            this.dto[key] = value;\n          }\n        });\n        this.activeFiltersCount = Object.keys(this.dto).length;\n        this.updateAutoSummary();\n        this.change.emit({ ...this.dto });\n        this.persist();\n        if (this.mode === 'auto') this.evaluateMode();\n      });\n  }\n\n  onSubmit(): void {\n    // Throttle simples para evitar submits duplicados em curto intervalo\n    const now = Date.now();\n    if (now - this.lastSubmitAt < 300) {\n      return;\n    }\n    this.lastSubmitAt = now;\n\n    // Impedir submit se o avançado estiver aberto e inválido\n    if (this.advancedOpen && this.advancedForm && !this.advancedForm.valid) {\n      this.advancedForm.markAllAsTouched();\n      return;\n    }\n\n    this.syncFormsToDto();\n    this.activeFiltersCount = Object.keys(this.dto).length;\n    this.updateAutoSummary();\n    this.submit.emit({ ...this.dto });\n    this.persist();\n    if (this.mode === 'auto') {\n      this.evaluateMode();\n    }\n  }\n\n  onClear(): void {\n    this.quickControl.setValue('', { emitEvent: false });\n    this.alwaysForm.reset(undefined, { emitEvent: false });\n    this.advancedForm?.reset(undefined, { emitEvent: false });\n    this.dto = {};\n    this.activeFiltersCount = 0;\n    this.updateAutoSummary();\n    this.clear.emit();\n    this.change.emit({});\n    this.clearPersisted();\n    if (this.mode === 'auto') {\n      this.evaluateMode();\n    }\n    if (this.advancedOpen) {\n      this.closeAdvanced();\n    }\n  }\n\n  quickHasValue(): boolean {\n    const v = this.quickControl?.value;\n    return v !== undefined && v !== null && v !== '';\n  }\n\n  // (old overlay toggler removed — now handled by unified method below)\n\n  // Detecta interações vindas de overlays filhos do Material/CDK (ex.: datepicker, autocomplete, select)\n  private isEventFromNestedOverlay(target?: EventTarget | null): boolean {\n    try {\n      const el = target as HTMLElement | null;\n      if (!el) return false;\n      return !!el.closest('.cdk-overlay-pane');\n    } catch {\n      return false;\n    }\n  }\n\n  onOverlayDetach(): void {\n    this.advancedOpen = false;\n    this.anchorRef?.elementRef.nativeElement.focus();\n    this.saveConfig();\n  }\n\n  // Fecha ao clicar fora do overlay (sem backdrop)\n  onOverlayOutsideClick(_event: MouseEvent): void {\n    // Ignorar o primeiro outsideClick logo após abrir (mesmo clique que abriu)\n    if (Date.now() < this.ignoreOutsideUntil) {\n      return;\n    }\n    // Ignorar cliques disparados por overlays filhos (datepicker, select, autocomplete, timepicker...)\n    const target = _event.target as HTMLElement | null;\n    if (this.isEventFromNestedOverlay(target)) {\n      return;\n    }\n    if (this.advancedOpen) {\n      this.closeAdvanced();\n    }\n  }\n\n  private async openAdvancedModal(): Promise<void> {\n    const { FilterFormDialogHostComponent } = await import('./filter-form-dialog-host.component');\n    const ref = this.dialog.open(FilterFormDialogHostComponent, {\n      width: '780px',\n      maxWidth: '96vw',\n      data: {\n        formId: this.formId,\n        resourcePath: this.resourcePath,\n        config: this.advancedConfig,\n        initialDto: this.advancedForm?.getRawValue?.() || this.dto || {},\n        schemaLoading: this.schemaLoading,\n      },\n    });\n    const result = await ref.afterClosed().toPromise();\n    if (result && result.formData) {\n      // reuse merge-and-submit logic\n      this.onAdvancedSubmit({ formData: result.formData });\n    }\n  }\n\n  private async openAdvancedDrawer(): Promise<void> {\n    if (!this.filterDrawerAdapter) {\n      await this.openAdvancedModal();\n      return;\n    }\n    // Ensure schema/advancedConfig before opening the drawer to avoid undefined config\n    if (!this.advancedConfig) {\n      if (!this.schemaLoading) this.loadSchema();\n      await new Promise<void>((resolve) => {\n        const start = Date.now();\n        const tick = () => {\n          if (this.advancedConfig) return resolve();\n          // Safety timeout (2s) to prevent infinite waits in case of backend errors\n          if (Date.now() - start > 2000) return resolve();\n          setTimeout(tick, 50);\n        };\n        tick();\n      });\n    }\n    const initialDto = this.advancedForm?.getRawValue?.() || this.dto || {};\n    this.filterDrawerAdapter.open({\n      resourcePath: this.resourcePath,\n      formId: this.formId,\n      config: this.advancedConfig,\n      initialDto,\n      title: 'Filtro Avançado',\n      onSubmit: (formData: Record<string, any>) => this.onAdvancedSubmit({ formData }),\n      onClose: () => {\n        // no-op; host controls drawer lifecycle\n      },\n    });\n  }\n\n  toggleAdvanced(): void {\n    if (this.advancedOpenMode === 'overlay') {\n      this.advancedOpen = !this.advancedOpen;\n      if (this.advancedOpen) {\n        // Prepare overlay origin and compute width\n        this.overlayOrigin = this.anchorRef;\n        this.updateOverlayWidth();\n        // On-demand schema fetch for advanced panel\n        if (!this.schemaMetas && !this.schemaLoading) {\n          this.loadSchema();\n        }\n      }\n      this.saveConfig();\n      return;\n    }\n    if (this.advancedOpenMode === 'modal') {\n      if (!this.schemaMetas && !this.schemaLoading) this.loadSchema();\n      this.openAdvancedModal();\n      return;\n    }\n    if (this.advancedOpenMode === 'drawer') {\n      if (!this.schemaMetas && !this.schemaLoading) this.loadSchema();\n      this.openAdvancedDrawer();\n      return;\n    }\n  }\n\n  private saveConfig(): void {\n    const config: FilterConfig = {\n      quickField: this.quickField,\n      alwaysVisibleFields: this.alwaysVisibleFields,\n      placeholder: this.placeholder,\n      showAdvanced: this.advancedOpen,\n      mode: this.mode,\n      allowSaveTags: this.allowSaveTags,\n      changeDebounceMs: this.changeDebounceMs,\n      placeBooleansInActions: this.placeBooleansInActions,\n      showToggleLabels: this.showToggleLabels,\n      alwaysMinWidth: this.alwaysMinWidth,\n      alwaysColsMd: this.alwaysColsMd,\n      alwaysColsLg: this.alwaysColsLg,\n      autoSummary: this.autoSummary,\n      confirmTagDelete: this.confirmTagDelete,\n      debugLayout: this.debugLayout,\n      tagColor: this.tagColor,\n      tagVariant: this.tagVariant,\n      tagButtonColor: this.tagButtonColor,\n      actionsButtonColor: this.actionsButtonColor,\n      actionsVariant: this.actionsVariant,\n      overlayVariant: this.overlayVariant,\n      overlayBackdrop: this.overlayBackdrop,\n      advancedOpenMode: this.advancedOpenMode,\n      showQuickFallback: this.showQuickFallback,\n    };\n    this.filterConfig.save(this.configKey, config);\n  }\n\n  private mergeI18n(): void {\n    this.i18nLabels = {\n      ...DEFAULT_I18N,\n      ...(this.placeholder ? { searchPlaceholder: this.placeholder } : {}),\n      ...this.i18n,\n    };\n  }\n\n  private persist(): void {\n    const key = this.persistenceKey ?? this.configKey;\n    if (key) {\n      this.configStorage.saveConfig(key, this.dto);\n    }\n  }\n\n  private clearPersisted(): void {\n    const key = this.persistenceKey ?? this.configKey;\n    if (key) {\n      this.configStorage.clearConfig(key);\n    }\n  }\n\n  private persistTags(): void {\n    if (this.allowSaveTags) {\n      this.configStorage.saveConfig(`${this.configKey}:tags`, this.savedTags);\n    }\n  }\n\n  private syncFormsToDto(): void {\n    // Mescla os valores dos forms (quick, always, advanced) no DTO\n    const quickPatch = this.quickField ? { [this.quickField]: this.quickControl.value } : {};\n    const alwaysData = this.alwaysForm?.getRawValue?.() ?? {};\n    const advancedData = this.advancedForm?.getRawValue?.() ?? {};\n    this.dto = {\n      ...this.dto,\n      ...quickPatch,\n      ...alwaysData,\n      ...advancedData,\n    };\n  }\n\n  onQuickClear(): void {\n    this.quickControl.setValue('');\n  }\n\n  private updateDisplayedTags(): void {\n    this.displayedTags = [...(this.tags ?? []), ...this.savedTags];\n  }\n\n  private evaluateMode(): void {\n    const prev = this.modeState;\n    if (this.mode === 'filter' || this.mode === 'card') {\n      this.modeState = this.mode;\n    } else {\n      const hasSummary = !!this.summary || (this.autoSummary && this.activeFiltersCount > 0);\n      this.modeState = hasSummary ? 'card' : 'filter';\n    }\n    if (this.modeState !== prev) {\n      if (this.modeState === 'card') {\n        this.advancedOpen = false;\n      }\n      this.modeChange.emit(this.modeState);\n    }\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  onGlobalKeydown(event: KeyboardEvent): void {\n    try {\n      // Atalho: \"/\" foca o quick, exceto quando já está digitando em um campo\n      if (event.key === '/' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n        const target = event.target as HTMLElement | null;\n        if (!this.isEditableElement(target)) {\n          event.preventDefault();\n          this.focusQuick();\n          return;\n        }\n      }\n    } catch {\n      // ignora erros de foco\n    }\n  }\n\n  private isEditableElement(el?: HTMLElement | null): boolean {\n    if (!el) return false;\n    const tag = (el.tagName || '').toLowerCase();\n    if (tag === 'input' || tag === 'textarea' || tag === 'select') return true;\n    if ((el as any).isContentEditable) return true;\n    return false;\n  }\n\n  private focusQuick(): void {\n    try {\n      const host = this.anchorRef?.elementRef?.nativeElement as HTMLElement | undefined;\n      if (!host) return;\n      const focusable = host.querySelector(\n        'input, textarea, select, [contenteditable=\"true\"], .mat-mdc-select-trigger'\n      ) as HTMLElement | null;\n      if (focusable && typeof focusable.focus === 'function') {\n        focusable.focus();\n      } else if (typeof (host as any).focus === 'function') {\n        (host as any).focus();\n      }\n    } catch {\n      // no-op\n    }\n  }\n}\n","<ng-container *ngIf=\"modeState === 'filter'; else summaryCard\">\n  <mat-progress-bar *ngIf=\"saving\" mode=\"indeterminate\"></mat-progress-bar>\n\n  <form class=\"praxis-filter-bar\" [class.is-open]=\"advancedOpen\" (submit)=\"onSubmit(); $event.preventDefault()\">\n    <!-- QUICK FIELD (oculto quando não há Quick e existem campos sempre visíveis, salvo override) -->\n    <ng-container *ngIf=\"showQuickBar(); else noQuick\">\n    <div class=\"quick-field\" *ngIf=\"quickFieldMeta; else fallbackQuick\">\n      <div class=\"filter-anchor quick-shell\" #anchorRef=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n\n        <!-- dinâmico: envolvido por host para garantir layout flex correto -->\n        <div *ngIf=\"quickFieldMode === 'dynamic'\" class=\"quick-field-host\" #quickHostRef\n             dynamicFieldLoader\n             [fields]=\"quickFieldMetaArray\"\n             [formGroup]=\"quickForm\"\n             (componentsCreated)=\"onQuickComponents($event)\"\n             (fieldCreated)=\"onQuickFieldCreated($event)\">\n        </div>\n\n        <!-- fallback (com meta) — sem suffix, só o input -->\n        <mat-form-field *ngIf=\"quickFieldMode === 'fallback'\"\n                        appearance=\"outline\"\n                        floatLabel=\"always\"\n                        class=\"fallback-quick-field\">\n          <mat-label>{{ quickFieldMeta.label || quickField }}</mat-label>\n          <input matInput [formControl]=\"quickControl\"\n                 [type]=\"getQuickInputType()\"\n                 [attr.inputmode]=\"getQuickInputMode()\"\n                 [attr.aria-label]=\"quickFieldMeta.label || quickField\"\n                 (keydown.escape)=\"onQuickClear()\"\n                 (keypress)=\"onQuickNumericKeypress($event)\"\n                 (blur)=\"onQuickBlurFormat()\">\n        </mat-form-field>\n\n        \n      </div>\n    </div>\n\n\n    <!-- QUICK “falso” (quando não há meta) -->\n    <ng-template #fallbackQuick>\n      <div class=\"filter-anchor quick-shell\" #anchorRef=\"cdkOverlayOrigin\" cdkOverlayOrigin>\n        <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"fallback-quick-field\">\n          <mat-label>{{ i18nLabels.searchPlaceholder }}</mat-label>\n          <input matInput [formControl]=\"quickControl\"\n                 [attr.aria-label]=\"i18nLabels.searchPlaceholder\"\n                 (keydown.escape)=\"onQuickClear()\" />\n        </mat-form-field>\n      </div>\n    </ng-template>\n    </ng-container>\n\n    <ng-template #noQuick></ng-template>\n\n    <!-- AÇÕES INLINE (fixas à direita da barra) -->\n    <div class=\"inline-actions\" [class.actions-outlined]=\"actionsVariant==='outlined'\">\n      <!-- Anchor de overlay quando não há Quick -->\n      <div *ngIf=\"!showQuickBar()\" class=\"actions-anchor\" #anchorRef=\"cdkOverlayOrigin\" cdkOverlayOrigin></div>\n      <!-- Toggles/booleans simples realocados para a barra de ações -->\n      <div class=\"inline-toggles\" *ngIf=\"toggleMetas.length\">\n        <ng-container dynamicFieldLoader [fields]=\"toggleMetas\" [formGroup]=\"alwaysForm\"\n                      (componentsCreated)=\"onToggleComponents($event)\"></ng-container>\n      </div>\n      <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" *ngIf=\"quickHasValue()\"\n              (click)=\"onQuickClear()\" [attr.aria-label]=\"i18nLabels.clear\">\n        <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n      </button>\n      <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" (click)=\"onSubmit()\" [attr.aria-label]=\"i18nLabels.apply\">\n        <mat-icon [praxisIcon]=\"'search'\"></mat-icon>\n      </button>\n      <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\"\n              [matBadge]=\"activeFiltersCount\"\n              [matBadgeHidden]=\"!activeFiltersCount\"\n              matBadgeSize=\"small\"\n              matBadgeColor=\"primary\"\n              [matBadgeOverlap]=\"false\"\n              (click)=\"toggleAdvanced()\"\n              [attr.aria-label]=\"getAdvancedAriaLabel()\"\n              [attr.aria-expanded]=\"advancedOpen\"\n              [attr.aria-controls]=\"advancedPanelId\">\n        <mat-icon [praxisIcon]=\"'tune'\"></mat-icon>\n      </button>\n      <button mat-icon-button [color]=\"actionsButtonColor==='basic'? null : actionsButtonColor\" type=\"button\" (click)=\"openSettings()\" *ngIf=\"showFilterSettings\"\n              [matBadge]=\"schemaOutdated ? '!' : ''\"\n              [matBadgeHidden]=\"!schemaOutdated\"\n              matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n              [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : i18nLabels.settings\"\n              matTooltipPosition=\"below\">\n        <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n      </button>\n    </div>\n\n    <!-- campos sempre visíveis (se houver) -->\n    <div class=\"always-fields\" *ngIf=\"alwaysVisibleMetas.length\">\n      <ng-container dynamicFieldLoader [fields]=\"alwaysVisibleMetas\" [formGroup]=\"alwaysForm\"\n                    (componentsCreated)=\"onAlwaysComponents($event)\"></ng-container>\n    </div>\n\n    <!-- acessibilidade -->\n    <span class=\"sr-only\" aria-live=\"polite\">\n      {{ activeFiltersCount ? (activeFiltersCount + ' filtros ativos') : '' }}\n    </span>\n    <button type=\"submit\" class=\"hidden-submit\" aria-hidden=\"true\" tabindex=\"-1\"></button>\n  </form>\n\n  <!-- tags -->\n  <div class=\"praxis-filter-tags\" *ngIf=\"displayedTags.length\" [class.outlined]=\"tagVariant==='outlined'\">\n    <mat-chip-set>\n      <mat-chip *ngFor=\"let tag of displayedTags\"\n                [color]=\"tagColor === 'basic' ? null : tagColor\"\n                (click)=\"applyTag(tag)\" (keydown.enter)=\"applyTag(tag)\"\n                tabindex=\"0\" role=\"button\">\n        <ng-container *ngIf=\"editingTagId !== tag.id; else editChip\">\n          <span class=\"chip-label\">{{ tag.label }}</span>\n          <span class=\"chip-actions\" *ngIf=\"isUserTag(tag)\">\n            <button mat-icon-button [color]=\"tagButtonColor === 'basic' ? null : tagButtonColor\"\n                    (click)=\"startEditTag(tag, $event)\" aria-label=\"edit tag\">\n              <mat-icon>edit</mat-icon>\n            </button>\n            <button mat-icon-button [color]=\"tagButtonColor === 'basic' ? null : tagButtonColor\"\n                    (click)=\"deleteTag(tag)\" aria-label=\"remove tag\">\n              <mat-icon>close</mat-icon>\n            </button>\n          </span>\n        </ng-container>\n        <ng-template #editChip>\n          <input matInput class=\"chip-editor\" [formControl]=\"editingTagLabel\"\n                 (keydown.enter)=\"commitEditTag(tag, $event)\" (keydown.escape)=\"cancelEditTag($event)\" (click)=\"$event.stopPropagation()\" />\n          <button mat-button color=\"primary\" (click)=\"commitEditTag(tag, $event)\">{{ i18nLabels.save }}</button>\n          <button mat-button (click)=\"cancelEditTag($event)\">{{ i18nLabels.cancel }}</button>\n        </ng-template>\n      </mat-chip>\n    </mat-chip-set>\n  </div>\n\n  <!-- OVERLAY -->\n  <ng-container *ngIf=\"overlayOrigin\">\n    <ng-template cdkConnectedOverlay\n                 [cdkConnectedOverlayOrigin]=\"overlayOrigin!\"\n                 [cdkConnectedOverlayOpen]=\"advancedOpen\"\n                 [cdkConnectedOverlayHasBackdrop]=\"overlayBackdrop\"\n                 [cdkConnectedOverlayBackdropClass]=\"'praxis-overlay-backdrop'\"\n                 [cdkConnectedOverlayPositions]=\"overlayPositions\"\n                 [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n                 [cdkConnectedOverlayPush]=\"true\"\n                 [cdkConnectedOverlayOffsetY]=\"8\"\n                 [cdkConnectedOverlayLockPosition]=\"true\"\n                 [cdkConnectedOverlayWidth]=\"overlayWidth\"\n                 [cdkConnectedOverlayPanelClass]=\"['praxis-filter-overlay', isMobile ? 'mobile' : '', overlayVariant === 'frosted' ? 'frosted' : '']\"\n                 (overlayOutsideClick)=\"onOverlayOutsideClick($event)\"\n                 (backdropClick)=\"onOverlayDetach()\"\n                 (detach)=\"onOverlayDetach()\">\n      <div class=\"praxis-filter-advanced\" (keydown.escape)=\"toggleAdvanced()\" (keydown.enter)=\"onAdvancedSubmit({ formData: (advancedForm?.getRawValue?.() || {}) })\" role=\"dialog\" aria-modal=\"true\" [attr.id]=\"advancedPanelId\">\n        <div class=\"advanced-body\">\n          <mat-progress-bar *ngIf=\"schemaLoading\" mode=\"indeterminate\"></mat-progress-bar>\n          <p *ngIf=\"schemaError\" class=\"schema-error\">\n            {{ i18nLabels.errorLoadingFilters }}\n            <button mat-button type=\"button\" (click)=\"loadSchema()\">{{ i18nLabels.retry }}</button>\n          </p>\n          <praxis-filter-form *ngIf=\"!schemaLoading && !schemaError && advancedConfig\"\n                              [formId]=\"formId\" [resourcePath]=\"resourcePath\" [mode]=\"'edit'\" [config]=\"advancedConfig\"\n                              (formReady)=\"onAdvancedReady($event)\" (valueChange)=\"onAdvancedChange($event)\"\n                              (validityChange)=\"onAdvancedValidityChange($event)\" (submit)=\"onAdvancedSubmit($event)\">\n          </praxis-filter-form>\n          <p *ngIf=\"!schemaLoading && !schemaError && !advancedConfig\">{{ i18nLabels.noData }}</p>\n        </div>\n        <div class=\"advanced-actions\" *ngIf=\"!schemaLoading && !schemaError && advancedConfig\">\n          <button mat-button type=\"button\" *ngIf=\"allowSaveTags && activeFiltersCount\" (click)=\"saveCurrentAsTag()\">\n            {{ i18nLabels.saveAsShortcut }}\n          </button>\n          <button mat-raised-button color=\"primary\" type=\"button\"\n                  (click)=\"onAdvancedSubmit({ formData: (advancedForm?.getRawValue?.() || {}) })\"\n                  [disabled]=\"!advancedValid\">\n            {{ i18nLabels.apply }}\n          </button>\n          <button mat-button type=\"button\" (click)=\"onClear()\">{{ i18nLabels.clear }}</button>\n        </div>\n      </div>\n    </ng-template>\n  </ng-container>\n</ng-container>\n\n<!-- resumo -->\n<ng-template #summaryCard>\n  <div class=\"praxis-filter-card\" (keydown.escape)=\"onClear()\">\n    <div class=\"summary-header\">\n      <img *ngIf=\"currentSummaryMap?.avatar?.(currentSummary)\" [src]=\"currentSummaryMap?.avatar?.(currentSummary)\"\n           class=\"summary-avatar\" alt=\"\" />\n      <div class=\"summary-text\">\n        <div class=\"summary-title\">{{ currentSummaryMap?.title?.(currentSummary) || '' }}</div>\n        <div class=\"summary-subtitle\" *ngIf=\"currentSummaryMap?.subtitle\">{{ currentSummaryMap?.subtitle?.(currentSummary) }}</div>\n      </div>\n    </div>\n    <div class=\"summary-badges\" *ngIf=\"currentSummaryMap?.badges?.length\">\n      <span *ngFor=\"let b of currentSummaryMap!.badges\">{{ b(currentSummary) }}</span>\n    </div>\n    <div class=\"card-actions\">\n      <button mat-button type=\"button\" (click)=\"switchToFilter()\">{{ i18nLabels.edit }}</button>\n      <button mat-button type=\"button\" (click)=\"onClear()\">{{ i18nLabels.clear }}</button>\n    </div>\n  </div>\n</ng-template>\n","import { Injectable } from '@angular/core';\nimport { TableConfig, createDefaultTableConfig, GlobalConfigService, fillUndefined } from '@praxisui/core';\n\n/**\n * Provides default table configurations.\n * Applications may override this service to supply product or tenant-specific defaults.\n */\n@Injectable({ providedIn: 'root' })\nexport class TableDefaultsProvider {\n  constructor(private readonly global: GlobalConfigService) {}\n  /**\n   * Returns default configuration for a given table identifier.\n   * @param tableId Table identifier\n   */\n  getDefaults(tableId: string): TableConfig {\n    const base = createDefaultTableConfig();\n    const g = this.global.getTable();\n    // Ensure proper typing: treat global table config as Partial<TableConfig>\n    return g ? fillUndefined<TableConfig>(base, g as Partial<TableConfig>) : base;\n  }\n}\n","import {\n  AfterContentInit,\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  Input,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  Output,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport {\n  MatPaginator,\n  MatPaginatorModule,\n  PageEvent,\n} from '@angular/material/paginator';\nimport { MatSort, MatSortModule, Sort } from '@angular/material/sort';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatBadgeModule } from '@angular/material/badge';\n// import { MatDialog, MatDialogModule } from '@angular/material/dialog';\nimport { SelectionModel } from '@angular/cdk/collections';\nimport { BehaviorSubject, take, Subscription } from 'rxjs';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n  ColumnDefinition,\n  FieldDefinition,\n  GenericCrudService,\n  BatchDeleteProgress,\n  BatchDeleteResult,\n  Page,\n  PageableRequest,\n  TableConfig,\n  createDefaultTableConfig,\n  CONFIG_STORAGE,\n  ConfigStorage,\n  CONNECTION_STORAGE,\n  ConnectionStorage,\n  fillUndefined,\n} from '@praxisui/core';\nimport { PraxisTableToolbar } from './praxis-table-toolbar';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { EmptyStateCardComponent, ResourceQuickConnectComponent } from '@praxisui/core';\nimport { PraxisTableConfigEditor } from './praxis-table-config-editor';\nimport { DataFormattingService } from './data-formatter/data-formatting.service';\nimport { ColumnDataType } from './data-formatter/data-formatter-types';\nimport { TableDefaultsProvider } from './services/table-defaults.provider';\nimport { FilterConfigService } from './services/filter-config.service';\nimport { PraxisFilter, I18n } from './components/praxis-filter';\nimport { DslParser } from '@praxisui/specification';\nimport { DslValidator } from '@praxisui/specification';\nimport { ValidationSeverity } from '@praxisui/specification';\nimport { getActionId, ActionLike } from './utils/action-utils';\nimport { PraxisDialog } from '@praxisui/dialog';\nimport { fetchWithETag } from '@praxisui/core';\nimport { GlobalConfigService } from '@praxisui/core';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\n\nexport interface RowActionConfig extends ActionLike {\n  /**\n   * Identifier of the action. Historically this property was named `id`\n   * in some configurations, so both `action` and `id` are supported.\n   */\n  icon: string;\n  label?: string;\n  priority?: number;\n  alwaysInline?: boolean;\n  visible?: (row: any) => boolean;\n  disabled?: (row: any) => boolean;\n  autoDelete?: boolean;\n  requiresConfirmation?: boolean;\n}\n\nexport interface RowActionsBehavior {\n  enabled: boolean;\n  maxInline:\n    | number\n    | { xs: number; sm: number; md: number; lg: number }\n    | 'auto';\n  autoStrategy?: 'measure' | 'breakpoint';\n}\n\n@Component({\n  selector: 'praxis-table',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MatTableModule,\n    MatButtonModule,\n    MatPaginatorModule,\n    MatSortModule,\n    MatIconModule,\n    MatMenuModule,\n    MatSlideToggleModule,\n    MatTooltipModule,\n    MatSnackBarModule,\n    MatCheckboxModule,\n    MatBadgeModule,\n    ScrollingModule,\n    PraxisTableToolbar,\n    PraxisFilter,\n    PraxisIconDirective,\n    EmptyStateCardComponent,\n  ],\n  templateUrl: './praxis-table.html',\n  styleUrls: ['./praxis-table.scss'],\n  host: {\n    '[class.debug-layout]': 'debugLayout',\n    // Apply density classes based on quick appearance setting\n    \"[class.density-compact]\": \"config?.appearance?.density === 'compact'\",\n    \"[class.density-comfortable]\": \"config?.appearance?.density === 'comfortable'\",\n    \"[class.density-spacious]\": \"config?.appearance?.density === 'spacious'\",\n    // Quick borders toggles (rows/columns)\n    \"[class.row-borders]\": \"config?.appearance?.borders?.showRowBorders !== false\",\n    \"[class.col-borders]\": \"!!config?.appearance?.borders?.showColumnBorders\",\n  },\n})\nexport class PraxisTable\n  implements OnInit, OnChanges, AfterViewInit, AfterContentInit, OnDestroy\n{\n  @Input() config: TableConfig = createDefaultTableConfig();\n  @Input() resourcePath?: string;\n  @Input() filterCriteria: any = {};\n  /** Controls outdated schema notifications visibility and channel (only effective in edit mode) */\n  @Input() notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none' = 'both';\n  /** Snooze duration for schema outdated notifications (ms), only in edit mode */\n  @Input() snoozeMs = 24 * 60 * 60 * 1000; // 24h\n  /** Auto open settings when schema is detected as outdated (only in edit mode) */\n  @Input() autoOpenSettingsOnOutdated = false;\n  /** Controls toolbar visibility */\n  @Input() showToolbar = false;\n  /** Enables new toolbar layout */\n  @Input() toolbarV2 = true;\n\n  /** Habilita exclusão automática */\n  @Input() autoDelete = false;\n\n  /** Enable edit mode */\n  @Input() editModeEnabled = false;\n\n  /** Dense mode reduces cell padding */\n  @Input() dense = false;\n\n  /** Identifier used for settings storage */\n  @Input() tableId = 'default';\n  /** Habilita visual de debug para alinhamento/layouot */\n  @Input() debugLayout = false;\n  /**\n   * Controla a estratégia de largura/scroll horizontal.\n   * - 'auto': (padrão) cria viewport com overflow-x e deixa a tabela crescer via max-content\n   * - 'wrap': permite quebra de linha nas células, reduzindo a largura (menos scroll)\n   * - 'none': desabilita comportamento da lib (host cuida do scroll)\n   */\n  @Input() horizontalScroll: 'auto' | 'wrap' | 'none' = 'auto';\n  /** Contexto opcional quando tabela está dentro do componente CRUD */\n  @Input() crudContext?: {\n    tableId: string;\n    resourcePath?: string;\n    defaults?: {\n      openMode?: 'modal' | 'route';\n      modal?: Record<string, any>;\n      back?: Record<string, any>;\n    };\n    actions?: Array<{\n      action: string;\n      label?: string;\n      formId?: string;\n      route?: string;\n      openMode?: 'modal' | 'route';\n    }>;\n    /** Nome do campo usado como identificador primário (default: 'id') */\n    idField?: string;\n  };\n  /** Nome do campo usado como identificador primário (default: 'id'). Tem precedência sobre crudContext.idField. */\n  @Input() idField?: string;\n\n  @Output() rowClick = new EventEmitter<{ row: any; index: number }>();\n  @Output() rowAction = new EventEmitter<{ action: string; row: any }>();\n  @Output() toolbarAction = new EventEmitter<{ action: string }>();\n  @Output() bulkAction = new EventEmitter<{ action: string; rows: any[] }>();\n  /** Emits on row double click according to behavior config */\n  @Output() rowDoubleClick = new EventEmitter<{ action: string; row: any }>();\n  /** Emits whenever schema outdated state changes (can be used by host) */\n  @Output() schemaStatusChange = new EventEmitter<{ outdated: boolean; serverHash?: string; lastVerifiedAt?: string; resourcePath?: string }>();\n  /** Emits when metadata (config.meta) changes for hosts interested in schema/config changes */\n  @Output() metadataChange = new EventEmitter<{ meta: any; reason: 'bootstrap'|'verification'|'applied' }>();\n\n  @Output() beforeDelete = new EventEmitter<any>();\n  @Output() afterDelete = new EventEmitter<any>();\n  @Output() deleteError = new EventEmitter<{ row: any; error: unknown }>();\n\n  @Output() beforeBulkDelete = new EventEmitter<any[]>();\n  @Output() afterBulkDelete = new EventEmitter<any[]>();\n  @Output() bulkDeleteError = new EventEmitter<{\n    rows: any[];\n    error: unknown;\n  }>();\n\n  @ViewChild(MatPaginator) paginator?: MatPaginator;\n  @ViewChild(MatSort) sort?: MatSort;\n  @ViewChild('actionsHeaderCell') actionsHeaderCell?: ElementRef<HTMLElement>;\n\n  @ContentChild(PraxisFilter) projectedFilter?: PraxisFilter;\n\n  dataSource = new MatTableDataSource<any>();\n  displayedColumns: string[] = [];\n  visibleColumns: ColumnDefinition[] = [];\n  private dataSubject = new BehaviorSubject<any[]>([]);\n  selection = new SelectionModel<any>(true, []);\n  private pageIndex = 0;\n  private pageSize = 5;\n  private sortState: Sort = { active: '', direction: '' };\n  private hasInitialized = false;\n  private breakpoints = { xs: 0, sm: 600, md: 960, lg: 1280 };\n  private measuredInline = 0;\n  private resizeObserver?: ResizeObserver;\n  readonly getActionId = getActionId;\n\n  // Centralized schema status state for internal use/testing; hosts should use outputs\n  private schemaStatusSubject = new BehaviorSubject<{\n    outdated: boolean;\n    serverHash?: string;\n    lastVerifiedAt?: string;\n    resourcePath?: string;\n  } | null>(null);\n\n  private emitSchemaStatus(\n    status: { outdated: boolean; serverHash?: string; lastVerifiedAt?: string; resourcePath?: string },\n    reason?: 'bootstrap'|'verification-304'|'verification-200'|'snackbar-dismiss'|'inline-ignore'|'inline-snooze'|'reconcile'|'applied',\n  ): void {\n    try { this.schemaStatusSubject.next(status); } catch {}\n    try { this.schemaStatusChange.emit(status); } catch {}\n    if (this.isDebug()) {\n      try { console.debug('[PraxisTable] schema:status', { ...status, reason }); } catch {}\n    }\n  }\n\n  private emitMetadataChange(reason: 'bootstrap'|'verification'|'applied'): void {\n    try { this.metadataChange.emit({ meta: (this.config?.meta as any) ?? null, reason }); } catch {}\n    if (this.isDebug()) {\n      try { console.debug('[PraxisTable] schema:metadata', { reason, meta: this.config?.meta }); } catch {}\n    }\n  }\n\n  // Row menu icon helpers (customizable via config.actions.row.menuIcon and optional menuButtonColor)\n  getRowMenuIcon(): string {\n    try {\n      return this.config.actions?.row?.menuIcon || 'more_vert';\n    } catch {\n      return 'more_vert';\n    }\n  }\n  getRowMenuButtonColor(): string | undefined {\n    try {\n      // Allow color override without strict typing changes\n      const rowCfg: any = this.config.actions?.row as any;\n      const c = rowCfg?.menuButtonColor;\n      return c === 'basic' ? undefined : c || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  // Actions header helpers\n  getActionsHeaderAlign(): 'start' | 'center' | 'end' {\n    try {\n      return (this.config.actions?.row as any)?.header?.align || 'end';\n    } catch {\n      return 'end';\n    }\n  }\n  getActionsHeaderLabel(): string | undefined {\n    try {\n      return (this.config.actions?.row as any)?.header?.label || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n  getActionsHeaderIcon(): string | undefined {\n    try {\n      return (this.config.actions?.row as any)?.header?.icon || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n  getActionsHeaderTooltip(): string | undefined {\n    try {\n      return (this.config.actions?.row as any)?.header?.tooltip || undefined;\n    } catch {\n      return undefined;\n    }\n  }\n\n  // Cache precompilado para expressões de regras visuais (DSL → Specification)\n  private styleSpecCache = new Map<string, any>();\n  private actionSpecCache = new Map<string, any>();\n  private dslParser = new DslParser<any>();\n\n  // Lightweight error state to expose CTA when backend/schema fails\n  schemaError = false;\n  dataError = false;\n  errorMessage: string | null = null;\n  // True when the server reports a new schema hash; UI may propose reconciliation\n  schemaOutdated = false;\n  // Resolved preferences (inputs → global fallback)\n  private _resolvedPrefs: { notifyIfOutdated: 'inline'|'snackbar'|'both'|'none'; snoozeMs: number; autoOpenSettingsOnOutdated: boolean } = {\n    notifyIfOutdated: 'both',\n    snoozeMs: 24 * 60 * 60 * 1000,\n    autoOpenSettingsOnOutdated: false,\n  };\n\n  private resolveSchemaPrefs(): void {\n    const DEFAULTS = { notifyIfOutdated: 'both' as const, snoozeMs: 24 * 60 * 60 * 1000, autoOpenSettingsOnOutdated: false };\n    let out = {\n      notifyIfOutdated: (this.notifyIfOutdated as any) ?? DEFAULTS.notifyIfOutdated,\n      snoozeMs: typeof this.snoozeMs === 'number' ? this.snoozeMs : DEFAULTS.snoozeMs,\n      autoOpenSettingsOnOutdated: !!this.autoOpenSettingsOnOutdated,\n    };\n    const inputsAreDefaults = (this.notifyIfOutdated === DEFAULTS.notifyIfOutdated) && (this.snoozeMs === DEFAULTS.snoozeMs) && (this.autoOpenSettingsOnOutdated === DEFAULTS.autoOpenSettingsOnOutdated);\n    if (inputsAreDefaults) {\n      try {\n        const g = this.global.getSchemaPrefsGlobal?.();\n        if (g && typeof g === 'object') {\n          out = {\n            notifyIfOutdated: (g.notifyIfOutdated as any) ?? out.notifyIfOutdated,\n            snoozeMs: (typeof g.snoozeMs === 'number' ? g.snoozeMs : out.snoozeMs),\n            autoOpenSettingsOnOutdated: (typeof g.autoOpenSettingsOnOutdated === 'boolean' ? g.autoOpenSettingsOnOutdated : out.autoOpenSettingsOnOutdated),\n          };\n        }\n      } catch {}\n    }\n    this._resolvedPrefs = out;\n  }\n\n  private getOutdatedIgnoreKey(serverHash: string): string {\n    const id = this.tableId || 'default';\n    return `schemaIgnore:${id}:${serverHash}`;\n  }\n  private getOutdatedSnoozeKey(serverHash: string): string {\n    const id = this.tableId || 'default';\n    return `schemaSnooze:${id}:${serverHash}`;\n  }\n  private getOutdatedNotifiedKey(serverHash: string): string {\n    const id = this.tableId || 'default';\n    return `schemaNotified:${id}:${serverHash}`;\n  }\n\n  private isOutdatedIgnored(serverHash?: string): boolean {\n    if (!serverHash) return false;\n    try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedIgnoreKey(serverHash)); } catch { return false; }\n  }\n  private getOutdatedSnoozeUntil(serverHash?: string): number | undefined {\n    if (!serverHash) return undefined;\n    try {\n      const v = this.configStorage.loadConfig<string>(this.getOutdatedSnoozeKey(serverHash));\n      if (!v) return undefined;\n      const t = Date.parse(v);\n      return isNaN(t) ? undefined : t;\n    } catch { return undefined; }\n  }\n  private setOutdatedSnooze(serverHash?: string, until?: Date): void {\n    if (!serverHash) return;\n    try {\n      if (!until) {\n        this.configStorage.clearConfig(this.getOutdatedSnoozeKey(serverHash));\n      } else {\n        this.configStorage.saveConfig(this.getOutdatedSnoozeKey(serverHash), until.toISOString());\n      }\n    } catch {}\n  }\n  private setOutdatedIgnore(serverHash?: string, val = true): void {\n    if (!serverHash) return;\n    try {\n      if (!val) this.configStorage.clearConfig(this.getOutdatedIgnoreKey(serverHash));\n      else this.configStorage.saveConfig(this.getOutdatedIgnoreKey(serverHash), true);\n    } catch {}\n  }\n  private setOutdatedNotified(serverHash?: string): void {\n    if (!serverHash) return;\n    try { this.configStorage.saveConfig(this.getOutdatedNotifiedKey(serverHash), true); } catch {}\n  }\n  private wasOutdatedNotified(serverHash?: string): boolean {\n    if (!serverHash) return false;\n    try { return !!this.configStorage.loadConfig<boolean>(this.getOutdatedNotifiedKey(serverHash)); } catch { return false; }\n  }\n\n  shouldShowOutdatedInline(): boolean {\n    if (!this.editModeEnabled) return false;\n    if (this._resolvedPrefs.notifyIfOutdated === 'none') return false;\n    const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n    if (!serverHash) return false;\n    if (!this.schemaOutdated) return false;\n    if (this.isOutdatedIgnored(serverHash)) return false;\n    const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n    if (snoozeUntil && Date.now() < snoozeUntil) return false;\n    return this._resolvedPrefs.notifyIfOutdated === 'inline' || this._resolvedPrefs.notifyIfOutdated === 'both';\n  }\n\n  private maybeShowOutdatedSnack(): void {\n    if (!this.editModeEnabled) return;\n    if (this._resolvedPrefs.notifyIfOutdated === 'none') return;\n    const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n    if (!serverHash || !this.schemaOutdated) return;\n    if (this.isOutdatedIgnored(serverHash)) return;\n    const snoozeUntil = this.getOutdatedSnoozeUntil(serverHash) || 0;\n    if (snoozeUntil && Date.now() < snoozeUntil) return;\n    if (!(this._resolvedPrefs.notifyIfOutdated === 'snackbar' || this._resolvedPrefs.notifyIfOutdated === 'both')) return;\n    if (this.wasOutdatedNotified(serverHash)) return;\n    // Single-action snackbar: primary action = Reconciliar; dismiss = Lembrar depois\n    try {\n      const ref = this.snackBar.open('O schema do servidor mudou.', 'Reconciliar', { duration: 8000 });\n      ref.onAction().subscribe(() => {\n        this.onReconcileRequested();\n      });\n      ref.afterDismissed().subscribe(() => {\n        // Snooze on dismiss\n        const until = new Date(Date.now() + Math.max(0, this._resolvedPrefs.snoozeMs || 0));\n        const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n        this.setOutdatedSnooze(hash, until);\n        this.schemaOutdated = false;\n        this.emitSchemaStatus({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath }, 'snackbar-dismiss');\n        this.cdr.markForCheck();\n      });\n      this.setOutdatedNotified(serverHash);\n    } catch {}\n  }\n\n  // Inline banner handlers\n  onReconcileRequested(): void {\n    this.emitSchemaStatus({ outdated: true, serverHash: (this.config?.meta as any)?.serverHash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath }, 'reconcile');\n    // Optional auto open settings first; otherwise just open settings\n    this.openTableSettings();\n  }\n  onIgnoreOutdated(): void {\n    const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n    this.setOutdatedIgnore(hash, true);\n    this.schemaOutdated = false;\n    this.emitSchemaStatus({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath }, 'inline-ignore');\n    this.cdr.markForCheck();\n  }\n  onSnoozeOutdated(): void {\n    const hash = (this.config?.meta as any)?.serverHash as string | undefined;\n    const until = new Date(Date.now() + Math.max(0, this.snoozeMs || 0));\n    this.setOutdatedSnooze(hash, until);\n    this.schemaOutdated = false; // hide inline banner for now\n    this.emitSchemaStatus({ outdated: false, serverHash: hash, lastVerifiedAt: (this.config?.meta as any)?.lastVerifiedAt, resourcePath: this.resourcePath }, 'inline-snooze');\n    this.cdr.markForCheck();\n  }\n\n  toggleRow(row: any): void {\n    this.selection.toggle(row);\n  }\n\n  masterToggle(): void {\n    if (this.isAllSelected()) {\n      this.selection.clear();\n    } else {\n      this.dataSource.data.forEach((row) => this.selection.select(row));\n    }\n  }\n\n  isAllSelected(): boolean {\n    const numSelected = this.selection.selected.length;\n    const numRows = this.dataSource.data.length;\n    return numSelected === numRows;\n  }\n  private isOverflowEnabled(): boolean {\n    return this.config.actions?.row?.behavior?.enabled !== false;\n  }\n\n  private getMaxInline(): number {\n    if (!this.isOverflowEnabled()) {\n      return Number.MAX_SAFE_INTEGER;\n    }\n    const behavior = this.config.actions?.row?.behavior;\n    const defaults = { xs: 1, sm: 2, md: 3, lg: 4 };\n    const maxInline = behavior?.maxInline ?? defaults;\n    if (maxInline === 'auto') {\n      if (behavior?.autoStrategy === 'measure') {\n        return this.measuredInline || this.getBreakpointMaxInline(defaults);\n      }\n      return this.getBreakpointMaxInline(defaults);\n    }\n    if (typeof maxInline === 'number') {\n      return maxInline;\n    }\n    // Merge with defaults to ensure all properties are defined\n    const breakpointConfig = {\n      xs: maxInline.xs ?? defaults.xs,\n      sm: maxInline.sm ?? defaults.sm,\n      md: maxInline.md ?? defaults.md,\n      lg: maxInline.lg ?? defaults.lg,\n    };\n    return this.getBreakpointMaxInline(breakpointConfig);\n  }\n\n  private getBreakpointMaxInline(b: {\n    xs: number;\n    sm: number;\n    md: number;\n    lg: number;\n  }): number {\n    const w = window.innerWidth;\n    if (w >= this.breakpoints.lg) {\n      return b.lg;\n    }\n    if (w >= this.breakpoints.md) {\n      return b.md;\n    }\n    if (w >= this.breakpoints.sm) {\n      return b.sm;\n    }\n    return b.xs;\n  }\n\n  private sortByPriority(actions: any[]): any[] {\n    return [...actions].sort(\n      (a, b) => (a.priority ?? 100) - (b.priority ?? 100),\n    );\n  }\n\n  isActionVisible(a: any, row: any): boolean {\n    // Explicit visible handler has precedence\n    if (typeof a.visible === 'function') return !!a.visible(row);\n    if (a.visible === false) return false;\n\n    // Evaluate conditional (DSL) when provided\n    const cond = (a as any).conditional as string | undefined;\n    if (cond && typeof cond === 'string' && cond.trim()) {\n      try {\n        return this.evaluateActionCondition(cond, row);\n      } catch {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  isActionDisabled(a: any, row: any): boolean {\n    return typeof a.disabled === 'function' ? !!a.disabled(row) : !!a.disabled;\n  }\n\n  trackAction = (_: number, a: RowActionConfig) => this.getActionId(a);\n\n  getInlineRowActions(row: any): any[] {\n    // If display is 'menu', render no inline actions\n    if ((this.config.actions?.row?.display as any) === 'menu') {\n      return [];\n    }\n    const actions = this.sortByPriority(\n      this.config.actions?.row?.actions ?? [],\n    ).filter((a) => this.isActionVisible(a, row));\n    const fixed = actions.filter((a) => a.alwaysInline);\n    const remaining = actions.filter((a) => !a.alwaysInline);\n    if (!this.isOverflowEnabled()) {\n      return [...fixed, ...remaining];\n    }\n    const max = Math.max(0, this.getMaxInline() - fixed.length);\n    return [...fixed, ...remaining.slice(0, max)];\n  }\n\n  getOverflowRowActions(row: any): any[] {\n    if (!this.isOverflowEnabled()) {\n      return [];\n    }\n    const actions = this.sortByPriority(\n      this.config.actions?.row?.actions ?? [],\n    ).filter((a) => this.isActionVisible(a, row));\n\n    const inline = this.getInlineRowActions(row).map((a) =>\n      this.getActionId(a),\n    );\n    return actions.filter((a) => !inline.includes(this.getActionId(a)));\n  }\n\n  hasOverflowRowActions(row: any): boolean {\n    return (\n      this.isOverflowEnabled() && this.getOverflowRowActions(row).length > 0\n    );\n  }\n\n  private updateMeasuredInline(): void {\n    if (!this.actionsHeaderCell) {\n      return;\n    }\n    const width = this.actionsHeaderCell.nativeElement.offsetWidth;\n    const iconWidth = this.dense ? 40 : 48;\n    this.measuredInline = Math.floor(width / iconWidth);\n  }\n\n  private setupResizeObserver(): void {\n    const behavior = this.config.actions?.row?.behavior;\n    if (\n      behavior?.maxInline === 'auto' &&\n      behavior?.autoStrategy === 'measure' &&\n      this.actionsHeaderCell\n    ) {\n      this.resizeObserver = new ResizeObserver(() =>\n        this.updateMeasuredInline(),\n      );\n      this.resizeObserver.observe(this.actionsHeaderCell.nativeElement);\n      this.updateMeasuredInline();\n    }\n  }\n\n  private subscriptions: Subscription[] = [];\n  private updateTableMetaFromServerInfo(\n    info?: { schemaId?: string; schemaHash?: string },\n    opts?: { updateVerifiedAt?: boolean; touchUpdatedAt?: boolean },\n  ): void {\n    try {\n      const nowIso = new Date().toISOString();\n      const meta: any = { ...(this.config?.meta || {}) };\n      if (info?.schemaId) meta.schemaId = info.schemaId;\n      if (info?.schemaHash != null) meta.serverHash = info.schemaHash;\n      if (!meta.version) meta.version = '2.0.0';\n      if (!meta.createdAt) meta.createdAt = nowIso;\n      if (opts?.touchUpdatedAt !== false) meta.updatedAt = nowIso;\n      if (opts?.updateVerifiedAt) meta.lastVerifiedAt = nowIso;\n      this.config.meta = meta;\n    } catch {}\n  }\n  private getIdField(): string {\n    // Precedence: @Input → crudContext.idField → config.meta.idField → service.getResourceIdField() → 'id'\n    const fromInput = (this.idField as string) || (this.crudContext?.idField as string);\n    const fromConfig = (this.config?.meta as any)?.idField as string | undefined;\n    const fromService = this.crudService?.getResourceIdField?.();\n    return (fromInput || fromConfig || fromService || 'id') as string;\n  }\n\n  // =============================\n  // Virtualization helpers\n  // =============================\n  isVirtualized(): boolean {\n    return !!this.config.behavior?.virtualization?.enabled;\n  }\n  getVirtItemHeight(): number { return this.config.behavior?.virtualization?.itemHeight ?? 44; }\n  getVirtBufferSize(): number { return this.config.behavior?.virtualization?.bufferSize ?? 10; }\n  getVirtMinHeight(): number | string | undefined { return (this.config.behavior?.virtualization?.minContainerHeight as any) ?? undefined; }\n  getVirtMinHeightStyle(): string | null { const v = this.getVirtMinHeight(); if (v == null) return null; return typeof v === 'number' ? `${v}px` : (v as string); }\n  trackByRow = (index: number, row: any) => this.getRowId(row) ?? index;\n\n  private getRowId(row: any): string | number | undefined {\n    if (!row) return undefined;\n    const key = this.getIdField();\n    let id = row[key];\n    if (id == null && key !== 'id') {\n      id = row['id'];\n    }\n    // Basic heuristics fallback to common keys\n    if (id == null) {\n      const candidates = ['_id', 'uuid', 'codigo', 'code'];\n      for (const c of candidates) { if (row[c] != null) { id = row[c]; break; } }\n    }\n    return id as any;\n  }\n\n  constructor(\n    private crudService: GenericCrudService<any>,\n    private cdr: ChangeDetectorRef,\n    private settingsPanel: SettingsPanelService,\n    private formattingService: DataFormattingService,\n    @Inject(CONFIG_STORAGE) private configStorage: ConfigStorage,\n    @Inject(CONNECTION_STORAGE) private connectionStorage: ConnectionStorage,\n    private tableDefaultsProvider: TableDefaultsProvider,\n    private snackBar: MatSnackBar,\n    private filterConfig: FilterConfigService,\n    private pxDialog: PraxisDialog,\n    private hostRef: ElementRef<HTMLElement>,\n    private global: GlobalConfigService,\n  ) {\n    this.subscriptions.push(\n      this.dataSubject.subscribe((data) => {\n        this.dataSource.data = data;\n        this.selection.clear();\n        try {\n          if (Array.isArray(data) && data.length) {\n            // Lightweight debug to help diagnose column→data mapping issues\n            const sample = data[0];\n            const cols = this.visibleColumns.map((c) => c.field);\n            if (this.isDebug()) {\n              console.debug('[PraxisTable] Data loaded', {\n                rows: data.length,\n                columns: cols,\n                sampleKeys: Object.keys(sample || {}),\n              });\n            }\n          } else {\n            if (this.isDebug()) {\n              console.debug('[PraxisTable] Data loaded: empty page');\n            }\n          }\n        } catch {}\n      }),\n    );\n  }\n\n  openQuickConnect(): void {\n    const ref = this.settingsPanel.open({\n      id: `table-quick-connect:${this.tableId}`,\n      title: 'Conectar à fonte de dados',\n      content: {\n        component: ResourceQuickConnectComponent,\n        inputs: { resourcePath: this.resourcePath },\n      },\n    });\n    const apply = (v: any) => {\n      const path = (v?.resourcePath as string || '').trim();\n      if (!path) return;\n      this.resourcePath = path;\n      this.saveConnection('quick-connect');\n      this.schemaError = false;\n      this.dataError = false;\n      this.errorMessage = null;\n      this.crudService.configure(this.resourcePath);\n      if ((this.config?.columns?.length ?? 0) > 0) {\n        this.verifyServerSchemaVersion().catch(() => {});\n      } else {\n        this.loadSchema();\n      }\n      this.fetchData();\n      this.cdr.markForCheck();\n    };\n    ref.applied$.subscribe(apply);\n    ref.saved$.subscribe(apply);\n  }\n\n  ngOnInit(): void {\n    // Resolve global fallback for schema prefs\n    this.resolveSchemaPrefs();\n    // Load persisted connection if not provided via input\n    if (!this.resourcePath && this.tableId) {\n      const saved = this.connectionStorage.loadConnection(this.connectionKey());\n      if (saved?.resourcePath) {\n        this.resourcePath = saved.resourcePath;\n        try {\n          this.crudService.configure(this.resourcePath);\n          // If we already have columns configured, verify server hash without blocking UI; otherwise load schema to bootstrap columns\n          if ((this.config?.columns?.length ?? 0) > 0) {\n            this.verifyServerSchemaVersion().catch(() => {});\n          } else {\n            this.loadSchema();\n          }\n        } catch {}\n      }\n    }\n    const storedConfig = this.configStorage.loadConfig<TableConfig>(\n      `table-config:${this.tableId}`,\n    );\n    if (storedConfig) {\n      this.config = storedConfig;\n    }\n    // Load persisted widget-level inputs (e.g., horizontalScroll)\n    try {\n      const inputs = this.configStorage.loadConfig<any>(this.inputsKey()) || {};\n      if (inputs && typeof inputs.horizontalScroll === 'string') {\n        const hs = inputs.horizontalScroll as 'auto' | 'wrap' | 'none';\n        if (hs === 'auto' || hs === 'wrap' || hs === 'none') {\n          this.horizontalScroll = hs;\n        }\n      }\n    } catch {}\n    // Apply global defaults as fallback only for missing properties\n    try {\n      const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n      this.config = fillUndefined(this.config, defaults);\n    } catch {}\n    this.showToolbar = !!(\n      this.config.toolbar?.visible ||\n      this.config.behavior?.filtering?.advancedFilters?.enabled\n    );\n    if (this.isDebug()) {\n      console.debug('[PraxisTable] Toolbar visibility on init', this.showToolbar);\n    }\n  }\n\n  ngAfterContentInit(): void {\n    if (this.config) {\n      this.setupColumns();\n      this.applyDefaultSortIfNone();\n      if (this.resourcePath && !this.hasInitialized) {\n        this.fetchData();\n      }\n    }\n    this.hasInitialized = true;\n    this.applyAppearanceVariables();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Ensure CRUD service is configured before any fetch\n    let configuredThisChange = false;\n    if (changes['resourcePath'] && this.resourcePath) {\n      // Reset error flags on resourcePath change\n      this.schemaError = false;\n      this.dataError = false;\n      this.errorMessage = null;\n      this.saveConnection('input');\n      this.crudService.configure(this.resourcePath);\n      // If columns already exist, verify server hash; otherwise load schema to generate columns\n      if ((this.config?.columns?.length ?? 0) > 0) {\n        this.verifyServerSchemaVersion().catch(() => {});\n      } else {\n        this.loadSchema();\n      }\n      configuredThisChange = true;\n      // Only fetch data if this is not the first change (handled by ngAfterContentInit)\n      // or if the component has already been initialized\n      if (!changes['resourcePath'].firstChange || this.hasInitialized) {\n        this.fetchData();\n      }\n    }\n\n    if (changes['config'] && this.config) {\n      // On external config changes, fill missing values from global defaults\n      try {\n        const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n        this.config = fillUndefined(this.config, defaults);\n      } catch {}\n      this.setupColumns();\n      this.applyDefaultSortIfNone();\n      // Avoid fetching twice in same cycle when resourcePath also changed\n      if (this.resourcePath && !configuredThisChange) {\n        this.fetchData();\n        // If we have columns, kick a background verification when config changes externally\n        if ((this.config?.columns?.length ?? 0) > 0) {\n          this.verifyServerSchemaVersion().catch(() => {});\n        }\n      }\n      this.showToolbar = !!(\n        this.config.toolbar?.visible ||\n        this.config.behavior?.filtering?.advancedFilters?.enabled\n      );\n      if (this.isDebug()) {\n        console.debug(\n          '[PraxisTable] Toolbar visibility on config change',\n          this.showToolbar,\n        );\n      }\n    }\n\n    if (changes['filterCriteria'] && this.resourcePath) {\n      this.fetchData();\n    }\n\n    this.applyDataSourceSettings();\n    this.applyAppearanceVariables();\n    if (changes['notifyIfOutdated'] || changes['snoozeMs'] || changes['autoOpenSettingsOnOutdated']) {\n      this.resolveSchemaPrefs();\n    }\n  }\n\n  private isDebug(): boolean {\n    try {\n      return (\n        this.debugLayout ||\n        (typeof window !== 'undefined' && (window as any).DEBUG_PTABLE === true)\n      );\n    } catch {\n      return this.debugLayout;\n    }\n  }\n\n  private connectionKey(): string {\n    return `conn:table:${this.tableId || 'default'}`;\n  }\n\n  private saveConnection(origin: 'input' | 'quick-connect' | 'editor'): void {\n    const rp = (this.resourcePath || '').trim();\n    if (!rp) return;\n    const key = this.connectionKey();\n    const prev = this.connectionStorage.loadConnection(key);\n    if (prev?.resourcePath === rp) return;\n    this.connectionStorage.saveConnection(key, {\n      resourcePath: rp,\n      version: 1,\n      updatedAt: new Date().toISOString(),\n      origin,\n    });\n  }\n\n  private inputsKey(): string {\n    return `table-inputs:${this.tableId || 'default'}`;\n  }\n\n  disconnect(): void {\n    try {\n      this.connectionStorage.clearConnection(this.connectionKey());\n    } catch {}\n    this.resourcePath = '';\n    this.schemaError = false;\n    this.dataError = false;\n    this.errorMessage = null;\n    this.dataSubject.next([]);\n    this.cdr.detectChanges();\n  }\n\n  ngAfterViewInit(): void {\n    this.applyDataSourceSettings();\n    this.setupResizeObserver();\n    this.applyDefaultSortIfNone();\n  }\n\n  onPageChange(event: PageEvent): void {\n    this.pageIndex = event.pageIndex;\n    this.pageSize = event.pageSize;\n    if (this.resourcePath) {\n      this.fetchData();\n    }\n  }\n\n  onSortChange(event: Sort): void {\n    this.sortState = event;\n    // Reset to first page when sorting changes (server-side paging)\n    this.pageIndex = 0;\n    if (this.resourcePath) {\n      this.fetchData();\n    }\n  }\n\n  onRowClicked(row: any, index: number): void {\n    console.debug('[PraxisTable] onRowClicked', { index, rowId: row?.id });\n    this.rowClick.emit({ row, index });\n  }\n\n  onRowDoubleClicked(row: any, index: number): void {\n    try {\n      const cfg = this.config.behavior?.interaction?.rowDoubleClick;\n      if (!cfg?.enabled) return;\n      const action = (cfg.action || 'view') as 'edit'|'view'|'custom';\n      const actId = action === 'custom' ? (cfg.customAction || 'custom') : action;\n      console.debug('[PraxisTable] onRowDoubleClicked', { index, action: actId, rowId: this.getRowId(row) });\n      this.rowDoubleClick.emit({ action: actId, row });\n    } catch {}\n  }\n\n  onRowAction(action: string, row: any, event: Event): void {\n    console.debug('[PraxisTable] onRowAction: click received', {\n      action,\n      rowId: row?.id,\n      target: (event?.target as HTMLElement)?.tagName,\n    });\n    event.stopPropagation();\n    (event.target as HTMLElement).blur?.();\n\n    const cfg = this.config.actions?.row?.actions.find(\n      (a) => this.getActionId(a) === action,\n    );\n    const cfgAutoDelete = cfg?.autoDelete;\n    const willAutoDelete =\n      action === 'delete' && !!(this.autoDelete || cfgAutoDelete);\n    const requiresConfirmation =\n      cfg?.requiresConfirmation || (action === 'delete' && willAutoDelete);\n\n    console.debug('[PraxisTable] onRowAction: resolved config', {\n      foundConfig: !!cfg,\n      cfgAutoDelete,\n      inputAutoDelete: this.autoDelete,\n      willAutoDelete,\n      requiresConfirmation,\n    });\n\n    if (requiresConfirmation) {\n      this.showConfirmDialog(action, row, cfg, willAutoDelete);\n    } else if (willAutoDelete) {\n      this.executeDeleteAction(row);\n    } else {\n      console.debug('[PraxisTable] onRowAction: emitting rowAction', {\n        action,\n        rowId: row?.id,\n      });\n      this.rowAction.emit({ action, row });\n    }\n  }\n\n  private showConfirmDialog(\n    action: string,\n    row: any,\n    cfg: any,\n    willAutoDelete: boolean,\n  ): void {\n    const isDelete = action === 'delete';\n    const title = isDelete ? 'Confirmar Exclusão' : `Confirmar ${cfg?.label || action}`;\n    // Prefer messages from TableConfig when available (configured via editor)\n    const confirmMsgs = this.config?.messages?.actions?.confirmations as any;\n    const message = isDelete\n      ? (confirmMsgs?.delete || 'Tem certeza que deseja excluir este registro? Esta ação não pode ser desfeita.')\n      : (confirmMsgs?.[action] || `Tem certeza que deseja executar a ação \"${cfg?.label || action}\"?`);\n\n    // Debug logs to diagnose message resolution\n    try {\n      console.debug('[PraxisTable] Dialog: confirmation message resolution', {\n        action,\n        isDelete,\n        hasMessages: !!this.config?.messages,\n        hasActionsMessages: !!this.config?.messages?.actions,\n        hasConfirmations: !!this.config?.messages?.actions?.confirmations,\n        confirmations: this.config?.messages?.actions?.confirmations,\n        resolvedTitle: title,\n        resolvedMessage: message,\n      });\n    } catch {}\n\n    const overrides = ((this.config as any)?.dialogs?.confirm?.delete ?? {}) as any;\n    // Build local config only with defined overrides so global presets remain intact\n    const localCfg: any = {\n      title,\n      message,\n      // Allow ESC and cancel to close by default; can be overridden via overrides.disableClose\n    };\n    // Apply common overrides supported by PraxisDialog\n    const copyIf = (k: string) => {\n      const v = (overrides as any)[k];\n      if (v != null && v !== '') (localCfg as any)[k] = v;\n    };\n    // Dimensions\n    copyIf('width');\n    copyIf('height');\n    copyIf('minWidth');\n    copyIf('maxWidth');\n    copyIf('minHeight');\n    copyIf('maxHeight');\n    // Visual\n    copyIf('themeColor');\n    copyIf('actionsLayout');\n    // Animation and style objects\n    if (overrides.animation && Object.keys(overrides.animation).length) localCfg.animation = overrides.animation;\n    if (overrides.styles && Object.keys(overrides.styles).length) localCfg.styles = overrides.styles;\n    // Overlay classes and position\n    copyIf('backdropClass');\n    copyIf('panelClass');\n    copyIf('position');\n    copyIf('hasBackdrop');\n    copyIf('zIndex');\n    // Behavior\n    if (overrides.disableClose != null) localCfg.disableClose = !!overrides.disableClose;\n\n    try {\n      console.debug('[PraxisTable] Dialog: final config for confirm', {\n        localCfg,\n      });\n    } catch {}\n    // Use the standard 'question' profile for confirmation prompts\n    const ref = this.pxDialog.confirm(localCfg, 'question');\n\n    ref.afterClosed().subscribe((result) => {\n      if (result) {\n        if (willAutoDelete) {\n          this.executeDeleteAction(row);\n        } else {\n          console.debug(\n            '[PraxisTable] onRowAction: confirmed, emitting rowAction',\n            { action, rowId: row?.id },\n          );\n          this.rowAction.emit({ action, row });\n        }\n      } else {\n        console.debug('[PraxisTable] onRowAction: action cancelled by user', {\n          action,\n          rowId: row?.id,\n        });\n      }\n    });\n  }\n\n  private executeDeleteAction(row: any): void {\n    const id = this.getRowId(row);\n    if (id == null) {\n      console.error('[PraxisTable] executeDeleteAction: missing id for row', { rowSampleKeys: Object.keys(row || {}), idField: this.getIdField() });\n      try { this.snackBar.open('ID do registro não encontrado para exclusão', undefined, { duration: 3000 }); } catch {}\n      return;\n    }\n    try {\n      this.beforeDelete.emit(row);\n      console.debug('[PraxisTable] executeDeleteAction: beforeDelete emitted', {\n        rowId: id,\n      });\n    } catch (e) {\n      console.warn(\n        '[PraxisTable] executeDeleteAction: beforeDelete emit error',\n        e,\n      );\n    }\n\n    const progressMsg = this.config.messages?.actions?.progress?.delete || 'Removendo...';\n    try {\n      console.debug('[PraxisTable] Delete: progress/success/error message resolution', {\n        progress: this.config.messages?.actions?.progress,\n        success: this.config.messages?.actions?.success,\n        errors: this.config.messages?.actions?.errors,\n        resolved: {\n          progress: progressMsg,\n          success: this.config.messages?.actions?.success?.delete || 'Registro removido',\n          error: this.config.messages?.actions?.errors?.delete || 'Erro ao remover',\n        },\n      });\n    } catch {}\n    this.snackBar.open(progressMsg);\n    console.debug('[PraxisTable] executeDeleteAction: calling crudService.delete', { id });\n    this.crudService.delete(id as any).subscribe({\n      next: () => {\n        console.debug('[PraxisTable] executeDeleteAction: delete success', {\n          id,\n        });\n        this.snackBar.open(this.config.messages?.actions?.success?.delete || 'Registro removido', undefined, { duration: 3000 });\n        try {\n          this.afterDelete.emit(row);\n          console.debug(\n            '[PraxisTable] executeDeleteAction: afterDelete emitted',\n            { id },\n          );\n        } catch (e) {\n          console.warn(\n            '[PraxisTable] executeDeleteAction: afterDelete emit error',\n            e,\n          );\n        }\n        this.fetchData();\n      },\n      error: (error) => {\n        console.error('[PraxisTable] executeDeleteAction: delete error', {\n          id,\n          error,\n        });\n        this.snackBar.open(this.config.messages?.actions?.errors?.delete || 'Erro ao remover', undefined, { duration: 3000 });\n        try {\n          this.deleteError.emit({ row, error });\n        } catch (e) {\n          console.warn(\n            '[PraxisTable] executeDeleteAction: deleteError emit error',\n            e,\n          );\n        }\n      },\n    });\n  }\n\n  onToolbarAction(event: { action: string }): void {\n    console.debug('[PraxisTable] onToolbarAction received', event);\n    const bulk = this.config.actions?.bulk?.actions.find(\n      (a) => this.getActionId(a) === event.action,\n    );\n    if (bulk) {\n      if (event.action === 'delete' && (this.autoDelete || bulk.autoDelete)) {\n        const rows = this.selection.selected.slice();\n        const ids = rows.map((r) => this.getRowId(r)).filter((v) => v != null) as any[];\n        console.debug('[PraxisTable] onToolbarAction: bulk delete requested', {\n          count: rows.length,\n          ids,\n        });\n        this.beforeBulkDelete.emit(rows);\n        const progress = (e: BatchDeleteProgress) => {\n          this.snackBar.open(\n            (this.config.messages?.actions?.progress?.deleteMultiple ||\n              'Removendo...') + ` ${e.index}/${e.total}`,\n            undefined,\n            { duration: 1000 },\n          );\n        };\n        this.crudService.deleteMany(ids, { progress }).subscribe({\n          next: (result: BatchDeleteResult) => {\n            console.debug(\n              '[PraxisTable] onToolbarAction: bulk delete result',\n              result,\n            );\n            if (result.errors.length) {\n              this.snackBar.open(\n                this.config.messages?.actions?.errors?.delete ||\n                  'Erro ao remover',\n                undefined,\n                { duration: 3000 },\n              );\n              const failedIds = new Set(result.errors.map((e) => e.id));\n              const failedRows = rows.filter((r) => failedIds.has(r.id));\n              this.selection.clear();\n              failedRows.forEach((r) => this.selection.select(r));\n              this.bulkDeleteError.emit({\n                rows: failedRows,\n                error: result.errors,\n              });\n            } else {\n              this.snackBar.open(\n                this.config.messages?.actions?.success?.delete ||\n                  'Registros removidos',\n                undefined,\n                { duration: 3000 },\n              );\n              this.afterBulkDelete.emit(rows);\n              this.selection.clear();\n            }\n            this.fetchData();\n          },\n          error: (error) => {\n            console.error(\n              '[PraxisTable] onToolbarAction: bulk delete error',\n              error,\n            );\n            this.snackBar.open(\n              this.config.messages?.actions?.errors?.delete ||\n                'Erro ao remover',\n              undefined,\n              { duration: 3000 },\n            );\n            this.bulkDeleteError.emit({ rows, error });\n          },\n        });\n      } else {\n        console.debug('[PraxisTable] onToolbarAction: emitting bulkAction', {\n          action: event.action,\n          selected: this.selection.selected.length,\n        });\n        this.bulkAction.emit({\n          action: event.action,\n          rows: this.selection.selected,\n        });\n      }\n    } else {\n      console.debug(\n        '[PraxisTable] onToolbarAction: emitting toolbarAction',\n        event,\n      );\n      this.toolbarAction.emit(event);\n    }\n  }\n\n  onAdvancedFilterSubmit(criteria: Record<string, any>): void {\n    this.filterCriteria = criteria || {};\n    if (this.resourcePath) {\n      this.fetchData();\n    }\n  }\n\n  onAdvancedFilterClear(): void {\n    this.filterCriteria = {};\n    if (this.resourcePath) {\n      this.fetchData();\n    }\n  }\n\n  openTableSettings(): void {\n    try {\n      console.debug('[PraxisTable] Opening table settings', {\n        tableId: this.tableId,\n        config: this.config,\n      });\n\n      const configCopy = JSON.parse(JSON.stringify(this.config)) as TableConfig;\n      const panelInputs: any = {\n        tableConfig: configCopy,\n        resourcePath: this.resourcePath,\n        idField: this.getIdField(),\n        horizontalScroll: this.horizontalScroll,\n        serverIdField: this.crudService.getResourceIdField?.(),\n        serverSchemaInfo: this.crudService.getLastSchemaInfo(),\n        crudContext: this.crudContext\n          ? { ...this.crudContext, tableId: this.tableId, resourcePath: this.resourcePath }\n          : undefined,\n      };\n\n      const ref = this.settingsPanel.open({\n        id: `table.${this.tableId}`,\n        title: 'Configurações da Tabela',\n        content: { component: PraxisTableConfigEditor, inputs: panelInputs },\n      });\n\n      this.subscriptions.push(\n        ref.applied$.subscribe((val: any) => {\n          const cfg = val as any;\n          if (!cfg) return;\n          console.debug('[PraxisTable] Applied config', cfg);\n          const newResourcePath = (cfg.__resourcePath__ as string) || '';\n          const newIdField = (cfg.__idField__ as string) || '';\n          const newHs = (cfg.__horizontalScroll__ as 'auto'|'wrap'|'none') || undefined;\n          if (newResourcePath && newResourcePath !== this.resourcePath) {\n            this.resourcePath = newResourcePath;\n            this.crudService.configure(this.resourcePath);\n            if ((this.config?.columns?.length ?? 0) > 0) {\n              this.verifyServerSchemaVersion().catch(() => {});\n            } else {\n              this.loadSchema();\n            }\n            this.fetchData();\n          }\n          if (newIdField && newIdField !== this.idField) {\n            this.idField = newIdField;\n          }\n          if (newHs && newHs !== this.horizontalScroll) {\n            this.horizontalScroll = newHs;\n            try {\n              const prev = this.configStorage.loadConfig<any>(this.inputsKey()) || {};\n              this.configStorage.saveConfig(this.inputsKey(), { ...prev, horizontalScroll: newHs });\n            } catch {}\n          }\n          // Persistir em memória no TableConfig.meta com idField resolvido (mesmo se usuário não alterou)\n          const metaApply: any = { ...(cfg.meta || {}) };\n          const resolvedIdApply = this.getIdField();\n          if (resolvedIdApply) metaApply.idField = resolvedIdApply;\n          if (!metaApply.version) metaApply.version = '2.0.0';\n          const nowApply = new Date().toISOString();\n          if (!metaApply.createdAt) metaApply.createdAt = nowApply;\n          metaApply.updatedAt = nowApply;\n          const infoApply = this.crudService.getLastSchemaInfo();\n          if (infoApply?.schemaId) metaApply.schemaId = infoApply.schemaId;\n          if (infoApply?.schemaHash) metaApply.serverHash = infoApply.schemaHash;\n          cfg.meta = metaApply;\n          // Remove internal marker before saving/applying\n          if ('__resourcePath__' in cfg) delete cfg.__resourcePath__;\n          if ('__idField__' in cfg) delete cfg.__idField__;\n          if ('__horizontalScroll__' in cfg) delete cfg.__horizontalScroll__;\n          this.applyTableConfig(cfg as TableConfig);\n        }),\n        ref.saved$.subscribe((val: any) => {\n          const cfg = val as any;\n          if (!cfg) return;\n          console.debug('[PraxisTable] Saved config', cfg);\n          const newResourcePath = (cfg.__resourcePath__ as string) || '';\n          const newIdField = (cfg.__idField__ as string) || '';\n          const newHs = (cfg.__horizontalScroll__ as 'auto'|'wrap'|'none') || undefined;\n          if (newResourcePath && newResourcePath !== this.resourcePath) {\n            this.resourcePath = newResourcePath;\n            this.crudService.configure(this.resourcePath);\n            if ((this.config?.columns?.length ?? 0) > 0) {\n              this.verifyServerSchemaVersion().catch(() => {});\n            } else {\n              this.loadSchema();\n            }\n            this.fetchData();\n          }\n          if (newIdField && newIdField !== this.idField) {\n            this.idField = newIdField;\n          }\n          if (newHs && newHs !== this.horizontalScroll) {\n            this.horizontalScroll = newHs;\n            try {\n              const prev = this.configStorage.loadConfig<any>(this.inputsKey()) || {};\n              this.configStorage.saveConfig(this.inputsKey(), { ...prev, horizontalScroll: newHs });\n            } catch {}\n          }\n          // Persistir meta no JSON salvo (sempre definir idField resolvido)\n          const metaSave: any = { ...(cfg.meta || {}) };\n          if (!metaSave.version) metaSave.version = '2.0.0';\n          const now = new Date().toISOString();\n          if (!metaSave.createdAt) metaSave.createdAt = now;\n          metaSave.updatedAt = now;\n          const info = this.crudService.getLastSchemaInfo();\n          if (info?.schemaId) metaSave.schemaId = info.schemaId;\n          if (info?.schemaHash) metaSave.serverHash = info.schemaHash;\n          const resolvedIdSave = this.getIdField();\n          if (resolvedIdSave) metaSave.idField = resolvedIdSave;\n          cfg.meta = metaSave;\n          if ('__resourcePath__' in cfg) delete cfg.__resourcePath__;\n          if ('__idField__' in cfg) delete cfg.__idField__;\n          if ('__horizontalScroll__' in cfg) delete cfg.__horizontalScroll__;\n          this.configStorage.saveConfig(`table-config:${this.tableId}`, cfg as TableConfig);\n          this.applyTableConfig(cfg as TableConfig);\n        }),\n        ref.reset$.subscribe(() => {\n          console.debug('[PraxisTable] Resetting to default config');\n          try { this.configStorage.clearConfig(`table-config:${this.tableId}`); } catch {}\n          try { this.filterConfig.save(`${this.tableId}-filter`, {} as any); } catch {}\n          try { this.configStorage.clearConfig(this.inputsKey()); } catch {}\n          const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n          this.applyTableConfig(defaults);\n        }),\n      );\n    } catch (error) {\n      console.error('[PraxisTable] Error opening table settings', error);\n    }\n  }\n\n  private applyTableConfig(cfg: TableConfig): void {\n    console.debug('[PraxisTable] Applying table config', cfg);\n    this.config = { ...cfg };\n    const filterSettings =\n      cfg.behavior?.filtering?.advancedFilters?.settings ?? {};\n    this.filterConfig.save(`${this.tableId}-filter`, filterSettings);\n    this.showToolbar = !!(\n      cfg.toolbar?.visible || cfg.behavior?.filtering?.advancedFilters?.enabled\n    );\n    console.debug(\n      '[PraxisTable] Toolbar visibility after apply',\n      this.showToolbar,\n    );\n    this.setupColumns();\n    this.applyAppearanceVariables();\n    this.applyDataSourceSettings();\n    if (this.resourcePath) {\n      this.fetchData();\n    }\n    this.cdr.detectChanges();\n  }\n\n  onResetPreferences(): void {\n    try { this.configStorage.clearConfig(`table-config:${this.tableId}`); } catch {}\n    try { this.filterConfig.save(`${this.tableId}-filter`, {} as any); } catch {}\n    const defaults = this.tableDefaultsProvider.getDefaults(this.tableId);\n    this.applyTableConfig(defaults);\n    try { this.snackBar.open('Preferências de tabela redefinidas', undefined, { duration: 2000 }); } catch {}\n  }\n\n  private resolvePagingStrategy(): 'client'|'server' {\n    const raw = this.config.behavior?.pagination?.strategy as any;\n    if (raw === 'client' || raw === 'server') return raw;\n    // Default to server when using remote resource and not explicitly configured\n    return this.resourcePath ? 'server' : 'client';\n  }\n  private resolveSortingStrategy(): 'client'|'server' {\n    const raw = this.config.behavior?.sorting?.strategy as any;\n    if (raw === 'client' || raw === 'server') return raw;\n    // Default to server when using remote resource and not explicitly configured\n    return this.resourcePath ? 'server' : 'client';\n  }\n\n  private applyDataSourceSettings(): void {\n    const paginationStrategy = this.resolvePagingStrategy();\n    const sortingStrategy = this.resolveSortingStrategy();\n    const isServerPaging = paginationStrategy === 'server';\n    const isServerSorting = sortingStrategy === 'server';\n\n    // Sync internal page size with config so server requests match UI paginator\n    try {\n      const cfgSize = this.getPaginationPageSize();\n      if (typeof cfgSize === 'number' && cfgSize > 0) {\n        this.pageSize = cfgSize;\n      }\n    } catch {}\n\n    if (this.paginator) {\n      this.paginator.length = this.getPaginationLength();\n      try { (this.paginator as any).pageSize = this.pageSize; } catch {}\n      // Only connect MatTableDataSource paginator when doing client-side paging\n      this.dataSource.paginator = isServerPaging ? null : this.paginator;\n    }\n    if (this.sort) {\n      // Only connect MatTableDataSource sorting when doing client-side sort\n      this.dataSource.sort = isServerSorting ? null : this.sort;\n    }\n  }\n\n  private setupColumns(): void {\n    const columns = this.config.columns || [];\n    this.visibleColumns = columns\n      .filter((c) => c.visible !== false)\n      .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n    this.displayedColumns = this.visibleColumns.map((c) => c.field);\n    if (this.config.behavior?.selection?.enabled) {\n      this.displayedColumns.unshift('_select');\n    }\n    if (this.config.actions?.row?.enabled) {\n      this.displayedColumns.push('_actions');\n    }\n  }\n\n  private applyDefaultSortIfNone(): void {\n    try {\n      if (this.sortState && this.sortState.active) return;\n      const ds = this.config?.behavior?.sorting?.defaultSort as any;\n      if (!ds) return;\n      const entry = Array.isArray(ds) ? ds[0] : ds;\n      if (!entry?.column || !entry?.direction) return;\n      const dir = (entry.direction === 'asc' || entry.direction === 'desc') ? entry.direction : 'asc';\n      this.sortState = { active: entry.column, direction: dir as any };\n      if (this.sort) {\n        (this.sort as any).active = entry.column;\n        (this.sort as any).direction = dir;\n        try { (this.sort.sortChange as any).emit({ active: entry.column, direction: dir }); } catch {}\n      }\n    } catch {}\n  }\n\n  /**\n   * Performs a lightweight server schema verification using ETag/If-None-Match without\n   * downloading or storing the schema body. Updates config.meta (serverHash/lastVerifiedAt)\n   * and toggles schemaOutdated when a new hash is detected.\n   */\n  private async verifyServerSchemaVersion(): Promise<void> {\n    try {\n      if (!this.resourcePath) return;\n      // Only verify when we already have columns configured (bootstrap handled by loadSchema)\n      if ((this.config?.columns?.length ?? 0) === 0) return;\n\n      // Build request to /schemas/filtered for grid (path=/.../all, operation=get, schemaType=response)\n      const baseUrl = this.crudService.getSchemasFilteredBaseUrl();\n      let derived = '';\n      try { derived = this.crudService.schemaUrl().replace(/\\/schemas$/, ''); } catch { return; }\n      const u = new URL(baseUrl);\n      u.searchParams.set('path', `${derived}/all`);\n      u.searchParams.set('operation', 'get');\n      u.searchParams.set('schemaType', 'response');\n      u.searchParams.set('includeInternalSchemas', 'false');\n\n      const serverHash = (this.config?.meta as any)?.serverHash as string | undefined;\n      const tenant = (() => { try { return this.global.getTenant(); } catch { return undefined; } })();\n      const locale = (() => { try { return (typeof navigator !== 'undefined' && navigator.language) ? navigator.language : undefined; } catch { return undefined; } })();\n\n      const res = await fetchWithETag({ url: u.toString(), schemaHash: serverHash, tenant, locale });\n      const nowIso = new Date().toISOString();\n\n      const meta: any = { ...(this.config?.meta || {}) };\n      if (!meta.version) meta.version = '2.0.0';\n      if (!meta.createdAt) meta.createdAt = nowIso;\n      meta.lastVerifiedAt = nowIso;\n\n      if (res.status === 304) {\n        // Only update lastVerifiedAt and persist (keep using existing columns)\n        this.config.meta = meta;\n        try { this.configStorage.saveConfig(`table-config:${this.tableId}`, this.config); } catch {}\n        // Keep outdated false and emit status\n        if (this.schemaOutdated) {\n          this.schemaOutdated = false;\n        }\n        this.emitMetadataChange('verification');\n        this.emitSchemaStatus({ outdated: false, serverHash: (this.config?.meta as any)?.serverHash, lastVerifiedAt: meta.lastVerifiedAt, resourcePath: this.resourcePath }, 'verification-304');\n        return;\n      }\n\n      // status === 200: server hash changed (or first verification without hash). Do not apply columns here.\n      meta.serverHash = (res as any).schemaHash;\n      this.config.meta = meta;\n      this.schemaOutdated = !!this.editModeEnabled; // only notify in edit mode\n      try { this.configStorage.saveConfig(`table-config:${this.tableId}`, this.config); } catch {}\n      this.emitMetadataChange('verification');\n      this.emitSchemaStatus({ outdated: this.schemaOutdated, serverHash: meta.serverHash, lastVerifiedAt: meta.lastVerifiedAt, resourcePath: this.resourcePath }, 'verification-200');\n      // Notifications only if edit mode\n      if (this.schemaOutdated) {\n        if (this._resolvedPrefs.autoOpenSettingsOnOutdated) {\n          this.openTableSettings();\n        } else {\n          this.maybeShowOutdatedSnack();\n        }\n      }\n    } catch {\n      // ignore verification errors; table remains functional with existing config\n    }\n  }\n\n  private loadSchema(): void {\n    this.crudService\n      .getSchema()\n      .pipe(take(1))\n      .subscribe({\n        next: (fields: FieldDefinition[]) => {\n          this.schemaError = false;\n          // Se idField não foi definido via inputs/contexto, tentar derivar do schema (x-ui.resource.idField)\n          try {\n            const derived = (this.idField as string) || (this.crudContext?.idField as string) || (this.config?.meta as any)?.idField || this.crudService.getResourceIdField();\n            if (derived && (!this.idField || this.idField === 'id')) {\n              this.idField = derived as any;\n            }\n            // Alertar divergência entre config.meta.idField e o idField vindo do serviço\n            const cfgId = (this.config?.meta as any)?.idField as string | undefined;\n            const svcId = this.crudService.getResourceIdField();\n            if (cfgId && svcId && cfgId !== svcId) {\n              try { this.snackBar.open('Aviso: idField do TableConfig diverge do servidor', undefined, { duration: 4000 }); } catch {}\n              console.warn('[PraxisTable] Divergência idField', { config: cfgId, server: svcId });\n            }\n          } catch {}\n          // Atualizar metadados de schema (schemaId/serverHash) e idField no TableConfig (em memória)\n          try {\n            const info = this.crudService.getLastSchemaInfo();\n            this.updateTableMetaFromServerInfo(\n              { schemaId: info?.schemaId, schemaHash: info?.schemaHash },\n              { updateVerifiedAt: true, touchUpdatedAt: true },\n            );\n          } catch {}\n          const existing = this.config?.columns ?? [];\n          if (existing.length === 0) {\n            this.config.columns = fields\n              .filter((f) => !f.tableHidden)\n              .map((f) => this.convertFieldToColumn(f));\n          }\n          this.setupColumns();\n          // Notificar hosts sobre atualização de metadados de schema ao concluir o loadSchema\n          try {\n            const meta: any = this.config?.meta || {};\n            // Ao carregar o schema com sucesso, consideramos que não há desatualização pendente\n            this.schemaOutdated = false;\n            this.emitMetadataChange('bootstrap');\n            this.emitSchemaStatus({\n              outdated: false,\n              serverHash: meta.serverHash,\n              lastVerifiedAt: meta.lastVerifiedAt,\n              resourcePath: this.resourcePath,\n            }, 'bootstrap');\n          } catch {}\n          this.cdr.detectChanges();\n        },\n        error: (err) => {\n          console.error('[PraxisTable] Schema load error', err);\n          this.schemaError = true;\n          this.errorMessage =\n            'Erro ao carregar colunas do servidor. Verifique a rota do recurso (API) e a conexão.';\n          this.cdr.detectChanges();\n        },\n      });\n  }\n\n  private convertFieldToColumn(field: FieldDefinition): ColumnDefinition {\n    // Prioritize API type over inference - only use inference as last resort\n    let apiType: ColumnDataType;\n\n    if (field.type && this.isValidColumnDataType(field.type)) {\n      // Use API type if it's valid\n      apiType = field.type as ColumnDataType;\n    } else {\n      // Fall back to inference only if API type is not available or invalid\n      apiType = this.inferFieldTypeFromFieldName(field.name);\n    }\n\n    const col: ColumnDefinition = {\n      field: field.name,\n      header: field.label ?? field.name,\n      order: field.order,\n      width: (field.width as any) ?? undefined,\n      sortable: field.sortable,\n      visible: field.tableHidden ? false : true,\n      type: apiType,\n      _originalApiType: apiType,\n      _isApiField: true,\n    } as ColumnDefinition;\n\n    // Auto-renderers: map known UI controls to richer cell renderers on first bootstrap\n    // - Avatar: when backend marks controlType 'avatar' (x-ui) or field name matches avatar-like patterns\n    try {\n      this.applyAutoRenderer(field, col);\n    } catch {}\n\n    return col;\n  }\n\n  /**\n   * Apply automatic renderer hints based on schema field metadata.\n   * Runs only on initial bootstrap (when columns are derived from schema).\n   */\n  private applyAutoRenderer(field: FieldDefinition, col: ColumnDefinition): void {\n    if (!field || !col) return;\n    // Do not override explicit renderer if any (defensive; initial columns have none)\n    if ((col as any).renderer && (col as any).renderer.type) return;\n\n    const ctl = (field.controlType || '').toString().trim().toLowerCase();\n    const fname = (field.name || '').toString();\n    const lname = fname.toLowerCase();\n\n    const isAvatarByControl = ctl === 'avatar';\n\n    if (isAvatarByControl) {\n      // Derive initials from common name fields; leave altField undefined to avoid brittle coupling\n      const initialsExpr = \"= (row.nomeCompleto || row.nome || row.fullName || row.name || row.title || '').trim().split(/\\\\s+/).slice(0,2).map(p => p[0] || '').join('').toUpperCase()\";\n\n      (col as any).renderer = {\n        type: 'avatar',\n        avatar: {\n          srcField: fname,\n          // altField intentionally omitted; rely on initialsExpr + title attr if provided later\n          initialsExpr,\n          shape: 'circle',\n          size: 32,\n        },\n      };\n      // Sensible defaults for avatar column\n      col.align = (col.align as any) || 'center';\n      if (!col.width) col.width = '56px';\n      return;\n    }\n  }\n\n  /**\n   * Check if a value is a valid ColumnDataType\n   */\n  private isValidColumnDataType(type: any): boolean {\n    const validTypes: ColumnDataType[] = [\n      'string',\n      'number',\n      'date',\n      'boolean',\n      'currency',\n      'percentage',\n      'custom',\n    ];\n    return validTypes.includes(type);\n  }\n\n  /**\n   * Infer column data type from field name patterns when API type is not available\n   * Refined logic to reduce false positives\n   */\n  private inferFieldTypeFromFieldName(fieldName: string): ColumnDataType {\n    const lowercaseName = fieldName.toLowerCase();\n\n    // Date/time patterns - more specific patterns first\n    if (\n      lowercaseName.endsWith('date') ||\n      lowercaseName.endsWith('time') ||\n      lowercaseName.endsWith('at') ||\n      lowercaseName.startsWith('date') ||\n      lowercaseName === 'created' ||\n      lowercaseName === 'updated' ||\n      lowercaseName === 'modified' ||\n      lowercaseName.includes('timestamp')\n    ) {\n      return 'date';\n    }\n\n    // Boolean patterns - most specific first to avoid conflicts\n    if (\n      lowercaseName.startsWith('is_') ||\n      lowercaseName.startsWith('has_') ||\n      lowercaseName.startsWith('can_') ||\n      lowercaseName.startsWith('should_') ||\n      lowercaseName === 'active' ||\n      lowercaseName === 'enabled' ||\n      lowercaseName === 'visible' ||\n      lowercaseName === 'deleted' ||\n      lowercaseName === 'archived' ||\n      lowercaseName.endsWith('_flag') ||\n      lowercaseName.endsWith('_enabled') ||\n      lowercaseName.endsWith('_active')\n    ) {\n      return 'boolean';\n    }\n\n    // Currency/money patterns - exclude common false positives\n    if (\n      (lowercaseName.includes('price') ||\n        lowercaseName.includes('amount') ||\n        lowercaseName.includes('cost') ||\n        lowercaseName.includes('salary') ||\n        lowercaseName.includes('wage') ||\n        lowercaseName.includes('fee') ||\n        (lowercaseName.includes('value') &&\n          !lowercaseName.includes('id') &&\n          !lowercaseName.includes('key'))) &&\n      !lowercaseName.includes('count') &&\n      !lowercaseName.includes('type')\n    ) {\n      return 'currency';\n    }\n\n    // Percentage patterns - be more specific\n    if (\n      lowercaseName.includes('percent') ||\n      lowercaseName.endsWith('_rate') ||\n      lowercaseName.endsWith('_ratio') ||\n      lowercaseName.endsWith('_pct') ||\n      (lowercaseName.includes('rate') &&\n        !lowercaseName.includes('created') &&\n        !lowercaseName.includes('updated')) ||\n      lowercaseName.endsWith('_score')\n    ) {\n      return 'percentage';\n    }\n\n    // Number patterns - exclude common false positives like string IDs\n    if (\n      (lowercaseName.endsWith('_id') && lowercaseName !== 'id') || // composite IDs might be strings\n      lowercaseName === 'id' ||\n      lowercaseName.includes('count') ||\n      lowercaseName.includes('quantity') ||\n      lowercaseName.includes('number') ||\n      lowercaseName.includes('total') ||\n      lowercaseName.includes('sum') ||\n      lowercaseName.includes('age') ||\n      lowercaseName.includes('weight') ||\n      lowercaseName.includes('height') ||\n      lowercaseName.includes('size') ||\n      lowercaseName.endsWith('_num') ||\n      lowercaseName.endsWith('_number')\n    ) {\n      return 'number';\n    }\n\n    // Default to string for ambiguous cases\n    return 'string';\n  }\n\n  private fetchData(): void {\n    if (!this.resourcePath) {\n      return;\n    }\n    const pageable: PageableRequest = {\n      pageNumber: this.pageIndex,\n      pageSize: this.pageSize,\n    };\n    if (this.sortState.active && this.sortState.direction) {\n      // Map active to backend sort field if provided\n      const active = this.sortState.active;\n      const col = this.visibleColumns.find((c) => c.field === active);\n      const sortField = (col as any)?.sortField || active;\n      const dir = (this.sortState.direction || 'asc').toLowerCase();\n      pageable.sort = [`${sortField},${dir}`];\n    } else {\n      // Apply defaultSort to first fetch when no sortState is active\n      const ds = this.config?.behavior?.sorting?.defaultSort as any;\n      if (ds) {\n        const entries = Array.isArray(ds) ? ds : [ds];\n        const sortList: string[] = [];\n        for (const e of entries) {\n          if (!e?.column || !e?.direction) continue;\n          const col = this.visibleColumns.find((c) => c.field === e.column);\n          const sf = (col as any)?.sortField || e.column;\n          const dir = (e.direction || 'asc').toLowerCase();\n          sortList.push(`${sf},${dir}`);\n        }\n        if (sortList.length) pageable.sort = sortList;\n      }\n    }\n    this.crudService\n      .filter(this.filterCriteria || {}, pageable)\n      .pipe(take(1))\n      .subscribe({\n        next: (page: Page<any>) => {\n          this.dataError = false;\n          this.dataSubject.next(page.content);\n          if (this.paginator) {\n            this.paginator.length = page.totalElements;\n          }\n          // Keep config pagination length in sync for template bindings\n          try {\n            const beh: any = this.config.behavior || (this.config.behavior = {} as any);\n            const pag: any = beh.pagination || (beh.pagination = {} as any);\n            pag.totalItems = page.totalElements;\n          } catch {}\n        },\n        error: (err) => {\n          console.error('[PraxisTable] Data load error', err);\n          this.dataError = true;\n          this.errorMessage =\n            'Erro ao carregar dados. Verifique a rota do recurso (API) e tente novamente.';\n          this.cdr.detectChanges();\n        },\n      });\n  }\n\n  // Public wrappers for template actions (AOT-safe)\n  retryData(): void {\n    if (this.resourcePath) this.fetchData();\n  }\n  reloadSchema(): void {\n    if (this.resourcePath) this.loadSchema();\n  }\n\n  refetch(): void {\n    this.fetchData();\n  }\n\n  /**\n   * Get the cell value for a given row and column\n   * Handles the complete transformation pipeline:\n   * 1. _generatedValueGetter (calculated columns) or regular field access\n   * 2. valueMapping (convert values to display text)\n   * 3. format (data formatting like dates, numbers, currency)\n   */\n  getCellValue(rowData: any, column: ColumnDefinition): any {\n    let value: any;\n\n    // Step 1: Get raw value (calculated or direct field access)\n    if (column._generatedValueGetter && column._generatedValueGetter.trim()) {\n      try {\n        // Safely evaluate the generated expression\n        const evaluationFunction = new Function(\n          'rowData',\n          `return ${column._generatedValueGetter}`,\n        );\n        value = evaluationFunction(rowData);\n      } catch (error) {\n        console.error('PTABLE:formula:error', error, column);\n        return `[Formula Error]`;\n      }\n    } else {\n      // Fallback to regular field access\n      value = this.getNestedPropertyValue(rowData, column.field);\n    }\n\n    // Step 2: Apply value mapping if defined\n    if (column.valueMapping && Object.keys(column.valueMapping).length > 0) {\n      value = this.applyValueMapping(value, column.valueMapping);\n    }\n\n    // Step 3: Apply data formatting if defined\n    if (\n      column.type &&\n      column.format &&\n      this.formattingService.needsFormatting(column.type, column.format)\n    ) {\n      try {\n        value = this.formattingService.formatValue(\n          value,\n          column.type,\n          column.format,\n        );\n      } catch (error) {\n        console.error('PTABLE:format:error', error, { value, column });\n      }\n    }\n\n    return value;\n  }\n\n  // =============================\n  // Conditional Styles (per cell)\n  // =============================\n  getCellClasses(rowData: any, column: ColumnDefinition): string[] | undefined {\n    const rules = (column as any).conditionalStyles as\n      | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n      | undefined;\n    if (!rules || rules.length === 0) return undefined;\n    const classes: string[] = [];\n    for (const r of rules) {\n      try {\n        if (this.evaluateStyleRule(r.condition, rowData)) {\n          if (r.cssClass) classes.push(r.cssClass);\n        }\n      } catch {}\n    }\n    if (!classes.length && rules?.length && this.isDebug()) {\n      console.debug('[PraxisTable] getCellClasses: no match', {\n        column: column.field,\n        rules: rules.map(r => r.condition),\n      });\n    }\n    return classes.length ? classes : undefined;\n  }\n\n  getCellNgStyle(\n    rowData: any,\n    column: ColumnDefinition,\n  ): Record<string, string> | undefined {\n    const rules = (column as any).conditionalStyles as\n      | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n      | undefined;\n    if (!rules || rules.length === 0) return undefined;\n    const style: Record<string, string> = {};\n    for (const r of rules) {\n      try {\n        if (r.style && this.evaluateStyleRule(r.condition, rowData)) {\n          Object.assign(style, r.style);\n        }\n      } catch {}\n    }\n    return Object.keys(style).length ? style : undefined;\n  }\n\n  private evaluateStyleRule(expression: string, rowData: any): boolean {\n    if (!expression || !expression.trim()) return false;\n    let spec = this.styleSpecCache.get(expression);\n    if (spec === undefined) {\n      try {\n        // Basic DSL validation before parsing\n        try {\n          const known = (this.visibleColumns || []).map((c) => c.field);\n          const validator = new DslValidator({ knownFields: known, maxComplexity: 80 });\n          const issues = validator.validate(expression);\n          const hasErrors = issues?.some((i: any) => i?.severity === ValidationSeverity.ERROR);\n          if (hasErrors) {\n            console.warn('[PraxisTable] DSL validation failed; ignoring condition', { expression, issues });\n            this.styleSpecCache.set(expression, null);\n            return false;\n          }\n        } catch {}\n        spec = this.dslParser.parse(expression);\n        this.styleSpecCache.set(expression, spec);\n      } catch (err) {\n        console.warn('[PraxisTable] Style DSL parse failed', { expression, err });\n        this.styleSpecCache.set(expression, null);\n        return false;\n      }\n    }\n    if (!spec) return false;\n    try {\n      return spec.isSatisfiedBy(rowData) === true;\n    } catch {\n      console.warn('[PraxisTable] Style spec evaluation error', { expression });\n      return false;\n    }\n  }\n\n  /** Evaluate row action visibility condition using the same DSL as styles */\n  private evaluateActionCondition(expression: string, rowData: any): boolean {\n    if (!expression || !expression.trim()) return true;\n    let spec = this.actionSpecCache.get(expression);\n    if (spec === undefined) {\n      try {\n        spec = this.dslParser.parse(expression);\n        this.actionSpecCache.set(expression, spec);\n      } catch (err) {\n        console.warn('[PraxisTable] Action DSL parse failed', { expression, err });\n        this.actionSpecCache.set(expression, null);\n        return true; // be permissive when parse fails\n      }\n    }\n    if (!spec) return true;\n    try {\n      return spec.isSatisfiedBy(rowData) === true;\n    } catch {\n      console.warn('[PraxisTable] Action spec evaluation error', { expression });\n      return true;\n    }\n  }\n\n  // =============================\n  // Conditional Styles (row/global)\n  // =============================\n  getRowClasses(rowData: any): string[] | undefined {\n    const rules = (this.config as any).rowConditionalStyles as\n      | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n      | undefined;\n    if (!rules || rules.length === 0) return undefined;\n    const classes: string[] = [];\n    for (const r of rules) {\n      try {\n        if (this.evaluateStyleRule(r.condition, rowData)) {\n          if (r.cssClass) classes.push(r.cssClass);\n        }\n      } catch {}\n    }\n    if (!classes.length && rules?.length && this.isDebug()) {\n      console.debug('[PraxisTable] getRowClasses: no match', {\n        rules: rules.map(r => r.condition),\n      });\n    }\n    return classes.length ? classes : undefined;\n  }\n\n  getRowNgStyle(rowData: any): Record<string, string> | undefined {\n    const rules = (this.config as any).rowConditionalStyles as\n      | Array<{ condition: string; cssClass?: string; style?: Record<string, string> }>\n      | undefined;\n    if (!rules || rules.length === 0) return undefined;\n    const style: Record<string, string> = {};\n    for (const r of rules) {\n      try {\n        if (r.style && this.evaluateStyleRule(r.condition, rowData)) {\n          Object.assign(style, r.style);\n        }\n      } catch {}\n    }\n    return Object.keys(style).length ? style : undefined;\n  }\n\n  // =============================\n  // Conditional Renderers (row/global) — tooltip/animation\n  // =============================\n  private getRowRenderer(rowData: any): any | null {\n    const rules = ((this.config as any)?.rowConditionalRenderers || []) as Array<{\n      condition: string;\n      tooltip?: { text?: string; position?: 'top'|'right'|'bottom'|'left'; bgColor?: string; delayMs?: number };\n      animation?: { type?: string; trigger?: string; repeat?: string; durationMs?: number; delayMs?: number };\n      enabled?: boolean;\n    }>;\n    if (!rules || !rules.length) return null;\n    for (const r of rules) {\n      if (r && r.enabled === false) continue;\n      if (r && r.condition && this.evaluateStyleRule(String(r.condition), rowData)) {\n        return r;\n      }\n    }\n    return null;\n  }\n\n  getRowTooltip(rowData: any): string | null {\n    const rr = this.getRowRenderer(rowData);\n    const text = rr?.tooltip?.text;\n    return text && String(text).trim().length ? String(text) : null;\n  }\n  getRowTooltipPosition(rowData: any): 'above'|'below'|'left'|'right' {\n    const pos = (this.getRowRenderer(rowData)?.tooltip?.position || 'bottom') as string;\n    return pos === 'top' ? 'above' : pos === 'right' ? 'right' : pos === 'left' ? 'left' : 'below';\n  }\n  getRowTooltipShowDelay(rowData: any): number {\n    return Number(this.getRowRenderer(rowData)?.tooltip?.delayMs || 0);\n  }\n\n  /**\n   * Apply value mapping to transform raw values into display-friendly text\n   */\n  private applyValueMapping(\n    value: any,\n    mapping: { [key: string | number]: string },\n  ): any {\n    if (value === null || value === undefined) {\n      return value;\n    }\n\n    // Try to find mapping by exact match\n    if (mapping.hasOwnProperty(value)) {\n      return mapping[value];\n    }\n\n    // Try string conversion for number/boolean values\n    const stringValue = String(value);\n    if (mapping.hasOwnProperty(stringValue)) {\n      return mapping[stringValue];\n    }\n\n    // Try number conversion for string values that represent numbers\n    if (typeof value === 'string') {\n      const numValue = parseFloat(value);\n      if (\n        !isNaN(numValue) &&\n        isFinite(numValue) &&\n        mapping.hasOwnProperty(numValue)\n      ) {\n        return mapping[numValue];\n      }\n    }\n\n    // Try boolean conversion for string values\n    if (typeof value === 'string') {\n      const lowerValue = value.toLowerCase();\n      if (lowerValue === 'true' && mapping.hasOwnProperty('true')) {\n        return mapping['true'];\n      }\n      if (lowerValue === 'false' && mapping.hasOwnProperty('false')) {\n        return mapping['false'];\n      }\n    }\n\n    // Return original value if no mapping found\n    return value;\n  }\n\n  /**\n   * Safely access nested properties using dot notation\n   */\n  private getNestedPropertyValue(obj: any, path: string): any {\n    if (!obj || !path) {\n      return null;\n    }\n\n    try {\n      return path.split('.').reduce((current, key) => {\n        return current && current[key] !== undefined ? current[key] : null;\n      }, obj);\n    } catch (error) {\n      console.error('PTABLE:property:access:error', error, { obj, path });\n      return null;\n    }\n  }\n\n  // =============================================================================\n  // CONFIGURATION ACCESS METHODS\n  // =============================================================================\n\n  /**\n   * Verifica se a ordenação está habilitada\n   */\n  getSortingEnabled(): boolean {\n    return this.config.behavior?.sorting?.enabled ?? true;\n  }\n\n  /**\n   * Verifica se a paginação está habilitada\n   */\n  getPaginationEnabled(): boolean {\n    return this.config.behavior?.pagination?.enabled ?? false;\n  }\n\n  /**\n   * Obtém o comprimento total da paginação\n   */\n  getPaginationLength(): number {\n    return this.config.behavior?.pagination?.totalItems ?? 0;\n  }\n\n  /**\n   * Obtém o tamanho da página\n   */\n  getPaginationPageSize(): number {\n    return this.config.behavior?.pagination?.pageSize ?? 10;\n  }\n\n  /**\n   * Obtém as opções de tamanho de página\n   */\n  getPaginationPageSizeOptions(): number[] {\n    return this.config.behavior?.pagination?.pageSizeOptions ?? [5, 10, 25, 50];\n  }\n\n  /**\n   * Verifica se deve mostrar botões primeira/última\n   */\n  getPaginationShowFirstLast(): boolean {\n    return this.config.behavior?.pagination?.showFirstLastButtons ?? true;\n  }\n\n  /**\n   * Verifica se uma funcionalidade está disponível\n   */\n  isFeatureAvailable(feature: string): boolean {\n    switch (feature) {\n      case 'multiSort':\n        return this.config.behavior?.sorting?.multiSort ?? false;\n      case 'bulkActions':\n        return this.config.actions?.bulk?.enabled ?? false;\n      case 'rowActions':\n        return this.config.actions?.row?.enabled ?? false;\n      case 'columnFilters':\n        return this.config.behavior?.filtering?.columnFilters?.enabled ?? false;\n      case 'export':\n        return this.config.export?.enabled ?? false;\n      case 'resizing':\n        return this.config.behavior?.resizing?.enabled ?? false;\n      case 'dragging':\n        return this.config.behavior?.dragging?.columns ?? false;\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * Obtém configurações de i18n para o filtro baseado na configuração da tabela\n   */\n  getFilterI18n(): Partial<I18n> | undefined {\n    const placeholder =\n      this.config.behavior?.filtering?.advancedFilters?.settings?.placeholder;\n    return placeholder ? { searchPlaceholder: placeholder } : undefined;\n  }\n\n  // =============================\n  // Cell Renderer Helpers (Phase 1)\n  // Always use effective renderer per row (base + conditional override)\n  // =============================\n  getIconName(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.icon;\n    if (!cfg) return null;\n    const raw = cfg.name as any;\n    const fromField = cfg.nameField ? this.getNestedPropertyValue(row, cfg.nameField) : undefined;\n    const evaluated = this.evaluateValueExpr(raw, row, 'string');\n    if (evaluated != null && evaluated !== '') return String(evaluated);\n    if (fromField != null && fromField !== '') return String(fromField);\n    if (typeof raw === 'string') return raw;\n    return null;\n  }\n  getIconColor(_row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(_row, column)?.icon;\n    if (!cfg) return null;\n    const raw = cfg.color as any;\n    const evaluated = this.evaluateValueExpr(raw, _row, 'string');\n    return (evaluated as any) || (typeof raw === 'string' ? raw : null);\n  }\n  getIconStyle(_row: any, column: ColumnDefinition): Record<string, string> | null {\n    const raw = this.getEffectiveRenderer(_row, column)?.icon?.size as any;\n    const size = this.evaluateValueExpr(raw, _row, 'number') as number | undefined;\n    return size ? { fontSize: `${size}px`, width: `${size}px`, height: `${size}px` } : null;\n  }\n  getIconAriaLabel(_row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(_row, column)?.icon?.ariaLabel as any)) || null;\n  }\n\n  /**\n   * Lightweight, controlled evaluator for string/number expressions using row context.\n   * Accepts values like '= row.status === \"OK\" ? \"primary\" : \"warn\"'.\n   * Falls back safely on error.\n   */\n  private evaluateValueExpr(\n    raw: any,\n    row: any,\n    expect: 'string' | 'number' | 'boolean',\n  ): string | number | boolean | null {\n    try {\n      if (raw == null) return null;\n      // Object form: { expr: '...' }\n      if (typeof raw === 'object' && typeof raw.expr === 'string') {\n        const fn = new Function('row', `\"use strict\"; return (${raw.expr});`);\n        const val = fn(row);\n        return this.coerceExpected(val, expect);\n      }\n      // String shorthand: '= <expr>'\n      if (typeof raw === 'string') {\n        const m = raw.match(/^\\s*=(.*)$/s);\n        if (m) {\n          const expr = m[1];\n          const fn = new Function('row', `\"use strict\"; return (${expr});`);\n          const val = fn(row);\n          return this.coerceExpected(val, expect);\n        }\n      }\n      return null;\n    } catch {\n      return null;\n    }\n  }\n\n  private coerceExpected(val: any, expect: 'string' | 'number' | 'boolean') {\n    if (val == null) return null;\n    switch (expect) {\n      case 'string':\n        return String(val);\n      case 'number':\n        return typeof val === 'number' ? val : Number(val);\n      case 'boolean':\n        return typeof val === 'boolean' ? val : !!val;\n    }\n  }\n\n  getImageSrc(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.image;\n    if (!cfg) return null;\n    const src = cfg.srcField ? this.getNestedPropertyValue(row, cfg.srcField) : cfg.src;\n    if (typeof src !== 'string') return null;\n    // basic guard against javascript: urls\n    if (/^\\s*javascript:/i.test(src)) return null;\n    return src;\n  }\n  getImageAlt(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.image;\n    if (!cfg) return null;\n    return (cfg.altField ? this.getNestedPropertyValue(row, cfg.altField) : cfg.alt) || null;\n  }\n  getImageWidth(row: any, column: ColumnDefinition): number | null {\n    return ((this.getEffectiveRenderer(row, column)?.image?.width as any)) || null;\n  }\n  getImageHeight(row: any, column: ColumnDefinition): number | null {\n    return ((this.getEffectiveRenderer(row, column)?.image?.height as any)) || null;\n  }\n  getImageShape(row: any, column: ColumnDefinition): 'square' | 'rounded' | 'circle' | undefined {\n    return ((this.getEffectiveRenderer(row, column)?.image?.shape as any)) || undefined;\n  }\n  getImageFit(row: any, column: ColumnDefinition): 'cover' | 'contain' | undefined {\n    return ((this.getEffectiveRenderer(row, column)?.image?.fit as any)) || undefined;\n  }\n  getImageLazy(_row: any, column: ColumnDefinition): boolean {\n    return !!this.getEffectiveRenderer(_row, column)?.image?.lazy;\n  }\n\n  getBadgeText(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.badge;\n    if (!cfg) return null;\n    const text = cfg.textField ? this.getNestedPropertyValue(row, cfg.textField) : cfg.text;\n    return text != null ? String(text) : null;\n  }\n  getBadgeIcon(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.badge;\n    return (cfg?.icon as any) || null;\n  }\n  getBadgeClasses(row: any, column: ColumnDefinition): string[] {\n    const cfg = this.getEffectiveRenderer(row, column)?.badge;\n    if (!cfg) return [];\n    const out: string[] = [];\n    const variant = (cfg.variant as any) || 'filled';\n    const color = ((cfg.color as any) || '').toLowerCase();\n    if (variant === 'outlined') out.push('pfx-badge--outlined');\n    else if (variant === 'soft') out.push(`pfx-badge--soft-${color || 'primary'}`);\n    else out.push(`pfx-badge--filled-${color || 'primary'}`);\n    return out;\n  }\n\n  // Resolve renderer type per row (supports conditional typeExpr)\n  getEffectiveRendererType(row: any, column: ColumnDefinition): 'icon' | 'image' | 'badge' | 'link' | 'button' | 'chip' | 'progress' | 'avatar' | 'toggle' | 'menu' | 'html' | 'compose' | null {\n    const eff = this.getEffectiveRenderer(row, column);\n    return (eff?.type as any) || null;\n  }\n\n  // Compose helpers\n  getComposeItems(row: any, column: ColumnDefinition): any[] {\n    const items = this.getEffectiveRenderer(row, column)?.compose?.items;\n    return Array.isArray(items) ? items.slice(0, 7) : [];\n  }\n  getComposeClasses(row: any, column: ColumnDefinition): string[] {\n    const layout = this.getEffectiveRenderer(row, column)?.compose?.layout || {};\n    const out: string[] = ['pfx-cell-compose'];\n    out.push(layout.direction === 'column' ? 'dir-col' : 'dir-row');\n    const align = layout.align || 'start';\n    out.push(`align-${align}`);\n    if (layout.wrap) out.push('wrap');\n    if (layout.ellipsis) out.push('ellipsis');\n    return out;\n  }\n  getComposeGapStyle(row: any, column: ColumnDefinition): any {\n    const layout = this.getEffectiveRenderer(row, column)?.compose?.layout || {};\n    const gap = Number(layout.gap);\n    return isFinite(gap) && gap > 0 ? { gap: `${gap}px` } : null;\n  }\n  asItemColumn(base: ColumnDefinition, item: any): any {\n    // Create a lightweight faux column reusing helpers by type\n    const r: any = { type: item?.type };\n    if (item?.icon) r.icon = item.icon;\n    if (item?.image) r.image = item.image;\n    if (item?.badge) r.badge = item.badge;\n    if (item?.link) r.link = item.link;\n    if (item?.button) r.button = item.button;\n    if (item?.chip) r.chip = item.chip;\n    if (item?.progress) r.progress = item.progress;\n    if (item?.avatar) r.avatar = item.avatar;\n    if (item?.toggle) r.toggle = item.toggle;\n    if (item?.menu) r.menu = item.menu;\n    if (item?.html) r.html = item.html;\n    return { field: (base as any).field, header: (base as any).header, renderer: r } as ColumnDefinition;\n  }\n  getItemEffectiveType(row: any, column: ColumnDefinition, item: any): any {\n    return this.getEffectiveRendererType(row, this.asItemColumn(column, item));\n  }\n\n  // =============================\n  // Renderer helpers — Phase 2\n  // =============================\n  // Resolve effective renderer (base + first matching override)\n  private _rendererOverrideCache = new Map<string, any>();\n\n  private mergeRenderer(base: any, ov: any): any {\n    if (!ov) return base;\n    const out: any = JSON.parse(JSON.stringify(base || {}));\n    if (ov.type) out.type = ov.type;\n    if (ov.typeExpr) out.typeExpr = ov.typeExpr;\n    const keys = ['icon','image','badge','link','button','chip','progress','avatar','toggle','menu','html'];\n    for (const k of keys) {\n      if (ov[k]) out[k] = { ...(out[k] || {}), ...(ov[k] || {}) };\n    }\n    if (ov.compose) {\n      out.compose = JSON.parse(JSON.stringify(ov.compose));\n    }\n    return out;\n  }\n\n  private getEffectiveRenderer(row: any, column: ColumnDefinition): any {\n    const key = (() => {\n      try {\n        const colId = (column as any).field || '';\n        const rHash = JSON.stringify((column as any).renderer || {});\n        const oHash = JSON.stringify((column as any).conditionalRenderers || []);\n        const rowKey = String(this.getRowId(row) ?? 'row');\n        return `${colId}|${rowKey}|${rHash}|${oHash}`;\n      } catch { return ''; }\n    })();\n    if (key && this._rendererOverrideCache.has(key)) return this._rendererOverrideCache.get(key);\n\n    let base: any = (column as any)?.renderer || null;\n    // Apply typeExpr early to stabilize type, but overrides may change it\n    if (base && base.typeExpr) {\n      const t = this.evaluateValueExpr(base.typeExpr, row, 'string') as string | null;\n      if (t === 'text' || t === 'none') base = null;\n      else if (t) base = { ...base, type: t };\n    }\n    let eff = base;\n    const rules: any[] = ((column as any)?.conditionalRenderers || []) as any[];\n    if (rules && rules.length) {\n      for (const r of rules) {\n        if (r && r.enabled === false) continue;\n        if (r && r.condition && this.evaluateStyleRule(String(r.condition), row)) {\n          eff = this.mergeRenderer(base || {}, r.renderer || {});\n          break; // first‑match wins\n        }\n      }\n    }\n    if (key) this._rendererOverrideCache.set(key, eff);\n    return eff;\n  }\n\n  // Link\n  getLinkHref(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.link;\n    if (!cfg) return null;\n    const href = cfg.hrefField ? this.getNestedPropertyValue(row, cfg.hrefField) : cfg.href;\n    if (typeof href !== 'string') return null;\n    if (!/^(https?:|mailto:)/i.test(href)) return null;\n    return href;\n  }\n  getLinkText(row: any, column: ColumnDefinition): string {\n    const cfg = this.getEffectiveRenderer(row, column)?.link;\n    const text = cfg?.textField ? this.getNestedPropertyValue(row, cfg.textField) : cfg?.text;\n    return (text != null ? String(text) : String(this.getCellValue(row, column) ?? '')) || '';\n  }\n  getLinkTarget(row: any, column: ColumnDefinition): string | null {\n    const t = ((this.getEffectiveRenderer(row, column)?.link?.target as any)) || null;\n    return t === '_blank' || t === '_self' || t === '_parent' || t === '_top' ? t : null;\n  }\n  getLinkRel(row: any, column: ColumnDefinition): string | null {\n    const t = this.getLinkTarget(row, column);\n    const cfg = this.getEffectiveRenderer(row, column)?.link;\n    if (t === '_blank') return cfg?.rel || 'noopener noreferrer';\n    return cfg?.rel || null;\n  }\n\n  // Button\n  getButtonLabel(row: any, column: ColumnDefinition): string {\n    const cfg = this.getEffectiveRenderer(row, column)?.button;\n    if (!cfg) return '';\n    const val = cfg.labelField ? this.getNestedPropertyValue(row, cfg.labelField) : cfg.label;\n    return (val != null ? String(val) : '') || '';\n  }\n  getButtonIcon(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.button?.icon as any)) || null;\n  }\n  getButtonVariant(row: any, column: ColumnDefinition): 'filled'|'outlined'|'text' {\n    return ((this.getEffectiveRenderer(row, column)?.button?.variant as any)) || 'filled';\n  }\n  getButtonColor(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.button?.color as any)) || null;\n  }\n  isButtonDisabled(row: any, column: ColumnDefinition): boolean {\n    const expr = this.getEffectiveRenderer(row, column)?.button?.disabledCondition as string | undefined;\n    if (!expr) return false;\n    return this.evaluateStyleRule(expr, row) === true;\n  }\n  getButtonAriaLabel(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.button?.ariaLabel as any)) || this.getButtonLabel(row, column) || null;\n  }\n  onButtonClick(row: any, column: ColumnDefinition, event: Event): void {\n    const id = ((this.getEffectiveRenderer(row, column)?.button?.action?.id as any)) || null;\n    if (!id) return;\n    this.onRowAction(id, row, event);\n  }\n\n  // Chip\n  getChipText(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.chip;\n    if (!cfg) return null;\n    const t = cfg.textField ? this.getNestedPropertyValue(row, cfg.textField) : cfg.text;\n    return t != null ? String(t) : null;\n  }\n  getChipIcon(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.chip?.icon as any)) || null;\n  }\n  getChipClasses(row: any, column: ColumnDefinition): string[] {\n    const cfg = this.getEffectiveRenderer(row, column)?.chip;\n    if (!cfg) return [];\n    const v = (cfg.variant as any) || 'filled';\n    const c = ((cfg.color as any) || 'primary').toLowerCase();\n    const out: string[] = [];\n    if (v === 'outlined') out.push('pfx-chip--outlined');\n    else if (v === 'soft') out.push(`pfx-chip--soft-${c}`);\n    else out.push(`pfx-chip--filled-${c}`);\n    return out;\n  }\n\n  // Progress\n  getProgressValue(row: any, column: ColumnDefinition): number {\n    const expr = this.getEffectiveRenderer(row, column)?.progress?.valueExpr;\n    let v: any = null;\n    if (expr) v = this.evaluateValueExpr(expr, row, 'number');\n    const n = typeof v === 'number' ? v : Number(v);\n    if (!isFinite(n)) return 0;\n    return Math.max(0, Math.min(100, n));\n  }\n  getProgressColor(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.progress?.color as any)) || null;\n  }\n  getProgressShowLabel(row: any, column: ColumnDefinition): boolean {\n    return !!this.getEffectiveRenderer(row, column)?.progress?.showLabel;\n  }\n\n  // Avatar\n  getAvatarSrc(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.avatar;\n    if (!cfg) return null;\n    const src = cfg.srcField ? this.getNestedPropertyValue(row, cfg.srcField) : cfg.src;\n    if (typeof src !== 'string') return null;\n    if (/^\\s*javascript:/i.test(src)) return null;\n    return src;\n  }\n  getAvatarAlt(row: any, column: ColumnDefinition): string | null {\n    const cfg = this.getEffectiveRenderer(row, column)?.avatar;\n    if (!cfg) return null;\n    return (cfg.altField ? this.getNestedPropertyValue(row, cfg.altField) : cfg.alt) || null;\n  }\n  getAvatarInitials(row: any, column: ColumnDefinition): string {\n    const cfg = (column as any).renderer?.avatar;\n    const expr = cfg?.initialsExpr as any;\n    const v = this.evaluateValueExpr(expr, row, 'string');\n    return (v != null ? String(v) : '') || '';\n  }\n  getAvatarShape(row: any, column: ColumnDefinition): 'square'|'rounded'|'circle'|undefined {\n    return ((this.getEffectiveRenderer(row, column)?.avatar?.shape as any)) || undefined;\n  }\n  getAvatarStyle(row: any, column: ColumnDefinition): Record<string,string> {\n    const size = ((this.getEffectiveRenderer(row, column)?.avatar?.size as any)) || 32;\n    const s = Math.max(8, Math.min(128, Number(size) || 32));\n    return { width: `${s}px`, height: `${s}px` };\n  }\n\n  // Toggle\n  getToggleState(row: any, column: ColumnDefinition): boolean {\n    const expr = this.getEffectiveRenderer(row, column)?.toggle?.stateExpr;\n    const v = this.evaluateValueExpr(expr, row, 'boolean');\n    return !!v;\n  }\n  isToggleDisabled(row: any, column: ColumnDefinition): boolean {\n    const expr = this.getEffectiveRenderer(row, column)?.toggle?.disabledCondition as string | undefined;\n    if (!expr) return false;\n    return this.evaluateStyleRule(expr, row) === true;\n  }\n  getToggleAriaLabel(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.toggle?.ariaLabel as any)) || null;\n  }\n  onToggleChange(row: any, column: ColumnDefinition, event: any): void {\n    const id = ((this.getEffectiveRenderer(row, column)?.toggle?.action?.id as any)) || null;\n    if (!id) return;\n    this.onRowAction(id, row, event);\n  }\n\n  // Menu\n  getMenuAriaLabel(row: any, column: ColumnDefinition): string | null {\n    return ((this.getEffectiveRenderer(row, column)?.menu?.ariaLabel as any)) || null;\n  }\n  private evaluateArrayExpr(raw: any, row: any): any[] | null {\n    try {\n      if (raw == null) return null;\n      if (typeof raw === 'object' && typeof raw.expr === 'string') {\n        const fn = new Function('row', '\"use strict\"; return (' + raw.expr + ');');\n        const val = fn(row);\n        return Array.isArray(val) ? val : null;\n      }\n      if (typeof raw === 'string') {\n        const m = raw.match(/^\\s*=(.*)$/s);\n        if (m) {\n          const expr = m[1];\n          const fn = new Function('row', '\"use strict\"; return (' + expr + ');');\n          const val = fn(row);\n          return Array.isArray(val) ? val : null;\n        }\n      }\n      return null;\n    } catch { return null; }\n  }\n  getMenuItems(row: any, column: ColumnDefinition): Array<{ label: string; icon?: string; id: string; __visible: boolean }> {\n    const expr = this.getEffectiveRenderer(row, column)?.menu?.itemsExpr;\n    const arr = this.evaluateArrayExpr(expr, row) || [];\n    return (arr as any[]).map((it) => {\n      const visible = it?.visibleCondition ? this.evaluateStyleRule(String(it.visibleCondition), row) === true : true;\n      return { label: String(it?.label ?? it?.id ?? 'item'), icon: it?.icon ? String(it.icon) : undefined, id: String(it?.id ?? ''), __visible: !!visible };\n    }).filter((it) => it.id && it.__visible);\n  }\n  onMenuItemClick(actionId: string, row: any, event: Event): void {\n    if (!actionId) return;\n    this.onRowAction(actionId, row, event);\n  }\n\n  // HTML (sanitized)\n  getSafeHtml(row: any, column: ColumnDefinition): any {\n    const cfg = this.getEffectiveRenderer(row, column)?.html;\n    if (!cfg || !cfg.template) return cfg?.emptyFallback || '';\n    // Replace tokens [[field]] with escaped values\n    const html = String(cfg.template).replace(/\\[\\[([A-Za-z0-9_\\.]+)\\]\\]/g, (_m: string, g1: string) => {\n      const v = this.getNestedPropertyValue(row, g1);\n      return this.escapeHtml(String(v ?? ''));\n    });\n    // Angular will sanitize [innerHTML] by default\n    // Additional strict mode: strip on* attributes\n    if (cfg.sanitize === 'strict') {\n      return html.replace(/\\son[a-z]+\\s*=\\s*\"[^\"]*\"/gi, '').replace(/\\son[a-z]+\\s*=\\s*'[^']*'/gi, '');\n    }\n    return html;\n  }\n  private escapeHtml(s: string): string {\n    return s\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  // Apply appearance variables (header spacing/typography/colors) from config\n  private applyAppearanceVariables(): void {\n    try {\n      const app: any = this.config?.appearance || {};\n      const spacing = app.spacing || {};\n      const typo = app.typography || {};\n      const el = this.hostRef?.nativeElement as HTMLElement;\n      if (!el) return;\n      if (typeof spacing.headerHeight === 'number' && isFinite(spacing.headerHeight)) {\n        el.style.setProperty('--mat-table-header-container-height', `${spacing.headerHeight}px`);\n      }\n      if (spacing.headerPadding) {\n        el.style.setProperty('--p-header-padding', String(spacing.headerPadding));\n      }\n      if (typo.headerFontSize) {\n        el.style.setProperty('--p-header-font-size', String(typo.headerFontSize));\n      }\n      if (typo.headerFontWeight) {\n        el.style.setProperty('--p-header-font-weight', String(typo.headerFontWeight));\n      }\n      if (typo.letterSpacing) {\n        el.style.setProperty('--p-header-letter-spacing', String(typo.letterSpacing));\n      }\n      if (typo.headerCase) {\n        const map: any = { none: 'none', uppercase: 'uppercase', lowercase: 'lowercase', capitalize: 'capitalize' };\n        el.style.setProperty('--p-header-text-transform', map[typo.headerCase] || 'none');\n      }\n      const colors = app.colors || {};\n      if (colors.headerBackground) {\n        el.style.setProperty('--p-table-header-bg', String(colors.headerBackground));\n      }\n      if (colors.headerTextColor) {\n        el.style.setProperty('--p-table-header-fg', String(colors.headerTextColor));\n      }\n      const headerBorderColor = app?.borders?.specific?.header?.color || app?.borders?.color;\n      if (headerBorderColor) {\n        el.style.setProperty('--p-table-border-color', String(headerBorderColor));\n      }\n      if (colors.alternateRowBackground) {\n        el.style.setProperty('--p-table-row-even-bg', String(colors.alternateRowBackground));\n      }\n    } catch {}\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n    // Clean up subscriptions to prevent memory leaks\n    this.subscriptions.forEach((sub) => sub.unsubscribe());\n    this.subscriptions = [];\n\n    // Complete the data subject\n    this.dataSubject.complete();\n  }\n}\n","<praxis-empty-state-card\n  *ngIf=\"!resourcePath\"\n  icon=\"link\"\n  [title]=\"'Conecte a tabela à fonte de dados'\"\n  [description]=\"'Informe a rota do recurso da API para carregar colunas e dados automaticamente.'\"\n  [primaryAction]=\"{ label: 'Conectar à fonte de dados', icon: 'bolt', action: openQuickConnect.bind(this) }\"\n></praxis-empty-state-card>\n\n<!-- Error State with Quick Connect CTA -->\n<div class=\"ptable-error\" *ngIf=\"resourcePath && (schemaError || dataError)\" style=\"display:flex; align-items:center; gap:12px; padding:12px; border:1px solid var(--md-sys-color-error, #b00020); border-radius:8px; margin: 8px 0;\">\n  <mat-icon color=\"warn\" aria-hidden=\"true\">error</mat-icon>\n  <div style=\"flex:1\">\n    <div style=\"font-weight:600\">Erro</div>\n    <div>{{ errorMessage || 'Ocorreu um erro ao carregar a tabela.' }}</div>\n  </div>\n  <button mat-flat-button color=\"primary\" (click)=\"openQuickConnect()\">\n    <mat-icon>bolt</mat-icon>\n    Conectar a recurso\n  </button>\n  <button mat-stroked-button (click)=\"retryData()\" *ngIf=\"!schemaError\">Tentar novamente</button>\n  <button mat-stroked-button (click)=\"reloadSchema()\" *ngIf=\"schemaError\">Recarregar colunas</button>\n  </div>\n\n<!-- Inline banner for schema change (only in edit mode) -->\n<div *ngIf=\"shouldShowOutdatedInline()\" class=\"ptable-info-banner\" role=\"status\" aria-live=\"polite\">\n  <div class=\"text\">O schema do servidor mudou. Reconciliar agora?</div>\n  <div class=\"actions\">\n    <button mat-stroked-button color=\"primary\" (click)=\"onReconcileRequested()\">\n      <mat-icon>sync</mat-icon>\n      Reconciliar\n    </button>\n    <button mat-button (click)=\"onSnoozeOutdated()\">Lembrar depois</button>\n    <button mat-button (click)=\"onIgnoreOutdated()\">Ignorar</button>\n  </div>\n  </div>\n\n  <ng-container *ngIf=\"resourcePath && !schemaError && !dataError && toolbarV2; else legacyHeader\">\n  <div class=\"praxis-table-header\" [class.debug-layout]=\"debugLayout\" [class.edit-mode]=\"editModeEnabled\" *ngIf=\"showToolbar || editModeEnabled\">\n    <praxis-table-toolbar\n      *ngIf=\"showToolbar\"\n      [config]=\"config\"\n      [debugLayout]=\"debugLayout\"\n      (toolbarAction)=\"onToolbarAction($event)\"\n      (reset)=\"onResetPreferences()\"\n    >\n      <praxis-filter\n        *ngIf=\"\n              resourcePath &&\n              config.behavior?.filtering?.advancedFilters?.enabled &&\n              !projectedFilter\n            \"\n        advancedFilter\n        [resourcePath]=\"resourcePath\"\n        [formId]=\"tableId + '-filter'\"\n        [editModeEnabled]=\"editModeEnabled\"\n        [quickField]=\"\n              config.behavior?.filtering?.advancedFilters?.settings?.quickField\n            \"\n        [alwaysVisibleFields]=\"\n              config.behavior?.filtering?.advancedFilters?.settings\n                ?.alwaysVisibleFields\n            \"\n        [allowSaveTags]=\"\n              config.behavior?.filtering?.advancedFilters?.settings\n                ?.allowSaveTags\n            \"\n        [changeDebounceMs]=\"\n              config.behavior?.filtering?.advancedFilters?.settings\n                ?.changeDebounceMs ?? 300\n            \"\n        [i18n]=\"getFilterI18n()\"\n        [mode]=\"\n              config.behavior?.filtering?.advancedFilters?.settings?.mode ??\n              'auto'\n            \"\n        [debugLayout]=\"debugLayout\"\n        [showFilterSettings]=\"editModeEnabled\"\n        (submit)=\"onAdvancedFilterSubmit($event)\"\n        (clear)=\"onAdvancedFilterClear()\"\n      ></praxis-filter>\n      <ng-content select=\"[advancedFilter]\" />\n      <ng-content select=\"[toolbar]\" />\n      <button end-actions mat-icon-button color=\"primary\" data-role=\"table-settings\" *ngIf=\"editModeEnabled\"\n              (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n              [matBadge]=\"schemaOutdated ? '!' : ''\"\n              [matBadgeHidden]=\"!schemaOutdated\"\n              matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n              [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n              matTooltipPosition=\"below\">\n        <mat-icon>settings</mat-icon>\n      </button>\n    </praxis-table-toolbar>\n    <!-- Render a minimal settings button when toolbar is hidden but edit mode is enabled -->\n    <div class=\"ptable-header-actions\" *ngIf=\"!showToolbar && editModeEnabled\">\n      <button mat-icon-button color=\"primary\" (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n              [matBadge]=\"schemaOutdated ? '!' : ''\"\n              [matBadgeHidden]=\"!schemaOutdated\"\n              matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n              [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n              matTooltipPosition=\"below\">\n        <mat-icon>settings</mat-icon>\n      </button>\n      <button mat-icon-button (click)=\"disconnect()\" aria-label=\"Desconectar\" matTooltip=\"Desconectar da fonte de dados\">\n        <mat-icon>link_off</mat-icon>\n      </button>\n    </div>\n    \n  </div>\n</ng-container>\n<ng-template #legacyHeader>\n  <ng-container *ngIf=\"resourcePath && !schemaError && !dataError\">\n  <praxis-table-toolbar\n    *ngIf=\"showToolbar\"\n    [config]=\"config\"\n    [debugLayout]=\"debugLayout\"\n    (toolbarAction)=\"onToolbarAction($event)\"\n    (reset)=\"onResetPreferences()\"\n  >\n  <praxis-filter\n      *ngIf=\"\n            resourcePath &&\n            config.behavior?.filtering?.advancedFilters?.enabled &&\n            !projectedFilter\n          \"\n      advancedFilter\n      [resourcePath]=\"resourcePath\"\n      [formId]=\"tableId + '-filter'\"\n      [editModeEnabled]=\"editModeEnabled\"\n      [quickField]=\"\n            config.behavior?.filtering?.advancedFilters?.settings?.quickField\n          \"\n      [alwaysVisibleFields]=\"\n            config.behavior?.filtering?.advancedFilters?.settings\n              ?.alwaysVisibleFields\n          \"\n      [allowSaveTags]=\"\n            config.behavior?.filtering?.advancedFilters?.settings?.allowSaveTags\n          \"\n      [changeDebounceMs]=\"\n            config.behavior?.filtering?.advancedFilters?.settings\n              ?.changeDebounceMs ?? 300\n          \"\n      [i18n]=\"getFilterI18n()\"\n      [mode]=\"\n            config.behavior?.filtering?.advancedFilters?.settings?.mode ??\n            'auto'\n          \"\n      [debugLayout]=\"debugLayout\"\n      [showFilterSettings]=\"editModeEnabled\"\n      (submit)=\"onAdvancedFilterSubmit($event)\"\n      (clear)=\"onAdvancedFilterClear()\"\n    ></praxis-filter>\n    <ng-content select=\"[advancedFilter]\" />\n    <ng-content select=\"[toolbar]\" />\n    <button end-actions mat-icon-button color=\"primary\" *ngIf=\"editModeEnabled\"\n            (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n            [matBadge]=\"schemaOutdated ? '!' : ''\"\n            [matBadgeHidden]=\"!schemaOutdated\"\n            matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n            [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n            matTooltipPosition=\"below\">\n      <mat-icon>settings</mat-icon>\n    </button>\n  </praxis-table-toolbar>\n  <!-- Legacy header: settings button when toolbar hidden -->\n  <div class=\"ptable-header-actions\" *ngIf=\"!showToolbar && editModeEnabled\">\n    <button mat-icon-button color=\"primary\" data-role=\"table-settings\" (click)=\"openTableSettings()\" aria-label=\"Configurações\"\n            [matBadge]=\"schemaOutdated ? '!' : ''\"\n            [matBadgeHidden]=\"!schemaOutdated\"\n            matBadgeColor=\"warn\" matBadgeSize=\"small\" matBadgePosition=\"above after\"\n            [matTooltip]=\"schemaOutdated ? 'Schema do servidor mudou — Reconciliar' : 'Configurações'\"\n            matTooltipPosition=\"below\">\n      <mat-icon>settings</mat-icon>\n    </button>\n  </div>\n  </ng-container>\n  \n</ng-template>\n<div class=\"px-scroll-viewport\"\n     [class.scroll-auto]=\"horizontalScroll === 'auto'\"\n     [class.scroll-wrap]=\"horizontalScroll === 'wrap'\"\n     [class.scroll-none]=\"horizontalScroll === 'none'\">\n\n<table\n  *ngIf=\"resourcePath && !schemaError && !dataError\"\n  mat-table\n  [dataSource]=\"dataSource\"\n  matSort\n  (matSortChange)=\"onSortChange($event)\"\n  [matSortDisabled]=\"!getSortingEnabled()\"\n  class=\"mat-elevation-z8\"\n>\n  <ng-container\n    *ngIf=\"config.behavior?.selection?.enabled\"\n    matColumnDef=\"_select\"\n  >\n    <th mat-header-cell *matHeaderCellDef>\n      <mat-checkbox\n        (change)=\"masterToggle()\"\n        [checked]=\"isAllSelected()\"\n        [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\n      ></mat-checkbox>\n    </th>\n    <td mat-cell *matCellDef=\"let row\">\n      <mat-checkbox\n        (click)=\"$event.stopPropagation()\"\n        (change)=\"toggleRow(row)\"\n        [checked]=\"selection.isSelected(row)\"\n      ></mat-checkbox>\n    </td>\n  </ng-container>\n  <ng-container\n    *ngFor=\"let column of visibleColumns\"\n    [matColumnDef]=\"column.field\"\n    [sticky]=\"column.sticky === true || column.sticky === 'start'\"\n    [stickyEnd]=\"column.sticky === 'end'\"\n  >\n    <th\n      mat-header-cell\n      *matHeaderCellDef\n      mat-sort-header\n      [disabled]=\"!getSortingEnabled() || column.sortable === false\"\n      [style.text-align]=\"column.align\"\n      [style.width]=\"column.width\"\n      [attr.style]=\"column.headerStyle\"\n    >\n      {{ column.header }}\n    </th>\n    <td\n      mat-cell\n      *matCellDef=\"let element\"\n      [style.text-align]=\"column.align\"\n      [style.width]=\"column.width\"\n      [attr.style]=\"column.style\"\n      [ngClass]=\"getCellClasses(element, column)\"\n      [ngStyle]=\"getCellNgStyle(element, column)\"\n    >\n      <ng-container [ngSwitch]=\"getEffectiveRendererType(element, column)\">\n        <!-- Icon renderer -->\n        <ng-container *ngSwitchCase=\"'icon'\">\n          <mat-icon\n            [color]=\"getIconColor(element, column) || null\"\n            [ngStyle]=\"getIconStyle(element, column)\"\n            [attr.aria-label]=\"getIconAriaLabel(element, column) || null\"\n            >{{ getIconName(element, column) }}</mat-icon\n          >\n        </ng-container>\n\n        <!-- Image renderer -->\n        <ng-container *ngSwitchCase=\"'image'\">\n          <img\n            class=\"pfx-cell-image\"\n            [src]=\"getImageSrc(element, column)\"\n            [attr.alt]=\"getImageAlt(element, column) || ''\"\n            [attr.loading]=\"getImageLazy(element, column) ? 'lazy' : null\"\n            [style.width.px]=\"getImageWidth(element, column)\"\n            [style.height.px]=\"getImageHeight(element, column)\"\n            [class.shape-rounded]=\"getImageShape(element, column) === 'rounded'\"\n            [class.shape-circle]=\"getImageShape(element, column) === 'circle'\"\n            [style.object-fit]=\"getImageFit(element, column)\"\n          />\n        </ng-container>\n\n        <!-- Badge renderer -->\n        <ng-container *ngSwitchCase=\"'badge'\">\n          <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, column)\">\n            <mat-icon *ngIf=\"getBadgeIcon(element, column) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon>\n            <span class=\"pfx-badge-text\">{{ getBadgeText(element, column) }}</span>\n          </span>\n        </ng-container>\n\n        <!-- Link renderer -->\n        <ng-container *ngSwitchCase=\"'link'\">\n          <a\n            class=\"pfx-link\"\n            [attr.href]=\"getLinkHref(element, column) || null\"\n            [attr.target]=\"getLinkTarget(element, column) || null\"\n            [attr.rel]=\"getLinkRel(element, column) || null\"\n            (click)=\"$event.stopPropagation()\"\n            >{{ getLinkText(element, column) }}</a\n          >\n        </ng-container>\n\n        <!-- Button renderer -->\n        <ng-container *ngSwitchCase=\"'button'\">\n          <ng-container [ngSwitch]=\"getButtonVariant(element, column)\">\n            <button\n              *ngSwitchCase=\"'outlined'\"\n              mat-stroked-button\n              [color]=\"getButtonColor(element, column) || null\"\n              [disabled]=\"isButtonDisabled(element, column)\"\n              [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n              (click)=\"onButtonClick(element, column, $event)\"\n            >\n              <mat-icon *ngIf=\"getButtonIcon(element, column) as bi\">{{ bi }}</mat-icon>\n              {{ getButtonLabel(element, column) }}\n            </button>\n            <button\n              *ngSwitchCase=\"'text'\"\n              mat-button\n              [color]=\"getButtonColor(element, column) || null\"\n              [disabled]=\"isButtonDisabled(element, column)\"\n              [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n              (click)=\"onButtonClick(element, column, $event)\"\n            >\n              <mat-icon *ngIf=\"getButtonIcon(element, column) as bi\">{{ bi }}</mat-icon>\n              {{ getButtonLabel(element, column) }}\n            </button>\n            <button\n              *ngSwitchDefault\n              mat-flat-button\n              [color]=\"getButtonColor(element, column) || null\"\n              [disabled]=\"isButtonDisabled(element, column)\"\n              [attr.aria-label]=\"getButtonAriaLabel(element, column) || getButtonLabel(element, column)\"\n              (click)=\"onButtonClick(element, column, $event)\"\n            >\n              <mat-icon *ngIf=\"getButtonIcon(element, column) as bi\">{{ bi }}</mat-icon>\n              {{ getButtonLabel(element, column) }}\n            </button>\n          </ng-container>\n        </ng-container>\n\n        <!-- Chip renderer -->\n        <ng-container *ngSwitchCase=\"'chip'\">\n          <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, column)\">\n            <mat-icon *ngIf=\"getChipIcon(element, column) as ci\" class=\"pfx-chip-icon\">{{ ci }}</mat-icon>\n            <span class=\"pfx-chip-text\">{{ getChipText(element, column) }}</span>\n          </span>\n        </ng-container>\n\n        <!-- Progress renderer -->\n        <ng-container *ngSwitchCase=\"'progress'\">\n          <div class=\"pfx-progress\">\n            <div class=\"pfx-progress-bar\" [style.width.%]=\"getProgressValue(element, column)\" [style.background]=\"getProgressColor(element, column) || null\"></div>\n            <div class=\"pfx-progress-label\" *ngIf=\"getProgressShowLabel(element, column)\">{{ getProgressValue(element, column) }}%</div>\n          </div>\n        </ng-container>\n\n        <!-- Avatar renderer -->\n        <ng-container *ngSwitchCase=\"'avatar'\">\n          <ng-container *ngIf=\"getAvatarSrc(element, column) as asrc; else initials\">\n            <img class=\"pfx-avatar\" [src]=\"asrc\" [attr.alt]=\"getAvatarAlt(element, column) || ''\" [ngStyle]=\"getAvatarStyle(element, column)\" [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\" loading=\"lazy\" />\n          </ng-container>\n          <ng-template #initials>\n            <span class=\"pfx-avatar pfx-avatar--initials\" [ngStyle]=\"getAvatarStyle(element, column)\" [class.shape-rounded]=\"getAvatarShape(element, column) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, column) === 'circle'\">{{ getAvatarInitials(element, column) }}</span>\n          </ng-template>\n        </ng-container>\n\n        <!-- Toggle renderer -->\n        <ng-container *ngSwitchCase=\"'toggle'\">\n          <mat-slide-toggle\n            [checked]=\"getToggleState(element, column)\"\n            [disabled]=\"isToggleDisabled(element, column)\"\n            [attr.aria-label]=\"getToggleAriaLabel(element, column) || 'Alternar'\"\n            (change)=\"onToggleChange(element, column, $event)\"\n            (click)=\"$event.stopPropagation()\"\n          ></mat-slide-toggle>\n        </ng-container>\n\n        <!-- Menu renderer -->\n        <ng-container *ngSwitchCase=\"'menu'\">\n          <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, column) || 'Menu'\">\n            <mat-icon>more_vert</mat-icon>\n          </button>\n          <mat-menu #menuRef=\"matMenu\">\n            <button mat-menu-item *ngFor=\"let it of getMenuItems(element, column)\" (click)=\"onMenuItemClick(it.id, element, $event)\" [disabled]=\"!it.__visible\" >\n              <mat-icon *ngIf=\"it.icon\">{{ it.icon }}</mat-icon>\n              <span>{{ it.label }}</span>\n            </button>\n          </mat-menu>\n        </ng-container>\n\n        <!-- HTML renderer (sanitizado) -->\n        <ng-container *ngSwitchCase=\"'html'\">\n          <span [innerHTML]=\"getSafeHtml(element, column)\"></span>\n        </ng-container>\n\n        <!-- Compose renderer -->\n        <ng-container *ngSwitchCase=\"'compose'\">\n          <span class=\"pfx-cell-compose\" [ngClass]=\"getComposeClasses(element, column)\" [ngStyle]=\"getComposeGapStyle(element, column)\">\n            <ng-container *ngFor=\"let it of getComposeItems(element, column)\">\n              <ng-container [ngSwitch]=\"getItemEffectiveType(element, column, it)\">\n                <!-- Reuse helpers by projecting item as faux column -->\n                <ng-container *ngSwitchCase=\"'icon'\">\n                  <mat-icon [color]=\"getIconColor(element, asItemColumn(column, it)) || null\" [ngStyle]=\"getIconStyle(element, asItemColumn(column, it))\" [attr.aria-label]=\"getIconAriaLabel(element, asItemColumn(column, it)) || null\">{{ getIconName(element, asItemColumn(column, it)) }}</mat-icon>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'image'\">\n                  <img class=\"pfx-cell-image\" [src]=\"getImageSrc(element, asItemColumn(column, it))\" [attr.alt]=\"getImageAlt(element, asItemColumn(column, it)) || ''\" [attr.loading]=\"getImageLazy(element, asItemColumn(column, it)) ? 'lazy' : null\" [style.width.px]=\"getImageWidth(element, asItemColumn(column, it))\" [style.height.px]=\"getImageHeight(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getImageShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getImageShape(element, asItemColumn(column, it)) === 'circle'\" [style.object-fit]=\"getImageFit(element, asItemColumn(column, it))\" />\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'badge'\">\n                  <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(element, asItemColumn(column, it))\"><mat-icon *ngIf=\"getBadgeIcon(element, asItemColumn(column, it)) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon><span class=\"pfx-badge-text\">{{ getBadgeText(element, asItemColumn(column, it)) }}</span></span>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'link'\">\n                  <a class=\"pfx-link\" [attr.href]=\"getLinkHref(element, asItemColumn(column, it)) || null\" [attr.target]=\"getLinkTarget(element, asItemColumn(column, it)) || null\" [attr.rel]=\"getLinkRel(element, asItemColumn(column, it)) || null\" (click)=\"$event.stopPropagation()\">{{ getLinkText(element, asItemColumn(column, it)) }}</a>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'button'\">\n                  <ng-container [ngSwitch]=\"getButtonVariant(element, asItemColumn(column, it))\">\n                    <button *ngSwitchCase=\"'outlined'\" mat-stroked-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><mat-icon *ngIf=\"getButtonIcon(element, asItemColumn(column, it)) as bi\">{{ bi }}</mat-icon>{{ getButtonLabel(element, asItemColumn(column, it)) }}</button>\n                    <button *ngSwitchCase=\"'text'\" mat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><mat-icon *ngIf=\"getButtonIcon(element, asItemColumn(column, it)) as bi\">{{ bi }}</mat-icon>{{ getButtonLabel(element, asItemColumn(column, it)) }}</button>\n                    <button *ngSwitchDefault mat-flat-button [color]=\"getButtonColor(element, asItemColumn(column, it)) || null\" [disabled]=\"isButtonDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getButtonAriaLabel(element, asItemColumn(column, it)) || getButtonLabel(element, asItemColumn(column, it))\" (click)=\"onButtonClick(element, asItemColumn(column, it), $event)\"><mat-icon *ngIf=\"getButtonIcon(element, asItemColumn(column, it)) as bi\">{{ bi }}</mat-icon>{{ getButtonLabel(element, asItemColumn(column, it)) }}</button>\n                  </ng-container>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'chip'\">\n                  <span class=\"pfx-chip\" [ngClass]=\"getChipClasses(element, asItemColumn(column, it))\"><mat-icon *ngIf=\"getChipIcon(element, asItemColumn(column, it)) as ci\" class=\"pfx-chip-icon\">{{ ci }}</mat-icon><span class=\"pfx-chip-text\">{{ getChipText(element, asItemColumn(column, it)) }}</span></span>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'progress'\">\n                  <div class=\"pfx-progress\"><div class=\"pfx-progress-bar\" [style.width.%]=\"getProgressValue(element, asItemColumn(column, it))\" [style.background]=\"getProgressColor(element, asItemColumn(column, it)) || null\"></div><div class=\"pfx-progress-label\" *ngIf=\"getProgressShowLabel(element, asItemColumn(column, it))\">{{ getProgressValue(element, asItemColumn(column, it)) }}%</div></div>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'avatar'\">\n                  <ng-container *ngIf=\"getAvatarSrc(element, asItemColumn(column, it)) as asrc; else initials_comp\">\n                  <img class=\"pfx-avatar\" [src]=\"asrc\" [attr.alt]=\"getAvatarAlt(element, asItemColumn(column, it)) || ''\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\" loading=\"lazy\" />\n                  </ng-container>\n                  <ng-template #initials_comp>\n                    <span class=\"pfx-avatar pfx-avatar--initials\" [ngStyle]=\"getAvatarStyle(element, asItemColumn(column, it))\" [class.shape-rounded]=\"getAvatarShape(element, asItemColumn(column, it)) === 'rounded'\" [class.shape-circle]=\"getAvatarShape(element, asItemColumn(column, it)) === 'circle'\">{{ getAvatarInitials(element, asItemColumn(column, it)) }}</span>\n                  </ng-template>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'toggle'\">\n                  <mat-slide-toggle [checked]=\"getToggleState(element, asItemColumn(column, it))\" [disabled]=\"isToggleDisabled(element, asItemColumn(column, it))\" [attr.aria-label]=\"getToggleAriaLabel(element, asItemColumn(column, it)) || 'Alternar'\" (change)=\"onToggleChange(element, asItemColumn(column, it), $event)\" (click)=\"$event.stopPropagation()\"></mat-slide-toggle>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'menu'\">\n                  <button mat-icon-button [matMenuTriggerFor]=\"menuRef\" (click)=\"$event.stopPropagation()\" [attr.aria-label]=\"getMenuAriaLabel(element, asItemColumn(column, it)) || 'Menu'\"><mat-icon>more_vert</mat-icon></button>\n                  <mat-menu #menuRef=\"matMenu\">\n                    <button mat-menu-item *ngFor=\"let mi of getMenuItems(element, asItemColumn(column, it))\" (click)=\"onMenuItemClick(mi.id, element, $event)\" [disabled]=\"!mi.__visible\"><mat-icon *ngIf=\"mi.icon\">{{ mi.icon }}</mat-icon><span>{{ mi.label }}</span></button>\n                  </mat-menu>\n                </ng-container>\n                <ng-container *ngSwitchCase=\"'html'\">\n                  <span [innerHTML]=\"getSafeHtml(element, asItemColumn(column, it))\"></span>\n                </ng-container>\n                <!-- Value item: render base cell text alongside visuals -->\n                <ng-container *ngSwitchCase=\"'value'\">\n                  <span class=\"pfx-cell-value\">{{ getCellValue(element, column) }}</span>\n                </ng-container>\n              </ng-container>\n            </ng-container>\n          </span>\n        </ng-container>\n\n        <!-- Default text rendering -->\n        <ng-container *ngSwitchDefault>\n          {{ getCellValue(element, column) }}\n        </ng-container>\n      </ng-container>\n    </td>\n  </ng-container>\n  <ng-container *ngIf=\"config.actions?.row?.enabled\" matColumnDef=\"_actions\" [sticky]=\"config.actions?.row?.sticky === true || config.actions?.row?.sticky === 'start'\" [stickyEnd]=\"config.actions?.row?.sticky === 'end'\">\n    <th mat-header-cell *matHeaderCellDef #actionsHeaderCell [style.width]=\"config.actions?.row?.width\" class=\"praxis-actions-header\" [class.align-start]=\"getActionsHeaderAlign() === 'start'\" [class.align-center]=\"getActionsHeaderAlign() === 'center'\" [class.align-end]=\"getActionsHeaderAlign() === 'end'\">\n      <div class=\"praxis-actions-header__content\" [matTooltip]=\"getActionsHeaderTooltip() || ''\" [matTooltipDisabled]=\"!getActionsHeaderTooltip()\">\n        <mat-icon *ngIf=\"getActionsHeaderIcon() as hi\" [praxisIcon]=\"hi\"></mat-icon>\n        <span class=\"label\" *ngIf=\"getActionsHeaderLabel() as hl\">{{ hl }}</span>\n      </div>\n    </th>\n    <td\n      mat-cell\n      *matCellDef=\"let row\"\n      class=\"praxis-actions-cell\"\n      [class.dense]=\"dense\"\n      [style.width]=\"config.actions?.row?.width\"\n    >\n      <div class=\"praxis-actions-cell__content\">\n        <!-- Ações inline -->\n        <!-- Inline actions: icons mode -->\n        <ng-container *ngIf=\"config.actions?.row?.display === 'icons' || !config.actions?.row?.display\">\n          <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n            <button\n              mat-icon-button\n              class=\"praxis-icon-btn\"\n              [disabled]=\"isActionDisabled(a, row)\"\n              (click)=\"onRowAction(getActionId(a), row, $event)\"\n              [matTooltip]=\"a.label || getActionId(a)\"\n              matTooltipPosition=\"above\"\n              matTooltipClass=\"praxis-tooltip\"\n              [attr.aria-label]=\"a.label || getActionId(a)\"\n              [color]=\"a.color || null\"\n            >\n              <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n            </button>\n          </ng-container>\n        </ng-container>\n\n        <!-- Inline actions: buttons mode (show label + icon) -->\n        <ng-container *ngIf=\"config.actions?.row?.display === 'buttons'\">\n          <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n            <button\n              mat-flat-button\n              class=\"praxis-row-btn\"\n              [disabled]=\"isActionDisabled(a, row)\"\n              (click)=\"onRowAction(getActionId(a), row, $event)\"\n              [attr.aria-label]=\"a.label || getActionId(a)\"\n              [color]=\"a.color || null\"\n            >\n              <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n              <span>{{ a.label || getActionId(a) }}</span>\n            </button>\n          </ng-container>\n        </ng-container>\n\n        <!-- Menu de overflow -->\n        <button\n          mat-icon-button\n          class=\"praxis-icon-btn praxis-more-btn\"\n          *ngIf=\"hasOverflowRowActions(row)\"\n          [matMenuTriggerFor]=\"rowMoreMenu\"\n          [color]=\"getRowMenuButtonColor() || null\"\n          aria-label=\"Mais ações\"\n        >\n          <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n        </button>\n        <mat-menu #rowMoreMenu=\"matMenu\" xPosition=\"before\">\n          <ng-container\n            *ngFor=\"let a of getOverflowRowActions(row); trackBy: trackAction\"\n          >\n            <button\n              mat-menu-item\n              (click)=\"onRowAction(getActionId(a), row, $event)\"\n              [disabled]=\"isActionDisabled(a, row)\"\n            >\n              <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n              <span>{{ a.label || getActionId(a) }}</span>\n            </button>\n          </ng-container>\n        </mat-menu>\n      </div>\n    </td>\n  </ng-container>\n\n  <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n  <ng-container *ngIf=\"!isVirtualized()\">\n    <tr\n      mat-row\n      *matRowDef=\"let row; let i = index; columns: displayedColumns\"\n      [ngClass]=\"getRowClasses(row)\"\n      [ngStyle]=\"getRowNgStyle(row)\"\n      [matTooltip]=\"getRowTooltip(row) || null\"\n      [matTooltipDisabled]=\"!getRowTooltip(row)\"\n      [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n      [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n      (click)=\"onRowClicked(row, i)\"\n      (dblclick)=\"onRowDoubleClicked(row, i)\"\n    ></tr>\n  </ng-container>\n</table>\n\n<!-- Virtual rows path (header preserved above) -->\n<ng-container *ngIf=\"resourcePath && !schemaError && !dataError && isVirtualized()\">\n  <cdk-virtual-scroll-viewport\n    class=\"ptable-viewport\"\n    [itemSize]=\"getVirtItemHeight()\"\n    [minBufferPx]=\"getVirtBufferSize() * getVirtItemHeight()\"\n    [maxBufferPx]=\"getVirtBufferSize() * getVirtItemHeight() * 2\"\n    [style.minHeight]=\"getVirtMinHeightStyle()\"\n  >\n    <table class=\"mat-mdc-table mat-elevation-z8\" [style.width]=\"horizontalScroll === 'auto' ? 'max-content' : '100%'\">\n      <tbody>\n        <tr class=\"mat-mdc-row\"\n            *cdkVirtualFor=\"let row of dataSource.data; let i = index; trackBy: trackByRow\"\n            [ngClass]=\"getRowClasses(row)\"\n            [ngStyle]=\"getRowNgStyle(row)\"\n            [matTooltip]=\"getRowTooltip(row) || null\"\n            [matTooltipDisabled]=\"!getRowTooltip(row)\"\n            [matTooltipPosition]=\"getRowTooltipPosition(row)\"\n            [matTooltipShowDelay]=\"getRowTooltipShowDelay(row)\"\n            (click)=\"onRowClicked(row, i)\"\n            (dblclick)=\"onRowDoubleClicked(row, i)\">\n          <!-- Selection column -->\n          <td class=\"mat-mdc-cell\" *ngIf=\"config.behavior?.selection?.enabled\">\n            <mat-checkbox\n              (click)=\"$event.stopPropagation()\"\n              (change)=\"toggleRow(row)\"\n              [checked]=\"selection.isSelected(row)\">\n            </mat-checkbox>\n          </td>\n          <!-- Data columns -->\n          <td class=\"mat-mdc-cell\"\n              *ngFor=\"let column of visibleColumns\"\n              [style.text-align]=\"column.align\"\n              [style.width]=\"column.width\"\n              [attr.style]=\"column.style\"\n              [ngClass]=\"getCellClasses(row, column)\"\n              [ngStyle]=\"getCellNgStyle(row, column)\">\n            <ng-container [ngSwitch]=\"getEffectiveRendererType(row, column)\">\n              <ng-container *ngSwitchCase=\"'icon'\">\n                <mat-icon [color]=\"getIconColor(row, column) || null\"\n                          [ngStyle]=\"getIconStyle(row, column)\"\n                          [attr.aria-label]=\"getIconAriaLabel(row, column) || null\">\n                  {{ getIconName(row, column) }}\n                </mat-icon>\n              </ng-container>\n              <ng-container *ngSwitchCase=\"'image'\">\n                <img class=\"pfx-cell-image\"\n                     [src]=\"getImageSrc(row, column)\"\n                     [attr.alt]=\"getImageAlt(row, column) || ''\"\n                     [attr.loading]=\"getImageLazy(row, column) ? 'lazy' : null\"\n                     [style.width.px]=\"getImageWidth(row, column)\"\n                     [style.height.px]=\"getImageHeight(row, column)\"\n                     [class.shape-rounded]=\"getImageShape(row, column) === 'rounded'\"\n                     [class.shape-circle]=\"getImageShape(row, column) === 'circle'\"\n                     [style.object-fit]=\"getImageFit(row, column)\" />\n              </ng-container>\n              <ng-container *ngSwitchCase=\"'badge'\">\n                <span class=\"pfx-badge\" [ngClass]=\"getBadgeClasses(row, column)\">\n                  <mat-icon *ngIf=\"getBadgeIcon(row, column) as bi\" class=\"pfx-badge-icon\">{{ bi }}</mat-icon>\n                  <span class=\"pfx-badge-text\">{{ getBadgeText(row, column) }}</span>\n                </span>\n              </ng-container>\n              <ng-container *ngSwitchDefault>\n                {{ getCellValue(row, column) }}\n              </ng-container>\n            </ng-container>\n          </td>\n\n          <!-- Actions column -->\n          <td class=\"mat-mdc-cell praxis-actions-cell\" *ngIf=\"config.actions?.row?.enabled\" [class.dense]=\"dense\" [style.width]=\"config.actions?.row?.width\">\n            <div class=\"praxis-actions-cell__content\">\n              <ng-container *ngIf=\"config.actions?.row?.display === 'icons' || !config.actions?.row?.display\">\n                <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n                  <button mat-icon-button class=\"praxis-icon-btn\"\n                          [disabled]=\"isActionDisabled(a, row)\"\n                          (click)=\"onRowAction(getActionId(a), row, $event)\"\n                          [matTooltip]=\"a.label || getActionId(a)\"\n                          matTooltipPosition=\"above\"\n                          matTooltipClass=\"praxis-tooltip\"\n                          [attr.aria-label]=\"a.label || getActionId(a)\"\n                          [color]=\"a.color || null\">\n                    <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n                  </button>\n                </ng-container>\n              </ng-container>\n              <ng-container *ngIf=\"config.actions?.row?.display === 'buttons'\">\n                <ng-container *ngFor=\"let a of getInlineRowActions(row); trackBy: trackAction\">\n                  <button mat-flat-button class=\"praxis-row-btn\"\n                          [disabled]=\"isActionDisabled(a, row)\"\n                          (click)=\"onRowAction(getActionId(a), row, $event)\"\n                          [attr.aria-label]=\"a.label || getActionId(a)\"\n                          [color]=\"a.color || null\">\n                    <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n                    <span>{{ a.label || getActionId(a) }}</span>\n                  </button>\n                </ng-container>\n              </ng-container>\n              <button mat-icon-button class=\"praxis-icon-btn praxis-more-btn\"\n                      *ngIf=\"hasOverflowRowActions(row)\"\n                      [matMenuTriggerFor]=\"rowMoreMenuV\"\n                      [color]=\"getRowMenuButtonColor() || null\"\n                      aria-label=\"Mais ações\">\n                <mat-icon [praxisIcon]=\"getRowMenuIcon()\"></mat-icon>\n              </button>\n              <mat-menu #rowMoreMenuV=\"matMenu\" xPosition=\"before\">\n                <ng-container *ngFor=\"let a of getOverflowRowActions(row); trackBy: trackAction\">\n                  <button mat-menu-item (click)=\"onRowAction(getActionId(a), row, $event)\" [disabled]=\"isActionDisabled(a, row)\">\n                    <mat-icon [color]=\"a.color || null\" [praxisIcon]=\"a.icon\"></mat-icon>\n                    <span>{{ a.label || getActionId(a) }}</span>\n                  </button>\n                </ng-container>\n              </mat-menu>\n            </div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n  </cdk-virtual-scroll-viewport>\n</ng-container>\n\n</div>\n<!-- Paginadores (top/bottom) -->\n<mat-paginator\n  *ngIf=\"resourcePath && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'top' || config.behavior?.pagination?.position === 'both')\"\n  [length]=\"getPaginationLength()\"\n  [pageSize]=\"getPaginationPageSize()\"\n  [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n  [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n  (page)=\"onPageChange($event)\"\n  [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n\n<mat-paginator\n  *ngIf=\"resourcePath && !schemaError && !dataError && getPaginationEnabled() && (config.behavior?.pagination?.position === 'bottom' || config.behavior?.pagination?.position === 'both' || !config.behavior?.pagination?.position)\"\n  [length]=\"getPaginationLength()\"\n  [pageSize]=\"getPaginationPageSize()\"\n  [pageSizeOptions]=\"getPaginationPageSizeOptions()\"\n  [showFirstLastButtons]=\"getPaginationShowFirstLast()\"\n  (page)=\"onPageChange($event)\"\n  [class.compact]=\"config.behavior?.pagination?.style === 'compact'\"\n>\n</mat-paginator>\n","import type { DslParser } from '@praxisui/specification';\n\n/**\n * Lightweight JSON path evaluator for simple cases used in conditional styling.\n * Supported syntax (subset):\n *  - $.a.b.c\n *  - a.b[0].c\n *  - a[\"key\"] / a['key']\n *  - a[0]\n */\nexport function jsonPathGet(root: any, rawPath: string): any {\n  if (root == null) return undefined;\n  let path = String(rawPath || '').trim();\n  if (!path) return undefined;\n  if (path.startsWith('$.')) path = path.slice(2);\n  if (path.startsWith('$')) path = path.slice(1);\n\n  // Tokenize: split by dots not inside brackets\n  const tokens: string[] = [];\n  let buf = '';\n  let inBracket = 0;\n  for (let i = 0; i < path.length; i++) {\n    const ch = path[i];\n    if (ch === '.' && inBracket === 0) {\n      if (buf) { tokens.push(buf); buf = ''; }\n      continue;\n    }\n    if (ch === '[') inBracket++;\n    if (ch === ']') inBracket = Math.max(0, inBracket - 1);\n    buf += ch;\n  }\n  if (buf) tokens.push(buf);\n\n  let cur: any = root;\n  for (const tk of tokens) {\n    if (cur == null) return undefined;\n    // Handle bracket notation\n    const m = tk.match(/^([^\\[]+)?(\\[.+\\])?$/);\n    if (!m) return undefined;\n    const head = (m[1] ?? tk).trim();\n    const bracket = m[2];\n    if (head) {\n      cur = cur[head];\n    }\n    if (bracket) {\n      // Could be multiple brackets: [0][\"key\"]\n      const parts = Array.from(bracket.matchAll(/\\[(.*?)\\]/g)).map((x) => x[1]);\n      for (const p of parts) {\n        const q = p?.trim();\n        if (!q) continue;\n        if ((q.startsWith('\"') && q.endsWith('\"')) || (q.startsWith('\\'') && q.endsWith('\\''))) {\n          const key = q.slice(1, -1);\n          cur = cur?.[key];\n        } else if (/^-?\\d+$/.test(q)) {\n          const idx = Number(q);\n          cur = Array.isArray(cur) ? cur[idx] : undefined;\n        } else {\n          // Fallback treat as key\n          cur = cur?.[q];\n        }\n      }\n    }\n  }\n  return cur;\n}\n\nexport function hasJsonKey(root: any, keyOrPath: string): boolean {\n  if (!keyOrPath) return false;\n  // If simple key without dots/brackets, check own key\n  if (!/[\\.\\[]/.test(keyOrPath)) {\n    return root != null && Object.prototype.hasOwnProperty.call(root, keyOrPath);\n  }\n  return jsonPathGet(root, keyOrPath) !== undefined;\n}\n\nexport function jsonPathMatches(root: any, path: string, pattern: string): boolean {\n  const val = jsonPathGet(root, path);\n  if (val == null) return false;\n  try {\n    const re = new RegExp(pattern);\n    return re.test(String(val));\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Registers JSON helpers in a DslParser instance, if it supports custom functions.\n * This is optional — call it in your app host bootstrap.\n */\nexport function registerJsonDslFunctions(parser: DslParser | any): void {\n  if (!parser || typeof (parser as any).registerFunction !== 'function') return;\n  const reg = (name: string, fn: (...args: any[]) => any) => {\n    try { (parser as any).registerFunction(name, fn); } catch {}\n  };\n  reg('jsonGet', (obj: any, p: string) => jsonPathGet(obj, p));\n  reg('hasJsonKey', (obj: any, p: string) => hasJsonKey(obj, p));\n  reg('jsonPathMatches', (obj: any, p: string, pat: string) => jsonPathMatches(obj, p, pat));\n}\n\n/**\n * Example: extend an existing parser instance\n *\n * import { DslParser } from '@praxisui/specification';\n * import { registerJsonDslFunctions } from '@praxisui/table';\n * const parser = new DslParser<any>();\n * registerJsonDslFunctions(parser);\n */\n\n","import type { DslParser } from '@praxisui/specification';\n\nfunction toIsoDateOnly(d: Date): string {\n  return d.toISOString().slice(0, 10);\n}\n\nfunction parseDateLike(input: any): Date | null {\n  if (input instanceof Date && !isNaN(input.getTime())) return input;\n  if (typeof input === 'number') {\n    const d = new Date(input);\n    return isNaN(d.getTime()) ? null : d;\n  }\n  const s = String(input ?? '').trim();\n  if (!s) return null;\n  // Accept 'YYYY-MM-DD' or ISO strings\n  const d = new Date(s.length <= 10 ? s + 'T00:00:00Z' : s);\n  return isNaN(d.getTime()) ? null : d;\n}\n\n/**\n * Registers simple date/time helpers in a DslParser instance.\n * - today(): returns 'YYYY-MM-DD' (UTC)\n * - now(): returns Date ISO string (toISOString)\n * - dateAdd(date, amount, unit): adds amount (days|weeks|months) and returns 'YYYY-MM-DD'\n * - dateFormat(date, token): supports token 'E' (ISO weekday 1..7)\n */\nexport function registerDateDslFunctions(parser: DslParser | any): void {\n  if (!parser || typeof (parser as any).registerFunction !== 'function') return;\n  const reg = (name: string, fn: (...args: any[]) => any) => {\n    try { (parser as any).registerFunction(name, fn); } catch {}\n  };\n\n  reg('today', () => toIsoDateOnly(new Date()));\n  reg('now', () => new Date().toISOString());\n\n  reg('dateAdd', (dateInput: any, amount: number, unit: string) => {\n    const base = parseDateLike(dateInput);\n    if (!base || !isFinite(Number(amount))) return null;\n    const amt = Number(amount);\n    const u = String(unit || 'days').toLowerCase();\n    const d = new Date(base.getTime());\n    if (u.startsWith('day')) {\n      d.setUTCDate(d.getUTCDate() + amt);\n      return toIsoDateOnly(d);\n    } else if (u.startsWith('week')) {\n      d.setUTCDate(d.getUTCDate() + amt * 7);\n      return toIsoDateOnly(d);\n    } else if (u.startsWith('month')) {\n      const year = d.getUTCFullYear();\n      const month = d.getUTCMonth();\n      const day = d.getUTCDate();\n      const targetMonth = month + amt;\n      const target = new Date(Date.UTC(year, targetMonth, Math.min(day, 28)));\n      // Adjust to prevent month overflow issues around 29/30/31\n      return toIsoDateOnly(target);\n    }\n    // default fallback (days)\n    d.setUTCDate(d.getUTCDate() + amt);\n    return toIsoDateOnly(d);\n  });\n\n  reg('dateFormat', (dateInput: any, token: string) => {\n    const d = parseDateLike(dateInput);\n    if (!d) return null;\n    const t = String(token || '').trim();\n    if (t === 'E') {\n      // ISO weekday: Monday=1 ... Sunday=7\n      const js = d.getUTCDay(); // 0..6 (Sun..Sat)\n      return js === 0 ? 7 : js;\n    }\n    // Fallback: raw ISO date\n    return toIsoDateOnly(d);\n  });\n}\n\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisTable } from './praxis-table';\n\n/** Metadata for PraxisTable component */\nexport const PRAXIS_TABLE_COMPONENT_METADATA: ComponentDocMeta = {\n  id: 'praxis-table',\n  selector: 'praxis-table',\n  component: PraxisTable,\n  friendlyName: 'Praxis Table',\n  description: 'Tabela interativa com paginação, ordenação e ações em massa.',\n  icon: 'grid_on',\n  inputs: [\n    {\n      name: 'config',\n      type: 'TableConfig',\n      label: 'Configuração',\n      description: 'Configuração da tabela (colunas, toolbar, ações)',\n    },\n    {\n      name: 'resourcePath',\n      type: 'string',\n      label: 'Recurso',\n      description: 'Endpoint base para operações de dados',\n    },\n    {\n      name: 'filterCriteria',\n      type: 'any',\n      label: 'Filtro',\n      description: 'Filtros aplicados às consultas (JSON)',\n      default: {},\n    },\n    {\n      name: 'showToolbar',\n      type: 'boolean',\n      default: false,\n      description: 'Exibe barra de ferramentas',\n    },\n    {\n      name: 'toolbarV2',\n      type: 'boolean',\n      default: true,\n      description: 'Ativa layout da toolbar v2',\n    },\n    {\n      name: 'autoDelete',\n      type: 'boolean',\n      default: false,\n      description: 'Ativa deleção automática',\n    },\n    {\n      name: 'editModeEnabled',\n      type: 'boolean',\n      default: false,\n      description: 'Permite edição de layout',\n    },\n    {\n      name: 'dense',\n      type: 'boolean',\n      default: false,\n      description: 'Modo compacto',\n    },\n    {\n      name: 'tableId',\n      type: 'string',\n      default: 'default',\n      label: 'ID da Tabela',\n      description: 'Identificador para armazenamento de configuração',\n    },\n  ],\n  outputs: [\n    {\n      name: 'rowClick',\n      type: '{ row: any; index: number }',\n      label: 'Clique na linha',\n      description: 'Emitido ao clicar em uma linha',\n    },\n    {\n      name: 'rowDoubleClick',\n      type: '{ action: string; row: any }',\n      label: 'Duplo clique na linha',\n      description: 'Emitido ao dar duplo clique na linha (ação conforme Behavior)',\n    },\n    {\n      name: 'rowAction',\n      type: '{ action: string; row: any }',\n      label: 'Ação na linha',\n      description: 'Emitido ao acionar uma ação em uma linha',\n    },\n    {\n      name: 'toolbarAction',\n      type: '{ action: string }',\n      label: 'Ação da toolbar',\n      description: 'Emitido ao acionar uma ação da toolbar',\n    },\n    {\n      name: 'bulkAction',\n      type: '{ action: string; rows: any[] }',\n      label: 'Ação em massa',\n      description: 'Emitido ao executar ações em massa',\n    },\n    {\n      name: 'beforeDelete',\n      type: 'any',\n      description: 'Antes de deletar uma linha',\n    },\n    { name: 'afterDelete', type: 'any', description: 'Após deletar uma linha' },\n    {\n      name: 'deleteError',\n      type: '{ row: any; error: unknown }',\n      description: 'Erro ao deletar uma linha',\n    },\n    {\n      name: 'beforeBulkDelete',\n      type: 'any[]',\n      description: 'Antes de deletar múltiplas linhas',\n    },\n    {\n      name: 'afterBulkDelete',\n      type: 'any[]',\n      description: 'Após deletar múltiplas linhas',\n    },\n    {\n      name: 'bulkDeleteError',\n      type: '{ rows: any[]; error: unknown }',\n      description: 'Erro ao deletar múltiplas linhas',\n    },\n  ],\n  tags: ['widget', 'table', 'configurable', 'hasWizard', 'stable'],\n  lib: '@praxisui/table',\n  layoutHints: { recommendedCols: 8, recommendedRows: 6, minCols: 5, minRows: 4 },\n};\n\n/**\n * Provider que registra o metadata no ComponentMetadataRegistry durante o bootstrap.\n */\nexport function providePraxisTableMetadata(): Provider {\n  return {\n    provide: ENVIRONMENT_INITIALIZER,\n    multi: true,\n    useFactory: (registry: ComponentMetadataRegistry) => () => {\n      registry.register(PRAXIS_TABLE_COMPONENT_METADATA);\n    },\n    deps: [ComponentMetadataRegistry],\n  } as Provider;\n}\n","/*\n * Public API Surface of praxis-table\n */\n\n// Core components and services\nexport * from './lib/praxis-table';\nexport * from './lib/praxis-table-toolbar';\nexport * from './lib/praxis-table-config-editor';\nexport * from './lib/components/praxis-filter';\nexport * from './lib/filter-drawer.adapter';\nexport * from './lib/services/filter-config.service';\nexport * from './lib/data-formatter/data-formatter-types';\nexport * from './lib/data-formatter/data-formatting.service';\nexport * from './lib/data-formatter/data-formatter.component';\nexport * from './lib/services/table-defaults.provider';\nexport * from './lib/utils/action-utils';\n\n// Editor components\nexport * from './lib/behavior-config-editor/behavior-config-editor.component';\nexport * from './lib/columns-config-editor/columns-config-editor.component';\nexport * from './lib/messages-localization-editor/messages-localization-editor.component';\nexport * from './lib/toolbar-actions-editor/toolbar-actions-editor.component';\nexport * from './lib/value-mapping-editor/value-mapping-editor.component';\nexport * from './lib/json-config-editor/json-config-editor.component';\nexport * from './lib/filter-settings/filter-settings.component';\nexport * from './lib/rules-editor/table-rules-editor.component';\nexport * from './lib/rules-editor/dsl-extensions/json-dsl.extensions';\nexport * from './lib/rules-editor/dsl-extensions/date-dsl.extensions';\n\n// Integration and utilities\nexport * from './lib/visual-formula-builder/visual-formula-builder.component';\nexport * from './lib/visual-formula-builder/formula-generator.service';\nexport * from './lib/visual-formula-builder/formula-types';\nexport * from './lib/praxis-table.metadata';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i5","i1.FormulaGeneratorService","i3","i4","i6","i7","i8","i10","i12","i1","i11","i1.DataFormattingService","i9","i13","i14","debounceTime","i1.OperatorsRegistryService","i2.RuleCompilerService","i15","i16","i17","i18","i19","i20","takeUntil","i2.FilterConfigService","take","i3.DataFormattingService","i4.TableDefaultsProvider","i6.FilterConfigService"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6tCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qtPAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAA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AA6B;wBAC7B,2BAA2B;wBAC3B,sBAAsB;qBACvB,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}