@angular-bootstrap/ngbootstrap 2.0.2 → 2.1.0

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, ViewChild, Directive, inject, Injectable, signal, TemplateRef, HostBinding, ElementRef, Renderer2, ChangeDetectorRef, Optional, InjectionToken, Inject, HostListener, QueryList, forwardRef, ContentChildren, ContentChild, ViewEncapsulation, SkipSelf, ViewChildren } from '@angular/core';
2
+ import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, ViewChild, Directive, inject, Injectable, signal, TemplateRef, HostBinding, input, computed, ElementRef, Renderer2, ChangeDetectorRef, Optional, InjectionToken, Inject, HostListener, QueryList, forwardRef, ContentChildren, ContentChild, ViewEncapsulation, SkipSelf, ViewChildren } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { CommonModule, DOCUMENT } from '@angular/common';
5
5
  import * as i1 from '@angular/forms';
@@ -704,6 +704,66 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
704
704
  type: Directive,
705
705
  args: [{ selector: 'ng-template[ngbPager]', standalone: true }]
706
706
  }], ctorParameters: () => [{ type: i0.TemplateRef }] });
707
+ class NgbDataGridGroupHeaderTemplateDirective {
708
+ template;
709
+ constructor(template) {
710
+ this.template = template;
711
+ }
712
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
713
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupHeaderTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupHeaderTemplate], ng-template[ngbGroupHeader]", ngImport: i0 });
714
+ }
715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderTemplateDirective, decorators: [{
716
+ type: Directive,
717
+ args: [{ selector: 'ng-template[ngbDatagridGroupHeaderTemplate], ng-template[ngbGroupHeader]', standalone: true }]
718
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
719
+ class NgbDataGridGroupHeaderColumnTemplateDirective {
720
+ template;
721
+ // Preserve the explicit public template binding names for compatibility.
722
+ field;
723
+ // eslint-disable-next-line @angular-eslint/no-input-rename
724
+ set legacyField(value) {
725
+ this.field = value;
726
+ }
727
+ constructor(template) {
728
+ this.template = template;
729
+ }
730
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderColumnTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
731
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupHeaderColumnTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupHeaderColumnTemplate], ng-template[ngbGroupHeaderColumn]", inputs: { field: ["ngbDatagridGroupHeaderColumnTemplate", "field"], legacyField: ["ngbGroupHeaderColumn", "legacyField"] }, ngImport: i0 });
732
+ }
733
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupHeaderColumnTemplateDirective, decorators: [{
734
+ type: Directive,
735
+ args: [{ selector: 'ng-template[ngbDatagridGroupHeaderColumnTemplate], ng-template[ngbGroupHeaderColumn]', standalone: true }]
736
+ }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
737
+ type: Input,
738
+ args: ['ngbDatagridGroupHeaderColumnTemplate']
739
+ }], legacyField: [{
740
+ type: Input,
741
+ args: ['ngbGroupHeaderColumn']
742
+ }] } });
743
+ class NgbDataGridGroupFooterTemplateDirective {
744
+ template;
745
+ // Preserve the explicit public template binding names for compatibility.
746
+ field;
747
+ // eslint-disable-next-line @angular-eslint/no-input-rename
748
+ set legacyField(value) {
749
+ this.field = value;
750
+ }
751
+ constructor(template) {
752
+ this.template = template;
753
+ }
754
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupFooterTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
755
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDataGridGroupFooterTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupFooterTemplate], ng-template[ngbGroupFooter]", inputs: { field: ["ngbDatagridGroupFooterTemplate", "field"], legacyField: ["ngbGroupFooter", "legacyField"] }, ngImport: i0 });
756
+ }
757
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataGridGroupFooterTemplateDirective, decorators: [{
758
+ type: Directive,
759
+ args: [{ selector: 'ng-template[ngbDatagridGroupFooterTemplate], ng-template[ngbGroupFooter]', standalone: true }]
760
+ }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
761
+ type: Input,
762
+ args: ['ngbDatagridGroupFooterTemplate']
763
+ }], legacyField: [{
764
+ type: Input,
765
+ args: ['ngbGroupFooter']
766
+ }] } });
707
767
  /** Handy constant to import in consumer apps */
