@porscheinformatik/clr-addons 21.2.0 → 21.3.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 { Component, NgModule, Injectable, EventEmitter, Output, Input, Directive, ViewChild, ContentChildren, TemplateRef, ViewChildren, HostBinding, ElementRef, Renderer2, forwardRef, DOCUMENT, Inject, ContentChild, Optional, input, ChangeDetectionStrategy, signal, computed, SkipSelf, inject, model, contentChild, linkedSignal, DestroyRef, contentChildren, effect, viewChild, ViewContainerRef, output, afterRenderEffect, InjectionToken, isSignal, HostListener, LOCALE_ID, Self, Host, ChangeDetectorRef, NgZone, Injector, untracked, runInInjectionContext } from '@angular/core';
2
+ import { Component, NgModule, Injectable, EventEmitter, Output, Input, Directive, ViewChild, ContentChildren, TemplateRef, ViewChildren, HostBinding, ElementRef, Renderer2, forwardRef, DOCUMENT, Inject, ContentChild, Optional, input, ChangeDetectionStrategy, signal, computed, SkipSelf, inject, model, contentChild, linkedSignal, DestroyRef, contentChildren, effect, NgZone, viewChild, ViewContainerRef, afterRenderEffect, InjectionToken, isSignal, HostListener, LOCALE_ID, Self, Host, output, ChangeDetectorRef, Injector, untracked, runInInjectionContext } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, NgComponentOutlet, NgTemplateOutlet, getLocaleDateFormat, FormatWidth, NgOptimizedImage, NgClass } from '@angular/common';
5
5
  import * as i2 from '@clr/angular/icon';
@@ -19,14 +19,14 @@ import * as i3$1 from '@clr/angular/popover/dropdown';
19
19
  import * as i2$3 from '@clr/angular/popover/common';
20
20
  import * as i2$4 from '@clr/angular/emphasis/alert';
21
21
  import { takeUntilDestroyed, toObservable, outputFromObservable, toSignal } from '@angular/core/rxjs-interop';
22
- import * as i1$3 from '@clr/angular/progress/spinner';
22
+ import * as i2$5 from '@clr/angular/progress/spinner';
23
23
  import * as i4 from '@clr/angular/forms/checkbox';
24
24
  import * as i3$2 from '@clr/angular/forms/input';
25
- import * as i1$4 from '@angular/common/http';
25
+ import * as i1$3 from '@angular/common/http';
26
26
  import { CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
27
27
  import * as i4$1 from '@clr/angular/forms/datepicker';
28
28
  import { CdkCopyToClipboard } from '@angular/cdk/clipboard';
29
- import * as i1$5 from '@clr/angular/popover/tooltip';
29
+ import * as i1$4 from '@clr/angular/popover/tooltip';
30
30
  import { provideAnimations } from '@angular/platform-browser/animations';
31
31
 
32
32
  /*
@@ -729,11 +729,14 @@ class ClrDropdownOverflowDirective {
729
729
  set clrMarginBottom(value) {
730
730
  this.marginBottomPx = this.convertToPixels(value);
731
731
  }
732
- constructor(elRef) {
732
+ constructor(elRef, ngZone) {
733
733
  this.elRef = elRef;
734
+ this.ngZone = ngZone;
734
735
  this.defaultItemMinHeightRem = 1.5;
735
736
  this.alreadyChecked = false;
736
737
  this.marginBottomPx = 2;
738
+ this.deferredCheckPending = false;
739
+ this.requestAnimationFrameRetry = 0;
737
740
  }
738
741
  ngAfterViewChecked() {
739
742
  // first trigger manually because the subscription lower only triggers after first change
@@ -758,13 +761,32 @@ class ClrDropdownOverflowDirective {
758
761
  applyDropdownOverflowStyles() {
759
762
  // the vertical position of our element in the current window
760
763
  const rect = this.elRef.nativeElement.getBoundingClientRect();
761
- const y = rect.y === 0 ? rect.height : rect.y;
762
- if (y !== 0 && !this.alreadyChecked) {
764
+ // If the element is at position 0,0 it may not yet be positioned by the popover/CDK overlay system.
765
+ // Note: @clr/angular v18+ switched from Renderer2 (synchronous) to CDK Overlay (async rAF),
766
+ // so positioning is no longer guaranteed to be complete by the time ngAfterViewChecked runs.
767
+ // Defer the check to allow async positioning (e.g. CDK Overlay) to complete.
768
+ if (rect.x === 0 &&
769
+ rect.y === 0 &&
770
+ !this.alreadyChecked &&
771
+ !this.deferredCheckPending &&
772
+ this.requestAnimationFrameRetry < 10) {
773
+ this.deferredCheckPending = true;
774
+ this.requestAnimationFrameRetry++;
775
+ this.ngZone.runOutsideAngular(() => {
776
+ requestAnimationFrame(() => {
777
+ this.deferredCheckPending = false;
778
+ this.ngZone.run(() => this.applyDropdownOverflowStyles());
779
+ });
780
+ });
781
+ return;
782
+ }
783
+ if (!this.alreadyChecked) {
763
784
  const itemMinHeightPx = this.getItemMinHeight(this.clrDropdownMenuItemMinHeight);
764
785
  // see https://stackoverflow.com/questions/22754315/for-loop-for-htmlcollection-elements
765
786
  for (const item of this.getAllChildDropdownMenuItems()) {
766
787
  item.style.minHeight = itemMinHeightPx + 'px';
767
788
  }
789
+ const y = this.elRef.nativeElement.getBoundingClientRect().y;
768
790
  const height = window.innerHeight - y;
769
791
  const maxHeight = this.getMenuMaxHeight(this.clrDropdownMenuMaxHeight, height - this.marginBottomPx);
770
792
  this.elRef.nativeElement.style.maxHeight = maxHeight + 'px';
@@ -779,6 +801,7 @@ class ClrDropdownOverflowDirective {
779
801
  this.elRef.nativeElement.style.maxHeight = null;
780
802
  this.elRef.nativeElement.style.overflowY = null;
781
803
  this.alreadyChecked = false;
804
+ this.requestAnimationFrameRetry = 0;
782
805
  }
783
806
  getAllChildDropdownMenuItems() {
784
807
  return this.elRef.nativeElement.getElementsByClassName('dropdown-item');
@@ -818,7 +841,7 @@ class ClrDropdownOverflowDirective {
818
841
  const pxPerVhUnit = window.innerHeight / 100;
819
842
  return vh * pxPerVhUnit;
820
843
  }
821
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrDropdownOverflowDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
844
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrDropdownOverflowDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
822
845
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: ClrDropdownOverflowDirective, isStandalone: false, selector: "clr-dropdown-menu", inputs: { clrDropdownMenuMaxHeight: "clrDropdownMenuMaxHeight", clrDropdownMenuItemMinHeight: "clrDropdownMenuItemMinHeight", clrMarginBottom: "clrMarginBottom" }, queries: [{ propertyName: "nestedDropdownChildren", predicate: ClrDropdown, descendants: true }], ngImport: i0 }); }
823
846
  }
824
847
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrDropdownOverflowDirective, decorators: [{
@@ -827,7 +850,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
827
850
  selector: 'clr-dropdown-menu',
828
851
  standalone: false,
829
852
  }]
830
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { clrDropdownMenuMaxHeight: [{
853
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { clrDropdownMenuMaxHeight: [{
831
854
  type: Input
832
855
  }], clrDropdownMenuItemMinHeight: [{
833
856
  type: Input
@@ -3120,11 +3143,11 @@ class ClrPagedSearchResultList {
3120
3143
  this.pageSizeChange = new EventEmitter();
3121
3144
  }
3122
3145
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrPagedSearchResultList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3123
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrPagedSearchResultList, isStandalone: false, selector: "clr-paged-search-result-list", inputs: { pageSize: ["clrPageSize", "pageSize"], pageSizeOptions: ["clrPageSizeOptions", "pageSizeOptions"], pageSizeLabel: ["clrPageSizeLabel", "pageSizeLabel"], currentPage: ["clrPage", "currentPage"], totalItems: ["clrTotalItems", "totalItems"], items: ["clrItems", "items"], clrPagerPosition: "clrPagerPosition" }, outputs: { pageChange: "clrPageChange", pageSizeChange: "clrPageSizeChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: "@if (clrPagerPosition === 'top' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'top' }\"> </ng-container>\n</div>\n} @for (item of items; track item) {\n<ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: item}\">\n @if (!itemTemplate) {\n <div>Item template input is undefined!</div>\n }\n</ng-container>\n} @if (clrPagerPosition === 'bottom' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'bottom' }\"> </ng-container>\n</div>\n}\n<ng-template #pager let-position>\n <div class=\"clr-row\">\n <div [class.pager-top]=\"position === 'top'\" [class.pager-bottom]=\"position === 'bottom'\">\n <ng-container *ngTemplateOutlet=\"pageSizeDropdown\"></ng-container>\n <clr-pager\n [clrPage]=\"currentPage\"\n [clrPageSize]=\"pageSize\"\n [clrTotalItems]=\"totalItems\"\n (clrPageChange)=\"pageChange.emit($event)\"\n ></clr-pager>\n </div>\n </div>\n</ng-template>\n<ng-template #pageSizeDropdown>\n @if (pageSizeOptions?.length > 1) {\n <div>\n <clr-dropdown>\n <button type=\"button\" class=\"btn btn-link options-text-button btn-no-capitalized\" clrDropdownTrigger>\n {{pageSizeLabel}}: {{pageSize}}\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <button type=\"button\" class=\"btn btn-link options-icon-button\" clrDropdownTrigger>\n <cds-icon shape=\"cog\"></cds-icon>\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <clr-dropdown-menu class=\"spinner-in-front\" clrPosition=\"top-right\">\n @for (sizeOption of pageSizeOptions; track sizeOption) {\n <button type=\"button\" clrDropdownItem (click)=\"pageSizeChange.emit(sizeOption)\">{{sizeOption}}</button>\n }\n </clr-dropdown-menu>\n </clr-dropdown>\n </div>\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: i3$1.ClrDropdown, selector: "clr-dropdown", inputs: ["clrCloseMenuOnItemClick"] }, { kind: "component", type: i3$1.ClrDropdownMenu, selector: "clr-dropdown-menu", inputs: ["clrPosition"] }, { kind: "directive", type: i3$1.ClrDropdownTrigger, selector: "[clrDropdownTrigger],[clrDropdownToggle]" }, { kind: "directive", type: i3$1.ClrDropdownItem, selector: "[clrDropdownItem]", inputs: ["clrDisabled", "id"] }, { kind: "component", type: ClrPager, selector: "clr-pager", inputs: ["clrPageSize", "clrTotalItems", "clrLast", "clrPage"], outputs: ["clrPageChange"] }] }); }
3146
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrPagedSearchResultList, isStandalone: false, selector: "clr-paged-search-result-list", inputs: { pageSize: ["clrPageSize", "pageSize"], pageSizeOptions: ["clrPageSizeOptions", "pageSizeOptions"], pageSizeLabel: ["clrPageSizeLabel", "pageSizeLabel"], currentPage: ["clrPage", "currentPage"], totalItems: ["clrTotalItems", "totalItems"], items: ["clrItems", "items"], clrPagerPosition: "clrPagerPosition" }, outputs: { pageChange: "clrPageChange", pageSizeChange: "clrPageSizeChange" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true, static: true }], ngImport: i0, template: "@if (clrPagerPosition === 'top' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'top' }\"></ng-container>\n</div>\n} @for (item of items; track item) {\n<ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: item}\">\n @if (!itemTemplate) {\n <div>Item template input is undefined!</div>\n }\n</ng-container>\n} @if (clrPagerPosition === 'bottom' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'bottom' }\"></ng-container>\n</div>\n}\n<ng-template #pager let-position>\n <div class=\"clr-row\">\n <div [class.pager-top]=\"position === 'top'\" [class.pager-bottom]=\"position === 'bottom'\">\n <ng-container *ngTemplateOutlet=\"pageSizeDropdown\"></ng-container>\n <clr-pager\n [clrPage]=\"currentPage\"\n [clrPageSize]=\"pageSize\"\n [clrTotalItems]=\"totalItems\"\n (clrPageChange)=\"pageChange.emit($event)\"\n ></clr-pager>\n </div>\n </div>\n</ng-template>\n<ng-template #pageSizeDropdown>\n @if (pageSizeOptions?.length > 1) {\n <div>\n <clr-dropdown>\n <button type=\"button\" class=\"btn btn-link btn-no-capitalized\" clrDropdownTrigger>\n <span class=\"options-text-button\">{{ pageSizeLabel }}: {{ pageSize }}</span>\n <cds-icon class=\"options-icon-button\" shape=\"cog\"></cds-icon>\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <clr-dropdown-menu class=\"spinner-in-front\" clrPosition=\"top-right\">\n @for (sizeOption of pageSizeOptions; track sizeOption) {\n <button type=\"button\" clrDropdownItem (click)=\"pageSizeChange.emit(sizeOption)\">{{ sizeOption }}</button>\n }\n </clr-dropdown-menu>\n </clr-dropdown>\n </div>\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: i3$1.ClrDropdown, selector: "clr-dropdown", inputs: ["clrCloseMenuOnItemClick"] }, { kind: "component", type: i3$1.ClrDropdownMenu, selector: "clr-dropdown-menu", inputs: ["clrPosition"] }, { kind: "directive", type: i3$1.ClrDropdownTrigger, selector: "[clrDropdownTrigger],[clrDropdownToggle]" }, { kind: "directive", type: i3$1.ClrDropdownItem, selector: "[clrDropdownItem]", inputs: ["clrDisabled", "id"] }, { kind: "component", type: ClrPager, selector: "clr-pager", inputs: ["clrPageSize", "clrTotalItems", "clrLast", "clrPage"], outputs: ["clrPageChange"] }] }); }
3124
3147
  }
3125
3148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrPagedSearchResultList, decorators: [{
3126
3149
  type: Component,
3127
- args: [{ selector: 'clr-paged-search-result-list', standalone: false, template: "@if (clrPagerPosition === 'top' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'top' }\"> </ng-container>\n</div>\n} @for (item of items; track item) {\n<ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: item}\">\n @if (!itemTemplate) {\n <div>Item template input is undefined!</div>\n }\n</ng-container>\n} @if (clrPagerPosition === 'bottom' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'bottom' }\"> </ng-container>\n</div>\n}\n<ng-template #pager let-position>\n <div class=\"clr-row\">\n <div [class.pager-top]=\"position === 'top'\" [class.pager-bottom]=\"position === 'bottom'\">\n <ng-container *ngTemplateOutlet=\"pageSizeDropdown\"></ng-container>\n <clr-pager\n [clrPage]=\"currentPage\"\n [clrPageSize]=\"pageSize\"\n [clrTotalItems]=\"totalItems\"\n (clrPageChange)=\"pageChange.emit($event)\"\n ></clr-pager>\n </div>\n </div>\n</ng-template>\n<ng-template #pageSizeDropdown>\n @if (pageSizeOptions?.length > 1) {\n <div>\n <clr-dropdown>\n <button type=\"button\" class=\"btn btn-link options-text-button btn-no-capitalized\" clrDropdownTrigger>\n {{pageSizeLabel}}: {{pageSize}}\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <button type=\"button\" class=\"btn btn-link options-icon-button\" clrDropdownTrigger>\n <cds-icon shape=\"cog\"></cds-icon>\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <clr-dropdown-menu class=\"spinner-in-front\" clrPosition=\"top-right\">\n @for (sizeOption of pageSizeOptions; track sizeOption) {\n <button type=\"button\" clrDropdownItem (click)=\"pageSizeChange.emit(sizeOption)\">{{sizeOption}}</button>\n }\n </clr-dropdown-menu>\n </clr-dropdown>\n </div>\n }\n</ng-template>\n" }]
3150
+ args: [{ selector: 'clr-paged-search-result-list', standalone: false, template: "@if (clrPagerPosition === 'top' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'top' }\"></ng-container>\n</div>\n} @for (item of items; track item) {\n<ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: item}\">\n @if (!itemTemplate) {\n <div>Item template input is undefined!</div>\n }\n</ng-container>\n} @if (clrPagerPosition === 'bottom' || clrPagerPosition === 'both') {\n<div>\n <ng-container [ngTemplateOutlet]=\"pager\" [ngTemplateOutletContext]=\"{ $implicit: 'bottom' }\"></ng-container>\n</div>\n}\n<ng-template #pager let-position>\n <div class=\"clr-row\">\n <div [class.pager-top]=\"position === 'top'\" [class.pager-bottom]=\"position === 'bottom'\">\n <ng-container *ngTemplateOutlet=\"pageSizeDropdown\"></ng-container>\n <clr-pager\n [clrPage]=\"currentPage\"\n [clrPageSize]=\"pageSize\"\n [clrTotalItems]=\"totalItems\"\n (clrPageChange)=\"pageChange.emit($event)\"\n ></clr-pager>\n </div>\n </div>\n</ng-template>\n<ng-template #pageSizeDropdown>\n @if (pageSizeOptions?.length > 1) {\n <div>\n <clr-dropdown>\n <button type=\"button\" class=\"btn btn-link btn-no-capitalized\" clrDropdownTrigger>\n <span class=\"options-text-button\">{{ pageSizeLabel }}: {{ pageSize }}</span>\n <cds-icon class=\"options-icon-button\" shape=\"cog\"></cds-icon>\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n <clr-dropdown-menu class=\"spinner-in-front\" clrPosition=\"top-right\">\n @for (sizeOption of pageSizeOptions; track sizeOption) {\n <button type=\"button\" clrDropdownItem (click)=\"pageSizeChange.emit(sizeOption)\">{{ sizeOption }}</button>\n }\n </clr-dropdown-menu>\n </clr-dropdown>\n </div>\n }\n</ng-template>\n" }]
3128
3151
  }], propDecorators: { pageSize: [{
3129
3152
  type: Input,
3130
3153
  args: ['clrPageSize']
@@ -3825,7 +3848,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
3825
3848
  }], propDecorators: { parent: [{ type: i0.Input, args: [{ isSignal: true, alias: "parent", required: false }] }], children: [{ type: i0.Input, args: [{ isSignal: true, alias: "children", required: false }] }] } });
3826
3849
 
3827
3850
  /*
3828
- * Copyright (c) 2018-2025 Porsche Informatik. All Rights Reserved.
3851
+ * Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.
3829
3852
  * This software is released under MIT license.
3830
3853
  * The full license information can be found in LICENSE in the root directory of this project.
3831
3854
  */
@@ -3841,8 +3864,8 @@ class ClrTreetableRowCheckbox {
3841
3864
  : ClrTreetableSelectedState.SELECTED);
3842
3865
  }
