@clr/angular 17.8.1 → 17.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/clarity.api.md +100 -50
  2. package/data/datagrid/datagrid-row.d.ts +6 -4
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +9 -2
  4. package/data/datagrid/datagrid.d.ts +11 -3
  5. package/data/datagrid/index.d.ts +1 -0
  6. package/data/datagrid/interfaces/key-nav-grid-strategy.interface.d.ts +11 -0
  7. package/data/datagrid/interfaces/virtual-scroll-data-range.interface.d.ts +5 -0
  8. package/data/datagrid/providers/items.d.ts +1 -0
  9. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +1 -16
  10. package/data/datagrid/utils/key-navigation-strategies/default.d.ts +15 -0
  11. package/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.d.ts +14 -0
  12. package/data/datagrid/utils/key-navigation-strategies/expanded-row.d.ts +14 -0
  13. package/data/datagrid/utils/key-navigation-utils.d.ts +22 -0
  14. package/data/tree-view/tree-node.d.ts +0 -1
  15. package/esm2020/data/datagrid/datagrid-column.mjs +8 -12
  16. package/esm2020/data/datagrid/datagrid-row.mjs +30 -10
  17. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +45 -10
  18. package/esm2020/data/datagrid/datagrid.mjs +48 -17
  19. package/esm2020/data/datagrid/index.mjs +2 -1
  20. package/esm2020/data/datagrid/interfaces/key-nav-grid-strategy.interface.mjs +8 -0
  21. package/esm2020/data/datagrid/interfaces/virtual-scroll-data-range.interface.mjs +8 -0
  22. package/esm2020/data/datagrid/providers/items.mjs +5 -1
  23. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +18 -243
  24. package/esm2020/data/datagrid/utils/key-navigation-strategies/default.mjs +132 -0
  25. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.mjs +132 -0
  26. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-row.mjs +168 -0
  27. package/esm2020/data/datagrid/utils/key-navigation-utils.mjs +108 -0
  28. package/esm2020/data/tree-view/tree-node.mjs +3 -6
  29. package/esm2020/forms/checkbox/checkbox.mjs +5 -2
  30. package/esm2020/forms/number-input/number-input.module.mjs +3 -3
  31. package/esm2020/layout/breadcrumbs/breadcrumbs.mjs +2 -2
  32. package/esm2020/modal/modal.mjs +7 -4
  33. package/esm2020/popover/common/popover.mjs +2 -2
  34. package/esm2020/utils/animations/constants.mjs +7 -1
  35. package/esm2020/utils/animations/expandable-animation/base-expandable-animation.mjs +38 -0
  36. package/esm2020/utils/animations/expandable-animation/expandable-animation.directive.mjs +56 -0
  37. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +10 -32
  38. package/esm2020/utils/animations/expandable-animation/expandable-animation.module.mjs +3 -2
  39. package/esm2020/utils/animations/expandable-animation/index.mjs +4 -2
  40. package/esm2020/utils/focus/focusable-item/basic-focusable-item.service.mjs +2 -2
  41. package/esm2020/wizard/wizard.mjs +29 -6
  42. package/fesm2015/clr-angular.mjs +915 -426
  43. package/fesm2015/clr-angular.mjs.map +1 -1
  44. package/fesm2020/clr-angular.mjs +936 -445
  45. package/fesm2020/clr-angular.mjs.map +1 -1
  46. package/modal/modal.d.ts +3 -2
  47. package/package.json +2 -2
  48. package/utils/animations/constants.d.ts +1 -0
  49. package/utils/animations/expandable-animation/base-expandable-animation.d.ts +13 -0
  50. package/utils/animations/expandable-animation/expandable-animation.d.ts +2 -6
  51. package/utils/animations/expandable-animation/expandable-animation.directive.d.ts +16 -0
  52. package/utils/animations/expandable-animation/expandable-animation.module.d.ts +3 -2
  53. package/utils/animations/expandable-animation/index.d.ts +1 -0
  54. package/wizard/wizard.d.ts +12 -2
@@ -1,19 +1,20 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, forwardRef, Attribute, TemplateRef, ViewContainerRef, LOCALE_ID, inject, Injector, VERSION, EnvironmentInjector, IterableDiffers } from '@angular/core';
2
+ import { Directive, NgModule, Optional, Input, Injectable, Component, ChangeDetectionStrategy, EventEmitter, SkipSelf, HostBinding, Output, ContentChildren, PLATFORM_ID, Inject, ViewChild, HostListener, Renderer2, InjectionToken, ElementRef, NgZone, ChangeDetectorRef, ContentChild, ComponentFactoryResolver, KeyValueDiffers, Self, forwardRef, Attribute, TemplateRef, ViewContainerRef, LOCALE_ID, inject, Injector, VERSION, EnvironmentInjector, IterableDiffers, ViewChildren } from '@angular/core';
3
3
  import * as i5 from '@angular/common';
4
4
  import { CommonModule, isPlatformBrowser, DOCUMENT, NgForOf, getLocaleDayNames, FormStyle, TranslationWidth, getLocaleMonthNames, getLocaleFirstDayOfWeek, getLocaleDateFormat, FormatWidth } from '@angular/common';
5
- import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, infoCircleIcon, timesIcon, angleDoubleIcon, eventIcon, calendarIcon, folderOpenIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, stepForward2Icon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
5
+ import { ClarityIcons, angleIcon, exclamationCircleIcon, checkCircleIcon, ellipsisHorizontalIcon, windowCloseIcon, infoCircleIcon, timesIcon, angleDoubleIcon, eventIcon, calendarIcon, folderOpenIcon, minusIcon, plusIcon, eyeHideIcon, eyeIcon, ellipsisVerticalIcon, viewColumnsIcon, arrowIcon, stepForward2Icon, filterGridCircleIcon, filterGridIcon, errorStandardIcon, helpIcon, infoStandardIcon, noteIcon, successStandardIcon, warningStandardIcon, circleIcon, dotCircleIcon } from '@cds/core/icon';
6
6
  import { map, tap, startWith, distinctUntilChanged, filter, skipUntil, debounceTime, takeUntil, take, first, switchMap as switchMap$1 } from 'rxjs/operators';
7
7
  import * as i3 from 'rxjs';
8
8
  import { Subject, BehaviorSubject, Observable, fromEvent, isObservable, of, shareReplay, combineLatest, startWith as startWith$1, switchMap, merge, map as map$1, EMPTY, ReplaySubject, tap as tap$1 } from 'rxjs';
9
- import { trigger, transition, style, animate, state, keyframes } from '@angular/animations';
9
+ import * as i2 from '@angular/animations';
10
+ import { animation, style, animate, trigger, transition, state, useAnimation, keyframes } from '@angular/animations';
10
11
  import * as i1 from '@angular/forms';
11
12
  import { FormControl, FormGroup, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, SelectMultipleControlValueAccessor } from '@angular/forms';
12
13
  import * as i1$1 from '@angular/router';
13
14
  import { RouterModule } from '@angular/router';
14
15
  import * as i1$2 from '@angular/cdk/a11y';
15
16
  import { CdkTrapFocus } from '@angular/cdk/a11y';
16
- import * as i2 from '@angular/cdk/drag-drop';
17
+ import * as i2$1 from '@angular/cdk/drag-drop';
17
18
  import { CdkDrag, CDK_DROP_LIST, CDK_DRAG_CONFIG } from '@angular/cdk/drag-drop';
18
19
  import * as i1$3 from '@angular/cdk/bidi';
19
20
  import { Directionality } from '@angular/cdk/bidi';
@@ -233,6 +234,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
233
234
  * The full license information can be found in LICENSE in the root directory of this project.
234
235
  */
235
236
  const defaultAnimationTiming = '0.2s ease-in-out';
237
+ const defaultExpandAnimation = animation([style({ height: '{{ startHeight }}px' }), animate(defaultAnimationTiming, style({ height: '*' }))], {
238
+ params: {
239
+ startHeight: 0, // default
240
+ },
241
+ });
236
242
 
237
243
  /*
238
244
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -3104,54 +3110,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3104
3110
  * This software is released under MIT license.
3105
3111
  * The full license information can be found in LICENSE in the root directory of this project.
3106
3112
  */
3107
- class ClrExpandableAnimation {
3113
+ class BaseExpandableAnimation {
3108
3114
  constructor(element, domAdapter, renderer) {
3109
3115
  this.element = element;
3110
3116
  this.domAdapter = domAdapter;
3111
3117
  this.renderer = renderer;
3112
- this.clrExpandTrigger = false;
3113
3118
  this.startHeight = 0;
3114
3119
  }
3120
+ updateStartHeight() {
3121
+ this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3122
+ }
3123
+ initAnimationEffects() {
3124
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3125
+ }
3126
+ cleanupAnimationEffects(cancelAnimations = false) {
3127
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3128
+ // A "safe" auto-update of the height ensuring basic OOTB user experience .
3129
+ // Prone to small jumps in initial animation height if data was changed in the meantime, the window was resized, etc.
3130
+ // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3131
+ this.updateStartHeight();
3132
+ if (cancelAnimations) {
3133
+ this.cancelElementAnimations();
3134
+ }
3135
+ }
3136
+ cancelElementAnimations() {
3137
+ this.element.nativeElement.getAnimations().forEach(animation => {
3138
+ if (animation.playState === 'finished') {
3139
+ animation.cancel(); // clears animation-style set on the element
3140
+ }
3141
+ });
3142
+ }
3143
+ }
3144
+
3145
+ /*
3146
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3147
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3148
+ * This software is released under MIT license.
3149
+ * The full license information can be found in LICENSE in the root directory of this project.
3150
+ */
3151
+ class ClrExpandableAnimation extends BaseExpandableAnimation {
3152
+ constructor(element, domAdapter, renderer) {
3153
+ super(element, domAdapter, renderer);
3154
+ this.clrExpandTrigger = false;
3155
+ }
3115
3156
  get expandAnimation() {
3116
3157
  return { value: this.clrExpandTrigger, params: { startHeight: this.startHeight } };
3117
3158
  }
3118
3159
  animationStart(event) {
3119
3160
  if (event.fromState !== 'void') {
3120
- this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3161
+ this.initAnimationEffects();
3121
3162
  }
3122
3163
  }
3123
3164
  animationDone(event) {
3124
3165
  if (event.fromState !== 'void') {
3125
- this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3126
- // A "safe" auto-update of the height ensuring basic OOTB user experience .
3127
- // Prone to small jumps in initial animation height if data was changed in the meantime, window was resized, etc.
3128
- // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3129
- this.updateStartHeight();
3166
+ this.cleanupAnimationEffects();
3130
3167
  }
3131
3168
  }
3132
- updateStartHeight() {
3133
- this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3134
- }
3135
3169
  }
3136
3170
  ClrExpandableAnimation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, deps: [{ token: i0.ElementRef }, { token: DomAdapter }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
3137
- ClrExpandableAnimation.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: { clrExpandTrigger: "clrExpandTrigger" }, host: { listeners: { "@expandAnimation.start": "animationStart($event)", "@expandAnimation.done": "animationDone($event)" }, properties: { "@expandAnimation": "this.expandAnimation" } }, providers: [DomAdapter], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:block}\n"], animations: [
3138
- trigger('expandAnimation', [
3139
- transition('true <=> false', [
3140
- style({ height: '{{startHeight}}px' }),
3141
- animate('0.2s ease-in-out', style({ height: '*' })),
3142
- ]),
3143
- ]),
3144
- ] });
3171
+ ClrExpandableAnimation.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: { clrExpandTrigger: "clrExpandTrigger" }, host: { listeners: { "@expandAnimation.start": "animationStart($event)", "@expandAnimation.done": "animationDone($event)" }, properties: { "@expandAnimation": "this.expandAnimation" } }, providers: [DomAdapter], usesInheritance: true, ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, styles: [":host{display:block}\n"], animations: [trigger('expandAnimation', [transition('true <=> false', [useAnimation(defaultExpandAnimation)])])] });
3145
3172
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, decorators: [{
3146
3173
  type: Component,
3147
- args: [{ selector: 'clr-expandable-animation', template: `<ng-content></ng-content>`, animations: [
3148
- trigger('expandAnimation', [
3149
- transition('true <=> false', [
3150
- style({ height: '{{startHeight}}px' }),
3151
- animate('0.2s ease-in-out', style({ height: '*' })),
3152
- ]),
3153
- ]),
3154
- ], providers: [DomAdapter], styles: [":host{display:block}\n"] }]
3174
+ args: [{ selector: 'clr-expandable-animation', template: `<ng-content></ng-content>`, animations: [trigger('expandAnimation', [transition('true <=> false', [useAnimation(defaultExpandAnimation)])])], providers: [DomAdapter], styles: [":host{display:block}\n"] }]
3155
3175
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }]; }, propDecorators: { clrExpandTrigger: [{
3156
3176
  type: Input
3157
3177
  }], expandAnimation: [{
@@ -3171,7 +3191,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3171
3191
  * This software is released under MIT license.
3172
3192
  * The full license information can be found in LICENSE in the root directory of this project.
3173
3193
  */
3174
- const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation];
3194
+ class ClrExpandableAnimationDirective extends BaseExpandableAnimation {
3195
+ constructor(element, domAdapter, renderer, builder) {
3196
+ super(element, domAdapter, renderer);
3197
+ this.builder = builder;
3198
+ this.expanded = false;
3199
+ }
3200
+ ngOnChanges(changes) {
3201
+ if (changes['expanded'] && !changes['expanded'].firstChange) {
3202
+ Promise.resolve().then(() => this.playAnimation());
3203
+ }
3204
+ }
3205
+ ngOnDestroy() {
3206
+ this.player?.destroy();
3207
+ }
3208
+ playAnimation() {
3209
+ if (this.player) {
3210
+ this.player.destroy();
3211
+ }
3212
+ this.player = this.builder
3213
+ .build([useAnimation(defaultExpandAnimation, { params: { startHeight: this.startHeight } })])
3214
+ .create(this.element.nativeElement);
3215
+ this.player.onStart(() => this.initAnimationEffects());
3216
+ this.player.onDone(() => this.cleanupAnimationEffects(true));
3217
+ this.player.play();
3218
+ }
3219
+ }
3220
+ ClrExpandableAnimationDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, deps: [{ token: i0.ElementRef }, { token: DomAdapter }, { token: i0.Renderer2 }, { token: i2.AnimationBuilder }], target: i0.ɵɵFactoryTarget.Directive });
3221
+ ClrExpandableAnimationDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrExpandableAnimationDirective, selector: "[clrExpandableAnimation]", inputs: { expanded: ["clrExpandableAnimation", "expanded"] }, host: { properties: { "class.clr-expandable-animation": "true" } }, providers: [DomAdapter], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
3222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, decorators: [{
3223
+ type: Directive,
3224
+ args: [{
3225
+ selector: '[clrExpandableAnimation]',
3226
+ providers: [DomAdapter],
3227
+ host: {
3228
+ '[class.clr-expandable-animation]': 'true',
3229
+ },
3230
+ }]
3231
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }, { type: i2.AnimationBuilder }]; }, propDecorators: { expanded: [{
3232
+ type: Input,
3233
+ args: ['clrExpandableAnimation']
3234
+ }] } });
3235
+
3236
+ /*
3237
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3238
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3239
+ * This software is released under MIT license.
3240
+ * The full license information can be found in LICENSE in the root directory of this project.
3241
+ */
3242
+ const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation, ClrExpandableAnimationDirective];
3175
3243
 