708
768
  const DATAGRID_TEMPLATE_DIRECTIVES = [
709
769
  NgbCellTemplate,
@@ -713,6 +773,9 @@ const DATAGRID_TEMPLATE_DIRECTIVES = [
713
773
  NgbGlobalFilterTemplate,
714
774
  NgbRowDetailTemplate,
715
775
  NgbPagerTemplate,
776
+ NgbDataGridGroupHeaderTemplateDirective,
777
+ NgbDataGridGroupHeaderColumnTemplateDirective,
778
+ NgbDataGridGroupFooterTemplateDirective,
716
779
  ];
717
780
 
718
781
  const NGB_TEXT_FILTER_OPERATORS = [
@@ -904,12 +967,23 @@ function ngbApplyDataGridOperations(data, options = {}) {
904
967
  const total = sorted.length;
905
968
  const aggregates = ngbCalculateDataGridAggregates(sorted, options.aggregates ?? []);
906
969
  const page = options.page === false ? sorted : applyPage(sorted, state);
970
+ const groupedData = (state.group?.length ?? 0) > 0
971
+ ? (options.groupedData?.length ? cloneGroupResults(options.groupedData) : ngbGroupData(page, state.group ?? []))
972
+ : undefined;
907
973
  return {
908
974
  data: page,
909
975
  total,
910
976
  ...(Object.keys(aggregates).length ? { aggregates } : {}),
977
+ ...(groupedData?.length ? { groupedData } : {}),
911
978
  };
912
979
  }
980
+ function ngbGroupData(data, descriptors) {
981
+ const rows = [...(data ?? [])];
982
+ const normalized = normalizeGroupDescriptors(descriptors);
983
+ if (!normalized.length || !rows.length)
984
+ return [];
985
+ return groupRows(rows, normalized, 0);
986
+ }
913
987
  function ngbCalculateDataGridAggregates(data, descriptors) {
914
988
  const rows = [...(data ?? [])];
915
989
  const results = {};
@@ -919,16 +993,19 @@ function ngbCalculateDataGridAggregates(data, descriptors) {
919
993
  const values = rows
920
994
  .map((row) => row?.[field])
921
995
  .filter((value) => value !== null && value !== undefined && value !== '');
922
- switch (descriptor.aggregate) {
996
+ const aggregate = normalizeAggregate(descriptor.aggregate);
997
+ switch (aggregate) {
923
998
  case 'count':
924
999
  bucket.count = values.length;
925
1000
  break;
926
1001
  case 'sum':
927
1002
  bucket.sum = numericValues(values).reduce((sum, value) => sum + value, 0);
928
1003
  break;
929
- case 'average': {
1004
+ case 'avg': {
930
1005
  const numbers = numericValues(values);
931
- bucket.average = numbers.length ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length : null;
1006
+ const average = numbers.length ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length : null;
1007
+ bucket.avg = average;
1008
+ bucket.average = average;
932
1009
  break;
933
1010
  }
934
1011
  case 'min':
@@ -1043,6 +1120,80 @@ function applyPage(rows, state) {
1043
1120
  : Math.max(0, (Math.max(1, Math.trunc(Number(state.page) || 1)) - 1) * pageSize);
1044
1121
  return rows.slice(skip, skip + pageSize);
1045
1122
  }
1123
+ function groupRows(rows, descriptors, level) {
1124
+ const descriptor = descriptors[level];
1125
+ if (!descriptor)
1126
+ return [];
1127
+ const buckets = new Map();
1128
+ for (const row of rows) {
1129
+ const value = row?.[descriptor.field];
1130
+ const key = groupValueKey(value);
1131
+ const bucket = buckets.get(key);
1132
+ if (bucket) {
1133
+ bucket.rows.push(row);
1134
+ }
1135
+ else {
1136
+ buckets.set(key, { value, rows: [row] });
1137
+ }
1138
+ }
1139
+ const groups = Array.from(buckets.values()).sort((left, right) => {
1140
+ const result = compareValues(left.value, right.value);
1141
+ return descriptor.dir === 'desc' ? -result : result;
1142
+ });
1143
+ return groups.map((bucket) => {
1144
+ const childGroups = groupRows(bucket.rows, descriptors, level + 1);
1145
+ return {
1146
+ field: descriptor.field,
1147
+ value: bucket.value,
1148
+ dir: descriptor.dir,
1149
+ level,
1150
+ count: bucket.rows.length,
1151
+ ...(descriptor.aggregates?.length ? { aggregates: ngbCalculateDataGridAggregates(bucket.rows, descriptor.aggregates) } : {}),
1152
+ items: childGroups.length ? childGroups : bucket.rows,
1153
+ };
1154
+ });
1155
+ }
1156
+ function normalizeGroupDescriptors(descriptors) {
1157
+ const seen = new Set();
1158
+ const normalized = [];
1159
+ for (const descriptor of descriptors ?? []) {
1160
+ const field = String(descriptor?.field ?? '').trim();
1161
+ if (!field || seen.has(field))
1162
+ continue;
1163
+ seen.add(field);
1164
+ normalized.push({
1165
+ field,
1166
+ dir: descriptor.dir === 'desc' ? 'desc' : 'asc',
1167
+ aggregates: [...(descriptor.aggregates ?? [])],
1168
+ });
1169
+ }
1170
+ return normalized;
1171
+ }
1172
+ function normalizeAggregate(aggregate) {
1173
+ return aggregate === 'average' ? 'avg' : aggregate;
1174
+ }
1175
+ function cloneGroupResults(groups) {
1176
+ return groups.map((group) => ({
1177
+ ...group,
1178
+ ...(group.aggregates ? { aggregates: cloneAggregateResults(group.aggregates) } : {}),
1179
+ items: group.items.map((item) => (isGroupResult(item) ? cloneGroupResults([item])[0] : item)),
1180
+ }));
1181
+ }
1182
+ function cloneAggregateResults(results) {
1183
+ const cloned = {};
1184
+ for (const field of Object.keys(results ?? {})) {
1185
+ cloned[field] = { ...results[field] };
1186
+ }
1187
+ return cloned;
1188
+ }
1189
+ function isGroupResult(item) {
1190
+ return typeof item === 'object' && item !== null && Array.isArray(item.items);
1191
+ }
1192
+ function groupValueKey(value) {
1193
+ if (value instanceof Date)
1194
+ return `date:${value.toISOString()}`;
1195
+ return `${typeof value}:${String(value)}`;
1196
+ }
1046
1197
  function resolveFilterType(column, raw, value) {
1047
1198
  if (column?.filterType)
1048
1199
  return column.filterType;
@@ -1148,16 +1299,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1148
1299
  args: [{ providedIn: 'root' }]
1149
1300
  }] });
1150
1301
 
1302
+ const hasStructuredClone = (value) => typeof value.structuredClone === 'function';
1151
1303
  const clone = (value) => {
1152
1304
  try {
1153
- // Prefer structuredClone when available.
1154
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
1155
- return globalThis.structuredClone ? globalThis.structuredClone(value) : JSON.parse(JSON.stringify(value));
1305
+ if (hasStructuredClone(globalThis)) {
1306
+ return globalThis.structuredClone(value);
1307
+ }
1308
+ return JSON.parse(JSON.stringify(value));
1156
1309
  }
1157
1310
  catch {
1158
1311
  return value;
1159
1312
  }
1160
1313
  };
1314
+ const asRecordLike = (value) => typeof value === 'object' && value !== null ? value : null;
1161
1315
  const shallowEqual = (a, b) => {
1162
1316
  if (a === b)
1163
1317
  return true;
@@ -1214,9 +1368,9 @@ class NgbDatagridDefaultEditService {
1214
1368
  const baseline = this.originals().find((it) => Object.is(it.id, rowId))?.row;
1215
1369
  if (!baseline)
1216
1370
  return false;
1217
- return !shallowEqual(baseline, currentRow);
1371
+ return !shallowEqual(asRecordLike(baseline), asRecordLike(currentRow));
1218
1372
  }
1219
- saveChanges(data, _rowIndex, rowId, currentRow) {
1373
+ saveChanges(data, _rowIndex, rowId, _currentRow) {
1220
1374
  this.newRows.update((ids) => ids.filter((id) => !Object.is(id, rowId)));
1221
1375
  // Once saved, clear baseline tracking (no longer "dirty").
1222
1376
  this.originals.update((items) => items.filter((it) => !Object.is(it.id, rowId)));
@@ -1249,13 +1403,104 @@ class NgbDatagridDefaultEditService {
1249
1403
  }
1250
1404
  }
1251
1405
 
1406
+ const PAGE_SIZES = {
1407
+ A4: [595.28, 841.89],
1408
+ Letter: [612, 792],
1409
+ };
1252
1410
  class JsPdfAdapter {
1253
- async export({ fileName, columns, rows, options }) {
1254
- const { jsPDF } = await import('jspdf/dist/jspdf.umd.min.js');
1255
- const autoTable = (await import('jspdf-autotable')).default;
1256
- const doc = new jsPDF({ orientation: options?.landscape ? 'landscape' : 'portrait' });
1257
- autoTable(doc, { head: [columns], body: rows.map(r => columns.map(k => r[k])), margin: options?.margins });
1258
- doc.save(`${fileName}.pdf`);
1411
+ async export(payload) {
1412
+ const pdf = this.createPdf(payload);
1413
+ const blob = new Blob([pdf], { type: 'application/pdf' });
1414
+ const url = URL.createObjectURL(blob);
1415
+ const link = document.createElement('a');
1416
+ link.href = url;
1417
+ link.download = `${payload.fileName}.pdf`;
1418
+ link.click();
1419
+ URL.revokeObjectURL(url);
1420
+ }
1421
+ createPdf({ fileName, columns, rows, options }) {
1422
+ const requestedSize = String(options?.pageSize || 'A4');
1423
+ const baseSize = PAGE_SIZES[requestedSize] || PAGE_SIZES.A4;
1424
+ const landscape = Boolean(options?.landscape);
1425
+ const [pageWidth, pageHeight] = landscape ? [baseSize[1], baseSize[0]] : baseSize;
1426
+ const margin = this.resolveMargin(options?.margins);
1427
+ const lineHeight = 14;
1428
+ const maxLines = Math.max(1, Math.floor((pageHeight - margin.top - margin.bottom - 52) / lineHeight));
1429
+ const tableLines = this.toTableLines(columns, rows);
1430
+ const pages = this.chunk(tableLines, maxLines);
1431
+ const objects = [];
1432
+ const pageIds = [];
1433
+ objects.push('<< /Type /Catalog /Pages 2 0 R >>');
1434
+ objects.push('');
1435
+ for (const [index, lines] of pages.entries()) {
1436
+ const pageObjectId = objects.length + 1;
1437
+ const contentObjectId = pageObjectId + 1;
1438
+ pageIds.push(pageObjectId);
1439
+ objects.push(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${pageWidth} ${pageHeight}] /Resources << /Font << /F1 ${pages.length * 2 + 3} 0 R >> >> /Contents ${contentObjectId} 0 R >>`);
1440
+ objects.push(this.contentStream(fileName, lines, index + 1, pages.length, pageHeight, margin, lineHeight));
1441
+ }
1442
+ objects[1] = `<< /Type /Pages /Kids [${pageIds.map(id => `${id} 0 R`).join(' ')}] /Count ${pageIds.length} >>`;
1443
+ objects.push('<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>');
1444
+ return this.serializePdf(objects);
1445
+ }
1446
+ resolveMargin(margins) {
1447
+ if (!Array.isArray(margins) || margins.length !== 4) {
1448
+ return { top: 40, right: 40, bottom: 40, left: 40 };
1449
+ }
1450
+ const [top, right, bottom, left] = margins.map(value => Math.max(16, Number(value) || 40));
1451
+ return { top, right, bottom, left };
1452
+ }
1453
+ toTableLines(columns, rows) {
1454
+ const headers = columns.map(column => this.printable(column));
1455
+ const body = rows.map(row => columns.map(column => this.printable(row?.[column])));
1456
+ const widths = headers.map((header, index) => Math.min(24, Math.max(header.length, ...body.map(values => values[index]?.length || 0))));
1457
+ const format = (values) => values.map((value, index) => value.padEnd(widths[index]).slice(0, widths[index])).join(' ');
1458
+ return [
1459
+ format(headers),
1460
+ widths.map(width => '-'.repeat(width)).join(' '),
1461
+ ...body.map(format),
1462
+ ];
1463
+ }
1464
+ contentStream(fileName, lines, page, totalPages, pageHeight, margin, lineHeight) {
1465
+ const commands = [
1466
+ 'BT',
1467
+ `/F1 16 Tf ${margin.left} ${pageHeight - margin.top} Td (${this.pdfText(fileName)}) Tj`,
1468
+ `/F1 9 Tf 0 -24 Td (${this.pdfText(`Page ${page} of ${totalPages}`)}) Tj`,
1469
+ ...lines.map(line => `0 -${lineHeight} Td (${this.pdfText(line)}) Tj`),
1470
+ 'ET',
1471
+ ].join('\n');
1472
+ return `<< /Length ${commands.length} >>\nstream\n${commands}\nendstream`;
1473
+ }
1474
+ chunk(items, size) {
1475
+ const pages = [];
1476
+ for (let index = 0; index < items.length; index += size) {
1477
+ pages.push(items.slice(index, index + size));
1478
+ }
1479
+ return pages.length ? pages : [[]];
1480
+ }
1481
+ printable(value) {
1482
+ if (value === null || value === undefined) {
1483
+ return '';
1484
+ }
1485
+ return String(value).replace(/[^\x20-\x7E]/g, '?').replace(/\s+/g, ' ').trim();
1486
+ }
1487
+ pdfText(value) {
1488
+ return value.replace(/\\/g, '\\\\').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
1489
+ }
1490
+ serializePdf(objects) {
1491
+ let pdf = '%PDF-1.4\n';
1492
+ const offsets = [0];
1493
+ for (const [index, object] of objects.entries()) {
1494
+ offsets[index + 1] = pdf.length;
1495
+ pdf += `${index + 1} 0 obj\n${object}\nendobj\n`;
1496
+ }
1497
+ const xrefOffset = pdf.length;
1498
+ pdf += `xref\n0 ${objects.length + 1}\n0000000000 65535 f \n`;
1499
+ for (let index = 1; index <= objects.length; index++) {
1500
+ pdf += `${String(offsets[index]).padStart(10, '0')} 00000 n \n`;
1501
+ }
1502
+ pdf += `trailer\n<< /Size ${objects.length + 1} /Root 1 0 R >>\nstartxref\n${xrefOffset}\n%%EOF`;
1503
+ return pdf;
1259
1504
  }
1260
1505
  }
1261
1506
 
@@ -1321,7 +1566,6 @@ class BrowserExcelExportAdapter {
1321
1566
  }
1322
1567
  }
1323
1568
 
1324
- // eslint-disable-next-line @angular-eslint/directive-selector
1325
1569
  class ExportButtonDirective {
1326
1570
  // Expose the TemplateRef so the grid can render it with a context
1327
1571
  templateRef = inject(TemplateRef);
@@ -1693,7 +1937,7 @@ class NgbDatagridAddRowComponent {
1693
1937
  </div>
1694
1938
  </td>
1695
1939
  }
1696
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }] });
1940
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1697
1941
  }
1698
1942
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridAddRowComponent, decorators: [{
1699
1943
  type: Component,
@@ -1702,6 +1946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1702
1946
  standalone: true,
1703
1947
  imports: [CommonModule, FormsModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
1704
1948
  viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
1949
+ changeDetection: ChangeDetectionStrategy.OnPush,
1705
1950
  template: `
1706
1951
  @if (grid.showSelectionColumn()) {
1707
1952
  <td
@@ -1916,6 +2161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1916
2161
 
1917
2162
  class NgbDatagridDataRowComponent {
1918
2163
  grid;
2164
+ renderTick = 0;
1919
2165
  row;
1920
2166
  index;
1921
2167
  selected = false;
@@ -1923,7 +2169,7 @@ class NgbDatagridDataRowComponent {
1923
2169
  return row[col.field];
1924
2170
  }
1925
2171
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1926
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridDataRowComponent, isStandalone: true, selector: "tr[ngbDatagridDataRow]", inputs: { grid: "grid", row: "row", index: "index", selected: "selected" }, ngImport: i0, template: `
2172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridDataRowComponent, isStandalone: true, selector: "tr[ngbDatagridDataRow]", inputs: { grid: "grid", renderTick: "renderTick", row: "row", index: "index", selected: "selected" }, ngImport: i0, template: `
1927
2173
  @if (grid.showSelectionColumn()) {
1928
2174
  <td
1929
2175
  class="text-center align-middle"
@@ -2009,6 +2255,7 @@ class NgbDatagridDataRowComponent {
2009
2255
  [class.grid-cell--incell]="grid.isIncellEditMode()"
2010
2256
  [ngClass]="grid.resolveCellClass(row, index, col)"
2011
2257
  [ngStyle]="grid.resolveCellStyle(row, index, col)"
2258
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2012
2259
  (click)="grid.onCellClick($event, index, col)"
2013
2260
  >
2014
2261
  <div class="ngb-stacked-card__label">{{ col.header }}</div>
@@ -2052,6 +2299,7 @@ class NgbDatagridDataRowComponent {
2052
2299
  [style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
2053
2300
  (focus)="grid.onDataCellFocus(index, ci)"
2054
2301
  (keydown)="grid.onDataCellKeydown($event, index, ci, col)"
2302
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2055
2303
  (click)="grid.onCellClick($event, index, col)"
2056
2304
  >
2057
2305
  <ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
@@ -2185,7 +2433,7 @@ class NgbDatagridDataRowComponent {
2185
2433
  @default {
2186
2434
  <span class="grid-cell-text">
2187
2435
  @if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
2188
- @for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track $index) {
2436
+ @for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track part.key) {
2189
2437
  @if (part.match) {
2190
2438
  <mark class="grid-search-highlight">{{ part.text }}</mark>
2191
2439
  } @else {
@@ -2265,7 +2513,7 @@ class NgbDatagridDataRowComponent {
2265
2513
  </div>
2266
2514
  }
2267
2515
  </ng-template>
2268
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }] });
2516
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2269
2517
  }
2270
2518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, decorators: [{
2271
2519
  type: Component,
@@ -2274,6 +2522,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2274
2522
  standalone: true,
2275
2523
  imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
2276
2524
  viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
2525
+ changeDetection: ChangeDetectionStrategy.OnPush,
2277
2526
  template: `
2278
2527
  @if (grid.showSelectionColumn()) {
2279
2528
  <td
@@ -2360,6 +2609,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2360
2609
  [class.grid-cell--incell]="grid.isIncellEditMode()"
2361
2610
  [ngClass]="grid.resolveCellClass(row, index, col)"
2362
2611
  [ngStyle]="grid.resolveCellStyle(row, index, col)"
2612
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2363
2613
  (click)="grid.onCellClick($event, index, col)"
2364
2614
  >
2365
2615
  <div class="ngb-stacked-card__label">{{ col.header }}</div>
@@ -2403,6 +2653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2403
2653
  [style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
2404
2654
  (focus)="grid.onDataCellFocus(index, ci)"
2405
2655
  (keydown)="grid.onDataCellKeydown($event, index, ci, col)"
2656
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2406
2657
  (click)="grid.onCellClick($event, index, col)"
2407
2658
  >
2408
2659
  <ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
@@ -2536,7 +2787,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2536
2787
  @default {
2537
2788
  <span class="grid-cell-text">
2538
2789
  @if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
2539
- @for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track $index) {
2790
+ @for (part of grid.getSearchHighlightSegments(valueFor(row, col), col.field); track part.key) {
2540
2791
  @if (part.match) {
2541
2792
  <mark class="grid-search-highlight">{{ part.text }}</mark>
2542
2793
  } @else {
@@ -2621,6 +2872,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2621
2872
  }], propDecorators: { grid: [{
2622
2873
  type: Input,
2623
2874
  args: [{ required: true }]
2875
+ }], renderTick: [{
2876
+ type: Input
2624
2877
  }], row: [{
2625
2878
  type: Input,
2626
2879
  args: [{ required: true }]
@@ -2640,7 +2893,7 @@ class NgbDatagridDetailRowComponent {
2640
2893
  <td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
2641
2894
  <div class="grid-detail-row__content">
2642
2895
  <ng-container
2643
- [ngTemplateOutlet]="grid.rowDetailTpl.template"
2896
+ [ngTemplateOutlet]="grid.rowDetailTpl!.template"
2644
2897
  [ngTemplateOutletContext]="{ $implicit: row, index: index }"
2645
2898
  >
2646
2899
  </ng-container>
@@ -2658,7 +2911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2658
2911
  <td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
2659
2912
  <div class="grid-detail-row__content">
2660
2913
  <ng-container
2661
- [ngTemplateOutlet]="grid.rowDetailTpl.template"
2914
+ [ngTemplateOutlet]="grid.rowDetailTpl!.template"
2662
2915
  [ngTemplateOutletContext]="{ $implicit: row, index: index }"
2663
2916
  >
2664
2917
  </ng-container>
@@ -2678,42 +2931,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2678
2931
  }] } });
2679
2932
 
2680
2933
  class NgbDatagridFooterComponent {
2681
- grid;
2682
- placement = 'bottom';
2934
+ grid = input.required(/* @ts-ignore */
2935
+ ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
2936
+ placement = input('bottom', /* @ts-ignore */
2937
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
2938
+ isTop = computed(() => this.placement() === 'top', /* @ts-ignore */
2939
+ ...(ngDevMode ? [{ debugName: "isTop" }] : /* istanbul ignore next */ []));
2940
+ isBottom = computed(() => this.placement() === 'bottom', /* @ts-ignore */
2941
+ ...(ngDevMode ? [{ debugName: "isBottom" }] : /* istanbul ignore next */ []));
2683
2942
  get pagerSettings() {
2684
- return ngbDatagridPagerSettings(this.grid.resolvedPageable());
2943
+ return ngbDatagridPagerSettings(this.grid().resolvedPageable());
2685
2944
  }
2686
2945
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2687
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFooterComponent, isStandalone: true, selector: "ngb-datagrid-footer", inputs: { grid: "grid", placement: "placement" }, ngImport: i0, template: `
2688
- @if (grid.paginationActive && grid.pagerShowsAt(placement)) {
2689
- @if (grid.hasCustomPagerTemplate()) {
2946
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFooterComponent, isStandalone: true, selector: "ngb-datagrid-footer", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: true, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
2947
+ @if (grid().paginationActive && grid().pagerShowsAt(placement())) {
2948
+ @if (grid().hasCustomPagerTemplate()) {
2690
2949
  <div
2691
2950
  class="grid-footer grid-footer--custom"
2692
- [class.grid-footer--top]="placement === 'top'"
2693
- [class.grid-footer--bottom]="placement === 'bottom'"
2694
- [class.sticky-footer]="grid.isFooterSticky && placement === 'bottom'"
2951
+ [class.grid-footer--top]="isTop()"
2952
+ [class.grid-footer--bottom]="isBottom()"
2953
+ [class.sticky-footer]="grid().isFooterSticky && isBottom()"
2695
2954
  >
2696
2955
  <ng-container
2697
- *ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
2956
+ *ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
2698
2957
  ></ng-container>
2699
2958
  </div>
2700
2959
  } @else {
2701
2960
  <div
2702
2961
  class="grid-footer"
2703
- [class.grid-footer--top]="placement === 'top'"
2704
- [class.grid-footer--bottom]="placement === 'bottom'"
2705
- [class.sticky-footer]="grid.isFooterSticky && placement === 'bottom'"
2962
+ [class.grid-footer--top]="isTop()"
2963
+ [class.grid-footer--bottom]="isBottom()"
2964
+ [class.sticky-footer]="grid().isFooterSticky && isBottom()"
2706
2965
  >
2707
2966
  <ngb-pager
2708
- [page]="grid.page"
2709
- [pageSize]="grid.pageSize"
2710
- [collectionSize]="grid.pagerCollectionSize()"
2967
+ [page]="grid().page"
2968
+ [pageSize]="grid().pageSize"
2969
+ [collectionSize]="grid().pagerCollectionSize()"
2711
2970
  [settings]="pagerSettings"
2712
- [infoLabel]="grid.paginationRangeLabel()"
2713
- [rowsPerPageLabel]="grid.rowsPerPageLabel()"
2714
- [responsive]="grid.pagerResponsive()"
2715
- (pageChange)="grid.onPage($event)"
2716
- (pageSizeChange)="grid.onPageSize($event)"
2971
+ [infoLabel]="grid().paginationRangeLabel()"
2972
+ [rowsPerPageLabel]="grid().rowsPerPageLabel()"
2973
+ [responsive]="grid().pagerResponsive()"
2974
+ (pageChange)="grid().onPage($event)"
2975
+ (pageSizeChange)="grid().onPageSize($event)"
2717
2976
  />
2718
2977
  </div>
2719
2978
  }
@@ -2727,47 +2986,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2727
2986
  standalone: true,
2728
2987
  imports: [CommonModule, NgbPagerComponent],
2729
2988
  template: `
2730
- @if (grid.paginationActive && grid.pagerShowsAt(placement)) {
2731
- @if (grid.hasCustomPagerTemplate()) {
2989
+ @if (grid().paginationActive && grid().pagerShowsAt(placement())) {
2990
+ @if (grid().hasCustomPagerTemplate()) {
2732
2991
  <div
2733
2992
  class="grid-footer grid-footer--custom"
2734
- [class.grid-footer--top]="placement === 'top'"
2735
- [class.grid-footer--bottom]="placement === 'bottom'"
2736
- [class.sticky-footer]="grid.isFooterSticky && placement === 'bottom'"
2993
+ [class.grid-footer--top]="isTop()"
2994
+ [class.grid-footer--bottom]="isBottom()"
2995
+ [class.sticky-footer]="grid().isFooterSticky && isBottom()"
2737
2996
  >
2738
2997
  <ng-container
2739
- *ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
2998
+ *ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
2740
2999
  ></ng-container>
2741
3000
  </div>
2742
3001
  } @else {
2743
3002
  <div
2744
3003
  class="grid-footer"
2745
- [class.grid-footer--top]="placement === 'top'"
2746
- [class.grid-footer--bottom]="placement === 'bottom'"
2747
- [class.sticky-footer]="grid.isFooterSticky && placement === 'bottom'"
3004
+ [class.grid-footer--top]="isTop()"
3005
+ [class.grid-footer--bottom]="isBottom()"
3006
+ [class.sticky-footer]="grid().isFooterSticky && isBottom()"
2748
3007
  >
2749
3008
  <ngb-pager
2750
- [page]="grid.page"
2751
- [pageSize]="grid.pageSize"
2752
- [collectionSize]="grid.pagerCollectionSize()"
3009
+ [page]="grid().page"
3010
+ [pageSize]="grid().pageSize"
3011
+ [collectionSize]="grid().pagerCollectionSize()"
2753
3012
  [settings]="pagerSettings"
2754
- [infoLabel]="grid.paginationRangeLabel()"
2755
- [rowsPerPageLabel]="grid.rowsPerPageLabel()"
2756
- [responsive]="grid.pagerResponsive()"
2757
- (pageChange)="grid.onPage($event)"
2758
- (pageSizeChange)="grid.onPageSize($event)"
3013
+ [infoLabel]="grid().paginationRangeLabel()"
3014
+ [rowsPerPageLabel]="grid().rowsPerPageLabel()"
3015
+ [responsive]="grid().pagerResponsive()"
3016
+ (pageChange)="grid().onPage($event)"
3017
+ (pageSizeChange)="grid().onPageSize($event)"
2759
3018
  />
2760
3019
  </div>
2761
3020
  }
2762
3021
  }
2763
3022
  `,
2764
3023
  }]
2765
- }], propDecorators: { grid: [{
2766
- type: Input,
2767
- args: [{ required: true }]
2768
- }], placement: [{
2769
- type: Input
2770
- }] } });
3024
+ }], propDecorators: { grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
2771
3025
 
2772
3026
  class NgbDatagridFieldShellComponent {
2773
3027
  icon;
@@ -2802,8 +3056,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2802
3056
 
2803
3057
  class NgbDatagridHeaderComponent {
2804
3058
  grid;
3059
+ renderTick = 0;
2805
3060
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2806
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridHeaderComponent, isStandalone: true, selector: "thead[ngbDatagridHeader]", inputs: { grid: "grid" }, ngImport: i0, template: `
3061
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridHeaderComponent, isStandalone: true, selector: "thead[ngbDatagridHeader]", inputs: { grid: "grid", renderTick: "renderTick" }, ngImport: i0, template: `
2807
3062
  <tr>
2808
3063
  @if (grid.showSelectionColumn()) {
2809
3064
  <th
@@ -2870,6 +3125,20 @@ class NgbDatagridHeaderComponent {
2870
3125
  [attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
2871
3126
  >
2872
3127
  <div class="grid-header__cell">
3128
+ @if (grid.isColumnGroupable(col)) {
3129
+ <span
3130
+ class="grid-column-group-handle bi bi-diagram-3"
3131
+ [class.grid-column-group-handle--active]="grid.isFieldGrouped(col.field)"
3132
+ draggable="true"
3133
+ role="button"
3134
+ tabindex="0"
3135
+ [attr.aria-label]="grid.groupHandleAriaLabel(col)"
3136
+ (dragstart)="grid.onGroupHandleDragStart($event, col.field); $event.stopPropagation()"
3137
+ (dragend)="grid.onGroupHandleDragEnd()"
3138
+ (keydown.enter)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
3139
+ (keydown.space)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
3140
+ ></span>
3141
+ }
2873
3142
  @if (grid.isColumnReorderable(col)) {
2874
3143
  <span
2875
3144
  class="grid-column-reorder-handle bi bi-grip-vertical"
@@ -3066,7 +3335,7 @@ class NgbDatagridHeaderComponent {
3066
3335
  @if (grid.showActionsColumn()) { <th></th> }
3067
3336
  </tr>
3068
3337
  }
3069
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }] });
3338
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3070
3339
  }
3071
3340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, decorators: [{
3072
3341
  type: Component,
@@ -3081,6 +3350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3081
3350
  NgbDatagridControlDirective,
3082
3351
  NgbDatagridFieldShellComponent,
3083
3352
  ],
3353
+ changeDetection: ChangeDetectionStrategy.OnPush,
3084
3354
  template: `
3085
3355
  <tr>
3086
3356
  @if (grid.showSelectionColumn()) {
@@ -3148,6 +3418,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3148
3418
  [attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
3149
3419
  >
3150
3420
  <div class="grid-header__cell">
3421
+ @if (grid.isColumnGroupable(col)) {
3422
+ <span
3423
+ class="grid-column-group-handle bi bi-diagram-3"
3424
+ [class.grid-column-group-handle--active]="grid.isFieldGrouped(col.field)"
3425
+ draggable="true"
3426
+ role="button"
3427
+ tabindex="0"
3428
+ [attr.aria-label]="grid.groupHandleAriaLabel(col)"
3429
+ (dragstart)="grid.onGroupHandleDragStart($event, col.field); $event.stopPropagation()"
3430
+ (dragend)="grid.onGroupHandleDragEnd()"
3431
+ (keydown.enter)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
3432
+ (keydown.space)="grid.toggleGroupField(col.field); $event.preventDefault(); $event.stopPropagation()"
3433
+ ></span>
3434
+ }
3151
3435
  @if (grid.isColumnReorderable(col)) {
3152
3436
  <span
3153
3437
  class="grid-column-reorder-handle bi bi-grip-vertical"
@@ -3349,6 +3633,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3349
3633
  }], propDecorators: { grid: [{
3350
3634
  type: Input,
3351
3635
  args: [{ required: true }]
3636
+ }], renderTick: [{
3637
+ type: Input
3352
3638
  }] } });
3353
3639
 
3354
3640
  class NgbDatagridSurfaceCardComponent {
@@ -3870,7 +4156,7 @@ class NgbDatagridFilterMenuPanelComponent {
3870
4156
  }
3871
4157
  </ngb-datagrid-surface-card>
3872
4158
  </div>
3873
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }, { kind: "component", type: NgbDatagridSurfaceCardComponent, selector: "ngb-datagrid-surface-card" }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }] });
4159
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }, { kind: "component", type: NgbDatagridSurfaceCardComponent, selector: "ngb-datagrid-surface-card" }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3874
4160
  }
3875
4161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, decorators: [{
3876
4162
  type: Component,
@@ -3886,6 +4172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3886
4172
  NgbDatagridSurfaceCardComponent,
3887
4173
  NgbDatagridFloatingPanelDirective,
3888
4174
  ],
4175
+ changeDetection: ChangeDetectionStrategy.OnPush,
3889
4176
  template: `
3890
4177
  <div
3891
4178
  class="grid-filter-menu-popover ngb-grid__filter-menu-overlay"
@@ -4120,7 +4407,7 @@ class NgbDatagridRowFilterOperatorPanelComponent {
4120
4407
  </button>
4121
4408
  }
4122
4409
  </div>
4123
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }] });
4410
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridFloatingPanelDirective, selector: "[ngbDatagridFloatingPanel]", inputs: ["ngbDatagridFloatingPanelAnchor", "ngbDatagridFloatingPanelPlacement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4124
4411
  }
4125
4412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, decorators: [{
4126
4413
  type: Component,
@@ -4128,6 +4415,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
4128
4415
  selector: 'ngb-datagrid-row-filter-operator-panel',
4129
4416
  standalone: true,
4130
4417
  imports: [CommonModule, NgbDatagridFloatingPanelDirective],
4418
+ changeDetection: ChangeDetectionStrategy.OnPush,
4131
4419
  template: `
4132
4420
  <div
4133
4421
  class="dropdown-menu show ngb-datagrid-floating-panel grid-filter-operator-menu"
@@ -4436,7 +4724,7 @@ class NgbDatagridEditingToolbarComponent {
4436
4724
  </div>
4437
4725
  </div>
4438
4726
  }
4439
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }] });
4727
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4440
4728
  }
4441
4729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridEditingToolbarComponent, decorators: [{
4442
4730
  type: Component,
@@ -4444,6 +4732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
4444
4732
  selector: 'ngb-datagrid-editing-toolbar',
4445
4733
  standalone: true,
4446
4734
  imports: [CommonModule, NgbDatagridButtonDirective],
4735
+ changeDetection: ChangeDetectionStrategy.OnPush,
4447
4736
  template: `
4448
4737
  @if (grid.showEditingToolbar()) {
4449
4738
  <div class="datagrid-editing-toolbar">
@@ -4593,7 +4882,7 @@ class NgbDatagridExternalEditorComponent {
4593
4882
  </div>
4594
4883
  </div>
4595
4884
  }
4596
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }] });
4885
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4597
4886
  }
4598
4887
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridExternalEditorComponent, decorators: [{
4599
4888
  type: Component,
@@ -4601,6 +4890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
4601
4890
  selector: 'ngb-datagrid-external-editor',
4602
4891
  standalone: true,
4603
4892
  imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
4893
+ changeDetection: ChangeDetectionStrategy.OnPush,
4604
4894
  template: `
4605
4895
  @if (grid.externalEditOpen) {
4606
4896
  <div
@@ -4739,6 +5029,7 @@ const defaultDndI18n = {
4739
5029
  listLabel: (n) => n ?? 'List',
4740
5030
  pickedUp: () => 'Picked up. Use Arrow keys to move, Enter to drop, Escape to cancel.',
4741
5031
  dropped: () => 'Dropped.',
5032
+ canceled: () => 'Canceled.',
4742
5033
  moveToIndex: (i, t) => `Moved to position ${i} of ${t}.`,
4743
5034
  dropHere: () => 'Drop here',
4744
5035
  cannotDropHere: () => 'Cannot drop here'
@@ -5187,18 +5478,29 @@ class NgbDndListDirective {
5187
5478
  this.canDrop = false;
5188
5479
  return;
5189
5480
  }
5190
- ev.preventDefault();
5191
- ev.stopPropagation();
5192
- this.state.setActiveDropList(this);
5193
5481
  this.hover = true;
5194
- this.canDrop = true;
5482
+ const idx = this.indexFromPointer(ev);
5483
+ const payload = this._buildGuardPayload(s, idx);
5484
+ const canDropHere = this._allowDrop(payload)
5485
+ && !this.isDroppingIntoOwnDescendant(s.item, this.list);
5486
+ this.canDrop = canDropHere;
5487
+ this._denied = !canDropHere;
5195
5488
  try {
5196
- if (ev.dataTransfer)
5197
- ev.dataTransfer.dropEffect = this.dndCloneOnDrop ? 'copy' : 'move';
5489
+ if (ev.dataTransfer) {
5490
+ ev.dataTransfer.dropEffect = canDropHere ? (this.dndCloneOnDrop ? 'copy' : 'move') : 'none';
5491
+ }
5198
5492
  }
5199
5493
  catch { }
5494
+ if (!canDropHere) {
5495
+ this.removePlaceholder();
5496
+ this.lastIndex = -1;
5497
+ this.state.clearActiveDropList(this);
5498
+ return;
5499
+ }
5500
+ ev.preventDefault();
5501
+ ev.stopPropagation();
5502
+ this.state.setActiveDropList(this);
5200
5503
  this.ensurePlaceholder();
5201
- const idx = this.indexFromPointer(ev);
5202
5504
  if (idx !== this.lastIndex) {
5203
5505
  this.lastIndex = idx;
5204
5506
  this.positionPlaceholderAt(idx);
@@ -5234,10 +5536,10 @@ class NgbDndListDirective {
5234
5536
  return;
5235
5537
  }
5236
5538
  }
5237
- const anyEv = ev;
5238
- if (anyEv.__ngbHandled)
5539
+ const handledEvent = ev;
5540
+ if (handledEvent.__ngbHandled)
5239
5541
  return;
5240
- anyEv.__ngbHandled = true;
5542
+ handledEvent.__ngbHandled = true;
5241
5543
  ev.preventDefault();
5242
5544
  this.performDrop(ev);
5243
5545
  this.resetVisualState();
@@ -5253,10 +5555,10 @@ class NgbDndListDirective {
5253
5555
  this.resetVisualState();
5254
5556
  return;
5255
5557
  }
5256
- const anyEv = ev;
5257
- if (anyEv.__ngbHandled)
5558
+ const handledEvent = ev;
5559
+ if (handledEvent.__ngbHandled)
5258
5560
  return;
5259
- anyEv.__ngbHandled = true;
5561
+ handledEvent.__ngbHandled = true;
5260
5562
  ev.preventDefault();
5261
5563
  ev.stopPropagation();
5262
5564
  this.performDrop(ev);
@@ -5359,17 +5661,20 @@ class NgbDndListDirective {
5359
5661
  }
5360
5662
  isDroppingIntoOwnDescendant(item, targetList) {
5361
5663
  const key = this.dndChildrenKey;
5362
- if (!key || !item)
5664
+ if (!key || !item || typeof item !== 'object')
5363
5665
  return false;
5364
5666
  const stack = [];
5365
- if (Array.isArray(item[key]))
5366
- stack.push(item[key]);
5667
+ const rootChildren = item[key];
5668
+ if (Array.isArray(rootChildren))
5669
+ stack.push(rootChildren);
5367
5670
  while (stack.length) {
5368
5671
  const arr = stack.pop();
5369
5672
  if (arr === targetList)
5370
5673
  return true;
5371
5674
  for (const child of arr) {
5372
- const kids = child?.[key];
5675
+ if (!child || typeof child !== 'object')
5676
+ continue;
5677
+ const kids = child[key];
5373
5678
  if (Array.isArray(kids))
5374
5679
  stack.push(kids);
5375
5680
  }
@@ -5383,7 +5688,7 @@ class NgbDndListDirective {
5383
5688
  _buildGuardPayload(session, dstIndex) {
5384
5689
  const srcList = session.fromList ?? [];
5385
5690
  const srcIndex = typeof session.fromIndex === 'number' ? session.fromIndex : -1;
5386
- const dstList = this.list;
5691
+ const dstList = this.list ?? [];
5387
5692
  return {
5388
5693
  dragItem: session.item,
5389
5694
  srcList,
@@ -5398,11 +5703,7 @@ class NgbDndListDirective {
5398
5703
  * Uses vertical list heuristics; adjust for horizontal if your list is horizontal.
5399
5704
  */
5400
5705
  _computeDropIndex(ev) {
5401
- const host = this._host?.nativeElement
5402
- ?? this._el?.nativeElement
5403
- ?? this.el?.nativeElement
5404
- ?? this.elementRef?.nativeElement
5405
- ?? null;
5706
+ const host = this.el.nativeElement;
5406
5707
  if (!host)
5407
5708
  return this.list?.length ?? 0;
5408
5709
  const children = this.draggableChildren();
@@ -5427,6 +5728,10 @@ class NgbDndListDirective {
5427
5728
  return false;
5428
5729
  }
5429
5730
  }
5731
+ emitDropEvent(event) {
5732
+ this.dndDropped.emit(event);
5733
+ this.state.announce?.(this.state.i18n.dropped());
5734
+ }
5430
5735
  // Extract your existing onDrop logic into a single method:
5431
5736
  performDrop(ev) {
5432
5737
  const session = this.getSession(ev);
@@ -5439,19 +5744,25 @@ class NgbDndListDirective {
5439
5744
  ev.preventDefault();
5440
5745
  ev.stopPropagation();
5441
5746
  this._denied = true; // cosmetic: adds .ngb-dnd-denied for styling
5747
+ this.canDrop = false;
5748
+ this.state.announce?.(this.state.i18n.cannotDropHere());
5749
+ this.removePlaceholder();
5750
+ this.lastIndex = -1;
5442
5751
  return; // ⛔ do not mutate arrays
5443
5752
  }
5444
5753
  this._denied = false;
5445
5754
  // ❗ block cycles: don't allow dropping an item into its own descendants
5446
5755
  if (this.isDroppingIntoOwnDescendant(session.item, this.list)) {
5447
5756
  // optional: visual/aural feedback
5757
+ this._denied = true;
5758
+ this.canDrop = false;
5448
5759
  this.state.announce?.(this.state.i18n.cannotDropHere());
5449
5760
  this.removePlaceholder();
5450
5761
  this.lastIndex = -1;
5451
5762
  return;
5452
5763
  }
5453
5764
  const targetIndex = this.lastIndex < 0 ? this.list.length : this.lastIndex;
5454
- const fromList = session.fromList ?? undefined;
5765
+ const fromList = session.fromList;
5455
5766
  const fromIndex = session.fromIndex ?? -1;
5456
5767
  const sameList = fromList === this.list;
5457
5768
  const isExternal = session.fromIsPalette === true || !fromList || fromIndex === -1;
@@ -5472,7 +5783,7 @@ class NgbDndListDirective {
5472
5783
  this.list.splice(insertAt, 0, itemToInsert);
5473
5784
  this.removePlaceholder();
5474
5785
  this.lastIndex = -1;
5475
- this.dndDropped.emit({
5786
+ this.emitDropEvent({
5476
5787
  item: itemToInsert,
5477
5788
  fromIndex,
5478
5789
  toIndex: insertAt,
@@ -5480,7 +5791,6 @@ class NgbDndListDirective {
5480
5791
  toList: this.list,
5481
5792
  sameList
5482
5793
  });
5483
- this.state.announce?.(this.state.i18n.dropped());
5484
5794
  }
5485
5795
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5486
5796
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDndListDirective, isStandalone: true, selector: "[ngbDndList]", inputs: { dndChildrenKey: "dndChildrenKey", list: ["ngbDndList", "list"], dndGroup: "dndGroup", dndDisabled: "dndDisabled", dndCloneOnDrop: "dndCloneOnDrop", dndCloneFn: "dndCloneFn", dndIsPalette: "dndIsPalette", dndCanDrop: "dndCanDrop", dndAriaLabel: "dndAriaLabel" }, outputs: { dndDropped: "dndDropped" }, host: { listeners: { "dragenter": "onDragEnter($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)", "document:drop": "onDocumentDrop($event)", "drop": "onDrop($event)", "document:dragend": "onDocumentDragFinished()", "document:dragcancel": "onDocumentDragFinished()" }, properties: { "class.ngb-dnd-denied": "this.denied", "attr.aria-label": "this.ariaLabel", "attr.role": "this.role", "class.ngb-dnd-list": "this.hostClass", "class.ngb-dnd-over": "this.isOver", "attr.data-drop-valid": "this.dataDropValid" } }, ngImport: i0 });
@@ -5578,75 +5888,134 @@ class NgbDndItemDirective {
5578
5888
  role = 'listitem';
5579
5889
  tabIndex = 0; // keyboard focusable
5580
5890
  sessionId = null;
5581
- onDragStart(ev) {
5582
- const eventWithFlag = ev;
5583
- if (eventWithFlag.__ngbDndItemStarted)
5584
- return;
5585
- eventWithFlag.__ngbDndItemStarted = true;
5891
+ keyboardDragState = null;
5892
+ sourceList() {
5893
+ return this.dndSourceList ?? this.parentList?.list;
5894
+ }
5895
+ resolveIndex(list) {
5896
+ if (typeof this.dndIndex === 'number')
5897
+ return this.dndIndex;
5898
+ return list ? list.indexOf(this.item) : -1;
5899
+ }
5900
+ beginDragSession(dataTransfer) {
5586
5901
  if (this.dndDisabled || this.item == null) {
5587
- ev.preventDefault();
5588
- return;
5902
+ return false;
5589
5903
  }
5590
5904
  this.sessionId = this.state.createSession({
5591
5905
  item: this.item,
5592
5906
  group: this.dndGroup ?? this.parentList?.dndGroup,
5593
- fromList: this.dndSourceList ?? this.parentList?.list,
5594
- fromIndex: this.dndIndex,
5907
+ fromList: this.sourceList(),
5908
+ fromIndex: this.resolveIndex(this.sourceList()),
5595
5909
  fromListRef: this.parentList,
5596
5910
  fromIsPalette: this.parentList?.dndIsPalette === true
5597
5911
  });
5598
- // set both a custom and a plain text payload; keep plain text non-empty
5599
- ev.dataTransfer?.setData('text/ngb-dnd', this.sessionId);
5600
- ev.dataTransfer?.setData('text/plain', 'ngb'); // some browsers require non-empty
5601
- if (ev.dataTransfer)
5602
- ev.dataTransfer.effectAllowed = 'copyMove';
5603
- ev.dataTransfer?.setDragImage(this.el.nativeElement, 16, 16);
5912
+ if (dataTransfer) {
5913
+ dataTransfer.setData('text/ngb-dnd', this.sessionId);
5914
+ dataTransfer.setData('text/plain', 'ngb');
5915
+ dataTransfer.effectAllowed = 'copyMove';
5916
+ dataTransfer.setDragImage(this.el.nativeElement, 16, 16);
5917
+ }
5604
5918
  this.dragging = true;
5605
5919
  this.dndDragStart.emit(this.item);
5920
+ this.state.announce?.(this.state.i18n.pickedUp());
5921
+ return true;
5606
5922
  }
5607
- onDragEnd() {
5923
+ endDragSession() {
5608
5924
  this.dragging = false;
5609
5925
  this.state.clear(this.sessionId);
5610
5926
  this.sessionId = null;
5927
+ this.keyboardDragState = null;
5611
5928
  this.dndDragEnd.emit();
5612
5929
  }
5930
+ onDragStart(ev) {
5931
+ const eventWithFlag = ev;
5932
+ if (eventWithFlag.__ngbDndItemStarted)
5933
+ return;
5934
+ eventWithFlag.__ngbDndItemStarted = true;
5935
+ if (!this.beginDragSession(ev.dataTransfer)) {
5936
+ ev.preventDefault();
5937
+ }
5938
+ }
5939
+ onDragEnd() {
5940
+ this.endDragSession();
5941
+ }
5942
+ moveWithinKeyboardList(offset) {
5943
+ const keyboardDragState = this.keyboardDragState;
5944
+ if (!keyboardDragState)
5945
+ return;
5946
+ const list = keyboardDragState.list;
5947
+ const from = keyboardDragState.currentIndex;
5948
+ let to = from + offset;
5949
+ to = Math.max(0, Math.min(list.length - 1, to));
5950
+ if (to === from)
5951
+ return;
5952
+ const [movedItem] = list.splice(from, 1);
5953
+ list.splice(to, 0, movedItem);
5954
+ keyboardDragState.currentIndex = to;
5955
+ this.dndIndex = to;
5956
+ this.state.announce?.(this.state.i18n.moveToIndex(to + 1, list.length));
5957
+ }
5958
+ emitKeyboardDrop() {
5959
+ const keyboardDragState = this.keyboardDragState;
5960
+ if (!keyboardDragState || !this.parentList)
5961
+ return;
5962
+ const event = {
5963
+ item: this.item,
5964
+ fromIndex: keyboardDragState.originalIndex,
5965
+ toIndex: keyboardDragState.currentIndex,
5966
+ fromList: keyboardDragState.list,
5967
+ toList: keyboardDragState.list,
5968
+ sameList: true,
5969
+ };
5970
+ this.parentList.emitDropEvent(event);
5971
+ }
5972
+ cancelKeyboardDrag() {
5973
+ const keyboardDragState = this.keyboardDragState;
5974
+ if (!keyboardDragState)
5975
+ return;
5976
+ if (keyboardDragState.currentIndex !== keyboardDragState.originalIndex) {
5977
+ const [movedItem] = keyboardDragState.list.splice(keyboardDragState.currentIndex, 1);
5978
+ keyboardDragState.list.splice(keyboardDragState.originalIndex, 0, movedItem);
5979
+ this.dndIndex = keyboardDragState.originalIndex;
5980
+ }
5981
+ this.state.announce?.(this.state.i18n.canceled?.() ?? 'Canceled.');
5982
+ }
5613
5983
  onKeydown(ev) {
5614
5984
  if (this.dndDisabled)
5615
5985
  return;
5616
5986
  // start dragging (keyboard mode)
5617
5987
  if (ev.code === 'Space' && !this.dragging) {
5618
5988
  ev.preventDefault();
5619
- this.onDragStart(new DragEvent('dragstart')); // reuse logic
5989
+ const list = this.sourceList();
5990
+ const index = this.resolveIndex(list);
5991
+ if (!list || index < 0)
5992
+ return;
5993
+ this.keyboardDragState = {
5994
+ list,
5995
+ originalIndex: index,
5996
+ currentIndex: index,
5997
+ };
5998
+ this.beginDragSession();
5620
5999
  return;
5621
6000
  }
5622
6001
  if (!this.dragging)
5623
6002
  return;
5624
- // move within same list
5625
- const parent = this.parentList;
5626
- if (!parent || typeof this.dndIndex !== 'number')
5627
- return;
5628
6003
  if (ev.code === 'ArrowUp' || ev.code === 'ArrowDown') {
5629
6004
  ev.preventDefault();
5630
- const list = parent.list;
5631
- const from = this.dndIndex;
5632
- let to = ev.code === 'ArrowUp' ? from - 1 : from + 1;
5633
- to = Math.max(0, Math.min(list.length - 1, to));
5634
- if (to !== from) {
5635
- const [it] = list.splice(from, 1);
5636
- list.splice(to, 0, it);
5637
- this.dndIndex = to;
5638
- // announce (see live region below)
5639
- this.state.announce?.(this.state.i18n.moveToIndex(to + 1, list.length));
5640
- }
6005
+ this.moveWithinKeyboardList(ev.code === 'ArrowUp' ? -1 : 1);
6006
+ return;
5641
6007
  }
5642
6008
  if (ev.code === 'Enter') {
5643
6009
  ev.preventDefault();
5644
- this.onDragEnd();
5645
- } // drop
6010
+ this.emitKeyboardDrop();
6011
+ this.endDragSession();
6012
+ return;
6013
+ }
5646
6014
  if (ev.code === 'Escape') {
5647
6015
  ev.preventDefault();
5648
- this.onDragEnd();
5649
- } // cancel
6016
+ this.cancelKeyboardDrag();
6017
+ this.endDragSession();
6018
+ }
5650
6019
  }
5651
6020
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndItemDirective, deps: [{ token: NgbDndListDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
5652
6021
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDndItemDirective, isStandalone: true, selector: "[ngbDndItem]", inputs: { item: ["ngbDndItem", "item"], dndGroup: "dndGroup", dndIndex: "dndIndex", dndSourceList: "dndSourceList", dndDisabled: "dndDisabled" }, outputs: { dndDragStart: "dndDragStart", dndDragEnd: "dndDragEnd" }, host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd()", "keydown": "onKeydown($event)" }, properties: { "attr.draggable": "this.draggable", "class.ngb-dnd-item": "this.hostClass", "class.ngb-dnd-dragging": "this.dragging", "attr.aria-grabbed": "this.ariaGrabbed", "attr.role": "this.role", "attr.tabindex": "this.tabIndex" } }, ngImport: i0 });
@@ -5793,6 +6162,7 @@ const isReasonableEmail = (value) => {
5793
6162
  class Datagrid {
5794
6163
  /** Column definitions to render */
5795
6164
  _columns = [];
6165
+ renderTick = 0;
5796
6166
  get columns() {
5797
6167
  return this._columns;
5798
6168
  }
@@ -5883,7 +6253,15 @@ class Datagrid {
5883
6253
  this.syncLegacyFilters(this.localFilter);
5884
6254
  this.invalidateFilteredCaches();
5885
6255
  }
5886
- filterOperators;
6256
+ _filterOperators;
6257
+ get filterOperators() {
6258
+ return this._filterOperators;
6259
+ }
6260
+ set filterOperators(value) {
6261
+ this._filterOperators = value;
6262
+ this.filterOperatorsCache.clear();
6263
+ this.markGridForCheck();
6264
+ }
5887
6265
  filterManual = false;
5888
6266
  externalFiltering = false;
5889
6267
  /** Opts local arrays into the reusable DataGrid operation helper for filter/sort/page processing. */
@@ -5895,6 +6273,34 @@ class Datagrid {
5895
6273
  this._dataOperations = value ?? false;
5896
6274
  this.invalidatePagedCache();
5897
6275
  }
6276
+ _groupable = false;
6277
+ get groupable() {
6278
+ return this._groupable;
6279
+ }
6280
+ set groupable(value) {
6281
+ this._groupable = value ?? false;
6282
+ this.invalidatePagedCache();
6283
+ this.markGridForCheck();
6284
+ }
6285
+ _group = [];
6286
+ get group() {
6287
+ return this._group;
6288
+ }
6289
+ set group(value) {
6290
+ this._group = this.normalizeGroupDescriptors(value);
6291
+ this.syncCollapsedGroups();
6292
+ this.invalidatePagedCache();
6293
+ this.markGridForCheck();
6294
+ }
6295
+ _groupedData = null;
6296
+ get groupedData() {
6297
+ return this._groupedData;
6298
+ }
6299
+ set groupedData(value) {
6300
+ this._groupedData = value ? this.cloneGroupResults(value) : null;
6301
+ this.invalidatePagedCache();
6302
+ this.markGridForCheck();
6303
+ }
5898
6304
  /**
5899
6305
  * Optional controlled data-operation state. When provided, the grid syncs page, pageSize,
5900
6306
  * sort, filter, and global filter from this object.
@@ -5966,6 +6372,8 @@ class Datagrid {
5966
6372
  }
5967
6373
  set tableOptions(value) {
5968
6374
  this._tableOptions = value ?? {};
6375
+ this.tableClassListCache = null;
6376
+ this.responsiveWrapperClassesCache = null;
5969
6377
  this.invalidatePagedCache();
5970
6378
  }
5971
6379
  /**
@@ -6002,10 +6410,26 @@ class Datagrid {
6002
6410
  globalFilterAriaLabel = 'Search all columns';
6003
6411
  /** Placeholder for the built-in global search input. */
6004
6412
  globalFilterPlaceholder = 'Search all columns';
6413
+ _searchHighlightTerm = '';
6005
6414
  /** When set, matching substrings in visible cells are wrapped with `.grid-search-highlight`. */
6006
- searchHighlightTerm = '';
6415
+ get searchHighlightTerm() {
6416
+ return this._searchHighlightTerm;
6417
+ }
6418
+ set searchHighlightTerm(value) {
6419
+ this._searchHighlightTerm = value ?? '';
6420
+ this.searchHighlightCache.clear();
6421
+ this.markGridForCheck();
6422
+ }
6423
+ _searchHighlightFields = null;
6007
6424
  /** Column fields included in search highlighting; all visible columns when empty. */
6008
- searchHighlightFields = null;
6425
+ get searchHighlightFields() {
6426
+ return this._searchHighlightFields;
6427
+ }
6428
+ set searchHighlightFields(value) {
6429
+ this._searchHighlightFields = value ?? null;
6430
+ this.searchHighlightCache.clear();
6431
+ this.markGridForCheck();
6432
+ }
6009
6433
  /** Accessible label announced when expanding a row. */
6010
6434
  expandRowAriaLabel = 'Expand row';
6011
6435
  /** Accessible label announced when collapsing a row. */
@@ -6043,7 +6467,16 @@ class Datagrid {
6043
6467
  }
6044
6468
  theme = 'bootstrap';
6045
6469
  responsive = false;
6046
- trackBy;
6470
+ _trackBy;
6471
+ get trackBy() {
6472
+ return this._trackBy;
6473
+ }
6474
+ set trackBy(value) {
6475
+ this._trackBy = value;
6476
+ this.invalidateRowIdentityCache();
6477
+ this.invalidateSortedCaches();
6478
+ this.markGridForCheck();
6479
+ }
6047
6480
  rowClass;
6048
6481
  rowStyle;
6049
6482
  rowReorderable = false;
@@ -6100,6 +6533,7 @@ class Datagrid {
6100
6533
  rowSave = new EventEmitter();
6101
6534
  rowCancel = new EventEmitter();
6102
6535
  rowDelete = new EventEmitter();
6536
+ groupChange = new EventEmitter();
6103
6537
  sortChange = new EventEmitter();
6104
6538
  filterChange = new EventEmitter();
6105
6539
  filtersChange = new EventEmitter();
@@ -6110,6 +6544,7 @@ class Datagrid {
6110
6544
  columnReorder = new EventEmitter();
6111
6545
  rowDetailTpl;
6112
6546
  pagerTpl;
6547
+ groupHeaderTpl;
6113
6548
  exporter = inject(NgbExportService); // instead of constructor(private exporter: NgbExportService) {}
6114
6549
  expanded = new Set();
6115
6550
  fb = inject(FormBuilder);
@@ -6211,24 +6646,77 @@ class Datagrid {
6211
6646
  filteredCache = [];
6212
6647
  sortedCache = [];
6213
6648
  pagedCache = [];
6649
+ renderRowsCache = [];
6650
+ stickyGroupHeaderRows = [];
6651
+ stickyGroupFooterRows = [];
6652
+ stickyGroupOverlayColumnWidths = [];
6653
+ stickyGroupHeaderTranslateY = 0;
6654
+ stickyGroupFooterTranslateY = 0;
6214
6655
  resolvedColumnsDirty = true;
6215
6656
  visibleColumnsDirty = true;
6216
6657
  filteredDirty = true;
6217
6658
  sortedDirty = true;
6218
6659
  pagedDirty = true;
6219
- rowIndexMap = new Map();
6220
- rowIndexMapSource = null;
6660
+ renderRowsDirty = true;
6661
+ stickyGroupSyncQueued = false;
6662
+ rowMetaMap = new Map();
6663
+ rowMetaSource = null;
6664
+ rowMetaTrackBy;
6665
+ filterOperatorsCache = new Map();
6666
+ searchHighlightCache = new Map();
6667
+ multiCheckboxOptionsCache = new Map();
6668
+ multiCheckboxVisibleOptionsCache = new Map();
6669
+ stackedColumnsCache = new Map();
6670
+ stackedCardGroupsCache = null;
6671
+ tableClassListCache = null;
6672
+ responsiveWrapperClassesCache = null;
6673
+ collapsedGroupKeys = new Set();
6674
+ groupRenderRowLookup = new Map();
6675
+ groupFooterRenderRowLookup = new Map();
6676
+ groupDragField = null;
6677
+ groupPanelDragActive = false;
6678
+ groupPanelDragDenied = false;
6221
6679
  norm(v) {
6222
6680
  return (v ?? '').toString().toLowerCase().trim();
6223
6681
  }
6224
6682
  keyOf(col) {
6225
6683
  return col.field;
6226
6684
  }
6685
+ readFieldValue(row, field) {
6686
+ return typeof row === 'object' && row !== null ? row[field] : undefined;
6687
+ }
6227
6688
  getDefaults() {
6228
6689
  return typeof this.newRowDefaults === 'function'
6229
6690
  ? this.newRowDefaults() ?? {}
6230
6691
  : this.newRowDefaults ?? {};
6231
6692
  }
6693
+ toDraftValues(row) {
6694
+ return typeof row === 'object' && row !== null ? row : {};
6695
+ }
6696
+ formDraftValues(form) {
6697
+ return this.toDraftValues(form.getRawValue());
6698
+ }
6699
+ assignDraftValues(row, values) {
6700
+ return this.getEditService().assignValues(row, values);
6701
+ }
6702
+ patchFieldValue(field, value) {
6703
+ return { [field]: value };
6704
+ }
6705
+ compareSortValues(left, right) {
6706
+ if (typeof left === 'string' && typeof right === 'string') {
6707
+ return left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' });
6708
+ }
6709
+ if (left === right)
6710
+ return 0;
6711
+ return left != null && right != null && left < right ? -1 : 1;
6712
+ }
6713
+ readModifierKeys(event) {
6714
+ const modifierEvent = event;
6715
+ return {
6716
+ shift: !!modifierEvent?.shiftKey,
6717
+ meta: !!(modifierEvent?.metaKey || modifierEvent?.ctrlKey),
6718
+ };
6719
+ }
6232
6720
  defaultFor(col) {
6233
6721
  const d = this.getDefaults();
6234
6722
  const key = col.field;
@@ -6341,6 +6829,12 @@ class Datagrid {
6341
6829
  invalidateColumnCaches() {
6342
6830
  this.resolvedColumnsDirty = true;
6343
6831
  this.visibleColumnsDirty = true;
6832
+ this.filterOperatorsCache.clear();
6833
+ this.stackedColumnsCache.clear();
6834
+ this.stackedCardGroupsCache = null;
6835
+ this.multiCheckboxOptionsCache.clear();
6836
+ this.multiCheckboxVisibleOptionsCache.clear();
6837
+ this.searchHighlightCache.clear();
6344
6838
  this.invalidateFilteredCaches();
6345
6839
  }
6346
6840
  invalidateFilteredCaches() {
@@ -6353,24 +6847,63 @@ class Datagrid {
6353
6847
  }
6354
6848
  invalidatePagedCache() {
6355
6849
  this.pagedDirty = true;
6850
+ this.renderRowsDirty = true;
6851
+ this.scheduleStickyGroupSync();
6852
+ }
6853
+ invalidateRowIdentityCache() {
6854
+ this.rowMetaSource = null;
6855
+ this.rowMetaTrackBy = undefined;
6356
6856
  }
6357
6857
  invalidateDataCaches() {
6358
- this.rowIndexMapSource = null;
6858
+ this.invalidateRowIdentityCache();
6859
+ this.multiCheckboxOptionsCache.clear();
6860
+ this.multiCheckboxVisibleOptionsCache.clear();
6861
+ this.searchHighlightCache.clear();
6359
6862
  this.invalidateFilteredCaches();
6360
6863
  }
6361
6864
  markGridForCheck() {
6362
6865
  this.cdr?.markForCheck();
6363
6866
  }
6364
- ensureRowIndexMap() {
6365
- if (this.rowIndexMapSource === this.data)
6867
+ // Some library interactions update internal state without changing an input reference.
6868
+ // Schedule a follow-up render so zoneless hosts and child row/header views stay in sync.
6869
+ scheduleViewRefresh(afterRefresh) {
6870
+ this.renderTick++;
6871
+ this.cdr.markForCheck();
6872
+ Promise.resolve().then(() => {
6873
+ try {
6874
+ this.cdr.detectChanges();
6875
+ afterRefresh?.();
6876
+ }
6877
+ catch {
6878
+ // The view can be destroyed before the queued refresh runs.
6879
+ }
6880
+ });
6881
+ }
6882
+ ensureRowMetaMap() {
6883
+ if (this.rowMetaSource === this.data && this.rowMetaTrackBy === this.trackBy)
6366
6884
  return;
6367
- this.rowIndexMap.clear();
6368
- (this.data ?? []).forEach((row, index) => this.rowIndexMap.set(row, index));
6369
- this.rowIndexMapSource = this.data;
6885
+ this.rowMetaMap.clear();
6886
+ (this.data ?? []).forEach((row, index) => {
6887
+ this.rowMetaMap.set(row, {
6888
+ index,
6889
+ id: this.trackBy ? this.trackBy(index, row) : index,
6890
+ });
6891
+ });
6892
+ this.rowMetaSource = this.data;
6893
+ this.rowMetaTrackBy = this.trackBy;
6894
+ }
6895
+ resolveRowMeta(row, fallbackIndex = -1) {
6896
+ this.ensureRowMetaMap();
6897
+ const cached = this.rowMetaMap.get(row);
6898
+ if (cached)
6899
+ return cached;
6900
+ return {
6901
+ index: fallbackIndex,
6902
+ id: this.trackBy ? this.trackBy(fallbackIndex, row) : fallbackIndex,
6903
+ };
6370
6904
  }
6371
6905
  dataIndexOf(row, fallback = -1) {
6372
- this.ensureRowIndexMap();
6373
- return this.rowIndexMap.get(row) ?? fallback;
6906
+ return this.resolveRowMeta(row, fallback).index;
6374
6907
  }
6375
6908
  syncColumnOrder(resetFromColumns) {
6376
6909
  const visible = this.resolvedColumns.filter((col) => !col.hidden);
@@ -6387,6 +6920,185 @@ class Datagrid {
6387
6920
  }
6388
6921
  this.columnOrder = next;
6389
6922
  }
6923
+ isGroupingEnabled() {
6924
+ return this.groupable !== false;
6925
+ }
6926
+ isGroupingActive() {
6927
+ return this.isGroupingEnabled() && this.group.length > 0;
6928
+ }
6929
+ isColumnGroupable(col) {
6930
+ return this.isGroupingEnabled() && !col.hidden;
6931
+ }
6932
+ isFieldGrouped(field) {
6933
+ return this.group.some((descriptor) => descriptor.field === field);
6934
+ }
6935
+ groupedColumns() {
6936
+ return this.group;
6937
+ }
6938
+ groupingSettings() {
6939
+ return typeof this.groupable === 'object' && this.groupable !== null ? this.groupable : {};
6940
+ }
6941
+ showGroupFooters() {
6942
+ return this.isGroupingActive() && this.groupingSettings().showFooter === true;
6943
+ }
6944
+ showStickyGroupHeaders() {
6945
+ return this.isGroupingActive() && this.groupingSettings().stickyHeaders === true;
6946
+ }
6947
+ showStickyGroupFooters() {
6948
+ return this.showGroupFooters() && this.groupingSettings().stickyFooters === true;
6949
+ }
6950
+ hasStickyGroupHeaders() {
6951
+ return this.showStickyGroupHeaders() && this.stickyGroupHeaderRows.length > 0;
6952
+ }
6953
+ hasStickyGroupFooters() {
6954
+ return this.showStickyGroupFooters() && this.stickyGroupFooterRows.length > 0;
6955
+ }
6956
+ groupColumnHeader(field) {
6957
+ const column = this.resolvedColumns.find((item) => item.field === field);
6958
+ return column?.header ?? field;
6959
+ }
6960
+ groupHandleAriaLabel(col) {
6961
+ const header = this.groupColumnHeader(col.field);
6962
+ return this.isFieldGrouped(col.field)
6963
+ ? `Grouped by ${header}. Press Enter to remove it from grouping.`
6964
+ : `Add ${header} to grouping. Drag into the group panel or press Enter.`;
6965
+ }
6966
+ groupDirectionAriaLabel(descriptor) {
6967
+ return `Toggle ${this.groupColumnHeader(descriptor.field)} group direction. Currently ${descriptor.dir === 'desc' ? 'descending' : 'ascending'}.`;
6968
+ }
6969
+ groupRemoveAriaLabel(descriptor) {
6970
+ return `Remove ${this.groupColumnHeader(descriptor.field)} grouping`;
6971
+ }
6972
+ groupPanelLabel() {
6973
+ return this.group.length
6974
+ ? 'Grouped by'
6975
+ : 'Drag column headers here to group rows';
6976
+ }
6977
+ groupFieldLabel(descriptor) {
6978
+ return this.groupColumnHeader(descriptor.field);
6979
+ }
6980
+ groupDirectionLabel(descriptor) {
6981
+ return descriptor.dir === 'desc' ? 'Descending' : 'Ascending';
6982
+ }
6983
+ toggleGroupField(field) {
6984
+ if (!field)
6985
+ return;
6986
+ if (this.isFieldGrouped(field)) {
6987
+ this.removeGroupField(field);
6988
+ return;
6989
+ }
6990
+ this.addGroupField(field);
6991
+ }
6992
+ addGroupField(field, dir = 'asc', emit = true) {
6993
+ if (!field || this.isFieldGrouped(field))
6994
+ return;
6995
+ this.setGroupDescriptors([...this.group, { field, dir }], emit);
6996
+ }
6997
+ removeGroupField(field, emit = true) {
6998
+ if (!field)
6999
+ return;
7000
+ this.setGroupDescriptors(this.group.filter((descriptor) => descriptor.field !== field), emit);
7001
+ }
7002
+ toggleGroupDirection(field) {
7003
+ this.setGroupDescriptors(this.group.map((descriptor) => descriptor.field === field
7004
+ ? { ...descriptor, dir: descriptor.dir === 'desc' ? 'asc' : 'desc' }
7005
+ : descriptor), true);
7006
+ }
7007
+ setGroupDescriptors(descriptors, emit = true) {
7008
+ const normalized = this.normalizeGroupDescriptors(descriptors);
7009
+ const changed = normalized.length !== this.group.length ||
7010
+ normalized.some((descriptor, index) => descriptor.field !== this.group[index]?.field || descriptor.dir !== this.group[index]?.dir);
7011
+ if (!changed) {
7012
+ this.clearGroupDragState();
7013
+ return;
7014
+ }
7015
+ this._group = normalized;
7016
+ this.page = 1;
7017
+ this.syncCollapsedGroups();
7018
+ this.invalidatePagedCache();
7019
+ if (emit) {
7020
+ this.groupChange.emit({ group: [...this.group] });
7021
+ this.emitDataStateChange();
7022
+ }
7023
+ this.clearGroupDragState();
7024
+ this.cdr.markForCheck();
7025
+ }
7026
+ normalizeGroupDescriptors(descriptors) {
7027
+ const seen = new Set();
7028
+ const normalized = [];
7029
+ for (const descriptor of descriptors ?? []) {
7030
+ const field = String(descriptor?.field ?? '').trim();
7031
+ if (!field || seen.has(field))
7032
+ continue;
7033
+ seen.add(field);
7034
+ normalized.push({
7035
+ field,
7036
+ dir: descriptor.dir === 'desc' ? 'desc' : 'asc',
7037
+ ...(descriptor.aggregates?.length ? { aggregates: this.cloneAggregateDescriptors(descriptor.aggregates) } : {}),
7038
+ });
7039
+ }
7040
+ return normalized;
7041
+ }
7042
+ syncCollapsedGroups() {
7043
+ if (!this.collapsedGroupKeys.size)
7044
+ return;
7045
+ const allowedPrefixes = new Set(this.group.map((descriptor, index) => `${index}:${descriptor.field}:`));
7046
+ this.collapsedGroupKeys = new Set(Array.from(this.collapsedGroupKeys).filter((key) => Array.from(allowedPrefixes).some((prefix) => key.startsWith(prefix))));
7047
+ }
7048
+ clearGroupDragState() {
7049
+ this.groupDragField = null;
7050
+ this.groupPanelDragActive = false;
7051
+ this.groupPanelDragDenied = false;
7052
+ }
7053
+ canAcceptGroupedField(field) {
7054
+ return !!field && this.isGroupingEnabled() && !this.isFieldGrouped(field);
7055
+ }
7056
+ onGroupHandleDragStart(event, field) {
7057
+ if (!this.canAcceptGroupedField(field)) {
7058
+ event.preventDefault();
7059
+ return;
7060
+ }
7061
+ this.groupDragField = field;
7062
+ if (event.dataTransfer) {
7063
+ event.dataTransfer.effectAllowed = 'move';
7064
+ event.dataTransfer.setData('text/ngb-datagrid-group-field', field);
7065
+ event.dataTransfer.setData('text/plain', field);
7066
+ }
7067
+ }
7068
+ onGroupHandleDragEnd() {
7069
+ this.clearGroupDragState();
7070
+ this.cdr.markForCheck();
7071
+ }
7072
+ onGroupPanelDragOver(event) {
7073
+ const field = this.groupDragField || event.dataTransfer?.getData('text/ngb-datagrid-group-field') || null;
7074
+ this.groupPanelDragDenied = !this.canAcceptGroupedField(field);
7075
+ this.groupPanelDragActive = !!field;
7076
+ if (this.groupPanelDragDenied)
7077
+ return;
7078
+ event.preventDefault();
7079
+ if (event.dataTransfer) {
7080
+ event.dataTransfer.dropEffect = 'move';
7081
+ }
7082
+ }
7083
+ onGroupPanelDragLeave(event) {
7084
+ const current = event.currentTarget;
7085
+ const related = event.relatedTarget;
7086
+ if (current && related && current.contains(related))
7087
+ return;
7088
+ this.groupPanelDragActive = false;
7089
+ this.groupPanelDragDenied = false;
7090
+ this.cdr.markForCheck();
7091
+ }
7092
+ onGroupPanelDrop(event) {
7093
+ const field = this.groupDragField || event.dataTransfer?.getData('text/ngb-datagrid-group-field') || null;
7094
+ if (!this.canAcceptGroupedField(field)) {
7095
+ this.clearGroupDragState();
7096
+ this.cdr.markForCheck();
7097
+ return;
7098
+ }
7099
+ event.preventDefault();
7100
+ this.addGroupField(field);
7101
+ }
6390
7102
  isColumnReorderEnabled() {
6391
7103
  if (!this.columnReorderable || this.isStackedLayout())
6392
7104
  return false;
@@ -6520,8 +7232,7 @@ class Datagrid {
6520
7232
  fields: [...order],
6521
7233
  });
6522
7234
  }
6523
- this.syncResizableColgroups();
6524
- this.cdr.markForCheck();
7235
+ this.scheduleViewRefresh(() => this.syncResizableColgroups());
6525
7236
  }
6526
7237
  validateColumnConfig() {
6527
7238
  const columns = this.resolvedColumns;
@@ -6607,7 +7318,7 @@ class Datagrid {
6607
7318
  return false;
6608
7319
  if (!global)
6609
7320
  return true;
6610
- return resolvedColumns.some((column) => this.norm(row?.[column.field]).includes(global));
7321
+ return resolvedColumns.some((column) => this.norm(this.readFieldValue(row, column.field)).includes(global));
6611
7322
  });
6612
7323
  }
6613
7324
  this.filteredDirty = false;
@@ -6643,7 +7354,7 @@ class Datagrid {
6643
7354
  matchesDescriptor(row, descriptor) {
6644
7355
  const column = this.resolvedColumns.find((col) => col.field === descriptor.field);
6645
7356
  const filterType = this.getColumnFilterType(column);
6646
- const cellValue = this.normalizeFilterValue(row?.[descriptor.field], filterType);
7357
+ const cellValue = this.normalizeFilterValue(this.readFieldValue(row, descriptor.field), filterType);
6647
7358
  const compareValue = this.normalizeFilterValue(descriptor.value, filterType);
6648
7359
  const ignoreCase = descriptor.ignoreCase ?? (filterType === 'text' || filterType === 'select');
6649
7360
  if (descriptor.operator === 'isnull')
@@ -6721,12 +7432,17 @@ class Datagrid {
6721
7432
  return this.isFilteringEnabled() && this.resolvedFilterMode() === 'multi' && !!col.filterable;
6722
7433
  }
6723
7434
  getAllowedOperators(col) {
6724
- if (col.allowedFilterOperators?.length)
6725
- return col.allowedFilterOperators;
6726
- const typeOperators = this.filterOperators?.[col.type ?? 'text'];
6727
- if (typeOperators?.length)
6728
- return typeOperators;
6729
- return ngbAllowedFilterOperators(this.getColumnFilterType(col));
7435
+ const field = col.field;
7436
+ const cached = this.filterOperatorsCache.get(field);
7437
+ if (cached)
7438
+ return cached;
7439
+ const resolved = col.allowedFilterOperators?.length
7440
+ ? col.allowedFilterOperators
7441
+ : this.filterOperators?.[col.type ?? 'text']?.length
7442
+ ? this.filterOperators[col.type ?? 'text']
7443
+ : ngbAllowedFilterOperators(this.getColumnFilterType(col));
7444
+ this.filterOperatorsCache.set(field, resolved);
7445
+ return resolved;
6730
7446
  }
6731
7447
  defaultFilterOperator(col) {
6732
7448
  const allowed = this.getAllowedOperators(col);
@@ -6809,14 +7525,162 @@ class Datagrid {
6809
7525
  return value ? 'Yes' : 'No';
6810
7526
  return String(value);
6811
7527
  }
7528
+ groupColumn(field) {
7529
+ return this.resolvedColumns.find((column) => column.field === field);
7530
+ }
7531
+ groupColumnField(col) {
7532
+ return String(col.field);
7533
+ }
7534
+ formatGroupValue(field, value) {
7535
+ const column = this.groupColumn(field);
7536
+ if (value === null || value === undefined || value === '')
7537
+ return '(Blank)';
7538
+ if (column?.type === 'select') {
7539
+ const option = column.options?.find((item) => item.value === value);
7540
+ if (option)
7541
+ return option.label;
7542
+ }
7543
+ return this.formatCellDisplayValue(value);
7544
+ }
7545
+ groupRowLabel(group) {
7546
+ return `${this.groupColumnHeader(group.field)}: ${this.formatGroupValue(group.field, group.value)}`;
7547
+ }
7548
+ groupRowCountLabel(group) {
7549
+ return `${group.count} item${group.count === 1 ? '' : 's'}`;
7550
+ }
7551
+ groupLeadColumnField(group) {
7552
+ const first = this.visibleColumns[0];
7553
+ return first ? String(first.field) : null;
7554
+ }
7555
+ isGroupLeadColumn(col, group) {
7556
+ return String(col.field) === this.groupLeadColumnField(group);
7557
+ }
7558
+ shouldRenderGroupCell(col, group) {
7559
+ if (this.isGroupLeadColumn(col, group))
7560
+ return true;
7561
+ return !this.isCoveredByGroupLeadSpan(col, group);
7562
+ }
7563
+ groupCellColspan(col, group) {
7564
+ if (!this.isGroupLeadColumn(col, group))
7565
+ return null;
7566
+ return this.groupLeadColumnSpan(group);
7567
+ }
7568
+ hasGroupHeaderColumnTemplate(field) {
7569
+ return !!this.groupHeaderColumnTpls[field];
7570
+ }
7571
+ hasGroupFooterTemplate(field) {
7572
+ return !!this.groupFooterTpls[field];
7573
+ }
7574
+ groupHeaderColumnTemplate(field) {
7575
+ return this.groupHeaderColumnTpls[field] ?? null;
7576
+ }
7577
+ groupFooterTemplate(field) {
7578
+ return this.groupFooterTpls[field] ?? null;
7579
+ }
7580
+ groupHeaderContext(group) {
7581
+ const ctx = {
7582
+ $implicit: group,
7583
+ group,
7584
+ field: group.field,
7585
+ value: group.value,
7586
+ items: group.items,
7587
+ level: group.level,
7588
+ count: group.count,
7589
+ aggregates: this.cloneAggregateResults(group.aggregates),
7590
+ };
7591
+ return ctx;
7592
+ }
7593
+ groupColumnContext(group, col) {
7594
+ return {
7595
+ ...this.groupHeaderContext(group),
7596
+ col,
7597
+ };
7598
+ }
7599
+ groupRowIndent(level) {
7600
+ return level * 1.1;
7601
+ }
7602
+ groupLeadColumnSpan(group) {
7603
+ const leadIndex = this.groupLeadColumnIndex(group);
7604
+ if (leadIndex === -1)
7605
+ return 1;
7606
+ for (let index = leadIndex + 1; index < this.visibleColumns.length; index += 1) {
7607
+ const field = this.groupColumnField(this.visibleColumns[index]);
7608
+ if (this.hasGroupHeaderColumnTemplate(field)) {
7609
+ return Math.max(index - leadIndex, 1);
7610
+ }
7611
+ }
7612
+ return Math.max(this.visibleColumns.length - leadIndex, 1);
7613
+ }
7614
+ isCoveredByGroupLeadSpan(col, group) {
7615
+ const index = this.groupColumnIndex(col);
7616
+ const leadIndex = this.groupLeadColumnIndex(group);
7617
+ if (index === -1 || leadIndex === -1 || index <= leadIndex)
7618
+ return false;
7619
+ return index < leadIndex + this.groupLeadColumnSpan(group);
7620
+ }
7621
+ groupLeadColumnIndex(group) {
7622
+ const field = this.groupLeadColumnField(group);
7623
+ return field ? this.visibleColumns.findIndex((column) => String(column.field) === field) : -1;
7624
+ }
7625
+ groupColumnIndex(col) {
7626
+ const field = String(col.field);
7627
+ return this.visibleColumns.findIndex((column) => String(column.field) === field);
7628
+ }
7629
+ groupKeyFor(group, level, startIndex) {
7630
+ return `${level}:${group.field}:${String(group.value)}:${startIndex}`;
7631
+ }
7632
+ isGroupCollapsed(group, level, startIndex) {
7633
+ return this.collapsedGroupKeys.has(this.groupKeyFor(group, level, startIndex));
7634
+ }
7635
+ toggleGroupCollapsed(group, level, startIndex) {
7636
+ const key = this.groupKeyFor(group, level, startIndex);
7637
+ if (this.collapsedGroupKeys.has(key)) {
7638
+ this.collapsedGroupKeys.delete(key);
7639
+ }
7640
+ else {
7641
+ this.collapsedGroupKeys.add(key);
7642
+ }
7643
+ this.invalidatePagedCache();
7644
+ this.cdr.markForCheck();
7645
+ }
7646
+ isGroupResult(item) {
7647
+ return typeof item === 'object' && item !== null && Array.isArray(item.items);
7648
+ }
7649
+ cloneAggregateDescriptors(descriptors) {
7650
+ return (descriptors ?? []).map((descriptor) => ({ ...descriptor }));
7651
+ }
7652
+ cloneAggregateResults(results) {
7653
+ const cloned = {};
7654
+ for (const field of Object.keys(results ?? {})) {
7655
+ cloned[field] = { ...results[field] };
7656
+ }
7657
+ return cloned;
7658
+ }
7659
+ cloneGroupResults(groups) {
7660
+ return (groups ?? []).map((group) => ({
7661
+ ...group,
7662
+ aggregates: this.cloneAggregateResults(group.aggregates),
7663
+ items: group.items.map((item) => (this.isGroupResult(item) ? this.cloneGroupResults([item])[0] : item)),
7664
+ }));
7665
+ }
6812
7666
  getSearchHighlightSegments(value, field) {
6813
7667
  const display = this.formatCellDisplayValue(value);
6814
- if (!this.shouldHighlightSearchInColumn(field)) {
6815
- return [{ text: display, match: false }];
6816
- }
6817
7668
  const term = this.norm(this.searchHighlightTerm);
6818
- if (!term || !display)
6819
- return [{ text: display, match: false }];
7669
+ const highlightEnabled = this.shouldHighlightSearchInColumn(field);
7670
+ const cacheKey = JSON.stringify([field, term, display, highlightEnabled]);
7671
+ const cached = this.searchHighlightCache.get(cacheKey);
7672
+ if (cached)
7673
+ return cached;
7674
+ if (!highlightEnabled) {
7675
+ const segments = [{ key: '0:n', text: display, match: false }];
7676
+ this.searchHighlightCache.set(cacheKey, segments);
7677
+ return segments;
7678
+ }
7679
+ if (!term || !display) {
7680
+ const segments = [{ key: '0:n', text: display, match: false }];
7681
+ this.searchHighlightCache.set(cacheKey, segments);
7682
+ return segments;
7683
+ }
6820
7684
  const normalizedDisplay = this.norm(display);
6821
7685
  const segments = [];
6822
7686
  let cursor = 0;
@@ -6825,18 +7689,20 @@ class Datagrid {
6825
7689
  const normalizedSlice = this.norm(slice);
6826
7690
  const matchIndex = normalizedSlice.indexOf(term);
6827
7691
  if (matchIndex < 0) {
6828
- segments.push({ text: display.slice(cursor), match: false });
7692
+ segments.push({ key: `${cursor}:n`, text: display.slice(cursor), match: false });
6829
7693
  break;
6830
7694
  }
6831
7695
  const start = cursor + matchIndex;
6832
7696
  const end = start + term.length;
6833
7697
  if (start > cursor) {
6834
- segments.push({ text: display.slice(cursor, start), match: false });
7698
+ segments.push({ key: `${cursor}:n`, text: display.slice(cursor, start), match: false });
6835
7699
  }
6836
- segments.push({ text: display.slice(start, end), match: true });
7700
+ segments.push({ key: `${start}:m`, text: display.slice(start, end), match: true });
6837
7701
  cursor = end;
6838
7702
  }
6839
- return segments.length ? segments : [{ text: display, match: false }];
7703
+ const resolved = segments.length ? segments : [{ key: '0:n', text: display, match: false }];
7704
+ this.searchHighlightCache.set(cacheKey, resolved);
7705
+ return resolved;
6840
7706
  }
6841
7707
  rowFilterEmptyOptionLabel(col) {
6842
7708
  return this.getColumnFilterType(col) === 'boolean' ? '(All)' : 'Select';
@@ -7201,22 +8067,37 @@ class Datagrid {
7201
8067
  this.closeFilterMenu();
7202
8068
  }
7203
8069
  multiCheckboxOptions(col) {
8070
+ const field = col.field;
8071
+ const cached = this.multiCheckboxOptionsCache.get(field);
8072
+ if (cached)
8073
+ return cached;
7204
8074
  const seen = new Map();
7205
8075
  for (const row of this.data ?? []) {
7206
- const value = row?.[col.field];
8076
+ const value = this.readFieldValue(row, col.field);
7207
8077
  const key = this.multiCheckboxValueKey(value);
7208
8078
  if (!seen.has(key)) {
7209
8079
  seen.set(key, { label: this.multiCheckboxValueLabel(col, value), value });
7210
8080
  }
7211
8081
  }
7212
- return Array.from(seen.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true }));
8082
+ const options = Array.from(seen.values()).sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base', numeric: true }));
8083
+ this.multiCheckboxOptionsCache.set(field, options);
8084
+ return options;
7213
8085
  }
7214
8086
  multiCheckboxVisibleOptions(col) {
7215
- const query = this.norm(this.multiCheckboxSearch[col.field]);
8087
+ const field = col.field;
8088
+ const query = this.norm(this.multiCheckboxSearch[field]);
8089
+ const cacheKey = JSON.stringify([field, query]);
8090
+ const cached = this.multiCheckboxVisibleOptionsCache.get(cacheKey);
8091
+ if (cached)
8092
+ return cached;
7216
8093
  const options = this.multiCheckboxOptions(col);
7217
- if (!query)
8094
+ if (!query) {
8095
+ this.multiCheckboxVisibleOptionsCache.set(cacheKey, options);
7218
8096
  return options;
7219
- return options.filter((option) => this.norm(option.label).includes(query));
8097
+ }
8098
+ const visible = options.filter((option) => this.norm(option.label).includes(query));
8099
+ this.multiCheckboxVisibleOptionsCache.set(cacheKey, visible);
8100
+ return visible;
7220
8101
  }
7221
8102
  multiCheckboxValueLabel(col, value) {
7222
8103
  if (this.getColumnFilterType(col) === 'boolean')
@@ -7391,11 +8272,9 @@ class Datagrid {
7391
8272
  const copy = [...this.filtered];
7392
8273
  const { active, direction } = this.sort;
7393
8274
  copy.sort((a, b) => {
7394
- const av = a?.[active];
7395
- const bv = b?.[active];
7396
- const cmp = typeof av === 'string' && typeof bv === 'string'
7397
- ? av.localeCompare(bv, undefined, { numeric: true, sensitivity: 'base' })
7398
- : av < bv ? -1 : av > bv ? 1 : 0;
8275
+ const av = this.readFieldValue(a, active);
8276
+ const bv = this.readFieldValue(b, active);
8277
+ const cmp = this.compareSortValues(av, bv);
7399
8278
  return direction === 'asc' ? cmp : -cmp;
7400
8279
  });
7401
8280
  return copy;
@@ -7428,6 +8307,11 @@ class Datagrid {
7428
8307
  }
7429
8308
  get paged() {
7430
8309
  if (this.pagedDirty) {
8310
+ if (this.isGroupingActive()) {
8311
+ this.ensureRenderRows();
8312
+ this.pagedDirty = false;
8313
+ return this.pagedCache;
8314
+ }
7431
8315
  if (this.shouldUseLocalDataOperations()) {
7432
8316
  this.pagedCache = this.localDataOperationsResult(this.paginationActive).data;
7433
8317
  this.pagedDirty = false;
@@ -7444,6 +8328,13 @@ class Datagrid {
7444
8328
  }
7445
8329
  return this.pagedCache;
7446
8330
  }
8331
+ get renderRows() {
8332
+ this.ensureRenderRows();
8333
+ return this.renderRowsCache;
8334
+ }
8335
+ hasRenderableRows() {
8336
+ return this.renderRows.length > 0;
8337
+ }
7447
8338
  shouldUseLocalDataOperations() {
7448
8339
  if (!this.dataOperations)
7449
8340
  return false;
@@ -7455,11 +8346,137 @@ class Datagrid {
7455
8346
  return ngbApplyDataGridOperations(this.data, {
7456
8347
  ...options,
7457
8348
  state: this.dataState(),
8349
+ groupedData: options.groupedData ?? this.groupedData,
7458
8350
  columns: options.columns ?? this.resolvedColumns,
7459
8351
  globalFilterFields: options.globalFilterFields ?? this.resolvedColumns.map((column) => column.field),
7460
8352
  page,
7461
8353
  });
7462
8354
  }
8355
+ usingProvidedGroupedData() {
8356
+ return (this.groupedData?.length ?? 0) > 0;
8357
+ }
8358
+ groupingResults(rows) {
8359
+ if (this.usingProvidedGroupedData()) {
8360
+ return this.cloneGroupResults(this.groupedData);
8361
+ }
8362
+ if (this.shouldUseLocalDataOperations()) {
8363
+ return this.localDataOperationsResult(false).groupedData ?? [];
8364
+ }
8365
+ return ngbGroupData(rows, this.group);
8366
+ }
8367
+ ensureRenderRows() {
8368
+ if (!this.renderRowsDirty)
8369
+ return;
8370
+ if (!this.isGroupingActive()) {
8371
+ const leafRows = this.shouldUseLocalDataOperations()
8372
+ ? this.localDataOperationsResult(this.paginationActive).data
8373
+ : (!this.paginationActive || this.isServerBound())
8374
+ ? this.sorted
8375
+ : this.sorted.slice((this.page - 1) * this.pageSize, (this.page - 1) * this.pageSize + this.pageSize);
8376
+ this.pagedCache = leafRows;
8377
+ this.renderRowsCache = leafRows.map((row, pagedIndex) => ({
8378
+ kind: 'data',
8379
+ key: this.trackRow(pagedIndex, row),
8380
+ row,
8381
+ pagedIndex,
8382
+ level: 0,
8383
+ }));
8384
+ this.groupRenderRowLookup.clear();
8385
+ this.groupFooterRenderRowLookup.clear();
8386
+ this.renderRowsDirty = false;
8387
+ this.pagedDirty = false;
8388
+ return;
8389
+ }
8390
+ const rows = this.groupingSourceRows();
8391
+ const groups = this.groupingResults(rows);
8392
+ const groupLeafCount = rows.length;
8393
+ const shouldSliceGroups = this.paginationActive && !this.isServerBound() && !this.usingProvidedGroupedData();
8394
+ const pageStart = shouldSliceGroups ? Math.max(0, (this.page - 1) * this.pageSize) : 0;
8395
+ const pageEnd = shouldSliceGroups ? pageStart + this.pageSize : groupLeafCount;
8396
+ let absoluteLeafIndex = 0;
8397
+ let pagedIndex = 0;
8398
+ const leafRows = [];
8399
+ const buildRows = (items, level) => {
8400
+ const rowsForLevel = [];
8401
+ for (const group of items) {
8402
+ const groupStart = absoluteLeafIndex;
8403
+ const collapsed = this.isGroupCollapsed(group, level, groupStart);
8404
+ const childRows = [];
8405
+ if (!collapsed) {
8406
+ for (const item of group.items) {
8407
+ if (this.isGroupResult(item)) {
8408
+ childRows.push(...buildRows([item], level + 1));
8409
+ continue;
8410
+ }
8411
+ const inPage = absoluteLeafIndex >= pageStart && absoluteLeafIndex < pageEnd;
8412
+ if (inPage) {
8413
+ leafRows.push(item);
8414
+ childRows.push({
8415
+ kind: 'data',
8416
+ key: this.trackRow(pagedIndex, item),
8417
+ row: item,
8418
+ pagedIndex,
8419
+ level: level + 1,
8420
+ });
8421
+ pagedIndex += 1;
8422
+ }
8423
+ absoluteLeafIndex += 1;
8424
+ }
8425
+ }
8426
+ else {
8427
+ absoluteLeafIndex += group.count;
8428
+ }
8429
+ const groupEnd = groupStart + group.count;
8430
+ if (groupEnd > pageStart && groupStart < pageEnd) {
8431
+ rowsForLevel.push({
8432
+ kind: 'group',
8433
+ key: this.groupKeyFor(group, level, groupStart),
8434
+ group,
8435
+ collapsed,
8436
+ level,
8437
+ startIndex: groupStart,
8438
+ });
8439
+ if (!collapsed) {
8440
+ rowsForLevel.push(...childRows);
8441
+ if (this.showGroupFooters()) {
8442
+ rowsForLevel.push({
8443
+ kind: 'group-footer',
8444
+ key: `${this.groupKeyFor(group, level, groupStart)}:footer`,
8445
+ group,
8446
+ level,
8447
+ startIndex: groupStart,
8448
+ });
8449
+ }
8450
+ }
8451
+ }
8452
+ }
8453
+ return rowsForLevel;
8454
+ };
8455
+ const renderedRows = buildRows(groups, 0);
8456
+ this.pagedCache = leafRows;
8457
+ this.renderRowsCache = renderedRows;
8458
+ this.rebuildGroupedRowLookups(renderedRows);
8459
+ this.renderRowsDirty = false;
8460
+ this.pagedDirty = false;
8461
+ }
8462
+ rebuildGroupedRowLookups(rows) {
8463
+ this.groupRenderRowLookup.clear();
8464
+ this.groupFooterRenderRowLookup.clear();
8465
+ for (const row of rows) {
8466
+ if (row.kind === 'group') {
8467
+ this.groupRenderRowLookup.set(row.key, row);
8468
+ }
8469
+ else if (row.kind === 'group-footer') {
8470
+ this.groupFooterRenderRowLookup.set(row.key, row);
8471
+ }
8472
+ }
8473
+ }
8474
+ groupingSourceRows() {
8475
+ if (this.shouldUseLocalDataOperations()) {
8476
+ return this.localDataOperationsResult(false).data;
8477
+ }
8478
+ return this.sorted;
8479
+ }
7463
8480
  // getters for template conditions / display
7464
8481
  get anyFilterable() {
7465
8482
  if (this.resolvedFilterMode() !== 'row')
@@ -7537,6 +8554,7 @@ class Datagrid {
7537
8554
  skip: Math.max(0, (this.page - 1) * this.pageSize),
7538
8555
  pageSize: this.pageSize,
7539
8556
  sort,
8557
+ group: [...this.group],
7540
8558
  filter: this.cloneComposite(this.effectiveFilterDescriptor()),
7541
8559
  globalFilter: this.currentGlobalFilterValue(),
7542
8560
  };
@@ -7567,6 +8585,10 @@ class Datagrid {
7567
8585
  this.sort = firstSort?.field && firstSort.direction
7568
8586
  ? { active: firstSort.field, direction: firstSort.direction }
7569
8587
  : { active: null, direction: '' };
8588
+ if (state.group !== undefined) {
8589
+ this._group = this.normalizeGroupDescriptors(state.group);
8590
+ this.syncCollapsedGroups();
8591
+ }
7570
8592
  if (state.filter !== undefined) {
7571
8593
  this.localFilter = this.cloneComposite(state.filter ?? { logic: 'and', filters: [] });
7572
8594
  this.syncLegacyFilters(this.localFilter);
@@ -7590,6 +8612,133 @@ class Datagrid {
7590
8612
  if (this.headerScroller?.nativeElement) {
7591
8613
  this.headerScroller.nativeElement.scrollLeft = left;
7592
8614
  }
8615
+ this.scheduleStickyGroupSync();
8616
+ }
8617
+ onWindowResize() {
8618
+ this.scheduleStickyGroupSync();
8619
+ }
8620
+ scheduleStickyGroupSync() {
8621
+ if (!this.showStickyGroupHeaders() && !this.showStickyGroupFooters()) {
8622
+ if (this.stickyGroupHeaderRows.length ||
8623
+ this.stickyGroupFooterRows.length ||
8624
+ this.stickyGroupOverlayColumnWidths.length ||
8625
+ this.stickyGroupHeaderTranslateY !== 0 ||
8626
+ this.stickyGroupFooterTranslateY !== 0) {
8627
+ this.stickyGroupHeaderRows = [];
8628
+ this.stickyGroupFooterRows = [];
8629
+ this.stickyGroupOverlayColumnWidths = [];
8630
+ this.stickyGroupHeaderTranslateY = 0;
8631
+ this.stickyGroupFooterTranslateY = 0;
8632
+ this.cdr.markForCheck();
8633
+ }
8634
+ return;
8635
+ }
8636
+ if (this.stickyGroupSyncQueued)
8637
+ return;
8638
+ this.stickyGroupSyncQueued = true;
8639
+ Promise.resolve().then(() => {
8640
+ const raf = typeof requestAnimationFrame === 'function'
8641
+ ? requestAnimationFrame
8642
+ : (callback) => setTimeout(() => callback(Date.now()), 16);
8643
+ raf(() => {
8644
+ this.stickyGroupSyncQueued = false;
8645
+ this.syncStickyGroupOverlays();
8646
+ });
8647
+ });
8648
+ }
8649
+ syncStickyGroupOverlays() {
8650
+ this.ensureRenderRows();
8651
+ const scroller = this.bodyScroller?.nativeElement;
8652
+ if (!scroller || !this.isGroupingActive()) {
8653
+ this.stickyGroupHeaderRows = [];
8654
+ this.stickyGroupFooterRows = [];
8655
+ this.stickyGroupOverlayColumnWidths = [];
8656
+ this.stickyGroupHeaderTranslateY = 0;
8657
+ this.stickyGroupFooterTranslateY = 0;
8658
+ this.cdr.markForCheck();
8659
+ return;
8660
+ }
8661
+ const mainTable = scroller.querySelector('table.grid-body--main');
8662
+ this.stickyGroupOverlayColumnWidths = Array.from(mainTable?.querySelectorAll('colgroup col') ?? []).map((col) => {
8663
+ const explicit = parseFloat(col.style.width || '');
8664
+ if (Number.isFinite(explicit) && explicit > 0)
8665
+ return explicit;
8666
+ const width = col.getBoundingClientRect().width;
8667
+ return Number.isFinite(width) && width > 0 ? width : 0;
8668
+ });
8669
+ const scrollerRect = scroller.getBoundingClientRect();
8670
+ const headerMeasurements = this.collectStickyGroupMeasurements(scroller.querySelectorAll('table.grid-body--main tbody > tr.grid-group-row[data-group-key]'), this.groupRenderRowLookup);
8671
+ const footerMeasurements = this.collectStickyGroupMeasurements(scroller.querySelectorAll('table.grid-body--main tbody > tr.grid-group-footer-row[data-group-key]'), this.groupFooterRenderRowLookup);
8672
+ const stickyHeaders = this.showStickyGroupHeaders()
8673
+ ? this.resolveStickyHeaderRows(headerMeasurements, scrollerRect.top)
8674
+ : [];
8675
+ const stickyFooters = this.showStickyGroupFooters()
8676
+ ? this.resolveStickyFooterRows(stickyHeaders, footerMeasurements, scrollerRect.bottom)
8677
+ : [];
8678
+ const stickyFooterMeasurements = stickyFooters
8679
+ .map((row) => footerMeasurements.find((measurement) => measurement.key === row.key))
8680
+ .filter(Boolean);
8681
+ this.stickyGroupHeaderRows = stickyHeaders;
8682
+ this.stickyGroupFooterRows = stickyFooters;
8683
+ this.stickyGroupHeaderTranslateY = stickyHeaders.length ? scroller.scrollTop : 0;
8684
+ this.stickyGroupFooterTranslateY = stickyFooters.length
8685
+ ? Math.max(0, scroller.scrollTop + scroller.clientHeight - this.measurementStackHeight(stickyFooterMeasurements))
8686
+ : 0;
8687
+ this.cdr.markForCheck();
8688
+ }
8689
+ collectStickyGroupMeasurements(nodes, lookup) {
8690
+ const measurements = [];
8691
+ for (const node of Array.from(nodes)) {
8692
+ const key = node.getAttribute('data-group-key') ?? '';
8693
+ const row = lookup.get(key);
8694
+ if (!row)
8695
+ continue;
8696
+ const rect = node.getBoundingClientRect();
8697
+ measurements.push({
8698
+ key: row.key,
8699
+ level: row.level,
8700
+ startIndex: row.startIndex,
8701
+ endIndex: row.startIndex + row.group.count,
8702
+ top: rect.top,
8703
+ bottom: rect.bottom,
8704
+ height: rect.height,
8705
+ row,
8706
+ });
8707
+ }
8708
+ return measurements;
8709
+ }
8710
+ resolveStickyHeaderRows(measurements, scrollerTop) {
8711
+ const active = [];
8712
+ let parentRange = null;
8713
+ let threshold = scrollerTop;
8714
+ for (let level = 0; level < this.group.length; level++) {
8715
+ const matches = measurements.filter((measurement) => measurement.level === level &&
8716
+ (!parentRange || (measurement.startIndex >= parentRange.start && measurement.startIndex < parentRange.end)) &&
8717
+ measurement.top < threshold - 0.5);
8718
+ const match = matches.length ? matches[matches.length - 1] : null;
8719
+ if (!match)
8720
+ break;
8721
+ active.push(match.row);
8722
+ parentRange = { start: match.startIndex, end: match.endIndex };
8723
+ threshold += match.height;
8724
+ }
8725
+ return active;
8726
+ }
8727
+ resolveStickyFooterRows(stickyHeaders, measurements, scrollerBottom) {
8728
+ const active = [];
8729
+ for (const stickyHeader of stickyHeaders) {
8730
+ const footerKey = `${stickyHeader.key}:footer`;
8731
+ const match = measurements.find((measurement) => measurement.key === footerKey);
8732
+ if (!match)
8733
+ continue;
8734
+ if (match.top > scrollerBottom + 0.5) {
8735
+ active.push(match.row);
8736
+ }
8737
+ }
8738
+ return active;
8739
+ }
8740
+ measurementStackHeight(measurements) {
8741
+ return measurements.reduce((total, measurement) => total + measurement.height, 0);
7593
8742
  }
7594
8743
  get isHeaderSticky() {
7595
8744
  return this.stickyHeaderEnabled && this.shouldEnableScroll;
@@ -7701,13 +8850,26 @@ class Datagrid {
7701
8850
  return this.editingIndex === pagedIndex;
7702
8851
  }
7703
8852
  onCellClick(ev, pagedIndex, col) {
8853
+ this.tryStartIncellEdit(ev, pagedIndex, col);
8854
+ }
8855
+ onCellMouseDown(ev, pagedIndex, col) {
8856
+ if (ev.button !== 0)
8857
+ return;
8858
+ this.tryStartIncellEdit(ev, pagedIndex, col);
8859
+ }
8860
+ tryStartIncellEdit(ev, pagedIndex, col) {
7704
8861
  if (!this.isIncellEditMode() || !this.enableEdit)
7705
8862
  return;
7706
8863
  const row = this.paged[pagedIndex];
7707
8864
  if (!this.isCellEditable(col, row, false))
7708
8865
  return;
7709
- const el = ev.target;
7710
- if (el.closest('button, a, input, select, textarea, label, .no-edit-trigger'))
8866
+ const target = ev.target;
8867
+ const el = target instanceof Element
8868
+ ? target
8869
+ : target instanceof Node
8870
+ ? target.parentElement
8871
+ : null;
8872
+ if (el?.closest('button, a, input, select, textarea, label, .no-edit-trigger'))
7711
8873
  return;
7712
8874
  if (this.isCellInEditMode(pagedIndex, col))
7713
8875
  return;
@@ -7764,10 +8926,13 @@ class Datagrid {
7764
8926
  this.addingNew = false;
7765
8927
  this.editingIndex = pagedIndex;
7766
8928
  this.editingCell = { rowIndex: pagedIndex, field };
7767
- this.editForm = this.buildFormFromRow(this.paged[pagedIndex]);
8929
+ const colIndex = this.visibleColumns.findIndex((col) => col.field === field);
8930
+ if (colIndex >= 0) {
8931
+ this.focusedCell = { rowIndex: pagedIndex, colIndex };
8932
+ }
8933
+ this.editForm = this.buildFormFromRow(this.toDraftValues(this.paged[pagedIndex]));
7768
8934
  this.saveAttemptedEdit = false;
7769
- this.cdr.markForCheck();
7770
- queueMicrotask(() => this.focusInlineEditor(field));
8935
+ this.scheduleViewRefresh(() => this.focusInlineEditor(field));
7771
8936
  }
7772
8937
  focusInlineEditor(preferredField) {
7773
8938
  const root = this.hostEl?.nativeElement;
@@ -7798,7 +8963,7 @@ class Datagrid {
7798
8963
  const original = this.data[di];
7799
8964
  const rowId = this.getRowId(di, original);
7800
8965
  const service = this.getEditService();
7801
- const updated = service.assignValues(original, { ...original, [field]: control?.value });
8966
+ const updated = service.assignValues(original, this.patchFieldValue(field, control?.value));
7802
8967
  const next = service.update(this.data ?? [], updated, di, rowId);
7803
8968
  this.data = service.saveChanges(next, di, rowId, updated);
7804
8969
  this.invalidateDataCaches();
@@ -7809,7 +8974,7 @@ class Datagrid {
7809
8974
  this.editForm = this.fb.group({});
7810
8975
  this.saveAttemptedEdit = false;
7811
8976
  }
7812
- this.cdr.markForCheck();
8977
+ this.scheduleViewRefresh();
7813
8978
  return true;
7814
8979
  }
7815
8980
  cancelIncellEdit() {
@@ -7823,7 +8988,7 @@ class Datagrid {
7823
8988
  this.editingIndex = null;
7824
8989
  this.editForm = this.fb.group({});
7825
8990
  this.saveAttemptedEdit = false;
7826
- this.cdr.markForCheck();
8991
+ this.scheduleViewRefresh();
7827
8992
  }
7828
8993
  getSingleSelectedPagedIndex() {
7829
8994
  const selected = this.paged
@@ -7853,11 +9018,10 @@ class Datagrid {
7853
9018
  this.externalDialogFocusedOnce = false;
7854
9019
  this.externalEditIsNew = false;
7855
9020
  this.externalEditPagedIndex = pagedIndex;
7856
- this.externalForm = this.buildFormFromRow(this.paged[pagedIndex]);
9021
+ this.externalForm = this.buildFormFromRow(this.toDraftValues(this.paged[pagedIndex]));
7857
9022
  this.saveAttemptedExternal = false;
7858
9023
  this.externalEditOpen = true;
7859
- this.cdr.markForCheck();
7860
- queueMicrotask(() => this.focusExternalDialogFirstField());
9024
+ this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
7861
9025
  }
7862
9026
  openExternalAdd() {
7863
9027
  this.externalDialogOpener = document.activeElement ?? null;
@@ -7868,11 +9032,10 @@ class Datagrid {
7868
9032
  this.saveAttemptedExternal = false;
7869
9033
  this.externalEditOpen = true;
7870
9034
  const service = this.getEditService();
7871
- const draft = service.assignValues({}, this.externalForm.value);
9035
+ const draft = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
7872
9036
  this.addDraftRowId = Symbol('ngb-datagrid-new-row');
7873
9037
  service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
7874
- this.cdr.markForCheck();
7875
- queueMicrotask(() => this.focusExternalDialogFirstField());
9038
+ this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
7876
9039
  }
7877
9040
  saveExternalEdit() {
7878
9041
  if (!this.externalEditOpen)
@@ -7884,7 +9047,7 @@ class Datagrid {
7884
9047
  return;
7885
9048
  const service = this.getEditService();
7886
9049
  if (this.externalEditIsNew) {
7887
- const newRow = service.assignValues({}, this.externalForm.value);
9050
+ const newRow = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
7888
9051
  const rowIndex = this.data.length;
7889
9052
  const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
7890
9053
  service.create(this.data ?? [], newRow, rowIndex, rowId);
@@ -7896,7 +9059,7 @@ class Datagrid {
7896
9059
  const di = this.dataIndexOf(this.paged[pagedIndex]);
7897
9060
  const original = this.data[di];
7898
9061
  const rowId = this.getRowId(di, original);
7899
- const updated = service.assignValues(original, this.externalForm.value);
9062
+ const updated = this.assignDraftValues(original, this.formDraftValues(this.externalForm));
7900
9063
  const next = service.update(this.data ?? [], updated, di, rowId);
7901
9064
  this.data = service.saveChanges(next, di, rowId, updated);
7902
9065
  this.invalidateDataCaches();
@@ -8119,6 +9282,8 @@ class Datagrid {
8119
9282
  return side ? `column-pinned-${side}${col.locked ? ' column-locked' : ' column-sticky'}` : null;
8120
9283
  }
8121
9284
  get tableClassList() {
9285
+ if (this.tableClassListCache)
9286
+ return this.tableClassListCache;
8122
9287
  const opts = this.tableOptions || {};
8123
9288
  const cls = ['table'];
8124
9289
  if (opts.stripedRows)
@@ -8139,15 +9304,20 @@ class Datagrid {
8139
9304
  cls.push('align-middle');
8140
9305
  if (opts.align === 'bottom')
8141
9306
  cls.push('align-bottom');
9307
+ this.tableClassListCache = cls;
8142
9308
  return cls;
8143
9309
  }
8144
9310
  get responsiveWrapperClasses() {
9311
+ if (this.responsiveWrapperClassesCache)
9312
+ return this.responsiveWrapperClassesCache;
8145
9313
  const r = this.tableOptions?.responsive;
8146
- if (r === false)
8147
- return [];
8148
- if (r === true || r === undefined)
8149
- return ['table-responsive'];
8150
- return [`table-responsive-${r}`];
9314
+ const classes = r === false
9315
+ ? []
9316
+ : r === true || r === undefined
9317
+ ? ['table-responsive']
9318
+ : [`table-responsive-${r}`];
9319
+ this.responsiveWrapperClassesCache = classes;
9320
+ return classes;
8151
9321
  }
8152
9322
  get densityMode() {
8153
9323
  return this.tableOptions?.density ?? 'comfortable';
@@ -8166,11 +9336,19 @@ class Datagrid {
8166
9336
  return col.stackedGroup ?? 'start';
8167
9337
  }
8168
9338
  stackedColumnsInGroup(group) {
8169
- return this.visibleColumns.filter((col) => this.stackedGroupFor(col) === group);
9339
+ const cached = this.stackedColumnsCache.get(group);
9340
+ if (cached)
9341
+ return cached;
9342
+ const columns = this.visibleColumns.filter((col) => this.stackedGroupFor(col) === group);
9343
+ this.stackedColumnsCache.set(group, columns);
9344
+ return columns;
8170
9345
  }
8171
9346
  stackedCardGroups() {
9347
+ if (this.stackedCardGroupsCache)
9348
+ return this.stackedCardGroupsCache;
8172
9349
  const order = ['start', 'center', 'end'];
8173
- return order.filter((group) => this.stackedColumnsInGroup(group).length > 0);
9350
+ this.stackedCardGroupsCache = order.filter((group) => this.stackedColumnsInGroup(group).length > 0);
9351
+ return this.stackedCardGroupsCache;
8174
9352
  }
8175
9353
  visibleColumnIndex(col) {
8176
9354
  return this.visibleColumns.findIndex((item) => item.field === col.field);
@@ -8250,7 +9428,7 @@ class Datagrid {
8250
9428
  }
8251
9429
  updateHighlightCache() {
8252
9430
  this.highlightRowMap.clear();
8253
- (this.highlightedIndex || []).forEach(item => {
9431
+ (this.highlightedIndex || []).forEach((item) => {
8254
9432
  const rowKey = item.row;
8255
9433
  if (!this.highlightRowMap.has(rowKey))
8256
9434
  this.highlightRowMap.set(rowKey, []);
@@ -8261,16 +9439,16 @@ class Datagrid {
8261
9439
  return (col.header ?? col.field ?? '').toString();
8262
9440
  }
8263
9441
  headerTitle(col) {
8264
- const t = col?.title;
9442
+ const t = col.title;
8265
9443
  return (t ?? this.headerText(col)) ?? '';
8266
9444
  }
8267
9445
  cellTitle(row, col) {
8268
- const def = col?.cellTitle;
9446
+ const def = col.cellTitle;
8269
9447
  if (typeof def === 'function')
8270
9448
  return def(row) ?? '';
8271
9449
  if (typeof def === 'string')
8272
9450
  return def;
8273
- const val = row?.[col.field];
9451
+ const val = this.readFieldValue(row, col.field);
8274
9452
  return val === undefined || val === null ? '' : String(val);
8275
9453
  }
8276
9454
  columnFilterAriaLabel(col) {
@@ -8526,8 +9704,7 @@ class Datagrid {
8526
9704
  const sticky = [];
8527
9705
  const rest = [];
8528
9706
  rows.forEach(r => {
8529
- const di = this.dataIndexOf(r);
8530
- const id = this.getRowId(di >= 0 ? di : 0, r);
9707
+ const { id } = this.resolveRowMeta(r, 0);
8531
9708
  (this.stickyRowIds.has(id) ? sticky : rest).push(r);
8532
9709
  });
8533
9710
  return [...sticky, ...rest];
@@ -8563,6 +9740,8 @@ class Datagrid {
8563
9740
  filterTplQ;
8564
9741
  filterMenuTplQ;
8565
9742
  globalTplQ;
9743
+ groupHeaderColumnTplQ;
9744
+ groupFooterTplQ;
8566
9745
  gridColumnQ;
8567
9746
  /** Internal lookup maps */
8568
9747
  cellTpls = {};
@@ -8570,6 +9749,8 @@ class Datagrid {
8570
9749
  filterTpls = {};
8571
9750
  filterMenuTpls = {};
8572
9751
  globalTpl = null;
9752
+ groupHeaderColumnTpls = {};
9753
+ groupFooterTpls = {};
8573
9754
  warnedDeclarativeColumns = false;
8574
9755
  toRecord(items) {
8575
9756
  const arr = Array.isArray(items)
@@ -8631,6 +9812,8 @@ class Datagrid {
8631
9812
  this.filterTpls = this.toRecord(this.filterTplQ);
8632
9813
  this.filterMenuTpls = this.toRecord(this.filterMenuTplQ);
8633
9814
  this.globalTpl = this.globalTplQ?.first ?? null;
9815
+ this.groupHeaderColumnTpls = this.toRecord(this.groupHeaderColumnTplQ);
9816
+ this.groupFooterTpls = this.toRecord(this.groupFooterTplQ);
8634
9817
  this.syncColumnWidthOverrides(true);
8635
9818
  this.syncColumnOrder(true);
8636
9819
  this.validateColumnConfig();
@@ -8645,7 +9828,10 @@ class Datagrid {
8645
9828
  this.filterTplQ?.changes.subscribe(rebuild);
8646
9829
  this.filterMenuTplQ?.changes.subscribe(rebuild);
8647
9830
  this.globalTplQ?.changes.subscribe(rebuild);
9831
+ this.groupHeaderColumnTplQ?.changes.subscribe(rebuild);
9832
+ this.groupFooterTplQ?.changes.subscribe(rebuild);
8648
9833
  this.gridColumnQ?.changes.subscribe(rebuild);
9834
+ this.scheduleStickyGroupSync();
8649
9835
  }
8650
9836
  ngOnChanges(ch) {
8651
9837
  if (ch['state']) {
@@ -8684,6 +9870,7 @@ class Datagrid {
8684
9870
  if (ch['data'] || ch['columns'] || ch['labels'] || ch['locale'] || ch['dir']) {
8685
9871
  this.cdr.markForCheck();
8686
9872
  }
9873
+ this.scheduleStickyGroupSync();
8687
9874
  }
8688
9875
  resetEditingState() {
8689
9876
  this.editingCell = null;
@@ -8694,7 +9881,10 @@ class Datagrid {
8694
9881
  this.cdr.markForCheck();
8695
9882
  }
8696
9883
  getRowId(rowIndex, row) {
8697
- return this.trackBy ? this.trackBy(rowIndex, row) : rowIndex;
9884
+ return this.resolveRowMeta(row, rowIndex).id;
9885
+ }
9886
+ selectedDataRows() {
9887
+ return (this.data ?? []).filter((row, index) => this.selectedRowIds.has(this.getRowId(index, row)));
8698
9888
  }
8699
9889
  /** Apply selection ids and refresh checkbox UI (for programmatic / OnPush sync). */
8700
9890
  setSelectionIds(ids, options) {
@@ -8706,7 +9896,7 @@ class Datagrid {
8706
9896
  }
8707
9897
  if (options?.emit !== false) {
8708
9898
  this.selectionChange.emit({
8709
- selected: this.data.filter((row, idx) => this.selectedRowIds.has(this.getRowId(idx, row))),
9899
+ selected: this.selectedDataRows(),
8710
9900
  lastAction: null,
8711
9901
  });
8712
9902
  }
@@ -8725,6 +9915,7 @@ class Datagrid {
8725
9915
  }
8726
9916
  isRowReorderEnabled() {
8727
9917
  return this.rowReorderable &&
9918
+ !this.isGroupingActive() &&
8728
9919
  !this.sort.active &&
8729
9920
  !this.hasActiveFilters() &&
8730
9921
  !this.addingNew &&
@@ -8749,7 +9940,7 @@ class Datagrid {
8749
9940
  this.saveAttemptedNew = false;
8750
9941
  // Register a draft row with the edit service so implementations can track "new" state.
8751
9942
  const service = this.getEditService();
8752
- const draft = service.assignValues({}, this.addForm.value);
9943
+ const draft = this.assignDraftValues({}, this.formDraftValues(this.addForm));
8753
9944
  this.addDraftRowId = Symbol('ngb-datagrid-new-row');
8754
9945
  service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
8755
9946
  this.cdr.markForCheck();
@@ -8763,7 +9954,7 @@ class Datagrid {
8763
9954
  if (this.addForm.invalid)
8764
9955
  return;
8765
9956
  const service = this.getEditService();
8766
- const newRow = service.assignValues({}, this.addForm.value);
9957
+ const newRow = this.assignDraftValues({}, this.formDraftValues(this.addForm));
8767
9958
  const rowIndex = this.data.length;
8768
9959
  const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
8769
9960
  service.create(this.data ?? [], newRow, rowIndex, rowId);
@@ -8799,15 +9990,14 @@ class Datagrid {
8799
9990
  this.editingCell = null;
8800
9991
  this.editingIndex = i;
8801
9992
  const row = this.paged[i];
8802
- this.editForm = this.buildFormFromRow(this.paged[i]);
9993
+ this.editForm = this.buildFormFromRow(this.toDraftValues(row));
8803
9994
  this.saveAttemptedEdit = false;
8804
9995
  const di = this.dataIndexOf(row);
8805
9996
  const rowId = this.getRowId(di, this.data[di]);
8806
9997
  // Start tracking baseline for the row (service can snapshot original state).
8807
9998
  this.getEditService().update(this.data ?? [], this.data[di], di, rowId);
8808
9999
  this.rowEdit.emit({ row: this.data[di], index: di });
8809
- this.cdr.markForCheck();
8810
- queueMicrotask(() => this.focusInlineEditor());
10000
+ this.scheduleViewRefresh(() => this.focusInlineEditor());
8811
10001
  }
8812
10002
  saveEdit(i) {
8813
10003
  if (this.editingIndex !== i || !this.editForm)
@@ -8821,7 +10011,7 @@ class Datagrid {
8821
10011
  const original = this.data[di];
8822
10012
  const rowId = this.getRowId(di, original);
8823
10013
  const service = this.getEditService();
8824
- const updated = service.assignValues(original, this.editForm.value);
10014
+ const updated = this.assignDraftValues(original, this.formDraftValues(this.editForm));
8825
10015
  const next = service.update(this.data ?? [], updated, di, rowId);
8826
10016
  this.data = service.saveChanges(next, di, rowId, updated);
8827
10017
  this.invalidateDataCaches();
@@ -8845,7 +10035,7 @@ class Datagrid {
8845
10035
  onNewDraftChange(col) {
8846
10036
  if (this.draftNew) {
8847
10037
  const key = this.keyOf(col);
8848
- this.draftNew = this.getEditService().assignValues(this.draftNew, { [key]: this.draftNew[key] });
10038
+ this.draftNew = { ...this.draftNew, [key]: this.draftNew[key] };
8849
10039
  }
8850
10040
  this.validateInto(col, this.draftNew, this.errorsNew);
8851
10041
  }
@@ -8895,7 +10085,7 @@ class Datagrid {
8895
10085
  if (typeof key === 'function')
8896
10086
  return key(row, rowIndex);
8897
10087
  if (typeof key === 'string')
8898
- return row?.[key];
10088
+ return this.readFieldValue(row, key);
8899
10089
  return rowIndex;
8900
10090
  }
8901
10091
  colKeyValue(column, colIndex) {
@@ -8903,7 +10093,7 @@ class Datagrid {
8903
10093
  if (typeof key === 'function')
8904
10094
  return key(column, colIndex);
8905
10095
  if (typeof key === 'string')
8906
- return column?.[key];
10096
+ return this.readFieldValue(column, key);
8907
10097
  return colIndex;
8908
10098
  }
8909
10099
  isRowHighlighted(row, rowIndex) {
@@ -8960,8 +10150,7 @@ class Datagrid {
8960
10150
  this.syncFilterFormFromState();
8961
10151
  }
8962
10152
  onDocumentClick(event) {
8963
- const target = event.target;
8964
- const insideMenu = !!target?.closest('.grid-filter-menu-host, .grid-filter-operator, .grid-filter-operator-menu, .ngb-datagrid-floating-panel, .ngb-grid__filter-menu-overlay');
10153
+ const insideMenu = this.isEventInsideSelector(event, '.grid-filter-menu-host, .grid-filter-operator, .grid-filter-operator-menu, .ngb-datagrid-floating-panel, .ngb-grid__filter-menu-overlay');
8965
10154
  if (insideMenu) {
8966
10155
  return;
8967
10156
  }
@@ -8970,11 +10159,27 @@ class Datagrid {
8970
10159
  this.openRowFilterOperatorAnchor = null;
8971
10160
  if (this.isIncellEditMode()) {
8972
10161
  // Clicking outside the grid commits a valid in-cell edit and keeps invalid edits open.
8973
- if (!target?.closest('.ngb-grid')) {
10162
+ if (!this.isEventInsideSelector(event, '.ngb-grid')) {
8974
10163
  this.commitIncellEdit(true);
8975
10164
  }
8976
10165
  }
8977
10166
  }
10167
+ isEventInsideSelector(event, selector) {
10168
+ const path = typeof event.composedPath === 'function' ? event.composedPath() : [];
10169
+ for (const node of path) {
10170
+ if (node instanceof Element && node.closest(selector)) {
10171
+ return true;
10172
+ }
10173
+ }
10174
+ const target = event.target;
10175
+ if (target instanceof Element) {
10176
+ return !!target.closest(selector);
10177
+ }
10178
+ if (target instanceof Node) {
10179
+ return !!target.parentElement?.closest(selector);
10180
+ }
10181
+ return false;
10182
+ }
8978
10183
  canCancelToolbarEdit() {
8979
10184
  return this.isToolbarEditMode() && (this.editingIndex != null || this.externalEditOpen);
8980
10185
  }
@@ -9063,8 +10268,12 @@ class Datagrid {
9063
10268
  this.expanded.add(i); // open the clicked row, or close all if it was open
9064
10269
  }
9065
10270
  else {
9066
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
9067
- isOpen ? this.expanded.delete(i) : this.expanded.add(i);
10271
+ if (isOpen) {
10272
+ this.expanded.delete(i);
10273
+ }
10274
+ else {
10275
+ this.expanded.add(i);
10276
+ }
9068
10277
  }
9069
10278
  }
9070
10279
  isExpanded(i) {
@@ -9117,7 +10326,9 @@ class Datagrid {
9117
10326
  this.cdr.markForCheck();
9118
10327
  }
9119
10328
  asBool(v) {
9120
- return typeof v === 'boolean' ? v : !!v?.enabled;
10329
+ if (typeof v === 'boolean')
10330
+ return v;
10331
+ return typeof v === 'object' && v !== null && 'enabled' in v ? !!v.enabled : false;
9121
10332
  }
9122
10333
  triggerExport(kind) {
9123
10334
  this.export(kind);
@@ -9129,8 +10340,7 @@ class Datagrid {
9129
10340
  isRowSticky(row, pagedIndex) {
9130
10341
  if (!this.stickyRows)
9131
10342
  return false;
9132
- const di = this.dataIndexOf(row);
9133
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10343
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9134
10344
  return this.stickyRowIds.has(id);
9135
10345
  }
9136
10346
  toggleStickyRow(pagedIndex) {
@@ -9139,8 +10349,7 @@ class Datagrid {
9139
10349
  const row = this.paged[pagedIndex];
9140
10350
  if (!row)
9141
10351
  return;
9142
- const di = this.dataIndexOf(row);
9143
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10352
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9144
10353
  if (this.stickyRowIds.has(id))
9145
10354
  this.stickyRowIds.delete(id);
9146
10355
  else
@@ -9193,8 +10402,7 @@ class Datagrid {
9193
10402
  return this.selectionDisabledFn(row, di >= 0 ? di : pagedIndex);
9194
10403
  }
9195
10404
  isRowSelected(row, pagedIndex) {
9196
- const di = this.dataIndexOf(this.paged[pagedIndex]);
9197
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10405
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9198
10406
  return this.selectedRowIds.has(id);
9199
10407
  }
9200
10408
  toggleSelection(pagedIndex, event) {
@@ -9203,13 +10411,12 @@ class Datagrid {
9203
10411
  const row = this.paged[pagedIndex];
9204
10412
  if (!row || this.isSelectionDisabled(row, pagedIndex))
9205
10413
  return;
9206
- const di = this.dataIndexOf(row);
9207
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10414
+ const { index: resolvedIndex, id } = this.resolveRowMeta(row, pagedIndex);
10415
+ const di = resolvedIndex >= 0 ? resolvedIndex : pagedIndex;
9208
10416
  const currentlySelected = this.selectedRowIds.has(id);
9209
10417
  const isMulti = this.selectionMode === 'multiple';
9210
10418
  const desktop = this.selectionKeyMode === 'desktop';
9211
- const shift = desktop && !!(event && 'shiftKey' in event && event.shiftKey);
9212
- const meta = desktop && !!(event && (('metaKey' in event && event.metaKey) || ('ctrlKey' in event && event.ctrlKey)));
10419
+ const { shift, meta } = this.readModifierKeys(event);
9213
10420
  const fromCheckbox = !!(event?.target instanceof HTMLInputElement && event.target.type === 'checkbox');
9214
10421
  if (!isMulti) {
9215
10422
  this.selectedRowIds.clear();
@@ -9227,7 +10434,7 @@ class Datagrid {
9227
10434
  const r = this.paged[i];
9228
10435
  if (!r || this.isSelectionDisabled(r, i))
9229
10436
  continue;
9230
- const rid = this.getRowId(this.dataIndexOf(r), r);
10437
+ const { id: rid } = this.resolveRowMeta(r, i);
9231
10438
  this.selectedRowIds.add(rid);
9232
10439
  }
9233
10440
  this.emitSelection(row, di, true);
@@ -9250,7 +10457,7 @@ class Datagrid {
9250
10457
  }
9251
10458
  emitSelection(row, dataIndex, selected) {
9252
10459
  this.selectionChange.emit({
9253
- selected: this.data.filter((r, idx) => this.selectedRowIds.has(this.getRowId(idx, r))),
10460
+ selected: this.selectedDataRows(),
9254
10461
  lastAction: { row, index: dataIndex, selected }
9255
10462
  });
9256
10463
  }
@@ -9261,30 +10468,55 @@ class Datagrid {
9261
10468
  const allSelected = allSelectable.every((r, i) => this.isRowSelected(r, i));
9262
10469
  if (allSelected) {
9263
10470
  allSelectable.forEach((r, i) => {
9264
- const rid = this.getRowId(this.dataIndexOf(r), r);
10471
+ const { id: rid } = this.resolveRowMeta(r, i);
9265
10472
  this.selectedRowIds.delete(rid);
9266
10473
  });
9267
10474
  }
9268
10475
  else {
9269
10476
  allSelectable.forEach((r, i) => {
9270
- const rid = this.getRowId(this.dataIndexOf(r), r);
10477
+ const { id: rid } = this.resolveRowMeta(r, i);
9271
10478
  this.selectedRowIds.add(rid);
9272
10479
  });
9273
10480
  }
9274
10481
  this.selectionChange.emit({
9275
- selected: this.data.filter((r, idx) => this.selectedRowIds.has(this.getRowId(idx, r))),
10482
+ selected: this.selectedDataRows(),
9276
10483
  lastAction: null
9277
10484
  });
9278
10485
  this.cdr.markForCheck();
9279
10486
  }
9280
10487
  isPageAllSelected() {
9281
- const selectable = this.paged.filter((r, i) => !this.isSelectionDisabled(r, i));
9282
- return selectable.length > 0 && selectable.every((r, i) => this.isRowSelected(r, i));
10488
+ let selectableCount = 0;
10489
+ for (let index = 0; index < this.paged.length; index++) {
10490
+ const row = this.paged[index];
10491
+ if (!row)
10492
+ continue;
10493
+ if (this.isSelectionDisabled(row, index))
10494
+ return false;
10495
+ selectableCount++;
10496
+ if (!this.isRowSelected(row, index))
10497
+ return false;
10498
+ }
10499
+ return selectableCount > 0;
9283
10500
  }
9284
10501
  isPageIndeterminate() {
9285
- const selectable = this.paged.filter((r, i) => !this.isSelectionDisabled(r, i));
9286
- const selectedCount = selectable.filter((r, i) => this.isRowSelected(r, i)).length;
9287
- return selectedCount > 0 && selectedCount < selectable.length;
10502
+ let selectableCount = 0;
10503
+ let selectedCount = 0;
10504
+ let hasDisabledRows = false;
10505
+ for (let index = 0; index < this.paged.length; index++) {
10506
+ const row = this.paged[index];
10507
+ if (!row)
10508
+ continue;
10509
+ if (this.isSelectionDisabled(row, index)) {
10510
+ hasDisabledRows = true;
10511
+ continue;
10512
+ }
10513
+ selectableCount++;
10514
+ if (this.isRowSelected(row, index))
10515
+ selectedCount++;
10516
+ }
10517
+ if (selectedCount === 0)
10518
+ return false;
10519
+ return selectedCount < selectableCount || hasDisabledRows;
9288
10520
  }
9289
10521
  selectAllLabel() {
9290
10522
  const labels = this.selectionA11yLabels || {};
@@ -9313,11 +10545,11 @@ class Datagrid {
9313
10545
  this.toggleSelection(pagedIndex, ev);
9314
10546
  }
9315
10547
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
9316
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: Datagrid, isStandalone: true, selector: "ngb-datagrid", inputs: { columns: "columns", data: "data", loading: "loading", total: "total", enableSorting: "enableSorting", enableFiltering: "enableFiltering", filterable: "filterable", enableGlobalFilter: "enableGlobalFilter", filterMode: "filterMode", filter: "filter", filterOperators: "filterOperators", filterManual: "filterManual", externalFiltering: "externalFiltering", dataOperations: "dataOperations", state: "state", multiCheckboxFilterOptions: "multiCheckboxFilterOptions", enablePagination: "enablePagination", pageable: "pageable", enableEdit: "enableEdit", enableDelete: "enableDelete", pageSizeOptions: "pageSizeOptions", enableAdd: "enableAdd", addButtonAriaLabel: "addButtonAriaLabel", addButtonText: "addButtonText", stickyRows: "stickyRows", stickyHeader: "stickyHeader", stickyFooter: "stickyFooter", scrollable: "scrollable", stickyRowHeight: "stickyRowHeight", stickyHeaderHeight: "stickyHeaderHeight", stickyFooterHeight: "stickyFooterHeight", tableOptions: "tableOptions", dataLayoutMode: "dataLayoutMode", selectionMode: "selectionMode", selectionBehavior: "selectionBehavior", selectionKeyMode: "selectionKeyMode", selectAllEnabled: "selectAllEnabled", selectionA11yLabels: "selectionA11yLabels", selectionDisabledFn: "selectionDisabledFn", highlightedIndex: "highlightedIndex", highlightRowKey: "highlightRowKey", highlightColKey: "highlightColKey", globalFilterAriaLabel: "globalFilterAriaLabel", globalFilterPlaceholder: "globalFilterPlaceholder", searchHighlightTerm: "searchHighlightTerm", searchHighlightFields: "searchHighlightFields", expandRowAriaLabel: "expandRowAriaLabel", collapseRowAriaLabel: "collapseRowAriaLabel", exportPdfAriaLabel: "exportPdfAriaLabel", exportExcelAriaLabel: "exportExcelAriaLabel", newRowDefaults: "newRowDefaults", strictEmail: "strictEmail", editOnRowClick: "editOnRowClick", editMode: "editMode", toolbarEditHint: "toolbarEditHint", singleExpand: "singleExpand", exportOptions: "exportOptions", theme: "theme", responsive: "responsive", trackBy: "trackBy", rowClass: "rowClass", rowStyle: "rowStyle", rowReorderable: "rowReorderable", columnReorderable: "columnReorderable", resizable: "resizable", actionDisplay: "actionDisplay", showStickyRowBadge: "showStickyRowBadge", stickyRowBadgeField: "stickyRowBadgeField", stickyRowBadgeLabel: "stickyRowBadgeLabel", labels: "labels", locale: "locale", dir: "dir", keyboardNavigation: "keyboardNavigation", editService: "editService", dataProviderAll: "dataProviderAll", dataProviderSelection: "dataProviderSelection", pageSize: "pageSize" }, outputs: { rowAdd: "rowAdd", rowEdit: "rowEdit", rowSave: "rowSave", rowCancel: "rowCancel", rowDelete: "rowDelete", sortChange: "sortChange", filterChange: "filterChange", filtersChange: "filtersChange", pageChange: "pageChange", dataStateChange: "dataStateChange", selectionChange: "selectionChange", rowReorder: "rowReorder", columnReorder: "columnReorder" }, host: { listeners: { "document:mousemove": "onDocumentMouseMove($event)", "document:mouseup": "onDocumentMouseUp()", "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey()" } }, providers: [
10548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: Datagrid, isStandalone: true, selector: "ngb-datagrid", inputs: { columns: "columns", data: "data", loading: "loading", total: "total", enableSorting: "enableSorting", enableFiltering: "enableFiltering", filterable: "filterable", enableGlobalFilter: "enableGlobalFilter", filterMode: "filterMode", filter: "filter", filterOperators: "filterOperators", filterManual: "filterManual", externalFiltering: "externalFiltering", dataOperations: "dataOperations", groupable: "groupable", group: "group", groupedData: "groupedData", state: "state", multiCheckboxFilterOptions: "multiCheckboxFilterOptions", enablePagination: "enablePagination", pageable: "pageable", enableEdit: "enableEdit", enableDelete: "enableDelete", pageSizeOptions: "pageSizeOptions", enableAdd: "enableAdd", addButtonAriaLabel: "addButtonAriaLabel", addButtonText: "addButtonText", stickyRows: "stickyRows", stickyHeader: "stickyHeader", stickyFooter: "stickyFooter", scrollable: "scrollable", stickyRowHeight: "stickyRowHeight", stickyHeaderHeight: "stickyHeaderHeight", stickyFooterHeight: "stickyFooterHeight", tableOptions: "tableOptions", dataLayoutMode: "dataLayoutMode", selectionMode: "selectionMode", selectionBehavior: "selectionBehavior", selectionKeyMode: "selectionKeyMode", selectAllEnabled: "selectAllEnabled", selectionA11yLabels: "selectionA11yLabels", selectionDisabledFn: "selectionDisabledFn", highlightedIndex: "highlightedIndex", highlightRowKey: "highlightRowKey", highlightColKey: "highlightColKey", globalFilterAriaLabel: "globalFilterAriaLabel", globalFilterPlaceholder: "globalFilterPlaceholder", searchHighlightTerm: "searchHighlightTerm", searchHighlightFields: "searchHighlightFields", expandRowAriaLabel: "expandRowAriaLabel", collapseRowAriaLabel: "collapseRowAriaLabel", exportPdfAriaLabel: "exportPdfAriaLabel", exportExcelAriaLabel: "exportExcelAriaLabel", newRowDefaults: "newRowDefaults", strictEmail: "strictEmail", editOnRowClick: "editOnRowClick", editMode: "editMode", toolbarEditHint: "toolbarEditHint", singleExpand: "singleExpand", exportOptions: "exportOptions", theme: "theme", responsive: "responsive", trackBy: "trackBy", rowClass: "rowClass", rowStyle: "rowStyle", rowReorderable: "rowReorderable", columnReorderable: "columnReorderable", resizable: "resizable", actionDisplay: "actionDisplay", showStickyRowBadge: "showStickyRowBadge", stickyRowBadgeField: "stickyRowBadgeField", stickyRowBadgeLabel: "stickyRowBadgeLabel", labels: "labels", locale: "locale", dir: "dir", keyboardNavigation: "keyboardNavigation", editService: "editService", dataProviderAll: "dataProviderAll", dataProviderSelection: "dataProviderSelection", pageSize: "pageSize" }, outputs: { rowAdd: "rowAdd", rowEdit: "rowEdit", rowSave: "rowSave", rowCancel: "rowCancel", rowDelete: "rowDelete", groupChange: "groupChange", sortChange: "sortChange", filterChange: "filterChange", filtersChange: "filtersChange", pageChange: "pageChange", dataStateChange: "dataStateChange", selectionChange: "selectionChange", rowReorder: "rowReorder", columnReorder: "columnReorder" }, host: { listeners: { "window:resize": "onWindowResize()", "document:mousemove": "onDocumentMouseMove($event)", "document:mouseup": "onDocumentMouseUp()", "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscapeKey()" } }, providers: [
9317
10549
  { provide: PdfExportAdapter, useClass: JsPdfAdapter },
9318
10550
  { provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
9319
10551
  { provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
9320
- ], queries: [{ propertyName: "exportButtonDir", first: true, predicate: ExportButtonDirective, descendants: true }, { propertyName: "rowDetailTpl", first: true, predicate: NgbRowDetailTemplate, descendants: true }, { propertyName: "pagerTpl", first: true, predicate: NgbPagerTemplate, descendants: true }, { propertyName: "cellTplQ", predicate: NgbCellTemplate }, { propertyName: "editTplQ", predicate: NgbEditorTemplate }, { propertyName: "filterTplQ", predicate: NgbFilterTemplate }, { propertyName: "filterMenuTplQ", predicate: NgbFilterMenuTemplate }, { propertyName: "globalTplQ", predicate: NgbGlobalFilterTemplate }, { propertyName: "gridColumnQ", predicate: NgbGridColumnDirective }], viewQueries: [{ propertyName: "bodyScroller", first: true, predicate: ["bodyScroller"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n <table\n class=\"grid-table grid-body mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!paged.length) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (row of paged; track trackRow($index, row); let i = $index) {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [selected]=\"isRowSelected(row, i)\"\n [ngbDndItem]=\"row\"\n [dndIndex]=\"i\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, i); onRowClick($event, i)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(row, i)\"\n [class.row-selected]=\"isRowSelected(row, i)\"\n [class.row-highlight]=\"isRowHighlighted(row, i)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(row, i)\"\n [ngStyle]=\"resolveRowStyle(row, i)\"\n [attr.aria-selected]=\"isRowSelected(row, i) ? 'true' : null\"\n [style.top.px]=\"stickyTop(row, i)\"\n [style.z-index]=\"isRowSticky(row, i) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(i)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [attr.id]=\"'dg-row-detail-' + i\"\n ></tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text)}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:0 .1rem;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.55;line-height:1}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbSyncColgroupDirective, selector: "[ngbSyncColgroup]", inputs: ["ngbSyncColgroup", "syncRole", "syncMode"] }, { kind: "component", type: NgbDatagridToolbarComponent, selector: "ngb-datagrid-toolbar", inputs: ["grid"] }, { kind: "component", type: NgbDatagridEditingToolbarComponent, selector: "ngb-datagrid-editing-toolbar", inputs: ["grid", "selectedCount", "editActive", "saveDisabled"] }, { kind: "component", type: NgbDatagridExternalEditorComponent, selector: "ngb-datagrid-external-editor", inputs: ["grid"] }, { kind: "component", type: NgbDatagridColgroupComponent, selector: "colgroup[ngbDatagridColgroup]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridHeaderComponent, selector: "thead[ngbDatagridHeader]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridFilterMenuPanelComponent, selector: "ngb-datagrid-filter-menu-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridRowFilterOperatorPanelComponent, selector: "ngb-datagrid-row-filter-operator-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridAddRowComponent, selector: "tr[ngbDatagridAddRow]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridDataRowComponent, selector: "tr[ngbDatagridDataRow]", inputs: ["grid", "row", "index", "selected"] }, { kind: "component", type: NgbDatagridDetailRowComponent, selector: "tr[ngbDatagridDetailRow]", inputs: ["grid", "row", "index"] }, { kind: "component", type: NgbDatagridFooterComponent, selector: "ngb-datagrid-footer", inputs: ["grid", "placement"] }, { kind: "directive", type: NgbDndListDirective, selector: "[ngbDndList]", inputs: ["dndChildrenKey", "ngbDndList", "dndGroup", "dndDisabled", "dndCloneOnDrop", "dndCloneFn", "dndIsPalette", "dndCanDrop", "dndAriaLabel"], outputs: ["dndDropped"] }, { kind: "directive", type: NgbDndItemDirective, selector: "[ngbDndItem]", inputs: ["ngbDndItem", "dndGroup", "dndIndex", "dndSourceList", "dndDisabled"], outputs: ["dndDragStart", "dndDragEnd"] }], encapsulation: i0.ViewEncapsulation.None });
10552
+ ], queries: [{ propertyName: "exportButtonDir", first: true, predicate: ExportButtonDirective, descendants: true }, { propertyName: "rowDetailTpl", first: true, predicate: NgbRowDetailTemplate, descendants: true }, { propertyName: "pagerTpl", first: true, predicate: NgbPagerTemplate, descendants: true }, { propertyName: "groupHeaderTpl", first: true, predicate: NgbDataGridGroupHeaderTemplateDirective, descendants: true }, { propertyName: "cellTplQ", predicate: NgbCellTemplate }, { propertyName: "editTplQ", predicate: NgbEditorTemplate }, { propertyName: "filterTplQ", predicate: NgbFilterTemplate }, { propertyName: "filterMenuTplQ", predicate: NgbFilterMenuTemplate }, { propertyName: "globalTplQ", predicate: NgbGlobalFilterTemplate }, { propertyName: "groupHeaderColumnTplQ", predicate: NgbDataGridGroupHeaderColumnTemplateDirective }, { propertyName: "groupFooterTplQ", predicate: NgbDataGridGroupFooterTemplateDirective }, { propertyName: "gridColumnQ", predicate: NgbGridColumnDirective }], viewQueries: [{ propertyName: "bodyScroller", first: true, predicate: ["bodyScroller"], descendants: true }, { propertyName: "headerScroller", first: true, predicate: ["headerScroller"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n [style.--ngb-render-tick]=\"renderTick\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n @if (isGroupingEnabled()) {\n <div\n class=\"ngb-grid__group-panel\"\n [class.ngb-grid__group-panel--active]=\"groupPanelDragActive && !groupPanelDragDenied\"\n [class.ngb-grid__group-panel--denied]=\"groupPanelDragDenied\"\n (dragover)=\"onGroupPanelDragOver($event)\"\n (dragleave)=\"onGroupPanelDragLeave($event)\"\n (drop)=\"onGroupPanelDrop($event)\"\n >\n <div class=\"ngb-grid__group-panel-label\">{{ groupPanelLabel() }}</div>\n @if (groupedColumns().length) {\n <div class=\"ngb-grid__group-chip-list\">\n @for (descriptor of groupedColumns(); track descriptor.field) {\n <div class=\"ngb-grid__group-chip\">\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-button\"\n (click)=\"toggleGroupDirection(descriptor.field)\"\n [attr.aria-label]=\"groupDirectionAriaLabel(descriptor)\"\n >\n <span class=\"ngb-grid__group-chip-label\">{{ groupFieldLabel(descriptor) }}</span>\n <span class=\"ngb-grid__group-chip-dir\">{{ descriptor.dir === 'desc' ? '\u2193' : '\u2191' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-remove\"\n (click)=\"removeGroupField(descriptor.field)\"\n [attr.aria-label]=\"groupRemoveAriaLabel(descriptor)\"\n >\n <span class=\"bi bi-x-lg\" aria-hidden=\"true\"></span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n @if (hasStickyGroupHeaders()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--top\"\n [style.transform]=\"'translateY(' + stickyGroupHeaderTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupHeaderRows; track item.key) {\n <tr class=\"grid-group-row grid-group-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <table\n class=\"grid-table grid-body grid-body--main mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!hasRenderableRows()) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (item of renderRows; track item.key) {\n @if (item.kind === 'group') {\n <tr\n class=\"grid-group-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else if (item.kind === 'group-footer') {\n <tr\n class=\"grid-group-footer-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [ngbDndItem]=\"item.row\"\n [dndIndex]=\"item.pagedIndex\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, item.pagedIndex); onRowClick($event, item.pagedIndex)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(item.row, item.pagedIndex)\"\n [class.row-selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [class.row-highlight]=\"isRowHighlighted(item.row, item.pagedIndex)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(item.row, item.pagedIndex)\"\n [ngStyle]=\"resolveRowStyle(item.row, item.pagedIndex)\"\n [attr.aria-selected]=\"isRowSelected(item.row, item.pagedIndex) ? 'true' : null\"\n [style.top.px]=\"stickyTop(item.row, item.pagedIndex)\"\n [style.z-index]=\"isRowSticky(item.row, item.pagedIndex) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(item.pagedIndex)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [attr.id]=\"'dg-row-detail-' + item.pagedIndex\"\n ></tr>\n }\n }\n }\n </tbody>\n </table>\n\n @if (hasStickyGroupFooters()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--bottom\"\n [style.transform]=\"'translateY(' + stickyGroupFooterTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupFooterRows; track item.key) {\n <tr class=\"grid-group-footer-row grid-group-footer-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text);--dg-group-sticky-row-height: 3rem}.ngb-grid.ngb-grid--compact{--dg-group-sticky-row-height: 2.5rem}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .ngb-grid__group-panel{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;min-height:3.25rem;margin-bottom:.9rem;padding:.75rem .9rem;border:1px dashed var(--dg-border-strong);border-radius:var(--dg-radius-md);background:color-mix(in srgb,var(--dg-surface-muted) 72%,white);transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.ngb-grid .ngb-grid__group-panel--active{border-color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 45%,white);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--dg-primary) 22%,transparent)}.ngb-grid .ngb-grid__group-panel--denied{border-color:var(--dg-danger, #dc3545);background:color-mix(in srgb,var(--dg-danger, #dc3545) 8%,white)}.ngb-grid .ngb-grid__group-panel-label{font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-list{display:inline-flex;align-items:center;gap:.55rem;flex-wrap:wrap}.ngb-grid .ngb-grid__group-chip{display:inline-flex;align-items:center;gap:.25rem;border:1px solid color-mix(in srgb,var(--dg-primary) 26%,var(--dg-border));border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .ngb-grid__group-chip-button,.ngb-grid .ngb-grid__group-chip-remove{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;border:0;background:transparent;color:var(--dg-text)}.ngb-grid .ngb-grid__group-chip-button{padding:.35rem .55rem .35rem .8rem;font-size:.8125rem;font-weight:600}.ngb-grid .ngb-grid__group-chip-remove{padding:.35rem .75rem .35rem .15rem;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-button:hover,.ngb-grid .ngb-grid__group-chip-remove:hover{color:var(--dg-primary)}.ngb-grid .ngb-grid__group-chip-button:focus-visible,.ngb-grid .ngb-grid__group-chip-remove:focus-visible,.ngb-grid .grid-column-group-handle:focus-visible,.ngb-grid .grid-group-row__toggle:focus-visible{outline:none;box-shadow:var(--dg-focus-shadow);border-radius:999px}.ngb-grid .ngb-grid__group-chip-dir{font-size:.8rem;color:var(--dg-primary)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .ngb-grid__group-sticky-layer{position:absolute;inset-inline-start:0;z-index:35;min-width:100%;pointer-events:none}.ngb-grid .ngb-grid__group-sticky-layer--top,.ngb-grid .ngb-grid__group-sticky-layer--bottom{top:0}.ngb-grid .grid-group-sticky-table{min-width:100%;pointer-events:auto}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:.1rem .18rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.82;line-height:1;font-size:.95rem}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1;background:color-mix(in srgb,var(--dg-accent) 12%,transparent)}.ngb-grid .grid-column-group-handle{flex:0 0 auto;padding:.15rem .25rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;font-size:.9rem}.ngb-grid .grid-column-group-handle--active,.ngb-grid .grid-column-group-handle:hover{color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 55%,transparent)}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-group-row td,.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 88%,white);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-group-row--overlay td{box-shadow:inset 0 -1px 0 var(--dg-border),0 1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-footer-row--overlay td{box-shadow:inset 0 1px 0 var(--dg-border),0 -1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-row__cell{padding:0;vertical-align:top}.ngb-grid .grid-group-footer-row__cell,.ngb-grid .grid-group-row__utility-cell{padding:.7rem .75rem;vertical-align:top}.ngb-grid .grid-group-row__toggle{display:flex;align-items:center;gap:.55rem;width:100%;padding:.7rem 1rem;border:0;background:transparent;color:var(--dg-text);text-align:left;font-size:.875rem;font-weight:600}.ngb-grid .grid-group-row__cell--lead .grid-group-row__toggle{padding-inline-end:.75rem}.ngb-grid .grid-group-row__toggle:hover{background:color-mix(in srgb,var(--dg-primary-soft) 34%,transparent)}.ngb-grid .grid-group-row__content{display:inline-flex;align-items:center;gap:.5rem;min-width:0}.ngb-grid .grid-group-row__label{color:var(--dg-text)}.ngb-grid .grid-group-row__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__column-slot{padding:.25rem .75rem .75rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__cell--lead .grid-group-row__column-slot{padding-inline-start:2.75rem}.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 94%,white)}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content,.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content *{pointer-events:none}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbSyncColgroupDirective, selector: "[ngbSyncColgroup]", inputs: ["ngbSyncColgroup", "syncRole", "syncMode"] }, { kind: "component", type: NgbDatagridToolbarComponent, selector: "ngb-datagrid-toolbar", inputs: ["grid"] }, { kind: "component", type: NgbDatagridEditingToolbarComponent, selector: "ngb-datagrid-editing-toolbar", inputs: ["grid", "selectedCount", "editActive", "saveDisabled"] }, { kind: "component", type: NgbDatagridExternalEditorComponent, selector: "ngb-datagrid-external-editor", inputs: ["grid"] }, { kind: "component", type: NgbDatagridColgroupComponent, selector: "colgroup[ngbDatagridColgroup]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridHeaderComponent, selector: "thead[ngbDatagridHeader]", inputs: ["grid", "renderTick"] }, { kind: "component", type: NgbDatagridFilterMenuPanelComponent, selector: "ngb-datagrid-filter-menu-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridRowFilterOperatorPanelComponent, selector: "ngb-datagrid-row-filter-operator-panel", inputs: ["grid", "col", "anchor"] }, { kind: "component", type: NgbDatagridAddRowComponent, selector: "tr[ngbDatagridAddRow]", inputs: ["grid"] }, { kind: "component", type: NgbDatagridDataRowComponent, selector: "tr[ngbDatagridDataRow]", inputs: ["grid", "renderTick", "row", "index", "selected"] }, { kind: "component", type: NgbDatagridDetailRowComponent, selector: "tr[ngbDatagridDetailRow]", inputs: ["grid", "row", "index"] }, { kind: "component", type: NgbDatagridFooterComponent, selector: "ngb-datagrid-footer", inputs: ["grid", "placement"] }, { kind: "directive", type: NgbDndListDirective, selector: "[ngbDndList]", inputs: ["dndChildrenKey", "ngbDndList", "dndGroup", "dndDisabled", "dndCloneOnDrop", "dndCloneFn", "dndIsPalette", "dndCanDrop", "dndAriaLabel"], outputs: ["dndDropped"] }, { kind: "directive", type: NgbDndItemDirective, selector: "[ngbDndItem]", inputs: ["ngbDndItem", "dndGroup", "dndIndex", "dndSourceList", "dndDisabled"], outputs: ["dndDragStart", "dndDragEnd"] }], encapsulation: i0.ViewEncapsulation.None });
9321
10553
  }
9322
10554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, decorators: [{
9323
10555
  type: Component,
@@ -9344,7 +10576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9344
10576
  { provide: PdfExportAdapter, useClass: JsPdfAdapter },
9345
10577
  { provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
9346
10578
  { provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
9347
- ], standalone: true, template: "<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n <table\n class=\"grid-table grid-body mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!paged.length) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (row of paged; track trackRow($index, row); let i = $index) {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [selected]=\"isRowSelected(row, i)\"\n [ngbDndItem]=\"row\"\n [dndIndex]=\"i\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, i); onRowClick($event, i)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(row, i)\"\n [class.row-selected]=\"isRowSelected(row, i)\"\n [class.row-highlight]=\"isRowHighlighted(row, i)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(row, i)\"\n [ngStyle]=\"resolveRowStyle(row, i)\"\n [attr.aria-selected]=\"isRowSelected(row, i) ? 'true' : null\"\n [style.top.px]=\"stickyTop(row, i)\"\n [style.z-index]=\"isRowSticky(row, i) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(i)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"row\"\n [index]=\"i\"\n [attr.id]=\"'dg-row-detail-' + i\"\n ></tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text)}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:0 .1rem;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.55;line-height:1}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"] }]
10579
+ ], standalone: true, template: "<div\n class=\"ngb-grid\"\n [attr.dir]=\"resolvedDir()\"\n [attr.data-theme]=\"theme\"\n [class.ngb-grid--rtl]=\"isRtl()\"\n [class.ngb-responsive]=\"isResponsiveEnabled()\"\n [class.ngb-grid--compact]=\"densityMode === 'compact'\"\n [class.ngb-grid--stacked]=\"isStackedLayout()\"\n [class.ngb-grid--stacked-cards]=\"isStackedCardsLayout()\"\n [class.ngb-grid--menu-open]=\"!!openFilterMenuField || !!openMenuOperatorField || !!openRowFilterField\"\n [class.ngb-grid--row-operator-open]=\"!!openRowFilterField\"\n [class.ngb-grid--zebra]=\"zebraStripesEnabled\"\n [class.ngb-grid--resizable]=\"resizable && !isStackedLayout()\"\n [class.ngb-grid--column-reorderable]=\"isColumnReorderEnabled()\"\n [class.ngb-grid--loading]=\"loading\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n [style.--ngb-render-tick]=\"renderTick\"\n>\n <div class=\"ngb-grid__layout-toolbar-host\">\n <ng-content select=\"ngb-datagrid-layout-toolbar\"></ng-content>\n </div>\n <ngb-datagrid-toolbar [grid]=\"gridHost\"></ngb-datagrid-toolbar>\n <ngb-datagrid-editing-toolbar\n [grid]=\"gridHost\"\n [selectedCount]=\"getSelectedCount()\"\n [editActive]=\"isToolbarEditActive()\"\n [saveDisabled]=\"isToolbarSaveDisabled()\"\n ></ngb-datagrid-editing-toolbar>\n\n @if (paginationActive && pagerShowsAt('top')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"top\"></ngb-datagrid-footer>\n }\n\n <div\n class=\"ngb-grid__status visually-hidden-focusable\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >{{ statusMessage }}</div>\n\n @if (isGroupingEnabled()) {\n <div\n class=\"ngb-grid__group-panel\"\n [class.ngb-grid__group-panel--active]=\"groupPanelDragActive && !groupPanelDragDenied\"\n [class.ngb-grid__group-panel--denied]=\"groupPanelDragDenied\"\n (dragover)=\"onGroupPanelDragOver($event)\"\n (dragleave)=\"onGroupPanelDragLeave($event)\"\n (drop)=\"onGroupPanelDrop($event)\"\n >\n <div class=\"ngb-grid__group-panel-label\">{{ groupPanelLabel() }}</div>\n @if (groupedColumns().length) {\n <div class=\"ngb-grid__group-chip-list\">\n @for (descriptor of groupedColumns(); track descriptor.field) {\n <div class=\"ngb-grid__group-chip\">\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-button\"\n (click)=\"toggleGroupDirection(descriptor.field)\"\n [attr.aria-label]=\"groupDirectionAriaLabel(descriptor)\"\n >\n <span class=\"ngb-grid__group-chip-label\">{{ groupFieldLabel(descriptor) }}</span>\n <span class=\"ngb-grid__group-chip-dir\">{{ descriptor.dir === 'desc' ? '\u2193' : '\u2191' }}</span>\n </button>\n <button\n type=\"button\"\n class=\"ngb-grid__group-chip-remove\"\n (click)=\"removeGroupField(descriptor.field)\"\n [attr.aria-label]=\"groupRemoveAriaLabel(descriptor)\"\n >\n <span class=\"bi bi-x-lg\" aria-hidden=\"true\"></span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"table-wrapper\" [ngClass]=\"responsiveWrapperClasses\">\n @if (loading) {\n <div class=\"ngb-grid__loading-overlay\" role=\"presentation\">\n <div class=\"spinner-border spinner-border-sm text-primary\" role=\"status\">\n <span class=\"visually-hidden\">Loading</span>\n </div>\n </div>\n }\n <div class=\"grid-header-shell\" #headerScroller>\n <table class=\"grid-table grid-header mb-0\" [ngClass]=\"tableClassList\" [style.width.px]=\"tablePixelWidth\">\n @if (tableOptions?.caption) {\n <caption\n [class.caption-top]=\"(tableOptions?.captionSide ?? 'top') === 'top'\"\n >\n {{ tableOptions?.caption }}\n </caption>\n }\n\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"header\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <thead\n class=\"table-light\"\n ngbDatagridHeader\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n ></thead>\n </table>\n </div>\n\n <div [class.table-body-scroll]=\"shouldEnableScroll\" #bodyScroller (scroll)=\"onBodyHorizontalScroll()\">\n @if (hasStickyGroupHeaders()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--top\"\n [style.transform]=\"'translateY(' + stickyGroupHeaderTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupHeaderRows; track item.key) {\n <tr class=\"grid-group-row grid-group-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n <table\n class=\"grid-table grid-body grid-body--main mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\"\n [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-readonly]=\"enableEdit || enableAdd ? 'false' : 'true'\"\n [attr.aria-label]=\"tableOptions?.caption || null\"\n >\n <colgroup\n ngbDatagridColgroup\n [grid]=\"gridHost\"\n [ngbSyncColgroup]=\"colgroupSyncId\"\n syncRole=\"body\"\n [syncMode]=\"resizable ? 'explicit' : 'auto'\"\n ></colgroup>\n\n <tbody\n [ngbDndList]=\"paged\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (dndDropped)=\"onRowDrop($event)\"\n >\n @if (!hasRenderableRows()) {\n <tr class=\"ngb-grid__empty-row\">\n <td [attr.colspan]=\"ariaColCount()\" class=\"ngb-grid__empty text-center text-muted py-4\">\n {{ emptyStateLabel() }}\n </td>\n </tr>\n }\n\n @if (addingNew) {\n <tr\n ngbDatagridAddRow\n [grid]=\"gridHost\"\n [formGroup]=\"addForm\"\n ></tr>\n }\n\n @for (item of renderRows; track item.key) {\n @if (item.kind === 'group') {\n <tr\n class=\"grid-group-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n @if (shouldRenderGroupCell(col, item.group)) {\n <td\n class=\"grid-group-row__cell\"\n [class.grid-group-row__cell--lead]=\"isGroupLeadColumn(col, item.group)\"\n [attr.colspan]=\"groupCellColspan(col, item.group)\"\n >\n @if (isGroupLeadColumn(col, item.group)) {\n <button\n type=\"button\"\n class=\"grid-group-row__toggle\"\n (click)=\"toggleGroupCollapsed(item.group, item.level, item.startIndex)\"\n [attr.aria-expanded]=\"!item.collapsed\"\n >\n <span\n class=\"bi\"\n [ngClass]=\"item.collapsed ? 'bi-chevron-right' : 'bi-chevron-down'\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"grid-group-row__content\" [style.padding-inline-start.rem]=\"groupRowIndent(item.level)\">\n @if (groupHeaderTpl) {\n <ng-container\n [ngTemplateOutlet]=\"groupHeaderTpl.template\"\n [ngTemplateOutletContext]=\"groupHeaderContext(item.group)\"\n ></ng-container>\n } @else {\n <span class=\"grid-group-row__label\">{{ groupRowLabel(item.group) }}</span>\n <span class=\"grid-group-row__count\">{{ groupRowCountLabel(item.group) }}</span>\n }\n </span>\n </button>\n @if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n } @else if (groupHeaderColumnTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else if (item.kind === 'group-footer') {\n <tr\n class=\"grid-group-footer-row\"\n [attr.data-group-key]=\"item.key\"\n [attr.data-group-level]=\"item.level\"\n >\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n } @else {\n <tr\n class=\"grid-data-row\"\n ngbDatagridDataRow\n [grid]=\"gridHost\"\n [renderTick]=\"renderTick\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [ngbDndItem]=\"item.row\"\n [dndIndex]=\"item.pagedIndex\"\n [dndDisabled]=\"!isRowReorderEnabled()\"\n (click)=\"onRowSelect($event, item.pagedIndex); onRowClick($event, item.pagedIndex)\"\n [formGroup]=\"editForm\"\n [class.sticky-row]=\"isRowSticky(item.row, item.pagedIndex)\"\n [class.row-selected]=\"isRowSelected(item.row, item.pagedIndex)\"\n [class.row-highlight]=\"isRowHighlighted(item.row, item.pagedIndex)\"\n [class.grid-row--reorderable]=\"isRowReorderEnabled()\"\n [ngClass]=\"resolveRowClass(item.row, item.pagedIndex)\"\n [ngStyle]=\"resolveRowStyle(item.row, item.pagedIndex)\"\n [attr.aria-selected]=\"isRowSelected(item.row, item.pagedIndex) ? 'true' : null\"\n [style.top.px]=\"stickyTop(item.row, item.pagedIndex)\"\n [style.z-index]=\"isRowSticky(item.row, item.pagedIndex) ? 3 : null\"\n ></tr>\n\n @if (rowDetailTpl && isExpanded(item.pagedIndex)) {\n <tr\n ngbDatagridDetailRow\n [grid]=\"gridHost\"\n [row]=\"item.row\"\n [index]=\"item.pagedIndex\"\n [attr.id]=\"'dg-row-detail-' + item.pagedIndex\"\n ></tr>\n }\n }\n }\n </tbody>\n </table>\n\n @if (hasStickyGroupFooters()) {\n <div\n class=\"ngb-grid__group-sticky-layer ngb-grid__group-sticky-layer--bottom\"\n [style.transform]=\"'translateY(' + stickyGroupFooterTranslateY + 'px)'\"\n >\n <table\n class=\"grid-table grid-group-sticky-table mb-0\"\n [ngClass]=\"tableClassList\"\n [style.width.px]=\"tablePixelWidth\"\n role=\"presentation\"\n >\n <colgroup>\n @for (width of stickyGroupOverlayColumnWidths; track $index) {\n <col [style.width.px]=\"width || null\" />\n }\n </colgroup>\n <tbody>\n @for (item of stickyGroupFooterRows; track item.key) {\n <tr class=\"grid-group-footer-row grid-group-footer-row--overlay\">\n @if (showSelectionColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (rowDetailTpl) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @if (stickyRowsEnabled) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n @for (col of visibleColumns; track col.field) {\n <td class=\"grid-group-footer-row__cell\">\n @if (groupFooterTemplate(groupColumnField(col)); as tpl) {\n <div class=\"grid-group-row__column-slot\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"groupColumnContext(item.group, col)\"\n ></ng-container>\n </div>\n }\n </td>\n }\n @if (showActionsColumn()) {\n <td class=\"grid-group-row__utility-cell\"></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <table class=\"table grid-table grid-foot mb-0\" [style.width.px]=\"tablePixelWidth\">\n <colgroup>\n @for (col of visibleColumns; track col.field) {\n <col [style.width.px]=\"col?.width\" />\n }\n </colgroup>\n <tbody>\n <tr>\n <td [attr.colspan]=\"visibleColumns.length\" width=\"100%\">\n @if (paginationActive && pagerShowsAt('bottom')) {\n <ngb-datagrid-footer [grid]=\"gridHost\" placement=\"bottom\"></ngb-datagrid-footer>\n }\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n @if (externalEditOpen) {\n <ngb-datagrid-external-editor [grid]=\"gridHost\"></ngb-datagrid-external-editor>\n }\n\n @if (openFilterMenuField && openFilterMenuColumn && openFilterMenuAnchor) {\n <ngb-datagrid-filter-menu-panel\n [grid]=\"gridHost\"\n [col]=\"openFilterMenuColumn\"\n [anchor]=\"openFilterMenuAnchor\"\n />\n }\n\n @if (openRowFilterField && openRowFilterColumn && openRowFilterOperatorAnchor) {\n <ngb-datagrid-row-filter-operator-panel\n [grid]=\"gridHost\"\n [col]=\"openRowFilterColumn\"\n [anchor]=\"openRowFilterOperatorAnchor\"\n />\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ngb-grid,.ngb-datagrid-floating-panel{--dg-surface: #ffffff;--dg-surface-muted: #f9fafb;--dg-surface-subtle: #f3f4f6;--dg-surface-config: #edf4ff;--dg-surface-filter-row: #fffbeb;--dg-surface-sticky-row: #fefce8;--dg-border: #d7deea;--dg-border-strong: #cfd6e2;--dg-text: #1f2937;--dg-text-muted: #5b6578;--dg-text-subtle: #64748b;--dg-primary: #315efb;--dg-primary-hover: #2749c4;--dg-primary-active: #1d4ed8;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-accent: #3b82f6;--dg-on-primary: #ffffff;--dg-placeholder: #94a3b8;--dg-success: #39a949;--dg-success-soft: #dcfce7;--dg-success-text: #166534;--dg-success-border-subtle: #bbf7d0;--dg-danger: #ef4444;--dg-danger-soft: #fee2e2;--dg-danger-text: #b91c1c;--dg-danger-border-subtle: #fecaca;--dg-warning-soft: #fef3c7;--dg-warning-border: #fde68a;--dg-warning-text: #854d0e;--dg-filter-multi-icon: #39a949;--dg-filter-multi-icon-soft: #dcfce7;--dg-neutral-pill-bg: #e2e8f0;--dg-locked-bg: #f8fafc;--dg-row-selected-bg: #eef5ff;--dg-row-hover-bg: #f8fbff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f8fbff;--dg-search-highlight-bg: #fef08a;--dg-sticky-border: #facc15;--dg-sticky-badge-bg: #fef08a;--dg-sticky-badge-text: #854d0e;--dg-dropdown-item-active-bg: var(--dg-primary-soft);--dg-dropdown-item-active-color: var(--dg-primary);--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(37, 99, 235, .15);--dg-pin-shadow-start: 1px 0 0 rgba(15, 23, 42, .08);--dg-pin-shadow-end: -1px 0 0 rgba(15, 23, 42, .08);--dg-backdrop: rgba(15, 23, 42, .45);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(37, 99, 235, .18);--dg-filter-divider: rgba(219, 227, 239, .8);--dg-shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--dg-shadow-md: 0 8px 24px rgba(15, 23, 42, .12);--dg-radius-lg: .5rem;--dg-radius-md: .45rem;--dg-radius-sm: .35rem;--dg-control-height: 2.15rem;--dg-nav-height: 2.5rem;--dg-font-size-header: .92rem;--dg-font-size-cell: .84rem;--dg-font-size-label: .94rem;--dg-cell-padding-y: .75rem;--dg-cell-padding-x: .85rem;--dg-header-padding-y: .75rem;--dg-header-padding-x: .85rem;--dg-table-border-width: 1px;--dg-pager-surface: var(--dg-surface);--dg-pager-text: var(--dg-text-muted);--dg-pager-control-bg: var(--dg-surface);--dg-pager-control-hover-bg: var(--dg-surface-subtle);--dg-pager-control-border: var(--dg-border);--dg-pager-link-text: var(--dg-primary);--dg-pager-active-bg: var(--dg-primary);--dg-pager-active-border: var(--dg-primary);--dg-pager-active-text: var(--dg-on-primary);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap],.ngb-datagrid-floating-panel[data-theme=bootstrap]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-main],.ngb-datagrid-floating-panel[data-theme=bootstrap-main]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #f8fbff;--dg-surface-muted: #eaf3ff;--dg-surface-subtle: #d9eaff;--dg-surface-config: #e0efff;--dg-border: #bfd7f4;--dg-border-strong: #7fb0e3;--dg-text: #172554;--dg-text-muted: #45617f;--dg-primary: #1769e0;--dg-primary-hover: #0f56bd;--dg-primary-active: #0b438f;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #93c5fd;--dg-accent: #0f766e;--dg-row-selected-bg: #dcecff;--dg-row-hover-bg: #eef6ff;--dg-detail-row-bg: #edf6ff;--dg-dropdown-item-active-bg: #dcecff;--dg-dropdown-item-active-color: #0f56bd;--dg-focus-ring: #1769e0;--dg-focus-border: rgba(23, 105, 224, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(23, 105, 224, .16)}.ngb-grid[data-theme=bootstrap-main-dark],.ngb-datagrid-floating-panel[data-theme=bootstrap-main-dark]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #172033;--dg-surface-muted: #202b42;--dg-surface-subtle: #273653;--dg-surface-config: #172a4f;--dg-surface-filter-row: #2c2714;--dg-surface-sticky-row: #2e2810;--dg-border: #33425f;--dg-border-strong: #4a5d80;--dg-text: #edf2ff;--dg-text-muted: #b8c3d9;--dg-text-subtle: #93a2bd;--dg-primary: #38bdf8;--dg-primary-hover: #7dd3fc;--dg-primary-active: #bae6fd;--dg-primary-soft: #12344f;--dg-primary-border-subtle: #0284c7;--dg-accent: #38bdf8;--dg-on-primary: #ffffff;--dg-placeholder: #93a2bd;--dg-locked-bg: #1e2a40;--dg-row-selected-bg: #153a67;--dg-row-hover-bg: #22304a;--dg-row-odd-bg: #172033;--dg-row-even-bg: #1b263a;--dg-detail-row-bg: #182d4c;--dg-dropdown-item-active-bg: #183b70;--dg-dropdown-item-active-color: #bfdbfe;--dg-focus-ring: #60a5fa;--dg-focus-border: rgba(96, 165, 250, .6);--dg-focus-shadow: 0 0 0 .2rem rgba(96, 165, 250, .2);--dg-shadow-sm: 0 1px 2px rgba(0, 0, 0, .35);--dg-shadow-md: 0 14px 32px rgba(0, 0, 0, .36);--dg-pager-surface: #111827;--dg-pager-text: #dbeafe;--dg-pager-control-bg: #172033;--dg-pager-control-hover-bg: #22304a;--dg-pager-control-border: #4a5d80;--dg-pager-link-text: #dbeafe;--dg-pager-active-bg: #38bdf8;--dg-pager-active-border: #38bdf8;--dg-pager-active-text: #0f172a;--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\")}.ngb-grid[data-theme=bootstrap-nordic],.ngb-datagrid-floating-panel[data-theme=bootstrap-nordic]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f2f7f8;--dg-surface-subtle: #e6f0f2;--dg-surface-config: #e4f8fb;--dg-surface-filter-row: #fff7ed;--dg-border: #d5e4e7;--dg-border-strong: #a9c8cf;--dg-text: #263243;--dg-text-muted: #64748b;--dg-primary: #0ea5b7;--dg-primary-hover: #0b8798;--dg-primary-active: #0f6b7a;--dg-primary-soft: #d7f5f8;--dg-primary-border-subtle: #9be4ec;--dg-accent: #e85d75;--dg-row-selected-bg: #e7f8fb;--dg-row-hover-bg: #f0fbfd;--dg-row-odd-bg: transparent;--dg-row-even-bg: #fbfeff;--dg-detail-row-bg: #f4fbfc;--dg-dropdown-item-active-bg: #e7f8fb;--dg-dropdown-item-active-color: #0b8798;--dg-focus-ring: #0ea5b7;--dg-focus-border: rgba(14, 165, 183, .45);--dg-focus-shadow: 0 0 0 .2rem rgba(14, 165, 183, .15);--dg-font-size-cell: .88rem;--dg-cell-padding-y: .82rem;--dg-pager-surface: #f8ffff;--dg-pager-text: #526173;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #e7f8fb;--dg-pager-control-border: #b9dce2;--dg-pager-link-text: #0b8798;--dg-pager-active-bg: #0ea5b7;--dg-pager-active-border: #0ea5b7;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-urban],.ngb-datagrid-floating-panel[data-theme=bootstrap-urban]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #ffffff;--dg-surface-muted: #f5f8fa;--dg-surface-subtle: #edf4f7;--dg-surface-config: #e8f4f9;--dg-border: #d9e5ea;--dg-border-strong: #adc6d3;--dg-text: #263445;--dg-text-muted: #5f6f84;--dg-primary: #468faf;--dg-primary-hover: #36748f;--dg-primary-active: #285b72;--dg-primary-soft: #e0f0f6;--dg-primary-border-subtle: #b9dbe8;--dg-accent: #ff7f50;--dg-row-selected-bg: #e8f4f9;--dg-row-hover-bg: #fff2eb;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-dropdown-item-active-bg: #e8f4f9;--dg-dropdown-item-active-color: #36748f;--dg-focus-ring: #468faf;--dg-focus-border: rgba(70, 143, 175, .48);--dg-focus-shadow: 0 0 0 .2rem rgba(70, 143, 175, .16);--dg-cell-padding-y: .86rem;--dg-cell-padding-x: .95rem;--dg-pager-surface: #fffaf7;--dg-pager-text: #5f6f84;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #fff2eb;--dg-pager-control-border: #d4e1e7;--dg-pager-link-text: #36748f;--dg-pager-active-bg: #468faf;--dg-pager-active-border: #468faf;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=bootstrap-vintage],.ngb-datagrid-floating-panel[data-theme=bootstrap-vintage]{--dg-surface: var(--bs-body-bg, #ffffff);--dg-surface-muted: var(--bs-tertiary-bg, #f8f9fa);--dg-surface-subtle: var(--bs-secondary-bg, #e9ecef);--dg-surface-config: var(--bs-primary-bg-subtle, #cfe2ff);--dg-surface-filter-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-surface-sticky-row: var(--bs-warning-bg-subtle, #fff3cd);--dg-border: var(--bs-border-color, #dee2e6);--dg-border-strong: var(--bs-border-color-translucent, #ced4da);--dg-text: var(--bs-body-color, #212529);--dg-text-muted: var(--bs-secondary-color, #6c757d);--dg-text-subtle: var(--bs-tertiary-color, #6c757d);--dg-primary: var(--bs-primary, #0d6efd);--dg-primary-hover: var(--bs-link-hover-color, #0a58ca);--dg-primary-active: var(--bs-link-hover-color, #0a58ca);--dg-primary-soft: var(--bs-primary-bg-subtle, #cfe2ff);--dg-primary-border-subtle: var(--bs-primary-border-subtle, #9ec5fe);--dg-accent: var(--bs-primary, #0d6efd);--dg-on-primary: var(--bs-btn-color, #fff);--dg-placeholder: var(--bs-secondary-color, #6c757d);--dg-success: var(--bs-success, #198754);--dg-success-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-success-text: var(--bs-success-text-emphasis, #0a3622);--dg-success-border-subtle: var(--bs-success-border-subtle, #a3cfbb);--dg-danger: var(--bs-danger, #dc3545);--dg-danger-soft: var(--bs-danger-bg-subtle, #f8d7da);--dg-danger-text: var(--bs-danger-text-emphasis, #58151c);--dg-danger-border-subtle: var(--bs-danger-border-subtle, #f1aeb5);--dg-warning-soft: var(--bs-warning-bg-subtle, #fff3cd);--dg-warning-border: var(--bs-warning-border-subtle, #ffe69c);--dg-warning-text: var(--bs-warning-text-emphasis, #664d03);--dg-filter-multi-icon: var(--bs-success, #198754);--dg-filter-multi-icon-soft: var(--bs-success-bg-subtle, #d1e7dd);--dg-neutral-pill-bg: var(--bs-secondary-bg, #e9ecef);--dg-locked-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-selected-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-row-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-search-highlight-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-border: var(--bs-warning-border-subtle, #ffe69c);--dg-sticky-badge-bg: var(--bs-warning-bg-subtle, #fff3cd);--dg-sticky-badge-text: var(--bs-warning-text-emphasis, #664d03);--dg-dropdown-item-active-bg: var(--bs-primary-bg-subtle, #cfe2ff);--dg-dropdown-item-active-color: var(--bs-primary, #0d6efd);--dg-focus-ring: var(--bs-focus-ring-color, var(--bs-primary, #0d6efd));--dg-focus-border: rgba(var(--bs-primary-rgb, 13, 110, 253), .45);--dg-focus-shadow: 0 0 0 .25rem rgba(var(--bs-primary-rgb, 13, 110, 253), var(--bs-focus-ring-opacity, .25));--dg-pin-shadow-start: 1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-pin-shadow-end: -1px 0 0 var(--bs-border-color-translucent, rgba(0, 0, 0, .08));--dg-backdrop: rgba(var(--bs-emphasis-color-rgb, 33, 37, 41), .5);--dg-loading-overlay: color-mix(in srgb, var(--dg-surface) 55%, transparent);--dg-primary-selection-overlay: rgba(var(--bs-primary-rgb, 13, 110, 253), .18);--dg-filter-divider: var(--bs-border-color-translucent, rgba(0, 0, 0, .1));--dg-shadow-sm: var(--bs-box-shadow-sm, 0 .125rem .25rem rgba(0, 0, 0, .075));--dg-shadow-md: var(--bs-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));--dg-radius-lg: var(--bs-border-radius-lg, .5rem);--dg-radius-md: var(--bs-border-radius, .375rem);--dg-radius-sm: var(--bs-border-radius-sm, .25rem);--dg-pager-surface: var(--bs-body-bg, #ffffff);--dg-pager-text: var(--bs-secondary-color, #6c757d);--dg-pager-control-bg: var(--bs-body-bg, #ffffff);--dg-pager-control-hover-bg: var(--bs-tertiary-bg, #f8f9fa);--dg-pager-control-border: var(--bs-border-color, #dee2e6);--dg-pager-link-text: var(--bs-primary, #0d6efd);--dg-pager-active-bg: var(--bs-primary, #0d6efd);--dg-pager-active-border: var(--bs-primary, #0d6efd);--dg-pager-active-text: var(--bs-btn-color, #fff);--dg-pager-select-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");--dg-surface: #fffdf8;--dg-surface-muted: #f6f0e7;--dg-surface-subtle: #eee4d8;--dg-surface-config: #f2e7ef;--dg-border: #dfd2c2;--dg-border-strong: #c8b8a5;--dg-text: #3d3440;--dg-text-muted: #766a72;--dg-primary: #7f4f68;--dg-primary-hover: #684057;--dg-primary-active: #523246;--dg-primary-soft: #efdde8;--dg-primary-border-subtle: #d8b9ca;--dg-accent: #88b0b7;--dg-row-selected-bg: #f1e4ec;--dg-row-hover-bg: #fbf1e5;--dg-row-odd-bg: #fffdf8;--dg-row-even-bg: #fbf7ef;--dg-detail-row-bg: #fbf6ef;--dg-dropdown-item-active-bg: #f1e4ec;--dg-dropdown-item-active-color: #684057;--dg-focus-ring: #7f4f68;--dg-focus-border: rgba(127, 79, 104, .5);--dg-focus-shadow: 0 0 0 .2rem rgba(127, 79, 104, .16);--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-pager-surface: #fffdf8;--dg-pager-text: #766a72;--dg-pager-control-bg: #fffaf2;--dg-pager-control-hover-bg: #fbf1e5;--dg-pager-control-border: #dfd2c2;--dg-pager-link-text: #684057;--dg-pager-active-bg: #7f4f68;--dg-pager-active-border: #7f4f68;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=material],.ngb-grid[data-theme=material-main],.ngb-datagrid-floating-panel[data-theme=material],.ngb-datagrid-floating-panel[data-theme=material-main]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0}.ngb-grid[data-theme=material-indigo],.ngb-datagrid-floating-panel[data-theme=material-indigo]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #3f51b5;--dg-primary-hover: #303f9f;--dg-primary-active: #283593;--dg-primary-soft: #e8eaf6;--dg-primary-border-subtle: #c5cae9;--dg-dropdown-item-active-bg: #e8eaf6;--dg-dropdown-item-active-color: #303f9f;--dg-focus-ring: #3f51b5;--dg-focus-border: rgba(63, 81, 181, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(63, 81, 181, .16);--dg-row-hover-bg: #f0f2ff}.ngb-grid[data-theme=material-deep-purple],.ngb-datagrid-floating-panel[data-theme=material-deep-purple]{--dg-surface: #fffbfe;--dg-surface-muted: #f4eff4;--dg-surface-subtle: #e7e0ec;--dg-surface-config: #eaddff;--dg-border: #cac4d0;--dg-border-strong: #938f99;--dg-text: #1c1b1f;--dg-text-muted: #49454f;--dg-primary: #6750a4;--dg-primary-hover: #59468d;--dg-primary-active: #4f378b;--dg-primary-soft: #eaddff;--dg-primary-border-subtle: #d0bcff;--dg-accent: #7d5260;--dg-row-selected-bg: #eaddff;--dg-row-hover-bg: #f5efff;--dg-row-odd-bg: transparent;--dg-row-even-bg: transparent;--dg-detail-row-bg: #f7f2fa;--dg-dropdown-item-active-bg: #eaddff;--dg-dropdown-item-active-color: #4f378b;--dg-focus-ring: #6750a4;--dg-focus-border: rgba(103, 80, 164, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(103, 80, 164, .16);--dg-radius-lg: .75rem;--dg-radius-md: .65rem;--dg-radius-sm: .5rem;--dg-font-size-header: .78rem;--dg-font-size-cell: .86rem;--dg-cell-padding-y: .8rem;--dg-table-border-width: 0;--dg-pager-control-bg: #fffbfe;--dg-pager-control-hover-bg: #f4eff4;--dg-pager-control-border: #cac4d0;--dg-primary: #7e57c2;--dg-primary-hover: #673ab7;--dg-primary-active: #512da8;--dg-primary-soft: #ede7f6;--dg-primary-border-subtle: #d1c4e9;--dg-accent: #ff7043;--dg-row-selected-bg: #ede7f6;--dg-row-hover-bg: #f5edff;--dg-dropdown-item-active-bg: #ede7f6;--dg-dropdown-item-active-color: #512da8;--dg-focus-ring: #7e57c2;--dg-focus-border: rgba(126, 87, 194, .5);--dg-focus-shadow: 0 0 0 .18rem rgba(126, 87, 194, .16)}.ngb-grid[data-theme=tailwind],.ngb-grid[data-theme=tailwind-main],.ngb-datagrid-floating-panel[data-theme=tailwind],.ngb-datagrid-floating-panel[data-theme=tailwind-main]{--dg-surface: #ffffff;--dg-surface-muted: #f8fafc;--dg-surface-subtle: #f1f5f9;--dg-border: #cbd5e1;--dg-border-strong: #94a3b8;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #2563eb;--dg-primary-hover: #1d4ed8;--dg-primary-active: #1e40af;--dg-primary-soft: #dbeafe;--dg-primary-border-subtle: #bfdbfe;--dg-dropdown-item-active-bg: #dbeafe;--dg-dropdown-item-active-color: #1d4ed8;--dg-focus-ring: #2563eb;--dg-focus-border: rgba(37, 99, 235, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(37, 99, 235, .16);--dg-row-hover-bg: #eff6ff;--dg-font-size-header: .75rem;--dg-font-size-cell: .85rem;--dg-cell-padding-y: .68rem;--dg-cell-padding-x: .8rem;--dg-table-border-width: 1px;--dg-pager-surface: #ffffff;--dg-pager-text: #475569;--dg-pager-control-bg: #ffffff;--dg-pager-control-hover-bg: #eff6ff;--dg-pager-control-border: #bfdbfe;--dg-pager-link-text: #1d4ed8;--dg-pager-active-bg: #2563eb;--dg-pager-active-border: #2563eb;--dg-pager-active-text: #ffffff}.ngb-grid[data-theme=tailwind-slate],.ngb-datagrid-floating-panel[data-theme=tailwind-slate]{--dg-surface: #f8fafc;--dg-surface-muted: #e2e8f0;--dg-surface-subtle: #cbd5e1;--dg-border: #cbd5e1;--dg-border-strong: #64748b;--dg-text: #0f172a;--dg-text-muted: #475569;--dg-primary: #475569;--dg-primary-hover: #334155;--dg-primary-active: #1e293b;--dg-primary-soft: #e2e8f0;--dg-primary-border-subtle: #94a3b8;--dg-dropdown-item-active-bg: #e2e8f0;--dg-dropdown-item-active-color: #334155;--dg-focus-ring: #475569;--dg-row-hover-bg: #e2e8f0;--dg-row-odd-bg: #f8fafc;--dg-row-even-bg: #f1f5f9;--dg-focus-border: rgba(71, 85, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(71, 85, 105, .16)}.ngb-grid[data-theme=tailwind-emerald],.ngb-datagrid-floating-panel[data-theme=tailwind-emerald]{--dg-surface: #ffffff;--dg-surface-muted: #ecfdf5;--dg-surface-subtle: #d1fae5;--dg-border: #a7f3d0;--dg-border-strong: #34d399;--dg-text: #064e3b;--dg-text-muted: #047857;--dg-primary: #059669;--dg-primary-hover: #047857;--dg-primary-active: #065f46;--dg-primary-soft: #d1fae5;--dg-primary-border-subtle: #6ee7b7;--dg-dropdown-item-active-bg: #d1fae5;--dg-dropdown-item-active-color: #047857;--dg-focus-ring: #059669;--dg-focus-border: rgba(5, 150, 105, .48);--dg-focus-shadow: 0 0 0 .18rem rgba(5, 150, 105, .16)}.ngb-datagrid-floating-panel.grid-filter-menu-popover,.ngb-datagrid-floating-panel.dropdown-menu{position:fixed!important;z-index:1200;display:block;visibility:visible;opacity:1;pointer-events:auto;max-height:min(28rem,100vh - 1.5rem);overflow:auto;margin:0!important;border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-datagrid-floating-panel.dropdown-menu{min-width:12rem;padding:.35rem 0}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item{display:block;width:100%;padding:.5rem .85rem;border:0;background:transparent;font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:left}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-operator-menu .dropdown-item.active{color:var(--dg-dropdown-item-active-color);background:var(--dg-dropdown-item-active-bg)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text)}.ngb-datagrid-floating-panel.dropdown-menu .dropdown-item:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel.grid-filter-menu-popover{min-width:18rem;padding:0}.ngb-datagrid-floating-panel .grid-filter-menu-surface{display:block;min-width:18rem;padding:1rem;border-radius:var(--dg-radius-md);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-datagrid-floating-panel .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-datagrid-floating-panel .grid-filter-stack--multi{gap:.65rem}.ngb-datagrid-floating-panel .grid-filter-condition{display:flex;flex-direction:column;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-operator-select,.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-operator-select--compact,.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:2.5rem;padding:.35rem .25rem;font-size:0}.ngb-datagrid-floating-panel .grid-filter-logic-select,.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-datagrid-floating-panel .grid-filter-logic-select select,.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;color:var(--dg-text);text-align:center}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--split,.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary,.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:hover,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:hover,.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-datagrid-floating-panel .grid-filter-multi-panel,.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-datagrid-floating-panel .grid-filter-join-select,.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-datagrid-floating-panel .grid-filter-join-select__control,.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-datagrid-floating-panel .grid-filter-field{position:relative;width:100%;min-width:0}.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-field--with-icon .grid-filter-value-input{padding-right:2.25rem}.ngb-datagrid-floating-panel .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-datagrid-floating-panel .grid-filter-control,.ngb-datagrid-floating-panel .grid-filter-value-input,.ngb-datagrid-floating-panel .grid-filter-value-select,.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-datagrid-floating-panel .grid-filter-apply--secondary:disabled,.ngb-datagrid-floating-panel .grid-filter-cancel--secondary:disabled,.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-datagrid-floating-panel .grid-filter-condition__join{margin:.15rem 0;font-size:.75rem;font-weight:700;color:var(--dg-text-muted);text-align:center}.ngb-datagrid-floating-panel .grid-filter-stack__footer{display:flex;align-items:center;justify-content:space-between;gap:.5rem;flex-wrap:wrap}.ngb-datagrid-floating-panel .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted);border:1px solid var(--dg-border);border-radius:var(--dg-radius-sm);background:var(--dg-surface)}.ngb-datagrid-floating-panel .grid-filter-clear,.ngb-datagrid-floating-panel .grid-filter-apply,.ngb-datagrid-floating-panel .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;border-radius:var(--dg-radius-sm)}.ngb-datagrid-floating-panel .grid-filter-apply{border:1px solid var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-datagrid-floating-panel .grid-filter-cancel,.ngb-datagrid-floating-panel .grid-filter-clear{border:1px solid var(--dg-border-strong);background:var(--dg-surface);color:var(--dg-text)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%;min-width:16rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__search{border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);min-height:2rem;padding:.4rem .65rem;font-size:.8125rem;width:100%}.ngb-datagrid-floating-panel .grid-multi-filter-list{max-height:11.5rem;overflow:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-datagrid-floating-panel .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-datagrid-floating-panel .grid-multi-filter-option__main{display:flex;align-items:center;gap:.5rem}.ngb-datagrid-floating-panel .grid-filter-menu-surface__actions--multi{justify-content:space-between}.ngb-datagrid-floating-panel[data-theme=bootstrap].dropdown-menu .dropdown-item{font-weight:400}.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-operator-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-input,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-value-select,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-menu-surface__search,.ngb-datagrid-floating-panel[data-theme=bootstrap] .grid-filter-join-select__control{border-radius:var(--bs-border-radius, var(--dg-radius-sm))}ngb-datagrid{display:block}.ngb-grid{color:var(--dg-text);--dg-group-sticky-row-height: 3rem}.ngb-grid.ngb-grid--compact{--dg-group-sticky-row-height: 2.5rem}.ngb-grid .table{margin-bottom:0}.ngb-grid .datagrid-toolbar{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__search{flex:1 1 20rem;min-width:16rem}.ngb-grid .datagrid-toolbar__search-label{display:block;margin-bottom:.35rem;font-size:.875rem;font-weight:500;color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-shell{display:flex;align-items:center;gap:.625rem;min-height:calc(var(--dg-control-height) + 4px);padding:0 .875rem;border:1px solid var(--dg-border);border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .datagrid-toolbar__search-icon{color:var(--dg-text-muted)}.ngb-grid .datagrid-toolbar__search-input{flex:1 1 auto;width:100%;min-width:0;border:0;background:transparent;color:var(--dg-text);outline:none;font-size:.95rem;padding:.625rem 0}.ngb-grid .datagrid-toolbar__search-input::placeholder{color:var(--dg-placeholder)}.ngb-grid .datagrid-toolbar__actions{display:flex;align-items:center;justify-content:flex-end;gap:.625rem;flex-wrap:wrap}.ngb-grid .datagrid-toolbar__button,.ngb-grid .grid-row-action,.ngb-grid .grid-filter-apply,.ngb-grid .grid-filter-clear,.ngb-grid .grid-filter-cancel,.ngb-grid .grid-filter-operator__button,.ngb-grid .grid-filter-menu-trigger,.ngb-grid .grid-detail-toggle{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height);border-radius:var(--dg-radius-md);border:1px solid var(--dg-border);background:var(--dg-surface);color:var(--dg-text);box-shadow:none;font:inherit;text-decoration:none;transition:background-color .12s ease,border-color .12s ease,color .12s ease,box-shadow .12s ease}.ngb-grid .datagrid-toolbar__button:hover,.ngb-grid .grid-row-action:hover,.ngb-grid .grid-filter-apply:hover,.ngb-grid .grid-filter-clear:hover,.ngb-grid .grid-filter-cancel:hover,.ngb-grid .grid-filter-operator__button:hover,.ngb-grid .grid-filter-menu-trigger:hover,.ngb-grid .grid-detail-toggle:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text);text-decoration:none}.ngb-grid .datagrid-toolbar__button:focus-visible,.ngb-grid .grid-row-action:focus-visible,.ngb-grid .grid-filter-apply:focus-visible,.ngb-grid .grid-filter-clear:focus-visible,.ngb-grid .grid-filter-cancel:focus-visible,.ngb-grid .grid-filter-operator__button:focus-visible,.ngb-grid .grid-filter-menu-trigger:focus-visible,.ngb-grid .grid-detail-toggle:focus-visible,.ngb-grid .grid-sort-button:focus-visible,.ngb-grid .grid-edit-control:focus-visible,.ngb-grid .grid-filter-control:focus-visible,.ngb-grid .datagrid-toolbar__search-input:focus-visible{outline:none;border-color:var(--dg-focus-border);box-shadow:var(--dg-focus-shadow)}.ngb-grid .datagrid-toolbar__button{padding:.625rem 1rem;font-size:.875rem;font-weight:400}.ngb-grid .datagrid-toolbar__button--primary{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--primary:hover{background:var(--dg-primary-hover);border-color:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid .datagrid-toolbar__button--secondary{background:var(--dg-surface);color:var(--dg-text)}.ngb-grid .ngb-grid__group-panel{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;min-height:3.25rem;margin-bottom:.9rem;padding:.75rem .9rem;border:1px dashed var(--dg-border-strong);border-radius:var(--dg-radius-md);background:color-mix(in srgb,var(--dg-surface-muted) 72%,white);transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.ngb-grid .ngb-grid__group-panel--active{border-color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 45%,white);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--dg-primary) 22%,transparent)}.ngb-grid .ngb-grid__group-panel--denied{border-color:var(--dg-danger, #dc3545);background:color-mix(in srgb,var(--dg-danger, #dc3545) 8%,white)}.ngb-grid .ngb-grid__group-panel-label{font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-list{display:inline-flex;align-items:center;gap:.55rem;flex-wrap:wrap}.ngb-grid .ngb-grid__group-chip{display:inline-flex;align-items:center;gap:.25rem;border:1px solid color-mix(in srgb,var(--dg-primary) 26%,var(--dg-border));border-radius:999px;background:var(--dg-surface);box-shadow:var(--dg-shadow-sm)}.ngb-grid .ngb-grid__group-chip-button,.ngb-grid .ngb-grid__group-chip-remove{display:inline-flex;align-items:center;gap:.4rem;min-height:2rem;border:0;background:transparent;color:var(--dg-text)}.ngb-grid .ngb-grid__group-chip-button{padding:.35rem .55rem .35rem .8rem;font-size:.8125rem;font-weight:600}.ngb-grid .ngb-grid__group-chip-remove{padding:.35rem .75rem .35rem .15rem;color:var(--dg-text-muted)}.ngb-grid .ngb-grid__group-chip-button:hover,.ngb-grid .ngb-grid__group-chip-remove:hover{color:var(--dg-primary)}.ngb-grid .ngb-grid__group-chip-button:focus-visible,.ngb-grid .ngb-grid__group-chip-remove:focus-visible,.ngb-grid .grid-column-group-handle:focus-visible,.ngb-grid .grid-group-row__toggle:focus-visible{outline:none;box-shadow:var(--dg-focus-shadow);border-radius:999px}.ngb-grid .ngb-grid__group-chip-dir{font-size:.8rem;color:var(--dg-primary)}.ngb-grid .table-wrapper{position:relative;overflow-x:hidden;overflow-y:clip;border:var(--dg-table-border-width) solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-sm);isolation:isolate}.ngb-grid .table-body-scroll{max-height:24rem;overflow-y:auto;overflow-x:auto;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border);scrollbar-gutter:stable both-edges;position:relative;z-index:0}.ngb-grid .ngb-grid__group-sticky-layer{position:absolute;inset-inline-start:0;z-index:35;min-width:100%;pointer-events:none}.ngb-grid .ngb-grid__group-sticky-layer--top,.ngb-grid .ngb-grid__group-sticky-layer--bottom{top:0}.ngb-grid .grid-group-sticky-table{min-width:100%;pointer-events:auto}.ngb-grid .grid-table{width:max-content;min-width:100%;table-layout:fixed;margin:0;border-collapse:separate;border-spacing:0}.ngb-grid.ngb-grid--resizable .grid-table{min-width:0;width:max-content}.ngb-grid.ngb-grid--resizable .grid-table th,.ngb-grid.ngb-grid--resizable .grid-table td{box-sizing:border-box}.ngb-grid .grid-header-shell{position:relative;z-index:20;overflow:hidden}.ngb-grid .grid-header{position:relative;z-index:20;overflow:visible}.ngb-grid .grid-header thead tr:first-child th:first-child{border-top-left-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead tr:first-child th:last-child{border-top-right-radius:var(--dg-radius-lg)}.ngb-grid .grid-header thead th{background:var(--dg-surface-muted);border-bottom:var(--dg-table-border-width) solid var(--dg-border);color:var(--dg-text);font-size:var(--dg-font-size-header);font-weight:600;text-transform:none;letter-spacing:.01em;overflow:visible}.ngb-grid .grid-table th,.ngb-grid .grid-table td{vertical-align:middle;border-bottom:var(--dg-table-border-width) solid var(--dg-border);padding:var(--dg-cell-padding-y) var(--dg-cell-padding-x);font-size:var(--dg-font-size-cell)}.ngb-grid .grid-table th{padding:var(--dg-header-padding-y) var(--dg-header-padding-x)}.ngb-grid .grid-table td{background:var(--dg-surface);color:var(--dg-text);font-weight:400}.ngb-grid .grid-table th{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-header .grid-table th{overflow:visible}.ngb-grid .grid-header thead tr:first-child th.grid-header__column--resizable{position:relative}.ngb-grid .grid-column-resize-handle{position:absolute;top:0;right:0;width:.45rem;height:100%;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;z-index:3}.ngb-grid .grid-column-resize-handle:after{content:\"\";position:absolute;top:.35rem;bottom:.35rem;right:.1rem;width:2px;border-radius:1px;background:var(--dg-border-strong);opacity:0;transition:opacity .15s ease}.ngb-grid .grid-header__column--resizable:hover .grid-column-resize-handle:after,.ngb-grid .grid-column-resize-handle:focus-visible:after{opacity:1}body.ngb-datagrid-column-resizing{cursor:col-resize!important;-webkit-user-select:none;user-select:none}.ngb-grid.ngb-grid--column-reorderable .grid-header thead tr:first-child th.grid-header__column--reorderable{position:relative}.ngb-grid .grid-column-reorder-handle{flex:0 0 auto;margin-right:.15rem;padding:.1rem .18rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;opacity:.82;line-height:1;font-size:.95rem}.ngb-grid .grid-header__column--reorderable:hover .grid-column-reorder-handle,.ngb-grid .grid-column-reorder-handle:focus-visible{opacity:1;background:color-mix(in srgb,var(--dg-accent) 12%,transparent)}.ngb-grid .grid-column-group-handle{flex:0 0 auto;padding:.15rem .25rem;border-radius:999px;color:var(--dg-text-muted);cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;font-size:.9rem}.ngb-grid .grid-column-group-handle--active,.ngb-grid .grid-column-group-handle:hover{color:var(--dg-primary);background:color-mix(in srgb,var(--dg-primary-soft) 55%,transparent)}.ngb-grid .grid-header__column--drag-over{background:color-mix(in srgb,var(--dg-accent) 12%,transparent);box-shadow:inset 0 -2px 0 var(--dg-accent)}.ngb-grid .grid-header__cell{display:flex;align-items:center;justify-content:space-between;gap:.625rem;width:100%;overflow:visible}.ngb-grid .grid-sort-button{display:inline-flex;align-items:center;justify-content:space-between;gap:.5rem;width:100%;padding:0;border:0;background:transparent;color:inherit;text-align:left}.ngb-grid .grid-sort-button__label{min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-sort-button__indicator{flex:0 0 auto;font-size:.8rem;color:var(--dg-placeholder)}.ngb-grid .grid-sort-button__indicator--active{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-host{position:relative;display:inline-flex;flex:0 0 auto;z-index:30}.ngb-grid .grid-filter-menu-popover:not(.ngb-datagrid-floating-panel){position:absolute;top:calc(100% + .5rem);right:0;z-index:120}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface{position:static;top:auto;right:auto}.ngb-grid .grid-filter-menu-trigger{min-width:var(--dg-control-height);width:var(--dg-control-height);height:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check .bi{color:var(--dg-placeholder)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check{border-color:var(--dg-focus-border);background:var(--dg-primary-soft);color:var(--dg-primary)}.ngb-grid .grid-filter-menu-trigger--check.grid-filter-menu-trigger--active .bi,.ngb-grid .filter-menu-active .grid-filter-menu-trigger--check .bi{color:var(--dg-primary)}.ngb-grid .grid-filter-menu-surface{position:absolute;top:calc(100% + .5rem);right:0;min-width:18rem;padding:1rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md);background:var(--dg-surface);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-menu-surface__header{margin-bottom:.875rem}.ngb-grid .grid-filter-menu-surface__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-subtle)}.ngb-grid .grid-filter-menu-surface__title{margin-top:.15rem;font-size:.95rem;font-weight:700;color:var(--dg-text)}.ngb-grid .grid-filter-stack{display:flex;flex-direction:column;gap:.75rem}.ngb-grid .grid-filter-stack--multi{gap:.65rem}.ngb-grid .grid-filter-operator-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem;color:var(--dg-text)}.ngb-grid .grid-filter-operator-select--compact{width:auto;min-width:2.25rem;max-width:3.5rem;padding:.35rem .25rem;font-size:.6875rem}.ngb-grid .grid-filter-logic-select{display:flex;justify-content:center;margin:.15rem 0}.ngb-grid .grid-filter-logic-select select{width:auto;min-width:4.5rem;min-height:1.75rem;padding:.2rem 1.5rem .2rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600}.ngb-grid .grid-filter-menu-surface__actions--split{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}.ngb-grid .grid-filter-apply--secondary,.ngb-grid .grid-filter-cancel--secondary{width:100%;border:1px solid var(--dg-border-strong);background:var(--dg-surface-muted);color:var(--dg-text);font-weight:600}.ngb-grid .grid-filter-apply--secondary:hover,.ngb-grid .grid-filter-cancel--secondary:hover{background:var(--dg-surface-subtle)}.ngb-grid .grid-filter-multi-panel{display:flex;flex-direction:column;gap:.5rem;min-width:16.5rem}.ngb-grid .grid-filter-join-select{display:inline-block;width:fit-content;max-width:100%;margin:.1rem 0}.ngb-grid .grid-filter-join-select__control{width:100%;min-height:1.75rem;padding:.2rem 1.25rem .2rem .5rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.8125rem;font-weight:600;text-align:left}.ngb-grid .grid-filter-value-input,.ngb-grid .grid-filter-value-select{width:100%;min-height:var(--dg-control-height);padding:.45rem .65rem;border:1px solid var(--dg-border);border-radius:.375rem;background:var(--dg-surface);font-size:.875rem}.ngb-grid .grid-filter-apply--secondary:disabled,.ngb-grid .grid-filter-cancel--secondary:disabled{opacity:.45;cursor:not-allowed}.ngb-grid .grid-group-row td,.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 88%,white);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-group-row--overlay td{box-shadow:inset 0 -1px 0 var(--dg-border),0 1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-footer-row--overlay td{box-shadow:inset 0 1px 0 var(--dg-border),0 -1px color-mix(in srgb,var(--dg-border) 36%,transparent)}.ngb-grid .grid-group-row__cell{padding:0;vertical-align:top}.ngb-grid .grid-group-footer-row__cell,.ngb-grid .grid-group-row__utility-cell{padding:.7rem .75rem;vertical-align:top}.ngb-grid .grid-group-row__toggle{display:flex;align-items:center;gap:.55rem;width:100%;padding:.7rem 1rem;border:0;background:transparent;color:var(--dg-text);text-align:left;font-size:.875rem;font-weight:600}.ngb-grid .grid-group-row__cell--lead .grid-group-row__toggle{padding-inline-end:.75rem}.ngb-grid .grid-group-row__toggle:hover{background:color-mix(in srgb,var(--dg-primary-soft) 34%,transparent)}.ngb-grid .grid-group-row__content{display:inline-flex;align-items:center;gap:.5rem;min-width:0}.ngb-grid .grid-group-row__label{color:var(--dg-text)}.ngb-grid .grid-group-row__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__column-slot{padding:.25rem .75rem .75rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-group-row__cell--lead .grid-group-row__column-slot{padding-inline-start:2.75rem}.ngb-grid .grid-group-footer-row td{background:color-mix(in srgb,var(--dg-surface-muted) 94%,white)}.ngb-grid .grid-filter-menu-popover .grid-filter-menu-surface:has(.grid-filter-menu-surface__multi){width:16.25rem;max-width:min(16.25rem,92vw);padding:.75rem}.ngb-grid .grid-filter-menu-surface__multi{display:flex;flex-direction:column;gap:.5rem;width:100%}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-menu-surface__search{border-radius:.5rem;min-height:2rem;padding:.4rem .65rem;font-size:.8125rem}.ngb-grid .grid-multi-filter-list{max-height:11.5rem;overflow:auto;margin:0 -.75rem;padding:.15rem 0;border-top:1px solid var(--dg-border);border-bottom:1px solid var(--dg-border)}.ngb-grid .grid-multi-filter-option{display:flex;align-items:center;justify-content:space-between;gap:.75rem;width:100%;padding:.45rem .75rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);cursor:pointer}.ngb-grid .grid-multi-filter-option+.grid-multi-filter-option{border-top:1px solid var(--dg-filter-divider)}.ngb-grid .grid-multi-filter-option--summary{font-weight:700}.ngb-grid .grid-multi-filter-option__main{display:inline-flex;align-items:center;gap:.75rem;min-width:0}.ngb-grid .grid-multi-filter-option__main input{width:1rem;height:1rem;margin:0;accent-color:var(--dg-primary);flex:0 0 auto}.ngb-grid .grid-multi-filter-option__count{font-size:.75rem;font-weight:700;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__label{font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-stack__footer,.ngb-grid .grid-filter-menu-surface__actions{display:flex;align-items:center;justify-content:space-between;gap:.625rem}.ngb-grid .grid-filter-inline{display:flex;align-items:center;gap:.45rem;min-width:0;width:100%}.ngb-grid .grid-filter-field{position:relative;min-width:12rem;flex:1 1 auto}.ngb-grid .grid-filter-field--with-icon .grid-filter-control{padding-right:2.25rem}.ngb-grid .grid-filter-field__icon{position:absolute;right:.8rem;top:50%;transform:translateY(-50%);color:var(--dg-placeholder);pointer-events:none}.ngb-grid .grid-filter-control,.ngb-grid .grid-edit-control{width:100%;min-width:0;min-height:var(--dg-control-height);padding:.5rem .75rem;border:1px solid var(--dg-border);border-radius:.3rem;background:var(--dg-surface);color:var(--dg-text);font-size:.875rem}.ngb-grid .grid-edit-checkbox{width:1rem;height:1rem;margin-top:0}.ngb-grid .grid-filter-operator{position:relative;flex:0 0 auto}.ngb-grid .grid-filter-operator__button{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-filter-operator__button--compact{min-width:var(--dg-control-height);width:var(--dg-control-height);padding:0}.ngb-grid .grid-filter-operator__button--active{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-grid .grid-filter-operator .dropdown-menu:not(.ngb-datagrid-floating-panel){position:absolute;inset:calc(100% + .35rem) 0 auto auto;min-width:12rem;margin:0;border-radius:.9rem;border-color:var(--dg-border);box-shadow:var(--dg-shadow-md);z-index:120}.ngb-grid .grid-filter-clear{padding:.55rem .8rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-grid .grid-filter-apply{padding:.625rem .95rem;border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary);font-size:.875rem;font-weight:600}.ngb-grid .grid-filter-apply:hover{border-color:var(--dg-primary-active);background:var(--dg-primary-active);color:var(--dg-on-primary)}.ngb-grid .grid-filter-menu-surface__actions--multi{justify-content:space-between;margin-top:.35rem}.ngb-grid .grid-filter-menu-surface__multi .grid-filter-apply{min-width:5.25rem;padding:.5rem 1.15rem;font-size:.8125rem}.ngb-grid .grid-filter-cancel{padding:.5rem .85rem;font-size:.8125rem;font-weight:600;color:var(--dg-text);border:1px solid var(--dg-border-strong);background:var(--dg-surface)}.ngb-grid .grid-filter-cancel:hover{border-color:var(--dg-border-strong);background:var(--dg-surface-subtle);color:var(--dg-text)}.ngb-grid .filter-row th{background:var(--dg-surface-filter-row);padding-top:.625rem;padding-bottom:.625rem;overflow:visible;position:relative;z-index:25}.ngb-grid.ngb-grid--menu-open .filter-row th{z-index:85}.ngb-grid .column-pinned-start,.ngb-grid .column-pinned-end{position:sticky;background:inherit;z-index:2}.ngb-grid .grid-header .column-pinned-start,.ngb-grid .grid-header .column-pinned-end{z-index:6}.ngb-grid .column-pinned-start{box-shadow:var(--dg-pin-shadow-start)}.ngb-grid .column-pinned-start:has(+.column-pinned-start){box-shadow:none}.ngb-grid .column-pinned-end{box-shadow:var(--dg-pin-shadow-end)}.ngb-grid .column-locked{background:var(--dg-locked-bg)}.ngb-grid .sticky-row,.ngb-grid .sticky-row td{background:var(--dg-surface-sticky-row);box-shadow:inset 0 0 0 1px var(--dg-sticky-border)}.ngb-grid .sticky-row{position:sticky;z-index:4}.ngb-grid .grid-sticky-badge{display:inline-flex;align-items:center;margin-left:.45rem;padding:.12rem .4rem;border-radius:.25rem;background:var(--dg-sticky-badge-bg);color:var(--dg-sticky-badge-text);font-size:.62rem;font-weight:800;letter-spacing:.04em;vertical-align:middle}.ngb-grid .grid-row-action--icon{min-width:2.05rem;width:2.05rem;height:2.05rem;min-height:2.05rem;padding:0;border-radius:var(--dg-radius-md)}.ngb-grid .grid-row-action--edit-icon{border-color:var(--dg-primary);background:var(--dg-primary);color:var(--dg-on-primary)}.ngb-grid .grid-row-action--edit-icon:hover{border-color:var(--dg-primary-hover);background:var(--dg-primary-hover);color:var(--dg-on-primary)}.ngb-grid.ngb-grid--zebra .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected) td{background:var(--dg-row-even-bg, var(--dg-surface-muted))}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(odd):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-odd-bg)}.ngb-grid:not(.ngb-grid--zebra) .grid-body tbody tr:nth-child(2n):not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-even-bg)}.ngb-grid .grid-body tbody tr.grid-data-row:hover:not(.sticky-row):not(.row-selected):not(.row-highlight) td{background:var(--dg-row-hover-bg)}.ngb-grid .row-selected,.ngb-grid .row-selected td{background:var(--dg-row-selected-bg)}.ngb-grid .row-highlight,.ngb-grid .row-highlight td{background:var(--dg-warning-soft)}.ngb-grid .grid-header th.column-pinned-start,.ngb-grid .grid-header th.column-pinned-end,.ngb-grid .grid-body tbody td.column-pinned-start,.ngb-grid .grid-body tbody td.column-pinned-end{background:var(--dg-surface)}.ngb-grid .grid-header th.column-locked,.ngb-grid .grid-body tbody td.column-locked{background:var(--dg-locked-bg)!important}.ngb-grid .grid-body tbody tr.row-selected td.column-locked{background:var(--dg-row-selected-bg)!important}.ngb-grid .cell-highlight{background:var(--dg-primary-soft)}.ngb-grid .grid-search-highlight{padding:0;border-radius:.15rem;background:var(--dg-sticky-badge-bg);color:inherit;font-weight:inherit}.ngb-grid .grid-detail-toggle{min-width:2rem;width:2rem;height:2rem;padding:0;border-radius:999px}.ngb-grid .grid-cell-content{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis}.ngb-grid .grid-cell-content,.ngb-grid .grid-cell-text{font-weight:400}.ngb-grid .grid-cell--emphasis .grid-cell-content,.ngb-grid .grid-cell--emphasis .grid-cell-text{font-weight:700}.ngb-grid .grid-boolean-pill{display:inline-flex;align-items:center;justify-content:center;min-width:3.5rem;padding:.25rem .55rem;border-radius:999px;background:var(--dg-neutral-pill-bg);color:var(--dg-text-muted);font-size:.75rem;font-weight:700}.ngb-grid .grid-boolean-pill--true{background:var(--dg-success-soft);color:var(--dg-success-text)}.ngb-grid .grid-row-action{padding:.55rem .8rem;font-size:.8125rem;font-weight:600;white-space:nowrap}.ngb-grid .grid-actions-cell{overflow:visible;text-overflow:clip;white-space:normal}.ngb-grid .grid-actions-cell__inner{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;flex-wrap:nowrap}.ngb-grid .grid-row-action--secondary{color:var(--dg-primary);background:var(--dg-primary-soft);border-color:var(--dg-primary-border-subtle)}.ngb-grid .grid-row-action--danger{color:var(--dg-danger-text);background:var(--dg-danger-soft);border-color:var(--dg-danger-border-subtle)}.ngb-grid .grid-row-action--success{color:var(--dg-success-text);background:var(--dg-success-soft);border-color:var(--dg-success-border-subtle)}.ngb-grid .grid-row-action--neutral{color:var(--dg-text-muted);background:var(--dg-locked-bg);border-color:var(--dg-border)}.ngb-grid .grid-detail-row__cell{padding:0;background:var(--dg-detail-row-bg)}.ngb-grid .grid-detail-row__content{padding:1rem 1.25rem}.ngb-grid.ngb-grid--compact .grid-table th,.ngb-grid.ngb-grid--compact .grid-table td{padding:.55rem .65rem}.ngb-grid.ngb-grid--compact .datagrid-toolbar__button,.ngb-grid.ngb-grid--compact .grid-row-action,.ngb-grid.ngb-grid--compact .grid-filter-apply,.ngb-grid.ngb-grid--compact .grid-filter-clear,.ngb-grid.ngb-grid--compact .grid-filter-operator__button,.ngb-grid.ngb-grid--compact .grid-filter-menu-trigger,.ngb-grid.ngb-grid--compact .grid-detail-toggle,.ngb-grid.ngb-grid--compact .grid-filter-control,.ngb-grid.ngb-grid--compact .grid-edit-control{min-height:32px;font-size:.8125rem}.ngb-grid .grid-row--reorderable{cursor:grab}.ngb-grid .grid-row--reorderable.ngb-dnd-dragging{cursor:grabbing;opacity:.82}.ngb-grid .ngb-dnd-placeholder{display:table-row;background:transparent}.ngb-grid tbody.ngb-dnd-list,.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=true],.ngb-grid tbody.ngb-dnd-list.ngb-dnd-over[data-drop-valid=false]{border:0;border-radius:0;background:transparent;box-shadow:none}.ngb-grid .ngb-dnd-placeholder>td{padding:0;border:0;background:transparent}.ngb-grid .ngb-dnd-placeholder__bar{display:block;height:.35rem;background:var(--dg-primary-selection-overlay)}.ngb-grid.ngb-grid--stacked .grid-header-shell,.ngb-grid.ngb-grid--stacked .grid-header{display:none}.ngb-grid.ngb-grid--stacked .table-wrapper{width:100%}.ngb-grid.ngb-grid--stacked .table-body-scroll{width:100%;max-height:none;overflow:visible;border-top:0;border-bottom:0}.ngb-grid.ngb-grid--stacked .grid-table.grid-body{width:100%;min-width:0;max-width:100%;table-layout:auto}.ngb-grid.ngb-grid--stacked .grid-table.grid-body colgroup{display:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody{display:block;width:100%}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .grid-header-shell,.ngb-grid.ngb-grid--row-operator-open .filter-row th{overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-header-shell,.ngb-grid.ngb-grid--menu-open .grid-header{z-index:80}.ngb-grid.ngb-grid--menu-open .grid-header thead th.filter-menu-open{position:relative;z-index:95;overflow:visible}.ngb-grid.ngb-grid--menu-open .grid-filter-menu-host{z-index:90}.ngb-grid__filter-menu-overlay{pointer-events:auto}.ngb-grid__layout-toolbar-host:empty{display:none}.ngb-grid__layout-toolbar-host:not(:empty){border-bottom:1px solid var(--dg-border)}.ngb-grid .table-wrapper{position:relative}.ngb-grid.ngb-grid--loading .table-wrapper{pointer-events:none}.ngb-grid.ngb-grid--loading .table-wrapper .grid-table{opacity:.45}.ngb-grid__loading-overlay{position:absolute;inset:0;z-index:120;display:flex;align-items:center;justify-content:center;background:var(--dg-loading-overlay);pointer-events:none}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody tr{display:grid;width:100%;box-sizing:border-box;grid-template-columns:minmax(0,1fr);gap:.65rem;border-bottom:1px solid var(--dg-border);padding:.9rem 1rem}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td{display:grid;width:100%;min-width:0;box-sizing:border-box;white-space:normal;border-bottom:0;padding:.35rem 0;position:static!important;left:auto!important;right:auto!important}.ngb-grid.ngb-grid--stacked .grid-table.grid-body tbody td:not([data-title]){grid-column:1/-1}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td[data-title]{grid-template-columns:minmax(5.5rem,34%) minmax(0,1fr);align-items:baseline;column-gap:.75rem}.ngb-grid.ngb-grid--stacked:not(.ngb-grid--stacked-cards) .grid-table.grid-body tbody td:before{content:attr(data-title);font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody tr{display:block;width:100%;padding:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td.ngb-stacked-card-cell{display:block;width:100%;padding:.9rem 1rem;border-bottom:1px solid var(--dg-border)}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card,.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{display:grid;grid-template-columns:minmax(0,1fr);gap:1rem}@media(min-width:40rem){.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__layout{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:1.5rem}}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__group{display:flex;flex-direction:column;gap:.85rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__field{display:flex;flex-direction:column;align-items:flex-start;gap:.35rem;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);line-height:1.3}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .ngb-stacked-card__value{width:100%;min-width:0}.ngb-grid.ngb-grid--stacked.ngb-grid--stacked-cards .grid-table.grid-body tbody td:not([data-title]):not(.ngb-stacked-card-cell){display:block;width:100%;padding:.65rem 1rem 0;border-bottom:0}.ngb-grid[data-theme=material] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=tailwind] .datagrid-toolbar__button--primary,.ngb-grid[data-theme=material] .grid-filter-apply,.ngb-grid[data-theme=tailwind] .grid-filter-apply{border-color:var(--dg-primary);background:var(--dg-primary)}.ngb-grid.ngb-responsive .table{width:100%}@media(max-width:992px){.ngb-grid .grid-filter-inline{min-width:11rem}.ngb-grid .grid-filter-field{min-width:10rem}}@media(max-width:768px){.ngb-grid .datagrid-toolbar{align-items:stretch}.ngb-grid .datagrid-toolbar__actions{justify-content:stretch}.ngb-grid .datagrid-toolbar__button{flex:1 1 auto}.ngb-grid .grid-filter-inline{width:100%}.ngb-grid.ngb-responsive thead{display:none}.ngb-grid.ngb-responsive tbody tr{display:grid;grid-template-columns:1fr;gap:.5rem;border:1px solid var(--dg-border);border-radius:.75rem;padding:.75rem;margin-bottom:.75rem}.ngb-grid.ngb-responsive tbody td{display:grid;grid-template-columns:8rem 1fr}.ngb-grid.ngb-responsive tbody td:before{content:attr(data-title);font-weight:600;opacity:.75;padding-right:.5rem}}.ngb-grid .datagrid-editing-toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;padding:.75rem 1rem;border:1px solid var(--dg-border);border-bottom:0;border-radius:var(--dg-radius-lg) var(--dg-radius-lg) 0 0;background:var(--dg-surface)}.ngb-grid .datagrid-editing-toolbar__start,.ngb-grid .datagrid-editing-toolbar__end{display:inline-flex;align-items:center;gap:.5rem}.ngb-grid .datagrid-editing-toolbar__save[hidden],.ngb-grid .datagrid-editing-toolbar__cancel[hidden]{display:none!important}.ngb-grid .datagrid-editing-toolbar__hint{flex:1 1 auto;text-align:center;font-size:.875rem;font-weight:600;color:var(--dg-text-muted)}.ngb-grid .grid-cell--incell{cursor:cell}.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content,.ngb-grid .grid-cell--incell:not(.grid-cell--editing) .grid-cell-content *{pointer-events:none}.ngb-grid .grid-cell--editing .grid-edit-control{border-color:var(--dg-primary);box-shadow:var(--dg-focus-shadow)}.ngb-grid .grid-external-editor{position:fixed;inset:0;z-index:400;display:flex;align-items:center;justify-content:center;padding:1.5rem}.ngb-grid .grid-external-editor__backdrop{position:absolute;inset:0;border:0;background:var(--dg-backdrop);cursor:pointer}.ngb-grid .grid-external-editor__panel{position:relative;z-index:1;width:min(32rem,100%);max-height:min(90vh,40rem);overflow:auto;padding:1.25rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-grid .grid-external-editor__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.ngb-grid .grid-external-editor__title{margin:0;font-size:1.125rem;font-weight:700}.ngb-grid .grid-external-editor__close{border:0;background:transparent;color:var(--dg-text-muted);padding:.25rem;cursor:pointer}.ngb-grid .grid-external-editor__form{display:grid;gap:.85rem}.ngb-grid .grid-external-editor__field{display:grid;gap:.35rem}.ngb-grid .grid-external-editor__label{font-size:.8125rem;font-weight:700;color:var(--dg-text-muted);text-transform:uppercase;letter-spacing:.03em}.ngb-grid .grid-external-editor__error{font-size:.75rem;color:var(--dg-danger)}.ngb-grid .grid-external-editor__actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.5rem}.ngb-grid__status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ngb-grid .grid-body td[role=gridcell]:focus-visible,.ngb-grid .grid-body td[role=gridcell].grid-cell--focused{outline:2px solid var(--dg-focus-ring);outline-offset:-2px}.ngb-grid--rtl .grid-column-reorder-handle{transform:scaleX(-1)}.ngb-grid--rtl .column-pinned-start{left:auto;right:var(--dg-pin-start, 0)}.ngb-grid--rtl .column-pinned-end{right:auto;left:var(--dg-pin-end, 0)}.ngb-grid .grid-footer{width:100%;color:var(--dg-pager-text)}.ngb-grid .grid-footer--top{margin-bottom:0;border-bottom:var(--dg-table-border-width) solid var(--dg-border)}.ngb-grid .grid-footer--custom{width:100%}\n"] }]
9348
10580
  }], propDecorators: { columns: [{
9349
10581
  type: Input
9350
10582
  }], data: [{
@@ -9373,6 +10605,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9373
10605
  type: Input
9374
10606
  }], dataOperations: [{
9375
10607
  type: Input
10608
+ }], groupable: [{
10609
+ type: Input
10610
+ }], group: [{
10611
+ type: Input
10612
+ }], groupedData: [{
10613
+ type: Input
9376
10614
  }], state: [{
9377
10615
  type: Input
9378
10616
  }], multiCheckboxFilterOptions: [{
@@ -9516,6 +10754,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9516
10754
  type: Output
9517
10755
  }], rowDelete: [{
9518
10756
  type: Output
10757
+ }], groupChange: [{
10758
+ type: Output
9519
10759
  }], sortChange: [{
9520
10760
  type: Output
9521
10761
  }], filterChange: [{
@@ -9538,8 +10778,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9538
10778
  }], pagerTpl: [{
9539
10779
  type: ContentChild,
9540
10780
  args: [NgbPagerTemplate]
10781
+ }], groupHeaderTpl: [{
10782
+ type: ContentChild,
10783
+ args: [NgbDataGridGroupHeaderTemplateDirective]
9541
10784
  }], pageSize: [{
9542
10785
  type: Input
10786
+ }], onWindowResize: [{
10787
+ type: HostListener,
10788
+ args: ['window:resize']
9543
10789
  }], onDocumentMouseMove: [{
9544
10790
  type: HostListener,
9545
10791
  args: ['document:mousemove', ['$event']]
@@ -9561,6 +10807,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9561
10807
  }], globalTplQ: [{
9562
10808
  type: ContentChildren,
9563
10809
  args: [NgbGlobalFilterTemplate]
10810
+ }], groupHeaderColumnTplQ: [{
10811
+ type: ContentChildren,
10812
+ args: [NgbDataGridGroupHeaderColumnTemplateDirective]
10813
+ }], groupFooterTplQ: [{
10814
+ type: ContentChildren,
10815
+ args: [NgbDataGridGroupFooterTemplateDirective]
9564
10816
  }], gridColumnQ: [{
9565
10817
  type: ContentChildren,
9566
10818
  args: [NgbGridColumnDirective]
@@ -11289,7 +12541,7 @@ class NgbGridChartComponent {
11289
12541
  </div>
11290
12542
  }
11291
12543
  </div>
11292
- `, isInline: true, styles: [":host{display:block}.ngb-grid-chart__split-layout,.ngb-grid-chart__full-layout{display:grid;gap:1rem;align-items:stretch}.ngb-grid-chart__split-layout{grid-template-columns:minmax(0,1.15fr) minmax(280px,.85fr)}.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.ngb-grid-chart__grid-pane,.ngb-grid-chart__chart-pane,.ngb-grid-chart__summary-pane{min-width:0}.ngb-grid-chart__chart-pane{display:flex;flex-direction:column;gap:.5rem}.ngb-grid-chart__dimension{display:inline-flex;align-items:flex-start;gap:.55rem;min-width:0}.ngb-grid-chart__subdimension{display:block;font-size:.82rem;color:#6b7280;font-weight:500}.ngb-grid-chart__series-dot{width:.55rem;height:.55rem;border-radius:999px;margin-top:.35rem;flex:0 0 auto}.ngb-grid-chart__growth{font-weight:700}.ngb-grid-chart__growth--up{color:#16a34a}.ngb-grid-chart__growth--down{color:#ef4444}@media(max-width:960px){.ngb-grid-chart__split-layout,.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Datagrid, selector: "ngb-datagrid", inputs: ["columns", "data", "loading", "total", "enableSorting", "enableFiltering", "filterable", "enableGlobalFilter", "filterMode", "filter", "filterOperators", "filterManual", "externalFiltering", "dataOperations", "state", "multiCheckboxFilterOptions", "enablePagination", "pageable", "enableEdit", "enableDelete", "pageSizeOptions", "enableAdd", "addButtonAriaLabel", "addButtonText", "stickyRows", "stickyHeader", "stickyFooter", "scrollable", "stickyRowHeight", "stickyHeaderHeight", "stickyFooterHeight", "tableOptions", "dataLayoutMode", "selectionMode", "selectionBehavior", "selectionKeyMode", "selectAllEnabled", "selectionA11yLabels", "selectionDisabledFn", "highlightedIndex", "highlightRowKey", "highlightColKey", "globalFilterAriaLabel", "globalFilterPlaceholder", "searchHighlightTerm", "searchHighlightFields", "expandRowAriaLabel", "collapseRowAriaLabel", "exportPdfAriaLabel", "exportExcelAriaLabel", "newRowDefaults", "strictEmail", "editOnRowClick", "editMode", "toolbarEditHint", "singleExpand", "exportOptions", "theme", "responsive", "trackBy", "rowClass", "rowStyle", "rowReorderable", "columnReorderable", "resizable", "actionDisplay", "showStickyRowBadge", "stickyRowBadgeField", "stickyRowBadgeLabel", "labels", "locale", "dir", "keyboardNavigation", "editService", "dataProviderAll", "dataProviderSelection", "pageSize"], outputs: ["rowAdd", "rowEdit", "rowSave", "rowCancel", "rowDelete", "sortChange", "filterChange", "filtersChange", "pageChange", "dataStateChange", "selectionChange", "rowReorder", "columnReorder"] }, { kind: "directive", type: NgbCellTemplate, selector: "ng-template[ngbCell]", inputs: ["ngbCell"] }, { kind: "component", type: NgbDataChartComponent, selector: "ngb-data-chart", inputs: ["config", "ariaLabel", "emptyState"] }, { kind: "component", type: NgbDataSparklineComponent, selector: "ngb-data-sparkline", inputs: ["values", "width", "height", "strokeWidth", "positiveColor", "negativeColor", "neutralColor", "color", "showEndDot", "endDotRadius", "ariaLabel"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12544
+ `, isInline: true, styles: [":host{display:block}.ngb-grid-chart__split-layout,.ngb-grid-chart__full-layout{display:grid;gap:1rem;align-items:stretch}.ngb-grid-chart__split-layout{grid-template-columns:minmax(0,1.15fr) minmax(280px,.85fr)}.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.ngb-grid-chart__grid-pane,.ngb-grid-chart__chart-pane,.ngb-grid-chart__summary-pane{min-width:0}.ngb-grid-chart__chart-pane{display:flex;flex-direction:column;gap:.5rem}.ngb-grid-chart__dimension{display:inline-flex;align-items:flex-start;gap:.55rem;min-width:0}.ngb-grid-chart__subdimension{display:block;font-size:.82rem;color:#6b7280;font-weight:500}.ngb-grid-chart__series-dot{width:.55rem;height:.55rem;border-radius:999px;margin-top:.35rem;flex:0 0 auto}.ngb-grid-chart__growth{font-weight:700}.ngb-grid-chart__growth--up{color:#16a34a}.ngb-grid-chart__growth--down{color:#ef4444}@media(max-width:960px){.ngb-grid-chart__split-layout,.ngb-grid-chart--full .ngb-grid-chart__full-layout{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Datagrid, selector: "ngb-datagrid", inputs: ["columns", "data", "loading", "total", "enableSorting", "enableFiltering", "filterable", "enableGlobalFilter", "filterMode", "filter", "filterOperators", "filterManual", "externalFiltering", "dataOperations", "groupable", "group", "groupedData", "state", "multiCheckboxFilterOptions", "enablePagination", "pageable", "enableEdit", "enableDelete", "pageSizeOptions", "enableAdd", "addButtonAriaLabel", "addButtonText", "stickyRows", "stickyHeader", "stickyFooter", "scrollable", "stickyRowHeight", "stickyHeaderHeight", "stickyFooterHeight", "tableOptions", "dataLayoutMode", "selectionMode", "selectionBehavior", "selectionKeyMode", "selectAllEnabled", "selectionA11yLabels", "selectionDisabledFn", "highlightedIndex", "highlightRowKey", "highlightColKey", "globalFilterAriaLabel", "globalFilterPlaceholder", "searchHighlightTerm", "searchHighlightFields", "expandRowAriaLabel", "collapseRowAriaLabel", "exportPdfAriaLabel", "exportExcelAriaLabel", "newRowDefaults", "strictEmail", "editOnRowClick", "editMode", "toolbarEditHint", "singleExpand", "exportOptions", "theme", "responsive", "trackBy", "rowClass", "rowStyle", "rowReorderable", "columnReorderable", "resizable", "actionDisplay", "showStickyRowBadge", "stickyRowBadgeField", "stickyRowBadgeLabel", "labels", "locale", "dir", "keyboardNavigation", "editService", "dataProviderAll", "dataProviderSelection", "pageSize"], outputs: ["rowAdd", "rowEdit", "rowSave", "rowCancel", "rowDelete", "groupChange", "sortChange", "filterChange", "filtersChange", "pageChange", "dataStateChange", "selectionChange", "rowReorder", "columnReorder"] }, { kind: "directive", type: NgbCellTemplate, selector: "ng-template[ngbCell]", inputs: ["ngbCell"] }, { kind: "component", type: NgbDataChartComponent, selector: "ngb-data-chart", inputs: ["config", "ariaLabel", "emptyState"] }, { kind: "component", type: NgbDataSparklineComponent, selector: "ngb-data-sparkline", inputs: ["values", "width", "height", "strokeWidth", "positiveColor", "negativeColor", "neutralColor", "color", "showEndDot", "endDotRadius", "ariaLabel"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11293
12545
  }
11294
12546
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridChartComponent, decorators: [{
11295
12547
  type: Component,
@@ -14254,11 +15506,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
14254
15506
  args: ['nodeBtn', { read: ElementRef }]
14255
15507
  }] } });
14256
15508
 
14257
- /// <reference path="./types/optional-peer-deps.d.ts" />
14258
-
14259
15509
  /**
14260
15510
  * Generated bundle index. Do not edit.
14261
15511
  */
14262
15512
 
14263
- export { BrowserExcelExportAdapter, DATAGRID_COLUMN_DIRECTIVES, DATAGRID_TEMPLATE_DIRECTIVES, DND_I18N, DND_LIVE_ANNOUNCE, Datagrid, ExcelExportAdapter, ExportButtonDirective, JsPdfAdapter, NGB_BOOLEAN_FILTER_OPERATORS, NGB_DATAGRID_DEFAULT_LABELS, NGB_DATAGRID_DEFAULT_PAGEABLE, NGB_DATAGRID_HOST, NGB_DATAGRID_KEYBOARD_SHORTCUTS, NGB_DATAGRID_PAGER_BREAKPOINTS, NGB_DATAGRID_THEME_OPTIONS, NGB_DATE_FILTER_OPERATORS, NGB_NUMERIC_FILTER_OPERATORS, NGB_PAGER_BREAKPOINTS, NGB_PAGER_DEFAULT_SETTINGS, NGB_SELECT_FILTER_OPERATORS, NGB_TEXT_FILTER_OPERATORS, NgbAdvancedSearchComponent, NgbCellTemplate, NgbChipsComponent, NgbDataChartComponent, NgbDataSparklineComponent, NgbDatagridButtonDirective, NgbDatagridColumnChooserToolComponent, NgbDatagridControlDirective, NgbDatagridDefaultEditService, NgbDatagridFieldShellComponent, NgbDatagridFilterToolComponent, NgbDatagridFloatingPanelDirective, NgbDatagridLayoutToolbarComponent, NgbDatagridLayoutToolbarSpacerComponent, NgbDatagridSortToolComponent, NgbDatagridSurfaceCardComponent, NgbDatagridThemePickerComponent, NgbDndHandleDirective, NgbDndItemDirective, NgbDndListDirective, NgbDndState, NgbEditorTemplate, NgbExportService, NgbFilterMenuTemplate, NgbFilterTemplate, NgbGlobalFilterTemplate, NgbGridChartComponent, NgbGridColumnDirective, NgbJsonPreviewComponent, NgbLiveAnnouncer, NgbPagerComponent, NgbPagerTemplate, NgbPaginationComponent, NgbRowDetailTemplate, NgbSearchHighlightComponent, NgbSplitterComponent, NgbSplitterPaneComponent, NgbStepLabelDirective, NgbStepperComponent, NgbTreeComponent, NgbTypeaheadComponent, PdfExportAdapter, defaultDndI18n, ngbAggregateValues, ngbAllowedFilterOperators, ngbApplyDataGridOperations, ngbBuildChartJsConfig, ngbBuildColumnSelectionChartData, ngbBuildFullGridChartData, ngbBuildRowSelectionChartData, ngbBuildSparklinePoints, ngbCalculateDataGridAggregates, ngbChartPalette, ngbColumnTypeToFilterType, ngbDatagridPagerSettings, ngbDefaultFilterOperator, ngbFilterOperatorLabel, ngbFindFieldFilterDescriptor, ngbFlattenFilterDescriptors, ngbFormatDatagridLabel, ngbFormatPagerRangeLabel, ngbIsCompositeFilter, ngbOperatorRequiresFilterValue, ngbPagerButtonCountForDensity, ngbResolveDatagridPagerSettings, ngbResolvePageableSettings, ngbResolvePagerDensity, ngbResolvePagerPageSizeOptions, ngbResolvePagerSettings, ngbSetFieldFilter };
15513
+ export { BrowserExcelExportAdapter, DATAGRID_COLUMN_DIRECTIVES, DATAGRID_TEMPLATE_DIRECTIVES, DND_I18N, DND_LIVE_ANNOUNCE, Datagrid, ExcelExportAdapter, ExportButtonDirective, JsPdfAdapter, NGB_BOOLEAN_FILTER_OPERATORS, NGB_DATAGRID_DEFAULT_LABELS, NGB_DATAGRID_DEFAULT_PAGEABLE, NGB_DATAGRID_HOST, NGB_DATAGRID_KEYBOARD_SHORTCUTS, NGB_DATAGRID_PAGER_BREAKPOINTS, NGB_DATAGRID_THEME_OPTIONS, NGB_DATE_FILTER_OPERATORS, NGB_NUMERIC_FILTER_OPERATORS, NGB_PAGER_BREAKPOINTS, NGB_PAGER_DEFAULT_SETTINGS, NGB_SELECT_FILTER_OPERATORS, NGB_TEXT_FILTER_OPERATORS, NgbAdvancedSearchComponent, NgbCellTemplate, NgbChipsComponent, NgbDataChartComponent, NgbDataGridGroupFooterTemplateDirective, NgbDataGridGroupHeaderColumnTemplateDirective, NgbDataGridGroupHeaderTemplateDirective, NgbDataSparklineComponent, NgbDatagridButtonDirective, NgbDatagridColumnChooserToolComponent, NgbDatagridControlDirective, NgbDatagridDefaultEditService, NgbDatagridFieldShellComponent, NgbDatagridFilterToolComponent, NgbDatagridFloatingPanelDirective, NgbDatagridLayoutToolbarComponent, NgbDatagridLayoutToolbarSpacerComponent, NgbDatagridSortToolComponent, NgbDatagridSurfaceCardComponent, NgbDatagridThemePickerComponent, NgbDndHandleDirective, NgbDndItemDirective, NgbDndListDirective, NgbDndState, NgbEditorTemplate, NgbExportService, NgbFilterMenuTemplate, NgbFilterTemplate, NgbGlobalFilterTemplate, NgbGridChartComponent, NgbGridColumnDirective, NgbGridHighlightDirective, NgbJsonPreviewComponent, NgbLiveAnnouncer, NgbPagerComponent, NgbPagerTemplate, NgbPaginationComponent, NgbRowDetailTemplate, NgbSearchHighlightComponent, NgbSplitterComponent, NgbSplitterPaneComponent, NgbStepLabelDirective, NgbStepperComponent, NgbTreeComponent, NgbTypeaheadComponent, PdfExportAdapter, defaultDndI18n, ngbAggregateValues, ngbAllowedFilterOperators, ngbApplyDataGridOperations, ngbBuildChartJsConfig, ngbBuildColumnSelectionChartData, ngbBuildFullGridChartData, ngbBuildRowSelectionChartData, ngbBuildSparklinePoints, ngbCalculateDataGridAggregates, ngbChartPalette, ngbColumnTypeToFilterType, ngbDatagridPagerSettings, ngbDefaultFilterOperator, ngbFilterOperatorLabel, ngbFindFieldFilterDescriptor, ngbFlattenFilterDescriptors, ngbFormatDatagridLabel, ngbFormatPagerRangeLabel, ngbGroupData, ngbIsCompositeFilter, ngbOperatorRequiresFilterValue, ngbPagerButtonCountForDensity, ngbResolveDatagridPagerSettings, ngbResolvePageableSettings, ngbResolvePagerDensity, ngbResolvePagerPageSizeOptions, ngbResolvePagerSettings, ngbSetFieldFilter };
14264
15514
  //# sourceMappingURL=angular-bootstrap-ngbootstrap.mjs.map