{"version":3,"file":"gridengine-angular-datagrid.mjs","sources":["../../../projects/grid/src/lib/data-grid.ts","../../../projects/grid/src/lib/data-grid.html","../../../projects/grid/src/lib/pivot.ts","../../../projects/grid/src/lib/quick-chart.ts","../../../projects/grid/src/public-api.ts","../../../projects/grid/src/gridengine-angular-datagrid.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  Directive,\n  ElementRef,\n  OnInit,\n  TemplateRef,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n} from '@angular/core';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport type { ColDef } from '../models/col-def';\nimport type { CellValueChangedEvent, GridReadyEvent } from '../models/grid-events';\n\n/** Focuses its host element once inserted - used for the inline cell editor instead of the\n * disallowed `autofocus` HTML attribute (flagged by @angular-eslint/template/no-autofocus). */\n@Directive({ selector: '[gdAutoFocus]' })\nclass AutoFocusDirective implements AfterViewInit {\n  private readonly host = inject(ElementRef<HTMLElement>);\n\n  ngAfterViewInit(): void {\n    queueMicrotask(() => this.host.nativeElement.focus());\n  }\n}\n\n/** A column def merged with `defaultColDef` and its resolved flex-box sizing. */\ninterface ResolvedColumn<TData> {\n  def: ColDef<TData>;\n  key: string;\n  width: number;\n  pinned: 'left' | 'right' | null;\n  style: Record<string, string>;\n}\n\ninterface SortEntry {\n  key: string;\n  direction: 'asc' | 'desc';\n}\n\ninterface GroupRow {\n  key: string;\n  level: number;\n  field: string;\n  value: unknown;\n  count: number;\n  aggregates: Record<string, unknown>;\n}\n\ntype DisplayItem<TData> =\n  | { kind: 'group'; group: GroupRow }\n  | { kind: 'row'; row: TData; rowIndex: number; level?: number }\n  | { kind: 'detail'; row: TData; rowIndex: number };\n\ninterface ContextMenuAction {\n  label: string;\n  action: () => void;\n}\n\ninterface ContextMenuState {\n  x: number;\n  y: number;\n  items: ContextMenuAction[];\n}\n\n/** A serializable snapshot of user-driven grid layout state, for persistence via `getGridState()`\n * / `applyGridState()`. */\nexport interface GridLayoutState {\n  columnWidths: Record<string, number>;\n  columnOrder: string[] | null;\n  sort: SortEntry[];\n  columnFilters: Record<string, string>;\n  page: number;\n}\n\n@Component({\n  selector: 'gd-data-grid',\n  imports: [NgClass, NgTemplateOutlet, ScrollingModule, AutoFocusDirective],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './data-grid.html',\n  styleUrl: './data-grid.css',\n})\nexport class DataGrid<TData = unknown> implements OnInit {\n  readonly rowData = input<readonly TData[]>([]);\n  readonly columnDefs = input<readonly ColDef<TData>[]>([]);\n  readonly defaultColDef = input<ColDef<TData> | undefined>(undefined);\n  /** Row height in px - the body is row-virtualized (CDK fixed-size viewport), so every row must be the same height. */\n  readonly rowHeight = input<number>(36);\n  /** CSS height of the scrollable body viewport, e.g. '480px' or '60vh'. */\n  readonly height = input<string>('480px');\n  /** Stable row identity for virtual-scroll trackBy AND row selection; defaults to positional\n   * index - supply a real id-based function (e.g. `(row) => row.id`) for selection to survive\n   * sorting/filtering correctly. */\n  readonly getRowId = input<(row: TData, index: number) => string | number>((_row, index) => index);\n  /** Global search text matched against every visible column's displayed value. */\n  readonly quickFilterText = input<string>('');\n  /** Enables client-side pagination; when true, the virtualized viewport is replaced with a pager. */\n  readonly pagination = input<boolean>(false);\n  /** Rows per page when `pagination` is enabled. */\n  readonly pageSize = input<number>(50);\n  /** Row selection mode; `'none'` disables selection entirely (default). */\n  readonly rowSelection = input<'none' | 'single' | 'multiple'>('none');\n  /** Starts inline editing on a single click instead of the default double-click. */\n  readonly singleClickEdit = input<boolean>(false);\n  /** Conditionally-applied row classes; each function receives the row object. */\n  readonly rowClassRules = input<Record<string, (row: TData) => boolean> | undefined>(undefined);\n  /** Built-in visual theme; sets CSS custom properties for colors. `'light'` (default) uses the\n   * grid's own hardcoded fallback colors, so it never needs its own overrides. */\n  readonly theme = input<'light' | 'dark' | 'high-contrast'>('light');\n  /** Controls cell padding (and thus visual row compactness) via CSS custom properties. */\n  readonly density = input<'compact' | 'normal' | 'comfortable'>('normal');\n  /** Shows a loading overlay over the body while data is being fetched/refreshed. */\n  readonly loading = input<boolean>(false);\n  /** Custom \"no rows\" overlay content; defaults to a plain \"No rows to display\" message. */\n  readonly noRowsTemplate = input<TemplateRef<void> | undefined>(undefined);\n  /** Per-row height override; falls back to `rowHeight()` when omitted. Only honored in\n   * non-virtualized (paginated) mode - the virtual-scroll viewport requires a single fixed\n   * `itemSize` for its fixed-size strategy, so virtualized rows always use `rowHeight()`. */\n  readonly getRowHeight = input<((row: TData, index: number) => number) | undefined>(undefined);\n  /** Enables hierarchical tree data: returns a row's children (or `undefined`/empty for a leaf).\n   * `rowData` provides the top-level (root) rows. Expand/collapse state is tracked per-row via\n   * `getRowId`. Mutually exclusive with row grouping (`ColDef.rowGroup`) in practice - if both are\n   * configured, row grouping takes priority. Filtering/sorting apply only to the root rows in\n   * `rowData`, not recursively to children - a documented v1 scope limitation. */\n  readonly getChildRows = input<((row: TData) => readonly TData[] | undefined) | undefined>(undefined);\n  /** Enables master/detail: rows get an expand toggle that reveals a full-width detail panel\n   * rendered from this template, `<ng-template #tpl let-row let-data=\"data\">...</ng-template>`.\n   * Composes with row grouping/tree data (detail rows are injected after that structure is\n   * resolved); not designed to combine with tree data's own first-cell toggle in the same grid. */\n  readonly detailRowTemplate = input<TemplateRef<{ $implicit: TData; data: TData }> | undefined>(undefined);\n  /** Pins a row to a fixed, always-visible section above (`'top'`) or below (`'bottom'`) the\n   * scrollable body, outside the normal filter/sort/page pipeline entirely - return `null` (or\n   * omit the input) for rows that should stay in the regular scrollable body. */\n  readonly isRowPinned = input<((row: TData) => 'top' | 'bottom' | null) | undefined>(undefined);\n  /** Enables drag-and-drop row reordering (native HTML5 drag-and-drop, via a drag handle in each\n   * row's first cell). The grid does not reorder `rowData` itself (a one-way input) - handle\n   * `(rowDragEnd)` and reorder your own array. Requires a real `getRowId` (not the default\n   * positional index) to resolve rows correctly once sorting/filtering has reordered them. */\n  readonly enableRowDrag = input<boolean>(false);\n  /** Customizes the right-click context menu's items; defaults to Copy cell/Copy row/Export CSV\n   * when omitted. Return an empty array to suppress the menu entirely for a given cell. */\n  readonly contextMenuItems = input<\n    ((params: { row: TData; col: ColDef<TData> | null }) => ContextMenuAction[]) | undefined\n  >(undefined);\n  /** Briefly highlights (\"flashes\") any cell whose displayed value changes between renders -\n   * useful for live/streaming data (e.g. an RxJS interval pushing new `rowData` snapshots).\n   * Requires a real `getRowId` (not the default positional index) so a row's identity survives\n   * across updates; otherwise every cell would appear to \"change\" whenever rows reorder. */\n  readonly enableChangeFlash = input<boolean>(false);\n  /** How long (ms) a flashed cell stays highlighted before the class is removed. */\n  readonly changeFlashDurationMs = input<number>(800);\n\n  readonly gridReady = output<GridReadyEvent>();\n  /** Fires with the full list of currently-selected row objects whenever selection changes. */\n  readonly selectionChanged = output<TData[]>();\n  /** Fires after an inline edit is committed (Enter or blur). */\n  readonly cellValueChanged = output<CellValueChangedEvent<TData>>();\n  /** Fires after a drag-and-drop row reorder; `fromIndex`/`toIndex` index into `rowData()`. The\n   * grid does not reorder its own data - apply the change to your `rowData` array in response. */\n  readonly rowDragEnd = output<{ row: TData; fromIndex: number; toIndex: number }>();\n\n  private readonly sortState = signal<SortEntry[]>([]);\n  private readonly columnFilters = signal<Record<string, string>>({});\n  /** Selected values per `filter: 'set'` column key; no entry means \"all values\" (no restriction). */\n  private readonly setFilters = signal<Record<string, ReadonlySet<string>>>({});\n  /** Which column's set-filter facet panel is open, plus its fixed-position coordinates (derived\n   * from the toggle button's bounding rect - see `toggleSetFilterPanel`) - `null` when closed.\n   * Uses `position: fixed` rather than a `position: absolute` + `overflow: visible` override\n   * because `.gd-cell` (and, via the CSS overflow-x/y interaction, `.gd-root` itself) clips\n   * overflowing descendants; fixed positioning sidesteps that entirely, matching the same\n   * pattern already used for the right-click context menu. */\n  private readonly openSetFilterPanel = signal<{ colKey: string; x: number; y: number } | null>(null);\n  private readonly currentPage = signal(0);\n  private readonly selection = signal<ReadonlyMap<string | number, TData>>(new Map());\n  private readonly editingCell = signal<{ rowKey: string | number; colKey: string } | null>(null);\n  /** Roving-tabindex active cell for keyboard navigation (arrows/Home/End/PageUp/PageDown) -\n   * exactly one cell is in the Tab order at a time (besides always-tabbable editable cells). */\n  private readonly activeCell = signal<{ rowIndex: number; colIndex: number }>({ rowIndex: 0, colIndex: 0 });\n  /** Row-group keys the user has collapsed; a key not in this set is expanded (default expanded). */\n  private readonly collapsedGroups = signal<ReadonlySet<string>>(new Set());\n  /** Row ids (via `getRowId`) with an expanded master/detail panel - default collapsed. */\n  private readonly expandedDetailRows = signal<ReadonlySet<string | number>>(new Set());\n  /** Open right-click context menu state (position + resolved items), or `null` when closed. */\n  protected readonly contextMenuState = signal<ContextMenuState | null>(null);\n  /** User-dragged column order, as a list of column keys; `null` uses `columnDefs`' natural order. */\n  private readonly columnOrder = signal<string[] | null>(null);\n  /** User-dragged column widths (px), keyed by column key; overrides `col.width` when present. */\n  private readonly columnWidthOverrides = signal<Record<string, number>>({});\n\n  protected readonly columns = computed<ResolvedColumn<TData>[]>(() => {\n    const fallback = this.defaultColDef();\n    const overrides = this.columnWidthOverrides();\n    const merged = this.columnDefs()\n      .filter((col) => !col.hide)\n      .map((col, index) => {\n        const def: ColDef<TData> = { ...fallback, ...col };\n        const key = def.field ?? def.headerName ?? String(index);\n        return { def, key, width: overrides[key] ?? def.width };\n      });\n\n    const ordered = applyColumnOrder(merged, this.columnOrder());\n    const grouped = groupByPinned(ordered);\n\n    let leftOffset = 0;\n    let rightOffset = grouped\n      .filter((entry) => entry.def.pinned === 'right')\n      .reduce((sum, entry) => sum + resolvedColumnWidth(entry.def, entry.width), 0);\n\n    return grouped.map((entry): ResolvedColumn<TData> => {\n      const width = resolvedColumnWidth(entry.def, entry.width);\n      const style = columnStyle(entry.def, entry.width);\n      if (entry.def.pinned === 'left') {\n        style['position'] = 'sticky';\n        style['left'] = `${leftOffset}px`;\n        style['z-index'] = '1';\n        leftOffset += width;\n      } else if (entry.def.pinned === 'right') {\n        rightOffset -= width;\n        style['position'] = 'sticky';\n        style['right'] = `${rightOffset}px`;\n        style['z-index'] = '1';\n      }\n      return { def: entry.def, key: entry.key, width, pinned: entry.def.pinned ?? null, style };\n    });\n  });\n\n  protected readonly hasColumnFilters = computed(() => this.columns().some((col) => !!col.def.filter));\n\n  /** Minimum total width of all columns - lets the grid provide its own horizontal scrollbar\n   * (via CSS `min-width` + `.gd-root { overflow-x: auto }`) instead of columns being silently\n   * clipped/pushed off-screen when the container is narrower than the content. */\n  protected readonly contentMinWidth = computed<string>(() => {\n    const total = this.columns().reduce((sum, col) => sum + col.width, 0);\n    return `${total}px`;\n  });\n\n  protected readonly filteredRows = computed<readonly TData[]>(() => {\n    const cols = this.columns();\n    const filters = this.columnFilters();\n    const setFilters = this.setFilters();\n    const { fieldTokens, remainingText } = parseSearchTokens(this.quickFilterText(), cols);\n    const quick = remainingText.trim().toLowerCase();\n    const pin = this.isRowPinned();\n    // Pinned rows are rendered in their own always-visible sections (see pinnedTopRows/\n    // pinnedBottomRows) and never participate in the normal filter/sort/page/scroll pipeline.\n    const candidateRows = pin ? this.rowData().filter((row) => !pin(row)) : this.rowData();\n    const activeColumnFilters = cols.filter((col) => (filters[col.key] ?? '').trim().length > 0);\n    const activeSetFilters = Object.entries(setFilters);\n    if (\n      activeColumnFilters.length === 0 &&\n      activeSetFilters.length === 0 &&\n      fieldTokens.length === 0 &&\n      !quick\n    ) {\n      return candidateRows;\n    }\n\n    return candidateRows.filter((row) => {\n      for (const col of activeColumnFilters) {\n        const filterText = filters[col.key].trim();\n        const type = col.def.filter === 'number' || col.def.filter === 'date' ? col.def.filter : 'text';\n        if (!matchesColumnFilter(this.cellValue(row, col.def), filterText, type)) return false;\n      }\n      for (const [colKey, selected] of activeSetFilters) {\n        const col = cols.find((c) => c.key === colKey);\n        if (col && !selected.has(this.cellDisplay(row, col.def))) return false;\n      }\n      for (const { col, value } of fieldTokens) {\n        if (!this.cellDisplay(row, col.def).toLowerCase().includes(value.toLowerCase())) return false;\n      }\n      if (quick && !cols.some((col) => this.cellDisplay(row, col.def).toLowerCase().includes(quick))) {\n        return false;\n      }\n      return true;\n    });\n  });\n\n  /** Distinct displayed values for a `filter: 'set'` column, with their count across ALL rows\n   * (not scoped to other active filters - a deliberate simplification over a fully \"faceted\"\n   * search where counts update live per other filters, to keep this feature reasonably scoped). */\n  protected facetsFor(col: ResolvedColumn<TData>): { value: string; count: number }[] {\n    const counts = new Map<string, number>();\n    for (const row of this.rowData()) {\n      const display = this.cellDisplay(row, col.def);\n      counts.set(display, (counts.get(display) ?? 0) + 1);\n    }\n    return Array.from(counts.entries())\n      .map(([value, count]) => ({ value, count }))\n      .sort((a, b) => a.value.localeCompare(b.value));\n  }\n\n  protected hasActiveSetFilter(col: ResolvedColumn<TData>): boolean {\n    return !!this.setFilters()[col.key];\n  }\n\n  protected isFacetSelected(col: ResolvedColumn<TData>, value: string): boolean {\n    const selected = this.setFilters()[col.key];\n    return !selected || selected.has(value);\n  }\n\n  protected toggleFacetValue(col: ResolvedColumn<TData>, value: string): void {\n    this.setFilters.update((current) => {\n      const allValues = this.facetsFor(col).map((facet) => facet.value);\n      const existing = current[col.key] ?? new Set(allValues);\n      const next = new Set(existing);\n      if (next.has(value)) next.delete(value);\n      else next.add(value);\n\n      const updated = { ...current };\n      // Selecting every value again is equivalent to \"no filter\" - drop the entry so\n      // hasActiveSetFilter()/the filter pipeline don't treat it as an active restriction.\n      if (next.size === allValues.length) delete updated[col.key];\n      else updated[col.key] = next;\n      return updated;\n    });\n  }\n\n  protected toggleSetFilterPanel(colKey: string, event: MouseEvent): void {\n    this.openSetFilterPanel.update((current) => {\n      if (current?.colKey === colKey) return null;\n      const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n      return { colKey, x: rect.left, y: rect.bottom };\n    });\n  }\n\n  protected isSetFilterPanelOpen(colKey: string): boolean {\n    return this.openSetFilterPanel()?.colKey === colKey;\n  }\n\n  protected setFilterPanelPosition(): { x: number; y: number } | null {\n    const panel = this.openSetFilterPanel();\n    return panel ? { x: panel.x, y: panel.y } : null;\n  }\n\n  protected closeSetFilterPanel(): void {\n    this.openSetFilterPanel.set(null);\n  }\n\n  protected readonly pinnedTopRows = computed<readonly TData[]>(() => {\n    const pin = this.isRowPinned();\n    return pin ? this.rowData().filter((row) => pin(row) === 'top') : [];\n  });\n\n  protected readonly pinnedBottomRows = computed<readonly TData[]>(() => {\n    const pin = this.isRowPinned();\n    return pin ? this.rowData().filter((row) => pin(row) === 'bottom') : [];\n  });\n\n  protected readonly hasPinnedRows = computed(\n    () => this.pinnedTopRows().length > 0 || this.pinnedBottomRows().length > 0,\n  );\n\n  protected readonly sortedRows = computed<readonly TData[]>(() => {\n    const sorts = this.sortState();\n    const rows = this.filteredRows();\n    if (sorts.length === 0) return rows;\n\n    const columnsByKey = new Map(this.columns().map((col) => [col.key, col.def]));\n    return [...rows].sort((rowA, rowB) => {\n      for (const sort of sorts) {\n        const col = columnsByKey.get(sort.key);\n        if (!col) continue;\n        const valueA = this.cellValue(rowA, col);\n        const valueB = this.cellValue(rowB, col);\n        const cmp = col.comparator ? col.comparator(valueA, valueB, rowA, rowB) : defaultCompare(valueA, valueB);\n        if (cmp !== 0) return sort.direction === 'desc' ? -cmp : cmp;\n      }\n      return 0;\n    });\n  });\n\n  protected readonly pageCount = computed(() => {\n    if (!this.pagination()) return 1;\n    return Math.max(1, Math.ceil(this.displayRows().length / this.pageSize()));\n  });\n\n  /** Clamped so filtering/sorting/pageSize changes never leave the page pointing past the end. */\n  protected readonly safeCurrentPage = computed(() => Math.min(this.currentPage(), this.pageCount() - 1));\n\n  protected readonly pagedRows = computed<readonly TData[]>(() => {\n    if (!this.pagination()) return this.sortedRows();\n    const start = this.safeCurrentPage() * this.pageSize();\n    return this.sortedRows().slice(start, start + this.pageSize());\n  });\n\n  /** Columns marked `rowGroup: true`, ordered by `rowGroupIndex` (outermost group first). */\n  protected readonly groupColumns = computed(() =>\n    this.columns()\n      .filter((col) => col.def.rowGroup)\n      .sort((colA, colB) => (colA.def.rowGroupIndex ?? 0) - (colB.def.rowGroupIndex ?? 0)),\n  );\n\n  protected readonly hasRowGrouping = computed(() => this.groupColumns().length > 0);\n\n  protected readonly aggregateColumns = computed(() => this.columns().filter((col) => !!col.def.aggFunc));\n\n  protected readonly hasTreeData = computed(() => !!this.getChildRows());\n\n  protected readonly hasDetailTemplate = computed(() => !!this.detailRowTemplate());\n\n  /** Flattened render list: every row when there's no grouping/tree data (1:1 with\n   * `sortedRows()`), a mix of group-header rows and leaf rows when one or more columns declare\n   * `rowGroup: true`, or a hierarchical (indented) flattening of `sortedRows()` + their children\n   * when `getChildRows` is provided. Groups are a stable partition of `sortedRows()` (grouping\n   * happens AFTER sort), so sorting still determines order both across and within groups.\n   * Collapsed groups/tree nodes (see `collapsedGroups`) omit their descendants entirely.\n   * Detail rows (see `detailRowTemplate`) are injected as a final pass, after grouping/tree\n   * structure is resolved, so master/detail composes with either of those. */\n  protected readonly displayRows = computed<DisplayItem<TData>[]>(() => {\n    const base = this.buildBaseDisplayRows();\n    if (!this.hasDetailTemplate()) return base;\n\n    const expanded = this.expandedDetailRows();\n    const result: DisplayItem<TData>[] = [];\n    for (const item of base) {\n      result.push(item);\n      if (item.kind === 'row' && expanded.has(this.rowId(item.row, item.rowIndex))) {\n        result.push({ kind: 'detail', row: item.row, rowIndex: item.rowIndex });\n      }\n    }\n    return result;\n  });\n\n  private buildBaseDisplayRows(): DisplayItem<TData>[] {\n    const rows = this.sortedRows();\n    const getChildren = this.getChildRows();\n    if (getChildren) return this.buildTreeDisplayRows(rows, getChildren);\n\n    const groupCols = this.groupColumns();\n    if (groupCols.length === 0) {\n      return rows.map((row, rowIndex): DisplayItem<TData> => ({ kind: 'row', row, rowIndex }));\n    }\n\n    // Preserves the same row identity (index into `sortedRows()`) used everywhere else (getRowId,\n    // selection, editing) even though grouping reorders rows into their group's bucket.\n    const originalIndex = new Map<TData, number>(rows.map((row, index) => [row, index]));\n    const aggCols = this.aggregateColumns();\n    const collapsed = this.collapsedGroups();\n    const result: DisplayItem<TData>[] = [];\n\n    const buildLevel = (data: readonly TData[], levelIndex: number, parentKey: string): void => {\n      if (levelIndex >= groupCols.length) {\n        for (const row of data) result.push({ kind: 'row', row, rowIndex: originalIndex.get(row)! });\n        return;\n      }\n      const col = groupCols[levelIndex];\n      const buckets = new Map<string, TData[]>();\n      for (const row of data) {\n        const bucketKey = String(this.cellValue(row, col.def));\n        const bucket = buckets.get(bucketKey);\n        if (bucket) bucket.push(row);\n        else buckets.set(bucketKey, [row]);\n      }\n      for (const [bucketKey, bucketRows] of buckets) {\n        const key = `${parentKey}/${col.key}=${bucketKey}`;\n        const aggregates: Record<string, unknown> = {};\n        for (const aggCol of aggCols) aggregates[aggCol.key] = this.computeAggregate(bucketRows, aggCol);\n        result.push({\n          kind: 'group',\n          group: {\n            key,\n            level: levelIndex,\n            field: col.key,\n            value: this.cellValue(bucketRows[0], col.def),\n            count: bucketRows.length,\n            aggregates,\n          },\n        });\n        if (!collapsed.has(key)) buildLevel(bucketRows, levelIndex + 1, key);\n      }\n    };\n    buildLevel(rows, 0, '');\n    return result;\n  }\n\n  private buildTreeDisplayRows(\n    rootRows: readonly TData[],\n    getChildren: (row: TData) => readonly TData[] | undefined,\n  ): DisplayItem<TData>[] {\n    const collapsed = this.collapsedGroups();\n    const result: DisplayItem<TData>[] = [];\n    let rowIndex = 0;\n\n    const walk = (nodes: readonly TData[], level: number): void => {\n      for (const row of nodes) {\n        const currentIndex = rowIndex++;\n        result.push({ kind: 'row', row, rowIndex: currentIndex, level });\n        const children = getChildren(row);\n        if (children && children.length > 0 && !collapsed.has(String(this.rowId(row, currentIndex)))) {\n          walk(children, level + 1);\n        }\n      }\n    };\n    walk(rootRows, 0);\n    return result;\n  }\n\n  protected hasChildRows(row: TData): boolean {\n    const children = this.getChildRows()?.(row);\n    return !!children && children.length > 0;\n  }\n\n  protected isRowExpanded(row: TData, rowIndex: number): boolean {\n    return !this.collapsedGroups().has(String(this.rowId(row, rowIndex)));\n  }\n\n  protected toggleRowExpanded(row: TData, rowIndex: number): void {\n    this.toggleGroup(String(this.rowId(row, rowIndex)));\n  }\n\n  protected isDetailExpanded(row: TData, rowIndex: number): boolean {\n    return this.expandedDetailRows().has(this.rowId(row, rowIndex));\n  }\n\n  protected toggleDetail(row: TData, rowIndex: number): void {\n    const id = this.rowId(row, rowIndex);\n    this.expandedDetailRows.update((current) => {\n      const next = new Set(current);\n      if (next.has(id)) next.delete(id);\n      else next.add(id);\n      return next;\n    });\n  }\n\n  /** `displayRows()`, paginated when `[pagination]` is enabled - used for the non-virtualized\n   * body, which handles both plain pagination and row grouping (grouping always uses this path;\n   * see the template for why it can't use the CDK virtual-scroll viewport). */\n  protected readonly pagedDisplayItems = computed<DisplayItem<TData>[]>(() => {\n    const items = this.displayRows();\n    if (!this.pagination()) return items;\n    const start = this.safeCurrentPage() * this.pageSize();\n    return items.slice(start, start + this.pageSize());\n  });\n\n  /** The currently rendered rows (post filter/sort/page/group) - what select-all should act on.\n   * Group header rows are never selectable, so only `kind: 'row'` items are included. */\n  private readonly visibleRows = computed<readonly TData[]>(() => {\n    if (this.hasRowGrouping()) {\n      const items = this.pagination() ? this.pagedDisplayItems() : this.displayRows();\n      return items.filter(isRowItem).map((item) => item.row);\n    }\n    return this.pagination() ? this.pagedRows() : this.sortedRows();\n  });\n\n  protected readonly allVisibleSelected = computed(() => {\n    const rows = this.visibleRows();\n    if (rows.length === 0) return false;\n    const selected = this.selection();\n    return rows.every((row, index) => selected.has(this.rowId(row, index)));\n  });\n\n  /** Cell keys (`${rowId}:${colKey}`) currently mid-flash from a detected value change. */\n  private readonly flashingCells = signal<ReadonlySet<string>>(new Set());\n  /** Last-seen displayed value per cell key - a plain mutable map (not a signal) since it's only\n   * ever read/written from inside the `enableChangeFlash` effect below, never from a template. */\n  private readonly previousCellValues = new Map<string, string>();\n\n  constructor() {\n    effect(() => {\n      if (!this.enableChangeFlash()) return;\n      const rows = this.sortedRows();\n      const cols = this.columns();\n      const changedKeys: string[] = [];\n\n      rows.forEach((row, index) => {\n        const rid = this.rowId(row, index);\n        for (const col of cols) {\n          const key = `${rid}:${col.key}`;\n          const value = this.cellDisplay(row, col.def);\n          const previous = this.previousCellValues.get(key);\n          if (previous !== undefined && previous !== value) changedKeys.push(key);\n          this.previousCellValues.set(key, value);\n        }\n      });\n\n      if (changedKeys.length === 0) return;\n      this.flashingCells.update((current) => new Set([...current, ...changedKeys]));\n      setTimeout(() => {\n        this.flashingCells.update((current) => {\n          const next = new Set(current);\n          changedKeys.forEach((key) => next.delete(key));\n          return next;\n        });\n      }, this.changeFlashDurationMs());\n    });\n  }\n\n  protected isCellFlashing(col: ResolvedColumn<TData>, row: TData, rowIndex: number): boolean {\n    return this.flashingCells().has(`${this.rowId(row, rowIndex)}:${col.key}`);\n  }\n\n  ngOnInit(): void {\n    const initialSort = this.columns()\n      .filter((col) => col.def.sort)\n      .sort((a, b) => (a.def.sortIndex ?? 0) - (b.def.sortIndex ?? 0))\n      .map((col): SortEntry => ({ key: col.key, direction: col.def.sort! }));\n    this.sortState.set(initialSort);\n\n    this.gridReady.emit({ rowCount: this.rowData().length, columnCount: this.columns().length });\n  }\n\n  // ---------------------------------------------------------------------------------------\n  // Imperative Grid API - obtain via `@ViewChild(DataGrid) grid!: DataGrid<TData>` and call\n  // these directly (Angular convention: the component instance itself IS the API surface,\n  // rather than a separate injectable service).\n  // ---------------------------------------------------------------------------------------\n\n  /** Selects every currently-displayed (filtered/sorted/paged) row. No-op when `rowSelection`\n   * is `'none'`. Emits `(selectionChanged)`. */\n  selectAll(): void {\n    if (this.rowSelection() === 'none') return;\n    const next = new Map<string | number, TData>();\n    this.visibleRows().forEach((row, index) => next.set(this.rowId(row, index), row));\n    this.selection.set(next);\n    this.selectionChanged.emit([...next.values()]);\n  }\n\n  /** Clears the current selection. Emits `(selectionChanged)` with an empty array. */\n  deselectAll(): void {\n    this.selection.set(new Map());\n    this.selectionChanged.emit([]);\n  }\n\n  /** Returns the currently-selected row objects, in selection order. */\n  getSelectedRows(): TData[] {\n    return [...this.selection().values()];\n  }\n\n  /** Total row count after filtering/sorting (before pagination slices it into pages). */\n  getDisplayedRowCount(): number {\n    return this.sortedRows().length;\n  }\n\n  /** Clears any user drag-resized column widths and drag-reordered column order, reverting to\n   * the widths/order declared in `columnDefs`. */\n  resetColumnState(): void {\n    this.columnWidthOverrides.set({});\n    this.columnOrder.set(null);\n  }\n\n  /** Snapshots the grid's user-driven layout state (column widths/order, sort, column filters,\n   * current page) for persistence - serialize the result yourself (e.g. `JSON.stringify` to\n   * `localStorage`); the grid stays storage-agnostic. */\n  getGridState(): GridLayoutState {\n    return {\n      columnWidths: this.columnWidthOverrides(),\n      columnOrder: this.columnOrder(),\n      sort: this.sortState(),\n      columnFilters: this.columnFilters(),\n      page: this.currentPage(),\n    };\n  }\n\n  /** Restores a snapshot from `getGridState()` (or a partial subset of it). */\n  applyGridState(state: Partial<GridLayoutState>): void {\n    if (state.columnWidths) this.columnWidthOverrides.set(state.columnWidths);\n    if (state.columnOrder !== undefined) this.columnOrder.set(state.columnOrder);\n    if (state.sort) this.sortState.set(state.sort);\n    if (state.columnFilters) this.columnFilters.set(state.columnFilters);\n    if (state.page !== undefined) this.currentPage.set(state.page);\n  }\n\n  /** Exports the currently filtered/sorted rows (all of them, ignoring pagination) as a CSV file\n   * download, using each column's `headerName`/`field` and formatted display value. */\n  exportDataAsCsv(fileName = 'export.csv'): void {\n    const cols = this.columns().filter((col) => !col.def.checkboxSelection);\n    const header = cols.map((col) => csvEscape(col.def.headerName ?? col.def.field ?? col.key));\n    const rows = this.sortedRows().map((row) => cols.map((col) => csvEscape(this.cellDisplay(row, col.def))));\n    const csv = [header, ...rows].map((line) => line.join(',')).join('\\r\\n');\n\n    const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = fileName;\n    link.click();\n    URL.revokeObjectURL(url);\n  }\n\n  /** Opens the right-click context menu for a cell; uses `contextMenuItems()` when provided,\n   * otherwise falls back to Copy cell / Copy row / Export CSV. */\n  protected onCellContextMenu(row: TData, col: ResolvedColumn<TData>, event: MouseEvent): void {\n    event.preventDefault();\n    const customItems = this.contextMenuItems();\n    const items = customItems ? customItems({ row, col: col.def }) : this.defaultContextMenuItems(row, col);\n    if (items.length === 0) return;\n    this.contextMenuState.set({ x: event.clientX, y: event.clientY, items });\n  }\n\n  private defaultContextMenuItems(row: TData, col: ResolvedColumn<TData>): ContextMenuAction[] {\n    return [\n      { label: 'Copy cell', action: () => this.copyToClipboard(this.cellDisplay(row, col.def)) },\n      {\n        label: 'Copy row',\n        action: () => this.copyToClipboard(this.columns().map((c) => this.cellDisplay(row, c.def)).join('\\t')),\n      },\n      { label: 'Export CSV', action: () => this.exportDataAsCsv() },\n    ];\n  }\n\n  private copyToClipboard(text: string): void {\n    navigator.clipboard?.writeText(text);\n  }\n\n  protected closeContextMenu(): void {\n    this.contextMenuState.set(null);\n  }\n\n  protected runContextMenuAction(action: () => void): void {\n    action();\n    this.closeContextMenu();\n  }\n\n  protected trackRow = (index: number, row: TData): string | number => this.getRowId()(row, index);\n\n  private rowId(row: TData, index: number): string | number {\n    return this.getRowId()(row, index);\n  }\n\n  protected isSelected(row: TData, index: number): boolean {\n    return this.selection().has(this.rowId(row, index));\n  }\n\n  protected toggleRowSelection(row: TData, index: number): void {\n    const mode = this.rowSelection();\n    if (mode === 'none') return;\n    const id = this.rowId(row, index);\n\n    this.selection.update((current) => {\n      if (mode === 'single') {\n        return current.has(id) && current.size === 1 ? new Map() : new Map([[id, row]]);\n      }\n      const next = new Map(current);\n      if (next.has(id)) next.delete(id);\n      else next.set(id, row);\n      return next;\n    });\n    this.selectionChanged.emit([...this.selection().values()]);\n  }\n\n  protected onRowClick(row: TData, index: number, event: MouseEvent): void {\n    // The checkbox's own (change) handler already toggles selection - avoid double-toggling.\n    // Editable cells handle their own click/dblclick to start editing instead of selecting.\n    const target = event.target as HTMLElement;\n    if (target.closest('input[type=\"checkbox\"]') || target.closest('.gd-cell--editable')) return;\n    this.toggleRowSelection(row, index);\n  }\n\n  protected onRowKeydown(row: TData, index: number, event: KeyboardEvent): void {\n    if (event.key !== 'Enter' && event.key !== ' ') return;\n    const target = event.target as HTMLElement;\n    if (target.closest('input[type=\"checkbox\"]') || target.closest('.gd-cell--editable')) return;\n    event.preventDefault();\n    this.toggleRowSelection(row, index);\n  }\n\n  /** A pinned row's index within `rowData()` - used as its `rowId()` basis since pinned rows are\n   * excluded from `sortedRows()` entirely (see `filteredRows`). */\n  protected pinnedRowIndex(row: TData): number {\n    return this.rowData().indexOf(row);\n  }\n\n  protected pinnedRowId(row: TData): string | number {\n    return this.rowId(row, this.pinnedRowIndex(row));\n  }\n\n  protected onRowDragStart(row: TData, index: number, event: DragEvent): void {\n    if (!this.enableRowDrag()) return;\n    event.dataTransfer?.setData('text/plain', String(this.rowId(row, index)));\n    if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n  }\n\n  protected onRowDragOver(event: DragEvent): void {\n    if (this.enableRowDrag()) event.preventDefault();\n  }\n\n  /** Resolves both rows against `rowData()` by identity (id string / object reference) rather\n   * than trusting the transient `sortedRows()`-relative index passed around during the drag, so\n   * this stays correct regardless of active sorting/filtering. Requires a real `getRowId` (not\n   * the default positional index) to work reliably once sorting/filtering reorders rows. */\n  protected onRowDrop(targetRow: TData, event: DragEvent): void {\n    if (!this.enableRowDrag()) return;\n    event.preventDefault();\n    const sourceId = event.dataTransfer?.getData('text/plain');\n    if (!sourceId) return;\n\n    const rows = this.rowData();\n    const fromIndex = rows.findIndex((row, index) => String(this.rowId(row, index)) === sourceId);\n    const toIndex = rows.indexOf(targetRow);\n    if (fromIndex === -1 || toIndex === -1 || fromIndex === toIndex) return;\n    this.rowDragEnd.emit({ row: rows[fromIndex], fromIndex, toIndex });\n  }\n\n  protected toggleSelectAll(): void {\n    if (this.rowSelection() !== 'multiple') return;\n    const rows = this.visibleRows();\n    const selectAll = !this.allVisibleSelected();\n\n    this.selection.update((current) => {\n      const next = new Map(current);\n      rows.forEach((row, index) => {\n        const id = this.rowId(row, index);\n        if (selectAll) next.set(id, row);\n        else next.delete(id);\n      });\n      return next;\n    });\n    this.selectionChanged.emit([...this.selection().values()]);\n  }\n\n  protected isEditable(col: ResolvedColumn<TData>, row: TData): boolean {\n    const editable = col.def.editable;\n    return typeof editable === 'function' ? editable(row) : !!editable;\n  }\n\n  protected isEditing(row: TData, index: number, col: ResolvedColumn<TData>): boolean {\n    const cell = this.editingCell();\n    return !!cell && cell.rowKey === this.rowId(row, index) && cell.colKey === col.key;\n  }\n\n  protected editorInitialValue(row: TData, col: ResolvedColumn<TData>): string {\n    const value = this.cellValue(row, col.def);\n    if (col.def.cellEditor === 'date') return value instanceof Date ? value.toISOString().slice(0, 10) : String(value ?? '');\n    return value == null ? '' : String(value);\n  }\n\n  protected editorInitialChecked(row: TData, col: ResolvedColumn<TData>): boolean {\n    return !!this.cellValue(row, col.def);\n  }\n\n  protected editorOptionSelected(row: TData, col: ResolvedColumn<TData>, optionValue: unknown): boolean {\n    return this.editorInitialValue(row, col) === String(optionValue);\n  }\n\n  protected onCellClick(row: TData, index: number, col: ResolvedColumn<TData>, event: MouseEvent): void {\n    if (!this.isEditable(col, row) || !this.singleClickEdit()) return;\n    event.stopPropagation();\n    this.startEdit(row, index, col);\n  }\n\n  protected onCellDblClick(row: TData, index: number, col: ResolvedColumn<TData>, event: MouseEvent): void {\n    if (!this.isEditable(col, row)) return;\n    event.stopPropagation();\n    this.startEdit(row, index, col);\n  }\n\n  protected onCellKeydown(row: TData, index: number, col: ResolvedColumn<TData>, event: KeyboardEvent): void {\n    if (this.isEditing(row, index, col)) return;\n    if (this.isEditable(col, row) && (event.key === 'Enter' || event.key === 'F2')) {\n      event.preventDefault();\n      event.stopPropagation();\n      this.startEdit(row, index, col);\n      return;\n    }\n    this.navigateFromCell(event);\n  }\n\n  /** Marks a cell as the roving-tabindex active cell whenever it receives DOM focus (via mouse\n   * click, Tab, or a programmatic `.focus()` from `navigateFromCell`). */\n  protected onCellFocus(rowIndex: number, colIndex: number): void {\n    this.activeCell.set({ rowIndex, colIndex });\n  }\n\n  protected isActiveCell(rowIndex: number, colIndex: number): boolean {\n    const active = this.activeCell();\n    return active.rowIndex === rowIndex && active.colIndex === colIndex;\n  }\n\n  /** Arrow/Home/End/PageUp/PageDown navigation between gridcells, via plain DOM sibling\n   * traversal from the currently-focused cell (robust against CDK virtual-scroll DOM node\n   * recycling, since it always reads the live DOM rather than trusting stale row indices). */\n  private navigateFromCell(event: KeyboardEvent): void {\n    const cell = event.currentTarget as HTMLElement;\n    const rowEl = cell.parentElement;\n    if (!rowEl) return;\n\n    let target: Element | null | undefined;\n    switch (event.key) {\n      case 'ArrowRight':\n        target = cell.nextElementSibling;\n        break;\n      case 'ArrowLeft':\n        target = cell.previousElementSibling;\n        break;\n      case 'Home':\n        target = rowEl.firstElementChild;\n        break;\n      case 'End':\n        target = rowEl.lastElementChild;\n        break;\n      case 'ArrowDown':\n        target = cellAtRowOffset(cell, rowEl, 1);\n        break;\n      case 'ArrowUp':\n        target = cellAtRowOffset(cell, rowEl, -1);\n        break;\n      case 'PageDown':\n        target = cellAtRowOffset(cell, rowEl, 10);\n        break;\n      case 'PageUp':\n        target = cellAtRowOffset(cell, rowEl, -10);\n        break;\n      default:\n        return;\n    }\n    if (!(target instanceof HTMLElement)) return;\n    event.preventDefault();\n    target.focus();\n  }\n\n  private startEdit(row: TData, index: number, col: ResolvedColumn<TData>): void {\n    this.editingCell.set({ rowKey: this.rowId(row, index), colKey: col.key });\n  }\n\n  protected cancelEdit(): void {\n    this.editingCell.set(null);\n  }\n\n  protected onEditorKeydown(row: TData, col: ResolvedColumn<TData>, event: KeyboardEvent): void {\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      // Stop the bubbled keydown from also reaching the cell's own Enter/F2-to-start-editing\n      // handler, which would otherwise see editing just turned off and reopen it immediately.\n      event.stopPropagation();\n      this.commitEditFromTarget(row, col, event.target);\n    } else if (event.key === 'Escape') {\n      event.preventDefault();\n      event.stopPropagation();\n      this.cancelEdit();\n    }\n  }\n\n  protected onEditorBlur(row: TData, col: ResolvedColumn<TData>, event: Event): void {\n    this.commitEditFromTarget(row, col, event.target);\n  }\n\n  private commitEditFromTarget(row: TData, col: ResolvedColumn<TData>, target: EventTarget | null): void {\n    // Guards against a second blur firing after Enter/Escape already closed the editor.\n    if (!this.editingCell()) return;\n    if (target instanceof HTMLInputElement && target.type === 'checkbox') {\n      this.commitEdit(row, col, target.checked);\n    } else if (target instanceof HTMLInputElement || target instanceof HTMLSelectElement) {\n      this.commitEdit(row, col, target.value);\n    }\n  }\n\n  private commitEdit(row: TData, col: ResolvedColumn<TData>, raw: string | boolean): void {\n    const field = col.def.field;\n    const oldValue = this.cellValue(row, col.def);\n    const newValue = coerceEditedValue(raw, col.def.cellEditor, col.def.cellEditorParams?.options);\n\n    if (col.def.valueSetter) col.def.valueSetter(row, newValue);\n    else if (field) (row as Record<string, unknown>)[field] = newValue;\n\n    this.editingCell.set(null);\n    this.cellValueChanged.emit({ row, field, oldValue, newValue });\n  }\n\n  protected goToPage(page: number): void {\n    this.currentPage.set(Math.min(Math.max(page, 0), this.pageCount() - 1));\n  }\n\n  /** e.g. \"1-50 of 320\" for the pager footer; \"0 of 0\" when there are no rows. */\n  protected pageRangeText(): string {\n    const total = this.displayRows().length;\n    if (total === 0) return '0 of 0';\n    const start = this.safeCurrentPage() * this.pageSize() + 1;\n    const end = Math.min(start + this.pageSize() - 1, total);\n    return `${start}-${end} of ${total}`;\n  }\n\n  protected isGroupCollapsed(key: string): boolean {\n    return this.collapsedGroups().has(key);\n  }\n\n  protected toggleGroup(key: string): void {\n    this.collapsedGroups.update((current) => {\n      const next = new Set(current);\n      if (next.has(key)) next.delete(key);\n      else next.add(key);\n      return next;\n    });\n  }\n\n  /** Stable `@for` track key for a display item - a group's own key, the leaf row's identity, or\n   * (for a detail panel) that same identity with a distinguishing prefix. */\n  protected itemTrackKey(item: DisplayItem<TData>): string | number {\n    if (item.kind === 'group') return item.group.key;\n    if (item.kind === 'detail') return `detail:${this.rowId(item.row, item.rowIndex)}`;\n    return this.rowId(item.row, item.rowIndex);\n  }\n\n  /** Formats an aggregate value for display; numbers are rounded to 2 decimal places (`avg`\n   * commonly produces long decimals; `sum`/`min`/`max`/`count` are already whole for most data). */\n  protected formatAggregateValue(value: unknown): string {\n    if (typeof value !== 'number') return String(value ?? '');\n    return Number.isInteger(value) ? String(value) : value.toFixed(2);\n  }\n\n  private computeAggregate(rows: readonly TData[], col: ResolvedColumn<TData>): unknown {\n    const fn = col.def.aggFunc;\n    if (!fn) return undefined;\n    if (fn === 'count') return rows.length;\n\n    const nums = rows.map((row) => Number(this.cellValue(row, col.def))).filter((num) => !Number.isNaN(num));\n    if (nums.length === 0) return fn === 'sum' ? 0 : undefined;\n    switch (fn) {\n      case 'sum':\n        return nums.reduce((sum, num) => sum + num, 0);\n      case 'avg':\n        return nums.reduce((sum, num) => sum + num, 0) / nums.length;\n      case 'min':\n        return Math.min(...nums);\n      case 'max':\n        return Math.max(...nums);\n      default:\n        return undefined;\n    }\n  }\n\n  protected cellValue(row: TData, col: ColDef<TData>): unknown {\n    if (col.valueGetter) return col.valueGetter(row);\n    return col.field ? row[col.field] : undefined;\n  }\n\n  protected cellDisplay(row: TData, col: ColDef<TData>): string {\n    const value = this.cellValue(row, col);\n    if (col.valueFormatter) return col.valueFormatter(value);\n    return value == null ? '' : String(value);\n  }\n\n  /** Merges a column's static `cellClass` with any `cellClassRules` that evaluate truthy for this row. */\n  /** Merges a column's static `cellClass` with any `cellClassRules` that evaluate truthy for this row. */\n  protected cellClasses(col: ResolvedColumn<TData>, row: TData): string[] {\n    const classes: string[] = ([] as string[]).concat(col.def.cellClass ?? []);\n    const rules = col.def.cellClassRules;\n    if (!rules) return classes;\n    const value = this.cellValue(row, col.def);\n    for (const [className, predicate] of Object.entries(rules)) {\n      if (predicate({ value, data: row })) classes.push(className);\n    }\n    return classes;\n  }\n\n  /** Native `title` attribute text for a cell's tooltip, or `null` when `tooltip` isn't set. */\n  protected cellTooltip(col: ResolvedColumn<TData>, row: TData): string | null {\n    const tooltip = col.def.tooltip;\n    if (!tooltip) return null;\n    return typeof tooltip === 'function' ? tooltip(row) : this.cellDisplay(row, col.def);\n  }\n\n  /** Evaluates `rowClassRules` (if provided) for a row, returning the matching class names. */\n  protected rowClasses(row: TData): string[] {\n    const rules = this.rowClassRules();\n    if (!rules) return [];\n    return Object.entries(rules)\n      .filter(([, predicate]) => predicate(row))\n      .map(([className]) => className);\n  }\n\n  /** Row height for paginated (non-virtualized) rows - honors `getRowHeight()` when provided. */\n  protected resolvedRowHeight(row: TData, index: number): number {\n    return this.getRowHeight()?.(row, index) ?? this.rowHeight();\n  }\n\n  protected columnFilterValue(col: ResolvedColumn<TData>): string {\n    return this.columnFilters()[col.key] ?? '';\n  }\n\n  protected filterPlaceholder(col: ResolvedColumn<TData>): string {\n    switch (col.def.filter) {\n      case 'number':\n        return 'e.g. >10';\n      case 'date':\n        return 'YYYY-MM-DD';\n      default:\n        return 'Filter…';\n    }\n  }\n\n  protected onColumnFilterInput(col: ResolvedColumn<TData>, event: Event): void {\n    const value = (event.target as HTMLInputElement).value;\n    this.columnFilters.update((current) => ({ ...current, [col.key]: value }));\n  }\n\n  protected onHeaderClick(col: ResolvedColumn<TData>, event: MouseEvent): void {\n    this.toggleSort(col, event.shiftKey);\n  }\n\n  protected onHeaderKeydown(col: ResolvedColumn<TData>, event: KeyboardEvent): void {\n    if (event.key !== 'Enter' && event.key !== ' ') return;\n    event.preventDefault();\n    this.toggleSort(col, event.shiftKey);\n  }\n\n  private toggleSort(col: ResolvedColumn<TData>, multi: boolean): void {\n    if (!col.def.sortable) return;\n    this.sortState.update((current) => nextSortState(current, col.key, multi));\n  }\n\n  /** Sort direction + 1-based order (only shown once >1 column is sorted) for a header's aria/indicator. */\n  protected sortInfo(col: ResolvedColumn<TData>): { direction?: 'asc' | 'desc'; order?: number } {\n    const sorts = this.sortState();\n    const index = sorts.findIndex((sort) => sort.key === col.key);\n    if (index === -1) return {};\n    return { direction: sorts[index].direction, order: sorts.length > 1 ? index + 1 : undefined };\n  }\n\n  protected isResizable(col: ResolvedColumn<TData>): boolean {\n    return col.def.resizable !== false;\n  }\n\n  /** Drag-resizes a column from its header's right-edge handle; listens on `document` so the\n   * drag continues even if the pointer leaves the handle/header cell. */\n  protected onResizeStart(col: ResolvedColumn<TData>, event: MouseEvent): void {\n    if (!this.isResizable(col)) return;\n    event.preventDefault();\n    event.stopPropagation();\n    const startX = event.clientX;\n    const startWidth = this.columnWidthOverrides()[col.key] ?? col.width;\n\n    const onMove = (moveEvent: MouseEvent): void => {\n      const next = Math.max(30, startWidth + (moveEvent.clientX - startX));\n      this.columnWidthOverrides.update((current) => ({ ...current, [col.key]: next }));\n    };\n    const onUp = (): void => {\n      document.removeEventListener('mousemove', onMove);\n      document.removeEventListener('mouseup', onUp);\n    };\n    document.addEventListener('mousemove', onMove);\n    document.addEventListener('mouseup', onUp);\n  }\n\n  /** Column reorder via native HTML5 drag-and-drop on the header cell (excludes the resize handle). */\n  protected onHeaderDragStart(col: ResolvedColumn<TData>, event: DragEvent): void {\n    event.dataTransfer?.setData('text/plain', col.key);\n    if (event.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n  }\n\n  protected onHeaderDragOver(event: DragEvent): void {\n    event.preventDefault();\n  }\n\n  protected onHeaderDrop(targetCol: ResolvedColumn<TData>, event: DragEvent): void {\n    event.preventDefault();\n    const sourceKey = event.dataTransfer?.getData('text/plain');\n    if (!sourceKey || sourceKey === targetCol.key) return;\n\n    const keys = this.columns().map((col) => col.key);\n    const from = keys.indexOf(sourceKey);\n    const to = keys.indexOf(targetCol.key);\n    if (from === -1 || to === -1) return;\n\n    const next = [...keys];\n    next.splice(from, 1);\n    next.splice(to, 0, sourceKey);\n    this.columnOrder.set(next);\n  }\n}\n\n/** Walks `Math.abs(deltaRows)` rows up/down from `cell`'s row, returning the cell at the same\n * column position in the target row (or the furthest reachable row if fewer rows remain). */\n/** Type guard narrowing a `DisplayItem` to its leaf-row variant (used to filter out group headers). */\nfunction isRowItem<TData>(item: DisplayItem<TData>): item is Extract<DisplayItem<TData>, { kind: 'row' }> {\n  return item.kind === 'row';\n}\n\nfunction cellAtRowOffset(cell: Element, rowEl: Element, deltaRows: number): Element | null {\n  const cellIndex = Array.from(rowEl.children).indexOf(cell);\n  const direction = deltaRows > 0 ? 1 : -1;\n  let currentRow: Element | null = rowEl;\n  let result: Element | null = null;\n  for (let i = 0; i < Math.abs(deltaRows); i++) {\n    const nextRow: Element | null = direction > 0 ? currentRow.nextElementSibling : currentRow.previousElementSibling;\n    if (!nextRow) break;\n    currentRow = nextRow;\n    result = currentRow.children[cellIndex] ?? null;\n  }\n  return result;\n}\n\n/** Wraps a CSV field in quotes (doubling any embedded quotes) whenever it contains a comma,\n * quote, or newline - otherwise returns it unmodified. */\nfunction csvEscape(value: string): string {\n  if (!/[\",\\r\\n]/.test(value)) return value;\n  return `\"${value.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction nextSortState(current: SortEntry[], key: string, multi: boolean): SortEntry[] {\n  const existing = current.find((entry) => entry.key === key);\n  const next = nextDirection(existing?.direction);\n\n  if (!multi) {\n    return next ? [{ key, direction: next }] : [];\n  }\n  const withoutKey = current.filter((entry) => entry.key !== key);\n  return next ? [...withoutKey, { key, direction: next }] : withoutKey;\n}\n\nfunction nextDirection(current: 'asc' | 'desc' | undefined): 'asc' | 'desc' | undefined {\n  if (current === undefined) return 'asc';\n  return current === 'asc' ? 'desc' : undefined;\n}\n\nfunction defaultCompare(valueA: unknown, valueB: unknown): number {\n  if (valueA == null && valueB == null) return 0;\n  if (valueA == null) return -1;\n  if (valueB == null) return 1;\n  if (typeof valueA === 'number' && typeof valueB === 'number') return valueA - valueB;\n  if (valueA instanceof Date && valueB instanceof Date) return valueA.getTime() - valueB.getTime();\n  return String(valueA).localeCompare(String(valueB));\n}\n\nconst NUMBER_FILTER_PATTERN = /^(>=|<=|>|<|=)?\\s*(-?\\d+(?:\\.\\d+)?)$/;\n\n/** Splits `quickFilterText` into `field:value` tokens (matched against each column's `field`,\n * case-insensitively) and the remaining free text, which is treated as a single substring exactly\n * like the plain quick filter always has been - so text with no `field:value` tokens behaves\n * identically to before this feature existed. */\nfunction parseSearchTokens<TData>(\n  text: string,\n  cols: readonly ResolvedColumn<TData>[],\n): { fieldTokens: { col: ResolvedColumn<TData>; value: string }[]; remainingText: string } {\n  const fieldTokens: { col: ResolvedColumn<TData>; value: string }[] = [];\n  const remainingParts: string[] = [];\n\n  for (const token of text.trim().split(/\\s+/).filter(Boolean)) {\n    const colonIndex = token.indexOf(':');\n    if (colonIndex > 0) {\n      const key = token.slice(0, colonIndex).toLowerCase();\n      const value = token.slice(colonIndex + 1);\n      const col = cols.find((candidate) => (candidate.def.field ?? '').toLowerCase() === key);\n      if (col && value) {\n        fieldTokens.push({ col, value });\n        continue;\n      }\n    }\n    remainingParts.push(token);\n  }\n  return { fieldTokens, remainingText: remainingParts.join(' ') };\n}\n\nfunction matchesColumnFilter(value: unknown, filterText: string, type: 'text' | 'number' | 'date'): boolean {\n  if (type === 'number') {\n    const match = NUMBER_FILTER_PATTERN.exec(filterText);\n    if (!match) return String(value ?? '').toLowerCase().includes(filterText.toLowerCase());\n\n    const [, operator = '=', numberText] = match;\n    const target = Number(numberText);\n    const actual = typeof value === 'number' ? value : Number(value);\n    if (Number.isNaN(actual)) return false;\n\n    switch (operator) {\n      case '>':\n        return actual > target;\n      case '>=':\n        return actual >= target;\n      case '<':\n        return actual < target;\n      case '<=':\n        return actual <= target;\n      default:\n        return actual === target;\n    }\n  }\n\n  if (type === 'date') {\n    const actual = value instanceof Date ? value.toISOString().slice(0, 10) : String(value ?? '');\n    return actual.startsWith(filterText.trim());\n  }\n\n  return String(value ?? '')\n    .toLowerCase()\n    .includes(filterText.toLowerCase());\n}\n\nfunction coerceEditedValue(\n  raw: string | boolean,\n  editorType: 'text' | 'number' | 'select' | 'date' | 'checkbox' | undefined,\n  options: { label: string; value: unknown }[] | undefined,\n): unknown {\n  if (editorType === 'checkbox') return !!raw;\n  if (editorType === 'number') return raw === '' ? null : Number(raw);\n  if (editorType === 'select' && options) {\n    const match = options.find((option) => String(option.value) === String(raw));\n    return match ? match.value : raw;\n  }\n  return raw;\n}\n\nfunction columnStyle<TData>(col: ColDef<TData>, widthOverride?: number): Record<string, string> {\n  const width = widthOverride ?? col.width;\n  const style: Record<string, string> = {\n    flex: width != null ? `0 0 ${width}px` : `${col.flex ?? 1} 1 0`,\n  };\n  if (col.minWidth != null) style['min-width'] = `${col.minWidth}px`;\n  if (col.maxWidth != null) style['max-width'] = `${col.maxWidth}px`;\n  return style;\n}\n\ninterface MergedColumn<TData> {\n  def: ColDef<TData>;\n  key: string;\n  width?: number;\n}\n\n/** Reorders `columns` to match a stored key order (from drag-reordering); any column not present\n * in `order` (e.g. newly added to `columnDefs`) keeps its natural relative position at the end. */\nfunction applyColumnOrder<TData>(columns: MergedColumn<TData>[], order: string[] | null): MergedColumn<TData>[] {\n  if (!order) return columns;\n  const byKey = new Map(columns.map((col) => [col.key, col]));\n  const ordered = order.map((key) => byKey.get(key)).filter((col): col is MergedColumn<TData> => !!col);\n  const orderedKeys = new Set(ordered.map((col) => col.key));\n  const remaining = columns.filter((col) => !orderedKeys.has(col.key));\n  return [...ordered, ...remaining];\n}\n\n/** Clusters pinned-left columns first, then unpinned, then pinned-right - preserving each group's\n * relative order (Array#filter is a stable partition). */\nfunction groupByPinned<TData>(columns: MergedColumn<TData>[]): MergedColumn<TData>[] {\n  const left = columns.filter((col) => col.def.pinned === 'left');\n  const right = columns.filter((col) => col.def.pinned === 'right');\n  const middle = columns.filter((col) => col.def.pinned !== 'left' && col.def.pinned !== 'right');\n  return [...left, ...middle, ...right];\n}\n\nfunction resolvedColumnWidth<TData>(col: ColDef<TData>, widthOverride?: number): number {\n  return widthOverride ?? col.width ?? col.minWidth ?? 120;\n}\n","<div\n  class=\"gd-root\"\n  role=\"grid\"\n  [attr.data-gd-theme]=\"theme()\"\n  [attr.data-gd-density]=\"density()\"\n  [attr.aria-rowcount]=\"sortedRows().length + 1\"\n  [attr.aria-colcount]=\"columns().length\"\n>\n  <div class=\"gd-row gd-row--header\" role=\"row\" [style.min-width]=\"contentMinWidth()\">\n    @for (col of columns(); track col.key; let colIndex = $index) {\n      <div\n        class=\"gd-cell gd-cell--header\"\n        role=\"columnheader\"\n        [ngClass]=\"col.def.cellClass\"\n        [style]=\"col.style\"\n        [class.gd-cell--sortable]=\"col.def.sortable\"\n        [attr.tabindex]=\"col.def.sortable ? 0 : null\"\n        [attr.aria-colindex]=\"colIndex + 1\"\n        [attr.aria-sort]=\"sortInfo(col).direction === 'asc' ? 'ascending' : sortInfo(col).direction === 'desc' ? 'descending' : col.def.sortable ? 'none' : null\"\n        draggable=\"true\"\n        (click)=\"onHeaderClick(col, $event)\"\n        (keydown)=\"onHeaderKeydown(col, $event)\"\n        (dragstart)=\"onHeaderDragStart(col, $event)\"\n        (dragover)=\"onHeaderDragOver($event)\"\n        (drop)=\"onHeaderDrop(col, $event)\"\n      >\n        <span class=\"gd-cell__label\">{{ col.def.headerName ?? col.def.field }}</span>\n        @if (col.def.checkboxSelection && rowSelection() === 'multiple') {\n          <input\n            type=\"checkbox\"\n            class=\"gd-select-checkbox\"\n            aria-label=\"Select all rows\"\n            [checked]=\"allVisibleSelected()\"\n            (click)=\"$event.stopPropagation()\"\n            (change)=\"toggleSelectAll()\"\n          />\n        }\n        @if (sortInfo(col).direction) {\n          <span class=\"gd-sort-indicator\">\n            {{ sortInfo(col).direction === 'asc' ? '▲' : '▼' }}\n            @if (sortInfo(col).order) {\n              <sup>{{ sortInfo(col).order }}</sup>\n            }\n          </span>\n        }\n        @if (isResizable(col)) {\n          <span\n            class=\"gd-col-resizer\"\n            role=\"separator\"\n            [attr.aria-label]=\"'Resize ' + (col.def.headerName ?? col.def.field)\"\n            (mousedown)=\"onResizeStart(col, $event)\"\n            (click)=\"$event.stopPropagation()\"\n            (keydown)=\"$event.stopPropagation()\"\n          ></span>\n        }\n      </div>\n    }\n  </div>\n\n  @if (hasColumnFilters()) {\n    <div class=\"gd-row gd-row--filter\" role=\"row\" [style.min-width]=\"contentMinWidth()\">\n      @for (col of columns(); track col.key) {\n        <div class=\"gd-cell gd-cell--filter\" role=\"gridcell\" [style]=\"col.style\" [class.gd-cell--pinned]=\"col.pinned\">\n          @if (col.def.filter === 'set') {\n            <div class=\"gd-set-filter\">\n              <button\n                type=\"button\"\n                class=\"gd-set-filter-toggle\"\n                [class.gd-set-filter-toggle--active]=\"hasActiveSetFilter(col)\"\n                (click)=\"toggleSetFilterPanel(col.key, $event)\"\n              >\n                Filter {{ hasActiveSetFilter(col) ? '●' : '▾' }}\n              </button>\n              @if (isSetFilterPanelOpen(col.key) && setFilterPanelPosition(); as pos) {\n                <div\n                  class=\"gd-set-filter-backdrop\"\n                  tabindex=\"-1\"\n                  (click)=\"closeSetFilterPanel()\"\n                  (keydown.escape)=\"closeSetFilterPanel()\"\n                ></div>\n                <div class=\"gd-set-filter-panel\" [style.left.px]=\"pos.x\" [style.top.px]=\"pos.y\">\n                  @for (facet of facetsFor(col); track facet.value) {\n                    <label class=\"gd-set-filter-option\">\n                      <input\n                        type=\"checkbox\"\n                        [checked]=\"isFacetSelected(col, facet.value)\"\n                        (change)=\"toggleFacetValue(col, facet.value)\"\n                      />\n                      {{ facet.value }} ({{ facet.count }})\n                    </label>\n                  }\n                </div>\n              }\n            </div>\n          } @else if (col.def.filter) {\n            <input\n              type=\"text\"\n              class=\"gd-filter-input\"\n              [attr.aria-label]=\"'Filter ' + (col.def.headerName ?? col.def.field)\"\n              [placeholder]=\"filterPlaceholder(col)\"\n              [value]=\"columnFilterValue(col)\"\n              (input)=\"onColumnFilterInput(col, $event)\"\n            />\n          }\n        </div>\n      }\n    </div>\n  }\n\n  @if (hasPinnedRows()) {\n    <div class=\"gd-body gd-body--pinned-top\" [style.min-width]=\"contentMinWidth()\">\n      @for (row of pinnedTopRows(); track pinnedRowId(row)) {\n        <ng-container *ngTemplateOutlet=\"dataRow; context: { row, rowIndex: pinnedRowIndex(row) }\" />\n      }\n    </div>\n  }\n\n  @if (sortedRows().length === 0 && !hasPinnedRows()) {\n    <div class=\"gd-empty\" role=\"row\">\n      @if (noRowsTemplate()) {\n        <ng-container *ngTemplateOutlet=\"noRowsTemplate()!\" />\n      } @else {\n        <div class=\"gd-cell\" role=\"gridcell\">No rows to display</div>\n      }\n    </div>\n  } @else if (pagination() || hasRowGrouping() || hasTreeData() || hasDetailTemplate()) {\n    <div class=\"gd-body gd-body--paged\" [style.min-width]=\"contentMinWidth()\">\n      @for (item of pagedDisplayItems(); track itemTrackKey(item)) {\n        @if (item.kind === 'group') {\n          <div\n            class=\"gd-row gd-row--group\"\n            role=\"row\"\n            tabindex=\"0\"\n            [style.height.px]=\"rowHeight()\"\n            (click)=\"toggleGroup(item.group.key)\"\n            (keydown.enter)=\"toggleGroup(item.group.key)\"\n            (keydown.space)=\"$event.preventDefault(); toggleGroup(item.group.key)\"\n          >\n            <div class=\"gd-cell gd-group-cell\" role=\"gridcell\" [style.padding-left.px]=\"item.group.level * 20 + 8\">\n              <button type=\"button\" class=\"gd-group-toggle\" (click)=\"toggleGroup(item.group.key); $event.stopPropagation()\">\n                {{ isGroupCollapsed(item.group.key) ? '▶' : '▼' }}\n              </button>\n              <span class=\"gd-group-label\">\n                {{ groupColumns()[item.group.level].def.headerName ?? groupColumns()[item.group.level].def.field }}:\n                {{ item.group.value }}\n              </span>\n              <span class=\"gd-group-count\">({{ item.group.count }})</span>\n              @for (aggCol of aggregateColumns(); track aggCol.key) {\n                <span class=\"gd-group-agg\">\n                  {{ aggCol.def.headerName ?? aggCol.def.field }}: {{ formatAggregateValue(item.group.aggregates[aggCol.key]) }}\n                </span>\n              }\n            </div>\n          </div>\n        } @else if (item.kind === 'detail') {\n          <div class=\"gd-row gd-row--detail\" role=\"row\">\n            <div class=\"gd-cell gd-detail-cell\" role=\"gridcell\">\n              <ng-container\n                *ngTemplateOutlet=\"detailRowTemplate()!; context: { $implicit: item.row, data: item.row }\"\n              />\n            </div>\n          </div>\n        } @else {\n          <ng-container\n            *ngTemplateOutlet=\"dataRow; context: { row: item.row, rowIndex: item.rowIndex, level: item.level }\"\n          />\n        }\n      }\n    </div>\n  } @else {\n    <cdk-virtual-scroll-viewport\n      [itemSize]=\"rowHeight()\"\n      [style.height]=\"height()\"\n      [style.min-width]=\"contentMinWidth()\"\n      class=\"gd-viewport\"\n    >\n      <div\n        class=\"gd-row\"\n        role=\"row\"\n        [ngClass]=\"rowClasses(row)\"\n        [class.gd-row--selected]=\"isSelected(row, rowIndex)\"\n        [style.height.px]=\"rowHeight()\"\n        [attr.aria-rowindex]=\"rowIndex + 2\"\n        [attr.aria-selected]=\"rowSelection() !== 'none' ? isSelected(row, rowIndex) : null\"\n        [attr.tabindex]=\"rowSelection() !== 'none' ? 0 : null\"\n        (click)=\"onRowClick(row, rowIndex, $event)\"\n        (keydown)=\"onRowKeydown(row, rowIndex, $event)\"\n        *cdkVirtualFor=\"let row of sortedRows(); trackBy: trackRow; let rowIndex = index\"\n      >\n        @for (col of columns(); track col.key; let colIndex = $index) {\n          <div\n            class=\"gd-cell\"\n            role=\"gridcell\"\n            [ngClass]=\"cellClasses(col, row)\"\n            [style]=\"col.style\"\n            [class.gd-cell--editable]=\"isEditable(col, row)\"\n            [class.gd-cell--pinned]=\"col.pinned\"\n            [class.gd-cell--flash]=\"enableChangeFlash() && isCellFlashing(col, row, rowIndex)\"\n            [attr.tabindex]=\"isEditable(col, row) ? 0 : (isActiveCell(rowIndex, colIndex) ? 0 : -1)\"\n            [attr.aria-colindex]=\"colIndex + 1\"\n            [attr.title]=\"cellTooltip(col, row)\"\n            (click)=\"onCellClick(row, rowIndex, col, $event)\"\n            (dblclick)=\"onCellDblClick(row, rowIndex, col, $event)\"\n            (keydown)=\"onCellKeydown(row, rowIndex, col, $event)\"\n            (focus)=\"onCellFocus(rowIndex, colIndex)\"\n            (contextmenu)=\"onCellContextMenu(row, col, $event)\"\n          >\n            <ng-container *ngTemplateOutlet=\"cellContent; context: { row, col, rowIndex }\" />\n          </div>\n        }\n      </div>\n    </cdk-virtual-scroll-viewport>\n  }\n\n  @if (loading()) {\n    <div class=\"gd-overlay gd-overlay--loading\" role=\"status\" aria-live=\"polite\">Loading…</div>\n  }\n\n  @if (hasPinnedRows() && pinnedBottomRows().length > 0) {\n    <div class=\"gd-body gd-body--pinned-bottom\" [style.min-width]=\"contentMinWidth()\">\n      @for (row of pinnedBottomRows(); track pinnedRowId(row)) {\n        <ng-container *ngTemplateOutlet=\"dataRow; context: { row, rowIndex: pinnedRowIndex(row) }\" />\n      }\n    </div>\n  }\n\n  @if (pagination() && sortedRows().length > 0) {\n    <div class=\"gd-pager\">\n      <span class=\"gd-pager__range\">{{ pageRangeText() }}</span>\n      <div class=\"gd-pager__buttons\">\n        <button type=\"button\" (click)=\"goToPage(0)\" [disabled]=\"safeCurrentPage() === 0\">« First</button>\n        <button type=\"button\" (click)=\"goToPage(safeCurrentPage() - 1)\" [disabled]=\"safeCurrentPage() === 0\">\n          ‹ Prev\n        </button>\n        <span class=\"gd-pager__page\">Page {{ safeCurrentPage() + 1 }} of {{ pageCount() }}</span>\n        <button\n          type=\"button\"\n          (click)=\"goToPage(safeCurrentPage() + 1)\"\n          [disabled]=\"safeCurrentPage() >= pageCount() - 1\"\n        >\n          Next ›\n        </button>\n        <button\n          type=\"button\"\n          (click)=\"goToPage(pageCount() - 1)\"\n          [disabled]=\"safeCurrentPage() >= pageCount() - 1\"\n        >\n          Last »\n        </button>\n      </div>\n    </div>\n  }\n</div>\n\n@if (contextMenuState(); as menu) {\n  <div\n    class=\"gd-context-menu-backdrop\"\n    tabindex=\"-1\"\n    (click)=\"closeContextMenu()\"\n    (keydown.escape)=\"closeContextMenu()\"\n    (contextmenu)=\"$event.preventDefault(); closeContextMenu()\"\n  ></div>\n  <div class=\"gd-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\">\n    @for (item of menu.items; track item.label) {\n      <button type=\"button\" role=\"menuitem\" (click)=\"runContextMenuAction(item.action)\">{{ item.label }}</button>\n    }\n  </div>\n}\n\n<ng-template #dataRow let-row=\"row\" let-rowIndex=\"rowIndex\" let-level=\"level\">\n  <div\n    class=\"gd-row\"\n    role=\"row\"\n    [ngClass]=\"rowClasses(row)\"\n    [class.gd-row--selected]=\"isSelected(row, rowIndex)\"\n    [style.height.px]=\"resolvedRowHeight(row, rowIndex)\"\n    [attr.aria-rowindex]=\"rowIndex + 2\"\n    [attr.aria-selected]=\"rowSelection() !== 'none' ? isSelected(row, rowIndex) : null\"\n    [attr.aria-level]=\"hasTreeData() ? (level ?? 0) + 1 : null\"\n    [attr.aria-expanded]=\"hasTreeData() && hasChildRows(row) ? isRowExpanded(row, rowIndex) : null\"\n    [attr.tabindex]=\"rowSelection() !== 'none' ? 0 : null\"\n    [attr.draggable]=\"enableRowDrag() ? true : null\"\n    (click)=\"onRowClick(row, rowIndex, $event)\"\n    (keydown)=\"onRowKeydown(row, rowIndex, $event)\"\n    (dragstart)=\"onRowDragStart(row, rowIndex, $event)\"\n    (dragover)=\"onRowDragOver($event)\"\n    (drop)=\"onRowDrop(row, $event)\"\n  >\n    @for (col of columns(); track col.key; let colIndex = $index) {\n      <div\n        class=\"gd-cell\"\n        role=\"gridcell\"\n        [ngClass]=\"cellClasses(col, row)\"\n        [style]=\"col.style\"\n        [style.padding-left.px]=\"colIndex === 0 && hasTreeData() ? (level ?? 0) * 20 + 8 : null\"\n        [class.gd-cell--editable]=\"isEditable(col, row)\"\n        [class.gd-cell--pinned]=\"col.pinned\"\n        [class.gd-cell--flash]=\"enableChangeFlash() && isCellFlashing(col, row, rowIndex)\"\n        [attr.tabindex]=\"isEditable(col, row) ? 0 : (isActiveCell(rowIndex, colIndex) ? 0 : -1)\"\n        [attr.aria-colindex]=\"colIndex + 1\"\n        [attr.title]=\"cellTooltip(col, row)\"\n        (click)=\"onCellClick(row, rowIndex, col, $event)\"\n        (dblclick)=\"onCellDblClick(row, rowIndex, col, $event)\"\n        (keydown)=\"onCellKeydown(row, rowIndex, col, $event)\"\n        (focus)=\"onCellFocus(rowIndex, colIndex)\"\n        (contextmenu)=\"onCellContextMenu(row, col, $event)\"\n      >\n        @if (colIndex === 0 && hasTreeData()) {\n          @if (hasChildRows(row)) {\n            <button\n              type=\"button\"\n              class=\"gd-tree-toggle\"\n              (click)=\"toggleRowExpanded(row, rowIndex); $event.stopPropagation()\"\n            >\n              {{ isRowExpanded(row, rowIndex) ? '▼' : '▶' }}\n            </button>\n          } @else {\n            <span class=\"gd-tree-spacer\"></span>\n          }\n        }\n        @if (colIndex === 0 && hasDetailTemplate()) {\n          <button\n            type=\"button\"\n            class=\"gd-detail-toggle\"\n            (click)=\"toggleDetail(row, rowIndex); $event.stopPropagation()\"\n          >\n            {{ isDetailExpanded(row, rowIndex) ? '▾' : '▸' }}\n          </button>\n        }\n        @if (colIndex === 0 && enableRowDrag()) {\n          <span class=\"gd-row-drag-handle\" aria-hidden=\"true\">⋮⋮</span>\n        }\n        <ng-container *ngTemplateOutlet=\"cellContent; context: { row, col, rowIndex }\" />\n      </div>\n    }\n  </div>\n</ng-template>\n\n<ng-template #cellContent let-row=\"row\" let-col=\"col\" let-rowIndex=\"rowIndex\">\n  @if (col.def.checkboxSelection) {\n    <input\n      type=\"checkbox\"\n      class=\"gd-select-checkbox\"\n      [attr.aria-label]=\"'Select row ' + (rowIndex + 1)\"\n      [checked]=\"isSelected(row, rowIndex)\"\n      (change)=\"toggleRowSelection(row, rowIndex)\"\n    />\n  } @else if (col.def.cellRenderer) {\n    <ng-container\n      *ngTemplateOutlet=\"col.def.cellRenderer; context: { $implicit: cellValue(row, col.def), value: cellValue(row, col.def), data: row }\"\n    />\n  } @else if (isEditing(row, rowIndex, col)) {\n    @switch (col.def.cellEditor ?? 'text') {\n      @case ('checkbox') {\n        <input\n          type=\"checkbox\"\n          class=\"gd-edit-input\"\n          gdAutoFocus\n          [checked]=\"editorInitialChecked(row, col)\"\n          (blur)=\"onEditorBlur(row, col, $event)\"\n          (keydown)=\"onEditorKeydown(row, col, $event)\"\n        />\n      }\n      @case ('select') {\n        <select\n          class=\"gd-edit-input\"\n          gdAutoFocus\n          (blur)=\"onEditorBlur(row, col, $event)\"\n          (keydown)=\"onEditorKeydown(row, col, $event)\"\n          (change)=\"onEditorBlur(row, col, $event)\"\n        >\n          @for (option of col.def.cellEditorParams?.options ?? []; track option.label) {\n            <option [value]=\"option.value\" [selected]=\"editorOptionSelected(row, col, option.value)\">\n              {{ option.label }}\n            </option>\n          }\n        </select>\n      }\n      @case ('number') {\n        <input\n          type=\"number\"\n          class=\"gd-edit-input\"\n          gdAutoFocus\n          [value]=\"editorInitialValue(row, col)\"\n          (blur)=\"onEditorBlur(row, col, $event)\"\n          (keydown)=\"onEditorKeydown(row, col, $event)\"\n        />\n      }\n      @case ('date') {\n        <input\n          type=\"date\"\n          class=\"gd-edit-input\"\n          gdAutoFocus\n          [value]=\"editorInitialValue(row, col)\"\n          (blur)=\"onEditorBlur(row, col, $event)\"\n          (keydown)=\"onEditorKeydown(row, col, $event)\"\n        />\n      }\n      @default {\n        <input\n          type=\"text\"\n          class=\"gd-edit-input\"\n          gdAutoFocus\n          [value]=\"editorInitialValue(row, col)\"\n          (blur)=\"onEditorBlur(row, col, $event)\"\n          (keydown)=\"onEditorKeydown(row, col, $event)\"\n        />\n      }\n    }\n  } @else {\n    {{ cellDisplay(row, col.def) }}\n  }\n</ng-template>\n","import type { ColDef } from '../models/col-def';\n\nexport interface PivotOptions<TData> {\n  /** Field whose distinct values become output rows. */\n  rowField: keyof TData & string;\n  /** Field whose distinct values become output columns. */\n  columnField: keyof TData & string;\n  /** Numeric field aggregated at each row/column intersection. */\n  valueField: keyof TData & string;\n  /** Defaults to `'sum'`. */\n  aggFunc?: 'sum' | 'avg' | 'min' | 'max' | 'count';\n  /** Header for the leading row-label column; defaults to `rowField`. */\n  rowHeaderName?: string;\n}\n\nexport interface PivotResult {\n  rowData: Record<string, unknown>[];\n  columnDefs: ColDef<Record<string, unknown>>[];\n}\n\n/** Transforms flat rows into a cross-tab: distinct `columnField` values become individual output\n * columns, distinct `rowField` values become output rows, and `valueField` is aggregated\n * (`aggFunc`, default `'sum'`) at each row/column intersection. Feed the result straight into\n * `<gd-data-grid [rowData]=\"result.rowData\" [columnDefs]=\"result.columnDefs\">` - the grid itself\n * has no pivot-specific code; this is a plain data-transformation utility that composes with\n * every other grid feature (sorting/filtering/grouping/etc. all just work on the pivoted output). */\nexport function pivotData<TData>(rows: readonly TData[], options: PivotOptions<TData>): PivotResult {\n  const { rowField, columnField, valueField, aggFunc = 'sum', rowHeaderName } = options;\n\n  const rowValues: string[] = [];\n  const columnValues: string[] = [];\n  const buckets = new Map<string, Map<string, number[]>>();\n\n  for (const row of rows) {\n    const rowKey = String(row[rowField]);\n    const colKey = String(row[columnField]);\n    const value = Number(row[valueField]);\n\n    if (!rowValues.includes(rowKey)) rowValues.push(rowKey);\n    if (!columnValues.includes(colKey)) columnValues.push(colKey);\n\n    let rowBucket = buckets.get(rowKey);\n    if (!rowBucket) {\n      rowBucket = new Map();\n      buckets.set(rowKey, rowBucket);\n    }\n    const values = rowBucket.get(colKey);\n    if (values) values.push(value);\n    else rowBucket.set(colKey, [value]);\n  }\n\n  rowValues.sort();\n  columnValues.sort();\n\n  const rowData = rowValues.map((rowKey) => {\n    const rowBucket = buckets.get(rowKey);\n    const record: Record<string, unknown> = { [rowField]: rowKey };\n    for (const colKey of columnValues) {\n      const values = rowBucket?.get(colKey);\n      record[colKey] = values ? aggregate(values, aggFunc) : null;\n    }\n    return record;\n  });\n\n  const columnDefs: ColDef<Record<string, unknown>>[] = [\n    { field: rowField, headerName: rowHeaderName ?? rowField, pinned: 'left' },\n    ...columnValues.map((colKey): ColDef<Record<string, unknown>> => ({ field: colKey, headerName: colKey, sortable: true })),\n  ];\n\n  return { rowData, columnDefs };\n}\n\nfunction aggregate(values: number[], fn: 'sum' | 'avg' | 'min' | 'max' | 'count'): number {\n  if (fn === 'count') return values.length;\n  const nums = values.filter((num) => !Number.isNaN(num));\n  if (nums.length === 0) return 0;\n  switch (fn) {\n    case 'sum':\n      return nums.reduce((sum, num) => sum + num, 0);\n    case 'avg':\n      return nums.reduce((sum, num) => sum + num, 0) / nums.length;\n    case 'min':\n      return Math.min(...nums);\n    case 'max':\n      return Math.max(...nums);\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport interface ChartDatum {\n  label: string;\n  value: number;\n}\n\ninterface ChartBar extends ChartDatum {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\n/** A minimal, dependency-free SVG bar chart - typically fed from `DataGrid.getSelectedRows()`\n * (via `buildChartSeries()`) to give a \"quick chart from selection\" without pulling in a full\n * charting library. Intentionally scoped to bar charts only for v1 - the simplest, most broadly\n * useful chart type to render correctly with plain SVG geometry. */\n@Component({\n  selector: 'gd-quick-chart',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <svg\n      [attr.viewBox]=\"'0 0 ' + width() + ' ' + height()\"\n      [attr.width]=\"width()\"\n      [attr.height]=\"height()\"\n      class=\"gd-chart\"\n      role=\"img\"\n      [attr.aria-label]=\"ariaLabel()\"\n    >\n      @for (bar of bars(); track bar.label) {\n        <rect [attr.x]=\"bar.x\" [attr.y]=\"bar.y\" [attr.width]=\"bar.width\" [attr.height]=\"bar.height\" [attr.fill]=\"color()\" />\n        <text [attr.x]=\"bar.x + bar.width / 2\" [attr.y]=\"height() - 6\" text-anchor=\"middle\" class=\"gd-chart-label\">\n          {{ bar.label }}\n        </text>\n        <text [attr.x]=\"bar.x + bar.width / 2\" [attr.y]=\"bar.y - 4\" text-anchor=\"middle\" class=\"gd-chart-value\">\n          {{ bar.value }}\n        </text>\n      }\n    </svg>\n  `,\n  styles: `\n    .gd-chart {\n      font-family: var(--gd-font-family, sans-serif);\n      overflow: visible;\n    }\n\n    .gd-chart-label {\n      font-size: 11px;\n      fill: var(--gd-muted-color, #666);\n    }\n\n    .gd-chart-value {\n      font-size: 11px;\n      fill: var(--gd-text-color, #1a1a1a);\n      font-weight: 600;\n    }\n  `,\n})\nexport class QuickChart {\n  readonly data = input<readonly ChartDatum[]>([]);\n  readonly width = input<number>(400);\n  readonly height = input<number>(200);\n  readonly color = input<string>('#2563eb');\n  readonly ariaLabel = input<string>('Bar chart');\n\n  protected readonly bars = computed<ChartBar[]>(() => {\n    const points = this.data();\n    const w = this.width();\n    const h = this.height();\n    if (points.length === 0) return [];\n\n    const topMargin = 20;\n    const bottomMargin = 20;\n    const chartHeight = h - topMargin - bottomMargin;\n    const gap = 8;\n    const barWidth = (w - gap * (points.length + 1)) / points.length;\n    const maxValue = Math.max(...points.map((point) => point.value), 1);\n\n    return points.map((point, index) => {\n      const barHeight = (Math.max(point.value, 0) / maxValue) * chartHeight;\n      return {\n        ...point,\n        x: gap + index * (barWidth + gap),\n        y: topMargin + (chartHeight - barHeight),\n        width: barWidth,\n        height: barHeight,\n      };\n    });\n  });\n}\n\n/** Maps rows (e.g. `DataGrid.getSelectedRows()`) into chart-ready `{label, value}` points. */\nexport function buildChartSeries<TData>(\n  rows: readonly TData[],\n  options: { labelField: keyof TData & string; valueField: keyof TData & string },\n): ChartDatum[] {\n  return rows.map((row) => ({\n    label: String(row[options.labelField]),\n    value: Number(row[options.valueField]),\n  }));\n}\n","/*\n * Public API Surface of grid\n */\n\nexport * from './lib/data-grid';\nexport * from './lib/pivot';\nexport * from './lib/quick-chart';\nexport * from './models/col-def';\nexport * from './models/grid-events';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}