3843
3866
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableRowCheckbox, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3844
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.18", type: ClrTreetableRowCheckbox, isStandalone: false, selector: "clr-tt-row-checkbox", inputs: { clrTtSelectionState: { classPropertyName: "clrTtSelectionState", publicName: "clrTtSelectionState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clrTtSelectionState: "clrTtSelectionStateChange" }, ngImport: i0, template: `
3845
- <div class="clr-checkbox-wrapper treetable-row-selection treetable-cell">
3867
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.18", type: ClrTreetableRowCheckbox, isStandalone: false, selector: "clr-tt-row-checkbox", inputs: { clrTtSelectionState: { classPropertyName: "clrTtSelectionState", publicName: "clrTtSelectionState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clrTtSelectionState: "clrTtSelectionStateChange" }, host: { attributes: { "role": "gridcell" }, properties: { "class.treetable-row-selection": "true", "class.treetable-cell": "true" } }, ngImport: i0, template: `
3868
+ <div class="clr-checkbox-wrapper">
3846
3869
  <input
3847
3870
  type="checkbox"
3848
3871
  data-testId="clrTtRowCheckbox"
@@ -3856,7 +3879,7 @@ class ClrTreetableRowCheckbox {
3856
3879
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableRowCheckbox, decorators: [{
3857
3880
  type: Component,
3858
3881
  args: [{ selector: 'clr-tt-row-checkbox', template: `
3859
- <div class="clr-checkbox-wrapper treetable-row-selection treetable-cell">
3882
+ <div class="clr-checkbox-wrapper">
3860
3883
  <input
3861
3884
  type="checkbox"
3862
3885
  data-testId="clrTtRowCheckbox"
@@ -3865,7 +3888,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
3865
3888
  (change)="toggle()"
3866
3889
  />
3867
3890
  </div>
3868
- `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".treetable-children-container{opacity:0;will-change:height,opacity}.treetable-children-container.expanded{opacity:1}.treetable-children-container.collapsed{height:0;opacity:0;overflow:hidden}.treetable-children-container.animate{transition:height .4s ease,opacity .4s ease}\n"] }]
3891
+ `, host: {
3892
+ '[class.treetable-row-selection]': 'true',
3893
+ '[class.treetable-cell]': 'true',
3894
+ role: 'gridcell',
3895
+ }, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".treetable-children-container{opacity:0;will-change:height,opacity}.treetable-children-container.expanded{opacity:1}.treetable-children-container.collapsed{height:0;opacity:0;overflow:hidden}.treetable-children-container.animate{transition:height .4s ease,opacity .4s ease}\n"] }]
3869
3896
  }], propDecorators: { clrTtSelectionState: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSelectionState", required: false }] }, { type: i0.Output, args: ["clrTtSelectionStateChange"] }] } });
3870
3897
 
3871
3898
  /*
@@ -4507,8 +4534,8 @@ class TreetableColumnStateService {
4507
4534
  this.columns = computed(() => Object.values(this._columnState()).sort((a, b) => a.columnIndex - b.columnIndex), ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
4508
4535
  this.visibleColumns = computed(() => this.columns().filter(column => !column.hidden), ...(ngDevMode ? [{ debugName: "visibleColumns" }] : /* istanbul ignore next */ []));
4509
4536
  this.hideableColumns = computed(() => this.columns().filter(column => column.hideable), ...(ngDevMode ? [{ debugName: "hideableColumns" }] : /* istanbul ignore next */ []));
4510
- this.hasHideableColumns = computed(() => this.hideableColumns()?.length > 0, ...(ngDevMode ? [{ debugName: "hasHideableColumns" }] : /* istanbul ignore next */ []));
4511
- this._changeWidthAction$ = this._changeWidth$.pipe(tap(({ id, width }) => this.update(id, { width })), share());
4537
+ this.hasHideableColumns = computed(() => this.hideableColumns().length > 0, ...(ngDevMode ? [{ debugName: "hasHideableColumns" }] : /* istanbul ignore next */ []));
4538
+ this._changeWidthAction$ = this._changeWidth$.pipe(filter$1(({ id, width }) => this.getColumn(id)?.width != width), tap(({ id, width }) => this.update(id, { width })), share());
4512
4539
  this._changeHideableAction$ = this._changeHideable$.pipe(tap(patch => {
4513
4540
  const current = this.getColumn(patch.id);
4514
4541
  if (current.hideable && !patch.hideable) {
@@ -4621,6 +4648,19 @@ class TreetableColumnStateService {
4621
4648
  getColumnState(id) {
4622
4649
  return toObservable(this._columnState).pipe(map$1(columns => columns[id]), distinctUntilChanged());
4623
4650
  }
4651
+ getColumnChangesById(id) {
4652
+ const hiddenChanges$ = merge(this._changeHiddenAction$.pipe(filter$1(change => change.id === id)), this._changeHiddenForAllAction$, this._resetHiddenAction$).pipe(map$1(() => ({
4653
+ id,
4654
+ type: TreetableColumnUpdate.HIDDEN,
4655
+ hidden: this.getColumn(id)?.hidden ?? false,
4656
+ })));
4657
+ const widthChanges$ = this._changeWidthAction$.pipe(filter$1(change => change.id === id), map$1((change) => ({
4658
+ id,
4659
+ type: TreetableColumnUpdate.WIDTH,
4660
+ width: change.width,
4661
+ })));
4662
+ return merge(widthChanges$, hiddenChanges$);
4663
+ }
4624
4664
  getColumn(id) {
4625
4665
  return this._columnState()[id];
4626
4666
  }
@@ -4652,10 +4692,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
4652
4692
  * This software is released under MIT license.
4653
4693
  * The full license information can be found in LICENSE in the root directory of this project.
4654
4694
  */
4695
+ let treetableId = 0;
4655
4696
  class ClrTreetable {
4656
4697
  constructor() {
4698
+ this.treetableId = `clr-treetable-${++treetableId}`;
4699
+ this.selectAllId = `clr-tt-select-all${treetableId}`;
4657
4700
  this._dataStateService = inject((TreetableDataStateService));
4658
4701
  this._recursionService = inject((ClrTreetableRecursionService));
4702
+ this._commonStringsService = inject(ClrCommonStringsService);
4703
+ this.commonStrings = this._commonStringsService.keys;
4659
4704
  this.clrClickableRows = input(true, ...(ngDevMode ? [{ debugName: "clrClickableRows" }] : /* istanbul ignore next */ []));
4660
4705
  this.clrHideHeader = input(false, ...(ngDevMode ? [{ debugName: "clrHideHeader" }] : /* istanbul ignore next */ []));
4661
4706
  this.clrTtLoading = input(false, ...(ngDevMode ? [{ debugName: "clrTtLoading" }] : /* istanbul ignore next */ []));
@@ -4692,7 +4737,7 @@ class ClrTreetable {
4692
4737
  TreetableColumnStateService,
4693
4738
  SortStateService,
4694
4739
  FilterStateService,
4695
- ], queries: [{ propertyName: "_ttRows", predicate: ClrTreetableRow, descendants: true, isSignal: true }, { propertyName: "_actionOverflow", predicate: ClrTreetableActionOverflow, descendants: true, isSignal: true }], ngImport: i0, template: "<!--\n~ Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.\n~ This software is released under MIT license.\n~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<div class=\"treetable\">\n <div class=\"treetable-grid\" role=\"grid\">\n <div class=\"treetable-header\" role=\"rowgroup\" [class.hide-header]=\"clrHideHeader()\">\n @if (showSelection() && !empty()) {\n <div class=\"clr-checkbox-wrapper treetable-row-selection treetable-column\" role=\"row\">\n <input\n type=\"checkbox\"\n data-testId=\"clrTtSelectAll\"\n [checked]=\"areAllRowsSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n </div>\n } @if (hasActionOverflow()) {\n <div class=\"treetable-row-actions treetable-column\">&nbsp;</div>\n }\n <div class=\"treetable-row-scrollable\" role=\"row\">\n <ng-content select=\"clr-tt-column\" />\n </div>\n </div>\n\n <div class=\"treetable-body\">\n @if (isRecursionMode()) {\n <clr-tt-recursive-rows [children]=\"displayedNodes()\" />\n } @else {\n <ng-content select=\"clr-tt-row\" />\n } @if (empty() && !clrTtLoading()) {\n <ng-content select=\"clr-tt-placeholder\" />\n }\n </div>\n </div>\n\n <ng-content select=\"clr-tt-footer\"></ng-content>\n\n @if (clrTtLoading()) {\n <div class=\"treetable-spinner\">\n <clr-spinner clrMedium />\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: i1$3.ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrTreetableRecursiveRows, selector: "clr-tt-recursive-rows", inputs: ["parent", "children"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4740
+ ], queries: [{ propertyName: "_ttRows", predicate: ClrTreetableRow, descendants: true, isSignal: true }, { propertyName: "_actionOverflow", predicate: ClrTreetableActionOverflow, descendants: true, isSignal: true }], ngImport: i0, template: "<!--\n~ Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.\n~ This software is released under MIT license.\n~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<div class=\"treetable\">\n <div class=\"treetable-grid\" role=\"grid\">\n <div class=\"treetable-header\" role=\"rowgroup\" [class.hide-header]=\"clrHideHeader()\">\n @if (showSelection() && !empty()) {\n <div class=\"treetable-row-selection treetable-column\" role=\"columnheader\">\n <div class=\"clr-checkbox-wrapper\">\n <input\n type=\"checkbox\"\n data-testId=\"clrTtSelectAll\"\n [id]=\"selectAllId\"\n [checked]=\"areAllRowsSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a treetable is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{ commonStrings.selectAll }}</span>\n </label>\n </div>\n </div>\n } @if (hasActionOverflow()) {\n <div class=\"treetable-row-actions treetable-column\">&nbsp;</div>\n }\n <div class=\"treetable-row-scrollable\">\n <ng-content select=\"clr-tt-column\" />\n </div>\n </div>\n\n <div class=\"treetable-body\">\n @if (isRecursionMode()) {\n <clr-tt-recursive-rows [children]=\"displayedNodes()\" />\n } @else {\n <ng-content select=\"clr-tt-row\" />\n } @if (empty() && !clrTtLoading()) {\n <ng-content select=\"clr-tt-placeholder\" />\n }\n </div>\n </div>\n\n <ng-content select=\"clr-tt-footer\"></ng-content>\n\n @if (clrTtLoading()) {\n <div class=\"treetable-spinner\">\n <clr-spinner clrMedium />\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: i1$1.ClrControlLabel, selector: "label", inputs: ["id", "for"] }, { kind: "component", type: i2$5.ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrTreetableRecursiveRows, selector: "clr-tt-recursive-rows", inputs: ["parent", "children"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4696
4741
  }
4697
4742
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetable, decorators: [{
4698
4743
  type: Component,
@@ -4702,7 +4747,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
4702
4747
  TreetableColumnStateService,
4703
4748
  SortStateService,
4704
4749
  FilterStateService,
4705
- ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<!--\n~ Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.\n~ This software is released under MIT license.\n~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<div class=\"treetable\">\n <div class=\"treetable-grid\" role=\"grid\">\n <div class=\"treetable-header\" role=\"rowgroup\" [class.hide-header]=\"clrHideHeader()\">\n @if (showSelection() && !empty()) {\n <div class=\"clr-checkbox-wrapper treetable-row-selection treetable-column\" role=\"row\">\n <input\n type=\"checkbox\"\n data-testId=\"clrTtSelectAll\"\n [checked]=\"areAllRowsSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n </div>\n } @if (hasActionOverflow()) {\n <div class=\"treetable-row-actions treetable-column\">&nbsp;</div>\n }\n <div class=\"treetable-row-scrollable\" role=\"row\">\n <ng-content select=\"clr-tt-column\" />\n </div>\n </div>\n\n <div class=\"treetable-body\">\n @if (isRecursionMode()) {\n <clr-tt-recursive-rows [children]=\"displayedNodes()\" />\n } @else {\n <ng-content select=\"clr-tt-row\" />\n } @if (empty() && !clrTtLoading()) {\n <ng-content select=\"clr-tt-placeholder\" />\n }\n </div>\n </div>\n\n <ng-content select=\"clr-tt-footer\"></ng-content>\n\n @if (clrTtLoading()) {\n <div class=\"treetable-spinner\">\n <clr-spinner clrMedium />\n </div>\n }\n</div>\n" }]
4750
+ ], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<!--\n~ Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.\n~ This software is released under MIT license.\n~ The full license information can be found in LICENSE in the root directory of this project.\n-->\n\n<div class=\"treetable\">\n <div class=\"treetable-grid\" role=\"grid\">\n <div class=\"treetable-header\" role=\"rowgroup\" [class.hide-header]=\"clrHideHeader()\">\n @if (showSelection() && !empty()) {\n <div class=\"treetable-row-selection treetable-column\" role=\"columnheader\">\n <div class=\"clr-checkbox-wrapper\">\n <input\n type=\"checkbox\"\n data-testId=\"clrTtSelectAll\"\n [id]=\"selectAllId\"\n [checked]=\"areAllRowsSelected()\"\n (change)=\"toggleSelectAll()\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a treetable is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{ commonStrings.selectAll }}</span>\n </label>\n </div>\n </div>\n } @if (hasActionOverflow()) {\n <div class=\"treetable-row-actions treetable-column\">&nbsp;</div>\n }\n <div class=\"treetable-row-scrollable\">\n <ng-content select=\"clr-tt-column\" />\n </div>\n </div>\n\n <div class=\"treetable-body\">\n @if (isRecursionMode()) {\n <clr-tt-recursive-rows [children]=\"displayedNodes()\" />\n } @else {\n <ng-content select=\"clr-tt-row\" />\n } @if (empty() && !clrTtLoading()) {\n <ng-content select=\"clr-tt-placeholder\" />\n }\n </div>\n </div>\n\n <ng-content select=\"clr-tt-footer\"></ng-content>\n\n @if (clrTtLoading()) {\n <div class=\"treetable-spinner\">\n <clr-spinner clrMedium />\n </div>\n }\n</div>\n" }]
4706
4751
  }], ctorParameters: () => [], propDecorators: { clrClickableRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrClickableRows", required: false }] }], clrHideHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrHideHeader", required: false }] }], clrTtLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtLoading", required: false }] }], clrTtSelected: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSelected", required: false }] }], clrTtAutoParentSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtAutoParentSelection", required: false }] }], clrTtSelectedChange: [{ type: i0.Output, args: ["clrTtSelectedChange"] }], clrTtRefresh: [{ type: i0.Output, args: ["clrTtRefresh"] }], _ttRows: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ClrTreetableRow), { ...{ descendants: true }, isSignal: true }] }], _actionOverflow: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ClrTreetableActionOverflow), { ...{ descendants: true }, isSignal: true }] }] } });
4707
4752
 
4708
4753
  /*
@@ -4717,6 +4762,230 @@ var ClrTreetableSortOrder;
4717
4762
  ClrTreetableSortOrder[ClrTreetableSortOrder["DESC"] = -1] = "DESC";
4718
4763
  })(ClrTreetableSortOrder || (ClrTreetableSortOrder = {}));
4719
4764
 
4765
+ /**
4766
+ * The default CSS column class.
4767
+ */
4768
+ const DEFAULT_COLUMN_CSS_CLASS = 'clr-col';
4769
+ /**
4770
+ * The CSS class to use to hide a column and its related cells in the treetable.
4771
+ */
4772
+ const HIDDEN_COLUMN_CSS_CLASS = 'treetable-hidden-column';
4773
+ /**
4774
+ * The minimum width of column headers and cells in the treetable.
4775
+ */
4776
+ const MIN_COLUMN_WIDTH = 48;
4777
+ /**
4778
+ * The resize width of column headers and cells per keybinds.
4779
+ */
4780
+ const KEYBOARD_RESIZE_LENGTH = 12;
4781
+
4782
+ class ClrTreetableColumnSeparator {
4783
+ constructor() {
4784
+ this.columnId = input.required(...(ngDevMode ? [{ debugName: "columnId" }] : /* istanbul ignore next */ []));
4785
+ this._columnState = inject(TreetableColumnStateService);
4786
+ this._commonStringsService = inject(ClrCommonStringsService);
4787
+ this._renderer = inject(Renderer2);
4788
+ this._ngZone = inject(NgZone);
4789
+ this._el = inject((ElementRef));
4790
+ this._resizeTracker = viewChild.required('resizeTracker');
4791
+ this._columnHandle = viewChild.required('columnHandle');
4792
+ this.commonStrings = this._commonStringsService.keys;
4793
+ this._minContentWidth = MIN_COLUMN_WIDTH;
4794
+ this._widthBeforeResize = 0;
4795
+ this._resizedBy = 0;
4796
+ this._isWithinMaxResizeRange = true;
4797
+ this._resizeStartedOnKeyDown = false;
4798
+ this._unlisteners = [];
4799
+ }
4800
+ ngAfterViewInit() {
4801
+ const handleEl = this._columnHandle().nativeElement;
4802
+ this._ngZone.runOutsideAngular(() => {
4803
+ this._unlisteners.push(this._renderer.listen(handleEl, 'pointerdown', (e) => this._onPointerDown(e)), this._renderer.listen(handleEl, 'keydown', (e) => {
4804
+ this._showTrackerOnFirstKeyDown(e);
4805
+ this._moveTrackerOnKeyDown(e);
4806
+ }), this._renderer.listen(handleEl, 'keyup', (e) => this._hideTrackerOnKeyUp(e)));
4807
+ });
4808
+ }
4809
+ ngOnDestroy() {
4810
+ this._unlisteners.forEach(fn => fn());
4811
+ }
4812
+ // --- Pointer-based drag ---
4813
+ _onPointerDown(event) {
4814
+ event.preventDefault();
4815
+ const handleEl = this._columnHandle().nativeElement;
4816
+ handleEl.setPointerCapture(event.pointerId);
4817
+ this._startResize();
4818
+ this._showTracker();
4819
+ const dragUnlisteners = [];
4820
+ const onMove = (e) => {
4821
+ this._calculateResize(e.clientX - event.clientX);
4822
+ this._moveTracker();
4823
+ };
4824
+ const onUp = () => {
4825
+ handleEl.releasePointerCapture(event.pointerId);
4826
+ this._hideTracker();
4827
+ this._endResize();
4828
+ dragUnlisteners.forEach(unlisten => unlisten());
4829
+ };
4830
+ dragUnlisteners.push(this._renderer.listen(handleEl, 'pointermove', onMove), this._renderer.listen(handleEl, 'pointerup', onUp), this._renderer.listen(handleEl, 'pointercancel', onUp));
4831
+ }
4832
+ // --- Keyboard-based resize ---
4833
+ _showTrackerOnFirstKeyDown(event) {
4834
+ if (!this._resizeStartedOnKeyDown && this._isArrowHorizontal(event)) {
4835
+ this._resizeStartedOnKeyDown = true;
4836
+ this._startResize();
4837
+ this._showTracker();
4838
+ }
4839
+ }
4840
+ _moveTrackerOnKeyDown(event) {
4841
+ if (event.key === 'ArrowLeft') {
4842
+ event.stopPropagation();
4843
+ this._calculateResize(this._resizedBy - KEYBOARD_RESIZE_LENGTH);
4844
+ this._moveTracker();
4845
+ }
4846
+ else if (event.key === 'ArrowRight') {
4847
+ event.stopPropagation();
4848
+ this._calculateResize(this._resizedBy + KEYBOARD_RESIZE_LENGTH);
4849
+ this._moveTracker();
4850
+ }
4851
+ }
4852
+ _hideTrackerOnKeyUp(event) {
4853
+ if (this._resizeStartedOnKeyDown && this._isArrowHorizontal(event)) {
4854
+ this._resizeStartedOnKeyDown = false;
4855
+ this._hideTracker();
4856
+ this._endResize();
4857
+ this._columnHandle().nativeElement.focus();
4858
+ }
4859
+ }
4860
+ // --- Resize calculation ---
4861
+ _startResize() {
4862
+ this._resizedBy = 0;
4863
+ this._isWithinMaxResizeRange = true;
4864
+ const columnEl = this._getColumnElement();
4865
+ this._widthBeforeResize = columnEl ? Math.round(columnEl.getBoundingClientRect().width) : 0;
4866
+ this._minContentWidth = this.measureMinContentWidth(columnEl);
4867
+ }
4868
+ _calculateResize(movedBy) {
4869
+ const maxShrink = this._widthBeforeResize - this._minContentWidth;
4870
+ if (movedBy < -maxShrink) {
4871
+ this._resizedBy = -maxShrink;
4872
+ this._isWithinMaxResizeRange = false;
4873
+ }
4874
+ else {
4875
+ this._resizedBy = movedBy;
4876
+ this._isWithinMaxResizeRange = true;
4877
+ }
4878
+ }
4879
+ _endResize() {
4880
+ const newWidth = Math.max(this._widthBeforeResize + this._resizedBy, this._minContentWidth);
4881
+ if (newWidth != this._widthBeforeResize) {
4882
+ this._ngZone.run(() => {
4883
+ this._columnState.changeWidth(this.columnId(), newWidth);
4884
+ });
4885
+ }
4886
+ }
4887
+ // --- Tracker visual ---
4888
+ _showTracker() {
4889
+ const trackerEl = this._resizeTracker().nativeElement;
4890
+ const tableHeight = this._getTableHeight();
4891
+ this._renderer.setStyle(trackerEl, 'height', tableHeight);
4892
+ this._renderer.setStyle(trackerEl, 'display', 'block');
4893
+ }
4894
+ _moveTracker() {
4895
+ const trackerEl = this._resizeTracker().nativeElement;
4896
+ this._renderer.setStyle(trackerEl, 'transform', `translateX(${this._resizedBy}px)`);
4897
+ if (this._isWithinMaxResizeRange) {
4898
+ this._renderer.removeClass(trackerEl, 'exceeded-max');
4899
+ }
4900
+ else {
4901
+ this._renderer.addClass(trackerEl, 'exceeded-max');
4902
+ }
4903
+ }
4904
+ _hideTracker() {
4905
+ const trackerEl = this._resizeTracker().nativeElement;
4906
+ this._renderer.setStyle(trackerEl, 'display', 'none');
4907
+ this._renderer.setStyle(trackerEl, 'transform', 'translateX(0px)');
4908
+ }
4909
+ // --- DOM helpers ---
4910
+ _getColumnElement() {
4911
+ return this._el.nativeElement.closest('.treetable-column');
4912
+ }
4913
+ _getTableHeight() {
4914
+ const grid = this._el.nativeElement.closest('.treetable-grid');
4915
+ return grid ? `${grid.clientHeight}px` : '100%';
4916
+ }
4917
+ _isArrowHorizontal(event) {
4918
+ return event.key === 'ArrowLeft' || event.key === 'ArrowRight';
4919
+ }
4920
+ /**
4921
+ * Measures the intrinsic `min-content` width (incl. padding & border, rounded
4922
+ * to whole pixels) of the given column by temporarily forcing `width: min-content`
4923
+ * directly on the element, then restoring the previous inline value.
4924
+ *
4925
+ * `.treetable-column` already declares `min-width: min-content`; forcing the
4926
+ * `width` collapses it so `getBoundingClientRect()` reports the min-content box.
4927
+ *
4928
+ * Falls back to (and is floored at) the MIN_COLUMN_WIDTH constant.
4929
+ */
4930
+ measureMinContentWidth(columnEl) {
4931
+ if (!columnEl) {
4932
+ return MIN_COLUMN_WIDTH;
4933
+ }
4934
+ const prevWidth = columnEl.style.width;
4935
+ const prevMaxWidth = columnEl.style.maxWidth;
4936
+ this._renderer.setStyle(columnEl, 'width', 'min-content');
4937
+ this._renderer.setStyle(columnEl, 'max-width', 'min-content');
4938
+ const measuredWidth = Math.round(columnEl.getBoundingClientRect().width);
4939
+ if (prevWidth || prevMaxWidth) {
4940
+ this._renderer.setStyle(columnEl, 'width', prevWidth);
4941
+ this._renderer.setStyle(columnEl, 'max-width', prevMaxWidth);
4942
+ }
4943
+ else {
4944
+ this._renderer.removeStyle(columnEl, 'width');
4945
+ this._renderer.removeStyle(columnEl, 'max-width');
4946
+ }
4947
+ return Number.isFinite(measuredWidth) && measuredWidth > 0
4948
+ ? Math.max(measuredWidth, MIN_COLUMN_WIDTH)
4949
+ : MIN_COLUMN_WIDTH;
4950
+ }
4951
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableColumnSeparator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4952
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.18", type: ClrTreetableColumnSeparator, isStandalone: false, selector: "clr-tt-column-separator", inputs: { columnId: { classPropertyName: "columnId", publicName: "columnId", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class.treetable-column-separator": "true" } }, viewQueries: [{ propertyName: "_resizeTracker", first: true, predicate: ["resizeTracker"], descendants: true, isSignal: true }, { propertyName: "_columnHandle", first: true, predicate: ["columnHandle"], descendants: true, isSignal: true }], ngImport: i0, template: `
4953
+ <button
4954
+ type="button"
4955
+ class="treetable-column-handle"
4956
+ [aria-label]="commonStrings.columnSeparatorAriaLabel"
4957
+ #columnHandle
4958
+ ></button>
4959
+ <span class="clr-sr-only">
4960
+ {{ commonStrings.columnSeparatorDescription }}
4961
+ </span>
4962
+ <div class="treetable-column-resize-tracker" #resizeTracker></div>
4963
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4964
+ }
4965
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableColumnSeparator, decorators: [{
4966
+ type: Component,
4967
+ args: [{
4968
+ selector: 'clr-tt-column-separator',
4969
+ template: `
4970
+ <button
4971
+ type="button"
4972
+ class="treetable-column-handle"
4973
+ [aria-label]="commonStrings.columnSeparatorAriaLabel"
4974
+ #columnHandle
4975
+ ></button>
4976
+ <span class="clr-sr-only">
4977
+ {{ commonStrings.columnSeparatorDescription }}
4978
+ </span>
4979
+ <div class="treetable-column-resize-tracker" #resizeTracker></div>
4980
+ `,
4981
+ host: {
4982
+ '[class.treetable-column-separator]': 'true',
4983
+ },
4984
+ changeDetection: ChangeDetectionStrategy.OnPush,
4985
+ standalone: false,
4986
+ }]
4987
+ }], propDecorators: { columnId: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnId", required: true }] }], _resizeTracker: [{ type: i0.ViewChild, args: ['resizeTracker', { isSignal: true }] }], _columnHandle: [{ type: i0.ViewChild, args: ['columnHandle', { isSignal: true }] }] } });
4988
+
4720
4989
  /*
4721
4990
  * Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.
4722
4991
  * This software is released under MIT license.
@@ -4746,6 +5015,8 @@ class ClrTreetableColumn {
4746
5015
  }, ...(ngDevMode ? [{ debugName: "_internalSortOrder" }] : /* istanbul ignore next */ []));