3176
3244
  /*
3177
3245
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -5167,7 +5235,7 @@ class Popover {
5167
5235
  this._scroll = new Subject();
5168
5236
  const anchor = e;
5169
5237
  let current = e;
5170
- while (current && current !== document) {
5238
+ while (current && current !== document && current.nodeType === Node.ELEMENT_NODE) {
5171
5239
  if (this.scrolls(current)) {
5172
5240
  current.addEventListener('scroll', this.boundOnScrollListener);
5173
5241
  this.scrollableElements.push(current);
@@ -5494,7 +5562,7 @@ class BasicFocusableItem {
5494
5562
  if (isPlatformBrowser(this.platformId)) {
5495
5563
  this.renderer.setAttribute(this.el.nativeElement, 'tabindex', '0');
5496
5564
  this.el.nativeElement.focus();
5497
- this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });
5565
+ this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
5498
5566
  }
5499
5567
  }
5500
5568
  blur() {
@@ -7546,11 +7614,14 @@ class ClrCheckbox extends WrappedFormControl {
7546
7614
  }
7547
7615
  }
7548
7616
  ClrCheckbox.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCheckbox, deps: [{ token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1.NgControl, optional: true, self: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: 'clrToggle', attribute: true }], target: i0.ɵɵFactoryTarget.Directive });
7549
- ClrCheckbox.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]", usesInheritance: true, ngImport: i0 });
7617
+ ClrCheckbox.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrCheckbox, selector: "[clrCheckbox],[clrToggle]", host: { properties: { "attr.role": "toggle !== null ? \"switch\" : null" } }, usesInheritance: true, ngImport: i0 });
7550
7618
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCheckbox, decorators: [{
7551
7619
  type: Directive,
7552
7620
  args: [{
7553
7621
  selector: '[clrCheckbox],[clrToggle]',
7622
+ host: {
7623
+ '[attr.role]': 'toggle !== null ? "switch" : null',
7624
+ },
7554
7625
  }]
7555
7626
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
7556
7627
  type: Self
@@ -9962,14 +10033,14 @@ class ClrBreadcrumbs {
9962
10033
  }
9963
10034
  }
9964
10035
  ClrBreadcrumbs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, deps: [{ token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
9965
- ClrBreadcrumbs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrBreadcrumbs, selector: "clr-breadcrumbs", inputs: { items: "items" }, outputs: { clrBreadcrumbItemClick: "clrBreadcrumbItemClick" }, host: { properties: { "attr.aria-label": "commonStrings.keys.breadcrumbsLabel", "attr.role": "\"navigation\"" }, classAttribute: "clr-breadcrumb" }, ngImport: i0, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ClrBreadcrumbItem, selector: "clr-breadcrumb-item" }, { kind: "pipe", type: i5.SlicePipe, name: "slice" }] });
10036
+ ClrBreadcrumbs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrBreadcrumbs, selector: "clr-breadcrumbs", inputs: { items: "items" }, outputs: { clrBreadcrumbItemClick: "clrBreadcrumbItemClick" }, host: { properties: { "attr.aria-label": "commonStrings.keys.breadcrumbsLabel", "attr.role": "\"navigation\"" }, classAttribute: "clr-breadcrumb" }, ngImport: i0, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited{color:var(--clr-link-color)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited:hover{color:var(--clr-link-hover-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ClrBreadcrumbItem, selector: "clr-breadcrumb-item" }, { kind: "pipe", type: i5.SlicePipe, name: "slice" }] });
9966
10037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, decorators: [{
9967
10038
  type: Component,
9968
10039
  args: [{ selector: 'clr-breadcrumbs', host: {
9969
10040
  class: 'clr-breadcrumb',
9970
10041
  '[attr.aria-label]': 'commonStrings.keys.breadcrumbsLabel',
9971
10042
  '[attr.role]': '"navigation"',
9972
- }, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"] }]
10043
+ }, template: "<div *ngIf=\"items?.length\" role=\"list\" class=\"clr-breadcrumb-menu\">\n <clr-breadcrumb-item *ngIf=\"items.length > max && !isExpanded\">\n <button\n [attr.aria-label]=\"commonStrings.keys.expandBreadcrumbsLabel\"\n class=\"btn btn-link btn-sm clr-breadcrumb-expand\"\n (click)=\"expand()\"\n (keydown)=\"expand()\"\n >\n <cds-icon shape=\"ellipsis-horizontal\"></cds-icon>\n </button>\n </clr-breadcrumb-item>\n <clr-breadcrumb-item *ngFor=\"let breadcrumb of items | slice: -limit : items.length; let isLastItem=last\">\n <span *ngIf=\"isLastItem; else breadcrumbLinks\" aria-current=\"page\">{{ breadcrumb.label }}</span>\n\n <ng-template #breadcrumbLinks>\n <a\n *ngIf=\"breadcrumb.routerLink\"\n [routerLink]=\"breadcrumb.routerLink\"\n [queryParams]=\"breadcrumb.queryParams\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n <a\n *ngIf=\"breadcrumb.href\"\n [href]=\"breadcrumb.href\"\n [target]=\"breadcrumb.target || '_self'\"\n (click)=\"handleItemClick(breadcrumb)\"\n >\n {{ breadcrumb.label }}\n </a>\n </ng-template>\n </clr-breadcrumb-item>\n</div>\n", styles: [":root [cds-theme]{--clr-breadcrumb-item-space: var(--cds-global-space-5)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;font-size:var(--cds-alias-typography-secondary-font-size);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--cds-alias-typography-secondary-line-height);letter-spacing:var(--cds-alias-typography-secondary-letter-spacing)}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center;line-height:var(--cds-global-space-9)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited{color:var(--clr-link-color)}.clr-breadcrumb-menu .clr-breadcrumb-item a:visited:hover{color:var(--clr-link-hover-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space);color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-item:last-child{color:var(--cds-alias-typography-color-400)}.clr-breadcrumb-menu .clr-breadcrumb-expand{margin:0;padding:0;gap:0;min-width:-moz-fit-content;min-width:fit-content}\n"] }]
9973
10044
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { items: [{
9974
10045
  type: Input
9975
10046
  }], clrBreadcrumbItemClick: [{
@@ -16189,7 +16260,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16189
16260
  */
16190
16261
  class ClrNumberInputModule {
16191
16262
  constructor() {
16192
- ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon);
16263
+ ClarityIcons.addIcons(exclamationCircleIcon, checkCircleIcon, minusIcon, plusIcon);
16193
16264
  }
16194
16265
  }
16195
16266
  ClrNumberInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -17177,7 +17248,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17177
17248
  class ClrExpandableAnimationModule {
17178
17249
  }
17179
17250
  ClrExpandableAnimationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17180
- ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation], imports: [CommonModule], exports: [ClrExpandableAnimation] });
17251
+ ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation, ClrExpandableAnimationDirective], imports: [CommonModule], exports: [ClrExpandableAnimation, ClrExpandableAnimationDirective] });
17181
17252
  ClrExpandableAnimationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, imports: [CommonModule] });
17182
17253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, decorators: [{
17183
17254
  type: NgModule,
@@ -17201,7 +17272,7 @@ class CdkDragModule_CdkDrag extends CdkDrag {
17201
17272
  super(elementRef, dropContainer, document, ngZone, viewContainerRef, config, dir, dragDrop, changeDetectorRef);
17202
17273
  }
17203
17274
  }
17204
- CdkDragModule_CdkDrag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, deps: [{ token: i0.ElementRef }, { token: CDK_DROP_LIST, optional: true }, { token: DOCUMENT, optional: true }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: CDK_DRAG_CONFIG, optional: true }, { token: i1$3.Directionality }, { token: i2.DragDrop }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
17275
+ CdkDragModule_CdkDrag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, deps: [{ token: i0.ElementRef }, { token: CDK_DROP_LIST, optional: true }, { token: DOCUMENT, optional: true }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: CDK_DRAG_CONFIG, optional: true }, { token: i1$3.Directionality }, { token: i2$1.DragDrop }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
17205
17276
  CdkDragModule_CdkDrag.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: CdkDragModule_CdkDrag, selector: "[cdkDrag]", usesInheritance: true, ngImport: i0 });
17206
17277
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, decorators: [{
17207
17278
  type: Directive,
@@ -17223,7 +17294,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17223
17294
  }, {
17224
17295
  type: Inject,
17225
17296
  args: [CDK_DRAG_CONFIG]
17226
- }] }, { type: i1$3.Directionality }, { type: i2.DragDrop }, { type: i0.ChangeDetectorRef }]; } });
17297
+ }] }, { type: i1$3.Directionality }, { type: i2$1.DragDrop }, { type: i0.ChangeDetectorRef }]; } });
17227
17298
  /**
17228
17299
  * This module allows us to avoid importing all of CdkDragDropModule which results in a smaller application bundle.
17229
17300
  */
@@ -17668,330 +17739,451 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17668
17739
  * This software is released under MIT license.
17669
17740
  * The full license information can be found in LICENSE in the root directory of this project.
17670
17741
  */
17671
- const actionableItemSelectors = [
17672
- 'a[href]',
17673
- 'area[href]',
17674
- 'input:not([disabled])',
17675
- 'button:not([disabled])',
17676
- 'select:not([disabled])',
17677
- 'textarea:not([disabled])',
17678
- 'iframe',
17679
- 'object',
17680
- 'embed',
17681
- '[contenteditable=true]',
17682
- '[role=button]:not([disabled])',
17683
- ];
17684
- function getTabbableItems(el) {
17685
- const tabbableItemSelectors = [...actionableItemSelectors, '[tabindex="0"]:not([disabled])'];
17686
- const tabbableSelector = tabbableItemSelectors.join(',');
17687
- return Array.from(el.querySelectorAll(tabbableSelector));
17688
- }
17689
- function isActionableItem(el) {
17690
- const actionableSelector = actionableItemSelectors.join(',');
17691
- return el.matches(actionableSelector);
17692
- }
17693
- class KeyNavigationGridController {
17694
- constructor(zone) {
17695
- this.zone = zone;
17696
- this.skipItemFocus = false;
17697
- this.listenersAdded = false;
17698
- this.destroy$ = new Subject();
17699
- this._activeCell = null;
17700
- this.config = {
17701
- keyGridRows: '[role=row]:not(.datagrid-placeholder):not([style*="display: none"])',
17702
- keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
17703
- keyGrid: '[role=grid]',
17704
- };
17705
- }
17706
- get grid() {
17707
- return this.host?.querySelector(this.config.keyGrid);
17708
- }
17709
- get rows() {
17710
- return this.host?.querySelectorAll(this.config.keyGridRows);
17711
- }
17712
- get cells() {
17713
- return this.host?.querySelectorAll(this.config.keyGridCells);
17714
- }
17715
- ngOnDestroy() {
17716
- this.destroy$.next();
17717
- this.destroy$.complete();
17718
- }
17719
- addListeners() {
17720
- if (this.listenersAdded) {
17721
- return;
17722
- }
17723
- this.zone.runOutsideAngular(() => {
17724
- fromEvent(this.grid, 'mousedown')
17725
- .pipe(takeUntil(this.destroy$))
17726
- .subscribe((e) => {
17727
- // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
17728
- if (e.buttons === 1 && !e.ctrlKey) {
17729
- const activeCell = this.cells
17730
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
17731
- : null;
17732
- if (activeCell) {
17733
- this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
17734
- }
17735
- }
17736
- });
17737
- fromEvent(this.grid, 'wheel')
17738
- .pipe(takeUntil(this.destroy$))
17739
- .subscribe(() => {
17740
- this.removeActiveCell();
17741
- });
17742
- fromEvent(this.grid, 'focusout')
17743
- .pipe(debounceTime(0), takeUntil(this.destroy$))
17744
- .subscribe(() => {
17745
- if (this.grid.contains(document.activeElement)) {
17746
- return;
17747
- }
17748
- this.removeActiveCell();
17749
- });
17750
- fromEvent(this.grid, 'keydown')
17751
- .pipe(takeUntil(this.destroy$))
17752
- .subscribe((e) => {
17753
- // Skip column resize events
17754
- if (e.target.classList.contains('drag-handle') &&
17755
- (e.key === Keys.ArrowLeft || e.key === Keys.ArrowRight)) {
17756
- return;
17757
- }
17758
- if (e.key === Keys.ArrowUp ||
17759
- e.key === Keys.ArrowDown ||
17760
- e.key === Keys.ArrowLeft ||
17761
- e.key === Keys.ArrowRight ||
17762
- e.key === Keys.End ||
17763
- e.key === Keys.Home ||
17764
- e.key === Keys.PageUp ||
17765
- e.key === Keys.PageDown) {
17766
- const currentCellCoords = this.getCurrentCellCoordinates();
17767
- const nextCellCoords = this.isExpandedRow(currentCellCoords.y) || this.isDetailsRow(currentCellCoords.y)
17768
- ? this.getNextForExpandedRowCoordinate(e, currentCellCoords)
17769
- : this.getNextItemCoordinate(e, currentCellCoords);
17770
- const activeItem = this.rows
17771
- ? Array.from(this.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
17772
- : null;
17773
- if (activeItem) {
17774
- this.setActiveCell(activeItem);
17775
- }
17776
- e.preventDefault();
17777
- }
17778
- });
17779
- });
17780
- this.listenersAdded = true;
17781
- }
17782
- initializeKeyGrid(host) {
17783
- this.host = host;
17784
- this.addListeners();
17785
- this.resetKeyGrid();
17786
- }
17787
- resetKeyGrid() {
17788
- this.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
17789
- const firstCell = this.cells ? this.cells[0] : null;
17790
- firstCell?.setAttribute('tabindex', '0');
17791
- }
17792
- removeActiveCell() {
17793
- this._activeCell = null;
17794
- }
17795
- getActiveCell() {
17796
- return this._activeCell;
17797
- }
17798
- setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
17799
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
17800
- if (prior) {
17801
- prior.setAttribute('tabindex', '-1');
17802
- }
17803
- activeCell.setAttribute('tabindex', '0');
17804
- this._activeCell = activeCell;
17805
- if (!this.skipItemFocus && !keepFocus) {
17806
- let elementToFocus;
17807
- if (activeCell.getAttribute('role') === 'columnheader') {
17808
- elementToFocus = activeCell;
17809
- }
17810
- else {
17811
- const tabbableElements = getTabbableItems(activeCell);
17812
- elementToFocus = tabbableElements.length ? tabbableElements[0] : activeCell;
17813
- }
17814
- elementToFocus.focus();
17815
- }
17742
+ class DefaultKeyNavigationStrategy {
17743
+ constructor(utils) {
17744
+ this.utils = utils;
17816
17745
  }
17817
- getNextForExpandedRowCoordinate(e, currentCellCoords) {
17818
- if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
17819
- return this.getNextItemCoordinate(e, currentCellCoords);
17746
+ keyUp(currentCellCoords) {
17747
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17748
+ if (currentCellCoords.y === 0) {
17749
+ return nextCellCoords;
17820
17750
  }
17821
- if (!this.isDetailsRow(currentCellCoords.y) &&
17822
- !this.isRowReplaced(currentCellCoords.y) &&
17823
- (e.key === Keys.Home || e.key === Keys.End || e.key === Keys.ArrowRight || e.key === Keys.ArrowLeft)) {
17824
- return this.getNextItemCoordinate(e, currentCellCoords);
17751
+ nextCellCoords.y = currentCellCoords.y - 1;
17752
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17753
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y) &&
17754
+ !isActionCell &&
17755
+ this.utils.isDetailsRow(nextCellCoords.y)) {
17756
+ nextCellCoords.x = 0;
17825
17757
  }
17826
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17827
- const isSingleCellExpandedRow = this.isSingleCellExpandedRow(currentCellCoords.y);
17828
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17829
- nextCellCoords.y = currentCellCoords.y - 1;
17830
- if (isSingleCellExpandedRow && !isActionCell) {
17831
- if (this.isRowReplaced(currentCellCoords.y)) {
17832
- nextCellCoords.y = nextCellCoords.y - 1;
17833
- }
17834
- if (this.isDetailsRow(nextCellCoords.y)) {
17835
- nextCellCoords.x = 0;
17836
- }
17837
- else if (this.isDetailsRow(currentCellCoords.y) === false) {
17838
- // false check is intentional, the ! operator may be missed easily in this case
17839
- nextCellCoords.x = currentCellCoords.x;
17840
- }
17841
- else {
17842
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
17843
- }
17844
- return nextCellCoords;
17845
- }
17846
- if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17758
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
17759
+ if (isActionCell) {
17847
17760
  nextCellCoords.y = nextCellCoords.y - 1;
17848
17761
  }
17849
- else if (this.isRowReplaced(nextCellCoords.y)) {
17850
- nextCellCoords.y = nextCellCoords.y - 1;
17851
- if (!this.isDetailsRow(nextCellCoords.y)) {
17852
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17853
- }
17854
- }
17855
- else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
17856
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17857
- }
17858
- else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17859
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
17860
- }
17861
- }
17862
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
17863
- nextCellCoords.y = currentCellCoords.y + 1;
17864
- if (isSingleCellExpandedRow && !isActionCell) {
17865
- if (this.isRowReplaced(nextCellCoords.y)) {
17866
- nextCellCoords.y = nextCellCoords.y + 1;
17867
- }
17868
- if (this.isDetailsRow(nextCellCoords.y)) {
17869
- nextCellCoords.x = 0;
17870
- }
17871
- else {
17872
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
17873
- }
17874
- return nextCellCoords;
17875
- }
17876
- if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
17877
- nextCellCoords.y = nextCellCoords.y + 1;
17878
- }
17879
- else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
17880
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
17881
- }
17882
17762
  else {
17883
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
17763
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17884
17764
  }
