@toolbox-web/grid-angular 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +146 -54
  2. package/fesm2022/toolbox-web-grid-angular-features-clipboard.mjs +58 -0
  3. package/fesm2022/toolbox-web-grid-angular-features-clipboard.mjs.map +1 -1
  4. package/fesm2022/toolbox-web-grid-angular-features-column-virtualization.mjs +37 -0
  5. package/fesm2022/toolbox-web-grid-angular-features-column-virtualization.mjs.map +1 -1
  6. package/fesm2022/toolbox-web-grid-angular-features-context-menu.mjs +51 -0
  7. package/fesm2022/toolbox-web-grid-angular-features-context-menu.mjs.map +1 -1
  8. package/fesm2022/toolbox-web-grid-angular-features-editing.mjs +115 -1
  9. package/fesm2022/toolbox-web-grid-angular-features-editing.mjs.map +1 -1
  10. package/fesm2022/toolbox-web-grid-angular-features-export.mjs +55 -2
  11. package/fesm2022/toolbox-web-grid-angular-features-export.mjs.map +1 -1
  12. package/fesm2022/toolbox-web-grid-angular-features-filtering.mjs +159 -5
  13. package/fesm2022/toolbox-web-grid-angular-features-filtering.mjs.map +1 -1
  14. package/fesm2022/toolbox-web-grid-angular-features-grouping-columns.mjs +83 -0
  15. package/fesm2022/toolbox-web-grid-angular-features-grouping-columns.mjs.map +1 -1
  16. package/fesm2022/toolbox-web-grid-angular-features-grouping-rows.mjs +82 -0
  17. package/fesm2022/toolbox-web-grid-angular-features-grouping-rows.mjs.map +1 -1
  18. package/fesm2022/toolbox-web-grid-angular-features-master-detail.mjs +115 -2
  19. package/fesm2022/toolbox-web-grid-angular-features-master-detail.mjs.map +1 -1
  20. package/fesm2022/toolbox-web-grid-angular-features-multi-sort.mjs +38 -0
  21. package/fesm2022/toolbox-web-grid-angular-features-multi-sort.mjs.map +1 -1
  22. package/fesm2022/toolbox-web-grid-angular-features-pinned-columns.mjs +37 -0
  23. package/fesm2022/toolbox-web-grid-angular-features-pinned-columns.mjs.map +1 -1
  24. package/fesm2022/toolbox-web-grid-angular-features-pinned-rows.mjs +103 -0
  25. package/fesm2022/toolbox-web-grid-angular-features-pinned-rows.mjs.map +1 -1
  26. package/fesm2022/toolbox-web-grid-angular-features-pivot.mjs +36 -0
  27. package/fesm2022/toolbox-web-grid-angular-features-pivot.mjs.map +1 -1
  28. package/fesm2022/toolbox-web-grid-angular-features-print.mjs +58 -2
  29. package/fesm2022/toolbox-web-grid-angular-features-print.mjs.map +1 -1
  30. package/fesm2022/toolbox-web-grid-angular-features-reorder-columns.mjs +52 -0
  31. package/fesm2022/toolbox-web-grid-angular-features-reorder-columns.mjs.map +1 -1
  32. package/fesm2022/toolbox-web-grid-angular-features-reorder-rows.mjs +41 -0
  33. package/fesm2022/toolbox-web-grid-angular-features-reorder-rows.mjs.map +1 -1
  34. package/fesm2022/toolbox-web-grid-angular-features-responsive.mjs +112 -2
  35. package/fesm2022/toolbox-web-grid-angular-features-responsive.mjs.map +1 -1
  36. package/fesm2022/toolbox-web-grid-angular-features-row-drag-drop.mjs +77 -0
  37. package/fesm2022/toolbox-web-grid-angular-features-row-drag-drop.mjs.map +1 -1
  38. package/fesm2022/toolbox-web-grid-angular-features-selection.mjs +52 -2
  39. package/fesm2022/toolbox-web-grid-angular-features-selection.mjs.map +1 -1
  40. package/fesm2022/toolbox-web-grid-angular-features-server-side.mjs +36 -0
  41. package/fesm2022/toolbox-web-grid-angular-features-server-side.mjs.map +1 -1
  42. package/fesm2022/toolbox-web-grid-angular-features-tooltip.mjs +36 -0
  43. package/fesm2022/toolbox-web-grid-angular-features-tooltip.mjs.map +1 -1
  44. package/fesm2022/toolbox-web-grid-angular-features-tree.mjs +53 -0
  45. package/fesm2022/toolbox-web-grid-angular-features-tree.mjs.map +1 -1
  46. package/fesm2022/toolbox-web-grid-angular-features-undo-redo.mjs +57 -2
  47. package/fesm2022/toolbox-web-grid-angular-features-undo-redo.mjs.map +1 -1
  48. package/fesm2022/toolbox-web-grid-angular-features-visibility.mjs +53 -0
  49. package/fesm2022/toolbox-web-grid-angular-features-visibility.mjs.map +1 -1
  50. package/fesm2022/toolbox-web-grid-angular.mjs +1274 -727
  51. package/fesm2022/toolbox-web-grid-angular.mjs.map +1 -1
  52. package/package.json +1 -1
  53. package/types/toolbox-web-grid-angular-features-clipboard.d.ts +23 -0
  54. package/types/toolbox-web-grid-angular-features-clipboard.d.ts.map +1 -1
  55. package/types/toolbox-web-grid-angular-features-column-virtualization.d.ts +19 -0
  56. package/types/toolbox-web-grid-angular-features-column-virtualization.d.ts.map +1 -1
  57. package/types/toolbox-web-grid-angular-features-context-menu.d.ts +22 -0
  58. package/types/toolbox-web-grid-angular-features-context-menu.d.ts.map +1 -1
  59. package/types/toolbox-web-grid-angular-features-editing.d.ts +32 -0
  60. package/types/toolbox-web-grid-angular-features-editing.d.ts.map +1 -1
  61. package/types/toolbox-web-grid-angular-features-export.d.ts +21 -3
  62. package/types/toolbox-web-grid-angular-features-export.d.ts.map +1 -1
  63. package/types/toolbox-web-grid-angular-features-filtering.d.ts +67 -6
  64. package/types/toolbox-web-grid-angular-features-filtering.d.ts.map +1 -1
  65. package/types/toolbox-web-grid-angular-features-grouping-columns.d.ts +19 -0
  66. package/types/toolbox-web-grid-angular-features-grouping-columns.d.ts.map +1 -1
  67. package/types/toolbox-web-grid-angular-features-grouping-rows.d.ts +25 -0
  68. package/types/toolbox-web-grid-angular-features-grouping-rows.d.ts.map +1 -1
  69. package/types/toolbox-web-grid-angular-features-master-detail.d.ts +23 -0
  70. package/types/toolbox-web-grid-angular-features-master-detail.d.ts.map +1 -1
  71. package/types/toolbox-web-grid-angular-features-multi-sort.d.ts +19 -0
  72. package/types/toolbox-web-grid-angular-features-multi-sort.d.ts.map +1 -1
  73. package/types/toolbox-web-grid-angular-features-pinned-columns.d.ts +18 -0
  74. package/types/toolbox-web-grid-angular-features-pinned-columns.d.ts.map +1 -1
  75. package/types/toolbox-web-grid-angular-features-pinned-rows.d.ts +19 -0
  76. package/types/toolbox-web-grid-angular-features-pinned-rows.d.ts.map +1 -1
  77. package/types/toolbox-web-grid-angular-features-pivot.d.ts +19 -0
  78. package/types/toolbox-web-grid-angular-features-pivot.d.ts.map +1 -1
  79. package/types/toolbox-web-grid-angular-features-print.d.ts +22 -3
  80. package/types/toolbox-web-grid-angular-features-print.d.ts.map +1 -1
  81. package/types/toolbox-web-grid-angular-features-reorder-columns.d.ts +22 -0
  82. package/types/toolbox-web-grid-angular-features-reorder-columns.d.ts.map +1 -1
  83. package/types/toolbox-web-grid-angular-features-reorder-rows.d.ts +19 -0
  84. package/types/toolbox-web-grid-angular-features-reorder-rows.d.ts.map +1 -1
  85. package/types/toolbox-web-grid-angular-features-responsive.d.ts +22 -0
  86. package/types/toolbox-web-grid-angular-features-responsive.d.ts.map +1 -1
  87. package/types/toolbox-web-grid-angular-features-row-drag-drop.d.ts +27 -0
  88. package/types/toolbox-web-grid-angular-features-row-drag-drop.d.ts.map +1 -1
  89. package/types/toolbox-web-grid-angular-features-selection.d.ts +21 -3
  90. package/types/toolbox-web-grid-angular-features-selection.d.ts.map +1 -1
  91. package/types/toolbox-web-grid-angular-features-server-side.d.ts +19 -0
  92. package/types/toolbox-web-grid-angular-features-server-side.d.ts.map +1 -1
  93. package/types/toolbox-web-grid-angular-features-tooltip.d.ts +19 -0
  94. package/types/toolbox-web-grid-angular-features-tooltip.d.ts.map +1 -1
  95. package/types/toolbox-web-grid-angular-features-tree.d.ts +22 -0
  96. package/types/toolbox-web-grid-angular-features-tree.d.ts.map +1 -1
  97. package/types/toolbox-web-grid-angular-features-undo-redo.d.ts +22 -3
  98. package/types/toolbox-web-grid-angular-features-undo-redo.d.ts.map +1 -1
  99. package/types/toolbox-web-grid-angular-features-visibility.d.ts +22 -0
  100. package/types/toolbox-web-grid-angular-features-visibility.d.ts.map +1 -1
  101. package/types/toolbox-web-grid-angular.d.ts +939 -128
  102. package/types/toolbox-web-grid-angular.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toolbox-web-grid-angular.mjs","sources":["../../../../libs/grid-angular/src/lib/angular-column-config.ts","../../../../libs/grid-angular/src/lib/directives/grid-column-editor.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-column-view.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-detail-view.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-form-array.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-responsive-card.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-tool-panel.directive.ts","../../../../libs/grid-angular/src/lib/directives/structural-directives.ts","../../../../libs/grid-angular/src/lib/editor-wiring.ts","../../../../libs/grid-angular/src/lib/grid-type-registry.ts","../../../../libs/grid-angular/src/lib/angular-grid-adapter.ts","../../../../libs/grid-angular/src/lib/grid-icon-registry.ts","../../../../libs/grid-angular/src/lib/inject-grid.ts","../../../../libs/grid-angular/src/lib/feature-registry.ts","../../../../libs/grid-angular/src/lib/base-filter-panel.ts","../../../../libs/grid-angular/src/lib/base-grid-editor.ts","../../../../libs/grid-angular/src/lib/base-grid-editor-cva.ts","../../../../libs/grid-angular/src/lib/base-overlay-editor.ts","../../../../libs/grid-angular/src/lib/directives/grid-column.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-header.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-lazy-form.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-tool-buttons.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid.directive.ts","../../../../libs/grid-angular/src/index.ts","../../../../libs/grid-angular/src/toolbox-web-grid-angular.ts"],"sourcesContent":["/**\n * Angular-specific column configuration types.\n *\n * These types extend the base grid column config to allow Angular component\n * classes to be used directly as renderers and editors.\n */\nimport type { Type } from '@angular/core';\nimport type { ColumnConfig as BaseColumnConfig, GridConfig as BaseGridConfig } from '@toolbox-web/grid';\nimport type { FilterPanelParams, FilterPanelRenderer } from '@toolbox-web/grid/plugins/filtering';\n\n// #region CellRenderer Interface\n/**\n * Interface for cell renderer components.\n *\n * Renderer components receive the cell value, row data, and column config as inputs.\n * Use Angular signal inputs for reactive updates.\n *\n * @example\n * ```typescript\n * import { Component, input } from '@angular/core';\n * import type { CellRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-status-badge',\n * template: `<span [class]=\"'badge-' + value()\">{{ value() }}</span>`\n * })\n * export class StatusBadgeComponent implements CellRenderer<Employee, string> {\n * value = input.required<string>();\n * row = input.required<Employee>();\n * column = input<unknown>();\n * }\n * ```\n */\nexport interface CellRenderer<TRow = unknown, TValue = unknown> {\n /** The cell value - use `input<TValue>()` or `input.required<TValue>()` */\n value: { (): TValue | undefined };\n /** The full row data - use `input<TRow>()` or `input.required<TRow>()` */\n row: { (): TRow | undefined };\n /** The column configuration (optional) - use `input<unknown>()` */\n column?: { (): unknown };\n}\n\n// #endregion\n\n// #region CellEditor Interface\n/**\n * Interface for cell editor components.\n *\n * Editor components receive the cell value, row data, and column config as inputs,\n * plus must emit `commit` and `cancel` outputs.\n *\n * @example\n * ```typescript\n * import { Component, input, output } from '@angular/core';\n * import type { CellEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-status-editor',\n * template: `\n * <select [value]=\"value()\" (change)=\"commit.emit($any($event.target).value)\">\n * <option value=\"active\">Active</option>\n * <option value=\"inactive\">Inactive</option>\n * </select>\n * `\n * })\n * export class StatusEditorComponent implements CellEditor<Employee, string> {\n * value = input.required<string>();\n * row = input.required<Employee>();\n * column = input<unknown>();\n * commit = output<string>();\n * cancel = output<void>();\n * }\n * ```\n */\nexport interface CellEditor<TRow = unknown, TValue = unknown> extends CellRenderer<TRow, TValue> {\n /** Emit to commit the new value - use `output<TValue>()` */\n commit: { emit(value: TValue): void; subscribe?(fn: (value: TValue) => void): { unsubscribe(): void } };\n /** Emit to cancel editing - use `output<void>()` */\n cancel: { emit(): void; subscribe?(fn: () => void): { unsubscribe(): void } };\n}\n\n// #endregion\n\n// #region FilterPanel Interface\n/**\n * Interface for filter panel components.\n *\n * Filter panel components receive the full `FilterPanelParams` as a single input,\n * providing access to field info, unique values, and filter action methods.\n *\n * @example\n * ```typescript\n * import { Component, input } from '@angular/core';\n * import type { FilterPanel } from '@toolbox-web/grid-angular';\n * import type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\n *\n * @Component({\n * selector: 'app-custom-filter',\n * template: `\n * <div>\n * <input (input)=\"onSearch($event)\" />\n * <button (click)=\"params().clearFilter()\">Clear</button>\n * </div>\n * `\n * })\n * export class CustomFilterComponent implements FilterPanel {\n * params = input.required<FilterPanelParams>();\n * }\n * ```\n */\nexport interface FilterPanel {\n /** The filter panel parameters — use `input.required<FilterPanelParams>()` */\n params: { (): FilterPanelParams };\n}\n// #endregion\n\n// #region TypeDefault Interface\n/**\n * Type default configuration.\n *\n * Allows Angular component classes for renderers and editors in typeDefaults.\n *\n * @example\n * ```typescript\n * import type { GridConfig, TypeDefault } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * typeDefaults: {\n * boolean: {\n * renderer: (ctx) => { ... }, // vanilla JS renderer\n * editor: CheckboxEditorComponent, // Angular component\n * },\n * date: {\n * editor: DatePickerComponent, // Angular component\n * }\n * }\n * };\n * ```\n */\nexport interface TypeDefault<TRow = unknown> {\n /** Format function for cell display */\n format?: (value: unknown, row: TRow) => string;\n /** Cell renderer - can be vanilla JS function or Angular component */\n renderer?: BaseColumnConfig<TRow>['renderer'] | Type<CellRenderer<TRow, unknown>>;\n /** Cell editor - can be vanilla JS function or Angular component */\n editor?: BaseColumnConfig<TRow>['editor'] | Type<CellEditor<TRow, unknown>>;\n /** Default editor parameters */\n editorParams?: Record<string, unknown>;\n /**\n * Custom filter panel renderer for this type. Requires FilteringPlugin.\n *\n * Can be:\n * - A vanilla `FilterPanelRenderer` function `(container, params) => void`\n * - An Angular component class implementing `FilterPanel`\n *\n * @example Using an Angular component\n * ```typescript\n * typeDefaults: {\n * date: {\n * filterPanelRenderer: DateFilterPanelComponent,\n * }\n * }\n * ```\n */\n filterPanelRenderer?: FilterPanelRenderer | Type<FilterPanel>;\n}\n\n// #endregion\n\n// #region ColumnConfig Interface\n/**\n * Column configuration for Angular applications.\n *\n * Extends the base ColumnConfig to allow Angular component classes\n * to be used directly as renderers and editors.\n *\n * @example\n * ```typescript\n * import type { ColumnConfig } from '@toolbox-web/grid-angular';\n * import { StatusBadgeComponent, StatusEditorComponent } from './components';\n *\n * const columns: ColumnConfig<Employee>[] = [\n * { field: 'name', header: 'Name' },\n * {\n * field: 'status',\n * header: 'Status',\n * editable: true,\n * renderer: StatusBadgeComponent,\n * editor: StatusEditorComponent,\n * },\n * ];\n * ```\n */\nexport interface ColumnConfig<TRow = unknown> extends Omit<\n BaseColumnConfig<TRow>,\n 'renderer' | 'editor' | 'headerRenderer' | 'headerLabelRenderer'\n> {\n /**\n * Cell renderer - can be:\n * - A function `(ctx) => HTMLElement | string`\n * - An Angular component class implementing CellRenderer\n */\n renderer?: BaseColumnConfig<TRow>['renderer'] | Type<CellRenderer<TRow, unknown>>;\n\n /**\n * Cell editor - can be:\n * - A function `(ctx) => HTMLElement`\n * - An Angular component class implementing CellEditor\n */\n editor?: BaseColumnConfig<TRow>['editor'] | Type<CellEditor<TRow, unknown>>;\n\n /**\n * Header cell renderer - can be:\n * - A function `(ctx: HeaderCellContext) => Node | string | void | null`\n * - An Angular component class with column, value, sortState, filterActive, renderSortIcon, renderFilterButton inputs\n */\n headerRenderer?: BaseColumnConfig<TRow>['headerRenderer'] | Type<unknown>;\n\n /**\n * Header label renderer - can be:\n * - A function `(ctx: HeaderLabelContext) => Node | string | void | null`\n * - An Angular component class with column and value inputs\n */\n headerLabelRenderer?: BaseColumnConfig<TRow>['headerLabelRenderer'] | Type<unknown>;\n}\n\n// #endregion\n\n// #region GridConfig Interface\n/**\n * Grid configuration for Angular applications.\n *\n * Extends the base GridConfig to use Angular-augmented ColumnConfig and TypeDefault.\n * This allows component classes as renderers/editors.\n *\n * @example\n * ```typescript\n * import type { GridConfig, ColumnConfig } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * columns: [...],\n * plugins: [...],\n * };\n * ```\n */\nexport interface GridConfig<TRow = unknown> extends Omit<\n BaseGridConfig<TRow>,\n 'columns' | 'typeDefaults' | 'loadingRenderer'\n> {\n columns?: ColumnConfig<TRow>[];\n /** Type-level defaults that can use Angular component classes */\n typeDefaults?: Record<string, TypeDefault<TRow>>;\n /**\n * Custom loading renderer - can be:\n * - A function `(ctx: LoadingContext) => HTMLElement | string`\n * - An Angular component class with a `size` input\n */\n loadingRenderer?: BaseGridConfig<TRow>['loadingRenderer'] | Type<unknown>;\n}\n\n// #endregion\n\n// #region Utilities\n/**\n * Type guard to check if a value is an Angular component class.\n *\n * Detects Angular components by checking for internal Angular markers:\n * - ɵcmp (component definition)\n * - ɵfac (factory function)\n *\n * Also checks if it's an ES6 class (vs function) by inspecting the\n * string representation.\n */\nexport function isComponentClass(value: unknown): value is Type<unknown> {\n if (typeof value !== 'function' || value.prototype === undefined) {\n return false;\n }\n\n // Check for Angular component markers (AOT compiled)\n if (Object.prototype.hasOwnProperty.call(value, 'ɵcmp') || Object.prototype.hasOwnProperty.call(value, 'ɵfac')) {\n return true;\n }\n\n // Check if it's an ES6 class (vs regular function)\n // Class definitions start with \"class\" in their toString()\n const fnString = Function.prototype.toString.call(value);\n return fnString.startsWith('class ') || fnString.startsWith('class{');\n}\n// #endregion\n","import { contentChild, Directive, effect, ElementRef, inject, TemplateRef } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\n\n/**\n * Context object passed to the cell editor template.\n * Contains the cell value, row data, column configuration, and commit/cancel functions.\n */\nexport interface GridEditorContext<TValue = unknown, TRow = unknown> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** Field name being edited */\n field: string;\n /** The column configuration */\n column: unknown;\n /** Stable row identifier (from `getRowId`). Empty string if no `getRowId` is configured. */\n rowId: string;\n /**\n * Callback function to commit the edited value.\n * Use with Angular event binding: `(commit)=\"onCommit($event)\"`\n */\n onCommit: (value: TValue) => void;\n /**\n * Callback function to cancel editing.\n * Use with Angular event binding: `(cancel)=\"onCancel()\"`\n */\n onCancel: () => void;\n /**\n * Update other fields in this row while the editor is open.\n * Changes trigger `cell-change` events with source `'cascade'`.\n */\n updateRow: (changes: Partial<TRow>) => void;\n /**\n * Register a callback to receive value updates when the cell is modified\n * externally (e.g., via `updateRow()` from another cell's commit).\n *\n * The framework adapter auto-patches `value`/`$implicit` for template editors,\n * but custom components may use this for additional reactivity.\n */\n onValueChange?: (callback: (newValue: TValue) => void) => void;\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray with FormGroups.\n *\n * This allows custom editors to bind directly to the control for validation display:\n * ```html\n * <input *tbwEditor=\"let value; control as ctrl\"\n * [formControl]=\"ctrl\"\n * [class.is-invalid]=\"ctrl?.invalid && ctrl?.touched\" />\n * ```\n *\n * Returns `undefined` if:\n * - The grid is not bound to a FormArray\n * - The FormArray doesn't contain FormGroups\n * - The field doesn't exist in the FormGroup\n */\n control?: AbstractControl;\n}\n\n// Global registry mapping DOM elements to their templates\nconst editorTemplateRegistry = new Map<HTMLElement, TemplateRef<GridEditorContext>>();\n\n/**\n * Gets the editor template registered for a given element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getEditorTemplate(element: HTMLElement): TemplateRef<GridEditorContext> | undefined {\n return editorTemplateRegistry.get(element);\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a cell editor.\n *\n * This enables declarative Angular component usage with proper input bindings\n * that satisfy Angular's AOT compiler.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid-column field=\"status\" editable>\n * <tbw-grid-column-editor>\n * <ng-template let-value let-row=\"row\" let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-select\n * [value]=\"value\"\n * [row]=\"row\"\n * (commit)=\"onCommit($event)\"\n * (cancel)=\"onCancel()\"\n * />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n * - `onCommit`: Callback function to commit the new value\n * - `onCancel`: Callback function to cancel editing\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridColumnEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridColumnEditor],\n * // ...\n * })\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: 'tbw-grid-column-editor' })\nexport class GridColumnEditor {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridEditorContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n editorTemplateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridColumnEditor, ctx: unknown): ctx is GridEditorContext {\n return true;\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the cell renderer template.\n * Contains the cell value, row data, and column configuration.\n */\nexport interface GridCellContext<TValue = unknown, TRow = unknown> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n column: unknown;\n}\n\n// Global registry mapping DOM elements to their templates\nconst templateRegistry = new Map<HTMLElement, TemplateRef<GridCellContext>>();\n\n/**\n * Gets the template registered for a given element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getViewTemplate(element: HTMLElement): TemplateRef<GridCellContext> | undefined {\n return templateRegistry.get(element);\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a cell renderer.\n *\n * This enables declarative Angular component usage with proper input bindings\n * that satisfy Angular's AOT compiler.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" [row]=\"row\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * </tbw-grid-column>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridColumnView } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridColumnView],\n * // ...\n * })\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: 'tbw-grid-column-view' })\nexport class GridColumnView {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridCellContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n templateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridColumnView, ctx: unknown): ctx is GridCellContext {\n return true;\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, input, TemplateRef } from '@angular/core';\nimport type { ExpandCollapseAnimation } from '@toolbox-web/grid';\n\n/**\n * Context object passed to the detail renderer template.\n * Contains the row data for the expanded detail view.\n */\nexport interface GridDetailContext<TRow = unknown> {\n /** The row data (implicit binding for let-row) */\n $implicit: TRow;\n /** The row data (explicit binding) */\n row: TRow;\n}\n\n// Global registry mapping DOM elements to their templates\nconst detailTemplateRegistry = new Map<HTMLElement, TemplateRef<GridDetailContext>>();\n\n/**\n * Gets the detail template registered for a given grid element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getDetailTemplate(gridElement: HTMLElement): TemplateRef<GridDetailContext> | undefined {\n // Look for tbw-grid-detail child and get its template\n const detailElement = gridElement.querySelector('tbw-grid-detail');\n if (detailElement) {\n return detailTemplateRegistry.get(detailElement as HTMLElement);\n }\n return undefined;\n}\n\n/**\n * Gets the configuration for the detail view.\n */\nexport function getDetailConfig(\n gridElement: HTMLElement,\n): { showExpandColumn?: boolean; animation?: ExpandCollapseAnimation } | undefined {\n const detailElement = gridElement.querySelector('tbw-grid-detail');\n if (detailElement) {\n const animationAttr = detailElement.getAttribute('animation');\n let animation: ExpandCollapseAnimation = 'slide';\n if (animationAttr === 'false') {\n animation = false;\n } else if (animationAttr === 'fade') {\n animation = 'fade';\n }\n return {\n showExpandColumn: detailElement.getAttribute('showExpandColumn') !== 'false',\n animation,\n };\n }\n return undefined;\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a master-detail row renderer.\n *\n * This enables declarative Angular component usage for expandable detail rows\n * that appear below the main row when expanded.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-detail [showExpandColumn]=\"true\" animation=\"slide\">\n * <ng-template let-row>\n * <app-detail-panel [employee]=\"row\" />\n * </ng-template>\n * </tbw-grid-detail>\n * </tbw-grid>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `row`: The full row data object\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridDetailView } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridDetailView],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-detail [showExpandColumn]=\"true\" animation=\"slide\">\n * <ng-template let-row>\n * <app-detail-panel [employee]=\"row\" />\n * </ng-template>\n * </tbw-grid-detail>\n * </tbw-grid>\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: 'tbw-grid-detail' })\nexport class GridDetailView {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /** Whether to show the expand/collapse column. Default: true */\n showExpandColumn = input<boolean>(true);\n\n /** Animation style for expand/collapse. Default: 'slide' */\n animation = input<ExpandCollapseAnimation>('slide');\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridDetailContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n detailTemplateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridDetailView, ctx: unknown): ctx is GridDetailContext {\n return true;\n }\n}\n","import { DestroyRef, Directive, effect, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport type { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, startWith } from 'rxjs/operators';\n\n/**\n * Interface for EditingPlugin validation methods.\n * We use a minimal interface to avoid importing the full EditingPlugin class.\n */\ninterface EditingPluginValidation {\n setInvalid(rowId: string, field: string, message?: string): void;\n clearInvalid(rowId: string, field: string): void;\n clearRowInvalid(rowId: string): void;\n}\n\n/**\n * Interface for EditingPlugin config to check mode.\n */\ninterface EditingPluginConfig {\n config?: { mode?: 'row' | 'grid' };\n}\n\n/**\n * Context provided to the grid containing form-related information.\n * This can be accessed by other directives to get form controls.\n */\nexport interface FormArrayContext {\n /** Get the row data at a specific index */\n getRow<T = unknown>(rowIndex: number): T | null;\n /** Update a field value at a specific row */\n updateField(rowIndex: number, field: string, value: unknown): void;\n /** Get the current form value (all rows) */\n getValue<T = unknown>(): T[];\n /**\n * Get the FormControl for a specific cell.\n * Only available when using FormArray with FormGroup rows.\n *\n * @param rowIndex - The row index\n * @param field - The field name\n * @returns The AbstractControl for the cell, or undefined if not available\n */\n getControl(rowIndex: number, field: string): AbstractControl | undefined;\n /**\n * Whether the grid is backed by a FormArray of FormGroups.\n * When true, `getControl()` will return cell-level controls.\n */\n hasFormGroups: boolean;\n /**\n * Get the FormGroup for a specific row.\n * Only available when using FormArray with FormGroup rows.\n *\n * @param rowIndex - The row index\n * @returns The FormGroup for the row, or undefined if not available\n */\n getRowFormGroup(rowIndex: number): FormGroup | undefined;\n /**\n * Check if a row is valid (all controls in the FormGroup are valid).\n * Returns true if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if the row is valid, false if any control is invalid\n */\n isRowValid(rowIndex: number): boolean;\n /**\n * Check if a row has been touched (any control in the FormGroup is touched).\n * Returns false if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if any control in the row is touched\n */\n isRowTouched(rowIndex: number): boolean;\n /**\n * Check if a row is dirty (any control in the FormGroup is dirty).\n * Returns false if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if any control in the row is dirty\n */\n isRowDirty(rowIndex: number): boolean;\n /**\n * Get validation errors for a specific row.\n * Aggregates errors from all controls in the FormGroup.\n *\n * @param rowIndex - The row index\n * @returns Object with field names as keys and their errors, or null if no errors\n */\n getRowErrors(rowIndex: number): Record<string, unknown> | null;\n}\n\n// Symbol for storing form context on the grid element\nconst FORM_ARRAY_CONTEXT = Symbol('formArrayContext');\n\n/**\n * Gets the FormArrayContext from a grid element, if present.\n * @internal\n */\nexport function getFormArrayContext(gridElement: HTMLElement): FormArrayContext | undefined {\n return (gridElement as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n}\n\n/**\n * Directive that binds a FormArray directly to the grid.\n *\n * This is the recommended way to integrate tbw-grid with Angular Reactive Forms.\n * Use a FormArray of FormGroups for row-level validation and cell-level control access.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, inject } from '@angular/core';\n * import { FormBuilder, ReactiveFormsModule } from '@angular/forms';\n * import { Grid, GridFormArray } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, GridFormArray, ReactiveFormsModule],\n * template: \\`\n * <form [formGroup]=\"form\">\n * <tbw-grid [formArray]=\"form.controls.rows\" [columns]=\"columns\" />\n * </form>\n * \\`\n * })\n * export class MyComponent {\n * private fb = inject(FormBuilder);\n *\n * form = this.fb.group({\n * rows: this.fb.array([\n * this.fb.group({ name: 'Alice', age: 30 }),\n * this.fb.group({ name: 'Bob', age: 25 }),\n * ])\n * });\n *\n * columns = [\n * { field: 'name', header: 'Name', editable: true },\n * { field: 'age', header: 'Age', editable: true }\n * ];\n * }\n * ```\n *\n * ## How It Works\n *\n * - **FormArray → Grid**: The grid displays the FormArray's value as rows\n * - **Grid → FormArray**: When a cell is edited, the corresponding FormControl is updated\n * - FormArrayContext is available for accessing cell-level controls\n *\n * ## Features\n *\n * - Works naturally with FormArray inside a FormGroup\n * - Provides cell-level FormControl access for validation\n * - Supports row-level validation state aggregation\n * - Automatically syncs FormArray changes to the grid\n *\n * @example\n * ```html\n * <form [formGroup]=\"form\">\n * <tbw-grid [formArray]=\"form.controls.rows\" [columns]=\"columns\" />\n * </form>\n * ```\n *\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid[formArray]',\n})\nexport class GridFormArray implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private elementRef = inject(ElementRef<GridElement>);\n private cellCommitUnsub: (() => void) | null = null;\n private cellCancelUnsub: (() => void) | null = null;\n private rowCommitUnsub: (() => void) | null = null;\n private touchListener: ((e: Event) => void) | null = null;\n private valueChangesSubscription: Subscription | null = null;\n private statusChangesSubscriptions: Subscription[] = [];\n\n /**\n * The FormArray to bind to the grid.\n */\n readonly formArray = input.required<FormArray>();\n\n /**\n * Whether to automatically sync Angular validation state to grid's visual invalid styling.\n *\n * When enabled:\n * - After a cell commit, if the FormControl is invalid, the cell is marked with `setInvalid()`\n * - When a FormControl becomes valid, `clearInvalid()` is called\n * - On `row-commit`, if the row's FormGroup has invalid controls, the commit is prevented\n * - In grid mode: validation state is synced on initial render and updated reactively\n *\n * @default true\n */\n readonly syncValidation = input<boolean>(true);\n\n /**\n * Effect that sets up valueChanges subscription when FormArray changes.\n * This handles both initial binding and when the FormArray reference changes.\n */\n private syncFormArrayToGrid = effect(() => {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid || !formArray) return;\n\n // Unsubscribe from previous FormArray if any\n this.valueChangesSubscription?.unsubscribe();\n\n // Subscribe to valueChanges to sync grid rows when FormArray content changes.\n // Use startWith to immediately sync the current value.\n // Note: We use getRawValue() to include disabled controls.\n //\n // In grid mode, editors bind directly to FormControls, so every keystroke\n // fires valueChanges. We skip the sync when an editor input is focused to\n // prevent destroying/recreating editors mid-edit (which orphans overlays\n // like mat-autocomplete/mat-select panels and causes focus loss).\n this.valueChangesSubscription = formArray.valueChanges\n .pipe(startWith(formArray.getRawValue()), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Skip sync while an editor is actively focused in the grid.\n // The FormArray already has the latest values via its own controls;\n // re-setting grid.rows would create new object references and trigger\n // an unnecessary render cycle.\n if (this.#isEditorFocused(grid)) return;\n\n grid.rows = formArray.getRawValue();\n });\n });\n\n ngOnInit(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Store the form context on the grid element for other directives to access\n this.#storeFormContext(grid);\n\n // Intercept cell-commit events to update the FormArray\n this.cellCommitUnsub = grid.on(\n 'cell-commit',\n (detail: { rowIndex: number; field: string; value: unknown; oldValue: unknown; rowId: string }) => {\n this.#handleCellCommit(detail);\n },\n );\n\n // Intercept cell-cancel events to revert FormControls (grid mode Escape)\n this.cellCancelUnsub = grid.on(\n 'cell-cancel',\n (detail: { rowIndex: number; field: string; previousValue: unknown }) => {\n this.#handleCellCancel(detail);\n },\n );\n\n // Intercept row-commit events to prevent if FormGroup is invalid\n this.rowCommitUnsub = grid.on(\n 'row-commit',\n (detail: { rowIndex: number; rowId?: string; changed: boolean }, event: CustomEvent) => {\n if (!this.syncValidation()) return;\n this.#handleRowCommit(event, detail);\n },\n );\n\n // Mark FormArray as touched on first interaction\n this.touchListener = () => {\n this.formArray().markAsTouched();\n // Remove after first touch\n if (this.touchListener) {\n grid.removeEventListener('click', this.touchListener);\n this.touchListener = null;\n }\n };\n grid.addEventListener('click', this.touchListener);\n\n // If in grid mode with syncValidation, set up reactive validation\n // Wait for grid to be ready so we can detect the editing mode\n grid.ready?.().then(() => {\n if (this.syncValidation() && this.#isGridMode()) {\n this.#setupReactiveValidation();\n // Sync initial validation state for all existing controls\n this.#syncAllValidationState();\n }\n });\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n this.cellCommitUnsub?.();\n this.cellCancelUnsub?.();\n this.rowCommitUnsub?.();\n if (this.touchListener) {\n grid.removeEventListener('click', this.touchListener);\n }\n if (this.valueChangesSubscription) {\n this.valueChangesSubscription.unsubscribe();\n }\n // Clean up status change subscriptions (grid mode)\n this.statusChangesSubscriptions.forEach((sub) => sub.unsubscribe());\n this.statusChangesSubscriptions = [];\n\n this.#clearFormContext(grid);\n }\n\n /**\n * Checks if the EditingPlugin is in 'grid' mode.\n */\n #isGridMode(): boolean {\n const grid = this.elementRef.nativeElement;\n if (!grid) return false;\n\n const editingPlugin = grid.getPluginByName?.('editing') as\n | (EditingPluginValidation & EditingPluginConfig)\n | undefined;\n\n return editingPlugin?.config?.mode === 'grid';\n }\n\n /**\n * Checks if a focusable editor element inside the grid currently has focus.\n * Used to skip valueChanges → grid.rows sync while a user is actively editing,\n * preventing editor destruction (which orphans overlay panels like autocomplete/select).\n */\n #isEditorFocused(grid: GridElement): boolean {\n if (!this.#isGridMode()) return false;\n const active = document.activeElement;\n if (!active) return false;\n // Check if the focused element is inside the grid\n return grid.contains(active) && active.closest('.editing') != null;\n }\n\n /**\n * Sets up reactive validation syncing for grid mode.\n * Subscribes to statusChanges on all FormControls to update validation state in real-time.\n */\n #setupReactiveValidation(): void {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Clean up any existing subscriptions\n this.statusChangesSubscriptions.forEach((sub) => sub.unsubscribe());\n this.statusChangesSubscriptions = [];\n\n // Subscribe to each FormGroup's statusChanges\n for (let rowIndex = 0; rowIndex < formArray.length; rowIndex++) {\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (!rowFormGroup) continue;\n\n // Get the row ID for this row\n const rowId = this.#getRowId(grid, rowIndex);\n if (!rowId) continue;\n\n // Subscribe to status changes for each control in the FormGroup\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (!control) return;\n\n const sub = control.statusChanges.pipe(debounceTime(50), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.#syncControlValidationToGrid(rowId, field, control);\n });\n\n this.statusChangesSubscriptions.push(sub);\n });\n }\n }\n\n /**\n * Syncs validation state for all controls in the FormArray.\n * Called once on init in grid mode to show pre-existing validation errors.\n */\n #syncAllValidationState(): void {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n for (let rowIndex = 0; rowIndex < formArray.length; rowIndex++) {\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (!rowFormGroup) continue;\n\n const rowId = this.#getRowId(grid, rowIndex);\n if (!rowId) continue;\n\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (control) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n });\n }\n }\n\n /**\n * Gets the row ID for a given row index using the grid's getRowId method.\n */\n #getRowId(grid: GridElement, rowIndex: number): string | undefined {\n try {\n const rows = grid.rows;\n const row = rows?.[rowIndex];\n if (!row) return undefined;\n return grid.getRowId?.(row);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Checks if the FormArray contains FormGroups.\n */\n #isFormArrayOfFormGroups(): boolean {\n const formArray = this.formArray();\n if (formArray.length === 0) return false;\n return formArray.at(0) instanceof FormGroup;\n }\n\n /**\n * Gets the FormGroup at a specific row index.\n */\n #getRowFormGroup(rowIndex: number): FormGroup | undefined {\n const formArray = this.formArray();\n const rowControl = formArray.at(rowIndex);\n return rowControl instanceof FormGroup ? rowControl : undefined;\n }\n\n /**\n * Stores the FormArrayContext on the grid element.\n */\n #storeFormContext(grid: GridElement): void {\n const getRowFormGroup = (rowIndex: number) => this.#getRowFormGroup(rowIndex);\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const context: FormArrayContext = {\n getRow: <T>(rowIndex: number): T | null => {\n const formArray = this.formArray();\n const rowControl = formArray.at(rowIndex);\n return rowControl ? (rowControl.value as T) : null;\n },\n updateField: (rowIndex: number, field: string, value: unknown) => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n }\n }\n },\n getValue: <T>(): T[] => {\n return this.formArray().getRawValue() as T[];\n },\n get hasFormGroups() {\n return self.#isFormArrayOfFormGroups();\n },\n getControl: (rowIndex: number, field: string): AbstractControl | undefined => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return undefined;\n return rowFormGroup.get(field) ?? undefined;\n },\n getRowFormGroup,\n isRowValid: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return true;\n return rowFormGroup.valid;\n },\n isRowTouched: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return false;\n return rowFormGroup.touched;\n },\n isRowDirty: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return false;\n return rowFormGroup.dirty;\n },\n getRowErrors: (rowIndex: number): Record<string, unknown> | null => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return null;\n\n const errors: Record<string, unknown> = {};\n let hasErrors = false;\n\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (control?.errors) {\n errors[field] = control.errors;\n hasErrors = true;\n }\n });\n\n if (rowFormGroup.errors) {\n errors['_group'] = rowFormGroup.errors;\n hasErrors = true;\n }\n\n return hasErrors ? errors : null;\n },\n };\n (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT] = context;\n }\n\n /**\n * Clears the FormArrayContext from the grid element.\n */\n #clearFormContext(grid: GridElement): void {\n delete (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n }\n\n /**\n * Handles cell-commit events by updating the FormControl in the FormGroup.\n */\n #handleCellCommit(detail: { rowIndex: number; field: string; value: unknown; rowId: string }): void {\n const { rowIndex, field, value, rowId } = detail;\n\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n control.markAsTouched();\n\n // Sync Angular validation state to grid's visual invalid styling\n if (this.syncValidation() && rowId) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n }\n }\n }\n\n /**\n * Handles row-commit events - prevents commit if FormGroup has invalid controls.\n */\n #handleRowCommit(event: Event, detail: { rowIndex: number }): void {\n const { rowIndex } = detail;\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n\n if (rowFormGroup && rowFormGroup.invalid) {\n // Prevent row commit if the FormGroup is invalid\n event.preventDefault();\n }\n }\n\n /**\n * Handles cell-cancel events (grid mode Escape) — reverts the FormControl\n * to the value it had before the edit session began.\n */\n #handleCellCancel(detail: { rowIndex: number; field: string; previousValue: unknown }): void {\n const { rowIndex, field, previousValue } = detail;\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(previousValue, { emitEvent: false });\n control.markAsPristine();\n }\n }\n }\n\n /**\n * Syncs a FormControl's validation state to the grid's visual invalid styling.\n */\n #syncControlValidationToGrid(rowId: string, field: string, control: AbstractControl): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Get EditingPlugin via getPluginByName\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n\n if (!editingPlugin) return;\n\n if (control.invalid) {\n // Get first error message to display\n const errorMessage = this.#getFirstErrorMessage(control);\n editingPlugin.setInvalid(rowId, field, errorMessage);\n } else {\n editingPlugin.clearInvalid(rowId, field);\n }\n }\n\n /**\n * Gets a human-readable error message from the first validation error.\n */\n #getFirstErrorMessage(control: AbstractControl): string {\n const errors = control.errors;\n if (!errors) return '';\n\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n\n // Common Angular validators\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n // Custom validators may provide a message property\n return typeof error === 'string' ? error : (error?.message ?? `Validation error: ${firstKey}`);\n }\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the responsive card template.\n *\n * @template TRow - The type of row data\n *\n * @example\n * ```html\n * <tbw-grid-responsive-card>\n * <ng-template let-row let-index=\"index\">\n * <div class=\"card-content\">\n * <span>{{ row.name }}</span>\n * <span>Row #{{ index }}</span>\n * </div>\n * </ng-template>\n * </tbw-grid-responsive-card>\n * ```\n */\nexport interface GridResponsiveCardContext<TRow = unknown> {\n /**\n * The row data (available as `let-row` or `let-myVar`).\n */\n $implicit: TRow;\n\n /**\n * The row data (explicit access via `let-row=\"row\"`).\n */\n row: TRow;\n\n /**\n * The row index (zero-based).\n */\n index: number;\n}\n\n/**\n * Registry to store responsive card templates by grid element.\n * Used by AngularGridAdapter to create card renderers.\n */\nexport const responsiveCardTemplateRegistry = new Map<HTMLElement, TemplateRef<GridResponsiveCardContext>>();\n\n/**\n * Retrieves the responsive card template for a grid element.\n *\n * @param gridElement - The grid element to look up\n * @returns The template reference or undefined if not found\n */\nexport function getResponsiveCardTemplate(\n gridElement: HTMLElement,\n): TemplateRef<GridResponsiveCardContext> | undefined {\n // Find the tbw-grid-responsive-card element inside the grid\n const cardElement = gridElement.querySelector('tbw-grid-responsive-card');\n if (!cardElement) return undefined;\n return responsiveCardTemplateRegistry.get(cardElement as HTMLElement);\n}\n\n/**\n * Directive for providing custom Angular templates for responsive card layout.\n *\n * Use this directive to define how each row should render when the grid\n * is in responsive/mobile mode. The template receives the row data and index.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"employees\">\n * <tbw-grid-responsive-card>\n * <ng-template let-employee let-idx=\"index\">\n * <div class=\"employee-card\">\n * <img [src]=\"employee.avatar\" alt=\"\">\n * <div class=\"info\">\n * <strong>{{ employee.name }}</strong>\n * <span>{{ employee.department }}</span>\n * </div>\n * </div>\n * </ng-template>\n * </tbw-grid-responsive-card>\n * </tbw-grid>\n * ```\n *\n * ## Important Notes\n *\n * - The ResponsivePlugin must be added to your grid config\n * - The Grid directive will automatically configure the plugin's cardRenderer\n * - Template context provides `$implicit` (row), `row`, and `index`\n *\n * @see ResponsivePlugin\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid-responsive-card',\n})\nexport class GridResponsiveCard<TRow = unknown> {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * The ng-template containing the card content.\n */\n template = contentChild(TemplateRef<GridResponsiveCardContext<TRow>>);\n\n /**\n * Effect that registers the template when it becomes available.\n */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n responsiveCardTemplateRegistry.set(\n this.elementRef.nativeElement,\n template as TemplateRef<GridResponsiveCardContext>,\n );\n }\n });\n\n /**\n * Type guard for template context inference.\n */\n static ngTemplateContextGuard<T>(\n _directive: GridResponsiveCard<T>,\n context: unknown,\n ): context is GridResponsiveCardContext<T> {\n return true;\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the tool panel template.\n * Provides access to grid-related information for the panel content.\n */\nexport interface GridToolPanelContext {\n /** The grid element (implicit binding) */\n $implicit: HTMLElement;\n /** The grid element */\n grid: HTMLElement;\n}\n\n// Global registry mapping DOM elements to their templates\nconst toolPanelTemplateRegistry = new Map<HTMLElement, TemplateRef<GridToolPanelContext>>();\n\n/**\n * Gets the tool panel template registered for a given tool panel element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getToolPanelTemplate(panelElement: HTMLElement): TemplateRef<GridToolPanelContext> | undefined {\n return toolPanelTemplateRegistry.get(panelElement);\n}\n\n/**\n * Gets all tool panel elements with registered templates within a grid element.\n */\nexport function getToolPanelElements(gridElement: HTMLElement): HTMLElement[] {\n const panelElements = gridElement.querySelectorAll('tbw-grid-tool-panel');\n return Array.from(panelElements).filter((el) => toolPanelTemplateRegistry.has(el as HTMLElement)) as HTMLElement[];\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a custom tool panel.\n *\n * This enables declarative Angular component usage for tool panels\n * that appear in the grid's side panel.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-tool-panel\n * id=\"quick-filters\"\n * title=\"Quick Filters\"\n * icon=\"🔍\"\n * tooltip=\"Apply quick filters\"\n * [order]=\"10\"\n * >\n * <ng-template let-grid>\n * <app-quick-filters [grid]=\"grid\" />\n * </ng-template>\n * </tbw-grid-tool-panel>\n * </tbw-grid>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `grid`: The grid element reference\n *\n * ### Attributes\n *\n * - `id` (required): Unique identifier for the panel\n * - `title` (required): Panel title shown in accordion header\n * - `icon`: Icon for accordion section header (emoji or text)\n * - `tooltip`: Tooltip for accordion section header\n * - `order`: Panel order priority (lower = first, default: 100)\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridToolPanel } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridToolPanel],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"rows\">\n * <tbw-grid-tool-panel id=\"quick-filters\" title=\"Quick Filters\" icon=\"\\uD83D\\uDD0D\">\n * <ng-template let-grid>\n * <app-quick-filters [grid]=\"grid\" />\n * </ng-template>\n * </tbw-grid-tool-panel>\n * </tbw-grid>\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: 'tbw-grid-tool-panel' })\nexport class GridToolPanel {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /** Unique panel identifier (required) */\n id = input.required<string>({ alias: 'id' });\n\n /** Panel title shown in accordion header (required) */\n title = input.required<string>({ alias: 'title' });\n\n /** Icon for accordion section header (emoji or text) */\n icon = input<string>();\n\n /** Tooltip for accordion section header */\n tooltip = input<string>();\n\n /** Panel order priority (lower = first, default: 100) */\n order = input<number>(100);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridToolPanelContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n const element = this.elementRef.nativeElement;\n\n if (template) {\n // Set attributes from inputs (for light DOM parsing to read)\n element.setAttribute('id', this.id());\n element.setAttribute('title', this.title());\n\n const icon = this.icon();\n if (icon) element.setAttribute('icon', icon);\n\n const tooltip = this.tooltip();\n if (tooltip) element.setAttribute('tooltip', tooltip);\n\n element.setAttribute('order', String(this.order()));\n\n // Register the template for this element\n toolPanelTemplateRegistry.set(element, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridToolPanel, ctx: unknown): ctx is GridToolPanelContext {\n return true;\n }\n}\n","import { Directive, effect, ElementRef, inject, OnDestroy, TemplateRef } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport { getEditorTemplate } from './grid-column-editor.directive';\nimport { getViewTemplate } from './grid-column-view.directive';\n\n/**\n * Context type for structural directives with `any` defaults.\n * This provides better ergonomics in templates without requiring explicit type annotations.\n *\n * @internal Use `GridCellContext` in application code for stricter typing.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface StructuralCellContext<TValue = any, TRow = any> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n column: any;\n}\n\n/**\n * Context type for structural editor directives with `any` defaults.\n * This provides better ergonomics in templates without requiring explicit type annotations.\n *\n * @internal Use `GridEditorContext` in application code for stricter typing.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface StructuralEditorContext<TValue = any, TRow = any> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n column: any;\n /**\n * Callback function to commit the edited value.\n */\n onCommit: (value: TValue) => void;\n /**\n * Callback function to cancel editing.\n */\n onCancel: () => void;\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray with FormGroups.\n *\n * Returns `undefined` if:\n * - The grid is not bound to a FormArray\n * - The FormArray doesn't contain FormGroups\n * - The field doesn't exist in the FormGroup\n */\n control?: AbstractControl;\n}\n\n// Registries for structural directive templates\nconst structuralViewRegistry = new Map<HTMLElement, TemplateRef<StructuralCellContext>>();\nconst structuralEditorRegistry = new Map<HTMLElement, TemplateRef<StructuralEditorContext>>();\n\n/**\n * Gets the view template registered by the structural directive for a given column element.\n * Falls back to the non-structural directive registry.\n */\nexport function getStructuralViewTemplate(columnElement: HTMLElement): TemplateRef<StructuralCellContext> | undefined {\n // First check structural directive registry\n const template = structuralViewRegistry.get(columnElement);\n if (template) return template;\n\n // Fall back to the nested element registry\n const viewEl = columnElement.querySelector('tbw-grid-column-view');\n if (viewEl) {\n return getViewTemplate(viewEl as HTMLElement) as TemplateRef<StructuralCellContext> | undefined;\n }\n return undefined;\n}\n\n/**\n * Gets the editor template registered by the structural directive for a given column element.\n * Falls back to the non-structural directive registry.\n */\nexport function getStructuralEditorTemplate(\n columnElement: HTMLElement,\n): TemplateRef<StructuralEditorContext> | undefined {\n // First check structural directive registry\n const template = structuralEditorRegistry.get(columnElement);\n if (template) return template;\n\n // Fall back to the nested element registry\n const editorEl = columnElement.querySelector('tbw-grid-column-editor');\n if (editorEl) {\n return getEditorTemplate(editorEl as HTMLElement) as TemplateRef<StructuralEditorContext> | undefined;\n }\n return undefined;\n}\n\n/**\n * Structural directive for cell view rendering.\n *\n * This provides a cleaner syntax for defining custom cell renderers without\n * the nested `<tbw-grid-column-view>` and `<ng-template>` boilerplate.\n *\n * ## Usage\n *\n * ```html\n * <!-- Instead of this verbose syntax: -->\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * </tbw-grid-column>\n *\n * <!-- Use this cleaner syntax: -->\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * ## Template Context\n *\n * The structural directive provides the same context as `GridColumnView`:\n * - `$implicit` / `value`: The cell value (use `let value` or `let-value`)\n * - `row`: The full row data object (use `row as row` or `let-row=\"row\"`)\n * - `column`: The column configuration\n *\n * ## Import\n *\n * ```typescript\n * import { TbwRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [TbwRenderer],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: '[tbwRenderer]' })\nexport class TbwRenderer implements OnDestroy {\n private template = inject(TemplateRef<StructuralCellContext>);\n private elementRef = inject(ElementRef<HTMLElement>);\n private columnElement: HTMLElement | null = null;\n\n constructor() {\n // Angular structural directives wrap the host element in a comment node.\n // We need to find the parent tbw-grid-column element.\n // Since we're injected into the template, we use an effect to register once the DOM is stable.\n effect(() => {\n this.registerTemplate();\n });\n }\n\n private registerTemplate(): void {\n // Find the parent tbw-grid-column element\n // The template's host element may not be in the DOM yet, so we traverse from the comment node\n let parent = this.elementRef.nativeElement?.parentElement;\n while (parent && parent.tagName !== 'TBW-GRID-COLUMN') {\n parent = parent.parentElement;\n }\n\n if (parent) {\n this.columnElement = parent;\n structuralViewRegistry.set(parent, this.template);\n }\n }\n\n ngOnDestroy(): void {\n if (this.columnElement) {\n structuralViewRegistry.delete(this.columnElement);\n }\n }\n\n /**\n * Static type guard for template context.\n * Uses `any` defaults for ergonomic template usage.\n */\n static ngTemplateContextGuard(dir: TbwRenderer, ctx: unknown): ctx is StructuralCellContext {\n return true;\n }\n}\n\n/**\n * Structural directive for cell editor rendering.\n *\n * This provides a cleaner syntax for defining custom cell editors without\n * the nested `<tbw-grid-column-editor>` and `<ng-template>` boilerplate.\n *\n * ## Usage\n *\n * ```html\n * <!-- Instead of this verbose syntax: -->\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-editor>\n * <ng-template let-value let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-editor [value]=\"value\" (commit)=\"onCommit($event)\" (cancel)=\"onCancel()\" />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n *\n * <!-- Use this cleaner syntax (with auto-wiring - no explicit bindings needed!): -->\n * <tbw-grid-column field=\"status\">\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * ## Template Context\n *\n * The structural directive provides the same context as `GridColumnEditor`:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n * - `onCommit`: Callback function to commit the new value (optional - auto-wired if component emits `commit` event)\n * - `onCancel`: Callback function to cancel editing (optional - auto-wired if component emits `cancel` event)\n *\n * ## Import\n *\n * ```typescript\n * import { TbwEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [TbwEditor],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid-column field=\"status\" editable>\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @category Directive\n */\n@Directive({ selector: '[tbwEditor]' })\nexport class TbwEditor implements OnDestroy {\n private template = inject(TemplateRef<StructuralEditorContext>);\n private elementRef = inject(ElementRef<HTMLElement>);\n private columnElement: HTMLElement | null = null;\n\n constructor() {\n effect(() => {\n this.registerTemplate();\n });\n }\n\n private registerTemplate(): void {\n // Find the parent tbw-grid-column element\n let parent = this.elementRef.nativeElement?.parentElement;\n while (parent && parent.tagName !== 'TBW-GRID-COLUMN') {\n parent = parent.parentElement;\n }\n\n if (parent) {\n this.columnElement = parent;\n structuralEditorRegistry.set(parent, this.template);\n }\n }\n\n ngOnDestroy(): void {\n if (this.columnElement) {\n structuralEditorRegistry.delete(this.columnElement);\n }\n }\n\n /**\n * Static type guard for template context.\n * Uses `any` defaults for ergonomic template usage.\n */\n static ngTemplateContextGuard(dir: TbwEditor, ctx: unknown): ctx is StructuralEditorContext {\n return true;\n }\n}\n","/**\n * Editor Wiring Helpers\n *\n * Pure functions for wiring up commit/cancel handlers on editor components.\n * Extracted from GridAdapter to enable unit testing without Angular DI.\n *\n * @internal\n */\n\n// #region subscribeToOutput\n\n/**\n * Subscribes to an Angular output on a component instance.\n * Works with both EventEmitter and OutputEmitterRef (signal outputs).\n *\n * @param instance - The component instance (as a plain record)\n * @param outputName - Name of the output property\n * @param callback - Callback to invoke when the output emits\n * @returns `true` if the output was found and subscribed, `false` otherwise\n * @internal\n */\nexport function subscribeToOutput<T>(\n instance: Record<string, unknown>,\n outputName: string,\n callback: (value: T) => void,\n): boolean {\n const output = instance[outputName];\n if (!output) return false;\n\n // Check if it's an Observable-like (EventEmitter or OutputEmitterRef)\n if (typeof (output as { subscribe?: unknown }).subscribe === 'function') {\n (output as { subscribe: (fn: (v: T) => void) => void }).subscribe(callback);\n return true;\n }\n return false;\n}\n\n// #endregion\n\n// #region wireEditorCallbacks\n\n/**\n * Wire up commit/cancel handlers for an editor component.\n *\n * Supports both Angular outputs and DOM CustomEvents. When both fire\n * (the BaseGridEditor pattern), a per-action flag prevents the callback\n * from running twice.\n *\n * @param hostElement - The host DOM element for the editor\n * @param instance - The component instance (as a plain record)\n * @param commit - Callback to invoke when committing a value\n * @param cancel - Callback to invoke when cancelling the edit\n * @internal\n */\nexport function wireEditorCallbacks<TValue>(\n hostElement: HTMLElement,\n instance: Record<string, unknown>,\n commit: (value: TValue) => void,\n cancel: () => void,\n): void {\n // Guard: when both Angular output AND DOM event fire (BaseGridEditor.commitValue\n // emits both), only the first should call commit/cancel(). The flags prevent\n // double-fires that cause redundant cell-commit events and extra dirty-tracking work.\n let commitHandledByOutput = false;\n let cancelHandledByOutput = false;\n\n subscribeToOutput(instance, 'commit', (value: TValue) => {\n commitHandledByOutput = true;\n commit(value);\n });\n subscribeToOutput(instance, 'cancel', () => {\n cancelHandledByOutput = true;\n cancel();\n });\n\n // Also listen for DOM CustomEvents as a fallback for editors that don't\n // have Angular commit/cancel outputs (e.g., third-party web components).\n hostElement.addEventListener('commit', (e: Event) => {\n e.stopPropagation();\n if (commitHandledByOutput) {\n // Already handled by the Angular output subscription — reset and skip.\n commitHandledByOutput = false;\n return;\n }\n const customEvent = e as CustomEvent<TValue>;\n commit(customEvent.detail);\n });\n hostElement.addEventListener('cancel', (e: Event) => {\n e.stopPropagation();\n if (cancelHandledByOutput) {\n cancelHandledByOutput = false;\n return;\n }\n cancel();\n });\n}\n\n// #endregion\n","/**\n * Type-level default registry for Angular applications.\n *\n * Provides application-wide type defaults for renderers and editors\n * that all grids inherit automatically.\n */\nimport {\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n Type,\n} from '@angular/core';\nimport type { TypeDefault } from '@toolbox-web/grid';\nimport type { FilterPanelRenderer } from '@toolbox-web/grid/plugins/filtering';\n\n/**\n * Type default registration configuration.\n * Uses Angular component types for renderers/editors.\n *\n * @example\n * ```typescript\n * const defaults: Record<string, TypeDefaultRegistration> = {\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent,\n * },\n * };\n * ```\n */\nexport interface TypeDefaultRegistration<TRow = unknown> {\n /** Angular component class for rendering cells of this type */\n renderer?: Type<any>;\n /** Angular component class for editing cells of this type */\n editor?: Type<any>;\n /** Default editorParams for this type */\n editorParams?: Record<string, unknown>;\n /**\n * Custom filter panel for this type.\n *\n * Accepts either:\n * - An Angular component class implementing `FilterPanel` (has a `params` signal input)\n * - A vanilla imperative function `(container, params) => void`\n */\n filterPanelRenderer?: FilterPanelRenderer | Type<any>;\n}\n\n/**\n * Injection token for providing type defaults at app level.\n */\nexport const GRID_TYPE_DEFAULTS = new InjectionToken<Record<string, TypeDefaultRegistration>>('GRID_TYPE_DEFAULTS');\n\n/**\n * Injectable service for managing type-level defaults.\n *\n * Use `provideGridTypeDefaults()` in your app config to set up defaults,\n * or inject this service for dynamic registration.\n *\n * @example\n * ```typescript\n * // App-level setup (app.config.ts)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent\n * },\n * status: {\n * renderer: StatusBadgeComponent\n * }\n * })\n * ]\n * };\n *\n * // Dynamic registration\n * @Component({ ... })\n * export class AppComponent {\n * private registry = inject(GridTypeRegistry);\n *\n * ngOnInit() {\n * this.registry.register('currency', {\n * renderer: CurrencyCellComponent\n * });\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class GridTypeRegistry {\n private readonly defaults = new Map<string, TypeDefaultRegistration>();\n\n constructor() {\n // Merge any initial defaults from provider\n const initial = inject(GRID_TYPE_DEFAULTS, { optional: true });\n if (initial) {\n for (const [type, config] of Object.entries(initial)) {\n this.defaults.set(type, config);\n }\n }\n }\n\n /**\n * Register type-level defaults for a custom type.\n *\n * @param type - The type name (e.g., 'country', 'currency')\n * @param defaults - Renderer/editor configuration\n */\n register<T = unknown>(type: string, defaults: TypeDefaultRegistration<T>): void {\n this.defaults.set(type, defaults);\n }\n\n /**\n * Get type defaults for a given type.\n */\n get(type: string): TypeDefaultRegistration | undefined {\n return this.defaults.get(type);\n }\n\n /**\n * Remove type defaults for a type.\n */\n unregister(type: string): void {\n this.defaults.delete(type);\n }\n\n /**\n * Check if a type has registered defaults.\n */\n has(type: string): boolean {\n return this.defaults.has(type);\n }\n\n /**\n * Get all registered type names.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.defaults.keys());\n }\n\n /**\n * Convert to TypeDefault for use with grid's typeDefaults.\n * This is used internally by the adapter.\n *\n * @internal\n */\n getAsTypeDefault(type: string): TypeDefault | undefined {\n const config = this.defaults.get(type);\n if (!config) return undefined;\n\n // Note: The actual renderer/editor functions are created by the adapter\n // when it calls getTypeDefault() - we just return the config here\n return {\n editorParams: config.editorParams,\n // renderer and editor are handled by the adapter which creates\n // the actual functions that instantiate Angular components\n };\n }\n}\n\n/**\n * Provides application-level type defaults for all grids.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideGridTypeDefaults } from '@toolbox-web/grid-angular';\n * import { CountryCellComponent, StatusBadgeComponent } from './components';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: { renderer: CountryCellComponent },\n * status: { renderer: StatusBadgeComponent },\n * date: { editor: DatePickerComponent }\n * })\n * ]\n * };\n * ```\n */\nexport function provideGridTypeDefaults(defaults: Record<string, TypeDefaultRegistration>): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: GRID_TYPE_DEFAULTS, useValue: defaults }]);\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EmbeddedViewRef,\n EnvironmentInjector,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n ColumnConfig as BaseColumnConfig,\n GridConfig as BaseGridConfig,\n TypeDefault as BaseTypeDefault,\n CellRenderContext,\n ColumnEditorContext,\n ColumnEditorSpec,\n ColumnViewRenderer,\n FrameworkAdapter,\n HeaderCellContext,\n HeaderLabelContext,\n LoadingContext,\n} from '@toolbox-web/grid';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport type { GroupHeaderRenderParams, GroupingColumnsConfig } from '@toolbox-web/grid/plugins/grouping-columns';\nimport type { GroupingRowsConfig, GroupRowRenderParams } from '@toolbox-web/grid/plugins/grouping-rows';\nimport type { PinnedRowsConfig, PinnedRowsContext } from '@toolbox-web/grid/plugins/pinned-rows';\nimport { isComponentClass, type ColumnConfig, type GridConfig, type TypeDefault } from './angular-column-config';\nimport { getEditorTemplate, GridEditorContext } from './directives/grid-column-editor.directive';\nimport { getViewTemplate, GridCellContext } from './directives/grid-column-view.directive';\nimport { getDetailTemplate, GridDetailContext } from './directives/grid-detail-view.directive';\nimport { getFormArrayContext } from './directives/grid-form-array.directive';\nimport { getResponsiveCardTemplate, GridResponsiveCardContext } from './directives/grid-responsive-card.directive';\nimport { getToolPanelTemplate, GridToolPanelContext } from './directives/grid-tool-panel.directive';\nimport { getStructuralEditorTemplate, getStructuralViewTemplate } from './directives/structural-directives';\nimport { wireEditorCallbacks } from './editor-wiring';\nimport { GridTypeRegistry } from './grid-type-registry';\n\n/**\n * Helper to get view template from either structural directive or nested directive.\n */\nfunction getAnyViewTemplate(element: HTMLElement): TemplateRef<GridCellContext> | undefined {\n // First check structural directive registry (for *tbwRenderer syntax)\n const structuralTemplate = getStructuralViewTemplate(element);\n if (structuralTemplate) return structuralTemplate as unknown as TemplateRef<GridCellContext>;\n\n // Fall back to nested directive (for <tbw-grid-column-view> syntax)\n return getViewTemplate(element);\n}\n\n/**\n * Helper to get editor template from either structural directive or nested directive.\n */\nfunction getAnyEditorTemplate(element: HTMLElement): TemplateRef<GridEditorContext> | undefined {\n // First check structural directive registry (for *tbwEditor syntax)\n // The structural context uses `any` types for better ergonomics, but is compatible with GridEditorContext\n const structuralTemplate = getStructuralEditorTemplate(element);\n if (structuralTemplate) return structuralTemplate as unknown as TemplateRef<GridEditorContext>;\n\n // Fall back to nested directive (for <tbw-grid-column-editor> syntax)\n return getEditorTemplate(element);\n}\n\n/**\n * Framework adapter that enables zero-boilerplate integration of Angular components\n * with the grid's light DOM configuration API.\n *\n * ## Usage\n *\n * **One-time setup in your app:**\n * ```typescript\n * import { Component, inject, EnvironmentInjector, ApplicationRef, ViewContainerRef } from '@angular/core';\n * import { GridElement } from '@toolbox-web/grid';\n * import { GridAdapter } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-root',\n * // ...\n * })\n * export class AppComponent {\n * constructor() {\n * const injector = inject(EnvironmentInjector);\n * const appRef = inject(ApplicationRef);\n * const viewContainerRef = inject(ViewContainerRef);\n * GridElement.registerAdapter(new GridAdapter(injector, appRef, viewContainerRef));\n * }\n * }\n * ```\n *\n * **Declarative configuration in templates (structural directive - recommended):**\n * ```html\n * <tbw-grid>\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * ```\n *\n * **Declarative configuration in templates (nested directive - legacy):**\n * ```html\n * <tbw-grid>\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" [row]=\"row\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * <tbw-grid-column-editor>\n * <ng-template let-value let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-select [value]=\"value\" (commit)=\"onCommit($event)\" (cancel)=\"onCancel()\" />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n * </tbw-grid>\n * ```\n *\n * The adapter automatically:\n * - Detects Angular templates registered by directives (both structural and nested)\n * - Creates embedded views with cell context (value, row, column)\n * - Handles editor callbacks (onCommit/onCancel)\n * - Manages view lifecycle and change detection\n */\n\n/**\n * Synchronize an embedded view's rootNodes into a stable container element.\n *\n * Angular's control flow blocks (@if, @for, @switch) can dynamically add or\n * remove rootNodes during `detectChanges()`. This helper ensures the container\n * always reflects the current set of rootNodes, preventing orphaned or stale\n * nodes when the template's DOM structure changes between renders.\n */\nfunction syncRootNodes(viewRef: EmbeddedViewRef<unknown>, container: HTMLElement): void {\n // Fast path: if the container already holds exactly the right nodes, skip DOM mutations.\n const rootNodes: Node[] = viewRef.rootNodes;\n const children = container.childNodes;\n\n let needsSync = children.length !== rootNodes.length;\n if (!needsSync) {\n for (let i = 0; i < rootNodes.length; i++) {\n if (children[i] !== rootNodes[i]) {\n needsSync = true;\n break;\n }\n }\n }\n\n if (needsSync) {\n // Clear and re-append. replaceChildren is efficient (single reflow).\n container.replaceChildren(...rootNodes);\n }\n}\n\nexport class GridAdapter implements FrameworkAdapter {\n private viewRefs: EmbeddedViewRef<unknown>[] = [];\n private componentRefs: ComponentRef<unknown>[] = [];\n /** Editor-specific view refs tracked separately for per-cell cleanup via releaseCell. */\n private editorViewRefs: EmbeddedViewRef<unknown>[] = [];\n /** Editor-specific component refs tracked separately for per-cell cleanup via releaseCell. */\n private editorComponentRefs: ComponentRef<unknown>[] = [];\n /**\n * Per-editor `before-edit-close` listener teardown functions, keyed by\n * editor host element.\n *\n * The grid's editing plugin emits `before-edit-close` on the host\n * `<tbw-grid>` before tearing down a row's managed editors. Angular\n * editors that commit on `(blur)` rely on the focused input firing `blur`\n * naturally, but Tab / programmatic row exit rebuilds the cell DOM\n * synchronously without giving the focused input a chance to blur first\n * — pending input is silently discarded.\n *\n * Mirror of Vue's `editorBeforeCloseUnsubs` and React's\n * `wrapReactEditor` queueMicrotask bridge.\n */\n private editorBeforeCloseUnsubs: Map<HTMLElement, () => void> = new Map();\n private typeRegistry: GridTypeRegistry | null = null;\n\n constructor(\n private injector: EnvironmentInjector,\n private appRef: ApplicationRef,\n private viewContainerRef: ViewContainerRef,\n ) {\n // Register globally for directive access\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).__ANGULAR_GRID_ADAPTER__ = this;\n\n // Try to get the type registry from the injector\n try {\n this.typeRegistry = this.injector.get(GridTypeRegistry, null);\n } catch {\n // GridTypeRegistry not available - type defaults won't be resolved\n }\n }\n\n /**\n * Processes an Angular grid configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * Call this method on your gridConfig before passing it to the grid.\n *\n * @example\n * ```typescript\n * import { GridAdapter, type GridConfig } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * columns: [\n * { field: 'status', renderer: StatusBadgeComponent, editor: StatusEditorComponent },\n * ],\n * };\n *\n * // In component\n * constructor() {\n * const adapter = inject(GridAdapter); // or create new instance\n * this.processedConfig = adapter.processGridConfig(config);\n * }\n * ```\n *\n * @param config - Angular grid configuration with possible component class references\n * @returns Processed GridConfig with actual renderer/editor functions\n */\n processGridConfig<TRow = unknown>(config: GridConfig<TRow>): BaseGridConfig<TRow> {\n return this.processConfig(config as BaseGridConfig<TRow>);\n }\n\n /**\n * FrameworkAdapter.processConfig implementation.\n * Called automatically by the grid's `set gridConfig` setter.\n */\n processConfig<TRow = unknown>(config: BaseGridConfig<TRow>): BaseGridConfig<TRow> {\n // Cast to Angular's extended GridConfig since the config may contain\n // Angular component classes as renderers/editors at runtime\n const angularConfig = config as unknown as GridConfig<TRow>;\n const result = { ...angularConfig };\n\n // Process columns\n if (angularConfig.columns) {\n result.columns = angularConfig.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults - convert Angular component classes to renderer/editor functions\n if (angularConfig.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(angularConfig.typeDefaults) as typeof angularConfig.typeDefaults;\n }\n\n // Process loadingRenderer - convert Angular component class to function\n if (angularConfig.loadingRenderer && isComponentClass(angularConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createComponentLoadingRenderer(\n angularConfig.loadingRenderer,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n }\n\n return result as BaseGridConfig<TRow>;\n }\n\n /**\n * Processes typeDefaults configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * @param typeDefaults - Angular type defaults with possible component class references\n * @returns Processed TypeDefault record\n */\n processTypeDefaults<TRow = unknown>(\n typeDefaults: Record<string, TypeDefault<TRow>>,\n ): Record<string, BaseTypeDefault<TRow>> {\n const processed: Record<string, BaseTypeDefault<TRow>> = {};\n\n for (const [type, config] of Object.entries(typeDefaults)) {\n const processedConfig: BaseTypeDefault<TRow> = { ...config } as BaseTypeDefault<TRow>;\n\n // Convert renderer component class to function\n if (config.renderer && isComponentClass(config.renderer)) {\n processedConfig.renderer = this.createComponentRenderer(config.renderer);\n }\n\n // Convert editor component class to function\n if (config.editor && isComponentClass(config.editor)) {\n (processedConfig as any).editor = this.createComponentEditor(config.editor);\n }\n\n // Convert filterPanelRenderer component class to function\n if (config.filterPanelRenderer && isComponentClass(config.filterPanelRenderer)) {\n processedConfig.filterPanelRenderer = this.createComponentFilterPanelRenderer(config.filterPanelRenderer);\n }\n\n processed[type] = processedConfig;\n }\n\n return processed;\n }\n\n /**\n * Processes a single column configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * @param column - Angular column configuration\n * @returns Processed ColumnConfig\n */\n processColumn<TRow = unknown>(column: ColumnConfig<TRow>): BaseColumnConfig<TRow> {\n const processed = { ...column } as BaseColumnConfig<TRow>;\n\n // Convert renderer component class to function\n if (column.renderer && isComponentClass(column.renderer)) {\n processed.renderer = this.createComponentRenderer(column.renderer);\n }\n\n // Convert editor component class to function\n if (column.editor && isComponentClass(column.editor)) {\n processed.editor = this.createComponentEditor(column.editor);\n }\n\n // Convert headerRenderer component class to function\n if (column.headerRenderer && isComponentClass(column.headerRenderer)) {\n processed.headerRenderer = this.createComponentHeaderRenderer(column.headerRenderer) as any;\n }\n\n // Convert headerLabelRenderer component class to function\n if (column.headerLabelRenderer && isComponentClass(column.headerLabelRenderer)) {\n processed.headerLabelRenderer = this.createComponentHeaderLabelRenderer(column.headerLabelRenderer) as any;\n }\n\n return processed;\n }\n\n /**\n * Determines if this adapter can handle the given element.\n * Checks if a template is registered for this element (structural or nested).\n */\n canHandle(element: HTMLElement): boolean {\n return getAnyViewTemplate(element) !== undefined || getAnyEditorTemplate(element) !== undefined;\n }\n\n /**\n * Creates a view renderer function that creates an embedded view\n * from the registered template and returns its DOM element.\n *\n * Returns undefined if no template is registered for this element,\n * allowing the grid to use its default rendering.\n */\n createRenderer<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnViewRenderer<TRow, TValue> | undefined {\n const template = getAnyViewTemplate(element) as TemplateRef<GridCellContext<TValue, TRow>> | undefined;\n\n if (!template) {\n // Return undefined so the grid uses default rendering\n // This is important when only an editor template is provided (no view template)\n return undefined;\n }\n\n // Cell cache for this column - maps cell element to its view ref and container.\n // When the grid recycles pool elements during scroll, the same cellEl is reused\n // for different row data. By caching per cellEl, we reuse the Angular view and\n // just update its context instead of creating a new embedded view every time.\n // This matches what React and Vue adapters do with their cell caches.\n //\n // IMPORTANT: We always use a stable wrapper container (display:contents) rather\n // than caching individual rootNodes. This is critical because Angular's control\n // flow (@if, @for, @switch) can dynamically add/remove rootNodes during\n // detectChanges(). If we cached a single rootNode, newly created nodes (e.g.,\n // from an @if becoming true) would be orphaned outside the grid cell.\n const cellCache = new WeakMap<\n HTMLElement,\n { viewRef: EmbeddedViewRef<GridCellContext<TValue, TRow>>; container: HTMLElement }\n >();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n // Skip rendering if the cell is in editing mode\n // This prevents the renderer from overwriting the editor when the grid re-renders\n if (ctx.cellEl?.classList.contains('editing')) {\n return null;\n }\n\n const cellEl = ctx.cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Reuse existing view - just update context and re-run change detection\n cached.viewRef.context.$implicit = ctx.value;\n cached.viewRef.context.value = ctx.value;\n cached.viewRef.context.row = ctx.row;\n cached.viewRef.context.column = ctx.column;\n cached.viewRef.detectChanges();\n // Re-sync rootNodes into the container. Angular's control flow (@if/@for)\n // may have added or removed nodes during detectChanges().\n syncRootNodes(cached.viewRef, cached.container);\n return cached.container;\n }\n }\n\n // Create the context for the template\n const context: GridCellContext<TValue, TRow> = {\n $implicit: ctx.value,\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Always use a stable wrapper container so Angular can freely add/remove\n // rootNodes (via @if, @for, etc.) without orphaning them outside the grid cell.\n const container = document.createElement('span');\n container.style.display = 'contents';\n syncRootNodes(viewRef, container);\n\n // Cache for reuse on scroll recycles\n if (cellEl) {\n cellCache.set(cellEl, { viewRef, container });\n }\n\n return container;\n };\n }\n\n /**\n * Creates an editor spec that creates an embedded view.\n *\n * **Auto-wiring**: The adapter automatically listens for `commit` and `cancel`\n * CustomEvents on the rendered component. If the component emits these events,\n * the adapter will call the grid's commit/cancel functions automatically.\n *\n * This means templates can be simplified from:\n * ```html\n * <app-editor *tbwEditor=\"let value; onCommit as onCommit\"\n * [value]=\"value\" (commit)=\"onCommit($event)\" />\n * ```\n * To just:\n * ```html\n * <app-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * ```\n * As long as the component emits `(commit)` with the new value.\n */\n createEditor<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnEditorSpec<TRow, TValue> | undefined {\n const template = getAnyEditorTemplate(element) as TemplateRef<GridEditorContext<TValue, TRow>> | undefined;\n\n // Find the parent grid element for FormArray context access\n const gridElement = element.closest('tbw-grid') as HTMLElement | null;\n\n if (!template) {\n // No template registered - return undefined to let the grid use its default editor.\n // This allows columns with only *tbwRenderer (no *tbwEditor) to still be editable\n // using the built-in text/number/boolean editors.\n return undefined;\n }\n\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n // Create simple callback functions\n const onCommit = (value: TValue) => ctx.commit(value);\n const onCancel = () => ctx.cancel();\n\n // Try to get the FormControl from the FormArrayContext\n let control: GridEditorContext<TValue, TRow>['control'];\n if (gridElement) {\n const formContext = getFormArrayContext(gridElement);\n if (formContext?.hasFormGroups) {\n // Find the row index by looking up ctx.row in the grid's rows\n const gridRows = (gridElement as { rows?: TRow[] }).rows;\n if (gridRows) {\n const rowIndex = gridRows.indexOf(ctx.row);\n if (rowIndex >= 0) {\n control = formContext.getControl(rowIndex, ctx.field);\n }\n }\n }\n }\n\n // Create the context for the template\n const context: GridEditorContext<TValue, TRow> = {\n $implicit: ctx.value,\n value: ctx.value,\n row: ctx.row,\n field: ctx.field as string,\n column: ctx.column,\n rowId: ctx.rowId ?? '',\n onCommit,\n onCancel,\n updateRow: ctx.updateRow,\n onValueChange: ctx.onValueChange,\n // FormControl from FormArray (if available)\n control,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Use a stable wrapper so Angular's rootNodes (which may include comment\n // placeholders from <ng-container>) are always inside one element node.\n const container = document.createElement('span');\n container.style.display = 'contents';\n syncRootNodes(viewRef, container);\n this.attachBeforeEditCloseFlush(container);\n\n // Auto-wire: Listen for commit/cancel events on the rendered component.\n // This allows components to just emit (commit) and (cancel) without\n // requiring explicit template bindings like (commit)=\"onCommit($event)\".\n container.addEventListener('commit', (e: Event) => {\n const customEvent = e as CustomEvent<TValue>;\n ctx.commit(customEvent.detail);\n });\n container.addEventListener('cancel', () => {\n ctx.cancel();\n });\n\n // Auto-update editor when value changes externally (e.g., via updateRow cascade\n // or Escape-revert in grid mode). Update the template context and run synchronous\n // detectChanges() — Angular's own bindings and control flow (@for, @if) handle\n // re-rendering regardless of editor type (inputs, chips, contenteditable, etc.).\n ctx.onValueChange?.((newVal: unknown) => {\n context.$implicit = newVal as TValue;\n context.value = newVal as TValue;\n viewRef.detectChanges();\n // Re-sync rootNodes in case Angular control flow changed them\n syncRootNodes(viewRef, container);\n });\n\n return container;\n };\n }\n\n /**\n * Creates a detail renderer function for MasterDetailPlugin.\n * Renders Angular templates for expandable detail rows.\n */\n createDetailRenderer<TRow = unknown>(gridElement: HTMLElement): ((row: TRow) => HTMLElement) | undefined {\n const template = getDetailTemplate(gridElement) as TemplateRef<GridDetailContext<TRow>> | undefined;\n\n if (!template) {\n return undefined;\n }\n\n return (row: TRow) => {\n // Create the context for the template\n const context: GridDetailContext<TRow> = {\n $implicit: row,\n row: row,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Create a container for the root nodes\n const container = document.createElement('div');\n viewRef.rootNodes.forEach((node) => container.appendChild(node));\n return container;\n };\n }\n\n /**\n * Framework adapter hook called by MasterDetailPlugin during attach().\n * Parses the <tbw-grid-detail> element and returns an Angular template-based renderer.\n *\n * This enables MasterDetailPlugin to automatically use Angular templates\n * without manual configuration in the Grid directive.\n */\n parseDetailElement<TRow = unknown>(\n detailElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement | string) | undefined {\n // Get the template from the registry for this detail element\n const template = getDetailTemplate(detailElement.closest('tbw-grid') as HTMLElement) as\n | TemplateRef<GridDetailContext<TRow>>\n | undefined;\n\n if (!template) {\n return undefined;\n }\n\n // Return a renderer function that creates embedded views\n // Note: rowIndex is part of the MasterDetailPlugin detailRenderer signature but not needed here\n return (row: TRow) => {\n const context: GridDetailContext<TRow> = {\n $implicit: row,\n row: row,\n };\n\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n viewRef.detectChanges();\n\n const container = document.createElement('div');\n viewRef.rootNodes.forEach((node) => container.appendChild(node));\n return container;\n };\n }\n\n /**\n * Creates a responsive card renderer function for ResponsivePlugin.\n * Renders Angular templates for card layout in responsive mode.\n *\n * @param gridElement - The grid element to look up the template for\n * @returns A card renderer function or undefined if no template is found\n */\n createResponsiveCardRenderer<TRow = unknown>(\n gridElement: HTMLElement,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const template = getResponsiveCardTemplate(gridElement) as TemplateRef<GridResponsiveCardContext<TRow>> | undefined;\n\n if (!template) {\n return undefined;\n }\n\n return (row: TRow, rowIndex: number) => {\n // Create the context for the template\n const context: GridResponsiveCardContext<TRow> = {\n $implicit: row,\n row: row,\n index: rowIndex,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Create a container for the root nodes\n const container = document.createElement('div');\n viewRef.rootNodes.forEach((node) => container.appendChild(node));\n return container;\n };\n }\n\n /**\n * FrameworkAdapter hook called by ResponsivePlugin during attach().\n * Parses the `<tbw-grid-responsive-card>` element and delegates to\n * {@link createResponsiveCardRenderer}. Required for parity with the Vue\n * adapter so ResponsivePlugin's standard lookup path works for Angular\n * users without relying on imperative `refreshCardRenderer` calls.\n */\n parseResponsiveCardElement<TRow = unknown>(\n cardElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = cardElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n return this.createResponsiveCardRenderer<TRow>(gridElement);\n }\n\n /**\n * Creates a tool panel renderer from a light DOM element.\n * The renderer creates an Angular template-based panel content.\n */\n createToolPanelRenderer(element: HTMLElement): ((container: HTMLElement) => void | (() => void)) | undefined {\n const template = getToolPanelTemplate(element) as TemplateRef<GridToolPanelContext> | undefined;\n\n if (!template) {\n return undefined;\n }\n\n // Find the parent grid element for context\n const gridElement = element.closest('tbw-grid') as HTMLElement | null;\n\n return (container: HTMLElement) => {\n // Create the context for the template\n const context: GridToolPanelContext = {\n $implicit: gridElement ?? container,\n grid: gridElement ?? container,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Append all root nodes to the container\n viewRef.rootNodes.forEach((node) => container.appendChild(node));\n\n // Return cleanup function\n return () => {\n const index = this.viewRefs.indexOf(viewRef);\n if (index > -1) {\n this.viewRefs.splice(index, 1);\n }\n viewRef.destroy();\n };\n };\n }\n\n /**\n * Gets type-level defaults from the application's GridTypeRegistry.\n *\n * This enables application-wide type defaults configured via `provideGridTypeDefaults()`.\n * The returned TypeDefault contains renderer/editor functions that instantiate\n * Angular components dynamically.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent\n * }\n * })\n * ]\n * };\n *\n * // Any grid with type: 'country' columns will use these components\n * gridConfig = {\n * columns: [{ field: 'country', type: 'country' }]\n * };\n * ```\n */\n getTypeDefault<TRow = unknown>(type: string, _gridEl?: HTMLElement): BaseTypeDefault<TRow> | undefined {\n if (!this.typeRegistry) {\n return undefined;\n }\n\n const config = this.typeRegistry.get(type);\n if (!config) {\n return undefined;\n }\n\n const typeDefault: BaseTypeDefault<TRow> = {\n editorParams: config.editorParams,\n };\n\n // Create renderer function that instantiates the Angular component\n if (config.renderer) {\n typeDefault.renderer = this.createComponentRenderer<TRow, unknown>(config.renderer);\n }\n\n // Create editor function that instantiates the Angular component\n if (config.editor) {\n // Type assertion needed: adapter bridges TRow to core's unknown\n typeDefault.editor = this.createComponentEditor<TRow, unknown>(config.editor) as BaseTypeDefault['editor'];\n }\n\n // Create filterPanelRenderer function that instantiates the Angular component\n if (config.filterPanelRenderer && isComponentClass(config.filterPanelRenderer)) {\n typeDefault.filterPanelRenderer = this.createComponentFilterPanelRenderer(config.filterPanelRenderer);\n } else if (config.filterPanelRenderer) {\n typeDefault.filterPanelRenderer = config.filterPanelRenderer as BaseTypeDefault['filterPanelRenderer'];\n }\n\n return typeDefault;\n }\n\n /**\n * Creates and mounts an Angular component dynamically.\n * Shared logic between renderer and editor component creation.\n * @internal\n */\n private mountComponent<TRow, TValue>(\n componentClass: Type<unknown>,\n inputs: { value: TValue; row: TRow; column: ColumnConfig<TRow> },\n isEditor = false,\n ): { hostElement: HTMLSpanElement; componentRef: ComponentRef<unknown> } {\n // Create a host element for the component\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n // Create the component dynamically\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n // Set inputs - components should have value, row, column inputs\n this.setComponentInputs(componentRef, inputs);\n\n // Attach to app for change detection\n this.appRef.attachView(componentRef.hostView);\n // Track in editor-specific array for per-cell cleanup, or general array for renderers\n if (isEditor) {\n this.editorComponentRefs.push(componentRef);\n } else {\n this.componentRefs.push(componentRef);\n }\n\n // Trigger change detection\n componentRef.changeDetectorRef.detectChanges();\n\n return { hostElement, componentRef };\n }\n\n /**\n * Creates a renderer function from an Angular component class.\n * @internal\n */\n private createComponentRenderer<TRow = unknown, TValue = unknown>(\n componentClass: Type<unknown>,\n ): ColumnViewRenderer<TRow, TValue> {\n // Cell cache for component-based renderers - maps cell element to its component ref\n const cellCache = new WeakMap<HTMLElement, { componentRef: ComponentRef<unknown>; hostElement: HTMLSpanElement }>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = ctx.cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Reuse existing component - just update inputs\n this.setComponentInputs(cached.componentRef, {\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n });\n cached.componentRef.changeDetectorRef.detectChanges();\n return cached.hostElement;\n }\n }\n\n const { hostElement, componentRef } = this.mountComponent<TRow, TValue>(componentClass, {\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n });\n\n // Cache for reuse on scroll recycles\n if (cellEl) {\n cellCache.set(cellEl, { componentRef, hostElement });\n }\n\n return hostElement;\n };\n }\n\n /**\n * Creates an editor function from an Angular component class.\n * @internal\n */\n private createComponentEditor<TRow = unknown, TValue = unknown>(\n componentClass: Type<unknown>,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n const { hostElement, componentRef } = this.mountComponent<TRow, TValue>(\n componentClass,\n {\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n },\n true, // isEditor — tracked separately for per-cell cleanup\n );\n\n wireEditorCallbacks<TValue>(\n hostElement,\n componentRef.instance as Record<string, unknown>,\n (value) => ctx.commit(value),\n () => ctx.cancel(),\n );\n this.attachBeforeEditCloseFlush(hostElement);\n\n // Auto-update editor when value changes externally (e.g., via updateRow cascade\n // or Escape-revert). Update the component input and run detectChanges() —\n // the component's own template handles rendering regardless of editor type.\n ctx.onValueChange?.((newVal: unknown) => {\n try {\n // Notify the editor so it can clear stale internal state (e.g., searchText\n // in autocomplete editors) before the value input updates.\n const instance = componentRef.instance;\n if (typeof (instance as Record<string, unknown>)['onExternalValueChange'] === 'function') {\n (instance as { onExternalValueChange: (v: unknown) => void }).onExternalValueChange(newVal);\n }\n componentRef.setInput('value', newVal);\n componentRef.changeDetectorRef.detectChanges();\n } catch {\n // Component is destroyed — nothing to update.\n }\n });\n\n return hostElement;\n };\n }\n\n /**\n * Creates a header renderer function from an Angular component class.\n * Mounts the component with full header context (column, value, sortState, etc.).\n * @internal\n */\n private createComponentHeaderRenderer<TRow = unknown>(\n componentClass: Type<unknown>,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n return (ctx: HeaderCellContext<TRow>) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n column: ctx.column,\n value: ctx.value,\n sortState: ctx.sortState,\n filterActive: ctx.filterActive,\n renderSortIcon: ctx.renderSortIcon,\n renderFilterButton: ctx.renderFilterButton,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Creates a header label renderer function from an Angular component class.\n * Mounts the component with label context (column, value).\n * @internal\n */\n private createComponentHeaderLabelRenderer<TRow = unknown>(\n componentClass: Type<unknown>,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n return (ctx: HeaderLabelContext<TRow>) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n column: ctx.column,\n value: ctx.value,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Creates a group header renderer function from an Angular component class.\n *\n * The component should accept group header inputs (id, label, columns, firstIndex, isImplicit).\n * Returns the host element directly (groupHeaderRenderer returns an element, not void).\n * @internal\n */\n private createComponentGroupHeaderRenderer(\n componentClass: Type<unknown>,\n ): (params: GroupHeaderRenderParams) => HTMLElement {\n return (params: GroupHeaderRenderParams) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n id: params.id,\n label: params.label,\n columns: params.columns,\n firstIndex: params.firstIndex,\n isImplicit: params.isImplicit,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Processes a GroupingColumnsConfig, converting component class references\n * to actual renderer functions.\n *\n * @param config - Angular grouping columns configuration with possible component class references\n * @returns Processed GroupingColumnsConfig with actual renderer functions\n */\n processGroupingColumnsConfig(config: GroupingColumnsConfig): GroupingColumnsConfig {\n const processed = { ...config };\n let changed = false;\n\n // Bridge top-level groupHeaderRenderer component class\n if (config.groupHeaderRenderer && isComponentClass(config.groupHeaderRenderer)) {\n processed.groupHeaderRenderer = this.createComponentGroupHeaderRenderer(config.groupHeaderRenderer);\n changed = true;\n }\n\n // Bridge per-group renderer component classes inside columnGroups\n if (Array.isArray(config.columnGroups)) {\n const mappedGroups = config.columnGroups.map((def) => {\n if (def.renderer && isComponentClass(def.renderer)) {\n changed = true;\n return { ...def, renderer: this.createComponentGroupHeaderRenderer(def.renderer) };\n }\n return def;\n });\n if (changed) processed.columnGroups = mappedGroups;\n }\n\n return changed ? processed : config;\n }\n\n /**\n * Processes a GroupingRowsConfig, converting component class references\n * to actual renderer functions.\n *\n * @param config - Angular grouping rows configuration with possible component class references\n * @returns Processed GroupingRowsConfig with actual renderer functions\n */\n processGroupingRowsConfig(config: GroupingRowsConfig): GroupingRowsConfig {\n if (config.groupRowRenderer && isComponentClass(config.groupRowRenderer)) {\n return {\n ...config,\n groupRowRenderer: this.createComponentGroupRowRenderer(config.groupRowRenderer),\n };\n }\n return config;\n }\n\n /**\n * Processes a PinnedRowsConfig, converting component class references\n * in `customPanels[].render` to actual renderer functions.\n *\n * @param config - Angular pinned rows configuration with possible component class references\n * @returns Processed PinnedRowsConfig with actual renderer functions\n */\n processPinnedRowsConfig(config: PinnedRowsConfig): PinnedRowsConfig {\n if (!Array.isArray(config.customPanels)) return config;\n\n const hasComponentRender = config.customPanels.some((panel) => isComponentClass(panel.render));\n if (!hasComponentRender) return config;\n\n return {\n ...config,\n customPanels: config.customPanels.map((panel) => {\n if (!isComponentClass(panel.render)) return panel;\n return {\n ...panel,\n render: this.createComponentPinnedRowsPanelRenderer(panel.render),\n };\n }),\n };\n }\n\n /**\n * Creates a pinned rows panel renderer function from an Angular component class.\n *\n * The component should accept inputs from PinnedRowsContext (totalRows, filteredRows,\n * selectedRows, columns, rows, grid).\n * @internal\n */\n private createComponentPinnedRowsPanelRenderer(\n componentClass: Type<unknown>,\n ): (ctx: PinnedRowsContext) => HTMLElement {\n return (ctx: PinnedRowsContext) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n totalRows: ctx.totalRows,\n filteredRows: ctx.filteredRows,\n selectedRows: ctx.selectedRows,\n columns: ctx.columns,\n rows: ctx.rows,\n grid: ctx.grid,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Creates a loading renderer function from an Angular component class.\n *\n * The component should accept a `size` input ('large' | 'small').\n * @internal\n */\n private createComponentLoadingRenderer(componentClass: Type<unknown>): (ctx: LoadingContext) => HTMLElement {\n return (ctx: LoadingContext) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n size: ctx.size,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Creates a group row renderer function from an Angular component class.\n *\n * The component should accept group row inputs (key, value, depth, rows, expanded, toggleExpand).\n * Returns the host element directly (groupRowRenderer returns an element, not void).\n * @internal\n */\n private createComponentGroupRowRenderer(\n componentClass: Type<unknown>,\n ): (params: GroupRowRenderParams) => HTMLElement {\n return (params: GroupRowRenderParams) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n this.setComponentInputs(componentRef, {\n key: params.key,\n value: params.value,\n depth: params.depth,\n rows: params.rows,\n expanded: params.expanded,\n toggleExpand: params.toggleExpand,\n });\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n return hostElement;\n };\n }\n\n /**\n * Creates a filter panel renderer function from an Angular component class.\n *\n * The component must implement `FilterPanel` (i.e., have a `params` input).\n * The component is mounted into the filter panel container element.\n * @internal\n */\n private createComponentFilterPanelRenderer(\n componentClass: Type<unknown>,\n ): (container: HTMLElement, params: FilterPanelParams) => void {\n return (container: HTMLElement, params: FilterPanelParams) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n\n // Set params input\n try {\n componentRef.setInput('params', params);\n } catch {\n // Input doesn't exist on component — ignore\n }\n\n this.appRef.attachView(componentRef.hostView);\n this.componentRefs.push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n\n container.appendChild(hostElement);\n };\n }\n\n /**\n * Sets component inputs using Angular's setInput API.\n * @internal\n */\n private setComponentInputs(componentRef: ComponentRef<unknown>, inputs: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(inputs)) {\n try {\n componentRef.setInput(key, value);\n } catch {\n // Input doesn't exist on component - that's okay, some inputs are optional\n }\n }\n }\n\n /**\n * Called when a cell's content is about to be wiped (e.g., exiting edit mode,\n * scroll-recycling a row, or rebuilding a row).\n *\n * Destroys any editor embedded views or component refs whose DOM is\n * inside the given cell element. This prevents memory leaks from\n * orphaned Angular views that would otherwise stay in the change\n * detection tree indefinitely.\n */\n releaseCell(cellEl: HTMLElement): void {\n // Release editor embedded views whose root nodes are inside this cell\n for (let i = this.editorViewRefs.length - 1; i >= 0; i--) {\n const ref = this.editorViewRefs[i];\n if (ref.rootNodes.some((n: Node) => cellEl.contains(n))) {\n ref.destroy();\n this.editorViewRefs.splice(i, 1);\n }\n }\n // Release editor component refs whose host element is inside this cell\n for (let i = this.editorComponentRefs.length - 1; i >= 0; i--) {\n const ref = this.editorComponentRefs[i];\n if (cellEl.contains(ref.location.nativeElement)) {\n ref.destroy();\n this.editorComponentRefs.splice(i, 1);\n }\n }\n // Detach `before-edit-close` listeners for editor hosts inside this cell\n for (const [hostEl, unsub] of this.editorBeforeCloseUnsubs) {\n if (cellEl.contains(hostEl)) {\n unsub();\n this.editorBeforeCloseUnsubs.delete(hostEl);\n }\n }\n }\n\n /**\n * Unmount a specific container (e.g., detail panel, tool panel).\n * Finds the matching view or component ref whose DOM nodes are inside\n * the container and properly destroys it to prevent memory leaks.\n */\n unmount(container: HTMLElement): void {\n for (let i = this.viewRefs.length - 1; i >= 0; i--) {\n const ref = this.viewRefs[i];\n if (ref.rootNodes.some((n: Node) => container.contains(n))) {\n ref.destroy();\n this.viewRefs.splice(i, 1);\n return;\n }\n }\n for (let i = this.componentRefs.length - 1; i >= 0; i--) {\n const ref = this.componentRefs[i];\n if (container.contains(ref.location.nativeElement)) {\n ref.destroy();\n this.componentRefs.splice(i, 1);\n return;\n }\n }\n }\n\n /**\n * Clean up all view references and component references.\n * Call this when your app/component is destroyed.\n */\n destroy(): void {\n this.viewRefs.forEach((ref) => ref.destroy());\n this.viewRefs = [];\n this.editorViewRefs.forEach((ref) => ref.destroy());\n this.editorViewRefs = [];\n this.componentRefs.forEach((ref) => ref.destroy());\n this.componentRefs = [];\n this.editorComponentRefs.forEach((ref) => ref.destroy());\n this.editorComponentRefs = [];\n this.editorBeforeCloseUnsubs.forEach((unsub) => unsub());\n this.editorBeforeCloseUnsubs.clear();\n }\n\n /**\n * Attaches a `before-edit-close` listener on the host grid that flushes\n * the focused input inside `host` via native `.blur()` so editors that\n * commit on `(blur)` flush pending input before the cell DOM is torn\n * down by Tab / programmatic row exit.\n *\n * The grid is resolved lazily via `queueMicrotask` because the host is\n * appended to the cell *after* the editor wrapper returns. Mirror of\n * Vue's `attachBeforeEditCloseFlush` and React's `wrapReactEditor`\n * queueMicrotask bridge.\n * @internal\n */\n private attachBeforeEditCloseFlush(host: HTMLElement): void {\n queueMicrotask(() => {\n const gridEl = host.closest('tbw-grid') as HTMLElement | null;\n if (!gridEl) return;\n const flush = () => {\n const focused = host.ownerDocument.activeElement as HTMLElement | null;\n if (\n focused &&\n host.contains(focused) &&\n (focused instanceof HTMLInputElement ||\n focused instanceof HTMLTextAreaElement ||\n focused instanceof HTMLSelectElement)\n ) {\n focused.blur();\n }\n };\n gridEl.addEventListener('before-edit-close', flush);\n this.editorBeforeCloseUnsubs.set(host, () => {\n gridEl.removeEventListener('before-edit-close', flush);\n });\n });\n }\n}\n","/**\n * Icon configuration registry for Angular applications.\n *\n * Provides application-wide icon overrides for all grids via\n * Angular's dependency injection.\n */\nimport { EnvironmentProviders, inject, Injectable, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport type { GridIcons } from '@toolbox-web/grid';\n\n/**\n * Injection token for providing icon overrides at app level.\n */\nexport const GRID_ICONS = new InjectionToken<Partial<GridIcons>>('GRID_ICONS');\n\n/**\n * Injectable service for managing grid icons.\n *\n * Use `provideGridIcons()` in your app config to set up icons,\n * or inject this service for dynamic registration.\n *\n * @example\n * ```typescript\n * // App-level setup (app.config.ts)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridIcons({\n * expand: '➕',\n * collapse: '➖',\n * sortAsc: '↑',\n * sortDesc: '↓',\n * })\n * ]\n * };\n *\n * // Dynamic registration\n * @Component({ ... })\n * export class AppComponent {\n * private registry = inject(GridIconRegistry);\n *\n * ngOnInit() {\n * this.registry.set('filter', '<svg>...</svg>');\n * }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class GridIconRegistry {\n private readonly icons = new Map<keyof GridIcons, GridIcons[keyof GridIcons]>();\n\n constructor() {\n // Merge any initial icons from provider\n const initial = inject(GRID_ICONS, { optional: true });\n if (initial) {\n for (const [key, value] of Object.entries(initial)) {\n this.icons.set(key as keyof GridIcons, value);\n }\n }\n }\n\n /**\n * Set an icon override.\n *\n * @param name - The icon name (e.g., 'expand', 'collapse', 'filter')\n * @param value - The icon value (string text or SVG markup)\n */\n set<K extends keyof GridIcons>(name: K, value: GridIcons[K]): void {\n this.icons.set(name, value);\n }\n\n /**\n * Get an icon value.\n */\n get<K extends keyof GridIcons>(name: K): GridIcons[K] | undefined {\n return this.icons.get(name) as GridIcons[K] | undefined;\n }\n\n /**\n * Remove an icon override.\n */\n remove(name: keyof GridIcons): void {\n this.icons.delete(name);\n }\n\n /**\n * Check if an icon has an override.\n */\n has(name: keyof GridIcons): boolean {\n return this.icons.has(name);\n }\n\n /**\n * Get all icon overrides as a GridIcons partial.\n * Used internally by the adapter.\n *\n * @internal\n */\n getAll(): Partial<GridIcons> {\n const result: Partial<GridIcons> = {};\n for (const [key, value] of this.icons) {\n (result as Record<keyof GridIcons, GridIcons[keyof GridIcons]>)[key] = value;\n }\n return result;\n }\n\n /**\n * Get all registered icon names.\n */\n getRegisteredIcons(): (keyof GridIcons)[] {\n return Array.from(this.icons.keys());\n }\n}\n\n/**\n * Provides application-level icon overrides for all grids.\n *\n * Available icons to override:\n * - `expand` - Expand icon for collapsed items (trees, groups, details)\n * - `collapse` - Collapse icon for expanded items\n * - `sortAsc` - Sort ascending indicator\n * - `sortDesc` - Sort descending indicator\n * - `sortNone` - Sort neutral/unsorted indicator\n * - `submenuArrow` - Submenu arrow for context menus\n * - `dragHandle` - Drag handle icon for reordering\n * - `toolPanel` - Tool panel toggle icon in toolbar\n * - `filter` - Filter icon in column headers\n * - `filterActive` - Filter icon when filter is active\n * - `print` - Print icon for print button\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideGridIcons } from '@toolbox-web/grid-angular';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridIcons({\n * expand: '➕',\n * collapse: '➖',\n * sortAsc: '↑',\n * sortDesc: '↓',\n * filter: '<svg viewBox=\"0 0 16 16\">...</svg>',\n * })\n * ]\n * };\n * ```\n */\nexport function provideGridIcons(icons: Partial<GridIcons>): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: GRID_ICONS, useValue: icons }]);\n}\n","import { afterNextRender, computed, DestroyRef, ElementRef, inject, type Signal, signal } from '@angular/core';\nimport type { ColumnConfig, DataGridElement, GridConfig } from '@toolbox-web/grid';\n\n/**\n * Return type for injectGrid function.\n */\nexport interface InjectGridReturn<TRow = unknown> {\n /** Direct access to the typed grid element */\n element: Signal<DataGridElement<TRow> | null>;\n /** Whether the grid is ready */\n isReady: Signal<boolean>;\n /** Current grid configuration */\n config: Signal<GridConfig<TRow> | null>;\n /** Get the effective configuration */\n getConfig: () => Promise<GridConfig<TRow> | null>;\n /** Force a layout recalculation */\n forceLayout: () => Promise<void>;\n /** Toggle a group row */\n toggleGroup: (key: string) => Promise<void>;\n /** Register custom styles */\n registerStyles: (id: string, css: string) => void;\n /** Unregister custom styles */\n unregisterStyles: (id: string) => void;\n /** Get current visible columns */\n visibleColumns: Signal<ColumnConfig<TRow>[]>;\n}\n\n/**\n * Angular inject function for programmatic access to a grid instance.\n *\n * This function should be called in the constructor or as a field initializer\n * of an Angular component that contains a `<tbw-grid>` element.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, injectGrid } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-my-grid',\n * imports: [Grid],\n * template: `\n * <button (click)=\"handleResize()\">Force Layout</button>\n * <button (click)=\"handleExport()\" [disabled]=\"!grid.isReady()\">Export</button>\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\"></tbw-grid>\n * `\n * })\n * export class MyGridComponent {\n * grid = injectGrid<Employee>();\n *\n * async handleResize() {\n * await this.grid.forceLayout();\n * }\n *\n * async handleExport() {\n * const config = await this.grid.getConfig();\n * console.log('Exporting with columns:', config?.columns);\n * }\n * }\n * ```\n *\n * @param selector - Optional CSS selector to target a specific grid element.\n * Defaults to `'tbw-grid'` (first grid in the component). Use when the\n * component contains multiple grids, e.g. `'tbw-grid.primary'` or `'#my-grid'`.\n * @returns Object with grid access methods and state signals\n */\nexport function injectGrid<TRow = unknown>(selector = 'tbw-grid'): InjectGridReturn<TRow> {\n const elementRef = inject(ElementRef);\n const destroyRef = inject(DestroyRef);\n\n // Reactive signals\n const isReady = signal(false);\n const config = signal<GridConfig<TRow> | null>(null);\n const element = signal<DataGridElement<TRow> | null>(null);\n\n // Track destruction so async work doesn't touch signals after teardown\n let destroyed = false;\n destroyRef.onDestroy(() => {\n destroyed = true;\n });\n\n // Initialize after render\n afterNextRender(() => {\n const gridElement = elementRef.nativeElement.querySelector(selector) as DataGridElement<TRow>;\n if (!gridElement) {\n console.warn('[injectGrid] No tbw-grid element found in component');\n return;\n }\n\n element.set(gridElement);\n\n // Wait for grid to be ready. Use Promise.resolve to guard against\n // gridElement.ready being undefined (would otherwise throw on .then).\n Promise.resolve(gridElement.ready?.())\n .then(async () => {\n if (destroyed) return;\n isReady.set(true);\n const effectiveConfig = await gridElement.getConfig?.();\n if (destroyed) return;\n if (effectiveConfig) {\n config.set(effectiveConfig as GridConfig<TRow>);\n }\n })\n .catch((err) => {\n console.error('[injectGrid] Error waiting for grid to be ready:', err);\n });\n });\n\n // Computed visible columns\n const visibleColumns = computed<ColumnConfig<TRow>[]>(() => {\n const currentConfig = config();\n if (!currentConfig?.columns) return [];\n return currentConfig.columns.filter((col) => !col.hidden);\n });\n\n // ═══════════════════════════════════════════════════════════════════\n // CORE METHODS\n // ═══════════════════════════════════════════════════════════════════\n\n const getConfig = async (): Promise<GridConfig<TRow> | null> => {\n const gridElement = element();\n if (!gridElement) return null;\n const effectiveConfig = gridElement.getConfig?.();\n return (effectiveConfig as GridConfig<TRow>) ?? null;\n };\n\n const forceLayout = async (): Promise<void> => {\n const gridElement = element();\n if (!gridElement) return;\n await gridElement.forceLayout?.();\n };\n\n const toggleGroup = async (key: string): Promise<void> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const gridElement = element() as any;\n if (!gridElement) return;\n await gridElement.toggleGroup?.(key);\n };\n\n const registerStyles = (id: string, css: string): void => {\n element()?.registerStyles?.(id, css);\n };\n\n const unregisterStyles = (id: string): void => {\n element()?.unregisterStyles?.(id);\n };\n\n return {\n element,\n isReady,\n config,\n visibleColumns,\n getConfig,\n forceLayout,\n toggleGroup,\n registerStyles,\n unregisterStyles,\n };\n}\n","/**\n * Feature Registry for @toolbox-web/grid-angular\n *\n * Delegates to the core registry at `@toolbox-web/grid/features/registry`.\n * This module re-exports core functions so existing feature modules continue\n * to work without changing their import paths.\n *\n * @example\n * ```typescript\n * // Import features you need (side-effect imports)\n * import '@toolbox-web/grid-angular/features/selection';\n * import '@toolbox-web/grid-angular/features/filtering';\n *\n * // Inputs work automatically - no async loading, no HTTP requests\n * <tbw-grid [selection]=\"'range'\" [filtering]=\"{ debounceMs: 200 }\" />\n * ```\n */\n\n// Re-export core registry — all adapters share the same registry Map\nexport {\n clearFeatureRegistry,\n createPluginFromFeature,\n getFeatureFactory,\n getRegisteredFeatures,\n isFeatureRegistered,\n registerFeature,\n} from '@toolbox-web/grid/features/registry';\n\nexport type { PluginFactory } from '@toolbox-web/grid/features/registry';\n\n/**\n * Feature names supported by the Grid directive.\n */\nexport type FeatureName =\n | 'selection'\n | 'editing'\n | 'clipboard'\n | 'contextMenu'\n | 'multiSort'\n | 'filtering'\n | 'reorderColumns'\n | 'visibility'\n | 'pinnedColumns'\n | 'groupingColumns'\n | 'columnVirtualization'\n | 'reorderRows'\n | 'rowDragDrop'\n | 'groupingRows'\n | 'pinnedRows'\n | 'tree'\n | 'masterDetail'\n | 'responsive'\n | 'undoRedo'\n | 'export'\n | 'print'\n | 'pivot'\n | 'serverSide'\n | 'tooltip';\n","import { Directive, input } from '@angular/core';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport type { FilterPanel } from './angular-column-config';\n\n/**\n * Base class for Angular filter panel components.\n *\n * Provides a ready-made `params` input and common lifecycle helpers\n * (`applyAndClose`, `clearAndClose`) so consumers only need to implement\n * their filter logic in `applyFilter()`.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, viewChild, ElementRef } from '@angular/core';\n * import { BaseFilterPanel } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-text-filter',\n * template: `\n * <input #input (keydown.enter)=\"applyAndClose()\" />\n * <button (click)=\"applyAndClose()\">Apply</button>\n * <button (click)=\"clearAndClose()\">Clear</button>\n * `\n * })\n * export class TextFilterComponent extends BaseFilterPanel {\n * input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n *\n * applyFilter(): void {\n * this.params().applyTextFilter('contains', this.input().nativeElement.value);\n * }\n * }\n * ```\n *\n * ## Template Syntax\n *\n * The grid's filtering plugin will mount this component and provide `params`\n * automatically. No manual wiring is required:\n *\n * ```typescript\n * gridConfig = {\n * columns: [\n * { field: 'name', filterable: true, filterPanel: TextFilterComponent },\n * ],\n * };\n * ```\n *\n * @typeParam TRow - The row data type (available via `params().column`)\n */\n@Directive()\nexport abstract class BaseFilterPanel implements FilterPanel {\n /**\n * Filter panel parameters injected by the grid's filtering plugin.\n *\n * Provides access to:\n * - `field` — the column field name\n * - `column` — full column configuration\n * - `uniqueValues` — distinct values in the column\n * - `excludedValues` — currently excluded values (set filter)\n * - `searchText` — current search text\n * - `applySetFilter(excluded)` — apply a set-based (include/exclude) filter\n * - `applyTextFilter(operator, value, valueTo?)` — apply a text/number filter\n * - `clearFilter()` — clear the filter for this column\n * - `closePanel()` — close the filter panel\n */\n readonly params = input.required<FilterPanelParams>();\n\n /**\n * Implement this to apply your filter logic.\n *\n * Called by {@link applyAndClose} before closing the panel.\n * Use `this.params()` to access the filter API.\n *\n * @example\n * ```typescript\n * applyFilter(): void {\n * this.params().applyTextFilter('contains', this.searchText);\n * }\n * ```\n */\n abstract applyFilter(): void;\n\n /**\n * Apply the filter then close the panel.\n *\n * Calls {@link applyFilter} followed by `params().closePanel()`.\n * Bind this to your \"Apply\" button or Enter key handler.\n */\n applyAndClose(): void {\n this.applyFilter();\n this.params().closePanel();\n }\n\n /**\n * Clear the filter then close the panel.\n *\n * Calls `params().clearFilter()` followed by `params().closePanel()`.\n * Bind this to your \"Clear\" / \"Reset\" button.\n */\n clearAndClose(): void {\n this.params().clearFilter();\n this.params().closePanel();\n }\n}\n","import { afterNextRender, computed, DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport type { ColumnConfig } from '@toolbox-web/grid';\n\n/**\n * Base class for grid cell editors.\n *\n * Provides common functionality for Angular cell editors:\n * - Automatic value resolution from FormControl or value input\n * - Common inputs (value, row, column, control)\n * - Common outputs (commit, cancel)\n * - Validation state helpers\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { BaseGridEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-my-editor',\n * template: \\`\n * <input\n * [value]=\"currentValue()\"\n * [class.is-invalid]=\"isInvalid()\"\n * (input)=\"commitValue($event.target.value)\"\n * (keydown.escape)=\"cancelEdit()\"\n * />\n * @if (hasErrors()) {\n * <div class=\"error\">{{ firstErrorMessage() }}</div>\n * }\n * \\`\n * })\n * export class MyEditorComponent extends BaseGridEditor<MyRow, string> {\n * // Override to customize error messages\n * protected override getErrorMessage(errorKey: string): string {\n * if (errorKey === 'required') return 'This field is required';\n * if (errorKey === 'minlength') return 'Too short';\n * return super.getErrorMessage(errorKey);\n * }\n * }\n * ```\n *\n * ## Template Syntax\n *\n * When using the base class, you only need to pass the control:\n *\n * ```html\n * <tbw-grid-column field=\"name\">\n * <app-my-editor *tbwEditor=\"let _; control as control\" [control]=\"control\" />\n * </tbw-grid-column>\n * ```\n *\n * Or without FormArray binding (fallback to value):\n *\n * ```html\n * <tbw-grid-column field=\"name\">\n * <app-my-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell value type\n */\n@Directive()\nexport abstract class BaseGridEditor<TRow = unknown, TValue = unknown> {\n protected readonly elementRef = inject(ElementRef);\n private readonly _destroyRef = inject(DestroyRef);\n\n /** Cleanup function for the edit-close listener */\n private _editCloseCleanup: (() => void) | null = null;\n\n // ============================================================================\n // Inputs\n // ============================================================================\n\n /**\n * The cell value. Used when FormControl is not available.\n * When a FormControl is provided, value is derived from control.value instead.\n */\n readonly value = input<TValue>();\n\n /**\n * The full row data object.\n */\n readonly row = input<TRow>();\n\n /**\n * The column configuration.\n */\n readonly column = input<ColumnConfig<TRow>>();\n\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray.\n * When provided, the editor uses control.value instead of the value input.\n */\n readonly control = input<AbstractControl>();\n\n // ============================================================================\n // Outputs\n // ============================================================================\n\n /**\n * Emits when the user commits a new value.\n * Emits `null` when a nullable field is cleared.\n */\n readonly commit = output<TValue | null>();\n\n /**\n * Emits when the user cancels editing.\n */\n readonly cancel = output<void>();\n\n // ============================================================================\n // Computed State\n // ============================================================================\n\n /**\n * The current value, derived from FormControl if available, otherwise from value input.\n * This is the recommended way to get the current value in your editor template.\n */\n readonly currentValue = computed<TValue | undefined>(() => {\n const ctrl = this.control();\n if (ctrl) {\n return ctrl.value as TValue;\n }\n return this.value();\n });\n\n /**\n * Whether the control is invalid (has validation errors).\n * Returns false if no FormControl is available.\n */\n readonly isInvalid = computed(() => {\n return this.control()?.invalid ?? false;\n });\n\n /**\n * Whether the control is dirty (has been modified).\n * Returns false if no FormControl is available.\n */\n readonly isDirty = computed(() => {\n return this.control()?.dirty ?? false;\n });\n\n /**\n * Whether the control has been touched.\n * Returns false if no FormControl is available.\n */\n readonly isTouched = computed(() => {\n return this.control()?.touched ?? false;\n });\n\n /**\n * Whether the control has any validation errors.\n */\n readonly hasErrors = computed(() => {\n const ctrl = this.control();\n return ctrl?.errors != null && Object.keys(ctrl.errors).length > 0;\n });\n\n /**\n * The first error message from the control's validation errors.\n * Returns an empty string if no errors.\n */\n readonly firstErrorMessage = computed(() => {\n const ctrl = this.control();\n if (!ctrl?.errors) return '';\n\n const firstKey = Object.keys(ctrl.errors)[0];\n return this.getErrorMessage(firstKey, ctrl.errors[firstKey]);\n });\n\n /**\n * All error messages from the control's validation errors.\n */\n readonly allErrorMessages = computed(() => {\n const ctrl = this.control();\n if (!ctrl?.errors) return [];\n\n return Object.entries(ctrl.errors).map(([key, value]) => this.getErrorMessage(key, value));\n });\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n constructor() {\n afterNextRender(() => this._initEditCloseListener());\n this._destroyRef.onDestroy(() => {\n this._editCloseCleanup?.();\n this._editCloseCleanup = null;\n });\n }\n\n private _initEditCloseListener(): void {\n const grid = this.elementRef.nativeElement.closest('tbw-grid') as\n | import('@toolbox-web/grid').DataGridElement\n | null;\n if (!grid) return;\n\n let unsubBefore: (() => void) | undefined;\n let unsubClose: (() => void) | undefined;\n\n unsubBefore = grid.on('before-edit-close', () => {\n this.onBeforeEditClose();\n unsubBefore?.();\n unsubBefore = undefined;\n });\n\n unsubClose = grid.on('edit-close', () => {\n this.onEditClose();\n unsubClose?.();\n unsubClose = undefined;\n });\n\n this._editCloseCleanup = () => {\n unsubBefore?.();\n unsubClose?.();\n };\n }\n\n // ============================================================================\n // Methods\n // ============================================================================\n\n /**\n * Whether this editor's cell is the currently focused cell.\n *\n * In row editing mode the grid creates editors for every editable cell\n * in the row simultaneously. Use this to conditionally auto-focus inputs\n * or open panels only in the active cell.\n *\n * Performs a synchronous DOM check — safe to call from `ngAfterViewInit`.\n */\n protected isCellFocused(): boolean {\n return this.elementRef.nativeElement.closest('[part=\"cell\"]')?.classList.contains('cell-focus') ?? false;\n }\n\n /**\n * Called **before** the grid clears editing state and destroys editor DOM.\n *\n * At this point the commit callback is still active, so subclasses can\n * call {@link commitValue} to flush any pending/deferred values.\n *\n * This fires only on the **commit** path (not on revert/cancel).\n * Use {@link onEditClose} for cleanup that should happen on both paths.\n */\n protected onBeforeEditClose(): void {\n // Default: no-op. Subclasses override to flush pending values.\n }\n\n /**\n * Called when the grid ends the editing session for this cell.\n *\n * Override to perform cleanup such as closing overlay panels, autocomplete\n * dropdowns, or other floating UI that lives at `<body>` level and would\n * otherwise persist after the editor DOM is removed.\n *\n * The listener is set up automatically via `afterNextRender` — no manual\n * wiring required.\n */\n protected onEditClose(): void {\n // Default: no-op. Subclasses override.\n }\n\n /**\n * Called by the grid adapter when the cell value changes externally\n * (e.g., via `updateRow()` cascade or undo/redo).\n *\n * Override in subclasses to reset internal state (search text, selection\n * flags, etc.) so the editor displays the updated value.\n *\n * This runs **synchronously** before the value input is updated, giving\n * the editor a chance to clear stale state before the next change-detection\n * pass re-reads the template.\n *\n * @param _newVal The new cell value being pushed from the grid\n */\n onExternalValueChange(_newVal: TValue): void {\n // Default: no-op. Subclasses override as needed.\n }\n\n /**\n * Commit a new value. Emits the commit output AND dispatches a DOM event.\n * The DOM event enables the grid's auto-wiring to catch the commit.\n * Call this when the user confirms their edit.\n */\n commitValue(newValue: TValue | null): void {\n // Emit Angular output for template bindings\n this.commit.emit(newValue);\n\n // Dispatch DOM CustomEvent for grid's auto-wiring\n // This allows the adapter to catch commits without explicit (commit)=\"...\" bindings\n this.elementRef.nativeElement.dispatchEvent(new CustomEvent('commit', { detail: newValue, bubbles: true }));\n }\n\n /**\n * Cancel editing. Emits the cancel output AND dispatches a DOM event.\n * Call this when the user cancels (e.g., presses Escape).\n */\n cancelEdit(): void {\n // Emit Angular output for template bindings\n this.cancel.emit();\n\n // Dispatch DOM CustomEvent for grid's auto-wiring\n this.elementRef.nativeElement.dispatchEvent(new CustomEvent('cancel', { bubbles: true }));\n }\n\n /**\n * Get a human-readable error message for a validation error.\n * Override this method to customize error messages for your editor.\n *\n * @param errorKey - The validation error key (e.g., 'required', 'minlength')\n * @param errorValue - The error value (e.g., { requiredLength: 5, actualLength: 3 })\n * @returns A human-readable error message\n */\n protected getErrorMessage(errorKey: string, errorValue?: unknown): string {\n switch (errorKey) {\n case 'required':\n return 'This field is required';\n case 'minlength': {\n const err = errorValue as { requiredLength?: number };\n return `Minimum length is ${err?.requiredLength ?? 'unknown'}`;\n }\n case 'maxlength': {\n const err = errorValue as { requiredLength?: number };\n return `Maximum length is ${err?.requiredLength ?? 'unknown'}`;\n }\n case 'min': {\n const err = errorValue as { min?: number };\n return `Minimum value is ${err?.min ?? 'unknown'}`;\n }\n case 'max': {\n const err = errorValue as { max?: number };\n return `Maximum value is ${err?.max ?? 'unknown'}`;\n }\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n return `Invalid value (${errorKey})`;\n }\n }\n}\n","import { computed, Directive, signal } from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport { BaseGridEditor } from './base-grid-editor';\n\n/**\n * Base class for grid editors that also work as Angular form controls.\n *\n * Combines `BaseGridEditor` with `ControlValueAccessor` so the same component\n * can be used inside a `<tbw-grid>` **and** in a standalone `<form>`.\n *\n * ## What it provides\n *\n * | Member | Purpose |\n * |--------|---------|\n * | `cvaValue` | Signal holding the value written by the form control |\n * | `disabledState` | Signal tracking `setDisabledState` calls |\n * | `displayValue` | Computed that prefers grid value (`currentValue`) and falls back to `cvaValue` |\n * | `commitBoth(v)` | Commits via both CVA `onChange` and grid `commitValue` |\n * | `writeValue` / `registerOn*` / `setDisabledState` | Full CVA implementation |\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, forwardRef } from '@angular/core';\n * import { NG_VALUE_ACCESSOR } from '@angular/forms';\n * import { BaseGridEditorCVA } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-date-picker',\n * providers: [{\n * provide: NG_VALUE_ACCESSOR,\n * useExisting: forwardRef(() => DatePickerComponent),\n * multi: true,\n * }],\n * template: `\n * <input\n * type=\"date\"\n * [value]=\"displayValue()\"\n * [disabled]=\"disabledState()\"\n * (change)=\"commitBoth($event.target.value)\"\n * (keydown.escape)=\"cancelEdit()\"\n * />\n * `\n * })\n * export class DatePickerComponent extends BaseGridEditorCVA<MyRow, string> {}\n * ```\n *\n * > **Note:** Subclasses must still provide `NG_VALUE_ACCESSOR` themselves\n * > because `forwardRef(() => ConcreteClass)` must reference the concrete\n * > component — this is an Angular limitation.\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell/control value type\n */\n@Directive()\nexport abstract class BaseGridEditorCVA<TRow = unknown, TValue = unknown>\n extends BaseGridEditor<TRow, TValue>\n implements ControlValueAccessor\n{\n // ============================================================================\n // CVA State\n // ============================================================================\n\n /** Internal onChange callback registered by the form control. */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onChange: (value: TValue | null) => void = () => {};\n\n /** Internal onTouched callback registered by the form control. */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onTouched: () => void = () => {};\n\n /**\n * Signal holding the value written by the form control via `writeValue()`.\n * Updated when the form control pushes a new value (e.g. `patchValue`, `setValue`).\n */\n protected readonly cvaValue = signal<TValue | null>(null);\n\n /**\n * Signal tracking the disabled state set by the form control.\n * Updated when `setDisabledState()` is called by Angular's forms module.\n */\n readonly disabledState = signal(false);\n\n /**\n * Resolved display value.\n *\n * Prefers `currentValue()` (grid context — from `control.value` or `value` input)\n * and falls back to `cvaValue()` (standalone form context — from `writeValue`).\n *\n * Use this in your template instead of reading `currentValue()` directly\n * so the component works in both grid and standalone form contexts.\n */\n readonly displayValue = computed<TValue | null>(() => {\n return (this.currentValue() as TValue | undefined) ?? this.cvaValue();\n });\n\n // ============================================================================\n // ControlValueAccessor Implementation\n // ============================================================================\n\n /**\n * Called by Angular forms when the form control value changes programmatically.\n */\n writeValue(value: TValue | null): void {\n this.cvaValue.set(value);\n }\n\n /**\n * Called by Angular forms to register a change callback.\n */\n registerOnChange(fn: (value: TValue | null) => void): void {\n this._onChange = fn;\n }\n\n /**\n * Called by Angular forms to register a touched callback.\n */\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n /**\n * Called by Angular forms to set the disabled state.\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n // ============================================================================\n // Dual-Commit Helpers\n // ============================================================================\n\n /**\n * Commit a value through both the CVA (form control) and the grid.\n *\n * - Calls the CVA `onChange` callback (updates the form control)\n * - Marks the control as touched\n * - Calls `commitValue()` (emits grid commit event + DOM `CustomEvent`)\n *\n * Use this instead of `commitValue()` when your editor doubles as a form control.\n *\n * @param value - The new value to commit\n */\n protected commitBoth(value: TValue | null): void {\n // Update CVA\n this.cvaValue.set(value);\n this._onChange(value);\n this._onTouched();\n\n // Update grid (null is valid for nullable columns — the grid's cell-commit\n // handler and EditingPlugin will apply it correctly)\n this.commitValue(value);\n }\n}\n","import { afterNextRender, DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { BaseGridEditor } from './base-grid-editor';\n\n// #region Overlay Position Types\n\n/**\n * Position of the overlay panel relative to its anchor cell.\n *\n * - `'below'` — panel appears below the cell, left-aligned (default)\n * - `'above'` — panel appears above the cell, left-aligned\n * - `'below-right'` — panel appears below the cell, right-aligned\n * - `'over-top-left'` — panel top-left corner aligns with cell top-left corner (opens downward)\n * - `'over-bottom-left'` — panel bottom-left corner aligns with cell bottom-left corner (opens upward)\n */\nexport type OverlayPosition = 'below' | 'above' | 'below-right' | 'over-top-left' | 'over-bottom-left';\n\n// #endregion\n\n// #region Global Styles\n\n/** Tracks whether the global overlay stylesheet has been injected. */\nlet overlayStylesInjected = false;\n\n/**\n * CSS for the overlay panel base layer.\n * Injected once into `<head>` on first `BaseOverlayEditor` use.\n *\n * Uses CSS Anchor Positioning as primary strategy with a JS fallback\n * for browsers that don't support it (Firefox, Safari as of late 2025).\n */\nconst OVERLAY_STYLES = /* css */ `\n.tbw-overlay-panel {\n position: fixed;\n z-index: 10000;\n background: var(--tbw-overlay-bg, #fff);\n border: 1px solid var(--tbw-overlay-border, #ccc);\n border-radius: var(--tbw-overlay-radius, 4px);\n box-shadow: var(--tbw-overlay-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));\n box-sizing: border-box;\n overflow: auto;\n}\n\n/* Hide panels that have not been initialised via initOverlay() yet.\n Prevents a flash-of-unstyled-content when the subclass defers\n the initOverlay call (e.g. via setTimeout or afterNextRender). */\n.tbw-overlay-panel:not([data-anchor-id]) {\n display: none;\n}\n\n.tbw-overlay-panel:popover-open {\n display: block;\n}\n\n@supports (anchor-name: --a) {\n .tbw-overlay-panel[data-anchor-id] {\n position: fixed;\n position-anchor: var(--tbw-overlay-anchor);\n inset: unset;\n }\n .tbw-overlay-panel[data-pos=\"below\"] {\n top: anchor(bottom);\n left: anchor(left);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"above\"] {\n bottom: anchor(top);\n left: anchor(left);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"below-right\"] {\n top: anchor(bottom);\n right: anchor(right);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"over-top-left\"] {\n top: anchor(top);\n left: anchor(left);\n }\n .tbw-overlay-panel[data-pos=\"over-bottom-left\"] {\n bottom: anchor(bottom);\n left: anchor(left);\n }\n}\n`;\n\nfunction ensureOverlayStyles(): void {\n if (overlayStylesInjected) return;\n overlayStylesInjected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-tbw-overlay', '');\n style.textContent = OVERLAY_STYLES;\n document.head.appendChild(style);\n}\n\n// #endregion\n\n// #region Anchor ID Counter\nlet anchorCounter = 0;\n// #endregion\n\n/**\n * Base class for grid editors that display a floating overlay panel.\n *\n * Provides infrastructure for:\n * - **Overlay positioning** — CSS Anchor Positioning with JS fallback\n * - **Focus gating** — in row editing mode, the panel only opens for the focused cell\n * - **Click-outside detection** — closes the panel when clicking outside\n * - **MutationObserver** — detects cell focus changes (row editing mode)\n * - **Escape handling** — closes the panel and returns focus to the inline input\n * - **Synthetic Tab dispatch** — advances grid focus after overlay close\n * - **Automatic teardown** — removes the panel from `<body>` and cleans up listeners\n * - **External focus registration** — auto-registers the panel via `grid.registerExternalFocusContainer()` so the grid keeps `data-has-focus` and editors stay open while the overlay has focus\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, viewChild, ElementRef, effect } from '@angular/core';\n * import { BaseOverlayEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-date-editor',\n * template: `\n * <input\n * #inlineInput\n * readonly\n * [value]=\"currentValue()\"\n * (click)=\"onInlineClick()\"\n * (keydown)=\"onInlineKeydown($event)\"\n * />\n * <div #panel class=\"tbw-overlay-panel\" style=\"width: 280px;\">\n * <!-- your date picker UI here -->\n * <div class=\"actions\">\n * <button (click)=\"selectAndClose(selectedDate)\">OK</button>\n * <button (click)=\"hideOverlay()\">Cancel</button>\n * </div>\n * </div>\n * `\n * })\n * export class DateEditorComponent extends BaseOverlayEditor<MyRow, string> {\n * panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n * inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inlineInput');\n *\n * protected override overlayPosition = 'below' as const;\n *\n * constructor() {\n * super();\n * effect(() => {\n * const panel = this.panelRef().nativeElement;\n * this.initOverlay(panel);\n * if (this.isCellFocused()) this.showOverlay();\n * });\n * }\n *\n * protected getInlineInput(): HTMLInputElement | null {\n * return this.inputRef()?.nativeElement ?? null;\n * }\n *\n * protected onOverlayOutsideClick(): void {\n * this.hideOverlay();\n * }\n *\n * selectAndClose(date: string): void {\n * this.commitValue(date);\n * this.hideOverlay();\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input #inlineInput readonly [value]=\"currentValue()\"\n * (click)=\"onInlineClick()\" (keydown)=\"onInlineKeydown($event)\" />\n * <div #panel style=\"width: 280px\">\n * <!-- overlay content -->\n * </div>\n * `\n * })\n * export class MyEditor extends BaseOverlayEditor<MyRow, string> {\n * panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n * inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inlineInput');\n *\n * constructor() {\n * super();\n * effect(() => this.initOverlay(this.panelRef().nativeElement));\n * }\n *\n * protected getInlineInput() { return this.inputRef()?.nativeElement ?? null; }\n * protected onOverlayOutsideClick() { this.hideOverlay(); }\n * }\n * ```\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell value type\n */\n@Directive()\nexport abstract class BaseOverlayEditor<TRow = unknown, TValue = unknown> extends BaseGridEditor<TRow, TValue> {\n private readonly _elementRef = inject(ElementRef);\n private readonly _overlayDestroyRef = inject(DestroyRef);\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Position of the overlay panel relative to the anchor cell.\n * Override in subclasses to change the default position.\n *\n * @default 'below'\n */\n protected overlayPosition: OverlayPosition = 'below';\n\n // ============================================================================\n // Internal State\n // ============================================================================\n\n /** The overlay panel element (set via `initOverlay()`). */\n private _panel: HTMLElement | null = null;\n\n /** Whether the overlay is currently visible. */\n protected _isOpen = false;\n\n /** Unique anchor ID for CSS Anchor Positioning. */\n private _anchorId = '';\n\n /** Whether the browser supports CSS Anchor Positioning. */\n private _supportsAnchor = false;\n\n /** AbortController for all overlay-related listeners. */\n private _abortCtrl: AbortController | null = null;\n\n /** MutationObserver watching cell focus class changes. */\n protected _focusObserver: MutationObserver | null = null;\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n constructor() {\n super();\n this._supportsAnchor = typeof CSS !== 'undefined' && CSS.supports('anchor-name', '--a');\n ensureOverlayStyles();\n\n afterNextRender(() => this._setupFocusObserver());\n this._overlayDestroyRef.onDestroy(() => this.teardownOverlay());\n }\n\n // ============================================================================\n // Public API — Subclass Interface\n // ============================================================================\n\n /**\n * Initialise the overlay with the panel element.\n *\n * Call this in an `effect()` or `afterNextRender()` with your `viewChild` panel reference.\n * The panel is moved to `<body>` and hidden until {@link showOverlay} is called.\n *\n * @param panel - The overlay panel DOM element\n */\n protected initOverlay(panel: HTMLElement): void {\n this._panel = panel;\n\n // Assign a unique anchor ID\n this._anchorId = `tbw-anchor-${++anchorCounter}`;\n panel.classList.add('tbw-overlay-panel');\n panel.setAttribute('data-pos', this.overlayPosition);\n panel.setAttribute('data-anchor-id', this._anchorId);\n panel.style.display = 'none';\n\n // Set up CSS Anchor Positioning on the cell\n if (this._supportsAnchor) {\n const cell = this._getCell();\n if (cell) {\n cell.style.setProperty('anchor-name', `--${this._anchorId}`);\n panel.style.setProperty('--tbw-overlay-anchor', `--${this._anchorId}`);\n }\n }\n\n // Move panel to body so it escapes grid overflow clipping\n document.body.appendChild(panel);\n\n // Register the panel as an external focus container on the grid\n // so focus moving into the overlay is treated as \"still in the grid\"\n this._getGridElement()?.registerExternalFocusContainer?.(panel);\n\n // Set up click-outside detection\n this._abortCtrl = new AbortController();\n document.addEventListener('pointerdown', (e) => this._onDocumentPointerDown(e), {\n signal: this._abortCtrl.signal,\n });\n\n // Close overlay when the grid viewport scrolls. Mirrors outside-click\n // semantics so subclasses' `onOverlayOutsideClick()` drives commit/cancel.\n // Uses the public `tbw-scroll` CustomEvent dispatched on the grid host —\n // no shadow-DOM reach-arounds required (composed: true crosses boundaries).\n const grid = this._getGridElement();\n if (grid) {\n grid.addEventListener('tbw-scroll', () => this._onGridScroll(), {\n signal: this._abortCtrl.signal,\n });\n }\n\n // If the focus observer already fired before the panel was initialised\n // (e.g. initOverlay called from a deferred setTimeout), the showOverlay()\n // call was silently ignored because _panel was still null. Catch up now.\n if (this._getCell()?.classList.contains('cell-focus')) {\n this.showOverlay();\n this.onOverlayOpened();\n }\n }\n\n /**\n * Show the overlay panel.\n *\n * If CSS Anchor Positioning is not supported, falls back to JS-based\n * positioning using `getBoundingClientRect()`.\n */\n protected showOverlay(): void {\n if (!this._panel || this._isOpen) return;\n\n this._isOpen = true;\n this._panel.style.display = '';\n\n // JS fallback positioning for browsers without CSS Anchor Positioning\n if (!this._supportsAnchor) {\n this._positionWithJs();\n }\n }\n\n /**\n * Hide the overlay panel.\n *\n * @param suppressTabAdvance - When `true`, skip synthetic Tab dispatch\n * (useful when hiding is triggered by an external focus change).\n */\n protected hideOverlay(suppressTabAdvance?: boolean): void {\n if (!this._panel || !this._isOpen) return;\n\n this._isOpen = false;\n this._panel.style.display = 'none';\n\n if (!suppressTabAdvance) {\n this.getInlineInput()?.focus();\n }\n }\n\n /**\n * Close and immediately re-open the overlay.\n * Useful after the panel content changes size and needs repositioning.\n */\n protected reopenOverlay(): void {\n if (!this._panel) return;\n this._isOpen = false;\n this._panel.style.display = 'none';\n this.showOverlay();\n }\n\n /**\n * Remove the overlay from the DOM and clean up all listeners.\n *\n * Called automatically on `DestroyRef.onDestroy`. Can also be called\n * manually if the editor needs early cleanup.\n */\n protected teardownOverlay(): void {\n this._abortCtrl?.abort();\n this._abortCtrl = null;\n\n this._focusObserver?.disconnect();\n this._focusObserver = null;\n\n // Unregister the panel from the grid's external focus container registry\n if (this._panel) {\n this._getGridElement()?.unregisterExternalFocusContainer?.(this._panel);\n }\n\n if (this._panel?.parentNode) {\n this._panel.parentNode.removeChild(this._panel);\n }\n this._panel = null;\n this._isOpen = false;\n\n // Clean up anchor-name on the cell\n if (this._supportsAnchor) {\n const cell = this._getCell();\n if (cell) {\n cell.style.removeProperty('anchor-name');\n }\n }\n }\n\n /**\n * Override in `edit-close` handler to also hide the overlay.\n * This is called automatically by `BaseGridEditor` when the grid\n * ends the editing session.\n */\n protected override onEditClose(): void {\n this.hideOverlay(true);\n }\n\n // ============================================================================\n // Keyboard & Click Helpers\n // ============================================================================\n\n /**\n * Keydown handler for the inline readonly input.\n *\n * - **Enter / Space / ArrowDown / F2** → open overlay\n * - **Escape** → calls {@link handleEscape}\n *\n * Bind this to `(keydown)` on your inline input element.\n */\n onInlineKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n case 'F2':\n event.preventDefault();\n this.showOverlay();\n this.onOverlayOpened();\n break;\n case 'Escape':\n this.handleEscape(event);\n break;\n }\n }\n\n /**\n * Click handler for the inline input.\n * Opens the overlay and calls {@link onOverlayOpened}.\n *\n * Bind this to `(click)` on your inline input element.\n */\n onInlineClick(): void {\n if (this._isOpen) {\n this.hideOverlay();\n } else {\n this.showOverlay();\n this.onOverlayOpened();\n }\n }\n\n /**\n * Handle Escape key press.\n *\n * If the overlay is open, closes it and returns focus to the inline input.\n * If the overlay is already closed, cancels the edit entirely.\n */\n protected handleEscape(event: Event): void {\n if (this._isOpen) {\n event.stopPropagation();\n this.hideOverlay();\n } else {\n this.cancelEdit();\n }\n }\n\n /**\n * Dispatch a synthetic Tab key event to advance grid focus.\n *\n * Call this after committing a value and closing the overlay so the\n * grid moves focus to the next cell.\n *\n * @param backward - When `true`, dispatch Shift+Tab to move backwards.\n */\n protected advanceGridFocus(backward = false): void {\n const cell = this._getCell();\n if (!cell) return;\n\n cell.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Tab',\n shiftKey: backward,\n bubbles: true,\n cancelable: true,\n }),\n );\n }\n\n // ============================================================================\n // Abstract / Hook Methods\n // ============================================================================\n\n /**\n * Return the inline input element, if any.\n *\n * Used by overlay infrastructure to return focus after hiding.\n * Return `null` if there is no inline input.\n */\n protected abstract getInlineInput(): HTMLInputElement | null;\n\n /**\n * Called when a pointerdown event occurs outside the overlay panel\n * and outside the editor's host element.\n *\n * Typically, subclasses call `hideOverlay()` here.\n */\n protected abstract onOverlayOutsideClick(): void;\n\n /**\n * Called after the overlay is shown.\n *\n * Override to focus an element inside the panel, start animations, etc.\n * Default implementation is a no-op.\n */\n protected onOverlayOpened(): void {\n // Default: no-op. Subclasses override.\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /** Find the parent cell element for this editor. */\n private _getCell(): HTMLElement | null {\n return this._elementRef.nativeElement.closest('[part=\"cell\"]') ?? null;\n }\n\n /** Find the parent `<tbw-grid>` element for this editor. */\n private _getGridElement():\n | (HTMLElement & {\n registerExternalFocusContainer?(el: Element): void;\n unregisterExternalFocusContainer?(el: Element): void;\n })\n | null {\n return this._elementRef.nativeElement.closest('tbw-grid') ?? null;\n }\n\n /**\n * JS fallback positioning for browsers without CSS Anchor Positioning.\n * Uses `getBoundingClientRect()` with viewport overflow detection.\n */\n private _positionWithJs(): void {\n const cell = this._getCell();\n const panel = this._panel;\n if (!cell || !panel) return;\n\n const cellRect = cell.getBoundingClientRect();\n\n // Temporarily make visible to measure\n panel.style.visibility = 'hidden';\n panel.style.display = '';\n const panelRect = panel.getBoundingClientRect();\n panel.style.visibility = '';\n\n const viewportH = window.innerHeight;\n const viewportW = window.innerWidth;\n\n let top: number;\n let left: number;\n\n switch (this.overlayPosition) {\n case 'above': {\n top = cellRect.top - panelRect.height;\n left = cellRect.left;\n // Flip to below if off-screen\n if (top < 0) top = cellRect.bottom;\n break;\n }\n case 'below-right': {\n top = cellRect.bottom;\n left = cellRect.right - panelRect.width;\n // Flip to above if off-screen\n if (top + panelRect.height > viewportH) top = cellRect.top - panelRect.height;\n break;\n }\n case 'over-top-left': {\n top = cellRect.top;\n left = cellRect.left;\n break;\n }\n case 'over-bottom-left': {\n top = cellRect.bottom - panelRect.height;\n left = cellRect.left;\n break;\n }\n case 'below':\n default: {\n top = cellRect.bottom;\n left = cellRect.left;\n // Flip to above if off-screen\n if (top + panelRect.height > viewportH) top = cellRect.top - panelRect.height;\n break;\n }\n }\n\n // Clamp to viewport\n if (left + panelRect.width > viewportW) left = viewportW - panelRect.width - 4;\n if (left < 0) left = 4;\n if (top < 0) top = 4;\n\n panel.style.top = `${top}px`;\n panel.style.left = `${left}px`;\n }\n\n /**\n * Document pointerdown handler for click-outside detection.\n * Fires `onOverlayOutsideClick()` if the click is outside the panel\n * and outside the editor's host element.\n */\n private _onDocumentPointerDown(event: PointerEvent): void {\n if (!this._isOpen || !this._panel) return;\n\n const target = event.target as Node;\n const hostEl = this._elementRef.nativeElement;\n\n // Click inside panel or host — ignore\n if (this._panel.contains(target) || hostEl.contains(target)) return;\n\n this.onOverlayOutsideClick();\n }\n\n /**\n * Handle the grid's `tbw-scroll` CustomEvent while the overlay is open.\n *\n * When the viewport scrolls, the anchored overlay would otherwise float\n * over content that no longer corresponds to the edited cell (or the\n * cell may be virtualized out entirely). Treat scroll as a dismissal\n * signal equivalent to clicking outside so subclasses' overlay-outside\n * handler drives the appropriate commit/cancel path.\n */\n private _onGridScroll(): void {\n if (!this._isOpen || !this._panel) return;\n this.onOverlayOutsideClick();\n }\n\n /**\n * Set up a MutationObserver on the parent cell to watch for\n * `cell-focus` class changes. This handles row-editing mode where\n * all editors exist simultaneously but only the focused cell's\n * editor should have its overlay visible.\n *\n * A `justOpened` flash guard suppresses the observer from\n * immediately closing the overlay when `beginBulkEdit()` moves\n * focus to the first editable column. Without this guard,\n * double-click triggers a \"flash open then close\" effect.\n */\n protected _setupFocusObserver(): void {\n const cell = this._getCell();\n if (!cell) return;\n\n let justOpened = false;\n\n let pendingHideRaf = 0;\n\n const hostEl = this._elementRef.nativeElement;\n\n this._focusObserver = new MutationObserver((mutations) => {\n // Guard: if the editor's host element is no longer inside the cell,\n // it means the component was detached (e.g., editing session ended\n // and the render pipeline cleared the cell DOM). Disconnect to\n // prevent orphaned observers from opening stale overlay panels.\n if (!cell.contains(hostEl)) {\n this._focusObserver?.disconnect();\n this._focusObserver = null;\n return;\n }\n\n for (const mutation of mutations) {\n if (mutation.type !== 'attributes' || mutation.attributeName !== 'class') continue;\n\n const isFocused = cell.classList.contains('cell-focus');\n if (isFocused && !this._isOpen) {\n // Cell just gained focus — cancel any pending hide and open overlay.\n if (pendingHideRaf) {\n cancelAnimationFrame(pendingHideRaf);\n pendingHideRaf = 0;\n }\n justOpened = true;\n this.showOverlay();\n this.onOverlayOpened();\n // Clear the guard after a macrotask so that an immediate\n // focus-away (e.g. beginBulkEdit focus adjustment) does\n // not close the overlay in the same event loop tick.\n setTimeout(() => {\n justOpened = false;\n }, 0);\n } else if (!isFocused && this._isOpen && !justOpened) {\n // Cell lost focus — defer hide to allow render cycles to settle.\n // Re-renders (e.g., from ResizeObserver after a footer appears)\n // may transiently toggle cell-focus within the same frame.\n // Deferring to the next animation frame lets the render pipeline\n // finish before we decide whether the overlay should actually close.\n if (pendingHideRaf) cancelAnimationFrame(pendingHideRaf);\n pendingHideRaf = requestAnimationFrame(() => {\n pendingHideRaf = 0;\n // Re-check settled state — cell-focus may have been re-applied\n if (!cell.classList.contains('cell-focus') && this._isOpen) {\n this.hideOverlay(true);\n }\n });\n }\n }\n });\n\n this._focusObserver.observe(cell, { attributes: true, attributeFilter: ['class'] });\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-column>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-column>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The underlying web component reads its attributes (`field`, `header`,\n * `type`, `width`, etc.) directly from the DOM, so no `@Input()` forwarding\n * is needed — Angular's standard property/attribute binding handles it.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridColumn, TbwRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridColumn, TbwRenderer],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid-column',\n})\nexport class TbwGridColumn {}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-header>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-header>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The grid's `config-manager` reads attributes like `title` directly\n * from the DOM element.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridHeader } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridHeader],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-header title=\"My Grid Title\"></tbw-grid-header>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid-header',\n})\nexport class TbwGridHeader {}\n","import { Directive, ElementRef, inject, input, OnDestroy, OnInit, output } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport type { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport type { FormArrayContext } from './grid-form-array.directive';\n\n/**\n * Interface for EditingPlugin validation methods.\n * We use a minimal interface to avoid importing the full EditingPlugin class.\n */\ninterface EditingPluginValidation {\n setInvalid(rowId: string, field: string, message?: string): void;\n clearInvalid(rowId: string, field: string): void;\n clearRowInvalid(rowId: string): void;\n}\n\n// Symbol for storing form context on the grid element (shared with GridFormArray)\nconst FORM_ARRAY_CONTEXT = Symbol('formArrayContext');\n\n/**\n * Gets the FormArrayContext from a grid element, if present.\n * @internal\n */\nexport function getLazyFormContext(gridElement: HTMLElement): FormArrayContext | undefined {\n return (gridElement as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n}\n\n/**\n * Factory function type for creating FormGroups lazily.\n * Called when a row enters edit mode for the first time.\n *\n * @template TRow The row data type\n * @param row The row data object\n * @param rowIndex The row index in the grid\n * @returns A FormGroup for the row (only include editable fields)\n */\nexport type LazyFormFactory<TRow = unknown> = (row: TRow, rowIndex: number) => FormGroup;\n\n/**\n * Event emitted when a row's form values have changed.\n */\nexport interface RowFormChangeEvent<TRow = unknown> {\n /** The row index */\n rowIndex: number;\n /** The row ID (if available) */\n rowId?: string;\n /** The original row data */\n row: TRow;\n /** The FormGroup for this row */\n formGroup: FormGroup;\n /** The current form values */\n values: Partial<TRow>;\n /** Whether the form is valid */\n valid: boolean;\n /** Whether the form is dirty */\n dirty: boolean;\n}\n\n/**\n * Directive that provides lazy FormGroup creation for grid editing.\n *\n * Unlike `GridFormArray` which creates all FormGroups upfront, this directive\n * creates FormGroups on-demand only when a row enters edit mode. This provides\n * much better performance for large datasets while still enabling full\n * Angular Reactive Forms integration.\n *\n * ## Key Benefits\n *\n * - **Performance**: Only creates FormGroups for rows being edited (20-100x fewer controls)\n * - **Same DX**: Editors still receive `control` in their context for validation\n * - **Memory efficient**: FormGroups are cleaned up when rows exit edit mode\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, inject, signal } from '@angular/core';\n * import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\n * import { Grid, GridLazyForm, TbwEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, GridLazyForm, TbwEditor, ReactiveFormsModule],\n * template: \\`\n * <tbw-grid\n * [rows]=\"employees()\"\n * [lazyForm]=\"createRowForm\"\n * [gridConfig]=\"config\">\n *\n * <tbw-grid-column field=\"firstName\">\n * <input *tbwEditor=\"let _; control as ctrl\"\n * [formControl]=\"ctrl\"\n * [class.is-invalid]=\"ctrl?.invalid && ctrl?.touched\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * \\`\n * })\n * export class MyComponent {\n * private fb = inject(FormBuilder);\n * employees = signal(generateEmployees(1000));\n *\n * // Factory called when editing starts - only include editable fields!\n * createRowForm = (row: Employee): FormGroup => this.fb.group({\n * firstName: [row.firstName, Validators.required],\n * lastName: [row.lastName, Validators.minLength(2)],\n * salary: [row.salary, [Validators.required, Validators.min(0)]],\n * });\n *\n * gridConfig = { columns: [...] };\n * }\n * ```\n *\n * ## How It Works\n *\n * 1. Rows come from `[rows]` input (plain data array)\n * 2. When a cell enters edit mode, the FormGroup is created lazily\n * 3. Editors receive the FormControl in their template context\n * 4. On commit, FormGroup values are synced back to the row\n * 5. FormGroup is cleaned up when the row exits edit mode (configurable)\n *\n * ## Performance Comparison\n *\n * | Rows | GridFormArray (20 fields) | GridLazyForm |\n * |------|---------------------------|--------------|\n * | 100 | 2,000 controls | ~20 controls |\n * | 500 | 10,000 controls | ~20 controls |\n * | 1000 | 20,000 controls | ~20 controls |\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"employees()\" [lazyForm]=\"createRowForm\" [gridConfig]=\"gridConfig\" />\n * ```\n *\n * @see GridFormArray For small datasets with full upfront validation\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid[lazyForm]',\n})\nexport class GridLazyForm<TRow = unknown> implements OnInit, OnDestroy {\n private elementRef = inject(ElementRef<GridElement<TRow>>);\n\n // Cache of FormGroups by row reference\n private formGroupCache = new Map<TRow, FormGroup>();\n // Map from row reference to rowIndex (needed for getControl)\n private rowIndexMap = new Map<TRow, number>();\n // Track which row is currently being edited\n private editingRowIndex: number | null = null;\n\n private cellCommitUnsub: (() => void) | null = null;\n private rowCommitUnsub: (() => void) | null = null;\n private rowsChangeUnsub: (() => void) | null = null;\n\n /**\n * Factory function to create a FormGroup for a row.\n * Called lazily when the row first enters edit mode.\n *\n * @example\n * ```typescript\n * createRowForm = (row: Employee): FormGroup => this.fb.group({\n * firstName: [row.firstName, Validators.required],\n * lastName: [row.lastName],\n * salary: [row.salary, [Validators.min(0)]],\n * });\n * ```\n */\n readonly lazyForm = input.required<LazyFormFactory<TRow>>();\n\n /**\n * Whether to automatically sync Angular validation state to grid's visual invalid styling.\n *\n * When enabled:\n * - After a cell commit, if the FormControl is invalid, the cell is marked with `setInvalid()`\n * - When a FormControl becomes valid, `clearInvalid()` is called\n * - On `row-commit`, if the row's FormGroup has invalid controls, the commit is prevented\n *\n * @default true\n */\n readonly syncValidation = input<boolean>(true);\n\n /**\n * Whether to keep FormGroups cached after a row exits edit mode.\n *\n * - `true`: FormGroups are kept, preserving dirty/touched state across edit sessions\n * - `false`: FormGroups are disposed when the row exits edit mode (default)\n *\n * @default false\n */\n readonly keepFormGroups = input<boolean>(false);\n\n /**\n * Emitted when a row's form values change.\n * Useful for auto-save, validation display, or syncing to external state.\n */\n readonly rowFormChange = output<RowFormChangeEvent<TRow>>();\n\n ngOnInit(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Store the form context for AngularGridAdapter to access\n this.#storeFormContext(grid);\n\n // Listen for cell-commit to update FormControl and sync validation\n this.cellCommitUnsub = grid.on(\n 'cell-commit',\n (detail: { rowIndex: number; field: string; value: unknown; oldValue: unknown; rowId: string }) => {\n this.#handleCellCommit(detail);\n },\n );\n\n // Listen for row-commit to sync FormGroup values back to row and cleanup\n this.rowCommitUnsub = grid.on('row-commit', (detail: { rowIndex: number; rowId?: string }, event: CustomEvent) => {\n this.#handleRowCommit(event, detail);\n });\n\n // Listen for rows-change to update row index mappings\n this.rowsChangeUnsub = grid.on('rows-change', () => {\n this.#updateRowIndexMap();\n });\n\n // Initial row index mapping\n this.#updateRowIndexMap();\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n this.cellCommitUnsub?.();\n this.rowCommitUnsub?.();\n this.rowsChangeUnsub?.();\n\n this.#clearFormContext(grid);\n this.formGroupCache.clear();\n this.rowIndexMap.clear();\n }\n\n // #region FormArrayContext Implementation\n\n /**\n * Gets or creates the FormGroup for a row.\n * This is the core lazy initialization logic.\n */\n #getOrCreateFormGroup(row: TRow, rowIndex: number): FormGroup {\n let formGroup = this.formGroupCache.get(row);\n if (!formGroup) {\n const factory = this.lazyForm();\n formGroup = factory(row, rowIndex);\n this.formGroupCache.set(row, formGroup);\n this.rowIndexMap.set(row, rowIndex);\n }\n return formGroup;\n }\n\n /**\n * Gets the FormGroup for a row if it exists (without creating).\n */\n #getRowFormGroup(rowIndex: number): FormGroup | undefined {\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex];\n return this.formGroupCache.get(row);\n }\n\n /**\n * Stores the FormArrayContext on the grid element.\n * This uses the same interface as GridFormArray for compatibility.\n */\n #storeFormContext(grid: GridElement<TRow>): void {\n const context: FormArrayContext = {\n getRow: <T>(rowIndex: number): T | null => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return null;\n return rows[rowIndex] as unknown as T;\n },\n\n updateField: (rowIndex: number, field: string, value: unknown) => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (formGroup) {\n const control = formGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n }\n }\n },\n\n getValue: <T>(): T[] => {\n return (grid.rows ?? []) as unknown as T[];\n },\n\n // Always true for lazy forms - we create FormGroups on demand\n hasFormGroups: true,\n\n getControl: (rowIndex: number, field: string): AbstractControl | undefined => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex] as TRow;\n // LAZY: Create the FormGroup when first needed\n const formGroup = this.#getOrCreateFormGroup(row, rowIndex);\n return formGroup.get(field) ?? undefined;\n },\n\n getRowFormGroup: (rowIndex: number): FormGroup | undefined => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex] as TRow;\n // LAZY: Create the FormGroup when first needed\n return this.#getOrCreateFormGroup(row, rowIndex);\n },\n\n isRowValid: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n // If no FormGroup exists yet, consider it valid (not edited)\n if (!formGroup) return true;\n return formGroup.valid;\n },\n\n isRowTouched: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return false;\n return formGroup.touched;\n },\n\n isRowDirty: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return false;\n return formGroup.dirty;\n },\n\n getRowErrors: (rowIndex: number): Record<string, unknown> | null => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return null;\n\n const errors: Record<string, unknown> = {};\n let hasErrors = false;\n\n Object.keys(formGroup.controls).forEach((field) => {\n const control = formGroup.get(field);\n if (control?.errors) {\n errors[field] = control.errors;\n hasErrors = true;\n }\n });\n\n if (formGroup.errors) {\n errors['_group'] = formGroup.errors;\n hasErrors = true;\n }\n\n return hasErrors ? errors : null;\n },\n };\n\n (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT] = context;\n }\n\n /**\n * Clears the FormArrayContext from the grid element.\n */\n #clearFormContext(grid: GridElement<TRow>): void {\n delete (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n }\n\n // #endregion\n\n // #region Event Handlers\n\n /**\n * Updates the row index map when rows change.\n * This ensures we can find FormGroups by row reference after sorting/filtering.\n */\n #updateRowIndexMap(): void {\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows) return;\n\n this.rowIndexMap.clear();\n rows.forEach((row: TRow, index: number) => {\n if (this.formGroupCache.has(row)) {\n this.rowIndexMap.set(row, index);\n }\n });\n }\n\n /**\n * Handles cell-commit events by updating the FormControl in the FormGroup.\n */\n #handleCellCommit(detail: { rowIndex: number; field: string; value: unknown; rowId: string }): void {\n const { rowIndex, field, value, rowId } = detail;\n\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (formGroup) {\n const control = formGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n control.markAsTouched();\n\n // Sync Angular validation state to grid's visual invalid styling\n if (this.syncValidation() && rowId) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n\n // Emit change event\n const grid = this.elementRef.nativeElement;\n const row = grid?.rows?.[rowIndex];\n if (row) {\n this.rowFormChange.emit({\n rowIndex,\n rowId,\n row,\n formGroup,\n values: formGroup.value,\n valid: formGroup.valid,\n dirty: formGroup.dirty,\n });\n }\n }\n }\n }\n\n /**\n * Handles row-commit events.\n * - Prevents commit if FormGroup is invalid (when syncValidation is true)\n * - Syncs FormGroup values back to the row\n * - Cleans up FormGroup if keepFormGroups is false\n */\n #handleRowCommit(event: Event, detail: { rowIndex: number; rowId?: string }): void {\n const { rowIndex, rowId } = detail;\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return;\n\n const row = rows[rowIndex];\n const formGroup = this.formGroupCache.get(row);\n\n if (!formGroup) return;\n\n // Prevent commit if invalid (when syncValidation is enabled)\n if (this.syncValidation() && formGroup.invalid) {\n // Mark all controls as touched to show validation errors\n formGroup.markAllAsTouched();\n event.preventDefault();\n return;\n }\n\n // Sync FormGroup values back to the row object\n if (formGroup.dirty) {\n const formValue = formGroup.value;\n Object.keys(formValue).forEach((field) => {\n if (field in row) {\n (row as Record<string, unknown>)[field] = formValue[field];\n }\n });\n }\n\n // Clean up FormGroup if not keeping them\n if (!this.keepFormGroups()) {\n this.formGroupCache.delete(row);\n this.rowIndexMap.delete(row);\n\n // Clear any validation state in the grid\n if (rowId) {\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n editingPlugin?.clearRowInvalid(rowId);\n }\n }\n }\n\n // #endregion\n\n // #region Validation Sync\n\n /**\n * Syncs a FormControl's validation state to the grid's visual invalid styling.\n */\n #syncControlValidationToGrid(rowId: string, field: string, control: AbstractControl): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n\n if (!editingPlugin) return;\n\n if (control.invalid) {\n const errorMessage = this.#getFirstErrorMessage(control);\n editingPlugin.setInvalid(rowId, field, errorMessage);\n } else {\n editingPlugin.clearInvalid(rowId, field);\n }\n }\n\n /**\n * Gets a human-readable error message from the first validation error.\n */\n #getFirstErrorMessage(control: AbstractControl): string {\n const errors = control.errors;\n if (!errors) return '';\n\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n return typeof error === 'string' ? error : (error?.message ?? `Validation error: ${firstKey}`);\n }\n }\n\n // #endregion\n\n // #region Public API\n\n /**\n * Gets the FormGroup for a row, if it exists.\n * Unlike the context methods, this does NOT create a FormGroup lazily.\n *\n * @param rowIndex The row index\n * @returns The FormGroup or undefined\n */\n getFormGroup(rowIndex: number): FormGroup | undefined {\n return this.#getRowFormGroup(rowIndex);\n }\n\n /**\n * Gets all cached FormGroups.\n * Useful for bulk validation or inspection.\n *\n * @returns Map of row objects to their FormGroups\n */\n getAllFormGroups(): ReadonlyMap<TRow, FormGroup> {\n return this.formGroupCache;\n }\n\n /**\n * Clears all cached FormGroups.\n * Useful when the underlying data changes significantly.\n */\n clearAllFormGroups(): void {\n this.formGroupCache.clear();\n this.rowIndexMap.clear();\n }\n\n /**\n * Validates all currently cached FormGroups.\n *\n * @returns true if all FormGroups are valid, false otherwise\n */\n validateAll(): boolean {\n for (const formGroup of this.formGroupCache.values()) {\n if (formGroup.invalid) {\n formGroup.markAllAsTouched();\n return false;\n }\n }\n return true;\n }\n\n // #endregion\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-tool-buttons>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-tool-buttons>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The grid's shell reads toolbar buttons directly from the DOM.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridToolButtons } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridToolButtons],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-tool-buttons>\n * <button (click)=\"doSomething()\">Action</button>\n * </tbw-grid-tool-buttons>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n */\n@Directive({\n selector: 'tbw-grid-tool-buttons',\n})\nexport class TbwGridToolButtons {}\n","import {\n AfterContentInit,\n ApplicationRef,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n ColumnConfig as BaseColumnConfig,\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n ColumnConfigMap,\n ColumnResizeDetail,\n FitMode,\n GridColumnState,\n DataGridElement as GridElement,\n RowClickDetail,\n SortChangeDetail,\n TbwScrollDetail,\n} from '@toolbox-web/grid';\nimport { DataGridElement as GridElementClass } from '@toolbox-web/grid';\n// Import editing event types from the editing plugin\nimport type { ChangedRowsResetDetail, EditingConfig } from '@toolbox-web/grid/plugins/editing';\n// Import plugin types and the two plugins always needed for Angular template integration\nimport type {\n ClipboardConfig,\n ColumnMoveDetail,\n ColumnVirtualizationConfig,\n ColumnVisibilityDetail,\n ContextMenuConfig,\n CopyDetail,\n DetailExpandDetail,\n ExportCompleteDetail,\n ExportConfig,\n FilterChangeDetail,\n FilterConfig,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n GroupToggleDetail,\n MasterDetailConfig,\n MasterDetailPlugin,\n MultiSortConfig,\n PasteDetail,\n PinnedRowsConfig,\n PivotConfig,\n PrintCompleteDetail,\n PrintConfig,\n PrintStartDetail,\n ReorderConfig,\n ResponsiveChangeDetail,\n ResponsivePlugin,\n ResponsivePluginConfig,\n RowDragDropConfig,\n RowDragEndDetail,\n RowDragStartDetail,\n RowDropDetail,\n RowMoveDetail,\n RowReorderConfig,\n RowTransferDetail,\n SelectionChangeDetail,\n SelectionConfig,\n ServerSideConfig,\n TooltipConfig,\n TreeConfig,\n TreeExpandDetail,\n UndoRedoConfig,\n UndoRedoDetail,\n VisibilityConfig,\n} from '@toolbox-web/grid/all';\nimport type { ColumnConfig, GridConfig } from '../angular-column-config';\nimport { GridAdapter } from '../angular-grid-adapter';\nimport { createPluginFromFeature, type FeatureName } from '../feature-registry';\nimport { GridIconRegistry } from '../grid-icon-registry';\n\n/**\n * Event detail for cell commit events.\n */\nexport interface CellCommitEvent<TRow = unknown, TValue = unknown> {\n /** The row data object */\n row: TRow;\n /** The field name of the edited column */\n field: string;\n /** The new value after edit */\n value: TValue;\n /** The row index in the data array */\n rowIndex: number;\n /** Array of all rows that have been modified */\n changedRows: TRow[];\n /** Set of row indices that have been modified */\n changedRowIndices: Set<number>;\n /** Whether this is the first modification to this row */\n firstTimeForRow: boolean;\n}\n\n/**\n * Event detail for row commit events (bulk editing).\n */\nexport interface RowCommitEvent<TRow = unknown> {\n /** The row data object */\n row: TRow;\n /** The row index in the data array */\n rowIndex: number;\n /** Array of all rows that have been modified */\n changedRows: TRow[];\n /** Set of row indices that have been modified */\n changedRowIndices: Set<number>;\n /** Whether this is the first modification to this row */\n firstTimeForRow: boolean;\n}\n\n/**\n * Directive that automatically registers the Angular adapter with tbw-grid elements.\n *\n * This directive eliminates the need to manually register the adapter in your component\n * constructor. Simply import this directive and it will handle adapter registration.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-root',\n * imports: [Grid],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\" [customStyles]=\"myStyles\">\n * <!-- column templates -->\n * </tbw-grid>\n * `\n * })\n * export class AppComponent {\n * rows = [...];\n * config = {...};\n * myStyles = `.my-class { color: red; }`;\n * }\n * ```\n *\n * The directive automatically:\n * - Creates a GridAdapter instance\n * - Registers it with the GridElement\n * - Injects custom styles into the grid\n * - Handles cleanup on destruction\n *\n * @category Directive\n */\n@Directive({ selector: 'tbw-grid' })\nexport class Grid implements OnInit, AfterContentInit, OnDestroy {\n private elementRef = inject(ElementRef<GridElement>);\n private injector = inject(EnvironmentInjector);\n private appRef = inject(ApplicationRef);\n private viewContainerRef = inject(ViewContainerRef);\n private iconRegistry = inject(GridIconRegistry, { optional: true });\n\n private adapter: GridAdapter | null = null;\n\n constructor() {\n // Effect to process gridConfig and apply to grid\n // This merges feature input plugins with the user's config plugins\n effect(() => {\n const userGridConfig = this.gridConfig();\n\n const angularCfg = userGridConfig;\n if (!this.adapter) return;\n\n // Create plugins from feature inputs\n const featurePlugins = this.createFeaturePlugins();\n\n // Build core config overrides from individual inputs\n const sortableValue = this.sortable();\n const filterableValue = this.filterable();\n const selectableValue = this.selectable();\n const coreConfigOverrides: Record<string, unknown> = {};\n if (sortableValue !== undefined) {\n coreConfigOverrides['sortable'] = sortableValue;\n }\n if (filterableValue !== undefined) {\n coreConfigOverrides['filterable'] = filterableValue;\n }\n if (selectableValue !== undefined) {\n coreConfigOverrides['selectable'] = selectableValue;\n }\n\n const grid = this.elementRef.nativeElement;\n\n // Merge icon overrides from registry with any existing icons\n // Registry icons are base, config.icons override them\n const registryIcons = this.iconRegistry?.getAll();\n if (registryIcons && Object.keys(registryIcons).length > 0) {\n const existingIcons = angularCfg?.icons || {};\n coreConfigOverrides['icons'] = { ...registryIcons, ...existingIcons };\n }\n\n // Nothing to do if there's no config input and no feature inputs\n const hasFeaturePlugins = featurePlugins.length > 0;\n const hasConfigOverrides = Object.keys(coreConfigOverrides).length > 0;\n\n if (!angularCfg && !hasFeaturePlugins && !hasConfigOverrides) {\n return;\n }\n\n const userConfig = angularCfg || {};\n\n // Merge feature-input plugins with the user's own plugins\n const configPlugins = userConfig.plugins || [];\n const mergedPlugins = [...featurePlugins, ...configPlugins];\n\n // The interceptor on element.gridConfig (installed in ngOnInit)\n // handles converting component classes → functions via processGridConfig,\n // so we can pass the raw Angular config through. The interceptor is\n // idempotent, making this safe even if the config is already processed.\n grid.gridConfig = {\n ...userConfig,\n ...coreConfigOverrides,\n plugins: mergedPlugins.length > 0 ? mergedPlugins : userConfig.plugins,\n };\n });\n\n // Effect to sync loading state to the grid element\n effect(() => {\n const loadingValue = this.loading();\n if (loadingValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.loading = loadingValue;\n });\n\n // Effect to sync rows to the grid element\n effect(() => {\n const rowsValue = this.rows();\n if (rowsValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.rows = rowsValue;\n });\n\n // Effect to sync columns to the grid element\n effect(() => {\n const columnsValue = this.columns();\n if (columnsValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n // Process columns through the adapter to convert Angular component classes\n // (renderer/editor) to functions — the grid's columns setter does NOT call\n // processConfig, unlike gridConfig. Without this, raw component classes\n // would be invoked without `new`, causing runtime errors.\n const processed = this.adapter\n ? (columnsValue as ColumnConfig[]).map((col) => this.adapter!.processColumn(col))\n : columnsValue;\n grid.columns = processed as BaseColumnConfig[] | ColumnConfigMap;\n });\n\n // Effect to sync fitMode to the grid element\n effect(() => {\n const fitModeValue = this.fitMode();\n if (fitModeValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.fitMode = fitModeValue;\n });\n }\n\n /**\n * Custom CSS styles to inject into the grid.\n * Use this to style custom cell renderers, editors, or detail panels.\n *\n * @example\n * ```typescript\n * // In your component\n * customStyles = `\n * .my-detail-panel { padding: 16px; }\n * .my-status-badge { border-radius: 4px; }\n * `;\n * ```\n *\n * ```html\n * <tbw-grid [customStyles]=\"customStyles\">...</tbw-grid>\n * ```\n */\n customStyles = input<string>();\n\n /**\n * Grid-wide sorting toggle.\n * When false, disables sorting for all columns regardless of their individual `sortable` setting.\n * When true (default), columns with `sortable: true` can be sorted.\n *\n * This is a core grid config property, not a plugin feature.\n * For multi-column sorting, also add the `[multiSort]` feature.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all sorting -->\n * <tbw-grid [sortable]=\"false\" />\n *\n * <!-- Enable sorting (default) - columns still need sortable: true -->\n * <tbw-grid [sortable]=\"true\" />\n *\n * <!-- Enable multi-column sorting -->\n * <tbw-grid [sortable]=\"true\" [multiSort]=\"true\" />\n * ```\n */\n sortable = input<boolean>();\n\n /**\n * Grid-wide filtering toggle.\n * When false, disables filtering for all columns regardless of their individual `filterable` setting.\n * When true (default), columns with `filterable: true` can be filtered.\n *\n * Requires the FilteringPlugin to be loaded.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all filtering -->\n * <tbw-grid [filterable]=\"false\" [filtering]=\"true\" />\n *\n * <!-- Enable filtering (default) -->\n * <tbw-grid [filterable]=\"true\" [filtering]=\"true\" />\n * ```\n */\n filterable = input<boolean>();\n\n /**\n * Grid-wide selection toggle.\n * When false, disables selection for all rows/cells.\n * When true (default), selection is enabled based on plugin mode.\n *\n * Requires the SelectionPlugin to be loaded.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all selection -->\n * <tbw-grid [selectable]=\"false\" [selection]=\"'range'\" />\n *\n * <!-- Enable selection (default) -->\n * <tbw-grid [selectable]=\"true\" [selection]=\"'range'\" />\n * ```\n */\n selectable = input<boolean>();\n\n /**\n * Show a loading overlay on the grid.\n * Use this during initial data fetch or refresh operations.\n *\n * For row/cell loading states, access the grid element directly:\n * - `grid.setRowLoading(rowId, true/false)`\n * - `grid.setCellLoading(rowId, field, true/false)`\n *\n * @default false\n *\n * @example\n * ```html\n * <!-- Show loading during data fetch -->\n * <tbw-grid [loading]=\"isLoading\" [rows]=\"rows\" />\n * ```\n *\n * ```typescript\n * isLoading = true;\n *\n * ngOnInit() {\n * this.dataService.fetchData().subscribe(data => {\n * this.rows = data;\n * this.isLoading = false;\n * });\n * }\n * ```\n */\n loading = input<boolean>();\n\n /**\n * The data rows to display in the grid.\n *\n * Accepts an array of data objects. Each object represents one row.\n * The grid reads property values for each column's `field` from these objects.\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"employees()\" [gridConfig]=\"config\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rows = input<any[]>();\n\n /**\n * Column configuration array.\n *\n * Shorthand for setting columns without wrapping them in a full `gridConfig`.\n * If both `columns` and `gridConfig.columns` are set, `columns` takes precedence\n * (see configuration precedence system).\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"data\" [columns]=\"[\n * { field: 'id', header: 'ID', pinned: 'left', width: 80 },\n * { field: 'name', header: 'Name' },\n * { field: 'email', header: 'Email' }\n * ]\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columns = input<ColumnConfig<any>[]>();\n\n /**\n * Column sizing strategy.\n *\n * - `'stretch'` (default) — columns stretch to fill available width\n * - `'fixed'` — columns use their declared widths; enables horizontal scrolling\n * - `'auto-fit'` — columns auto-size to content, then stretch to fill\n *\n * @default 'stretch'\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"data\" fitMode=\"fixed\" />\n * <tbw-grid [rows]=\"data\" [fitMode]=\"dynamicMode()\" />\n * ```\n */\n fitMode = input<FitMode>();\n\n /**\n * Grid configuration object with optional Angular-specific extensions.\n *\n * Accepts Angular-augmented `GridConfig` from `@toolbox-web/grid-angular`.\n * You can specify Angular component classes directly for renderers and editors.\n *\n * Component classes must implement the appropriate interfaces:\n * - Renderers: `CellRenderer<TRow, TValue>` - requires `value()` and `row()` signal inputs\n * - Editors: `CellEditor<TRow, TValue>` - adds `commit` and `cancel` outputs\n *\n * @example\n * ```typescript\n * // Simple config with plain renderers\n * config: GridConfig = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'active', type: 'boolean' }\n * ],\n * typeDefaults: {\n * boolean: { renderer: (ctx) => ctx.value ? '✓' : '✗' }\n * }\n * };\n *\n * // Config with component classes\n * config: GridConfig<Employee> = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'bonus', header: 'Bonus', editable: true, editor: BonusEditorComponent }\n * ]\n * };\n * ```\n *\n * ```html\n * <tbw-grid [gridConfig]=\"config\" [rows]=\"employees\"></tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n gridConfig = input<GridConfig<any>>();\n\n // ═══════════════════════════════════════════════════════════════════════════\n // FEATURE INPUTS - Declarative plugin configuration\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Enable cell/row/range selection.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/selection';\n * ```\n *\n * @example\n * ```html\n * <!-- Shorthand - just the mode -->\n * <tbw-grid [selection]=\"'range'\" />\n *\n * <!-- Full config object -->\n * <tbw-grid [selection]=\"{ mode: 'range', checkbox: true }\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selection = input<'cell' | 'row' | 'range' | SelectionConfig<any>>();\n\n /**\n * Enable inline cell editing.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/editing';\n * ```\n *\n * @example\n * ```html\n * <!-- Enable with default trigger (dblclick) -->\n * <tbw-grid [editing]=\"true\" />\n *\n * <!-- Specify trigger -->\n * <tbw-grid [editing]=\"'click'\" />\n * <tbw-grid [editing]=\"'dblclick'\" />\n * <tbw-grid [editing]=\"'manual'\" />\n *\n * <!-- Full config with callbacks -->\n * <tbw-grid [editing]=\"{ editOn: 'dblclick', onBeforeEditClose: myCallback }\" />\n * ```\n */\n editing = input<boolean | 'click' | 'dblclick' | 'manual' | EditingConfig>();\n\n /**\n * Enable clipboard copy/paste. Requires selection to be enabled.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/clipboard';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [selection]=\"'range'\" [clipboard]=\"true\" />\n * ```\n */\n clipboard = input<boolean | ClipboardConfig>();\n\n /**\n * Enable right-click context menu.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/context-menu';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [contextMenu]=\"true\" />\n * ```\n */\n contextMenu = input<boolean | ContextMenuConfig>();\n\n /**\n * Enable multi-column sorting.\n *\n * Multi-sort allows users to sort by multiple columns simultaneously.\n * For basic single-column sorting, columns with `sortable: true` work without this plugin.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/multi-sort';\n * ```\n *\n * @example\n * ```html\n * <!-- Enable multi-column sorting -->\n * <tbw-grid [multiSort]=\"true\" />\n *\n * <!-- Limit to single column (uses plugin but restricts to 1 column) -->\n * <tbw-grid [multiSort]=\"'single'\" />\n *\n * <!-- Full config -->\n * <tbw-grid [multiSort]=\"{ maxSortColumns: 3 }\" />\n * ```\n */\n multiSort = input<boolean | 'single' | 'multi' | MultiSortConfig>();\n\n /**\n * Enable column filtering.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/filtering';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [filtering]=\"true\" />\n * <tbw-grid [filtering]=\"{ debounceMs: 200 }\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filtering = input<boolean | FilterConfig<any>>();\n\n /**\n * Enable column drag-to-reorder.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/reorder-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [reorderColumns]=\"true\" />\n * ```\n */\n reorderColumns = input<boolean | ReorderConfig>();\n\n /**\n * Enable column visibility toggle panel.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/visibility';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [visibility]=\"true\" />\n * ```\n */\n visibility = input<boolean | VisibilityConfig>();\n\n /**\n * Enable pinned/sticky columns.\n * Columns are pinned via the `sticky` column property.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pinned-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pinnedColumns]=\"true\" [columns]=\"[\n * { field: 'id', pinned: 'left' },\n * { field: 'name' },\n * { field: 'actions', pinned: 'right' }\n * ]\" />\n * ```\n */\n pinnedColumns = input<boolean>();\n\n /**\n * Enable multi-level column headers (column groups).\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/grouping-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [groupingColumns]=\"true\" />\n * ```\n */\n groupingColumns = input<boolean | GroupingColumnsConfig>();\n\n /**\n * Enable horizontal column virtualization for wide grids.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/column-virtualization';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [columnVirtualization]=\"true\" />\n * ```\n */\n columnVirtualization = input<boolean | ColumnVirtualizationConfig>();\n\n /**\n * Enable row drag-to-reorder.\n *\n * @deprecated Use `rowDragDrop` instead. `reorderRows` remains as an alias.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/reorder-rows';\n * ```\n */\n reorderRows = input<boolean | RowReorderConfig>();\n\n /**\n * Enable row drag-and-drop within and across grids.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/row-drag-drop';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [rowDragDrop]=\"{ dropZone: 'employees', operation: 'move' }\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragDrop = input<boolean | RowDragDropConfig<any>>();\n\n /**\n * Enable row grouping by field values.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/grouping-rows';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [groupingRows]=\"{ groupBy: ['department'] }\" />\n * ```\n */\n groupingRows = input<GroupingRowsConfig>();\n\n /**\n * Enable pinned rows (aggregation/status bar).\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pinned-rows';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pinnedRows]=\"{ bottom: [{ type: 'aggregation' }] }\" />\n * ```\n */\n pinnedRows = input<boolean | PinnedRowsConfig>();\n\n /**\n * Enable hierarchical tree view.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/tree';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [tree]=\"{ childrenField: 'children' }\" />\n * ```\n */\n tree = input<boolean | TreeConfig>();\n\n /**\n * Enable master-detail expandable rows.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/master-detail';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [masterDetail]=\"{ detailRenderer: detailFn }\" />\n * ```\n */\n masterDetail = input<MasterDetailConfig>();\n\n /**\n * Enable responsive card layout for narrow viewports.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/responsive';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [responsive]=\"{ breakpoint: 768 }\" />\n * ```\n */\n responsive = input<boolean | ResponsivePluginConfig>();\n\n /**\n * Enable undo/redo for cell edits. Requires editing to be enabled.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/undo-redo';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [editing]=\"'dblclick'\" [undoRedo]=\"true\" />\n * ```\n */\n undoRedo = input<boolean | UndoRedoConfig>();\n\n /**\n * Enable CSV/JSON export functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/export';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [export]=\"true\" />\n * <tbw-grid [export]=\"{ filename: 'data.csv' }\" />\n * ```\n */\n exportFeature = input<boolean | ExportConfig>(undefined, { alias: 'export' });\n\n /**\n * Enable print functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/print';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [print]=\"true\" />\n * ```\n */\n print = input<boolean | PrintConfig>();\n\n /**\n * Enable pivot table functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pivot';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pivot]=\"{ rowFields: ['category'], valueField: 'sales' }\" />\n * ```\n */\n pivot = input<PivotConfig>();\n\n /**\n * Enable server-side data operations.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/server-side';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [serverSide]=\"{ dataSource: fetchDataFn }\" />\n * ```\n */\n serverSide = input<ServerSideConfig>();\n\n /**\n * Controls the tooltip behavior for the grid.\n *\n * @example\n * ```html\n * <tbw-grid [tooltip]=\"true\" />\n * <tbw-grid [tooltip]=\"{ header: true, cell: false }\" />\n * ```\n */\n tooltip = input<boolean | TooltipConfig>();\n\n // ═══════════════════════════════════════════════════════════════════════════\n // EVENT OUTPUTS - All grid events\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Emitted when a cell is clicked.\n *\n * @example\n * ```html\n * <tbw-grid (cellClick)=\"onCellClick($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellClick = output<CellClickDetail<any>>();\n\n /**\n * Emitted when a row is clicked.\n *\n * @example\n * ```html\n * <tbw-grid (rowClick)=\"onRowClick($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowClick = output<RowClickDetail<any>>();\n\n /**\n * Emitted when a cell is activated (Enter key or double-click).\n *\n * @example\n * ```html\n * <tbw-grid (cellActivate)=\"onCellActivate($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellActivate = output<CellActivateDetail<any>>();\n\n /**\n * Emitted when a cell value changes (before commit).\n *\n * @example\n * ```html\n * <tbw-grid (cellChange)=\"onCellChange($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellChange = output<CellChangeDetail<any>>();\n\n /**\n * Emitted when a cell value is committed (inline editing).\n * Provides the row, field, new value, and change tracking information.\n *\n * @example\n * ```html\n * <tbw-grid (cellCommit)=\"onCellCommit($event)\">...</tbw-grid>\n * ```\n *\n * ```typescript\n * onCellCommit(event: CellCommitEvent) {\n * console.log(`Changed ${event.field} to ${event.value} in row ${event.rowIndex}`);\n * }\n * ```\n */\n cellCommit = output<CellCommitEvent>();\n\n /**\n * Emitted when a row's values are committed (bulk/row editing).\n * Provides the row data and change tracking information.\n *\n * @example\n * ```html\n * <tbw-grid (rowCommit)=\"onRowCommit($event)\">...</tbw-grid>\n * ```\n */\n rowCommit = output<RowCommitEvent>();\n\n /**\n * Emitted when the changed rows are reset.\n *\n * @example\n * ```html\n * <tbw-grid (changedRowsReset)=\"onChangedRowsReset($event)\">...</tbw-grid>\n * ```\n */\n changedRowsReset = output<ChangedRowsResetDetail>();\n\n /**\n * Emitted when sort state changes.\n *\n * @example\n * ```html\n * <tbw-grid (sortChange)=\"onSortChange($event)\">...</tbw-grid>\n * ```\n */\n sortChange = output<SortChangeDetail>();\n\n /**\n * Emitted when filter values change.\n *\n * @example\n * ```html\n * <tbw-grid (filterChange)=\"onFilterChange($event)\">...</tbw-grid>\n * ```\n */\n filterChange = output<FilterChangeDetail>();\n\n /**\n * Emitted when a column is resized.\n *\n * @example\n * ```html\n * <tbw-grid (columnResize)=\"onColumnResize($event)\">...</tbw-grid>\n * ```\n */\n columnResize = output<ColumnResizeDetail>();\n\n /**\n * Emitted when a column is moved via drag-and-drop.\n *\n * @example\n * ```html\n * <tbw-grid (columnMove)=\"onColumnMove($event)\">...</tbw-grid>\n * ```\n */\n columnMove = output<ColumnMoveDetail>();\n\n /**\n * Emitted when column visibility changes.\n *\n * @example\n * ```html\n * <tbw-grid (columnVisibility)=\"onColumnVisibility($event)\">...</tbw-grid>\n * ```\n */\n columnVisibility = output<ColumnVisibilityDetail>();\n\n /**\n * Emitted when column state changes (resize, reorder, visibility).\n *\n * @example\n * ```html\n * <tbw-grid (columnStateChange)=\"onColumnStateChange($event)\">...</tbw-grid>\n * ```\n */\n columnStateChange = output<GridColumnState>();\n\n /**\n * Emitted when selection changes.\n *\n * @example\n * ```html\n * <tbw-grid (selectionChange)=\"onSelectionChange($event)\">...</tbw-grid>\n * ```\n */\n selectionChange = output<SelectionChangeDetail>();\n\n /**\n * Emitted when a row is moved via drag-and-drop.\n *\n * @example\n * ```html\n * <tbw-grid (rowMove)=\"onRowMove($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowMove = output<RowMoveDetail<any>>();\n\n /**\n * Emitted when a row drag starts. Cancelable via `event.preventDefault()`.\n *\n * @example\n * ```html\n * <tbw-grid (rowDragStart)=\"onRowDragStart($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragStart = output<RowDragStartDetail<any>>();\n\n /**\n * Emitted when a row drag ends (after drop or cancel).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragEnd = output<RowDragEndDetail<any>>();\n\n /**\n * Emitted on the target grid when rows are dropped from another grid.\n * Cancelable via `event.preventDefault()`.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDrop = output<RowDropDetail<any>>();\n\n /**\n * Emitted on BOTH source and target grids after a successful cross-grid\n * row transfer.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowTransfer = output<RowTransferDetail<any>>();\n\n /**\n * Emitted when a group is expanded or collapsed.\n *\n * @example\n * ```html\n * <tbw-grid (groupToggle)=\"onGroupToggle($event)\">...</tbw-grid>\n * ```\n */\n groupToggle = output<GroupToggleDetail>();\n\n /**\n * Emitted when a tree node is expanded.\n *\n * @example\n * ```html\n * <tbw-grid (treeExpand)=\"onTreeExpand($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n treeExpand = output<TreeExpandDetail<any>>();\n\n /**\n * Emitted when a detail panel is expanded or collapsed.\n *\n * @example\n * ```html\n * <tbw-grid (detailExpand)=\"onDetailExpand($event)\">...</tbw-grid>\n * ```\n */\n detailExpand = output<DetailExpandDetail>();\n\n /**\n * Emitted when responsive mode changes (table ↔ card).\n *\n * @example\n * ```html\n * <tbw-grid (responsiveChange)=\"onResponsiveChange($event)\">...</tbw-grid>\n * ```\n */\n responsiveChange = output<ResponsiveChangeDetail>();\n\n /**\n * Emitted when cells are copied to clipboard.\n *\n * @example\n * ```html\n * <tbw-grid (copy)=\"onCopy($event)\">...</tbw-grid>\n * ```\n */\n copy = output<CopyDetail>();\n\n /**\n * Emitted when cells are pasted from clipboard.\n *\n * @example\n * ```html\n * <tbw-grid (paste)=\"onPaste($event)\">...</tbw-grid>\n * ```\n */\n paste = output<PasteDetail>();\n\n /**\n * Emitted when undo/redo is performed.\n *\n * @example\n * ```html\n * <tbw-grid (undoRedoAction)=\"onUndoRedo($event)\">...</tbw-grid>\n * ```\n */\n undoRedoAction = output<UndoRedoDetail>();\n\n /**\n * Emitted when export completes.\n *\n * @example\n * ```html\n * <tbw-grid (exportComplete)=\"onExportComplete($event)\">...</tbw-grid>\n * ```\n */\n exportComplete = output<ExportCompleteDetail>();\n\n /**\n * Emitted when print starts.\n *\n * @example\n * ```html\n * <tbw-grid (printStart)=\"onPrintStart($event)\">...</tbw-grid>\n * ```\n */\n printStart = output<PrintStartDetail>();\n\n /**\n * Emitted when print completes.\n *\n * @example\n * ```html\n * <tbw-grid (printComplete)=\"onPrintComplete($event)\">...</tbw-grid>\n * ```\n */\n printComplete = output<PrintCompleteDetail>();\n\n /**\n * Emitted (rAF-batched) when the grid's viewport is scrolled vertically.\n *\n * For server-side pagination of large datasets prefer `ServerSidePlugin`\n * — this event is the lower-level primitive for custom load-more triggers,\n * deferring heavy cell content, dismissing overlays, etc.\n *\n * Named `tbwScroll` (not `scroll`) to avoid collision with the native DOM\n * scroll event that bubbles from focusable internals.\n *\n * @example\n * ```html\n * <tbw-grid (tbwScroll)=\"onScroll($event)\">...</tbw-grid>\n * ```\n */\n tbwScroll = output<TbwScrollDetail>();\n\n // Map of output names to event names for automatic wiring\n private readonly eventOutputMap = {\n cellClick: 'cell-click',\n rowClick: 'row-click',\n cellActivate: 'cell-activate',\n cellChange: 'cell-change',\n cellCommit: 'cell-commit',\n rowCommit: 'row-commit',\n changedRowsReset: 'changed-rows-reset',\n sortChange: 'sort-change',\n filterChange: 'filter-change',\n columnResize: 'column-resize',\n columnMove: 'column-move',\n columnVisibility: 'column-visibility',\n columnStateChange: 'column-state-change',\n selectionChange: 'selection-change',\n rowMove: 'row-move',\n rowDragStart: 'row-drag-start',\n rowDragEnd: 'row-drag-end',\n rowDrop: 'row-drop',\n rowTransfer: 'row-transfer',\n groupToggle: 'group-toggle',\n treeExpand: 'tree-expand',\n detailExpand: 'detail-expand',\n responsiveChange: 'responsive-change',\n copy: 'copy',\n paste: 'paste',\n undoRedoAction: 'undo-redo',\n exportComplete: 'export-complete',\n printStart: 'print-start',\n printComplete: 'print-complete',\n tbwScroll: 'tbw-scroll',\n } as const;\n\n // Store event listeners for cleanup\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private eventListeners: Map<string, (e: Event) => void> = new Map();\n\n ngOnInit(): void {\n // Create and register the adapter\n this.adapter = new GridAdapter(this.injector, this.appRef, this.viewContainerRef);\n GridElementClass.registerAdapter(this.adapter);\n\n const grid = this.elementRef.nativeElement;\n\n // Register adapter on the grid element so processConfig is called\n // automatically by the grid's set gridConfig setter, and so\n // MasterDetailPlugin can use it via the __frameworkAdapter hook during attach()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (grid as any).__frameworkAdapter = this.adapter;\n\n // Wire up all event listeners based on eventOutputMap\n this.setupEventListeners(grid);\n }\n\n /**\n * Sets up event listeners for all outputs using the eventOutputMap.\n */\n private setupEventListeners(grid: GridElement): void {\n // Wire up all event listeners\n for (const [outputName, eventName] of Object.entries(this.eventOutputMap)) {\n const listener = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[outputName].emit(detail);\n };\n grid.addEventListener(eventName, listener);\n this.eventListeners.set(eventName, listener);\n }\n }\n\n /**\n * Creates plugins from feature inputs.\n * Uses the feature registry to allow tree-shaking - only imported features are bundled.\n * Returns the array of created plugins (doesn't modify grid).\n */\n private createFeaturePlugins(): unknown[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const plugins: unknown[] = [];\n\n // Helper to add plugin if feature is registered\n const addPlugin = (name: FeatureName, config: unknown) => {\n if (config === undefined || config === null || config === false) return;\n const plugin = createPluginFromFeature(name, config);\n if (plugin) plugins.push(plugin);\n };\n\n // Add plugins for each feature input\n addPlugin('selection', this.selection());\n addPlugin('editing', this.editing());\n addPlugin('clipboard', this.clipboard());\n addPlugin('contextMenu', this.contextMenu());\n // multiSort is the primary input\n addPlugin('multiSort', this.multiSort());\n addPlugin('filtering', this.filtering());\n addPlugin('reorderColumns', this.reorderColumns());\n addPlugin('visibility', this.visibility());\n addPlugin('pinnedColumns', this.pinnedColumns());\n\n // Pre-process groupingColumns config to bridge Angular component classes\n const gcConfig = this.groupingColumns();\n if (gcConfig && typeof gcConfig === 'object' && this.adapter) {\n addPlugin('groupingColumns', this.adapter.processGroupingColumnsConfig(gcConfig as GroupingColumnsConfig));\n } else {\n addPlugin('groupingColumns', gcConfig);\n }\n\n addPlugin('columnVirtualization', this.columnVirtualization());\n addPlugin('reorderRows', this.reorderRows());\n addPlugin('rowDragDrop', this.rowDragDrop());\n // Pre-process groupingRows config to bridge Angular component classes\n const grConfig = this.groupingRows();\n if (grConfig && typeof grConfig === 'object' && this.adapter) {\n addPlugin('groupingRows', this.adapter.processGroupingRowsConfig(grConfig as GroupingRowsConfig));\n } else {\n addPlugin('groupingRows', grConfig);\n }\n // Pre-process pinnedRows config to bridge Angular component classes in customPanels\n const prConfig = this.pinnedRows();\n if (prConfig && typeof prConfig === 'object' && this.adapter) {\n addPlugin('pinnedRows', this.adapter.processPinnedRowsConfig(prConfig as PinnedRowsConfig));\n } else {\n addPlugin('pinnedRows', prConfig);\n }\n addPlugin('tree', this.tree());\n addPlugin('masterDetail', this.masterDetail());\n addPlugin('responsive', this.responsive());\n addPlugin('undoRedo', this.undoRedo());\n addPlugin('export', this.exportFeature());\n addPlugin('print', this.print());\n addPlugin('pivot', this.pivot());\n addPlugin('serverSide', this.serverSide());\n addPlugin('tooltip', this.tooltip());\n\n return plugins;\n }\n\n ngAfterContentInit(): void {\n // After Angular child directives have initialized (GridColumnView, GridColumnEditor, GridDetailView, GridToolPanel),\n // force the grid to re-parse light DOM columns so adapters can create renderers/editors\n const grid = this.elementRef.nativeElement;\n if (grid && typeof (grid as any).refreshColumns === 'function') {\n // Use setTimeout to ensure Angular effects have run (template registration)\n setTimeout(() => {\n (grid as any).refreshColumns();\n\n // Configure MasterDetailPlugin after Angular templates are registered\n this.configureMasterDetail(grid);\n\n // Configure ResponsivePlugin card renderer if template is present\n this.configureResponsiveCard(grid);\n\n // Refresh shell header to pick up tool panel templates\n // This allows Angular templates to be used in tool panels\n if (typeof (grid as any).refreshShellHeader === 'function') {\n (grid as any).refreshShellHeader();\n }\n\n // Register custom styles if provided\n this.registerCustomStyles(grid);\n }, 0);\n }\n }\n\n /**\n * Registers custom styles into the grid.\n * Uses the grid's registerStyles() API for clean encapsulation.\n */\n private registerCustomStyles(grid: GridElement): void {\n const styles = this.customStyles();\n if (!styles) return;\n\n // Wait for grid to be ready before registering styles\n grid.ready?.().then(() => {\n grid.registerStyles?.('angular-custom-styles', styles);\n });\n }\n\n /**\n * Configures the MasterDetailPlugin after Angular templates are registered.\n * - If plugin exists: refresh its detail renderer\n * - If plugin doesn't exist but <tbw-grid-detail> is present: dynamically import and add the plugin\n */\n private async configureMasterDetail(grid: GridElement): Promise<void> {\n if (!this.adapter) return;\n\n // Check for existing plugin by name to avoid importing the class\n const existingPlugin = grid.gridConfig?.plugins?.find((p) => (p as { name?: string }).name === 'masterDetail') as\n | MasterDetailPlugin\n | undefined;\n\n if (existingPlugin && typeof existingPlugin.refreshDetailRenderer === 'function') {\n // Plugin exists - just refresh the renderer to pick up Angular templates\n existingPlugin.refreshDetailRenderer();\n return;\n }\n\n // Check if <tbw-grid-detail> is present in light DOM\n const detailElement = grid.querySelector('tbw-grid-detail');\n if (!detailElement) return;\n\n // Create detail renderer from Angular template\n const detailRenderer = this.adapter.createDetailRenderer(grid);\n if (!detailRenderer) return;\n\n // Parse configuration from attributes\n const animationAttr = detailElement.getAttribute('animation');\n let animation: 'slide' | 'fade' | false = 'slide';\n if (animationAttr === 'false') {\n animation = false;\n } else if (animationAttr === 'fade') {\n animation = 'fade';\n }\n\n const showExpandColumn = detailElement.getAttribute('showExpandColumn') !== 'false';\n\n // Dynamically import the plugin to avoid bundling it when not used\n const { MasterDetailPlugin } = await import('@toolbox-web/grid/plugins/master-detail');\n\n // Create and add the plugin\n const plugin = new MasterDetailPlugin({\n detailRenderer: detailRenderer,\n showExpandColumn,\n animation,\n });\n\n const currentConfig = grid.gridConfig || {};\n const existingPlugins = currentConfig.plugins || [];\n grid.gridConfig = {\n ...currentConfig,\n plugins: [...existingPlugins, plugin],\n };\n }\n\n /**\n * Configures the ResponsivePlugin with Angular template-based card renderer.\n * - If plugin exists: updates its cardRenderer configuration\n * - If plugin doesn't exist but <tbw-grid-responsive-card> is present: logs a warning\n */\n private configureResponsiveCard(grid: GridElement): void {\n if (!this.adapter) return;\n\n // Check if <tbw-grid-responsive-card> is present in light DOM\n const cardElement = grid.querySelector('tbw-grid-responsive-card');\n if (!cardElement) return;\n\n // Create card renderer from Angular template\n const cardRenderer = this.adapter.createResponsiveCardRenderer(grid);\n if (!cardRenderer) return;\n\n // Find existing plugin by name to avoid importing the class\n const existingPlugin = grid.gridConfig?.plugins?.find((p) => (p as { name?: string }).name === 'responsive') as\n | ResponsivePlugin\n | undefined;\n\n if (existingPlugin && typeof existingPlugin.setCardRenderer === 'function') {\n // Plugin exists - update its cardRenderer\n existingPlugin.setCardRenderer(cardRenderer);\n return;\n }\n\n // Plugin doesn't exist - log a warning\n console.warn(\n '[tbw-grid-angular] <tbw-grid-responsive-card> found but ResponsivePlugin is not configured.\\n' +\n 'Add ResponsivePlugin to your gridConfig.plugins array:\\n\\n' +\n ' import { ResponsivePlugin } from \"@toolbox-web/grid/plugins/responsive\";\\n' +\n ' gridConfig = {\\n' +\n ' plugins: [new ResponsivePlugin({ breakpoint: 600 })]\\n' +\n ' };',\n );\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n\n // Cleanup all event listeners\n if (grid) {\n for (const [eventName, listener] of this.eventListeners) {\n grid.removeEventListener(eventName, listener);\n }\n this.eventListeners.clear();\n }\n\n // Cleanup custom styles\n if (grid && this.customStyles()) {\n grid.unregisterStyles?.('angular-custom-styles');\n }\n\n // Cleanup adapter if needed\n if (this.adapter) {\n this.adapter.destroy?.();\n this.adapter = null;\n }\n }\n}\n","/**\n * @packageDocumentation\n * @toolbox-web/grid-angular - Angular adapter for @toolbox-web/grid.\n *\n * Provides directives for seamless Angular integration with the grid component.\n */\n\n// Primary export\nexport { GridAdapter } from './lib/angular-grid-adapter';\n\n// Configuration types\nexport { isComponentClass } from './lib/angular-column-config';\nexport type {\n CellEditor,\n CellRenderer,\n ColumnConfig,\n FilterPanel,\n GridConfig,\n TypeDefault,\n} from './lib/angular-column-config';\n\n// Type registry for application-wide type defaults\nexport { GRID_TYPE_DEFAULTS, GridTypeRegistry, provideGridTypeDefaults } from './lib/grid-type-registry';\nexport type { TypeDefaultRegistration } from './lib/grid-type-registry';\n\n// Icon registry for application-wide icon overrides\nexport { GRID_ICONS, GridIconRegistry, provideGridIcons } from './lib/grid-icon-registry';\n\n// Inject function for programmatic grid access\nexport { injectGrid } from './lib/inject-grid';\nexport type { InjectGridReturn } from './lib/inject-grid';\n\n// Feature registry for tree-shakeable plugin registration\nexport {\n clearFeatureRegistry,\n createPluginFromFeature,\n getFeatureFactory,\n getRegisteredFeatures,\n isFeatureRegistered,\n registerFeature,\n} from './lib/feature-registry';\nexport type { FeatureName, PluginFactory } from './lib/feature-registry';\n\n// Base classes for editors and filter panels\nexport { BaseFilterPanel } from './lib/base-filter-panel';\nexport { BaseGridEditor } from './lib/base-grid-editor';\nexport { BaseGridEditorCVA } from './lib/base-grid-editor-cva';\nexport { BaseOverlayEditor } from './lib/base-overlay-editor';\nexport type { OverlayPosition } from './lib/base-overlay-editor';\nexport { GridColumnEditor } from './lib/directives/grid-column-editor.directive';\nexport type { GridEditorContext } from './lib/directives/grid-column-editor.directive';\nexport { GridColumnView } from './lib/directives/grid-column-view.directive';\nexport type { GridCellContext } from './lib/directives/grid-column-view.directive';\nexport { TbwGridColumn } from './lib/directives/grid-column.directive';\nexport { GridDetailView } from './lib/directives/grid-detail-view.directive';\nexport type { GridDetailContext } from './lib/directives/grid-detail-view.directive';\nexport { getFormArrayContext, GridFormArray } from './lib/directives/grid-form-array.directive';\nexport type { FormArrayContext } from './lib/directives/grid-form-array.directive';\nexport { TbwGridHeader } from './lib/directives/grid-header.directive';\nexport { getLazyFormContext, GridLazyForm } from './lib/directives/grid-lazy-form.directive';\nexport type { LazyFormFactory, RowFormChangeEvent } from './lib/directives/grid-lazy-form.directive';\nexport { GridResponsiveCard } from './lib/directives/grid-responsive-card.directive';\nexport type { GridResponsiveCardContext } from './lib/directives/grid-responsive-card.directive';\nexport { TbwGridToolButtons } from './lib/directives/grid-tool-buttons.directive';\nexport { GridToolPanel } from './lib/directives/grid-tool-panel.directive';\nexport type { GridToolPanelContext } from './lib/directives/grid-tool-panel.directive';\nexport { Grid } from './lib/directives/grid.directive';\nexport type { CellCommitEvent, RowCommitEvent } from './lib/directives/grid.directive';\n\n// Structural directives for cleaner template syntax\nexport { TbwEditor, TbwRenderer } from './lib/directives/structural-directives';\nexport type { StructuralCellContext, StructuralEditorContext } from './lib/directives/structural-directives';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["FORM_ARRAY_CONTEXT","GridElementClass"],"mappings":"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"}
1
+ {"version":3,"file":"toolbox-web-grid-angular.mjs","sources":["../../../../libs/grid-angular/src/lib/angular-column-config.ts","../../../../libs/grid-angular/src/lib/directives/grid-column-editor.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-column-view.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-form-array.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-tool-panel.directive.ts","../../../../libs/grid-angular/src/lib/directives/structural-directives.ts","../../../../libs/grid-angular/src/lib/editor-mount-hooks.ts","../../../../libs/grid-angular/src/lib/editor-wiring.ts","../../../../libs/grid-angular/src/lib/grid-type-registry.ts","../../../../libs/grid-angular/src/lib/internal/feature-bridges.ts","../../../../libs/grid-angular/src/lib/internal/feature-extensions.ts","../../../../libs/grid-angular/src/lib/angular-grid-adapter.ts","../../../../libs/grid-angular/src/lib/grid-icon-registry.ts","../../../../libs/grid-angular/src/lib/inject-grid.ts","../../../../libs/grid-angular/src/lib/feature-registry.ts","../../../../libs/grid-angular/src/lib/base-filter-panel.ts","../../../../libs/grid-angular/src/lib/base-grid-editor.ts","../../../../libs/grid-angular/src/lib/base-grid-editor-cva.ts","../../../../libs/grid-angular/src/lib/base-overlay-editor.ts","../../../../libs/grid-angular/src/lib/directives/grid-column.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-detail-view.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-header.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-lazy-form.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-responsive-card.directive.ts","../../../../libs/grid-angular/src/lib/directives/grid-tool-buttons.directive.ts","../../../../libs/grid-angular/src/lib/column-shorthand.ts","../../../../libs/grid-angular/src/lib/internal/feature-claims.ts","../../../../libs/grid-angular/src/lib/directives/grid.directive.ts","../../../../libs/grid-angular/src/lib/grid-provider.ts","../../../../libs/grid-angular/src/index.ts","../../../../libs/grid-angular/src/toolbox-web-grid-angular.ts"],"sourcesContent":["/**\n * Angular-specific column configuration types.\n *\n * These types extend the base grid column config to allow Angular component\n * classes to be used directly as renderers and editors.\n */\nimport type { Type } from '@angular/core';\nimport type { ColumnConfig as BaseColumnConfig, GridConfig as BaseGridConfig } from '@toolbox-web/grid';\nimport type { FilterPanelParams, FilterPanelRenderer } from '@toolbox-web/grid/plugins/filtering';\n\n// #region CellRenderer Interface\n/**\n * Interface for cell renderer components.\n *\n * Renderer components receive the cell value, row data, and column config as inputs.\n * Use Angular signal inputs for reactive updates.\n *\n * @example\n * ```typescript\n * import { Component, input } from '@angular/core';\n * import type { CellRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-status-badge',\n * template: `<span [class]=\"'badge-' + value()\">{{ value() }}</span>`\n * })\n * export class StatusBadgeComponent implements CellRenderer<Employee, string> {\n * value = input.required<string>();\n * row = input.required<Employee>();\n * column = input<unknown>();\n * }\n * ```\n * @since 0.11.0\n */\nexport interface CellRenderer<TRow = unknown, TValue = unknown> {\n /** The cell value - use `input<TValue>()` or `input.required<TValue>()` */\n value: { (): TValue | undefined };\n /** The full row data - use `input<TRow>()` or `input.required<TRow>()` */\n row: { (): TRow | undefined };\n /** The column configuration (optional) - use `input<unknown>()` */\n column?: { (): unknown };\n}\n\n// #endregion\n\n// #region CellEditor Interface\n/**\n * Interface for cell editor components.\n *\n * Editor components receive the cell value, row data, and column config as inputs,\n * plus must emit `commit` and `cancel` outputs.\n *\n * @example\n * ```typescript\n * import { Component, input, output } from '@angular/core';\n * import type { CellEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-status-editor',\n * template: `\n * <select [value]=\"value()\" (change)=\"commit.emit($any($event.target).value)\">\n * <option value=\"active\">Active</option>\n * <option value=\"inactive\">Inactive</option>\n * </select>\n * `\n * })\n * export class StatusEditorComponent implements CellEditor<Employee, string> {\n * value = input.required<string>();\n * row = input.required<Employee>();\n * column = input<unknown>();\n * commit = output<string>();\n * cancel = output<void>();\n * }\n * ```\n * @since 0.11.0\n */\nexport interface CellEditor<TRow = unknown, TValue = unknown> extends CellRenderer<TRow, TValue> {\n /** Emit to commit the new value - use `output<TValue>()` */\n commit: { emit(value: TValue): void; subscribe?(fn: (value: TValue) => void): { unsubscribe(): void } };\n /** Emit to cancel editing - use `output<void>()` */\n cancel: { emit(): void; subscribe?(fn: () => void): { unsubscribe(): void } };\n}\n\n// #endregion\n\n// #region FilterPanel Interface\n/**\n * Interface for filter panel components.\n *\n * Filter panel components receive the full `FilterPanelParams` as a single input,\n * providing access to field info, unique values, and filter action methods.\n *\n * @example\n * ```typescript\n * import { Component, input } from '@angular/core';\n * import type { FilterPanel } from '@toolbox-web/grid-angular';\n * import type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\n *\n * @Component({\n * selector: 'app-custom-filter',\n * template: `\n * <div>\n * <input (input)=\"onSearch($event)\" />\n * <button (click)=\"params().clearFilter()\">Clear</button>\n * </div>\n * `\n * })\n * export class CustomFilterComponent implements FilterPanel {\n * params = input.required<FilterPanelParams>();\n * }\n * ```\n * @since 0.12.0\n */\nexport interface FilterPanel {\n /** The filter panel parameters — use `input.required<FilterPanelParams>()` */\n params: { (): FilterPanelParams };\n}\n// #endregion\n\n// #region TypeDefault Interface\n/**\n * Type default configuration.\n *\n * Allows Angular component classes for renderers and editors in typeDefaults.\n *\n * @example\n * ```typescript\n * import type { GridConfig, TypeDefault } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * typeDefaults: {\n * boolean: {\n * renderer: (ctx) => { ... }, // vanilla JS renderer\n * editor: CheckboxEditorComponent, // Angular component\n * },\n * date: {\n * editor: DatePickerComponent, // Angular component\n * }\n * }\n * };\n * ```\n * @since 0.10.0\n */\nexport interface TypeDefault<TRow = unknown> {\n /** Format function for cell display */\n format?: (value: unknown, row: TRow) => string;\n /** Cell renderer - can be vanilla JS function or Angular component */\n renderer?: BaseColumnConfig<TRow>['renderer'] | Type<CellRenderer<TRow, unknown>>;\n /** Cell editor - can be vanilla JS function or Angular component */\n editor?: BaseColumnConfig<TRow>['editor'] | Type<CellEditor<TRow, unknown>>;\n /** Default editor parameters */\n editorParams?: Record<string, unknown>;\n /**\n * Custom filter panel renderer for this type. Requires FilteringPlugin.\n *\n * Can be:\n * - A vanilla `FilterPanelRenderer` function `(container, params) => void`\n * - An Angular component class implementing `FilterPanel`\n *\n * @example Using an Angular component\n * ```typescript\n * typeDefaults: {\n * date: {\n * filterPanelRenderer: DateFilterPanelComponent,\n * }\n * }\n * ```\n */\n filterPanelRenderer?: FilterPanelRenderer | Type<FilterPanel>;\n}\n\n// #endregion\n\n// #region ColumnConfig Interface\n/**\n * Column configuration for Angular applications.\n *\n * Extends the base ColumnConfig to allow Angular component classes\n * to be used directly as renderers and editors.\n *\n * @example\n * ```typescript\n * import type { ColumnConfig } from '@toolbox-web/grid-angular';\n * import { StatusBadgeComponent, StatusEditorComponent } from './components';\n *\n * const columns: ColumnConfig<Employee>[] = [\n * { field: 'name', header: 'Name' },\n * {\n * field: 'status',\n * header: 'Status',\n * editable: true,\n * renderer: StatusBadgeComponent,\n * editor: StatusEditorComponent,\n * },\n * ];\n * ```\n * @since 0.3.0\n */\nexport interface ColumnConfig<TRow = unknown> extends Omit<\n BaseColumnConfig<TRow>,\n 'renderer' | 'editor' | 'headerRenderer' | 'headerLabelRenderer'\n> {\n /**\n * Cell renderer - can be:\n * - A function `(ctx) => HTMLElement | string`\n * - An Angular component class implementing CellRenderer\n */\n renderer?: BaseColumnConfig<TRow>['renderer'] | Type<CellRenderer<TRow, unknown>>;\n\n /**\n * Cell editor - can be:\n * - A function `(ctx) => HTMLElement`\n * - An Angular component class implementing CellEditor\n */\n editor?: BaseColumnConfig<TRow>['editor'] | Type<CellEditor<TRow, unknown>>;\n\n /**\n * Header cell renderer - can be:\n * - A function `(ctx: HeaderCellContext) => Node | string | void | null`\n * - An Angular component class with column, value, sortState, filterActive, renderSortIcon, renderFilterButton inputs\n */\n headerRenderer?: BaseColumnConfig<TRow>['headerRenderer'] | Type<unknown>;\n\n /**\n * Header label renderer - can be:\n * - A function `(ctx: HeaderLabelContext) => Node | string | void | null`\n * - An Angular component class with column and value inputs\n */\n headerLabelRenderer?: BaseColumnConfig<TRow>['headerLabelRenderer'] | Type<unknown>;\n}\n\n// #endregion\n\n// #region GridConfig Interface\n/**\n * Grid configuration for Angular applications.\n *\n * Extends the base GridConfig to use Angular-augmented ColumnConfig and TypeDefault.\n * This allows component classes as renderers/editors.\n *\n * @example\n * ```typescript\n * import type { GridConfig, ColumnConfig } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * columns: [...],\n * plugins: [...],\n * };\n * ```\n * @since 0.3.0\n */\nexport interface GridConfig<TRow = unknown> extends Omit<\n BaseGridConfig<TRow>,\n 'columns' | 'typeDefaults' | 'loadingRenderer'\n> {\n columns?: ColumnConfig<TRow>[];\n /** Type-level defaults that can use Angular component classes */\n typeDefaults?: Record<string, TypeDefault<TRow>>;\n /**\n * Custom loading renderer - can be:\n * - A function `(ctx: LoadingContext) => HTMLElement | string`\n * - An Angular component class with a `size` input\n */\n loadingRenderer?: BaseGridConfig<TRow>['loadingRenderer'] | Type<unknown>;\n}\n\n// #endregion\n\n// #region Utilities\n/**\n * Type guard to check if a value is an Angular component class.\n *\n * Detects Angular components by checking for internal Angular markers:\n * - ɵcmp (component definition)\n * - ɵfac (factory function)\n *\n * Also checks if it's an ES6 class (vs function) by inspecting the\n * string representation.\n * @since 0.3.0\n */\nexport function isComponentClass(value: unknown): value is Type<unknown> {\n if (typeof value !== 'function' || value.prototype === undefined) {\n return false;\n }\n\n // Check for Angular component markers (AOT compiled)\n if (Object.prototype.hasOwnProperty.call(value, 'ɵcmp') || Object.prototype.hasOwnProperty.call(value, 'ɵfac')) {\n return true;\n }\n\n // Check if it's an ES6 class (vs regular function)\n // Class definitions start with \"class\" in their toString()\n const fnString = Function.prototype.toString.call(value);\n return fnString.startsWith('class ') || fnString.startsWith('class{');\n}\n// #endregion\n","import { contentChild, Directive, effect, ElementRef, inject, TemplateRef } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\n\n/**\n * Context object passed to the cell editor template.\n * Contains the cell value, row data, column configuration, and commit/cancel functions.\n * @since 0.1.0\n */\nexport interface GridEditorContext<TValue = unknown, TRow = unknown> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** Field name being edited */\n field: string;\n /** The column configuration */\n column: unknown;\n /** Stable row identifier (from `getRowId`). Empty string if no `getRowId` is configured. */\n rowId: string;\n /**\n * Callback function to commit the edited value.\n * Use with Angular event binding: `(commit)=\"onCommit($event)\"`\n */\n onCommit: (value: TValue) => void;\n /**\n * Callback function to cancel editing.\n * Use with Angular event binding: `(cancel)=\"onCancel()\"`\n */\n onCancel: () => void;\n /**\n * Update other fields in this row while the editor is open.\n * Changes trigger `cell-change` events with source `'cascade'`.\n */\n updateRow: (changes: Partial<TRow>) => void;\n /**\n * Register a callback to receive value updates when the cell is modified\n * externally (e.g., via `updateRow()` from another cell's commit).\n *\n * The framework adapter auto-patches `value`/`$implicit` for template editors,\n * but custom components may use this for additional reactivity.\n */\n onValueChange?: (callback: (newValue: TValue) => void) => void;\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray with FormGroups.\n *\n * This allows custom editors to bind directly to the control for validation display:\n * ```html\n * <input *tbwEditor=\"let value; control as ctrl\"\n * [formControl]=\"ctrl\"\n * [class.is-invalid]=\"ctrl?.invalid && ctrl?.touched\" />\n * ```\n *\n * Returns `undefined` if:\n * - The grid is not bound to a FormArray\n * - The FormArray doesn't contain FormGroups\n * - The field doesn't exist in the FormGroup\n */\n control?: AbstractControl;\n}\n\n// Global registry mapping DOM elements to their templates\nconst editorTemplateRegistry = new Map<HTMLElement, TemplateRef<GridEditorContext>>();\n\n/**\n * Gets the editor template registered for a given element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getEditorTemplate(element: HTMLElement): TemplateRef<GridEditorContext> | undefined {\n return editorTemplateRegistry.get(element);\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a cell editor.\n *\n * This enables declarative Angular component usage with proper input bindings\n * that satisfy Angular's AOT compiler.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid-column field=\"status\" editable>\n * <tbw-grid-column-editor>\n * <ng-template let-value let-row=\"row\" let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-select\n * [value]=\"value\"\n * [row]=\"row\"\n * (commit)=\"onCommit($event)\"\n * (cancel)=\"onCancel()\"\n * />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n * - `onCommit`: Callback function to commit the new value\n * - `onCancel`: Callback function to cancel editing\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridColumnEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridColumnEditor],\n * // ...\n * })\n * ```\n *\n * @category Directive\n *\n * MOVE-IN-V2: this directive (and its companion `GridEditorContext` type and\n * `getEditorTemplate` helper) will physically move into\n * `@toolbox-web/grid-angular/features/editing` in v2.0.0; the deprecated\n * re-exports from the main `@toolbox-web/grid-angular` entry will be removed\n * at the same time. Consumers should already be importing from the feature\n * entry.\n * @since 0.1.0\n */\n@Directive({ selector: 'tbw-grid-column-editor' })\nexport class GridColumnEditor {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridEditorContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n editorTemplateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridColumnEditor, ctx: unknown): ctx is GridEditorContext {\n return true;\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the cell renderer template.\n * Contains the cell value, row data, and column configuration.\n * @since 0.1.0\n */\nexport interface GridCellContext<TValue = unknown, TRow = unknown> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n column: unknown;\n}\n\n// Global registry mapping DOM elements to their templates\nconst templateRegistry = new Map<HTMLElement, TemplateRef<GridCellContext>>();\n\n/**\n * Gets the template registered for a given element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getViewTemplate(element: HTMLElement): TemplateRef<GridCellContext> | undefined {\n return templateRegistry.get(element);\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a cell renderer.\n *\n * This enables declarative Angular component usage with proper input bindings\n * that satisfy Angular's AOT compiler.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" [row]=\"row\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * </tbw-grid-column>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridColumnView } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridColumnView],\n * // ...\n * })\n * ```\n *\n * @category Directive\n * @since 0.1.0\n */\n@Directive({ selector: 'tbw-grid-column-view' })\nexport class GridColumnView {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridCellContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n templateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridColumnView, ctx: unknown): ctx is GridCellContext {\n return true;\n }\n}\n","import { DestroyRef, Directive, effect, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\nimport type { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, startWith } from 'rxjs/operators';\n\n/**\n * Interface for EditingPlugin validation methods.\n * We use a minimal interface to avoid importing the full EditingPlugin class.\n */\ninterface EditingPluginValidation {\n setInvalid(rowId: string, field: string, message?: string): void;\n clearInvalid(rowId: string, field: string): void;\n clearRowInvalid(rowId: string): void;\n}\n\n/**\n * Interface for EditingPlugin config to check mode.\n */\ninterface EditingPluginConfig {\n config?: { mode?: 'row' | 'grid' };\n}\n\n/**\n * Context provided to the grid containing form-related information.\n * This can be accessed by other directives to get form controls.\n * @since 0.5.0\n */\nexport interface FormArrayContext {\n /** Get the row data at a specific index */\n getRow<T = unknown>(rowIndex: number): T | null;\n /** Update a field value at a specific row */\n updateField(rowIndex: number, field: string, value: unknown): void;\n /** Get the current form value (all rows) */\n getValue<T = unknown>(): T[];\n /**\n * Get the FormControl for a specific cell.\n * Only available when using FormArray with FormGroup rows.\n *\n * @param rowIndex - The row index\n * @param field - The field name\n * @returns The AbstractControl for the cell, or undefined if not available\n */\n getControl(rowIndex: number, field: string): AbstractControl | undefined;\n /**\n * Whether the grid is backed by a FormArray of FormGroups.\n * When true, `getControl()` will return cell-level controls.\n */\n hasFormGroups: boolean;\n /**\n * Get the FormGroup for a specific row.\n * Only available when using FormArray with FormGroup rows.\n *\n * @param rowIndex - The row index\n * @returns The FormGroup for the row, or undefined if not available\n */\n getRowFormGroup(rowIndex: number): FormGroup | undefined;\n /**\n * Check if a row is valid (all controls in the FormGroup are valid).\n * Returns true if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if the row is valid, false if any control is invalid\n */\n isRowValid(rowIndex: number): boolean;\n /**\n * Check if a row has been touched (any control in the FormGroup is touched).\n * Returns false if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if any control in the row is touched\n */\n isRowTouched(rowIndex: number): boolean;\n /**\n * Check if a row is dirty (any control in the FormGroup is dirty).\n * Returns false if not using FormArray or if the row doesn't exist.\n *\n * @param rowIndex - The row index\n * @returns true if any control in the row is dirty\n */\n isRowDirty(rowIndex: number): boolean;\n /**\n * Get validation errors for a specific row.\n * Aggregates errors from all controls in the FormGroup.\n *\n * @param rowIndex - The row index\n * @returns Object with field names as keys and their errors, or null if no errors\n */\n getRowErrors(rowIndex: number): Record<string, unknown> | null;\n}\n\n// Symbol for storing form context on the grid element\nconst FORM_ARRAY_CONTEXT = Symbol('formArrayContext');\n\n/**\n * Gets the FormArrayContext from a grid element, if present.\n * @internal\n * @since 0.5.0\n */\nexport function getFormArrayContext(gridElement: HTMLElement): FormArrayContext | undefined {\n return (gridElement as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n}\n\n/**\n * Directive that binds a FormArray directly to the grid.\n *\n * This is the recommended way to integrate tbw-grid with Angular Reactive Forms.\n * Use a FormArray of FormGroups for row-level validation and cell-level control access.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, inject } from '@angular/core';\n * import { FormBuilder, ReactiveFormsModule } from '@angular/forms';\n * import { Grid, GridFormArray } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, GridFormArray, ReactiveFormsModule],\n * template: \\`\n * <form [formGroup]=\"form\">\n * <tbw-grid [formArray]=\"form.controls.rows\" [columns]=\"columns\" />\n * </form>\n * \\`\n * })\n * export class MyComponent {\n * private fb = inject(FormBuilder);\n *\n * form = this.fb.group({\n * rows: this.fb.array([\n * this.fb.group({ name: 'Alice', age: 30 }),\n * this.fb.group({ name: 'Bob', age: 25 }),\n * ])\n * });\n *\n * columns = [\n * { field: 'name', header: 'Name', editable: true },\n * { field: 'age', header: 'Age', editable: true }\n * ];\n * }\n * ```\n *\n * ## How It Works\n *\n * - **FormArray → Grid**: The grid displays the FormArray's value as rows\n * - **Grid → FormArray**: When a cell is edited, the corresponding FormControl is updated\n * - FormArrayContext is available for accessing cell-level controls\n *\n * ## Features\n *\n * - Works naturally with FormArray inside a FormGroup\n * - Provides cell-level FormControl access for validation\n * - Supports row-level validation state aggregation\n * - Automatically syncs FormArray changes to the grid\n *\n * @example\n * ```html\n * <form [formGroup]=\"form\">\n * <tbw-grid [formArray]=\"form.controls.rows\" [columns]=\"columns\" />\n * </form>\n * ```\n *\n * @category Directive\n *\n * MOVE-IN-V2: this directive (and its `FormArrayContext` type and\n * `getFormArrayContext` helper) will physically move into\n * `@toolbox-web/grid-angular/features/editing` in v2.0.0; the deprecated\n * re-exports from the main `@toolbox-web/grid-angular` entry will be removed\n * at the same time. Consumers should already be importing from the feature\n * entry.\n * @since 0.5.0\n */\n@Directive({\n selector: 'tbw-grid[formArray]',\n})\nexport class GridFormArray implements OnInit, OnDestroy {\n private readonly destroyRef = inject(DestroyRef);\n private elementRef = inject(ElementRef<GridElement>);\n private cellCommitUnsub: (() => void) | null = null;\n private cellCancelUnsub: (() => void) | null = null;\n private rowCommitUnsub: (() => void) | null = null;\n private touchListener: ((e: Event) => void) | null = null;\n private valueChangesSubscription: Subscription | null = null;\n private statusChangesSubscriptions: Subscription[] = [];\n\n /**\n * The FormArray to bind to the grid.\n */\n readonly formArray = input.required<FormArray>();\n\n /**\n * Whether to automatically sync Angular validation state to grid's visual invalid styling.\n *\n * When enabled:\n * - After a cell commit, if the FormControl is invalid, the cell is marked with `setInvalid()`\n * - When a FormControl becomes valid, `clearInvalid()` is called\n * - On `row-commit`, if the row's FormGroup has invalid controls, the commit is prevented\n * - In grid mode: validation state is synced on initial render and updated reactively\n *\n * @default true\n */\n readonly syncValidation = input<boolean>(true);\n\n /**\n * Effect that sets up valueChanges subscription when FormArray changes.\n * This handles both initial binding and when the FormArray reference changes.\n */\n private syncFormArrayToGrid = effect(() => {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid || !formArray) return;\n\n // Unsubscribe from previous FormArray if any\n this.valueChangesSubscription?.unsubscribe();\n\n // Subscribe to valueChanges to sync grid rows when FormArray content changes.\n // Use startWith to immediately sync the current value.\n // Note: We use getRawValue() to include disabled controls.\n //\n // In grid mode, editors bind directly to FormControls, so every keystroke\n // fires valueChanges. We skip the sync when an editor input is focused to\n // prevent destroying/recreating editors mid-edit (which orphans overlays\n // like mat-autocomplete/mat-select panels and causes focus loss).\n this.valueChangesSubscription = formArray.valueChanges\n .pipe(startWith(formArray.getRawValue()), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n // Skip sync while an editor is actively focused in the grid.\n // The FormArray already has the latest values via its own controls;\n // re-setting grid.rows would create new object references and trigger\n // an unnecessary render cycle.\n if (this.#isEditorFocused(grid)) return;\n\n grid.rows = formArray.getRawValue();\n });\n });\n\n ngOnInit(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Store the form context on the grid element for other directives to access\n this.#storeFormContext(grid);\n\n // Intercept cell-commit events to update the FormArray\n this.cellCommitUnsub = grid.on(\n 'cell-commit',\n (detail: { rowIndex: number; field: string; value: unknown; oldValue: unknown; rowId: string }) => {\n this.#handleCellCommit(detail);\n },\n );\n\n // Intercept cell-cancel events to revert FormControls (grid mode Escape)\n this.cellCancelUnsub = grid.on(\n 'cell-cancel',\n (detail: { rowIndex: number; field: string; previousValue: unknown }) => {\n this.#handleCellCancel(detail);\n },\n );\n\n // Intercept row-commit events to prevent if FormGroup is invalid\n this.rowCommitUnsub = grid.on(\n 'row-commit',\n (detail: { rowIndex: number; rowId?: string; changed: boolean }, event: CustomEvent) => {\n if (!this.syncValidation()) return;\n this.#handleRowCommit(event, detail);\n },\n );\n\n // Mark FormArray as touched on first interaction\n this.touchListener = () => {\n this.formArray().markAsTouched();\n // Remove after first touch\n if (this.touchListener) {\n grid.removeEventListener('click', this.touchListener);\n this.touchListener = null;\n }\n };\n grid.addEventListener('click', this.touchListener);\n\n // If in grid mode with syncValidation, set up reactive validation\n // Wait for grid to be ready so we can detect the editing mode\n grid.ready?.().then(() => {\n if (this.syncValidation() && this.#isGridMode()) {\n this.#setupReactiveValidation();\n // Sync initial validation state for all existing controls\n this.#syncAllValidationState();\n }\n });\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n this.cellCommitUnsub?.();\n this.cellCancelUnsub?.();\n this.rowCommitUnsub?.();\n if (this.touchListener) {\n grid.removeEventListener('click', this.touchListener);\n }\n if (this.valueChangesSubscription) {\n this.valueChangesSubscription.unsubscribe();\n }\n // Clean up status change subscriptions (grid mode)\n this.statusChangesSubscriptions.forEach((sub) => sub.unsubscribe());\n this.statusChangesSubscriptions = [];\n\n this.#clearFormContext(grid);\n }\n\n /**\n * Checks if the EditingPlugin is in 'grid' mode.\n */\n #isGridMode(): boolean {\n const grid = this.elementRef.nativeElement;\n if (!grid) return false;\n\n const editingPlugin = grid.getPluginByName?.('editing') as\n | (EditingPluginValidation & EditingPluginConfig)\n | undefined;\n\n return editingPlugin?.config?.mode === 'grid';\n }\n\n /**\n * Checks if a focusable editor element inside the grid currently has focus.\n * Used to skip valueChanges → grid.rows sync while a user is actively editing,\n * preventing editor destruction (which orphans overlay panels like autocomplete/select).\n */\n #isEditorFocused(grid: GridElement): boolean {\n if (!this.#isGridMode()) return false;\n const active = document.activeElement;\n if (!active) return false;\n // Check if the focused element is inside the grid\n return grid.contains(active) && active.closest('.editing') != null;\n }\n\n /**\n * Sets up reactive validation syncing for grid mode.\n * Subscribes to statusChanges on all FormControls to update validation state in real-time.\n */\n #setupReactiveValidation(): void {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Clean up any existing subscriptions\n this.statusChangesSubscriptions.forEach((sub) => sub.unsubscribe());\n this.statusChangesSubscriptions = [];\n\n // Subscribe to each FormGroup's statusChanges\n for (let rowIndex = 0; rowIndex < formArray.length; rowIndex++) {\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (!rowFormGroup) continue;\n\n // Get the row ID for this row\n const rowId = this.#getRowId(grid, rowIndex);\n if (!rowId) continue;\n\n // Subscribe to status changes for each control in the FormGroup\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (!control) return;\n\n const sub = control.statusChanges.pipe(debounceTime(50), takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n this.#syncControlValidationToGrid(rowId, field, control);\n });\n\n this.statusChangesSubscriptions.push(sub);\n });\n }\n }\n\n /**\n * Syncs validation state for all controls in the FormArray.\n * Called once on init in grid mode to show pre-existing validation errors.\n */\n #syncAllValidationState(): void {\n const formArray = this.formArray();\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n for (let rowIndex = 0; rowIndex < formArray.length; rowIndex++) {\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (!rowFormGroup) continue;\n\n const rowId = this.#getRowId(grid, rowIndex);\n if (!rowId) continue;\n\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (control) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n });\n }\n }\n\n /**\n * Gets the row ID for a given row index using the grid's getRowId method.\n */\n #getRowId(grid: GridElement, rowIndex: number): string | undefined {\n try {\n const rows = grid.rows;\n const row = rows?.[rowIndex];\n if (!row) return undefined;\n return grid.getRowId?.(row);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Checks if the FormArray contains FormGroups.\n */\n #isFormArrayOfFormGroups(): boolean {\n const formArray = this.formArray();\n if (formArray.length === 0) return false;\n return formArray.at(0) instanceof FormGroup;\n }\n\n /**\n * Gets the FormGroup at a specific row index.\n */\n #getRowFormGroup(rowIndex: number): FormGroup | undefined {\n const formArray = this.formArray();\n const rowControl = formArray.at(rowIndex);\n return rowControl instanceof FormGroup ? rowControl : undefined;\n }\n\n /**\n * Stores the FormArrayContext on the grid element.\n */\n #storeFormContext(grid: GridElement): void {\n const getRowFormGroup = (rowIndex: number) => this.#getRowFormGroup(rowIndex);\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n const context: FormArrayContext = {\n getRow: <T>(rowIndex: number): T | null => {\n const formArray = this.formArray();\n const rowControl = formArray.at(rowIndex);\n return rowControl ? (rowControl.value as T) : null;\n },\n updateField: (rowIndex: number, field: string, value: unknown) => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n }\n }\n },\n getValue: <T>(): T[] => {\n return this.formArray().getRawValue() as T[];\n },\n get hasFormGroups() {\n return self.#isFormArrayOfFormGroups();\n },\n getControl: (rowIndex: number, field: string): AbstractControl | undefined => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return undefined;\n return rowFormGroup.get(field) ?? undefined;\n },\n getRowFormGroup,\n isRowValid: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return true;\n return rowFormGroup.valid;\n },\n isRowTouched: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return false;\n return rowFormGroup.touched;\n },\n isRowDirty: (rowIndex: number): boolean => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return false;\n return rowFormGroup.dirty;\n },\n getRowErrors: (rowIndex: number): Record<string, unknown> | null => {\n const rowFormGroup = getRowFormGroup(rowIndex);\n if (!rowFormGroup) return null;\n\n const errors: Record<string, unknown> = {};\n let hasErrors = false;\n\n Object.keys(rowFormGroup.controls).forEach((field) => {\n const control = rowFormGroup.get(field);\n if (control?.errors) {\n errors[field] = control.errors;\n hasErrors = true;\n }\n });\n\n if (rowFormGroup.errors) {\n errors['_group'] = rowFormGroup.errors;\n hasErrors = true;\n }\n\n return hasErrors ? errors : null;\n },\n };\n (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT] = context;\n }\n\n /**\n * Clears the FormArrayContext from the grid element.\n */\n #clearFormContext(grid: GridElement): void {\n delete (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n }\n\n /**\n * Handles cell-commit events by updating the FormControl in the FormGroup.\n */\n #handleCellCommit(detail: { rowIndex: number; field: string; value: unknown; rowId: string }): void {\n const { rowIndex, field, value, rowId } = detail;\n\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n control.markAsTouched();\n\n // Sync Angular validation state to grid's visual invalid styling\n if (this.syncValidation() && rowId) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n }\n }\n }\n\n /**\n * Handles row-commit events - prevents commit if FormGroup has invalid controls.\n */\n #handleRowCommit(event: Event, detail: { rowIndex: number }): void {\n const { rowIndex } = detail;\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n\n if (rowFormGroup && rowFormGroup.invalid) {\n // Prevent row commit if the FormGroup is invalid\n event.preventDefault();\n }\n }\n\n /**\n * Handles cell-cancel events (grid mode Escape) — reverts the FormControl\n * to the value it had before the edit session began.\n */\n #handleCellCancel(detail: { rowIndex: number; field: string; previousValue: unknown }): void {\n const { rowIndex, field, previousValue } = detail;\n const rowFormGroup = this.#getRowFormGroup(rowIndex);\n\n if (rowFormGroup) {\n const control = rowFormGroup.get(field);\n if (control) {\n control.setValue(previousValue, { emitEvent: false });\n control.markAsPristine();\n }\n }\n }\n\n /**\n * Syncs a FormControl's validation state to the grid's visual invalid styling.\n */\n #syncControlValidationToGrid(rowId: string, field: string, control: AbstractControl): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Get EditingPlugin via getPluginByName\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n\n if (!editingPlugin) return;\n\n if (control.invalid) {\n // Get first error message to display\n const errorMessage = this.#getFirstErrorMessage(control);\n editingPlugin.setInvalid(rowId, field, errorMessage);\n } else {\n editingPlugin.clearInvalid(rowId, field);\n }\n }\n\n /**\n * Gets a human-readable error message from the first validation error.\n */\n #getFirstErrorMessage(control: AbstractControl): string {\n const errors = control.errors;\n if (!errors) return '';\n\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n\n // Common Angular validators\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n // Custom validators may provide a message property\n return typeof error === 'string' ? error : (error?.message ?? `Validation error: ${firstKey}`);\n }\n }\n}\n","import { contentChild, Directive, effect, ElementRef, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the tool panel template.\n * Provides access to grid-related information for the panel content.\n * @since 0.1.0\n */\nexport interface GridToolPanelContext {\n /** The grid element (implicit binding) */\n $implicit: HTMLElement;\n /** The grid element */\n grid: HTMLElement;\n}\n\n// Global registry mapping DOM elements to their templates\nconst toolPanelTemplateRegistry = new Map<HTMLElement, TemplateRef<GridToolPanelContext>>();\n\n/**\n * Gets the tool panel template registered for a given tool panel element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n */\nexport function getToolPanelTemplate(panelElement: HTMLElement): TemplateRef<GridToolPanelContext> | undefined {\n return toolPanelTemplateRegistry.get(panelElement);\n}\n\n/**\n * Gets all tool panel elements with registered templates within a grid element.\n */\nexport function getToolPanelElements(gridElement: HTMLElement): HTMLElement[] {\n const panelElements = gridElement.querySelectorAll('tbw-grid-tool-panel');\n return Array.from(panelElements).filter((el) => toolPanelTemplateRegistry.has(el as HTMLElement)) as HTMLElement[];\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a custom tool panel.\n *\n * This enables declarative Angular component usage for tool panels\n * that appear in the grid's side panel.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-tool-panel\n * id=\"quick-filters\"\n * title=\"Quick Filters\"\n * icon=\"🔍\"\n * tooltip=\"Apply quick filters\"\n * [order]=\"10\"\n * >\n * <ng-template let-grid>\n * <app-quick-filters [grid]=\"grid\" />\n * </ng-template>\n * </tbw-grid-tool-panel>\n * </tbw-grid>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `grid`: The grid element reference\n *\n * ### Attributes\n *\n * - `id` (required): Unique identifier for the panel\n * - `title` (required): Panel title shown in accordion header\n * - `icon`: Icon for accordion section header (emoji or text)\n * - `tooltip`: Tooltip for accordion section header\n * - `order`: Panel order priority (lower = first, default: 100)\n *\n * Import the directive in your component:\n *\n * ```typescript\n * import { GridToolPanel } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [GridToolPanel],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"rows\">\n * <tbw-grid-tool-panel id=\"quick-filters\" title=\"Quick Filters\" icon=\"\\uD83D\\uDD0D\">\n * <ng-template let-grid>\n * <app-quick-filters [grid]=\"grid\" />\n * </ng-template>\n * </tbw-grid-tool-panel>\n * </tbw-grid>\n * ```\n *\n * @category Directive\n * @since 0.1.0\n */\n@Directive({ selector: 'tbw-grid-tool-panel' })\nexport class GridToolPanel {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /** Unique panel identifier (required) */\n id = input.required<string>({ alias: 'id' });\n\n /** Panel title shown in accordion header (required) */\n title = input.required<string>({ alias: 'title' });\n\n /** Icon for accordion section header (emoji or text) */\n icon = input<string>();\n\n /** Tooltip for accordion section header */\n tooltip = input<string>();\n\n /** Panel order priority (lower = first, default: 100) */\n order = input<number>(100);\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridToolPanelContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n const element = this.elementRef.nativeElement;\n\n if (template) {\n // Set attributes from inputs (for light DOM parsing to read)\n element.setAttribute('id', this.id());\n element.setAttribute('title', this.title());\n\n const icon = this.icon();\n if (icon) element.setAttribute('icon', icon);\n\n const tooltip = this.tooltip();\n if (tooltip) element.setAttribute('tooltip', tooltip);\n\n element.setAttribute('order', String(this.order()));\n\n // Register the template for this element\n toolPanelTemplateRegistry.set(element, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridToolPanel, ctx: unknown): ctx is GridToolPanelContext {\n return true;\n }\n}\n","import { Directive, effect, ElementRef, inject, OnDestroy, TemplateRef } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport { getEditorTemplate } from './grid-column-editor.directive';\nimport { getViewTemplate } from './grid-column-view.directive';\n\n/**\n * Context type for structural directives with `any` defaults.\n * This provides better ergonomics in templates without requiring explicit type annotations.\n *\n * @internal Use `GridCellContext` in application code for stricter typing.\n * @since 0.1.1\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface StructuralCellContext<TValue = any, TRow = any> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n column: any;\n}\n\n/**\n * Context type for structural editor directives with `any` defaults.\n * This provides better ergonomics in templates without requiring explicit type annotations.\n *\n * @internal Use `GridEditorContext` in application code for stricter typing.\n * @since 0.1.1\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface StructuralEditorContext<TValue = any, TRow = any> {\n /** The cell value for this column */\n $implicit: TValue;\n /** The cell value (explicit binding) */\n value: TValue;\n /** The full row data object */\n row: TRow;\n /** The column configuration */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n column: any;\n /**\n * Callback function to commit the edited value.\n */\n onCommit: (value: TValue) => void;\n /**\n * Callback function to cancel editing.\n */\n onCancel: () => void;\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray with FormGroups.\n *\n * Returns `undefined` if:\n * - The grid is not bound to a FormArray\n * - The FormArray doesn't contain FormGroups\n * - The field doesn't exist in the FormGroup\n */\n control?: AbstractControl;\n}\n\n// Registries for structural directive templates\nconst structuralViewRegistry = new Map<HTMLElement, TemplateRef<StructuralCellContext>>();\nconst structuralEditorRegistry = new Map<HTMLElement, TemplateRef<StructuralEditorContext>>();\n\n/**\n * Gets the view template registered by the structural directive for a given column element.\n * Falls back to the non-structural directive registry.\n */\nexport function getStructuralViewTemplate(columnElement: HTMLElement): TemplateRef<StructuralCellContext> | undefined {\n // First check structural directive registry\n const template = structuralViewRegistry.get(columnElement);\n if (template) return template;\n\n // Fall back to the nested element registry\n const viewEl = columnElement.querySelector('tbw-grid-column-view');\n if (viewEl) {\n return getViewTemplate(viewEl as HTMLElement) as TemplateRef<StructuralCellContext> | undefined;\n }\n return undefined;\n}\n\n/**\n * Gets the editor template registered by the structural directive for a given column element.\n * Falls back to the non-structural directive registry.\n */\nexport function getStructuralEditorTemplate(\n columnElement: HTMLElement,\n): TemplateRef<StructuralEditorContext> | undefined {\n // First check structural directive registry\n const template = structuralEditorRegistry.get(columnElement);\n if (template) return template;\n\n // Fall back to the nested element registry\n const editorEl = columnElement.querySelector('tbw-grid-column-editor');\n if (editorEl) {\n return getEditorTemplate(editorEl as HTMLElement) as TemplateRef<StructuralEditorContext> | undefined;\n }\n return undefined;\n}\n\n/**\n * Structural directive for cell view rendering.\n *\n * This provides a cleaner syntax for defining custom cell renderers without\n * the nested `<tbw-grid-column-view>` and `<ng-template>` boilerplate.\n *\n * ## Usage\n *\n * ```html\n * <!-- Instead of this verbose syntax: -->\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * </tbw-grid-column>\n *\n * <!-- Use this cleaner syntax: -->\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * ## Template Context\n *\n * The structural directive provides the same context as `GridColumnView`:\n * - `$implicit` / `value`: The cell value (use `let value` or `let-value`)\n * - `row`: The full row data object (use `row as row` or `let-row=\"row\"`)\n * - `column`: The column configuration\n *\n * ## Import\n *\n * ```typescript\n * import { TbwRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [TbwRenderer],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @category Directive\n * @since 0.1.1\n */\n@Directive({ selector: '[tbwRenderer]' })\nexport class TbwRenderer implements OnDestroy {\n private template = inject(TemplateRef<StructuralCellContext>);\n private elementRef = inject(ElementRef<HTMLElement>);\n private columnElement: HTMLElement | null = null;\n\n constructor() {\n // Angular structural directives wrap the host element in a comment node.\n // We need to find the parent tbw-grid-column element.\n // Since we're injected into the template, we use an effect to register once the DOM is stable.\n effect(() => {\n this.registerTemplate();\n });\n }\n\n private registerTemplate(): void {\n // Find the parent tbw-grid-column element\n // The template's host element may not be in the DOM yet, so we traverse from the comment node\n let parent = this.elementRef.nativeElement?.parentElement;\n while (parent && parent.tagName !== 'TBW-GRID-COLUMN') {\n parent = parent.parentElement;\n }\n\n if (parent) {\n this.columnElement = parent;\n structuralViewRegistry.set(parent, this.template);\n }\n }\n\n ngOnDestroy(): void {\n if (this.columnElement) {\n structuralViewRegistry.delete(this.columnElement);\n }\n }\n\n /**\n * Static type guard for template context.\n * Uses `any` defaults for ergonomic template usage.\n */\n static ngTemplateContextGuard(dir: TbwRenderer, ctx: unknown): ctx is StructuralCellContext {\n return true;\n }\n}\n\n/**\n * Structural directive for cell editor rendering.\n *\n * This provides a cleaner syntax for defining custom cell editors without\n * the nested `<tbw-grid-column-editor>` and `<ng-template>` boilerplate.\n *\n * ## Usage\n *\n * ```html\n * <!-- Instead of this verbose syntax: -->\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-editor>\n * <ng-template let-value let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-editor [value]=\"value\" (commit)=\"onCommit($event)\" (cancel)=\"onCancel()\" />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n *\n * <!-- Use this cleaner syntax (with auto-wiring - no explicit bindings needed!): -->\n * <tbw-grid-column field=\"status\">\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * ## Template Context\n *\n * The structural directive provides the same context as `GridColumnEditor`:\n * - `$implicit` / `value`: The cell value\n * - `row`: The full row data object\n * - `column`: The column configuration\n * - `onCommit`: Callback function to commit the new value (optional - auto-wired if component emits `commit` event)\n * - `onCancel`: Callback function to cancel editing (optional - auto-wired if component emits `cancel` event)\n *\n * ## Import\n *\n * ```typescript\n * import { TbwEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [TbwEditor],\n * // ...\n * })\n * ```\n *\n * @example\n * ```html\n * <tbw-grid-column field=\"status\" editable>\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @category Directive\n *\n * MOVE-IN-V2: this directive (and its `StructuralEditorContext` type) will\n * physically move into `@toolbox-web/grid-angular/features/editing` in v2.0.0;\n * the deprecated re-export from the main `@toolbox-web/grid-angular` entry\n * will be removed at the same time. Consumers should already be importing\n * from the feature entry. (`TbwRenderer` stays in the main entry — it is\n * editor-agnostic.)\n * @since 0.1.1\n */\n@Directive({ selector: '[tbwEditor]' })\nexport class TbwEditor implements OnDestroy {\n private template = inject(TemplateRef<StructuralEditorContext>);\n private elementRef = inject(ElementRef<HTMLElement>);\n private columnElement: HTMLElement | null = null;\n\n constructor() {\n effect(() => {\n this.registerTemplate();\n });\n }\n\n private registerTemplate(): void {\n // Find the parent tbw-grid-column element\n let parent = this.elementRef.nativeElement?.parentElement;\n while (parent && parent.tagName !== 'TBW-GRID-COLUMN') {\n parent = parent.parentElement;\n }\n\n if (parent) {\n this.columnElement = parent;\n structuralEditorRegistry.set(parent, this.template);\n }\n }\n\n ngOnDestroy(): void {\n if (this.columnElement) {\n structuralEditorRegistry.delete(this.columnElement);\n }\n }\n\n /**\n * Static type guard for template context.\n * Uses `any` defaults for ergonomic template usage.\n */\n static ngTemplateContextGuard(dir: TbwEditor, ctx: unknown): ctx is StructuralEditorContext {\n return true;\n }\n}\n","/**\n * Editor mount hook registry — append-only hooks called when an Angular-managed\n * editor host is mounted into the DOM with a known owner grid.\n *\n * This is the augmentation point that lets feature secondary entries\n * (e.g. `@toolbox-web/grid-angular/features/editing`) install per-editor\n * lifecycle behaviour (such as the `before-edit-close` blur bridge)\n * without coupling the central adapter file to the editing feature.\n * Mirrors React's and Vue's `editor-mount-hooks` and how core grid plugins\n * augment the grid via `registerPlugin()`.\n *\n * @packageDocumentation\n * @internal\n */\n\n/**\n * Hook called when an editor host is mounted. Returning a function\n * registers a teardown that runs when the editor is released.\n * @since 1.4.0\n */\nexport type EditorMountHook = (ctx: { container: HTMLElement; gridEl: HTMLElement }) => (() => void) | void;\n\nconst editorMountHooks: EditorMountHook[] = [];\n\n/**\n * Install an editor-mount hook. Called by feature secondary entries\n * (e.g. `features/editing`) on import.\n *\n * @internal Plugin API\n * @since 1.4.0\n */\nexport function registerEditorMountHook(hook: EditorMountHook): void {\n editorMountHooks.push(hook);\n}\n\n/**\n * Run all registered editor-mount hooks for a freshly mounted editor.\n * Returns a combined teardown that invokes each hook's teardown in\n * registration order.\n *\n * @internal Adapter use only.\n */\nexport function notifyEditorMounted(container: HTMLElement, gridEl: HTMLElement): () => void {\n const teardowns: Array<() => void> = [];\n for (const hook of editorMountHooks) {\n const teardown = hook({ container, gridEl });\n if (teardown) teardowns.push(teardown);\n }\n return () => {\n for (const teardown of teardowns) teardown();\n };\n}\n\n/**\n * Returns a function that, when invoked, blurs the focused input/textarea/select\n * inside `host` (if any). Used by the `before-edit-close` bridge installed by\n * `@toolbox-web/grid-angular/features/editing` so editors that commit on\n * `(blur)` flush their pending value before the cell DOM is torn down by Tab /\n * programmatic row exit.\n * @internal\n * @since 1.4.0\n */\nexport function makeFlushFocusedInput(host: HTMLElement): () => void {\n return () => {\n const focused = host.ownerDocument.activeElement as HTMLElement | null;\n if (\n focused &&\n host.contains(focused) &&\n (focused instanceof HTMLInputElement ||\n focused instanceof HTMLTextAreaElement ||\n focused instanceof HTMLSelectElement)\n ) {\n focused.blur();\n }\n };\n}\n","/**\n * Editor Wiring Helpers\n *\n * Pure functions for wiring up commit/cancel handlers on editor components.\n * Extracted from GridAdapter to enable unit testing without Angular DI.\n *\n * @internal\n */\n\n// #region subscribeToOutput\n\n/**\n * Subscribes to an Angular output on a component instance.\n * Works with both EventEmitter and OutputEmitterRef (signal outputs).\n *\n * @param instance - The component instance (as a plain record)\n * @param outputName - Name of the output property\n * @param callback - Callback to invoke when the output emits\n * @returns `true` if the output was found and subscribed, `false` otherwise\n * @internal\n */\nexport function subscribeToOutput<T>(\n instance: Record<string, unknown>,\n outputName: string,\n callback: (value: T) => void,\n): boolean {\n const output = instance[outputName];\n if (!output) return false;\n\n // Check if it's an Observable-like (EventEmitter or OutputEmitterRef)\n if (typeof (output as { subscribe?: unknown }).subscribe === 'function') {\n (output as { subscribe: (fn: (v: T) => void) => void }).subscribe(callback);\n return true;\n }\n return false;\n}\n\n// #endregion\n\n// #region wireEditorCallbacks\n\n/**\n * Wire up commit/cancel handlers for an editor component.\n *\n * Supports both Angular outputs and DOM CustomEvents. When both fire\n * (the BaseGridEditor pattern), a per-action flag prevents the callback\n * from running twice.\n *\n * @param hostElement - The host DOM element for the editor\n * @param instance - The component instance (as a plain record)\n * @param commit - Callback to invoke when committing a value\n * @param cancel - Callback to invoke when cancelling the edit\n * @internal\n */\nexport function wireEditorCallbacks<TValue>(\n hostElement: HTMLElement,\n instance: Record<string, unknown>,\n commit: (value: TValue) => void,\n cancel: () => void,\n): void {\n // Guard: when both Angular output AND DOM event fire (BaseGridEditor.commitValue\n // emits both), only the first should call commit/cancel(). The flags prevent\n // double-fires that cause redundant cell-commit events and extra dirty-tracking work.\n let commitHandledByOutput = false;\n let cancelHandledByOutput = false;\n\n subscribeToOutput(instance, 'commit', (value: TValue) => {\n commitHandledByOutput = true;\n commit(value);\n });\n subscribeToOutput(instance, 'cancel', () => {\n cancelHandledByOutput = true;\n cancel();\n });\n\n // Also listen for DOM CustomEvents as a fallback for editors that don't\n // have Angular commit/cancel outputs (e.g., third-party web components).\n hostElement.addEventListener('commit', (e: Event) => {\n e.stopPropagation();\n if (commitHandledByOutput) {\n // Already handled by the Angular output subscription — reset and skip.\n commitHandledByOutput = false;\n return;\n }\n const customEvent = e as CustomEvent<TValue>;\n commit(customEvent.detail);\n });\n hostElement.addEventListener('cancel', (e: Event) => {\n e.stopPropagation();\n if (cancelHandledByOutput) {\n cancelHandledByOutput = false;\n return;\n }\n cancel();\n });\n}\n\n// #endregion\n","/**\n * Type-level default registry for Angular applications.\n *\n * Provides application-wide type defaults for renderers and editors\n * that all grids inherit automatically.\n */\nimport {\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n Type,\n} from '@angular/core';\nimport type { TypeDefault } from '@toolbox-web/grid';\nimport type { FilterPanelRenderer } from '@toolbox-web/grid/plugins/filtering';\n\n/**\n * Type default registration configuration.\n * Uses Angular component types for renderers/editors.\n *\n * @example\n * ```typescript\n * const defaults: Record<string, TypeDefaultRegistration> = {\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent,\n * },\n * };\n * ```\n * @since 0.11.0\n */\nexport interface TypeDefaultRegistration<TRow = unknown> {\n /** Angular component class for rendering cells of this type */\n renderer?: Type<any>;\n /** Angular component class for editing cells of this type */\n editor?: Type<any>;\n /** Default editorParams for this type */\n editorParams?: Record<string, unknown>;\n /**\n * Custom filter panel for this type.\n *\n * Accepts either:\n * - An Angular component class implementing `FilterPanel` (has a `params` signal input)\n * - A vanilla imperative function `(container, params) => void`\n */\n filterPanelRenderer?: FilterPanelRenderer | Type<any>;\n}\n\n/**\n * Injection token for providing type defaults at app level.\n * @since 0.3.0\n */\nexport const GRID_TYPE_DEFAULTS = new InjectionToken<Record<string, TypeDefaultRegistration>>('GRID_TYPE_DEFAULTS');\n\n/**\n * Injectable service for managing type-level defaults.\n *\n * Use `provideGridTypeDefaults()` in your app config to set up defaults,\n * or inject this service for dynamic registration.\n *\n * @example\n * ```typescript\n * // App-level setup (app.config.ts)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent\n * },\n * status: {\n * renderer: StatusBadgeComponent\n * }\n * })\n * ]\n * };\n *\n * // Dynamic registration\n * @Component({ ... })\n * export class AppComponent {\n * private registry = inject(GridTypeRegistry);\n *\n * ngOnInit() {\n * this.registry.register('currency', {\n * renderer: CurrencyCellComponent\n * });\n * }\n * }\n * ```\n * @since 0.3.0\n */\n@Injectable({ providedIn: 'root' })\nexport class GridTypeRegistry {\n private readonly defaults = new Map<string, TypeDefaultRegistration>();\n\n constructor() {\n // Merge any initial defaults from provider\n const initial = inject(GRID_TYPE_DEFAULTS, { optional: true });\n if (initial) {\n for (const [type, config] of Object.entries(initial)) {\n this.defaults.set(type, config);\n }\n }\n }\n\n /**\n * Register type-level defaults for a custom type.\n *\n * @param type - The type name (e.g., 'country', 'currency')\n * @param defaults - Renderer/editor configuration\n */\n register<T = unknown>(type: string, defaults: TypeDefaultRegistration<T>): void {\n this.defaults.set(type, defaults);\n }\n\n /**\n * Get type defaults for a given type.\n */\n get(type: string): TypeDefaultRegistration | undefined {\n return this.defaults.get(type);\n }\n\n /**\n * Remove type defaults for a type.\n */\n unregister(type: string): void {\n this.defaults.delete(type);\n }\n\n /**\n * Check if a type has registered defaults.\n */\n has(type: string): boolean {\n return this.defaults.has(type);\n }\n\n /**\n * Get all registered type names.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.defaults.keys());\n }\n\n /**\n * Convert to TypeDefault for use with grid's typeDefaults.\n * This is used internally by the adapter.\n *\n * @internal\n */\n getAsTypeDefault(type: string): TypeDefault | undefined {\n const config = this.defaults.get(type);\n if (!config) return undefined;\n\n // Note: The actual renderer/editor functions are created by the adapter\n // when it calls getTypeDefault() - we just return the config here\n return {\n editorParams: config.editorParams,\n // renderer and editor are handled by the adapter which creates\n // the actual functions that instantiate Angular components\n };\n }\n}\n\n/**\n * Provides application-level type defaults for all grids.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideGridTypeDefaults } from '@toolbox-web/grid-angular';\n * import { CountryCellComponent, StatusBadgeComponent } from './components';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: { renderer: CountryCellComponent },\n * status: { renderer: StatusBadgeComponent },\n * date: { editor: DatePickerComponent }\n * })\n * ]\n * };\n * ```\n * @since 0.3.0\n */\nexport function provideGridTypeDefaults(defaults: Record<string, TypeDefaultRegistration>): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: GRID_TYPE_DEFAULTS, useValue: defaults }]);\n}\n","/**\n * Append-only bridge registries used by `@toolbox-web/grid-angular`.\n *\n * These let feature secondary entries plug into the central `GridAdapter`\n * without the adapter needing to know about them. Mirrors React's and Vue's\n * `register*Bridge` modules and how core grid plugins augment the grid via\n * `registerPlugin()`.\n *\n * This module is deliberately framework-free: it holds plain module-level\n * `let` state and never imports from `@angular/core` or from\n * `@toolbox-web/grid/plugins/...`. Feature subpaths import the setters via\n * the `@toolbox-web/grid-angular` package barrel (relative imports outside\n * a secondary entry's `rootDir` are forbidden by ng-packagr).\n *\n * @internal\n */\n\nimport type { TypeDefault as BaseTypeDefault } from '@toolbox-web/grid';\nimport type { GridAdapter } from '../angular-grid-adapter';\n\n/**\n * Installer signature: given a grid element + adapter, returns the row-renderer\n * the adapter should expose, or undefined if no Angular template is registered\n * for that grid. Used by `features/master-detail` and `features/responsive`.\n * @internal\n * @since 1.4.0\n */\nexport type RowRendererBridge = <TRow = unknown>(\n gridElement: HTMLElement,\n adapter: GridAdapter,\n) => ((row: TRow, rowIndex: number) => HTMLElement) | undefined;\n\n/**\n * Installer signature for the type-default `filterPanelRenderer` wrapper.\n * Receives the user-supplied component class loosely typed as `unknown`\n * (so the adapter does not depend on filtering types) and returns the\n * imperative `(container, params) => void` form required by core.\n * @internal\n * @since 1.4.0\n */\nexport type FilterPanelTypeDefaultBridge = (\n rendererValue: unknown,\n adapter: GridAdapter,\n) => NonNullable<BaseTypeDefault['filterPanelRenderer']> | undefined;\n\nlet detailRendererBridge: RowRendererBridge | null = null;\nlet responsiveCardRendererBridge: RowRendererBridge | null = null;\nlet filterPanelTypeDefaultBridge: FilterPanelTypeDefaultBridge | null = null;\n\n/**\n * Install the master-detail row-renderer bridge. Called once on import by\n * `@toolbox-web/grid-angular/features/master-detail`.\n * @internal Plugin API\n * @since 1.4.0\n */\nexport function registerDetailRendererBridge(bridge: RowRendererBridge): void {\n detailRendererBridge = bridge;\n}\n\n/**\n * Install the responsive-card row-renderer bridge. Called once on import by\n * `@toolbox-web/grid-angular/features/responsive`.\n * @internal Plugin API\n * @since 1.4.0\n */\nexport function registerResponsiveCardRendererBridge(bridge: RowRendererBridge): void {\n responsiveCardRendererBridge = bridge;\n}\n\n/**\n * Install the type-default `filterPanelRenderer` wrapper. Called once on import\n * by `@toolbox-web/grid-angular/features/filtering`. Without this bridge,\n * type-default and grid-config-level component-class filterPanelRenderers are\n * silently dropped — same precondition as the FilteringPlugin (TBW031).\n * @internal Plugin API\n * @since 1.4.0\n */\nexport function registerFilterPanelTypeDefaultBridge(bridge: FilterPanelTypeDefaultBridge): void {\n filterPanelTypeDefaultBridge = bridge;\n}\n\n/** @internal Adapter use only. */\nexport function getDetailRendererBridge(): RowRendererBridge | null {\n return detailRendererBridge;\n}\n\n/** @internal Adapter use only. */\nexport function getResponsiveCardRendererBridge(): RowRendererBridge | null {\n return responsiveCardRendererBridge;\n}\n\n/** @internal Adapter use only. */\nexport function getFilterPanelTypeDefaultBridge(): FilterPanelTypeDefaultBridge | null {\n return filterPanelTypeDefaultBridge;\n}\n","/**\n * Internal registries used by `@toolbox-web/grid-angular`.\n *\n * Two extension points are exposed so individual feature secondary entries\n * (e.g. `@toolbox-web/grid-angular/features/master-detail`) can plug into\n * the core `Grid` directive without the directive needing to know about them.\n *\n * - {@link registerTemplateBridge} — runs in `ngAfterContentInit` once Angular\n * templates inside the grid have been registered. Used to discover light-DOM\n * slot elements (`<tbw-grid-detail>`, `<tbw-grid-responsive-card>`, …) and\n * wire them to the corresponding plugin's renderer setter.\n * - {@link registerFeatureConfigPreprocessor} — runs inside the directive's\n * feature-plugin builder before `createPluginFromFeature` is called. Lets a\n * feature transform its config object (e.g. to convert Angular component\n * classes embedded in `customPanels` to renderer functions).\n *\n * Both registries are append-only and module-scoped: they are populated by\n * side-effect imports of feature secondary entries and consumed by the core\n * `Grid` directive. Order is insertion order.\n *\n * @internal — public for cross-entry-point use; not part of the supported API.\n */\n\nimport type { GridAdapter } from '../angular-grid-adapter';\nimport type { FeatureName } from '../feature-registry';\n\n/**\n * Context passed to template bridges.\n *\n * @internal\n * @since 1.4.0\n */\nexport interface TemplateBridgeContext {\n /** The `<tbw-grid>` element this directive is attached to. */\n grid: HTMLElement;\n /** The Angular `GridAdapter` instance for this grid. */\n adapter: GridAdapter;\n}\n\n/**\n * A template bridge runs once per grid in `ngAfterContentInit`, after the\n * grid has refreshed its columns and Angular content templates have been\n * registered. Bridges may be async; the directive does not await them\n * sequentially — they run concurrently.\n *\n * @internal\n * @since 1.4.0\n */\nexport type TemplateBridge = (ctx: TemplateBridgeContext) => void | Promise<void>;\n\nconst templateBridges: TemplateBridge[] = [];\n\n/**\n * Register a template bridge. Called by feature secondary entries at module\n * load (e.g. `import '@toolbox-web/grid-angular/features/master-detail'`).\n *\n * Bridges are append-only and never deduplicated; calling registration twice\n * for the same feature module is safe because module imports are deduplicated\n * by the JS loader.\n *\n * @internal\n * @since 1.4.0\n */\nexport function registerTemplateBridge(bridge: TemplateBridge): void {\n templateBridges.push(bridge);\n}\n\n/**\n * Run all registered template bridges for a grid. The directive calls this\n * from `ngAfterContentInit` after `refreshColumns()`. Bridges run concurrently;\n * errors thrown by one bridge do not stop the others.\n *\n * @internal\n * @since 1.4.0\n */\nexport function runTemplateBridges(ctx: TemplateBridgeContext): void {\n for (const bridge of templateBridges) {\n try {\n const result = bridge(ctx);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch((err) => {\n // eslint-disable-next-line no-console\n console.error('[tbw-grid-angular] template bridge threw:', err);\n });\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[tbw-grid-angular] template bridge threw:', err);\n }\n }\n}\n\n/**\n * A feature config preprocessor receives the user-supplied config for a\n * specific feature input and returns a transformed config that the core\n * plugin factory can consume. Used to bridge Angular component classes\n * embedded in feature configs (e.g. `customPanels`, `groupHeaderRenderer`)\n * to plain renderer functions.\n *\n * Receives the typed config and the directive's adapter. Returning the same\n * reference is fine — preprocessors typically clone-and-augment.\n *\n * @internal\n * @since 1.4.0\n */\nexport type FeatureConfigPreprocessor = (config: unknown, adapter: GridAdapter) => unknown;\n\nconst featureConfigPreprocessors = new Map<FeatureName, FeatureConfigPreprocessor>();\n\n/**\n * Register a feature config preprocessor. Last registration wins (subsequent\n * imports of the same feature module re-register the same function, which is\n * a no-op).\n *\n * @internal\n * @since 1.4.0\n */\nexport function registerFeatureConfigPreprocessor(name: FeatureName, fn: FeatureConfigPreprocessor): void {\n featureConfigPreprocessors.set(name, fn);\n}\n\n/**\n * Look up the preprocessor for a feature, if any.\n *\n * @internal\n * @since 1.4.0\n */\nexport function getFeatureConfigPreprocessor(name: FeatureName): FeatureConfigPreprocessor | undefined {\n return featureConfigPreprocessors.get(name);\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EmbeddedViewRef,\n EnvironmentInjector,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n ColumnConfig as BaseColumnConfig,\n GridConfig as BaseGridConfig,\n TypeDefault as BaseTypeDefault,\n CellRenderContext,\n ColumnEditorContext,\n ColumnEditorSpec,\n ColumnViewRenderer,\n FrameworkAdapter,\n HeaderCellContext,\n HeaderLabelContext,\n LoadingContext,\n} from '@toolbox-web/grid';\nimport { isComponentClass, type ColumnConfig, type GridConfig, type TypeDefault } from './angular-column-config';\nimport { getEditorTemplate, GridEditorContext } from './directives/grid-column-editor.directive';\nimport { getViewTemplate, GridCellContext } from './directives/grid-column-view.directive';\nimport { getFormArrayContext } from './directives/grid-form-array.directive';\nimport { getToolPanelTemplate, GridToolPanelContext } from './directives/grid-tool-panel.directive';\nimport { getStructuralEditorTemplate, getStructuralViewTemplate } from './directives/structural-directives';\nimport { notifyEditorMounted, registerEditorMountHook, type EditorMountHook } from './editor-mount-hooks';\nimport { wireEditorCallbacks } from './editor-wiring';\nimport type { FeatureName } from './feature-registry';\nimport { GridTypeRegistry } from './grid-type-registry';\nimport {\n getDetailRendererBridge,\n getFilterPanelTypeDefaultBridge,\n getResponsiveCardRendererBridge,\n} from './internal/feature-bridges';\nimport { getFeatureConfigPreprocessor } from './internal/feature-extensions';\n\n// Re-export so feature secondary entries can install editor-mount hooks via\n// `import { registerEditorMountHook } from '@toolbox-web/grid-angular'`.\nexport { makeFlushFocusedInput } from './editor-mount-hooks';\nexport {\n registerDetailRendererBridge,\n registerFilterPanelTypeDefaultBridge,\n registerResponsiveCardRendererBridge,\n} from './internal/feature-bridges';\nexport type { FilterPanelTypeDefaultBridge, RowRendererBridge } from './internal/feature-bridges';\nexport { registerEditorMountHook, type EditorMountHook };\n\n// #region Feature bridge registries\n// (Storage lives in `./internal/feature-bridges` so feature subpaths can\n// install bridges without pulling Angular runtime into specs that mock\n// `@angular/core` — see filtering feature spec.)\n// #endregion\n\n/**\n * Helper to get view template from either structural directive or nested directive.\n */\nfunction getAnyViewTemplate(element: HTMLElement): TemplateRef<GridCellContext> | undefined {\n // First check structural directive registry (for *tbwRenderer syntax)\n const structuralTemplate = getStructuralViewTemplate(element);\n if (structuralTemplate) return structuralTemplate as unknown as TemplateRef<GridCellContext>;\n\n // Fall back to nested directive (for <tbw-grid-column-view> syntax)\n return getViewTemplate(element);\n}\n\n/**\n * Helper to get editor template from either structural directive or nested directive.\n */\nfunction getAnyEditorTemplate(element: HTMLElement): TemplateRef<GridEditorContext> | undefined {\n // First check structural directive registry (for *tbwEditor syntax)\n // The structural context uses `any` types for better ergonomics, but is compatible with GridEditorContext\n const structuralTemplate = getStructuralEditorTemplate(element);\n if (structuralTemplate) return structuralTemplate as unknown as TemplateRef<GridEditorContext>;\n\n // Fall back to nested directive (for <tbw-grid-column-editor> syntax)\n return getEditorTemplate(element);\n}\n\n/**\n * Framework adapter that enables zero-boilerplate integration of Angular components\n * with the grid's light DOM configuration API.\n *\n * ## Usage\n *\n * **One-time setup in your app:**\n * ```typescript\n * import { Component, inject, EnvironmentInjector, ApplicationRef, ViewContainerRef } from '@angular/core';\n * import { GridElement } from '@toolbox-web/grid';\n * import { GridAdapter } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-root',\n * // ...\n * })\n * export class AppComponent {\n * constructor() {\n * const injector = inject(EnvironmentInjector);\n * const appRef = inject(ApplicationRef);\n * const viewContainerRef = inject(ViewContainerRef);\n * GridElement.registerAdapter(new GridAdapter(injector, appRef, viewContainerRef));\n * }\n * }\n * ```\n *\n * **Declarative configuration in templates (structural directive - recommended):**\n * ```html\n * <tbw-grid>\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value; row as row\" [value]=\"value\" />\n * <app-status-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * ```\n *\n * **Declarative configuration in templates (nested directive - legacy):**\n * ```html\n * <tbw-grid>\n * <tbw-grid-column field=\"status\">\n * <tbw-grid-column-view>\n * <ng-template let-value let-row=\"row\">\n * <app-status-badge [value]=\"value\" [row]=\"row\" />\n * </ng-template>\n * </tbw-grid-column-view>\n * <tbw-grid-column-editor>\n * <ng-template let-value let-onCommit=\"onCommit\" let-onCancel=\"onCancel\">\n * <app-status-select [value]=\"value\" (commit)=\"onCommit($event)\" (cancel)=\"onCancel()\" />\n * </ng-template>\n * </tbw-grid-column-editor>\n * </tbw-grid-column>\n * </tbw-grid>\n * ```\n *\n * The adapter automatically:\n * - Detects Angular templates registered by directives (both structural and nested)\n * - Creates embedded views with cell context (value, row, column)\n * - Handles editor callbacks (onCommit/onCancel)\n * - Manages view lifecycle and change detection\n */\n\n/**\n * Synchronize an embedded view's rootNodes into a stable container element.\n *\n * Angular's control flow blocks (@if, @for, @switch) can dynamically add or\n * remove rootNodes during `detectChanges()`. This helper ensures the container\n * always reflects the current set of rootNodes, preventing orphaned or stale\n * nodes when the template's DOM structure changes between renders.\n */\nfunction syncRootNodes(viewRef: EmbeddedViewRef<unknown>, container: HTMLElement): void {\n // Fast path: if the container already holds exactly the right nodes, skip DOM mutations.\n const rootNodes: Node[] = viewRef.rootNodes;\n const children = container.childNodes;\n\n let needsSync = children.length !== rootNodes.length;\n if (!needsSync) {\n for (let i = 0; i < rootNodes.length; i++) {\n if (children[i] !== rootNodes[i]) {\n needsSync = true;\n break;\n }\n }\n }\n\n if (needsSync) {\n // Clear and re-append. replaceChildren is efficient (single reflow).\n container.replaceChildren(...rootNodes);\n }\n}\n\n/** @since 0.11.0 */\nexport class GridAdapter implements FrameworkAdapter {\n private viewRefs: EmbeddedViewRef<unknown>[] = [];\n private componentRefs: ComponentRef<unknown>[] = [];\n /** Editor-specific view refs tracked separately for per-cell cleanup via releaseCell. */\n private editorViewRefs: EmbeddedViewRef<unknown>[] = [];\n /** Editor-specific component refs tracked separately for per-cell cleanup via releaseCell. */\n private editorComponentRefs: ComponentRef<unknown>[] = [];\n /**\n * Per-editor mount-hook teardown functions, keyed by editor host element.\n *\n * Populated by {@link runEditorMountHooks} (which invokes\n * {@link notifyEditorMounted}) and torn down per-cell from\n * {@link releaseCell}, with full sweep on {@link destroy}. The actual\n * lifecycle behaviour is supplied by feature secondary entries (e.g.\n * `@toolbox-web/grid-angular/features/editing` installs the\n * `before-edit-close` blur bridge).\n */\n private editorMountTeardowns: Map<HTMLElement, () => void> = new Map();\n private typeRegistry: GridTypeRegistry | null = null;\n\n constructor(\n private injector: EnvironmentInjector,\n private appRef: ApplicationRef,\n private viewContainerRef: ViewContainerRef,\n ) {\n // Register globally for directive access\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).__ANGULAR_GRID_ADAPTER__ = this;\n\n // Try to get the type registry from the injector\n try {\n this.typeRegistry = this.injector.get(GridTypeRegistry, null);\n } catch {\n // GridTypeRegistry not available - type defaults won't be resolved\n }\n }\n\n /**\n * Processes an Angular grid configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * Call this method on your gridConfig before passing it to the grid.\n *\n * @example\n * ```typescript\n * import { GridAdapter, type GridConfig } from '@toolbox-web/grid-angular';\n *\n * const config: GridConfig<Employee> = {\n * columns: [\n * { field: 'status', renderer: StatusBadgeComponent, editor: StatusEditorComponent },\n * ],\n * };\n *\n * // In component\n * constructor() {\n * const adapter = inject(GridAdapter); // or create new instance\n * this.processedConfig = adapter.processGridConfig(config);\n * }\n * ```\n *\n * @param config - Angular grid configuration with possible component class references\n * @returns Processed GridConfig with actual renderer/editor functions\n */\n processGridConfig<TRow = unknown>(config: GridConfig<TRow>): BaseGridConfig<TRow> {\n return this.processConfig(config as BaseGridConfig<TRow>);\n }\n\n /**\n * FrameworkAdapter.processConfig implementation.\n * Called automatically by the grid's `set gridConfig` setter.\n */\n processConfig<TRow = unknown>(config: BaseGridConfig<TRow>): BaseGridConfig<TRow> {\n // Cast to Angular's extended GridConfig since the config may contain\n // Angular component classes as renderers/editors at runtime\n const angularConfig = config as unknown as GridConfig<TRow>;\n const result = { ...angularConfig };\n\n // Process columns\n if (angularConfig.columns) {\n result.columns = angularConfig.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults - convert Angular component classes to renderer/editor functions\n if (angularConfig.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(angularConfig.typeDefaults) as typeof angularConfig.typeDefaults;\n }\n\n // Process loadingRenderer - convert Angular component class to function\n if (angularConfig.loadingRenderer && isComponentClass(angularConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createComponentLoadingRenderer(\n angularConfig.loadingRenderer,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n }\n\n return result as BaseGridConfig<TRow>;\n }\n\n /**\n * Processes typeDefaults configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * @param typeDefaults - Angular type defaults with possible component class references\n * @returns Processed TypeDefault record\n */\n processTypeDefaults<TRow = unknown>(\n typeDefaults: Record<string, TypeDefault<TRow>>,\n ): Record<string, BaseTypeDefault<TRow>> {\n const processed: Record<string, BaseTypeDefault<TRow>> = {};\n\n for (const [type, config] of Object.entries(typeDefaults)) {\n const processedConfig: BaseTypeDefault<TRow> = { ...config } as BaseTypeDefault<TRow>;\n\n // Convert renderer component class to function\n if (config.renderer && isComponentClass(config.renderer)) {\n processedConfig.renderer = this.createComponentRenderer(config.renderer);\n }\n\n // Convert editor component class to function\n if (config.editor && isComponentClass(config.editor)) {\n (processedConfig as any).editor = this.createComponentEditor(config.editor);\n }\n\n // Convert filterPanelRenderer component class to function via the\n // filtering feature bridge. Without `@toolbox-web/grid-angular/features/filtering`\n // imported, component-class filterPanelRenderers are dropped silently.\n if (config.filterPanelRenderer && isComponentClass(config.filterPanelRenderer)) {\n const wrapped = getFilterPanelTypeDefaultBridge()?.(config.filterPanelRenderer, this);\n if (wrapped) processedConfig.filterPanelRenderer = wrapped;\n }\n\n processed[type] = processedConfig;\n }\n\n return processed;\n }\n\n /**\n * Processes a single column configuration, converting component class references\n * to actual renderer/editor functions.\n *\n * @param column - Angular column configuration\n * @returns Processed ColumnConfig\n */\n processColumn<TRow = unknown>(column: ColumnConfig<TRow>): BaseColumnConfig<TRow> {\n const processed = { ...column } as BaseColumnConfig<TRow>;\n\n // Convert renderer component class to function\n if (column.renderer && isComponentClass(column.renderer)) {\n processed.renderer = this.createComponentRenderer(column.renderer);\n }\n\n // Convert editor component class to function\n if (column.editor && isComponentClass(column.editor)) {\n processed.editor = this.createComponentEditor(column.editor);\n }\n\n // Convert headerRenderer component class to function\n if (column.headerRenderer && isComponentClass(column.headerRenderer)) {\n processed.headerRenderer = this.createComponentHeaderRenderer(column.headerRenderer) as any;\n }\n\n // Convert headerLabelRenderer component class to function\n if (column.headerLabelRenderer && isComponentClass(column.headerLabelRenderer)) {\n processed.headerLabelRenderer = this.createComponentHeaderLabelRenderer(column.headerLabelRenderer) as any;\n }\n\n return processed;\n }\n\n /**\n * Determines if this adapter can handle the given element.\n * Checks if a template is registered for this element (structural or nested).\n */\n canHandle(element: HTMLElement): boolean {\n return getAnyViewTemplate(element) !== undefined || getAnyEditorTemplate(element) !== undefined;\n }\n\n /**\n * Creates a view renderer function that creates an embedded view\n * from the registered template and returns its DOM element.\n *\n * Returns undefined if no template is registered for this element,\n * allowing the grid to use its default rendering.\n */\n createRenderer<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnViewRenderer<TRow, TValue> | undefined {\n const template = getAnyViewTemplate(element) as TemplateRef<GridCellContext<TValue, TRow>> | undefined;\n\n if (!template) {\n // Return undefined so the grid uses default rendering\n // This is important when only an editor template is provided (no view template)\n return undefined;\n }\n\n // Cell cache for this column - maps cell element to its view ref and container.\n // When the grid recycles pool elements during scroll, the same cellEl is reused\n // for different row data. By caching per cellEl, we reuse the Angular view and\n // just update its context instead of creating a new embedded view every time.\n // This matches what React and Vue adapters do with their cell caches.\n //\n // IMPORTANT: We always use a stable wrapper container (display:contents) rather\n // than caching individual rootNodes. This is critical because Angular's control\n // flow (@if, @for, @switch) can dynamically add/remove rootNodes during\n // detectChanges(). If we cached a single rootNode, newly created nodes (e.g.,\n // from an @if becoming true) would be orphaned outside the grid cell.\n const cellCache = new WeakMap<\n HTMLElement,\n { viewRef: EmbeddedViewRef<GridCellContext<TValue, TRow>>; container: HTMLElement }\n >();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n // Skip rendering if the cell is in editing mode\n // This prevents the renderer from overwriting the editor when the grid re-renders\n if (ctx.cellEl?.classList.contains('editing')) {\n return null;\n }\n\n const cellEl = ctx.cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Reuse existing view - just update context and re-run change detection\n cached.viewRef.context.$implicit = ctx.value;\n cached.viewRef.context.value = ctx.value;\n cached.viewRef.context.row = ctx.row;\n cached.viewRef.context.column = ctx.column;\n cached.viewRef.detectChanges();\n // Re-sync rootNodes into the container. Angular's control flow (@if/@for)\n // may have added or removed nodes during detectChanges().\n syncRootNodes(cached.viewRef, cached.container);\n return cached.container;\n }\n }\n\n // Create the context for the template\n const context: GridCellContext<TValue, TRow> = {\n $implicit: ctx.value,\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Always use a stable wrapper container so Angular can freely add/remove\n // rootNodes (via @if, @for, etc.) without orphaning them outside the grid cell.\n const container = document.createElement('span');\n container.style.display = 'contents';\n syncRootNodes(viewRef, container);\n\n // Cache for reuse on scroll recycles\n if (cellEl) {\n cellCache.set(cellEl, { viewRef, container });\n }\n\n return container;\n };\n }\n\n /**\n * Creates an editor spec that creates an embedded view.\n *\n * **Auto-wiring**: The adapter automatically listens for `commit` and `cancel`\n * CustomEvents on the rendered component. If the component emits these events,\n * the adapter will call the grid's commit/cancel functions automatically.\n *\n * This means templates can be simplified from:\n * ```html\n * <app-editor *tbwEditor=\"let value; onCommit as onCommit\"\n * [value]=\"value\" (commit)=\"onCommit($event)\" />\n * ```\n * To just:\n * ```html\n * <app-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * ```\n * As long as the component emits `(commit)` with the new value.\n */\n createEditor<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnEditorSpec<TRow, TValue> | undefined {\n const template = getAnyEditorTemplate(element) as TemplateRef<GridEditorContext<TValue, TRow>> | undefined;\n\n // Find the parent grid element for FormArray context access\n const gridElement = element.closest('tbw-grid') as HTMLElement | null;\n\n if (!template) {\n // No template registered - return undefined to let the grid use its default editor.\n // This allows columns with only *tbwRenderer (no *tbwEditor) to still be editable\n // using the built-in text/number/boolean editors.\n return undefined;\n }\n\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n // Create simple callback functions\n const onCommit = (value: TValue) => ctx.commit(value);\n const onCancel = () => ctx.cancel();\n\n // Try to get the FormControl from the FormArrayContext\n let control: GridEditorContext<TValue, TRow>['control'];\n if (gridElement) {\n const formContext = getFormArrayContext(gridElement);\n if (formContext?.hasFormGroups) {\n // Find the row index by looking up ctx.row in the grid's rows\n const gridRows = (gridElement as { rows?: TRow[] }).rows;\n if (gridRows) {\n const rowIndex = gridRows.indexOf(ctx.row);\n if (rowIndex >= 0) {\n control = formContext.getControl(rowIndex, ctx.field);\n }\n }\n }\n }\n\n // Create the context for the template\n const context: GridEditorContext<TValue, TRow> = {\n $implicit: ctx.value,\n value: ctx.value,\n row: ctx.row,\n field: ctx.field as string,\n column: ctx.column,\n rowId: ctx.rowId ?? '',\n onCommit,\n onCancel,\n updateRow: ctx.updateRow,\n onValueChange: ctx.onValueChange,\n // FormControl from FormArray (if available)\n control,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Use a stable wrapper so Angular's rootNodes (which may include comment\n // placeholders from <ng-container>) are always inside one element node.\n const container = document.createElement('span');\n container.style.display = 'contents';\n syncRootNodes(viewRef, container);\n this.runEditorMountHooks(container);\n\n // Auto-wire: Listen for commit/cancel events on the rendered component.\n // This allows components to just emit (commit) and (cancel) without\n // requiring explicit template bindings like (commit)=\"onCommit($event)\".\n container.addEventListener('commit', (e: Event) => {\n const customEvent = e as CustomEvent<TValue>;\n ctx.commit(customEvent.detail);\n });\n container.addEventListener('cancel', () => {\n ctx.cancel();\n });\n\n // Auto-update editor when value changes externally (e.g., via updateRow cascade\n // or Escape-revert in grid mode). Update the template context and run synchronous\n // detectChanges() — Angular's own bindings and control flow (@for, @if) handle\n // re-rendering regardless of editor type (inputs, chips, contenteditable, etc.).\n ctx.onValueChange?.((newVal: unknown) => {\n context.$implicit = newVal as TValue;\n context.value = newVal as TValue;\n viewRef.detectChanges();\n // Re-sync rootNodes in case Angular control flow changed them\n syncRootNodes(viewRef, container);\n });\n\n return container;\n };\n }\n\n /**\n * Creates a detail renderer function for MasterDetailPlugin. Delegates to\n * the bridge installed by `@toolbox-web/grid-angular/features/master-detail`.\n * Returns undefined if the feature is not imported or no `<tbw-grid-detail>`\n * template is registered for this grid.\n */\n createDetailRenderer<TRow = unknown>(gridElement: HTMLElement): ((row: TRow) => HTMLElement) | undefined {\n return getDetailRendererBridge()?.<TRow>(gridElement, this) as ((row: TRow) => HTMLElement) | undefined;\n }\n\n /**\n * FrameworkAdapter hook called by MasterDetailPlugin during attach(). Delegates\n * to {@link createDetailRenderer} (bridge installed by master-detail feature).\n */\n parseDetailElement<TRow = unknown>(\n detailElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement | string) | undefined {\n const gridElement = detailElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n return getDetailRendererBridge()?.<TRow>(gridElement, this);\n }\n\n /**\n * Creates a responsive card renderer function for ResponsivePlugin. Delegates\n * to the bridge installed by `@toolbox-web/grid-angular/features/responsive`.\n */\n createResponsiveCardRenderer<TRow = unknown>(\n gridElement: HTMLElement,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n return getResponsiveCardRendererBridge()?.<TRow>(gridElement, this);\n }\n\n /**\n * FrameworkAdapter hook called by ResponsivePlugin during attach(). Delegates\n * to {@link createResponsiveCardRenderer} (bridge installed by responsive feature).\n */\n parseResponsiveCardElement<TRow = unknown>(\n cardElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = cardElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n return getResponsiveCardRendererBridge()?.<TRow>(gridElement, this);\n }\n\n /**\n * Creates a tool panel renderer from a light DOM element.\n * The renderer creates an Angular template-based panel content.\n */\n createToolPanelRenderer(element: HTMLElement): ((container: HTMLElement) => void | (() => void)) | undefined {\n const template = getToolPanelTemplate(element) as TemplateRef<GridToolPanelContext> | undefined;\n\n if (!template) {\n return undefined;\n }\n\n // Find the parent grid element for context\n const gridElement = element.closest('tbw-grid') as HTMLElement | null;\n\n return (container: HTMLElement) => {\n // Create the context for the template\n const context: GridToolPanelContext = {\n $implicit: gridElement ?? container,\n grid: gridElement ?? container,\n };\n\n // Create embedded view from template\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n\n // Trigger change detection\n viewRef.detectChanges();\n\n // Append all root nodes to the container\n viewRef.rootNodes.forEach((node) => container.appendChild(node));\n\n // Return cleanup function\n return () => {\n const index = this.viewRefs.indexOf(viewRef);\n if (index > -1) {\n this.viewRefs.splice(index, 1);\n }\n viewRef.destroy();\n };\n };\n }\n\n /**\n * Gets type-level defaults from the application's GridTypeRegistry.\n *\n * This enables application-wide type defaults configured via `provideGridTypeDefaults()`.\n * The returned TypeDefault contains renderer/editor functions that instantiate\n * Angular components dynamically.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridTypeDefaults({\n * country: {\n * renderer: CountryCellComponent,\n * editor: CountryEditorComponent\n * }\n * })\n * ]\n * };\n *\n * // Any grid with type: 'country' columns will use these components\n * gridConfig = {\n * columns: [{ field: 'country', type: 'country' }]\n * };\n * ```\n */\n getTypeDefault<TRow = unknown>(type: string, _gridEl?: HTMLElement): BaseTypeDefault<TRow> | undefined {\n if (!this.typeRegistry) {\n return undefined;\n }\n\n const config = this.typeRegistry.get(type);\n if (!config) {\n return undefined;\n }\n\n const typeDefault: BaseTypeDefault<TRow> = {\n editorParams: config.editorParams,\n };\n\n // Create renderer function that instantiates the Angular component\n if (config.renderer) {\n typeDefault.renderer = this.createComponentRenderer<TRow, unknown>(config.renderer);\n }\n\n // Create editor function that instantiates the Angular component\n if (config.editor) {\n // Type assertion needed: adapter bridges TRow to core's unknown\n typeDefault.editor = this.createComponentEditor<TRow, unknown>(config.editor) as BaseTypeDefault['editor'];\n }\n\n // Create filterPanelRenderer function that instantiates the Angular component\n // via the filtering feature bridge. Drop silently if the feature is not imported.\n if (config.filterPanelRenderer && isComponentClass(config.filterPanelRenderer)) {\n const wrapped = getFilterPanelTypeDefaultBridge()?.(config.filterPanelRenderer, this);\n if (wrapped) typeDefault.filterPanelRenderer = wrapped;\n } else if (config.filterPanelRenderer) {\n typeDefault.filterPanelRenderer = config.filterPanelRenderer as BaseTypeDefault['filterPanelRenderer'];\n }\n\n return typeDefault;\n }\n\n /**\n * Generalized component-mount primitive. All `createComponent*Renderer` methods\n * are thin wrappers around this. Returns a function `(ctx) => { hostElement, componentRef }`\n * so callers that need the `componentRef` (editor wiring, value-change subscription)\n * still have it; callers that only need the host element use `.hostElement`.\n *\n * Public so feature secondary entries can compose their own component renderers\n * without re-implementing the mount/track plumbing.\n *\n * @param componentClass Angular component class to instantiate per call.\n * @param mapInputs Maps the renderer context to a `setInput()` bag.\n * @param pool Which `componentRefs[]` array tracks the instance for cleanup.\n * `'render'` (default) is the long-lived pool cleared at `dispose()`.\n * `'editor'` is the per-cell pool swept by `releaseCell()`.\n * @internal\n */\n mountComponentRenderer<TCtx>(\n componentClass: Type<unknown>,\n mapInputs: (ctx: TCtx) => Record<string, unknown>,\n pool: 'render' | 'editor' = 'render',\n ): (ctx: TCtx) => { hostElement: HTMLSpanElement; componentRef: ComponentRef<unknown> } {\n return (ctx: TCtx) => {\n const hostElement = document.createElement('span');\n hostElement.style.display = 'contents';\n const componentRef = createComponent(componentClass, {\n environmentInjector: this.injector,\n hostElement,\n });\n this.setComponentInputs(componentRef, mapInputs(ctx));\n this.appRef.attachView(componentRef.hostView);\n (pool === 'editor' ? this.editorComponentRefs : this.componentRefs).push(componentRef);\n componentRef.changeDetectorRef.detectChanges();\n return { hostElement, componentRef };\n };\n }\n\n /**\n * Creates a renderer function from an Angular component class.\n * Wraps {@link mountComponentRenderer} with a per-cell `WeakMap` cache so\n * scroll-recycled cells reuse the existing component (just refresh inputs)\n * instead of mounting a fresh one.\n * @internal\n */\n private createComponentRenderer<TRow = unknown, TValue = unknown>(\n componentClass: Type<unknown>,\n ): ColumnViewRenderer<TRow, TValue> {\n const cellCache = new WeakMap<HTMLElement, { componentRef: ComponentRef<unknown>; hostElement: HTMLSpanElement }>();\n const mount = this.mountComponentRenderer<CellRenderContext<TRow, TValue>>(componentClass, (ctx) => ({\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n }));\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = ctx.cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Reuse existing component - just update inputs.\n this.setComponentInputs(cached.componentRef, {\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n });\n cached.componentRef.changeDetectorRef.detectChanges();\n return cached.hostElement;\n }\n }\n\n const { hostElement, componentRef } = mount(ctx);\n if (cellEl) cellCache.set(cellEl, { componentRef, hostElement });\n return hostElement;\n };\n }\n\n /**\n * Creates an editor function from an Angular component class.\n * Wraps {@link mountComponentRenderer} (using the `'editor'` pool for per-cell\n * cleanup) plus editor-specific wiring: callback bridge, mount-hook fan-out\n * (see {@link runEditorMountHooks}), and external value-change subscription.\n * @internal\n */\n private createComponentEditor<TRow = unknown, TValue = unknown>(\n componentClass: Type<unknown>,\n ): ColumnEditorSpec<TRow, TValue> {\n const mount = this.mountComponentRenderer<ColumnEditorContext<TRow, TValue>>(\n componentClass,\n (ctx) => ({ value: ctx.value, row: ctx.row, column: ctx.column }),\n 'editor',\n );\n\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n const { hostElement, componentRef } = mount(ctx);\n\n wireEditorCallbacks<TValue>(\n hostElement,\n componentRef.instance as Record<string, unknown>,\n (value) => ctx.commit(value),\n () => ctx.cancel(),\n );\n this.runEditorMountHooks(hostElement);\n\n // Auto-update editor when value changes externally (e.g., via updateRow cascade\n // or Escape-revert). Update the component input and run detectChanges() —\n // the component's own template handles rendering regardless of editor type.\n ctx.onValueChange?.((newVal: unknown) => {\n try {\n // Notify the editor so it can clear stale internal state (e.g., searchText\n // in autocomplete editors) before the value input updates.\n const instance = componentRef.instance;\n if (typeof (instance as Record<string, unknown>)['onExternalValueChange'] === 'function') {\n (instance as { onExternalValueChange: (v: unknown) => void }).onExternalValueChange(newVal);\n }\n componentRef.setInput('value', newVal);\n componentRef.changeDetectorRef.detectChanges();\n } catch {\n // Component is destroyed — nothing to update.\n }\n });\n\n return hostElement;\n };\n }\n\n /**\n * Creates a header renderer function from an Angular component class.\n * Mounts the component with full header context (column, value, sortState, etc.).\n * @internal\n */\n private createComponentHeaderRenderer<TRow = unknown>(\n componentClass: Type<unknown>,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n const mount = this.mountComponentRenderer<HeaderCellContext<TRow>>(componentClass, (ctx) => ({\n column: ctx.column,\n value: ctx.value,\n sortState: ctx.sortState,\n filterActive: ctx.filterActive,\n renderSortIcon: ctx.renderSortIcon,\n renderFilterButton: ctx.renderFilterButton,\n }));\n return (ctx) => mount(ctx).hostElement;\n }\n\n /**\n * Creates a header label renderer function from an Angular component class.\n * Mounts the component with label context (column, value).\n * @internal\n */\n private createComponentHeaderLabelRenderer<TRow = unknown>(\n componentClass: Type<unknown>,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n const mount = this.mountComponentRenderer<HeaderLabelContext<TRow>>(componentClass, (ctx) => ({\n column: ctx.column,\n value: ctx.value,\n }));\n return (ctx) => mount(ctx).hostElement;\n }\n\n /**\n * Creates a loading renderer function from an Angular component class.\n *\n * The component should accept a `size` input ('large' | 'small').\n * @internal\n */\n private createComponentLoadingRenderer(componentClass: Type<unknown>): (ctx: LoadingContext) => HTMLElement {\n const mount = this.mountComponentRenderer<LoadingContext>(componentClass, (ctx) => ({ size: ctx.size }));\n return (ctx) => mount(ctx).hostElement;\n }\n\n /**\n * Create an embedded view from a `TemplateRef` and append-track it on the\n * adapter's view-ref pool so it is cleaned up on `destroy()` / `unmount()`.\n * Public so feature secondary entries can mount Angular templates (e.g.\n * master-detail rows, responsive cards) without reaching into the adapter's\n * private `viewContainerRef` / `viewRefs`.\n * @internal\n */\n createTrackedEmbeddedView<TCtx>(template: TemplateRef<TCtx>, context: TCtx): EmbeddedViewRef<TCtx> {\n const viewRef = this.viewContainerRef.createEmbeddedView(template, context);\n this.viewRefs.push(viewRef);\n viewRef.detectChanges();\n return viewRef;\n }\n\n /**\n * Processes a GroupingColumnsConfig. Delegates to the feature config\n * preprocessor installed by `@toolbox-web/grid-angular/features/grouping-columns`,\n * which handles converting Angular component class references to actual\n * renderer functions. Returns the input config unchanged if the feature\n * is not imported.\n */\n processGroupingColumnsConfig<TConfig>(config: TConfig): TConfig {\n return this.applyFeatureConfigPreprocessor('groupingColumns', config);\n }\n\n /**\n * Processes a GroupingRowsConfig. Delegates to the feature config preprocessor\n * installed by `@toolbox-web/grid-angular/features/grouping-rows`.\n */\n processGroupingRowsConfig<TConfig>(config: TConfig): TConfig {\n return this.applyFeatureConfigPreprocessor('groupingRows', config);\n }\n\n /**\n * Processes a PinnedRowsConfig. Delegates to the feature config preprocessor\n * installed by `@toolbox-web/grid-angular/features/pinned-rows`.\n */\n processPinnedRowsConfig<TConfig>(config: TConfig): TConfig {\n return this.applyFeatureConfigPreprocessor('pinnedRows', config);\n }\n\n /**\n * Run a registered feature-config preprocessor against `config`, returning\n * the original config unchanged when the feature is not imported.\n * @internal\n */\n private applyFeatureConfigPreprocessor<TConfig>(name: FeatureName, config: TConfig): TConfig {\n if (!config || typeof config !== 'object') return config;\n const preprocessor = getFeatureConfigPreprocessor(name);\n if (!preprocessor) return config;\n return preprocessor(config, this) as TConfig;\n }\n\n /**\n * Sets component inputs using Angular's setInput API.\n * @internal\n */\n private setComponentInputs(componentRef: ComponentRef<unknown>, inputs: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(inputs)) {\n try {\n componentRef.setInput(key, value);\n } catch {\n // Input doesn't exist on component - that's okay, some inputs are optional\n }\n }\n }\n\n /**\n * Called when a cell's content is about to be wiped (e.g., exiting edit mode,\n * scroll-recycling a row, or rebuilding a row).\n *\n * Destroys any editor embedded views or component refs whose DOM is\n * inside the given cell element. This prevents memory leaks from\n * orphaned Angular views that would otherwise stay in the change\n * detection tree indefinitely.\n */\n releaseCell(cellEl: HTMLElement): void {\n // Release editor embedded views whose root nodes are inside this cell\n for (let i = this.editorViewRefs.length - 1; i >= 0; i--) {\n const ref = this.editorViewRefs[i];\n if (ref.rootNodes.some((n: Node) => cellEl.contains(n))) {\n ref.destroy();\n this.editorViewRefs.splice(i, 1);\n }\n }\n // Release editor component refs whose host element is inside this cell\n for (let i = this.editorComponentRefs.length - 1; i >= 0; i--) {\n const ref = this.editorComponentRefs[i];\n if (cellEl.contains(ref.location.nativeElement)) {\n ref.destroy();\n this.editorComponentRefs.splice(i, 1);\n }\n }\n // Detach editor-mount hook teardowns for editor hosts inside this cell.\n for (const [hostEl, unsub] of this.editorMountTeardowns) {\n if (cellEl.contains(hostEl)) {\n unsub();\n this.editorMountTeardowns.delete(hostEl);\n }\n }\n }\n\n /**\n * Unmount a specific container (e.g., detail panel, tool panel).\n * Finds the matching view or component ref whose DOM nodes are inside\n * the container and properly destroys it to prevent memory leaks.\n */\n unmount(container: HTMLElement): void {\n for (let i = this.viewRefs.length - 1; i >= 0; i--) {\n const ref = this.viewRefs[i];\n if (ref.rootNodes.some((n: Node) => container.contains(n))) {\n ref.destroy();\n this.viewRefs.splice(i, 1);\n return;\n }\n }\n for (let i = this.componentRefs.length - 1; i >= 0; i--) {\n const ref = this.componentRefs[i];\n if (container.contains(ref.location.nativeElement)) {\n ref.destroy();\n this.componentRefs.splice(i, 1);\n return;\n }\n }\n }\n\n /**\n * Clean up all view references and component references.\n * Call this when your app/component is destroyed.\n */\n destroy(): void {\n this.viewRefs.forEach((ref) => ref.destroy());\n this.viewRefs = [];\n this.editorViewRefs.forEach((ref) => ref.destroy());\n this.editorViewRefs = [];\n this.componentRefs.forEach((ref) => ref.destroy());\n this.componentRefs = [];\n this.editorComponentRefs.forEach((ref) => ref.destroy());\n this.editorComponentRefs = [];\n this.editorMountTeardowns.forEach((unsub) => unsub());\n this.editorMountTeardowns.clear();\n }\n\n /**\n * Runs every registered {@link EditorMountHook} against a freshly mounted\n * editor host once it has been parented to the grid. The grid is resolved\n * lazily via `queueMicrotask` because the host is appended to the cell\n * *after* the editor wrapper returns. Mirror of Vue's\n * `attachBeforeEditCloseFlush` and React's `wrapReactEditor`\n * queueMicrotask bridge.\n *\n * Without any feature imports the hook list is empty and this is a no-op\n * — `before-edit-close` blur handling lives in\n * `@toolbox-web/grid-angular/features/editing`.\n * @internal\n */\n private runEditorMountHooks(host: HTMLElement): void {\n queueMicrotask(() => {\n const gridEl = host.closest('tbw-grid') as HTMLElement | null;\n if (!gridEl) return;\n this.editorMountTeardowns.set(host, notifyEditorMounted(host, gridEl));\n });\n }\n}\n","/**\n * Icon configuration registry for Angular applications.\n *\n * Provides application-wide icon overrides for all grids via\n * Angular's dependency injection.\n */\nimport { EnvironmentProviders, inject, Injectable, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport type { GridIcons } from '@toolbox-web/grid';\n\n/**\n * Injection token for providing icon overrides at app level.\n * @since 0.8.0\n */\nexport const GRID_ICONS = new InjectionToken<Partial<GridIcons>>('GRID_ICONS');\n\n/**\n * Injectable service for managing grid icons.\n *\n * Use `provideGridIcons()` in your app config to set up icons,\n * or inject this service for dynamic registration.\n *\n * @example\n * ```typescript\n * // App-level setup (app.config.ts)\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridIcons({\n * expand: '➕',\n * collapse: '➖',\n * sortAsc: '↑',\n * sortDesc: '↓',\n * })\n * ]\n * };\n *\n * // Dynamic registration\n * @Component({ ... })\n * export class AppComponent {\n * private registry = inject(GridIconRegistry);\n *\n * ngOnInit() {\n * this.registry.set('filter', '<svg>...</svg>');\n * }\n * }\n * ```\n * @since 0.8.0\n */\n@Injectable({ providedIn: 'root' })\nexport class GridIconRegistry {\n private readonly icons = new Map<keyof GridIcons, GridIcons[keyof GridIcons]>();\n\n constructor() {\n // Merge any initial icons from provider\n const initial = inject(GRID_ICONS, { optional: true });\n if (initial) {\n for (const [key, value] of Object.entries(initial)) {\n this.icons.set(key as keyof GridIcons, value);\n }\n }\n }\n\n /**\n * Set an icon override.\n *\n * @param name - The icon name (e.g., 'expand', 'collapse', 'filter')\n * @param value - The icon value (string text or SVG markup)\n */\n set<K extends keyof GridIcons>(name: K, value: GridIcons[K]): void {\n this.icons.set(name, value);\n }\n\n /**\n * Get an icon value.\n */\n get<K extends keyof GridIcons>(name: K): GridIcons[K] | undefined {\n return this.icons.get(name) as GridIcons[K] | undefined;\n }\n\n /**\n * Remove an icon override.\n */\n remove(name: keyof GridIcons): void {\n this.icons.delete(name);\n }\n\n /**\n * Check if an icon has an override.\n */\n has(name: keyof GridIcons): boolean {\n return this.icons.has(name);\n }\n\n /**\n * Get all icon overrides as a GridIcons partial.\n * Used internally by the adapter.\n *\n * @internal\n */\n getAll(): Partial<GridIcons> {\n const result: Partial<GridIcons> = {};\n for (const [key, value] of this.icons) {\n (result as Record<keyof GridIcons, GridIcons[keyof GridIcons]>)[key] = value;\n }\n return result;\n }\n\n /**\n * Get all registered icon names.\n */\n getRegisteredIcons(): (keyof GridIcons)[] {\n return Array.from(this.icons.keys());\n }\n}\n\n/**\n * Provides application-level icon overrides for all grids.\n *\n * Available icons to override:\n * - `expand` - Expand icon for collapsed items (trees, groups, details)\n * - `collapse` - Collapse icon for expanded items\n * - `sortAsc` - Sort ascending indicator\n * - `sortDesc` - Sort descending indicator\n * - `sortNone` - Sort neutral/unsorted indicator\n * - `submenuArrow` - Submenu arrow for context menus\n * - `dragHandle` - Drag handle icon for reordering\n * - `toolPanel` - Tool panel toggle icon in toolbar\n * - `filter` - Filter icon in column headers\n * - `filterActive` - Filter icon when filter is active\n * - `print` - Print icon for print button\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { provideGridIcons } from '@toolbox-web/grid-angular';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGridIcons({\n * expand: '➕',\n * collapse: '➖',\n * sortAsc: '↑',\n * sortDesc: '↓',\n * filter: '<svg viewBox=\"0 0 16 16\">...</svg>',\n * })\n * ]\n * };\n * ```\n * @since 0.8.0\n */\nexport function provideGridIcons(icons: Partial<GridIcons>): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: GRID_ICONS, useValue: icons }]);\n}\n","import { afterNextRender, computed, DestroyRef, ElementRef, inject, type Signal, signal } from '@angular/core';\nimport type { ColumnConfig, DataGridElement, GridConfig } from '@toolbox-web/grid';\n\n/**\n * Return type for injectGrid function.\n * @since 0.6.0\n */\nexport interface InjectGridReturn<TRow = unknown> {\n /** Direct access to the typed grid element */\n element: Signal<DataGridElement<TRow> | null>;\n /** Whether the grid is ready */\n isReady: Signal<boolean>;\n /** Current grid configuration */\n config: Signal<GridConfig<TRow> | null>;\n /** Get the effective configuration */\n getConfig: () => Promise<GridConfig<TRow> | null>;\n /** Force a layout recalculation */\n forceLayout: () => Promise<void>;\n /** Toggle a group row */\n toggleGroup: (key: string) => Promise<void>;\n /** Register custom styles */\n registerStyles: (id: string, css: string) => void;\n /** Unregister custom styles */\n unregisterStyles: (id: string) => void;\n /** Get current visible columns */\n visibleColumns: Signal<ColumnConfig<TRow>[]>;\n /**\n * Look up a plugin instance by its class constructor.\n * Returns `undefined` if the plugin is not registered or the grid is not yet ready.\n */\n getPlugin: <T>(pluginClass: new (...args: unknown[]) => T) => T | undefined;\n /**\n * Look up a plugin instance by its registered name (e.g. `'tooltip'`, `'undoRedo'`).\n * Returns `undefined` if the plugin is not registered or the grid is not yet ready.\n */\n getPluginByName: DataGridElement<TRow>['getPluginByName'];\n}\n\n/**\n * Angular inject function for programmatic access to a grid instance.\n *\n * This function should be called in the constructor or as a field initializer\n * of an Angular component that contains a `<tbw-grid>` element.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, injectGrid } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-my-grid',\n * imports: [Grid],\n * template: `\n * <button (click)=\"handleResize()\">Force Layout</button>\n * <button (click)=\"handleExport()\" [disabled]=\"!grid.isReady()\">Export</button>\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\"></tbw-grid>\n * `\n * })\n * export class MyGridComponent {\n * grid = injectGrid<Employee>();\n *\n * async handleResize() {\n * await this.grid.forceLayout();\n * }\n *\n * async handleExport() {\n * const config = await this.grid.getConfig();\n * console.log('Exporting with columns:', config?.columns);\n * }\n * }\n * ```\n *\n * @param selector - Optional CSS selector to target a specific grid element.\n * Defaults to `'tbw-grid'` (first grid in the component). Use when the\n * component contains multiple grids, e.g. `'tbw-grid.primary'` or `'#my-grid'`.\n * @returns Object with grid access methods and state signals\n * @since 0.6.0\n */\nexport function injectGrid<TRow = unknown>(selector = 'tbw-grid'): InjectGridReturn<TRow> {\n const elementRef = inject(ElementRef);\n const destroyRef = inject(DestroyRef);\n\n // Reactive signals\n const isReady = signal(false);\n const config = signal<GridConfig<TRow> | null>(null);\n const element = signal<DataGridElement<TRow> | null>(null);\n\n // Track destruction so async work doesn't touch signals after teardown\n let destroyed = false;\n destroyRef.onDestroy(() => {\n destroyed = true;\n });\n\n // Initialize after render\n afterNextRender(() => {\n const gridElement = elementRef.nativeElement.querySelector(selector) as DataGridElement<TRow>;\n if (!gridElement) {\n console.warn('[injectGrid] No tbw-grid element found in component');\n return;\n }\n\n element.set(gridElement);\n\n // Wait for grid to be ready. Use Promise.resolve to guard against\n // gridElement.ready being undefined (would otherwise throw on .then).\n Promise.resolve(gridElement.ready?.())\n .then(async () => {\n if (destroyed) return;\n isReady.set(true);\n const effectiveConfig = await gridElement.getConfig?.();\n if (destroyed) return;\n if (effectiveConfig) {\n config.set(effectiveConfig as GridConfig<TRow>);\n }\n })\n .catch((err) => {\n console.error('[injectGrid] Error waiting for grid to be ready:', err);\n });\n });\n\n // Computed visible columns\n const visibleColumns = computed<ColumnConfig<TRow>[]>(() => {\n const currentConfig = config();\n if (!currentConfig?.columns) return [];\n return currentConfig.columns.filter((col) => !col.hidden);\n });\n\n // ═══════════════════════════════════════════════════════════════════\n // CORE METHODS\n // ═══════════════════════════════════════════════════════════════════\n\n const getConfig = async (): Promise<GridConfig<TRow> | null> => {\n const gridElement = element();\n if (!gridElement) return null;\n const effectiveConfig = gridElement.getConfig?.();\n return (effectiveConfig as GridConfig<TRow>) ?? null;\n };\n\n const forceLayout = async (): Promise<void> => {\n const gridElement = element();\n if (!gridElement) return;\n await gridElement.forceLayout?.();\n };\n\n const toggleGroup = async (key: string): Promise<void> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const gridElement = element() as any;\n if (!gridElement) return;\n await gridElement.toggleGroup?.(key);\n };\n\n const registerStyles = (id: string, css: string): void => {\n element()?.registerStyles?.(id, css);\n };\n\n const unregisterStyles = (id: string): void => {\n element()?.unregisterStyles?.(id);\n };\n\n const getPlugin = <T>(pluginClass: new (...args: unknown[]) => T): T | undefined => {\n return element()?.getPlugin?.(pluginClass);\n };\n\n const getPluginByName = ((name: string) => {\n return element()?.getPluginByName?.(name);\n }) as DataGridElement<TRow>['getPluginByName'];\n\n return {\n element,\n isReady,\n config,\n visibleColumns,\n getConfig,\n forceLayout,\n toggleGroup,\n registerStyles,\n unregisterStyles,\n getPlugin,\n getPluginByName,\n };\n}\n","/**\n * Feature Registry for @toolbox-web/grid-angular\n *\n * Delegates to the core registry at `@toolbox-web/grid/features/registry`.\n * This module re-exports core functions so existing feature modules continue\n * to work without changing their import paths.\n *\n * @example\n * ```typescript\n * // Import features you need (side-effect imports)\n * import '@toolbox-web/grid-angular/features/selection';\n * import '@toolbox-web/grid-angular/features/filtering';\n *\n * // Inputs work automatically - no async loading, no HTTP requests\n * <tbw-grid [selection]=\"'range'\" [filtering]=\"{ debounceMs: 200 }\" />\n * ```\n */\n\n// Re-export core registry — all adapters share the same registry Map\nexport {\n clearFeatureRegistry,\n createPluginFromFeature,\n getFeatureFactory,\n getRegisteredFeatures,\n isFeatureRegistered,\n registerFeature,\n} from '@toolbox-web/grid/features/registry';\n\nexport type { PluginFactory } from '@toolbox-web/grid/features/registry';\n\n/**\n * Feature names supported by the Grid directive.\n * @since 0.6.0\n */\nexport type FeatureName =\n | 'selection'\n | 'editing'\n | 'clipboard'\n | 'contextMenu'\n | 'multiSort'\n | 'filtering'\n | 'reorderColumns'\n | 'visibility'\n | 'pinnedColumns'\n | 'groupingColumns'\n | 'columnVirtualization'\n | 'reorderRows'\n | 'rowDragDrop'\n | 'groupingRows'\n | 'pinnedRows'\n | 'tree'\n | 'masterDetail'\n | 'responsive'\n | 'undoRedo'\n | 'export'\n | 'print'\n | 'pivot'\n | 'serverSide'\n | 'tooltip';\n","import { Directive, input } from '@angular/core';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport type { FilterPanel } from './angular-column-config';\n\n/**\n * Base class for Angular filter panel components.\n *\n * Provides a ready-made `params` input and common lifecycle helpers\n * (`applyAndClose`, `clearAndClose`) so consumers only need to implement\n * their filter logic in `applyFilter()`.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, viewChild, ElementRef } from '@angular/core';\n * import { BaseFilterPanel } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-text-filter',\n * template: `\n * <input #input (keydown.enter)=\"applyAndClose()\" />\n * <button (click)=\"applyAndClose()\">Apply</button>\n * <button (click)=\"clearAndClose()\">Clear</button>\n * `\n * })\n * export class TextFilterComponent extends BaseFilterPanel {\n * input = viewChild.required<ElementRef<HTMLInputElement>>('input');\n *\n * applyFilter(): void {\n * this.params().applyTextFilter('contains', this.input().nativeElement.value);\n * }\n * }\n * ```\n *\n * ## Template Syntax\n *\n * The grid's filtering plugin will mount this component and provide `params`\n * automatically. No manual wiring is required:\n *\n * ```typescript\n * gridConfig = {\n * columns: [\n * { field: 'name', filterable: true, filterPanel: TextFilterComponent },\n * ],\n * };\n * ```\n *\n * @typeParam TRow - The row data type (available via `params().column`)\n *\n * MOVE-IN-V2: this class will physically move into\n * `@toolbox-web/grid-angular/features/filtering` in v2.0.0; the deprecated\n * re-export from the main `@toolbox-web/grid-angular` entry will be removed at\n * the same time. Consumers should already be importing from the feature entry.\n * @since 0.13.0\n */\n@Directive()\nexport abstract class BaseFilterPanel implements FilterPanel {\n /**\n * Filter panel parameters injected by the grid's filtering plugin.\n *\n * Provides access to:\n * - `field` — the column field name\n * - `column` — full column configuration\n * - `uniqueValues` — distinct values in the column\n * - `excludedValues` — currently excluded values (set filter)\n * - `searchText` — current search text\n * - `applySetFilter(excluded)` — apply a set-based (include/exclude) filter\n * - `applyTextFilter(operator, value, valueTo?)` — apply a text/number filter\n * - `clearFilter()` — clear the filter for this column\n * - `closePanel()` — close the filter panel\n */\n readonly params = input.required<FilterPanelParams>();\n\n /**\n * Implement this to apply your filter logic.\n *\n * Called by {@link applyAndClose} before closing the panel.\n * Use `this.params()` to access the filter API.\n *\n * @example\n * ```typescript\n * applyFilter(): void {\n * this.params().applyTextFilter('contains', this.searchText);\n * }\n * ```\n */\n abstract applyFilter(): void;\n\n /**\n * Apply the filter then close the panel.\n *\n * Calls {@link applyFilter} followed by `params().closePanel()`.\n * Bind this to your \"Apply\" button or Enter key handler.\n */\n applyAndClose(): void {\n this.applyFilter();\n this.params().closePanel();\n }\n\n /**\n * Clear the filter then close the panel.\n *\n * Calls `params().clearFilter()` followed by `params().closePanel()`.\n * Bind this to your \"Clear\" / \"Reset\" button.\n */\n clearAndClose(): void {\n this.params().clearFilter();\n this.params().closePanel();\n }\n}\n","import { afterNextRender, computed, DestroyRef, Directive, ElementRef, inject, input, output } from '@angular/core';\nimport type { AbstractControl } from '@angular/forms';\nimport type { ColumnConfig } from '@toolbox-web/grid';\n\n/**\n * Base class for grid cell editors.\n *\n * Provides common functionality for Angular cell editors:\n * - Automatic value resolution from FormControl or value input\n * - Common inputs (value, row, column, control)\n * - Common outputs (commit, cancel)\n * - Validation state helpers\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { BaseGridEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-my-editor',\n * template: \\`\n * <input\n * [value]=\"currentValue()\"\n * [class.is-invalid]=\"isInvalid()\"\n * (input)=\"commitValue($event.target.value)\"\n * (keydown.escape)=\"cancelEdit()\"\n * />\n * @if (hasErrors()) {\n * <div class=\"error\">{{ firstErrorMessage() }}</div>\n * }\n * \\`\n * })\n * export class MyEditorComponent extends BaseGridEditor<MyRow, string> {\n * // Override to customize error messages\n * protected override getErrorMessage(errorKey: string): string {\n * if (errorKey === 'required') return 'This field is required';\n * if (errorKey === 'minlength') return 'Too short';\n * return super.getErrorMessage(errorKey);\n * }\n * }\n * ```\n *\n * ## Template Syntax\n *\n * When using the base class, you only need to pass the control:\n *\n * ```html\n * <tbw-grid-column field=\"name\">\n * <app-my-editor *tbwEditor=\"let _; control as control\" [control]=\"control\" />\n * </tbw-grid-column>\n * ```\n *\n * Or without FormArray binding (fallback to value):\n *\n * ```html\n * <tbw-grid-column field=\"name\">\n * <app-my-editor *tbwEditor=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * ```\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell value type\n *\n * MOVE-IN-V2: this class will physically move into\n * `@toolbox-web/grid-angular/features/editing` in v2.0.0; the deprecated\n * re-export from the main `@toolbox-web/grid-angular` entry will be removed at\n * the same time. Consumers should already be importing from the feature entry.\n * @since 0.5.0\n */\n@Directive()\nexport abstract class BaseGridEditor<TRow = unknown, TValue = unknown> {\n protected readonly elementRef = inject(ElementRef);\n private readonly _destroyRef = inject(DestroyRef);\n\n /** Cleanup function for the edit-close listener */\n private _editCloseCleanup: (() => void) | null = null;\n\n // ============================================================================\n // Inputs\n // ============================================================================\n\n /**\n * The cell value. Used when FormControl is not available.\n * When a FormControl is provided, value is derived from control.value instead.\n */\n readonly value = input<TValue>();\n\n /**\n * The full row data object.\n */\n readonly row = input<TRow>();\n\n /**\n * The column configuration.\n */\n readonly column = input<ColumnConfig<TRow>>();\n\n /**\n * The FormControl for this cell, if the grid is bound to a FormArray.\n * When provided, the editor uses control.value instead of the value input.\n */\n readonly control = input<AbstractControl>();\n\n // ============================================================================\n // Outputs\n // ============================================================================\n\n /**\n * Emits when the user commits a new value.\n * Emits `null` when a nullable field is cleared.\n */\n readonly commit = output<TValue | null>();\n\n /**\n * Emits when the user cancels editing.\n */\n readonly cancel = output<void>();\n\n // ============================================================================\n // Computed State\n // ============================================================================\n\n /**\n * The current value, derived from FormControl if available, otherwise from value input.\n * This is the recommended way to get the current value in your editor template.\n */\n readonly currentValue = computed<TValue | undefined>(() => {\n const ctrl = this.control();\n if (ctrl) {\n return ctrl.value as TValue;\n }\n return this.value();\n });\n\n /**\n * Whether the control is invalid (has validation errors).\n * Returns false if no FormControl is available.\n */\n readonly isInvalid = computed(() => {\n return this.control()?.invalid ?? false;\n });\n\n /**\n * Whether the control is dirty (has been modified).\n * Returns false if no FormControl is available.\n */\n readonly isDirty = computed(() => {\n return this.control()?.dirty ?? false;\n });\n\n /**\n * Whether the control has been touched.\n * Returns false if no FormControl is available.\n */\n readonly isTouched = computed(() => {\n return this.control()?.touched ?? false;\n });\n\n /**\n * Whether the control has any validation errors.\n */\n readonly hasErrors = computed(() => {\n const ctrl = this.control();\n return ctrl?.errors != null && Object.keys(ctrl.errors).length > 0;\n });\n\n /**\n * The first error message from the control's validation errors.\n * Returns an empty string if no errors.\n */\n readonly firstErrorMessage = computed(() => {\n const ctrl = this.control();\n if (!ctrl?.errors) return '';\n\n const firstKey = Object.keys(ctrl.errors)[0];\n return this.getErrorMessage(firstKey, ctrl.errors[firstKey]);\n });\n\n /**\n * All error messages from the control's validation errors.\n */\n readonly allErrorMessages = computed(() => {\n const ctrl = this.control();\n if (!ctrl?.errors) return [];\n\n return Object.entries(ctrl.errors).map(([key, value]) => this.getErrorMessage(key, value));\n });\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n constructor() {\n afterNextRender(() => this._initEditCloseListener());\n this._destroyRef.onDestroy(() => {\n this._editCloseCleanup?.();\n this._editCloseCleanup = null;\n });\n }\n\n private _initEditCloseListener(): void {\n const grid = this.elementRef.nativeElement.closest('tbw-grid') as\n | import('@toolbox-web/grid').DataGridElement\n | null;\n if (!grid) return;\n\n let unsubBefore: (() => void) | undefined;\n let unsubClose: (() => void) | undefined;\n\n unsubBefore = grid.on('before-edit-close', () => {\n this.onBeforeEditClose();\n unsubBefore?.();\n unsubBefore = undefined;\n });\n\n unsubClose = grid.on('edit-close', () => {\n this.onEditClose();\n unsubClose?.();\n unsubClose = undefined;\n });\n\n this._editCloseCleanup = () => {\n unsubBefore?.();\n unsubClose?.();\n };\n }\n\n // ============================================================================\n // Methods\n // ============================================================================\n\n /**\n * Whether this editor's cell is the currently focused cell.\n *\n * In row editing mode the grid creates editors for every editable cell\n * in the row simultaneously. Use this to conditionally auto-focus inputs\n * or open panels only in the active cell.\n *\n * Performs a synchronous DOM check — safe to call from `ngAfterViewInit`.\n */\n protected isCellFocused(): boolean {\n return this.elementRef.nativeElement.closest('[part=\"cell\"]')?.classList.contains('cell-focus') ?? false;\n }\n\n /**\n * Called **before** the grid clears editing state and destroys editor DOM.\n *\n * At this point the commit callback is still active, so subclasses can\n * call {@link commitValue} to flush any pending/deferred values.\n *\n * This fires only on the **commit** path (not on revert/cancel).\n * Use {@link onEditClose} for cleanup that should happen on both paths.\n */\n protected onBeforeEditClose(): void {\n // Default: no-op. Subclasses override to flush pending values.\n }\n\n /**\n * Called when the grid ends the editing session for this cell.\n *\n * Override to perform cleanup such as closing overlay panels, autocomplete\n * dropdowns, or other floating UI that lives at `<body>` level and would\n * otherwise persist after the editor DOM is removed.\n *\n * The listener is set up automatically via `afterNextRender` — no manual\n * wiring required.\n */\n protected onEditClose(): void {\n // Default: no-op. Subclasses override.\n }\n\n /**\n * Called by the grid adapter when the cell value changes externally\n * (e.g., via `updateRow()` cascade or undo/redo).\n *\n * Override in subclasses to reset internal state (search text, selection\n * flags, etc.) so the editor displays the updated value.\n *\n * This runs **synchronously** before the value input is updated, giving\n * the editor a chance to clear stale state before the next change-detection\n * pass re-reads the template.\n *\n * @param _newVal The new cell value being pushed from the grid\n */\n onExternalValueChange(_newVal: TValue): void {\n // Default: no-op. Subclasses override as needed.\n }\n\n /**\n * Commit a new value. Emits the commit output AND dispatches a DOM event.\n * The DOM event enables the grid's auto-wiring to catch the commit.\n * Call this when the user confirms their edit.\n */\n commitValue(newValue: TValue | null): void {\n // Emit Angular output for template bindings\n this.commit.emit(newValue);\n\n // Dispatch DOM CustomEvent for grid's auto-wiring\n // This allows the adapter to catch commits without explicit (commit)=\"...\" bindings\n this.elementRef.nativeElement.dispatchEvent(new CustomEvent('commit', { detail: newValue, bubbles: true }));\n }\n\n /**\n * Cancel editing. Emits the cancel output AND dispatches a DOM event.\n * Call this when the user cancels (e.g., presses Escape).\n */\n cancelEdit(): void {\n // Emit Angular output for template bindings\n this.cancel.emit();\n\n // Dispatch DOM CustomEvent for grid's auto-wiring\n this.elementRef.nativeElement.dispatchEvent(new CustomEvent('cancel', { bubbles: true }));\n }\n\n /**\n * Get a human-readable error message for a validation error.\n * Override this method to customize error messages for your editor.\n *\n * @param errorKey - The validation error key (e.g., 'required', 'minlength')\n * @param errorValue - The error value (e.g., { requiredLength: 5, actualLength: 3 })\n * @returns A human-readable error message\n */\n protected getErrorMessage(errorKey: string, errorValue?: unknown): string {\n switch (errorKey) {\n case 'required':\n return 'This field is required';\n case 'minlength': {\n const err = errorValue as { requiredLength?: number };\n return `Minimum length is ${err?.requiredLength ?? 'unknown'}`;\n }\n case 'maxlength': {\n const err = errorValue as { requiredLength?: number };\n return `Maximum length is ${err?.requiredLength ?? 'unknown'}`;\n }\n case 'min': {\n const err = errorValue as { min?: number };\n return `Minimum value is ${err?.min ?? 'unknown'}`;\n }\n case 'max': {\n const err = errorValue as { max?: number };\n return `Maximum value is ${err?.max ?? 'unknown'}`;\n }\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n return `Invalid value (${errorKey})`;\n }\n }\n}\n","import { computed, Directive, signal } from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\nimport { BaseGridEditor } from './base-grid-editor';\n\n/**\n * Base class for grid editors that also work as Angular form controls.\n *\n * Combines `BaseGridEditor` with `ControlValueAccessor` so the same component\n * can be used inside a `<tbw-grid>` **and** in a standalone `<form>`.\n *\n * ## What it provides\n *\n * | Member | Purpose |\n * |--------|---------|\n * | `cvaValue` | Signal holding the value written by the form control |\n * | `disabledState` | Signal tracking `setDisabledState` calls |\n * | `displayValue` | Computed that prefers grid value (`currentValue`) and falls back to `cvaValue` |\n * | `commitBoth(v)` | Commits via both CVA `onChange` and grid `commitValue` |\n * | `writeValue` / `registerOn*` / `setDisabledState` | Full CVA implementation |\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, forwardRef } from '@angular/core';\n * import { NG_VALUE_ACCESSOR } from '@angular/forms';\n * import { BaseGridEditorCVA } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-date-picker',\n * providers: [{\n * provide: NG_VALUE_ACCESSOR,\n * useExisting: forwardRef(() => DatePickerComponent),\n * multi: true,\n * }],\n * template: `\n * <input\n * type=\"date\"\n * [value]=\"displayValue()\"\n * [disabled]=\"disabledState()\"\n * (change)=\"commitBoth($event.target.value)\"\n * (keydown.escape)=\"cancelEdit()\"\n * />\n * `\n * })\n * export class DatePickerComponent extends BaseGridEditorCVA<MyRow, string> {}\n * ```\n *\n * > **Note:** Subclasses must still provide `NG_VALUE_ACCESSOR` themselves\n * > because `forwardRef(() => ConcreteClass)` must reference the concrete\n * > component — this is an Angular limitation.\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell/control value type\n *\n * MOVE-IN-V2: this class will physically move into\n * `@toolbox-web/grid-angular/features/editing` in v2.0.0; the deprecated\n * re-export from the main `@toolbox-web/grid-angular` entry will be removed at\n * the same time. Consumers should already be importing from the feature entry.\n * @since 0.13.0\n */\n@Directive()\nexport abstract class BaseGridEditorCVA<TRow = unknown, TValue = unknown>\n extends BaseGridEditor<TRow, TValue>\n implements ControlValueAccessor\n{\n // ============================================================================\n // CVA State\n // ============================================================================\n\n /** Internal onChange callback registered by the form control. */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onChange: (value: TValue | null) => void = () => {};\n\n /** Internal onTouched callback registered by the form control. */\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private _onTouched: () => void = () => {};\n\n /**\n * Signal holding the value written by the form control via `writeValue()`.\n * Updated when the form control pushes a new value (e.g. `patchValue`, `setValue`).\n */\n protected readonly cvaValue = signal<TValue | null>(null);\n\n /**\n * Signal tracking the disabled state set by the form control.\n * Updated when `setDisabledState()` is called by Angular's forms module.\n */\n readonly disabledState = signal(false);\n\n /**\n * Resolved display value.\n *\n * Prefers `currentValue()` (grid context — from `control.value` or `value` input)\n * and falls back to `cvaValue()` (standalone form context — from `writeValue`).\n *\n * Use this in your template instead of reading `currentValue()` directly\n * so the component works in both grid and standalone form contexts.\n */\n readonly displayValue = computed<TValue | null>(() => {\n return (this.currentValue() as TValue | undefined) ?? this.cvaValue();\n });\n\n // ============================================================================\n // ControlValueAccessor Implementation\n // ============================================================================\n\n /**\n * Called by Angular forms when the form control value changes programmatically.\n */\n writeValue(value: TValue | null): void {\n this.cvaValue.set(value);\n }\n\n /**\n * Called by Angular forms to register a change callback.\n */\n registerOnChange(fn: (value: TValue | null) => void): void {\n this._onChange = fn;\n }\n\n /**\n * Called by Angular forms to register a touched callback.\n */\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n /**\n * Called by Angular forms to set the disabled state.\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabledState.set(isDisabled);\n }\n\n // ============================================================================\n // Dual-Commit Helpers\n // ============================================================================\n\n /**\n * Commit a value through both the CVA (form control) and the grid.\n *\n * - Calls the CVA `onChange` callback (updates the form control)\n * - Marks the control as touched\n * - Calls `commitValue()` (emits grid commit event + DOM `CustomEvent`)\n *\n * Use this instead of `commitValue()` when your editor doubles as a form control.\n *\n * @param value - The new value to commit\n */\n protected commitBoth(value: TValue | null): void {\n // Update CVA\n this.cvaValue.set(value);\n this._onChange(value);\n this._onTouched();\n\n // Update grid (null is valid for nullable columns — the grid's cell-commit\n // handler and EditingPlugin will apply it correctly)\n this.commitValue(value);\n }\n}\n","import { afterNextRender, DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { BaseGridEditor } from './base-grid-editor';\n\n// #region Overlay Position Types\n\n/**\n * Position of the overlay panel relative to its anchor cell.\n *\n * - `'below'` — panel appears below the cell, left-aligned (default)\n * - `'above'` — panel appears above the cell, left-aligned\n * - `'below-right'` — panel appears below the cell, right-aligned\n * - `'over-top-left'` — panel top-left corner aligns with cell top-left corner (opens downward)\n * - `'over-bottom-left'` — panel bottom-left corner aligns with cell bottom-left corner (opens upward)\n * @since 0.13.0\n */\nexport type OverlayPosition = 'below' | 'above' | 'below-right' | 'over-top-left' | 'over-bottom-left';\n\n// #endregion\n\n// #region Global Styles\n\n/** Tracks whether the global overlay stylesheet has been injected. */\nlet overlayStylesInjected = false;\n\n/**\n * CSS for the overlay panel base layer.\n * Injected once into `<head>` on first `BaseOverlayEditor` use.\n *\n * Uses CSS Anchor Positioning as primary strategy with a JS fallback\n * for browsers that don't support it (Firefox, Safari as of late 2025).\n */\nconst OVERLAY_STYLES = /* css */ `\n.tbw-overlay-panel {\n position: fixed;\n z-index: 10000;\n background: var(--tbw-overlay-bg, #fff);\n border: 1px solid var(--tbw-overlay-border, #ccc);\n border-radius: var(--tbw-overlay-radius, 4px);\n box-shadow: var(--tbw-overlay-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));\n box-sizing: border-box;\n overflow: auto;\n}\n\n/* Hide panels that have not been initialised via initOverlay() yet.\n Prevents a flash-of-unstyled-content when the subclass defers\n the initOverlay call (e.g. via setTimeout or afterNextRender). */\n.tbw-overlay-panel:not([data-anchor-id]) {\n display: none;\n}\n\n.tbw-overlay-panel:popover-open {\n display: block;\n}\n\n@supports (anchor-name: --a) {\n .tbw-overlay-panel[data-anchor-id] {\n position: fixed;\n position-anchor: var(--tbw-overlay-anchor);\n inset: unset;\n }\n .tbw-overlay-panel[data-pos=\"below\"] {\n top: anchor(bottom);\n left: anchor(left);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"above\"] {\n bottom: anchor(top);\n left: anchor(left);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"below-right\"] {\n top: anchor(bottom);\n right: anchor(right);\n position-try-fallbacks: flip-block;\n }\n .tbw-overlay-panel[data-pos=\"over-top-left\"] {\n top: anchor(top);\n left: anchor(left);\n }\n .tbw-overlay-panel[data-pos=\"over-bottom-left\"] {\n bottom: anchor(bottom);\n left: anchor(left);\n }\n}\n`;\n\nfunction ensureOverlayStyles(): void {\n if (overlayStylesInjected) return;\n overlayStylesInjected = true;\n\n const style = document.createElement('style');\n style.setAttribute('data-tbw-overlay', '');\n style.textContent = OVERLAY_STYLES;\n document.head.appendChild(style);\n}\n\n// #endregion\n\n// #region Anchor ID Counter\nlet anchorCounter = 0;\n// #endregion\n\n/**\n * Base class for grid editors that display a floating overlay panel.\n *\n * Provides infrastructure for:\n * - **Overlay positioning** — CSS Anchor Positioning with JS fallback\n * - **Focus gating** — in row editing mode, the panel only opens for the focused cell\n * - **Click-outside detection** — closes the panel when clicking outside\n * - **MutationObserver** — detects cell focus changes (row editing mode)\n * - **Escape handling** — closes the panel and returns focus to the inline input\n * - **Synthetic Tab dispatch** — advances grid focus after overlay close\n * - **Automatic teardown** — removes the panel from `<body>` and cleans up listeners\n * - **External focus registration** — auto-registers the panel via `grid.registerExternalFocusContainer()` so the grid keeps `data-has-focus` and editors stay open while the overlay has focus\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, viewChild, ElementRef, effect } from '@angular/core';\n * import { BaseOverlayEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-date-editor',\n * template: `\n * <input\n * #inlineInput\n * readonly\n * [value]=\"currentValue()\"\n * (click)=\"onInlineClick()\"\n * (keydown)=\"onInlineKeydown($event)\"\n * />\n * <div #panel class=\"tbw-overlay-panel\" style=\"width: 280px;\">\n * <!-- your date picker UI here -->\n * <div class=\"actions\">\n * <button (click)=\"selectAndClose(selectedDate)\">OK</button>\n * <button (click)=\"hideOverlay()\">Cancel</button>\n * </div>\n * </div>\n * `\n * })\n * export class DateEditorComponent extends BaseOverlayEditor<MyRow, string> {\n * panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n * inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inlineInput');\n *\n * protected override overlayPosition = 'below' as const;\n *\n * constructor() {\n * super();\n * effect(() => {\n * const panel = this.panelRef().nativeElement;\n * this.initOverlay(panel);\n * if (this.isCellFocused()) this.showOverlay();\n * });\n * }\n *\n * protected getInlineInput(): HTMLInputElement | null {\n * return this.inputRef()?.nativeElement ?? null;\n * }\n *\n * protected onOverlayOutsideClick(): void {\n * this.hideOverlay();\n * }\n *\n * selectAndClose(date: string): void {\n * this.commitValue(date);\n * this.hideOverlay();\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <input #inlineInput readonly [value]=\"currentValue()\"\n * (click)=\"onInlineClick()\" (keydown)=\"onInlineKeydown($event)\" />\n * <div #panel style=\"width: 280px\">\n * <!-- overlay content -->\n * </div>\n * `\n * })\n * export class MyEditor extends BaseOverlayEditor<MyRow, string> {\n * panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n * inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inlineInput');\n *\n * constructor() {\n * super();\n * effect(() => this.initOverlay(this.panelRef().nativeElement));\n * }\n *\n * protected getInlineInput() { return this.inputRef()?.nativeElement ?? null; }\n * protected onOverlayOutsideClick() { this.hideOverlay(); }\n * }\n * ```\n *\n * @typeParam TRow - The row data type\n * @typeParam TValue - The cell value type\n *\n * MOVE-IN-V2: this class (and its companion `OverlayPosition` type) will\n * physically move into `@toolbox-web/grid-angular/features/editing` in v2.0.0;\n * the deprecated re-export from the main `@toolbox-web/grid-angular` entry\n * will be removed at the same time. Consumers should already be importing\n * from the feature entry.\n * @since 0.13.0\n */\n@Directive()\nexport abstract class BaseOverlayEditor<TRow = unknown, TValue = unknown> extends BaseGridEditor<TRow, TValue> {\n private readonly _elementRef = inject(ElementRef);\n private readonly _overlayDestroyRef = inject(DestroyRef);\n\n // ============================================================================\n // Configuration\n // ============================================================================\n\n /**\n * Position of the overlay panel relative to the anchor cell.\n * Override in subclasses to change the default position.\n *\n * @default 'below'\n */\n protected overlayPosition: OverlayPosition = 'below';\n\n // ============================================================================\n // Internal State\n // ============================================================================\n\n /** The overlay panel element (set via `initOverlay()`). */\n private _panel: HTMLElement | null = null;\n\n /** Whether the overlay is currently visible. */\n protected _isOpen = false;\n\n /** Unique anchor ID for CSS Anchor Positioning. */\n private _anchorId = '';\n\n /** Whether the browser supports CSS Anchor Positioning. */\n private _supportsAnchor = false;\n\n /** AbortController for all overlay-related listeners. */\n private _abortCtrl: AbortController | null = null;\n\n /** MutationObserver watching cell focus class changes. */\n protected _focusObserver: MutationObserver | null = null;\n\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n constructor() {\n super();\n this._supportsAnchor = typeof CSS !== 'undefined' && CSS.supports('anchor-name', '--a');\n ensureOverlayStyles();\n\n afterNextRender(() => this._setupFocusObserver());\n this._overlayDestroyRef.onDestroy(() => this.teardownOverlay());\n }\n\n // ============================================================================\n // Public API — Subclass Interface\n // ============================================================================\n\n /**\n * Initialise the overlay with the panel element.\n *\n * Call this in an `effect()` or `afterNextRender()` with your `viewChild` panel reference.\n * The panel is moved to `<body>` and hidden until {@link showOverlay} is called.\n *\n * @param panel - The overlay panel DOM element\n */\n protected initOverlay(panel: HTMLElement): void {\n this._panel = panel;\n\n // Assign a unique anchor ID\n this._anchorId = `tbw-anchor-${++anchorCounter}`;\n panel.classList.add('tbw-overlay-panel');\n panel.setAttribute('data-pos', this.overlayPosition);\n panel.setAttribute('data-anchor-id', this._anchorId);\n panel.style.display = 'none';\n\n // Set up CSS Anchor Positioning on the cell\n if (this._supportsAnchor) {\n const cell = this._getCell();\n if (cell) {\n cell.style.setProperty('anchor-name', `--${this._anchorId}`);\n panel.style.setProperty('--tbw-overlay-anchor', `--${this._anchorId}`);\n }\n }\n\n // Move panel to body so it escapes grid overflow clipping\n document.body.appendChild(panel);\n\n // Register the panel as an external focus container on the grid\n // so focus moving into the overlay is treated as \"still in the grid\"\n this._getGridElement()?.registerExternalFocusContainer?.(panel);\n\n // Set up click-outside detection\n this._abortCtrl = new AbortController();\n document.addEventListener('pointerdown', (e) => this._onDocumentPointerDown(e), {\n signal: this._abortCtrl.signal,\n });\n\n // Close overlay when the grid viewport scrolls. Mirrors outside-click\n // semantics so subclasses' `onOverlayOutsideClick()` drives commit/cancel.\n // Uses the public `tbw-scroll` CustomEvent dispatched on the grid host —\n // no shadow-DOM reach-arounds required (composed: true crosses boundaries).\n const grid = this._getGridElement();\n if (grid) {\n grid.addEventListener('tbw-scroll', () => this._onGridScroll(), {\n signal: this._abortCtrl.signal,\n });\n }\n\n // If the focus observer already fired before the panel was initialised\n // (e.g. initOverlay called from a deferred setTimeout), the showOverlay()\n // call was silently ignored because _panel was still null. Catch up now.\n if (this._getCell()?.classList.contains('cell-focus')) {\n this.showOverlay();\n this.onOverlayOpened();\n }\n }\n\n /**\n * Show the overlay panel.\n *\n * If CSS Anchor Positioning is not supported, falls back to JS-based\n * positioning using `getBoundingClientRect()`.\n */\n protected showOverlay(): void {\n if (!this._panel || this._isOpen) return;\n\n this._isOpen = true;\n this._panel.style.display = '';\n\n // JS fallback positioning for browsers without CSS Anchor Positioning\n if (!this._supportsAnchor) {\n this._positionWithJs();\n }\n }\n\n /**\n * Hide the overlay panel.\n *\n * @param suppressTabAdvance - When `true`, skip synthetic Tab dispatch\n * (useful when hiding is triggered by an external focus change).\n */\n protected hideOverlay(suppressTabAdvance?: boolean): void {\n if (!this._panel || !this._isOpen) return;\n\n this._isOpen = false;\n this._panel.style.display = 'none';\n\n if (!suppressTabAdvance) {\n this.getInlineInput()?.focus();\n }\n }\n\n /**\n * Close and immediately re-open the overlay.\n * Useful after the panel content changes size and needs repositioning.\n */\n protected reopenOverlay(): void {\n if (!this._panel) return;\n this._isOpen = false;\n this._panel.style.display = 'none';\n this.showOverlay();\n }\n\n /**\n * Remove the overlay from the DOM and clean up all listeners.\n *\n * Called automatically on `DestroyRef.onDestroy`. Can also be called\n * manually if the editor needs early cleanup.\n */\n protected teardownOverlay(): void {\n this._abortCtrl?.abort();\n this._abortCtrl = null;\n\n this._focusObserver?.disconnect();\n this._focusObserver = null;\n\n // Unregister the panel from the grid's external focus container registry\n if (this._panel) {\n this._getGridElement()?.unregisterExternalFocusContainer?.(this._panel);\n }\n\n if (this._panel?.parentNode) {\n this._panel.parentNode.removeChild(this._panel);\n }\n this._panel = null;\n this._isOpen = false;\n\n // Clean up anchor-name on the cell\n if (this._supportsAnchor) {\n const cell = this._getCell();\n if (cell) {\n cell.style.removeProperty('anchor-name');\n }\n }\n }\n\n /**\n * Override in `edit-close` handler to also hide the overlay.\n * This is called automatically by `BaseGridEditor` when the grid\n * ends the editing session.\n */\n protected override onEditClose(): void {\n this.hideOverlay(true);\n }\n\n // ============================================================================\n // Keyboard & Click Helpers\n // ============================================================================\n\n /**\n * Keydown handler for the inline readonly input.\n *\n * - **Enter / Space / ArrowDown / F2** → open overlay\n * - **Escape** → calls {@link handleEscape}\n *\n * Bind this to `(keydown)` on your inline input element.\n */\n onInlineKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'Enter':\n case ' ':\n case 'ArrowDown':\n case 'F2':\n event.preventDefault();\n this.showOverlay();\n this.onOverlayOpened();\n break;\n case 'Escape':\n this.handleEscape(event);\n break;\n }\n }\n\n /**\n * Click handler for the inline input.\n * Opens the overlay and calls {@link onOverlayOpened}.\n *\n * Bind this to `(click)` on your inline input element.\n */\n onInlineClick(): void {\n if (this._isOpen) {\n this.hideOverlay();\n } else {\n this.showOverlay();\n this.onOverlayOpened();\n }\n }\n\n /**\n * Handle Escape key press.\n *\n * If the overlay is open, closes it and returns focus to the inline input.\n * If the overlay is already closed, cancels the edit entirely.\n */\n protected handleEscape(event: Event): void {\n if (this._isOpen) {\n event.stopPropagation();\n this.hideOverlay();\n } else {\n this.cancelEdit();\n }\n }\n\n /**\n * Dispatch a synthetic Tab key event to advance grid focus.\n *\n * Call this after committing a value and closing the overlay so the\n * grid moves focus to the next cell.\n *\n * @param backward - When `true`, dispatch Shift+Tab to move backwards.\n */\n protected advanceGridFocus(backward = false): void {\n const cell = this._getCell();\n if (!cell) return;\n\n cell.dispatchEvent(\n new KeyboardEvent('keydown', {\n key: 'Tab',\n shiftKey: backward,\n bubbles: true,\n cancelable: true,\n }),\n );\n }\n\n // ============================================================================\n // Abstract / Hook Methods\n // ============================================================================\n\n /**\n * Return the inline input element, if any.\n *\n * Used by overlay infrastructure to return focus after hiding.\n * Return `null` if there is no inline input.\n */\n protected abstract getInlineInput(): HTMLInputElement | null;\n\n /**\n * Called when a pointerdown event occurs outside the overlay panel\n * and outside the editor's host element.\n *\n * Typically, subclasses call `hideOverlay()` here.\n */\n protected abstract onOverlayOutsideClick(): void;\n\n /**\n * Called after the overlay is shown.\n *\n * Override to focus an element inside the panel, start animations, etc.\n * Default implementation is a no-op.\n */\n protected onOverlayOpened(): void {\n // Default: no-op. Subclasses override.\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /** Find the parent cell element for this editor. */\n private _getCell(): HTMLElement | null {\n return this._elementRef.nativeElement.closest('[part=\"cell\"]') ?? null;\n }\n\n /** Find the parent `<tbw-grid>` element for this editor. */\n private _getGridElement():\n | (HTMLElement & {\n registerExternalFocusContainer?(el: Element): void;\n unregisterExternalFocusContainer?(el: Element): void;\n })\n | null {\n return this._elementRef.nativeElement.closest('tbw-grid') ?? null;\n }\n\n /**\n * JS fallback positioning for browsers without CSS Anchor Positioning.\n * Uses `getBoundingClientRect()` with viewport overflow detection.\n */\n private _positionWithJs(): void {\n const cell = this._getCell();\n const panel = this._panel;\n if (!cell || !panel) return;\n\n const cellRect = cell.getBoundingClientRect();\n\n // Temporarily make visible to measure\n panel.style.visibility = 'hidden';\n panel.style.display = '';\n const panelRect = panel.getBoundingClientRect();\n panel.style.visibility = '';\n\n const viewportH = window.innerHeight;\n const viewportW = window.innerWidth;\n\n let top: number;\n let left: number;\n\n switch (this.overlayPosition) {\n case 'above': {\n top = cellRect.top - panelRect.height;\n left = cellRect.left;\n // Flip to below if off-screen\n if (top < 0) top = cellRect.bottom;\n break;\n }\n case 'below-right': {\n top = cellRect.bottom;\n left = cellRect.right - panelRect.width;\n // Flip to above if off-screen\n if (top + panelRect.height > viewportH) top = cellRect.top - panelRect.height;\n break;\n }\n case 'over-top-left': {\n top = cellRect.top;\n left = cellRect.left;\n break;\n }\n case 'over-bottom-left': {\n top = cellRect.bottom - panelRect.height;\n left = cellRect.left;\n break;\n }\n case 'below':\n default: {\n top = cellRect.bottom;\n left = cellRect.left;\n // Flip to above if off-screen\n if (top + panelRect.height > viewportH) top = cellRect.top - panelRect.height;\n break;\n }\n }\n\n // Clamp to viewport\n if (left + panelRect.width > viewportW) left = viewportW - panelRect.width - 4;\n if (left < 0) left = 4;\n if (top < 0) top = 4;\n\n panel.style.top = `${top}px`;\n panel.style.left = `${left}px`;\n }\n\n /**\n * Document pointerdown handler for click-outside detection.\n * Fires `onOverlayOutsideClick()` if the click is outside the panel\n * and outside the editor's host element.\n */\n private _onDocumentPointerDown(event: PointerEvent): void {\n if (!this._isOpen || !this._panel) return;\n\n const target = event.target as Node;\n const hostEl = this._elementRef.nativeElement;\n\n // Click inside panel or host — ignore\n if (this._panel.contains(target) || hostEl.contains(target)) return;\n\n this.onOverlayOutsideClick();\n }\n\n /**\n * Handle the grid's `tbw-scroll` CustomEvent while the overlay is open.\n *\n * When the viewport scrolls, the anchored overlay would otherwise float\n * over content that no longer corresponds to the edited cell (or the\n * cell may be virtualized out entirely). Treat scroll as a dismissal\n * signal equivalent to clicking outside so subclasses' overlay-outside\n * handler drives the appropriate commit/cancel path.\n */\n private _onGridScroll(): void {\n if (!this._isOpen || !this._panel) return;\n this.onOverlayOutsideClick();\n }\n\n /**\n * Set up a MutationObserver on the parent cell to watch for\n * `cell-focus` class changes. This handles row-editing mode where\n * all editors exist simultaneously but only the focused cell's\n * editor should have its overlay visible.\n *\n * A `justOpened` flash guard suppresses the observer from\n * immediately closing the overlay when `beginBulkEdit()` moves\n * focus to the first editable column. Without this guard,\n * double-click triggers a \"flash open then close\" effect.\n */\n protected _setupFocusObserver(): void {\n const cell = this._getCell();\n if (!cell) return;\n\n let justOpened = false;\n\n let pendingHideRaf = 0;\n\n const hostEl = this._elementRef.nativeElement;\n\n this._focusObserver = new MutationObserver((mutations) => {\n // Guard: if the editor's host element is no longer inside the cell,\n // it means the component was detached (e.g., editing session ended\n // and the render pipeline cleared the cell DOM). Disconnect to\n // prevent orphaned observers from opening stale overlay panels.\n if (!cell.contains(hostEl)) {\n this._focusObserver?.disconnect();\n this._focusObserver = null;\n return;\n }\n\n for (const mutation of mutations) {\n if (mutation.type !== 'attributes' || mutation.attributeName !== 'class') continue;\n\n const isFocused = cell.classList.contains('cell-focus');\n if (isFocused && !this._isOpen) {\n // Cell just gained focus — cancel any pending hide and open overlay.\n if (pendingHideRaf) {\n cancelAnimationFrame(pendingHideRaf);\n pendingHideRaf = 0;\n }\n justOpened = true;\n this.showOverlay();\n this.onOverlayOpened();\n // Clear the guard after a macrotask so that an immediate\n // focus-away (e.g. beginBulkEdit focus adjustment) does\n // not close the overlay in the same event loop tick.\n setTimeout(() => {\n justOpened = false;\n }, 0);\n } else if (!isFocused && this._isOpen && !justOpened) {\n // Cell lost focus — defer hide to allow render cycles to settle.\n // Re-renders (e.g., from ResizeObserver after a footer appears)\n // may transiently toggle cell-focus within the same frame.\n // Deferring to the next animation frame lets the render pipeline\n // finish before we decide whether the overlay should actually close.\n if (pendingHideRaf) cancelAnimationFrame(pendingHideRaf);\n pendingHideRaf = requestAnimationFrame(() => {\n pendingHideRaf = 0;\n // Re-check settled state — cell-focus may have been re-applied\n if (!cell.classList.contains('cell-focus') && this._isOpen) {\n this.hideOverlay(true);\n }\n });\n }\n }\n });\n\n this._focusObserver.observe(cell, { attributes: true, attributeFilter: ['class'] });\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-column>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-column>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The underlying web component reads its attributes (`field`, `header`,\n * `type`, `width`, etc.) directly from the DOM, so no `@Input()` forwarding\n * is needed — Angular's standard property/attribute binding handles it.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridColumn, TbwRenderer } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridColumn, TbwRenderer],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-column field=\"status\">\n * <app-status-badge *tbwRenderer=\"let value\" [value]=\"value\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n * @since 0.13.0\n */\n@Directive({\n selector: 'tbw-grid-column',\n})\nexport class TbwGridColumn {}\n","import { contentChild, Directive, effect, ElementRef, inject, input, TemplateRef } from '@angular/core';\nimport type { ExpandCollapseAnimation } from '@toolbox-web/grid';\n\n/**\n * Context object passed to the detail renderer template.\n * Contains the row data for the expanded detail view.\n * @since 0.1.0\n */\nexport interface GridDetailContext<TRow = unknown> {\n /** The row data (implicit binding for let-row) */\n $implicit: TRow;\n /** The row data (explicit binding) */\n row: TRow;\n}\n\n// Global registry mapping DOM elements to their templates\nconst detailTemplateRegistry = new Map<HTMLElement, TemplateRef<GridDetailContext>>();\n\n/**\n * Gets the detail template registered for a given grid element.\n * Used by AngularGridAdapter to retrieve templates at render time.\n * @since 0.1.0\n */\nexport function getDetailTemplate(gridElement: HTMLElement): TemplateRef<GridDetailContext> | undefined {\n // Look for tbw-grid-detail child and get its template\n const detailElement = gridElement.querySelector('tbw-grid-detail');\n if (detailElement) {\n return detailTemplateRegistry.get(detailElement as HTMLElement);\n }\n return undefined;\n}\n\n/**\n * Directive that captures an `<ng-template>` for use as a master-detail row renderer.\n *\n * This enables declarative Angular component usage for expandable detail rows\n * that appear below the main row when expanded.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-detail [showExpandColumn]=\"true\" animation=\"slide\">\n * <ng-template let-row>\n * <app-detail-panel [employee]=\"row\" />\n * </ng-template>\n * </tbw-grid-detail>\n * </tbw-grid>\n * ```\n *\n * The template context provides:\n * - `$implicit` / `row`: The full row data object\n *\n * Import the directive from the master-detail feature entry:\n *\n * ```typescript\n * import { GridDetailView } from '@toolbox-web/grid-angular/features/master-detail';\n *\n * @Component({\n * imports: [GridDetailView],\n * // ...\n * })\n * ```\n *\n * > Note: `GridDetailView` is also re-exported from `@toolbox-web/grid-angular`\n * > for backwards compatibility, but that re-export is deprecated and will be\n * > removed in v2.0.0. Always import from the feature entry.\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-detail [showExpandColumn]=\"true\" animation=\"slide\">\n * <ng-template let-row>\n * <app-detail-panel [employee]=\"row\" />\n * </ng-template>\n * </tbw-grid-detail>\n * </tbw-grid>\n * ```\n *\n * @category Directive\n * @since 0.1.0\n */\n@Directive({ selector: 'tbw-grid-detail' })\nexport class GridDetailView {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /** Whether to show the expand/collapse column. Default: true */\n showExpandColumn = input<boolean>(true);\n\n /** Animation style for expand/collapse. Default: 'slide' */\n animation = input<ExpandCollapseAnimation>('slide');\n\n /**\n * Query for the ng-template content child.\n */\n template = contentChild(TemplateRef<GridDetailContext>);\n\n /** Effect that triggers when the template is available */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n // Register the template for this element\n detailTemplateRegistry.set(this.elementRef.nativeElement, template);\n }\n });\n\n /**\n * Static type guard for template context.\n * Enables type inference in templates.\n */\n static ngTemplateContextGuard(dir: GridDetailView, ctx: unknown): ctx is GridDetailContext {\n return true;\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-header>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-header>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The grid's `config-manager` reads attributes like `title` directly\n * from the DOM element.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridHeader } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridHeader],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-header title=\"My Grid Title\"></tbw-grid-header>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n * @since 0.13.0\n */\n@Directive({\n selector: 'tbw-grid-header',\n})\nexport class TbwGridHeader {}\n","import { Directive, ElementRef, inject, input, OnDestroy, OnInit, output } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport type { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport type { FormArrayContext } from './grid-form-array.directive';\n\n/**\n * Interface for EditingPlugin validation methods.\n * We use a minimal interface to avoid importing the full EditingPlugin class.\n */\ninterface EditingPluginValidation {\n setInvalid(rowId: string, field: string, message?: string): void;\n clearInvalid(rowId: string, field: string): void;\n clearRowInvalid(rowId: string): void;\n}\n\n// Symbol for storing form context on the grid element (shared with GridFormArray)\nconst FORM_ARRAY_CONTEXT = Symbol('formArrayContext');\n\n/**\n * Gets the FormArrayContext from a grid element, if present.\n * @internal\n * @since 0.11.0\n */\nexport function getLazyFormContext(gridElement: HTMLElement): FormArrayContext | undefined {\n return (gridElement as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n}\n\n/**\n * Factory function type for creating FormGroups lazily.\n * Called when a row enters edit mode for the first time.\n *\n * @template TRow The row data type\n * @param row The row data object\n * @param rowIndex The row index in the grid\n * @returns A FormGroup for the row (only include editable fields)\n * @since 0.11.0\n */\nexport type LazyFormFactory<TRow = unknown> = (row: TRow, rowIndex: number) => FormGroup;\n\n/**\n * Event emitted when a row's form values have changed.\n * @since 0.11.0\n */\nexport interface RowFormChangeEvent<TRow = unknown> {\n /** The row index */\n rowIndex: number;\n /** The row ID (if available) */\n rowId?: string;\n /** The original row data */\n row: TRow;\n /** The FormGroup for this row */\n formGroup: FormGroup;\n /** The current form values */\n values: Partial<TRow>;\n /** Whether the form is valid */\n valid: boolean;\n /** Whether the form is dirty */\n dirty: boolean;\n}\n\n/**\n * Directive that provides lazy FormGroup creation for grid editing.\n *\n * Unlike `GridFormArray` which creates all FormGroups upfront, this directive\n * creates FormGroups on-demand only when a row enters edit mode. This provides\n * much better performance for large datasets while still enabling full\n * Angular Reactive Forms integration.\n *\n * ## Key Benefits\n *\n * - **Performance**: Only creates FormGroups for rows being edited (20-100x fewer controls)\n * - **Same DX**: Editors still receive `control` in their context for validation\n * - **Memory efficient**: FormGroups are cleaned up when rows exit edit mode\n *\n * ## Usage\n *\n * ```typescript\n * import { Component, inject, signal } from '@angular/core';\n * import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\n * import { Grid, GridLazyForm, TbwEditor } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, GridLazyForm, TbwEditor, ReactiveFormsModule],\n * template: \\`\n * <tbw-grid\n * [rows]=\"employees()\"\n * [lazyForm]=\"createRowForm\"\n * [gridConfig]=\"config\">\n *\n * <tbw-grid-column field=\"firstName\">\n * <input *tbwEditor=\"let _; control as ctrl\"\n * [formControl]=\"ctrl\"\n * [class.is-invalid]=\"ctrl?.invalid && ctrl?.touched\" />\n * </tbw-grid-column>\n * </tbw-grid>\n * \\`\n * })\n * export class MyComponent {\n * private fb = inject(FormBuilder);\n * employees = signal(generateEmployees(1000));\n *\n * // Factory called when editing starts - only include editable fields!\n * createRowForm = (row: Employee): FormGroup => this.fb.group({\n * firstName: [row.firstName, Validators.required],\n * lastName: [row.lastName, Validators.minLength(2)],\n * salary: [row.salary, [Validators.required, Validators.min(0)]],\n * });\n *\n * gridConfig = { columns: [...] };\n * }\n * ```\n *\n * ## How It Works\n *\n * 1. Rows come from `[rows]` input (plain data array)\n * 2. When a cell enters edit mode, the FormGroup is created lazily\n * 3. Editors receive the FormControl in their template context\n * 4. On commit, FormGroup values are synced back to the row\n * 5. FormGroup is cleaned up when the row exits edit mode (configurable)\n *\n * ## Performance Comparison\n *\n * | Rows | GridFormArray (20 fields) | GridLazyForm |\n * |------|---------------------------|--------------|\n * | 100 | 2,000 controls | ~20 controls |\n * | 500 | 10,000 controls | ~20 controls |\n * | 1000 | 20,000 controls | ~20 controls |\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"employees()\" [lazyForm]=\"createRowForm\" [gridConfig]=\"gridConfig\" />\n * ```\n *\n * @see GridFormArray For small datasets with full upfront validation\n * @category Directive\n *\n * MOVE-IN-V2: this directive (and its `LazyFormFactory`, `RowFormChangeEvent`\n * types and `getLazyFormContext` helper) will physically move into\n * `@toolbox-web/grid-angular/features/editing` in v2.0.0; the deprecated\n * re-exports from the main `@toolbox-web/grid-angular` entry will be removed\n * at the same time. Consumers should already be importing from the feature\n * entry.\n * @since 0.11.0\n */\n@Directive({\n selector: 'tbw-grid[lazyForm]',\n})\nexport class GridLazyForm<TRow = unknown> implements OnInit, OnDestroy {\n private elementRef = inject(ElementRef<GridElement<TRow>>);\n\n // Cache of FormGroups by row reference\n private formGroupCache = new Map<TRow, FormGroup>();\n // Map from row reference to rowIndex (needed for getControl)\n private rowIndexMap = new Map<TRow, number>();\n // Track which row is currently being edited\n private editingRowIndex: number | null = null;\n\n private cellCommitUnsub: (() => void) | null = null;\n private rowCommitUnsub: (() => void) | null = null;\n private rowsChangeUnsub: (() => void) | null = null;\n\n /**\n * Factory function to create a FormGroup for a row.\n * Called lazily when the row first enters edit mode.\n *\n * @example\n * ```typescript\n * createRowForm = (row: Employee): FormGroup => this.fb.group({\n * firstName: [row.firstName, Validators.required],\n * lastName: [row.lastName],\n * salary: [row.salary, [Validators.min(0)]],\n * });\n * ```\n */\n readonly lazyForm = input.required<LazyFormFactory<TRow>>();\n\n /**\n * Whether to automatically sync Angular validation state to grid's visual invalid styling.\n *\n * When enabled:\n * - After a cell commit, if the FormControl is invalid, the cell is marked with `setInvalid()`\n * - When a FormControl becomes valid, `clearInvalid()` is called\n * - On `row-commit`, if the row's FormGroup has invalid controls, the commit is prevented\n *\n * @default true\n */\n readonly syncValidation = input<boolean>(true);\n\n /**\n * Whether to keep FormGroups cached after a row exits edit mode.\n *\n * - `true`: FormGroups are kept, preserving dirty/touched state across edit sessions\n * - `false`: FormGroups are disposed when the row exits edit mode (default)\n *\n * @default false\n */\n readonly keepFormGroups = input<boolean>(false);\n\n /**\n * Emitted when a row's form values change.\n * Useful for auto-save, validation display, or syncing to external state.\n */\n readonly rowFormChange = output<RowFormChangeEvent<TRow>>();\n\n ngOnInit(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n // Store the form context for AngularGridAdapter to access\n this.#storeFormContext(grid);\n\n // Listen for cell-commit to update FormControl and sync validation\n this.cellCommitUnsub = grid.on(\n 'cell-commit',\n (detail: { rowIndex: number; field: string; value: unknown; oldValue: unknown; rowId: string }) => {\n this.#handleCellCommit(detail);\n },\n );\n\n // Listen for row-commit to sync FormGroup values back to row and cleanup\n this.rowCommitUnsub = grid.on('row-commit', (detail: { rowIndex: number; rowId?: string }, event: CustomEvent) => {\n this.#handleRowCommit(event, detail);\n });\n\n // Listen for rows-change to update row index mappings\n this.rowsChangeUnsub = grid.on('rows-change', () => {\n this.#updateRowIndexMap();\n });\n\n // Initial row index mapping\n this.#updateRowIndexMap();\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n this.cellCommitUnsub?.();\n this.rowCommitUnsub?.();\n this.rowsChangeUnsub?.();\n\n this.#clearFormContext(grid);\n this.formGroupCache.clear();\n this.rowIndexMap.clear();\n }\n\n // #region FormArrayContext Implementation\n\n /**\n * Gets or creates the FormGroup for a row.\n * This is the core lazy initialization logic.\n */\n #getOrCreateFormGroup(row: TRow, rowIndex: number): FormGroup {\n let formGroup = this.formGroupCache.get(row);\n if (!formGroup) {\n const factory = this.lazyForm();\n formGroup = factory(row, rowIndex);\n this.formGroupCache.set(row, formGroup);\n this.rowIndexMap.set(row, rowIndex);\n }\n return formGroup;\n }\n\n /**\n * Gets the FormGroup for a row if it exists (without creating).\n */\n #getRowFormGroup(rowIndex: number): FormGroup | undefined {\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex];\n return this.formGroupCache.get(row);\n }\n\n /**\n * Stores the FormArrayContext on the grid element.\n * This uses the same interface as GridFormArray for compatibility.\n */\n #storeFormContext(grid: GridElement<TRow>): void {\n const context: FormArrayContext = {\n getRow: <T>(rowIndex: number): T | null => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return null;\n return rows[rowIndex] as unknown as T;\n },\n\n updateField: (rowIndex: number, field: string, value: unknown) => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (formGroup) {\n const control = formGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n }\n }\n },\n\n getValue: <T>(): T[] => {\n return (grid.rows ?? []) as unknown as T[];\n },\n\n // Always true for lazy forms - we create FormGroups on demand\n hasFormGroups: true,\n\n getControl: (rowIndex: number, field: string): AbstractControl | undefined => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex] as TRow;\n // LAZY: Create the FormGroup when first needed\n const formGroup = this.#getOrCreateFormGroup(row, rowIndex);\n return formGroup.get(field) ?? undefined;\n },\n\n getRowFormGroup: (rowIndex: number): FormGroup | undefined => {\n const rows = grid.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return undefined;\n\n const row = rows[rowIndex] as TRow;\n // LAZY: Create the FormGroup when first needed\n return this.#getOrCreateFormGroup(row, rowIndex);\n },\n\n isRowValid: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n // If no FormGroup exists yet, consider it valid (not edited)\n if (!formGroup) return true;\n return formGroup.valid;\n },\n\n isRowTouched: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return false;\n return formGroup.touched;\n },\n\n isRowDirty: (rowIndex: number): boolean => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return false;\n return formGroup.dirty;\n },\n\n getRowErrors: (rowIndex: number): Record<string, unknown> | null => {\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (!formGroup) return null;\n\n const errors: Record<string, unknown> = {};\n let hasErrors = false;\n\n Object.keys(formGroup.controls).forEach((field) => {\n const control = formGroup.get(field);\n if (control?.errors) {\n errors[field] = control.errors;\n hasErrors = true;\n }\n });\n\n if (formGroup.errors) {\n errors['_group'] = formGroup.errors;\n hasErrors = true;\n }\n\n return hasErrors ? errors : null;\n },\n };\n\n (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT] = context;\n }\n\n /**\n * Clears the FormArrayContext from the grid element.\n */\n #clearFormContext(grid: GridElement<TRow>): void {\n delete (grid as unknown as Record<symbol, FormArrayContext>)[FORM_ARRAY_CONTEXT];\n }\n\n // #endregion\n\n // #region Event Handlers\n\n /**\n * Updates the row index map when rows change.\n * This ensures we can find FormGroups by row reference after sorting/filtering.\n */\n #updateRowIndexMap(): void {\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows) return;\n\n this.rowIndexMap.clear();\n rows.forEach((row: TRow, index: number) => {\n if (this.formGroupCache.has(row)) {\n this.rowIndexMap.set(row, index);\n }\n });\n }\n\n /**\n * Handles cell-commit events by updating the FormControl in the FormGroup.\n */\n #handleCellCommit(detail: { rowIndex: number; field: string; value: unknown; rowId: string }): void {\n const { rowIndex, field, value, rowId } = detail;\n\n const formGroup = this.#getRowFormGroup(rowIndex);\n if (formGroup) {\n const control = formGroup.get(field);\n if (control) {\n control.setValue(value);\n control.markAsDirty();\n control.markAsTouched();\n\n // Sync Angular validation state to grid's visual invalid styling\n if (this.syncValidation() && rowId) {\n this.#syncControlValidationToGrid(rowId, field, control);\n }\n\n // Emit change event\n const grid = this.elementRef.nativeElement;\n const row = grid?.rows?.[rowIndex];\n if (row) {\n this.rowFormChange.emit({\n rowIndex,\n rowId,\n row,\n formGroup,\n values: formGroup.value,\n valid: formGroup.valid,\n dirty: formGroup.dirty,\n });\n }\n }\n }\n }\n\n /**\n * Handles row-commit events.\n * - Prevents commit if FormGroup is invalid (when syncValidation is true)\n * - Syncs FormGroup values back to the row\n * - Cleans up FormGroup if keepFormGroups is false\n */\n #handleRowCommit(event: Event, detail: { rowIndex: number; rowId?: string }): void {\n const { rowIndex, rowId } = detail;\n const grid = this.elementRef.nativeElement;\n const rows = grid?.rows;\n if (!rows || rowIndex < 0 || rowIndex >= rows.length) return;\n\n const row = rows[rowIndex];\n const formGroup = this.formGroupCache.get(row);\n\n if (!formGroup) return;\n\n // Prevent commit if invalid (when syncValidation is enabled)\n if (this.syncValidation() && formGroup.invalid) {\n // Mark all controls as touched to show validation errors\n formGroup.markAllAsTouched();\n event.preventDefault();\n return;\n }\n\n // Sync FormGroup values back to the row object\n if (formGroup.dirty) {\n const formValue = formGroup.value;\n Object.keys(formValue).forEach((field) => {\n if (field in row) {\n (row as Record<string, unknown>)[field] = formValue[field];\n }\n });\n }\n\n // Clean up FormGroup if not keeping them\n if (!this.keepFormGroups()) {\n this.formGroupCache.delete(row);\n this.rowIndexMap.delete(row);\n\n // Clear any validation state in the grid\n if (rowId) {\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n editingPlugin?.clearRowInvalid(rowId);\n }\n }\n }\n\n // #endregion\n\n // #region Validation Sync\n\n /**\n * Syncs a FormControl's validation state to the grid's visual invalid styling.\n */\n #syncControlValidationToGrid(rowId: string, field: string, control: AbstractControl): void {\n const grid = this.elementRef.nativeElement;\n if (!grid) return;\n\n const editingPlugin = grid.getPluginByName?.('editing') as EditingPluginValidation | undefined;\n\n if (!editingPlugin) return;\n\n if (control.invalid) {\n const errorMessage = this.#getFirstErrorMessage(control);\n editingPlugin.setInvalid(rowId, field, errorMessage);\n } else {\n editingPlugin.clearInvalid(rowId, field);\n }\n }\n\n /**\n * Gets a human-readable error message from the first validation error.\n */\n #getFirstErrorMessage(control: AbstractControl): string {\n const errors = control.errors;\n if (!errors) return '';\n\n const firstKey = Object.keys(errors)[0];\n const error = errors[firstKey];\n\n switch (firstKey) {\n case 'required':\n return 'This field is required';\n case 'minlength':\n return `Minimum length is ${error.requiredLength}`;\n case 'maxlength':\n return `Maximum length is ${error.requiredLength}`;\n case 'min':\n return `Minimum value is ${error.min}`;\n case 'max':\n return `Maximum value is ${error.max}`;\n case 'email':\n return 'Invalid email address';\n case 'pattern':\n return 'Invalid format';\n default:\n return typeof error === 'string' ? error : (error?.message ?? `Validation error: ${firstKey}`);\n }\n }\n\n // #endregion\n\n // #region Public API\n\n /**\n * Gets the FormGroup for a row, if it exists.\n * Unlike the context methods, this does NOT create a FormGroup lazily.\n *\n * @param rowIndex The row index\n * @returns The FormGroup or undefined\n */\n getFormGroup(rowIndex: number): FormGroup | undefined {\n return this.#getRowFormGroup(rowIndex);\n }\n\n /**\n * Gets all cached FormGroups.\n * Useful for bulk validation or inspection.\n *\n * @returns Map of row objects to their FormGroups\n */\n getAllFormGroups(): ReadonlyMap<TRow, FormGroup> {\n return this.formGroupCache;\n }\n\n /**\n * Clears all cached FormGroups.\n * Useful when the underlying data changes significantly.\n */\n clearAllFormGroups(): void {\n this.formGroupCache.clear();\n this.rowIndexMap.clear();\n }\n\n /**\n * Validates all currently cached FormGroups.\n *\n * @returns true if all FormGroups are valid, false otherwise\n */\n validateAll(): boolean {\n for (const formGroup of this.formGroupCache.values()) {\n if (formGroup.invalid) {\n formGroup.markAllAsTouched();\n return false;\n }\n }\n return true;\n }\n\n // #endregion\n}\n","import { contentChild, Directive, effect, ElementRef, inject, input, TemplateRef } from '@angular/core';\n\n/**\n * Context object passed to the responsive card template.\n *\n * @template TRow - The type of row data\n *\n * @example\n * ```html\n * <tbw-grid-responsive-card>\n * <ng-template let-row let-index=\"index\">\n * <div class=\"card-content\">\n * <span>{{ row.name }}</span>\n * <span>Row #{{ index }}</span>\n * </div>\n * </ng-template>\n * </tbw-grid-responsive-card>\n * ```\n * @since 0.4.0\n */\nexport interface GridResponsiveCardContext<TRow = unknown> {\n /**\n * The row data (available as `let-row` or `let-myVar`).\n */\n $implicit: TRow;\n\n /**\n * The row data (explicit access via `let-row=\"row\"`).\n */\n row: TRow;\n\n /**\n * The row index (zero-based).\n */\n index: number;\n}\n\n/**\n * Registry to store responsive card templates by grid element.\n * Used by AngularGridAdapter to create card renderers.\n */\nexport const responsiveCardTemplateRegistry = new Map<HTMLElement, TemplateRef<GridResponsiveCardContext>>();\n\n/**\n * Retrieves the responsive card template for a grid element.\n *\n * @param gridElement - The grid element to look up\n * @returns The template reference or undefined if not found\n * @since 0.4.0\n */\nexport function getResponsiveCardTemplate(\n gridElement: HTMLElement,\n): TemplateRef<GridResponsiveCardContext> | undefined {\n // Find the tbw-grid-responsive-card element inside the grid\n const cardElement = gridElement.querySelector('tbw-grid-responsive-card');\n if (!cardElement) return undefined;\n return responsiveCardTemplateRegistry.get(cardElement as HTMLElement);\n}\n\n/**\n * Directive for providing custom Angular templates for responsive card layout.\n *\n * Use this directive to define how each row should render when the grid\n * is in responsive/mobile mode. The template receives the row data and index.\n *\n * ## Usage\n *\n * ```html\n * <tbw-grid [rows]=\"employees\">\n * <tbw-grid-responsive-card>\n * <ng-template let-employee let-idx=\"index\">\n * <div class=\"employee-card\">\n * <img [src]=\"employee.avatar\" alt=\"\">\n * <div class=\"info\">\n * <strong>{{ employee.name }}</strong>\n * <span>{{ employee.department }}</span>\n * </div>\n * </div>\n * </ng-template>\n * </tbw-grid-responsive-card>\n * </tbw-grid>\n * ```\n *\n * ## Important Notes\n *\n * - The ResponsivePlugin must be added to your grid config\n * - The Grid directive will automatically configure the plugin's cardRenderer\n * - Template context provides `$implicit` (row), `row`, and `index`\n *\n * @see ResponsivePlugin\n * @category Directive\n * @since 0.4.0\n */\n@Directive({\n selector: 'tbw-grid-responsive-card',\n})\nexport class GridResponsiveCard<TRow = unknown> {\n private elementRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Card row height in pixels. Use `'auto'` for dynamic height based on content.\n *\n * Mirrors to the `card-row-height` attribute on the underlying\n * `<tbw-grid-responsive-card>` element which the ResponsivePlugin reads.\n *\n * @default 'auto'\n */\n cardRowHeight = input<number | 'auto'>();\n\n /**\n * The ng-template containing the card content.\n */\n template = contentChild(TemplateRef<GridResponsiveCardContext<TRow>>);\n\n /**\n * Effect that registers the template when it becomes available.\n */\n private onTemplateReceived = effect(() => {\n const template = this.template();\n if (template) {\n responsiveCardTemplateRegistry.set(\n this.elementRef.nativeElement,\n template as TemplateRef<GridResponsiveCardContext>,\n );\n }\n });\n\n /**\n * Effect that mirrors the `cardRowHeight` input to the kebab-cased attribute\n * read by the ResponsivePlugin.\n */\n private onCardRowHeightChange = effect(() => {\n const value = this.cardRowHeight();\n const element = this.elementRef.nativeElement;\n if (value === undefined) {\n element.removeAttribute('card-row-height');\n return;\n }\n element.setAttribute('card-row-height', value === 'auto' ? 'auto' : String(value));\n });\n\n /**\n * Type guard for template context inference.\n */\n static ngTemplateContextGuard<T>(\n _directive: GridResponsiveCard<T>,\n context: unknown,\n ): context is GridResponsiveCardContext<T> {\n return true;\n }\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive that registers `<tbw-grid-tool-buttons>` as a known Angular element.\n *\n * This directive exists so that Angular's template compiler recognises\n * `<tbw-grid-tool-buttons>` without requiring `CUSTOM_ELEMENTS_SCHEMA`.\n * The grid's shell reads toolbar buttons directly from the DOM.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid, TbwGridToolButtons } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * imports: [Grid, TbwGridToolButtons],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\">\n * <tbw-grid-tool-buttons>\n * <button (click)=\"doSomething()\">Action</button>\n * </tbw-grid-tool-buttons>\n * </tbw-grid>\n * `\n * })\n * export class MyComponent { }\n * ```\n *\n * @category Directive\n * @since 0.13.0\n */\n@Directive({\n selector: 'tbw-grid-tool-buttons',\n})\nexport class TbwGridToolButtons {}\n","/**\n * Column shorthand parsing for `@toolbox-web/grid-angular`.\n *\n * Intentionally duplicated across the React, Vue, and Angular adapters so each\n * adapter has zero shared-runtime dependency. Do not extract into a shared\n * package: the helpers are tiny (~100 lines), the duplication keeps each\n * adapter independently tree-shakeable, and a shared package would force\n * consumers to install an extra dep just to import shorthand support.\n *\n * If you change behavior here, mirror the change in `grid-react` and\n * `grid-vue`. The three implementations are kept byte-equivalent.\n */\nimport type { ColumnConfig } from '@toolbox-web/grid';\n\n/**\n * Type for column shorthand notation.\n *\n * Supports:\n * - Simple string: `'name'` → `{ field: 'name', header: 'Name' }`\n * - With type: `'salary:number'` → `{ field: 'salary', header: 'Salary', type: 'number' }`\n * - Full config object: `{ field: 'id', header: 'ID', width: 80 }` (passed through)\n *\n * @example\n * ```typescript\n * // All equivalent:\n * const cols1 = ['id', 'name', 'email'];\n * const cols2 = ['id:number', 'name:string', 'email'];\n * const cols3 = [{ field: 'id' }, { field: 'name' }, { field: 'email' }];\n * ```\n * @since 1.4.0\n */\nexport type ColumnShorthand<TRow = unknown> = string | ColumnConfig<TRow>;\n\n/** Capitalize the first letter of a string for header generation. */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Generate a human-readable header from a field name.\n *\n * Handles camelCase, snake_case, and kebab-case.\n *\n * @example\n * generateHeader('firstName') → 'First Name'\n * generateHeader('last_name') → 'Last Name'\n * generateHeader('email-address') → 'Email Address'\n * generateHeader('id') → 'ID' (special case)\n */\nfunction generateHeader(field: string): string {\n if (field.toLowerCase() === 'id') return 'ID';\n\n const words = field\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_-]/g, ' ')\n .split(' ')\n .filter(Boolean);\n\n return words.map(capitalize).join(' ');\n}\n\n/** Valid column types from the shorthand notation. */\nconst VALID_TYPES = new Set(['string', 'number', 'boolean', 'date', 'datetime', 'currency']);\n\n/**\n * Parse a column shorthand string into a ColumnConfig.\n *\n * Supports formats:\n * - `'fieldName'` → `{ field: 'fieldName', header: 'Field Name' }`\n * - `'fieldName:type'` → `{ field: 'fieldName', header: 'Field Name', type: 'type' }`\n *\n * @param shorthand - The shorthand string (e.g., 'name', 'salary:number')\n * @returns A ColumnConfig object\n * @since 1.4.0\n */\nexport function parseColumnShorthand<TRow = unknown>(shorthand: string): ColumnConfig<TRow> {\n const colonIndex = shorthand.lastIndexOf(':');\n\n if (colonIndex > 0) {\n const potentialType = shorthand.slice(colonIndex + 1).toLowerCase();\n\n if (VALID_TYPES.has(potentialType)) {\n const field = shorthand.slice(0, colonIndex);\n return {\n field: field as keyof TRow & string,\n header: generateHeader(field),\n type: potentialType as ColumnConfig['type'],\n };\n }\n }\n\n return {\n field: shorthand as keyof TRow & string,\n header: generateHeader(shorthand),\n };\n}\n\n/**\n * Normalize an array of column shorthands to ColumnConfig objects.\n *\n * @param columns - Array of column shorthands (strings or ColumnConfig objects)\n * @returns Array of ColumnConfig objects\n * @since 1.4.0\n */\nexport function normalizeColumns<TRow = unknown>(columns: ColumnShorthand<TRow>[]): ColumnConfig<TRow>[] {\n return columns.map((col) => (typeof col === 'string' ? parseColumnShorthand<TRow>(col) : col));\n}\n\n/**\n * Apply column defaults to a list of columns. Individual column properties\n * override defaults.\n * @since 1.4.0\n */\nexport function applyColumnDefaults<TRow = unknown>(\n columns: ColumnConfig<TRow>[],\n defaults: Partial<ColumnConfig<TRow>> | undefined,\n): ColumnConfig<TRow>[] {\n if (!defaults) return columns;\n return columns.map((col) => ({ ...defaults, ...col }));\n}\n\n/** Check if an array of columns contains any shorthand strings. * @since 1.4.0\n */\nexport function hasColumnShorthands<TRow>(columns: ColumnShorthand<TRow>[]): boolean {\n return columns.some((col) => typeof col === 'string');\n}\n","/**\n * Per-grid-element claims registry used by the hybrid feature-directive\n * refactor (v1.4 → v2).\n *\n * Background: historically every plugin's input/output (e.g. `[filtering]`,\n * `(filterChange)`) was declared on the central {@link Grid} directive. That\n * pulled the typed surface for every {@link FeatureName} into the core\n * bundle — even for apps that only used a few. The new approach gives every\n * feature a thin **attribute-selector** directive (e.g.\n * `GridFilteringDirective` with selector `tbw-grid[filtering], tbw-grid[filterChange]`)\n * that lives in the feature secondary entry, so the plugin's typed surface\n * is only paid for when the feature is actually imported.\n *\n * To stay non-breaking in v1.x, the deprecated inputs/outputs remain on\n * {@link Grid}. When a feature directive is present on the same `<tbw-grid>`\n * element it **claims** its feature here; {@link Grid} consults the registry\n * and lets the directive own the input + event so we never produce duplicate\n * plugins or double-emit events.\n *\n * This module is deliberately framework-free (plain {@link WeakMap} state, no\n * `@angular/core` imports) so feature secondary entries can import it through\n * the package barrel without introducing circular module graphs. The\n * {@link FeatureName} and {@link DataGridEventMap} type imports are\n * type-only, so no runtime dependency leaks.\n *\n * @internal\n */\nimport type { DataGridEventMap } from '@toolbox-web/grid';\nimport type { FeatureName } from '../feature-registry';\n\n/** Event names that can be claimed by a feature directive. */\ntype ClaimableEventName = keyof DataGridEventMap<unknown>;\n\n/**\n * Reads the directive-owned config value for a feature. The function is\n * called during {@link Grid}'s `createFeaturePlugins` effect, so reading a\n * signal inside it establishes reactive dependency tracking — the effect\n * re-runs when the directive's input changes.\n * @internal\n * @since 1.4.0\n */\nexport type FeatureConfigGetter = () => unknown;\n\n/** Per-element map of claimed feature names → config getter. */\nconst featureClaims = new WeakMap<HTMLElement, Map<FeatureName, FeatureConfigGetter>>();\n\n/** Per-element set of claimed event names (matches `keyof DataGridEventMap`). */\nconst eventClaims = new WeakMap<HTMLElement, Set<ClaimableEventName>>();\n\n/**\n * Register a feature claim. Called by a feature directive's constructor;\n * the {@link Grid} directive will then use {@link getFeatureClaim} during\n * plugin creation instead of reading its own deprecated input.\n * @internal\n * @since 1.4.0\n */\nexport function registerFeatureClaim(grid: HTMLElement, name: FeatureName, getConfig: FeatureConfigGetter): void {\n let map = featureClaims.get(grid);\n if (!map) {\n map = new Map();\n featureClaims.set(grid, map);\n }\n map.set(name, getConfig);\n}\n\n/**\n * Look up a feature claim. Returns the registered config getter, or\n * `undefined` if no directive owns this feature on this element.\n * @internal\n * @since 1.4.0\n */\nexport function getFeatureClaim(grid: HTMLElement, name: FeatureName): FeatureConfigGetter | undefined {\n return featureClaims.get(grid)?.get(name);\n}\n\n/**\n * Drop a feature claim. Called by a feature directive's `ngOnDestroy` so\n * that, if the directive is removed (e.g. via `*ngIf`) but the host\n * `<tbw-grid>` survives, {@link Grid}'s deprecated input takes back over.\n * @internal\n * @since 1.4.0\n */\nexport function unregisterFeatureClaim(grid: HTMLElement, name: FeatureName): void {\n featureClaims.get(grid)?.delete(name);\n}\n\n/**\n * Mark an event as owned by a feature directive. {@link Grid}'s\n * `setupEventListeners` skips wiring its own deprecated `output()` for any\n * claimed event — the directive owns the listener and the emit.\n * @internal\n * @since 1.4.0\n */\nexport function claimEvent(grid: HTMLElement, eventName: ClaimableEventName): void {\n let set = eventClaims.get(grid);\n if (!set) {\n set = new Set();\n eventClaims.set(grid, set);\n }\n set.add(eventName);\n}\n\n/**\n * Returns true if a directive has claimed this event on this grid element.\n * @internal\n * @since 1.4.0\n */\nexport function isEventClaimed(grid: HTMLElement, eventName: ClaimableEventName): boolean {\n return eventClaims.get(grid)?.has(eventName) ?? false;\n}\n\n/**\n * Drop an event claim. Pair with {@link claimEvent} in a directive's\n * `ngOnDestroy`.\n * @internal\n * @since 1.4.0\n */\nexport function unclaimEvent(grid: HTMLElement, eventName: ClaimableEventName): void {\n eventClaims.get(grid)?.delete(eventName);\n}\n","import {\n AfterContentInit,\n ApplicationRef,\n Directive,\n effect,\n ElementRef,\n EnvironmentInjector,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewContainerRef,\n} from '@angular/core';\nimport type {\n ColumnConfig as BaseColumnConfig,\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n ColumnConfigMap,\n ColumnResizeDetail,\n FitMode,\n GridColumnState,\n DataGridElement as GridElement,\n RowClickDetail,\n SortChangeDetail,\n TbwScrollDetail,\n} from '@toolbox-web/grid';\nimport { DataGridElement as GridElementClass } from '@toolbox-web/grid';\n// Import editing event types from the editing plugin\nimport type {\n BeforeEditCloseDetail,\n CellCancelDetail,\n ChangedRowsResetDetail,\n DirtyChangeDetail,\n EditCloseDetail,\n EditingConfig,\n EditOpenDetail,\n} from '@toolbox-web/grid/plugins/editing';\n// Import plugin config types only. Specific plugin classes are intentionally\n// not imported here — feature-specific bridging lives in the feature secondary\n// entries (see `internal/feature-extensions.ts`).\nimport type {\n ClipboardConfig,\n ColumnMoveDetail,\n ColumnResizeResetDetail,\n ColumnVirtualizationConfig,\n ColumnVisibilityDetail,\n ContextMenuConfig,\n ContextMenuOpenDetail,\n CopyDetail,\n DataChangeDetail,\n DataGridEventMap,\n DetailExpandDetail,\n ExportCompleteDetail,\n ExportConfig,\n FilterChangeDetail,\n FilterConfig,\n GroupCollapseDetail,\n GroupExpandDetail,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n GroupToggleDetail,\n MasterDetailConfig,\n MultiSortConfig,\n PasteDetail,\n PinnedRowsConfig,\n PivotConfig,\n PrintCompleteDetail,\n PrintConfig,\n PrintStartDetail,\n ReorderConfig,\n ResponsiveChangeDetail,\n ResponsivePluginConfig,\n RowDragDropConfig,\n RowDragEndDetail,\n RowDragStartDetail,\n RowDropDetail,\n RowMoveDetail,\n RowReorderConfig,\n RowTransferDetail,\n SelectionChangeDetail,\n SelectionConfig,\n ServerSideConfig,\n TooltipConfig,\n TreeConfig,\n TreeExpandDetail,\n UndoRedoConfig,\n UndoRedoDetail,\n VisibilityConfig,\n} from '@toolbox-web/grid/all';\nimport type { ColumnConfig, GridConfig } from '../angular-column-config';\nimport { GridAdapter } from '../angular-grid-adapter';\nimport { applyColumnDefaults, type ColumnShorthand, normalizeColumns } from '../column-shorthand';\nimport { createPluginFromFeature, type FeatureName } from '../feature-registry';\nimport { GridIconRegistry } from '../grid-icon-registry';\nimport { getFeatureClaim, isEventClaimed } from '../internal/feature-claims';\nimport { getFeatureConfigPreprocessor, runTemplateBridges } from '../internal/feature-extensions';\n\n/**\n * Event detail for cell commit events.\n * @since 0.1.1\n */\nexport interface CellCommitEvent<TRow = unknown, TValue = unknown> {\n /** The row data object */\n row: TRow;\n /** The field name of the edited column */\n field: string;\n /** The new value after edit */\n value: TValue;\n /** The row index in the data array */\n rowIndex: number;\n /** Array of all rows that have been modified */\n changedRows: TRow[];\n /** Set of row indices that have been modified */\n changedRowIndices: Set<number>;\n /** Whether this is the first modification to this row */\n firstTimeForRow: boolean;\n}\n\n/**\n * Event detail for row commit events (bulk editing).\n * @since 0.1.1\n */\nexport interface RowCommitEvent<TRow = unknown> {\n /** The row data object */\n row: TRow;\n /** The row index in the data array */\n rowIndex: number;\n /** Array of all rows that have been modified */\n changedRows: TRow[];\n /** Set of row indices that have been modified */\n changedRowIndices: Set<number>;\n /** Whether this is the first modification to this row */\n firstTimeForRow: boolean;\n}\n\n/**\n * Directive that automatically registers the Angular adapter with tbw-grid elements.\n *\n * This directive eliminates the need to manually register the adapter in your component\n * constructor. Simply import this directive and it will handle adapter registration.\n *\n * ## Usage\n *\n * ```typescript\n * import { Component } from '@angular/core';\n * import { Grid } from '@toolbox-web/grid-angular';\n *\n * @Component({\n * selector: 'app-root',\n * imports: [Grid],\n * template: `\n * <tbw-grid [rows]=\"rows\" [gridConfig]=\"config\" [customStyles]=\"myStyles\">\n * <!-- column templates -->\n * </tbw-grid>\n * `\n * })\n * export class AppComponent {\n * rows = [...];\n * config = {...};\n * myStyles = `.my-class { color: red; }`;\n * }\n * ```\n *\n * The directive automatically:\n * - Creates a GridAdapter instance\n * - Registers it with the GridElement\n * - Injects custom styles into the grid\n * - Handles cleanup on destruction\n *\n * @category Directive\n * @since 0.1.0\n */\n@Directive({ selector: 'tbw-grid' })\nexport class Grid implements OnInit, AfterContentInit, OnDestroy {\n private elementRef = inject(ElementRef<GridElement>);\n private injector = inject(EnvironmentInjector);\n private appRef = inject(ApplicationRef);\n private viewContainerRef = inject(ViewContainerRef);\n private iconRegistry = inject(GridIconRegistry, { optional: true });\n\n private adapter: GridAdapter | null = null;\n\n constructor() {\n // Effect to process gridConfig and apply to grid\n // This merges feature input plugins with the user's config plugins\n effect(() => {\n const userGridConfig = this.gridConfig();\n\n const angularCfg = userGridConfig;\n if (!this.adapter) return;\n\n // Create plugins from feature inputs\n const featurePlugins = this.createFeaturePlugins();\n\n // Build core config overrides from individual inputs\n const sortableValue = this.sortable();\n const filterableValue = this.filterable();\n const selectableValue = this.selectable();\n const coreConfigOverrides: Record<string, unknown> = {};\n if (sortableValue !== undefined) {\n coreConfigOverrides['sortable'] = sortableValue;\n }\n if (filterableValue !== undefined) {\n coreConfigOverrides['filterable'] = filterableValue;\n }\n if (selectableValue !== undefined) {\n coreConfigOverrides['selectable'] = selectableValue;\n }\n\n const grid = this.elementRef.nativeElement;\n\n // Merge icon overrides from registry with any existing icons\n // Registry icons are base, config.icons override them\n const registryIcons = this.iconRegistry?.getAll();\n if (registryIcons && Object.keys(registryIcons).length > 0) {\n const existingIcons = angularCfg?.icons || {};\n coreConfigOverrides['icons'] = { ...registryIcons, ...existingIcons };\n }\n\n // Nothing to do if there's no config input and no feature inputs\n const hasFeaturePlugins = featurePlugins.length > 0;\n const hasConfigOverrides = Object.keys(coreConfigOverrides).length > 0;\n\n if (!angularCfg && !hasFeaturePlugins && !hasConfigOverrides) {\n return;\n }\n\n const userConfig = angularCfg || {};\n\n // Merge feature-input plugins with the user's own plugins\n const configPlugins = userConfig.plugins || [];\n const mergedPlugins = [...featurePlugins, ...configPlugins];\n\n // The interceptor on element.gridConfig (installed in ngOnInit)\n // handles converting component classes → functions via processGridConfig,\n // so we can pass the raw Angular config through. The interceptor is\n // idempotent, making this safe even if the config is already processed.\n grid.gridConfig = {\n ...userConfig,\n ...coreConfigOverrides,\n plugins: mergedPlugins.length > 0 ? mergedPlugins : userConfig.plugins,\n };\n });\n\n // Effect to sync loading state to the grid element\n effect(() => {\n const loadingValue = this.loading();\n if (loadingValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.loading = loadingValue;\n });\n\n // Effect to sync rows to the grid element\n effect(() => {\n const rowsValue = this.rows();\n if (rowsValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.rows = rowsValue;\n });\n\n // Effect to sync columns to the grid element\n effect(() => {\n const columnsValue = this.columns();\n if (columnsValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n // First normalize any shorthand strings to ColumnConfig objects, then\n // merge in any per-grid column defaults. Individual column props always win.\n // Note: Angular ColumnConfig allows component classes for renderer/editor,\n // which the adapter normalizes via processColumn below; we widen to `any`\n // here so the shorthand helpers (typed against the core ColumnConfig) accept\n // the Angular-flavoured payload unchanged.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const normalized = applyColumnDefaults<any>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n normalizeColumns<any>(columnsValue as ColumnShorthand<any>[]),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.columnDefaults() as any,\n );\n // Process columns through the adapter to convert Angular component classes\n // (renderer/editor) to functions — the grid's columns setter does NOT call\n // processConfig, unlike gridConfig. Without this, raw component classes\n // would be invoked without `new`, causing runtime errors.\n const processed = this.adapter\n ? (normalized as ColumnConfig[]).map((col) => this.adapter!.processColumn(col))\n : normalized;\n grid.columns = processed as BaseColumnConfig[] | ColumnConfigMap;\n });\n\n // Effect to sync fitMode to the grid element\n effect(() => {\n const fitModeValue = this.fitMode();\n if (fitModeValue === undefined) return;\n\n const grid = this.elementRef.nativeElement;\n grid.fitMode = fitModeValue;\n });\n }\n\n /**\n * Custom CSS styles to inject into the grid.\n * Use this to style custom cell renderers, editors, or detail panels.\n *\n * @example\n * ```typescript\n * // In your component\n * customStyles = `\n * .my-detail-panel { padding: 16px; }\n * .my-status-badge { border-radius: 4px; }\n * `;\n * ```\n *\n * ```html\n * <tbw-grid [customStyles]=\"customStyles\">...</tbw-grid>\n * ```\n */\n customStyles = input<string>();\n\n /**\n * Grid-wide sorting toggle.\n * When false, disables sorting for all columns regardless of their individual `sortable` setting.\n * When true (default), columns with `sortable: true` can be sorted.\n *\n * This is a core grid config property, not a plugin feature.\n * For multi-column sorting, also add the `[multiSort]` feature.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all sorting -->\n * <tbw-grid [sortable]=\"false\" />\n *\n * <!-- Enable sorting (default) - columns still need sortable: true -->\n * <tbw-grid [sortable]=\"true\" />\n *\n * <!-- Enable multi-column sorting -->\n * <tbw-grid [sortable]=\"true\" [multiSort]=\"true\" />\n * ```\n */\n sortable = input<boolean>();\n\n /**\n * Grid-wide filtering toggle.\n * When false, disables filtering for all columns regardless of their individual `filterable` setting.\n * When true (default), columns with `filterable: true` can be filtered.\n *\n * Requires the FilteringPlugin to be loaded.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all filtering -->\n * <tbw-grid [filterable]=\"false\" [filtering]=\"true\" />\n *\n * <!-- Enable filtering (default) -->\n * <tbw-grid [filterable]=\"true\" [filtering]=\"true\" />\n * ```\n */\n filterable = input<boolean>();\n\n /**\n * Grid-wide selection toggle.\n * When false, disables selection for all rows/cells.\n * When true (default), selection is enabled based on plugin mode.\n *\n * Requires the SelectionPlugin to be loaded.\n *\n * @default true\n *\n * @example\n * ```html\n * <!-- Disable all selection -->\n * <tbw-grid [selectable]=\"false\" [selection]=\"'range'\" />\n *\n * <!-- Enable selection (default) -->\n * <tbw-grid [selectable]=\"true\" [selection]=\"'range'\" />\n * ```\n */\n selectable = input<boolean>();\n\n /**\n * Show a loading overlay on the grid.\n * Use this during initial data fetch or refresh operations.\n *\n * For row/cell loading states, access the grid element directly:\n * - `grid.setRowLoading(rowId, true/false)`\n * - `grid.setCellLoading(rowId, field, true/false)`\n *\n * @default false\n *\n * @example\n * ```html\n * <!-- Show loading during data fetch -->\n * <tbw-grid [loading]=\"isLoading\" [rows]=\"rows\" />\n * ```\n *\n * ```typescript\n * isLoading = true;\n *\n * ngOnInit() {\n * this.dataService.fetchData().subscribe(data => {\n * this.rows = data;\n * this.isLoading = false;\n * });\n * }\n * ```\n */\n loading = input<boolean>();\n\n /**\n * The data rows to display in the grid.\n *\n * Accepts an array of data objects. Each object represents one row.\n * The grid reads property values for each column's `field` from these objects.\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"employees()\" [gridConfig]=\"config\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rows = input<any[]>();\n\n /**\n * Column configuration array.\n *\n * Accepts either full `ColumnConfig` objects or shorthand strings such as\n * `'name'` or `'salary:number'`. Shorthands auto-generate human-readable\n * headers from the field name.\n *\n * Shorthand for setting columns without wrapping them in a full `gridConfig`.\n * If both `columns` and `gridConfig.columns` are set, `columns` takes precedence\n * (see configuration precedence system).\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"data\" [columns]=\"['id:number', 'name', { field: 'status', editable: true }]\" />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columns = input<ColumnShorthand<any>[]>();\n\n /**\n * Default column properties applied to every column in `columns`.\n * Individual column properties override these defaults.\n *\n * @example\n * ```html\n * <tbw-grid\n * [columnDefaults]=\"{ sortable: true, resizable: true }\"\n * [columns]=\"[{ field: 'id', sortable: false }, { field: 'name' }]\"\n * />\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columnDefaults = input<Partial<ColumnConfig<any>>>();\n\n /**\n * Column sizing strategy.\n *\n * - `'stretch'` (default) — columns stretch to fill available width\n * - `'fixed'` — columns use their declared widths; enables horizontal scrolling\n * - `'auto-fit'` — columns auto-size to content, then stretch to fill\n *\n * @default 'stretch'\n *\n * @example\n * ```html\n * <tbw-grid [rows]=\"data\" fitMode=\"fixed\" />\n * <tbw-grid [rows]=\"data\" [fitMode]=\"dynamicMode()\" />\n * ```\n */\n fitMode = input<FitMode>();\n\n /**\n * Grid configuration object with optional Angular-specific extensions.\n *\n * Accepts Angular-augmented `GridConfig` from `@toolbox-web/grid-angular`.\n * You can specify Angular component classes directly for renderers and editors.\n *\n * Component classes must implement the appropriate interfaces:\n * - Renderers: `CellRenderer<TRow, TValue>` - requires `value()` and `row()` signal inputs\n * - Editors: `CellEditor<TRow, TValue>` - adds `commit` and `cancel` outputs\n *\n * @example\n * ```typescript\n * // Simple config with plain renderers\n * config: GridConfig = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'active', type: 'boolean' }\n * ],\n * typeDefaults: {\n * boolean: { renderer: (ctx) => ctx.value ? '✓' : '✗' }\n * }\n * };\n *\n * // Config with component classes\n * config: GridConfig<Employee> = {\n * columns: [\n * { field: 'name', header: 'Name' },\n * { field: 'bonus', header: 'Bonus', editable: true, editor: BonusEditorComponent }\n * ]\n * };\n * ```\n *\n * ```html\n * <tbw-grid [gridConfig]=\"config\" [rows]=\"employees\"></tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n gridConfig = input<GridConfig<any>>();\n\n // ═══════════════════════════════════════════════════════════════════════════\n // FEATURE INPUTS - Declarative plugin configuration\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Enable cell/row/range selection.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/selection';\n * ```\n *\n * @example\n * ```html\n * <!-- Shorthand - just the mode -->\n * <tbw-grid [selection]=\"'range'\" />\n *\n * <!-- Full config object -->\n * <tbw-grid [selection]=\"{ mode: 'range', checkbox: true }\" />\n * ```\n *\n * @deprecated Use `GridSelectionDirective` from\n * `@toolbox-web/grid-angular/features/selection`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selection = input<'cell' | 'row' | 'range' | SelectionConfig<any>>();\n\n /**\n * Enable inline cell editing.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/editing';\n * ```\n *\n * @example\n * ```html\n * <!-- Enable with default trigger (dblclick) -->\n * <tbw-grid [editing]=\"true\" />\n *\n * <!-- Specify trigger -->\n * <tbw-grid [editing]=\"'click'\" />\n * <tbw-grid [editing]=\"'dblclick'\" />\n * <tbw-grid [editing]=\"'manual'\" />\n *\n * <!-- Full config with callbacks -->\n * <tbw-grid [editing]=\"{ editOn: 'dblclick', onBeforeEditClose: myCallback }\" />\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n editing = input<boolean | 'click' | 'dblclick' | 'manual' | EditingConfig>();\n\n /**\n * Enable clipboard copy/paste. Requires selection to be enabled.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/clipboard';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [selection]=\"'range'\" [clipboard]=\"true\" />\n * ```\n *\n * @deprecated Use `GridClipboardDirective` from\n * `@toolbox-web/grid-angular/features/clipboard`. Will be removed in v2.0.0.\n */\n clipboard = input<boolean | ClipboardConfig>();\n\n /**\n * Enable right-click context menu.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/context-menu';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [contextMenu]=\"true\" />\n * ```\n *\n * @deprecated Use `GridContextMenuDirective` from\n * `@toolbox-web/grid-angular/features/context-menu`. Will be removed in v2.0.0.\n */\n contextMenu = input<boolean | ContextMenuConfig>();\n\n /**\n * Enable multi-column sorting.\n *\n * Multi-sort allows users to sort by multiple columns simultaneously.\n * For basic single-column sorting, columns with `sortable: true` work without this plugin.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/multi-sort';\n * ```\n *\n * @example\n * ```html\n * <!-- Enable multi-column sorting -->\n * <tbw-grid [multiSort]=\"true\" />\n *\n * <!-- Limit to single column (uses plugin but restricts to 1 column) -->\n * <tbw-grid [multiSort]=\"'single'\" />\n *\n * <!-- Full config -->\n * <tbw-grid [multiSort]=\"{ maxSortColumns: 3 }\" />\n * ```\n *\n * @deprecated Use `GridMultiSortDirective` from\n * `@toolbox-web/grid-angular/features/multi-sort`. Will be removed in v2.0.0.\n */\n multiSort = input<boolean | 'single' | 'multi' | MultiSortConfig>();\n\n /**\n * Enable column filtering.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/filtering';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [filtering]=\"true\" />\n * <tbw-grid [filtering]=\"{ debounceMs: 200 }\" />\n * ```\n *\n * @deprecated Use `GridFilteringDirective` from\n * `@toolbox-web/grid-angular/features/filtering` and add it to your\n * component's `imports`. The directive owns the `filtering` input + the\n * `filterChange` output and lets the typed surface tree-shake away when\n * the feature is not imported. This input remains as a non-breaking shim\n * and will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n filtering = input<boolean | FilterConfig<any>>();\n\n /**\n * Enable column drag-to-reorder.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/reorder-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [reorderColumns]=\"true\" />\n * ```\n *\n * @deprecated Use `GridReorderColumnsDirective` from\n * `@toolbox-web/grid-angular/features/reorder-columns`. Will be removed in v2.0.0.\n */\n reorderColumns = input<boolean | ReorderConfig>();\n\n /**\n * Enable column visibility toggle panel.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/visibility';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [visibility]=\"true\" />\n * ```\n *\n * @deprecated Use `GridVisibilityDirective` from\n * `@toolbox-web/grid-angular/features/visibility`. Will be removed in v2.0.0.\n */\n visibility = input<boolean | VisibilityConfig>();\n\n /**\n * Enable pinned/sticky columns.\n * Columns are pinned via the `sticky` column property.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pinned-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pinnedColumns]=\"true\" [columns]=\"[\n * { field: 'id', pinned: 'left' },\n * { field: 'name' },\n * { field: 'actions', pinned: 'right' }\n * ]\" />\n * ```\n *\n * @deprecated Use `GridPinnedColumnsDirective` from\n * `@toolbox-web/grid-angular/features/pinned-columns`. Will be removed in v2.0.0.\n */\n pinnedColumns = input<boolean>();\n\n /**\n * Enable multi-level column headers (column groups).\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/grouping-columns';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [groupingColumns]=\"true\" />\n * ```\n *\n * @deprecated Use `GridGroupingColumnsDirective` from\n * `@toolbox-web/grid-angular/features/grouping-columns`. Will be removed in v2.0.0.\n */\n groupingColumns = input<boolean | GroupingColumnsConfig>();\n\n /**\n * Enable horizontal column virtualization for wide grids.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/column-virtualization';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [columnVirtualization]=\"true\" />\n * ```\n *\n * @deprecated Use `GridColumnVirtualizationDirective` from\n * `@toolbox-web/grid-angular/features/column-virtualization`. Will be removed in v2.0.0.\n */\n columnVirtualization = input<boolean | ColumnVirtualizationConfig>();\n\n /**\n * Enable row drag-to-reorder.\n *\n * @deprecated Use `rowDragDrop` instead. `reorderRows` remains as an alias.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/reorder-rows';\n * ```\n */\n reorderRows = input<boolean | RowReorderConfig>();\n\n /**\n * Enable row drag-and-drop within and across grids.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/row-drag-drop';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [rowDragDrop]=\"{ dropZone: 'employees', operation: 'move' }\" />\n * ```\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragDrop = input<boolean | RowDragDropConfig<any>>();\n\n /**\n * Enable row grouping by field values.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/grouping-rows';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [groupingRows]=\"{ groupBy: ['department'] }\" />\n * ```\n *\n * @deprecated Use `GridGroupingRowsDirective` from\n * `@toolbox-web/grid-angular/features/grouping-rows`. Will be removed in v2.0.0.\n */\n groupingRows = input<GroupingRowsConfig>();\n\n /**\n * Enable pinned rows (aggregation/status bar).\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pinned-rows';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pinnedRows]=\"{ bottom: [{ type: 'aggregation' }] }\" />\n * ```\n *\n * @deprecated Use `GridPinnedRowsDirective` from\n * `@toolbox-web/grid-angular/features/pinned-rows`. Will be removed in v2.0.0.\n */\n pinnedRows = input<boolean | PinnedRowsConfig>();\n\n /**\n * Enable hierarchical tree view.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/tree';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [tree]=\"{ childrenField: 'children' }\" />\n * ```\n *\n * @deprecated Use `GridTreeDirective` from\n * `@toolbox-web/grid-angular/features/tree`. Will be removed in v2.0.0.\n */\n tree = input<boolean | TreeConfig>();\n\n /**\n * Enable master-detail expandable rows.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/master-detail';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [masterDetail]=\"{ detailRenderer: detailFn }\" />\n * ```\n *\n * @deprecated Use `GridMasterDetailDirective` from\n * `@toolbox-web/grid-angular/features/master-detail`. Will be removed in v2.0.0.\n */\n masterDetail = input<MasterDetailConfig>();\n\n /**\n * Enable responsive card layout for narrow viewports.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/responsive';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [responsive]=\"{ breakpoint: 768 }\" />\n * ```\n *\n * @deprecated Use `GridResponsiveDirective` from\n * `@toolbox-web/grid-angular/features/responsive`. Will be removed in v2.0.0.\n */\n responsive = input<boolean | ResponsivePluginConfig>();\n\n /**\n * Enable undo/redo for cell edits. Requires editing to be enabled.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/undo-redo';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [editing]=\"'dblclick'\" [undoRedo]=\"true\" />\n * ```\n *\n * @deprecated Use `GridUndoRedoDirective` from\n * `@toolbox-web/grid-angular/features/undo-redo`. Will be removed in v2.0.0.\n */\n undoRedo = input<boolean | UndoRedoConfig>();\n\n /**\n * Enable CSV/JSON export functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/export';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [export]=\"true\" />\n * <tbw-grid [export]=\"{ filename: 'data.csv' }\" />\n * ```\n *\n * @deprecated Use `GridExportDirective` from\n * `@toolbox-web/grid-angular/features/export`. Will be removed in v2.0.0.\n */\n exportFeature = input<boolean | ExportConfig>(undefined, { alias: 'export' });\n\n /**\n * Enable print functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/print';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [print]=\"true\" />\n * ```\n *\n * @deprecated Use `GridPrintDirective` from\n * `@toolbox-web/grid-angular/features/print`. Will be removed in v2.0.0.\n */\n print = input<boolean | PrintConfig>();\n\n /**\n * Enable pivot table functionality.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/pivot';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [pivot]=\"{ rowFields: ['category'], valueField: 'sales' }\" />\n * ```\n *\n * @deprecated Use `GridPivotDirective` from\n * `@toolbox-web/grid-angular/features/pivot`. Will be removed in v2.0.0.\n */\n pivot = input<PivotConfig>();\n\n /**\n * Enable server-side data operations.\n *\n * **Requires feature import:**\n * ```typescript\n * import '@toolbox-web/grid-angular/features/server-side';\n * ```\n *\n * @example\n * ```html\n * <tbw-grid [serverSide]=\"{ dataSource: fetchDataFn }\" />\n * ```\n *\n * @deprecated Use `GridServerSideDirective` from\n * `@toolbox-web/grid-angular/features/server-side`. Will be removed in v2.0.0.\n */\n serverSide = input<ServerSideConfig>();\n\n /**\n * Controls the tooltip behavior for the grid.\n *\n * @example\n * ```html\n * <tbw-grid [tooltip]=\"true\" />\n * <tbw-grid [tooltip]=\"{ header: true, cell: false }\" />\n * ```\n *\n * @deprecated Use `GridTooltipDirective` from\n * `@toolbox-web/grid-angular/features/tooltip`. Will be removed in v2.0.0.\n */\n tooltip = input<boolean | TooltipConfig>();\n\n // ═══════════════════════════════════════════════════════════════════════════\n // EVENT OUTPUTS - All grid events\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Emitted when a cell is clicked.\n *\n * @example\n * ```html\n * <tbw-grid (cellClick)=\"onCellClick($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellClick = output<CellClickDetail<any>>();\n\n /**\n * Emitted when a row is clicked.\n *\n * @example\n * ```html\n * <tbw-grid (rowClick)=\"onRowClick($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowClick = output<RowClickDetail<any>>();\n\n /**\n * Emitted when a cell is activated (Enter key or double-click).\n *\n * @example\n * ```html\n * <tbw-grid (cellActivate)=\"onCellActivate($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellActivate = output<CellActivateDetail<any>>();\n\n /**\n * Emitted when a cell value changes (before commit).\n *\n * @example\n * ```html\n * <tbw-grid (cellChange)=\"onCellChange($event)\">...</tbw-grid>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cellChange = output<CellChangeDetail<any>>();\n\n /**\n * Emitted when a cell value is committed (inline editing).\n * Provides the row, field, new value, and change tracking information.\n *\n * @example\n * ```html\n * <tbw-grid (cellCommit)=\"onCellCommit($event)\">...</tbw-grid>\n * ```\n *\n * ```typescript\n * onCellCommit(event: CellCommitEvent) {\n * console.log(`Changed ${event.field} to ${event.value} in row ${event.rowIndex}`);\n * }\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n cellCommit = output<CellCommitEvent>();\n\n /**\n * Emitted when a cell edit is cancelled (Escape, click outside without\n * commit, or `editor.cancel()`).\n *\n * @example\n * ```html\n * <tbw-grid (cellCancel)=\"onCellCancel($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n cellCancel = output<CellCancelDetail>();\n\n /**\n * Emitted when a cell editor opens.\n *\n * @example\n * ```html\n * <tbw-grid (editOpen)=\"onEditOpen($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editOpen = output<EditOpenDetail<any>>();\n\n /**\n * Emitted before an editor closes. Useful for last-chance validation.\n *\n * @example\n * ```html\n * <tbw-grid (beforeEditClose)=\"onBeforeEditClose($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n beforeEditClose = output<BeforeEditCloseDetail<any>>();\n\n /**\n * Emitted after an editor closes (whether committed or cancelled).\n *\n * @example\n * ```html\n * <tbw-grid (editClose)=\"onEditClose($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editClose = output<EditCloseDetail<any>>();\n\n /**\n * Emitted when the dirty / changed-rows state transitions.\n *\n * @example\n * ```html\n * <tbw-grid (dirtyChange)=\"onDirtyChange($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dirtyChange = output<DirtyChangeDetail<any>>();\n\n /**\n * Emitted when row data is replaced (e.g. via the `rows` setter).\n *\n * @example\n * ```html\n * <tbw-grid (dataChange)=\"onDataChange($event)\">...</tbw-grid>\n * ```\n */\n dataChange = output<DataChangeDetail>();\n\n /**\n * Emitted when a row's values are committed (bulk/row editing).\n * Provides the row data and change tracking information.\n *\n * @example\n * ```html\n * <tbw-grid (rowCommit)=\"onRowCommit($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n rowCommit = output<RowCommitEvent>();\n\n /**\n * Emitted when the changed rows are reset.\n *\n * @example\n * ```html\n * <tbw-grid (changedRowsReset)=\"onChangedRowsReset($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridEditingDirective` from\n * `@toolbox-web/grid-angular/features/editing`. Will be removed in v2.0.0.\n */\n changedRowsReset = output<ChangedRowsResetDetail>();\n\n /**\n * Emitted when sort state changes.\n *\n * @example\n * ```html\n * <tbw-grid (sortChange)=\"onSortChange($event)\">...</tbw-grid>\n * ```\n */\n sortChange = output<SortChangeDetail>();\n\n /**\n * Emitted when filter values change.\n *\n * @example\n * ```html\n * <tbw-grid (filterChange)=\"onFilterChange($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridFilteringDirective` from\n * `@toolbox-web/grid-angular/features/filtering` (the directive\n * declares the `(filterChange)` output). This output remains as a\n * non-breaking shim and will be removed in v2.0.0.\n */\n filterChange = output<FilterChangeDetail>();\n\n /**\n * Emitted when a column is resized.\n *\n * @example\n * ```html\n * <tbw-grid (columnResize)=\"onColumnResize($event)\">...</tbw-grid>\n * ```\n */\n columnResize = output<ColumnResizeDetail>();\n\n /**\n * Emitted when a column's width is reset (double-click on the resize handle).\n *\n * @example\n * ```html\n * <tbw-grid (columnResizeReset)=\"onColumnResizeReset($event)\">...</tbw-grid>\n * ```\n */\n columnResizeReset = output<ColumnResizeResetDetail>();\n\n /**\n * Emitted when a column is moved via drag-and-drop.\n *\n * @example\n * ```html\n * <tbw-grid (columnMove)=\"onColumnMove($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridReorderColumnsDirective` from\n * `@toolbox-web/grid-angular/features/reorder-columns`. Will be removed in v2.0.0.\n */\n columnMove = output<ColumnMoveDetail>();\n\n /**\n * Emitted when a column is shown or hidden — either via the visibility\n * sidebar, `grid.toggleColumnVisibility(field)`, `grid.setColumnVisible(field, visible)`,\n * or `grid.showAllColumns()`.\n *\n * @example\n * ```html\n * <tbw-grid (columnVisibility)=\"onColumnVisibility($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridVisibilityDirective` from\n * `@toolbox-web/grid-angular/features/visibility`. Will be removed in v2.0.0.\n */\n columnVisibility = output<ColumnVisibilityDetail>();\n\n /**\n * Emitted when column state changes (resize, reorder, visibility).\n *\n * @example\n * ```html\n * <tbw-grid (columnStateChange)=\"onColumnStateChange($event)\">...</tbw-grid>\n * ```\n */\n columnStateChange = output<GridColumnState>();\n\n /**\n * Emitted when selection changes.\n *\n * @example\n * ```html\n * <tbw-grid (selectionChange)=\"onSelectionChange($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridSelectionDirective` from\n * `@toolbox-web/grid-angular/features/selection`. Will be removed in v2.0.0.\n */\n selectionChange = output<SelectionChangeDetail>();\n\n /**\n * Emitted when a row is moved via drag-and-drop.\n *\n * @example\n * ```html\n * <tbw-grid (rowMove)=\"onRowMove($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowMove = output<RowMoveDetail<any>>();\n\n /**\n * Emitted when a row drag starts. Cancelable via `event.preventDefault()`.\n *\n * @example\n * ```html\n * <tbw-grid (rowDragStart)=\"onRowDragStart($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragStart = output<RowDragStartDetail<any>>();\n\n /**\n * Emitted when a row drag ends (after drop or cancel).\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDragEnd = output<RowDragEndDetail<any>>();\n\n /**\n * Emitted on the target grid when rows are dropped from another grid.\n * Cancelable via `event.preventDefault()`.\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowDrop = output<RowDropDetail<any>>();\n\n /**\n * Emitted on BOTH source and target grids after a successful cross-grid\n * row transfer.\n *\n * @deprecated Use `GridRowDragDropDirective` from\n * `@toolbox-web/grid-angular/features/row-drag-drop`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rowTransfer = output<RowTransferDetail<any>>();\n\n /**\n * Emitted when a group is expanded or collapsed.\n *\n * @example\n * ```html\n * <tbw-grid (groupToggle)=\"onGroupToggle($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridGroupingRowsDirective` from\n * `@toolbox-web/grid-angular/features/grouping-rows`. Will be removed in v2.0.0.\n */\n groupToggle = output<GroupToggleDetail>();\n\n /**\n * Emitted when a group is expanded.\n *\n * @example\n * ```html\n * <tbw-grid (groupExpand)=\"onGroupExpand($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridGroupingRowsDirective` from\n * `@toolbox-web/grid-angular/features/grouping-rows`. Will be removed in v2.0.0.\n */\n groupExpand = output<GroupExpandDetail>();\n\n /**\n * Emitted when a group is collapsed.\n *\n * @example\n * ```html\n * <tbw-grid (groupCollapse)=\"onGroupCollapse($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridGroupingRowsDirective` from\n * `@toolbox-web/grid-angular/features/grouping-rows`. Will be removed in v2.0.0.\n */\n groupCollapse = output<GroupCollapseDetail>();\n\n /**\n * Emitted when a tree node is expanded.\n *\n * @example\n * ```html\n * <tbw-grid (treeExpand)=\"onTreeExpand($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridTreeDirective` from\n * `@toolbox-web/grid-angular/features/tree`. Will be removed in v2.0.0.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n treeExpand = output<TreeExpandDetail<any>>();\n\n /**\n * Emitted when a detail panel is expanded or collapsed.\n *\n * @example\n * ```html\n * <tbw-grid (detailExpand)=\"onDetailExpand($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridMasterDetailDirective` from\n * `@toolbox-web/grid-angular/features/master-detail`. Will be removed in v2.0.0.\n */\n detailExpand = output<DetailExpandDetail>();\n\n /**\n * Emitted when responsive mode changes (table ↔ card).\n *\n * @example\n * ```html\n * <tbw-grid (responsiveChange)=\"onResponsiveChange($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridResponsiveDirective` from\n * `@toolbox-web/grid-angular/features/responsive`. Will be removed in v2.0.0.\n */\n responsiveChange = output<ResponsiveChangeDetail>();\n\n /**\n * Emitted when the context menu opens.\n *\n * @example\n * ```html\n * <tbw-grid (contextMenuOpen)=\"onContextMenuOpen($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridContextMenuDirective` from\n * `@toolbox-web/grid-angular/features/context-menu`. Will be removed in v2.0.0.\n */\n contextMenuOpen = output<ContextMenuOpenDetail>();\n\n /**\n * Emitted when cells are copied to clipboard.\n *\n * @example\n * ```html\n * <tbw-grid (copy)=\"onCopy($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridClipboardDirective` from\n * `@toolbox-web/grid-angular/features/clipboard`. Will be removed in v2.0.0.\n */\n copy = output<CopyDetail>();\n\n /**\n * Emitted when cells are pasted from clipboard.\n *\n * @example\n * ```html\n * <tbw-grid (paste)=\"onPaste($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridClipboardDirective` from\n * `@toolbox-web/grid-angular/features/clipboard`. Will be removed in v2.0.0.\n */\n paste = output<PasteDetail>();\n\n /**\n * Emitted when an undo action is performed.\n *\n * @example\n * ```html\n * <tbw-grid (undo)=\"onUndo($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridUndoRedoDirective` from\n * `@toolbox-web/grid-angular/features/undo-redo`. Will be removed in v2.0.0.\n */\n undo = output<UndoRedoDetail>();\n\n /**\n * Emitted when a redo action is performed.\n *\n * @example\n * ```html\n * <tbw-grid (redo)=\"onRedo($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridUndoRedoDirective` from\n * `@toolbox-web/grid-angular/features/undo-redo`. Will be removed in v2.0.0.\n */\n redo = output<UndoRedoDetail>();\n\n /**\n * Emitted when export completes.\n *\n * @example\n * ```html\n * <tbw-grid (exportComplete)=\"onExportComplete($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridExportDirective` from\n * `@toolbox-web/grid-angular/features/export`. Will be removed in v2.0.0.\n */\n exportComplete = output<ExportCompleteDetail>();\n\n /**\n * Emitted when print starts.\n *\n * @example\n * ```html\n * <tbw-grid (printStart)=\"onPrintStart($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridPrintDirective` from\n * `@toolbox-web/grid-angular/features/print`. Will be removed in v2.0.0.\n */\n printStart = output<PrintStartDetail>();\n\n /**\n * Emitted when print completes.\n *\n * @example\n * ```html\n * <tbw-grid (printComplete)=\"onPrintComplete($event)\">...</tbw-grid>\n * ```\n *\n * @deprecated Use `GridPrintDirective` from\n * `@toolbox-web/grid-angular/features/print`. Will be removed in v2.0.0.\n */\n printComplete = output<PrintCompleteDetail>();\n\n /**\n * Emitted (rAF-batched) when the grid's viewport is scrolled vertically.\n *\n * For server-side pagination of large datasets prefer `ServerSidePlugin`\n * — this event is the lower-level primitive for custom load-more triggers,\n * deferring heavy cell content, dismissing overlays, etc.\n *\n * Named `tbwScroll` (not `scroll`) to avoid collision with the native DOM\n * scroll event that bubbles from focusable internals.\n *\n * @example\n * ```html\n * <tbw-grid (tbwScroll)=\"onScroll($event)\">...</tbw-grid>\n * ```\n */\n tbwScroll = output<TbwScrollDetail>();\n\n // Map of output names to event names for automatic wiring.\n //\n // The `satisfies` clause enforces compile-time sync against\n // `DataGridEventMap`: every value must be a real event name (typos and\n // stale entries pointing at non-existent events fail to compile).\n // Plugin event augmentations of `DataGridEventMap` flow through\n // automatically via the `/all` import.\n private readonly eventOutputMap = {\n cellClick: 'cell-click',\n rowClick: 'row-click',\n cellActivate: 'cell-activate',\n cellChange: 'cell-change',\n cellCommit: 'cell-commit',\n cellCancel: 'cell-cancel',\n rowCommit: 'row-commit',\n changedRowsReset: 'changed-rows-reset',\n editOpen: 'edit-open',\n beforeEditClose: 'before-edit-close',\n editClose: 'edit-close',\n dirtyChange: 'dirty-change',\n dataChange: 'data-change',\n sortChange: 'sort-change',\n filterChange: 'filter-change',\n columnResize: 'column-resize',\n columnResizeReset: 'column-resize-reset',\n columnMove: 'column-move',\n columnVisibility: 'column-visibility',\n columnStateChange: 'column-state-change',\n selectionChange: 'selection-change',\n rowMove: 'row-move',\n rowDragStart: 'row-drag-start',\n rowDragEnd: 'row-drag-end',\n rowDrop: 'row-drop',\n rowTransfer: 'row-transfer',\n groupToggle: 'group-toggle',\n groupExpand: 'group-expand',\n groupCollapse: 'group-collapse',\n treeExpand: 'tree-expand',\n detailExpand: 'detail-expand',\n responsiveChange: 'responsive-change',\n contextMenuOpen: 'context-menu-open',\n copy: 'copy',\n paste: 'paste',\n undo: 'undo',\n redo: 'redo',\n exportComplete: 'export-complete',\n printStart: 'print-start',\n printComplete: 'print-complete',\n tbwScroll: 'tbw-scroll',\n } as const satisfies Readonly<Record<string, keyof DataGridEventMap<unknown>>>;\n\n // ─────────────────────────────────────────────────────────────────────────\n // Forward-only event coverage guard.\n //\n // Mirrors the React adapter's `_AssertFeaturePropsCoverCore` pattern. If a\n // new event is added to core's `DataGridEventMap` (via plugin module\n // augmentation in `/all`) but no `eventOutputMap` entry covers it, this\n // type fails to evaluate to `true` and the build breaks. Adapter consumers\n // never see a silently-dropped event.\n //\n // Reverse direction (extra `eventOutputMap` entries pointing at non-existent\n // events) is already enforced by the `satisfies` clause above.\n //\n // To consciously omit an event from the Angular surface, add it to the\n // `IntentionallyOmittedEvents` union below with a comment explaining why.\n // ─────────────────────────────────────────────────────────────────────────\n /** Events deliberately not exposed as Angular outputs. Keep empty unless documented. */\n declare private _intentionallyOmittedEvents: never;\n declare private _assertEventOutputMapCoversCore: [\n Exclude<\n keyof DataGridEventMap<unknown>,\n | (typeof Grid.prototype.eventOutputMap)[keyof typeof Grid.prototype.eventOutputMap]\n | Grid['_intentionallyOmittedEvents']\n >,\n ] extends [never]\n ? true\n : [\n 'Missing Angular outputs for core grid events:',\n Exclude<\n keyof DataGridEventMap<unknown>,\n | (typeof Grid.prototype.eventOutputMap)[keyof typeof Grid.prototype.eventOutputMap]\n | Grid['_intentionallyOmittedEvents']\n >,\n ];\n\n // Store event listeners for cleanup\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private eventListeners: Map<string, (e: Event) => void> = new Map();\n\n ngOnInit(): void {\n // Create and register the adapter\n this.adapter = new GridAdapter(this.injector, this.appRef, this.viewContainerRef);\n GridElementClass.registerAdapter(this.adapter);\n\n const grid = this.elementRef.nativeElement;\n\n // Register adapter on the grid element so processConfig is called\n // automatically by the grid's set gridConfig setter, and so\n // MasterDetailPlugin can use it via the __frameworkAdapter hook during attach()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (grid as any).__frameworkAdapter = this.adapter;\n\n // Wire up all event listeners based on eventOutputMap\n this.setupEventListeners(grid);\n }\n\n /**\n * Sets up event listeners for all outputs using the eventOutputMap.\n *\n * Hybrid v1.x / v2 ownership: events claimed by an attribute-selector\n * feature directive (via `claimEvent` in `feature-claims.ts`) are skipped\n * here so the directive's own `output()` is the sole emitter. Without\n * this skip both this directive's deprecated output and the directive's\n * new output would fire for the same DOM event.\n */\n private setupEventListeners(grid: GridElement): void {\n // Wire up all event listeners\n for (const [outputName, eventName] of Object.entries(this.eventOutputMap)) {\n if (isEventClaimed(grid, eventName)) continue;\n const listener = (e: Event) => {\n const detail = (e as CustomEvent).detail;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[outputName].emit(detail);\n };\n grid.addEventListener(eventName, listener);\n this.eventListeners.set(eventName, listener);\n }\n }\n\n /**\n * Creates plugins from feature inputs.\n * Uses the feature registry to allow tree-shaking - only imported features are bundled.\n * Per-feature config bridging (e.g. converting Angular component classes inside\n * `groupingColumns` / `groupingRows` / `pinnedRows` configs to renderer functions)\n * runs via `getFeatureConfigPreprocessor`, populated by feature secondary entries.\n *\n * Hybrid v1.x / v2 ownership: when an attribute-selector feature directive\n * (e.g. `GridFilteringDirective`) is present on the same `<tbw-grid>`\n * element it claims its feature in `feature-claims.ts`. We then read the\n * claim's config getter — which transitively reads the directive's input\n * signal, establishing reactive dependency tracking — instead of the\n * deprecated input on this directive. This keeps the existing `[filtering]`\n * binding working when used directly on `<tbw-grid>` (no directive, no\n * claim) while letting the directive own the binding when imported.\n *\n * Returns the array of created plugins (doesn't modify grid).\n */\n private createFeaturePlugins(): unknown[] {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const plugins: unknown[] = [];\n const adapter = this.adapter;\n const grid = this.elementRef.nativeElement;\n\n // Helper to add plugin if feature is registered\n const addPlugin = (name: FeatureName, ownInput: unknown) => {\n // Directive-owned config wins. Reading the claim's getter inside this\n // effect registers the directive's input signal as a dependency, so\n // changes to e.g. `[filtering]` on the directive re-trigger this effect.\n const claim = getFeatureClaim(grid, name);\n const config = claim ? claim() : ownInput;\n if (config === undefined || config === null || config === false) return;\n // Apply per-feature config preprocessor (registered by feature secondary entries)\n // to bridge Angular component classes embedded in the config before instantiation.\n let finalConfig: unknown = config;\n if (adapter && config !== true && typeof config === 'object') {\n const preprocess = getFeatureConfigPreprocessor(name);\n if (preprocess) finalConfig = preprocess(config, adapter);\n }\n const plugin = createPluginFromFeature(name, finalConfig);\n if (plugin) plugins.push(plugin);\n };\n\n addPlugin('selection', this.selection());\n addPlugin('editing', this.editing());\n addPlugin('clipboard', this.clipboard());\n addPlugin('contextMenu', this.contextMenu());\n addPlugin('multiSort', this.multiSort());\n addPlugin('filtering', this.filtering());\n addPlugin('reorderColumns', this.reorderColumns());\n addPlugin('visibility', this.visibility());\n addPlugin('pinnedColumns', this.pinnedColumns());\n addPlugin('groupingColumns', this.groupingColumns());\n addPlugin('columnVirtualization', this.columnVirtualization());\n addPlugin('reorderRows', this.reorderRows());\n addPlugin('rowDragDrop', this.rowDragDrop());\n addPlugin('groupingRows', this.groupingRows());\n addPlugin('pinnedRows', this.pinnedRows());\n addPlugin('tree', this.tree());\n addPlugin('masterDetail', this.masterDetail());\n addPlugin('responsive', this.responsive());\n addPlugin('undoRedo', this.undoRedo());\n addPlugin('export', this.exportFeature());\n addPlugin('print', this.print());\n addPlugin('pivot', this.pivot());\n addPlugin('serverSide', this.serverSide());\n addPlugin('tooltip', this.tooltip());\n\n return plugins;\n }\n\n ngAfterContentInit(): void {\n // After Angular child directives have initialized (GridColumnView, GridColumnEditor, GridDetailView, GridToolPanel),\n // force the grid to re-parse light DOM columns so adapters can create renderers/editors\n const grid = this.elementRef.nativeElement;\n if (grid && typeof (grid as any).refreshColumns === 'function') {\n // Use setTimeout to ensure Angular effects have run (template registration)\n setTimeout(() => {\n (grid as any).refreshColumns();\n\n // Run feature-registered template bridges. Each bridge wires a specific\n // light-DOM slot element (<tbw-grid-detail>, <tbw-grid-responsive-card>, ...)\n // to its plugin. Bridges are registered by feature secondary entries\n // (e.g. `import '@toolbox-web/grid-angular/features/master-detail';`).\n if (this.adapter) {\n runTemplateBridges({ grid, adapter: this.adapter });\n }\n\n // Refresh shell header to pick up tool panel templates\n // This allows Angular templates to be used in tool panels\n if (typeof (grid as any).refreshShellHeader === 'function') {\n (grid as any).refreshShellHeader();\n }\n\n // Register custom styles if provided\n this.registerCustomStyles(grid);\n }, 0);\n }\n }\n\n /**\n * Registers custom styles into the grid.\n * Uses the grid's registerStyles() API for clean encapsulation.\n */\n private registerCustomStyles(grid: GridElement): void {\n const styles = this.customStyles();\n if (!styles) return;\n\n // Wait for grid to be ready before registering styles\n grid.ready?.().then(() => {\n grid.registerStyles?.('angular-custom-styles', styles);\n });\n }\n\n ngOnDestroy(): void {\n const grid = this.elementRef.nativeElement;\n\n // Cleanup all event listeners\n if (grid) {\n for (const [eventName, listener] of this.eventListeners) {\n grid.removeEventListener(eventName, listener);\n }\n this.eventListeners.clear();\n }\n\n // Cleanup custom styles\n if (grid && this.customStyles()) {\n grid.unregisterStyles?.('angular-custom-styles');\n }\n\n // Cleanup adapter if needed\n if (this.adapter) {\n this.adapter.destroy?.();\n this.adapter = null;\n }\n }\n}\n","/**\n * Combined provider helper for grid type defaults and icons.\n *\n * Convenience function that combines `provideGridTypeDefaults` and\n * `provideGridIcons` into a single call for application bootstrap.\n *\n * @example\n * ```typescript\n * // app.config.ts\n * import { ApplicationConfig } from '@angular/core';\n * import { provideGrid } from '@toolbox-web/grid-angular';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideGrid({\n * typeDefaults: {\n * country: { renderer: CountryCellComponent },\n * },\n * icons: {\n * sortAsc: '↑',\n * sortDesc: '↓',\n * },\n * }),\n * ],\n * };\n * ```\n */\nimport { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport type { GridIcons } from '@toolbox-web/grid';\nimport { provideGridIcons } from './grid-icon-registry';\nimport { provideGridTypeDefaults, type TypeDefaultRegistration } from './grid-type-registry';\n\n/**\n * Options for {@link provideGrid}.\n * @since 1.4.0\n */\nexport interface ProvideGridOptions {\n /** Type defaults to register globally. Equivalent to `provideGridTypeDefaults`. */\n typeDefaults?: Record<string, TypeDefaultRegistration>;\n /** Icon overrides to register globally. Equivalent to `provideGridIcons`. */\n icons?: Partial<GridIcons>;\n}\n\n/**\n * Combined provider for grid type defaults and icons.\n *\n * Returns environment providers that can be added to your `ApplicationConfig`\n * `providers` array. Either field is optional — only the registries you\n * supply are wired up.\n *\n * Equivalent to calling `provideGridTypeDefaults(options.typeDefaults)` and\n * `provideGridIcons(options.icons)` separately.\n * @since 1.4.0\n */\nexport function provideGrid(options: ProvideGridOptions = {}): EnvironmentProviders {\n const providers: EnvironmentProviders[] = [];\n if (options.typeDefaults) {\n providers.push(provideGridTypeDefaults(options.typeDefaults));\n }\n if (options.icons) {\n providers.push(provideGridIcons(options.icons));\n }\n return makeEnvironmentProviders(providers);\n}\n","/**\n * @packageDocumentation\n * @toolbox-web/grid-angular - Angular adapter for @toolbox-web/grid.\n *\n * Provides directives for seamless Angular integration with the grid component.\n */\n\n// Primary export\nexport {\n GridAdapter,\n makeFlushFocusedInput,\n registerDetailRendererBridge,\n registerEditorMountHook,\n registerFilterPanelTypeDefaultBridge,\n registerResponsiveCardRendererBridge,\n} from './lib/angular-grid-adapter';\nexport type { EditorMountHook, FilterPanelTypeDefaultBridge, RowRendererBridge } from './lib/angular-grid-adapter';\n\n// Configuration types\nexport { isComponentClass } from './lib/angular-column-config';\nexport type {\n CellEditor,\n CellRenderer,\n ColumnConfig,\n FilterPanel,\n GridConfig,\n TypeDefault,\n} from './lib/angular-column-config';\n\n// Type registry for application-wide type defaults\nexport { GRID_TYPE_DEFAULTS, GridTypeRegistry, provideGridTypeDefaults } from './lib/grid-type-registry';\nexport type { TypeDefaultRegistration } from './lib/grid-type-registry';\n\n// Icon registry for application-wide icon overrides\nexport { GRID_ICONS, GridIconRegistry, provideGridIcons } from './lib/grid-icon-registry';\n\n// Inject function for programmatic grid access\nexport { injectGrid } from './lib/inject-grid';\nexport type { InjectGridReturn } from './lib/inject-grid';\n\n// Feature registry for tree-shakeable plugin registration\nexport {\n clearFeatureRegistry,\n createPluginFromFeature,\n getFeatureFactory,\n getRegisteredFeatures,\n isFeatureRegistered,\n registerFeature,\n} from './lib/feature-registry';\nexport type { FeatureName, PluginFactory } from './lib/feature-registry';\n\n// Base classes for editors and filter panels\n//\n// NOTE: All re-exports below for editing/filtering/master-detail directives are\n// `@deprecated` from the main `@toolbox-web/grid-angular` entry. Importing the\n// same symbol from `@toolbox-web/grid-angular/features/<feature>` does NOT\n// trigger the deprecation warning \\u2014 only this main-entry path does. The source\n// will physically move into the matching `features/<feature>` secondary entry\n// in v2.0.0, and these re-exports will be removed at the same time. Search the\n// `libs/grid-angular/src/` tree for `MOVE-IN-V2` to enumerate everything that\n// needs to move at that point.\n\n/** @deprecated Import from `@toolbox-web/grid-angular/features/filtering` instead. Will be removed from the main entry in v2.0.0. */\nexport { BaseFilterPanel } from './lib/base-filter-panel';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { BaseGridEditor } from './lib/base-grid-editor';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { BaseGridEditorCVA } from './lib/base-grid-editor-cva';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { BaseOverlayEditor } from './lib/base-overlay-editor';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport type { OverlayPosition } from './lib/base-overlay-editor';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { GridColumnEditor } from './lib/directives/grid-column-editor.directive';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport type { GridEditorContext } from './lib/directives/grid-column-editor.directive';\nexport { GridColumnView } from './lib/directives/grid-column-view.directive';\nexport type { GridCellContext } from './lib/directives/grid-column-view.directive';\nexport { TbwGridColumn } from './lib/directives/grid-column.directive';\n/**\n * @deprecated Import from `@toolbox-web/grid-angular/features/master-detail` instead.\n * Will be removed from the main entry in v2.0.0.\n */\nexport { GridDetailView, getDetailTemplate } from './lib/directives/grid-detail-view.directive';\n/**\n * @deprecated Import from `@toolbox-web/grid-angular/features/master-detail` instead.\n * Will be removed from the main entry in v2.0.0.\n */\nexport type { GridDetailContext } from './lib/directives/grid-detail-view.directive';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { GridFormArray, getFormArrayContext } from './lib/directives/grid-form-array.directive';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport type { FormArrayContext } from './lib/directives/grid-form-array.directive';\nexport { TbwGridHeader } from './lib/directives/grid-header.directive';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { GridLazyForm, getLazyFormContext } from './lib/directives/grid-lazy-form.directive';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport type { LazyFormFactory, RowFormChangeEvent } from './lib/directives/grid-lazy-form.directive';\nexport { GridResponsiveCard, getResponsiveCardTemplate } from './lib/directives/grid-responsive-card.directive';\nexport type { GridResponsiveCardContext } from './lib/directives/grid-responsive-card.directive';\nexport { TbwGridToolButtons } from './lib/directives/grid-tool-buttons.directive';\nexport { GridToolPanel } from './lib/directives/grid-tool-panel.directive';\nexport type { GridToolPanelContext } from './lib/directives/grid-tool-panel.directive';\nexport { Grid } from './lib/directives/grid.directive';\nexport type { CellCommitEvent, RowCommitEvent } from './lib/directives/grid.directive';\n\n// Structural directives for cleaner template syntax. `TbwRenderer` stays in the\n// main entry (editor-agnostic). `TbwEditor` is deprecated here \\u2014 use the\n// `features/editing` re-export instead.\nexport { TbwRenderer } from './lib/directives/structural-directives';\nexport type { StructuralCellContext } from './lib/directives/structural-directives';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport { TbwEditor } from './lib/directives/structural-directives';\n/** @deprecated Import from `@toolbox-web/grid-angular/features/editing` instead. Will be removed from the main entry in v2.0.0. */\nexport type { StructuralEditorContext } from './lib/directives/structural-directives';\n\n// Column shorthand utilities (parity with grid-react / grid-vue)\nexport {\n applyColumnDefaults,\n hasColumnShorthands,\n normalizeColumns,\n parseColumnShorthand,\n} from './lib/column-shorthand';\nexport type { ColumnShorthand } from './lib/column-shorthand';\n\n// Combined provider helper (parity with grid-vue's GridProvider component)\nexport { provideGrid } from './lib/grid-provider';\nexport type { ProvideGridOptions } from './lib/grid-provider';\n\n// Internal extension points used by feature secondary entries to plug into the\n// core Grid directive (template bridges + per-feature config preprocessors).\n// These are public for cross-entry-point use; not part of the supported API.\nexport {\n getFeatureConfigPreprocessor,\n registerFeatureConfigPreprocessor,\n registerTemplateBridge,\n runTemplateBridges,\n} from './lib/internal/feature-extensions';\nexport type {\n FeatureConfigPreprocessor,\n TemplateBridge,\n TemplateBridgeContext,\n} from './lib/internal/feature-extensions';\n\n// Per-grid claims registry used by feature-attribute directives to take\n// ownership of inputs/outputs that are otherwise handled by the central\n// `Grid` directive. Public for cross-entry-point use; not part of the\n// supported API. See `internal/feature-claims.ts` for the design rationale.\nexport {\n claimEvent,\n getFeatureClaim,\n isEventClaimed,\n registerFeatureClaim,\n unclaimEvent,\n unregisterFeatureClaim,\n} from './lib/internal/feature-claims';\nexport type { FeatureConfigGetter } from './lib/internal/feature-claims';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["FORM_ARRAY_CONTEXT","GridElementClass"],"mappings":"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"}