4747
5016
  this.clrTtSortOrder = input(ClrTreetableSortOrder.UNSORTED, ...(ngDevMode ? [{ debugName: "clrTtSortOrder" }] : /* istanbul ignore next */ []));
4748
5017
  this.clrTtSortOrderChange = outputFromObservable(toObservable(this._internalSortOrder));
5018
+ this.clrTtColumnSize = input(null, ...(ngDevMode ? [{ debugName: "clrTtColumnSize" }] : /* istanbul ignore next */ []));
5019
+ this.clrTtColumnResize = outputFromObservable(this._columnState.getColumnChangesById(this.columnId).pipe(filter$1(data => data.type === TreetableColumnUpdate.WIDTH), map$1(data => data.width)));
4749
5020
  this.isSortable = computed(() => !!this.clrTtSortBy(), ...(ngDevMode ? [{ debugName: "isSortable" }] : /* istanbul ignore next */ []));
4750
5021
  this.sortDirection = computed(() => {
4751
5022
  const order = this._internalSortOrder();
@@ -4800,6 +5071,12 @@ class ClrTreetableColumn {
4800
5071
  break;
4801
5072
  }
4802
5073
  });
5074
+ effect(() => {
5075
+ const size = this.clrTtColumnSize();
5076
+ if (size) {
5077
+ this._columnState.changeWidth(this.columnId, size);
5078
+ }
5079
+ });
4803
5080
  }
