@angular-bootstrap/ngbootstrap 2.0.3 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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';
@@ -50,8 +50,8 @@ class NgbPaginationComponent {
50
50
  return;
51
51
  this.pageChange.emit(page);
52
52
  }
53
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbPaginationComponent, isStandalone: true, selector: "ngb-pagination", inputs: { page: "page", pageSize: "pageSize", collectionSize: "collectionSize", maxSize: "maxSize", buttonCount: "buttonCount", previousNext: "previousNext", pagerType: "pagerType", responsive: "responsive" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
53
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbPaginationComponent, isStandalone: true, selector: "ngb-pagination", inputs: { page: "page", pageSize: "pageSize", collectionSize: "collectionSize", maxSize: "maxSize", buttonCount: "buttonCount", previousNext: "previousNext", pagerType: "pagerType", responsive: "responsive" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
55
55
  @if (totalPages >= 1) {
56
56
  <nav
57
57
  class="ngb-pagination"
@@ -150,7 +150,7 @@ class NgbPaginationComponent {
150
150
  }
151
151
  `, isInline: true, styles: [".ngb-pagination--responsive .pagination{flex-wrap:wrap;justify-content:center;gap:.15rem}.ngb-pagination .page-link,.ngb-pagination .btn{border-color:var(--dg-pager-control-border, var(--bs-border-color));background-color:var(--dg-pager-control-bg, var(--bs-body-bg));color:var(--dg-pager-link-text, var(--dg-primary, var(--bs-primary)))}.ngb-pagination .page-link:hover,.ngb-pagination .btn:hover{border-color:var(--dg-border-strong, var(--bs-border-color));background-color:var(--dg-pager-control-hover-bg, var(--bs-tertiary-bg));color:var(--dg-primary-hover, var(--bs-link-hover-color))}.ngb-pagination .page-item.active .page-link{border-color:var(--dg-pager-active-border, var(--dg-primary, var(--bs-primary)));background-color:var(--dg-pager-active-bg, var(--dg-primary, var(--bs-primary)));color:var(--dg-pager-active-text, var(--dg-on-primary, #fff))}.ngb-pagination .page-item.disabled .page-link,.ngb-pagination .btn:disabled{border-color:var(--dg-pager-control-border, var(--bs-border-color));background-color:var(--dg-pager-control-bg, var(--bs-body-bg));color:var(--dg-text-subtle, var(--bs-secondary-color));opacity:.55}.ngb-pagination__input-group{display:inline-flex;align-items:center;gap:.35rem;flex-wrap:wrap;justify-content:center}.ngb-pagination__page-input{width:4.25rem;text-align:center;border-color:var(--dg-pager-control-border, var(--bs-border-color));background-color:var(--dg-pager-control-bg, var(--bs-body-bg));color:var(--dg-text, var(--bs-body-color))}.ngb-pagination__input-label{margin:0}.ngb-pagination__input-total{font-size:.875rem;color:var(--dg-pager-text, var(--bs-secondary-color));white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
152
152
  }
153
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPaginationComponent, decorators: [{
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPaginationComponent, decorators: [{
154
154
  type: Component,
155
155
  args: [{ selector: 'ngb-pagination', standalone: true, imports: [CommonModule, FormsModule], template: `
156
156
  @if (totalPages >= 1) {
@@ -422,8 +422,8 @@ class NgbPagerComponent {
422
422
  });
423
423
  this.resizeObserver.observe(element);
424
424
  }
425
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPagerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
426
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbPagerComponent, isStandalone: true, selector: "ngb-pager", inputs: { page: "page", pageSize: "pageSize", collectionSize: "collectionSize", settings: "settings", infoLabel: "infoLabel", rangeLabelTemplate: "rangeLabelTemplate", rowsPerPageLabel: "rowsPerPageLabel", responsive: "responsive" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, viewQueries: [{ propertyName: "pagerRoot", first: true, predicate: ["pagerRoot"], descendants: true }], ngImport: i0, template: `
425
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPagerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
426
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbPagerComponent, isStandalone: true, selector: "ngb-pager", inputs: { page: "page", pageSize: "pageSize", collectionSize: "collectionSize", settings: "settings", infoLabel: "infoLabel", rangeLabelTemplate: "rangeLabelTemplate", rowsPerPageLabel: "rowsPerPageLabel", responsive: "responsive" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, viewQueries: [{ propertyName: "pagerRoot", first: true, predicate: ["pagerRoot"], descendants: true }], ngImport: i0, template: `
427
427
  <div
428
428
  #pagerRoot
429
429
  class="ngb-pager"
@@ -486,7 +486,7 @@ class NgbPagerComponent {
486
486
  </div>
487
487
  `, isInline: true, styles: [".ngb-pager{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:.5rem .75rem;width:100%;color:var(--dg-pager-text, var(--bs-secondary-color))}.ngb-pager__range{justify-self:start;min-width:0;color:var(--dg-pager-text, var(--bs-secondary-color))!important}.ngb-pager__pagination{display:flex;justify-content:center;justify-self:center;min-width:0}.ngb-pager__page-size{display:inline-flex;align-items:center;justify-self:end;gap:.5rem;min-width:0}.ngb-pager__page-size-label{margin:0;white-space:nowrap;font-size:.875rem;line-height:1.25;color:var(--dg-pager-text, var(--bs-secondary-color))}.ngb-pager__page-size-select{width:auto;min-width:4.5rem;flex:0 0 auto;border-color:var(--dg-pager-control-border, var(--bs-border-color));background-color:var(--dg-pager-control-bg, var(--bs-body-bg));background-image:var(--dg-pager-select-icon);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;color:var(--dg-text, var(--bs-body-color));padding-right:2.25rem;appearance:none}.ngb-pager--wrap{display:flex;flex-wrap:wrap;justify-content:center}.ngb-pager--wrap .ngb-pager__range{flex:1 1 100%;justify-self:auto}.ngb-pager--wrap .ngb-pager__pagination{flex:1 1 100%;justify-content:center;justify-self:auto}.ngb-pager--wrap .ngb-pager__page-size{flex:0 0 auto;justify-self:auto}.ngb-pager--responsive{flex-wrap:nowrap;overflow:hidden}.ngb-pager__part--hidden{visibility:hidden;pointer-events:none}\n"], 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.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: "component", type: NgbPaginationComponent, selector: "ngb-pagination", inputs: ["page", "pageSize", "collectionSize", "maxSize", "buttonCount", "previousNext", "pagerType", "responsive"], outputs: ["pageChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
488
488
  }
489
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPagerComponent, decorators: [{
489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPagerComponent, decorators: [{
490
490
  type: Component,
491
491
  args: [{ selector: 'ngb-pager', standalone: true, imports: [CommonModule, FormsModule, NgbPaginationComponent], template: `
492
492
  <div
@@ -610,10 +610,10 @@ class NgbCellTemplate {
610
610
  constructor(template) {
611
611
  this.template = template;
612
612
  }
613
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbCellTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
614
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbCellTemplate, isStandalone: true, selector: "ng-template[ngbCell]", inputs: { field: ["ngbCell", "field"] }, ngImport: i0 });
613
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbCellTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
614
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbCellTemplate, isStandalone: true, selector: "ng-template[ngbCell]", inputs: { field: ["ngbCell", "field"] }, ngImport: i0 });
615
615
  }
616
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbCellTemplate, decorators: [{
616
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbCellTemplate, decorators: [{
617
617
  type: Directive,
618
618
  args: [{ selector: 'ng-template[ngbCell]', standalone: true }]
619
619
  }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
@@ -626,10 +626,10 @@ class NgbEditorTemplate {
626
626
  constructor(template) {
627
627
  this.template = template;
628
628
  }
629
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbEditorTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
630
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbEditorTemplate, isStandalone: true, selector: "ng-template[ngbEditor]", inputs: { field: ["ngbEditor", "field"] }, ngImport: i0 });
629
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbEditorTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
630
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbEditorTemplate, isStandalone: true, selector: "ng-template[ngbEditor]", inputs: { field: ["ngbEditor", "field"] }, ngImport: i0 });
631
631
  }
632
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbEditorTemplate, decorators: [{
632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbEditorTemplate, decorators: [{
633
633
  type: Directive,
634
634
  args: [{ selector: 'ng-template[ngbEditor]', standalone: true }]
635
635
  }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
@@ -642,10 +642,10 @@ class NgbFilterTemplate {
642
642
  constructor(template) {
643
643
  this.template = template;
644
644
  }
645
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbFilterTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
646
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbFilterTemplate, isStandalone: true, selector: "ng-template[ngbFilter]", inputs: { field: ["ngbFilter", "field"] }, ngImport: i0 });
645
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbFilterTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
646
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbFilterTemplate, isStandalone: true, selector: "ng-template[ngbFilter]", inputs: { field: ["ngbFilter", "field"] }, ngImport: i0 });
647
647
  }
648
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbFilterTemplate, decorators: [{
648
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbFilterTemplate, decorators: [{
649
649
  type: Directive,
650
650
  args: [{ selector: 'ng-template[ngbFilter]', standalone: true }]
651
651
  }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
@@ -658,10 +658,10 @@ class NgbFilterMenuTemplate {
658
658
  constructor(template) {
659
659
  this.template = template;
660
660
  }
661
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbFilterMenuTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
662
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbFilterMenuTemplate, isStandalone: true, selector: "ng-template[ngbFilterMenu]", inputs: { field: ["ngbFilterMenu", "field"] }, ngImport: i0 });
661
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbFilterMenuTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
662
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbFilterMenuTemplate, isStandalone: true, selector: "ng-template[ngbFilterMenu]", inputs: { field: ["ngbFilterMenu", "field"] }, ngImport: i0 });
663
663
  }
664
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbFilterMenuTemplate, decorators: [{
664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbFilterMenuTemplate, decorators: [{
665
665
  type: Directive,
666
666
  args: [{ selector: 'ng-template[ngbFilterMenu]', standalone: true }]
667
667
  }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { field: [{
@@ -673,10 +673,10 @@ class NgbGlobalFilterTemplate {
673
673
  constructor(template) {
674
674
  this.template = template;
675
675
  }
676
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGlobalFilterTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
677
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbGlobalFilterTemplate, isStandalone: true, selector: "ng-template[ngbGlobalFilter]", ngImport: i0 });
676
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGlobalFilterTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
677
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbGlobalFilterTemplate, isStandalone: true, selector: "ng-template[ngbGlobalFilter]", ngImport: i0 });
678
678
  }
679
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGlobalFilterTemplate, decorators: [{
679
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGlobalFilterTemplate, decorators: [{
680
680
  type: Directive,
681
681
  args: [{ selector: 'ng-template[ngbGlobalFilter]', standalone: true }]
682
682
  }], ctorParameters: () => [{ type: i0.TemplateRef }] });
@@ -685,10 +685,10 @@ class NgbRowDetailTemplate {
685
685
  constructor(template) {
686
686
  this.template = template;
687
687
  }
688
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbRowDetailTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
689
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbRowDetailTemplate, isStandalone: true, selector: "ng-template[ngbRowDetail]", ngImport: i0 });
688
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbRowDetailTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
689
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbRowDetailTemplate, isStandalone: true, selector: "ng-template[ngbRowDetail]", ngImport: i0 });
690
690
  }
691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbRowDetailTemplate, decorators: [{
691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbRowDetailTemplate, decorators: [{
692
692
  type: Directive,
693
693
  args: [{ selector: 'ng-template[ngbRowDetail]', standalone: true }]
694
694
  }], ctorParameters: () => [{ type: i0.TemplateRef }] });
@@ -697,13 +697,73 @@ class NgbPagerTemplate {
697
697
  constructor(template) {
698
698
  this.template = template;
699
699
  }
700
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPagerTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
701
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbPagerTemplate, isStandalone: true, selector: "ng-template[ngbPager]", ngImport: i0 });
700
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPagerTemplate, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
701
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbPagerTemplate, isStandalone: true, selector: "ng-template[ngbPager]", ngImport: i0 });
702
702
  }
703
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbPagerTemplate, decorators: [{
703
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbPagerTemplate, decorators: [{
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.8", ngImport: i0, type: NgbDataGridGroupHeaderTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
713
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbDataGridGroupHeaderTemplateDirective, isStandalone: true, selector: "ng-template[ngbDatagridGroupHeaderTemplate], ng-template[ngbGroupHeader]", ngImport: i0 });
714
+ }
715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", 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.8", ngImport: i0, type: NgbDataGridGroupHeaderColumnTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
731
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", 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.8", 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.8", ngImport: i0, type: NgbDataGridGroupFooterTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
755
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", 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.8", 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;
@@ -1140,24 +1291,27 @@ class NgbExportService {
1140
1291
  throw new Error('No ExcelExportAdapter provided');
1141
1292
  return this.excel.export(p);
1142
1293
  }
1143
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1144
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbExportService, providedIn: 'root' });
1294
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1295
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbExportService, providedIn: 'root' });
1145
1296
  }
1146
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbExportService, decorators: [{
1297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbExportService, decorators: [{
1147
1298
  type: Injectable,
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)));
@@ -1412,14 +1566,13 @@ class BrowserExcelExportAdapter {
1412
1566
  }
1413
1567
  }
1414
1568
 
1415
- // eslint-disable-next-line @angular-eslint/directive-selector
1416
1569
  class ExportButtonDirective {
1417
1570
  // Expose the TemplateRef so the grid can render it with a context
1418
1571
  templateRef = inject(TemplateRef);
1419
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ExportButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1420
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: ExportButtonDirective, isStandalone: true, selector: "[ngbExportButton]", ngImport: i0 });
1572
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1573
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ExportButtonDirective, isStandalone: true, selector: "[ngbExportButton]", ngImport: i0 });
1421
1574
  }
1422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ExportButtonDirective, decorators: [{
1575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportButtonDirective, decorators: [{
1423
1576
  type: Directive,
1424
1577
  args: [{ selector: '[ngbExportButton]' }]
1425
1578
  }] });
@@ -1479,10 +1632,10 @@ class NgbGridColumnDirective {
1479
1632
  maxResizableWidth: this.maxResizableWidth
1480
1633
  };
1481
1634
  }
1482
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1483
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbGridColumnDirective, isStandalone: true, selector: "ngb-grid-column", inputs: { field: "field", header: "header", title: "title", cellTitle: "cellTitle", sortable: "sortable", filterable: "filterable", filterType: "filterType", defaultFilterOperator: "defaultFilterOperator", allowedFilterOperators: "allowedFilterOperators", showFilterMenu: "showFilterMenu", showFilterRow: "showFilterRow", showFilterOperator: "showFilterOperator", editable: "editable", type: "type", options: "options", width: "width", stackedGroup: "stackedGroup", required: "required", hidden: "hidden", sticky: "sticky", locked: "locked", reorderable: "reorderable", resizable: "resizable", minResizableWidth: "minResizableWidth", maxResizableWidth: "maxResizableWidth" }, ngImport: i0 });
1635
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridColumnDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1636
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbGridColumnDirective, isStandalone: true, selector: "ngb-grid-column", inputs: { field: "field", header: "header", title: "title", cellTitle: "cellTitle", sortable: "sortable", filterable: "filterable", filterType: "filterType", defaultFilterOperator: "defaultFilterOperator", allowedFilterOperators: "allowedFilterOperators", showFilterMenu: "showFilterMenu", showFilterRow: "showFilterRow", showFilterOperator: "showFilterOperator", editable: "editable", type: "type", options: "options", width: "width", stackedGroup: "stackedGroup", required: "required", hidden: "hidden", sticky: "sticky", locked: "locked", reorderable: "reorderable", resizable: "resizable", minResizableWidth: "minResizableWidth", maxResizableWidth: "maxResizableWidth" }, ngImport: i0 });
1484
1637
  }