17885
17765
  }
17886
- else if (e.key === inlineStart) {
17887
- if (currentCellCoords.x !== 0) {
17888
- nextCellCoords.x = currentCellCoords.x - 1;
17889
- }
17890
- else if (!isActionCell) {
17891
- nextCellCoords.y = currentCellCoords.y - 1;
17892
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y) - 1;
17893
- }
17766
+ return nextCellCoords;
17767
+ }
17768
+ keyDown(currentCellCoords) {
17769
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17770
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17771
+ if (currentCellCoords.y >= numOfRows) {
17772
+ return nextCellCoords;
17894
17773
  }
17895
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
17896
- if (isActionCell &&
17897
- currentCellCoords.x === this.actionCellCount(currentCellCoords.x) - 1 &&
17898
- this.isRowReplaced(currentCellCoords.y) &&
17899
- !this.isDetailsRow(currentCellCoords.y)) {
17900
- nextCellCoords.y = currentCellCoords.y + 1;
17901
- nextCellCoords.x = 0;
17902
- }
17903
- else {
17904
- nextCellCoords.x = currentCellCoords.x + 1;
17905
- }
17774
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17775
+ nextCellCoords.y = currentCellCoords.y + 1;
17776
+ if (!isActionCell && this.utils.isRowReplaced(nextCellCoords.y)) {
17777
+ nextCellCoords.y = nextCellCoords.y + 1;
17778
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17779
+ ? 0
17780
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17906
17781
  }
17907
- else if (e.key === Keys.End) {
17908
- nextCellCoords.x = this.getCellsForRow(currentCellCoords.y).length - 1;
17909
- if (e.ctrlKey) {
17910
- nextCellCoords.x = numOfColumns;
17911
- nextCellCoords.y = numOfRows;
17912
- }
17782
+ return nextCellCoords;
17783
+ }
17784
+ keyLeft(currentCellCoords) {
17785
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17786
+ if (currentCellCoords.x === 0) {
17787
+ return nextCellCoords;
17913
17788
  }
17914
- else if (e.key === Keys.Home) {
17915
- nextCellCoords.x = 0;
17916
- nextCellCoords.y = currentCellCoords.y - 1;
17917
- if (e.ctrlKey) {
17918
- nextCellCoords.y = 0;
17789
+ nextCellCoords.x = currentCellCoords.x - 1;
17790
+ return nextCellCoords;
17791
+ }
17792
+ keyRight(currentCellCoords) {
17793
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17794
+ // calculate numOfColumns based on header cells.
17795
+ const numOfColumns = this.utils.rows?.length - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
17796
+ nextCellCoords.x = currentCellCoords.x < numOfColumns ? nextCellCoords.x + 1 : nextCellCoords.x;
17797
+ return nextCellCoords;
17798
+ }
17799
+ keyEnd(currentCellCoords, ctrlKey) {
17800
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17801
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17802
+ // calculate X based on header cells.
17803
+ nextCellCoords.x = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
17804
+ if (ctrlKey) {
17805
+ nextCellCoords.y = numOfRows;
17806
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17807
+ nextCellCoords.x = this.utils.getCellsForRow(nextCellCoords.y).length - 1;
17919
17808
  }
17920
17809
  }
17921
17810
  return nextCellCoords;
17922
17811
  }
17923
- getNextItemCoordinate(e, currentCellCoords) {
17924
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17925
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17926
- nextCellCoords.y = currentCellCoords.y - 1;
17927
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isDetailsRow(nextCellCoords.y)) {
17928
- nextCellCoords.x = 0;
17929
- return nextCellCoords;
17930
- }
17931
- if (this.isDetailsRow(nextCellCoords.y)) {
17932
- if (isActionCell) {
17933
- nextCellCoords.y = nextCellCoords.y - 1;
17934
- }
17935
- else {
17936
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
17937
- }
17938
- }
17812
+ keyHome(currentCellCoords, ctrlKey) {
17813
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17814
+ nextCellCoords.x = 0;
17815
+ if (ctrlKey) {
17816
+ nextCellCoords.y = 0;
17939
17817
  }
17940
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
17941
- nextCellCoords.y = currentCellCoords.y + 1;
17942
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isRowReplaced(nextCellCoords.y)) {
17943
- nextCellCoords.x = 0;
17944
- nextCellCoords.y = nextCellCoords.y + 1;
17945
- return nextCellCoords;
17946
- }
17947
- if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
17818
+ return nextCellCoords;
17819
+ }
17820
+ keyPageUp(currentCellCoords) {
17821
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17822
+ const itemsPerPage = this.utils.itemsPerPage;
17823
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17824
+ if (!this.utils.isActionCell(currentCellCoords)) {
17825
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17826
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17827
+ ? 0
17828
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17829
+ }
17830
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
17948
17831
  nextCellCoords.y = nextCellCoords.y + 1;
17949
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
17832
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17833
+ ? 0
17834
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17950
17835
  }
17951
17836
  }
17952
- else if (e.key === inlineStart && currentCellCoords.x !== 0) {
17953
- nextCellCoords.x = currentCellCoords.x - 1;
17954
- }
17955
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
17956
- nextCellCoords.x = currentCellCoords.x + 1;
17957
- }
17958
- else if (e.key === Keys.End) {
17959
- nextCellCoords.x = numOfColumns;
17960
- if (e.ctrlKey) {
17961
- nextCellCoords.y = numOfRows;
17837
+ else {
17838
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17839
+ nextCellCoords.y = nextCellCoords.y - 1;
17962
17840
  }
17963
17841
  }
17964
- else if (e.key === Keys.Home) {
17842
+ return nextCellCoords;
17843
+ }
17844
+ keyPageDown(currentCellCoords) {
17845
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17846
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17847
+ const itemsPerPage = this.utils.itemsPerPage;
17848
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
17849
+ if (this.utils.isActionCell(currentCellCoords) && this.utils.isDetailsRow(nextCellCoords.y)) {
17850
+ nextCellCoords.y = nextCellCoords.y - 1;
17851
+ }
17852
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
17965
17853
  nextCellCoords.x = 0;
17966
- if (e.ctrlKey) {
17967
- nextCellCoords.y = 0;
17968
- }
17969
17854
  }
17970
- else if (e.key === Keys.PageUp) {
17971
- nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17855
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
17856
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17972
17857
  }
17973
- else if (e.key === Keys.PageDown) {
17974
- nextCellCoords.y =
17975
- currentCellCoords.y + itemsPerPage < numOfRows ? currentCellCoords.y + itemsPerPage : numOfRows;
17858
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
17859
+ nextCellCoords.y = nextCellCoords.y + 1;
17860
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17861
+ ? 0
17862
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17976
17863
  }
17977
17864
  return nextCellCoords;
17978
17865
  }