4804
5081
  sort(reverse) {
4805
5082
  const comparator = this.clrTtSortBy();
@@ -4809,7 +5086,7 @@ class ClrTreetableColumn {
4809
5086
  this._sort.toggle(comparator, reverse);
4810
5087
  }
4811
5088
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableColumn, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4812
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrTreetableColumn, isStandalone: false, selector: "clr-tt-column", inputs: { clrTtSortBy: { classPropertyName: "clrTtSortBy", publicName: "clrTtSortBy", isSignal: true, isRequired: false, transformFunction: null }, clrTtSortOrder: { classPropertyName: "clrTtSortOrder", publicName: "clrTtSortOrder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clrTtSortOrderChange: "clrTtSortOrderChange" }, host: { attributes: { "role": "columnheader" }, properties: { "class.treetable-column": "true", "attr.aria-sort": "ariaSort()" } }, providers: [ClrPopoverService], viewQueries: [{ propertyName: "_columnTitleRef", first: true, predicate: ["columnTitle"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: `
5089
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrTreetableColumn, isStandalone: false, selector: "clr-tt-column", inputs: { clrTtSortBy: { classPropertyName: "clrTtSortBy", publicName: "clrTtSortBy", isSignal: true, isRequired: false, transformFunction: null }, clrTtSortOrder: { classPropertyName: "clrTtSortOrder", publicName: "clrTtSortOrder", isSignal: true, isRequired: false, transformFunction: null }, clrTtColumnSize: { classPropertyName: "clrTtColumnSize", publicName: "clrTtColumnSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clrTtSortOrderChange: "clrTtSortOrderChange", clrTtColumnResize: "clrTtColumnResize" }, host: { attributes: { "role": "columnheader" }, properties: { "class.treetable-column": "true", "attr.aria-sort": "ariaSort()" } }, providers: [ClrPopoverService], viewQueries: [{ propertyName: "_columnTitleRef", first: true, predicate: ["columnTitle"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0, template: `
4813
5090
  @if (isSortable()) {
4814
5091
  <button type="button" class="treetable-column-title" data-testId="clrTtSortButton" (click)="sort()">
4815
5092
  <ng-container *ngTemplateOutlet="columnTitle" />
@@ -4831,10 +5108,12 @@ class ClrTreetableColumn {
4831
5108
 
4832
5109
  <ng-content select="clr-tt-filter, clr-tt-string-filter" />
4833
5110
 
5111
+ <clr-tt-column-separator [columnId]="columnId" />
5112
+
4834
5113
  <ng-template #columnTitle>
4835
5114
  <ng-content />
4836
5115
  </ng-template>
4837
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5116
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrTreetableColumnSeparator, selector: "clr-tt-column-separator", inputs: ["columnId"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4838
5117
  }
4839
5118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableColumn, decorators: [{
4840
5119
  type: Component,
@@ -4863,6 +5142,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
4863
5142
 
4864
5143
  <ng-content select="clr-tt-filter, clr-tt-string-filter" />
4865
5144
 
5145
+ <clr-tt-column-separator [columnId]="columnId" />
5146
+
4866
5147
  <ng-template #columnTitle>
4867
5148
  <ng-content />
4868
5149
  </ng-template>
@@ -4875,7 +5156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
4875
5156
  changeDetection: ChangeDetectionStrategy.OnPush,
4876
5157
  standalone: false,
4877
5158
  }]
4878
- }], ctorParameters: () => [], propDecorators: { _columnTitleRef: [{ type: i0.ViewChild, args: ['columnTitle', { ...{ read: TemplateRef }, isSignal: true }] }], clrTtSortBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSortBy", required: false }] }], clrTtSortOrder: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSortOrder", required: false }] }], clrTtSortOrderChange: [{ type: i0.Output, args: ["clrTtSortOrderChange"] }] } });
5159
+ }], ctorParameters: () => [], propDecorators: { _columnTitleRef: [{ type: i0.ViewChild, args: ['columnTitle', { ...{ read: TemplateRef }, isSignal: true }] }], clrTtSortBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSortBy", required: false }] }], clrTtSortOrder: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtSortOrder", required: false }] }], clrTtSortOrderChange: [{ type: i0.Output, args: ["clrTtSortOrderChange"] }], clrTtColumnSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtColumnSize", required: false }] }], clrTtColumnResize: [{ type: i0.Output, args: ["clrTtColumnResize"] }] } });
4879
5160
 
