{"version":3,"file":"ngx-core-components-grid.mjs","sources":["../../../projects/ngx-core-components/grid/data-grid/grid-export.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-export-xlsx.service.ts","../../../projects/ngx-core-components/grid/data-grid/components/grid-status-bar/grid-status-bar.component.ts","../../../projects/ngx-core-components/grid/data-grid/components/grid-filter-builder/grid-filter-builder.component.ts","../../../projects/ngx-core-components/grid/data-grid/data-grid.component.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-state.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-selection.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-edit.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-clipboard.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-virtualization.service.ts","../../../projects/ngx-core-components/grid/data-grid/services/grid-keyboard.service.ts","../../../projects/ngx-core-components/grid/data-grid/utils/grid-sort.util.ts","../../../projects/ngx-core-components/grid/data-grid/utils/grid-filter.util.ts","../../../projects/ngx-core-components/grid/data-grid/utils/grid-aggregate.util.ts","../../../projects/ngx-core-components/grid/pivot-grid/pivot-grid.component.ts","../../../projects/ngx-core-components/grid/public-api.ts","../../../projects/ngx-core-components/grid/ngx-core-components-grid.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { GridColumnDef, GridGroupState } from './models';\n\n/**\n * Standalone injectable service for exporting grid data to JSON, CSV, and Excel formats.\n * Extracted from DataGridComponent to enable reuse and reduce component size.\n */\n@Injectable({ providedIn: 'root' })\nexport class GridExportService {\n\n  /**\n   * Export data as a JSON file download.\n   */\n  exportToJson<T>(data: T[], filename = 'grid-data.json'): void {\n    if (data.length === 0 || typeof window === 'undefined' || typeof document === 'undefined') return;\n    const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(data, null, 2));\n    this.triggerDownload(dataStr, filename);\n  }\n\n  /**\n   * Export data as a CSV file download.\n   */\n  exportToCsv<T extends object>(\n    data: T[],\n    columns: GridColumnDef<T>[],\n    filename = 'grid-data.csv',\n    groupBy?: GridGroupState | null\n  ): void {\n    if (data.length === 0 || typeof window === 'undefined' || typeof document === 'undefined') return;\n    const headers = columns.map(c => c.title);\n    const fields = columns.map(c => c.field);\n    const lines: string[] = [headers.join(',')];\n\n    if (groupBy) {\n      const field = groupBy.field;\n      const groupsMap = new Map<string, T[]>();\n      data.forEach(row => {\n        const val = (row as Record<string, unknown>)[field] ?? '';\n        const key = String(val === '' || val == null ? '(Blank)' : val);\n        const groupItems = groupsMap.get(key) || [];\n        groupItems.push(row);\n        groupsMap.set(key, groupItems);\n      });\n\n      groupsMap.forEach((items, key) => {\n        lines.push(`\"${groupBy.field.toUpperCase()}: ${key} (${items.length} items)\"` + ','.repeat(columns.length - 1));\n        items.forEach(row => {\n          const r = row as Record<string, unknown>;\n          const rowVals = fields.map(f => {\n            const val = r[f] ?? '';\n            const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n            return `\"${valStr.replace(/\"/g, '\"\"')}\"`;\n          });\n          lines.push(rowVals.join(','));\n        });\n      });\n    } else {\n      const rows = data.map(row => {\n        const r = row as Record<string, unknown>;\n        return fields.map(field => {\n          const val = r[field] ?? '';\n          const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n          return `\"${valStr.replace(/\"/g, '\"\"')}\"`;\n        });\n      });\n      lines.push(...rows.map(e => e.join(',')));\n    }\n\n    const csvContent = lines.join('\\n');\n    const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n    const url = URL.createObjectURL(blob);\n    this.triggerDownload(url, filename);\n  }\n\n  /**\n   * Export data as an Excel (.xls) file download using an HTML table template.\n   */\n  exportToExcel<T extends object>(\n    data: T[],\n    columns: GridColumnDef<T>[],\n    filename = 'grid-data.xls',\n    groupBy?: GridGroupState | null\n  ): void {\n    if (data.length === 0 || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    let tableHtml = '<table><thead><tr>';\n    columns.forEach(c => {\n      tableHtml += `<th>${c.title}</th>`;\n    });\n    tableHtml += '</tr></thead><tbody>';\n\n    if (groupBy) {\n      const field = groupBy.field;\n      const groupsMap = new Map<string, T[]>();\n      data.forEach(row => {\n        const val = (row as Record<string, unknown>)[field] ?? '';\n        const key = String(val === '' || val == null ? '(Blank)' : val);\n        const groupItems = groupsMap.get(key) || [];\n        groupItems.push(row);\n        groupsMap.set(key, groupItems);\n      });\n\n      groupsMap.forEach((items, key) => {\n        tableHtml += `\n          <tr class=\"group-header\">\n            <td colspan=\"${columns.length}\" style=\"background-color: #e2e8f0; font-weight: 700; color: #1e293b; border: 1px solid #cbd5e1; padding: 6px;\">\n              ${groupBy.field.toUpperCase()}: ${key} (${items.length} items)\n            </td>\n          </tr>\n        `;\n        items.forEach(row => {\n          const r = row as Record<string, unknown>;\n          tableHtml += '<tr>';\n          columns.forEach(c => {\n            const val = r[c.field] ?? '';\n            const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n            const alignClass = c.align ? ` class=\"text-${c.align}\"` : '';\n            const indentStyle = c === columns[0] ? ' style=\"padding-left: 20px;\"' : '';\n            tableHtml += `<td${alignClass}${indentStyle}>${valStr}</td>`;\n          });\n          tableHtml += '</tr>';\n        });\n      });\n    } else {\n      data.forEach(row => {\n        const r = row as Record<string, unknown>;\n        tableHtml += '<tr>';\n        columns.forEach(c => {\n          const val = r[c.field] ?? '';\n          const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n          const alignClass = c.align ? ` class=\"text-${c.align}\"` : '';\n          tableHtml += `<td${alignClass}>${valStr}</td>`;\n        });\n        tableHtml += '</tr>';\n      });\n    }\n    tableHtml += '</tbody></table>';\n\n    const worksheetName = 'Grid Export';\n    const template = `\n      <html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">\n      <head>\n      <!--[if gte mso 9]>\n      <xml>\n       <x:ExcelWorkbook>\n        <x:ExcelWorksheets>\n         <x:ExcelWorksheet>\n          <x:Name>${worksheetName}</x:Name>\n          <x:WorksheetOptions>\n           <x:DisplayGridlines/>\n          </x:WorksheetOptions>\n         </x:ExcelWorksheet>\n        </x:ExcelWorksheets>\n       </x:ExcelWorkbook>\n      </xml>\n      <![endif]-->\n      <style>\n        table { border-collapse: collapse; font-family: sans-serif; font-size: 11pt; }\n        th { background-color: #f1f5f9; color: #1e293b; font-weight: bold; border: 1px solid #cbd5e1; padding: 6px; }\n        td { border: 1px solid #cbd5e1; padding: 6px; }\n        .text-right { text-align: right; }\n        .text-center { text-align: center; }\n        .text-left { text-align: left; }\n      </style>\n      </head>\n      <body>\n      ${tableHtml}\n      </body>\n      </html>\n    `;\n\n    const blob = new Blob([template], { type: 'application/vnd.ms-excel;charset=utf-8;' });\n    const url = URL.createObjectURL(blob);\n    this.triggerDownload(url, filename);\n  }\n\n  exportToPdf<T extends object>(\n    data: T[],\n    columns: GridColumnDef<T>[],\n    title = 'Data Grid Export',\n    groupBy?: GridGroupState | null\n  ): void {\n    if (data.length === 0 || typeof window === 'undefined' || typeof document === 'undefined') return;\n\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      alert('Pop-up blocker prevented printing. Please allow pop-ups for this site.');\n      return;\n    }\n\n    let tableHtml = '<table><thead><tr>';\n    columns.forEach(c => {\n      tableHtml += `<th>${c.title}</th>`;\n    });\n    tableHtml += '</tr></thead><tbody>';\n\n    if (groupBy) {\n      const field = groupBy.field;\n      const groupsMap = new Map<string, T[]>();\n      data.forEach(row => {\n        const val = (row as Record<string, unknown>)[field] ?? '';\n        const key = String(val === '' || val == null ? '(Blank)' : val);\n        const groupItems = groupsMap.get(key) || [];\n        groupItems.push(row);\n        groupsMap.set(key, groupItems);\n      });\n\n      groupsMap.forEach((items, key) => {\n        tableHtml += `\n          <tr class=\"group-header\">\n            <td colspan=\"${columns.length}\" style=\"background-color: #f1f5f9; font-weight: bold; color: #1e293b; border: 1px solid #cbd5e1; padding: 10px 8px;\">\n              ${groupBy.field.toUpperCase()}: ${key} (${items.length} items)\n            </td>\n          </tr>\n        `;\n        items.forEach(row => {\n          const r = row as Record<string, unknown>;\n          tableHtml += '<tr>';\n          columns.forEach(c => {\n            const val = r[c.field] ?? '';\n            const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n            const alignClass = c.align ? ` class=\"text-${c.align}\"` : '';\n            const indentStyle = c === columns[0] ? ' style=\"padding-left: 24px;\"' : '';\n            tableHtml += `<td${alignClass}${indentStyle}>${valStr}</td>`;\n          });\n          tableHtml += '</tr>';\n        });\n      });\n    } else {\n      data.forEach(row => {\n        const r = row as Record<string, unknown>;\n        tableHtml += '<tr>';\n        columns.forEach(c => {\n          const val = r[c.field] ?? '';\n          const valStr = typeof val === 'object' ? JSON.stringify(val) : String(val);\n          const alignClass = c.align ? ` class=\"text-${c.align}\"` : '';\n          tableHtml += `<td${alignClass}>${valStr}</td>`;\n        });\n        tableHtml += '</tr>';\n      });\n    }\n    tableHtml += '</tbody></table>';\n\n    const printTemplate = `\n      <html>\n      <head>\n        <title>${title}</title>\n        <style>\n          body { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; padding: 24px; color: #0f172a; }\n          .header { display: flex; justify-content: space-between; align-items: center; border-bottom: 2px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px; }\n          .title { font-size: 20px; font-weight: bold; }\n          .date { font-size: 12px; color: #64748b; }\n          table { width: 100%; border-collapse: collapse; margin-top: 12px; font-size: 10pt; }\n          th { background-color: #f8fafc; color: #1e293b; font-weight: bold; border: 1px solid #cbd5e1; padding: 10px 8px; text-align: left; }\n          td { border: 1px solid #cbd5e1; padding: 8px; color: #334155; }\n          .text-right { text-align: right; }\n          .text-center { text-align: center; }\n          .text-left { text-align: left; }\n          @media print {\n            body { padding: 0; }\n            button { display: none; }\n          }\n        </style>\n      </head>\n      <body>\n        <div class=\"header\">\n          <div class=\"title\">${title}</div>\n          <div class=\"date\">${new Date().toLocaleString()}</div>\n        </div>\n        ${tableHtml}\n        <script>\n          window.onload = function() {\n            window.print();\n            setTimeout(function() { window.close(); }, 500);\n          };\n        </script>\n      </body>\n      </html>\n    `;\n\n    printWindow.document.write(printTemplate);\n    printWindow.document.close();\n  }\n\n  /**\n   * Create a temporary anchor element, trigger a download, and clean up.\n   */\n  private triggerDownload(href: string, filename: string): void {\n    if (typeof document === 'undefined') return;\n    const downloadAnchor = document.createElement('a');\n    downloadAnchor.setAttribute('href', href);\n    downloadAnchor.setAttribute('download', filename);\n    document.body.appendChild(downloadAnchor);\n    downloadAnchor.click();\n    downloadAnchor.remove();\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { GridColumnDef, GridGroupState } from '../models';\n\n/**\n * Enterprise-grade export service for the DataGrid.\n * Generates native XLSX binary workbooks and vector PDF documents\n * with zero external dependencies.\n */\n@Injectable()\nexport class GridExportXlsxService {\n\n  /**\n   * Export data as a native .xlsx binary workbook.\n   * Supports: styled headers, auto-column widths, frozen header pane,\n   * number formatting, and multi-sheet grouped exports.\n   */\n  exportToXlsx<T extends object>(\n    data: T[],\n    columns: GridColumnDef<T>[],\n    filename = 'grid-data.xlsx',\n    options?: XlsxExportOptions\n  ): void {\n    if (!data.length || typeof window === 'undefined') return;\n\n    const opts: Required<XlsxExportOptions> = {\n      sheetName: options?.sheetName ?? 'Sheet1',\n      freezeHeader: options?.freezeHeader ?? true,\n      autoFilter: options?.autoFilter ?? true,\n      groupBy: options?.groupBy ?? null,\n      includeFooter: options?.includeFooter ?? false,\n      title: options?.title ?? '',\n      dateFormat: options?.dateFormat ?? 'yyyy-mm-dd',\n      numberFormat: options?.numberFormat ?? '#,##0.00',\n    };\n\n    const fields = columns.map(c => c.field);\n    const headers = columns.map(c => c.title);\n\n    if (opts.groupBy) {\n      // Multi-sheet export: one sheet per group\n      const groupField = opts.groupBy.field;\n      const groupsMap = new Map<string, T[]>();\n      for (const row of data) {\n        const val = (row as Record<string, unknown>)[groupField] ?? '';\n        const key = String(val === '' || val == null ? '(Blank)' : val);\n        const items = groupsMap.get(key) || [];\n        items.push(row);\n        groupsMap.set(key, items);\n      }\n\n      const sheets: XlsxSheet[] = [];\n      groupsMap.forEach((items, key) => {\n        const rows = items.map(row => this.rowToValues(row as Record<string, unknown>, fields, columns));\n        sheets.push({\n          name: this.sanitizeSheetName(key),\n          headers,\n          data: rows,\n          columnWidths: this.computeColumnWidths(headers, rows),\n          columnTypes: columns.map(c => c.columnType ?? 'text'),\n        });\n      });\n\n      const workbook = this.buildWorkbook(sheets, opts);\n      this.downloadBlob(workbook, filename, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\n    } else {\n      const rows = data.map(row => this.rowToValues(row as Record<string, unknown>, fields, columns));\n      const sheet: XlsxSheet = {\n        name: opts.sheetName,\n        headers,\n        data: rows,\n        columnWidths: this.computeColumnWidths(headers, rows),\n        columnTypes: columns.map(c => c.columnType ?? 'text'),\n      };\n\n      const workbook = this.buildWorkbook([sheet], opts);\n      this.downloadBlob(workbook, filename, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\n    }\n  }\n\n  /**\n   * Export data as a native vector PDF document.\n   * Supports: title, page numbers, column alignment, landscape/portrait.\n   */\n  exportToPdf<T extends object>(\n    data: T[],\n    columns: GridColumnDef<T>[],\n    options?: PdfExportOptions\n  ): void {\n    if (!data.length || typeof window === 'undefined') return;\n\n    const opts: Required<PdfExportOptions> = {\n      title: options?.title ?? 'Data Grid Export',\n      orientation: options?.orientation ?? 'landscape',\n      pageSize: options?.pageSize ?? 'A4',\n      fontSize: options?.fontSize ?? 9,\n      headerFontSize: options?.headerFontSize ?? 10,\n      margin: options?.margin ?? 40,\n      groupBy: options?.groupBy ?? null,\n      showPageNumbers: options?.showPageNumbers ?? true,\n      showDate: options?.showDate ?? true,\n    };\n\n    const fields = columns.map(c => c.field);\n    const headers = columns.map(c => c.title);\n    const rows = data.map(row => this.rowToStringValues(row as Record<string, unknown>, fields));\n\n    // Generate PDF using a print window with enhanced styling\n    const printWindow = window.open('', '_blank');\n    if (!printWindow) {\n      console.warn('Pop-up blocker prevented PDF export.');\n      return;\n    }\n\n    const colWidths = this.computeRelativeColumnWidths(headers, rows);\n    const tableHtml = this.buildPdfTableHtml(headers, rows, columns, colWidths, opts);\n\n    const html = `<!DOCTYPE html>\n<html>\n<head>\n  <title>${opts.title}</title>\n  <style>\n    @page {\n      size: ${opts.pageSize} ${opts.orientation};\n      margin: ${opts.margin}px;\n    }\n    * { box-sizing: border-box; }\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n      padding: 0;\n      margin: 0;\n      color: #0f172a;\n      font-size: ${opts.fontSize}pt;\n      -webkit-print-color-adjust: exact;\n      print-color-adjust: exact;\n    }\n    .pdf-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-end;\n      border-bottom: 2px solid #1e293b;\n      padding-bottom: 8px;\n      margin-bottom: 16px;\n    }\n    .pdf-title { font-size: 16pt; font-weight: 800; color: #0f172a; }\n    .pdf-meta { font-size: 8pt; color: #64748b; text-align: right; }\n    table { width: 100%; border-collapse: collapse; table-layout: fixed; }\n    th {\n      background-color: #1e293b !important;\n      color: #ffffff !important;\n      font-weight: 700;\n      font-size: ${opts.headerFontSize}pt;\n      padding: 8px 6px;\n      border: 1px solid #334155;\n      text-align: left;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    td {\n      padding: 6px;\n      border: 1px solid #e2e8f0;\n      color: #334155;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    tr:nth-child(even) td { background-color: #f8fafc !important; }\n    .text-right { text-align: right; }\n    .text-center { text-align: center; }\n    .group-row td {\n      background-color: #f1f5f9 !important;\n      font-weight: 700;\n      color: #1e293b;\n      padding: 8px 6px;\n      border: 1px solid #cbd5e1;\n    }\n    .pdf-footer {\n      position: fixed;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      text-align: center;\n      font-size: 7pt;\n      color: #94a3b8;\n      padding: 4px 0;\n    }\n    @media screen {\n      body { padding: 24px; }\n      .no-print { display: block; }\n    }\n    @media print {\n      .no-print { display: none !important; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"pdf-header\">\n    <div class=\"pdf-title\">${opts.title}</div>\n    <div class=\"pdf-meta\">\n      ${opts.showDate ? `Generated: ${new Date().toLocaleDateString()} ${new Date().toLocaleTimeString()}` : ''}\n      <br>Total Records: ${data.length}\n    </div>\n  </div>\n  ${tableHtml}\n  ${opts.showPageNumbers ? '<div class=\"pdf-footer\">Page <span class=\"page-num\"></span></div>' : ''}\n  <script>\n    window.onload = function() {\n      window.print();\n      setTimeout(function() { window.close(); }, 800);\n    };\n  </script>\n</body>\n</html>`;\n\n    printWindow.document.write(html);\n    printWindow.document.close();\n  }\n\n  // ─── Private XLSX helpers ──────────────────────────────────────────────\n\n  private buildWorkbook(sheets: XlsxSheet[], opts: Required<XlsxExportOptions>): Blob {\n    // Build XLSX using Open XML SpreadsheetML (ZIP of XML files)\n    // Simplified implementation generating valid xlsx structure\n    const zip = new XlsxZipBuilder();\n\n    // [Content_Types].xml\n    zip.addFile('[Content_Types].xml', this.buildContentTypes(sheets));\n\n    // _rels/.rels\n    zip.addFile('_rels/.rels', this.buildRootRels());\n\n    // xl/workbook.xml\n    zip.addFile('xl/workbook.xml', this.buildWorkbookXml(sheets));\n\n    // xl/_rels/workbook.xml.rels\n    zip.addFile('xl/_rels/workbook.xml.rels', this.buildWorkbookRels(sheets));\n\n    // xl/styles.xml\n    zip.addFile('xl/styles.xml', this.buildStyles());\n\n    // xl/sharedStrings.xml\n    const sharedStrings = new SharedStringTable();\n\n    // Build each sheet\n    sheets.forEach((sheet, i) => {\n      const sheetXml = this.buildSheetXml(sheet, sharedStrings, opts);\n      zip.addFile(`xl/worksheets/sheet${i + 1}.xml`, sheetXml);\n    });\n\n    zip.addFile('xl/sharedStrings.xml', sharedStrings.toXml());\n\n    return zip.generate();\n  }\n\n  private buildContentTypes(sheets: XlsxSheet[]): string {\n    let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n    xml += '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">';\n    xml += '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>';\n    xml += '<Default Extension=\"xml\" ContentType=\"application/xml\"/>';\n    xml += '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>';\n    xml += '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>';\n    xml += '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>';\n    sheets.forEach((_, i) => {\n      xml += `<Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`;\n    });\n    xml += '</Types>';\n    return xml;\n  }\n\n  private buildRootRels(): string {\n    return '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n      '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' +\n      '</Relationships>';\n  }\n\n  private buildWorkbookXml(sheets: XlsxSheet[]): string {\n    let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n    xml += '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">';\n    xml += '<sheets>';\n    sheets.forEach((sheet, i) => {\n      xml += `<sheet name=\"${this.escapeXml(sheet.name)}\" sheetId=\"${i + 1}\" r:id=\"rId${i + 1}\"/>`;\n    });\n    xml += '</sheets></workbook>';\n    return xml;\n  }\n\n  private buildWorkbookRels(sheets: XlsxSheet[]): string {\n    let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n    xml += '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">';\n    sheets.forEach((_, i) => {\n      xml += `<Relationship Id=\"rId${i + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`;\n    });\n    xml += `<Relationship Id=\"rId${sheets.length + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n    xml += `<Relationship Id=\"rId${sheets.length + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>`;\n    xml += '</Relationships>';\n    return xml;\n  }\n\n  private buildStyles(): string {\n    return '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n      '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">' +\n      '<numFmts count=\"1\"><numFmt numFmtId=\"164\" formatCode=\"#,##0.00\"/></numFmts>' +\n      '<fonts count=\"2\">' +\n        '<font><sz val=\"11\"/><color theme=\"1\"/><name val=\"Calibri\"/></font>' +\n        '<font><b/><sz val=\"11\"/><color rgb=\"FFFFFFFF\"/><name val=\"Calibri\"/></font>' +\n      '</fonts>' +\n      '<fills count=\"3\">' +\n        '<fill><patternFill patternType=\"none\"/></fill>' +\n        '<fill><patternFill patternType=\"gray125\"/></fill>' +\n        '<fill><patternFill patternType=\"solid\"><fgColor rgb=\"FF1E293B\"/></patternFill></fill>' +\n      '</fills>' +\n      '<borders count=\"2\">' +\n        '<border><left/><right/><top/><bottom/><diagonal/></border>' +\n        '<border>' +\n          '<left style=\"thin\"><color rgb=\"FFCBD5E1\"/></left>' +\n          '<right style=\"thin\"><color rgb=\"FFCBD5E1\"/></right>' +\n          '<top style=\"thin\"><color rgb=\"FFCBD5E1\"/></top>' +\n          '<bottom style=\"thin\"><color rgb=\"FFCBD5E1\"/></bottom>' +\n          '<diagonal/>' +\n        '</border>' +\n      '</borders>' +\n      '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n      '<cellXfs count=\"4\">' +\n        '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>' +\n        '<xf numFmtId=\"0\" fontId=\"1\" fillId=\"2\" borderId=\"1\" xfId=\"0\" applyFont=\"1\" applyFill=\"1\" applyBorder=\"1\" applyAlignment=\"1\"><alignment horizontal=\"left\" vertical=\"center\" wrapText=\"1\"/></xf>' +\n        '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyBorder=\"1\" applyAlignment=\"1\"><alignment vertical=\"center\"/></xf>' +\n        '<xf numFmtId=\"164\" fontId=\"0\" fillId=\"0\" borderId=\"1\" xfId=\"0\" applyNumberFormat=\"1\" applyBorder=\"1\" applyAlignment=\"1\"><alignment horizontal=\"right\" vertical=\"center\"/></xf>' +\n      '</cellXfs>' +\n      '</styleSheet>';\n  }\n\n  private buildSheetXml(sheet: XlsxSheet, sst: SharedStringTable, opts: Required<XlsxExportOptions>): string {\n    const colCount = sheet.headers.length;\n    const lastCol = this.colIndexToLetter(colCount - 1);\n    const lastRow = sheet.data.length + 1;\n\n    let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n    xml += '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">';\n\n    // Column widths\n    xml += '<cols>';\n    sheet.columnWidths.forEach((w, i) => {\n      xml += `<col min=\"${i + 1}\" max=\"${i + 1}\" width=\"${w}\" customWidth=\"1\"/>`;\n    });\n    xml += '</cols>';\n\n    // Freeze header pane\n    if (opts.freezeHeader) {\n      xml += '<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\">';\n      xml += '<pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\"/>';\n      xml += '</sheetView></sheetViews>';\n    }\n\n    xml += '<sheetData>';\n\n    // Header row\n    xml += '<row r=\"1\">';\n    sheet.headers.forEach((header, ci) => {\n      const ref = `${this.colIndexToLetter(ci)}1`;\n      const si = sst.add(header);\n      xml += `<c r=\"${ref}\" t=\"s\" s=\"1\"><v>${si}</v></c>`;\n    });\n    xml += '</row>';\n\n    // Data rows\n    sheet.data.forEach((rowValues, ri) => {\n      const rowNum = ri + 2;\n      xml += `<row r=\"${rowNum}\">`;\n      rowValues.forEach((val, ci) => {\n        const ref = `${this.colIndexToLetter(ci)}${rowNum}`;\n        const colType = sheet.columnTypes[ci] ?? 'text';\n\n        if (val === null || val === undefined || val === '') {\n          xml += `<c r=\"${ref}\" s=\"2\"/>`;\n        } else if (colType === 'number' && typeof val === 'number' && !isNaN(val)) {\n          xml += `<c r=\"${ref}\" s=\"3\"><v>${val}</v></c>`;\n        } else {\n          const si = sst.add(String(val));\n          xml += `<c r=\"${ref}\" t=\"s\" s=\"2\"><v>${si}</v></c>`;\n        }\n      });\n      xml += '</row>';\n    });\n\n    xml += '</sheetData>';\n\n    // Auto-filter\n    if (opts.autoFilter) {\n      xml += `<autoFilter ref=\"A1:${lastCol}${lastRow}\"/>`;\n    }\n\n    xml += '</worksheet>';\n    return xml;\n  }\n\n  // ─── Private PDF helpers ──────────────────────────────────────────────\n\n  private buildPdfTableHtml<T>(\n    headers: string[],\n    rows: string[][],\n    columns: GridColumnDef<T>[],\n    colWidths: number[],\n    opts: Required<PdfExportOptions>\n  ): string {\n    let html = '<table>';\n\n    // Colgroup for column widths\n    html += '<colgroup>';\n    colWidths.forEach(w => { html += `<col style=\"width:${w}%\">`; });\n    html += '</colgroup>';\n\n    // Header\n    html += '<thead><tr>';\n    headers.forEach((h, i) => {\n      const align = columns[i]?.align ?? 'left';\n      html += `<th class=\"text-${align}\">${this.escapeHtml(h)}</th>`;\n    });\n    html += '</tr></thead><tbody>';\n\n    // Data rows\n    rows.forEach(row => {\n      html += '<tr>';\n      row.forEach((val, i) => {\n        const align = columns[i]?.align ?? 'left';\n        html += `<td class=\"text-${align}\">${this.escapeHtml(val)}</td>`;\n      });\n      html += '</tr>';\n    });\n\n    html += '</tbody></table>';\n    return html;\n  }\n\n  // ─── Shared helpers ────────────────────────────────────────────────────\n\n  private rowToValues<T>(row: Record<string, unknown>, fields: string[], columns: GridColumnDef<T>[]): unknown[] {\n    return fields.map((f, i) => {\n      const val = row[f];\n      if (val === null || val === undefined) return '';\n      if (columns[i]?.columnType === 'number' && typeof val === 'number') return val;\n      if (val instanceof Date) return val.toISOString().split('T')[0];\n      if (typeof val === 'object') return JSON.stringify(val);\n      return val;\n    });\n  }\n\n  private rowToStringValues(row: Record<string, unknown>, fields: string[]): string[] {\n    return fields.map(f => {\n      const val = row[f];\n      if (val === null || val === undefined) return '';\n      if (val instanceof Date) return val.toLocaleDateString();\n      if (typeof val === 'object') return JSON.stringify(val);\n      return String(val);\n    });\n  }\n\n  private computeColumnWidths(headers: string[], rows: unknown[][]): number[] {\n    return headers.map((h, i) => {\n      let maxLen = h.length;\n      for (const row of rows) {\n        const val = String(row[i] ?? '');\n        if (val.length > maxLen) maxLen = val.length;\n      }\n      return Math.min(Math.max(maxLen + 2, 8), 60);\n    });\n  }\n\n  private computeRelativeColumnWidths(headers: string[], rows: string[][]): number[] {\n    const absolute = this.computeColumnWidths(headers, rows);\n    const total = absolute.reduce((s, w) => s + w, 0) || 1;\n    return absolute.map(w => Math.round((w / total) * 100));\n  }\n\n  private colIndexToLetter(index: number): string {\n    let result = '';\n    let n = index;\n    while (n >= 0) {\n      result = String.fromCharCode(65 + (n % 26)) + result;\n      n = Math.floor(n / 26) - 1;\n    }\n    return result;\n  }\n\n  private sanitizeSheetName(name: string): string {\n    return name.replace(/[\\\\/*?:\\[\\]]/g, '_').substring(0, 31) || 'Sheet';\n  }\n\n  private escapeXml(str: string): string {\n    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n  }\n\n  private escapeHtml(str: string): string {\n    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n  }\n\n  private downloadBlob(blob: Blob, filename: string, _mimeType: string): void {\n    if (typeof document === 'undefined') return;\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename;\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    URL.revokeObjectURL(url);\n  }\n}\n\n// ─── XLSX ZIP Builder (minimal ZIP implementation) ─────────────────────────\n\n/**\n * Minimal ZIP file builder for generating XLSX workbooks.\n * Implements the ZIP Local File Header + Central Directory format\n * without compression (STORE method) for simplicity and zero dependencies.\n */\nclass XlsxZipBuilder {\n  private files: { name: string; content: Uint8Array; }[] = [];\n\n  addFile(name: string, content: string): void {\n    this.files.push({ name, content: new TextEncoder().encode(content) });\n  }\n\n  generate(): Blob {\n    const parts: Uint8Array[] = [];\n    const centralDir: Uint8Array[] = [];\n    let offset = 0;\n\n    for (const file of this.files) {\n      const nameBytes = new TextEncoder().encode(file.name);\n      const crc = this.crc32(file.content);\n\n      // Local file header\n      const localHeader = new Uint8Array(30 + nameBytes.length);\n      const lhView = new DataView(localHeader.buffer);\n      lhView.setUint32(0, 0x04034b50, true); // signature\n      lhView.setUint16(4, 20, true);          // version needed\n      lhView.setUint16(6, 0, true);           // flags\n      lhView.setUint16(8, 0, true);           // compression (STORE)\n      lhView.setUint16(10, 0, true);          // mod time\n      lhView.setUint16(12, 0, true);          // mod date\n      lhView.setUint32(14, crc, true);        // crc32\n      lhView.setUint32(18, file.content.length, true); // compressed size\n      lhView.setUint32(22, file.content.length, true); // uncompressed size\n      lhView.setUint16(26, nameBytes.length, true);    // name length\n      lhView.setUint16(28, 0, true);                   // extra length\n      localHeader.set(nameBytes, 30);\n\n      parts.push(localHeader);\n      parts.push(file.content);\n\n      // Central directory entry\n      const cdEntry = new Uint8Array(46 + nameBytes.length);\n      const cdView = new DataView(cdEntry.buffer);\n      cdView.setUint32(0, 0x02014b50, true);  // signature\n      cdView.setUint16(4, 20, true);           // version made by\n      cdView.setUint16(6, 20, true);           // version needed\n      cdView.setUint16(8, 0, true);            // flags\n      cdView.setUint16(10, 0, true);           // compression\n      cdView.setUint16(12, 0, true);           // mod time\n      cdView.setUint16(14, 0, true);           // mod date\n      cdView.setUint32(16, crc, true);         // crc32\n      cdView.setUint32(20, file.content.length, true); // compressed size\n      cdView.setUint32(24, file.content.length, true); // uncompressed size\n      cdView.setUint16(28, nameBytes.length, true);    // name length\n      cdView.setUint16(30, 0, true);           // extra length\n      cdView.setUint16(32, 0, true);           // comment length\n      cdView.setUint16(34, 0, true);           // disk number start\n      cdView.setUint16(36, 0, true);           // internal attrs\n      cdView.setUint32(38, 0, true);           // external attrs\n      cdView.setUint32(42, offset, true);      // local header offset\n      cdEntry.set(nameBytes, 46);\n      centralDir.push(cdEntry);\n\n      offset += localHeader.length + file.content.length;\n    }\n\n    // Central directory\n    const cdOffset = offset;\n    let cdSize = 0;\n    for (const cd of centralDir) {\n      parts.push(cd);\n      cdSize += cd.length;\n    }\n\n    // End of central directory\n    const eocd = new Uint8Array(22);\n    const eocdView = new DataView(eocd.buffer);\n    eocdView.setUint32(0, 0x06054b50, true); // signature\n    eocdView.setUint16(4, 0, true);          // disk number\n    eocdView.setUint16(6, 0, true);          // disk with CD\n    eocdView.setUint16(8, this.files.length, true);  // entries on disk\n    eocdView.setUint16(10, this.files.length, true); // total entries\n    eocdView.setUint32(12, cdSize, true);    // CD size\n    eocdView.setUint32(16, cdOffset, true);  // CD offset\n    eocdView.setUint16(20, 0, true);         // comment length\n    parts.push(eocd);\n\n    return new Blob(parts, { type: 'application/zip' });\n  }\n\n  /** CRC-32 computation (IEEE 802.3 polynomial) */\n  private crc32(data: Uint8Array): number {\n    let crc = 0xFFFFFFFF;\n    for (let i = 0; i < data.length; i++) {\n      crc ^= data[i];\n      for (let j = 0; j < 8; j++) {\n        crc = (crc >>> 1) ^ (crc & 1 ? 0xEDB88320 : 0);\n      }\n    }\n    return (crc ^ 0xFFFFFFFF) >>> 0;\n  }\n}\n\n/**\n * Shared String Table for XLSX — deduplicates strings across sheets.\n */\nclass SharedStringTable {\n  private strings: string[] = [];\n  private indexMap = new Map<string, number>();\n\n  add(str: string): number {\n    const existing = this.indexMap.get(str);\n    if (existing !== undefined) return existing;\n    const index = this.strings.length;\n    this.strings.push(str);\n    this.indexMap.set(str, index);\n    return index;\n  }\n\n  toXml(): string {\n    let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>';\n    xml += `<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${this.strings.length}\" uniqueCount=\"${this.strings.length}\">`;\n    for (const s of this.strings) {\n      xml += `<si><t>${this.escapeXml(s)}</t></si>`;\n    }\n    xml += '</sst>';\n    return xml;\n  }\n\n  private escapeXml(str: string): string {\n    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n  }\n}\n\n// ─── Export option interfaces ──────────────────────────────────────────────\n\nexport interface XlsxExportOptions {\n  sheetName?: string;\n  freezeHeader?: boolean;\n  autoFilter?: boolean;\n  groupBy?: GridGroupState | null;\n  includeFooter?: boolean;\n  title?: string;\n  dateFormat?: string;\n  numberFormat?: string;\n}\n\nexport interface PdfExportOptions {\n  title?: string;\n  orientation?: 'portrait' | 'landscape';\n  pageSize?: 'A4' | 'A3' | 'Letter' | 'Legal';\n  fontSize?: number;\n  headerFontSize?: number;\n  margin?: number;\n  groupBy?: GridGroupState | null;\n  showPageNumbers?: boolean;\n  showDate?: boolean;\n}\n\nexport interface XlsxSheet {\n  name: string;\n  headers: string[];\n  data: unknown[][];\n  columnWidths: number[];\n  columnTypes: string[];\n}\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GridStatusBarAggregates } from '../../models';\n\n/**\n * Enterprise Status Bar component for the DataGrid.\n * Displays live aggregation metrics (Count, Sum, Average, Min, Max)\n * computed from the currently selected cell range.\n *\n * @selector ngx-grid-status-bar\n * @usage\n * ```html\n * <ngx-grid-status-bar [aggregates]=\"selectionAggregates()\" [visible]=\"showStatusBar()\" />\n * ```\n */\n@Component({\n  selector: 'ngx-grid-status-bar',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    @if (visible() && hasSelection()) {\n      <div class=\"grid-status-bar\">\n        <div class=\"status-section status-info\">\n          <span class=\"status-icon\">📊</span>\n          <span class=\"status-label\">Selection</span>\n        </div>\n\n        <div class=\"status-metrics\">\n          <div class=\"metric\">\n            <span class=\"metric-label\">Count</span>\n            <span class=\"metric-value\">{{ aggregates().count }}</span>\n          </div>\n\n          @if (aggregates().sum !== null) {\n            <div class=\"metric-divider\"></div>\n            <div class=\"metric\">\n              <span class=\"metric-label\">Sum</span>\n              <span class=\"metric-value metric-value-primary\">{{ formatNumber(aggregates().sum!) }}</span>\n            </div>\n          }\n\n          @if (aggregates().average !== null) {\n            <div class=\"metric-divider\"></div>\n            <div class=\"metric\">\n              <span class=\"metric-label\">Average</span>\n              <span class=\"metric-value\">{{ formatNumber(aggregates().average!) }}</span>\n            </div>\n          }\n\n          @if (aggregates().min !== null) {\n            <div class=\"metric-divider\"></div>\n            <div class=\"metric\">\n              <span class=\"metric-label\">Min</span>\n              <span class=\"metric-value metric-value-success\">{{ formatNumber(aggregates().min!) }}</span>\n            </div>\n          }\n\n          @if (aggregates().max !== null) {\n            <div class=\"metric-divider\"></div>\n            <div class=\"metric\">\n              <span class=\"metric-label\">Max</span>\n              <span class=\"metric-value metric-value-warning\">{{ formatNumber(aggregates().max!) }}</span>\n            </div>\n          }\n        </div>\n\n        <div class=\"status-section status-badge\">\n          <span class=\"badge\">{{ aggregates().count }} cell{{ aggregates().count !== 1 ? 's' : '' }} selected</span>\n        </div>\n      </div>\n    }\n  `,\n  styles: [`\n    :host { display: block; }\n\n    .grid-status-bar {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 8px 16px;\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border-top: 1px solid var(--ngx-grid-border, #e2e8f0);\n      font-family: var(--ngx-font-family, inherit);\n      font-size: 12px;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      min-height: 38px;\n      gap: 16px;\n      transition: all 0.2s ease;\n    }\n\n    .status-section {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      flex-shrink: 0;\n    }\n\n    .status-icon {\n      font-size: 13px;\n    }\n\n    .status-label {\n      font-weight: 700;\n      font-size: 10px;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      color: var(--ngx-grid-text-secondary, #64748b);\n    }\n\n    .status-metrics {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      flex: 1;\n      justify-content: center;\n      flex-wrap: wrap;\n    }\n\n    .metric {\n      display: flex;\n      align-items: center;\n      gap: 4px;\n    }\n\n    .metric-label {\n      font-size: 10px;\n      font-weight: 600;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n    }\n\n    .metric-value {\n      font-size: 13px;\n      font-weight: 700;\n      color: var(--ngx-grid-text, #0f172a);\n      font-variant-numeric: tabular-nums;\n    }\n\n    .metric-value-primary {\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n\n    .metric-value-success {\n      color: #059669;\n    }\n\n    .metric-value-warning {\n      color: #d97706;\n    }\n\n    .metric-divider {\n      width: 1px;\n      height: 18px;\n      background: var(--ngx-grid-border, #e2e8f0);\n    }\n\n    .badge {\n      display: inline-flex;\n      align-items: center;\n      padding: 2px 8px;\n      font-size: 10px;\n      font-weight: 600;\n      border-radius: 10px;\n      background: rgba(79, 70, 229, 0.08);\n      color: var(--ngx-input-focus, #4f46e5);\n      white-space: nowrap;\n    }\n  `]\n})\nexport class GridStatusBarComponent {\n  /** Aggregation metrics computed from selected cells */\n  aggregates = input<GridStatusBarAggregates>({\n    count: 0, sum: null, average: null, min: null, max: null\n  });\n\n  /** Whether the status bar should be visible */\n  visible = input<boolean>(true);\n\n  /** Whether there is an active selection to display */\n  hasSelection = computed(() => this.aggregates().count > 0);\n\n  /** Format a number for display with locale-aware separators */\n  formatNumber(value: number): string {\n    if (Number.isInteger(value)) {\n      return value.toLocaleString();\n    }\n    return value.toLocaleString(undefined, {\n      minimumFractionDigits: 0,\n      maximumFractionDigits: 2,\n    });\n  }\n}\n","import { Component, ChangeDetectionStrategy, input, output, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FilterExpression, FilterCondition, GridColumnDef } from '../../models';\n\n/**\n * Enterprise Filter Builder component for the DataGrid.\n * Provides a visual AND/OR condition tree builder UI for constructing\n * complex filter expressions with nested groups.\n *\n * @selector ngx-grid-filter-builder\n * @usage\n * ```html\n * <ngx-grid-filter-builder\n *   [columns]=\"filterableColumns()\"\n *   [expression]=\"currentFilterExpression()\"\n *   (expressionChange)=\"onFilterExpressionChange($event)\"\n *   (close)=\"closeFilterBuilder()\"\n * />\n * ```\n */\n@Component({\n  selector: 'ngx-grid-filter-builder',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"filter-builder-overlay\" (click)=\"close.emit()\">\n      <div class=\"filter-builder-panel\" (click)=\"$event.stopPropagation()\">\n        <div class=\"fb-header\">\n          <div class=\"fb-title\">\n            <span class=\"fb-icon\">🔍</span>\n            <span>Advanced Filter Builder</span>\n          </div>\n          <button type=\"button\" class=\"fb-close\" (click)=\"close.emit()\">✕</button>\n        </div>\n\n        <div class=\"fb-body\">\n          <ng-container *ngTemplateOutlet=\"groupTpl; context: { group: editExpression(), path: [] }\" />\n        </div>\n\n        <div class=\"fb-footer\">\n          <button type=\"button\" class=\"fb-btn fb-btn-clear\" (click)=\"clearAll()\">Clear All</button>\n          <div class=\"fb-footer-actions\">\n            <button type=\"button\" class=\"fb-btn fb-btn-cancel\" (click)=\"close.emit()\">Cancel</button>\n            <button type=\"button\" class=\"fb-btn fb-btn-apply\" (click)=\"applyFilter()\">Apply Filter</button>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <ng-template #groupTpl let-group=\"group\" let-path=\"path\">\n      <div class=\"fb-group\">\n        <div class=\"fb-group-header\">\n          <div class=\"fb-operator-toggle\">\n            <button type=\"button\"\n              class=\"op-btn\"\n              [class.active]=\"group.operator === 'AND'\"\n              (click)=\"setGroupOperator(path, 'AND')\"\n            >AND</button>\n            <button type=\"button\"\n              class=\"op-btn\"\n              [class.active]=\"group.operator === 'OR'\"\n              (click)=\"setGroupOperator(path, 'OR')\"\n            >OR</button>\n          </div>\n          <div class=\"fb-group-actions\">\n            <button type=\"button\" class=\"fb-add-btn\" (click)=\"addCondition(path)\">+ Condition</button>\n            <button type=\"button\" class=\"fb-add-btn fb-add-group\" (click)=\"addGroup(path)\">+ Group</button>\n            @if (path.length > 0) {\n              <button type=\"button\" class=\"fb-remove-group\" (click)=\"removeItem(path)\">✕</button>\n            }\n          </div>\n        </div>\n\n        <div class=\"fb-conditions\">\n          @for (item of group.conditions; track $index) {\n            @if (isGroup(item)) {\n              <ng-container *ngTemplateOutlet=\"groupTpl; context: { group: item, path: path.concat($index) }\" />\n            } @else {\n              <div class=\"fb-condition-row\">\n                <select class=\"fb-select fb-field-select\" [value]=\"asCondition(item).field\" (change)=\"updateConditionField(path.concat($index), $any($event.target).value)\">\n                  @for (col of filterableColumnsList(); track col.field) {\n                    <option [value]=\"col.field\" [selected]=\"col.field === asCondition(item).field\">{{ col.title }}</option>\n                  }\n                </select>\n\n                <select class=\"fb-select fb-operator-select\" [value]=\"asCondition(item).type\" (change)=\"updateConditionType(path.concat($index), $any($event.target).value)\">\n                  @for (op of getOperatorsForField(asCondition(item).field); track op.value) {\n                    <option [value]=\"op.value\" [selected]=\"op.value === asCondition(item).type\">{{ op.label }}</option>\n                  }\n                </select>\n\n                @if (!isUnaryOperator(asCondition(item).type)) {\n                  <input class=\"fb-input\" [value]=\"asCondition(item).value ?? ''\" (input)=\"updateConditionValue(path.concat($index), $any($event.target).value)\" placeholder=\"Value...\">\n                  @if (asCondition(item).type === 'between') {\n                    <span class=\"fb-between-label\">and</span>\n                    <input class=\"fb-input\" [value]=\"asCondition(item).valueTo ?? ''\" (input)=\"updateConditionValueTo(path.concat($index), $any($event.target).value)\" placeholder=\"To...\">\n                  }\n                }\n\n                <button type=\"button\" class=\"fb-remove-condition\" (click)=\"removeItem(path.concat($index))\">✕</button>\n              </div>\n            }\n          }\n\n          @if (group.conditions.length === 0) {\n            <div class=\"fb-empty\">No conditions. Click \"+ Condition\" to add one.</div>\n          }\n        </div>\n      </div>\n    </ng-template>\n  `,\n  styles: [`\n    :host { display: block; }\n\n    .filter-builder-overlay {\n      position: fixed;\n      inset: 0;\n      background: rgba(15, 23, 42, 0.4);\n      backdrop-filter: blur(4px);\n      z-index: 10000;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      animation: fbFadeIn 0.2s ease;\n    }\n\n    @keyframes fbFadeIn {\n      from { opacity: 0; }\n      to { opacity: 1; }\n    }\n\n    .filter-builder-panel {\n      background: var(--ngx-grid-bg, #ffffff);\n      border-radius: 16px;\n      box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n      width: 720px;\n      max-width: 95vw;\n      max-height: 80vh;\n      display: flex;\n      flex-direction: column;\n      overflow: hidden;\n      animation: fbSlideIn 0.25s ease;\n      font-family: var(--ngx-font-family, inherit);\n    }\n\n    @keyframes fbSlideIn {\n      from { transform: scale(0.95) translateY(10px); opacity: 0; }\n      to { transform: scale(1) translateY(0); opacity: 1; }\n    }\n\n    .fb-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 16px 20px;\n      border-bottom: 1px solid var(--ngx-grid-border, #e2e8f0);\n      background: var(--ngx-grid-header-bg, #f8fafc);\n    }\n\n    .fb-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-weight: 700;\n      font-size: 15px;\n      color: var(--ngx-grid-text, #0f172a);\n    }\n\n    .fb-icon { font-size: 16px; }\n\n    .fb-close {\n      background: transparent;\n      border: none;\n      font-size: 16px;\n      cursor: pointer;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      padding: 4px 8px;\n      border-radius: 6px;\n      transition: all 0.15s;\n    }\n    .fb-close:hover { background: #f1f5f9; color: #ef4444; }\n\n    .fb-body {\n      padding: 20px;\n      overflow-y: auto;\n      flex: 1;\n    }\n\n    .fb-group {\n      border: 1.5px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: 12px;\n      padding: 12px;\n      background: rgba(248, 250, 252, 0.5);\n    }\n\n    .fb-group .fb-group {\n      margin-top: 8px;\n      border-color: #c7d2fe;\n      background: rgba(238, 242, 255, 0.3);\n    }\n\n    .fb-group-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 10px;\n    }\n\n    .fb-operator-toggle {\n      display: flex;\n      gap: 0;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      overflow: hidden;\n    }\n\n    .op-btn {\n      padding: 4px 12px;\n      font-size: 11px;\n      font-weight: 700;\n      border: none;\n      background: var(--ngx-grid-bg, #ffffff);\n      cursor: pointer;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      transition: all 0.15s;\n    }\n    .op-btn.active {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n    }\n\n    .fb-group-actions {\n      display: flex;\n      gap: 6px;\n      align-items: center;\n    }\n\n    .fb-add-btn {\n      padding: 4px 10px;\n      font-size: 11px;\n      font-weight: 600;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      background: var(--ngx-grid-bg, #ffffff);\n      border-radius: 6px;\n      cursor: pointer;\n      color: var(--ngx-grid-text, #334155);\n      transition: all 0.15s;\n    }\n    .fb-add-btn:hover {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n    .fb-add-group {\n      border-style: dashed;\n    }\n\n    .fb-remove-group, .fb-remove-condition {\n      background: transparent;\n      border: none;\n      font-size: 12px;\n      cursor: pointer;\n      color: #94a3b8;\n      padding: 2px 6px;\n      border-radius: 4px;\n      transition: all 0.15s;\n    }\n    .fb-remove-group:hover, .fb-remove-condition:hover {\n      color: #ef4444;\n      background: #fef2f2;\n    }\n\n    .fb-conditions {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n    }\n\n    .fb-condition-row {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 6px 8px;\n      background: var(--ngx-grid-bg, #ffffff);\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: 8px;\n      transition: all 0.15s;\n    }\n    .fb-condition-row:hover {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.06);\n    }\n\n    .fb-select, .fb-input {\n      padding: 5px 8px;\n      font-size: 12px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 6px;\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      font-family: inherit;\n      outline: none;\n      transition: all 0.15s;\n    }\n    .fb-select:focus, .fb-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.12);\n    }\n\n    .fb-field-select { min-width: 140px; flex: 1; }\n    .fb-operator-select { min-width: 120px; }\n    .fb-input { flex: 1; min-width: 80px; }\n\n    .fb-between-label {\n      font-size: 11px;\n      font-weight: 600;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      flex-shrink: 0;\n    }\n\n    .fb-empty {\n      padding: 16px;\n      text-align: center;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      font-size: 12px;\n      font-style: italic;\n    }\n\n    .fb-footer {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 12px 20px;\n      border-top: 1px solid var(--ngx-grid-border, #e2e8f0);\n      background: var(--ngx-grid-header-bg, #f8fafc);\n    }\n\n    .fb-footer-actions {\n      display: flex;\n      gap: 8px;\n    }\n\n    .fb-btn {\n      padding: 7px 16px;\n      font-size: 12px;\n      font-weight: 600;\n      border-radius: 8px;\n      cursor: pointer;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #334155);\n      font-family: inherit;\n      transition: all 0.2s;\n    }\n    .fb-btn:hover {\n      border-color: var(--ngx-input-border-hover, #94a3b8);\n    }\n\n    .fb-btn-clear {\n      border-color: transparent;\n      background: transparent;\n      color: #ef4444;\n    }\n    .fb-btn-clear:hover {\n      background: #fef2f2;\n    }\n\n    .fb-btn-apply {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n    }\n    .fb-btn-apply:hover {\n      background: var(--ngx-btn-primary-hover, #4338ca);\n      box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.25);\n    }\n  `]\n})\nexport class GridFilterBuilderComponent {\n  /** Available columns for filter field selection */\n  columns = input<GridColumnDef[]>([]);\n\n  /** Current filter expression to edit */\n  expression = input<FilterExpression | null>(null);\n\n  /** Emitted when the user applies the filter */\n  expressionChange = output<FilterExpression | null>();\n\n  /** Emitted when the panel is closed */\n  close = output<void>();\n\n  /** Internal editable copy of the expression */\n  editExpression = signal<FilterExpression>(this.createEmptyGroup());\n\n  /** Filterable columns for the dropdown */\n  filterableColumnsList = computed(() =>\n    this.columns().filter(c => c.filterable !== false)\n  );\n\n  constructor() {\n    // Initialize from input expression when available\n    const expr = this.expression();\n    if (expr) {\n      this.editExpression.set(this.deepClone(expr));\n    }\n  }\n\n  /** Type guard for filter groups */\n  isGroup(item: FilterCondition | FilterExpression): item is FilterExpression {\n    return 'operator' in item && 'conditions' in item;\n  }\n\n  /** Cast helper for template */\n  asCondition(item: FilterCondition | FilterExpression): FilterCondition {\n    return item as FilterCondition;\n  }\n\n  /** Check if an operator doesn't need a value input */\n  isUnaryOperator(type: string): boolean {\n    return ['isTrue', 'isFalse', 'isEmpty', 'isNotEmpty'].includes(type);\n  }\n\n  /** Get available operators based on column type */\n  getOperatorsForField(field: string): { value: string; label: string }[] {\n    const col = this.columns().find(c => c.field === field);\n    const colType = col?.columnType ?? 'text';\n\n    const common = [\n      { value: 'isEmpty', label: 'Is Empty' },\n      { value: 'isNotEmpty', label: 'Is Not Empty' },\n    ];\n\n    switch (colType) {\n      case 'number':\n        return [\n          { value: 'eq', label: 'Equals' },\n          { value: 'neq', label: 'Not Equals' },\n          { value: 'gt', label: 'Greater Than' },\n          { value: 'gte', label: 'Greater or Equal' },\n          { value: 'lt', label: 'Less Than' },\n          { value: 'lte', label: 'Less or Equal' },\n          { value: 'between', label: 'Between' },\n          ...common,\n        ];\n      case 'date':\n        return [\n          { value: 'eq', label: 'Equals' },\n          { value: 'before', label: 'Before' },\n          { value: 'after', label: 'After' },\n          { value: 'between', label: 'Between' },\n          ...common,\n        ];\n      case 'boolean':\n        return [\n          { value: 'isTrue', label: 'Is True' },\n          { value: 'isFalse', label: 'Is False' },\n        ];\n      default:\n        return [\n          { value: 'contains', label: 'Contains' },\n          { value: 'eq', label: 'Equals' },\n          { value: 'neq', label: 'Not Equals' },\n          { value: 'startsWith', label: 'Starts With' },\n          { value: 'endsWith', label: 'Ends With' },\n          ...common,\n        ];\n    }\n  }\n\n  /** Set the AND/OR operator for a group at the given path */\n  setGroupOperator(path: number[], operator: 'AND' | 'OR'): void {\n    this.editExpression.update(expr => {\n      const clone = this.deepClone(expr);\n      const group = this.getGroupAtPath(clone, path);\n      if (group) group.operator = operator;\n      return clone;\n    });\n  }\n\n  /** Add a new condition to the group at the given path */\n  addCondition(path: number[]): void {\n    this.editExpression.update(expr => {\n      const clone = this.deepClone(expr);\n      const group = this.getGroupAtPath(clone, path);\n      if (group) {\n        const firstCol = this.filterableColumnsList()[0];\n        const condition: FilterCondition = {\n          field: firstCol?.field ?? '',\n          type: 'contains',\n          value: '',\n        };\n        group.conditions.push(condition);\n      }\n      return clone;\n    });\n  }\n\n  /** Add a nested group to the group at the given path */\n  addGroup(path: number[]): void {\n    this.editExpression.update(expr => {\n      const clone = this.deepClone(expr);\n      const group = this.getGroupAtPath(clone, path);\n      if (group) {\n        group.conditions.push(this.createEmptyGroup());\n      }\n      return clone;\n    });\n  }\n\n  /** Remove an item (condition or group) at the given path */\n  removeItem(path: number[]): void {\n    if (path.length === 0) return;\n    this.editExpression.update(expr => {\n      const clone = this.deepClone(expr);\n      const parentPath = path.slice(0, -1);\n      const index = path[path.length - 1];\n      const parent = this.getGroupAtPath(clone, parentPath);\n      if (parent) {\n        parent.conditions.splice(index, 1);\n      }\n      return clone;\n    });\n  }\n\n  /** Update condition field */\n  updateConditionField(path: number[], field: string): void {\n    this.updateConditionProp(path, 'field', field);\n  }\n\n  /** Update condition operator type */\n  updateConditionType(path: number[], type: string): void {\n    this.updateConditionProp(path, 'type', type);\n  }\n\n  /** Update condition value */\n  updateConditionValue(path: number[], value: string): void {\n    this.updateConditionProp(path, 'value', value);\n  }\n\n  /** Update condition valueTo (for between) */\n  updateConditionValueTo(path: number[], value: string): void {\n    this.updateConditionProp(path, 'valueTo', value);\n  }\n\n  /** Apply the current filter expression */\n  applyFilter(): void {\n    const expr = this.editExpression();\n    if (expr.conditions.length === 0) {\n      this.expressionChange.emit(null);\n    } else {\n      this.expressionChange.emit(this.deepClone(expr));\n    }\n    this.close.emit();\n  }\n\n  /** Clear all conditions */\n  clearAll(): void {\n    this.editExpression.set(this.createEmptyGroup());\n  }\n\n  // ─── Private helpers ──────────────────────────────────────────────\n\n  private createEmptyGroup(): FilterExpression {\n    return { operator: 'AND', conditions: [] };\n  }\n\n  private getGroupAtPath(root: FilterExpression, path: number[]): FilterExpression | null {\n    let current: FilterExpression = root;\n    for (const index of path) {\n      const item = current.conditions[index];\n      if (!item || !this.isGroup(item)) return null;\n      current = item;\n    }\n    return current;\n  }\n\n  private updateConditionProp(path: number[], prop: string, value: unknown): void {\n    if (path.length === 0) return;\n    this.editExpression.update(expr => {\n      const clone = this.deepClone(expr);\n      const parentPath = path.slice(0, -1);\n      const index = path[path.length - 1];\n      const parent = this.getGroupAtPath(clone, parentPath);\n      if (parent) {\n        const condition = parent.conditions[index] as unknown as Record<string, unknown>;\n        if (condition) condition[prop] = value;\n      }\n      return clone;\n    });\n  }\n\n  private deepClone<T>(obj: T): T {\n    return JSON.parse(JSON.stringify(obj));\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  TemplateRef,\n  computed,\n  effect,\n  input,\n  output,\n  signal,\n  inject,\n  ElementRef,\n  OnInit,\n  untracked,\n  DestroyRef,\n  HostListener,\n  ContentChildren,\n  Directive,\n  Input,\n  QueryList,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NGX_CORE_I18N } from 'ngx-core-components/i18n';\nimport { GridExportService } from './grid-export.service';\nimport { GridExportXlsxService } from './services/grid-export-xlsx.service';\nimport { GridStatusBarComponent } from './components/grid-status-bar/grid-status-bar.component';\nimport { GridFilterBuilderComponent } from './components/grid-filter-builder/grid-filter-builder.component';\nimport type { TreeDataConfig, FilterExpression, GridStatusBarAggregates, GridInfiniteScrollEvent } from './models';\n\n// Re-export all model types so existing imports from this file continue to work\nexport type {\n  GridColumnDef,\n  GridSortState,\n  GridFilterState,\n  GridGroupState,\n  GridPageChangeEvent,\n  GridSortChangeEvent,\n  GridFilterChangeEvent,\n  GridGroupChangeEvent,\n  GridDataStateChangeEvent,\n  GridRowClickEvent,\n  GridRowUpdateEvent,\n  GridGroupResult,\n  GridHeaderTemplateContext,\n  GridCellTemplateContext,\n  GridRowTemplateContext,\n  GridDetailTemplateContext,\n  GridFooterTemplateContext,\n} from './models';\n\nimport type {\n  GridColumnDef,\n  GridSortState,\n  GridFilterState,\n  GridGroupState,\n  GridPageChangeEvent,\n  GridSortChangeEvent,\n  GridFilterChangeEvent,\n  GridGroupChangeEvent,\n  GridDataStateChangeEvent,\n  GridRowClickEvent,\n  GridRowUpdateEvent,\n  GridGroupResult,\n  GridHeaderTemplateContext,\n  GridCellTemplateContext,\n  GridRowTemplateContext,\n  GridDetailTemplateContext,\n  GridFooterTemplateContext,\n} from './models';\n\n@Directive({\n  selector: '[ngxGridCellTemplate]',\n  standalone: true\n})\nexport class NgxGridCellTemplateDirective {\n  @Input('ngxGridCellTemplate') columnField!: string;\n  templateRef = inject(TemplateRef);\n}\n\n@Directive({\n  selector: '[ngxGridEditCellTemplate]',\n  standalone: true\n})\nexport class NgxGridEditCellTemplateDirective {\n  @Input('ngxGridEditCellTemplate') columnField!: string;\n  templateRef = inject(TemplateRef);\n}\n\n@Directive({\n  selector: '[ngxGridHeaderTemplate]',\n  standalone: true\n})\nexport class NgxGridHeaderTemplateDirective {\n  @Input('ngxGridHeaderTemplate') columnField!: string;\n  templateRef = inject(TemplateRef);\n}\n\n@Directive({\n  selector: '[ngxGridFooterTemplate]',\n  standalone: true\n})\nexport class NgxGridFooterTemplateDirective {\n  @Input('ngxGridFooterTemplate') columnField!: string;\n  templateRef = inject(TemplateRef);\n}\n\n@Component({\n  selector: 'ngx-data-grid',\n  standalone: true,\n  imports: [\n    NgTemplateOutlet,\n    GridStatusBarComponent,\n    GridFilterBuilderComponent\n  ],\n  providers: [\n    GridExportXlsxService\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div class=\"ngx-data-grid\" [class.loading]=\"loading()\" [class.compact]=\"compact()\">\n\n      @if (showGroupingPanel()) {\n        <div\n          class=\"grid-grouping-panel\"\n          (dragover)=\"onGroupingPanelDragOver($event)\"\n          (dragleave)=\"onGroupingPanelDragLeave($event)\"\n          (drop)=\"onGroupingPanelDrop($event)\"\n          [class.drag-over]=\"isGroupingPanelDragOver()\"\n        >\n          <div class=\"grouping-panel-label\">\n            @if (internalGroupBy(); as gb) {\n              <span>Grouped by:</span>\n              <span class=\"group-chip\">\n                {{ getColumnTitle(gb.field) }}\n                <button class=\"remove-group-btn\" (click)=\"clearGrouping()\">×</button>\n              </span>\n            } @else {\n              <span>Drag a column header here to group</span>\n            }\n          </div>\n        </div>\n      }\n\n      <div class=\"grid-toolbar\">\n        <span class=\"grid-toolbar-title\">Data Grid</span>\n        <div class=\"grid-toolbar-actions\">\n          @if (showGlobalSearch()) {\n            <div class=\"grid-search-wrap\">\n              <input\n                class=\"grid-search-input\"\n                type=\"text\"\n                [placeholder]=\"globalSearchPlaceholder()\"\n                [value]=\"searchText()\"\n                (input)=\"searchText.set($any($event.target).value)\"\n              />\n              @if (searchText()) {\n                <button class=\"grid-search-clear\" (click)=\"searchText.set('')\" title=\"Clear search\">×</button>\n              }\n            </div>\n          }\n          @if (activeFilters().length > 0) {\n            <button class=\"grid-action-btn clear-filters-btn\" (click)=\"clearAllFilters()\" title=\"Clear all active column filters\">Clear Filters</button>\n          }\n          @if (showColumnChooser()) {\n            <button class=\"grid-action-btn\" (click)=\"openColumnChooser($event)\" title=\"Choose columns\">Columns</button>\n          }\n          @if (showFilterBuilder()) {\n            <button class=\"grid-action-btn\" (click)=\"isFilterBuilderOpen.set(true)\" title=\"Advanced Filter Builder\">🔍 Filter</button>\n          }\n          <button class=\"grid-action-btn\" (click)=\"exportToJson()\" title=\"Export JSON\">JSON</button>\n          <button class=\"grid-action-btn\" (click)=\"exportToCsv()\" title=\"Export CSV\">CSV</button>\n          <button class=\"grid-action-btn\" (click)=\"exportToXlsx()\" title=\"Export native XLSX workbook\">XLSX</button>\n          <button class=\"grid-action-btn\" (click)=\"exportToExcel()\" title=\"Export HTML Excel\">Excel</button>\n          <button class=\"grid-action-btn\" (click)=\"exportToPdf()\" title=\"Export PDF\">PDF</button>\n        </div>\n      </div>\n\n      <div class=\"grid-table-wrap\" #viewportEl (scroll)=\"onViewportScroll($event)\">\n        <table class=\"grid-table\" [class.striped]=\"striped()\">\n          <colgroup>\n            @if (rowReorderable()) {\n              <col style=\"width: 44px\" />\n            }\n            @if (showDetailToggle()) {\n              <col style=\"width: 44px\" />\n            }\n            @if (selectable()) {\n              <col style=\"width: 44px\" />\n            }\n            @for (col of orderedColumns(); track col.field) {\n              <col [style.width.px]=\"getColumnWidth(col)\" />\n            }\n            @if (editable()) {\n              <col style=\"width: 120px\" />\n            }\n          </colgroup>\n          <thead>\n            <ng-template #headerCellContent let-col=\"col\">\n              <div class=\"th-content-wrapper\">\n                @if (resolveHeaderTemplate(col); as activeHeaderTemplate) {\n                  <ng-container *ngTemplateOutlet=\"activeHeaderTemplate; context: {\n                    $implicit: col,\n                    column: col,\n                    sort: sortState(),\n                    filters: activeFilters(),\n                    isServerMode: isAnyServerMode()\n                  }\" />\n                } @else {\n                  <span class=\"th-text\">{{ col.title }}</span>\n                  @if (col.sortable) {\n                    @if (getSortDirection(col); as dir) {\n                      <span class=\"sort-icon active\">\n                        {{ dir === 'asc' ? '↑' : '↓' }}\n                        @if (multiSort() && sortStates().length > 1) {\n                          <sub class=\"sort-order-badge\">{{ getSortIndex(col) }}</sub>\n                        }\n                      </span>\n                    } @else {\n                      <span class=\"sort-icon\">↕</span>\n                    }\n                  }\n                }\n                @if (col.filterable) {\n                  <button class=\"grid-filter-btn\" [class.active]=\"filterStates().has(col.field)\" (click)=\"openFilterPopover($event, col.field); $event.stopPropagation()\" title=\"Filter column\">\n                    <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                      <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon>\n                    </svg>\n                  </button>\n                }\n              </div>\n              <div class=\"grid-resize-handle\" (mousedown)=\"onResizeStart($event, col)\" (dblclick)=\"onResizeDoubleClick($event, col)\" (click)=\"$event.stopPropagation()\"></div>\n            </ng-template>\n\n            <tr class=\"grid-header-row\">\n              @if (rowReorderable()) {\n                <th class=\"grid-th grid-th-reorder pinned-left\" [class.pinned-left-last]=\"isRowReorderableLastPinned()\" [attr.rowspan]=\"hasColumnCategories() ? 2 : 1\" style=\"width:44px; left:0px\"></th>\n              }\n              @if (showDetailToggle()) {\n                <th class=\"grid-th grid-th-toggle pinned-left\" [class.pinned-left-last]=\"isDetailToggleLastPinned()\" [attr.rowspan]=\"hasColumnCategories() ? 2 : 1\" [style.left.px]=\"rowReorderable() ? 44 : 0\" style=\"width:44px\"></th>\n              }\n              @if (selectable()) {\n                <th class=\"grid-th grid-th-check pinned-left\" [class.pinned-left-last]=\"isSelectableLastPinned()\" [attr.rowspan]=\"hasColumnCategories() ? 2 : 1\" [style.left.px]=\"(rowReorderable() ? 44 : 0) + (showDetailToggle() ? 44 : 0)\" style=\"width:44px\"><input type=\"checkbox\" [checked]=\"allSelected()\" [indeterminate]=\"someSelected() && !allSelected()\" (change)=\"toggleAll()\" /></th>\n              }\n              @for (cell of headerRows().row1; track cell.field) {\n                @if (cell.isCategory) {\n                  <th\n                    class=\"grid-th grid-category-th\"\n                    [class.pinned-left]=\"cell.pinned === 'left'\"\n                    [class.pinned-left-last]=\"cell.isPinnedLast\"\n                    [class.pinned-right]=\"cell.pinned === 'right'\"\n                    [class.pinned-right-first]=\"cell.isPinnedFirst\"\n                    [style.left.px]=\"cell.pinned === 'left' ? cell.leftOffset : null\"\n                    [style.right.px]=\"cell.pinned === 'right' ? cell.rightOffset : null\"\n                    [attr.colspan]=\"cell.colSpan\"\n                    [attr.rowspan]=\"cell.rowSpan\"\n                  >\n                    <span class=\"category-title\">{{ cell.title }}</span>\n                  </th>\n                } @else {\n                  <th\n                    class=\"grid-th\"\n                    [class.pinned-left]=\"cell.column.pinned === 'left'\"\n                    [class.pinned-left-last]=\"cell.isPinnedLast\"\n                    [class.pinned-right]=\"cell.column.pinned === 'right'\"\n                    [class.pinned-right-first]=\"cell.isPinnedFirst\"\n                    [style.left.px]=\"cell.column.pinned === 'left' ? cell.leftOffset : null\"\n                    [style.right.px]=\"cell.column.pinned === 'right' ? cell.rightOffset : null\"\n                    [style.width.px]=\"getColumnWidth(cell.column)\"\n                    [class.sortable]=\"cell.column.sortable\"\n                    [class.sort-asc]=\"getSortDirection(cell.column) === 'asc'\"\n                    [class.sort-desc]=\"getSortDirection(cell.column) === 'desc'\"\n                    [class.dragging]=\"draggingField() === cell.column.field\"\n                    [class.drag-over]=\"dragOverField() === cell.column.field\"\n                    [attr.draggable]=\"reorderable() || cell.column.groupable ? true : null\"\n                    (dragstart)=\"onDragStart($event, cell.column)\"\n                    (dragover)=\"onDragOver($event, cell.column)\"\n                    (drop)=\"onDrop($event, cell.column)\"\n                    (dragend)=\"onDragEnd()\"\n                    (click)=\"cell.column.sortable ? onSort(cell.column, $event) : null\"\n                    [attr.colspan]=\"cell.colSpan\"\n                    [attr.rowspan]=\"cell.rowSpan\"\n                  >\n                    <ng-container *ngTemplateOutlet=\"headerCellContent; context: { col: cell.column }\" />\n                  </th>\n                }\n              }\n              @if (editable()) {\n                <th\n                  class=\"grid-th\"\n                  [class.pinned-right]=\"firstPinnedRightColumnField() !== null\"\n                  [class.pinned-right-first]=\"firstPinnedRightColumnField() === null\"\n                  [style.right.px]=\"firstPinnedRightColumnField() !== null ? 0 : null\"\n                  [attr.rowspan]=\"hasColumnCategories() ? 2 : 1\"\n                  style=\"width:120px\"\n                >Actions</th>\n              }\n            </tr>\n            @if (hasColumnCategories()) {\n              <tr class=\"grid-header-row sub-header-row\">\n                @for (cell of headerRows().row2; track cell.field) {\n                  <th\n                    class=\"grid-th\"\n                    [class.pinned-left]=\"cell.column.pinned === 'left'\"\n                    [class.pinned-left-last]=\"cell.isPinnedLast\"\n                    [class.pinned-right]=\"cell.column.pinned === 'right'\"\n                    [class.pinned-right-first]=\"cell.isPinnedFirst\"\n                    [style.left.px]=\"cell.column.pinned === 'left' ? cell.leftOffset : null\"\n                    [style.right.px]=\"cell.column.pinned === 'right' ? cell.rightOffset : null\"\n                    [style.width.px]=\"getColumnWidth(cell.column)\"\n                    [class.sortable]=\"cell.column.sortable\"\n                    [class.sort-asc]=\"getSortDirection(cell.column) === 'asc'\"\n                    [class.sort-desc]=\"getSortDirection(cell.column) === 'desc'\"\n                    [class.dragging]=\"draggingField() === cell.column.field\"\n                    [class.drag-over]=\"dragOverField() === cell.column.field\"\n                    [attr.draggable]=\"reorderable() || cell.column.groupable ? true : null\"\n                    (dragstart)=\"onDragStart($event, cell.column)\"\n                    (dragover)=\"onDragOver($event, cell.column)\"\n                    (drop)=\"onDrop($event, cell.column)\"\n                    (dragend)=\"onDragEnd()\"\n                    (click)=\"cell.column.sortable ? onSort(cell.column, $event) : null\"\n                    [attr.colspan]=\"cell.colSpan\"\n                    [attr.rowspan]=\"cell.rowSpan\"\n                  >\n                    <ng-container *ngTemplateOutlet=\"headerCellContent; context: { col: cell.column }\" />\n                  </th>\n                }\n              </tr>\n            }\n          </thead>\n          <tbody>\n            @if (loading()) {\n              <tr>\n                <td [attr.colspan]=\"renderColumnCount()\" class=\"grid-loading-cell\">\n                  <div class=\"grid-spinner\"></div>\n                </td>\n              </tr>\n            } @else if (flatRenderedRows().length === 0 && groupedRows().length === 0) {\n              <tr>\n                <td [attr.colspan]=\"renderColumnCount()\" class=\"grid-empty-cell\">{{ i18n.grid.noData }}</td>\n              </tr>\n            } @else if (groupedRows().length > 0) {\n              @for (group of groupedRows(); track group.key) {\n                <tr class=\"grid-group-row\" (click)=\"toggleGroup(group.key)\">\n                  @if (groupAggregations()) {\n                    @if (rowReorderable()) {\n                      <td class=\"grid-td grid-td-reorder pinned-left\" [class.pinned-left-last]=\"isRowReorderableLastPinned()\" style=\"left:0px; width:44px\"></td>\n                    }\n                    @if (showDetailToggle()) {\n                      <td class=\"grid-td grid-td-toggle pinned-left\" [class.pinned-left-last]=\"isDetailToggleLastPinned()\" [style.left.px]=\"rowReorderable() ? 44 : 0\" style=\"width:44px\"></td>\n                    }\n                    @if (selectable()) {\n                      <td class=\"grid-td grid-td-check pinned-left\" [class.pinned-left-last]=\"isSelectableLastPinned()\" [style.left.px]=\"(rowReorderable() ? 44 : 0) + (showDetailToggle() ? 44 : 0)\" style=\"width:44px\"><input type=\"checkbox\" [checked]=\"isGroupAllSelected(group)\" (change)=\"toggleGroupSelection(group, $event)\" (click)=\"$event.stopPropagation()\" /></td>\n                    }\n                    @for (col of orderedColumns(); track col.field; let first = $first) {\n                      <td\n                        class=\"grid-td\"\n                        [class.pinned-left]=\"col.pinned === 'left'\"\n                        [class.pinned-left-last]=\"col.pinned === 'left' && lastPinnedColumnField() === col.field\"\n                        [class.pinned-right]=\"col.pinned === 'right'\"\n                        [class.pinned-right-first]=\"col.pinned === 'right' && firstPinnedRightColumnField() === col.field\"\n                        [style.left.px]=\"col.pinned === 'left' ? columnOffsets()[col.field] : null\"\n                        [style.right.px]=\"col.pinned === 'right' ? columnRightOffsets()[col.field] : null\"\n                        [style.text-align]=\"col.align ?? 'left'\"\n                        [style.width.px]=\"getColumnWidth(col)\"\n                      >\n                        @if (first) {\n                          <div style=\"display: flex; align-items: center; gap: 4px;\">\n                            <button class=\"group-toggle\" type=\"button\" (click)=\"toggleGroup(group.key); $event.stopPropagation()\" style=\"background: transparent; border: none; cursor: pointer; padding: 0 4px; font-weight: bold; color: inherit; outline: none;\">\n                              {{ isGroupCollapsed(group.key) ? '▸' : '▾' }}\n                            </button>\n                            <strong>{{ col.category ? '' : group.field + ': ' }}</strong>{{ group.value }} <span class=\"group-count\">({{ group.count }})</span>\n                          </div>\n                        } @else if (col.aggregation) {\n                          <span class=\"agg-label\">{{ col.aggregation }}: </span>\n                          <strong class=\"agg-value\">{{ getGroupAggregationValue(group, col) }}</strong>\n                        }\n                      </td>\n                    }\n                    @if (editable()) {\n                      <td\n                        [class.pinned-right]=\"firstPinnedRightColumnField() !== null\"\n                        [class.pinned-right-first]=\"firstPinnedRightColumnField() === null\"\n                        [style.right.px]=\"firstPinnedRightColumnField() !== null ? 0 : null\"\n                      ></td>\n                    }\n                  } @else {\n                    <td [attr.colspan]=\"renderColumnCount()\">\n                      <button class=\"group-toggle\" type=\"button\" (click)=\"toggleGroup(group.key); $event.stopPropagation()\">\n                        {{ isGroupCollapsed(group.key) ? '▸' : '▾' }}\n                      </button>\n                      <strong>{{ group.field }}</strong>: {{ group.value }}\n                      <span class=\"group-count\">({{ group.count }})</span>\n                    </td>\n                  }\n                </tr>\n\n                @if (!isGroupCollapsed(group.key)) {\n                  @for (row of group.items; track getKey(row, $index); let i = $index) {\n                    <tr\n                      [class]=\"'grid-row ' + getRowCustomClass(row)\"\n                      [class.selected]=\"isRowSelected(row)\"\n                      [class.dragging-row]=\"draggingRowIndex() === i\"\n                      [class.drag-over-row]=\"dragOverRowIndex() === i\"\n                      (dragover)=\"onRowDragOver($event, i)\"\n                      (drop)=\"onRowDrop($event, i)\"\n                      (dragend)=\"onRowDragEnd()\"\n                      (click)=\"onRowClick(row, i)\"\n                      (dblclick)=\"editable() ? beginEdit(row, i) : null\"\n                    >\n                      @if (rowReorderable()) {\n                        <td class=\"grid-td grid-td-reorder pinned-left\" [class.pinned-left-last]=\"isRowReorderableLastPinned()\" style=\"left:0px; text-align:center; width:44px\">\n                          <span class=\"row-drag-handle\" draggable=\"true\" (dragstart)=\"onRowDragStart($event, i)\" (dragend)=\"onRowDragEnd()\" title=\"Drag row to reorder\">\n                            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"display: block;\">\n                              <circle cx=\"9\" cy=\"5\" r=\"1.5\"></circle>\n                              <circle cx=\"9\" cy=\"12\" r=\"1.5\"></circle>\n                              <circle cx=\"9\" cy=\"19\" r=\"1.5\"></circle>\n                              <circle cx=\"15\" cy=\"5\" r=\"1.5\"></circle>\n                              <circle cx=\"15\" cy=\"12\" r=\"1.5\"></circle>\n                              <circle cx=\"15\" cy=\"19\" r=\"1.5\"></circle>\n                            </svg>\n                          </span>\n                        </td>\n                      }\n\n                      @if (showDetailToggle()) {\n                        <td class=\"grid-td grid-td-toggle pinned-left\" [class.pinned-left-last]=\"isDetailToggleLastPinned()\" [style.left.px]=\"rowReorderable() ? 44 : 0\">\n                          <button class=\"toggle-btn\" [class.expanded]=\"isExpanded(row)\" type=\"button\" (click)=\"toggleDetail(row); $event.stopPropagation()\" title=\"Toggle Detail\">\n                            <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"chevron-icon\">\n                              <polyline points=\"9 18 15 12 9 6\"></polyline>\n                            </svg>\n                          </button>\n                        </td>\n                      }\n\n                      @if (selectable()) {\n                        <td class=\"grid-td grid-td-check pinned-left\" [class.pinned-left-last]=\"isSelectableLastPinned()\" [style.left.px]=\"(rowReorderable() ? 44 : 0) + (showDetailToggle() ? 44 : 0)\"><input type=\"checkbox\" [checked]=\"isRowSelected(row)\" (change)=\"toggleRow(row)\" (click)=\"$event.stopPropagation()\" /></td>\n                      }\n\n                      @if (rowTemplate()) {\n                        <td class=\"grid-td\" [attr.colspan]=\"orderedColumns().length + (editable() ? 1 : 0)\">\n                          <ng-container *ngTemplateOutlet=\"rowTemplate(); context: {\n                            $implicit: row,\n                            row: row,\n                            index: i,\n                            editing: isEditing(row),\n                            expanded: isExpanded(row)\n                          }\" />\n                        </td>\n                      } @else {\n                        @for (col of orderedColumns(); track col.field) {\n                          @if (getCellRowSpan(row, col.field, i, group.items) > 0) {\n                            <td\n                              class=\"grid-td\"\n                              [attr.rowspan]=\"getCellRowSpan(row, col.field, i, group.items)\"\n                              [class.pinned-left]=\"col.pinned === 'left'\"\n                              [class.pinned-left-last]=\"col.pinned === 'left' && lastPinnedColumnField() === col.field\"\n                              [class.pinned-right]=\"col.pinned === 'right'\"\n                              [class.pinned-right-first]=\"col.pinned === 'right' && firstPinnedRightColumnField() === col.field\"\n                              [class.cell-focused]=\"focusedCell()?.row === row && focusedCell()?.colField === col.field\"\n                              [class.cell-focused-editing]=\"focusedCell()?.row === row && focusedCell()?.colField === col.field && focusedCellEditActive()\"\n                              [style.left.px]=\"col.pinned === 'left' ? columnOffsets()[col.field] : null\"\n                              [style.right.px]=\"col.pinned === 'right' ? columnRightOffsets()[col.field] : null\"\n                              [style.text-align]=\"col.align ?? 'left'\"\n                              [style.width.px]=\"getColumnWidth(col)\"\n                              [class.cell-selected]=\"isCellSelected(row, col.field)\"\n                              (mousedown)=\"onCellMouseDown($event, row, col.field)\"\n                              (mouseenter)=\"onCellMouseEnter(row, col.field)\"\n                              (contextmenu)=\"onCellContextMenu($event, row, col.field)\"\n                              (click)=\"onCellClick(row, col.field)\"\n                            >\n                              @if (isEditing(row) && editable() && col.editable) {\n                                @if (resolveEditCellTemplate(col); as activeEditTemplate) {\n                                  <ng-container *ngTemplateOutlet=\"activeEditTemplate; context: {\n                                    $implicit: getDraftValue(row, col.field),\n                                    value: getCellValue(row, col.field),\n                                    row: row,\n                                    column: col,\n                                    index: i,\n                                    editing: true,\n                                    draftValue: getDraftValue(row, col.field),\n                                    updateDraft: getUpdateDraftCallback(col.field)\n                                  }\" />\n                                } @else {\n                                  <input\n                                    class=\"grid-edit-input\"\n                                    [value]=\"toStringSafe(getDraftValue(row, col.field))\"\n                                    (input)=\"updateDraft(col.field, $any($event.target).value)\"\n                                    (click)=\"$event.stopPropagation()\"\n                                  />\n                                }\n                              } @else if (resolveCellTemplate(col)) {\n                                <ng-container *ngTemplateOutlet=\"resolveCellTemplate(col)!; context: {\n                                  $implicit: getCellValue(row, col.field),\n                                  value: getCellValue(row, col.field),\n                                  row: row,\n                                  column: col,\n                                  index: i,\n                                  editing: isEditing(row)\n                                }\" />\n                              } @else {\n                                @if (showGlobalSearch() && searchText()) {\n                                  <span [innerHTML]=\"highlightSearchText(getCellValue(row, col.field))\"></span>\n                                } @else {\n                                  {{ getCellValue(row, col.field) }}\n                                }\n                              }\n                            </td>\n                          }\n                        }\n\n                        @if (editable()) {\n                          <td\n                            class=\"grid-td grid-actions\"\n                            [class.pinned-right]=\"firstPinnedRightColumnField() !== null\"\n                            [class.pinned-right-first]=\"firstPinnedRightColumnField() === null\"\n                            [style.right.px]=\"firstPinnedRightColumnField() !== null ? 0 : null\"\n                            style=\"width:120px\"\n                          >\n                            @if (!isEditing(row)) {\n                              <button class=\"action-btn\" type=\"button\" (click)=\"beginEdit(row, i); $event.stopPropagation()\">Edit</button>\n                            } @else {\n                              <button class=\"action-btn save\" type=\"button\" (click)=\"saveEdit(row, i); $event.stopPropagation()\">Save</button>\n                              <button class=\"action-btn\" type=\"button\" (click)=\"cancelEdit(); $event.stopPropagation()\">Cancel</button>\n                            }\n                          </td>\n                        }\n                      }\n                    </tr>\n\n                    @if (showDetailToggle() && detailRowTemplate()) {\n                      <tr class=\"grid-detail-row\" [class.expanded]=\"isExpanded(row)\">\n                        <td [attr.colspan]=\"renderColumnCount()\" class=\"grid-detail-cell\">\n                          <div class=\"detail-wrapper\" [class.expanded]=\"isExpanded(row)\">\n                            <ng-container *ngTemplateOutlet=\"detailRowTemplate(); context: {\n                              $implicit: row,\n                              row: row,\n                              index: i\n                            }\" />\n                          </div>\n                        </td>\n                      </tr>\n                    }\n                  }\n                }\n              }\n            } @else {\n              @if (virtualScroll()) {\n                <tr [style.height.px]=\"startIndex() * rowHeight()\">\n                  <td [attr.colspan]=\"renderColumnCount()\" style=\"padding:0; border:none; height: inherit;\"></td>\n                </tr>\n              }\n              @for (row of (virtualScroll() ? visibleRows() : flatRenderedRows()); track getKey(row, $index); let i = $index) {\n                @let actualIndex = virtualScroll() ? startIndex() + i : i;\n                <tr\n                  [class]=\"'grid-row ' + getRowCustomClass(row)\"\n                  [class.selected]=\"isRowSelected(row)\"\n                  [class.dragging-row]=\"draggingRowIndex() === actualIndex\"\n                  [class.drag-over-row]=\"dragOverRowIndex() === actualIndex\"\n                  [style.transform]=\"getRowTranslation(actualIndex)\"\n                  (dragover)=\"onRowDragOver($event, actualIndex)\"\n                  (drop)=\"onRowDrop($event, actualIndex)\"\n                  (dragend)=\"onRowDragEnd()\"\n                  (click)=\"onRowClick(row, actualIndex)\"\n                  (dblclick)=\"editable() ? beginEdit(row, actualIndex) : null\"\n                >\n                  @if (rowReorderable()) {\n                    <td class=\"grid-td grid-td-reorder pinned-left\" [class.pinned-left-last]=\"isRowReorderableLastPinned()\" style=\"left:0px; text-align:center; width:44px\">\n                      <span class=\"row-drag-handle\" draggable=\"true\" (dragstart)=\"onRowDragStart($event, actualIndex)\" (dragend)=\"onRowDragEnd()\" title=\"Drag row to reorder\">\n                        <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"display: block;\">\n                          <circle cx=\"9\" cy=\"5\" r=\"1.5\"></circle>\n                          <circle cx=\"9\" cy=\"12\" r=\"1.5\"></circle>\n                          <circle cx=\"9\" cy=\"19\" r=\"1.5\"></circle>\n                          <circle cx=\"15\" cy=\"5\" r=\"1.5\"></circle>\n                          <circle cx=\"15\" cy=\"12\" r=\"1.5\"></circle>\n                          <circle cx=\"15\" cy=\"19\" r=\"1.5\"></circle>\n                        </svg>\n                      </span>\n                    </td>\n                  }\n\n                  @if (showDetailToggle()) {\n                    <td class=\"grid-td grid-td-toggle pinned-left\" [class.pinned-left-last]=\"isDetailToggleLastPinned()\" [style.left.px]=\"rowReorderable() ? 44 : 0\">\n                      <button class=\"toggle-btn\" [class.expanded]=\"isExpanded(row)\" type=\"button\" (click)=\"toggleDetail(row); $event.stopPropagation()\" title=\"Toggle Detail\">\n                        <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"chevron-icon\">\n                          <polyline points=\"9 18 15 12 9 6\"></polyline>\n                        </svg>\n                      </button>\n                    </td>\n                  }\n\n                  @if (selectable()) {\n                    <td class=\"grid-td grid-td-check pinned-left\" [class.pinned-left-last]=\"isSelectableLastPinned()\" [style.left.px]=\"(rowReorderable() ? 44 : 0) + (showDetailToggle() ? 44 : 0)\"><input type=\"checkbox\" [checked]=\"isRowSelected(row)\" (change)=\"toggleRow(row)\" (click)=\"$event.stopPropagation()\" /></td>\n                  }\n\n                  @if (rowTemplate()) {\n                    <td class=\"grid-td\" [attr.colspan]=\"orderedColumns().length + (editable() ? 1 : 0)\">\n                      <ng-container *ngTemplateOutlet=\"rowTemplate(); context: {\n                        $implicit: row,\n                        row: row,\n                        index: actualIndex,\n                        editing: isEditing(row),\n                        expanded: isExpanded(row)\n                      }\" />\n                    </td>\n                  } @else {\n                    @for (col of orderedColumns(); track col.field) {\n                      @if (getCellRowSpan(row, col.field, actualIndex) > 0) {\n                        <td\n                          class=\"grid-td\"\n                          [attr.rowspan]=\"getCellRowSpan(row, col.field, actualIndex)\"\n                          [class.pinned-left]=\"col.pinned === 'left'\"\n                          [class.pinned-left-last]=\"col.pinned === 'left' && lastPinnedColumnField() === col.field\"\n                          [class.pinned-right]=\"col.pinned === 'right'\"\n                          [class.pinned-right-first]=\"col.pinned === 'right' && firstPinnedRightColumnField() === col.field\"\n                          [class.cell-focused]=\"focusedCell()?.row === row && focusedCell()?.colField === col.field\"\n                          [class.cell-focused-editing]=\"focusedCell()?.row === row && focusedCell()?.colField === col.field && focusedCellEditActive()\"\n                          [style.left.px]=\"col.pinned === 'left' ? columnOffsets()[col.field] : null\"\n                          [style.right.px]=\"col.pinned === 'right' ? columnRightOffsets()[col.field] : null\"\n                          [style.text-align]=\"col.align ?? 'left'\"\n                          [style.width.px]=\"getColumnWidth(col)\"\n                          [class.cell-selected]=\"isCellSelected(row, col.field)\"\n                          (mousedown)=\"onCellMouseDown($event, row, col.field)\"\n                          (mouseenter)=\"onCellMouseEnter(row, col.field)\"\n                          (contextmenu)=\"onCellContextMenu($event, row, col.field)\"\n                          (click)=\"onCellClick(row, col.field)\"\n                        >\n                          @if (isEditing(row) && editable() && col.editable) {\n                            @if (resolveEditCellTemplate(col); as activeEditTemplate) {\n                              <ng-container *ngTemplateOutlet=\"activeEditTemplate; context: {\n                                $implicit: getDraftValue(row, col.field),\n                                value: getCellValue(row, col.field),\n                                row: row,\n                                column: col,\n                                index: actualIndex,\n                                editing: true,\n                                draftValue: getDraftValue(row, col.field),\n                                updateDraft: getUpdateDraftCallback(col.field)\n                              }\" />\n                            } @else {\n                              <input\n                                class=\"grid-edit-input\"\n                                [value]=\"toStringSafe(getDraftValue(row, col.field))\"\n                                (input)=\"updateDraft(col.field, $any($event.target).value)\"\n                                (click)=\"$event.stopPropagation()\"\n                              />\n                            }\n                          } @else if (resolveCellTemplate(col)) {\n                            <ng-container *ngTemplateOutlet=\"resolveCellTemplate(col)!; context: {\n                              $implicit: getCellValue(row, col.field),\n                              value: getCellValue(row, col.field),\n                              row: row,\n                              column: col,\n                              index: actualIndex,\n                              editing: isEditing(row)\n                            }\" />\n                          } @else {\n                            @if (showGlobalSearch() && searchText()) {\n                              <span [innerHTML]=\"highlightSearchText(getCellValue(row, col.field))\"></span>\n                            } @else {\n                              {{ getCellValue(row, col.field) }}\n                            }\n                          }\n                        </td>\n                      }\n                    }\n\n                    @if (editable()) {\n                      <td\n                        class=\"grid-td grid-actions\"\n                        [class.pinned-right]=\"firstPinnedRightColumnField() !== null\"\n                        [class.pinned-right-first]=\"firstPinnedRightColumnField() === null\"\n                        [style.right.px]=\"firstPinnedRightColumnField() !== null ? 0 : null\"\n                        style=\"width:120px\"\n                      >\n                        @if (!isEditing(row)) {\n                          <button class=\"action-btn\" type=\"button\" (click)=\"beginEdit(row, actualIndex); $event.stopPropagation()\">Edit</button>\n                        } @else {\n                          <button class=\"action-btn save\" type=\"button\" (click)=\"saveEdit(row, actualIndex); $event.stopPropagation()\">Save</button>\n                          <button class=\"action-btn\" type=\"button\" (click)=\"cancelEdit(); $event.stopPropagation()\">Cancel</button>\n                        }\n                      </td>\n                    }\n                  }\n                </tr>\n\n                @if (showDetailToggle() && detailRowTemplate()) {\n                  <tr class=\"grid-detail-row\" [class.expanded]=\"isExpanded(row)\">\n                    <td [attr.colspan]=\"renderColumnCount()\" class=\"grid-detail-cell\">\n                      <div class=\"detail-wrapper\" [class.expanded]=\"isExpanded(row)\">\n                        <ng-container *ngTemplateOutlet=\"detailRowTemplate(); context: {\n                          $implicit: row,\n                          row: row,\n                          index: actualIndex\n                        }\" />\n                      </div>\n                    </td>\n                  </tr>\n                }\n              }\n              @if (virtualScroll()) {\n                <tr [style.height.px]=\"(flatRenderedRows().length - endIndex()) * rowHeight()\">\n                  <td [attr.colspan]=\"renderColumnCount()\" style=\"padding:0; border:none; height: inherit;\"></td>\n                </tr>\n              }\n            }\n          </tbody>\n          @if (hasAggregation()) {\n            <tfoot>\n              <tr class=\"grid-footer-row\">\n                @if (rowReorderable()) {\n                  <td class=\"grid-td-reorder pinned-left\" [class.pinned-left-last]=\"isRowReorderableLastPinned()\" style=\"left:0px; width:44px\"></td>\n                }\n                @if (showDetailToggle()) {\n                  <td class=\"grid-td-toggle pinned-left\" [class.pinned-left-last]=\"isDetailToggleLastPinned()\" [style.left.px]=\"rowReorderable() ? 44 : 0\" style=\"width:44px\"></td>\n                }\n                @if (selectable()) {\n                  <td class=\"grid-td-check pinned-left\" [class.pinned-left-last]=\"isSelectableLastPinned()\" [style.left.px]=\"(rowReorderable() ? 44 : 0) + (showDetailToggle() ? 44 : 0)\" style=\"width:44px\"></td>\n                }\n                @for (col of orderedColumns(); track col.field) {\n                  <td\n                    class=\"grid-td grid-footer-cell\"\n                    [class.pinned-left]=\"col.pinned === 'left'\"\n                    [class.pinned-left-last]=\"col.pinned === 'left' && lastPinnedColumnField() === col.field\"\n                    [class.pinned-right]=\"col.pinned === 'right'\"\n                    [class.pinned-right-first]=\"col.pinned === 'right' && firstPinnedRightColumnField() === col.field\"\n                    [style.left.px]=\"col.pinned === 'left' ? columnOffsets()[col.field] : null\"\n                    [style.right.px]=\"col.pinned === 'right' ? columnRightOffsets()[col.field] : null\"\n                    [style.text-align]=\"col.align ?? 'left'\"\n                    [style.width.px]=\"getColumnWidth(col)\"\n                  >\n                    @if (resolveFooterTemplate(col); as activeFooterTemplate) {\n                      <ng-container *ngTemplateOutlet=\"activeFooterTemplate; context: {\n                        $implicit: col,\n                        column: col,\n                        aggregationValue: getAggregationValue(col),\n                        data: flatRenderedRows()\n                      }\" />\n                    } @else if (col.aggregation) {\n                      <span class=\"agg-label\">{{ col.aggregation }}: </span>\n                      <strong class=\"agg-value\">{{ getAggregationValue(col) }}</strong>\n                    }\n                  </td>\n                }\n                @if (editable()) {\n                  <td\n                    [class.pinned-right]=\"firstPinnedRightColumnField() !== null\"\n                    [class.pinned-right-first]=\"firstPinnedRightColumnField() === null\"\n                    [style.right.px]=\"firstPinnedRightColumnField() !== null ? 0 : null\"\n                  ></td>\n                }\n              </tr>\n            </tfoot>\n          }\n        </table>\n      </div>\n\n      @if (showPager()) {\n        <div class=\"grid-pagination\">\n          <div class=\"pagination-left\">\n            <span class=\"page-info\">\n              {{ i18n.pagination.page }} <strong class=\"page-info-highlight\">{{ pagerRangeStart() }}–{{ pagerRangeEnd() }}</strong> {{ i18n.pagination.of }} <strong class=\"page-info-highlight\">{{ totalItems() }}</strong>\n            </span>\n            <div class=\"page-size-selector\">\n              <span class=\"page-size-label\">{{ i18n.pagination.itemsPerPage }}:</span>\n              <select [value]=\"internalPageSize()\" (change)=\"changePageSize(+$any($event.target).value)\" class=\"page-size-select\">\n                <option [value]=\"5\">5</option>\n                <option [value]=\"8\">8</option>\n                <option [value]=\"10\">10</option>\n                <option [value]=\"20\">20</option>\n                <option [value]=\"50\">50</option>\n                <option [value]=\"100\">100</option>\n              </select>\n            </div>\n          </div>\n          <div class=\"page-btns\">\n            <button class=\"page-btn ctrl\" [disabled]=\"currentPage() === 1\" (click)=\"goPage(1)\" [title]=\"i18n.pagination.firstPage\">\n              <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <polyline points=\"11 17 6 12 11 7\"></polyline>\n                <polyline points=\"18 17 13 12 18 7\"></polyline>\n              </svg>\n            </button>\n            <button class=\"page-btn ctrl\" [disabled]=\"currentPage() === 1\" (click)=\"goPage(currentPage() - 1)\" [title]=\"i18n.pagination.previousPage\">\n              <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <polyline points=\"15 18 9 12 15 6\"></polyline>\n              </svg>\n            </button>\n            \n            <div class=\"page-numbers\">\n              @for (p of pageNumbers(); track p) {\n                <button class=\"page-btn number\" [class.active]=\"p === currentPage()\" (click)=\"goPage(p)\">{{ p }}</button>\n              }\n            </div>\n\n            <button class=\"page-btn ctrl\" [disabled]=\"currentPage() === totalPages()\" (click)=\"goPage(currentPage() + 1)\" [title]=\"i18n.pagination.nextPage\">\n              <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <polyline points=\"9 18 15 12 9 6\"></polyline>\n              </svg>\n            </button>\n            <button class=\"page-btn ctrl\" [disabled]=\"currentPage() === totalPages()\" (click)=\"goPage(totalPages())\" [title]=\"i18n.pagination.lastPage\">\n              <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <polyline points=\"13 17 18 12 13 7\"></polyline>\n                <polyline points=\"6 17 11 12 6 7\"></polyline>\n              </svg>\n            </button>\n          </div>\n        </div>\n      }\n\n      <!-- Excel-Style Filter Popover Overlay -->\n      @if (activeFilterPopover(); as pop) {\n        <div class=\"grid-filter-popover\" [style.top.px]=\"pop.top\" [style.left.px]=\"pop.left\" (click)=\"$event.stopPropagation()\">\n          <div class=\"popover-section pinning-section\">\n            <label class=\"popover-label\">Pin Column</label>\n            <div class=\"pinning-actions\">\n              <button class=\"pin-btn\" [class.active]=\"getColumnPinnedState(pop.field) === 'left'\" (click)=\"pinColumnPopover(pop.field, 'left')\" type=\"button\">Left</button>\n              <button class=\"pin-btn\" [class.active]=\"getColumnPinnedState(pop.field) === 'right'\" (click)=\"pinColumnPopover(pop.field, 'right')\" type=\"button\">Right</button>\n              <button class=\"pin-btn\" [class.active]=\"getColumnPinnedState(pop.field) === null\" (click)=\"pinColumnPopover(pop.field, null)\" type=\"button\">No Pin</button>\n            </div>\n          </div>\n\n          <div class=\"popover-section text-filter-section\">\n            <label class=\"popover-label\">Text Filter</label>\n            <div class=\"text-filter-row\">\n              <select class=\"popover-select\" [value]=\"tempFilterOperator()\" (change)=\"tempFilterOperator.set($any($event.target).value)\">\n                <option value=\"contains\">Contains</option>\n                <option value=\"eq\">Equals</option>\n                <option value=\"startsWith\">Starts With</option>\n                <option value=\"endsWith\">Ends With</option>\n              </select>\n              <input class=\"popover-input\" type=\"text\" [value]=\"tempFilterValue()\" (input)=\"tempFilterValue.set($any($event.target).value)\" [placeholder]=\"i18n.grid.filterPlaceholder\" />\n            </div>\n          </div>\n          \n          <div class=\"popover-section checklist-section\">\n            <label class=\"popover-label\">Checklist Filter</label>\n            <input\n              class=\"checklist-search\"\n              type=\"text\"\n              [value]=\"filterSearchQuery()\"\n              (input)=\"filterSearchQuery.set($any($event.target).value)\"\n              [placeholder]=\"i18n.common.search\"\n            />\n            <div class=\"checklist-actions\">\n              <label class=\"checklist-item select-all\">\n                <input type=\"checkbox\" [checked]=\"tempSelectedValues().size === getFilteredDistinctValues(pop.field).length\" [indeterminate]=\"tempSelectedValues().size > 0 && tempSelectedValues().size < getFilteredDistinctValues(pop.field).length\" (change)=\"toggleSelectAllChecklist()\" />\n                <span>({{ i18n.grid.selectAll }})</span>\n              </label>\n            </div>\n            <div class=\"checklist-scroll\">\n              @for (val of getFilteredDistinctValues(pop.field); track val) {\n                <label class=\"checklist-item\">\n                  <input type=\"checkbox\" [checked]=\"tempSelectedValues().has(val)\" (change)=\"toggleChecklistItem(val)\" />\n                  <span>{{ val }}</span>\n                </label>\n              }\n            </div>\n          </div>\n          \n          <div class=\"popover-footer\">\n            <button class=\"popover-btn clear\" (click)=\"clearPopoverFilter()\">{{ i18n.datePicker.clear }}</button>\n            <div class=\"footer-actions\">\n              <button class=\"popover-btn cancel\" (click)=\"activeFilterPopover.set(null)\">{{ i18n.common.cancel }}</button>\n              <button class=\"popover-btn apply\" (click)=\"applyPopoverFilter()\">Apply</button>\n            </div>\n          </div>\n        </div>\n      }\n\n      <!-- Column Chooser Popover Overlay -->\n      @if (activeColumnChooserPopover(); as pop) {\n        <div class=\"grid-column-chooser-popover\" [style.top.px]=\"pop.top\" [style.left.px]=\"pop.left\" (click)=\"$event.stopPropagation()\">\n          <div class=\"popover-section checklist-section\" style=\"border-top: none; padding-top: 0;\">\n            <label class=\"popover-label\">Visible Columns</label>\n            <div class=\"checklist-scroll\">\n              @for (col of columns(); track col.field) {\n                <label class=\"checklist-item\">\n                  <input type=\"checkbox\" [checked]=\"!hiddenColumns().has(col.field)\" (change)=\"toggleColumnVisibility(col.field)\" />\n                  <span>{{ col.title }}</span>\n                </label>\n              }\n            </div>\n          </div>\n          <div class=\"popover-footer\">\n            <button class=\"popover-btn apply\" (click)=\"activeColumnChooserPopover.set(null)\">Close</button>\n          </div>\n        </div>\n      }\n\n      <!-- Custom Context Menu Overlay -->\n      @if (activeContextMenu(); as menu) {\n        <div class=\"grid-context-menu\" [style.top.px]=\"menu.y\" [style.left.px]=\"menu.x\" (click)=\"$event.stopPropagation()\">\n          <button class=\"menu-item\" [disabled]=\"!selectedCellStart()\" (click)=\"contextMenuCopy()\">\n            <span class=\"menu-icon\">📋</span> Copy Selection\n          </button>\n          <div class=\"menu-divider\"></div>\n          @if (showDetailToggle() && detailRowTemplate() && menu.row) {\n            <button class=\"menu-item\" (click)=\"contextMenuToggleDetail(menu.row)\">\n              <span class=\"menu-icon\">🔍</span> {{ isExpanded(menu.row) ? 'Collapse Details' : 'Expand Details' }}\n            </button>\n            <button class=\"menu-item\" (click)=\"expandAllDetails()\">\n              <span class=\"menu-icon\">📂</span> Expand All Details\n            </button>\n            <button class=\"menu-item\" (click)=\"collapseAllDetails()\">\n              <span class=\"menu-icon\">📁</span> Collapse All Details\n            </button>\n            <div class=\"menu-divider\"></div>\n          }\n          @if (getColumnDef(menu.colField); as columnDef) {\n            @if (columnDef.groupable) {\n              @if (internalGroupBy()?.field === menu.colField) {\n                <button class=\"menu-item\" (click)=\"contextMenuClearGrouping()\">\n                  <span class=\"menu-icon\">📁</span> Clear Grouping\n                </button>\n              } @else {\n                <button class=\"menu-item\" (click)=\"contextMenuGroupBy(menu.colField)\">\n                  <span class=\"menu-icon\">🗂️</span> Group by {{ columnDef.title }}\n                </button>\n              }\n            }\n          }\n          @if (hasGrouping()) {\n            <button class=\"menu-item\" (click)=\"expandAllGroups()\">\n              <span class=\"menu-icon\">↕️</span> Expand All Groups\n            </button>\n            <button class=\"menu-item\" (click)=\"collapseAllGroups()\">\n              <span class=\"menu-icon\">⋯</span> Collapse All Groups\n            </button>\n          }\n          <div class=\"menu-divider\"></div>\n          <button class=\"menu-item\" (click)=\"contextMenuTogglePin(menu.colField)\">\n            <span class=\"menu-icon\">📌</span> {{ isColumnPinned(menu.colField) ? 'Unpin Column' : 'Pin Column Left' }}\n          </button>\n          <button class=\"menu-item\" (click)=\"contextMenuHideColumn(menu.colField)\">\n            <span class=\"menu-icon\">👁️</span> Hide Column\n          </button>\n          <div class=\"menu-divider\"></div>\n          <button class=\"menu-item\" [disabled]=\"filterStates().size === 0\" (click)=\"contextMenuClearFilters()\">\n            <span class=\"menu-icon\">🧹</span> Clear All Filters\n          </button>\n          <div class=\"menu-divider\"></div>\n          <button class=\"menu-item\" (click)=\"exportToJson(); activeContextMenu.set(null)\">\n            <span class=\"menu-icon\">📄</span> Export to JSON\n          </button>\n          <button class=\"menu-item\" (click)=\"exportToCsv(); activeContextMenu.set(null)\">\n            <span class=\"menu-icon\">📊</span> Export to CSV\n          </button>\n          <button class=\"menu-item\" (click)=\"exportToExcel(); activeContextMenu.set(null)\">\n            <span class=\"menu-icon\">📈</span> Export to Excel\n          </button>\n          <button class=\"menu-item\" (click)=\"exportToPdf(); activeContextMenu.set(null)\">\n            <span class=\"menu-icon\">📕</span> Export to PDF\n          </button>\n        </div>\n      }\n\n      <!-- Status Bar -->\n      <ngx-grid-status-bar [aggregates]=\"selectionAggregates()\" [visible]=\"showStatusBar()\" />\n\n      <!-- Advanced Filter Builder Overlay -->\n      @if (isFilterBuilderOpen()) {\n        <ngx-grid-filter-builder\n          [columns]=\"$any(columns())\"\n          [expression]=\"internalFilterExpression()\"\n          (expressionChange)=\"onFilterExpressionChange($event)\"\n          (close)=\"isFilterBuilderOpen.set(false)\"\n        />\n      }\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n    \n    /* Custom Scrollbar Styles for premium feel */\n    .grid-table-wrap::-webkit-scrollbar,\n    .checklist-scroll::-webkit-scrollbar {\n      width: 6px;\n      height: 6px;\n    }\n    .grid-table-wrap::-webkit-scrollbar-track,\n    .checklist-scroll::-webkit-scrollbar-track {\n      background: transparent;\n    }\n    .grid-table-wrap::-webkit-scrollbar-thumb,\n    .checklist-scroll::-webkit-scrollbar-thumb {\n      background: rgba(100, 116, 139, 0.2);\n      border-radius: 99px;\n    }\n    .grid-table-wrap::-webkit-scrollbar-thumb:hover,\n    .checklist-scroll::-webkit-scrollbar-thumb:hover {\n      background: rgba(100, 116, 139, 0.4);\n    }\n\n    .ngx-data-grid {\n      position: relative;\n      font-family: inherit;\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: var(--ngx-grid-radius, 12px);\n      overflow: hidden; /* Clamps inner children corners */\n      background: var(--ngx-grid-bg, #ffffff);\n      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.03), 0 4px 6px -4px rgba(0, 0, 0, 0.03), 0 0 0 1px rgba(0, 0, 0, 0.02);\n      transition: background-color 0.3s, border-color 0.3s, box-shadow 0.3s;\n    }\n    .grid-toolbar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 14px 18px;\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border-bottom: 1px solid var(--ngx-grid-border, #e2e8f0);\n      flex-wrap: wrap;\n      gap: 12px;\n    }\n    .grid-toolbar-title {\n      font-family: var(--ngx-heading-font-family, 'Outfit', sans-serif);\n      font-weight: 700;\n      font-size: 15px;\n      color: var(--ngx-grid-text, #0f172a);\n      letter-spacing: -0.01em;\n    }\n    .grid-toolbar-actions {\n      display: flex;\n      gap: 8px;\n    }\n    .grid-action-btn {\n      padding: 6px 14px;\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: 8px;\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      font-size: 12px;\n      font-weight: 600;\n      cursor: pointer;\n      font-family: inherit;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      outline: none;\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .grid-action-btn:hover {\n      background: var(--ngx-grid-hover-bg, #f8fafc);\n      border-color: var(--ngx-input-focus, #4f46e5);\n      color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.08);\n      transform: translateY(-0.5px);\n    }\n    .grid-action-btn:active {\n      transform: scale(0.97);\n    }\n    .grid-table-wrap { overflow-x: auto; overflow-y: hidden; }\n    .grid-table { width: 100%; border-collapse: collapse; font-size: 13px; table-layout: fixed; }\n    /* Compact Mode styling */\n    .ngx-data-grid.compact .grid-td {\n      padding: 7px 12px;\n      font-size: 12px;\n    }\n    .ngx-data-grid.compact .grid-th {\n      padding: 9px 12px;\n      font-size: 10px;\n    }\n    .ngx-data-grid.compact .grid-grouping-panel {\n      padding: 8px 14px;\n    }\n    .ngx-data-grid.compact .grid-toolbar {\n      padding: 8px 14px;\n    }\n    \n    /* Clear Filters button styling */\n    .clear-filters-btn {\n      border-color: rgba(239, 68, 68, 0.25) !important;\n      background: rgba(239, 68, 68, 0.05) !important;\n      color: #ef4444 !important;\n      font-weight: 600;\n    }\n    .clear-filters-btn:hover {\n      background: #ef4444 !important;\n      color: #ffffff !important;\n      border-color: transparent !important;\n    }\n\n    .grid-th {\n      position: sticky;\n      top: 0;\n      z-index: 10;\n      padding: 14px 18px;\n      text-align: left;\n      font-size: 11px;\n      font-weight: 750;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border-bottom: 2px solid var(--ngx-grid-border, #e2e8f0);\n      white-space: nowrap;\n      user-select: none;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      font-family: var(--ngx-heading-font-family, 'Outfit', sans-serif);\n      transition: background-color 0.2s ease;\n    }\n    .grid-category-th {\n      text-align: center;\n      border-bottom: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-right: 1px solid var(--ngx-grid-border, #e2e8f0);\n    }\n    .sub-header-row .grid-th {\n      border-bottom: 2px solid var(--ngx-grid-border, #e2e8f0);\n      border-right: 1px solid var(--ngx-grid-border, #f1f5f9);\n    }\n    .grid-th.sortable { cursor: pointer; }\n    .grid-th.sortable:hover { background: var(--ngx-grid-hover-bg, #f1f5f9); color: var(--ngx-grid-text, #0f172a); }\n    .grid-th.sort-asc, .grid-th.sort-desc { color: var(--ngx-input-focus, #4f46e5); background: rgba(79, 70, 229, 0.02); }\n    .th-text { margin-right: 4px; }\n    .sort-icon { font-size: 10px; color: #cbd5e1; transition: color 0.2s ease; }\n    .sort-asc .sort-icon, .sort-desc .sort-icon { color: var(--ngx-input-focus, #4f46e5); }\n    \n    .th-content-wrapper {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 6px;\n      width: 100%;\n    }\n    .grid-filter-btn {\n      background: transparent;\n      border: none;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      cursor: pointer;\n      padding: 4px;\n      border-radius: 6px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.2s;\n    }\n    .grid-filter-btn:hover {\n      background: var(--ngx-grid-hover-bg, #cbd5e1);\n      color: var(--ngx-grid-text, #0f172a);\n    }\n    .grid-filter-btn.active {\n      color: var(--ngx-input-focus, #4f46e5);\n      background: rgba(79, 70, 229, 0.1);\n    }\n    .grid-resize-handle {\n      position: absolute;\n      right: 0;\n      top: 0;\n      bottom: 0;\n      width: 6px;\n      cursor: col-resize;\n      background: transparent;\n      z-index: 10;\n      transition: background-color 0.2s;\n    }\n    .grid-resize-handle:hover,\n    .grid-resize-handle.resizing {\n      background: var(--ngx-input-focus, #4f46e5);\n    }\n    \n    .grid-filter-popover,\n    .grid-column-chooser-popover,\n    .grid-context-menu {\n      position: absolute;\n      width: 250px;\n      background: var(--ngx-grid-bg-glass, rgba(255, 255, 255, 0.8));\n      backdrop-filter: blur(16px) saturate(180%);\n      -webkit-backdrop-filter: blur(16px) saturate(180%);\n      border: 1px solid rgba(255, 255, 255, 0.5);\n      border-radius: 14px;\n      box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.08), 0 10px 10px -5px rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(0, 0, 0, 0.02);\n      z-index: 1000;\n      padding: 12px;\n      box-sizing: border-box;\n      display: flex;\n      flex-direction: column;\n      gap: 12px;\n      font-family: inherit;\n      animation: popoverFadeIn 0.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;\n      transform-origin: top center;\n    }\n    .grid-context-menu {\n      width: 190px;\n      padding: 6px;\n      gap: 2px;\n    }\n    @keyframes popoverFadeIn {\n      from { opacity: 0; transform: scale(0.95) translateY(-5px); }\n      to { opacity: 1; transform: scale(1) translateY(0); }\n    }\n    .checklist-search {\n      padding: 8px 12px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      font-size: 12px;\n      font-family: inherit;\n      outline: none;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      width: 100%;\n      box-sizing: border-box;\n      margin-bottom: 4px;\n      transition: all 0.2s ease;\n    }\n    .checklist-search:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n    }\n    .pinning-section {\n      border-bottom: 1px solid var(--ngx-grid-border, #e2e8f0);\n      padding-bottom: 10px;\n    }\n    .pinning-actions {\n      display: flex;\n      gap: 6px;\n    }\n    .pin-btn {\n      flex: 1;\n      padding: 6px 4px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 6px;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      font-size: 11px;\n      font-weight: 600;\n      cursor: pointer;\n      text-align: center;\n      transition: all 0.15s ease;\n      outline: none;\n    }\n    .pin-btn:hover {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      color: var(--ngx-input-focus, #4f46e5);\n      background: rgba(79, 70, 229, 0.02);\n    }\n    .pin-btn.active {\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n      box-shadow: 0 2px 4px rgba(79, 70, 229, 0.15);\n    }\n\n    .popover-section {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n    }\n    .popover-label {\n      font-size: 10px;\n      font-weight: 800;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n    }\n    .text-filter-row {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n    }\n    .popover-select {\n      padding: 6px 10px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      font-size: 12px;\n      font-family: inherit;\n      outline: none;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      cursor: pointer;\n    }\n    .popover-input {\n      padding: 6px 10px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      font-size: 12px;\n      font-family: inherit;\n      outline: none;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      transition: all 0.2s;\n    }\n    .popover-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n    }\n    .checklist-section {\n      border-top: 1px solid var(--ngx-grid-border, #e2e8f0);\n      padding-top: 10px;\n    }\n    .checklist-scroll {\n      max-height: 140px;\n      overflow-y: auto;\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: 8px;\n      padding: 8px;\n      background: rgba(255, 255, 255, 0.45);\n    }\n    .checklist-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 12px;\n      color: var(--ngx-grid-text, #0f172a);\n      cursor: pointer;\n      user-select: none;\n    }\n    .popover-footer {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-top: 1px solid var(--ngx-grid-border, #e2e8f0);\n      padding-top: 10px;\n      margin-top: 4px;\n    }\n    .footer-actions {\n      display: flex;\n      gap: 6px;\n    }\n    .popover-btn {\n      padding: 5px 12px;\n      font-size: 11px;\n      font-weight: 600;\n      border-radius: 6px;\n      cursor: pointer;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      transition: all 0.2s ease;\n      font-family: inherit;\n    }\n    .popover-btn:hover {\n      background: var(--ngx-grid-hover-bg, #f8fafc);\n      border-color: var(--ngx-input-border, #cbd5e1);\n    }\n    .popover-btn.apply {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n    }\n    .popover-btn.apply:hover {\n      background: var(--ngx-btn-primary-hover, #4338ca);\n      border-color: var(--ngx-btn-primary-hover, #4338ca);\n      box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.2);\n    }\n    .popover-btn.clear {\n      color: #ef4444;\n      border-color: transparent;\n      background: transparent;\n    }\n    .popover-btn.clear:hover {\n      background: #fef2f2;\n    }\n\n    .grid-group-row td {\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border-bottom: 1.5px solid var(--ngx-grid-border, #e2e8f0);\n      color: var(--ngx-grid-text, #0f172a);\n      font-size: 12px;\n      font-weight: 600;\n      padding: 12px 18px;\n      cursor: pointer;\n    }\n    .group-toggle {\n      border: none;\n      background: transparent;\n      margin-right: 6px;\n      cursor: pointer;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      font-size: 12px;\n      transition: transform 0.2s ease;\n    }\n    .group-count { color: var(--ngx-grid-text-secondary, #64748b); margin-left: 6px; font-weight: 500; }\n    .grid-row {\n      border-bottom: 1px solid var(--ngx-grid-border, #f1f5f9);\n      transition: background-color 0.15s ease;\n    }\n    .grid-row:hover { background: var(--ngx-grid-hover-bg, #f5f3ff) !important; }\n    .grid-row.selected { background: var(--ngx-grid-selected-bg, #e0e7ff) !important; }\n    .grid-row.selected:hover { background: var(--ngx-grid-selected-bg-hover, #c7d2fe) !important; }\n    .grid-table.striped .grid-row:nth-child(even) { background: var(--ngx-grid-stripe-bg, #f8fafc); }\n    .grid-table.striped .grid-row:nth-child(even):hover { background: var(--ngx-grid-hover-bg, #f5f3ff) !important; }\n    .grid-table.striped .grid-row.selected { background: var(--ngx-grid-selected-bg, #e0e7ff) !important; }\n    .grid-td {\n      padding: 12px 18px;\n      color: var(--ngx-grid-text, #0f172a);\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      vertical-align: middle;\n      box-sizing: border-box;\n    }\n    .grid-th-check, .grid-td-check,\n    .grid-th-toggle, .grid-td-toggle,\n    .grid-td-reorder, .grid-th-reorder {\n      width: 44px !important;\n      text-align: center;\n      padding: 0 !important;\n      text-overflow: clip !important;\n    }\n    .toggle-btn {\n      border: none;\n      background: transparent;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      cursor: pointer;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 24px;\n      height: 24px;\n      border-radius: 6px;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      outline: none;\n    }\n    .toggle-btn:hover {\n      background: var(--ngx-grid-hover-bg, #f1f5f9);\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n    .toggle-btn .chevron-icon {\n      transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n    }\n    .toggle-btn.expanded .chevron-icon {\n      transform: rotate(90deg);\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n    .grid-detail-row {\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    .grid-detail-cell {\n      padding: 0 !important;\n      border-bottom: 1px solid var(--ngx-grid-border, #e2e8f0);\n      white-space: normal;\n    }\n    .detail-wrapper {\n      max-height: 0;\n      opacity: 0;\n      overflow: hidden;\n      padding: 0 24px;\n      transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), \n                  opacity 0.25s ease-out, \n                  padding 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      box-sizing: border-box;\n    }\n    .detail-wrapper.expanded {\n      max-height: 800px;\n      opacity: 1;\n      padding: 16px 24px 20px 24px;\n    }\n    .grid-edit-input {\n      width: 100%;\n      min-width: 80px;\n      padding: 6px 10px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      font-size: 12px;\n      font-family: inherit;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      box-sizing: border-box;\n      outline: none;\n      transition: border-color 0.2s, box-shadow 0.2s;\n    }\n    .grid-edit-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n    }\n    .grid-actions { white-space: nowrap; }\n    .action-btn {\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      border-radius: 8px;\n      padding: 6px 12px;\n      font-size: 12px;\n      font-weight: 600;\n      margin-right: 6px;\n      cursor: pointer;\n      transition: all 0.2s;\n      outline: none;\n    }\n    .action-btn:hover {\n      background: var(--ngx-grid-hover-bg, #f8fafc);\n      border-color: var(--ngx-input-border, #cbd5e1);\n    }\n    .action-btn.save {\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n    }\n    .action-btn.save:hover {\n      background: var(--ngx-btn-primary-hover, #4338ca);\n      border-color: var(--ngx-btn-primary-hover, #4338ca);\n      box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.2);\n    }\n    .action-btn:last-child { margin-right: 0; }\n    .grid-loading-cell, .grid-empty-cell {\n      padding: 48px;\n      text-align: center;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .grid-spinner {\n      width: 28px;\n      height: 28px;\n      border: 3.5px solid var(--ngx-grid-border, #e2e8f0);\n      border-top-color: var(--ngx-btn-primary-bg, #4f46e5);\n      border-radius: 50%;\n      animation: spin 0.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;\n      margin: 0 auto;\n    }\n    @keyframes spin { to { transform: rotate(360deg); } }\n    .grid-pagination {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 14px 20px;\n      border-top: 1px solid var(--ngx-grid-border, #e2e8f0);\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      flex-wrap: wrap;\n      gap: 16px;\n    }\n    .pagination-left {\n      display: flex;\n      align-items: center;\n      gap: 20px;\n      flex-wrap: wrap;\n    }\n    .page-info {\n      font-size: 13px;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .page-info-highlight {\n      color: var(--ngx-grid-text, #0f172a);\n      font-weight: 600;\n    }\n    .page-size-selector {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .page-size-label {\n      font-size: 12px;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      font-weight: 500;\n    }\n    .page-size-select {\n      padding: 4px 28px 4px 10px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 6px;\n      font-size: 12px;\n      font-weight: 600;\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      cursor: pointer;\n      outline: none;\n      transition: all 0.2s;\n      appearance: none;\n      -webkit-appearance: none;\n      background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2364748b' stroke-width='2.5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 8.25l-7.5 7.5-7.5-7.5'/%3E%3C/svg%3E\");\n      background-repeat: no-repeat;\n      background-position: right 8px center;\n      background-size: 12px;\n    }\n    .page-size-select:hover {\n      border-color: var(--ngx-input-border-hover, #94a3b8);\n    }\n    .page-size-select:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n    }\n    .page-btns {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n    }\n    .page-numbers {\n      display: flex;\n      gap: 4px;\n    }\n    .page-btn {\n      min-width: 32px;\n      height: 32px;\n      padding: 0 8px;\n      font-size: 13px;\n      font-weight: 600;\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      background: var(--ngx-grid-bg, #ffffff);\n      border-radius: 8px;\n      cursor: pointer;\n      font-family: inherit;\n      color: var(--ngx-grid-text, #0f172a);\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      outline: none;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n    }\n    .page-btn.ctrl {\n      color: var(--ngx-grid-text-secondary, #64748b);\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    .page-btn:hover:not(:disabled) {\n      background: var(--ngx-grid-hover-bg, #f1f5f9);\n      border-color: var(--ngx-input-border-hover, #cbd5e1);\n      color: var(--ngx-input-focus, #4f46e5);\n      transform: translateY(-0.5px);\n    }\n    .page-btn.active {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff !important;\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n      box-shadow: 0 4px 6px -1px rgba(79, 70, 229, 0.25);\n    }\n    .page-btn:disabled {\n      opacity: 0.35;\n      cursor: not-allowed;\n      transform: none !important;\n    }\n    \n    .grid-footer-row td {\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border-top: 2px solid var(--ngx-grid-border, #e2e8f0);\n      font-size: 12px;\n      padding: 12px 18px;\n      color: var(--ngx-grid-text, #0f172a);\n    }\n    .agg-label {\n      font-size: 10px;\n      font-weight: 800;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n    }\n    .agg-value {\n      font-weight: 700;\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n    .pinned-left {\n      position: sticky !important;\n      z-index: 5;\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    th.pinned-left {\n      position: sticky !important;\n      top: 0;\n      z-index: 30 !important;\n      background: var(--ngx-grid-header-bg, #f8fafc) !important;\n    }\n    .sticky-toggle {\n      position: sticky !important;\n      left: 0;\n      z-index: 5;\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    th.sticky-toggle {\n      position: sticky !important;\n      top: 0;\n      z-index: 30 !important;\n      background: var(--ngx-grid-header-bg, #f8fafc) !important;\n    }\n    .sticky-check {\n      position: sticky !important;\n      z-index: 5;\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    th.sticky-check {\n      position: sticky !important;\n      top: 0;\n      z-index: 30 !important;\n      background: var(--ngx-grid-header-bg, #f8fafc) !important;\n    }\n    .pinned-left-last,\n    .sticky-toggle-last,\n    .sticky-check-last {\n      border-right: 1px solid var(--ngx-grid-border, #cbd5e1) !important;\n      box-shadow: 4px 0 10px -3px rgba(0, 0, 0, 0.08);\n    }\n    .grid-table.striped .grid-row:nth-child(even) .pinned-left,\n    .grid-table.striped .grid-row:nth-child(even) .sticky-toggle,\n    .grid-table.striped .grid-row:nth-child(even) .sticky-check {\n      background: var(--ngx-grid-stripe-bg, #f8fafc);\n    }\n    .grid-row:hover .pinned-left,\n    .grid-row:hover .sticky-toggle,\n    .grid-row:hover .sticky-check {\n      background: var(--ngx-grid-hover-bg, #f5f3ff) !important;\n    }\n    .grid-row.selected .pinned-left,\n    .grid-row.selected .sticky-toggle,\n    .grid-row.selected .sticky-check {\n      background: var(--ngx-grid-selected-bg, #e0e7ff) !important;\n    }\n    .grid-footer-row .pinned-left,\n    .grid-footer-row .sticky-toggle,\n    .grid-footer-row .sticky-check {\n      background: var(--ngx-grid-header-bg, #f8fafc);\n    }\n\n    .pinned-right {\n      position: sticky !important;\n      z-index: 5;\n      background: var(--ngx-grid-bg, #ffffff);\n    }\n    th.pinned-right {\n      position: sticky !important;\n      top: 0;\n      z-index: 30 !important;\n      background: var(--ngx-grid-header-bg, #f8fafc) !important;\n    }\n    .pinned-right-first {\n      border-left: 1px solid var(--ngx-grid-border, #cbd5e1) !important;\n      box-shadow: -4px 0 10px -3px rgba(0, 0, 0, 0.08);\n    }\n    .grid-table.striped .grid-row:nth-child(even) .pinned-right {\n      background: var(--ngx-grid-stripe-bg, #f8fafc);\n    }\n    .grid-row:hover .pinned-right {\n      background: var(--ngx-grid-hover-bg, #f5f3ff) !important;\n    }\n    .grid-row.selected .pinned-right {\n      background: var(--ngx-grid-selected-bg, #e0e7ff) !important;\n    }\n    .grid-footer-row .pinned-right {\n      background: var(--ngx-grid-header-bg, #f8fafc);\n    }\n\n    /* Keyboard Navigation Styles */\n    .grid-td.cell-focused {\n      outline: 2px solid var(--ngx-input-focus, #4f46e5) !important;\n      outline-offset: -2px;\n      z-index: 5;\n    }\n    .grid-td.cell-focused-editing {\n      padding: 0 !important;\n    }\n    .grid-td.cell-focused-editing .grid-edit-input {\n      width: 100%;\n      height: 100%;\n      border: none;\n      outline: none;\n      padding: 12px 18px;\n      box-sizing: border-box;\n      background: var(--ngx-grid-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      font-family: inherit;\n      font-size: inherit;\n      border-radius: 0;\n    }\n    \n    /* Drag & Drop Reordering Styles */\n    .grid-th[draggable=\"true\"] {\n      cursor: grab;\n    }\n    .grid-th[draggable=\"true\"]:active {\n      cursor: grabbing;\n    }\n    .grid-th.dragging {\n      opacity: 0.4;\n      background: var(--ngx-grid-hover-bg, #f1f5f9) !important;\n      border: 1.5px dashed var(--ngx-input-border, #cbd5e1);\n    }\n    .grid-th.drag-over {\n      border-left: 3px solid var(--ngx-input-focus, #4f46e5) !important;\n    }\n    \n    /* Multi-Column Sorting order badge */\n    .sort-icon.active {\n      color: var(--ngx-input-focus, #4f46e5);\n      font-weight: 700;\n    }\n    .sort-order-badge {\n      font-size: 8px;\n      line-height: 1;\n      background: var(--ngx-input-focus, #4f46e5);\n      color: #ffffff;\n      padding: 2px 4px;\n      border-radius: 4px;\n      vertical-align: super;\n      margin-left: 2px;\n      font-weight: 700;\n    }\n    \n    /* Global Search Styles */\n    .grid-search-wrap {\n      position: relative;\n      display: inline-flex;\n      align-items: center;\n    }\n    .grid-search-input {\n      padding: 6px 30px 6px 12px;\n      border: 1px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 8px;\n      font-size: 13px;\n      font-family: inherit;\n      background: var(--ngx-input-bg, #ffffff);\n      color: var(--ngx-grid-text, #0f172a);\n      outline: none;\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      width: 180px;\n    }\n    .grid-search-input:focus {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 3px var(--primary-glow, rgba(79, 70, 229, 0.15));\n      width: 220px;\n    }\n    .grid-search-clear {\n      position: absolute;\n      right: 8px;\n      background: transparent;\n      border: none;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      font-size: 16px;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: 2px;\n      line-height: 1;\n    }\n    .grid-search-clear:hover {\n      color: var(--ngx-grid-text, #0f172a);\n    }\n    .search-highlight {\n      background-color: rgba(251, 191, 36, 0.25);\n      color: inherit;\n      font-weight: 600;\n      padding: 1px 2px;\n      border-radius: 4px;\n    }\n    .grid-td.cell-selected {\n      background: var(--ngx-grid-cell-selected-bg, rgba(79, 70, 229, 0.1)) !important;\n      outline: 1.5px solid var(--ngx-grid-cell-selected-border, #4f46e5);\n      outline-offset: -1.5px;\n    }\n\n    /* Row Drag & Drop Styles */\n    .row-drag-handle {\n      cursor: grab;\n      user-select: none;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 24px;\n      height: 24px;\n      border-radius: 6px;\n      padding: 0;\n      transition: all 0.2s ease;\n    }\n    .row-drag-handle:hover {\n      color: var(--ngx-input-focus, #4f46e5);\n      background: var(--ngx-grid-hover-bg, #f1f5f9);\n      transform: scale(1.1);\n    }\n    .row-drag-handle:active {\n      cursor: grabbing;\n      transform: scale(0.95);\n    }\n    .grid-row {\n      transition: background-color 0.15s ease, opacity 0.2s ease, transform 0.28s cubic-bezier(0.2, 0.8, 0.2, 1);\n    }\n    .grid-row.dragging-row td {\n      opacity: 0.35;\n      background: var(--ngx-grid-hover-bg, rgba(79, 70, 229, 0.04)) !important;\n      color: var(--ngx-grid-text-secondary, #94a3b8);\n      transition: opacity 0.2s ease;\n    }\n    .grid-row.drag-over-row td {\n      border-top: 2.5px solid var(--ngx-btn-primary-bg, #4f46e5) !important;\n      background: rgba(79, 70, 229, 0.03) !important;\n      box-shadow: inset 0 2px 4px rgba(79, 70, 229, 0.05);\n    }\n\n    .grid-context-menu {\n      position: absolute;\n      width: 215px;\n      background: var(--ngx-grid-bg, rgba(255, 255, 255, 0.95));\n      backdrop-filter: blur(8px);\n      -webkit-backdrop-filter: blur(8px);\n      border: 1px solid var(--ngx-grid-border, #e2e8f0);\n      border-radius: 10px;\n      box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n      z-index: 2000;\n      padding: 6px;\n      box-sizing: border-box;\n      display: flex;\n      flex-direction: column;\n      gap: 2px;\n      font-family: inherit;\n    }\n    .menu-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      padding: 8px 10px;\n      border: none;\n      background: transparent;\n      color: var(--ngx-grid-text, #0f172a);\n      font-size: 12px;\n      font-weight: 500;\n      cursor: pointer;\n      text-align: left;\n      border-radius: 6px;\n      transition: all 0.15s ease;\n      font-family: inherit;\n      width: 100%;\n      box-sizing: border-box;\n      outline: none;\n    }\n    .menu-item:hover:not(:disabled) {\n      background: var(--ngx-grid-hover-bg, #f1f5f9);\n      color: var(--ngx-btn-primary-bg, #4f46e5);\n    }\n    .menu-item:disabled {\n      opacity: 0.4;\n      cursor: not-allowed;\n    }\n    .menu-icon {\n      font-size: 14px;\n      width: 16px;\n      text-align: center;\n    }\n    .menu-divider {\n      height: 1px;\n      background: var(--ngx-grid-border, #e2e8f0);\n      margin: 4px 6px;\n    }\n\n    /* Checkbox Custom Styling for Premium Look */\n    .grid-th-check input[type=\"checkbox\"],\n    .grid-td-check input[type=\"checkbox\"],\n    .checklist-item input[type=\"checkbox\"] {\n      appearance: none;\n      -webkit-appearance: none;\n      width: 16px;\n      height: 16px;\n      border: 1.5px solid var(--ngx-grid-border, #cbd5e1);\n      border-radius: 4px;\n      outline: none;\n      cursor: pointer;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--ngx-grid-bg, #ffffff);\n      transition: all 0.2s ease;\n      margin: 0;\n      position: relative;\n    }\n    .grid-th-check input[type=\"checkbox\"]:hover,\n    .grid-td-check input[type=\"checkbox\"]:hover,\n    .checklist-item input[type=\"checkbox\"]:hover {\n      border-color: var(--ngx-input-focus, #4f46e5);\n      box-shadow: 0 0 0 2.5px rgba(79, 70, 229, 0.15);\n    }\n    .grid-th-check input[type=\"checkbox\"]:checked,\n    .grid-td-check input[type=\"checkbox\"]:checked,\n    .checklist-item input[type=\"checkbox\"]:checked {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n    }\n    .grid-th-check input[type=\"checkbox\"]:checked::after,\n    .grid-td-check input[type=\"checkbox\"]:checked::after,\n    .checklist-item input[type=\"checkbox\"]:checked::after {\n      content: \"\";\n      display: block;\n      width: 4px;\n      height: 8px;\n      border: solid #ffffff;\n      border-width: 0 2px 2px 0;\n      transform: rotate(45deg);\n      margin-bottom: 2px;\n    }\n    .grid-th-check input[type=\"checkbox\"]:indeterminate {\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      border-color: var(--ngx-btn-primary-bg, #4f46e5);\n    }\n    .grid-th-check input[type=\"checkbox\"]:indeterminate::after {\n      content: \"\";\n      display: block;\n      width: 8px;\n      height: 2px;\n      background: #ffffff;\n    }\n    \n    /* Drag-and-Drop Grouping Panel Styles */\n    .grid-grouping-panel {\n      display: flex;\n      align-items: center;\n      padding: 10px 16px;\n      background: var(--ngx-grid-header-bg, #f8fafc);\n      border: 1.5px dashed var(--ngx-grid-border, #cbd5e1);\n      border-radius: 10px;\n      margin-bottom: 12px;\n      font-size: 12px;\n      color: var(--ngx-grid-text-secondary, #64748b);\n      transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n      min-height: 44px;\n      box-sizing: border-box;\n    }\n    .grid-grouping-panel.drag-over {\n      background: var(--ngx-grid-hover-bg, rgba(79, 70, 229, 0.05));\n      border-color: var(--ngx-input-focus, #4f46e5);\n      border-style: solid;\n      color: var(--ngx-input-focus, #4f46e5);\n    }\n    .grouping-panel-label {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      flex-wrap: wrap;\n    }\n    .group-chip {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      background: var(--ngx-btn-primary-bg, #4f46e5);\n      color: #ffffff;\n      padding: 3px 10px;\n      border-radius: 99px;\n      font-size: 11px;\n      font-weight: 700;\n      box-shadow: 0 2px 4px rgba(79, 70, 229, 0.15);\n    }\n    .remove-group-btn {\n      background: transparent;\n      border: none;\n      color: #ffffff;\n      font-size: 14px;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: 0;\n      line-height: 1;\n      opacity: 0.8;\n      transition: opacity 0.15s;\n    }\n    .remove-group-btn:hover {\n      opacity: 1;\n    }\n  `],\n})\nexport class DataGridComponent<T extends object = Record<string, unknown>> implements OnInit {\n  @ContentChildren(NgxGridCellTemplateDirective) cellTemplates!: QueryList<NgxGridCellTemplateDirective>;\n  @ContentChildren(NgxGridEditCellTemplateDirective) editCellTemplates!: QueryList<NgxGridEditCellTemplateDirective>;\n  @ContentChildren(NgxGridHeaderTemplateDirective) headerTemplates!: QueryList<NgxGridHeaderTemplateDirective>;\n  @ContentChildren(NgxGridFooterTemplateDirective) footerTemplates!: QueryList<NgxGridFooterTemplateDirective>;\n\n  /**\n   * The tabular dataset to render in the grid.\n   */\n  data = input<T[]>([]);\n\n  /**\n   * The column definition metadata specifying header labels, fields, sorting/filtering settings, and templates.\n   */\n  columns = input<GridColumnDef<T>[]>([]);\n\n  stateKey = input<string>('');\n  reorderable = input<boolean>(false);\n  multiSort = input<boolean>(false);\n  columnReorder = output<{ columns: GridColumnDef<T>[] }>();\n  rowReorderable = input<boolean>(false);\n  showGlobalSearch = input<boolean>(false);\n  globalSearchPlaceholder = input<string>('Search...');\n  rowReorder = output<{ previousIndex: number; currentIndex: number; data: T[] }>();\n\n  // Enterprise feature inputs & outputs\n  showStatusBar = input<boolean>(false);\n  showFilterBuilder = input<boolean>(false);\n  treeData = input<TreeDataConfig | null>(null);\n  pinnedTopRows = input<T[]>([]);\n  pinnedBottomRows = input<T[]>([]);\n  infiniteScroll = input<boolean>(false);\n  filterExpression = input<FilterExpression | null>(null);\n  filterExpressionChange = output<FilterExpression | null>();\n  infiniteScrollLoad = output<GridInfiniteScrollEvent>();\n\n  // Injected services\n  private xlsxExportService = inject(GridExportXlsxService);\n\n  // Filter builder state\n  isFilterBuilderOpen = signal<boolean>(false);\n  internalFilterExpression = signal<FilterExpression | null>(null);\n\n  /** Live selection aggregates for status bar */\n  selectionAggregates = computed<GridStatusBarAggregates>(() => {\n    const selectedText = this.getSelectedCellsText();\n    if (!selectedText) {\n      const selRows = this.selectedRows();\n      return { count: selRows.size, sum: null, average: null, min: null, max: null };\n    }\n    const numbers = selectedText.split(/[\\t\\n]/)\n      .map(str => str.trim())\n      .filter(str => str !== '' && !isNaN(Number(str)))\n      .map(str => Number(str));\n\n    const count = numbers.length;\n    if (count === 0) return { count: 0, sum: null, average: null, min: null, max: null };\n    const sum = numbers.reduce((a, b) => a + b, 0);\n    const average = sum / count;\n    const min = Math.min(...numbers);\n    const max = Math.max(...numbers);\n    return { count, sum, average, min, max };\n  });\n\n  onFilterExpressionChange(expr: FilterExpression | null): void {\n    this.internalFilterExpression.set(expr);\n    this.filterExpressionChange.emit(expr);\n  }\n\n  exportToXlsx(filename = 'grid-data.xlsx'): void {\n    this.xlsxExportService.exportToXlsx(\n      this.clientFilteredData(),\n      this.columns() as GridColumnDef<T>[],\n      filename,\n      { groupBy: this.internalGroupBy() }\n    );\n  }\n\n  /**\n   * Number of rows to render per page in paginated mode.\n   * @default 10\n   */\n  pageSize = input<number>(10);\n\n  /**\n   * The current active 1-indexed page number.\n   * @default 1\n   */\n  page = input<number>(1);\n\n  total = input<number>(0);\n\n  /**\n   * Whether row selection is enabled.\n   * @default false\n   */\n  selectable = input<boolean>(false);\n\n  striped = input<boolean>(true);\n  loading = input<boolean>(false);\n\n  /**\n   * Whether inline cell/row editing is enabled.\n   * @default false\n   */\n  editable = input<boolean>(false);\n\n  sortMode = input<'client' | 'server'>('client');\n  filterMode = input<'client' | 'server'>('client');\n  groupMode = input<'client' | 'server'>('client');\n  pagingMode = input<'client' | 'server'>('client');\n\n  groupBy = input<GridGroupState | null>(null);\n  groupedData = input<GridGroupResult<T>[]>([]);\n\n  headerTemplate = input<TemplateRef<GridHeaderTemplateContext<T>> | null>(null);\n  cellTemplate = input<TemplateRef<GridCellTemplateContext<T>> | null>(null);\n  editCellTemplate = input<TemplateRef<GridCellTemplateContext<T>> | null>(null);\n  rowTemplate = input<TemplateRef<GridRowTemplateContext<T>> | null>(null);\n  detailRowTemplate = input<TemplateRef<GridDetailTemplateContext<T>> | null>(null);\n  footerTemplate = input<TemplateRef<GridFooterTemplateContext<T>> | null>(null);\n\n  rowClick = output<GridRowClickEvent<T>>();\n  selectionChange = output<T[]>();\n  sortChange = output<GridSortChangeEvent>();\n  filterChange = output<GridFilterChangeEvent>();\n  groupChange = output<GridGroupChangeEvent>();\n  pageChange = output<GridPageChangeEvent>();\n  dataStateChange = output<GridDataStateChangeEvent>();\n  rowUpdate = output<GridRowUpdateEvent<T>>();\n\n  // New Enterprise Features\n  showColumnChooser = input<boolean>(false);\n  cellSelection = input<boolean>(false);\n  cellSelectionChange = output<{ start: { row: T; colField: string }; end: { row: T; colField: string } } | null>();\n  enableContextMenu = input<boolean>(false);\n  keyboardNavigation = input<boolean>(false);\n  groupAggregations = input<boolean>(false);\n  showGroupingPanel = input<boolean>(false);\n  rowClass = input<((row: T) => string) | null>(null);\n  compact = input<boolean>(false);\n\n  /**\n   * Whether to render only the visible rows using high-performance row virtualization.\n   * Useful when rendering large datasets (1,000+ items).\n   * @default false\n   */\n  virtualScroll = input<boolean>(false);\n\n  /**\n   * The height of each row in pixels. Required for virtual scrolling viewport calculations.\n   * @default 49\n   */\n  rowHeight = input<number>(49);\n\n  sortState = signal<GridSortState | null>(null);\n  currentPage = signal(1);\n  selectedRows = signal<Set<string>>(new Set());\n  expandedRows = signal<Set<string>>(new Set());\n  collapsedGroups = signal<Set<string>>(new Set());\n  editingRowKey = signal<string | null>(null);\n  editingDraft = signal<Record<string, unknown>>({});\n  internalPageSize = signal<number>(10);\n  internalGroupBy = signal<GridGroupState | null>(null);\n  isGroupingPanelDragOver = signal<boolean>(false);\n\n  scrollTop = signal<number>(0);\n  viewportHeight = signal<number>(400);\n\n  startIndex = computed(() => {\n    if (!this.virtualScroll()) return 0;\n    return Math.max(0, Math.floor(this.scrollTop() / this.rowHeight()) - 3);\n  });\n\n  endIndex = computed(() => {\n    const totalCount = this.flatRenderedRows().length;\n    if (!this.virtualScroll()) return totalCount;\n    return Math.min(totalCount, Math.ceil((this.scrollTop() + this.viewportHeight()) / this.rowHeight()) + 3);\n  });\n\n  visibleRows = computed(() => {\n    const rendered = this.flatRenderedRows();\n    if (!this.virtualScroll()) return rendered;\n    return rendered.slice(this.startIndex(), this.endIndex());\n  });\n  \n  // Enterprise Extensions\n  i18n = inject(NGX_CORE_I18N);\n  private elementRef = inject(ElementRef);\n  destroyRef = inject(DestroyRef);\n  private gridExportService = inject(GridExportService);\n  columnWidths = signal<Record<string, number>>({});\n  filterStates = signal<Map<string, GridFilterState>>(new Map());\n  sortStates = signal<GridSortState[]>([]);\n  columnOrder = signal<string[]>([]);\n  \n  // Column Chooser state\n  hiddenColumns = signal<Set<string>>(new Set());\n  activeColumnChooserPopover = signal<{ top: number; left: number } | null>(null);\n\n  // Cell Selection state\n  selectedCellStart = signal<{ row: T; colField: string } | null>(null);\n  selectedCellEnd = signal<{ row: T; colField: string } | null>(null);\n  isCellDragging = signal<boolean>(false);\n\n  // Context Menu state\n  activeContextMenu = signal<{ x: number; y: number; row: T | null; colField: string | null } | null>(null);\n  columnPinnedOverrides = signal<Record<string, 'left' | 'right' | null>>({});\n\n  // Keyboard Navigation state\n  focusedCell = signal<{ row: T; colField: string } | null>(null);\n  focusedCellEditActive = signal<boolean>(false);\n\n  // Drag and drop state\n  draggingField = signal<string | null>(null);\n  dragOverField = signal<string | null>(null);\n  draggingRowIndex = signal<number | null>(null);\n  dragOverRowIndex = signal<number | null>(null);\n  \n  // Resizing state\n  private resizeStartWidth = 0;\n  private resizeStartX = 0;\n  private resizingField: string | null = null;\n  private isInitialPageSync = true;\n\n  // Filter Popover state\n  activeFilterPopover = signal<{ field: string; top: number; left: number } | null>(null);\n  tempFilterValue = signal<string>('');\n  tempFilterOperator = signal<'contains' | 'startsWith' | 'endsWith' | 'eq'>('contains');\n  tempSelectedValues = signal<Set<string>>(new Set());\n  filterSearchQuery = signal<string>('');\n\n  // Global search state\n  searchText = signal<string>('');\n\n  constructor() {\n    effect(() => {\n      const externalPage = this.page();\n      const current = untracked(() => this.currentPage());\n      if (this.isInitialPageSync) {\n        this.isInitialPageSync = false;\n        if (this.stateKey()) {\n          return;\n        }\n      }\n      if (externalPage > 0 && externalPage !== current) {\n        untracked(() => this.currentPage.set(externalPage));\n      }\n    });\n\n    effect(() => {\n      const max = this.totalPages();\n      if (this.currentPage() > max) {\n        this.currentPage.set(max);\n      }\n    });\n\n    effect(() => {\n      const externalPageSize = this.pageSize();\n      untracked(() => this.internalPageSize.set(externalPageSize));\n    });\n\n    effect(() => {\n      const externalGroupBy = this.groupBy();\n      untracked(() => this.internalGroupBy.set(externalGroupBy));\n    });\n\n    effect(() => {\n      const states = this.sortStates();\n      const current = untracked(() => this.sortState());\n      const first = states.length > 0 ? states[0] : null;\n      if (JSON.stringify(first) !== JSON.stringify(current)) {\n        untracked(() => this.sortState.set(first));\n      }\n    });\n\n    effect(() => {\n      const single = this.sortState();\n      const current = untracked(() => this.sortStates());\n      const first = current.length > 0 ? current[0] : null;\n      if (JSON.stringify(single) !== JSON.stringify(first)) {\n        untracked(() => this.sortStates.set(single ? [single] : []));\n      }\n    });\n\n    // Initialize hidden columns from definitions\n    effect(() => {\n      const cols = this.columns();\n      untracked(() => {\n        const currentHidden = this.hiddenColumns();\n        if (currentHidden.size === 0 && !this.stateKey()) {\n          const initialHidden = new Set<string>();\n          cols.forEach(c => {\n            if (c.hidden) {\n              initialHidden.add(c.field);\n            }\n          });\n          if (initialHidden.size > 0) {\n            this.hiddenColumns.set(initialHidden);\n          }\n        }\n      });\n    }, { allowSignalWrites: true });\n\n    effect(() => {\n      const key = this.stateKey();\n      if (!key || typeof window === 'undefined' || typeof localStorage === 'undefined') {\n        return;\n      }\n      const state = {\n        columnWidths: this.columnWidths(),\n        sortState: this.sortState(),\n        sortStates: this.sortStates(),\n        columnOrder: this.columnOrder(),\n        currentPage: this.currentPage(),\n        filters: Array.from(this.filterStates().values()),\n        searchText: this.searchText(),\n        hiddenColumns: Array.from(this.hiddenColumns()),\n        columnPinnedOverrides: this.columnPinnedOverrides()\n      };\n      try {\n        localStorage.setItem(`ngx_grid_state_${key}`, JSON.stringify(state));\n      } catch (e) {\n        console.warn('Failed to save grid state to localStorage', e);\n      }\n    });\n\n    // Window event listeners for closing popovers and copy behavior\n    if (typeof window !== 'undefined') {\n      const clickListener = () => {\n        this.activeFilterPopover.set(null);\n        this.activeColumnChooserPopover.set(null);\n        this.activeContextMenu.set(null);\n      };\n      const mouseUpListener = () => {\n        if (this.isCellDragging()) {\n          this.isCellDragging.set(false);\n        }\n      };\n      const keydownListener = (e: KeyboardEvent) => {\n        if (e.key === 'Escape') {\n          this.activeFilterPopover.set(null);\n          this.activeColumnChooserPopover.set(null);\n          this.activeContextMenu.set(null);\n        }\n        if (!this.cellSelection()) return;\n        if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'c') {\n          const start = this.selectedCellStart();\n          const end = this.selectedCellEnd();\n          if (!start || !end) return;\n\n          const text = this.getSelectedCellsText();\n          if (text) {\n            e.preventDefault();\n            navigator.clipboard.writeText(text).catch(err => {\n              console.error('Failed to copy grid cell range to clipboard', err);\n            });\n          }\n        }\n      };\n\n      window.addEventListener('click', clickListener);\n      window.addEventListener('mouseup', mouseUpListener);\n      window.addEventListener('keydown', keydownListener);\n\n      this.destroyRef.onDestroy(() => {\n        window.removeEventListener('click', clickListener);\n        window.removeEventListener('mouseup', mouseUpListener);\n        window.removeEventListener('keydown', keydownListener);\n      });\n    }\n  }\n\n  ngOnInit(): void {\n    this.internalPageSize.set(this.pageSize());\n    this.internalGroupBy.set(this.groupBy());\n    this.loadState();\n  }\n\n  private loadState(): void {\n    const key = this.stateKey();\n    if (!key || typeof window === 'undefined' || typeof localStorage === 'undefined') {\n      return;\n    }\n    try {\n      const saved = localStorage.getItem(`ngx_grid_state_${key}`);\n      if (saved) {\n        const state = JSON.parse(saved);\n        if (state.columnWidths) {\n          this.columnWidths.set(state.columnWidths);\n        }\n        if (state.columnOrder) {\n          this.columnOrder.set(state.columnOrder);\n        }\n        if (state.sortStates) {\n          this.sortStates.set(state.sortStates);\n          this.sortState.set(state.sortStates.length > 0 ? state.sortStates[0] : null);\n        } else if (state.sortState !== undefined) {\n          this.sortState.set(state.sortState);\n          this.sortStates.set(state.sortState ? [state.sortState] : []);\n        }\n        if (state.currentPage !== undefined) {\n          this.currentPage.set(state.currentPage);\n        }\n        if (state.filters) {\n          const map = new Map<string, GridFilterState>();\n          (state.filters as GridFilterState[]).forEach((f: GridFilterState) => {\n            map.set(f.field, f);\n          });\n          this.filterStates.set(map);\n        }\n        if (state.searchText !== undefined) {\n          this.searchText.set(state.searchText);\n        }\n        if (state.hiddenColumns) {\n          this.hiddenColumns.set(new Set(state.hiddenColumns));\n        }\n        if (state.columnPinnedOverrides) {\n          this.columnPinnedOverrides.set(state.columnPinnedOverrides);\n        }\n      }\n    } catch (e) {\n      console.warn('Failed to load grid state from localStorage', e);\n    }\n  }\n\n  orderedColumns = computed(() => {\n    const cols = this.columns();\n    const order = this.columnOrder();\n    const hidden = this.hiddenColumns();\n    const pinOverrides = this.columnPinnedOverrides();\n    \n    let mapped = cols\n      .filter(c => !hidden.has(c.field))\n      .map(c => {\n        const pinOverride = pinOverrides[c.field];\n        if (pinOverride !== undefined) {\n          return { ...c, pinned: pinOverride === null ? undefined : pinOverride };\n        }\n        return c;\n      });\n\n    if (order.length > 0) {\n      mapped.sort((a, b) => {\n        const idxA = order.indexOf(a.field);\n        const idxB = order.indexOf(b.field);\n        if (idxA === -1 && idxB === -1) return 0;\n        if (idxA === -1) return 1;\n        if (idxB === -1) return -1;\n        return idxA - idxB;\n      });\n    }\n    \n    const pinnedLeft = mapped.filter(c => c.pinned === 'left');\n    const pinnedRight = mapped.filter(c => c.pinned === 'right');\n    const normal = mapped.filter(c => c.pinned !== 'left' && c.pinned !== 'right');\n    return [...pinnedLeft, ...normal, ...pinnedRight];\n  });\n\n  hasPinnedColumns = computed(() => this.orderedColumns().some(c => c.pinned === 'left' || c.pinned === 'right'));\n\n  lastPinnedColumnField = computed(() => {\n    const pinned = this.orderedColumns().filter(c => c.pinned === 'left');\n    return pinned.length > 0 ? pinned[pinned.length - 1].field : null;\n  });\n\n  isSelectableLastPinned = computed(() => {\n    const hasPinnedCols = this.orderedColumns().some(c => c.pinned === 'left');\n    return this.selectable() && !hasPinnedCols;\n  });\n\n  isDetailToggleLastPinned = computed(() => {\n    const hasPinnedCols = this.orderedColumns().some(c => c.pinned === 'left');\n    return this.showDetailToggle() && !this.selectable() && !hasPinnedCols;\n  });\n\n  isRowReorderableLastPinned = computed(() => {\n    const hasPinnedCols = this.orderedColumns().some(c => c.pinned === 'left');\n    return this.rowReorderable() && !this.showDetailToggle() && !this.selectable() && !hasPinnedCols;\n  });\n\n  firstPinnedRightColumnField = computed(() => {\n    const pinned = this.orderedColumns().filter(c => c.pinned === 'right');\n    return pinned.length > 0 ? pinned[0].field : null;\n  });\n\n  columnRightOffsets = computed(() => {\n    const offsets: Record<string, number> = {};\n    let currentOffset = 0;\n    \n    if (this.editable()) {\n      offsets['__actions'] = currentOffset;\n      currentOffset += 120;\n    }\n    \n    const cols = this.orderedColumns();\n    for (let i = cols.length - 1; i >= 0; i--) {\n      const col = cols[i];\n      if (col.pinned === 'right') {\n        offsets[col.field] = currentOffset;\n        currentOffset += this.getColumnWidth(col) ?? 120;\n      }\n    }\n    return offsets;\n  });\n\n  columnOffsets = computed(() => {\n    const offsets: Record<string, number> = {};\n    let currentOffset = 0;\n    \n    if (this.rowReorderable()) {\n      currentOffset += 44;\n    }\n    if (this.showDetailToggle()) {\n      currentOffset += 44;\n    }\n    if (this.selectable()) {\n      currentOffset += 44;\n    }\n    \n    const cols = this.orderedColumns();\n    for (const col of cols) {\n      if (col.pinned === 'left') {\n        offsets[col.field] = currentOffset;\n        currentOffset += this.getColumnWidth(col) ?? 120;\n      }\n    }\n    return offsets;\n  });\n\n  hasColumnCategories = computed(() => {\n    return this.orderedColumns().some(c => !!c.category);\n  });\n\n  headerRows = computed(() => {\n    const cols = this.orderedColumns();\n    const hasCat = this.hasColumnCategories();\n    if (!hasCat) {\n      return {\n        row1: cols.map(c => ({\n          title: c.title,\n          column: c,\n          colSpan: 1,\n          rowSpan: 1,\n          isCategory: false,\n          field: c.field,\n          pinned: c.pinned,\n          leftOffset: c.pinned === 'left' ? this.columnOffsets()[c.field] : null,\n          rightOffset: c.pinned === 'right' ? this.columnRightOffsets()[c.field] : null,\n          isPinnedLast: c.pinned === 'left' && this.lastPinnedColumnField() === c.field,\n          isPinnedFirst: c.pinned === 'right' && this.firstPinnedRightColumnField() === c.field\n        })),\n        row2: [] as any[]\n      };\n    }\n\n    const row1: any[] = [];\n    const row2: any[] = [];\n\n    let i = 0;\n    while (i < cols.length) {\n      const col = cols[i];\n      if (!col.category) {\n        row1.push({\n          title: col.title,\n          column: col,\n          colSpan: 1,\n          rowSpan: 2,\n          isCategory: false,\n          field: col.field,\n          pinned: col.pinned,\n          leftOffset: col.pinned === 'left' ? this.columnOffsets()[col.field] : null,\n          rightOffset: col.pinned === 'right' ? this.columnRightOffsets()[col.field] : null,\n          isPinnedLast: col.pinned === 'left' && this.lastPinnedColumnField() === col.field,\n          isPinnedFirst: col.pinned === 'right' && this.firstPinnedRightColumnField() === col.field\n        });\n        i++;\n      } else {\n        const cat = col.category;\n        const startIdx = i;\n        while (i < cols.length && cols[i].category === cat && cols[i].pinned === col.pinned) {\n          const currentCol = cols[i];\n          row2.push({\n            title: currentCol.title,\n            column: currentCol,\n            colSpan: 1,\n            rowSpan: 1,\n            isCategory: false,\n            field: currentCol.field,\n            pinned: currentCol.pinned,\n            leftOffset: currentCol.pinned === 'left' ? this.columnOffsets()[currentCol.field] : null,\n            rightOffset: currentCol.pinned === 'right' ? this.columnRightOffsets()[currentCol.field] : null,\n            isPinnedLast: currentCol.pinned === 'left' && this.lastPinnedColumnField() === currentCol.field,\n            isPinnedFirst: currentCol.pinned === 'right' && this.firstPinnedRightColumnField() === currentCol.field\n          });\n          i++;\n        }\n        const groupCount = i - startIdx;\n        const lastColInGroup = cols[i - 1];\n        row1.push({\n          title: cat,\n          colSpan: groupCount,\n          rowSpan: 1,\n          isCategory: true,\n          pinned: col.pinned,\n          leftOffset: col.pinned === 'left' ? this.columnOffsets()[col.field] : null,\n          rightOffset: col.pinned === 'right' ? this.columnRightOffsets()[lastColInGroup.field] : null,\n          isPinnedLast: col.pinned === 'left' && this.lastPinnedColumnField() === lastColInGroup.field,\n          isPinnedFirst: col.pinned === 'right' && this.firstPinnedRightColumnField() === col.field,\n          field: `__cat_${cat}_${startIdx}`\n        });\n      }\n    }\n\n    return { row1, row2 };\n  });\n\n  hasFilterableColumns = computed(() => this.columns().some(column => column.filterable));\n  isAnyServerMode = computed(() =>\n    this.sortMode() === 'server' ||\n    this.filterMode() === 'server' ||\n    this.groupMode() === 'server' ||\n    this.pagingMode() === 'server'\n  );\n  showDetailToggle = computed(() => this.detailRowTemplate() !== null);\n\n  activeFilters = computed<GridFilterState[]>(() =>\n    Array.from(this.filterStates().values())\n  );\n\n  private clientFilteredData = computed(() => {\n    if (this.filterMode() !== 'client') {\n      return this.data();\n    }\n\n    let rows = this.data() as T[];\n    for (const filter of this.activeFilters()) {\n      if (filter.operator === 'in') {\n        const selected = filter.selectedValues ?? [];\n        if (selected.length > 0) {\n          rows = rows.filter(row => {\n            const cellVal = String((row as Record<string, unknown>)[filter.field] ?? '');\n            const displayVal = cellVal === '' || cellVal == null ? '(Blank)' : cellVal;\n            return selected.includes(displayVal);\n          });\n        }\n      } else {\n        if (!filter.value) {\n          continue;\n        }\n        const query = filter.value.toLowerCase();\n        const operator = filter.operator ?? 'contains';\n        rows = rows.filter(row => {\n          const cellVal = String((row as Record<string, unknown>)[filter.field] ?? '').toLowerCase();\n          if (operator === 'eq') return cellVal === query;\n          if (operator === 'startsWith') return cellVal.startsWith(query);\n          if (operator === 'endsWith') return cellVal.endsWith(query);\n          return cellVal.includes(query); // contains\n        });\n      }\n    }\n    const searchVal = this.searchText().trim().toLowerCase();\n    if (searchVal) {\n      const cols = this.orderedColumns();\n      rows = rows.filter(row => {\n        return cols.some(col => {\n          const cellVal = String((row as Record<string, unknown>)[col.field] ?? '').toLowerCase();\n          return cellVal.includes(searchVal);\n        });\n      });\n    }\n    return rows;\n  });\n\n  private clientSortedData = computed(() => {\n    const rows = this.clientFilteredData();\n    if (this.sortMode() !== 'client') {\n      return rows;\n    }\n\n    const activeSorts = this.sortStates();\n    if (activeSorts.length === 0) {\n      return rows;\n    }\n\n    return [...rows].sort((left, right) => {\n      for (const state of activeSorts) {\n        const leftValue = (left as Record<string, unknown>)[state.field];\n        const rightValue = (right as Record<string, unknown>)[state.field];\n        const compared = this.compareValues(leftValue, rightValue);\n        if (compared !== 0) {\n          return state.dir === 'asc' ? compared : -compared;\n        }\n      }\n      return 0;\n    });\n  });\n\n  private baseFlatData = computed(() => {\n    if (this.sortMode() === 'server' || this.filterMode() === 'server') {\n      return this.data();\n    }\n    return this.clientSortedData();\n  });\n\n  totalItems = computed(() => {\n    if (this.pagingMode() === 'server') {\n      return this.total() > 0 ? this.total() : this.data().length;\n    }\n    return this.baseFlatData().length;\n  });\n\n  totalPages = computed(() => {\n    const pageSize = Math.max(1, this.internalPageSize());\n    return Math.max(1, Math.ceil(this.totalItems() / pageSize));\n  });\n\n  flatRenderedRows = computed(() => {\n    if (this.hasGrouping()) {\n      return [] as T[];\n    }\n\n    if (this.pagingMode() === 'server') {\n      return this.data();\n    }\n\n    const pageSize = Math.max(1, this.internalPageSize());\n    const start = (this.currentPage() - 1) * pageSize;\n    return this.baseFlatData().slice(start, start + pageSize);\n  });\n\n  groupedRows = computed(() => {\n    if (!this.hasGrouping()) {\n      return [] as GridGroupResult<T>[];\n    }\n\n    if (this.groupMode() === 'server') {\n      return this.groupedData();\n    }\n\n    const group = this.internalGroupBy();\n    if (!group) {\n      return [];\n    }\n\n    const source = this.pagingMode() === 'server'\n      ? this.data()\n      : this.paginateRows(this.baseFlatData());\n\n    const map = new Map<string, GridGroupResult<T>>();\n    for (const row of source) {\n      const value = (row as Record<string, unknown>)[group.field];\n      const key = String(value ?? '(empty)');\n      const existing = map.get(key);\n      if (existing) {\n        existing.items.push(row);\n        existing.count += 1;\n      } else {\n        map.set(key, { key, value, field: group.field, count: 1, items: [row] });\n      }\n    }\n\n    const groups = Array.from(map.values());\n    groups.sort((a, b) => {\n      const compared = this.compareValues(a.value, b.value);\n      return (group.dir ?? 'asc') === 'asc' ? compared : -compared;\n    });\n\n    return groups;\n  });\n\n  allSelected = computed(() => {\n    const rows = this.visibleSelectionRows();\n    if (rows.length === 0) {\n      return false;\n    }\n    const selected = this.selectedRows();\n    return rows.every(row => selected.has(this.keyOf(row)));\n  });\n\n  someSelected = computed(() => {\n    const rows = this.visibleSelectionRows();\n    const selected = this.selectedRows();\n    return rows.some(row => selected.has(this.keyOf(row)));\n  });\n\n  pagerRangeStart = computed(() => {\n    if (this.totalItems() === 0) {\n      return 0;\n    }\n    return (this.currentPage() - 1) * this.internalPageSize() + 1;\n  });\n\n  pagerRangeEnd = computed(() => {\n    if (this.totalItems() === 0) {\n      return 0;\n    }\n    return Math.min(this.currentPage() * this.internalPageSize(), this.totalItems());\n  });\n\n  pageNumbers = computed(() => {\n    const total = this.totalPages();\n    const current = this.currentPage();\n    const pages: number[] = [];\n    const from = Math.max(1, current - 2);\n    const to = Math.min(total, current + 2);\n    for (let page = from; page <= to; page += 1) {\n      pages.push(page);\n    }\n    return pages;\n  });\n\n  renderColumnCount = computed(() =>\n    this.orderedColumns().length +\n    (this.selectable() ? 1 : 0) +\n    (this.showDetailToggle() ? 1 : 0) +\n    (this.rowReorderable() ? 1 : 0) +\n    (this.editable() ? 1 : 0)\n  );\n\n  showPager = computed(() => this.totalItems() > 0);\n\n  renderedRowsList = computed(() => {\n    if (this.hasGrouping()) {\n      const list: T[] = [];\n      this.groupedRows().forEach(group => {\n        if (!this.isGroupCollapsed(group.key)) {\n          list.push(...group.items);\n        }\n      });\n      return list;\n    }\n    return this.flatRenderedRows();\n  });\n\n  isCellSelected(row: T, colField: string): boolean {\n    const start = this.selectedCellStart();\n    const end = this.selectedCellEnd();\n    if (!start || !end) return false;\n\n    const rows = this.renderedRowsList();\n    const cols = this.orderedColumns();\n\n    const startRowIndex = rows.indexOf(start.row);\n    const endRowIndex = rows.indexOf(end.row);\n    const rowIndex = rows.indexOf(row);\n\n    const startColIndex = cols.findIndex(c => c.field === start.colField);\n    const endColIndex = cols.findIndex(c => c.field === end.colField);\n    const colIndex = cols.findIndex(c => c.field === colField);\n\n    if (startRowIndex === -1 || endRowIndex === -1 || rowIndex === -1 ||\n        startColIndex === -1 || endColIndex === -1 || colIndex === -1) {\n      return false;\n    }\n\n    const minRow = Math.min(startRowIndex, endRowIndex);\n    const maxRow = Math.max(startRowIndex, endRowIndex);\n    const minCol = Math.min(startColIndex, endColIndex);\n    const maxCol = Math.max(startColIndex, endColIndex);\n\n    return rowIndex >= minRow && rowIndex <= maxRow && colIndex >= minCol && colIndex <= maxCol;\n  }\n\n  onCellContextMenu(event: MouseEvent, row: T, colField: string): void {\n    if (!this.enableContextMenu()) return;\n    event.preventDefault();\n    event.stopPropagation();\n\n    const gridEl = this.elementRef.nativeElement.querySelector('.ngx-data-grid') as HTMLElement;\n    const gridRect = gridEl.getBoundingClientRect();\n\n    const x = event.clientX - gridRect.left;\n    const y = event.clientY - gridRect.top;\n\n    this.activeFilterPopover.set(null);\n    this.activeColumnChooserPopover.set(null);\n\n    this.activeContextMenu.set({\n      x: Math.min(x, gridRect.width - 190),\n      y: y,\n      row,\n      colField\n    });\n  }\n\n  isColumnPinned(field: string | null): boolean {\n    if (!field) return false;\n    const pinOverride = this.columnPinnedOverrides()[field];\n    if (pinOverride !== undefined) {\n      return pinOverride === 'left';\n    }\n    const col = this.columns().find(c => c.field === field);\n    return col?.pinned === 'left';\n  }\n\n  contextMenuTogglePin(field: string | null): void {\n    if (!field) return;\n    const currentlyPinned = this.isColumnPinned(field);\n    const overrides = { ...this.columnPinnedOverrides() };\n    overrides[field] = currentlyPinned ? null : 'left';\n    this.columnPinnedOverrides.set(overrides);\n    this.activeContextMenu.set(null);\n  }\n\n  contextMenuHideColumn(field: string | null): void {\n    if (field) {\n      this.toggleColumnVisibility(field);\n    }\n    this.activeContextMenu.set(null);\n  }\n\n  contextMenuClearFilters(): void {\n    this.filterStates.set(new Map());\n    this.currentPage.set(1);\n    this.filterChange.emit({ filters: [] });\n    this.emitDataState();\n    this.activeContextMenu.set(null);\n  }\n\n  contextMenuCopy(): void {\n    const text = this.getSelectedCellsText();\n    if (text) {\n      navigator.clipboard.writeText(text).catch(err => {\n        console.error('Failed to copy to clipboard', err);\n      });\n    }\n    this.activeContextMenu.set(null);\n  }\n\n  onCellMouseDown(event: MouseEvent, row: T, colField: string): void {\n    if (!this.cellSelection()) return;\n    if (event.button !== 0) return;\n\n    const target = event.target as HTMLElement;\n    if (target && (target.closest('.grid-edit-input') || target.closest('.action-btn') || target.closest('.toggle-btn') || target.closest('input[type=\"checkbox\"]'))) {\n      return;\n    }\n\n    event.preventDefault();\n    \n    this.selectedCellStart.set({ row, colField });\n    this.selectedCellEnd.set({ row, colField });\n    this.isCellDragging.set(true);\n\n    this.cellSelectionChange.emit({\n      start: { row, colField },\n      end: { row, colField }\n    });\n  }\n\n  onCellMouseEnter(row: T, colField: string): void {\n    if (!this.cellSelection() || !this.isCellDragging()) return;\n\n    this.selectedCellEnd.set({ row, colField });\n\n    const start = this.selectedCellStart();\n    if (start) {\n      this.cellSelectionChange.emit({\n        start,\n        end: { row, colField }\n      });\n    }\n  }\n\n  openColumnChooser(event: MouseEvent): void {\n    event.stopPropagation();\n    if (this.activeColumnChooserPopover()) {\n      this.activeColumnChooserPopover.set(null);\n      return;\n    }\n\n    this.activeFilterPopover.set(null);\n\n    const buttonEl = event.currentTarget as HTMLElement;\n    const gridEl = this.elementRef.nativeElement.querySelector('.ngx-data-grid') as HTMLElement;\n    const buttonRect = buttonEl.getBoundingClientRect();\n    const gridRect = gridEl.getBoundingClientRect();\n\n    const top = buttonRect.bottom - gridRect.top;\n    const left = buttonRect.left - gridRect.left;\n\n    this.activeColumnChooserPopover.set({\n      top,\n      left: Math.min(left, gridRect.width - 260)\n    });\n  }\n\n  toggleColumnVisibility(field: string): void {\n    const hidden = new Set(this.hiddenColumns());\n    if (hidden.has(field)) {\n      hidden.delete(field);\n    } else {\n      if (hidden.size < this.columns().length - 1) {\n        hidden.add(field);\n      }\n    }\n    this.hiddenColumns.set(hidden);\n  }\n\n  getSelectedCellsText(): string | null {\n    const start = this.selectedCellStart();\n    const end = this.selectedCellEnd();\n    if (!start || !end) return null;\n\n    const rows = this.renderedRowsList();\n    const cols = this.orderedColumns();\n\n    const startRowIndex = rows.indexOf(start.row);\n    const endRowIndex = rows.indexOf(end.row);\n\n    const startColIndex = cols.findIndex(c => c.field === start.colField);\n    const endColIndex = cols.findIndex(c => c.field === end.colField);\n\n    if (startRowIndex === -1 || endRowIndex === -1 || startColIndex === -1 || endColIndex === -1) {\n      return null;\n    }\n\n    const minRow = Math.min(startRowIndex, endRowIndex);\n    const maxRow = Math.max(startRowIndex, endRowIndex);\n    const minCol = Math.min(startColIndex, endColIndex);\n    const maxCol = Math.max(startColIndex, endColIndex);\n\n    const selectedCols = cols.slice(minCol, maxCol + 1);\n\n    const textLines: string[] = [];\n    for (let r = minRow; r <= maxRow; r++) {\n      if (r >= 0 && r < rows.length) {\n        const rowData = rows[r];\n        const rowValues = selectedCols.map(col => {\n          const val = this.getCellValue(rowData, col.field);\n          return val !== null && val !== undefined ? String(val) : '';\n        });\n        textLines.push(rowValues.join('\\t'));\n      }\n    }\n\n    return textLines.join('\\n');\n  }\n\n  getFilter(field: string): string {\n    return this.filterStates().get(field)?.value ?? '';\n  }\n\n  exportToJson(): void {\n    this.gridExportService.exportToJson(this.baseFlatData());\n  }\n\n  exportToCsv(): void {\n    this.gridExportService.exportToCsv(this.baseFlatData(), this.orderedColumns(), 'grid-data.csv', this.internalGroupBy());\n  }\n\n  exportToExcel(): void {\n    this.gridExportService.exportToExcel(this.baseFlatData(), this.orderedColumns(), 'grid-data.xls', this.internalGroupBy());\n  }\n\n  exportToPdf(): void {\n    this.gridExportService.exportToPdf(this.baseFlatData(), this.orderedColumns(), 'Data Grid Export', this.internalGroupBy());\n  }\n\n  setFilter(field: string, value: string): void {\n    const nextStates = new Map(this.filterStates());\n    if (value) {\n      nextStates.set(field, { field, value, operator: 'contains' });\n    } else {\n      nextStates.delete(field);\n    }\n\n    this.filterStates.set(nextStates);\n    this.currentPage.set(1);\n\n    const filters = this.activeFilters();\n    this.filterChange.emit({ filters });\n    this.emitDataState();\n  }\n\n  getColumnWidth(col: GridColumnDef<T>): number | undefined {\n    return this.columnWidths()[col.field] ?? col.width;\n  }\n\n  onResizeStart(event: MouseEvent, col: GridColumnDef<T>): void {\n    event.stopPropagation();\n    event.preventDefault();\n    this.resizingField = col.field;\n    this.resizeStartX = event.clientX;\n    this.resizeStartWidth = this.columnWidths()[col.field] ?? col.width ?? 120;\n\n    const onMouseMove = (moveEvent: MouseEvent) => {\n      if (!this.resizingField) return;\n      const deltaX = moveEvent.clientX - this.resizeStartX;\n      const newWidth = Math.max(50, this.resizeStartWidth + deltaX);\n      this.columnWidths.update(widths => ({\n        ...widths,\n        [this.resizingField!]: newWidth\n      }));\n    };\n\n    const onMouseUp = () => {\n      this.resizingField = null;\n      window.removeEventListener('mousemove', onMouseMove);\n      window.removeEventListener('mouseup', onMouseUp);\n    };\n\n    window.addEventListener('mousemove', onMouseMove);\n    window.addEventListener('mouseup', onMouseUp);\n  }\n\n  onResizeDoubleClick(event: MouseEvent, col: GridColumnDef<T>): void {\n    event.stopPropagation();\n    event.preventDefault();\n    this.autoSizeColumn(col);\n  }\n\n  autoSizeColumn(col: GridColumnDef<T>): void {\n    const colField = col.field;\n    let longestText = '';\n\n    if (col.title && col.title.length > longestText.length) {\n      longestText = col.title;\n    }\n\n    const rows = this.clientFilteredData();\n    for (const row of rows) {\n      const val = this.getCellValue(row, colField);\n      const strVal = val != null ? String(val) : '';\n      if (strVal.length > longestText.length) {\n        longestText = strVal;\n      }\n    }\n\n    const padding = col.filterable ? 44 : 24;\n    const computedWidth = Math.max(60, Math.min(600, longestText.length * 8 + padding));\n\n    this.columnWidths.update(widths => ({\n      ...widths,\n      [colField]: computedWidth\n    }));\n  }\n\n  getColumnPinnedState(field: string): 'left' | 'right' | null {\n    const override = this.columnPinnedOverrides()[field];\n    if (override !== undefined) {\n      return override;\n    }\n    const col = this.columns().find(c => c.field === field);\n    return col?.pinned ?? null;\n  }\n\n  pinColumnPopover(field: string, pin: 'left' | 'right' | null): void {\n    const nextOverrides = { ...this.columnPinnedOverrides(), [field]: pin };\n    this.columnPinnedOverrides.set(nextOverrides);\n  }\n\n  getRowCustomClass(row: T): string {\n    const fn = this.rowClass();\n    return fn ? fn(row) : '';\n  }\n\n  openFilterPopover(event: MouseEvent, field: string): void {\n    event.stopPropagation();\n    if (this.activeFilterPopover()?.field === field) {\n      this.activeFilterPopover.set(null);\n      return;\n    }\n\n    this.filterSearchQuery.set('');\n\n    const current = this.filterStates().get(field);\n    this.tempFilterValue.set(current?.value ?? '');\n    this.tempFilterOperator.set(\n      (current?.operator === 'in' ? 'contains' : current?.operator) ?? 'contains'\n    );\n\n    const distinct = this.getDistinctValues(field);\n    if (current?.selectedValues) {\n      this.tempSelectedValues.set(new Set(current.selectedValues));\n    } else {\n      this.tempSelectedValues.set(new Set(distinct));\n    }\n\n    const buttonEl = event.currentTarget as HTMLElement;\n    const gridEl = this.elementRef.nativeElement.querySelector('.ngx-data-grid') as HTMLElement;\n    const buttonRect = buttonEl.getBoundingClientRect();\n    const gridRect = gridEl.getBoundingClientRect();\n\n    const top = buttonRect.bottom - gridRect.top;\n    const left = buttonRect.left - gridRect.left;\n\n    this.activeFilterPopover.set({\n      field,\n      top,\n      left: Math.min(left, gridRect.width - 260)\n    });\n  }\n\n  getDistinctValues(field: string): string[] {\n    const vals = new Set<string>();\n    this.data().forEach(row => {\n      const val = (row as Record<string, unknown>)[field];\n      vals.add(val == null || val === '' ? '(Blank)' : String(val));\n    });\n    return Array.from(vals).sort();\n  }\n\n  getFilteredDistinctValues(field: string): string[] {\n    const distinct = this.getDistinctValues(field);\n    const search = this.filterSearchQuery().trim().toLowerCase();\n    if (!search) return distinct;\n    return distinct.filter(v => v.toLowerCase().includes(search));\n  }\n\n  toggleChecklistItem(val: string): void {\n    const next = new Set(this.tempSelectedValues());\n    if (next.has(val)) {\n      next.delete(val);\n    } else {\n      next.add(val);\n    }\n    this.tempSelectedValues.set(next);\n  }\n\n  toggleSelectAllChecklist(): void {\n    const pop = this.activeFilterPopover();\n    if (!pop) return;\n    const distinct = this.getFilteredDistinctValues(pop.field);\n    const current = new Set(this.tempSelectedValues());\n    const allSelected = distinct.every(val => current.has(val));\n    \n    if (allSelected) {\n      distinct.forEach(val => current.delete(val));\n    } else {\n      distinct.forEach(val => current.add(val));\n    }\n    this.tempSelectedValues.set(current);\n  }\n\n  applyPopoverFilter(): void {\n    const pop = this.activeFilterPopover();\n    if (!pop) return;\n\n    const field = pop.field;\n    const distinct = this.getDistinctValues(field);\n    const selected = this.tempSelectedValues();\n\n    let filterState: GridFilterState | null = null;\n\n    if (this.tempFilterValue()) {\n      filterState = {\n        field,\n        value: this.tempFilterValue(),\n        operator: this.tempFilterOperator()\n      };\n    } else if (selected.size < distinct.length) {\n      filterState = {\n        field,\n        value: '',\n        operator: 'in',\n        selectedValues: Array.from(selected)\n      };\n    }\n\n    const nextStates = new Map(this.filterStates());\n    if (filterState) {\n      nextStates.set(field, filterState);\n    } else {\n      nextStates.delete(field);\n    }\n\n    this.filterStates.set(nextStates);\n    this.currentPage.set(1);\n    this.activeFilterPopover.set(null);\n\n    this.filterChange.emit({ filters: this.activeFilters() });\n    this.emitDataState();\n  }\n\n  clearPopoverFilter(): void {\n    const pop = this.activeFilterPopover();\n    if (!pop) return;\n\n    const field = pop.field;\n    const nextStates = new Map(this.filterStates());\n    nextStates.delete(field);\n\n    this.filterStates.set(nextStates);\n    this.currentPage.set(1);\n    this.activeFilterPopover.set(null);\n\n    this.filterChange.emit({ filters: this.activeFilters() });\n    this.emitDataState();\n  }\n\n  clearAllFilters(): void {\n    this.filterStates.set(new Map());\n    this.currentPage.set(1);\n    this.activeFilterPopover.set(null);\n    this.filterChange.emit({ filters: [] });\n    this.emitDataState();\n  }\n\n  hasAggregation = computed(() => this.columns().some(col => col.aggregation));\n\n  getAggregationValue(col: GridColumnDef<T>): string {\n    const rows = this.clientFilteredData();\n    if (rows.length === 0) return '-';\n\n    const values = rows.map(r => {\n      const val = (r as Record<string, unknown>)[col.field];\n      return typeof val === 'number' ? val : Number(val);\n    }).filter(v => !isNaN(v));\n\n    if (col.aggregation === 'count') {\n      return String(rows.length);\n    }\n\n    if (values.length === 0) return '-';\n\n    switch (col.aggregation) {\n      case 'sum': {\n        const sum = values.reduce((acc, v) => acc + v, 0);\n        return this.formatAggValue(sum);\n      }\n      case 'avg': {\n        const sum = values.reduce((acc, v) => acc + v, 0);\n        const avg = sum / values.length;\n        return this.formatAggValue(avg);\n      }\n      case 'min': {\n        return this.formatAggValue(Math.min(...values));\n      }\n      case 'max': {\n        return this.formatAggValue(Math.max(...values));\n      }\n      default:\n        return '-';\n    }\n  }\n\n  private formatAggValue(val: number): string {\n    return val % 1 === 0 ? String(val) : val.toFixed(2);\n  }\n\n  onSort(column: GridColumnDef<T>, event?: MouseEvent): void {\n    const isMulti = this.multiSort() && event && (event.ctrlKey || event.shiftKey);\n    const currentStates = [...this.sortStates()];\n    const index = currentStates.findIndex(s => s.field === column.field);\n\n    if (isMulti) {\n      if (index !== -1) {\n        const current = currentStates[index];\n        if (current.dir === 'asc') {\n          currentStates[index] = { field: column.field, dir: 'desc' };\n        } else {\n          currentStates.splice(index, 1);\n        }\n      } else {\n        currentStates.push({ field: column.field, dir: 'asc' });\n      }\n      this.sortStates.set(currentStates);\n    } else {\n      if (index !== -1 && currentStates.length === 1) {\n        const current = currentStates[0];\n        if (current.dir === 'asc') {\n          this.sortStates.set([{ field: column.field, dir: 'desc' }]);\n        } else {\n          this.sortStates.set([]);\n        }\n      } else {\n        this.sortStates.set([{ field: column.field, dir: 'asc' }]);\n      }\n    }\n\n    this.currentPage.set(1);\n    this.sortChange.emit({ sort: this.sortState(), sorts: this.sortStates() } as any);\n    this.emitDataState();\n  }\n\n  onGroupingPanelDragOver(event: DragEvent): void {\n    const field = this.draggingField();\n    if (!field) return;\n    const col = this.columns().find(c => c.field === field);\n    if (col && col.groupable) {\n      event.preventDefault();\n      this.isGroupingPanelDragOver.set(true);\n    }\n  }\n\n  onGroupingPanelDragLeave(event: DragEvent): void {\n    this.isGroupingPanelDragOver.set(false);\n  }\n\n  onGroupingPanelDrop(event: DragEvent): void {\n    event.preventDefault();\n    this.isGroupingPanelDragOver.set(false);\n    const field = this.draggingField();\n    if (field) {\n      const col = this.columns().find(c => c.field === field);\n      if (col && col.groupable) {\n        const newGroup = { field, dir: 'asc' as const };\n        this.internalGroupBy.set(newGroup);\n        this.groupChange.emit({ group: newGroup });\n        this.emitDataState();\n      }\n    }\n    this.draggingField.set(null);\n  }\n\n  clearGrouping(): void {\n    this.internalGroupBy.set(null);\n    this.groupChange.emit({ group: null });\n    this.emitDataState();\n  }\n\n  getColumnTitle(field: string): string {\n    const col = this.columns().find(c => c.field === field);\n    return col ? col.title : field;\n  }\n\n  onDragStart(event: DragEvent, col: GridColumnDef<T>): void {\n    if (!this.reorderable() && !col.groupable) return;\n    this.draggingField.set(col.field);\n    if (event.dataTransfer) {\n      event.dataTransfer.effectAllowed = 'move';\n      event.dataTransfer.setData('text/plain', col.field);\n    }\n  }\n\n  onDragOver(event: DragEvent, col: GridColumnDef<T>): void {\n    if (!this.reorderable() || this.draggingField() === col.field) return;\n    event.preventDefault();\n    this.dragOverField.set(col.field);\n  }\n\n  onDrop(event: DragEvent, targetCol: GridColumnDef<T>): void {\n    if (!this.reorderable()) return;\n    const sourceField = this.draggingField();\n    const targetField = targetCol.field;\n    if (sourceField && sourceField !== targetField) {\n      const currentOrder = this.columnOrder().length > 0 \n        ? [...this.columnOrder()] \n        : this.columns().map(c => c.field);\n        \n      const sourceIndex = currentOrder.indexOf(sourceField);\n      const targetIndex = currentOrder.indexOf(targetField);\n      if (sourceIndex !== -1 && targetIndex !== -1) {\n        currentOrder.splice(sourceIndex, 1);\n        currentOrder.splice(targetIndex, 0, sourceField);\n        this.columnOrder.set(currentOrder);\n        this.columnReorder.emit({ columns: this.orderedColumns() });\n      }\n    }\n    this.draggingField.set(null);\n    this.dragOverField.set(null);\n  }\n\n  onDragEnd(): void {\n    this.draggingField.set(null);\n    this.dragOverField.set(null);\n  }\n\n  onRowDragStart(event: DragEvent, index: number): void {\n    if (!this.rowReorderable()) return;\n    this.draggingRowIndex.set(index);\n    if (event.dataTransfer) {\n      event.dataTransfer.effectAllowed = 'move';\n      event.dataTransfer.setData('text/plain', String(index));\n    }\n  }\n\n  onRowDragOver(event: DragEvent, index: number): void {\n    if (!this.rowReorderable() || this.draggingRowIndex() === index) return;\n    event.preventDefault();\n    this.dragOverRowIndex.set(index);\n  }\n\n  onRowDrop(event: DragEvent, targetIndex: number): void {\n    if (!this.rowReorderable()) return;\n    const sourceIndex = this.draggingRowIndex();\n    if (sourceIndex !== null && sourceIndex !== targetIndex) {\n      const rendered = this.flatRenderedRows();\n      const sourceItem = rendered[sourceIndex];\n      const targetItem = rendered[targetIndex];\n      \n      const currentData = [...this.data()];\n      const actualSourceIdx = currentData.indexOf(sourceItem);\n      const actualTargetIdx = currentData.indexOf(targetItem);\n      \n      if (actualSourceIdx !== -1 && actualTargetIdx !== -1) {\n        currentData.splice(actualSourceIdx, 1);\n        currentData.splice(actualTargetIdx, 0, sourceItem);\n        this.rowReorder.emit({\n          previousIndex: actualSourceIdx,\n          currentIndex: actualTargetIdx,\n          data: currentData\n        });\n      }\n    }\n    this.draggingRowIndex.set(null);\n    this.dragOverRowIndex.set(null);\n  }\n\n  onViewportScroll(event: Event): void {\n    const target = event.target as HTMLElement;\n    if (target && this.virtualScroll()) {\n      this.scrollTop.set(target.scrollTop);\n      this.viewportHeight.set(target.clientHeight || 400);\n    }\n  }\n\n  onRowDragEnd(): void {\n    this.draggingRowIndex.set(null);\n    this.dragOverRowIndex.set(null);\n  }\n\n  getRowTranslation(index: number): string {\n    const draggingIdx = this.draggingRowIndex();\n    const dragOverIdx = this.dragOverRowIndex();\n    \n    if (draggingIdx === null || dragOverIdx === null || draggingIdx === dragOverIdx) {\n      return '';\n    }\n    \n    // Disable sliding transforms in grouped mode as group segments render hierarchically.\n    if (this.groupedRows().length > 0) {\n      return '';\n    }\n    \n    const rowHeight = 49;\n    \n    if (draggingIdx < dragOverIdx) {\n      if (index > draggingIdx && index <= dragOverIdx) {\n        return `translateY(-${rowHeight}px)`;\n      }\n      if (index === draggingIdx) {\n        return `translateY(${(dragOverIdx - draggingIdx) * rowHeight}px)`;\n      }\n    } else if (draggingIdx > dragOverIdx) {\n      if (index >= dragOverIdx && index < draggingIdx) {\n        return `translateY(${rowHeight}px)`;\n      }\n      if (index === draggingIdx) {\n        return `translateY(-${(draggingIdx - dragOverIdx) * rowHeight}px)`;\n      }\n    }\n    \n    return '';\n  }\n\n  getSortIndex(col: GridColumnDef<T>): number {\n    return this.sortStates().findIndex(s => s.field === col.field) + 1;\n  }\n\n  getSortDirection(col: GridColumnDef<T>): 'asc' | 'desc' | null {\n    const found = this.sortStates().find(s => s.field === col.field);\n    return found ? found.dir : null;\n  }\n\n  setGroup(state: GridGroupState | null): void {\n    this.groupChange.emit({ group: state });\n    this.currentPage.set(1);\n    this.emitDataState(state);\n  }\n\n  toggleGroup(key: string): void {\n    const next = new Set(this.collapsedGroups());\n    if (next.has(key)) {\n      next.delete(key);\n    } else {\n      next.add(key);\n    }\n    this.collapsedGroups.set(next);\n  }\n\n  isGroupCollapsed(key: string): boolean {\n    return this.collapsedGroups().has(key);\n  }\n\n  goPage(page: number): void {\n    const safePage = Math.max(1, Math.min(this.totalPages(), page));\n    this.currentPage.set(safePage);\n    this.pageChange.emit({ page: safePage, pageSize: this.internalPageSize() });\n    this.emitDataState();\n  }\n\n  changePageSize(size: number): void {\n    this.internalPageSize.set(size);\n    this.currentPage.set(1);\n    this.pageChange.emit({ page: 1, pageSize: size });\n    this.emitDataState();\n  }\n\n  getColumnDef(field: string | null): GridColumnDef<T> | null {\n    if (!field) return null;\n    return this.columns().find(c => c.field === field) ?? null;\n  }\n\n\n  contextMenuGroupBy(field: string | null): void {\n    if (!field) return;\n    const groupState = { field, dir: 'asc' as const };\n    this.internalGroupBy.set(groupState);\n    this.groupChange.emit({ group: groupState });\n    this.emitDataState(groupState);\n    this.activeContextMenu.set(null);\n  }\n\n  contextMenuClearGrouping(): void {\n    this.internalGroupBy.set(null);\n    this.groupChange.emit({ group: null });\n    this.emitDataState(null);\n    this.activeContextMenu.set(null);\n  }\n\n  collapseAllGroups(): void {\n    const keys = this.groupedRows().map(g => g.key);\n    this.collapsedGroups.set(new Set(keys));\n    this.activeContextMenu.set(null);\n  }\n\n  expandAllGroups(): void {\n    this.collapsedGroups.set(new Set());\n    this.activeContextMenu.set(null);\n  }\n\n  contextMenuToggleDetail(row: T): void {\n    this.toggleDetail(row);\n    this.activeContextMenu.set(null);\n  }\n\n  expandAllDetails(): void {\n    const keys = this.flatRenderedRows().map(r => this.keyOf(r));\n    this.expandedRows.set(new Set(keys));\n    this.activeContextMenu.set(null);\n  }\n\n  collapseAllDetails(): void {\n    this.expandedRows.set(new Set());\n    this.activeContextMenu.set(null);\n  }\n\n  onRowClick(row: T, index: number): void {\n    this.rowClick.emit({ row, index });\n  }\n\n  isRowSelected(row: T): boolean {\n    return this.selectedRows().has(this.keyOf(row));\n  }\n\n  toggleRow(row: T): void {\n    const key = this.keyOf(row);\n    const next = new Set(this.selectedRows());\n    if (next.has(key)) {\n      next.delete(key);\n    } else {\n      next.add(key);\n    }\n    this.selectedRows.set(next);\n    this.selectionChange.emit(this.resolveSelectedRows(next));\n  }\n\n  toggleAll(): void {\n    const next = new Set(this.selectedRows());\n    const rows = this.visibleSelectionRows();\n    if (this.allSelected()) {\n      for (const row of rows) {\n        next.delete(this.keyOf(row));\n      }\n    } else {\n      for (const row of rows) {\n        next.add(this.keyOf(row));\n      }\n    }\n    this.selectedRows.set(next);\n    this.selectionChange.emit(this.resolveSelectedRows(next));\n  }\n\n  toggleDetail(row: T): void {\n    const key = this.keyOf(row);\n    const next = new Set(this.expandedRows());\n    if (next.has(key)) {\n      next.delete(key);\n    } else {\n      next.add(key);\n    }\n    this.expandedRows.set(next);\n  }\n\n  isExpanded(row: T): boolean {\n    return this.expandedRows().has(this.keyOf(row));\n  }\n\n  beginEdit(row: T, _index: number): void {\n    if (!this.editable()) {\n      return;\n    }\n\n    const key = this.keyOf(row);\n    this.editingRowKey.set(key);\n    this.editingDraft.set({ ...(row as Record<string, unknown>) });\n  }\n\n  isEditing(row: T): boolean {\n    return this.editingRowKey() === this.keyOf(row);\n  }\n\n  updateDraft(field: string, value: unknown): void {\n    this.editingDraft.set({ ...this.editingDraft(), [field]: value });\n  }\n\n  getDraftValue(row: T, field: string): unknown {\n    if (!this.isEditing(row)) {\n      return (row as Record<string, unknown>)[field];\n    }\n\n    const draft = this.editingDraft();\n    return Object.prototype.hasOwnProperty.call(draft, field)\n      ? draft[field]\n      : (row as Record<string, unknown>)[field];\n  }\n\n  saveEdit(row: T, index: number): void {\n    const updated = { ...(row as Record<string, unknown>), ...this.editingDraft() } as T;\n    this.rowUpdate.emit({ previous: row, updated, index });\n    this.cancelEdit();\n  }\n\n  cancelEdit(): void {\n    this.editingRowKey.set(null);\n    this.editingDraft.set({});\n  }\n\n  getCellValue(row: T, field: string): unknown {\n    return (row as Record<string, unknown>)[field] ?? '';\n  }\n\n  resolveHeaderTemplate(column: GridColumnDef<T>): TemplateRef<GridHeaderTemplateContext<T>> | null {\n    if (column.headerTemplate) {\n      return column.headerTemplate;\n    }\n    const match = this.headerTemplates?.find(t => t.columnField === column.field);\n    if (match) {\n      return match.templateRef;\n    }\n    return this.headerTemplate();\n  }\n\n  resolveCellTemplate(column: GridColumnDef<T>): TemplateRef<GridCellTemplateContext<T>> | null {\n    if (column.cellTemplate) {\n      return column.cellTemplate;\n    }\n    const match = this.cellTemplates?.find(t => t.columnField === column.field);\n    if (match) {\n      return match.templateRef;\n    }\n    return this.cellTemplate();\n  }\n\n  resolveEditCellTemplate(column: GridColumnDef<T>): TemplateRef<GridCellTemplateContext<T>> | null {\n    if (column.editCellTemplate) {\n      return column.editCellTemplate;\n    }\n    const match = this.editCellTemplates?.find(t => t.columnField === column.field);\n    if (match) {\n      return match.templateRef;\n    }\n    return this.editCellTemplate();\n  }\n\n  resolveFooterTemplate(column: GridColumnDef<T>): TemplateRef<GridFooterTemplateContext<T>> | null {\n    if (column.footerTemplate) {\n      return column.footerTemplate;\n    }\n    const match = this.footerTemplates?.find(t => t.columnField === column.field);\n    if (match) {\n      return match.templateRef;\n    }\n    return this.footerTemplate();\n  }\n\n  getUpdateDraftCallback(field: string): (val: unknown) => void {\n    return (val: unknown) => this.updateDraft(field, val);\n  }\n\n  toStringSafe(value: unknown): string {\n    return value == null ? '' : String(value);\n  }\n\n  highlightSearchText(value: unknown): string {\n    const rawVal = value == null ? '' : String(value);\n    const searchVal = this.searchText().trim();\n    if (!searchVal || !this.showGlobalSearch()) {\n      return this.escapeHtml(rawVal);\n    }\n    \n    const escapedVal = this.escapeHtml(rawVal);\n    const escapedSearch = this.escapeRegExp(searchVal);\n    try {\n      const regex = new RegExp(`(${escapedSearch})`, 'gi');\n      return escapedVal.replace(regex, '<mark class=\"search-highlight\">$1</mark>');\n    } catch {\n      return escapedVal;\n    }\n  }\n\n  private escapeHtml(text: string): string {\n    return text\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#039;');\n  }\n\n  private escapeRegExp(text: string): string {\n    return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n  }\n\n  getKey(row: T, index: number): string {\n    const source = row as Record<string, unknown>;\n    return String(source['id'] ?? source['key'] ?? index);\n  }\n\n  hasGrouping(): boolean {\n    return this.internalGroupBy() !== null;\n  }\n\n  private paginateRows(rows: T[]): T[] {\n    if (this.pagingMode() === 'server') {\n      return rows;\n    }\n\n    const pageSize = Math.max(1, this.internalPageSize());\n    const start = (this.currentPage() - 1) * pageSize;\n    return rows.slice(start, start + pageSize);\n  }\n\n  private compareValues(left: unknown, right: unknown): number {\n    if (left == null && right == null) {\n      return 0;\n    }\n    if (left == null) {\n      return -1;\n    }\n    if (right == null) {\n      return 1;\n    }\n\n    if (typeof left === 'number' && typeof right === 'number') {\n      return left - right;\n    }\n\n    return String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: 'base' });\n  }\n\n  private visibleSelectionRows(): T[] {\n    if (this.groupedRows().length > 0) {\n      const rows: T[] = [];\n      for (const group of this.groupedRows()) {\n        if (!this.isGroupCollapsed(group.key)) {\n          rows.push(...group.items);\n        }\n      }\n      return rows;\n    }\n\n    return this.flatRenderedRows();\n  }\n\n  private resolveSelectedRows(selection: Set<string>): T[] {\n    const source = this.data();\n    return source.filter(row => selection.has(this.keyOf(row)));\n  }\n\n  private keyOf(row: T): string {\n    const source = row as Record<string, unknown>;\n    return String(source['id'] ?? source['key'] ?? JSON.stringify(row));\n  }\n\n  private emitDataState(overrideGroup?: GridGroupState | null): void {\n    this.dataStateChange.emit({\n      page: this.currentPage(),\n      pageSize: this.internalPageSize(),\n      sort: this.sortState(),\n      filters: this.activeFilters(),\n      group: overrideGroup === undefined ? this.internalGroupBy() : overrideGroup,\n    });\n  }\n\n  onCellClick(row: T, colField: string): void {\n    if (!this.keyboardNavigation()) return;\n    this.focusedCell.set({ row, colField });\n    this.focusedCellEditActive.set(this.isEditing(row));\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeyDown(event: KeyboardEvent): void {\n    if (!this.keyboardNavigation()) return;\n    const key = event.key;\n    const focused = this.focusedCell();\n    if (!focused) {\n      if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'ArrowLeft' || key === 'ArrowRight') {\n        const rows = this.flatRenderedRows();\n        const cols = this.orderedColumns();\n        if (rows.length > 0 && cols.length > 0) {\n          this.focusedCell.set({ row: rows[0], colField: cols[0].field });\n          event.preventDefault();\n        }\n      }\n      return;\n    }\n\n    const rows = this.flatRenderedRows();\n    const cols = this.orderedColumns();\n    const rowIndex = rows.indexOf(focused.row);\n    const colIndex = cols.findIndex(c => c.field === focused.colField);\n\n    if (rowIndex === -1 || colIndex === -1) return;\n\n    if (this.focusedCellEditActive()) {\n      if (key === 'Enter') {\n        this.saveEdit(focused.row, rowIndex);\n        this.focusedCellEditActive.set(false);\n        if (rowIndex < rows.length - 1) {\n          this.focusedCell.set({ row: rows[rowIndex + 1], colField: focused.colField });\n        }\n        event.preventDefault();\n      } else if (key === 'Escape') {\n        this.cancelEdit();\n        this.focusedCellEditActive.set(false);\n        event.preventDefault();\n      }\n      return;\n    }\n\n    switch (key) {\n      case 'ArrowUp':\n        if (rowIndex > 0) {\n          this.focusedCell.set({ row: rows[rowIndex - 1], colField: focused.colField });\n          event.preventDefault();\n        }\n        break;\n      case 'ArrowDown':\n        if (rowIndex < rows.length - 1) {\n          this.focusedCell.set({ row: rows[rowIndex + 1], colField: focused.colField });\n          event.preventDefault();\n        }\n        break;\n      case 'ArrowLeft':\n        if (colIndex > 0) {\n          this.focusedCell.set({ row: focused.row, colField: cols[colIndex - 1].field });\n          event.preventDefault();\n        }\n        break;\n      case 'ArrowRight':\n        if (colIndex < cols.length - 1) {\n          this.focusedCell.set({ row: focused.row, colField: cols[colIndex + 1].field });\n          event.preventDefault();\n        }\n        break;\n      case 'Tab':\n        if (event.shiftKey) {\n          if (colIndex > 0) {\n            this.focusedCell.set({ row: focused.row, colField: cols[colIndex - 1].field });\n          } else if (rowIndex > 0) {\n            this.focusedCell.set({ row: rows[rowIndex - 1], colField: cols[cols.length - 1].field });\n          }\n        } else {\n          if (colIndex < cols.length - 1) {\n            this.focusedCell.set({ row: focused.row, colField: cols[colIndex + 1].field });\n          } else if (rowIndex < rows.length - 1) {\n            this.focusedCell.set({ row: rows[rowIndex + 1], colField: cols[0].field });\n          }\n        }\n        event.preventDefault();\n        break;\n      case 'Enter': {\n        const col = cols[colIndex];\n        if (this.editable() && col.editable) {\n          this.beginEdit(focused.row, rowIndex);\n          this.focusedCellEditActive.set(true);\n          setTimeout(() => {\n            const inputEl = this.elementRef.nativeElement.querySelector('.grid-edit-input') as HTMLInputElement;\n            if (inputEl) inputEl.focus();\n          }, 0);\n          event.preventDefault();\n        }\n        break;\n      }\n      case 'Escape':\n        this.focusedCell.set(null);\n        event.preventDefault();\n        break;\n      default:\n        if (key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n          const currentCol = cols[colIndex];\n          if (this.editable() && currentCol.editable) {\n            this.beginEdit(focused.row, rowIndex);\n            this.focusedCellEditActive.set(true);\n            this.updateDraft(focused.colField, key);\n            setTimeout(() => {\n              const inputEl = this.elementRef.nativeElement.querySelector('.grid-edit-input') as HTMLInputElement;\n              if (inputEl) {\n                inputEl.focus();\n                inputEl.value = key;\n              }\n            }, 0);\n            event.preventDefault();\n          }\n        }\n        break;\n    }\n  }\n\n  getCellRowSpan(row: T, colField: string, rowIndex: number, groupItems?: T[]): number {\n    const col = this.columns().find(c => c.field === colField);\n    if (!col || !col.mergeRows) {\n      return 1;\n    }\n\n    const items = groupItems ? groupItems : this.flatRenderedRows();\n    const currentValue = this.getCellValue(row, colField);\n\n    if (rowIndex > 0) {\n      const prevValue = this.getCellValue(items[rowIndex - 1], colField);\n      if (prevValue === currentValue) {\n        return 0;\n      }\n    }\n\n    let span = 1;\n    for (let i = rowIndex + 1; i < items.length; i++) {\n      if (this.getCellValue(items[i], colField) === currentValue) {\n        span++;\n      } else {\n        break;\n      }\n    }\n    return span;\n  }\n\n  isGroupAllSelected(group: GridGroupResult<T>): boolean {\n    const rows = group.items;\n    if (rows.length === 0) return false;\n    const selected = this.selectedRows();\n    return rows.every(row => selected.has(this.keyOf(row)));\n  }\n\n  toggleGroupSelection(group: GridGroupResult<T>, event: Event): void {\n    event.stopPropagation();\n    const checked = (event.target as HTMLInputElement).checked;\n    const selected = new Set(this.selectedRows());\n    group.items.forEach(row => {\n      const key = this.keyOf(row);\n      if (checked) {\n        selected.add(key);\n      } else {\n        selected.delete(key);\n      }\n    });\n    this.selectedRows.set(selected);\n    this.selectionChange.emit(this.resolveSelectedRows(selected));\n  }\n\n  getGroupAggregationValue(group: GridGroupResult<T>, col: GridColumnDef<T>): string {\n    const rows = group.items;\n    if (rows.length === 0) return '-';\n\n    const values = rows.map(r => {\n      const val = (r as Record<string, unknown>)[col.field];\n      return typeof val === 'number' ? val : Number(val);\n    }).filter(v => !isNaN(v));\n\n    if (col.aggregation === 'count') {\n      return String(rows.length);\n    }\n\n    if (values.length === 0) return '-';\n\n    switch (col.aggregation) {\n      case 'sum': {\n        const sum = values.reduce((acc, v) => acc + v, 0);\n        return this.formatAggValue(sum);\n      }\n      case 'avg': {\n        const sum = values.reduce((acc, v) => acc + v, 0);\n        const avg = sum / values.length;\n        return this.formatAggValue(avg);\n      }\n      case 'min': {\n        return this.formatAggValue(Math.min(...values));\n      }\n      case 'max': {\n        return this.formatAggValue(Math.max(...values));\n      }\n      default:\n        return '-';\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { GridColumnDef, GridSortState, GridFilterState, GridGroupState } from '../models';\n\nexport interface GridPersistedState {\n  columnWidths: Record<string, number>;\n  columnOrder: string[];\n  sorts: GridSortState[];\n  filters: GridFilterState[];\n  groups: GridGroupState[];\n  page: number;\n  pageSize: number;\n  hiddenColumns: string[];\n  pinnedColumns: Record<string, 'left' | 'right' | null>;\n}\n\n@Injectable()\nexport class GridStateService {\n  /** \n   * Save grid state to localStorage\n   * @param key Storage key\n   * @param state The state object to persist\n   */\n  saveState(key: string, state: GridPersistedState): void {\n    try {\n      localStorage.setItem(key, JSON.stringify(state));\n    } catch (e) {\n      console.warn('GridStateService: Failed to save state to localStorage', e);\n    }\n  }\n  \n  /** \n   * Load grid state from localStorage\n   * @param key Storage key\n   * @returns The persisted state or null if not found\n   */\n  loadState(key: string): GridPersistedState | null {\n    try {\n      const stateStr = localStorage.getItem(key);\n      if (stateStr) {\n        return JSON.parse(stateStr) as GridPersistedState;\n      }\n    } catch (e) {\n      console.warn('GridStateService: Failed to load state from localStorage', e);\n    }\n    return null;\n  }\n  \n  /** \n   * Clear persisted state\n   * @param key Storage key\n   */\n  clearState(key: string): void {\n    try {\n      localStorage.removeItem(key);\n    } catch (e) {\n      console.warn('GridStateService: Failed to clear state', e);\n    }\n  }\n  \n  /** \n   * Merge loaded state with current column definitions\n   * @param state The loaded state\n   * @param columns The default column definitions\n   * @returns Array of column definitions updated with the state\n   */\n  applyState(state: GridPersistedState, columns: GridColumnDef[]): GridColumnDef[] {\n    if (!state || !columns || columns.length === 0) {\n      return columns;\n    }\n\n    const colMap = new Map<string, GridColumnDef>();\n    columns.forEach(col => colMap.set(col.field, { ...col }));\n\n    // Apply widths, hidden state, and pinned state\n    for (const col of colMap.values()) {\n      if (state.columnWidths && state.columnWidths[col.field] !== undefined) {\n        col.width = state.columnWidths[col.field];\n      }\n      \n      if (state.hiddenColumns) {\n        col.hidden = state.hiddenColumns.includes(col.field);\n      }\n      \n      if (state.pinnedColumns && state.pinnedColumns[col.field] !== undefined) {\n        col.pinned = state.pinnedColumns[col.field];\n      }\n    }\n\n    // Apply column ordering\n    if (state.columnOrder && state.columnOrder.length > 0) {\n      const orderedCols: GridColumnDef[] = [];\n      const orderSet = new Set(state.columnOrder);\n\n      // Add columns in the saved order\n      for (const field of state.columnOrder) {\n        if (colMap.has(field)) {\n          orderedCols.push(colMap.get(field)!);\n        }\n      }\n\n      // Add any new columns that weren't in the saved order\n      for (const col of columns) {\n        if (!orderSet.has(col.field) && colMap.has(col.field)) {\n          orderedCols.push(colMap.get(col.field)!);\n        }\n      }\n\n      return orderedCols;\n    }\n\n    return Array.from(colMap.values());\n  }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { GridStatusBarAggregates } from '../models';\n\nexport interface CellCoordinate {\n  rowIndex: number;\n  colField: string;\n}\n\nexport interface CellRange {\n  start: CellCoordinate;\n  end: CellCoordinate;\n}\n\n@Injectable()\nexport class GridSelectionService {\n  // Row selection\n  readonly selectedRows = signal<Set<unknown>>(new Set());\n  \n  // Cell range selection (supports multiple disjoint ranges)\n  readonly cellRanges = signal<CellRange[]>([]);\n  readonly activeCellRange = signal<CellRange | null>(null);\n  readonly focusedCell = signal<CellCoordinate | null>(null);\n  readonly isDragging = signal<boolean>(false);\n  \n  // Status bar aggregates computed from selected cells\n  readonly selectionAggregates = signal<GridStatusBarAggregates>({\n    count: 0, sum: null, average: null, min: null, max: null\n  });\n  \n  // ==========================================\n  // Row selection methods\n  // ==========================================\n  \n  selectRow(rowId: unknown): void {\n    const current = new Set(this.selectedRows());\n    current.add(rowId);\n    this.selectedRows.set(current);\n  }\n  \n  deselectRow(rowId: unknown): void {\n    const current = new Set(this.selectedRows());\n    current.delete(rowId);\n    this.selectedRows.set(current);\n  }\n  \n  toggleRow(rowId: unknown): void {\n    const current = new Set(this.selectedRows());\n    if (current.has(rowId)) {\n      current.delete(rowId);\n    } else {\n      current.add(rowId);\n    }\n    this.selectedRows.set(current);\n  }\n  \n  selectAll(rowIds: unknown[]): void {\n    this.selectedRows.set(new Set(rowIds));\n  }\n  \n  deselectAll(): void {\n    this.selectedRows.set(new Set());\n  }\n  \n  isRowSelected(rowId: unknown): boolean {\n    return this.selectedRows().has(rowId);\n  }\n  \n  // ==========================================\n  // Cell selection methods\n  // ==========================================\n  \n  startCellSelection(coord: CellCoordinate): void {\n    const range: CellRange = { start: { ...coord }, end: { ...coord } };\n    this.activeCellRange.set(range);\n    this.cellRanges.set([range]);\n    this.setFocusedCell(coord);\n    this.isDragging.set(true);\n  }\n  \n  extendCellSelection(coord: CellCoordinate): void {\n    const active = this.activeCellRange();\n    if (!active) return;\n    \n    const updatedRange = { ...active, end: { ...coord } };\n    this.activeCellRange.set(updatedRange);\n    \n    const ranges = [...this.cellRanges()];\n    if (ranges.length > 0) {\n      ranges[ranges.length - 1] = updatedRange;\n      this.cellRanges.set(ranges);\n    }\n  }\n  \n  endCellSelection(): void {\n    this.isDragging.set(false);\n  }\n  \n  addCellRange(range: CellRange): void {\n    this.cellRanges.update(ranges => [...ranges, range]);\n    this.activeCellRange.set(range);\n    this.setFocusedCell(range.end);\n  }\n  \n  clearCellSelection(): void {\n    this.cellRanges.set([]);\n    this.activeCellRange.set(null);\n  }\n  \n  /** Simplistic check assuming contiguous field indices are managed externally if needed */\n  isCellSelected(rowIndex: number, colField: string): boolean {\n    // For robust 2D selection, the caller needs to provide column field index mapping.\n    // Without column layout, we match exactly on the field strings of start/end boundaries, \n    // or treat start and end field as boundaries if fields match.\n    // In a real scenario, grid maps colField to colIndex and checks bounds.\n    for (const range of this.cellRanges()) {\n      const minRow = Math.min(range.start.rowIndex, range.end.rowIndex);\n      const maxRow = Math.max(range.start.rowIndex, range.end.rowIndex);\n      \n      // Basic check: row is in bounds and field matches either start or end.\n      // (Full horizontal range implementation requires column ordinals)\n      if (rowIndex >= minRow && rowIndex <= maxRow) {\n        if (colField === range.start.colField || colField === range.end.colField) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n  \n  // ==========================================\n  // Focus management\n  // ==========================================\n  \n  setFocusedCell(coord: CellCoordinate): void {\n    this.focusedCell.set({ ...coord });\n  }\n  \n  moveFocus(direction: 'up' | 'down' | 'left' | 'right', maxRow: number, fields: string[]): void {\n    const current = this.focusedCell();\n    if (!current) return;\n    \n    let { rowIndex, colField } = current;\n    const colIndex = fields.indexOf(colField);\n    if (colIndex === -1) return;\n    \n    switch (direction) {\n      case 'up':\n        rowIndex = Math.max(0, rowIndex - 1);\n        break;\n      case 'down':\n        rowIndex = Math.min(maxRow, rowIndex + 1);\n        break;\n      case 'left':\n        colField = fields[Math.max(0, colIndex - 1)];\n        break;\n      case 'right':\n        colField = fields[Math.min(fields.length - 1, colIndex + 1)];\n        break;\n    }\n    \n    const newCoord = { rowIndex, colField };\n    this.setFocusedCell(newCoord);\n    \n    if (!this.isDragging()) {\n      this.clearCellSelection();\n      this.startCellSelection(newCoord);\n      this.endCellSelection();\n    } else {\n      this.extendCellSelection(newCoord);\n    }\n  }\n  \n  // ==========================================\n  // Aggregation\n  // ==========================================\n  \n  updateSelectionAggregates<T extends Record<string, unknown>>(data: T[], fields: string[]): void {\n    let count = 0;\n    let sum = 0;\n    let min = Infinity;\n    let max = -Infinity;\n    let numericCount = 0;\n    \n    const ranges = this.cellRanges();\n    if (ranges.length === 0) {\n      this.selectionAggregates.set({ count: 0, sum: null, average: null, min: null, max: null });\n      return;\n    }\n    \n    // Note: robust 2D selection aggregates need to iterate all cells in range.\n    // Simplifying: we'll aggregate over start & end cells as placeholders without a full layout matrix.\n    for (const range of ranges) {\n      const minRow = Math.min(range.start.rowIndex, range.end.rowIndex);\n      const maxRow = Math.max(range.start.rowIndex, range.end.rowIndex);\n      \n      const startColIdx = fields.indexOf(range.start.colField);\n      const endColIdx = fields.indexOf(range.end.colField);\n      if (startColIdx === -1 || endColIdx === -1) continue;\n      \n      const minCol = Math.min(startColIdx, endColIdx);\n      const maxCol = Math.max(startColIdx, endColIdx);\n      \n      for (let r = minRow; r <= maxRow; r++) {\n        const rowData = data[r];\n        if (!rowData) continue;\n        \n        for (let c = minCol; c <= maxCol; c++) {\n          count++;\n          const val = rowData[fields[c]];\n          \n          if (typeof val === 'number' && !isNaN(val)) {\n            sum += val;\n            min = Math.min(min, val);\n            max = Math.max(max, val);\n            numericCount++;\n          }\n        }\n      }\n    }\n    \n    this.selectionAggregates.set({\n      count,\n      sum: numericCount > 0 ? sum : null,\n      average: numericCount > 0 ? sum / numericCount : null,\n      min: numericCount > 0 ? min : null,\n      max: numericCount > 0 ? max : null\n    });\n  }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { GridCellValidator, GridCellValidationError, GridEditChangeset } from '../models';\n\nexport interface EditCommand {\n  type: 'cell-edit' | 'row-delete' | 'row-add' | 'cell-clear';\n  rowIndex: number;\n  field?: string;\n  previousValue?: unknown;\n  newValue?: unknown;\n  row?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class GridEditService {\n  // State\n  readonly isEditing = signal<boolean>(false);\n  readonly editingRowIndex = signal<number | null>(null);\n  readonly draftValues = signal<Map<number, Map<string, unknown>>>(new Map());\n  readonly dirtyFields = signal<Map<number, Set<string>>>(new Map());\n  readonly deletedRows = signal<Set<number>>(new Set());\n  readonly validationErrors = signal<GridCellValidationError[]>([]);\n  \n  // Undo/Redo stacks\n  private undoStack: EditCommand[] = [];\n  private redoStack: EditCommand[] = [];\n  readonly canUndo = signal<boolean>(false);\n  readonly canRedo = signal<boolean>(false);\n  readonly undoStackSize = signal<number>(0);\n  readonly maxUndoDepth = 50;\n  \n  // Computed\n  readonly hasDirtyChanges = computed(() => this.dirtyFields().size > 0 || this.deletedRows().size > 0);\n  \n  // ==========================================\n  // Edit operations\n  // ==========================================\n  \n  beginEdit(rowIndex: number): void {\n    this.isEditing.set(true);\n    this.editingRowIndex.set(rowIndex);\n    \n    if (!this.draftValues().has(rowIndex)) {\n      const drafts = new Map(this.draftValues());\n      drafts.set(rowIndex, new Map<string, unknown>());\n      this.draftValues.set(drafts);\n    }\n  }\n  \n  updateDraft(rowIndex: number, field: string, value: unknown): void {\n    const drafts = new Map(this.draftValues());\n    let rowDrafts = drafts.get(rowIndex);\n    if (!rowDrafts) {\n      rowDrafts = new Map<string, unknown>();\n      drafts.set(rowIndex, rowDrafts);\n    }\n    rowDrafts.set(field, value);\n    this.draftValues.set(drafts);\n  }\n  \n  getDraftValue(rowIndex: number, field: string): unknown | undefined {\n    return this.draftValues().get(rowIndex)?.get(field);\n  }\n  \n  saveEdit(rowIndex: number): void {\n    // Implementer is responsible for merging drafts to data model,\n    // this service tracks the change states.\n    this.isEditing.set(false);\n    this.editingRowIndex.set(null);\n  }\n  \n  cancelEdit(): void {\n    const rowIndex = this.editingRowIndex();\n    if (rowIndex !== null) {\n      const drafts = new Map(this.draftValues());\n      drafts.delete(rowIndex);\n      this.draftValues.set(drafts);\n    }\n    this.isEditing.set(false);\n    this.editingRowIndex.set(null);\n  }\n  \n  // ==========================================\n  // Batch operations\n  // ==========================================\n  \n  markCellDirty(rowIndex: number, field: string, originalValue: unknown, newValue: unknown): void {\n    const dirty = new Map(this.dirtyFields());\n    let rowDirty = dirty.get(rowIndex);\n    \n    if (!rowDirty) {\n      rowDirty = new Set<string>();\n      dirty.set(rowIndex, rowDirty);\n    }\n    \n    if (originalValue !== newValue) {\n      rowDirty.add(field);\n    } else {\n      rowDirty.delete(field);\n      if (rowDirty.size === 0) dirty.delete(rowIndex);\n    }\n    \n    this.dirtyFields.set(dirty);\n  }\n  \n  deleteRow(rowIndex: number): void {\n    const deleted = new Set(this.deletedRows());\n    deleted.add(rowIndex);\n    this.deletedRows.set(deleted);\n    \n    this.pushCommand({\n      type: 'row-delete',\n      rowIndex\n    });\n  }\n  \n  isRowDirty(rowIndex: number): boolean {\n    return this.dirtyFields().has(rowIndex);\n  }\n  \n  isFieldDirty(rowIndex: number, field: string): boolean {\n    return this.dirtyFields().get(rowIndex)?.has(field) || false;\n  }\n  \n  isRowDeleted(rowIndex: number): boolean {\n    return this.deletedRows().has(rowIndex);\n  }\n  \n  // ==========================================\n  // Changeset\n  // ==========================================\n  \n  getChangeset<T extends Record<string, unknown>>(originalData: T[]): GridEditChangeset<T> {\n    const added: T[] = [];\n    const updated: { previous: T; current: T; dirtyFields: string[] }[] = [];\n    const deleted: T[] = [];\n    \n    this.deletedRows().forEach(index => {\n      if (originalData[index]) deleted.push(originalData[index]);\n    });\n    \n    this.dirtyFields().forEach((fields, index) => {\n      if (this.deletedRows().has(index)) return; // Skip if deleted\n      \n      const changes: Record<string, unknown> = {};\n      const rowDraft = this.draftValues().get(index);\n      fields.forEach(field => {\n        if (rowDraft?.has(field)) changes[field] = rowDraft.get(field);\n      });\n      \n      if (originalData[index]) {\n        updated.push({ previous: originalData[index], current: { ...originalData[index], ...changes } as T, dirtyFields: Array.from(fields) });\n      }\n    });\n    \n    return { added, updated, deleted };\n  }\n  \n  discardAllChanges(): void {\n    this.draftValues.set(new Map());\n    this.dirtyFields.set(new Map());\n    this.deletedRows.set(new Set());\n    this.undoStack = [];\n    this.redoStack = [];\n    this.updateUndoRedoState();\n  }\n  \n  // ==========================================\n  // Undo/Redo\n  // ==========================================\n  \n  pushCommand(command: EditCommand): void {\n    this.undoStack.push(command);\n    if (this.undoStack.length > this.maxUndoDepth) {\n      this.undoStack.shift();\n    }\n    this.redoStack = [];\n    this.updateUndoRedoState();\n  }\n  \n  undo(): EditCommand | null {\n    if (this.undoStack.length === 0) return null;\n    \n    const command = this.undoStack.pop()!;\n    this.redoStack.push(command);\n    this.updateUndoRedoState();\n    return command;\n  }\n  \n  redo(): EditCommand | null {\n    if (this.redoStack.length === 0) return null;\n    \n    const command = this.redoStack.pop()!;\n    this.undoStack.push(command);\n    this.updateUndoRedoState();\n    return command;\n  }\n  \n  private updateUndoRedoState(): void {\n    this.canUndo.set(this.undoStack.length > 0);\n    this.canRedo.set(this.redoStack.length > 0);\n    this.undoStackSize.set(this.undoStack.length);\n  }\n  \n  // ==========================================\n  // Validation\n  // ==========================================\n  \n  validateCell(value: unknown, row: Record<string, unknown>, validators: GridCellValidator[]): GridCellValidationError[] {\n    const errors: GridCellValidationError[] = [];\n    for (const v of validators) {\n      if (v.validate && !v.validate(value, row)) {\n        errors.push({ field: '', rowIndex: -1, message: v.message || 'Validation failed', validator: v });\n      }\n    }\n    return errors;\n  }\n  \n  validateAll<T extends Record<string, unknown>>(data: T[], columns: { field: string; validators?: GridCellValidator[] }[]): GridCellValidationError[] {\n    const errors: GridCellValidationError[] = [];\n    \n    for (let r = 0; r < data.length; r++) {\n      if (this.deletedRows().has(r)) continue;\n      \n      const row = data[r];\n      const drafts = this.draftValues().get(r);\n      \n      for (const col of columns) {\n        if (!col.validators || col.validators.length === 0) continue;\n        \n        const value = drafts?.has(col.field) ? drafts.get(col.field) : row[col.field];\n        const cellErrors = this.validateCell(value, row, col.validators);\n        \n        cellErrors.forEach(err => errors.push({ ...err, rowIndex: r, field: col.field }));\n      }\n    }\n    \n    this.validationErrors.set(errors);\n    return errors;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { CellCoordinate, CellRange } from './grid-selection.service';\n\n@Injectable()\nexport class GridClipboardService {\n  \n  /** Copy selected cell values as TSV to clipboard */\n  async copyToClipboard<T extends Record<string, unknown>>(\n    data: T[], \n    ranges: CellRange[], \n    fields: string[]\n  ): Promise<void> {\n    if (ranges.length === 0) return;\n    \n    const { minRow, maxRow, minCol, maxCol } = this.getBounds(ranges, fields);\n    \n    const gridData: unknown[][] = [];\n    for (let r = minRow; r <= maxRow; r++) {\n      const rowData = data[r];\n      const rowArr: unknown[] = [];\n      for (let c = minCol; c <= maxCol; c++) {\n        rowArr.push(rowData ? rowData[fields[c]] : '');\n      }\n      gridData.push(rowArr);\n    }\n    \n    const tsvText = this.formatAsTsv(gridData);\n    try {\n      await navigator.clipboard.writeText(tsvText);\n    } catch (err) {\n      console.warn('GridClipboardService: Failed to copy to clipboard', err);\n    }\n  }\n  \n  /** Cut selected cells (copy + clear values) */\n  async cutToClipboard<T extends Record<string, unknown>>(\n    data: T[], \n    ranges: CellRange[], \n    fields: string[]\n  ): Promise<{ clearedCells: { rowIndex: number; field: string; previousValue: unknown }[] }> {\n    await this.copyToClipboard(data, ranges, fields);\n    \n    const clearedCells: { rowIndex: number; field: string; previousValue: unknown }[] = [];\n    \n    const { minRow, maxRow, minCol, maxCol } = this.getBounds(ranges, fields);\n    for (let r = minRow; r <= maxRow; r++) {\n      for (let c = minCol; c <= maxCol; c++) {\n        const field = fields[c];\n        if (data[r] && field) {\n          clearedCells.push({ rowIndex: r, field, previousValue: data[r][field] });\n          // Note: State mutation logic belongs to the controller/edit service.\n        }\n      }\n    }\n    \n    return { clearedCells };\n  }\n  \n  /** Parse clipboard TSV/CSV text into a 2D cell matrix */\n  parseClipboardText(text: string): string[][] {\n    if (!text) return [];\n    \n    const isCsv = text.includes(',') && !text.includes('\\t');\n    const delimiter = isCsv ? ',' : '\\t';\n    \n    // Basic CSV/TSV parser handling quotes\n    const rows: string[][] = [];\n    let currentRow: string[] = [];\n    let currentCell = '';\n    let inQuotes = false;\n    \n    for (let i = 0; i < text.length; i++) {\n      const char = text[i];\n      const nextChar = text[i + 1];\n      \n      if (char === '\"') {\n        if (inQuotes && nextChar === '\"') {\n          currentCell += '\"';\n          i++; // skip next quote\n        } else {\n          inQuotes = !inQuotes;\n        }\n      } else if (char === delimiter && !inQuotes) {\n        currentRow.push(currentCell);\n        currentCell = '';\n      } else if (char === '\\n' && !inQuotes) {\n        currentRow.push(currentCell);\n        rows.push(currentRow);\n        currentRow = [];\n        currentCell = '';\n      } else if (char === '\\r' && !inQuotes) {\n        // ignore carriage return\n      } else {\n        currentCell += char;\n      }\n    }\n    \n    if (currentCell || currentRow.length > 0) {\n      currentRow.push(currentCell);\n      rows.push(currentRow);\n    }\n    \n    return rows;\n  }\n  \n  /** Paste clipboard data into grid starting from a coordinate */\n  async pasteFromClipboard<T extends Record<string, unknown>>(\n    data: T[],\n    startCoord: CellCoordinate,\n    editableFields: string[]\n  ): Promise<{ pastedCells: { rowIndex: number; field: string; previousValue: unknown; newValue: string }[] }> {\n    try {\n      const text = await navigator.clipboard.readText();\n      const matrix = this.parseClipboardText(text);\n      \n      const pastedCells: { rowIndex: number; field: string; previousValue: unknown; newValue: string }[] = [];\n      const startColIndex = editableFields.indexOf(startCoord.colField);\n      \n      if (startColIndex === -1) return { pastedCells };\n      \n      for (let r = 0; r < matrix.length; r++) {\n        const targetRow = startCoord.rowIndex + r;\n        if (targetRow >= data.length) break;\n        \n        const sourceRow = matrix[r];\n        for (let c = 0; c < sourceRow.length; c++) {\n          const targetCol = startColIndex + c;\n          if (targetCol >= editableFields.length) break;\n          \n          const field = editableFields[targetCol];\n          pastedCells.push({\n            rowIndex: targetRow,\n            field,\n            previousValue: data[targetRow]?.[field],\n            newValue: sourceRow[c]\n          });\n        }\n      }\n      return { pastedCells };\n    } catch (err) {\n      console.warn('GridClipboardService: Failed to read from clipboard', err);\n      return { pastedCells: [] };\n    }\n  }\n  \n  /** Fill handle: extend values from source range into target range */\n  fillRange<T extends Record<string, unknown>>(\n    data: T[],\n    sourceRange: CellRange,\n    targetRange: CellRange,\n    fields: string[]\n  ): { filledCells: { rowIndex: number; field: string; previousValue: unknown; newValue: unknown }[] } {\n    const filledCells: { rowIndex: number; field: string; previousValue: unknown; newValue: unknown }[] = [];\n    \n    const src = this.getBounds([sourceRange], fields);\n    const tgt = this.getBounds([targetRange], fields);\n    \n    const srcHeight = src.maxRow - src.minRow + 1;\n    const srcWidth = src.maxCol - src.minCol + 1;\n    \n    // Repeat source pattern into target\n    for (let r = tgt.minRow; r <= tgt.maxRow; r++) {\n      for (let c = tgt.minCol; c <= tgt.maxCol; c++) {\n        // Skip if inside source\n        if (r >= src.minRow && r <= src.maxRow && c >= src.minCol && c <= src.maxCol) {\n          continue;\n        }\n        \n        const srcR = src.minRow + ((r - tgt.minRow) % srcHeight);\n        const srcC = src.minCol + ((c - tgt.minCol) % srcWidth);\n        \n        const field = fields[c];\n        const srcField = fields[srcC];\n        \n        if (data[r] && data[srcR]) {\n          filledCells.push({\n            rowIndex: r,\n            field,\n            previousValue: data[r][field],\n            newValue: data[srcR][srcField]\n          });\n        }\n      }\n    }\n    \n    return { filledCells };\n  }\n  \n  /** Format a 2D array of values as TSV string */\n  formatAsTsv(values: unknown[][]): string {\n    return values.map(row => {\n      return row.map(val => {\n        if (val === null || val === undefined) return '';\n        let str = String(val);\n        // Escape quotes and wrap in quotes if contains delimiter or newline\n        if (str.includes('\\t') || str.includes('\\n') || str.includes('\"')) {\n          str = `\"${str.replace(/\"/g, '\"\"')}\"`;\n        }\n        return str;\n      }).join('\\t');\n    }).join('\\n');\n  }\n\n  /** Helper to get min/max row and col indices from ranges */\n  private getBounds(ranges: CellRange[], fields: string[]) {\n    let minRow = Infinity;\n    let maxRow = -Infinity;\n    let minCol = Infinity;\n    let maxCol = -Infinity;\n\n    for (const range of ranges) {\n      minRow = Math.min(minRow, range.start.rowIndex, range.end.rowIndex);\n      maxRow = Math.max(maxRow, range.start.rowIndex, range.end.rowIndex);\n      \n      const startCol = fields.indexOf(range.start.colField);\n      const endCol = fields.indexOf(range.end.colField);\n      \n      if (startCol !== -1 && endCol !== -1) {\n        minCol = Math.min(minCol, startCol, endCol);\n        maxCol = Math.max(maxCol, startCol, endCol);\n      }\n    }\n    \n    return { minRow, maxRow, minCol, maxCol };\n  }\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\n/**\n * Enterprise virtualization engine for the DataGrid.\n * Handles both row (vertical) and column (horizontal) virtualization\n * for high-performance rendering of massive datasets (100K+ rows, 200+ columns).\n *\n * Row virtualization renders only the visible rows plus a configurable buffer,\n * using spacer elements to maintain correct scroll position.\n *\n * Column virtualization renders only the visible columns plus a buffer,\n * using left/right spacer cells to maintain correct horizontal scroll position.\n */\n@Injectable()\nexport class GridVirtualizationService {\n  // ─── Configuration ──────────────────────────────────────────────────\n  readonly rowHeight = signal<number>(49);\n  readonly viewportHeight = signal<number>(600);\n  readonly viewportWidth = signal<number>(1200);\n  readonly scrollTop = signal<number>(0);\n  readonly scrollLeft = signal<number>(0);\n  readonly totalRows = signal<number>(0);\n  readonly columnWidths = signal<number[]>([]);\n  readonly rowBuffer = signal<number>(5);\n  readonly colBuffer = signal<number>(2);\n\n  // ─── Variable row height support ────────────────────────────────────\n  private readonly rowHeightCache = new Map<number, number>();\n  readonly useVariableHeight = signal<boolean>(false);\n\n  // ─── Infinite scroll ────────────────────────────────────────────────\n  readonly infiniteScrollEnabled = signal<boolean>(false);\n  readonly infiniteScrollThreshold = signal<number>(200); // px from bottom\n  readonly isLoadingMore = signal<boolean>(false);\n  private loadedBlockRanges: Array<{ start: number; end: number }> = [];\n\n  // ─── Row Virtualization Computed Signals ─────────────────────────────\n\n  /** Index of the first visible row (0-based) */\n  readonly startRowIndex = computed(() => {\n    if (this.useVariableHeight()) {\n      return this.findRowAtOffset(this.scrollTop());\n    }\n    const idx = Math.floor(this.scrollTop() / this.rowHeight());\n    return Math.max(0, idx - this.rowBuffer());\n  });\n\n  /** Index of the last visible row (0-based, exclusive) */\n  readonly endRowIndex = computed(() => {\n    if (this.useVariableHeight()) {\n      const startOffset = this.scrollTop();\n      const endOffset = startOffset + this.viewportHeight();\n      const endIdx = this.findRowAtOffset(endOffset);\n      return Math.min(this.totalRows(), endIdx + this.rowBuffer() + 1);\n    }\n    const visibleCount = Math.ceil(this.viewportHeight() / this.rowHeight());\n    const endIdx = this.startRowIndex() + visibleCount + this.rowBuffer() * 2;\n    return Math.min(this.totalRows(), endIdx);\n  });\n\n  /** Total virtual content height for the scrollbar */\n  readonly totalContentHeight = computed(() => {\n    if (this.useVariableHeight()) {\n      return this.computeTotalVariableHeight();\n    }\n    return this.totalRows() * this.rowHeight();\n  });\n\n  /** Top spacer height (space before the first rendered row) */\n  readonly topSpacerHeight = computed(() => {\n    if (this.useVariableHeight()) {\n      return this.computeHeightRange(0, this.startRowIndex());\n    }\n    return this.startRowIndex() * this.rowHeight();\n  });\n\n  /** Bottom spacer height (space after the last rendered row) */\n  readonly bottomSpacerHeight = computed(() => {\n    if (this.useVariableHeight()) {\n      return this.computeHeightRange(this.endRowIndex(), this.totalRows());\n    }\n    return Math.max(0, (this.totalRows() - this.endRowIndex()) * this.rowHeight());\n  });\n\n  /** Number of rows currently rendered in the DOM */\n  readonly renderedRowCount = computed(() => this.endRowIndex() - this.startRowIndex());\n\n  // ─── Column Virtualization Computed Signals ──────────────────────────\n\n  /** Index of the first visible column (0-based) */\n  readonly startColIndex = computed(() => {\n    const widths = this.columnWidths();\n    if (!widths.length) return 0;\n    let offset = 0;\n    for (let i = 0; i < widths.length; i++) {\n      if (offset + widths[i] > this.scrollLeft()) {\n        return Math.max(0, i - this.colBuffer());\n      }\n      offset += widths[i];\n    }\n    return Math.max(0, widths.length - 1);\n  });\n\n  /** Index of the last visible column (0-based, exclusive) */\n  readonly endColIndex = computed(() => {\n    const widths = this.columnWidths();\n    if (!widths.length) return 0;\n    const endOffset = this.scrollLeft() + this.viewportWidth();\n    let offset = 0;\n    for (let i = 0; i < widths.length; i++) {\n      offset += widths[i];\n      if (offset >= endOffset) {\n        return Math.min(widths.length, i + this.colBuffer() + 1);\n      }\n    }\n    return widths.length;\n  });\n\n  /** Total virtual content width for horizontal scrollbar */\n  readonly totalContentWidth = computed(() => {\n    return this.columnWidths().reduce((sum, w) => sum + w, 0);\n  });\n\n  /** Left spacer width (space before first rendered column) */\n  readonly leftSpacerWidth = computed(() => {\n    const widths = this.columnWidths();\n    let total = 0;\n    for (let i = 0; i < this.startColIndex() && i < widths.length; i++) {\n      total += widths[i];\n    }\n    return total;\n  });\n\n  /** Right spacer width (space after last rendered column) */\n  readonly rightSpacerWidth = computed(() => {\n    const widths = this.columnWidths();\n    let total = 0;\n    for (let i = this.endColIndex(); i < widths.length; i++) {\n      total += widths[i];\n    }\n    return total;\n  });\n\n  // ─── Public Methods ──────────────────────────────────────────────────\n\n  /** Update scroll position from the viewport scroll event */\n  onScroll(scrollTop: number, scrollLeft: number): void {\n    this.scrollTop.set(scrollTop);\n    this.scrollLeft.set(scrollLeft);\n  }\n\n  /** Update viewport dimensions (e.g., on resize) */\n  updateViewportSize(width: number, height: number): void {\n    this.viewportWidth.set(width);\n    this.viewportHeight.set(height);\n  }\n\n  /** Set or update the measured height for a specific row (variable height mode) */\n  setRowHeight(rowIndex: number, height: number): void {\n    this.rowHeightCache.set(rowIndex, height);\n  }\n\n  /** Get the height of a specific row */\n  getRowHeight(rowIndex: number): number {\n    if (this.useVariableHeight()) {\n      return this.rowHeightCache.get(rowIndex) ?? this.rowHeight();\n    }\n    return this.rowHeight();\n  }\n\n  /** Clear the variable row height cache */\n  clearHeightCache(): void {\n    this.rowHeightCache.clear();\n  }\n\n  /** Scroll to a specific row index */\n  scrollToRow(rowIndex: number): number {\n    if (this.useVariableHeight()) {\n      return this.computeHeightRange(0, rowIndex);\n    }\n    return rowIndex * this.rowHeight();\n  }\n\n  /** Scroll to a specific column index */\n  scrollToColumn(colIndex: number): number {\n    const widths = this.columnWidths();\n    let offset = 0;\n    for (let i = 0; i < colIndex && i < widths.length; i++) {\n      offset += widths[i];\n    }\n    return offset;\n  }\n\n  // ─── Infinite Scroll ─────────────────────────────────────────────────\n\n  /** Check if we should trigger loading more data */\n  shouldLoadMore(): boolean {\n    if (!this.infiniteScrollEnabled() || this.isLoadingMore()) return false;\n    const distanceFromBottom = this.totalContentHeight() - (this.scrollTop() + this.viewportHeight());\n    return distanceFromBottom < this.infiniteScrollThreshold();\n  }\n\n  /** Register a loaded block range */\n  registerLoadedBlock(start: number, end: number): void {\n    this.loadedBlockRanges.push({ start, end });\n    this.isLoadingMore.set(false);\n  }\n\n  /** Check if a row index has been loaded */\n  isRowLoaded(rowIndex: number): boolean {\n    return this.loadedBlockRanges.some(block => rowIndex >= block.start && rowIndex < block.end);\n  }\n\n  /** Reset infinite scroll state */\n  resetInfiniteScroll(): void {\n    this.loadedBlockRanges = [];\n    this.isLoadingMore.set(false);\n  }\n\n  // ─── Private Methods ─────────────────────────────────────────────────\n\n  /** Find the row index at a given pixel offset (variable height) */\n  private findRowAtOffset(offset: number): number {\n    let accumulated = 0;\n    const total = this.totalRows();\n    for (let i = 0; i < total; i++) {\n      accumulated += this.getRowHeight(i);\n      if (accumulated >= offset) return i;\n    }\n    return Math.max(0, total - 1);\n  }\n\n  /** Compute the total height of all rows (variable height) */\n  private computeTotalVariableHeight(): number {\n    let total = 0;\n    const rowCount = this.totalRows();\n    const defaultH = this.rowHeight();\n    for (let i = 0; i < rowCount; i++) {\n      total += this.rowHeightCache.get(i) ?? defaultH;\n    }\n    return total;\n  }\n\n  /** Compute the combined height of rows in a range [startIdx, endIdx) */\n  private computeHeightRange(startIdx: number, endIdx: number): number {\n    let total = 0;\n    const defaultH = this.rowHeight();\n    for (let i = startIdx; i < endIdx; i++) {\n      total += this.rowHeightCache.get(i) ?? defaultH;\n    }\n    return total;\n  }\n}\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * Enterprise keyboard navigation service for the DataGrid.\n * Centralizes all keyboard event handling including:\n * - Arrow key cell navigation\n * - Tab / Shift+Tab traversal\n * - Enter/Escape for edit mode\n * - Ctrl+Z/Y for undo/redo\n * - Ctrl+A for select all\n * - Ctrl+C/X/V for clipboard\n * - F2 for edit mode\n * - Delete for clearing cells\n */\n@Injectable()\nexport class GridKeyboardService {\n  /** Currently focused cell coordinates */\n  readonly focusedRow = signal<number>(-1);\n  readonly focusedCol = signal<number>(-1);\n\n  /** Whether the grid is in keyboard navigation mode */\n  readonly isNavigating = signal<boolean>(false);\n\n  /** Whether we're currently in cell edit mode */\n  readonly isEditMode = signal<boolean>(false);\n\n  /** Grid boundaries */\n  private maxRow = 0;\n  private maxCol = 0;\n  private editableFields: Set<string> = new Set();\n  private columnFields: string[] = [];\n\n  /** Callbacks registered by the grid component */\n  private handlers: GridKeyboardHandlers = {};\n\n  /** Initialize the keyboard service with grid dimensions and handlers */\n  initialize(config: GridKeyboardConfig): void {\n    this.maxRow = config.maxRow;\n    this.maxCol = config.maxCol;\n    this.columnFields = config.columnFields;\n    this.editableFields = new Set(config.editableFields ?? []);\n    this.handlers = config.handlers ?? {};\n  }\n\n  /** Update grid dimensions (e.g., after data change) */\n  updateDimensions(maxRow: number, maxCol: number): void {\n    this.maxRow = maxRow;\n    this.maxCol = maxCol;\n\n    // Clamp focused cell within bounds\n    if (this.focusedRow() >= maxRow) this.focusedRow.set(Math.max(0, maxRow - 1));\n    if (this.focusedCol() >= maxCol) this.focusedCol.set(Math.max(0, maxCol - 1));\n  }\n\n  /** Handle keydown events from the grid */\n  handleKeyDown(event: KeyboardEvent): GridKeyboardAction | null {\n    const key = event.key;\n    const ctrl = event.ctrlKey || event.metaKey;\n    const shift = event.shiftKey;\n\n    // ─── Edit Mode Shortcuts ───────────────────────────────────────\n    if (this.isEditMode()) {\n      switch (key) {\n        case 'Escape':\n          event.preventDefault();\n          this.isEditMode.set(false);\n          return { type: 'cancel-edit' };\n        case 'Enter':\n          event.preventDefault();\n          this.isEditMode.set(false);\n          return { type: 'save-edit' };\n        case 'Tab':\n          event.preventDefault();\n          this.isEditMode.set(false);\n          if (shift) {\n            this.moveFocus('left');\n          } else {\n            this.moveFocus('right');\n          }\n          return { type: 'save-edit-and-move', direction: shift ? 'left' : 'right' };\n        default:\n          return null; // Let the input handle the key\n      }\n    }\n\n    // ─── Navigation Keys ───────────────────────────────────────────\n    switch (key) {\n      case 'ArrowUp':\n        event.preventDefault();\n        if (shift) return this.extendSelection('up');\n        this.moveFocus('up');\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'ArrowDown':\n        event.preventDefault();\n        if (shift) return this.extendSelection('down');\n        this.moveFocus('down');\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        if (shift) return this.extendSelection('left');\n        this.moveFocus('left');\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'ArrowRight':\n        event.preventDefault();\n        if (shift) return this.extendSelection('right');\n        this.moveFocus('right');\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'Tab':\n        event.preventDefault();\n        this.moveFocus(shift ? 'left' : 'right');\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'Home':\n        event.preventDefault();\n        if (ctrl) {\n          this.focusedRow.set(0);\n          this.focusedCol.set(0);\n        } else {\n          this.focusedCol.set(0);\n        }\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'End':\n        event.preventDefault();\n        if (ctrl) {\n          this.focusedRow.set(this.maxRow - 1);\n          this.focusedCol.set(this.maxCol - 1);\n        } else {\n          this.focusedCol.set(this.maxCol - 1);\n        }\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'PageUp':\n        event.preventDefault();\n        this.focusedRow.update(r => Math.max(0, r - 10));\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      case 'PageDown':\n        event.preventDefault();\n        this.focusedRow.update(r => Math.min(this.maxRow - 1, r + 10));\n        return { type: 'navigate', row: this.focusedRow(), col: this.focusedCol() };\n\n      // ─── Edit Mode Entry ───────────────────────────────────────\n      case 'Enter':\n        event.preventDefault();\n        if (this.canEditCurrentCell()) {\n          this.isEditMode.set(true);\n          return { type: 'begin-edit', row: this.focusedRow(), col: this.focusedCol() };\n        }\n        return null;\n\n      case 'F2':\n        event.preventDefault();\n        if (this.canEditCurrentCell()) {\n          this.isEditMode.set(true);\n          return { type: 'begin-edit', row: this.focusedRow(), col: this.focusedCol() };\n        }\n        return null;\n\n      // ─── Deletion ──────────────────────────────────────────────\n      case 'Delete':\n      case 'Backspace':\n        if (ctrl) return null;\n        event.preventDefault();\n        return { type: 'clear-cells' };\n\n      // ─── Clipboard & Undo ──────────────────────────────────────\n      default:\n        break;\n    }\n\n    // ─── Ctrl Shortcuts ──────────────────────────────────────────\n    if (ctrl) {\n      switch (key.toLowerCase()) {\n        case 'c':\n          return { type: 'copy' };\n        case 'x':\n          return { type: 'cut' };\n        case 'v':\n          return { type: 'paste' };\n        case 'z':\n          event.preventDefault();\n          return shift ? { type: 'redo' } : { type: 'undo' };\n        case 'y':\n          event.preventDefault();\n          return { type: 'redo' };\n        case 'a':\n          event.preventDefault();\n          return { type: 'select-all' };\n        default:\n          return null;\n      }\n    }\n\n    // ─── Quick Edit: printable character starts edit mode ─────────\n    if (key.length === 1 && !ctrl && this.canEditCurrentCell()) {\n      this.isEditMode.set(true);\n      return { type: 'quick-edit', row: this.focusedRow(), col: this.focusedCol(), char: key };\n    }\n\n    return null;\n  }\n\n  /** Set focus to a specific cell */\n  setFocus(row: number, col: number): void {\n    this.focusedRow.set(Math.max(0, Math.min(row, this.maxRow - 1)));\n    this.focusedCol.set(Math.max(0, Math.min(col, this.maxCol - 1)));\n    this.isNavigating.set(true);\n  }\n\n  /** Clear focus */\n  clearFocus(): void {\n    this.focusedRow.set(-1);\n    this.focusedCol.set(-1);\n    this.isNavigating.set(false);\n    this.isEditMode.set(false);\n  }\n\n  /** Get the field name of the currently focused column */\n  getFocusedField(): string | null {\n    const col = this.focusedCol();\n    return col >= 0 && col < this.columnFields.length ? this.columnFields[col] : null;\n  }\n\n  // ─── Private Methods ────────────────────────────────────────────────\n\n  private moveFocus(direction: 'up' | 'down' | 'left' | 'right'): void {\n    switch (direction) {\n      case 'up':\n        this.focusedRow.update(r => Math.max(0, r - 1));\n        break;\n      case 'down':\n        this.focusedRow.update(r => Math.min(this.maxRow - 1, r + 1));\n        break;\n      case 'left':\n        this.focusedCol.update(c => {\n          if (c > 0) return c - 1;\n          // Wrap to previous row\n          const row = this.focusedRow();\n          if (row > 0) {\n            this.focusedRow.set(row - 1);\n            return this.maxCol - 1;\n          }\n          return 0;\n        });\n        break;\n      case 'right':\n        this.focusedCol.update(c => {\n          if (c < this.maxCol - 1) return c + 1;\n          // Wrap to next row\n          const row = this.focusedRow();\n          if (row < this.maxRow - 1) {\n            this.focusedRow.set(row + 1);\n            return 0;\n          }\n          return this.maxCol - 1;\n        });\n        break;\n    }\n  }\n\n  private extendSelection(direction: 'up' | 'down' | 'left' | 'right'): GridKeyboardAction {\n    this.moveFocus(direction);\n    return {\n      type: 'extend-selection',\n      row: this.focusedRow(),\n      col: this.focusedCol(),\n      direction\n    };\n  }\n\n  private canEditCurrentCell(): boolean {\n    const field = this.getFocusedField();\n    return field !== null && this.editableFields.has(field);\n  }\n}\n\n// ─── Interfaces ──────────────────────────────────────────────────────────\n\nexport interface GridKeyboardConfig {\n  maxRow: number;\n  maxCol: number;\n  columnFields: string[];\n  editableFields?: string[];\n  handlers?: GridKeyboardHandlers;\n}\n\nexport interface GridKeyboardHandlers {\n  onNavigate?: (row: number, col: number) => void;\n  onBeginEdit?: (row: number, col: number) => void;\n  onSaveEdit?: () => void;\n  onCancelEdit?: () => void;\n  onCopy?: () => void;\n  onPaste?: () => void;\n  onUndo?: () => void;\n  onRedo?: () => void;\n}\n\nexport interface GridKeyboardAction {\n  type:\n    | 'navigate'\n    | 'begin-edit'\n    | 'quick-edit'\n    | 'save-edit'\n    | 'cancel-edit'\n    | 'save-edit-and-move'\n    | 'extend-selection'\n    | 'copy'\n    | 'cut'\n    | 'paste'\n    | 'undo'\n    | 'redo'\n    | 'select-all'\n    | 'clear-cells';\n  row?: number;\n  col?: number;\n  direction?: 'up' | 'down' | 'left' | 'right';\n  char?: string;\n}\n","/**\n * Pure sort comparator functions for the enterprise data grid.\n * Supports multi-column sorting, natural sort, and type-aware comparison.\n */\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortDescriptor {\n  field: string;\n  dir: SortDirection;\n}\n\n/** Natural sort comparator — handles mixed alpha-numeric strings (e.g. 'item2' before 'item10') */\nexport function naturalCompare(a: string, b: string): number {\n  const re = /(\\d+)|(\\D+)/g;\n  const ax: Array<[number, string]> = [];\n  const bx: Array<[number, string]> = [];\n  let m: RegExpExecArray | null;\n  while ((m = re.exec(a))) ax.push([m[1] ? parseInt(m[1], 10) : Infinity, m[2] || '']);\n  re.lastIndex = 0;\n  while ((m = re.exec(b))) bx.push([m[1] ? parseInt(m[1], 10) : Infinity, m[2] || '']);\n  const len = Math.min(ax.length, bx.length);\n  for (let i = 0; i < len; i++) {\n    const nn = (ax[i][0] as number) - (bx[i][0] as number) || ax[i][1].localeCompare(bx[i][1]);\n    if (nn) return nn;\n  }\n  return ax.length - bx.length;\n}\n\n/** Type-aware value comparison: handles string, number, Date, boolean, null/undefined */\nexport function compareValues(a: unknown, b: unknown): number {\n  if (a === b) return 0;\n  if (a === null || a === undefined) return -1;\n  if (b === null || b === undefined) return 1;\n\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() - b.getTime();\n  }\n  if (typeof a === 'number' && typeof b === 'number') {\n    return a - b;\n  }\n  if (typeof a === 'string' && typeof b === 'string') {\n    return naturalCompare(a, b);\n  }\n  if (typeof a === 'boolean' && typeof b === 'boolean') {\n    return a === b ? 0 : a ? 1 : -1;\n  }\n  return String(a).localeCompare(String(b));\n}\n\n/** Single-field sort */\nexport function sortByField<T extends Record<string, unknown>>(data: T[], field: string, dir: SortDirection): T[] {\n  return [...data].sort((a, b) => {\n    const result = compareValues(a[field], b[field]);\n    return dir === 'asc' ? result : -result;\n  });\n}\n\n/** Multi-field sort (ordered priority) */\nexport function sortByMultipleFields<T extends Record<string, unknown>>(data: T[], descriptors: SortDescriptor[]): T[] {\n  if (!descriptors.length) return data;\n  return [...data].sort((a, b) => {\n    for (const desc of descriptors) {\n      const result = compareValues(a[desc.field], b[desc.field]);\n      if (result !== 0) return desc.dir === 'asc' ? result : -result;\n    }\n    return 0;\n  });\n}\n","import { FilterCondition, FilterExpression, GridFilterState } from '../models';\n\n/** Evaluate a single filter condition against a row */\nexport function evaluateCondition<T extends Record<string, unknown>>(row: T, condition: FilterCondition): boolean {\n  const { field, type, value } = condition;\n  const cellValue = row[field];\n\n  // Handle empty checks first\n  if (type === 'isEmpty') return cellValue === null || cellValue === undefined || cellValue === '';\n  if (type === 'isNotEmpty') return cellValue !== null && cellValue !== undefined && cellValue !== '';\n\n  if (cellValue === null || cellValue === undefined) return false;\n\n  const normalizeStr = (v: unknown) => String(v).toLowerCase();\n\n  switch (type) {\n    case 'contains':\n      return normalizeStr(cellValue).includes(normalizeStr(value));\n    case 'eq':\n      return cellValue === value || normalizeStr(cellValue) === normalizeStr(value);\n    case 'neq':\n      return cellValue !== value && normalizeStr(cellValue) !== normalizeStr(value);\n    case 'startsWith':\n      return normalizeStr(cellValue).startsWith(normalizeStr(value));\n    case 'endsWith':\n      return normalizeStr(cellValue).endsWith(normalizeStr(value));\n    case 'gt':\n      return Number(cellValue) > Number(value);\n    case 'gte':\n      return Number(cellValue) >= Number(value);\n    case 'lt':\n      return Number(cellValue) < Number(value);\n    case 'lte':\n      return Number(cellValue) <= Number(value);\n    case 'between': {\n      const val = Number(cellValue);\n      if (condition.valueTo !== undefined) {\n        return val >= Number(value) && val <= Number(condition.valueTo);\n      }\n      if (Array.isArray(value) && value.length === 2) {\n        return val >= Number(value[0]) && val <= Number(value[1]);\n      }\n      return false;\n    }\n    case 'in': {\n      if (Array.isArray(value)) {\n        return value.some(v => v === cellValue || normalizeStr(v) === normalizeStr(cellValue));\n      }\n      return false;\n    }\n    case 'before': {\n      const dateCell = cellValue instanceof Date ? cellValue : new Date(cellValue as string);\n      const dateVal = value instanceof Date ? value : new Date(value as string);\n      return dateCell.getTime() < dateVal.getTime();\n    }\n    case 'after': {\n      const dateCell = cellValue instanceof Date ? cellValue : new Date(cellValue as string);\n      const dateVal = value instanceof Date ? value : new Date(value as string);\n      return dateCell.getTime() > dateVal.getTime();\n    }\n    case 'isTrue':\n      return cellValue === true || normalizeStr(cellValue) === 'true';\n    case 'isFalse':\n      return cellValue === false || normalizeStr(cellValue) === 'false';\n    default:\n      return false;\n  }\n}\n\n/** Recursively evaluate a filter expression tree (AND/OR groups) */\nexport function evaluateExpression<T extends Record<string, unknown>>(row: T, expression: FilterExpression): boolean {\n  if (!expression.conditions || expression.conditions.length === 0) return true;\n\n  if (expression.operator === 'AND') {\n    return expression.conditions.every((item: FilterCondition | FilterExpression) => {\n      if ('operator' in item && 'conditions' in item) {\n        return evaluateExpression(row, item as FilterExpression);\n      }\n      return evaluateCondition(row, item as FilterCondition);\n    });\n  } else {\n    return expression.conditions.some((item: FilterCondition | FilterExpression) => {\n      if ('operator' in item && 'conditions' in item) {\n        return evaluateExpression(row, item as FilterExpression);\n      }\n      return evaluateCondition(row, item as FilterCondition);\n    });\n  }\n}\n\n/** Apply legacy GridFilterState[] filters (backward-compatible) */\nexport function applyLegacyFilters<T extends Record<string, unknown>>(data: T[], filters: GridFilterState[]): T[] {\n  if (!filters || filters.length === 0) return data;\n\n  return data.filter(row => {\n    return filters.every(filter => {\n      const condition: FilterCondition = {\n        field: filter.field,\n        type: (filter.operator as FilterCondition['type']) || 'contains',\n        value: filter.value\n      };\n      return evaluateCondition(row, condition);\n    });\n  });\n}\n\n/** Apply a FilterExpression tree to a dataset */\nexport function applyFilterExpression<T extends Record<string, unknown>>(data: T[], expression: FilterExpression | null): T[] {\n  if (!expression) return data;\n  return data.filter(row => evaluateExpression(row, expression));\n}\n\n/** Apply global text search across all fields */\nexport function applyGlobalSearch<T extends Record<string, unknown>>(data: T[], searchText: string, fields?: string[]): T[] {\n  if (!searchText) return data;\n  const searchLower = searchText.toLowerCase();\n\n  return data.filter(row => {\n    const keys = fields || Object.keys(row);\n    return keys.some(key => {\n      const val = row[key];\n      if (val === null || val === undefined) return false;\n      return String(val).toLowerCase().includes(searchLower);\n    });\n  });\n}\n","import { GridStatusBarAggregates } from '../models';\n\nexport type AggregateFunction = 'sum' | 'avg' | 'count' | 'min' | 'max';\n\n/** Compute a single aggregate across a numeric field */\nexport function computeAggregate<T extends Record<string, unknown>>(data: T[], field: string, fn: AggregateFunction): number | string {\n  if (!data || data.length === 0) return 0;\n  \n  const values = data.map(item => {\n    const val = item[field];\n    return typeof val === 'number' ? val : Number(val);\n  }).filter(val => !isNaN(val));\n\n  if (fn === 'count') return data.length;\n  \n  if (values.length === 0) return 0;\n\n  switch (fn) {\n    case 'sum':\n      return values.reduce((acc, curr) => acc + curr, 0);\n    case 'avg':\n      return values.reduce((acc, curr) => acc + curr, 0) / values.length;\n    case 'min':\n      return Math.min(...values);\n    case 'max':\n      return Math.max(...values);\n    default:\n      return 0;\n  }\n}\n\n/** Compute all aggregates for a set of values (for status bar) */\nexport function computeStatusBarAggregates(values: unknown[]): GridStatusBarAggregates {\n  const numericValues = values\n    .map(v => typeof v === 'number' ? v : Number(v))\n    .filter(v => !isNaN(v));\n\n  const count = values.length;\n  if (numericValues.length === 0) {\n    return { sum: 0, average: 0, count, min: 0, max: 0 };\n  }\n\n  const sum = numericValues.reduce((acc, curr) => acc + curr, 0);\n  const avg = sum / numericValues.length;\n  const min = Math.min(...numericValues);\n  const max = Math.max(...numericValues);\n\n  return { sum, average: avg, count, min, max };\n}\n\n/** Compute group-level aggregates for all aggregatable columns */\nexport function computeGroupAggregates<T extends Record<string, unknown>>(\n  items: T[], \n  aggregateDefs: { field: string; fn: AggregateFunction }[]\n): Record<string, number | string> {\n  const result: Record<string, number | string> = {};\n  \n  for (const def of aggregateDefs) {\n    result[def.field] = computeAggregate(items, def.field, def.fn);\n  }\n  \n  return result;\n}\n\n/** Format aggregate value for display (respects locale) */\nexport function formatAggregateValue(value: number | string, fn: AggregateFunction): string {\n  const numVal = typeof value === 'string' ? Number(value) : value;\n  if (isNaN(numVal)) return String(value);\n\n  const formatter = new Intl.NumberFormat('en-US', {\n    maximumFractionDigits: fn === 'avg' ? 2 : (fn === 'count' ? 0 : 2)\n  });\n  \n  return formatter.format(numVal);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal, effect } from '@angular/core';\n\nexport interface PivotValueDef {\n  field: string;\n  label?: string;\n  aggregate?: 'sum' | 'count' | 'avg' | 'min' | 'max' | 'custom';\n  customAggregate?: (items: Record<string, unknown>[]) => number | string;\n  formatter?: (value: number | string) => string;\n}\n\ninterface PivotColumn {\n  key: string;\n  label: string;\n  isTotal?: boolean;\n}\n\ninterface PivotRow {\n  key: string;\n  label: string;\n  values: Record<string, unknown>;\n  isTotal?: boolean;\n}\n\n@Component({\n  selector: 'ngx-pivot-grid',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"ngx-pivot-grid-wrapper\">\n      <!-- Toolbar & Field Chooser Header -->\n      <div class=\"pivot-toolbar\" *ngIf=\"showFieldChooser()\">\n        <div class=\"toolbar-title\">\n          <span class=\"pivot-icon\">📊</span>\n          <span class=\"title-text\">Pivot Analysis Studio</span>\n        </div>\n        <button type=\"button\" class=\"field-chooser-toggle\" (click)=\"isChooserOpen.set(!isChooserOpen())\">\n          ⚙ Field Chooser\n        </button>\n      </div>\n\n      <!-- Collapsible Field Chooser Drawer -->\n      <div class=\"field-chooser-drawer\" *ngIf=\"showFieldChooser() && isChooserOpen()\">\n        <div class=\"chooser-grid\">\n          <div class=\"chooser-section\">\n            <span class=\"section-label\">Row Dimensions</span>\n            <div class=\"field-chips-list\">\n              @for (field of activeRows(); track field) {\n                <span class=\"field-chip row-chip\">\n                  {{ field }}\n                  <button type=\"button\" class=\"remove-chip\" (click)=\"removeRowField(field)\">✕</button>\n                </span>\n              }\n            </div>\n          </div>\n\n          <div class=\"chooser-section\">\n            <span class=\"section-label\">Column Dimensions</span>\n            <div class=\"field-chips-list\">\n              @for (field of activeCols(); track field) {\n                <span class=\"field-chip col-chip\">\n                  {{ field }}\n                  <button type=\"button\" class=\"remove-chip\" (click)=\"removeColField(field)\">✕</button>\n                </span>\n              }\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Pivot Data Table -->\n      <div class=\"ngx-pivot-grid\">\n        <table>\n          <thead>\n            <tr>\n              <th class=\"row-header\">{{ rowHeaderLabel() }}</th>\n              @for (column of pivotColumns(); track column.key) {\n                @for (value of activeValues(); track value.field) {\n                  <th [class.total-col-header]=\"column.isTotal\">\n                    {{ column.label }}@if (activeValues().length > 1) { <span> / {{ value.label || value.field }}</span> }\n                  </th>\n                }\n              }\n            </tr>\n          </thead>\n          <tbody>\n            @for (row of pivotRows(); track row.key) {\n              <tr [class.grand-total-row]=\"row.isTotal\">\n                <th class=\"row-label\" [class.grand-total-header]=\"row.isTotal\">{{ row.label }}</th>\n                @for (column of pivotColumns(); track column.key) {\n                  @for (value of activeValues(); track value.field) {\n                    <td [class.grand-total-cell]=\"row.isTotal || column.isTotal\">\n                      {{ aggregateCell(row, column, value) }}\n                    </td>\n                  }\n                }\n              </tr>\n            }\n          </tbody>\n        </table>\n      </div>\n    </div>\n  `,\n  styles: [`\n    :host { display: block; }\n\n    .ngx-pivot-grid-wrapper {\n      width: 100%;\n      border: 1px solid var(--border-color, #dbe3ee);\n      border-radius: 12px;\n      background: var(--bg-secondary, #ffffff);\n      overflow: hidden;\n      box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n      font-family: var(--ngx-font-family, inherit);\n    }\n\n    .pivot-toolbar {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 12px 16px;\n      background: var(--border-light, #f8fafc);\n      border-bottom: 1px solid var(--border-color, #e2e8f0);\n    }\n    .toolbar-title {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-weight: 700;\n      font-size: 14px;\n      color: var(--text-primary, #0f172a);\n    }\n    .field-chooser-toggle {\n      background: var(--bg-secondary, #ffffff);\n      border: 1px solid var(--border-color, #cbd5e1);\n      border-radius: 6px;\n      padding: 4px 10px;\n      font-size: 12px;\n      font-weight: 600;\n      cursor: pointer;\n      color: var(--text-primary, #334155);\n      transition: all 0.2s;\n    }\n    .field-chooser-toggle:hover {\n      background: #f1f5f9;\n    }\n\n    .field-chooser-drawer {\n      padding: 14px 16px;\n      background: #f1f5f9;\n      border-bottom: 1px solid var(--border-color, #e2e8f0);\n    }\n    .chooser-grid {\n      display: flex;\n      gap: 20px;\n      flex-wrap: wrap;\n    }\n    .chooser-section {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      flex: 1;\n      min-width: 180px;\n    }\n    .section-label {\n      font-size: 11px;\n      font-weight: 700;\n      text-transform: uppercase;\n      color: #64748b;\n    }\n    .field-chips-list {\n      display: flex;\n      gap: 6px;\n      flex-wrap: wrap;\n    }\n    .field-chip {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      padding: 3px 8px;\n      border-radius: 12px;\n      font-size: 11px;\n      font-weight: 600;\n      background: #ffffff;\n      border: 1px solid #cbd5e1;\n    }\n    .row-chip { border-color: #3b82f6; color: #1d4ed8; }\n    .col-chip { border-color: #10b981; color: #047857; }\n    .remove-chip {\n      background: transparent;\n      border: none;\n      font-size: 10px;\n      cursor: pointer;\n      color: #94a3b8;\n      padding: 0;\n    }\n    .remove-chip:hover { color: #ef4444; }\n\n    .ngx-pivot-grid {\n      width: 100%;\n      overflow: auto;\n    }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      min-width: 520px;\n      font-size: 13px;\n      color: var(--text-primary, #0f172a);\n    }\n    th, td {\n      padding: 10px 12px;\n      border-bottom: 1px solid var(--border-light, #edf2f7);\n      border-right: 1px solid var(--border-light, #edf2f7);\n      text-align: right;\n      white-space: nowrap;\n    }\n    thead th {\n      position: sticky;\n      top: 0;\n      z-index: 1;\n      background: var(--border-light, #f8fafc);\n      color: var(--text-secondary, #475569);\n      font-size: 11px;\n      font-weight: 800;\n      text-transform: uppercase;\n      letter-spacing: 0.4px;\n    }\n    thead th span { color: var(--text-primary, #0f172a); }\n    .row-header, .row-label {\n      position: sticky;\n      left: 0;\n      z-index: 2;\n      text-align: left;\n      background: var(--bg-secondary, #ffffff);\n    }\n    thead .row-header { z-index: 3; background: var(--border-light, #f8fafc); }\n    tbody tr:hover td, tbody tr:hover .row-label {\n      background: var(--primary-glow, rgba(79, 70, 229, 0.04));\n    }\n    tr:last-child th, tr:last-child td { border-bottom: none; }\n\n    /* Grand Total Row & Column styles */\n    .grand-total-row {\n      background: rgba(79, 70, 229, 0.06) !important;\n      font-weight: 700;\n    }\n    .grand-total-header {\n      background: #f1f5f9 !important;\n      font-weight: 800;\n    }\n    .grand-total-cell {\n      font-weight: 700;\n      background: rgba(79, 70, 229, 0.03);\n    }\n    .total-col-header {\n      background: #e2e8f0 !important;\n      color: #1e293b !important;\n      font-weight: 800 !important;\n    }\n  `]\n})\nexport class PivotGridComponent {\n  data = input<Record<string, unknown>[]>([]);\n  rows = input<string[]>([]);\n  columns = input<string[]>([]);\n  values = input<PivotValueDef[]>([{ field: 'value', aggregate: 'sum' }]);\n  emptyValue = input('-');\n  showGrandTotals = input<boolean>(true);\n  showFieldChooser = input<boolean>(true);\n\n  isChooserOpen = signal(false);\n  activeRows = signal<string[]>([]);\n  activeCols = signal<string[]>([]);\n  activeValues = signal<PivotValueDef[]>([]);\n\n  constructor() {\n    effect(() => {\n      this.activeRows.set([...this.rows()]);\n      this.activeCols.set([...this.columns()]);\n      this.activeValues.set([...this.values()]);\n    }, { allowSignalWrites: true });\n  }\n\n  pivotColumns = computed<PivotColumn[]>(() => {\n    const keys = new Map<string, string>();\n    const cols = this.activeCols();\n    for (const item of this.data()) {\n      const key = this.keyFor(item, cols);\n      keys.set(key, this.labelFor(item, cols));\n    }\n    const colsList: PivotColumn[] = Array.from(keys, ([key, label]) => ({ key, label }));\n\n    if (this.showGrandTotals()) {\n      colsList.push({ key: '__GRAND_TOTAL__', label: 'Grand Total', isTotal: true });\n    }\n\n    return colsList;\n  });\n\n  pivotRows = computed<PivotRow[]>(() => {\n    const rowsMap = new Map<string, PivotRow>();\n    const rowFields = this.activeRows();\n    for (const item of this.data()) {\n      const key = this.keyFor(item, rowFields);\n      if (!rowsMap.has(key)) {\n        rowsMap.set(key, { key, label: this.labelFor(item, rowFields), values: item });\n      }\n    }\n    const rowsList: PivotRow[] = Array.from(rowsMap.values());\n\n    if (this.showGrandTotals()) {\n      rowsList.push({ key: '__GRAND_TOTAL__', label: 'Grand Total', values: {}, isTotal: true });\n    }\n\n    return rowsList;\n  });\n\n  rowHeaderLabel(): string {\n    return this.activeRows().join(' / ') || 'Rows';\n  }\n\n  removeRowField(field: string): void {\n    this.activeRows.update(r => r.filter(f => f !== field));\n  }\n\n  removeColField(field: string): void {\n    this.activeCols.update(c => c.filter(f => f !== field));\n  }\n\n  aggregateCell(row: PivotRow, column: PivotColumn, value: PivotValueDef): string | number {\n    let items = this.data();\n\n    // Filter by row keys (unless Grand Total row)\n    if (!row.isTotal) {\n      items = items.filter(item => this.keyFor(item, this.activeRows()) === row.key);\n    }\n\n    // Filter by column keys (unless Grand Total column)\n    if (!column.isTotal) {\n      items = items.filter(item => this.keyFor(item, this.activeCols()) === column.key);\n    }\n\n    if (!items.length) return this.emptyValue();\n\n    let computedVal: number | string = 0;\n    const aggregate = value.aggregate ?? 'sum';\n\n    if (aggregate === 'custom' && value.customAggregate) {\n      computedVal = value.customAggregate(items);\n    } else if (aggregate === 'count') {\n      computedVal = items.length;\n    } else {\n      const numbers = items.map(item => Number(item[value.field])).filter(item => Number.isFinite(item));\n      if (!numbers.length) return this.emptyValue();\n      if (aggregate === 'avg') computedVal = this.round(numbers.reduce((sum, item) => sum + item, 0) / numbers.length);\n      else if (aggregate === 'min') computedVal = Math.min(...numbers);\n      else if (aggregate === 'max') computedVal = Math.max(...numbers);\n      else computedVal = this.round(numbers.reduce((sum, item) => sum + item, 0));\n    }\n\n    if (value.formatter && typeof computedVal === 'number') {\n      return value.formatter(computedVal);\n    }\n\n    return computedVal;\n  }\n\n  private keyFor(item: Record<string, unknown>, fields: string[]): string {\n    return fields.map(field => String(item[field] ?? '')).join('||') || '__total__';\n  }\n\n  private labelFor(item: Record<string, unknown>, fields: string[]): string {\n    return fields.map(field => String(item[field] ?? '')).filter(Boolean).join(' / ') || 'Total';\n  }\n\n  private round(value: number): number {\n    return Math.round(value * 100) / 100;\n  }\n}\n","/*\n * Public API Surface — secondary entry point: ngx-core-components/grid\n */\n\n// ─── Core Component & Directives ──────────────────────────────────────────\nexport {\n  DataGridComponent,\n  NgxGridCellTemplateDirective,\n  NgxGridEditCellTemplateDirective,\n  NgxGridHeaderTemplateDirective,\n  NgxGridFooterTemplateDirective,\n} from './data-grid/data-grid.component';\n\n// ─── Models & Interfaces ──────────────────────────────────────────────────\nexport type {\n  // Core models\n  GridColumnDef,\n  GridFilterState,\n  GridGroupState,\n  GridGroupResult,\n  GridSortState,\n  // Event interfaces\n  GridPageChangeEvent,\n  GridSortChangeEvent,\n  GridFilterChangeEvent,\n  GridGroupChangeEvent,\n  GridDataStateChangeEvent,\n  GridRowClickEvent,\n  GridRowUpdateEvent,\n  // Template contexts\n  GridHeaderTemplateContext,\n  GridCellTemplateContext,\n  GridRowTemplateContext,\n  GridDetailTemplateContext,\n  GridFooterTemplateContext,\n  // Enterprise interfaces\n  GridCellValidator,\n  TreeDataConfig,\n  FilterExpression,\n  FilterCondition,\n  GridInfiniteScrollEvent,\n  GridCellValidationError,\n  GridEditChangeset,\n  GridStatusBarAggregates,\n} from './data-grid/models';\n\n// ─── Services ─────────────────────────────────────────────────────────────\nexport { GridExportService } from './data-grid/grid-export.service';\nexport { GridExportXlsxService } from './data-grid/services/grid-export-xlsx.service';\nexport type { XlsxExportOptions, PdfExportOptions } from './data-grid/services/grid-export-xlsx.service';\nexport { GridStateService } from './data-grid/services/grid-state.service';\nexport { GridSelectionService } from './data-grid/services/grid-selection.service';\nexport { GridEditService } from './data-grid/services/grid-edit.service';\nexport { GridClipboardService } from './data-grid/services/grid-clipboard.service';\nexport { GridVirtualizationService } from './data-grid/services/grid-virtualization.service';\nexport { GridKeyboardService } from './data-grid/services/grid-keyboard.service';\nexport type { GridKeyboardConfig, GridKeyboardAction, GridKeyboardHandlers } from './data-grid/services/grid-keyboard.service';\n\n// ─── Sub-Components ───────────────────────────────────────────────────────\nexport { GridStatusBarComponent } from './data-grid/components/grid-status-bar/grid-status-bar.component';\nexport { GridFilterBuilderComponent } from './data-grid/components/grid-filter-builder/grid-filter-builder.component';\n\n// ─── Utilities ────────────────────────────────────────────────────────────\nexport { naturalCompare, compareValues, sortByField, sortByMultipleFields } from './data-grid/utils/grid-sort.util';\nexport type { SortDirection, SortDescriptor } from './data-grid/utils/grid-sort.util';\nexport { evaluateCondition, evaluateExpression, applyLegacyFilters, applyFilterExpression, applyGlobalSearch } from './data-grid/utils/grid-filter.util';\nexport { computeAggregate, computeStatusBarAggregates, computeGroupAggregates, formatAggregateValue } from './data-grid/utils/grid-aggregate.util';\nexport type { AggregateFunction } from './data-grid/utils/grid-aggregate.util';\n\n// ─── Pivot Grid ───────────────────────────────────────────────────────────\nexport { PivotGridComponent } from './pivot-grid/pivot-grid.component';\nexport type { PivotValueDef } from './pivot-grid/pivot-grid.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}