17979
- getCalcVariables(currentCellCoords) {
17980
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
17981
- // calculate numOfColumns based on header cells.
17982
- const numOfColumns = numOfRows ? this.getCellsForRow(0).length - 1 : 0;
17983
- const dir = this.host.dir;
17984
- const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
17985
- const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
17986
- const itemsPerPage = Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
17987
- const isActionCell = this.isActionCell(currentCellCoords);
17988
- const nextCellCoords = {
17989
- x: currentCellCoords.x,
17990
- y: currentCellCoords.y,
17991
- };
17992
- return { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords };
17866
+ }
17867
+
17868
+ /*
17869
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17870
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17871
+ * This software is released under MIT license.
17872
+ * The full license information can be found in LICENSE in the root directory of this project.
17873
+ */
17874
+ class ExpandedRowKeyNavigationStrategy extends DefaultKeyNavigationStrategy {
17875
+ constructor(utils) {
17876
+ super(utils);
17877
+ }
17878
+ keyUp(currentCellCoords) {
17879
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17880
+ if (currentCellCoords.y === 0) {
17881
+ return nextCellCoords;
17882
+ }
17883
+ nextCellCoords.y = currentCellCoords.y - 1;
17884
+ if (!this.utils.isActionCell(currentCellCoords)) {
17885
+ if (this.utils.isRowReplaced(currentCellCoords.y)) {
17886
+ nextCellCoords.y = nextCellCoords.y - 1;
17887
+ }
17888
+ switch (true) {
17889
+ case this.utils.isDetailsRow(nextCellCoords.y):
17890
+ nextCellCoords.x = 0;
17891
+ break;
17892
+ case this.utils.isDetailsRow(currentCellCoords.y) === false:
17893
+ nextCellCoords.x = currentCellCoords.x;
17894
+ break;
17895
+ default:
17896
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
17897
+ }
17898
+ }
17899
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && nextCellCoords.y > 0) {
17900
+ nextCellCoords.y = nextCellCoords.y - 1;
17901
+ }
17902
+ return nextCellCoords;
17903
+ }
17904
+ keyDown(currentCellCoords) {
17905
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17906
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17907
+ if (currentCellCoords.y >= numOfRows) {
17908
+ return nextCellCoords;
17909
+ }
17910
+ nextCellCoords.y = currentCellCoords.y + 1;
17911
+ if (!this.utils.isActionCell(currentCellCoords)) {
17912
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
17913
+ nextCellCoords.y = nextCellCoords.y + 1;
17914
+ }
17915
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17916
+ nextCellCoords.x = 0;
17917
+ }
17918
+ else {
17919
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
17920
+ }
17921
+ }
17922
+ else {
17923
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y;
17924
+ }
17925
+ return nextCellCoords;
17926
+ }
17927
+ keyLeft(currentCellCoords) {
17928
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17929
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17930
+ return super.keyLeft(currentCellCoords);
17931
+ }
17932
+ if (currentCellCoords.x !== 0) {
17933
+ nextCellCoords.x = currentCellCoords.x - 1;
17934
+ }
17935
+ else if (!this.utils.isActionCell(currentCellCoords)) {
17936
+ nextCellCoords.y = currentCellCoords.y - 1;
17937
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y) - 1;
17938
+ }
17939
+ return nextCellCoords;
17940
+ }
17941
+ keyRight(currentCellCoords) {
17942
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17943
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17944
+ return super.keyRight(currentCellCoords);
17945
+ }
17946
+ // calculate numOfColumns based on header cells.
17947
+ const numOfColumns = this.utils.rows?.length - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
17948
+ if (currentCellCoords.x >= numOfColumns) {
17949
+ return nextCellCoords;
17950
+ }
17951
+ if (this.utils.isActionCell(currentCellCoords) &&
17952
+ currentCellCoords.x === this.utils.actionCellCount(currentCellCoords.x) - 1 &&
17953
+ this.utils.isRowReplaced(currentCellCoords.y) &&
17954
+ !this.utils.isDetailsRow(currentCellCoords.y)) {
17955
+ nextCellCoords.y = currentCellCoords.y + 1;
17956
+ nextCellCoords.x = 0;
17957
+ }
17958
+ else {
17959
+ nextCellCoords.x = currentCellCoords.x + 1;
17960
+ }
17961
+ return nextCellCoords;
17962
+ }
17963
+ keyEnd(currentCellCoords, ctrlKey) {
17964
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17965
+ if ((!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) || ctrlKey) {
17966
+ return super.keyEnd(currentCellCoords, ctrlKey);
17967
+ }
17968
+ nextCellCoords.x = this.utils.getCellsForRow(currentCellCoords.y).length - 1;
17969
+ return nextCellCoords;
17970
+ }
17971
+ keyHome(currentCellCoords, ctrlKey) {
17972
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17973
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
17974
+ return super.keyHome(currentCellCoords, ctrlKey);
17975
+ }
17976
+ nextCellCoords.x = 0;
17977
+ nextCellCoords.y = currentCellCoords.y - 1;
17978
+ if (ctrlKey) {
17979
+ nextCellCoords.y = 0;
17980
+ }
17981
+ return nextCellCoords;
17982
+ }
17983
+ keyPageUp(currentCellCoords) {
17984
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17985
+ const itemsPerPage = this.utils.itemsPerPage;
17986
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17987
+ if (!this.utils.isActionCell(currentCellCoords)) {
17988
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
17989
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
17990
+ nextCellCoords.y = nextCellCoords.y + 1;
17991
+ nextCellCoords.x = 0;
17992
+ }
17993
+ }
17994
+ else if (!this.utils.isDetailsRow(currentCellCoords.y)) {
17995
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17996
+ nextCellCoords.x = 0;
17997
+ }
17998
+ }
17999
+ else if (this.utils.isDetailsRow(currentCellCoords.y)) {
18000
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18001
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18002
+ }
18003
+ }
18004
+ }
18005
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18006
+ nextCellCoords.y = nextCellCoords.y - 1;
18007
+ }
18008
+ return nextCellCoords;
18009
+ }
18010
+ keyPageDown(currentCellCoords) {
18011
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18012
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18013
+ const itemsPerPage = this.utils.itemsPerPage;
18014
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18015
+ if (!this.utils.isActionCell(currentCellCoords)) {
18016
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18017
+ if (nextCellCoords.y < numOfRows && !this.utils.isDetailsRow(nextCellCoords.y)) {
18018
+ nextCellCoords.y = nextCellCoords.y + 1;
18019
+ }
18020
+ }
18021
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18022
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18023
+ }
18024
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18025
+ nextCellCoords.x = 0;
18026
+ }
18027
+ }
18028
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18029
+ nextCellCoords.y = nextCellCoords.y - 1;
18030
+ }
18031
+ return nextCellCoords;
18032
+ }
18033
+ }
18034
+
18035
+ /*
18036
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18037
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18038
+ * This software is released under MIT license.
18039
+ * The full license information can be found in LICENSE in the root directory of this project.
18040
+ */
18041
+ class ExpandedColumnsRowKeyNavigationStrategy extends ExpandedRowKeyNavigationStrategy {
18042
+ constructor(utils) {
18043
+ super(utils);
17993
18044
  }
17994
- getCurrentCellCoordinates() {
18045
+ keyUp(currentCellCoords) {
18046
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18047
+ if (currentCellCoords.y === 0) {
18048
+ return nextCellCoords;
18049
+ }
18050
+ nextCellCoords.y = currentCellCoords.y - 1;
18051
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18052
+ return super.keyUp(currentCellCoords);
18053
+ }
18054
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18055
+ if (isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18056
+ nextCellCoords.y = nextCellCoords.y - 1;
18057
+ }
18058
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18059
+ nextCellCoords.y = nextCellCoords.y - 1;
18060
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18061
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18062
+ }
18063
+ }
18064
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18065
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18066
+ }
18067
+ else if (!isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18068
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18069
+ }
18070
+ return nextCellCoords;
18071
+ }
18072
+ keyDown(currentCellCoords) {
18073
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18074
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18075
+ const numOfColumns = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
18076
+ if (currentCellCoords.y >= numOfRows) {
18077
+ return nextCellCoords;
18078
+ }
18079
+ nextCellCoords.y = currentCellCoords.y + 1;
18080
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18081
+ return super.keyDown(currentCellCoords);
18082
+ }
18083
+ if (!this.utils.isActionCell(currentCellCoords)) {
18084
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18085
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18086
+ }
18087
+ else if (this.utils.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18088
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18089
+ }
18090
+ else {
18091
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18092
+ }
18093
+ }
18094
+ else {
18095
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18096
+ }
18097
+ return nextCellCoords;
18098
+ }
18099
+ keyLeft(currentCellCoords) {
18100
+ return super.keyLeft(currentCellCoords);
18101
+ }
18102
+ keyRight(currentCellCoords) {
18103
+ return super.keyRight(currentCellCoords);
18104
+ }
18105
+ keyEnd(currentCellCoords, ctrlKey) {
18106
+ return super.keyEnd(currentCellCoords, ctrlKey);
18107
+ }
18108
+ keyHome(currentCellCoords, ctrlKey) {
18109
+ return super.keyHome(currentCellCoords, ctrlKey);
18110
+ }
18111
+ keyPageUp(currentCellCoords) {
18112
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18113
+ const itemsPerPage = this.utils.itemsPerPage;
18114
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18115
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18116
+ return super.keyPageUp(currentCellCoords);
18117
+ }
18118
+ if (!this.utils.isActionCell(currentCellCoords)) {
18119
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18120
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18121
+ nextCellCoords.y = nextCellCoords.y + 1;
18122
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18123
+ }
18124
+ }
18125
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18126
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18127
+ }
18128
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18129
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18130
+ }
18131
+ }
18132
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18133
+ nextCellCoords.y = nextCellCoords.y - 1;
18134
+ }
18135
+ return nextCellCoords;
18136
+ }
18137
+ keyPageDown(currentCellCoords) {
18138
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18139
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18140
+ const itemsPerPage = this.utils.itemsPerPage;
18141
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18142
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18143
+ return super.keyPageDown(currentCellCoords);
18144
+ }
18145
+ if (!this.utils.isActionCell(currentCellCoords)) {
18146
+ if (this.utils.isRowReplaced(nextCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18147
+ if (nextCellCoords.y < numOfRows) {
18148
+ nextCellCoords.y = nextCellCoords.y + 1;
18149
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18150
+ }
18151
+ }
18152
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18153
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18154
+ }
18155
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18156
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18157
+ }
18158
+ }
18159
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18160
+ nextCellCoords.y = nextCellCoords.y - 1;
18161
+ }
18162
+ return nextCellCoords;
18163
+ }
18164
+ }
18165
+
18166
+ /*
18167
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18168
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18169
+ * This software is released under MIT license.
18170
+ * The full license information can be found in LICENSE in the root directory of this project.
18171
+ */
18172
+ class KeyNavigationUtils {
18173
+ constructor(host, config) {
18174
+ this.host = host;
18175
+ this.config = config;
18176
+ }
18177
+ get grid() {
18178
+ return this.host?.querySelector(this.config.keyGrid);
18179
+ }
18180
+ get rows() {
18181
+ return this.host?.querySelectorAll(this.config.keyGridRows);
18182
+ }
18183
+ get cells() {
18184
+ return this.host?.querySelectorAll(this.config.keyGridCells);
18185
+ }
18186
+ get currentCellCoordinates() {
17995
18187
  const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
17996
18188
  const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
17997
18189
  const coordinates = {
@@ -18002,6 +18194,35 @@ class KeyNavigationGridController {
18002
18194
  };
18003
18195
  return coordinates;
18004
18196
  }
18197
+ get itemsPerPage() {
18198
+ return Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.rows[0].clientHeight) - 1 || 0;
18199
+ }
18200
+ getNextItemCoordinate(e) {
18201
+ const currentCellCoords = this.currentCellCoordinates;
18202
+ const strategy = this.getNavStrategy(currentCellCoords);
18203
+ const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18204
+ const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18205
+ switch (e.key) {
18206
+ case Keys.ArrowUp:
18207
+ return strategy.keyUp(currentCellCoords);
18208
+ case Keys.ArrowDown:
18209
+ return strategy.keyDown(currentCellCoords);
18210
+ case inlineStart:
18211
+ return strategy.keyLeft(currentCellCoords);
18212
+ case inlineEnd:
18213
+ return strategy.keyRight(currentCellCoords);
18214
+ case Keys.Home:
18215
+ return strategy.keyHome(currentCellCoords, e.ctrlKey);
18216
+ case Keys.End:
18217
+ return strategy.keyEnd(currentCellCoords, e.ctrlKey);
18218
+ case Keys.PageUp:
18219
+ return strategy.keyPageUp(currentCellCoords);
18220
+ case Keys.PageDown:
18221
+ return strategy.keyPageDown(currentCellCoords);
18222
+ default:
18223
+ return currentCellCoords;
18224
+ }
18225
+ }
18005
18226
  getCellsForRow(index) {
18006
18227
  return this.rows[index].querySelectorAll(this.config.keyGridCells);
18007
18228
  }
@@ -18016,10 +18237,7 @@ class KeyNavigationGridController {
18016
18237
  return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18017
18238
  }
18018
18239
  isSingleCellExpandedRow(index) {
18019
- const row = this.rows[index].classList.contains('datagrid-row-detail')
18020
- ? this.rows[index]
18021
- : this.rows[index].querySelector('.datagrid-row-detail');
18022
- return row?.querySelectorAll(this.config.keyGridCells).length === 1;
18240
+ return this.rows[index]?.querySelectorAll(this.config.keyGridCells).length === 1;
18023
18241
  }
18024
18242
  actionCellCount(index) {
18025
18243
  return this.actionCellsAsArray(index).length;
@@ -18030,6 +18248,167 @@ class KeyNavigationGridController {
18030
18248
  isActionCell(cellCoords) {
18031
18249
  return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18032
18250
  }
18251
+ createNextCellCoords(cellCoords) {
18252
+ return {
18253
+ x: cellCoords.x,
18254
+ y: cellCoords.y,
18255
+ };
18256
+ }
18257
+ getNavStrategy(currentCellCoords) {
18258
+ switch (true) {
18259
+ case this.isSingleCellExpandedRow(currentCellCoords.y):
18260
+ return new ExpandedRowKeyNavigationStrategy(this);
18261
+ case this.isDetailsRow(currentCellCoords.y):
18262
+ case this.isExpandedRow(currentCellCoords.y):
18263
+ return new ExpandedColumnsRowKeyNavigationStrategy(this);
18264
+ default:
18265
+ return new DefaultKeyNavigationStrategy(this);
18266
+ }
18267
+ }
18268
+ }
18269
+
18270
+ /*
18271
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18272
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18273
+ * This software is released under MIT license.
18274
+ * The full license information can be found in LICENSE in the root directory of this project.
18275
+ */
18276
+ const actionableItemSelectors = [
18277
+ 'a[href]',
18278
+ 'area[href]',
18279
+ 'input:not([disabled])',
18280
+ 'button:not([disabled])',
18281
+ 'select:not([disabled])',
18282
+ 'textarea:not([disabled])',
18283
+ 'iframe',
18284
+ 'object',
18285
+ 'embed',
18286
+ '[contenteditable=true]',
18287
+ '[role=button]:not([disabled])',
18288
+ ];
18289
+ function getTabbableItems(el) {
18290
+ const tabbableItemSelectors = [...actionableItemSelectors, '[tabindex="0"]:not([disabled])'];
18291
+ const tabbableSelector = tabbableItemSelectors.join(',');
18292
+ return Array.from(el.querySelectorAll(tabbableSelector));
18293
+ }
18294
+ function isActionableItem(el) {
18295
+ const actionableSelector = actionableItemSelectors.join(',');
18296
+ return el.matches(actionableSelector);
18297
+ }
18298
+ class KeyNavigationGridController {
18299
+ constructor(zone) {
18300
+ this.zone = zone;
18301
+ this.skipItemFocus = false;
18302
+ this.listenersAdded = false;
18303
+ this.destroy$ = new Subject();
18304
+ this._activeCell = null;
18305
+ this.config = {
18306
+ keyGridRows: '[role=row]:not(.datagrid-placeholder):not([style*="display: none"])',
18307
+ keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
18308
+ keyGrid: '[role=grid]',
18309
+ };
18310
+ }
18311
+ ngOnDestroy() {
18312
+ this.destroy$.next();
18313
+ this.destroy$.complete();
18314
+ }
18315
+ addListeners() {
18316
+ if (this.listenersAdded) {
18317
+ return;
18318
+ }
18319
+ this.zone.runOutsideAngular(() => {
18320
+ fromEvent(this.keyNavUtils.grid, 'mousedown')
18321
+ .pipe(takeUntil(this.destroy$))
18322
+ .subscribe((e) => {
18323
+ // preserve right click for context menus & keyboard mouse control https://apple.stackexchange.com/questions/32715/how-do-i-open-the-context-menu-from-a-mac-keyboard
18324
+ if (e.buttons === 1 && !e.ctrlKey) {
18325
+ const activeCell = this.keyNavUtils.cells
18326
+ ? Array.from(this.keyNavUtils.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
18327
+ : null;
18328
+ if (activeCell) {
18329
+ this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
18330
+ }
18331
+ }
18332
+ });
18333
+ fromEvent(this.keyNavUtils.grid, 'wheel')
18334
+ .pipe(takeUntil(this.destroy$))
18335
+ .subscribe(() => {
18336
+ this.removeActiveCell();
18337
+ });
18338
+ fromEvent(this.keyNavUtils.grid, 'focusout')
18339
+ .pipe(debounceTime(0), takeUntil(this.destroy$))
18340
+ .subscribe(() => {
18341
+ if (this.keyNavUtils.grid.contains(document.activeElement)) {
18342
+ return;
18343
+ }
18344
+ this.removeActiveCell();
18345
+ });
18346
+ fromEvent(this.keyNavUtils.grid, 'keydown')
18347
+ .pipe(takeUntil(this.destroy$))
18348
+ .subscribe((e) => {
18349
+ // Skip column resize events
18350
+ if (e.target.classList.contains('drag-handle') &&
18351
+ (e.key === Keys.ArrowLeft || e.key === Keys.ArrowRight)) {
18352
+ return;
18353
+ }
18354
+ if (e.key === Keys.ArrowUp ||
18355
+ e.key === Keys.ArrowDown ||
18356
+ e.key === Keys.ArrowLeft ||
18357
+ e.key === Keys.ArrowRight ||
18358
+ e.key === Keys.End ||
18359
+ e.key === Keys.Home ||
18360
+ e.key === Keys.PageUp ||
18361
+ e.key === Keys.PageDown) {
18362
+ const nextCellCoords = this.keyNavUtils.getNextItemCoordinate(e);
18363
+ const activeItem = this.keyNavUtils.rows
18364
+ ? Array.from(this.keyNavUtils.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
18365
+ : null;
18366
+ if (activeItem) {
18367
+ this.setActiveCell(activeItem);
18368
+ }
18369
+ e.preventDefault();
18370
+ }
18371
+ });
18372
+ });
18373
+ this.listenersAdded = true;
18374
+ }
18375
+ initializeKeyGrid(host) {
18376
+ this.keyNavUtils = new KeyNavigationUtils(host, this.config);
18377
+ this.addListeners();
18378
+ this.resetKeyGrid();
18379
+ }
18380
+ resetKeyGrid() {
18381
+ this.keyNavUtils.cells?.forEach((i) => i.setAttribute('tabindex', '-1'));
18382
+ const firstCell = this.keyNavUtils.cells ? this.keyNavUtils.cells[0] : null;
18383
+ firstCell?.setAttribute('tabindex', '0');
18384
+ }
18385
+ removeActiveCell() {
18386
+ this._activeCell = null;
18387
+ }
18388
+ getActiveCell() {
18389
+ return this._activeCell;
18390
+ }
18391
+ setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
18392
+ const prior = this.keyNavUtils.cells
18393
+ ? Array.from(this.keyNavUtils.cells).find(c => c.getAttribute('tabindex') === '0')
18394
+ : null;
18395
+ if (prior) {
18396
+ prior.setAttribute('tabindex', '-1');
18397
+ }
18398
+ activeCell.setAttribute('tabindex', '0');
18399
+ this._activeCell = activeCell;
18400
+ if (!this.skipItemFocus && !keepFocus) {
18401
+ let elementToFocus;
18402
+ if (activeCell.getAttribute('role') === 'columnheader') {
18403
+ elementToFocus = activeCell;
18404
+ }
18405
+ else {
18406
+ const tabbableElements = getTabbableItems(activeCell);
18407
+ elementToFocus = tabbableElements.length ? tabbableElements[0] : activeCell;
18408
+ }
18409
+ elementToFocus.focus();
18410
+ }
18411
+ }
18033
18412
  }
18034
18413
  KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
18035
18414
  KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
@@ -19727,18 +20106,14 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19727
20106
  if (typeof comparator === 'string') {
19728
20107
  this._sortBy = new DatagridPropertyComparator(comparator);
19729
20108
  }
20109
+ else if (comparator) {
20110
+ this._sortBy = comparator;
20111
+ }
20112
+ else if (this.field) {
20113
+ this._sortBy = new DatagridPropertyComparator(this.field);
20114
+ }
19730
20115
  else {
19731
- if (comparator) {
19732
- this._sortBy = comparator;
19733
- }
19734
- else {
19735
- if (this.field) {
19736
- this._sortBy = new DatagridPropertyComparator(this.field);
19737
- }
19738
- else {
19739
- delete this._sortBy;
19740
- }
19741
- }
20116
+ delete this._sortBy;
19742
20117
  }
19743
20118
  }
19744
20119
  get sortOrder() {
@@ -20121,6 +20496,10 @@ class Items {
20121
20496
  this._pageSub.unsubscribe();
20122
20497
  }
20123
20498
  }
20499
+ smartenDown() {
20500
+ this._smart = false;
20501
+ this.destroy();
20502
+ }
20124
20503
  smartenUp() {
20125
20504
  this._smart = true;
20126
20505
  /*
@@ -20910,6 +21289,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
20910
21289
  args: ['click', ['$event']]
20911
21290
  }] } });
20912
21291
 
21292
+ /*
21293
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21294
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21295
+ * This software is released under MIT license.
21296
+ * The full license information can be found in LICENSE in the root directory of this project.
21297
+ */
21298
+ class DatagridCellRenderer {
21299
+ constructor(el, renderer, organizer) {
21300
+ this.el = el;
21301
+ this.renderer = renderer;
21302
+ this.subscriptions = [];
21303
+ this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
21304
+ }
21305
+ ngOnDestroy() {
21306
+ this.subscriptions.forEach(sub => sub.unsubscribe());
21307
+ if (this.stateSubscription) {
21308
+ this.stateSubscription.unsubscribe();
21309
+ }
21310
+ }
21311
+ resetState(state) {
21312
+ this.setWidth(state);
21313
+ this.setHidden(state);
21314
+ }
21315
+ setWidth(state) {
21316
+ if (state.strictWidth) {
21317
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21318
+ }
21319
+ else {
21320
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21321
+ }
21322
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
21323
+ }
21324
+ setHidden(state) {
21325
+ if (state.hidden) {
21326
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21327
+ }
21328
+ else {
21329
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21330
+ }
21331
+ }
21332
+ clearWidth() {
21333
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21334
+ this.renderer.setStyle(this.el.nativeElement, 'width', null);
21335
+ }
21336
+ }
21337
+ DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
21338
+ DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
21339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
21340
+ type: Directive,
21341
+ args: [{
21342
+ selector: 'clr-dg-cell',
21343
+ }]
21344
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
21345
+
20913
21346
  /*
20914
21347
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
20915
21348
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -20933,6 +21366,7 @@ class ClrDatagridRow {
20933
21366
  this.expandedChange = new EventEmitter(false);
20934
21367
  this.detailDisabled = false;
20935
21368
  this.detailHidden = false;
21369
+ this.skeletonLoading = false;
20936
21370
  this.displayCells = false;
20937
21371
  this.expandAnimationTrigger = false;
20938
21372
  /* reference to the enum so that template can access */
@@ -21067,6 +21501,16 @@ class ClrDatagridRow {
21067
21501
  }
21068
21502
  if (viewChange === DatagridDisplayMode.CALCULATE) {
21069
21503
  this.displayCells = false;
21504
+ // Inserts a fixed cell if any of these conditions are true.
21505
+ const fixedCellConditions = [
21506
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
21507
+ this.rowActionService.hasActionableRow,
21508
+ this.globalExpandable.hasExpandableRow,
21509
+ this.detailService.enabled,
21510
+ ];
21511
+ fixedCellConditions
21512
+ .filter(Boolean)
21513
+ .forEach(() => this._calculatedCells.insert(this._fixedCellTemplate.createEmbeddedView(null)));
21070
21514
  this.dgCells.forEach(cell => {
21071
21515
  if (!cell._view.destroyed) {
21072
21516
  this._calculatedCells.insert(cell._view);
@@ -21108,7 +21552,7 @@ class ClrDatagridRow {
21108
21552
  * selection browser functionality, which is inconsistently implemented in browsers anyway.
21109
21553
  */
21110
21554
  clearRanges(event) {
21111
- if (event.shiftKey) {
21555
+ if (this.selection.rowSelectionMode && event.shiftKey) {
21112
21556
  this.document.getSelection().removeAllRanges();
21113
21557
  // Firefox is too persistent about its text-selection behaviour. So we need to add a preventDefault();
21114
21558
  // We should not try to enforce this on the other browsers, though, because their toggle cycle does not get canceled by
@@ -21125,7 +21569,7 @@ class ClrDatagridRow {
21125
21569
  selectRow(selected = !this.selected, $event) {
21126
21570
  // The label also captures clicks that bubble up to the row event listener, causing
21127
21571
  // this handler to run twice. This exits early to prevent toggling the checkbox twice.
21128
- if ($event.target.tagName === 'LABEL') {
21572
+ if (!this.selection.rowSelectionMode || $event.target.tagName === 'LABEL') {
21129
21573
  return;
21130
21574
  }
21131
21575
  if (this.selection.selectionType === this.SELECTION_TYPE.Single) {
@@ -21160,15 +21604,16 @@ class ClrDatagridRow {
21160
21604
  }
21161
21605
  }
21162
21606
  ClrDatagridRow.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, deps: [{ token: Selection }, { token: RowActionService }, { token: ExpandableRowsCount }, { token: DatagridIfExpandService }, { token: DetailService }, { token: DisplayModeService }, { token: i0.ViewContainerRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: ClrCommonStringsService }, { token: Items }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
21163
- ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRow, selector: "clr-dg-row", inputs: { detailDisabled: ["clrDgDetailDisabled", "detailDisabled"], detailHidden: ["clrDgDetailHidden", "detailHidden"], item: ["clrDgItem", "item"], clrDgSelectable: "clrDgSelectable", selected: ["clrDgSelected", "selected"], expanded: ["clrDgExpanded", "expanded"], clrDgDetailOpenLabel: "clrDgDetailOpenLabel", clrDgDetailCloseLabel: "clrDgDetailCloseLabel", clrDgRowSelectionLabel: "clrDgRowSelectionLabel" }, outputs: { selectedChanged: "clrDgSelectedChange", expandedChange: "clrDgExpandedChange" }, host: { attributes: { "role": "rowgroup" }, properties: { "class.datagrid-row": "true", "class.datagrid-selected": "selected", "attr.aria-owns": "id" } }, providers: [
21607
+ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridRow, selector: "clr-dg-row", inputs: { detailDisabled: ["clrDgDetailDisabled", "detailDisabled"], detailHidden: ["clrDgDetailHidden", "detailHidden"], skeletonLoading: ["clrDgSkeletonLoading", "skeletonLoading"], item: ["clrDgItem", "item"], clrDgSelectable: "clrDgSelectable", selected: ["clrDgSelected", "selected"], expanded: ["clrDgExpanded", "expanded"], clrDgDetailOpenLabel: "clrDgDetailOpenLabel", clrDgDetailCloseLabel: "clrDgDetailCloseLabel", clrDgRowSelectionLabel: "clrDgRowSelectionLabel" }, outputs: { selectedChanged: "clrDgSelectedChange", expandedChange: "clrDgExpandedChange" }, host: { attributes: { "role": "rowgroup" }, properties: { "class.datagrid-row": "true", "class.datagrid-row-skeleton": "skeletonLoading", "class.datagrid-selected": "selected", "attr.aria-owns": "id" } }, providers: [
21164
21608
  DatagridIfExpandService,
21165
21609
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21166
21610
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21167
- ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimation, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </div>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expand.hasExpandTemplate && !expand.expanded ? null : expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrExpandableAnimation, selector: "clr-expandable-animation", inputs: ["clrExpandTrigger"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
21611
+ ], queries: [{ propertyName: "dgCells", predicate: ClrDatagridCell }], viewQueries: [{ propertyName: "expandAnimation", first: true, predicate: ClrExpandableAnimationDirective, descendants: true }, { propertyName: "detailButton", first: true, predicate: ["detailButton"], descendants: true }, { propertyName: "_stickyCells", first: true, predicate: ["stickyCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_scrollableCells", first: true, predicate: ["scrollableCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculatedCells", first: true, predicate: ["calculatedCells"], descendants: true, read: ViewContainerRef }, { propertyName: "_fixedCellTemplate", first: true, predicate: ["fixedCellTemplate"], descendants: true }], ngImport: i0, template: "<div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [clrExpandableAnimation]=\"expandAnimationTrigger\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n [class.datagrid-row-clickable]=\"selection.rowSelectionMode\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n>\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </div>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expand.hasExpandTemplate && !expand.expanded ? null : expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n</div>\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n\n<ng-template #fixedCellTemplate>\n <div class=\"datagrid-fixed-column datagrid-cell\" role=\"gridcell\"></div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: ClrRadio, selector: "[clrRadio]" }, { kind: "component", type: ClrRadioWrapper, selector: "clr-radio-wrapper" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ClrExpandableAnimationDirective, selector: "[clrExpandableAnimation]", inputs: ["clrExpandableAnimation"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }] });
21168
21612
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
21169
21613
  type: Component,
21170
21614
  args: [{ selector: 'clr-dg-row', host: {
21171
21615
  '[class.datagrid-row]': 'true',
21616
+ '[class.datagrid-row-skeleton]': 'skeletonLoading',
21172
21617
  '[class.datagrid-selected]': 'selected',
21173
21618
  '[attr.aria-owns]': 'id',
21174
21619
  role: 'rowgroup',
@@ -21176,7 +21621,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21176
21621
  DatagridIfExpandService,
21177
21622
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21178
21623
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21179
- ], template: "<!--\n We need to wrap the #rowContent in label element if we are in rowSelectionMode.\n Clicking of that wrapper label will equate to clicking on the whole row, which triggers the checkbox to toggle.\n-->\n<div\n class=\"datagrid-row-clickable\"\n *ngIf=\"selection.rowSelectionMode\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n>\n <clr-expandable-animation [clrExpandTrigger]=\"expandAnimationTrigger\" *ngIf=\"expand.expandable\">\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n </clr-expandable-animation>\n <ng-template [ngTemplateOutlet]=\"rowContent\" *ngIf=\"!expand.expandable\"></ng-template>\n</div>\n\n<clr-expandable-animation\n *ngIf=\"!selection.rowSelectionMode && expand.expandable\"\n [clrExpandTrigger]=\"expandAnimationTrigger\"\n>\n <ng-template [ngTemplateOutlet]=\"rowContent\"></ng-template>\n</clr-expandable-animation>\n\n<ng-template *ngIf=\"!selection.rowSelectionMode && !expand.expandable\" [ngTemplateOutlet]=\"rowContent\"></ng-template>\n\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-template #rowContent>\n <div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n >\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </div>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expand.hasExpandTemplate && !expand.expanded ? null : expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
21624
+ ], template: "<div\n role=\"row\"\n [id]=\"id\"\n class=\"datagrid-row-master datagrid-row-flex\"\n [clrExpandableAnimation]=\"expandAnimationTrigger\"\n (mousedown)=\"clearRanges($event)\"\n (click)=\"selectRow(!selected, $event)\"\n [class.datagrid-row-clickable]=\"selection.rowSelectionMode\"\n [class.datagrid-row-detail-open]=\"detailService.isRowOpen(item)\"\n>\n <div class=\"datagrid-row-sticky\">\n <!-- Sticky elements here -->\n <ng-container #stickyCells>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <div class=\"clr-checkbox-wrapper\">\n <input\n tabindex=\"-1\"\n type=\"checkbox\"\n [ngModel]=\"selected\"\n (ngModelChange)=\"toggle($event)\"\n [id]=\"checkboxId\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"checkboxId\" class=\"clr-control-label clr-col-null\" (click)=\"clearRanges($event)\">\n <span class=\"clr-sr-only\">{{clrDgRowSelectionLabel || commonStrings.keys.select}}</span>\n </label>\n </div>\n </div>\n <div\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n class=\"datagrid-select datagrid-fixed-column datagrid-cell\"\n [ngClass]=\"{ 'clr-form-control-disabled': !clrDgSelectable }\"\n role=\"gridcell\"\n >\n <clr-radio-wrapper>\n <input\n tabindex=\"-1\"\n type=\"radio\"\n clrRadio\n [id]=\"radioId\"\n [name]=\"selection.id + '-radio'\"\n [value]=\"item\"\n [(ngModel)]=\"selection.currentSingle\"\n [checked]=\"selection.currentSingle === item\"\n [disabled]=\"clrDgSelectable ? null : true\"\n [attr.aria-disabled]=\"clrDgSelectable ? null : true\"\n />\n <label class=\"clr-control-label clr-col-null\" [for]=\"radioId\">\n <span class=\"clr-sr-only\">{{ clrDgRowSelectionLabel || commonStrings.keys.select }}</span>\n </label>\n </clr-radio-wrapper>\n </div>\n <div\n *ngIf=\"rowActionService.hasActionableRow\"\n class=\"datagrid-row-actions datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-content select=\"clr-dg-action-overflow\"></ng-content>\n </div>\n <div\n *ngIf=\"globalExpandable.hasExpandableRow\"\n class=\"datagrid-expandable-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <ng-container *ngIf=\"expand.expandable\">\n <button\n tabindex=\"-1\"\n *ngIf=\"!expand.loading\"\n (click)=\"toggleExpand()\"\n type=\"button\"\n class=\"datagrid-expandable-caret-button\"\n [attr.aria-expanded]=\"expand.expanded\"\n [attr.aria-label]=\"expand.expanded ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-controls]=\"expand.hasExpandTemplate && !expand.expanded ? null : expandableId\"\n >\n <cds-icon\n shape=\"angle\"\n class=\"datagrid-expandable-caret-icon\"\n [attr.direction]=\"expand.expanded ? 'down' : 'right'\"\n [attr.title]=\"expand.expanded ? commonStrings.keys.collapse : commonStrings.keys.expand\"\n ></cds-icon>\n </button>\n <clr-spinner *ngIf=\"expand.loading\" clrSmall>{{ commonStrings.keys.loading }}</clr-spinner>\n </ng-container>\n </div>\n <div\n *ngIf=\"detailService.enabled\"\n class=\"datagrid-detail-caret datagrid-fixed-column datagrid-cell\"\n role=\"gridcell\"\n >\n <button\n tabindex=\"-1\"\n (click)=\"detailService.toggle(item, detailButton)\"\n type=\"button\"\n #detailButton\n class=\"datagrid-detail-caret-button\"\n [disabled]=\"detailDisabled\"\n *ngIf=\"!detailHidden\"\n [class.is-open]=\"detailService.isRowOpen(item)\"\n [attr.aria-label]=\"detailService.isRowOpen(item) ? clrDgDetailCloseLabel : clrDgDetailOpenLabel\"\n [attr.aria-expanded]=\"detailService.isRowOpen(item)\"\n [attr.aria-controls]=\"detailService.id\"\n aria-haspopup=\"dialog\"\n >\n <cds-icon\n shape=\"angle-double\"\n [attr.direction]=\"detailService.isRowOpen(item) ? 'left' : 'right'\"\n class=\"datagrid-detail-caret-icon\"\n [attr.title]=\"detailService.isRowOpen(item) ? commonStrings.keys.close: commonStrings.keys.open\"\n ></cds-icon>\n </button>\n </div>\n </ng-container>\n <!-- placeholder for projecting other sticky cells as pinned-->\n </div>\n <div class=\"datagrid-row-scrollable\" [ngClass]=\"{'is-replaced': replaced && expanded}\">\n <div class=\"datagrid-scrolling-cells\">\n <ng-content select=\"clr-dg-cell\"></ng-content>\n <ng-container #scrollableCells></ng-container>\n </div>\n <!-- details here when replace, re-visit when sticky container is used for pinned cells -->\n <ng-template *ngIf=\"replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n <ng-template *ngIf=\"!replaced && !expand.loading\" [ngTemplateOutlet]=\"detail\"></ng-template>\n </div>\n <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n</div>\n<!--\n We need the \"project into template\" hacks because we need this in 2 different places\n depending on whether the details replace the row or not.\n-->\n<ng-template #detail>\n <ng-content select=\"clr-dg-row-detail\"></ng-content>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n\n<ng-template #fixedCellTemplate>\n <div class=\"datagrid-fixed-column datagrid-cell\" role=\"gridcell\"></div>\n</ng-template>\n" }]
21180
21625
  }], ctorParameters: function () { return [{ type: Selection }, { type: RowActionService }, { type: ExpandableRowsCount }, { type: DatagridIfExpandService }, { type: DetailService }, { type: DisplayModeService }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: ClrCommonStringsService }, { type: Items }, { type: undefined, decorators: [{
21181
21626
  type: Inject,
21182
21627
  args: [DOCUMENT]
@@ -21192,12 +21637,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21192
21637
  }], detailHidden: [{
21193
21638
  type: Input,
21194
21639
  args: ['clrDgDetailHidden']
21640
+ }], skeletonLoading: [{
21641
+ type: Input,
21642
+ args: ['clrDgSkeletonLoading']
21195
21643
  }], dgCells: [{
21196
21644
  type: ContentChildren,
21197
21645
  args: [ClrDatagridCell]
21198
21646
  }], expandAnimation: [{
21199
21647
  type: ViewChild,
21200
- args: [ClrExpandableAnimation]
21648
+ args: [ClrExpandableAnimationDirective]
21201
21649
  }], detailButton: [{
21202
21650
  type: ViewChild,
21203
21651
  args: ['detailButton']
@@ -21210,6 +21658,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21210
21658
  }], _calculatedCells: [{
21211
21659
  type: ViewChild,
21212
21660
  args: ['calculatedCells', { read: ViewContainerRef }]
21661
+ }], _fixedCellTemplate: [{
21662
+ type: ViewChild,
21663
+ args: ['fixedCellTemplate']
21213
21664
  }], item: [{
21214
21665
  type: Input,
21215
21666
  args: ['clrDgItem']
@@ -21332,6 +21783,7 @@ class ClrDatagridVirtualScrollDirective {
21332
21783
  this.columnsService = columnsService;
21333
21784
  this.injector = injector;
21334
21785
  this.renderedRangeChange = new EventEmitter();
21786
+ this.persistItems = true;
21335
21787
  this._cdkFixedSizeVirtualScrollInputs = { ...defaultCdkFixedSizeVirtualScrollInputs };
21336
21788
  this.subscriptions = [];
21337
21789
  this.topIndex = 0;
@@ -21408,6 +21860,22 @@ class ClrDatagridVirtualScrollDirective {
21408
21860
  this._cdkFixedSizeVirtualScrollInputs.maxBufferPx = coerceNumberProperty(value);
21409
21861
  this.updateFixedSizeVirtualScrollInputs();
21410
21862
  }
21863
+ set dataRange(range) {
21864
+ if (!range) {
21865
+ return;
21866
+ }
21867
+ if (this.items.smart) {
21868
+ this.items.smartenDown();
21869
+ }
21870
+ this.totalItems = range.total;
21871
+ this.updateDataRange(range.skip, range.data);
21872
+ }
21873
+ get totalItems() {
21874
+ return this._totalItems;
21875
+ }
21876
+ set totalItems(value) {
21877
+ this._totalItems = value;
21878
+ }
21411
21879
  ngAfterViewInit() {
21412
21880
  this.injector.runInContext(() => {
21413
21881
  this.virtualScrollViewport = this.createVirtualScrollViewportForDatagrid(this.changeDetectorRef, this.ngZone, this.renderer2, this.directionality, this.scrollDispatcher, this.viewportRuler, this.datagridElementRef, this.virtualScrollStrategy);
@@ -21417,7 +21885,9 @@ class ClrDatagridVirtualScrollDirective {
21417
21885
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
21418
21886
  this.updateCdkVirtualForInputs();
21419
21887
  this.subscriptions.push(this.items.change.subscribe(newItems => {
21420
- this.cdkVirtualFor.cdkVirtualForOf = newItems;
21888
+ if (this.items.smart) {
21889
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
21890
+ }
21421
21891
  }), this.cdkVirtualFor.dataStream.subscribe(data => {
21422
21892
  this.updateAriaRowCount(data.length);
21423
21893
  }), this.virtualScrollViewport.scrolledIndexChange.subscribe(index => {
@@ -21453,6 +21923,14 @@ class ClrDatagridVirtualScrollDirective {
21453
21923
  scrollToIndex(index, behavior = 'auto') {
21454
21924
  this.virtualScrollViewport?.scrollToIndex(index, behavior);
21455
21925
  }
21926
+ updateDataRange(skip, data) {
21927
+ let items = this.cdkVirtualForOf;
21928
+ if (!this.persistItems || !items || items?.length !== this.totalItems) {
21929
+ items = Array(this.totalItems);
21930
+ }
21931
+ items.splice(skip, data.length, ...data);
21932
+ this.cdkVirtualForOf = Array.from(items);
21933
+ }
21456
21934
  updateCdkVirtualForInputs() {
21457
21935
  if (this.cdkVirtualFor) {
21458
21936
  for (const cdkVirtualForInputKey of Object.keys(this.cdkVirtualForInputs)) {
@@ -21510,18 +21988,22 @@ class ClrDatagridVirtualScrollDirective {
21510
21988
  return virtualScrollViewport;
21511
21989
  }
21512
21990
  }
21513
- ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items, skipSelf: true }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$3.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: ClrDatagrid }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
21514
- ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[clrVirtualScroll],[ClrVirtualScroll]", inputs: { cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
21991
+ ClrDatagridVirtualScrollDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.IterableDiffers }, { token: Items }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: i1$3.Directionality }, { token: i3$1.ScrollDispatcher }, { token: i3$1.ViewportRuler }, { token: forwardRef(() => ClrDatagrid) }, { token: ColumnsService }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Directive });
21992
+ ClrDatagridVirtualScrollDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridVirtualScrollDirective, selector: "[clrVirtualScroll],[ClrVirtualScroll]", inputs: { persistItems: ["clrVirtualPersistItems", "persistItems"], cdkVirtualForOf: ["clrVirtualRowsOf", "cdkVirtualForOf"], cdkVirtualForTrackBy: ["clrVirtualRowsTrackBy", "cdkVirtualForTrackBy"], cdkVirtualForTemplate: ["clrVirtualRowsTemplate", "cdkVirtualForTemplate"], cdkVirtualForTemplateCacheSize: ["clrVirtualRowsTemplateCacheSize", "cdkVirtualForTemplateCacheSize"], itemSize: ["clrVirtualRowsItemSize", "itemSize"], minBufferPx: ["clrVirtualRowsMinBufferPx", "minBufferPx"], maxBufferPx: ["clrVirtualRowsMaxBufferPx", "maxBufferPx"], dataRange: ["clrVirtualDataRange", "dataRange"] }, outputs: { renderedRangeChange: "renderedRangeChange" }, providers: [Items], ngImport: i0 });
21515
21993
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
21516
21994
  type: Directive,
21517
21995
  args: [{
21518
21996
  selector: '[clrVirtualScroll],[ClrVirtualScroll]',
21519
21997
  providers: [Items],
21520
21998
  }]
21521
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
21522
- type: SkipSelf
21523
- }] }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$3.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid }, { type: ColumnsService }, { type: i0.EnvironmentInjector }]; }, propDecorators: { renderedRangeChange: [{
21999
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: i1$3.Directionality }, { type: i3$1.ScrollDispatcher }, { type: i3$1.ViewportRuler }, { type: ClrDatagrid, decorators: [{
22000
+ type: Inject,
22001
+ args: [forwardRef(() => ClrDatagrid)]
22002
+ }] }, { type: ColumnsService }, { type: i0.EnvironmentInjector }]; }, propDecorators: { renderedRangeChange: [{
21524
22003
  type: Output
22004
+ }], persistItems: [{
22005
+ type: Input,
22006
+ args: ['clrVirtualPersistItems']
21525
22007
  }], cdkVirtualForOf: [{
21526
22008
  type: Input,
21527
22009
  args: ['clrVirtualRowsOf']
@@ -21543,6 +22025,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21543
22025
  }], maxBufferPx: [{
21544
22026
  type: Input,
21545
22027
  args: ['clrVirtualRowsMaxBufferPx']
22028
+ }], dataRange: [{
22029
+ type: Input,
22030
+ args: ['clrVirtualDataRange']
21546
22031
  }] } });
21547
22032
  function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
21548
22033
  if (+VERSION.major < 19) {
@@ -21658,60 +22143,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21658
22143
  type: Injectable
21659
22144
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
21660
22145
 
21661
- /*
21662
- * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21663
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21664
- * This software is released under MIT license.
21665
- * The full license information can be found in LICENSE in the root directory of this project.
21666
- */
21667
- class DatagridCellRenderer {
21668
- constructor(el, renderer, organizer) {
21669
- this.el = el;
21670
- this.renderer = renderer;
21671
- this.subscriptions = [];
21672
- this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
21673
- }
21674
- ngOnDestroy() {
21675
- this.subscriptions.forEach(sub => sub.unsubscribe());
21676
- if (this.stateSubscription) {
21677
- this.stateSubscription.unsubscribe();
21678
- }
21679
- }
21680
- resetState(state) {
21681
- this.setWidth(state);
21682
- this.setHidden(state);
21683
- }
21684
- setWidth(state) {
21685
- if (state.strictWidth) {
21686
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21687
- }
21688
- else {
21689
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21690
- }
21691
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
21692
- }
21693
- setHidden(state) {
21694
- if (state.hidden) {
21695
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21696
- }
21697
- else {
21698
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21699
- }
21700
- }
21701
- clearWidth() {
21702
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21703
- this.renderer.setStyle(this.el.nativeElement, 'width', null);
21704
- }
21705
- }
21706
- DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
21707
- DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
21708
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
21709
- type: Directive,
21710
- args: [{
21711
- selector: 'clr-dg-cell',
21712
- }]
21713
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
21714
-
21715
22146
  /*
21716
22147
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21717
22148
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -21806,6 +22237,11 @@ class ClrDatagrid {
21806
22237
  * Output emitted whenever the data needs to be refreshed, based on user action or external ones
21807
22238
  */
21808
22239
  this.refresh = new EventEmitter(false);
22240
+ /**
22241
+ * The application can provide custom select all logic.
22242
+ */
22243
+ this.customSelectAllEnabled = false;
22244
+ this.customSelectAll = new EventEmitter();
21809
22245
  /* reference to the enum so that template can access */
21810
22246
  this.SELECTION_TYPE = SelectionType;
21811
22247
  /**
@@ -21872,13 +22308,18 @@ class ClrDatagrid {
21872
22308
  get allSelected() {
21873
22309
  return this.selection.isAllSelected();
21874
22310
  }
21875
- set allSelected(_value) {
21876
- /**
21877
- * This is a setter but we ignore the value.
21878
- * It's strange, but it lets us have an indeterminate state where only
21879
- * some of the items are selected.
21880
- */
21881
- this.selection.toggleAll();
22311
+ set allSelected(value) {
22312
+ if (this.customSelectAllEnabled) {
22313
+ this.customSelectAll.emit(value);
22314
+ }
22315
+ else {
22316
+ /**
22317
+ * This is a setter but we ignore the value.
22318
+ * It's strange, but it lets us have an indeterminate state where only
22319
+ * some of the items are selected.
22320
+ */
22321
+ this.selection.toggleAll();
22322
+ }
21882
22323
  }
21883
22324
  ngAfterContentInit() {
21884
22325
  if (!this.items.smart) {
@@ -21924,7 +22365,7 @@ class ClrDatagrid {
21924
22365
  this.updateDetailState();
21925
22366
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
21926
22367
  this.refresh.emit(this.stateProvider.state);
21927
- this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22368
+ this._subscriptions.push(this.stickyHeaders.changes.subscribe(() => this.resize()), this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
21928
22369
  if (this.selection.selectionType === SelectionType.Single) {
21929
22370
  this.singleSelectedChanged.emit(s);
21930
22371
  }
@@ -21970,6 +22411,15 @@ class ClrDatagrid {
21970
22411
  else {
21971
22412
  // Set state, style for the datagrid to CALCULATE and insert row & columns into containers
21972
22413
  this.renderer.addClass(this.el.nativeElement, 'datagrid-calculate-mode');
22414
+ // Inserts a fixed column if any of these conditions are true.
22415
+ const fixedColumnConditions = [
22416
+ this.rowActionService.hasActionableRow,
22417
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
22418
+ this.expandableRows.hasExpandableRow || this.detailService.enabled,
22419
+ ];
22420
+ fixedColumnConditions
22421
+ .filter(Boolean)
22422
+ .forEach(() => this._projectedCalculationColumns.insert(this._fixedColumnTemplate.createEmbeddedView(null)));
21973
22423
  this.columns.forEach(column => {
21974
22424
  this._projectedCalculationColumns.insert(column._view);
21975
22425
  });
@@ -21997,10 +22447,7 @@ class ClrDatagrid {
21997
22447
  }
21998
22448
  toggleAllSelected($event) {
21999
22449
  $event.preventDefault();
22000
- if (this.virtualScroll) {
22001
- return;
22002
- }
22003
- this.allSelected = !this.allSelected;
22450
+ this.selectAllCheckbox?.nativeElement.click();
22004
22451
  }
22005
22452
  resize() {
22006
22453
  this.organizer.resize();
@@ -22036,7 +22483,7 @@ class ClrDatagrid {
22036
22483
  }
22037
22484
  }
22038
22485
  ClrDatagrid.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, deps: [{ token: DatagridRenderOrganizer }, { token: Items }, { token: ExpandableRowsCount }, { token: Selection }, { token: RowActionService }, { token: StateProvider }, { token: DisplayModeService }, { token: i0.Renderer2 }, { token: DetailService }, { token: DOCUMENT }, { token: i0.ElementRef }, { token: Page }, { token: ClrCommonStringsService }, { token: KeyNavigationGridController }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
22039
- ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagrid, selector: "clr-datagrid", inputs: { loadingMoreItems: ["clrLoadingMoreItems", "loadingMoreItems"], clrDgSingleSelectionAriaLabel: "clrDgSingleSelectionAriaLabel", clrDgSingleActionableAriaLabel: "clrDgSingleActionableAriaLabel", clrDetailExpandableAriaLabel: "clrDetailExpandableAriaLabel", clrDgDisablePageFocus: "clrDgDisablePageFocus", loading: ["clrDgLoading", "loading"], selected: ["clrDgSelected", "selected"], singleSelected: ["clrDgSingleSelected", "singleSelected"], clrDgPreserveSelection: "clrDgPreserveSelection", rowSelectionMode: ["clrDgRowSelection", "rowSelectionMode"], trackBy: ["clrDgItemsTrackBy", "trackBy"] }, outputs: { selectedChanged: "clrDgSelectedChange", singleSelectedChanged: "clrDgSingleSelectedChange", refresh: "clrDgRefresh" }, host: { properties: { "class.datagrid-host": "true", "class.datagrid-detail-open": "detailService.isOpen" } }, providers: [
22486
+ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagrid, selector: "clr-datagrid", inputs: { loadingMoreItems: ["clrLoadingMoreItems", "loadingMoreItems"], clrDgSingleSelectionAriaLabel: "clrDgSingleSelectionAriaLabel", clrDgSingleActionableAriaLabel: "clrDgSingleActionableAriaLabel", clrDetailExpandableAriaLabel: "clrDetailExpandableAriaLabel", clrDgDisablePageFocus: "clrDgDisablePageFocus", customSelectAllEnabled: ["clrDgCustomSelectAllEnabled", "customSelectAllEnabled"], loading: ["clrDgLoading", "loading"], selected: ["clrDgSelected", "selected"], singleSelected: ["clrDgSingleSelected", "singleSelected"], clrDgPreserveSelection: "clrDgPreserveSelection", rowSelectionMode: ["clrDgRowSelection", "rowSelectionMode"], trackBy: ["clrDgItemsTrackBy", "trackBy"] }, outputs: { selectedChanged: "clrDgSelectedChange", singleSelectedChanged: "clrDgSingleSelectedChange", refresh: "clrDgRefresh", customSelectAll: "clrDgCustomSelectAll" }, host: { properties: { "class.datagrid-host": "true", "class.datagrid-detail-open": "detailService.isOpen" } }, providers: [
22040
22487
  Selection,
22041
22488
  Sort,
22042
22489
  FiltersProvider,
@@ -22052,7 +22499,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
22052
22499
  ColumnsService,
22053
22500
  DisplayModeService,
22054
22501
  KeyNavigationGridController,
22055
- ], queries: [{ propertyName: "virtualScroll", first: true, predicate: ClrDatagridVirtualScrollDirective, descendants: true }, { propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!virtualScroll\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgDetailDisabled", "clrDgDetailHidden", "clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
22502
+ ], queries: [{ propertyName: "virtualScroll", first: true, predicate: ClrDatagridVirtualScrollDirective, descendants: true }, { propertyName: "iterator", first: true, predicate: ClrDatagridItems, descendants: true }, { propertyName: "placeholder", first: true, predicate: ClrDatagridPlaceholder, descendants: true }, { propertyName: "columns", predicate: ClrDatagridColumn }, { propertyName: "rows", predicate: ClrDatagridRow }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "scrollableColumns", first: true, predicate: ["scrollableColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedDisplayColumns", first: true, predicate: ["projectedDisplayColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_projectedCalculationColumns", first: true, predicate: ["projectedCalculationColumns"], descendants: true, read: ViewContainerRef }, { propertyName: "_displayedRows", first: true, predicate: ["displayedRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_calculationRows", first: true, predicate: ["calculationRows"], descendants: true, read: ViewContainerRef }, { propertyName: "_fixedColumnTemplate", first: true, predicate: ["fixedColumnTemplate"], descendants: true }, { propertyName: "selectAllCheckbox", first: true, predicate: ["selectAllCheckbox"], descendants: true }, { propertyName: "stickyHeaders", predicate: ["stickyHeader"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!virtualScroll || customSelectAllEnabled\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n #selectAllCheckbox\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n\n<ng-template #fixedColumnTemplate>\n <div class=\"datagrid-column datagrid-fixed-column\"></div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ClrLabel, selector: "label", inputs: ["id", "for"] }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrSpinner, selector: "clr-spinner", inputs: ["clrInline", "clrInverse", "clrSmall", "clrMedium"] }, { kind: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "component", type: ClrDatagridPlaceholder, selector: "clr-dg-placeholder" }, { kind: "component", type: ClrDatagridRow, selector: "clr-dg-row", inputs: ["clrDgDetailDisabled", "clrDgDetailHidden", "clrDgSkeletonLoading", "clrDgItem", "clrDgSelectable", "clrDgSelected", "clrDgExpanded", "clrDgDetailOpenLabel", "clrDgDetailCloseLabel", "clrDgRowSelectionLabel"], outputs: ["clrDgSelectedChange", "clrDgExpandedChange"] }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }, { kind: "directive", type: DatagridRowRenderer, selector: "clr-dg-row, clr-dg-row-detail" }, { kind: "directive", type: ActionableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }, { kind: "directive", type: ExpandableOompaLoompa, selector: "clr-datagrid, clr-dg-row" }] });
22056
22503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
22057
22504
  type: Component,
22058
22505
  args: [{ selector: 'clr-datagrid', providers: [
@@ -22074,7 +22521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22074
22521
  ], host: {
22075
22522
  '[class.datagrid-host]': 'true',
22076
22523
  '[class.datagrid-detail-open]': 'detailService.isOpen',
22077
- }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!virtualScroll\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n" }]
22524
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-content select=\"clr-dg-action-bar\"></ng-content>\n<div class=\"datagrid-outer-wrapper\">\n <div class=\"datagrid-inner-wrapper\">\n <div class=\"datagrid\" #datagrid [attr.aria-hidden]=\"detailService.isOpen ? true : null\">\n <div class=\"datagrid-table-wrapper\">\n <div role=\"grid\" class=\"datagrid-table\" tabindex=\"-1\" #datagridTable>\n <div role=\"rowgroup\" class=\"datagrid-header\">\n <div role=\"row\" class=\"datagrid-row\">\n <div class=\"datagrid-row-master datagrid-row-flex\">\n <div class=\"datagrid-row-sticky\">\n <!--header for datagrid where you can select multiple rows -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Multi\"\n (keydown.space)=\"toggleAllSelected($event)\"\n >\n <div *ngIf=\"!virtualScroll || customSelectAllEnabled\" class=\"clr-checkbox-wrapper\">\n <!-- We need to move focus and space-key handling to the parent because of keyboard arrow key navigation,\n which is not able to transfer focus directly on the input when focused with the tab key -->\n <input\n #selectAllCheckbox\n type=\"checkbox\"\n [id]=\"selectAllId\"\n [(ngModel)]=\"allSelected\"\n [attr.aria-label]=\"commonStrings.keys.selectAll\"\n tabindex=\"-1\"\n />\n <!-- Usage of class clr-col-null here prevents clr-col-* classes from being added when a datagrid is wrapped inside clrForm -->\n <label [for]=\"selectAllId\" class=\"clr-control-label clr-col-null\">\n <span class=\"clr-sr-only\">{{commonStrings.keys.selectAll}}</span>\n </label>\n </div>\n\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for datagrid where you can select one row only -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-select datagrid-fixed-column\"\n *ngIf=\"selection.selectionType === SELECTION_TYPE.Single\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleSelectionAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for single row action; only displayType if we have at least one actionable row in datagrid -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-row-actions datagrid-fixed-column\"\n *ngIf=\"rowActionService.hasActionableRow\"\n >\n <div class=\"clr-sr-only\">{{clrDgSingleActionableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n <!-- header for carets; only displayType if we have at least one expandable row in datagrid -->\n <div\n #stickyHeader\n role=\"columnheader\"\n class=\"datagrid-column datagrid-expandable-caret datagrid-fixed-column\"\n *ngIf=\"expandableRows.hasExpandableRow || detailService.enabled\"\n >\n <div class=\"clr-sr-only\">{{clrDetailExpandableAriaLabel}}</div>\n <div class=\"datagrid-column-separator\"></div>\n </div>\n </div>\n <div class=\"datagrid-row-scrollable\">\n <ng-container #projectedDisplayColumns></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div role=\"presentation\" class=\"datagrid-rows\">\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <ng-container #displayedRows></ng-container>\n\n <clr-dg-row class=\"datagrid-row-loading\" *ngIf=\"loadingMoreItems\">\n <clr-dg-cell>\n <clr-spinner clrMedium></clr-spinner>\n <span>{{ commonStrings.keys.loading }}</span>\n </clr-dg-cell>\n </clr-dg-row>\n\n <!-- Custom placeholder overrides the default empty one -->\n <ng-content select=\"clr-dg-placeholder\"></ng-content>\n <clr-dg-placeholder *ngIf=\"!placeholder\"></clr-dg-placeholder>\n </div>\n </div>\n </div>\n </div>\n <ng-content select=\"clr-dg-footer\"></ng-content>\n <div class=\"datagrid-spinner\" *ngIf=\"loading\">\n <clr-spinner clrMedium>Loading</clr-spinner>\n </div>\n </div>\n <ng-content select=\"[clrIfDetail],clr-dg-detail\"></ng-content>\n</div>\n\n<div class=\"datagrid-calculation-table\">\n <div class=\"datagrid-calculation-header\">\n <ng-container #projectedCalculationColumns></ng-container>\n </div>\n <ng-container #calculationRows></ng-container>\n</div>\n\n<ng-template #fixedColumnTemplate>\n <div class=\"datagrid-column datagrid-fixed-column\"></div>\n</ng-template>\n" }]
22078
22525
  }], ctorParameters: function () { return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
22079
22526
  type: Inject,
22080
22527
  args: [DOCUMENT]
@@ -22098,6 +22545,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22098
22545
  }], refresh: [{
22099
22546
  type: Output,
22100
22547
  args: ['clrDgRefresh']
22548
+ }], customSelectAllEnabled: [{
22549
+ type: Input,
22550
+ args: ['clrDgCustomSelectAllEnabled']
22551
+ }], customSelectAll: [{
22552
+ type: Output,
22553
+ args: ['clrDgCustomSelectAll']
22101
22554
  }], virtualScroll: [{
22102
22555
  type: ContentChild,
22103
22556
  args: [ClrDatagridVirtualScrollDirective]
@@ -22134,6 +22587,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22134
22587
  }], _calculationRows: [{
22135
22588
  type: ViewChild,
22136
22589
  args: ['calculationRows', { read: ViewContainerRef }]
22590
+ }], _fixedColumnTemplate: [{
22591
+ type: ViewChild,
22592
+ args: ['fixedColumnTemplate']
22593
+ }], stickyHeaders: [{
22594
+ type: ViewChildren,
22595
+ args: ['stickyHeader', { emitDistinctChangesOnly: true }]
22596
+ }], selectAllCheckbox: [{
22597
+ type: ViewChild,
22598
+ args: ['selectAllCheckbox']
22137
22599
  }], loading: [{
22138
22600
  type: Input,
22139
22601
  args: ['clrDgLoading']
@@ -25315,9 +25777,6 @@ class ClrTreeNode {
25315
25777
  return null;
25316
25778
  }
25317
25779
  }
25318
- get treeNodeContentTextOnly() {
25319
- return this.treeNodeLinkList.length === 0;
25320
- }
25321
25780
  get treeNodeLink() {
25322
25781
  return this.treeNodeLinkList && this.treeNodeLinkList.first;
25323
25782
  }
@@ -25488,7 +25947,7 @@ class ClrTreeNode {
25488
25947
  }
25489
25948
  }
25490
25949
  ClrTreeNode.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrTreeNode, deps: [{ token: PLATFORM_ID }, { token: ClrTreeNode, optional: true, skipSelf: true }, { token: TreeFeaturesService }, { token: IfExpandService }, { token: ClrCommonStringsService }, { token: TreeFocusManagerService }, { token: i0.ElementRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
25491
- ClrTreeNode.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTreeNode, selector: "clr-tree-node", inputs: { expandable: ["clrExpandable", "expandable"], disabled: ["clrDisabled", "disabled"], selected: ["clrSelected", "selected"], expanded: ["clrExpanded", "expanded"], clrForTypeAhead: "clrForTypeAhead" }, outputs: { selectedChange: "clrSelectedChange", expandedChange: "clrExpandedChange" }, host: { properties: { "class.clr-tree-node": "true", "class.disabled": "this._model.disabled" } }, providers: [TREE_FEATURES_PROVIDER, IfExpandService, { provide: LoadingListener, useExisting: IfExpandService }], queries: [{ propertyName: "treeNodeLinkList", predicate: ClrTreeNodeLink }], viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: RecursiveChildren, selector: "clr-recursive-children", inputs: ["parent", "children"] }], animations: [
25950
+ ClrTreeNode.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrTreeNode, selector: "clr-tree-node", inputs: { expandable: ["clrExpandable", "expandable"], disabled: ["clrDisabled", "disabled"], selected: ["clrSelected", "selected"], expanded: ["clrExpanded", "expanded"], clrForTypeAhead: "clrForTypeAhead" }, outputs: { selectedChange: "clrSelectedChange", expandedChange: "clrExpandedChange" }, host: { properties: { "class.clr-tree-node": "true", "class.disabled": "this._model.disabled" } }, providers: [TREE_FEATURES_PROVIDER, IfExpandService, { provide: LoadingListener, useExisting: IfExpandService }], queries: [{ propertyName: "treeNodeLinkList", predicate: ClrTreeNodeLink }], viewQueries: [{ propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div class=\"clr-treenode-content\" (mouseup)=\"focusTreeNode()\" *ngIf=\"!featuresService.selectable\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: RecursiveChildren, selector: "clr-recursive-children", inputs: ["parent", "children"] }], animations: [
25492
25951
  trigger('toggleChildrenAnim', [
25493
25952
  transition('collapsed => expanded', [style({ height: 0 }), animate(200, style({ height: '*' }))]),
25494
25953
  transition('expanded => collapsed', [style({ height: '*' }), animate(200, style({ height: 0 }))]),
@@ -25508,7 +25967,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
25508
25967
  ], host: {
25509
25968
  '[class.clr-tree-node]': 'true',
25510
25969
  '[class.disabled]': 'this._model.disabled',
25511
- }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div\n class=\"clr-treenode-content\"\n [class.clr-treenode-text-only]=\"treeNodeContentTextOnly\"\n (mouseup)=\"focusTreeNode()\"\n *ngIf=\"!featuresService.selectable\"\n >\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n" }]
25970
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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\n #contentContainer\n role=\"treeitem\"\n class=\"clr-tree-node-content-container\"\n tabindex=\"-1\"\n [class.clr-form-control-disabled]=\"disabled\"\n [attr.aria-disabled]=\"disabled\"\n [attr.aria-expanded]=\"isExpandable() ? expanded : null\"\n [attr.aria-selected]=\"ariaSelected\"\n (keydown)=\"onKeyDown($event)\"\n (focus)=\"broadcastFocusOnContainer()\"\n>\n <button\n *ngIf=\"isExpandable() && !isModelLoading && !expandService.loading\"\n aria-hidden=\"true\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"clr-treenode-caret\"\n (click)=\"expandService.toggle();\"\n (focus)=\"focusTreeNode()\"\n [disabled]=\"disabled\"\n >\n <cds-icon\n class=\"clr-treenode-caret-icon\"\n shape=\"angle\"\n [attr.direction]=\"expandService.expanded ? 'down' : 'right'\"\n ></cds-icon>\n </button>\n <div class=\"clr-treenode-spinner-container\" *ngIf=\"expandService.loading || isModelLoading\">\n <span class=\"clr-treenode-spinner spinner\"></span>\n </div>\n <div class=\"clr-checkbox-wrapper clr-treenode-checkbox\" *ngIf=\"featuresService.selectable\">\n <input\n aria-hidden=\"true\"\n type=\"checkbox\"\n [id]=\"nodeId + '-check'\"\n class=\"clr-checkbox\"\n [disabled]=\"disabled\"\n [checked]=\"_model.selected.value === STATES.SELECTED\"\n [indeterminate]=\"_model.selected.value === STATES.INDETERMINATE\"\n (change)=\"_model.toggleSelection(featuresService.eager)\"\n (focus)=\"focusTreeNode()\"\n tabindex=\"-1\"\n />\n <label [for]=\"nodeId + '-check'\" class=\"clr-control-label\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </label>\n </div>\n <div class=\"clr-treenode-content\" (mouseup)=\"focusTreeNode()\" *ngIf=\"!featuresService.selectable\">\n <ng-container [ngTemplateOutlet]=\"treenodeContent\"></ng-container>\n </div>\n\n <ng-template #treenodeContent>\n <ng-content></ng-content>\n <div class=\"clr-sr-only\" *ngIf=\"featuresService.selectable || ariaSelected\">\n <span> {{ariaSelected ? commonStrings.keys.selectedTreeNode : commonStrings.keys.unselectedTreeNode}}</span>\n </div>\n </ng-template>\n</div>\n<div\n class=\"clr-treenode-children\"\n [@toggleChildrenAnim]=\"expandService.expanded ? 'expanded' : 'collapsed'\"\n [attr.role]=\"isExpandable() && !featuresService.recursion ? 'group' : null\"\n>\n <ng-content select=\"clr-tree-node\"></ng-content>\n <ng-content select=\"[clrIfExpanded]\"></ng-content>\n <clr-recursive-children [parent]=\"_model\"></clr-recursive-children>\n</div>\n" }]
25512
25971
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
25513
25972
  type: Inject,
25514
25973
  args: [PLATFORM_ID]
@@ -26431,7 +26890,7 @@ class ClrModal {
26431
26890
  }
26432
26891
  }
26433
26892
  ClrModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModal, deps: [{ token: ScrollingService }, { token: ClrCommonStringsService }, { token: ModalStackService }, { token: ClrModalConfigurationService }], target: i0.ɵɵFactoryTarget.Component });
26434
- ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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 *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <ng-content select=\".leading-button\"></ng-content>\n <div class=\"modal-title-wrapper\" #title [id]=\"modalId\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
26893
+ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModal, selector: "clr-modal", inputs: { _open: ["clrModalOpen", "_open"], closable: ["clrModalClosable", "closable"], closeButtonAriaLabel: ["clrModalCloseButtonAriaLabel", "closeButtonAriaLabel"], size: ["clrModalSize", "size"], staticBackdrop: ["clrModalStaticBackdrop", "staticBackdrop"], skipAnimation: ["clrModalSkipAnimation", "skipAnimation"], stopClose: ["clrModalPreventClose", "stopClose"], labelledBy: ["clrModalLabelledById", "labelledBy"], bypassScrollService: ["clrModalOverrideScrollService", "bypassScrollService"] }, outputs: { _openChanged: "clrModalOpenChange", altClose: "clrModalAlternateClose" }, host: { properties: { "class.open": "this._open" } }, queries: [{ propertyName: "modalContentTemplate", first: true, predicate: ["clrInternalModalContentTemplate"], descendants: true }], viewQueries: [{ propertyName: "title", first: true, predicate: ["title"], descendants: true }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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 *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <!-- This wizard is tightly coupled to the modal styles, so changes here could require changes in the wizard. -->\n <div *ngIf=\"!modalContentTemplate; else modalContentTemplate\" class=\"modal-content-wrapper\">\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <ng-content select=\".leading-button\"></ng-content>\n <div class=\"modal-title-wrapper\" #title [id]=\"modalId\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdkTrapFocusModule_CdkTrapFocus, selector: "[cdkTrapFocus]" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }], viewProviders: [ScrollingService], animations: [
26435
26894
  trigger('fadeMove', [
26436
26895
  transition('* => fadeDown', [
26437
26896
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -26466,7 +26925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26466
26925
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
26467
26926
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
26468
26927
  ]),
26469
- ], template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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 *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <div class=\"modal-content-wrapper\">\n <!-- only used in wizards -->\n <ng-content select=\".modal-nav\"></ng-content>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <ng-content select=\".leading-button\"></ng-content>\n <div class=\"modal-title-wrapper\" #title [id]=\"modalId\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
26928
+ ], template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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 *ngIf=\"_open\" class=\"modal\" [class.modal-full-screen]=\"size == 'full-screen'\">\n <!--fixme: revisit when ngClass works with exit animation-->\n <div\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n [@fadeMove]=\"fadeMove\"\n (@fadeMove.done)=\"fadeDone($event)\"\n class=\"modal-dialog\"\n [class.modal-sm]=\"size == 'sm'\"\n [class.modal-lg]=\"size == 'lg'\"\n [class.modal-xl]=\"size == 'xl'\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-hidden]=\"!_open\"\n [attr.aria-labelledby]=\"labelledBy || modalId\"\n >\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentStart}}</div>\n <!-- This wizard is tightly coupled to the modal styles, so changes here could require changes in the wizard. -->\n <div *ngIf=\"!modalContentTemplate; else modalContentTemplate\" class=\"modal-content-wrapper\">\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <ng-content select=\".leading-button\"></ng-content>\n <div class=\"modal-title-wrapper\" #title [id]=\"modalId\" cdkFocusInitial tabindex=\"-1\">\n <ng-content select=\".modal-title\"></ng-content>\n </div>\n <button\n type=\"button\"\n [attr.aria-label]=\"closeButtonAriaLabel || commonStrings.keys.close\"\n class=\"close\"\n *ngIf=\"closable\"\n (click)=\"close()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <ng-content select=\".modal-body\"></ng-content>\n </div>\n <ng-content select=\".modal-footer\"></ng-content>\n </div>\n </div>\n <div class=\"clr-sr-only\">{{commonStrings.keys.modalContentEnd}}</div>\n </div>\n</div>\n\n<div [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
26470
26929
  }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
26471
26930
  type: ViewChild,
26472
26931
  args: ['title']
@@ -26506,6 +26965,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26506
26965
  }], bypassScrollService: [{
26507
26966
  type: Input,
26508
26967
  args: ['clrModalOverrideScrollService']
26968
+ }], modalContentTemplate: [{
26969
+ type: ContentChild,
26970
+ args: ['clrInternalModalContentTemplate']
26509
26971
  }], bodyElementRef: [{
26510
26972
  type: ViewChild,
26511
26973
  args: ['body']
@@ -29373,6 +29835,15 @@ class ClrWizard {
29373
29835
  * Set the modal size of the wizard. Set using `[clrWizardSize]` input.
29374
29836
  */
29375
29837
  this.size = 'xl';
29838
+ /**
29839
+ * Enable "in page" wizard. Set using `[clrWizardInPage]` input.
29840
+ */
29841
+ this.inPage = false;
29842
+ /**
29843
+ * Make an "in page" wizard fill the `.content-area`. Set using `[clrWizardInPageFillContentArea]` input.
29844
+ * If you can't use this option, you will likely need to provide custom CSS to set the wizard's height and margins.
29845
+ */
29846
+ this.inPageFillContentArea = false;
29376
29847
  /**
29377
29848
  * Tells the modal part of the wizard whether it should have a close "X"
29378
29849
  * in the top right corner. Set using `[clrWizardClosable]` input.
@@ -29531,6 +30002,9 @@ class ClrWizard {
29531
30002
  ngAfterContentInit() {
29532
30003
  this.pageCollection.pages = this.pages;
29533
30004
  this.headerActionService.wizardHeaderActions = this.headerActions;
30005
+ if (this.inPage) {
30006
+ this.open();
30007
+ }
29534
30008
  this.initializeButtons();
29535
30009
  }
29536
30010
  ngDoCheck() {
@@ -29725,7 +30199,7 @@ class ClrWizard {
29725
30199
  this.pageTitle?.nativeElement.focus();
29726
30200
  this.currentPageChanged.emit();
29727
30201
  // scroll to top of page in case there is long page content
29728
- this.modal?.scrollTop();
30202
+ this.bodyElementRef?.nativeElement.scrollTo(0, 0);
29729
30203
  });
29730
30204
  }
29731
30205
  updateNavOnPageChanges() {
@@ -29749,7 +30223,7 @@ class ClrWizard {
29749
30223
  }
29750
30224
  }
29751
30225
  ClrWizard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: WizardNavigationService }, { token: PageCollectionService }, { token: ButtonHubService }, { token: HeaderActionService }, { token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
29752
- ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.lastPage": "navService.currentPageIsLast" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }, { propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: ["label"] }] });
30226
+ ClrWizard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizard, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], inPage: ["clrWizardInPage", "inPage"], inPageFillContentArea: ["clrWizardInPageFillContentArea", "inPageFillContentArea"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.wizard-in-page": "inPage", "class.wizard-in-page--fill-content-area": "inPage && inPageFillContentArea" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-container *ngIf=\"inPage; then wizardTemplate; else wizardModalTemplate\"></ng-container>\n\n<ng-template #wizardModalTemplate>\n <clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n >\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"wizardTemplate\"></ng-container>\n </ng-template>\n </clr-modal>\n</ng-template>\n\n<!-- This template is tightly coupled to the modal styles. -->\n<ng-template #wizardTemplate>\n <div class=\"modal-content-wrapper\">\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"closable && !inPage\"\n type=\"button\"\n class=\"close\"\n [attr.aria-label]=\"commonStrings.keys.close\"\n (click)=\"modalCancel()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: ClrModalBody, selector: ".modal-body" }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: ["label"] }] });
29753
30227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
29754
30228
  type: Component,
29755
30229
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -29757,8 +30231,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29757
30231
  '[class.wizard-md]': "size == 'md'",
29758
30232
  '[class.wizard-lg]': "size == 'lg'",
29759
30233
  '[class.wizard-xl]': "size == 'xl'",
29760
- '[class.lastPage]': 'navService.currentPageIsLast',
29761
- }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-title\" role=\"heading\" [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\">\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n</clr-modal>\n" }]
30234
+ '[class.wizard-in-page]': 'inPage',
30235
+ '[class.wizard-in-page--fill-content-area]': 'inPage && inPageFillContentArea',
30236
+ }, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\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<ng-container *ngIf=\"inPage; then wizardTemplate; else wizardModalTemplate\"></ng-container>\n\n<ng-template #wizardModalTemplate>\n <clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n >\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"wizardTemplate\"></ng-container>\n </ng-template>\n </clr-modal>\n</ng-template>\n\n<!-- This template is tightly coupled to the modal styles. -->\n<ng-template #wizardTemplate>\n <div class=\"modal-content-wrapper\">\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n\n <div class=\"modal-header-actions-wrapper\" *ngIf=\"headerActionService.displayHeaderActionsWrapper\">\n <div *ngIf=\"headerActionService.showWizardHeaderActions\">\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n </div>\n <div *ngIf=\"headerActionService.currentPageHasHeaderActions\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.headerActions\"></ng-template>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"closable && !inPage\"\n type=\"button\"\n class=\"close\"\n [attr.aria-label]=\"commonStrings.keys.close\"\n (click)=\"modalCancel()\"\n >\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n </div>\n <div #body class=\"modal-body-wrapper\">\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n *ngIf=\"navService.currentPage && !navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-content select=\"clr-wizard-button\"></ng-content>\n </div>\n <div\n *ngIf=\"navService.currentPage && navService.currentPage.hasButtons\"\n class=\"clr-wizard-footer-buttons-wrapper\"\n >\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n" }]
29762
30237
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
29763
30238
  type: Inject,
29764
30239
  args: [PLATFORM_ID]
@@ -29768,6 +30243,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29768
30243
  }], size: [{
29769
30244
  type: Input,
29770
30245
  args: ['clrWizardSize']
30246
+ }], inPage: [{
30247
+ type: Input,
30248
+ args: ['clrWizardInPage']
30249
+ }], inPageFillContentArea: [{
30250
+ type: Input,
30251
+ args: ['clrWizardInPageFillContentArea']
29771
30252
  }], closable: [{
29772
30253
  type: Input,
29773
30254
  args: ['clrWizardClosable']
@@ -29807,6 +30288,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29807
30288
  }], wizardTitle: [{
29808
30289
  type: ContentChild,
29809
30290
  args: [ClrWizardTitle]
30291
+ }], bodyElementRef: [{
30292
+ type: ViewChild,
30293
+ args: ['body']
29810
30294
  }], modal: [{
29811
30295
  type: ViewChild,
29812
30296
  args: [ClrModal]
@@ -30386,9 +30870,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30386
30870
  * The full license information can be found in LICENSE in the root directory of this project.
30387
30871
  */
30388
30872
 
30873
+ /*
30874
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
30875
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
30876
+ * This software is released under MIT license.
30877
+ * The full license information can be found in LICENSE in the root directory of this project.
30878
+ */
30879
+
30389
30880
  /**
30390
30881
  * Generated bundle index. Do not edit.
30391
30882
  */
30392
30883
 
30393
- export { CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, CLR_ICON_DIRECTIVES, CLR_LAYOUT_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, CLR_LOADING_DIRECTIVES, CLR_MENU_POSITIONS, CLR_MODAL_DIRECTIVES, CLR_NAVIGATION_DIRECTIVES, CLR_PROGRESS_BAR_DIRECTIVES, CLR_SIDEPANEL_DIRECTIVES, CLR_SIGNPOST_DIRECTIVES, CLR_SPINNER_DIRECTIVES, CLR_STACK_VIEW_DIRECTIVES, CLR_TABS_DIRECTIVES, CLR_TOOLTIP_DIRECTIVES, CLR_TREE_VIEW_DIRECTIVES, CLR_VERTICAL_NAV_DIRECTIVES, CLR_WIZARD_DIRECTIVES, CONDITIONAL_DIRECTIVES, CUSTOM_BUTTON_TYPES, CdsIconCustomTag, ClarityModule, ClrAbstractContainer, ClrAccordion, ClrAccordionContent, ClrAccordionDescription, ClrAccordionModule, ClrAccordionPanel, ClrAccordionTitle, ClrAlert, ClrAlertItem, ClrAlertModule, ClrAlertText, ClrAlerts, ClrAlertsPager, ClrAlignment, ClrAriaCurrentLink, ClrAxis, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, ClrDateInputBase, ClrDateInputValidator, ClrDatepickerActions, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrEndDateInput, ClrEndDateInputValidator, ClrExpandableAnimation, ClrFileError, ClrFileInfo, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, ClrFileList, ClrFileMessagesTemplate, ClrFileSuccess, ClrFocusOnViewInit, ClrFocusOnViewInitModule, ClrForm, ClrFormLayout, ClrFormsModule, ClrHeader, ClrIconCustomTag, ClrIconModule, ClrIfActive, ClrIfDetail, ClrIfError, ClrIfExpanded, ClrIfOpen, ClrIfSuccess, ClrInput, ClrInputContainer, ClrInputModule, ClrLabel, ClrLayout, ClrLayoutModule, ClrLoading, ClrLoadingButton, ClrLoadingButtonModule, ClrLoadingModule, ClrLoadingState, ClrMainContainer, ClrMainContainerModule, ClrModal, ClrModalBody, ClrModalConfigurationService, ClrModalHostDirective, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionItems, ClrOptionSelected, ClrOptions, ClrPassword, ClrPasswordContainer, ClrPasswordModule, ClrPopoverAnchor, ClrPopoverContent, ClrPopoverEventsService, ClrPopoverHostDirective, ClrPopoverModule, ClrPopoverPositionService, ClrPopoverToggleService, ClrProgressBar, ClrProgressBarModule, ClrRadio, ClrRadioContainer, ClrRadioModule, ClrRadioWrapper, ClrRange, ClrRangeContainer, ClrRangeModule, ClrRecursiveForOf, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrSelectedState, ClrSide, ClrSidePanel, ClrSidePanelModule, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStartDateInput, ClrStartDateInputValidator, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
30884
+ export { BaseExpandableAnimation, CHANGE_KEYS, CLR_ALERT_DIRECTIVES, CLR_BUTTON_GROUP_DIRECTIVES, CLR_DATAGRID_DIRECTIVES, CLR_DATEPICKER_DIRECTIVES, CLR_DROPDOWN_DIRECTIVES, CLR_FILE_MESSAGES_TEMPLATE_CONTEXT, CLR_ICON_DIRECTIVES, CLR_LAYOUT_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, CLR_LOADING_DIRECTIVES, CLR_MENU_POSITIONS, CLR_MODAL_DIRECTIVES, CLR_NAVIGATION_DIRECTIVES, CLR_PROGRESS_BAR_DIRECTIVES, CLR_SIDEPANEL_DIRECTIVES, CLR_SIGNPOST_DIRECTIVES, CLR_SPINNER_DIRECTIVES, CLR_STACK_VIEW_DIRECTIVES, CLR_TABS_DIRECTIVES, CLR_TOOLTIP_DIRECTIVES, CLR_TREE_VIEW_DIRECTIVES, CLR_VERTICAL_NAV_DIRECTIVES, CLR_WIZARD_DIRECTIVES, CONDITIONAL_DIRECTIVES, CUSTOM_BUTTON_TYPES, CdsIconCustomTag, ClarityModule, ClrAbstractContainer, ClrAccordion, ClrAccordionContent, ClrAccordionDescription, ClrAccordionModule, ClrAccordionPanel, ClrAccordionTitle, ClrAlert, ClrAlertItem, ClrAlertModule, ClrAlertText, ClrAlerts, ClrAlertsPager, ClrAlignment, ClrAriaCurrentLink, ClrAxis, ClrBreadcrumbItem, ClrBreadcrumbs, ClrBreadcrumbsModule, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrCalendar, ClrCheckbox, ClrCheckboxContainer, ClrCheckboxModule, ClrCheckboxWrapper, ClrCombobox, ClrComboboxContainer, ClrComboboxModule, ClrCommonFormsModule, ClrCommonStringsService, ClrConditionalModule, ClrControl, ClrControlContainer, ClrControlError, ClrControlHelper, ClrControlSuccess, ClrDataModule, ClrDatagrid, ClrDatagridActionBar, ClrDatagridActionOverflow, ClrDatagridCell, ClrDatagridColumn, ClrDatagridColumnSeparator, ClrDatagridColumnToggle, ClrDatagridColumnToggleButton, ClrDatagridDetail, ClrDatagridDetailBody, ClrDatagridDetailHeader, ClrDatagridFilter, ClrDatagridFooter, ClrDatagridHideableColumn, ClrDatagridItems, ClrDatagridModule, ClrDatagridPageSize, ClrDatagridPagination, ClrDatagridPlaceholder, ClrDatagridRow, ClrDatagridRowDetail, ClrDatagridSortOrder, ClrDatalist, ClrDatalistContainer, ClrDatalistInput, ClrDatalistModule, ClrDateContainer, ClrDateInput, ClrDateInputBase, ClrDateInputValidator, ClrDatepickerActions, ClrDatepickerModule, ClrDatepickerViewManager, ClrDay, ClrDaypicker, ClrDestroyService, ClrDropdown, ClrDropdownItem, ClrDropdownMenu, ClrDropdownModule, ClrDropdownTrigger, ClrEmphasisModule, ClrEndDateInput, ClrEndDateInputValidator, ClrExpandableAnimation, ClrFileError, ClrFileInfo, ClrFileInput, ClrFileInputContainer, ClrFileInputModule, ClrFileInputValidator, ClrFileInputValueAccessor, ClrFileList, ClrFileMessagesTemplate, ClrFileSuccess, ClrFocusOnViewInit, ClrFocusOnViewInitModule, ClrForm, ClrFormLayout, ClrFormsModule, ClrHeader, ClrIconCustomTag, ClrIconModule, ClrIfActive, ClrIfDetail, ClrIfError, ClrIfExpanded, ClrIfOpen, ClrIfSuccess, ClrInput, ClrInputContainer, ClrInputModule, ClrLabel, ClrLayout, ClrLayoutModule, ClrLoading, ClrLoadingButton, ClrLoadingButtonModule, ClrLoadingModule, ClrLoadingState, ClrMainContainer, ClrMainContainerModule, ClrModal, ClrModalBody, ClrModalConfigurationService, ClrModalHostDirective, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionItems, ClrOptionSelected, ClrOptions, ClrPassword, ClrPasswordContainer, ClrPasswordModule, ClrPopoverAnchor, ClrPopoverContent, ClrPopoverEventsService, ClrPopoverHostDirective, ClrPopoverModule, ClrPopoverPositionService, ClrPopoverToggleService, ClrProgressBar, ClrProgressBarModule, ClrRadio, ClrRadioContainer, ClrRadioModule, ClrRadioWrapper, ClrRange, ClrRangeContainer, ClrRangeModule, ClrRecursiveForOf, ClrSelect, ClrSelectContainer, ClrSelectModule, ClrSelectedState, ClrSide, ClrSidePanel, ClrSidePanelModule, ClrSignpost, ClrSignpostContent, ClrSignpostModule, ClrSignpostTitle, ClrSignpostTrigger, ClrSpinner, ClrSpinnerModule, ClrStackBlock, ClrStackContentInput, ClrStackHeader, ClrStackView, ClrStackViewCustomTags, ClrStackViewLabel, ClrStackViewModule, ClrStandaloneCdkTrapFocus, ClrStartDateInput, ClrStartDateInputValidator, ClrStepButton, ClrStepButtonType, ClrStepper, ClrStepperModule, ClrStepperPanel, ClrStopEscapePropagationDirective, ClrTab, ClrTabAction, ClrTabContent, ClrTabLink, ClrTabOverflowContent, ClrTabs, ClrTabsActions, ClrTabsModule, ClrTextarea, ClrTextareaContainer, ClrTextareaModule, ClrTimeline, ClrTimelineLayout, ClrTimelineModule, ClrTimelineStep, ClrTimelineStepDescription, ClrTimelineStepHeader, ClrTimelineStepState, ClrTimelineStepTitle, ClrTooltip, ClrTooltipContent, ClrTooltipModule, ClrTooltipTrigger, ClrTree, ClrTreeNode, ClrTreeNodeLink, ClrTreeViewModule, ClrVerticalNav, ClrVerticalNavGroup, ClrVerticalNavGroupChildren, ClrVerticalNavIcon, ClrVerticalNavLink, ClrVerticalNavModule, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, ClrYearpicker, DEFAULT_BUTTON_TYPES, DatagridNumericFilter, DatagridPropertyComparator, DatagridPropertyNumericFilter, DatagridPropertyStringFilter, DatagridStringFilter, EXPANDABLE_ANIMATION_DIRECTIVES, FOCUS_ON_VIEW_INIT, FOCUS_ON_VIEW_INIT_DIRECTIVES, IS_TOGGLE, IS_TOGGLE_PROVIDER, LoadingListener, MainContainerWillyWonka, NavDetectionOompaLoompa, TOGGLE_SERVICE, TOGGLE_SERVICE_PROVIDER, ToggleServiceFactory, WrappedFormControl, collapse, commonStringsDefault, fade, fadeSlide, isToggleFactory, slide, AccordionOompaLoompa as ÇlrAccordionOompaLoompa, AccordionWillyWonka as ÇlrAccordionWillyWonka, ActionableOompaLoompa as ÇlrActionableOompaLoompa, ActiveOompaLoompa as ÇlrActiveOompaLoompa, ClrPopoverCloseButton as ÇlrClrPopoverCloseButton, ClrPopoverModuleNext as ÇlrClrPopoverModuleNext, ClrPopoverOpenCloseButton as ÇlrClrPopoverOpenCloseButton, DatagridCellRenderer as ÇlrDatagridCellRenderer, DatagridDetailRegisterer as ÇlrDatagridDetailRegisterer, DatagridHeaderRenderer as ÇlrDatagridHeaderRenderer, DatagridMainRenderer as ÇlrDatagridMainRenderer, DatagridRowRenderer as ÇlrDatagridRowRenderer, ClrDatagridSelectionCellDirective as ÇlrDatagridSelectionCellDirective, ClrDatagridVirtualScrollDirective as ÇlrDatagridVirtualScrollDirective, DatagridWillyWonka as ÇlrDatagridWillyWonka, ExpandableOompaLoompa as ÇlrExpandableOompaLoompa, StepperOompaLoompa as ÇlrStepperOompaLoompa, StepperWillyWonka as ÇlrStepperWillyWonka, TabsWillyWonka as ÇlrTabsWillyWonka, WrappedCell as ÇlrWrappedCell, WrappedColumn as ÇlrWrappedColumn, WrappedRow as ÇlrWrappedRow };
30394
30885
  //# sourceMappingURL=clr-angular.mjs.map