4880
5161
  let id = 0;
4881
5162
  class ClrTreetableColumnManagerMenuComponent {
@@ -5170,7 +5451,7 @@ class ClrTreetableHideableColumn {
5170
5451
  this._columnState = inject(TreetableColumnStateService);
5171
5452
  this._column = inject(ClrTreetableColumn);
5172
5453
  this.clrTtHideableColumn = input('', ...(ngDevMode ? [{ debugName: "clrTtHideableColumn" }] : /* istanbul ignore next */ []));
5173
- this.clrTtHiddenChange = output();
5454
+ this.clrTtHiddenChange = outputFromObservable(this._columnState.getColumnChangesById(this._column.columnId).pipe(filter$1(data => data.type === TreetableColumnUpdate.HIDDEN), map$1(data => data.hidden)));
5174
5455
  this.resolvedHidden = computed(() => {
5175
5456
  const value = this.clrTtHideableColumn();
5176
5457
  if (typeof value === 'string') {
@@ -5319,13 +5600,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
5319
5600
  }], propDecorators: { clrTtFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "clrTtFilter", required: true }] }] } });
5320
5601
 
5321
5602
  /*
5322
- * Copyright (c) 2018-2025 Porsche Informatik. All Rights Reserved.
5603
+ * Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.
5323
5604
  * This software is released under MIT license.
5324
5605
  * The full license information can be found in LICENSE in the root directory of this project.
5325
5606
  */
5326
5607
  class ClrTreetableCell {
5327
5608
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableCell, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5328
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: ClrTreetableCell, isStandalone: false, selector: "clr-tt-cell", host: { attributes: { "role": "cell" }, properties: { "class.treetable-cell": "true" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5609
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: ClrTreetableCell, isStandalone: false, selector: "clr-tt-cell", host: { attributes: { "role": "gridcell" }, properties: { "class.treetable-cell": "true" } }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5329
5610
  }
5330
5611
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrTreetableCell, decorators: [{
5331
5612
  type: Component,
@@ -5334,7 +5615,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
5334
5615
  template: '<ng-content></ng-content>',
5335
5616
  host: {
5336
5617
  '[class.treetable-cell]': 'true',
5337
- role: 'cell',
5618
+ role: 'gridcell',
5338
5619
  },
5339
5620
  standalone: false,
5340
5621
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -5371,11 +5652,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
5371
5652
  }]
5372
5653
  }] });
5373
5654
 
5374
- /**
5375
- * The CSS class to use to hide a column and its related cells in the treetable.
5376
- */
5377
- const HIDDEN_COLUMN_CSS_CLASS = 'treetable-hidden-column';
5378
-
5379
5655
  /*
5380
5656
  * Copyright (c) 2018-2026 Porsche Informatik. All Rights Reserved.
5381
5657
  * This software is released under MIT license.
@@ -5383,14 +5659,14 @@ const HIDDEN_COLUMN_CSS_CLASS = 'treetable-hidden-column';
5383
5659
  */