1485
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridColumnDirective, decorators: [{
1638
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridColumnDirective, decorators: [{
1486
1639
  type: Directive,
1487
1640
  args: [{
1488
1641
  selector: 'ngb-grid-column',
@@ -1567,10 +1720,10 @@ class NgbDatagridButtonDirective {
1567
1720
  get iconButtonClass() {
1568
1721
  return this.variant === 'icon';
1569
1722
  }
1570
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1571
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridButtonDirective, isStandalone: true, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: { variant: ["ngbDatagridButton", "variant"] }, host: { properties: { "class.datagrid-toolbar__button": "this.toolbarButtonClass", "class.datagrid-toolbar__button--primary": "this.toolbarPrimary", "class.datagrid-toolbar__button--secondary": "this.toolbarSecondary", "class.grid-row-action": "this.rowActionClass", "class.grid-row-action--success": "this.rowSuccess", "class.grid-row-action--danger": "this.rowDanger", "class.grid-row-action--neutral": "this.rowNeutral", "class.grid-filter-menu-trigger": "this.iconButtonClass" } }, ngImport: i0 });
1723
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1724
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridButtonDirective, isStandalone: true, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: { variant: ["ngbDatagridButton", "variant"] }, host: { properties: { "class.datagrid-toolbar__button": "this.toolbarButtonClass", "class.datagrid-toolbar__button--primary": "this.toolbarPrimary", "class.datagrid-toolbar__button--secondary": "this.toolbarSecondary", "class.grid-row-action": "this.rowActionClass", "class.grid-row-action--success": "this.rowSuccess", "class.grid-row-action--danger": "this.rowDanger", "class.grid-row-action--neutral": "this.rowNeutral", "class.grid-filter-menu-trigger": "this.iconButtonClass" } }, ngImport: i0 });
1572
1725
  }
1573
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridButtonDirective, decorators: [{
1726
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridButtonDirective, decorators: [{
1574
1727
  type: Directive,
1575
1728
  args: [{
1576
1729
  selector: 'button[ngbDatagridButton], a[ngbDatagridButton]',
@@ -1613,10 +1766,10 @@ class NgbDatagridControlDirective {
1613
1766
  get editClass() {
1614
1767
  return this.ngbDatagridControlMode === 'edit';
1615
1768
  }
1616
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1617
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridControlDirective, isStandalone: true, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: { ngbDatagridControlMode: "ngbDatagridControlMode" }, host: { properties: { "class.grid-filter-control": "this.filterClass", "class.grid-edit-control": "this.editClass" } }, ngImport: i0 });
1769
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1770
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridControlDirective, isStandalone: true, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: { ngbDatagridControlMode: "ngbDatagridControlMode" }, host: { properties: { "class.grid-filter-control": "this.filterClass", "class.grid-edit-control": "this.editClass" } }, ngImport: i0 });
1618
1771
  }
1619
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridControlDirective, decorators: [{
1772
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridControlDirective, decorators: [{
1620
1773
  type: Directive,
1621
1774
  args: [{
1622
1775
  selector: 'input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]',
@@ -1634,8 +1787,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1634
1787
 
1635
1788
  class NgbDatagridAddRowComponent {
1636
1789
  grid;
1637
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridAddRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1638
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridAddRowComponent, isStandalone: true, selector: "tr[ngbDatagridAddRow]", inputs: { grid: "grid" }, ngImport: i0, template: `
1790
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridAddRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1791
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridAddRowComponent, isStandalone: true, selector: "tr[ngbDatagridAddRow]", inputs: { grid: "grid" }, ngImport: i0, template: `
1639
1792
  @if (grid.showSelectionColumn()) {
1640
1793
  <td
1641
1794
  [style.width.px]="grid.utilityColumnWidth('selection')"
@@ -1784,15 +1937,16 @@ class NgbDatagridAddRowComponent {
1784
1937
  </div>
1785
1938
  </td>
1786
1939
  }
1787
- `, 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 });
1788
1941
  }
1789
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridAddRowComponent, decorators: [{
1942
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridAddRowComponent, decorators: [{
1790
1943
  type: Component,
1791
1944
  args: [{
1792
1945
  selector: 'tr[ngbDatagridAddRow]',
1793
1946
  standalone: true,
1794
1947
  imports: [CommonModule, FormsModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
1795
1948
  viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
1949
+ changeDetection: ChangeDetectionStrategy.OnPush,
1796
1950
  template: `
1797
1951
  @if (grid.showSelectionColumn()) {
1798
1952
  <td
@@ -1951,8 +2105,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
1951
2105
 
1952
2106
  class NgbDatagridColgroupComponent {
1953
2107
  grid;
1954
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridColgroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1955
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridColgroupComponent, isStandalone: true, selector: "colgroup[ngbDatagridColgroup]", inputs: { grid: "grid" }, ngImport: i0, template: `
2108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridColgroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridColgroupComponent, isStandalone: true, selector: "colgroup[ngbDatagridColgroup]", inputs: { grid: "grid" }, ngImport: i0, template: `
1956
2110
  @if (grid.showSelectionColumn()) {
1957
2111
  <col [style.width.px]="grid.utilityColumnWidth('selection')" />
1958
2112
  }
@@ -1973,7 +2127,7 @@ class NgbDatagridColgroupComponent {
1973
2127
  }
1974
2128
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
1975
2129
  }
1976
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridColgroupComponent, decorators: [{
2130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridColgroupComponent, decorators: [{
1977
2131
  type: Component,
1978
2132
  args: [{
1979
2133
  selector: 'colgroup[ngbDatagridColgroup]',
@@ -2007,14 +2161,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2007
2161
 
2008
2162
  class NgbDatagridDataRowComponent {
2009
2163
  grid;
2164
+ renderTick = 0;
2010
2165
  row;
2011
2166
  index;
2012
2167
  selected = false;
2013
2168
  valueFor(row, col) {
2014
2169
  return row[col.field];
2015
2170
  }
2016
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2017
- 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: `
2171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridDataRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridDataRowComponent, isStandalone: true, selector: "tr[ngbDatagridDataRow]", inputs: { grid: "grid", renderTick: "renderTick", row: "row", index: "index", selected: "selected" }, ngImport: i0, template: `
2018
2173
  @if (grid.showSelectionColumn()) {
2019
2174
  <td
2020
2175
  class="text-center align-middle"
@@ -2100,6 +2255,7 @@ class NgbDatagridDataRowComponent {
2100
2255
  [class.grid-cell--incell]="grid.isIncellEditMode()"
2101
2256
  [ngClass]="grid.resolveCellClass(row, index, col)"
2102
2257
  [ngStyle]="grid.resolveCellStyle(row, index, col)"
2258
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2103
2259
  (click)="grid.onCellClick($event, index, col)"
2104
2260
  >
2105
2261
  <div class="ngb-stacked-card__label">{{ col.header }}</div>
@@ -2143,6 +2299,7 @@ class NgbDatagridDataRowComponent {
2143
2299
  [style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
2144
2300
  (focus)="grid.onDataCellFocus(index, ci)"
2145
2301
  (keydown)="grid.onDataCellKeydown($event, index, ci, col)"
2302
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2146
2303
  (click)="grid.onCellClick($event, index, col)"
2147
2304
  >
2148
2305
  <ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
@@ -2276,7 +2433,7 @@ class NgbDatagridDataRowComponent {
2276
2433
  @default {
2277
2434
  <span class="grid-cell-text">
2278
2435
  @if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
2279
- @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) {
2280
2437
  @if (part.match) {
2281
2438
  <mark class="grid-search-highlight">{{ part.text }}</mark>
2282
2439
  } @else {
@@ -2356,15 +2513,16 @@ class NgbDatagridDataRowComponent {
2356
2513
  </div>
2357
2514
  }
2358
2515
  </ng-template>
2359
- `, 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 });
2360
2517
  }
2361
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDataRowComponent, decorators: [{
2518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridDataRowComponent, decorators: [{
2362
2519
  type: Component,
2363
2520
  args: [{
2364
2521
  selector: 'tr[ngbDatagridDataRow]',
2365
2522
  standalone: true,
2366
2523
  imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
2367
2524
  viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }],
2525
+ changeDetection: ChangeDetectionStrategy.OnPush,
2368
2526
  template: `
2369
2527
  @if (grid.showSelectionColumn()) {
2370
2528
  <td
@@ -2451,6 +2609,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2451
2609
  [class.grid-cell--incell]="grid.isIncellEditMode()"
2452
2610
  [ngClass]="grid.resolveCellClass(row, index, col)"
2453
2611
  [ngStyle]="grid.resolveCellStyle(row, index, col)"
2612
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2454
2613
  (click)="grid.onCellClick($event, index, col)"
2455
2614
  >
2456
2615
  <div class="ngb-stacked-card__label">{{ col.header }}</div>
@@ -2494,6 +2653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2494
2653
  [style.right.px]="grid.isStackedLayout() ? null : grid.columnEndOffset(col)"
2495
2654
  (focus)="grid.onDataCellFocus(index, ci)"
2496
2655
  (keydown)="grid.onDataCellKeydown($event, index, ci, col)"
2656
+ (mousedown)="grid.onCellMouseDown($event, index, col)"
2497
2657
  (click)="grid.onCellClick($event, index, col)"
2498
2658
  >
2499
2659
  <ng-container *ngTemplateOutlet="dataCell; context: { col: col, ci: ci }"></ng-container>
@@ -2627,7 +2787,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2627
2787
  @default {
2628
2788
  <span class="grid-cell-text">
2629
2789
  @if (grid.isSearchHighlightEnabled() && grid.shouldHighlightSearchInColumn(col.field)) {
2630
- @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) {
2631
2791
  @if (part.match) {
2632
2792
  <mark class="grid-search-highlight">{{ part.text }}</mark>
2633
2793
  } @else {
@@ -2712,6 +2872,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2712
2872
  }], propDecorators: { grid: [{
2713
2873
  type: Input,
2714
2874
  args: [{ required: true }]
2875
+ }], renderTick: [{
2876
+ type: Input
2715
2877
  }], row: [{
2716
2878
  type: Input,
2717
2879
  args: [{ required: true }]
@@ -2726,12 +2888,12 @@ class NgbDatagridDetailRowComponent {
2726
2888
  grid;
2727
2889
  row;
2728
2890
  index;
2729
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDetailRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2730
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridDetailRowComponent, isStandalone: true, selector: "tr[ngbDatagridDetailRow]", inputs: { grid: "grid", row: "row", index: "index" }, ngImport: i0, template: `
2891
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridDetailRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2892
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridDetailRowComponent, isStandalone: true, selector: "tr[ngbDatagridDetailRow]", inputs: { grid: "grid", row: "row", index: "index" }, ngImport: i0, template: `
2731
2893
  <td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
2732
2894
  <div class="grid-detail-row__content">
2733
2895
  <ng-container
2734
- [ngTemplateOutlet]="grid.rowDetailTpl.template"
2896
+ [ngTemplateOutlet]="grid.rowDetailTpl!.template"
2735
2897
  [ngTemplateOutletContext]="{ $implicit: row, index: index }"
2736
2898
  >
2737
2899
  </ng-container>
@@ -2739,7 +2901,7 @@ class NgbDatagridDetailRowComponent {
2739
2901
  </td>
2740
2902
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2741
2903
  }
2742
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridDetailRowComponent, decorators: [{
2904
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridDetailRowComponent, decorators: [{
2743
2905
  type: Component,
2744
2906
  args: [{
2745
2907
  selector: 'tr[ngbDatagridDetailRow]',
@@ -2749,7 +2911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2749
2911
  <td [attr.colspan]="grid.detailColspan" role="region" class="grid-detail-row__cell">
2750
2912
  <div class="grid-detail-row__content">
2751
2913
  <ng-container
2752
- [ngTemplateOutlet]="grid.rowDetailTpl.template"
2914
+ [ngTemplateOutlet]="grid.rowDetailTpl!.template"
2753
2915
  [ngTemplateOutletContext]="{ $implicit: row, index: index }"
2754
2916
  >
2755
2917
  </ng-container>
@@ -2769,101 +2931,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2769
2931
  }] } });
2770
2932
 
2771
2933
  class NgbDatagridFooterComponent {
2772
- grid;
2773
- 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 */ []));
2774
2942
  get pagerSettings() {
2775
- return ngbDatagridPagerSettings(this.grid.resolvedPageable());
2943
+ return ngbDatagridPagerSettings(this.grid().resolvedPageable());
2776
2944
  }
2777
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2778
- 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: `
2779
- @if (grid.paginationActive && grid.pagerShowsAt(placement)) {
2780
- @if (grid.hasCustomPagerTemplate()) {
2945
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2946
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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()) {
2781
2949
  <div
2782
2950
  class="grid-footer grid-footer--custom"
2783
- [class.grid-footer--top]="placement === 'top'"
2784
- [class.grid-footer--bottom]="placement === 'bottom'"
2785
- [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()"
2786
2954
  >
2787
2955
  <ng-container
2788
- *ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
2956
+ *ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
2789
2957
  ></ng-container>
2790
2958
  </div>
2791
2959
  } @else {
2792
2960
  <div
2793
2961
  class="grid-footer"
2794
- [class.grid-footer--top]="placement === 'top'"
2795
- [class.grid-footer--bottom]="placement === 'bottom'"
2796
- [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()"
2797
2965
  >
2798
2966
  <ngb-pager
2799
- [page]="grid.page"
2800
- [pageSize]="grid.pageSize"
2801
- [collectionSize]="grid.pagerCollectionSize()"
2967
+ [page]="grid().page"
2968
+ [pageSize]="grid().pageSize"
2969
+ [collectionSize]="grid().pagerCollectionSize()"
2802
2970
  [settings]="pagerSettings"
2803
- [infoLabel]="grid.paginationRangeLabel()"
2804
- [rowsPerPageLabel]="grid.rowsPerPageLabel()"
2805
- [responsive]="grid.pagerResponsive()"
2806
- (pageChange)="grid.onPage($event)"
2807
- (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)"
2808
2976
  />
2809
2977
  </div>
2810
2978
  }
2811
2979
  }
2812
2980
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgbPagerComponent, selector: "ngb-pager", inputs: ["page", "pageSize", "collectionSize", "settings", "infoLabel", "rangeLabelTemplate", "rowsPerPageLabel", "responsive"], outputs: ["pageChange", "pageSizeChange"] }] });
2813
2981
  }
2814
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFooterComponent, decorators: [{
2982
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFooterComponent, decorators: [{
2815
2983
  type: Component,
2816
2984
  args: [{
2817
2985
  selector: 'ngb-datagrid-footer',
2818
2986
  standalone: true,
2819
2987
  imports: [CommonModule, NgbPagerComponent],
2820
2988
  template: `
2821
- @if (grid.paginationActive && grid.pagerShowsAt(placement)) {
2822
- @if (grid.hasCustomPagerTemplate()) {
2989
+ @if (grid().paginationActive && grid().pagerShowsAt(placement())) {
2990
+ @if (grid().hasCustomPagerTemplate()) {
2823
2991
  <div
2824
2992
  class="grid-footer grid-footer--custom"
2825
- [class.grid-footer--top]="placement === 'top'"
2826
- [class.grid-footer--bottom]="placement === 'bottom'"
2827
- [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()"
2828
2996
  >
2829
2997
  <ng-container
2830
- *ngTemplateOutlet="grid.pagerTpl!.template; context: grid.pagerContext()"
2998
+ *ngTemplateOutlet="grid().pagerTpl!.template; context: grid().pagerContext()"
2831
2999
  ></ng-container>
2832
3000
  </div>
2833
3001
  } @else {
2834
3002
  <div
2835
3003
  class="grid-footer"
2836
- [class.grid-footer--top]="placement === 'top'"
2837
- [class.grid-footer--bottom]="placement === 'bottom'"
2838
- [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()"
2839
3007
  >
2840
3008
  <ngb-pager
2841
- [page]="grid.page"
2842
- [pageSize]="grid.pageSize"
2843
- [collectionSize]="grid.pagerCollectionSize()"
3009
+ [page]="grid().page"
3010
+ [pageSize]="grid().pageSize"
3011
+ [collectionSize]="grid().pagerCollectionSize()"
2844
3012
  [settings]="pagerSettings"
2845
- [infoLabel]="grid.paginationRangeLabel()"
2846
- [rowsPerPageLabel]="grid.rowsPerPageLabel()"
2847
- [responsive]="grid.pagerResponsive()"
2848
- (pageChange)="grid.onPage($event)"
2849
- (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)"
2850
3018
  />
2851
3019
  </div>
2852
3020
  }
2853
3021
  }
2854
3022
  `,
2855
3023
  }]
2856
- }], propDecorators: { grid: [{
2857
- type: Input,
2858
- args: [{ required: true }]
2859
- }], placement: [{
2860
- type: Input
2861
- }] } });
3024
+ }], propDecorators: { grid: [{ type: i0.Input, args: [{ isSignal: true, alias: "grid", required: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }] } });
2862
3025
 
2863
3026
  class NgbDatagridFieldShellComponent {
2864
3027
  icon;
2865
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFieldShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2866
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFieldShellComponent, isStandalone: true, selector: "ngb-datagrid-field-shell", inputs: { icon: "icon" }, ngImport: i0, template: `
3028
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFieldShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3029
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridFieldShellComponent, isStandalone: true, selector: "ngb-datagrid-field-shell", inputs: { icon: "icon" }, ngImport: i0, template: `
2867
3030
  <div class="grid-filter-field" [class.grid-filter-field--with-icon]="!!icon">
2868
3031
  <ng-content></ng-content>
2869
3032
  @if (icon) {
@@ -2872,7 +3035,7 @@ class NgbDatagridFieldShellComponent {
2872
3035
  </div>
2873
3036
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
2874
3037
  }
2875
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFieldShellComponent, decorators: [{
3038
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFieldShellComponent, decorators: [{
2876
3039
  type: Component,
2877
3040
  args: [{
2878
3041
  selector: 'ngb-datagrid-field-shell',
@@ -2893,8 +3056,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
2893
3056
 
2894
3057
  class NgbDatagridHeaderComponent {
2895
3058
  grid;
2896
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2897
- 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: `
3059
+ renderTick = 0;
3060
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3061
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridHeaderComponent, isStandalone: true, selector: "thead[ngbDatagridHeader]", inputs: { grid: "grid", renderTick: "renderTick" }, ngImport: i0, template: `
2898
3062
  <tr>
2899
3063
  @if (grid.showSelectionColumn()) {
2900
3064
  <th
@@ -2961,6 +3125,20 @@ class NgbDatagridHeaderComponent {
2961
3125
  [attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
2962
3126
  >
2963
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
+ }
2964
3142
  @if (grid.isColumnReorderable(col)) {
2965
3143
  <span
2966
3144
  class="grid-column-reorder-handle bi bi-grip-vertical"
@@ -3157,9 +3335,9 @@ class NgbDatagridHeaderComponent {
3157
3335
  @if (grid.showActionsColumn()) { <th></th> }
3158
3336
  </tr>
3159
3337
  }
3160
- `, 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 });
3161
3339
  }
3162
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridHeaderComponent, decorators: [{
3340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridHeaderComponent, decorators: [{
3163
3341
  type: Component,
3164
3342
  args: [{
3165
3343
  selector: 'thead[ngbDatagridHeader]',
@@ -3172,6 +3350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3172
3350
  NgbDatagridControlDirective,
3173
3351
  NgbDatagridFieldShellComponent,
3174
3352
  ],
3353
+ changeDetection: ChangeDetectionStrategy.OnPush,
3175
3354
  template: `
3176
3355
  <tr>
3177
3356
  @if (grid.showSelectionColumn()) {
@@ -3239,6 +3418,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3239
3418
  [attr.aria-sort]="grid.enableSorting && col.sortable ? grid.ariaSortFor(col.field) : null"
3240
3419
  >
3241
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
+ }
3242
3435
  @if (grid.isColumnReorderable(col)) {
3243
3436
  <span
3244
3437
  class="grid-column-reorder-handle bi bi-grip-vertical"
@@ -3440,17 +3633,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3440
3633
  }], propDecorators: { grid: [{
3441
3634
  type: Input,
3442
3635
  args: [{ required: true }]
3636
+ }], renderTick: [{
3637
+ type: Input
3443
3638
  }] } });
3444
3639
 
3445
3640
  class NgbDatagridSurfaceCardComponent {
3446
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridSurfaceCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3447
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridSurfaceCardComponent, isStandalone: true, selector: "ngb-datagrid-surface-card", ngImport: i0, template: `
3641
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridSurfaceCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3642
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridSurfaceCardComponent, isStandalone: true, selector: "ngb-datagrid-surface-card", ngImport: i0, template: `
3448
3643
  <div class="grid-filter-menu-surface">
3449
3644
  <ng-content></ng-content>
3450
3645
  </div>
3451
3646
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] });
3452
3647
  }
3453
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridSurfaceCardComponent, decorators: [{
3648
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridSurfaceCardComponent, decorators: [{
3454
3649
  type: Component,
3455
3650
  args: [{
3456
3651
  selector: 'ngb-datagrid-surface-card',
@@ -3725,10 +3920,10 @@ class NgbDatagridFloatingPanelDirective {
3725
3920
  node.style.removeProperty(prop);
3726
3921
  }
3727
3922
  }
3728
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFloatingPanelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3729
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridFloatingPanelDirective, isStandalone: true, selector: "[ngbDatagridFloatingPanel]", inputs: { ngbDatagridFloatingPanelAnchor: "ngbDatagridFloatingPanelAnchor", ngbDatagridFloatingPanelPlacement: "ngbDatagridFloatingPanelPlacement" }, host: { properties: { "style.position": "this.hostPosition", "style.z-index": "this.hostZIndex", "style.margin": "this.hostMargin", "style.transform": "this.hostTransform", "style.top.px": "this.panelTop", "style.left.px": "this.panelLeft" } }, usesOnChanges: true, ngImport: i0 });
3923
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFloatingPanelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3924
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridFloatingPanelDirective, isStandalone: true, selector: "[ngbDatagridFloatingPanel]", inputs: { ngbDatagridFloatingPanelAnchor: "ngbDatagridFloatingPanelAnchor", ngbDatagridFloatingPanelPlacement: "ngbDatagridFloatingPanelPlacement" }, host: { properties: { "style.position": "this.hostPosition", "style.z-index": "this.hostZIndex", "style.margin": "this.hostMargin", "style.transform": "this.hostTransform", "style.top.px": "this.panelTop", "style.left.px": "this.panelLeft" } }, usesOnChanges: true, ngImport: i0 });
3730
3925
  }
3731
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFloatingPanelDirective, decorators: [{
3926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFloatingPanelDirective, decorators: [{
3732
3927
  type: Directive,
3733
3928
  args: [{
3734
3929
  selector: '[ngbDatagridFloatingPanel]',
@@ -3777,8 +3972,8 @@ class NgbDatagridFilterMenuPanelComponent {
3777
3972
  requestAnimationFrame(() => this.floatingPanel?.reposition());
3778
3973
  });
3779
3974
  }
3780
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3781
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFilterMenuPanelComponent, isStandalone: true, selector: "ngb-datagrid-filter-menu-panel", inputs: { grid: "grid", col: "col", anchor: "anchor" }, viewQueries: [{ propertyName: "floatingPanel", first: true, predicate: NgbDatagridFloatingPanelDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
3975
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3976
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridFilterMenuPanelComponent, isStandalone: true, selector: "ngb-datagrid-filter-menu-panel", inputs: { grid: "grid", col: "col", anchor: "anchor" }, viewQueries: [{ propertyName: "floatingPanel", first: true, predicate: NgbDatagridFloatingPanelDirective, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
3782
3977
  <div
3783
3978
  class="grid-filter-menu-popover ngb-grid__filter-menu-overlay"
3784
3979
  ngbDatagridFloatingPanel
@@ -3961,9 +4156,9 @@ class NgbDatagridFilterMenuPanelComponent {
3961
4156
  }
3962
4157
  </ngb-datagrid-surface-card>
3963
4158
  </div>
3964
- `, 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 });
3965
4160
  }
3966
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, decorators: [{
4161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFilterMenuPanelComponent, decorators: [{
3967
4162
  type: Component,
3968
4163
  args: [{
3969
4164
  selector: 'ngb-datagrid-filter-menu-panel',
@@ -3977,6 +4172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
3977
4172
  NgbDatagridSurfaceCardComponent,
3978
4173
  NgbDatagridFloatingPanelDirective,
3979
4174
  ],
4175
+ changeDetection: ChangeDetectionStrategy.OnPush,
3980
4176
  template: `
3981
4177
  <div
3982
4178
  class="grid-filter-menu-popover ngb-grid__filter-menu-overlay"
@@ -4187,8 +4383,8 @@ class NgbDatagridRowFilterOperatorPanelComponent {
4187
4383
  requestAnimationFrame(() => this.floatingPanel?.reposition());
4188
4384
  });
4189
4385
  }
4190
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4191
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridRowFilterOperatorPanelComponent, isStandalone: true, selector: "ngb-datagrid-row-filter-operator-panel", inputs: { grid: "grid", col: "col", anchor: "anchor" }, viewQueries: [{ propertyName: "floatingPanel", first: true, predicate: NgbDatagridFloatingPanelDirective, descendants: true, static: true }], ngImport: i0, template: `
4386
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4387
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridRowFilterOperatorPanelComponent, isStandalone: true, selector: "ngb-datagrid-row-filter-operator-panel", inputs: { grid: "grid", col: "col", anchor: "anchor" }, viewQueries: [{ propertyName: "floatingPanel", first: true, predicate: NgbDatagridFloatingPanelDirective, descendants: true, static: true }], ngImport: i0, template: `
4192
4388
  <div
4193
4389
  class="dropdown-menu show ngb-datagrid-floating-panel grid-filter-operator-menu"
4194
4390
  ngbDatagridFloatingPanel
@@ -4211,14 +4407,15 @@ class NgbDatagridRowFilterOperatorPanelComponent {
4211
4407
  </button>
4212
4408
  }
4213
4409
  </div>
4214
- `, 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 });
4215
4411
  }
4216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, decorators: [{
4412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridRowFilterOperatorPanelComponent, decorators: [{
4217
4413
  type: Component,
4218
4414
  args: [{
4219
4415
  selector: 'ngb-datagrid-row-filter-operator-panel',
4220
4416
  standalone: true,
4221
4417
  imports: [CommonModule, NgbDatagridFloatingPanelDirective],
4418
+ changeDetection: ChangeDetectionStrategy.OnPush,
4222
4419
  template: `
4223
4420
  <div
4224
4421
  class="dropdown-menu show ngb-datagrid-floating-panel grid-filter-operator-menu"
@@ -4260,8 +4457,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
4260
4457
 
4261
4458
  class NgbDatagridToolbarComponent {
4262
4459
  grid;
4263
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4264
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridToolbarComponent, isStandalone: true, selector: "ngb-datagrid-toolbar", inputs: { grid: "grid" }, ngImport: i0, template: `
4460
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4461
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridToolbarComponent, isStandalone: true, selector: "ngb-datagrid-toolbar", inputs: { grid: "grid" }, ngImport: i0, template: `
4265
4462
  @if (grid.exportOptions?.enabled || (grid.enableAdd && !grid.isToolbarEditMode()) || grid.enableGlobalFilter) {
4266
4463
  <div
4267
4464
  class="datagrid-toolbar"
@@ -4348,7 +4545,7 @@ class NgbDatagridToolbarComponent {
4348
4545
  }
4349
4546
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "component", type: NgbDatagridFieldShellComponent, selector: "ngb-datagrid-field-shell", inputs: ["icon"] }] });
4350
4547
  }
4351
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridToolbarComponent, decorators: [{
4548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridToolbarComponent, decorators: [{
4352
4549
  type: Component,
4353
4550
  args: [{
4354
4551
  selector: 'ngb-datagrid-toolbar',
@@ -4451,8 +4648,8 @@ class NgbDatagridEditingToolbarComponent {
4451
4648
  selectedCount = 0;
4452
4649
  editActive = false;
4453
4650
  saveDisabled = true;
4454
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridEditingToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4455
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridEditingToolbarComponent, isStandalone: true, selector: "ngb-datagrid-editing-toolbar", inputs: { grid: "grid", selectedCount: "selectedCount", editActive: "editActive", saveDisabled: "saveDisabled" }, ngImport: i0, template: `
4651
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridEditingToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4652
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridEditingToolbarComponent, isStandalone: true, selector: "ngb-datagrid-editing-toolbar", inputs: { grid: "grid", selectedCount: "selectedCount", editActive: "editActive", saveDisabled: "saveDisabled" }, ngImport: i0, template: `
4456
4653
  @if (grid.showEditingToolbar()) {
4457
4654
  <div class="datagrid-editing-toolbar">
4458
4655
  <div class="datagrid-editing-toolbar__start">
@@ -4527,14 +4724,15 @@ class NgbDatagridEditingToolbarComponent {
4527
4724
  </div>
4528
4725
  </div>
4529
4726
  }
4530
- `, 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 });
4531
4728
  }
4532
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridEditingToolbarComponent, decorators: [{
4729
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridEditingToolbarComponent, decorators: [{
4533
4730
  type: Component,
4534
4731
  args: [{
4535
4732
  selector: 'ngb-datagrid-editing-toolbar',
4536
4733
  standalone: true,
4537
4734
  imports: [CommonModule, NgbDatagridButtonDirective],
4735
+ changeDetection: ChangeDetectionStrategy.OnPush,
4538
4736
  template: `
4539
4737
  @if (grid.showEditingToolbar()) {
4540
4738
  <div class="datagrid-editing-toolbar">
@@ -4625,8 +4823,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
4625
4823
 
4626
4824
  class NgbDatagridExternalEditorComponent {
4627
4825
  grid;
4628
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridExternalEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4629
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridExternalEditorComponent, isStandalone: true, selector: "ngb-datagrid-external-editor", inputs: { grid: "grid" }, ngImport: i0, template: `
4826
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridExternalEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4827
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridExternalEditorComponent, isStandalone: true, selector: "ngb-datagrid-external-editor", inputs: { grid: "grid" }, ngImport: i0, template: `
4630
4828
  @if (grid.externalEditOpen) {
4631
4829
  <div
4632
4830
  class="grid-external-editor"
@@ -4684,14 +4882,15 @@ class NgbDatagridExternalEditorComponent {
4684
4882
  </div>
4685
4883
  </div>
4686
4884
  }
4687
- `, 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 });
4688
4886
  }
4689
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridExternalEditorComponent, decorators: [{
4887
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridExternalEditorComponent, decorators: [{
4690
4888
  type: Component,
4691
4889
  args: [{
4692
4890
  selector: 'ngb-datagrid-external-editor',
4693
4891
  standalone: true,
4694
4892
  imports: [CommonModule, ReactiveFormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective],
4893
+ changeDetection: ChangeDetectionStrategy.OnPush,
4695
4894
  template: `
4696
4895
  @if (grid.externalEditOpen) {
4697
4896
  <div
@@ -4779,10 +4978,10 @@ class NgbGridHighlightDirective {
4779
4978
  this.grid.highlightedIndex = this.highlightedIndex ?? [];
4780
4979
  this.grid.updateHighlightCache();
4781
4980
  }
4782
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridHighlightDirective, deps: [{ token: Datagrid, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
4783
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbGridHighlightDirective, isStandalone: true, selector: "[ngbGridHighlight]", inputs: { rowKey: ["ngbGridHighlight", "rowKey"], highlightColumnIndex: "highlightColumnIndex", highlightedIndex: "highlightedIndex" }, usesOnChanges: true, ngImport: i0 });
4981
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridHighlightDirective, deps: [{ token: Datagrid, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
4982
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbGridHighlightDirective, isStandalone: true, selector: "[ngbGridHighlight]", inputs: { rowKey: ["ngbGridHighlight", "rowKey"], highlightColumnIndex: "highlightColumnIndex", highlightedIndex: "highlightedIndex" }, usesOnChanges: true, ngImport: i0 });
4784
4983
  }
4785
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridHighlightDirective, decorators: [{
4984
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridHighlightDirective, decorators: [{
4786
4985
  type: Directive,
4787
4986
  args: [{
4788
4987
  selector: '[ngbGridHighlight]',
@@ -4816,10 +5015,10 @@ class NgbLiveAnnouncer {
4816
5015
  }
4817
5016
  this.node.textContent = message;
4818
5017
  }
4819
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbLiveAnnouncer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
4820
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbLiveAnnouncer, providedIn: 'root' });
5018
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbLiveAnnouncer, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
5019
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbLiveAnnouncer, providedIn: 'root' });
4821
5020
  }
4822
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbLiveAnnouncer, decorators: [{
5021
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbLiveAnnouncer, decorators: [{
4823
5022
  type: Injectable,
4824
5023
  args: [{ providedIn: 'root' }]
4825
5024
  }] });
@@ -4830,6 +5029,7 @@ const defaultDndI18n = {
4830
5029
  listLabel: (n) => n ?? 'List',
4831
5030
  pickedUp: () => 'Picked up. Use Arrow keys to move, Enter to drop, Escape to cancel.',
4832
5031
  dropped: () => 'Dropped.',
5032
+ canceled: () => 'Canceled.',
4833
5033
  moveToIndex: (i, t) => `Moved to position ${i} of ${t}.`,
4834
5034
  dropHere: () => 'Drop here',
4835
5035
  cannotDropHere: () => 'Cannot drop here'
@@ -4887,10 +5087,10 @@ class NgbDndState {
4887
5087
  this.active.set(false);
4888
5088
  }
4889
5089
  }
4890
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndState, deps: [{ token: DND_LIVE_ANNOUNCE, optional: true }, { token: DND_I18N, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
4891
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndState, providedIn: 'root' });
5090
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndState, deps: [{ token: DND_LIVE_ANNOUNCE, optional: true }, { token: DND_I18N, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
5091
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndState, providedIn: 'root' });
4892
5092
  }
4893
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndState, decorators: [{
5093
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndState, decorators: [{
4894
5094
  type: Injectable,
4895
5095
  args: [{ providedIn: 'root' }]
4896
5096
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -5195,10 +5395,10 @@ class NgbSyncColgroupDirective {
5195
5395
  }
5196
5396
  return contentWidth;
5197
5397
  }
5198
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSyncColgroupDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
5199
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbSyncColgroupDirective, isStandalone: true, selector: "[ngbSyncColgroup]", inputs: { syncId: ["ngbSyncColgroup", "syncId"], syncRole: "syncRole", syncMode: "syncMode" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0 });
5398
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSyncColgroupDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
5399
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbSyncColgroupDirective, isStandalone: true, selector: "[ngbSyncColgroup]", inputs: { syncId: ["ngbSyncColgroup", "syncId"], syncRole: "syncRole", syncMode: "syncMode" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0 });
5200
5400
  }
5201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSyncColgroupDirective, decorators: [{
5401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSyncColgroupDirective, decorators: [{
5202
5402
  type: Directive,
5203
5403
  args: [{
5204
5404
  selector: '[ngbSyncColgroup]',
@@ -5278,18 +5478,29 @@ class NgbDndListDirective {
5278
5478
  this.canDrop = false;
5279
5479
  return;
5280
5480
  }
5281
- ev.preventDefault();
5282
- ev.stopPropagation();
5283
- this.state.setActiveDropList(this);
5284
5481
  this.hover = true;
5285
- 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;
5286
5488
  try {
5287
- if (ev.dataTransfer)
5288
- ev.dataTransfer.dropEffect = this.dndCloneOnDrop ? 'copy' : 'move';
5489
+ if (ev.dataTransfer) {
5490
+ ev.dataTransfer.dropEffect = canDropHere ? (this.dndCloneOnDrop ? 'copy' : 'move') : 'none';
5491
+ }
5289
5492
  }
5290
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);
5291
5503
  this.ensurePlaceholder();
5292
- const idx = this.indexFromPointer(ev);
5293
5504
  if (idx !== this.lastIndex) {
5294
5505
  this.lastIndex = idx;
5295
5506
  this.positionPlaceholderAt(idx);
@@ -5325,10 +5536,10 @@ class NgbDndListDirective {
5325
5536
  return;
5326
5537
  }
5327
5538
  }
5328
- const anyEv = ev;
5329
- if (anyEv.__ngbHandled)
5539
+ const handledEvent = ev;
5540
+ if (handledEvent.__ngbHandled)
5330
5541
  return;
5331
- anyEv.__ngbHandled = true;
5542
+ handledEvent.__ngbHandled = true;
5332
5543
  ev.preventDefault();
5333
5544
  this.performDrop(ev);
5334
5545
  this.resetVisualState();
@@ -5344,10 +5555,10 @@ class NgbDndListDirective {
5344
5555
  this.resetVisualState();
5345
5556
  return;
5346
5557
  }
5347
- const anyEv = ev;
5348
- if (anyEv.__ngbHandled)
5558
+ const handledEvent = ev;
5559
+ if (handledEvent.__ngbHandled)
5349
5560
  return;
5350
- anyEv.__ngbHandled = true;
5561
+ handledEvent.__ngbHandled = true;
5351
5562
  ev.preventDefault();
5352
5563
  ev.stopPropagation();
5353
5564
  this.performDrop(ev);
@@ -5450,17 +5661,20 @@ class NgbDndListDirective {
5450
5661
  }
5451
5662
  isDroppingIntoOwnDescendant(item, targetList) {
5452
5663
  const key = this.dndChildrenKey;
5453
- if (!key || !item)
5664
+ if (!key || !item || typeof item !== 'object')
5454
5665
  return false;
5455
5666
  const stack = [];
5456
- if (Array.isArray(item[key]))
5457
- stack.push(item[key]);
5667
+ const rootChildren = item[key];
5668
+ if (Array.isArray(rootChildren))
5669
+ stack.push(rootChildren);
5458
5670
  while (stack.length) {
5459
5671
  const arr = stack.pop();
5460
5672
  if (arr === targetList)
5461
5673
  return true;
5462
5674
  for (const child of arr) {
5463
- const kids = child?.[key];
5675
+ if (!child || typeof child !== 'object')
5676
+ continue;
5677
+ const kids = child[key];
5464
5678
  if (Array.isArray(kids))
5465
5679
  stack.push(kids);
5466
5680
  }
@@ -5474,7 +5688,7 @@ class NgbDndListDirective {
5474
5688
  _buildGuardPayload(session, dstIndex) {
5475
5689
  const srcList = session.fromList ?? [];
5476
5690
  const srcIndex = typeof session.fromIndex === 'number' ? session.fromIndex : -1;
5477
- const dstList = this.list;
5691
+ const dstList = this.list ?? [];
5478
5692
  return {
5479
5693
  dragItem: session.item,
5480
5694
  srcList,
@@ -5489,11 +5703,7 @@ class NgbDndListDirective {
5489
5703
  * Uses vertical list heuristics; adjust for horizontal if your list is horizontal.
5490
5704
  */
5491
5705
  _computeDropIndex(ev) {
5492
- const host = this._host?.nativeElement
5493
- ?? this._el?.nativeElement
5494
- ?? this.el?.nativeElement
5495
- ?? this.elementRef?.nativeElement
5496
- ?? null;
5706
+ const host = this.el.nativeElement;
5497
5707
  if (!host)
5498
5708
  return this.list?.length ?? 0;
5499
5709
  const children = this.draggableChildren();
@@ -5518,6 +5728,10 @@ class NgbDndListDirective {
5518
5728
  return false;
5519
5729
  }
5520
5730
  }
5731
+ emitDropEvent(event) {
5732
+ this.dndDropped.emit(event);
5733
+ this.state.announce?.(this.state.i18n.dropped());
5734
+ }
5521
5735
  // Extract your existing onDrop logic into a single method:
5522
5736
  performDrop(ev) {
5523
5737
  const session = this.getSession(ev);
@@ -5530,19 +5744,25 @@ class NgbDndListDirective {
5530
5744
  ev.preventDefault();
5531
5745
  ev.stopPropagation();
5532
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;
5533
5751
  return; // ⛔ do not mutate arrays
5534
5752
  }
5535
5753
  this._denied = false;
5536
5754
  // ❗ block cycles: don't allow dropping an item into its own descendants
5537
5755
  if (this.isDroppingIntoOwnDescendant(session.item, this.list)) {
5538
5756
  // optional: visual/aural feedback
5757
+ this._denied = true;
5758
+ this.canDrop = false;
5539
5759
  this.state.announce?.(this.state.i18n.cannotDropHere());
5540
5760
  this.removePlaceholder();
5541
5761
  this.lastIndex = -1;
5542
5762
  return;
5543
5763
  }
5544
5764
  const targetIndex = this.lastIndex < 0 ? this.list.length : this.lastIndex;
5545
- const fromList = session.fromList ?? undefined;
5765
+ const fromList = session.fromList;
5546
5766
  const fromIndex = session.fromIndex ?? -1;
5547
5767
  const sameList = fromList === this.list;
5548
5768
  const isExternal = session.fromIsPalette === true || !fromList || fromIndex === -1;
@@ -5563,7 +5783,7 @@ class NgbDndListDirective {
5563
5783
  this.list.splice(insertAt, 0, itemToInsert);
5564
5784
  this.removePlaceholder();
5565
5785
  this.lastIndex = -1;
5566
- this.dndDropped.emit({
5786
+ this.emitDropEvent({
5567
5787
  item: itemToInsert,
5568
5788
  fromIndex,
5569
5789
  toIndex: insertAt,
@@ -5571,12 +5791,11 @@ class NgbDndListDirective {
5571
5791
  toList: this.list,
5572
5792
  sameList
5573
5793
  });
5574
- this.state.announce?.(this.state.i18n.dropped());
5575
5794
  }
5576
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5577
- 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 });
5795
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndListDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
5796
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", 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
5797
  }
5579
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndListDirective, decorators: [{
5798
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndListDirective, decorators: [{
5580
5799
  type: Directive,
5581
5800
  args: [{
5582
5801
  selector: '[ngbDndList]',
@@ -5669,80 +5888,139 @@ class NgbDndItemDirective {
5669
5888
  role = 'listitem';
5670
5889
  tabIndex = 0; // keyboard focusable
5671
5890
  sessionId = null;
5672
- onDragStart(ev) {
5673
- const eventWithFlag = ev;
5674
- if (eventWithFlag.__ngbDndItemStarted)
5675
- return;
5676
- 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) {
5677
5901
  if (this.dndDisabled || this.item == null) {
5678
- ev.preventDefault();
5679
- return;
5902
+ return false;
5680
5903
  }
5681
5904
  this.sessionId = this.state.createSession({
5682
5905
  item: this.item,
5683
5906
  group: this.dndGroup ?? this.parentList?.dndGroup,
5684
- fromList: this.dndSourceList ?? this.parentList?.list,
5685
- fromIndex: this.dndIndex,
5907
+ fromList: this.sourceList(),
5908
+ fromIndex: this.resolveIndex(this.sourceList()),
5686
5909
  fromListRef: this.parentList,
5687
5910
  fromIsPalette: this.parentList?.dndIsPalette === true
5688
5911
  });
5689
- // set both a custom and a plain text payload; keep plain text non-empty
5690
- ev.dataTransfer?.setData('text/ngb-dnd', this.sessionId);
5691
- ev.dataTransfer?.setData('text/plain', 'ngb'); // some browsers require non-empty
5692
- if (ev.dataTransfer)
5693
- ev.dataTransfer.effectAllowed = 'copyMove';
5694
- 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
+ }
5695
5918
  this.dragging = true;
5696
5919
  this.dndDragStart.emit(this.item);
5920
+ this.state.announce?.(this.state.i18n.pickedUp());
5921
+ return true;
5697
5922
  }
5698
- onDragEnd() {
5923
+ endDragSession() {
5699
5924
  this.dragging = false;
5700
5925
  this.state.clear(this.sessionId);
5701
5926
  this.sessionId = null;
5927
+ this.keyboardDragState = null;
5702
5928
  this.dndDragEnd.emit();
5703
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
+ }
5704
5983
  onKeydown(ev) {
5705
5984
  if (this.dndDisabled)
5706
5985
  return;
5707
5986
  // start dragging (keyboard mode)
5708
5987
  if (ev.code === 'Space' && !this.dragging) {
5709
5988
  ev.preventDefault();
5710
- 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();
5711
5999
  return;
5712
6000
  }
5713
6001
  if (!this.dragging)
5714
6002
  return;
5715
- // move within same list
5716
- const parent = this.parentList;
5717
- if (!parent || typeof this.dndIndex !== 'number')
5718
- return;
5719
6003
  if (ev.code === 'ArrowUp' || ev.code === 'ArrowDown') {
5720
6004
  ev.preventDefault();
5721
- const list = parent.list;
5722
- const from = this.dndIndex;
5723
- let to = ev.code === 'ArrowUp' ? from - 1 : from + 1;
5724
- to = Math.max(0, Math.min(list.length - 1, to));
5725
- if (to !== from) {
5726
- const [it] = list.splice(from, 1);
5727
- list.splice(to, 0, it);
5728
- this.dndIndex = to;
5729
- // announce (see live region below)
5730
- this.state.announce?.(this.state.i18n.moveToIndex(to + 1, list.length));
5731
- }
6005
+ this.moveWithinKeyboardList(ev.code === 'ArrowUp' ? -1 : 1);
6006
+ return;
5732
6007
  }
5733
6008
  if (ev.code === 'Enter') {
5734
6009
  ev.preventDefault();
5735
- this.onDragEnd();
5736
- } // drop
6010
+ this.emitKeyboardDrop();
6011
+ this.endDragSession();
6012
+ return;
6013
+ }
5737
6014
  if (ev.code === 'Escape') {
5738
6015
  ev.preventDefault();
5739
- this.onDragEnd();
5740
- } // cancel
6016
+ this.cancelKeyboardDrag();
6017
+ this.endDragSession();
6018
+ }
5741
6019
  }
5742
- 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 });
5743
- 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 });
6020
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndItemDirective, deps: [{ token: NgbDndListDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
6021
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", 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 });
5744
6022
  }
5745
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndItemDirective, decorators: [{
6023
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndItemDirective, decorators: [{
5746
6024
  type: Directive,
5747
6025
  args: [{
5748
6026
  selector: '[ngbDndItem]',
@@ -5884,6 +6162,7 @@ const isReasonableEmail = (value) => {
5884
6162
  class Datagrid {
5885
6163
  /** Column definitions to render */
5886
6164
  _columns = [];
6165
+ renderTick = 0;
5887
6166
  get columns() {
5888
6167
  return this._columns;
5889
6168
  }
@@ -5974,7 +6253,15 @@ class Datagrid {
5974
6253
  this.syncLegacyFilters(this.localFilter);
5975
6254
  this.invalidateFilteredCaches();
5976
6255
  }
5977
- 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
+ }
5978
6265
  filterManual = false;
5979
6266
  externalFiltering = false;
5980
6267
  /** Opts local arrays into the reusable DataGrid operation helper for filter/sort/page processing. */
@@ -5986,6 +6273,34 @@ class Datagrid {
5986
6273
  this._dataOperations = value ?? false;
5987
6274
  this.invalidatePagedCache();
5988
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
+ }
5989
6304
  /**
5990
6305
  * Optional controlled data-operation state. When provided, the grid syncs page, pageSize,
5991
6306
  * sort, filter, and global filter from this object.
@@ -6057,6 +6372,8 @@ class Datagrid {
6057
6372
  }
6058
6373
  set tableOptions(value) {
6059
6374
  this._tableOptions = value ?? {};
6375
+ this.tableClassListCache = null;
6376
+ this.responsiveWrapperClassesCache = null;
6060
6377
  this.invalidatePagedCache();
6061
6378
  }
6062
6379
  /**
@@ -6093,10 +6410,26 @@ class Datagrid {
6093
6410
  globalFilterAriaLabel = 'Search all columns';
6094
6411
  /** Placeholder for the built-in global search input. */
6095
6412
  globalFilterPlaceholder = 'Search all columns';
6413
+ _searchHighlightTerm = '';
6096
6414
  /** When set, matching substrings in visible cells are wrapped with `.grid-search-highlight`. */
6097
- 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;
6098
6424
  /** Column fields included in search highlighting; all visible columns when empty. */
6099
- 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
+ }
6100
6433
  /** Accessible label announced when expanding a row. */
6101
6434
  expandRowAriaLabel = 'Expand row';
6102
6435
  /** Accessible label announced when collapsing a row. */
@@ -6134,7 +6467,16 @@ class Datagrid {
6134
6467
  }
6135
6468
  theme = 'bootstrap';
6136
6469
  responsive = false;
6137
- 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
+ }
6138
6480
  rowClass;
6139
6481
  rowStyle;
6140
6482
  rowReorderable = false;
@@ -6191,6 +6533,7 @@ class Datagrid {
6191
6533
  rowSave = new EventEmitter();
6192
6534
  rowCancel = new EventEmitter();
6193
6535
  rowDelete = new EventEmitter();
6536
+ groupChange = new EventEmitter();
6194
6537
  sortChange = new EventEmitter();
6195
6538
  filterChange = new EventEmitter();
6196
6539
  filtersChange = new EventEmitter();
@@ -6201,6 +6544,7 @@ class Datagrid {
6201
6544
  columnReorder = new EventEmitter();
6202
6545
  rowDetailTpl;
6203
6546
  pagerTpl;
6547
+ groupHeaderTpl;
6204
6548
  exporter = inject(NgbExportService); // instead of constructor(private exporter: NgbExportService) {}
6205
6549
  expanded = new Set();
6206
6550
  fb = inject(FormBuilder);
@@ -6302,24 +6646,77 @@ class Datagrid {
6302
6646
  filteredCache = [];
6303
6647
  sortedCache = [];
6304
6648
  pagedCache = [];
6649
+ renderRowsCache = [];
6650
+ stickyGroupHeaderRows = [];
6651
+ stickyGroupFooterRows = [];
6652
+ stickyGroupOverlayColumnWidths = [];
6653
+ stickyGroupHeaderTranslateY = 0;
6654
+ stickyGroupFooterTranslateY = 0;
6305
6655
  resolvedColumnsDirty = true;
6306
6656
  visibleColumnsDirty = true;
6307
6657
  filteredDirty = true;
6308
6658
  sortedDirty = true;
6309
6659
  pagedDirty = true;
6310
- rowIndexMap = new Map();
6311
- 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;
6312
6679
  norm(v) {
6313
6680
  return (v ?? '').toString().toLowerCase().trim();
6314
6681
  }
6315
6682
  keyOf(col) {
6316
6683
  return col.field;
6317
6684
  }
6685
+ readFieldValue(row, field) {
6686
+ return typeof row === 'object' && row !== null ? row[field] : undefined;
6687
+ }
6318
6688
  getDefaults() {
6319
6689
  return typeof this.newRowDefaults === 'function'
6320
6690
  ? this.newRowDefaults() ?? {}
6321
6691
  : this.newRowDefaults ?? {};
6322
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
+ }
6323
6720
  defaultFor(col) {
6324
6721
  const d = this.getDefaults();
6325
6722
  const key = col.field;
@@ -6432,6 +6829,12 @@ class Datagrid {
6432
6829
  invalidateColumnCaches() {
6433
6830
  this.resolvedColumnsDirty = true;
6434
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();
6435
6838
  this.invalidateFilteredCaches();
6436
6839
  }
6437
6840
  invalidateFilteredCaches() {
@@ -6444,24 +6847,63 @@ class Datagrid {
6444
6847
  }
6445
6848
  invalidatePagedCache() {
6446
6849
  this.pagedDirty = true;
6850
+ this.renderRowsDirty = true;
6851
+ this.scheduleStickyGroupSync();
6852
+ }
6853
+ invalidateRowIdentityCache() {
6854
+ this.rowMetaSource = null;
6855
+ this.rowMetaTrackBy = undefined;
6447
6856
  }
6448
6857
  invalidateDataCaches() {
6449
- this.rowIndexMapSource = null;
6858
+ this.invalidateRowIdentityCache();
6859
+ this.multiCheckboxOptionsCache.clear();
6860
+ this.multiCheckboxVisibleOptionsCache.clear();
6861
+ this.searchHighlightCache.clear();
6450
6862
  this.invalidateFilteredCaches();
6451
6863
  }
6452
6864
  markGridForCheck() {
6453
6865
  this.cdr?.markForCheck();
6454
6866
  }
6455
- ensureRowIndexMap() {
6456
- 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)
6457
6884
  return;
6458
- this.rowIndexMap.clear();
6459
- (this.data ?? []).forEach((row, index) => this.rowIndexMap.set(row, index));
6460
- 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
+ };
6461
6904
  }
6462
6905
  dataIndexOf(row, fallback = -1) {
6463
- this.ensureRowIndexMap();
6464
- return this.rowIndexMap.get(row) ?? fallback;
6906
+ return this.resolveRowMeta(row, fallback).index;
6465
6907
  }
6466
6908
  syncColumnOrder(resetFromColumns) {
6467
6909
  const visible = this.resolvedColumns.filter((col) => !col.hidden);
@@ -6478,6 +6920,185 @@ class Datagrid {
6478
6920
  }
6479
6921
  this.columnOrder = next;
6480
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
+ }
6481
7102
  isColumnReorderEnabled() {
6482
7103
  if (!this.columnReorderable || this.isStackedLayout())
6483
7104
  return false;
@@ -6611,8 +7232,7 @@ class Datagrid {
6611
7232
  fields: [...order],
6612
7233
  });
6613
7234
  }
6614
- this.syncResizableColgroups();
6615
- this.cdr.markForCheck();
7235
+ this.scheduleViewRefresh(() => this.syncResizableColgroups());
6616
7236
  }
6617
7237
  validateColumnConfig() {
6618
7238
  const columns = this.resolvedColumns;
@@ -6698,7 +7318,7 @@ class Datagrid {
6698
7318
  return false;
6699
7319
  if (!global)
6700
7320
  return true;
6701
- 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));
6702
7322
  });
6703
7323
  }
6704
7324
  this.filteredDirty = false;
@@ -6734,7 +7354,7 @@ class Datagrid {
6734
7354
  matchesDescriptor(row, descriptor) {
6735
7355
  const column = this.resolvedColumns.find((col) => col.field === descriptor.field);
6736
7356
  const filterType = this.getColumnFilterType(column);
6737
- const cellValue = this.normalizeFilterValue(row?.[descriptor.field], filterType);
7357
+ const cellValue = this.normalizeFilterValue(this.readFieldValue(row, descriptor.field), filterType);
6738
7358
  const compareValue = this.normalizeFilterValue(descriptor.value, filterType);
6739
7359
  const ignoreCase = descriptor.ignoreCase ?? (filterType === 'text' || filterType === 'select');
6740
7360
  if (descriptor.operator === 'isnull')
@@ -6812,12 +7432,17 @@ class Datagrid {
6812
7432
  return this.isFilteringEnabled() && this.resolvedFilterMode() === 'multi' && !!col.filterable;
6813
7433
  }
6814
7434
  getAllowedOperators(col) {
6815
- if (col.allowedFilterOperators?.length)
6816
- return col.allowedFilterOperators;
6817
- const typeOperators = this.filterOperators?.[col.type ?? 'text'];
6818
- if (typeOperators?.length)
6819
- return typeOperators;
6820
- 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;
6821
7446
  }
6822
7447
  defaultFilterOperator(col) {
6823
7448
  const allowed = this.getAllowedOperators(col);
@@ -6900,14 +7525,162 @@ class Datagrid {
6900
7525
  return value ? 'Yes' : 'No';
6901
7526
  return String(value);
6902
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
+ }
6903
7666
  getSearchHighlightSegments(value, field) {
6904
7667
  const display = this.formatCellDisplayValue(value);
6905
- if (!this.shouldHighlightSearchInColumn(field)) {
6906
- return [{ text: display, match: false }];
6907
- }
6908
7668
  const term = this.norm(this.searchHighlightTerm);
6909
- if (!term || !display)
6910
- 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
+ }
6911
7684
  const normalizedDisplay = this.norm(display);
6912
7685
  const segments = [];
6913
7686
  let cursor = 0;
@@ -6916,18 +7689,20 @@ class Datagrid {
6916
7689
  const normalizedSlice = this.norm(slice);
6917
7690
  const matchIndex = normalizedSlice.indexOf(term);
6918
7691
  if (matchIndex < 0) {
6919
- segments.push({ text: display.slice(cursor), match: false });
7692
+ segments.push({ key: `${cursor}:n`, text: display.slice(cursor), match: false });
6920
7693
  break;
6921
7694
  }
6922
7695
  const start = cursor + matchIndex;
6923
7696
  const end = start + term.length;
6924
7697
  if (start > cursor) {
6925
- segments.push({ text: display.slice(cursor, start), match: false });
7698
+ segments.push({ key: `${cursor}:n`, text: display.slice(cursor, start), match: false });
6926
7699
  }
6927
- segments.push({ text: display.slice(start, end), match: true });
7700
+ segments.push({ key: `${start}:m`, text: display.slice(start, end), match: true });
6928
7701
  cursor = end;
6929
7702
  }
6930
- 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;
6931
7706
  }
6932
7707
  rowFilterEmptyOptionLabel(col) {
6933
7708
  return this.getColumnFilterType(col) === 'boolean' ? '(All)' : 'Select';
@@ -7292,22 +8067,37 @@ class Datagrid {
7292
8067
  this.closeFilterMenu();
7293
8068
  }
7294
8069
  multiCheckboxOptions(col) {
8070
+ const field = col.field;
8071
+ const cached = this.multiCheckboxOptionsCache.get(field);
8072
+ if (cached)
8073
+ return cached;
7295
8074
  const seen = new Map();
7296
8075
  for (const row of this.data ?? []) {
7297
- const value = row?.[col.field];
8076
+ const value = this.readFieldValue(row, col.field);
7298
8077
  const key = this.multiCheckboxValueKey(value);
7299
8078
  if (!seen.has(key)) {
7300
8079
  seen.set(key, { label: this.multiCheckboxValueLabel(col, value), value });
7301
8080
  }
7302
8081
  }
7303
- 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;
7304
8085
  }
7305
8086
  multiCheckboxVisibleOptions(col) {
7306
- 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;
7307
8093
  const options = this.multiCheckboxOptions(col);
7308
- if (!query)
8094
+ if (!query) {
8095
+ this.multiCheckboxVisibleOptionsCache.set(cacheKey, options);
7309
8096
  return options;
7310
- 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;
7311
8101
  }
7312
8102
  multiCheckboxValueLabel(col, value) {
7313
8103
  if (this.getColumnFilterType(col) === 'boolean')
@@ -7482,11 +8272,9 @@ class Datagrid {
7482
8272
  const copy = [...this.filtered];
7483
8273
  const { active, direction } = this.sort;
7484
8274
  copy.sort((a, b) => {
7485
- const av = a?.[active];
7486
- const bv = b?.[active];
7487
- const cmp = typeof av === 'string' && typeof bv === 'string'
7488
- ? av.localeCompare(bv, undefined, { numeric: true, sensitivity: 'base' })
7489
- : 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);
7490
8278
  return direction === 'asc' ? cmp : -cmp;
7491
8279
  });
7492
8280
  return copy;
@@ -7519,6 +8307,11 @@ class Datagrid {
7519
8307
  }
7520
8308
  get paged() {
7521
8309
  if (this.pagedDirty) {
8310
+ if (this.isGroupingActive()) {
8311
+ this.ensureRenderRows();
8312
+ this.pagedDirty = false;
8313
+ return this.pagedCache;
8314
+ }
7522
8315
  if (this.shouldUseLocalDataOperations()) {
7523
8316
  this.pagedCache = this.localDataOperationsResult(this.paginationActive).data;
7524
8317
  this.pagedDirty = false;
@@ -7535,6 +8328,13 @@ class Datagrid {
7535
8328
  }
7536
8329
  return this.pagedCache;
7537
8330
  }
8331
+ get renderRows() {
8332
+ this.ensureRenderRows();
8333
+ return this.renderRowsCache;
8334
+ }
8335
+ hasRenderableRows() {
8336
+ return this.renderRows.length > 0;
8337
+ }
7538
8338
  shouldUseLocalDataOperations() {
7539
8339
  if (!this.dataOperations)
7540
8340
  return false;
@@ -7546,11 +8346,137 @@ class Datagrid {
7546
8346
  return ngbApplyDataGridOperations(this.data, {
7547
8347
  ...options,
7548
8348
  state: this.dataState(),
8349
+ groupedData: options.groupedData ?? this.groupedData,
7549
8350
  columns: options.columns ?? this.resolvedColumns,
7550
8351
  globalFilterFields: options.globalFilterFields ?? this.resolvedColumns.map((column) => column.field),
7551
8352
  page,
7552
8353
  });
7553
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
+ }
7554
8480
  // getters for template conditions / display
7555
8481
  get anyFilterable() {
7556
8482
  if (this.resolvedFilterMode() !== 'row')
@@ -7628,6 +8554,7 @@ class Datagrid {
7628
8554
  skip: Math.max(0, (this.page - 1) * this.pageSize),
7629
8555
  pageSize: this.pageSize,
7630
8556
  sort,
8557
+ group: [...this.group],
7631
8558
  filter: this.cloneComposite(this.effectiveFilterDescriptor()),
7632
8559
  globalFilter: this.currentGlobalFilterValue(),
7633
8560
  };
@@ -7658,6 +8585,10 @@ class Datagrid {
7658
8585
  this.sort = firstSort?.field && firstSort.direction
7659
8586
  ? { active: firstSort.field, direction: firstSort.direction }
7660
8587
  : { active: null, direction: '' };
8588
+ if (state.group !== undefined) {
8589
+ this._group = this.normalizeGroupDescriptors(state.group);
8590
+ this.syncCollapsedGroups();
8591
+ }
7661
8592
  if (state.filter !== undefined) {
7662
8593
  this.localFilter = this.cloneComposite(state.filter ?? { logic: 'and', filters: [] });
7663
8594
  this.syncLegacyFilters(this.localFilter);
@@ -7681,6 +8612,133 @@ class Datagrid {
7681
8612
  if (this.headerScroller?.nativeElement) {
7682
8613
  this.headerScroller.nativeElement.scrollLeft = left;
7683
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);
7684
8742
  }
7685
8743
  get isHeaderSticky() {
7686
8744
  return this.stickyHeaderEnabled && this.shouldEnableScroll;
@@ -7792,13 +8850,26 @@ class Datagrid {
7792
8850
  return this.editingIndex === pagedIndex;
7793
8851
  }
7794
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) {
7795
8861
  if (!this.isIncellEditMode() || !this.enableEdit)
7796
8862
  return;
7797
8863
  const row = this.paged[pagedIndex];
7798
8864
  if (!this.isCellEditable(col, row, false))
7799
8865
  return;
7800
- const el = ev.target;
7801
- 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'))
7802
8873
  return;
7803
8874
  if (this.isCellInEditMode(pagedIndex, col))
7804
8875
  return;
@@ -7855,10 +8926,13 @@ class Datagrid {
7855
8926
  this.addingNew = false;
7856
8927
  this.editingIndex = pagedIndex;
7857
8928
  this.editingCell = { rowIndex: pagedIndex, field };
7858
- 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]));
7859
8934
  this.saveAttemptedEdit = false;
7860
- this.cdr.markForCheck();
7861
- queueMicrotask(() => this.focusInlineEditor(field));
8935
+ this.scheduleViewRefresh(() => this.focusInlineEditor(field));
7862
8936
  }
7863
8937
  focusInlineEditor(preferredField) {
7864
8938
  const root = this.hostEl?.nativeElement;
@@ -7889,7 +8963,7 @@ class Datagrid {
7889
8963
  const original = this.data[di];
7890
8964
  const rowId = this.getRowId(di, original);
7891
8965
  const service = this.getEditService();
7892
- const updated = service.assignValues(original, { ...original, [field]: control?.value });
8966
+ const updated = service.assignValues(original, this.patchFieldValue(field, control?.value));
7893
8967
  const next = service.update(this.data ?? [], updated, di, rowId);
7894
8968
  this.data = service.saveChanges(next, di, rowId, updated);
7895
8969
  this.invalidateDataCaches();
@@ -7900,7 +8974,7 @@ class Datagrid {
7900
8974
  this.editForm = this.fb.group({});
7901
8975
  this.saveAttemptedEdit = false;
7902
8976
  }
7903
- this.cdr.markForCheck();
8977
+ this.scheduleViewRefresh();
7904
8978
  return true;
7905
8979
  }
7906
8980
  cancelIncellEdit() {
@@ -7914,7 +8988,7 @@ class Datagrid {
7914
8988
  this.editingIndex = null;
7915
8989
  this.editForm = this.fb.group({});
7916
8990
  this.saveAttemptedEdit = false;
7917
- this.cdr.markForCheck();
8991
+ this.scheduleViewRefresh();
7918
8992
  }
7919
8993
  getSingleSelectedPagedIndex() {
7920
8994
  const selected = this.paged
@@ -7944,11 +9018,10 @@ class Datagrid {
7944
9018
  this.externalDialogFocusedOnce = false;
7945
9019
  this.externalEditIsNew = false;
7946
9020
  this.externalEditPagedIndex = pagedIndex;
7947
- this.externalForm = this.buildFormFromRow(this.paged[pagedIndex]);
9021
+ this.externalForm = this.buildFormFromRow(this.toDraftValues(this.paged[pagedIndex]));
7948
9022
  this.saveAttemptedExternal = false;
7949
9023
  this.externalEditOpen = true;
7950
- this.cdr.markForCheck();
7951
- queueMicrotask(() => this.focusExternalDialogFirstField());
9024
+ this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
7952
9025
  }
7953
9026
  openExternalAdd() {
7954
9027
  this.externalDialogOpener = document.activeElement ?? null;
@@ -7959,11 +9032,10 @@ class Datagrid {
7959
9032
  this.saveAttemptedExternal = false;
7960
9033
  this.externalEditOpen = true;
7961
9034
  const service = this.getEditService();
7962
- const draft = service.assignValues({}, this.externalForm.value);
9035
+ const draft = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
7963
9036
  this.addDraftRowId = Symbol('ngb-datagrid-new-row');
7964
9037
  service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
7965
- this.cdr.markForCheck();
7966
- queueMicrotask(() => this.focusExternalDialogFirstField());
9038
+ this.scheduleViewRefresh(() => this.focusExternalDialogFirstField());
7967
9039
  }
7968
9040
  saveExternalEdit() {
7969
9041
  if (!this.externalEditOpen)
@@ -7975,7 +9047,7 @@ class Datagrid {
7975
9047
  return;
7976
9048
  const service = this.getEditService();
7977
9049
  if (this.externalEditIsNew) {
7978
- const newRow = service.assignValues({}, this.externalForm.value);
9050
+ const newRow = this.assignDraftValues({}, this.formDraftValues(this.externalForm));
7979
9051
  const rowIndex = this.data.length;
7980
9052
  const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
7981
9053
  service.create(this.data ?? [], newRow, rowIndex, rowId);
@@ -7987,7 +9059,7 @@ class Datagrid {
7987
9059
  const di = this.dataIndexOf(this.paged[pagedIndex]);
7988
9060
  const original = this.data[di];
7989
9061
  const rowId = this.getRowId(di, original);
7990
- const updated = service.assignValues(original, this.externalForm.value);
9062
+ const updated = this.assignDraftValues(original, this.formDraftValues(this.externalForm));
7991
9063
  const next = service.update(this.data ?? [], updated, di, rowId);
7992
9064
  this.data = service.saveChanges(next, di, rowId, updated);
7993
9065
  this.invalidateDataCaches();
@@ -8210,6 +9282,8 @@ class Datagrid {
8210
9282
  return side ? `column-pinned-${side}${col.locked ? ' column-locked' : ' column-sticky'}` : null;
8211
9283
  }
8212
9284
  get tableClassList() {
9285
+ if (this.tableClassListCache)
9286
+ return this.tableClassListCache;
8213
9287
  const opts = this.tableOptions || {};
8214
9288
  const cls = ['table'];
8215
9289
  if (opts.stripedRows)
@@ -8230,15 +9304,20 @@ class Datagrid {
8230
9304
  cls.push('align-middle');
8231
9305
  if (opts.align === 'bottom')
8232
9306
  cls.push('align-bottom');
9307
+ this.tableClassListCache = cls;
8233
9308
  return cls;
8234
9309
  }
8235
9310
  get responsiveWrapperClasses() {
9311
+ if (this.responsiveWrapperClassesCache)
9312
+ return this.responsiveWrapperClassesCache;
8236
9313
  const r = this.tableOptions?.responsive;
8237
- if (r === false)
8238
- return [];
8239
- if (r === true || r === undefined)
8240
- return ['table-responsive'];
8241
- 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;
8242
9321
  }
8243
9322
  get densityMode() {
8244
9323
  return this.tableOptions?.density ?? 'comfortable';
@@ -8257,11 +9336,19 @@ class Datagrid {
8257
9336
  return col.stackedGroup ?? 'start';
8258
9337
  }
8259
9338
  stackedColumnsInGroup(group) {
8260
- 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;
8261
9345
  }
8262
9346
  stackedCardGroups() {
9347
+ if (this.stackedCardGroupsCache)
9348
+ return this.stackedCardGroupsCache;
8263
9349
  const order = ['start', 'center', 'end'];
8264
- return order.filter((group) => this.stackedColumnsInGroup(group).length > 0);
9350
+ this.stackedCardGroupsCache = order.filter((group) => this.stackedColumnsInGroup(group).length > 0);
9351
+ return this.stackedCardGroupsCache;
8265
9352
  }
8266
9353
  visibleColumnIndex(col) {
8267
9354
  return this.visibleColumns.findIndex((item) => item.field === col.field);
@@ -8341,7 +9428,7 @@ class Datagrid {
8341
9428
  }
8342
9429
  updateHighlightCache() {
8343
9430
  this.highlightRowMap.clear();
8344
- (this.highlightedIndex || []).forEach(item => {
9431
+ (this.highlightedIndex || []).forEach((item) => {
8345
9432
  const rowKey = item.row;
8346
9433
  if (!this.highlightRowMap.has(rowKey))
8347
9434
  this.highlightRowMap.set(rowKey, []);
@@ -8352,16 +9439,16 @@ class Datagrid {
8352
9439
  return (col.header ?? col.field ?? '').toString();
8353
9440
  }
8354
9441
  headerTitle(col) {
8355
- const t = col?.title;
9442
+ const t = col.title;
8356
9443
  return (t ?? this.headerText(col)) ?? '';
8357
9444
  }
8358
9445
  cellTitle(row, col) {
8359
- const def = col?.cellTitle;
9446
+ const def = col.cellTitle;
8360
9447
  if (typeof def === 'function')
8361
9448
  return def(row) ?? '';
8362
9449
  if (typeof def === 'string')
8363
9450
  return def;
8364
- const val = row?.[col.field];
9451
+ const val = this.readFieldValue(row, col.field);
8365
9452
  return val === undefined || val === null ? '' : String(val);
8366
9453
  }
8367
9454
  columnFilterAriaLabel(col) {
@@ -8617,8 +9704,7 @@ class Datagrid {
8617
9704
  const sticky = [];
8618
9705
  const rest = [];
8619
9706
  rows.forEach(r => {
8620
- const di = this.dataIndexOf(r);
8621
- const id = this.getRowId(di >= 0 ? di : 0, r);
9707
+ const { id } = this.resolveRowMeta(r, 0);
8622
9708
  (this.stickyRowIds.has(id) ? sticky : rest).push(r);
8623
9709
  });
8624
9710
  return [...sticky, ...rest];
@@ -8654,6 +9740,8 @@ class Datagrid {
8654
9740
  filterTplQ;
8655
9741
  filterMenuTplQ;
8656
9742
  globalTplQ;
9743
+ groupHeaderColumnTplQ;
9744
+ groupFooterTplQ;
8657
9745
  gridColumnQ;
8658
9746
  /** Internal lookup maps */
8659
9747
  cellTpls = {};
@@ -8661,6 +9749,8 @@ class Datagrid {
8661
9749
  filterTpls = {};
8662
9750
  filterMenuTpls = {};
8663
9751
  globalTpl = null;
9752
+ groupHeaderColumnTpls = {};
9753
+ groupFooterTpls = {};
8664
9754
  warnedDeclarativeColumns = false;
8665
9755
  toRecord(items) {
8666
9756
  const arr = Array.isArray(items)
@@ -8722,6 +9812,8 @@ class Datagrid {
8722
9812
  this.filterTpls = this.toRecord(this.filterTplQ);
8723
9813
  this.filterMenuTpls = this.toRecord(this.filterMenuTplQ);
8724
9814
  this.globalTpl = this.globalTplQ?.first ?? null;
9815
+ this.groupHeaderColumnTpls = this.toRecord(this.groupHeaderColumnTplQ);
9816
+ this.groupFooterTpls = this.toRecord(this.groupFooterTplQ);
8725
9817
  this.syncColumnWidthOverrides(true);
8726
9818
  this.syncColumnOrder(true);
8727
9819
  this.validateColumnConfig();
@@ -8736,7 +9828,10 @@ class Datagrid {
8736
9828
  this.filterTplQ?.changes.subscribe(rebuild);
8737
9829
  this.filterMenuTplQ?.changes.subscribe(rebuild);
8738
9830
  this.globalTplQ?.changes.subscribe(rebuild);
9831
+ this.groupHeaderColumnTplQ?.changes.subscribe(rebuild);
9832
+ this.groupFooterTplQ?.changes.subscribe(rebuild);
8739
9833
  this.gridColumnQ?.changes.subscribe(rebuild);
9834
+ this.scheduleStickyGroupSync();
8740
9835
  }
8741
9836
  ngOnChanges(ch) {
8742
9837
  if (ch['state']) {
@@ -8775,6 +9870,7 @@ class Datagrid {
8775
9870
  if (ch['data'] || ch['columns'] || ch['labels'] || ch['locale'] || ch['dir']) {
8776
9871
  this.cdr.markForCheck();
8777
9872
  }
9873
+ this.scheduleStickyGroupSync();
8778
9874
  }
8779
9875
  resetEditingState() {
8780
9876
  this.editingCell = null;
@@ -8785,7 +9881,10 @@ class Datagrid {
8785
9881
  this.cdr.markForCheck();
8786
9882
  }
8787
9883
  getRowId(rowIndex, row) {
8788
- 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)));
8789
9888
  }
8790
9889
  /** Apply selection ids and refresh checkbox UI (for programmatic / OnPush sync). */
8791
9890
  setSelectionIds(ids, options) {
@@ -8797,7 +9896,7 @@ class Datagrid {
8797
9896
  }
8798
9897
  if (options?.emit !== false) {
8799
9898
  this.selectionChange.emit({
8800
- selected: this.data.filter((row, idx) => this.selectedRowIds.has(this.getRowId(idx, row))),
9899
+ selected: this.selectedDataRows(),
8801
9900
  lastAction: null,
8802
9901
  });
8803
9902
  }
@@ -8816,6 +9915,7 @@ class Datagrid {
8816
9915
  }
8817
9916
  isRowReorderEnabled() {
8818
9917
  return this.rowReorderable &&
9918
+ !this.isGroupingActive() &&
8819
9919
  !this.sort.active &&
8820
9920
  !this.hasActiveFilters() &&
8821
9921
  !this.addingNew &&
@@ -8840,7 +9940,7 @@ class Datagrid {
8840
9940
  this.saveAttemptedNew = false;
8841
9941
  // Register a draft row with the edit service so implementations can track "new" state.
8842
9942
  const service = this.getEditService();
8843
- const draft = service.assignValues({}, this.addForm.value);
9943
+ const draft = this.assignDraftValues({}, this.formDraftValues(this.addForm));
8844
9944
  this.addDraftRowId = Symbol('ngb-datagrid-new-row');
8845
9945
  service.create(this.data ?? [], draft, this.data.length, this.addDraftRowId);
8846
9946
  this.cdr.markForCheck();
@@ -8854,7 +9954,7 @@ class Datagrid {
8854
9954
  if (this.addForm.invalid)
8855
9955
  return;
8856
9956
  const service = this.getEditService();
8857
- const newRow = service.assignValues({}, this.addForm.value);
9957
+ const newRow = this.assignDraftValues({}, this.formDraftValues(this.addForm));
8858
9958
  const rowIndex = this.data.length;
8859
9959
  const rowId = this.addDraftRowId ?? this.getRowId(rowIndex, newRow);
8860
9960
  service.create(this.data ?? [], newRow, rowIndex, rowId);
@@ -8890,15 +9990,14 @@ class Datagrid {
8890
9990
  this.editingCell = null;
8891
9991
  this.editingIndex = i;
8892
9992
  const row = this.paged[i];
8893
- this.editForm = this.buildFormFromRow(this.paged[i]);
9993
+ this.editForm = this.buildFormFromRow(this.toDraftValues(row));
8894
9994
  this.saveAttemptedEdit = false;
8895
9995
  const di = this.dataIndexOf(row);
8896
9996
  const rowId = this.getRowId(di, this.data[di]);
8897
9997
  // Start tracking baseline for the row (service can snapshot original state).
8898
9998
  this.getEditService().update(this.data ?? [], this.data[di], di, rowId);
8899
9999
  this.rowEdit.emit({ row: this.data[di], index: di });
8900
- this.cdr.markForCheck();
8901
- queueMicrotask(() => this.focusInlineEditor());
10000
+ this.scheduleViewRefresh(() => this.focusInlineEditor());
8902
10001
  }
8903
10002
  saveEdit(i) {
8904
10003
  if (this.editingIndex !== i || !this.editForm)
@@ -8912,7 +10011,7 @@ class Datagrid {
8912
10011
  const original = this.data[di];
8913
10012
  const rowId = this.getRowId(di, original);
8914
10013
  const service = this.getEditService();
8915
- const updated = service.assignValues(original, this.editForm.value);
10014
+ const updated = this.assignDraftValues(original, this.formDraftValues(this.editForm));
8916
10015
  const next = service.update(this.data ?? [], updated, di, rowId);
8917
10016
  this.data = service.saveChanges(next, di, rowId, updated);
8918
10017
  this.invalidateDataCaches();
@@ -8936,7 +10035,7 @@ class Datagrid {
8936
10035
  onNewDraftChange(col) {
8937
10036
  if (this.draftNew) {
8938
10037
  const key = this.keyOf(col);
8939
- this.draftNew = this.getEditService().assignValues(this.draftNew, { [key]: this.draftNew[key] });
10038
+ this.draftNew = { ...this.draftNew, [key]: this.draftNew[key] };
8940
10039
  }
8941
10040
  this.validateInto(col, this.draftNew, this.errorsNew);
8942
10041
  }
@@ -8986,7 +10085,7 @@ class Datagrid {
8986
10085
  if (typeof key === 'function')
8987
10086
  return key(row, rowIndex);
8988
10087
  if (typeof key === 'string')
8989
- return row?.[key];
10088
+ return this.readFieldValue(row, key);
8990
10089
  return rowIndex;
8991
10090
  }
8992
10091
  colKeyValue(column, colIndex) {
@@ -8994,7 +10093,7 @@ class Datagrid {
8994
10093
  if (typeof key === 'function')
8995
10094
  return key(column, colIndex);
8996
10095
  if (typeof key === 'string')
8997
- return column?.[key];
10096
+ return this.readFieldValue(column, key);
8998
10097
  return colIndex;
8999
10098
  }
9000
10099
  isRowHighlighted(row, rowIndex) {
@@ -9051,8 +10150,7 @@ class Datagrid {
9051
10150
  this.syncFilterFormFromState();
9052
10151
  }
9053
10152
  onDocumentClick(event) {
9054
- const target = event.target;
9055
- 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');
9056
10154
  if (insideMenu) {
9057
10155
  return;
9058
10156
  }
@@ -9061,11 +10159,27 @@ class Datagrid {
9061
10159
  this.openRowFilterOperatorAnchor = null;
9062
10160
  if (this.isIncellEditMode()) {
9063
10161
  // Clicking outside the grid commits a valid in-cell edit and keeps invalid edits open.
9064
- if (!target?.closest('.ngb-grid')) {
10162
+ if (!this.isEventInsideSelector(event, '.ngb-grid')) {
9065
10163
  this.commitIncellEdit(true);
9066
10164
  }
9067
10165
  }
9068
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
+ }
9069
10183
  canCancelToolbarEdit() {
9070
10184
  return this.isToolbarEditMode() && (this.editingIndex != null || this.externalEditOpen);
9071
10185
  }
@@ -9154,8 +10268,12 @@ class Datagrid {
9154
10268
  this.expanded.add(i); // open the clicked row, or close all if it was open
9155
10269
  }
9156
10270
  else {
9157
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
9158
- 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
+ }
9159
10277
  }
9160
10278
  }
9161
10279
  isExpanded(i) {
@@ -9208,7 +10326,9 @@ class Datagrid {
9208
10326
  this.cdr.markForCheck();
9209
10327
  }
9210
10328
  asBool(v) {
9211
- 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;
9212
10332
  }
9213
10333
  triggerExport(kind) {
9214
10334
  this.export(kind);
@@ -9220,8 +10340,7 @@ class Datagrid {
9220
10340
  isRowSticky(row, pagedIndex) {
9221
10341
  if (!this.stickyRows)
9222
10342
  return false;
9223
- const di = this.dataIndexOf(row);
9224
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10343
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9225
10344
  return this.stickyRowIds.has(id);
9226
10345
  }
9227
10346
  toggleStickyRow(pagedIndex) {
@@ -9230,8 +10349,7 @@ class Datagrid {
9230
10349
  const row = this.paged[pagedIndex];
9231
10350
  if (!row)
9232
10351
  return;
9233
- const di = this.dataIndexOf(row);
9234
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10352
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9235
10353
  if (this.stickyRowIds.has(id))
9236
10354
  this.stickyRowIds.delete(id);
9237
10355
  else
@@ -9284,8 +10402,7 @@ class Datagrid {
9284
10402
  return this.selectionDisabledFn(row, di >= 0 ? di : pagedIndex);
9285
10403
  }
9286
10404
  isRowSelected(row, pagedIndex) {
9287
- const di = this.dataIndexOf(this.paged[pagedIndex]);
9288
- const id = this.getRowId(di >= 0 ? di : pagedIndex, row);
10405
+ const { id } = this.resolveRowMeta(row, pagedIndex);
9289
10406
  return this.selectedRowIds.has(id);
9290
10407
  }
9291
10408
  toggleSelection(pagedIndex, event) {
@@ -9294,13 +10411,12 @@ class Datagrid {
9294
10411
  const row = this.paged[pagedIndex];
9295
10412
  if (!row || this.isSelectionDisabled(row, pagedIndex))
9296
10413
  return;
9297
- const di = this.dataIndexOf(row);
9298
- 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;
9299
10416
  const currentlySelected = this.selectedRowIds.has(id);
9300
10417
  const isMulti = this.selectionMode === 'multiple';
9301
10418
  const desktop = this.selectionKeyMode === 'desktop';
9302
- const shift = desktop && !!(event && 'shiftKey' in event && event.shiftKey);
9303
- const meta = desktop && !!(event && (('metaKey' in event && event.metaKey) || ('ctrlKey' in event && event.ctrlKey)));
10419
+ const { shift, meta } = this.readModifierKeys(event);
9304
10420
  const fromCheckbox = !!(event?.target instanceof HTMLInputElement && event.target.type === 'checkbox');
9305
10421
  if (!isMulti) {
9306
10422
  this.selectedRowIds.clear();
@@ -9318,7 +10434,7 @@ class Datagrid {
9318
10434
  const r = this.paged[i];
9319
10435
  if (!r || this.isSelectionDisabled(r, i))
9320
10436
  continue;
9321
- const rid = this.getRowId(this.dataIndexOf(r), r);
10437
+ const { id: rid } = this.resolveRowMeta(r, i);
9322
10438
  this.selectedRowIds.add(rid);
9323
10439
  }
9324
10440
  this.emitSelection(row, di, true);
@@ -9341,7 +10457,7 @@ class Datagrid {
9341
10457
  }
9342
10458
  emitSelection(row, dataIndex, selected) {
9343
10459
  this.selectionChange.emit({
9344
- selected: this.data.filter((r, idx) => this.selectedRowIds.has(this.getRowId(idx, r))),
10460
+ selected: this.selectedDataRows(),
9345
10461
  lastAction: { row, index: dataIndex, selected }
9346
10462
  });
9347
10463
  }
@@ -9352,30 +10468,55 @@ class Datagrid {
9352
10468
  const allSelected = allSelectable.every((r, i) => this.isRowSelected(r, i));
9353
10469
  if (allSelected) {
9354
10470
  allSelectable.forEach((r, i) => {
9355
- const rid = this.getRowId(this.dataIndexOf(r), r);
10471
+ const { id: rid } = this.resolveRowMeta(r, i);
9356
10472
  this.selectedRowIds.delete(rid);
9357
10473
  });
9358
10474
  }
9359
10475
  else {
9360
10476
  allSelectable.forEach((r, i) => {
9361
- const rid = this.getRowId(this.dataIndexOf(r), r);
10477
+ const { id: rid } = this.resolveRowMeta(r, i);
9362
10478
  this.selectedRowIds.add(rid);
9363
10479
  });
9364
10480
  }
9365
10481
  this.selectionChange.emit({
9366
- selected: this.data.filter((r, idx) => this.selectedRowIds.has(this.getRowId(idx, r))),
10482
+ selected: this.selectedDataRows(),
9367
10483
  lastAction: null
9368
10484
  });
9369
10485
  this.cdr.markForCheck();
9370
10486
  }
9371
10487
  isPageAllSelected() {
9372
- const selectable = this.paged.filter((r, i) => !this.isSelectionDisabled(r, i));
9373
- 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;
9374
10500
  }
9375
10501
  isPageIndeterminate() {
9376
- const selectable = this.paged.filter((r, i) => !this.isSelectionDisabled(r, i));
9377
- const selectedCount = selectable.filter((r, i) => this.isRowSelected(r, i)).length;
9378
- 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;
9379
10520
  }
9380
10521
  selectAllLabel() {
9381
10522
  const labels = this.selectionA11yLabels || {};
@@ -9403,14 +10544,14 @@ class Datagrid {
9403
10544
  return;
9404
10545
  this.toggleSelection(pagedIndex, ev);
9405
10546
  }
9406
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
9407
- 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: [
10547
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: Datagrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
10548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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: [
9408
10549
  { provide: PdfExportAdapter, useClass: JsPdfAdapter },
9409
10550
  { provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
9410
10551
  { provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
9411
- ], 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 });
9412
10553
  }
9413
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: Datagrid, decorators: [{
10554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: Datagrid, decorators: [{
9414
10555
  type: Component,
9415
10556
  args: [{ selector: 'ngb-datagrid', encapsulation: ViewEncapsulation.None, imports: [
9416
10557
  CommonModule,
@@ -9435,7 +10576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9435
10576
  { provide: PdfExportAdapter, useClass: JsPdfAdapter },
9436
10577
  { provide: ExcelExportAdapter, useClass: BrowserExcelExportAdapter },
9437
10578
  { provide: NGB_DATAGRID_HOST, useExisting: forwardRef(() => Datagrid) },
9438
- ], 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"] }]
9439
10580
  }], propDecorators: { columns: [{
9440
10581
  type: Input
9441
10582
  }], data: [{
@@ -9464,6 +10605,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9464
10605
  type: Input
9465
10606
  }], dataOperations: [{
9466
10607
  type: Input
10608
+ }], groupable: [{
10609
+ type: Input
10610
+ }], group: [{
10611
+ type: Input
10612
+ }], groupedData: [{
10613
+ type: Input
9467
10614
  }], state: [{
9468
10615
  type: Input
9469
10616
  }], multiCheckboxFilterOptions: [{
@@ -9607,6 +10754,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9607
10754
  type: Output
9608
10755
  }], rowDelete: [{
9609
10756
  type: Output
10757
+ }], groupChange: [{
10758
+ type: Output
9610
10759
  }], sortChange: [{
9611
10760
  type: Output
9612
10761
  }], filterChange: [{
@@ -9629,8 +10778,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9629
10778
  }], pagerTpl: [{
9630
10779
  type: ContentChild,
9631
10780
  args: [NgbPagerTemplate]
10781
+ }], groupHeaderTpl: [{
10782
+ type: ContentChild,
10783
+ args: [NgbDataGridGroupHeaderTemplateDirective]
9632
10784
  }], pageSize: [{
9633
10785
  type: Input
10786
+ }], onWindowResize: [{
10787
+ type: HostListener,
10788
+ args: ['window:resize']
9634
10789
  }], onDocumentMouseMove: [{
9635
10790
  type: HostListener,
9636
10791
  args: ['document:mousemove', ['$event']]
@@ -9652,6 +10807,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
9652
10807
  }], globalTplQ: [{
9653
10808
  type: ContentChildren,
9654
10809
  args: [NgbGlobalFilterTemplate]
10810
+ }], groupHeaderColumnTplQ: [{
10811
+ type: ContentChildren,
10812
+ args: [NgbDataGridGroupHeaderColumnTemplateDirective]
10813
+ }], groupFooterTplQ: [{
10814
+ type: ContentChildren,
10815
+ args: [NgbDataGridGroupFooterTemplateDirective]
9655
10816
  }], gridColumnQ: [{
9656
10817
  type: ContentChildren,
9657
10818
  args: [NgbGridColumnDirective]
@@ -9686,10 +10847,10 @@ class NgbDatagridLayoutToolbarCoordinator {
9686
10847
  close();
9687
10848
  }
9688
10849
  }
9689
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
9690
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator });
10850
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10851
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator });
9691
10852
  }
9692
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator, decorators: [{
10853
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarCoordinator, decorators: [{
9693
10854
  type: Injectable
9694
10855
  }] });
9695
10856
 
@@ -9793,8 +10954,8 @@ class NgbDatagridColumnChooserToolComponent {
9793
10954
  return;
9794
10955
  this.closePanel();
9795
10956
  }
9796
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridColumnChooserToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9797
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridColumnChooserToolComponent, isStandalone: true, selector: "ngb-datagrid-column-chooser-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, usesOnChanges: true, ngImport: i0, template: `
10957
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridColumnChooserToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10958
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridColumnChooserToolComponent, isStandalone: true, selector: "ngb-datagrid-column-chooser-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, usesOnChanges: true, ngImport: i0, template: `
9798
10959
  @if (chooserColumns.length) {
9799
10960
  <div class="ngb-layout-tool">
9800
10961
  <button
@@ -9853,7 +11014,7 @@ class NgbDatagridColumnChooserToolComponent {
9853
11014
  }
9854
11015
  `, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.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: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], encapsulation: i0.ViewEncapsulation.None });
9855
11016
  }
9856
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridColumnChooserToolComponent, decorators: [{
11017
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridColumnChooserToolComponent, decorators: [{
9857
11018
  type: Component,
9858
11019
  args: [{ selector: 'ngb-datagrid-column-chooser-tool', standalone: true, imports: [CommonModule, FormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective], template: `
9859
11020
  @if (chooserColumns.length) {
@@ -9998,8 +11159,8 @@ class NgbDatagridFilterToolComponent {
9998
11159
  return;
9999
11160
  this.closePanel();
10000
11161
  }
10001
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10002
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridFilterToolComponent, isStandalone: true, selector: "ngb-datagrid-filter-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: `
11162
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFilterToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11163
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridFilterToolComponent, isStandalone: true, selector: "ngb-datagrid-filter-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: `
10003
11164
  @if (filterableColumns.length) {
10004
11165
  <div class="ngb-layout-tool">
10005
11166
  <button
@@ -10145,7 +11306,7 @@ class NgbDatagridFilterToolComponent {
10145
11306
  }
10146
11307
  `, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }], encapsulation: i0.ViewEncapsulation.None });
10147
11308
  }
10148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridFilterToolComponent, decorators: [{
11309
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridFilterToolComponent, decorators: [{
10149
11310
  type: Component,
10150
11311
  args: [{ selector: 'ngb-datagrid-filter-tool', standalone: true, imports: [CommonModule, FormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective], template: `
10151
11312
  @if (filterableColumns.length) {
@@ -10358,8 +11519,8 @@ class NgbDatagridSortToolComponent {
10358
11519
  return;
10359
11520
  this.closePanel();
10360
11521
  }
10361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridSortToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10362
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridSortToolComponent, isStandalone: true, selector: "ngb-datagrid-sort-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: `
11522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridSortToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11523
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridSortToolComponent, isStandalone: true, selector: "ngb-datagrid-sort-tool", inputs: { grid: "grid", label: "label" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)" } }, ngImport: i0, template: `
10363
11524
  @if (sortableColumns.length) {
10364
11525
  <div class="ngb-layout-tool">
10365
11526
  <button
@@ -10404,7 +11565,7 @@ class NgbDatagridSortToolComponent {
10404
11565
  }
10405
11566
  `, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
10406
11567
  }
10407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridSortToolComponent, decorators: [{
11568
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridSortToolComponent, decorators: [{
10408
11569
  type: Component,
10409
11570
  args: [{ selector: 'ngb-datagrid-sort-tool', standalone: true, imports: [CommonModule], template: `
10410
11571
  @if (sortableColumns.length) {
@@ -10489,14 +11650,14 @@ class NgbDatagridLayoutToolbarComponent {
10489
11650
  ];
10490
11651
  tools.forEach((tool) => tool.bindHostGrid(this.grid));
10491
11652
  }
10492
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10493
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridLayoutToolbarComponent, isStandalone: true, selector: "ngb-datagrid-layout-toolbar", inputs: { grid: "grid", ariaLabel: "ariaLabel" }, providers: [NgbDatagridLayoutToolbarCoordinator], queries: [{ propertyName: "filterTools", predicate: NgbDatagridFilterToolComponent }, { propertyName: "sortTools", predicate: NgbDatagridSortToolComponent }, { propertyName: "columnTools", predicate: NgbDatagridColumnChooserToolComponent }], usesOnChanges: true, ngImport: i0, template: `
11653
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11654
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridLayoutToolbarComponent, isStandalone: true, selector: "ngb-datagrid-layout-toolbar", inputs: { grid: "grid", ariaLabel: "ariaLabel" }, providers: [NgbDatagridLayoutToolbarCoordinator], queries: [{ propertyName: "filterTools", predicate: NgbDatagridFilterToolComponent }, { propertyName: "sortTools", predicate: NgbDatagridSortToolComponent }, { propertyName: "columnTools", predicate: NgbDatagridColumnChooserToolComponent }], usesOnChanges: true, ngImport: i0, template: `
10494
11655
  <div class="ngb-layout-toolbar" role="toolbar" [attr.aria-label]="ariaLabel">
10495
11656
  <ng-content></ng-content>
10496
11657
  </div>
10497
11658
  `, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None });
10498
11659
  }
10499
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarComponent, decorators: [{
11660
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarComponent, decorators: [{
10500
11661
  type: Component,
10501
11662
  args: [{ selector: 'ngb-datagrid-layout-toolbar', standalone: true, imports: [CommonModule], providers: [NgbDatagridLayoutToolbarCoordinator], template: `
10502
11663
  <div class="ngb-layout-toolbar" role="toolbar" [attr.aria-label]="ariaLabel">
@@ -10519,10 +11680,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
10519
11680
  args: [NgbDatagridColumnChooserToolComponent]
10520
11681
  }] } });
10521
11682
  class NgbDatagridLayoutToolbarSpacerComponent {
10522
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarSpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10523
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbDatagridLayoutToolbarSpacerComponent, isStandalone: true, selector: "ngb-datagrid-layout-toolbar-spacer", ngImport: i0, template: `<div class="ngb-layout-toolbar__spacer" aria-hidden="true"></div>`, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], encapsulation: i0.ViewEncapsulation.None });
11683
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarSpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11684
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbDatagridLayoutToolbarSpacerComponent, isStandalone: true, selector: "ngb-datagrid-layout-toolbar-spacer", ngImport: i0, template: `<div class="ngb-layout-toolbar__spacer" aria-hidden="true"></div>`, isInline: true, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"], encapsulation: i0.ViewEncapsulation.None });
10524
11685
  }
10525
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridLayoutToolbarSpacerComponent, decorators: [{
11686
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridLayoutToolbarSpacerComponent, decorators: [{
10526
11687
  type: Component,
10527
11688
  args: [{ selector: 'ngb-datagrid-layout-toolbar-spacer', standalone: true, template: `<div class="ngb-layout-toolbar__spacer" aria-hidden="true"></div>`, encapsulation: ViewEncapsulation.None, styles: [".ngb-layout-toolbar{display:flex;align-items:center;gap:.5rem;padding:.65rem .85rem;background:var(--dg-surface)}.ngb-layout-toolbar__spacer{flex:1 1 auto}.ngb-layout-toolbar>ngb-datagrid-column-chooser-tool{margin-left:auto}.ngb-layout-tool{position:relative}.ngb-layout-tool__trigger{display:inline-flex;align-items:center;gap:.45rem;min-height:2.125rem;padding:.35rem .85rem;border:1px solid var(--dg-border);border-radius:var(--dg-radius-md, .375rem);background:var(--dg-surface);color:var(--dg-text);font-size:.875rem;font-weight:500;line-height:1.2}.ngb-layout-tool__trigger:hover,.ngb-layout-tool__trigger--open{border-color:var(--dg-primary);color:var(--dg-primary)}.ngb-layout-tool__panel{position:absolute;top:calc(100% + .35rem);left:0;z-index:120;min-width:18rem;max-width:min(24rem,100vw - 2rem);max-height:min(28rem,100vh - 8rem);overflow:auto;border:1px solid var(--dg-border);border-radius:var(--dg-radius-lg, .5rem);background:var(--dg-surface);box-shadow:var(--dg-shadow-md)}.ngb-layout-tool__panel--wide{min-width:22rem}.ngb-layout-tool__panel--end{left:auto;right:0}.ngb-filter-accordion__section+.ngb-filter-accordion__section{border-top:1px solid var(--dg-border)}.ngb-filter-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.75rem .9rem;border:0;background:transparent;font-size:.875rem;font-weight:600;text-align:left}.ngb-filter-accordion__body{padding:0 .9rem .9rem}.ngb-filter-accordion__stack{display:grid;gap:.5rem}.ngb-filter-accordion__join{margin:.35rem 0 0;font-size:.75rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted)}.ngb-filter-accordion__condition-actions{margin-top:.15rem}.ngb-filter-accordion__add-condition{margin-top:.35rem}.ngb-filter-accordion__actions{display:flex;gap:.5rem;margin-top:.65rem}.ngb-layout-tool__footer{padding:.75rem .9rem;border-top:1px solid var(--dg-border)}.ngb-sort-list__item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:.65rem .9rem;border:0;border-bottom:1px solid var(--dg-border);background:transparent;font-size:.875rem;text-align:left}.ngb-sort-list__item:last-child{border-bottom:0}.ngb-sort-list__item--active{color:var(--dg-primary);font-weight:600}.ngb-column-chooser__search{padding:.75rem .9rem .35rem}.ngb-column-chooser__list{padding:0 .9rem}.ngb-column-chooser__option{display:flex;align-items:center;gap:.55rem;padding:.45rem 0;font-size:.875rem}.ngb-column-chooser__summary{padding:.5rem .9rem;font-size:.8125rem;color:var(--dg-text-muted)}.ngb-column-chooser__actions{display:flex;gap:.5rem;padding:.75rem .9rem;border-top:1px solid var(--dg-border)}\n"] }]
10528
11689
  }] });
@@ -10848,8 +12009,8 @@ class NgbDataChartComponent {
10848
12009
  this.chart?.destroy();
10849
12010
  this.chart = undefined;
10850
12011
  }
10851
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10852
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDataChartComponent, isStandalone: true, selector: "ngb-data-chart", inputs: { config: "config", ariaLabel: "ariaLabel", emptyState: "emptyState" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
12012
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDataChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12013
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDataChartComponent, isStandalone: true, selector: "ngb-data-chart", inputs: { config: "config", ariaLabel: "ariaLabel", emptyState: "emptyState" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
10853
12014
  <div class="ngb-data-chart" [style.height.px]="chartHeight">
10854
12015
  @if (hasData()) {
10855
12016
  <canvas #canvas [attr.aria-label]="ariaLabel" role="img"></canvas>
@@ -10859,7 +12020,7 @@ class NgbDataChartComponent {
10859
12020
  </div>
10860
12021
  `, isInline: true, styles: [":host{display:block}.ngb-data-chart{position:relative;width:100%;height:320px;overflow:hidden}.ngb-data-chart canvas{display:block;width:100%!important;height:100%!important}.ngb-data-chart__empty{min-height:inherit;display:grid;place-items:center;color:#6b7280;font-size:.95rem;border:1px dashed #d7deea;border-radius:.75rem;background:#f8fafc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10861
12022
  }
10862
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataChartComponent, decorators: [{
12023
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDataChartComponent, decorators: [{
10863
12024
  type: Component,
10864
12025
  args: [{ selector: 'ngb-data-chart', standalone: true, imports: [CommonModule], template: `
10865
12026
  <div class="ngb-data-chart" [style.height.px]="chartHeight">
@@ -10920,8 +12081,8 @@ class NgbDataSparklineComponent {
10920
12081
  return this.negativeColor;
10921
12082
  return this.neutralColor;
10922
12083
  }
10923
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataSparklineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10924
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDataSparklineComponent, isStandalone: true, selector: "ngb-data-sparkline", inputs: { values: "values", width: "width", height: "height", strokeWidth: "strokeWidth", positiveColor: "positiveColor", negativeColor: "negativeColor", neutralColor: "neutralColor", color: "color", showEndDot: "showEndDot", endDotRadius: "endDotRadius", ariaLabel: "ariaLabel" }, usesOnChanges: true, ngImport: i0, template: `
12084
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDataSparklineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12085
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDataSparklineComponent, isStandalone: true, selector: "ngb-data-sparkline", inputs: { values: "values", width: "width", height: "height", strokeWidth: "strokeWidth", positiveColor: "positiveColor", negativeColor: "negativeColor", neutralColor: "neutralColor", color: "color", showEndDot: "showEndDot", endDotRadius: "endDotRadius", ariaLabel: "ariaLabel" }, usesOnChanges: true, ngImport: i0, template: `
10925
12086
  <svg
10926
12087
  class="ngb-data-sparkline"
10927
12088
  [attr.viewBox]="'0 0 ' + width + ' ' + height"
@@ -10942,7 +12103,7 @@ class NgbDataSparklineComponent {
10942
12103
  </svg>
10943
12104
  `, isInline: true, styles: [":host{display:inline-flex;align-items:center}.ngb-data-sparkline{display:block;overflow:visible}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10944
12105
  }
10945
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDataSparklineComponent, decorators: [{
12106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDataSparklineComponent, decorators: [{
10946
12107
  type: Component,
10947
12108
  args: [{ selector: 'ngb-data-sparkline', standalone: true, imports: [CommonModule], template: `
10948
12109
  <svg
@@ -11289,8 +12450,8 @@ class NgbGridChartComponent {
11289
12450
  })));
11290
12451
  return cols;
11291
12452
  }
11292
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11293
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbGridChartComponent, isStandalone: true, selector: "ngb-grid-chart", inputs: { config: "config", ariaLabel: "ariaLabel" }, outputs: { selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "grid", first: true, predicate: Datagrid, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
12453
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12454
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbGridChartComponent, isStandalone: true, selector: "ngb-grid-chart", inputs: { config: "config", ariaLabel: "ariaLabel" }, outputs: { selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "grid", first: true, predicate: Datagrid, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
11294
12455
  <div class="ngb-grid-chart" [class.ngb-grid-chart--full]="config?.mode === 'full-grid'">
11295
12456
  @if (config?.mode === 'sparklines') {
11296
12457
  <ngb-datagrid
@@ -11380,9 +12541,9 @@ class NgbGridChartComponent {
11380
12541
  </div>
11381
12542
  }
11382
12543
  </div>
11383
- `, 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 });
11384
12545
  }
11385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbGridChartComponent, decorators: [{
12546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbGridChartComponent, decorators: [{
11386
12547
  type: Component,
11387
12548
  args: [{ selector: 'ngb-grid-chart', standalone: true, imports: [CommonModule, Datagrid, NgbCellTemplate, NgbDataChartComponent, NgbDataSparklineComponent], template: `
11388
12549
  <div class="ngb-grid-chart" [class.ngb-grid-chart--full]="config?.mode === 'full-grid'">
@@ -11654,8 +12815,8 @@ class NgbAdvancedSearchComponent {
11654
12815
  this.inputTypeCache.set(field.field, field.type === 'number' ? 'number' : field.type === 'date' ? 'date' : 'text');
11655
12816
  }
11656
12817
  }
11657
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbAdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11658
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbAdvancedSearchComponent, isStandalone: true, selector: "ngb-advanced-search", inputs: { fields: "fields", operators: "operators", rules: "rules", logic: "logic", minRules: "minRules", matchLabel: "matchLabel", rulesLabel: "rulesLabel", whenLabel: "whenLabel", addRuleLabel: "addRuleLabel", applyLabel: "applyLabel", removeRuleLabel: "removeRuleLabel", removeRuleAriaLabel: "removeRuleAriaLabel", fieldAriaLabel: "fieldAriaLabel", operatorAriaLabel: "operatorAriaLabel", valueAriaLabel: "valueAriaLabel", valuePlaceholder: "valuePlaceholder" }, outputs: { rulesChange: "rulesChange", logicChange: "logicChange", filterChange: "filterChange" }, ngImport: i0, template: `
12818
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbAdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12819
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbAdvancedSearchComponent, isStandalone: true, selector: "ngb-advanced-search", inputs: { fields: "fields", operators: "operators", rules: "rules", logic: "logic", minRules: "minRules", matchLabel: "matchLabel", rulesLabel: "rulesLabel", whenLabel: "whenLabel", addRuleLabel: "addRuleLabel", applyLabel: "applyLabel", removeRuleLabel: "removeRuleLabel", removeRuleAriaLabel: "removeRuleAriaLabel", fieldAriaLabel: "fieldAriaLabel", operatorAriaLabel: "operatorAriaLabel", valueAriaLabel: "valueAriaLabel", valuePlaceholder: "valuePlaceholder" }, outputs: { rulesChange: "rulesChange", logicChange: "logicChange", filterChange: "filterChange" }, ngImport: i0, template: `
11659
12820
  <div class="ngb-advanced-search">
11660
12821
  <div class="ngb-advanced-search__logic">
11661
12822
  <span>{{ matchLabel }}</span>
@@ -11736,7 +12897,7 @@ class NgbAdvancedSearchComponent {
11736
12897
  </div>
11737
12898
  `, isInline: true, styles: [":host{display:block}.ngb-advanced-search{display:grid;gap:1rem;color:var(--dg-text, #1f2937)}.ngb-advanced-search__logic,.ngb-advanced-search__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.625rem}.ngb-advanced-search__logic{font-weight:700}.ngb-advanced-search__rules{display:grid;gap:.75rem}.ngb-advanced-search__rule{display:grid;grid-template-columns:auto minmax(9rem,1fr) minmax(10rem,1fr) minmax(10rem,1fr) auto;align-items:center;gap:.625rem}.ngb-advanced-search__join{min-width:3.5rem;font-size:.8125rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--dg-text-muted, #64748b)}.ngb-advanced-search .grid-filter-control{min-height:var(--dg-control-height, 2.5rem);border:1px solid var(--dg-border, #d5dbe5);border-radius:var(--dg-radius-md, .5rem);background:var(--dg-surface, #fff);color:var(--dg-text, #1f2937);padding:0 .75rem}.ngb-advanced-search .datagrid-toolbar__button,.ngb-advanced-search .grid-row-action{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;min-height:var(--dg-control-height, 2.5rem);padding:0 .9rem;border:1px solid var(--dg-border, #d5dbe5);border-radius:var(--dg-radius-md, .5rem);background:var(--dg-surface, #fff);color:var(--dg-text, #1f2937);font:inherit;font-weight:700}.ngb-advanced-search .datagrid-toolbar__button--primary{border-color:var(--dg-accent, #2563eb);background:var(--dg-accent, #2563eb);color:#fff}.ngb-advanced-search .grid-row-action--success{border-color:#16a34a;background:#16a34a;color:#fff}.ngb-advanced-search .grid-row-action--danger{border-color:#dc2626;background:#dc2626;color:#fff}.ngb-advanced-search button:disabled{cursor:not-allowed;opacity:.55}@media(max-width:768px){.ngb-advanced-search__rule{grid-template-columns:1fr}.ngb-advanced-search__join{min-width:0}}\n"], 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.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: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }] });
11738
12899
  }
11739
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbAdvancedSearchComponent, decorators: [{
12900
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbAdvancedSearchComponent, decorators: [{
11740
12901
  type: Component,
11741
12902
  args: [{ selector: 'ngb-advanced-search', standalone: true, imports: [CommonModule, FormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective], template: `
11742
12903
  <div class="ngb-advanced-search">
@@ -11895,8 +13056,8 @@ class NgbSearchHighlightComponent {
11895
13056
  selectedFields: [...this.selectedFields],
11896
13057
  });
11897
13058
  }
11898
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSearchHighlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11899
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbSearchHighlightComponent, isStandalone: true, selector: "ngb-search-highlight", inputs: { fields: "fields", selectedFields: "selectedFields", term: "term", placeholder: "placeholder", searchAriaLabel: "searchAriaLabel", fieldsLabel: "fieldsLabel", fieldsAriaLabel: "fieldsAriaLabel", searchIcon: "searchIcon", allowEmptySelection: "allowEmptySelection" }, outputs: { termChange: "termChange", selectedFieldsChange: "selectedFieldsChange", selectionChange: "selectionChange" }, ngImport: i0, template: `
13059
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSearchHighlightComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13060
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbSearchHighlightComponent, isStandalone: true, selector: "ngb-search-highlight", inputs: { fields: "fields", selectedFields: "selectedFields", term: "term", placeholder: "placeholder", searchAriaLabel: "searchAriaLabel", fieldsLabel: "fieldsLabel", fieldsAriaLabel: "fieldsAriaLabel", searchIcon: "searchIcon", allowEmptySelection: "allowEmptySelection" }, outputs: { termChange: "termChange", selectedFieldsChange: "selectedFieldsChange", selectionChange: "selectionChange" }, ngImport: i0, template: `
11900
13061
  <div class="ngb-search-highlight">
11901
13062
  <label class="ngb-search-highlight__search">
11902
13063
  <span class="ngb-search-highlight__icon" aria-hidden="true">{{ searchIcon }}</span>
@@ -11932,7 +13093,7 @@ class NgbSearchHighlightComponent {
11932
13093
  </div>
11933
13094
  `, isInline: true, styles: [":host{display:block}.ngb-search-highlight{display:grid;gap:1rem;color:var(--dg-text, #1f2937)}.ngb-search-highlight__search{display:flex;align-items:center;gap:.625rem;min-width:min(100%,18rem)}.ngb-search-highlight__search .grid-filter-control{width:100%;min-height:var(--dg-control-height, 2.5rem);border:1px solid var(--dg-border, #d5dbe5);border-radius:var(--dg-radius-md, .5rem);background:var(--dg-surface, #fff);color:var(--dg-text, #1f2937);padding:0 .75rem}.ngb-search-highlight__icon{color:var(--dg-text-muted, #64748b);display:inline-flex;align-items:center;justify-content:center;min-width:2rem;font-size:1.9rem;line-height:1;font-weight:700}.ngb-search-highlight__fields{display:grid;gap:.5rem}.ngb-search-highlight__label{font-size:.875rem;font-weight:700;color:var(--dg-text, #1f2937)}.ngb-search-highlight__chips{display:flex;flex-wrap:wrap;gap:.5rem}.ngb-search-highlight .datagrid-toolbar__button{display:inline-flex;align-items:center;justify-content:center;min-height:var(--dg-control-height, 2.5rem);padding:0 .9rem;border:1px solid var(--dg-border, #d5dbe5);border-radius:var(--dg-radius-md, .5rem);background:var(--dg-surface, #fff);color:var(--dg-text, #1f2937);font:inherit;font-weight:700}.ngb-search-highlight .datagrid-toolbar__button--primary{border-color:var(--dg-accent, #2563eb);background:var(--dg-accent, #2563eb);color:#fff}.ngb-search-highlight button:disabled{cursor:not-allowed;opacity:.55}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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.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: NgbDatagridButtonDirective, selector: "button[ngbDatagridButton], a[ngbDatagridButton]", inputs: ["ngbDatagridButton"] }, { kind: "directive", type: NgbDatagridControlDirective, selector: "input[ngbDatagridControl], select[ngbDatagridControl], textarea[ngbDatagridControl]", inputs: ["ngbDatagridControlMode"] }] });
11934
13095
  }
11935
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSearchHighlightComponent, decorators: [{
13096
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSearchHighlightComponent, decorators: [{
11936
13097
  type: Component,
11937
13098
  args: [{ selector: 'ngb-search-highlight', standalone: true, imports: [CommonModule, FormsModule, NgbDatagridButtonDirective, NgbDatagridControlDirective], template: `
11938
13099
  <div class="ngb-search-highlight">
@@ -12061,8 +13222,8 @@ class NgbDatagridThemePickerComponent {
12061
13222
  .map((label) => ({ label, items: themes.filter((theme) => theme.group === label) }))
12062
13223
  .filter((group) => group.items.length > 0);
12063
13224
  }
12064
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridThemePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12065
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbDatagridThemePickerComponent, isStandalone: true, selector: "ngb-datagrid-theme-picker", inputs: { label: "label", value: "value", themes: "themes" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)", "keydown.escape": "closeOnEscape()" } }, ngImport: i0, template: `
13225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridThemePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13226
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbDatagridThemePickerComponent, isStandalone: true, selector: "ngb-datagrid-theme-picker", inputs: { label: "label", value: "value", themes: "themes" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "document:click": "closeOnOutsideClick($event)", "keydown.escape": "closeOnEscape()" } }, ngImport: i0, template: `
12066
13227
  <div class="ngb-datagrid-theme-picker">
12067
13228
  @if (label) {
12068
13229
  <span class="ngb-datagrid-theme-picker__label">{{ label }}</span>
@@ -12122,7 +13283,7 @@ class NgbDatagridThemePickerComponent {
12122
13283
  </div>
12123
13284
  `, isInline: true, styles: [":host{display:inline-block;color:#344054;font:inherit}.ngb-datagrid-theme-picker{display:inline-flex;align-items:center;gap:.6rem;position:relative}.ngb-datagrid-theme-picker__label{color:#667085;font-size:.86rem;line-height:1.4}.ngb-datagrid-theme-picker__control{position:relative;min-width:12.5rem}.ngb-datagrid-theme-picker__trigger,.ngb-datagrid-theme-picker__option{display:flex;align-items:center;width:100%;border:1px solid #d0d5dd;background:#fff;color:#101828;font:inherit;text-align:left;cursor:pointer}.ngb-datagrid-theme-picker__trigger{min-height:2.25rem;gap:.55rem;padding:.35rem .65rem;border-radius:.5rem;box-shadow:0 1px 2px #1018280d}.ngb-datagrid-theme-picker__trigger:focus-visible,.ngb-datagrid-theme-picker__trigger--open{outline:none;border-color:#315efb;box-shadow:0 0 0 .2rem #315efb24}.ngb-datagrid-theme-picker__selected{flex:1 1 auto;min-width:0;font-weight:600}.ngb-datagrid-theme-picker__chevron{width:.75rem;height:.75rem;border-right:2px solid #315efb;border-bottom:2px solid #315efb;transform:rotate(45deg);transition:transform .15s ease;margin-top:-.25rem}.ngb-datagrid-theme-picker__trigger--open .ngb-datagrid-theme-picker__chevron{transform:rotate(225deg);margin-top:.25rem}.ngb-datagrid-theme-picker__menu{position:absolute;z-index:1100;top:calc(100% + .25rem);right:0;width:min(19rem,90vw);max-height:24rem;overflow:auto;padding:.65rem;border:1px solid #d7deea;border-radius:.5rem;background:#fff;box-shadow:0 1rem 2.25rem #1018282e}.ngb-datagrid-theme-picker__group{padding:.55rem .65rem .45rem;color:#344054;font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border-top:1px solid #e4e7ec}.ngb-datagrid-theme-picker__group:first-child{border-top:0;padding-top:.35rem}.ngb-datagrid-theme-picker__option{gap:.65rem;min-height:2.55rem;padding:.45rem .65rem;border:0;border-radius:.45rem}.ngb-datagrid-theme-picker__option:hover,.ngb-datagrid-theme-picker__option--active{background:#f2f4f7}.ngb-datagrid-theme-picker__option-label{flex:1 1 auto;font-weight:600;color:#344054}.ngb-datagrid-theme-picker__swatches{display:inline-flex;align-items:center;min-width:3.2rem}.ngb-datagrid-theme-picker__swatch{width:1.25rem;height:1.25rem;border:2px solid #fff;border-radius:50%;box-shadow:0 0 0 1px #10182814}.ngb-datagrid-theme-picker__swatch+.ngb-datagrid-theme-picker__swatch{margin-left:-.42rem}.ngb-datagrid-theme-picker__moon{width:.95rem;height:.95rem;border-radius:50%;box-shadow:-.28rem 0 #344054;transform:translate(.28rem)}@media(max-width:640px){.ngb-datagrid-theme-picker{align-items:stretch;flex-direction:column;gap:.45rem;width:100%}.ngb-datagrid-theme-picker__control{min-width:0;width:100%}.ngb-datagrid-theme-picker__menu{left:0;right:auto;width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
12124
13285
  }
12125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDatagridThemePickerComponent, decorators: [{
13286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDatagridThemePickerComponent, decorators: [{
12126
13287
  type: Component,
12127
13288
  args: [{ selector: 'ngb-datagrid-theme-picker', standalone: true, imports: [CommonModule], template: `
12128
13289
  <div class="ngb-datagrid-theme-picker">
@@ -12212,10 +13373,10 @@ class NgbDndHandleDirective {
12212
13373
  onDragEnd() {
12213
13374
  this.item?.onDragEnd();
12214
13375
  }
12215
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndHandleDirective, deps: [{ token: NgbDndItemDirective, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive });
12216
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbDndHandleDirective, isStandalone: true, selector: "[ngbDndHandle]", host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd()" }, properties: { "attr.draggable": "this.draggable", "class.ngb-dnd-handle": "this.hostClass" } }, ngImport: i0 });
13376
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndHandleDirective, deps: [{ token: NgbDndItemDirective, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Directive });
13377
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbDndHandleDirective, isStandalone: true, selector: "[ngbDndHandle]", host: { listeners: { "dragstart": "onDragStart($event)", "dragend": "onDragEnd()" }, properties: { "attr.draggable": "this.draggable", "class.ngb-dnd-handle": "this.hostClass" } }, ngImport: i0 });
12217
13378
  }
12218
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbDndHandleDirective, decorators: [{
13379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbDndHandleDirective, decorators: [{
12219
13380
  type: Directive,
12220
13381
  args: [{
12221
13382
  selector: '[ngbDndHandle]',
@@ -12255,12 +13416,12 @@ class NgbJsonPreviewComponent {
12255
13416
  return this.fallback;
12256
13417
  }
12257
13418
  }
12258
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbJsonPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12259
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbJsonPreviewComponent, isStandalone: true, selector: "ngb-json-preview", inputs: { value: "value", indent: "indent", fallback: "fallback", maxHeight: "maxHeight" }, ngImport: i0, template: `
13419
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbJsonPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13420
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbJsonPreviewComponent, isStandalone: true, selector: "ngb-json-preview", inputs: { value: "value", indent: "indent", fallback: "fallback", maxHeight: "maxHeight" }, ngImport: i0, template: `
12260
13421
  <pre class="ngb-json-preview" [style.max-height.px]="maxHeight"><code>{{ formattedJson }}</code></pre>
12261
13422
  `, isInline: true, styles: [":host{display:block}.ngb-json-preview{margin:0;overflow:auto;padding:.75rem 1rem;border:0;background:var(--bs-body-bg, #fff);color:var(--bs-body-color, #212529);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:.875rem;line-height:1.4;white-space:pre}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12262
13423
  }
12263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbJsonPreviewComponent, decorators: [{
13424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbJsonPreviewComponent, decorators: [{
12264
13425
  type: Component,
12265
13426
  args: [{ selector: 'ngb-json-preview', standalone: true, template: `
12266
13427
  <pre class="ngb-json-preview" [style.max-height.px]="maxHeight"><code>{{ formattedJson }}</code></pre>
@@ -12281,10 +13442,10 @@ class NgbStepLabelDirective {
12281
13442
  constructor(template) {
12282
13443
  this.template = template;
12283
13444
  }
12284
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbStepLabelDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
12285
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: NgbStepLabelDirective, isStandalone: true, selector: "[ngbStepLabel]", inputs: { for: ["ngbStepLabel", "for"] }, ngImport: i0 });
13445
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbStepLabelDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
13446
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NgbStepLabelDirective, isStandalone: true, selector: "[ngbStepLabel]", inputs: { for: ["ngbStepLabel", "for"] }, ngImport: i0 });
12286
13447
  }
12287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbStepLabelDirective, decorators: [{
13448
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbStepLabelDirective, decorators: [{
12288
13449
  type: Directive,
12289
13450
  args: [{
12290
13451
  selector: '[ngbStepLabel]',
@@ -12479,10 +13640,10 @@ class NgbStepperComponent {
12479
13640
  step: this.steps[nextIndex],
12480
13641
  });
12481
13642
  }
12482
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbStepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12483
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbStepperComponent, isStandalone: true, selector: "ngb-stepper", inputs: { steps: "steps", orientation: "orientation", labelPosition: "labelPosition", contentPosition: "contentPosition", allowRevisit: "allowRevisit", lazy: "lazy", theme: "theme", responsive: "responsive", disableAnimation: "disableAnimation", animationDuration: "animationDuration", nextLabel: "nextLabel", previousLabel: "previousLabel", resetLabel: "resetLabel", cancelLabel: "cancelLabel", optionalLabel: "optionalLabel", stateIcons: "stateIcons", selectedIndex: "selectedIndex" }, outputs: { selectedIndexChange: "selectedIndexChange", selectionChange: "selectionChange", nextClicked: "nextClicked", prevClicked: "prevClicked", resetClicked: "resetClicked", cancelClicked: "cancelClicked" }, queries: [{ propertyName: "stepLabelTplDir", first: true, predicate: NgbStepLabelDirective, descendants: true }, { propertyName: "customIconTpl", first: true, predicate: ["ngbStepperIcon"], descendants: true, read: TemplateRef }, { propertyName: "stepContentTpl", first: true, predicate: ["stepContent"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<div\n class=\"ngb-stepper\"\n [class.horizontal]=\"orientation === 'horizontal'\"\n [class.vertical]=\"orientation === 'vertical'\"\n [class.ngb-responsive]=\"responsive\"\n [class.bootstrap]=\"theme === 'bootstrap'\"\n [class.material]=\"theme === 'material'\"\n [class.tailwind]=\"theme === 'tailwind'\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation\"\n>\n <!-- HEADER / LABELS -->\n <div class=\"ngb-stepper-header\">\n <ol class=\"ngb-stepper-steps\" role=\"presentation\">\n @for (step of steps; track step; let i = $index) {\n <li\n class=\"ngb-stepper-step\"\n [class.active]=\"i === selectedIndex\"\n [class.done]=\"i < selectedIndex && !isStepInError(i)\"\n [class.error]=\"isStepInError(i)\"\n [class.disabled]=\"step.disabled\"\n role=\"tab\"\n [attr.id]=\"stepId(i)\"\n [attr.aria-controls]=\"contentId(i)\"\n [attr.aria-selected]=\"i === selectedIndex\"\n [attr.aria-disabled]=\"step.disabled || (!allowRevisit && i < visitedFrom && i !== selectedIndex)\"\n tabindex=\"{{ i === selectedIndex ? 0 : -1 }}\"\n (click)=\"onHeaderClick(i)\"\n (keydown.enter)=\"onHeaderKeydown($event, i)\"\n (keydown.space)=\"onHeaderKeydown($event, i)\"\n >\n <div\n class=\"ngb-stepper-indicator\"\n [ngClass]=\"indicatorClass(i)\"\n aria-hidden=\"true\"\n >\n @if (customIconTpl) {\n <ng-container\n [ngTemplateOutlet]=\"customIconTpl\"\n [ngTemplateOutletContext]=\"{ index: i, state: stepState(i) }\"\n ></ng-container>\n } @else {\n {{ defaultIconForState(stepState(i), i) }}\n }\n </div>\n\n <div\n class=\"ngb-stepper-label-container\"\n [ngClass]=\"labelPositionClass\"\n >\n @if (stepLabelTpl) {\n <div class=\"ngb-stepper-label\">\n <ng-container\n [ngTemplateOutlet]=\"stepLabelTpl\"\n [ngTemplateOutletContext]=\"{ index: i, step: step }\"\n ></ng-container>\n </div>\n } @else {\n <div class=\"ngb-stepper-label-text\">\n {{ step.label || ('Step ' + (i + 1)) }}\n </div>\n }\n @if (step.optional) {\n <div class=\"ngb-stepper-optional\">\n {{ optionalLabel }}\n </div>\n }\n </div>\n </li>\n }\n </ol>\n </div>\n\n <!-- CONTENT -->\n <div class=\"ngb-stepper-content\" [class.ngb-stepper-content-top]=\"contentPosition === 'top'\">\n @if (lazy) {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n } @else {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n\n <!-- ACTIONS -->\n <div class=\"ngb-stepper-buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onCancel()\"\n >\n {{ cancelLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onReset()\"\n >\n {{ resetLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"prev()\"\n [disabled]=\"selectedIndex <= 0 || !allowRevisit\"\n >\n {{ previousLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary\"\n (click)=\"next()\"\n [disabled]=\"selectedIndex >= steps.length - 1 || steps[selectedIndex]?.disabled\"\n >\n {{ nextLabel }}\n </button>\n </div>\n</div>\n", styles: [".ngb-stepper{display:flex;flex-direction:column}.ngb-stepper.horizontal .ngb-stepper-header{display:flex;overflow-x:auto}.ngb-stepper.vertical .ngb-stepper-header{display:block}.ngb-stepper-header{margin-bottom:1rem}.ngb-stepper-steps{list-style:none;padding:0;margin:0;display:flex;flex-wrap:nowrap}.ngb-stepper.vertical .ngb-stepper-steps{flex-direction:column}.ngb-stepper-step{position:relative;display:flex;align-items:center;cursor:pointer}.ngb-stepper.horizontal .ngb-stepper-step{padding:.5rem .75rem}.ngb-stepper.vertical .ngb-stepper-step{padding:.5rem 0}.ngb-stepper-step.disabled{cursor:default;opacity:.6}.ngb-stepper-indicator{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;margin-right:.5rem;flex-shrink:0}.ngb-stepper.bootstrap .ngb-stepper-indicator{border:1px solid var(--bs-border-color, #dee2e6);background-color:var(--bs-body-bg, #fff)}.ngb-stepper.bootstrap .ngb-stepper-step.active .ngb-stepper-indicator{background-color:var(--bs-primary, #0d6efd);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.done .ngb-stepper-indicator{background-color:var(--bs-success, #198754);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.error .ngb-stepper-indicator{background-color:var(--bs-danger, #dc3545);color:#fff}.ngb-stepper-label-container{display:flex;flex-direction:column}.ngb-stepper-label-top{flex-direction:column-reverse}.ngb-stepper-label-bottom{flex-direction:column}.ngb-stepper-label-left{flex-direction:row-reverse}.ngb-stepper-label-right{flex-direction:row}.ngb-stepper-content{position:relative}.ngb-stepper-content-top{order:-1}.ngb-stepper-buttons{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}.ngb-stepper-error{color:var(--bs-danger, #dc3545);font-size:.875rem;margin-top:.25rem}.ngb-stepper-optional{font-size:.75rem;opacity:.7}.ngb-stepper .fade-step{animation:ngb-stepper-fade var(--ngb-stepper-animation-duration, .15s) ease-in-out;animation-fill-mode:both}@keyframes ngb-stepper-fade{0%{opacity:0;transform:translateY(.35rem)}to{opacity:1;transform:translateY(0)}}\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13643
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbStepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13644
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbStepperComponent, isStandalone: true, selector: "ngb-stepper", inputs: { steps: "steps", orientation: "orientation", labelPosition: "labelPosition", contentPosition: "contentPosition", allowRevisit: "allowRevisit", lazy: "lazy", theme: "theme", responsive: "responsive", disableAnimation: "disableAnimation", animationDuration: "animationDuration", nextLabel: "nextLabel", previousLabel: "previousLabel", resetLabel: "resetLabel", cancelLabel: "cancelLabel", optionalLabel: "optionalLabel", stateIcons: "stateIcons", selectedIndex: "selectedIndex" }, outputs: { selectedIndexChange: "selectedIndexChange", selectionChange: "selectionChange", nextClicked: "nextClicked", prevClicked: "prevClicked", resetClicked: "resetClicked", cancelClicked: "cancelClicked" }, queries: [{ propertyName: "stepLabelTplDir", first: true, predicate: NgbStepLabelDirective, descendants: true }, { propertyName: "customIconTpl", first: true, predicate: ["ngbStepperIcon"], descendants: true, read: TemplateRef }, { propertyName: "stepContentTpl", first: true, predicate: ["stepContent"], descendants: true, read: TemplateRef }], ngImport: i0, template: "<div\n class=\"ngb-stepper\"\n [class.horizontal]=\"orientation === 'horizontal'\"\n [class.vertical]=\"orientation === 'vertical'\"\n [class.ngb-responsive]=\"responsive\"\n [class.bootstrap]=\"theme === 'bootstrap'\"\n [class.material]=\"theme === 'material'\"\n [class.tailwind]=\"theme === 'tailwind'\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation\"\n>\n <!-- HEADER / LABELS -->\n <div class=\"ngb-stepper-header\">\n <ol class=\"ngb-stepper-steps\" role=\"presentation\">\n @for (step of steps; track step; let i = $index) {\n <li\n class=\"ngb-stepper-step\"\n [class.active]=\"i === selectedIndex\"\n [class.done]=\"i < selectedIndex && !isStepInError(i)\"\n [class.error]=\"isStepInError(i)\"\n [class.disabled]=\"step.disabled\"\n role=\"tab\"\n [attr.id]=\"stepId(i)\"\n [attr.aria-controls]=\"contentId(i)\"\n [attr.aria-selected]=\"i === selectedIndex\"\n [attr.aria-disabled]=\"step.disabled || (!allowRevisit && i < visitedFrom && i !== selectedIndex)\"\n tabindex=\"{{ i === selectedIndex ? 0 : -1 }}\"\n (click)=\"onHeaderClick(i)\"\n (keydown.enter)=\"onHeaderKeydown($event, i)\"\n (keydown.space)=\"onHeaderKeydown($event, i)\"\n >\n <div\n class=\"ngb-stepper-indicator\"\n [ngClass]=\"indicatorClass(i)\"\n aria-hidden=\"true\"\n >\n @if (customIconTpl) {\n <ng-container\n [ngTemplateOutlet]=\"customIconTpl\"\n [ngTemplateOutletContext]=\"{ index: i, state: stepState(i) }\"\n ></ng-container>\n } @else {\n {{ defaultIconForState(stepState(i), i) }}\n }\n </div>\n\n <div\n class=\"ngb-stepper-label-container\"\n [ngClass]=\"labelPositionClass\"\n >\n @if (stepLabelTpl) {\n <div class=\"ngb-stepper-label\">\n <ng-container\n [ngTemplateOutlet]=\"stepLabelTpl\"\n [ngTemplateOutletContext]=\"{ index: i, step: step }\"\n ></ng-container>\n </div>\n } @else {\n <div class=\"ngb-stepper-label-text\">\n {{ step.label || ('Step ' + (i + 1)) }}\n </div>\n }\n @if (step.optional) {\n <div class=\"ngb-stepper-optional\">\n {{ optionalLabel }}\n </div>\n }\n </div>\n </li>\n }\n </ol>\n </div>\n\n <!-- CONTENT -->\n <div class=\"ngb-stepper-content\" [class.ngb-stepper-content-top]=\"contentPosition === 'top'\">\n @if (lazy) {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n } @else {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n\n <!-- ACTIONS -->\n <div class=\"ngb-stepper-buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onCancel()\"\n >\n {{ cancelLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onReset()\"\n >\n {{ resetLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"prev()\"\n [disabled]=\"selectedIndex <= 0 || !allowRevisit\"\n >\n {{ previousLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary\"\n (click)=\"next()\"\n [disabled]=\"selectedIndex >= steps.length - 1 || steps[selectedIndex]?.disabled\"\n >\n {{ nextLabel }}\n </button>\n </div>\n</div>\n", styles: [".ngb-stepper{display:flex;flex-direction:column}.ngb-stepper.horizontal .ngb-stepper-header{display:flex;overflow-x:auto}.ngb-stepper.vertical .ngb-stepper-header{display:block}.ngb-stepper-header{margin-bottom:1rem}.ngb-stepper-steps{list-style:none;padding:0;margin:0;display:flex;flex-wrap:nowrap}.ngb-stepper.vertical .ngb-stepper-steps{flex-direction:column}.ngb-stepper-step{position:relative;display:flex;align-items:center;cursor:pointer}.ngb-stepper.horizontal .ngb-stepper-step{padding:.5rem .75rem}.ngb-stepper.vertical .ngb-stepper-step{padding:.5rem 0}.ngb-stepper-step.disabled{cursor:default;opacity:.6}.ngb-stepper-indicator{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;margin-right:.5rem;flex-shrink:0}.ngb-stepper.bootstrap .ngb-stepper-indicator{border:1px solid var(--bs-border-color, #dee2e6);background-color:var(--bs-body-bg, #fff)}.ngb-stepper.bootstrap .ngb-stepper-step.active .ngb-stepper-indicator{background-color:var(--bs-primary, #0d6efd);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.done .ngb-stepper-indicator{background-color:var(--bs-success, #198754);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.error .ngb-stepper-indicator{background-color:var(--bs-danger, #dc3545);color:#fff}.ngb-stepper-label-container{display:flex;flex-direction:column}.ngb-stepper-label-top{flex-direction:column-reverse}.ngb-stepper-label-bottom{flex-direction:column}.ngb-stepper-label-left{flex-direction:row-reverse}.ngb-stepper-label-right{flex-direction:row}.ngb-stepper-content{position:relative}.ngb-stepper-content-top{order:-1}.ngb-stepper-buttons{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}.ngb-stepper-error{color:var(--bs-danger, #dc3545);font-size:.875rem;margin-top:.25rem}.ngb-stepper-optional{font-size:.75rem;opacity:.7}.ngb-stepper .fade-step{animation:ngb-stepper-fade var(--ngb-stepper-animation-duration, .15s) ease-in-out;animation-fill-mode:both}@keyframes ngb-stepper-fade{0%{opacity:0;transform:translateY(.35rem)}to{opacity:1;transform:translateY(0)}}\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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12484
13645
  }
12485
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbStepperComponent, decorators: [{
13646
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbStepperComponent, decorators: [{
12486
13647
  type: Component,
12487
13648
  args: [{ selector: 'ngb-stepper', standalone: true, imports: [CommonModule, NgbStepLabelDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"ngb-stepper\"\n [class.horizontal]=\"orientation === 'horizontal'\"\n [class.vertical]=\"orientation === 'vertical'\"\n [class.ngb-responsive]=\"responsive\"\n [class.bootstrap]=\"theme === 'bootstrap'\"\n [class.material]=\"theme === 'material'\"\n [class.tailwind]=\"theme === 'tailwind'\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation\"\n>\n <!-- HEADER / LABELS -->\n <div class=\"ngb-stepper-header\">\n <ol class=\"ngb-stepper-steps\" role=\"presentation\">\n @for (step of steps; track step; let i = $index) {\n <li\n class=\"ngb-stepper-step\"\n [class.active]=\"i === selectedIndex\"\n [class.done]=\"i < selectedIndex && !isStepInError(i)\"\n [class.error]=\"isStepInError(i)\"\n [class.disabled]=\"step.disabled\"\n role=\"tab\"\n [attr.id]=\"stepId(i)\"\n [attr.aria-controls]=\"contentId(i)\"\n [attr.aria-selected]=\"i === selectedIndex\"\n [attr.aria-disabled]=\"step.disabled || (!allowRevisit && i < visitedFrom && i !== selectedIndex)\"\n tabindex=\"{{ i === selectedIndex ? 0 : -1 }}\"\n (click)=\"onHeaderClick(i)\"\n (keydown.enter)=\"onHeaderKeydown($event, i)\"\n (keydown.space)=\"onHeaderKeydown($event, i)\"\n >\n <div\n class=\"ngb-stepper-indicator\"\n [ngClass]=\"indicatorClass(i)\"\n aria-hidden=\"true\"\n >\n @if (customIconTpl) {\n <ng-container\n [ngTemplateOutlet]=\"customIconTpl\"\n [ngTemplateOutletContext]=\"{ index: i, state: stepState(i) }\"\n ></ng-container>\n } @else {\n {{ defaultIconForState(stepState(i), i) }}\n }\n </div>\n\n <div\n class=\"ngb-stepper-label-container\"\n [ngClass]=\"labelPositionClass\"\n >\n @if (stepLabelTpl) {\n <div class=\"ngb-stepper-label\">\n <ng-container\n [ngTemplateOutlet]=\"stepLabelTpl\"\n [ngTemplateOutletContext]=\"{ index: i, step: step }\"\n ></ng-container>\n </div>\n } @else {\n <div class=\"ngb-stepper-label-text\">\n {{ step.label || ('Step ' + (i + 1)) }}\n </div>\n }\n @if (step.optional) {\n <div class=\"ngb-stepper-optional\">\n {{ optionalLabel }}\n </div>\n }\n </div>\n </li>\n }\n </ol>\n </div>\n\n <!-- CONTENT -->\n <div class=\"ngb-stepper-content\" [class.ngb-stepper-content-top]=\"contentPosition === 'top'\">\n @if (lazy) {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n } @else {\n <div\n class=\"fade-step\"\n [style.--ngb-stepper-animation-duration]=\"(disableAnimation ? 0 : animationDuration) + 'ms'\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"stepId(selectedIndex)\"\n [attr.id]=\"contentId(selectedIndex)\"\n >\n <ng-container *ngTemplateOutlet=\"stepContentTpl; context: { index: selectedIndex }\"></ng-container>\n @if (currentErrorMessage) {\n <div class=\"ngb-stepper-error\" role=\"alert\">\n {{ currentErrorMessage }}\n </div>\n }\n </div>\n }\n </div>\n\n <!-- ACTIONS -->\n <div class=\"ngb-stepper-buttons\">\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onCancel()\"\n >\n {{ cancelLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"onReset()\"\n >\n {{ resetLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-outline-secondary\"\n (click)=\"prev()\"\n [disabled]=\"selectedIndex <= 0 || !allowRevisit\"\n >\n {{ previousLabel }}\n </button>\n\n <button\n type=\"button\"\n class=\"btn btn-sm btn-primary\"\n (click)=\"next()\"\n [disabled]=\"selectedIndex >= steps.length - 1 || steps[selectedIndex]?.disabled\"\n >\n {{ nextLabel }}\n </button>\n </div>\n</div>\n", styles: [".ngb-stepper{display:flex;flex-direction:column}.ngb-stepper.horizontal .ngb-stepper-header{display:flex;overflow-x:auto}.ngb-stepper.vertical .ngb-stepper-header{display:block}.ngb-stepper-header{margin-bottom:1rem}.ngb-stepper-steps{list-style:none;padding:0;margin:0;display:flex;flex-wrap:nowrap}.ngb-stepper.vertical .ngb-stepper-steps{flex-direction:column}.ngb-stepper-step{position:relative;display:flex;align-items:center;cursor:pointer}.ngb-stepper.horizontal .ngb-stepper-step{padding:.5rem .75rem}.ngb-stepper.vertical .ngb-stepper-step{padding:.5rem 0}.ngb-stepper-step.disabled{cursor:default;opacity:.6}.ngb-stepper-indicator{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:50%;margin-right:.5rem;flex-shrink:0}.ngb-stepper.bootstrap .ngb-stepper-indicator{border:1px solid var(--bs-border-color, #dee2e6);background-color:var(--bs-body-bg, #fff)}.ngb-stepper.bootstrap .ngb-stepper-step.active .ngb-stepper-indicator{background-color:var(--bs-primary, #0d6efd);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.done .ngb-stepper-indicator{background-color:var(--bs-success, #198754);color:#fff}.ngb-stepper.bootstrap .ngb-stepper-step.error .ngb-stepper-indicator{background-color:var(--bs-danger, #dc3545);color:#fff}.ngb-stepper-label-container{display:flex;flex-direction:column}.ngb-stepper-label-top{flex-direction:column-reverse}.ngb-stepper-label-bottom{flex-direction:column}.ngb-stepper-label-left{flex-direction:row-reverse}.ngb-stepper-label-right{flex-direction:row}.ngb-stepper-content{position:relative}.ngb-stepper-content-top{order:-1}.ngb-stepper-buttons{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}.ngb-stepper-error{color:var(--bs-danger, #dc3545);font-size:.875rem;margin-top:.25rem}.ngb-stepper-optional{font-size:.75rem;opacity:.7}.ngb-stepper .fade-step{animation:ngb-stepper-fade var(--ngb-stepper-animation-duration, .15s) ease-in-out;animation-fill-mode:both}@keyframes ngb-stepper-fade{0%{opacity:0;transform:translateY(.35rem)}to{opacity:1;transform:translateY(0)}}\n"] }]
12488
13649
  }], propDecorators: { steps: [{
@@ -12551,14 +13712,14 @@ class NgbSplitterPaneComponent {
12551
13712
  collapsed = false;
12552
13713
  collapsedChange = new EventEmitter();
12553
13714
  template;
12554
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSplitterPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12555
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.0", type: NgbSplitterPaneComponent, isStandalone: true, selector: "ngb-splitter-pane", inputs: { size: "size", min: "min", max: "max", scrollable: "scrollable", collapsible: "collapsible", collapsed: "collapsed" }, outputs: { collapsedChange: "collapsedChange" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["content"], descendants: true, static: true }], ngImport: i0, template: `<ng-template #content>
13715
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSplitterPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13716
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: NgbSplitterPaneComponent, isStandalone: true, selector: "ngb-splitter-pane", inputs: { size: "size", min: "min", max: "max", scrollable: "scrollable", collapsible: "collapsible", collapsed: "collapsed" }, outputs: { collapsedChange: "collapsedChange" }, viewQueries: [{ propertyName: "template", first: true, predicate: ["content"], descendants: true, static: true }], ngImport: i0, template: `<ng-template #content>
12556
13717
  <div [style.overflow]="scrollable ? 'auto' : 'hidden'" style="height: 100%; width: 100%;">
12557
13718
  <ng-content></ng-content>
12558
13719
  </div>
12559
13720
  </ng-template>`, isInline: true, styles: [":host{display:block;position:relative}\n"] });
12560
13721
  }
12561
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSplitterPaneComponent, decorators: [{
13722
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSplitterPaneComponent, decorators: [{
12562
13723
  type: Component,
12563
13724
  args: [{ selector: 'ngb-splitter-pane', standalone: true, template: `<ng-template #content>
12564
13725
  <div [style.overflow]="scrollable ? 'auto' : 'hidden'" style="height: 100%; width: 100%;">
@@ -12790,8 +13951,8 @@ class NgbSplitterComponent {
12790
13951
  nextPercent = Math.max(0, Math.min(100, nextPercent));
12791
13952
  targetPane.size = `${nextPercent}%`;
12792
13953
  }
12793
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSplitterComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
12794
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbSplitterComponent, isStandalone: true, selector: "ngb-splitter", inputs: { orientation: "orientation", handleThickness: "handleThickness", handleIconColor: "handleIconColor", verticalMinHeight: "verticalMinHeight", resizable: "resizable", barColor: "barColor", lineColor: "lineColor" }, host: { listeners: { "window:mousemove": "onMouseMove($event)", "window:mouseup": "onMouseUp()" } }, queries: [{ propertyName: "panes", predicate: NgbSplitterPaneComponent }], ngImport: i0, template: `
13954
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSplitterComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
13955
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbSplitterComponent, isStandalone: true, selector: "ngb-splitter", inputs: { orientation: "orientation", handleThickness: "handleThickness", handleIconColor: "handleIconColor", verticalMinHeight: "verticalMinHeight", resizable: "resizable", barColor: "barColor", lineColor: "lineColor" }, host: { listeners: { "window:mousemove": "onMouseMove($event)", "window:mouseup": "onMouseUp()" } }, queries: [{ propertyName: "panes", predicate: NgbSplitterPaneComponent }], ngImport: i0, template: `
12795
13956
  <div class="splitter-container" [class.vertical]="orientation === 'vertical'"
12796
13957
  [style.min-height]="orientation === 'vertical' ? verticalMinHeight : null"
12797
13958
  [style.height]="orientation === 'vertical' ? verticalMinHeight : null">
@@ -12838,7 +13999,7 @@ class NgbSplitterComponent {
12838
13999
  </div>
12839
14000
  `, isInline: true, styles: [":host{display:block;width:100%}.splitter-container{display:flex;height:100%;width:100%}.splitter-container.vertical{flex-direction:column}.splitbar{background:#ccc;width:5px;position:relative;align-items:center;justify-content:center;flex:0 0 auto;z-index:10}.splitbar.resizable{cursor:col-resize}.splitbar:hover{filter:brightness(90%)}.handle-line{border-radius:2px;opacity:.8;left:45%;position:absolute;top:45%;display:flex;align-items:center;justify-content:center}.splitter-container:not(.vertical) .handle-line{width:2px;height:10px}.pane-wrapper{position:relative;min-width:0;min-height:0;overflow:hidden;flex-shrink:1}.vertical .handle-line{height:2px;width:10px}.vertical .splitbar.resizable{cursor:row-resize}.splitter-container.vertical .splitter-container .splitbar.resizable{cursor:col-resize}.vertical .splitbar{width:100%}.collapse-btn{cursor:pointer;background:#666;width:10px;height:10px;position:absolute;top:50%}.collapse-arrow{font-size:.95rem;-webkit-user-select:none;user-select:none;cursor:pointer;line-height:1;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;position:absolute;top: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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12840
14001
  }
12841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbSplitterComponent, decorators: [{
14002
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbSplitterComponent, decorators: [{
12842
14003
  type: Component,
12843
14004
  args: [{ selector: 'ngb-splitter', standalone: true, imports: [CommonModule, NgbSplitterPaneComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
12844
14005
  <div class="splitter-container" [class.vertical]="orientation === 'vertical'"
@@ -12918,8 +14079,8 @@ class NgbChipsComponent {
12918
14079
  removeLabel;
12919
14080
  remove = new EventEmitter();
12920
14081
  trackById = (_, item) => item.id;
12921
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbChipsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12922
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbChipsComponent, isStandalone: true, selector: "ngb-chips", inputs: { items: "items", removable: "removable", ariaLabel: "ariaLabel", removeLabel: "removeLabel" }, outputs: { remove: "remove" }, ngImport: i0, template: `
14082
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbChipsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14083
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbChipsComponent, isStandalone: true, selector: "ngb-chips", inputs: { items: "items", removable: "removable", ariaLabel: "ariaLabel", removeLabel: "removeLabel" }, outputs: { remove: "remove" }, ngImport: i0, template: `
12923
14084
  <div class="ngb-chips" [attr.aria-label]="ariaLabel">
12924
14085
  @for (item of items; track trackById($index, item)) {
12925
14086
  <span class="badge rounded-pill bg-secondary ngb-chip" [class.opacity-50]="!!item.disabled">
@@ -12940,7 +14101,7 @@ class NgbChipsComponent {
12940
14101
  </div>
12941
14102
  `, isInline: true, styles: [":host{display:block}.ngb-chips{display:flex;flex-wrap:wrap;gap:.35rem;align-items:center}.ngb-chip{display:inline-flex;align-items:center;gap:.25rem;max-width:100%}.ngb-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngb-chip-remove{border:0;background:transparent;padding:0;line-height:1;cursor:pointer;font-size:1rem;opacity:.85}.ngb-chip-remove:disabled{cursor:default;opacity:.4}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12942
14103
  }
12943
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbChipsComponent, decorators: [{
14104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbChipsComponent, decorators: [{
12944
14105
  type: Component,
12945
14106
  args: [{ selector: 'ngb-chips', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
12946
14107
  <div class="ngb-chips" [attr.aria-label]="ariaLabel">
@@ -13674,8 +14835,8 @@ class NgbTypeaheadComponent {
13674
14835
  return match;
13675
14836
  return { id: `${value}`, label: `${value}`, value };
13676
14837
  }
13677
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbTypeaheadComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
13678
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbTypeaheadComponent, isStandalone: true, selector: "ngb-typeahead", inputs: { data: "data", debounceTime: "debounceTime", characterTyped: "characterTyped", limit: "limit", selectExact: "selectExact", multiSelect: "multiSelect", matchSelection: "matchSelection", showDropdownButton: "showDropdownButton", showClearButton: "showClearButton", updateOnBlur: "updateOnBlur", updateOnTab: "updateOnTab", separator: "separator", chips: "chips", vScroll: "vScroll", vItemSize: "vItemSize", itemTemplate: "itemTemplate", i18n: "i18n" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onUnselect: "onUnselect", onAdd: "onAdd", onFocus: "onFocus", onBlur: "onBlur", onDropdownClick: "onDropdownClick", onClear: "onClear", onInputKeydown: "onInputKeydown", onKeyUp: "onKeyUp", onShow: "onShow", onHide: "onHide", onLazyLoad: "onLazyLoad", selectedItems: "selectedItems", selectionChange: "selectionChange", onChange: "onChange", onScrollEvent: "onScrollEvent" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event)", "document:focusin": "onDocumentFocusIn($event)" } }, providers: [
14838
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbTypeaheadComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
14839
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbTypeaheadComponent, isStandalone: true, selector: "ngb-typeahead", inputs: { data: "data", debounceTime: "debounceTime", characterTyped: "characterTyped", limit: "limit", selectExact: "selectExact", multiSelect: "multiSelect", matchSelection: "matchSelection", showDropdownButton: "showDropdownButton", showClearButton: "showClearButton", updateOnBlur: "updateOnBlur", updateOnTab: "updateOnTab", separator: "separator", chips: "chips", vScroll: "vScroll", vItemSize: "vItemSize", itemTemplate: "itemTemplate", i18n: "i18n" }, outputs: { completeMethod: "completeMethod", onSelect: "onSelect", onUnselect: "onUnselect", onAdd: "onAdd", onFocus: "onFocus", onBlur: "onBlur", onDropdownClick: "onDropdownClick", onClear: "onClear", onInputKeydown: "onInputKeydown", onKeyUp: "onKeyUp", onShow: "onShow", onHide: "onHide", onLazyLoad: "onLazyLoad", selectedItems: "selectedItems", selectionChange: "selectionChange", onChange: "onChange", onScrollEvent: "onScrollEvent" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event)", "document:focusin": "onDocumentFocusIn($event)" } }, providers: [
13679
14840
  {
13680
14841
  provide: NG_VALUE_ACCESSOR,
13681
14842
  useExisting: forwardRef(() => NgbTypeaheadComponent),
@@ -13832,7 +14993,7 @@ class NgbTypeaheadComponent {
13832
14993
  </div>
13833
14994
  `, isInline: true, styles: [":host{display:block}.typeahead-root{position:relative}.typeahead-chips-control{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;min-height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem}.typeahead-chips-control input{border:0;outline:0;flex:1 1 9rem;min-width:6rem;padding:0;margin:0;background:transparent}.typeahead-chips-control input:focus{outline:0;box-shadow:none}.typeahead-panel{position:absolute;top:calc(100% + .25rem);left:0;right:0;z-index:1050;max-height:240px;overflow:auto;opacity:0;transform:translateY(-.25rem);pointer-events:none;transition:opacity .12s ease,transform .12s ease}.typeahead-panel.show{opacity:1;transform:translateY(0);pointer-events:auto}.typeahead-item{display:flex;align-items:center;gap:.5rem}.typeahead-item-checkbox{display:inline-flex;align-items:center;justify-content:center;width:1.15rem;height:1.15rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgbChipsComponent, selector: "ngb-chips", inputs: ["items", "removable", "ariaLabel", "removeLabel"], outputs: ["remove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13834
14995
  }
13835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbTypeaheadComponent, decorators: [{
14996
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbTypeaheadComponent, decorators: [{
13836
14997
  type: Component,
13837
14998
  args: [{ selector: 'ngb-typeahead', standalone: true, imports: [CommonModule, NgbChipsComponent], providers: [
13838
14999
  {
@@ -14166,8 +15327,8 @@ class NgbTreeComponent {
14166
15327
  }
14167
15328
  return acc;
14168
15329
  }
14169
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.0", type: NgbTreeComponent, isStandalone: true, selector: "ngb-tree", inputs: { nodes: "nodes", type: "type", showCheckbox: "showCheckbox", i18n: "i18n", expandIcon: "expandIcon", collapseIcon: "collapseIcon", plusIcon: "plusIcon", minusIcon: "minusIcon" }, outputs: { expand: "expand", collapse: "collapse", expandAll: "expandAll", collapseAll: "collapseAll", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "nodeButtons", predicate: ["nodeBtn"], descendants: true, read: ElementRef }], ngImport: i0, template: `
15330
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15331
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: NgbTreeComponent, isStandalone: true, selector: "ngb-tree", inputs: { nodes: "nodes", type: "type", showCheckbox: "showCheckbox", i18n: "i18n", expandIcon: "expandIcon", collapseIcon: "collapseIcon", plusIcon: "plusIcon", minusIcon: "minusIcon" }, outputs: { expand: "expand", collapse: "collapse", expandAll: "expandAll", collapseAll: "collapseAll", selectionChange: "selectionChange" }, viewQueries: [{ propertyName: "nodeButtons", predicate: ["nodeBtn"], descendants: true, read: ElementRef }], ngImport: i0, template: `
14171
15332
  <div class="d-flex gap-2 mb-2">
14172
15333
  <button type="button" class="btn btn-sm btn-outline-secondary" (click)="expandAllNodes()" [attr.aria-label]="i18n?.expandAll || 'Expand all'">
14173
15334
  {{ i18n?.expandAll || 'Expand all' }}
@@ -14237,7 +15398,7 @@ class NgbTreeComponent {
14237
15398
  </ng-template>
14238
15399
  `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14239
15400
  }
14240
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: NgbTreeComponent, decorators: [{
15401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NgbTreeComponent, decorators: [{
14241
15402
  type: Component,
14242
15403
  args: [{
14243
15404
  selector: 'ngb-tree',
@@ -14349,5 +15510,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
14349
15510
  * Generated bundle index. Do not edit.
14350
15511
  */
14351
15512
 
14352
- 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 };
14353
15514
  //# sourceMappingURL=angular-bootstrap-ngbootstrap.mjs.map