5384
5660
  class TreetableHeaderRenderer {
5385
5661
  constructor() {
5386
- this.elementRef = inject(ElementRef);
5662
+ this.elementRef = inject((ElementRef));
5387
5663
  this.renderer = inject(Renderer2);
5388
5664
  }
5389
5665
  /**
5390
5666
  * Returns the client width of the header cell.
5391
5667
  */
5392
5668
  getWidth() {
5393
- return this.elementRef.nativeElement.clientWidth;
5669
+ return this.elementRef.nativeElement.getBoundingClientRect().width;
5394
5670
  }
5395
5671
  hide() {
5396
5672
  this.renderer.addClass(this.elementRef.nativeElement, HIDDEN_COLUMN_CSS_CLASS);
@@ -5407,14 +5683,20 @@ class TreetableHeaderRenderer {
5407
5683
  getColumnClasses() {
5408
5684
  const classes = [];
5409
5685
  this.elementRef.nativeElement.classList.forEach((className) => {
5410
- if (className.indexOf('clr-col') !== -1) {
5686
+ if (className.includes(DEFAULT_COLUMN_CSS_CLASS)) {
5411
5687
  classes.push(className);
5412
5688
  }
5413
5689
  });
5414
5690
  return classes;
5415
5691
  }
5416
5692
  setDefaultColumnClass() {
5417
- this.renderer.addClass(this.elementRef.nativeElement, 'clr-col');
5693
+ this.renderer.addClass(this.elementRef.nativeElement, DEFAULT_COLUMN_CSS_CLASS);
5694
+ }
5695
+ setWidth(width) {
5696
+ const el = this.elementRef.nativeElement;
5697
+ this.renderer.setStyle(el, 'width', `${width}px`);
5698
+ this.renderer.setStyle(el, 'max-width', `${width}px`);
5699
+ this.renderer.setStyle(el, 'flex', '0 0 auto');
5418
5700
  }
5419
5701
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TreetableHeaderRenderer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5420
5702
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: TreetableHeaderRenderer, isStandalone: false, selector: "clr-tt-column", ngImport: i0 }); }
@@ -5434,7 +5716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
5434
5716
  */
5435
5717
  class TreetableCellRenderer {
5436
5718
  constructor() {
5437
- this.elementRef = inject(ElementRef);
5719
+ this.elementRef = inject((ElementRef));
5438
5720
  this.renderer = inject(Renderer2);
5439
5721
  }
5440
5722
  setColumnClasses(columnClasses) {
@@ -5454,6 +5736,12 @@ class TreetableCellRenderer {
5454
5736
  setMaxWidth(maxWidth) {
5455
5737
  this.renderer.setStyle(this.elementRef.nativeElement, 'max-width', maxWidth + 'px');
5456
5738
  }
5739
+ setWidth(width) {
5740
+ const el = this.elementRef.nativeElement;
5741
+ this.renderer.setStyle(el, 'width', `${width}px`);
5742
+ this.renderer.setStyle(el, 'max-width', `${width}px`);
5743
+ this.renderer.setStyle(el, 'flex', '0 0 auto');
5744
+ }
5457
5745
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: TreetableCellRenderer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
5458
5746
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.18", type: TreetableCellRenderer, isStandalone: false, selector: "clr-tt-cell", ngImport: i0 }); }
5459
5747
  }
@@ -5498,12 +5786,13 @@ class TreetableMainRenderer {
5498
5786
  this.columns = contentChildren(ClrTreetableColumn, ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
5499
5787
  this.rules = [
5500
5788
  this.createClassesRule(),
5501
- this.createFirstColumnWidthRule(),
5789
+ this.createColumnResizeWidthRule(),
5790
+ this.createColumnCellWidthRule(),
5502
5791
  this.createDisplayRule(),
5503
5792
  ];
5504
5793
  fromEvent(window, 'resize')
5505
5794
  .pipe(debounceTime(200), takeUntilDestroyed())
5506
- .subscribe(() => this.renderRuleByKey('first-column-width', this.headers(), this.rows()));
5795
+ .subscribe(() => this.renderRuleByKey('column-cell-width', this.headers(), this.rows()));
5507
5796
  afterRenderEffect(() => {
5508
5797
  const headers = this.headers();
5509
5798
  const rows = this.rows();
@@ -5516,13 +5805,13 @@ class TreetableMainRenderer {
5516
5805
  const rows = this.rows();
5517
5806
  switch (event) {
5518
5807
  case TreetableColumnUpdate.HIDDEN:
5519
- this.renderRulesByKeys(['display', 'first-column-width'], headers, rows);
5808
+ this.renderRulesByKeys(['display', 'column-cell-width'], headers, rows);
5520
5809
  break;
5521
5810
  case TreetableColumnUpdate.RESET_HIDDEN:
5522
5811
  this.renderAllRules(headers, rows); // resetHidden etc.
5523
5812
  break;
5524
5813
  case TreetableColumnUpdate.WIDTH:
5525
- this.renderRuleByKey('first-column-width', headers, rows);
5814
+ this.renderRulesByKeys(['column-cell-width', 'column-resize-width'], headers, rows);
5526
5815
  break;
5527
5816
  default:
5528
5817
  this.renderAllRules(headers, rows);
@@ -5613,14 +5902,11 @@ class TreetableMainRenderer {
5613
5902
  },
5614
5903
  };
5615
5904
  }
5616
- createFirstColumnWidthRule() {
5905
+ createColumnCellWidthRule() {
5617
5906
  return {
5618
- key: 'first-column-width',
5907
+ key: 'column-cell-width',
5619
5908
  layoutPhase: 'stable',
5620
5909
  prepareData: ctx => {
5621
- if (!ctx.isFirstVisible || !ctx.header) {
5622
- return null;
5623
- }
5624
5910
  return { width: ctx.header.getWidth() };
5625
5911
  },
5626
5912
  applyCell: (cell, data) => {
@@ -5628,6 +5914,24 @@ class TreetableMainRenderer {
5628
5914
  },
5629
5915
  };
5630
5916
  }
5917
+ createColumnResizeWidthRule() {
5918
+ return {
5919
+ key: 'column-resize-width',
5920
+ layoutPhase: 'unstable',
5921
+ prepareData: ctx => {
5922
+ if (!ctx.state?.width) {
5923
+ return null;
5924
+ }
5925
+ return { width: ctx.state.width };
5926
+ },
5927
+ applyHeader: (header, data) => {
5928
+ header.setWidth(data.width);
5929
+ },
5930
+ applyCell: (cell, data) => {
5931
+ cell.setWidth(data.width);
5932
+ },
5933
+ };
5934
+ }
5631
5935
  createDisplayRule() {
5632
5936
  return {
5633
5937
  key: 'display',
@@ -5858,7 +6162,8 @@ class ClrTreetableModule {
5858
6162
  ClrTreetableFilter,
5859
6163
  ClrTreetableStringFilter, ClrTreetableRecursiveRows,
5860
6164
  ClrTreetableRowCheckbox,
5861
- ClrTreetableColumnManagerMenuComponent], imports: [CommonModule, ClarityModule, ReactiveFormsModule, FormsModule, CdkTrapFocusModule], exports: [ClrTreetable,
6165
+ ClrTreetableColumnManagerMenuComponent,
6166
+ ClrTreetableColumnSeparator], imports: [CommonModule, ClarityModule, ReactiveFormsModule, FormsModule, CdkTrapFocusModule], exports: [ClrTreetable,
5862
6167
  ClrTreetableRow,
5863
6168
  ClrTreetableCell,
5864
6169
  ClrTreetableColumn,
@@ -5884,6 +6189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
5884
6189
  ClrTreetableRecursiveRows,
5885
6190
  ClrTreetableRowCheckbox,
5886
6191
  ClrTreetableColumnManagerMenuComponent,
6192
+ ClrTreetableColumnSeparator,
5887
6193
  ],
5888
6194
  exports: [CLR_TREETABLE_DIRECTIVES],
5889
6195
  }]
@@ -6414,7 +6720,7 @@ class ClrHistoryHttpImplService {
6414
6720
  }
6415
6721
  return url;
6416
6722
  }
6417
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrHistoryHttpImplService, deps: [{ token: HISTORY_NOTIFICATION_URL_PROVIDER }, { token: i1$4.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
6723
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrHistoryHttpImplService, deps: [{ token: HISTORY_NOTIFICATION_URL_PROVIDER }, { token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
6418
6724
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrHistoryHttpImplService }); }
6419
6725
  }
6420
6726
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrHistoryHttpImplService, decorators: [{
@@ -6422,7 +6728,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
6422
6728
  }], ctorParameters: () => [{ type: undefined, decorators: [{
6423
6729
  type: Inject,
6424
6730
  args: [HISTORY_NOTIFICATION_URL_PROVIDER]
6425
- }] }, { type: i1$4.HttpClient }] });
6731
+ }] }, { type: i1$3.HttpClient }] });
6426
6732
 
6427
6733
  /*
6428
6734
  * Copyright (c) 2018-2025 Porsche Informatik. All Rights Reserved.
@@ -16879,7 +17185,7 @@ class ClrCopyToClipboard {
16879
17185
  });
16880
17186
  }
16881
17187
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrCopyToClipboard, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
16882
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.18", type: ClrCopyToClipboard, isStandalone: true, selector: "clr-copy-to-clipboard", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, tooltipText: { classPropertyName: "tooltipText", publicName: "tooltipText", isSignal: true, isRequired: false, transformFunction: null }, hiddenUntilHovered: { classPropertyName: "hiddenUntilHovered", publicName: "hiddenUntilHovered", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hidden-until-hovered": "hiddenUntilHovered()", "class.parent-hovered": "parentHovered" } }, ngImport: i0, template: "<clr-tooltip>\n <cds-icon\n clrTooltipTrigger\n class=\"copy-to-clipboard-icon\"\n [cdkCopyToClipboard]=\"trimmedValue()\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\"\n [shape]=\"showCopiedIcon ? 'success-standard' : 'copy-to-clipboard'\"\n [ngClass]=\"{ 'attribute-was-copied-color': showCopiedIcon }\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\"\n ></cds-icon>\n <clr-tooltip-content\n class=\"clr-tooltip-fit-content\"\n [clrSize]=\"tooltipSize\"\n [clrPosition]=\"tooltipPosition\"\n *clrIfOpen\n >{{ tooltipText() }}</clr-tooltip-content\n >\n</clr-tooltip>\n", styles: [":host,.tooltip{display:flex;align-items:center}.copy-to-clipboard-icon{cursor:pointer;color:var(--cds-alias-status-disabled-tint)!important}.copy-to-clipboard-icon:hover{color:var(--cds-alias-typography-link-color)!important}.attribute-was-copied-color{color:var(--cds-alias-status-success)!important}:host(.hidden-until-hovered){visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease}:host(.hidden-until-hovered.parent-hovered),:host(.hidden-until-hovered:focus-within){visibility:visible;opacity:1}.copy-to-clipboard-parent{display:flex;flex-direction:row;align-items:center;gap:.25rem}\n"], dependencies: [{ kind: "directive", type: CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "ngmodule", type: ClrTooltipModule }, { kind: "component", type: i1$5.ClrTooltip, selector: "clr-tooltip" }, { kind: "directive", type: i1$5.ClrTooltipTrigger, selector: "[clrTooltipTrigger]" }, { kind: "component", type: i1$5.ClrTooltipContent, selector: "clr-tooltip-content", inputs: ["id", "clrPosition", "clrSize"] }, { kind: "directive", type: i2$3.ClrIfOpen, selector: "[clrIfOpen]", inputs: ["clrIfOpen"], outputs: ["clrIfOpenChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.18", type: ClrCopyToClipboard, isStandalone: true, selector: "clr-copy-to-clipboard", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, tooltipText: { classPropertyName: "tooltipText", publicName: "tooltipText", isSignal: true, isRequired: false, transformFunction: null }, hiddenUntilHovered: { classPropertyName: "hiddenUntilHovered", publicName: "hiddenUntilHovered", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.hidden-until-hovered": "hiddenUntilHovered()", "class.parent-hovered": "parentHovered" } }, ngImport: i0, template: "<clr-tooltip>\n <cds-icon\n clrTooltipTrigger\n class=\"copy-to-clipboard-icon\"\n [cdkCopyToClipboard]=\"trimmedValue()\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\"\n [shape]=\"showCopiedIcon ? 'success-standard' : 'copy-to-clipboard'\"\n [ngClass]=\"{ 'attribute-was-copied-color': showCopiedIcon }\"\n (click)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\"\n ></cds-icon>\n <clr-tooltip-content\n class=\"clr-tooltip-fit-content\"\n [clrSize]=\"tooltipSize\"\n [clrPosition]=\"tooltipPosition\"\n *clrIfOpen\n >{{ tooltipText() }}</clr-tooltip-content\n >\n</clr-tooltip>\n", styles: [":host,.tooltip{display:flex;align-items:center}.copy-to-clipboard-icon{cursor:pointer;color:var(--cds-alias-status-disabled-tint)!important}.copy-to-clipboard-icon:hover{color:var(--cds-alias-typography-link-color)!important}.attribute-was-copied-color{color:var(--cds-alias-status-success)!important}:host(.hidden-until-hovered){visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease}:host(.hidden-until-hovered.parent-hovered),:host(.hidden-until-hovered:focus-within){visibility:visible;opacity:1}.copy-to-clipboard-parent{display:flex;flex-direction:row;align-items:center;gap:.25rem}\n"], dependencies: [{ kind: "directive", type: CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "ngmodule", type: ClrTooltipModule }, { kind: "component", type: i1$4.ClrTooltip, selector: "clr-tooltip" }, { kind: "directive", type: i1$4.ClrTooltipTrigger, selector: "[clrTooltipTrigger]" }, { kind: "component", type: i1$4.ClrTooltipContent, selector: "clr-tooltip-content", inputs: ["id", "clrPosition", "clrSize"] }, { kind: "directive", type: i2$3.ClrIfOpen, selector: "[clrIfOpen]", inputs: ["clrIfOpen"], outputs: ["clrIfOpenChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
16883
17189
  }
16884
17190
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrCopyToClipboard, decorators: [{
16885
17191
  type: Component,
@@ -17135,7 +17441,7 @@ class ClrSummaryItemValue {
17135
17441
  return false;
17136
17442
  }
17137
17443
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrSummaryItemValue, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17138
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrSummaryItemValue, isStandalone: true, selector: "clr-summary-item-value", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.has-icon": "this.hasIcon", "class.has-text": "this.hasText", "class.hidden": "this.isHidden" } }, providers: [provideAnimations()], viewQueries: [{ propertyName: "projectedContent", first: true, predicate: ["projectedContent"], descendants: true }, { propertyName: "valueElement", first: true, predicate: ["valueElement"], descendants: true }], ngImport: i0, template: "@if (icon() !== undefined && icon() !== null && icon() !== '') { @if (href()) { @if (tooltip()) {\n<clr-tooltip>\n <a clrTooltipTrigger class=\"value-icon-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n <cds-icon [shape]=\"icon()\" class=\"value-icon value-link\"></cds-icon>\n </a>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<a class=\"value-icon-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n <cds-icon [shape]=\"icon()\" class=\"value-icon value-link\"></cds-icon>\n</a>\n} } @else if (hasClickHandler) { @if (tooltip()) {\n<clr-tooltip>\n <cds-icon\n clrTooltipTrigger\n [shape]=\"icon()\"\n class=\"value-icon value-link\"\n tabindex=\"0\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n ></cds-icon>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<cds-icon\n [shape]=\"icon()\"\n class=\"value-icon value-link\"\n tabindex=\"0\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n></cds-icon>\n} } @else { @if (tooltip()) {\n<clr-tooltip>\n <cds-icon clrTooltipTrigger [shape]=\"icon()\" class=\"value-icon value-icon-neutral\"></cds-icon>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<cds-icon [shape]=\"icon()\" class=\"value-icon value-icon-neutral\"></cds-icon>\n} } } @else if (value() !== undefined && value() !== null && value() !== '') { @if (href()) { @if (effectiveTooltip) {\n<clr-tooltip>\n <a\n #valueElement\n class=\"value value-link\"\n clrTooltipTrigger\n [href]=\"href()\"\n [attr.target]=\"target() ?? null\"\n (click)=\"handleClick()\"\n >\n {{ value() }}\n </a>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<a #valueElement class=\"value value-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n {{ value() }}\n</a>\n} } @else if (hasClickHandler) {\n<clr-tooltip>\n <span\n #valueElement\n class=\"value value-link\"\n clrTooltipTrigger\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n >\n {{ value() }}\n </span>\n @if (effectiveTooltip) {\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n }\n</clr-tooltip>\n} @else if(effectiveTooltip) {\n<clr-tooltip>\n <span #valueElement class=\"value\" clrTooltipTrigger>{{ value() }}</span>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<span #valueElement class=\"value\">{{ value() }}</span>\n} } @else {\n<span class=\"projected-wrapper\" #projectedContent>\n <ng-content></ng-content>\n</span>\n}\n", styles: [":host{display:inline-flex;flex-direction:row;align-items:center;gap:.25rem;flex:0 1 auto;max-width:100%;min-width:0;overflow:visible}:host.hidden{display:none}:host(.has-icon){flex:0 0 auto;width:auto}.value,.value-link,.projected-wrapper,clr-tooltip [clrTooltipTrigger]{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}cds-icon{flex-shrink:0}.value-icon-link{display:inline-flex;align-items:center;text-decoration:none;cursor:pointer}.value-icon-link cds-icon{color:var(--cds-alias-typography-link-color)}.value-icon-link:hover cds-icon,.value-icon-link:focus cds-icon{color:var(--cds-alias-typography-link-color-hover)}.value-icon-link:visited cds-icon{color:var(--cds-alias-typography-link-color-visited)}.value-icon{height:20px;width:20px}.value-icon-neutral{color:var(--cds-alias-status-neutral)}.value-link,.edit-link{color:var(--cds-alias-typography-link-color);text-decoration:underline;cursor:pointer}.value-link:visited,.edit-link:visited{color:var(--cds-alias-typography-link-color-visited)}.value-link:hover,.value-link:focus,.edit-link:hover,.edit-link:focus{color:var(--cds-alias-typography-link-color-hover);text-decoration:underline}.value{display:inline-block}clr-tooltip{display:inline-flex;flex:1 1 auto;min-width:0;overflow:visible}clr-tooltip [clrTooltipTrigger]{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep clr-tooltip-content{overflow-wrap:break-word;word-wrap:break-word;hyphens:auto}::ng-deep .tooltip-content{overflow-wrap:break-word;word-wrap:break-word;hyphens:auto}:host(.error){color:var(--cds-alias-status-danger)}:host(.error) cds-icon{color:var(--cds-alias-status-danger)!important}:host(.error) .value{color:var(--cds-alias-status-danger)}:host(.warning){color:var(--cds-alias-status-warning)}:host(.warning) cds-icon{color:var(--cds-alias-status-warning)!important}:host(.warning) .value{color:var(--cds-alias-status-warning)}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: ClarityModule }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i2$3.ClrIfOpen, selector: "[clrIfOpen]", inputs: ["clrIfOpen"], outputs: ["clrIfOpenChange"] }, { kind: "component", type: i1$5.ClrTooltip, selector: "clr-tooltip" }, { kind: "directive", type: i1$5.ClrTooltipTrigger, selector: "[clrTooltipTrigger]" }, { kind: "component", type: i1$5.ClrTooltipContent, selector: "clr-tooltip-content", inputs: ["id", "clrPosition", "clrSize"] }] }); }
17444
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrSummaryItemValue, isStandalone: true, selector: "clr-summary-item-value", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.has-icon": "this.hasIcon", "class.has-text": "this.hasText", "class.hidden": "this.isHidden" } }, providers: [provideAnimations()], viewQueries: [{ propertyName: "projectedContent", first: true, predicate: ["projectedContent"], descendants: true }, { propertyName: "valueElement", first: true, predicate: ["valueElement"], descendants: true }], ngImport: i0, template: "@if (icon() !== undefined && icon() !== null && icon() !== '') { @if (href()) { @if (tooltip()) {\n<clr-tooltip>\n <a clrTooltipTrigger class=\"value-icon-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n <cds-icon [shape]=\"icon()\" class=\"value-icon value-link\"></cds-icon>\n </a>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<a class=\"value-icon-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n <cds-icon [shape]=\"icon()\" class=\"value-icon value-link\"></cds-icon>\n</a>\n} } @else if (hasClickHandler) { @if (tooltip()) {\n<clr-tooltip>\n <cds-icon\n clrTooltipTrigger\n [shape]=\"icon()\"\n class=\"value-icon value-link\"\n tabindex=\"0\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n ></cds-icon>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<cds-icon\n [shape]=\"icon()\"\n class=\"value-icon value-link\"\n tabindex=\"0\"\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n></cds-icon>\n} } @else { @if (tooltip()) {\n<clr-tooltip>\n <cds-icon clrTooltipTrigger [shape]=\"icon()\" class=\"value-icon value-icon-neutral\"></cds-icon>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ tooltip() }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<cds-icon [shape]=\"icon()\" class=\"value-icon value-icon-neutral\"></cds-icon>\n} } } @else if (value() !== undefined && value() !== null && value() !== '') { @if (href()) { @if (effectiveTooltip) {\n<clr-tooltip>\n <a\n #valueElement\n class=\"value value-link\"\n clrTooltipTrigger\n [href]=\"href()\"\n [attr.target]=\"target() ?? null\"\n (click)=\"handleClick()\"\n >\n {{ value() }}\n </a>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<a #valueElement class=\"value value-link\" [href]=\"href()\" [attr.target]=\"target() ?? null\" (click)=\"handleClick()\">\n {{ value() }}\n</a>\n} } @else if (hasClickHandler) {\n<clr-tooltip>\n <span\n #valueElement\n class=\"value value-link\"\n clrTooltipTrigger\n (click)=\"handleClick()\"\n (keydown.enter)=\"handleClick()\"\n >\n {{ value() }}\n </span>\n @if (effectiveTooltip) {\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n }\n</clr-tooltip>\n} @else if(effectiveTooltip) {\n<clr-tooltip>\n <span #valueElement class=\"value\" clrTooltipTrigger>{{ value() }}</span>\n <clr-tooltip-content [clrSize]=\"tooltipSize\" [clrPosition]=\"tooltipPosition\" *clrIfOpen>\n {{ effectiveTooltip }}</clr-tooltip-content\n >\n</clr-tooltip>\n} @else {\n<span #valueElement class=\"value\">{{ value() }}</span>\n} } @else {\n<span class=\"projected-wrapper\" #projectedContent>\n <ng-content></ng-content>\n</span>\n}\n", styles: [":host{display:inline-flex;flex-direction:row;align-items:center;gap:.25rem;flex:0 1 auto;max-width:100%;min-width:0;overflow:visible}:host.hidden{display:none}:host(.has-icon){flex:0 0 auto;width:auto}.value,.value-link,.projected-wrapper,clr-tooltip [clrTooltipTrigger]{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}cds-icon{flex-shrink:0}.value-icon-link{display:inline-flex;align-items:center;text-decoration:none;cursor:pointer}.value-icon-link cds-icon{color:var(--cds-alias-typography-link-color)}.value-icon-link:hover cds-icon,.value-icon-link:focus cds-icon{color:var(--cds-alias-typography-link-color-hover)}.value-icon-link:visited cds-icon{color:var(--cds-alias-typography-link-color-visited)}.value-icon{height:20px;width:20px}.value-icon-neutral{color:var(--cds-alias-status-neutral)}.value-link,.edit-link{color:var(--cds-alias-typography-link-color);text-decoration:underline;cursor:pointer}.value-link:visited,.edit-link:visited{color:var(--cds-alias-typography-link-color-visited)}.value-link:hover,.value-link:focus,.edit-link:hover,.edit-link:focus{color:var(--cds-alias-typography-link-color-hover);text-decoration:underline}.value{display:inline-block}clr-tooltip{display:inline-flex;flex:1 1 auto;min-width:0;overflow:visible}clr-tooltip [clrTooltipTrigger]{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep clr-tooltip-content{overflow-wrap:break-word;word-wrap:break-word;hyphens:auto}::ng-deep .tooltip-content{overflow-wrap:break-word;word-wrap:break-word;hyphens:auto}:host(.error){color:var(--cds-alias-status-danger)}:host(.error) cds-icon{color:var(--cds-alias-status-danger)!important}:host(.error) .value{color:var(--cds-alias-status-danger)}:host(.warning){color:var(--cds-alias-status-warning)}:host(.warning) cds-icon{color:var(--cds-alias-status-warning)!important}:host(.warning) .value{color:var(--cds-alias-status-warning)}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: ClarityModule }, { kind: "component", type: i2.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i2$3.ClrIfOpen, selector: "[clrIfOpen]", inputs: ["clrIfOpen"], outputs: ["clrIfOpenChange"] }, { kind: "component", type: i1$4.ClrTooltip, selector: "clr-tooltip" }, { kind: "directive", type: i1$4.ClrTooltipTrigger, selector: "[clrTooltipTrigger]" }, { kind: "component", type: i1$4.ClrTooltipContent, selector: "clr-tooltip-content", inputs: ["id", "clrPosition", "clrSize"] }] }); }
17139
17445
  }
17140
17446
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrSummaryItemValue, decorators: [{
17141
17447
  type: Component,
@@ -17761,7 +18067,7 @@ class ClrSummaryArea {
17761
18067
  }
17762
18068
  }
17763
18069
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrSummaryArea, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
17764
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrSummaryArea, isStandalone: true, selector: "clr-summary-area", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "items", predicate: ClrSummaryItem, descendants: true }], viewQueries: [{ propertyName: "panelsRef", first: true, predicate: ["panelsRef"], descendants: true, static: true }], ngImport: i0, template: "<div\n #panelsRef\n class=\"summary-area-panels\"\n [class.is-active]=\"!isCollapsed()\"\n [class.loading-active]=\"hasLoading\"\n [style.height]=\"panelHeight\"\n>\n <div\n class=\"summary-area-panel summary-area-panel--state\"\n [class.is-active]=\"!isCollapsed() && (hasLoading || hasError || hasWarning)\"\n [class.is-error]=\"hasError\"\n [class.is-warning]=\"hasWarning\"\n [style.--rows]=\"currentRows()\"\n [attr.aria-hidden]=\"isCollapsed() || !(hasLoading || hasError || hasWarning) ? 'true' : 'false'\"\n [attr.inert]=\"isCollapsed() || !(hasLoading || hasError || hasWarning) ? '' : null\"\n >\n <div class=\"summary-area-panel__body\">\n <div\n class=\"summary-area-loading\"\n [class.is-visible]=\"loadingVisible\"\n [attr.aria-hidden]=\"!hasLoading\"\n [style.height]=\"loadingPanelHeight\"\n >\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span class=\"loading-text\">{{ loadingText }}</span>\n </div>\n @if (hasError) {\n <div class=\"summary-area-alert\">\n <clr-alert [clrAlertLightweight]=\"true\" [clrAlertType]=\"'danger'\">\n <clr-alert-item>\n @if (errorLinkText && errorClick) {\n <span class=\"alert-text\">{{ errorText }}</span>\n <span class=\"alert-action\" (click)=\"errorClick()\" (keydown.enter)=\"errorClick()\">{{ errorLinkText }}</span>\n } @else if (errorClick) {\n <span class=\"alert-action\" (click)=\"errorClick()\" (keydown.enter)=\"errorClick()\">{{ errorText }}</span>\n } @else {\n <span class=\"alert-text\">{{ errorText }}</span>\n }\n </clr-alert-item>\n </clr-alert>\n </div>\n } @else if (hasWarning) {\n <div class=\"summary-area-alert\">\n <clr-alert [clrAlertLightweight]=\"true\" [clrAlertType]=\"'warning'\">\n <clr-alert-item>\n @if (warningLinkText && warningClick) {\n <span class=\"alert-text\">{{ warningText }}</span>\n <span class=\"alert-action\" (click)=\"warningClick()\" (keydown.enter)=\"warningClick()\">\n {{ warningLinkText }}\n </span>\n } @else if (warningClick) {\n <span class=\"alert-action\" (click)=\"warningClick()\" (keydown.enter)=\"warningClick()\"\n >{{ warningText }}</span\n >\n } @else {\n <span class=\"alert-text\">{{ warningText }}</span>\n }\n </clr-alert-item>\n </clr-alert>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"summary-area-panel summary-area-panel--grid\"\n [class.is-active]=\"!isCollapsed() && !hasError && !hasWarning && !hasLoading\"\n [attr.aria-hidden]=\"isCollapsed() || hasError || hasWarning || hasLoading ? 'true' : 'false'\"\n [attr.inert]=\"isCollapsed() || hasError || hasWarning || hasLoading ? '' : null\"\n >\n <div class=\"summary-area-panel__body\">\n <div class=\"summary-area-container\">\n <div class=\"summary-grid\" [style.--columns]=\"currentColumns\" [style.--rows]=\"currentRows()\">\n @for (item of visibleItems; track item) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".summary-area-container,.summary-area-alert{margin:0 24px 9px;max-width:100%;overflow-x:auto}.summary-grid{display:grid;grid-template-columns:repeat(var(--columns),minmax(0,320px));grid-template-rows:repeat(var(--rows),auto);grid-auto-flow:column;max-width:100%;column-gap:36px;row-gap:6px;padding:3px 0}.summary-item{max-width:320px;min-width:0;height:20px;overflow:visible;display:flex;flex-direction:column}clr-alert-item{display:flex;align-items:center;gap:.5rem;flex-wrap:nowrap}clr-alert-item .alert-text{flex:none;width:auto;white-space:nowrap;align-self:flex-start}clr-alert-item .alert-action{white-space:nowrap}.alert-action{color:var(--cds-alias-typography-link-color)!important;cursor:pointer}.alert-action:visited{color:var(--cds-alias-typography-link-color-visited)}.alert-action:hover,.alert-action:focus{color:var(--cds-alias-typography-link-color-hover)}clr-alert ::ng-deep>.alert-lightweight{padding-left:0;padding-right:0}.summary-area-panels{position:relative;height:0;opacity:0;transform-origin:top center;pointer-events:none;visibility:hidden;overflow:hidden;margin:0 0 9px;transition:height .3s cubic-bezier(.4,0,.2,1),opacity .4s ease-in-out,visibility .4s ease-in-out}.summary-area-panels.is-active{opacity:1;pointer-events:auto;visibility:visible;overflow:visible;transition:height .3s cubic-bezier(.4,0,.2,1),opacity .4s ease-in-out,visibility .4s ease-in-out}.summary-area-panels.loading-active{display:flex;align-items:center;justify-content:center;opacity:1;transition:opacity .4s ease-in-out}.summary-area-panel{transform-origin:top center;opacity:0;pointer-events:none;transition:opacity .4s ease-in-out;position:absolute;top:0;left:0;right:0}.summary-area-panel__body{will-change:opacity}.summary-area-panel.is-active{opacity:1;pointer-events:auto;position:relative;transition:opacity .4s ease-in-out}.summary-area-panel.is-active .summary-area-panel__body{overflow:visible}.summary-area-loading{display:flex;align-items:center;justify-content:center;gap:.75rem;margin:0 24px;padding:3px 0;opacity:0;transition:opacity 0s ease-in-out}.summary-area-loading.is-visible{opacity:1;transition:opacity .4s ease-in-out}.summary-area-loading .loading-text{color:var(--cds-alias-typography-color-300)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ClarityModule }, { kind: "component", type: i2$4.ClrAlert, selector: "clr-alert", inputs: ["clrAlertSizeSmall", "clrAlertClosable", "clrAlertAppLevel", "clrCloseButtonAriaLabel", "clrAlertLightweight", "clrAlertType", "clrAlertIcon", "clrAlertClosed"], outputs: ["clrAlertClosedChange"] }, { kind: "component", type: i2$4.ClrAlertItem, selector: "clr-alert-item" }, { kind: "directive", type: i2$4.ClrAlertText, selector: ".alert-text" }, { kind: "component", type: i1$3.ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }] }); }
18070
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: ClrSummaryArea, isStandalone: true, selector: "clr-summary-area", inputs: { rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, warning: { classPropertyName: "warning", publicName: "warning", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "items", predicate: ClrSummaryItem, descendants: true }], viewQueries: [{ propertyName: "panelsRef", first: true, predicate: ["panelsRef"], descendants: true, static: true }], ngImport: i0, template: "<div\n #panelsRef\n class=\"summary-area-panels\"\n [class.is-active]=\"!isCollapsed()\"\n [class.loading-active]=\"hasLoading\"\n [style.height]=\"panelHeight\"\n>\n <div\n class=\"summary-area-panel summary-area-panel--state\"\n [class.is-active]=\"!isCollapsed() && (hasLoading || hasError || hasWarning)\"\n [class.is-error]=\"hasError\"\n [class.is-warning]=\"hasWarning\"\n [style.--rows]=\"currentRows()\"\n [attr.aria-hidden]=\"isCollapsed() || !(hasLoading || hasError || hasWarning) ? 'true' : 'false'\"\n [attr.inert]=\"isCollapsed() || !(hasLoading || hasError || hasWarning) ? '' : null\"\n >\n <div class=\"summary-area-panel__body\">\n <div\n class=\"summary-area-loading\"\n [class.is-visible]=\"loadingVisible\"\n [attr.aria-hidden]=\"!hasLoading\"\n [style.height]=\"loadingPanelHeight\"\n >\n <clr-spinner [clrMedium]=\"true\"></clr-spinner>\n <span class=\"loading-text\">{{ loadingText }}</span>\n </div>\n @if (hasError) {\n <div class=\"summary-area-alert\">\n <clr-alert [clrAlertLightweight]=\"true\" [clrAlertType]=\"'danger'\">\n <clr-alert-item>\n @if (errorLinkText && errorClick) {\n <span class=\"alert-text\">{{ errorText }}</span>\n <span class=\"alert-action\" (click)=\"errorClick()\" (keydown.enter)=\"errorClick()\">{{ errorLinkText }}</span>\n } @else if (errorClick) {\n <span class=\"alert-action\" (click)=\"errorClick()\" (keydown.enter)=\"errorClick()\">{{ errorText }}</span>\n } @else {\n <span class=\"alert-text\">{{ errorText }}</span>\n }\n </clr-alert-item>\n </clr-alert>\n </div>\n } @else if (hasWarning) {\n <div class=\"summary-area-alert\">\n <clr-alert [clrAlertLightweight]=\"true\" [clrAlertType]=\"'warning'\">\n <clr-alert-item>\n @if (warningLinkText && warningClick) {\n <span class=\"alert-text\">{{ warningText }}</span>\n <span class=\"alert-action\" (click)=\"warningClick()\" (keydown.enter)=\"warningClick()\">\n {{ warningLinkText }}\n </span>\n } @else if (warningClick) {\n <span class=\"alert-action\" (click)=\"warningClick()\" (keydown.enter)=\"warningClick()\"\n >{{ warningText }}</span\n >\n } @else {\n <span class=\"alert-text\">{{ warningText }}</span>\n }\n </clr-alert-item>\n </clr-alert>\n </div>\n }\n </div>\n </div>\n\n <div\n class=\"summary-area-panel summary-area-panel--grid\"\n [class.is-active]=\"!isCollapsed() && !hasError && !hasWarning && !hasLoading\"\n [attr.aria-hidden]=\"isCollapsed() || hasError || hasWarning || hasLoading ? 'true' : 'false'\"\n [attr.inert]=\"isCollapsed() || hasError || hasWarning || hasLoading ? '' : null\"\n >\n <div class=\"summary-area-panel__body\">\n <div class=\"summary-area-container\">\n <div class=\"summary-grid\" [style.--columns]=\"currentColumns\" [style.--rows]=\"currentRows()\">\n @for (item of visibleItems; track item) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".summary-area-container,.summary-area-alert{margin:0 24px 9px;max-width:100%;overflow-x:auto}.summary-grid{display:grid;grid-template-columns:repeat(var(--columns),minmax(0,320px));grid-template-rows:repeat(var(--rows),auto);grid-auto-flow:column;max-width:100%;column-gap:36px;row-gap:6px;padding:3px 0}.summary-item{max-width:320px;min-width:0;height:20px;overflow:visible;display:flex;flex-direction:column}clr-alert-item{display:flex;align-items:center;gap:.5rem;flex-wrap:nowrap}clr-alert-item .alert-text{flex:none;width:auto;white-space:nowrap;align-self:flex-start}clr-alert-item .alert-action{white-space:nowrap}.alert-action{color:var(--cds-alias-typography-link-color)!important;cursor:pointer}.alert-action:visited{color:var(--cds-alias-typography-link-color-visited)}.alert-action:hover,.alert-action:focus{color:var(--cds-alias-typography-link-color-hover)}clr-alert ::ng-deep>.alert-lightweight{padding-left:0;padding-right:0}.summary-area-panels{position:relative;height:0;opacity:0;transform-origin:top center;pointer-events:none;visibility:hidden;overflow:hidden;margin:0 0 9px;transition:height .3s cubic-bezier(.4,0,.2,1),opacity .4s ease-in-out,visibility .4s ease-in-out}.summary-area-panels.is-active{opacity:1;pointer-events:auto;visibility:visible;overflow:visible;transition:height .3s cubic-bezier(.4,0,.2,1),opacity .4s ease-in-out,visibility .4s ease-in-out}.summary-area-panels.loading-active{display:flex;align-items:center;justify-content:center;opacity:1;transition:opacity .4s ease-in-out}.summary-area-panel{transform-origin:top center;opacity:0;pointer-events:none;transition:opacity .4s ease-in-out;position:absolute;top:0;left:0;right:0}.summary-area-panel__body{will-change:opacity}.summary-area-panel.is-active{opacity:1;pointer-events:auto;position:relative;transition:opacity .4s ease-in-out}.summary-area-panel.is-active .summary-area-panel__body{overflow:visible}.summary-area-loading{display:flex;align-items:center;justify-content:center;gap:.75rem;margin:0 24px;padding:3px 0;opacity:0;transition:opacity 0s ease-in-out}.summary-area-loading.is-visible{opacity:1;transition:opacity .4s ease-in-out}.summary-area-loading .loading-text{color:var(--cds-alias-typography-color-300)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ClarityModule }, { kind: "component", type: i2$4.ClrAlert, selector: "clr-alert", inputs: ["clrAlertSizeSmall", "clrAlertClosable", "clrAlertAppLevel", "clrCloseButtonAriaLabel", "clrAlertLightweight", "clrAlertType", "clrAlertIcon", "clrAlertClosed"], outputs: ["clrAlertClosedChange"] }, { kind: "component", type: i2$4.ClrAlertItem, selector: "clr-alert-item" }, { kind: "directive", type: i2$4.ClrAlertText, selector: ".alert-text" }, { kind: "component", type: i2$5.ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }] }); }
17765
18071
  }
17766
18072
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: ClrSummaryArea, decorators: [{
17767
18073
  type: Component,