@clr/angular 17.9.0 → 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 (50) hide show
  1. package/clarity.api.md +92 -52
  2. package/data/datagrid/datagrid-row.d.ts +5 -4
  3. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +3 -7
  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/esm2020/data/datagrid/datagrid-column.mjs +8 -12
  15. package/esm2020/data/datagrid/datagrid-row.mjs +21 -8
  16. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +23 -20
  17. package/esm2020/data/datagrid/datagrid.mjs +48 -17
  18. package/esm2020/data/datagrid/index.mjs +2 -1
  19. package/esm2020/data/datagrid/interfaces/key-nav-grid-strategy.interface.mjs +8 -0
  20. package/esm2020/data/datagrid/interfaces/virtual-scroll-data-range.interface.mjs +8 -0
  21. package/esm2020/data/datagrid/providers/items.mjs +5 -1
  22. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +18 -243
  23. package/esm2020/data/datagrid/utils/key-navigation-strategies/default.mjs +132 -0
  24. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.mjs +132 -0
  25. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-row.mjs +168 -0
  26. package/esm2020/data/datagrid/utils/key-navigation-utils.mjs +108 -0
  27. package/esm2020/layout/breadcrumbs/breadcrumbs.mjs +2 -2
  28. package/esm2020/modal/modal.mjs +7 -4
  29. package/esm2020/popover/common/popover.mjs +2 -2
  30. package/esm2020/utils/animations/constants.mjs +7 -1
  31. package/esm2020/utils/animations/expandable-animation/base-expandable-animation.mjs +38 -0
  32. package/esm2020/utils/animations/expandable-animation/expandable-animation.directive.mjs +56 -0
  33. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +10 -32
  34. package/esm2020/utils/animations/expandable-animation/expandable-animation.module.mjs +3 -2
  35. package/esm2020/utils/animations/expandable-animation/index.mjs +4 -2
  36. package/esm2020/utils/focus/focusable-item/basic-focusable-item.service.mjs +2 -2
  37. package/esm2020/wizard/wizard.mjs +29 -6
  38. package/fesm2015/clr-angular.mjs +790 -338
  39. package/fesm2015/clr-angular.mjs.map +1 -1
  40. package/fesm2020/clr-angular.mjs +788 -334
  41. package/fesm2020/clr-angular.mjs.map +1 -1
  42. package/modal/modal.d.ts +3 -2
  43. package/package.json +2 -2
  44. package/utils/animations/constants.d.ts +1 -0
  45. package/utils/animations/expandable-animation/base-expandable-animation.d.ts +13 -0
  46. package/utils/animations/expandable-animation/expandable-animation.d.ts +2 -6
  47. package/utils/animations/expandable-animation/expandable-animation.directive.d.ts +16 -0
  48. package/utils/animations/expandable-animation/expandable-animation.module.d.ts +3 -2
  49. package/utils/animations/expandable-animation/index.d.ts +1 -0
  50. 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
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';
@@ -235,6 +236,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
235
236
  * The full license information can be found in LICENSE in the root directory of this project.
236
237
  */
237
238
  const defaultAnimationTiming = '0.2s ease-in-out';
239
+ const defaultExpandAnimation = animation([style({ height: '{{ startHeight }}px' }), animate(defaultAnimationTiming, style({ height: '*' }))], {
240
+ params: {
241
+ startHeight: 0, // default
242
+ },
243
+ });
238
244
 
239
245
  /*
240
246
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -3117,54 +3123,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3117
3123
  * This software is released under MIT license.
3118
3124
  * The full license information can be found in LICENSE in the root directory of this project.
3119
3125
  */
3120
- class ClrExpandableAnimation {
3126
+ class BaseExpandableAnimation {
3121
3127
  constructor(element, domAdapter, renderer) {
3122
3128
  this.element = element;
3123
3129
  this.domAdapter = domAdapter;
3124
3130
  this.renderer = renderer;
3125
- this.clrExpandTrigger = false;
3126
3131
  this.startHeight = 0;
3127
3132
  }
3133
+ updateStartHeight() {
3134
+ this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3135
+ }
3136
+ initAnimationEffects() {
3137
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3138
+ }
3139
+ cleanupAnimationEffects(cancelAnimations = false) {
3140
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3141
+ // A "safe" auto-update of the height ensuring basic OOTB user experience .
3142
+ // Prone to small jumps in initial animation height if data was changed in the meantime, the window was resized, etc.
3143
+ // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3144
+ this.updateStartHeight();
3145
+ if (cancelAnimations) {
3146
+ this.cancelElementAnimations();
3147
+ }
3148
+ }
3149
+ cancelElementAnimations() {
3150
+ this.element.nativeElement.getAnimations().forEach(animation => {
3151
+ if (animation.playState === 'finished') {
3152
+ animation.cancel(); // clears animation-style set on the element
3153
+ }
3154
+ });
3155
+ }
3156
+ }
3157
+
3158
+ /*
3159
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3160
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3161
+ * This software is released under MIT license.
3162
+ * The full license information can be found in LICENSE in the root directory of this project.
3163
+ */
3164
+ class ClrExpandableAnimation extends BaseExpandableAnimation {
3165
+ constructor(element, domAdapter, renderer) {
3166
+ super(element, domAdapter, renderer);
3167
+ this.clrExpandTrigger = false;
3168
+ }
3128
3169
  get expandAnimation() {
3129
3170
  return { value: this.clrExpandTrigger, params: { startHeight: this.startHeight } };
3130
3171
  }
3131
3172
  animationStart(event) {
3132
3173
  if (event.fromState !== 'void') {
3133
- this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3174
+ this.initAnimationEffects();
3134
3175
  }
3135
3176
  }
3136
3177
  animationDone(event) {
3137
3178
  if (event.fromState !== 'void') {
3138
- this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3139
- // A "safe" auto-update of the height ensuring basic OOTB user experience .
3140
- // Prone to small jumps in initial animation height if data was changed in the meantime, window was resized, etc.
3141
- // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3142
- this.updateStartHeight();
3179
+ this.cleanupAnimationEffects();
3143
3180
  }
3144
3181
  }
3145
- updateStartHeight() {
3146
- this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3147
- }
3148
3182
  }
3149
3183
  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 });
3150
- 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: [
3151
- trigger('expandAnimation', [
3152
- transition('true <=> false', [
3153
- style({ height: '{{startHeight}}px' }),
3154
- animate('0.2s ease-in-out', style({ height: '*' })),
3155
- ]),
3156
- ]),
3157
- ] });
3184
+ 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)])])] });
3158
3185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, decorators: [{
3159
3186
  type: Component,
3160
- args: [{ selector: 'clr-expandable-animation', template: `<ng-content></ng-content>`, animations: [
3161
- trigger('expandAnimation', [
3162
- transition('true <=> false', [
3163
- style({ height: '{{startHeight}}px' }),
3164
- animate('0.2s ease-in-out', style({ height: '*' })),
3165
- ]),
3166
- ]),
3167
- ], providers: [DomAdapter], styles: [":host{display:block}\n"] }]
3187
+ 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"] }]
3168
3188
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }]; }, propDecorators: { clrExpandTrigger: [{
3169
3189
  type: Input
3170
3190
  }], expandAnimation: [{
@@ -3184,7 +3204,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3184
3204
  * This software is released under MIT license.
3185
3205
  * The full license information can be found in LICENSE in the root directory of this project.
3186
3206
  */
3187
- const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation];
3207
+ class ClrExpandableAnimationDirective extends BaseExpandableAnimation {
3208
+ constructor(element, domAdapter, renderer, builder) {
3209
+ super(element, domAdapter, renderer);
3210
+ this.builder = builder;
3211
+ this.expanded = false;
3212
+ }
3213
+ ngOnChanges(changes) {
3214
+ if (changes['expanded'] && !changes['expanded'].firstChange) {
3215
+ Promise.resolve().then(() => this.playAnimation());
3216
+ }
3217
+ }
3218
+ ngOnDestroy() {
3219
+ var _a;
3220
+ (_a = this.player) === null || _a === void 0 ? void 0 : _a.destroy();
3221
+ }
3222
+ playAnimation() {
3223
+ if (this.player) {
3224
+ this.player.destroy();
3225
+ }
3226
+ this.player = this.builder
3227
+ .build([useAnimation(defaultExpandAnimation, { params: { startHeight: this.startHeight } })])
3228
+ .create(this.element.nativeElement);
3229
+ this.player.onStart(() => this.initAnimationEffects());
3230
+ this.player.onDone(() => this.cleanupAnimationEffects(true));
3231
+ this.player.play();
3232
+ }
3233
+ }
3234
+ 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 });
3235
+ 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 });
3236
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, decorators: [{
3237
+ type: Directive,
3238
+ args: [{
3239
+ selector: '[clrExpandableAnimation]',
3240
+ providers: [DomAdapter],
3241
+ host: {
3242
+ '[class.clr-expandable-animation]': 'true',
3243
+ },
3244
+ }]
3245
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }, { type: i2.AnimationBuilder }]; }, propDecorators: { expanded: [{
3246
+ type: Input,
3247
+ args: ['clrExpandableAnimation']
3248
+ }] } });
3249
+
3250
+ /*
3251
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3252
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3253
+ * This software is released under MIT license.
3254
+ * The full license information can be found in LICENSE in the root directory of this project.
3255
+ */
3256
+ const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation, ClrExpandableAnimationDirective];
3188
3257
 
3189
3258
  /*
3190
3259
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -5185,7 +5254,7 @@ class Popover {
5185
5254
  this._scroll = new Subject();
5186
5255
  const anchor = e;
5187
5256
  let current = e;
5188
- while (current && current !== document) {
5257
+ while (current && current !== document && current.nodeType === Node.ELEMENT_NODE) {
5189
5258
  if (this.scrolls(current)) {
5190
5259
  current.addEventListener('scroll', this.boundOnScrollListener);
5191
5260
  this.scrollableElements.push(current);
@@ -5516,7 +5585,7 @@ class BasicFocusableItem {
5516
5585
  if (isPlatformBrowser(this.platformId)) {
5517
5586
  this.renderer.setAttribute(this.el.nativeElement, 'tabindex', '0');
5518
5587
  this.el.nativeElement.focus();
5519
- this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });
5588
+ this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
5520
5589
  }
5521
5590
  }
5522
5591
  blur() {
@@ -10049,14 +10118,14 @@ class ClrBreadcrumbs {
10049
10118
  }
10050
10119
  }
10051
10120
  ClrBreadcrumbs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, deps: [{ token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
10052
- 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" }] });
10121
+ 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" }] });
10053
10122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, decorators: [{
10054
10123
  type: Component,
10055
10124
  args: [{ selector: 'clr-breadcrumbs', host: {
10056
10125
  class: 'clr-breadcrumb',
10057
10126
  '[attr.aria-label]': 'commonStrings.keys.breadcrumbsLabel',
10058
10127
  '[attr.role]': '"navigation"',
10059
- }, 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"] }]
10128
+ }, 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"] }]
10060
10129
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { items: [{
10061
10130
  type: Input
10062
10131
  }], clrBreadcrumbItemClick: [{
@@ -17338,7 +17407,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17338
17407
  class ClrExpandableAnimationModule {
17339
17408
  }
17340
17409
  ClrExpandableAnimationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17341
- ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation], imports: [CommonModule], exports: [ClrExpandableAnimation] });
17410
+ ClrExpandableAnimationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, declarations: [ClrExpandableAnimation, ClrExpandableAnimationDirective], imports: [CommonModule], exports: [ClrExpandableAnimation, ClrExpandableAnimationDirective] });
17342
17411
  ClrExpandableAnimationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, imports: [CommonModule] });
17343
17412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, decorators: [{
17344
17413
  type: NgModule,
@@ -17362,7 +17431,7 @@ class CdkDragModule_CdkDrag extends CdkDrag {
17362
17431
  super(elementRef, dropContainer, document, ngZone, viewContainerRef, config, dir, dragDrop, changeDetectorRef);
17363
17432
  }
17364
17433
  }
17365
- 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 });
17434
+ 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 });
17366
17435
  CdkDragModule_CdkDrag.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: CdkDragModule_CdkDrag, selector: "[cdkDrag]", usesInheritance: true, ngImport: i0 });
17367
17436
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, decorators: [{
17368
17437
  type: Directive,
@@ -17385,7 +17454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17385
17454
  }, {
17386
17455
  type: Inject,
17387
17456
  args: [CDK_DRAG_CONFIG]
17388
- }] }, { type: i1$3.Directionality }, { type: i2.DragDrop }, { type: i0.ChangeDetectorRef }];
17457
+ }] }, { type: i1$3.Directionality }, { type: i2$1.DragDrop }, { type: i0.ChangeDetectorRef }];
17389
17458
  } });
17390
17459
  /**
17391
17460
  * This module allows us to avoid importing all of CdkDragDropModule which results in a smaller application bundle.
@@ -17825,6 +17894,547 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17825
17894
  type: Directive
17826
17895
  }], ctorParameters: function () { return [{ type: FiltersProvider }]; } });
17827
17896
 
17897
+ /*
17898
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17899
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
17900
+ * This software is released under MIT license.
17901
+ * The full license information can be found in LICENSE in the root directory of this project.
17902
+ */
17903
+ class DefaultKeyNavigationStrategy {
17904
+ constructor(utils) {
17905
+ this.utils = utils;
17906
+ }
17907
+ keyUp(currentCellCoords) {
17908
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17909
+ if (currentCellCoords.y === 0) {
17910
+ return nextCellCoords;
17911
+ }
17912
+ nextCellCoords.y = currentCellCoords.y - 1;
17913
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17914
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y) &&
17915
+ !isActionCell &&
17916
+ this.utils.isDetailsRow(nextCellCoords.y)) {
17917
+ nextCellCoords.x = 0;
17918
+ }
17919
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
17920
+ if (isActionCell) {
17921
+ nextCellCoords.y = nextCellCoords.y - 1;
17922
+ }
17923
+ else {
17924
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17925
+ }
17926
+ }
17927
+ return nextCellCoords;
17928
+ }
17929
+ keyDown(currentCellCoords) {
17930
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17931
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17932
+ if (currentCellCoords.y >= numOfRows) {
17933
+ return nextCellCoords;
17934
+ }
17935
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
17936
+ nextCellCoords.y = currentCellCoords.y + 1;
17937
+ if (!isActionCell && this.utils.isRowReplaced(nextCellCoords.y)) {
17938
+ nextCellCoords.y = nextCellCoords.y + 1;
17939
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17940
+ ? 0
17941
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17942
+ }
17943
+ return nextCellCoords;
17944
+ }
17945
+ keyLeft(currentCellCoords) {
17946
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17947
+ if (currentCellCoords.x === 0) {
17948
+ return nextCellCoords;
17949
+ }
17950
+ nextCellCoords.x = currentCellCoords.x - 1;
17951
+ return nextCellCoords;
17952
+ }
17953
+ keyRight(currentCellCoords) {
17954
+ var _a;
17955
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17956
+ // calculate numOfColumns based on header cells.
17957
+ const numOfColumns = ((_a = this.utils.rows) === null || _a === void 0 ? void 0 : _a.length) - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
17958
+ nextCellCoords.x = currentCellCoords.x < numOfColumns ? nextCellCoords.x + 1 : nextCellCoords.x;
17959
+ return nextCellCoords;
17960
+ }
17961
+ keyEnd(currentCellCoords, ctrlKey) {
17962
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17963
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
17964
+ // calculate X based on header cells.
17965
+ nextCellCoords.x = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
17966
+ if (ctrlKey) {
17967
+ nextCellCoords.y = numOfRows;
17968
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17969
+ nextCellCoords.x = this.utils.getCellsForRow(nextCellCoords.y).length - 1;
17970
+ }
17971
+ }
17972
+ return nextCellCoords;
17973
+ }
17974
+ keyHome(currentCellCoords, ctrlKey) {
17975
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17976
+ nextCellCoords.x = 0;
17977
+ if (ctrlKey) {
17978
+ nextCellCoords.y = 0;
17979
+ }
17980
+ return nextCellCoords;
17981
+ }
17982
+ keyPageUp(currentCellCoords) {
17983
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
17984
+ const itemsPerPage = this.utils.itemsPerPage;
17985
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
17986
+ if (!this.utils.isActionCell(currentCellCoords)) {
17987
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
17988
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17989
+ ? 0
17990
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17991
+ }
17992
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
17993
+ nextCellCoords.y = nextCellCoords.y + 1;
17994
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
17995
+ ? 0
17996
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17997
+ }
17998
+ }
17999
+ else {
18000
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18001
+ nextCellCoords.y = nextCellCoords.y - 1;
18002
+ }
18003
+ }
18004
+ return nextCellCoords;
18005
+ }
18006
+ keyPageDown(currentCellCoords) {
18007
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18008
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18009
+ const itemsPerPage = this.utils.itemsPerPage;
18010
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18011
+ if (this.utils.isActionCell(currentCellCoords) && this.utils.isDetailsRow(nextCellCoords.y)) {
18012
+ nextCellCoords.y = nextCellCoords.y - 1;
18013
+ }
18014
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18015
+ nextCellCoords.x = 0;
18016
+ }
18017
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18018
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18019
+ }
18020
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18021
+ nextCellCoords.y = nextCellCoords.y + 1;
18022
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
18023
+ ? 0
18024
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18025
+ }
18026
+ return nextCellCoords;
18027
+ }
18028
+ }
18029
+
18030
+ /*
18031
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18032
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18033
+ * This software is released under MIT license.
18034
+ * The full license information can be found in LICENSE in the root directory of this project.
18035
+ */
18036
+ class ExpandedRowKeyNavigationStrategy extends DefaultKeyNavigationStrategy {
18037
+ constructor(utils) {
18038
+ super(utils);
18039
+ }
18040
+ keyUp(currentCellCoords) {
18041
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18042
+ if (currentCellCoords.y === 0) {
18043
+ return nextCellCoords;
18044
+ }
18045
+ nextCellCoords.y = currentCellCoords.y - 1;
18046
+ if (!this.utils.isActionCell(currentCellCoords)) {
18047
+ if (this.utils.isRowReplaced(currentCellCoords.y)) {
18048
+ nextCellCoords.y = nextCellCoords.y - 1;
18049
+ }
18050
+ switch (true) {
18051
+ case this.utils.isDetailsRow(nextCellCoords.y):
18052
+ nextCellCoords.x = 0;
18053
+ break;
18054
+ case this.utils.isDetailsRow(currentCellCoords.y) === false:
18055
+ nextCellCoords.x = currentCellCoords.x;
18056
+ break;
18057
+ default:
18058
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18059
+ }
18060
+ }
18061
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && nextCellCoords.y > 0) {
18062
+ nextCellCoords.y = nextCellCoords.y - 1;
18063
+ }
18064
+ return nextCellCoords;
18065
+ }
18066
+ keyDown(currentCellCoords) {
18067
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18068
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18069
+ if (currentCellCoords.y >= numOfRows) {
18070
+ return nextCellCoords;
18071
+ }
18072
+ nextCellCoords.y = currentCellCoords.y + 1;
18073
+ if (!this.utils.isActionCell(currentCellCoords)) {
18074
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18075
+ nextCellCoords.y = nextCellCoords.y + 1;
18076
+ }
18077
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18078
+ nextCellCoords.x = 0;
18079
+ }
18080
+ else {
18081
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18082
+ }
18083
+ }
18084
+ else {
18085
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y;
18086
+ }
18087
+ return nextCellCoords;
18088
+ }
18089
+ keyLeft(currentCellCoords) {
18090
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18091
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18092
+ return super.keyLeft(currentCellCoords);
18093
+ }
18094
+ if (currentCellCoords.x !== 0) {
18095
+ nextCellCoords.x = currentCellCoords.x - 1;
18096
+ }
18097
+ else if (!this.utils.isActionCell(currentCellCoords)) {
18098
+ nextCellCoords.y = currentCellCoords.y - 1;
18099
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y) - 1;
18100
+ }
18101
+ return nextCellCoords;
18102
+ }
18103
+ keyRight(currentCellCoords) {
18104
+ var _a;
18105
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18106
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18107
+ return super.keyRight(currentCellCoords);
18108
+ }
18109
+ // calculate numOfColumns based on header cells.
18110
+ const numOfColumns = ((_a = this.utils.rows) === null || _a === void 0 ? void 0 : _a.length) - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
18111
+ if (currentCellCoords.x >= numOfColumns) {
18112
+ return nextCellCoords;
18113
+ }
18114
+ if (this.utils.isActionCell(currentCellCoords) &&
18115
+ currentCellCoords.x === this.utils.actionCellCount(currentCellCoords.x) - 1 &&
18116
+ this.utils.isRowReplaced(currentCellCoords.y) &&
18117
+ !this.utils.isDetailsRow(currentCellCoords.y)) {
18118
+ nextCellCoords.y = currentCellCoords.y + 1;
18119
+ nextCellCoords.x = 0;
18120
+ }
18121
+ else {
18122
+ nextCellCoords.x = currentCellCoords.x + 1;
18123
+ }
18124
+ return nextCellCoords;
18125
+ }
18126
+ keyEnd(currentCellCoords, ctrlKey) {
18127
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18128
+ if ((!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) || ctrlKey) {
18129
+ return super.keyEnd(currentCellCoords, ctrlKey);
18130
+ }
18131
+ nextCellCoords.x = this.utils.getCellsForRow(currentCellCoords.y).length - 1;
18132
+ return nextCellCoords;
18133
+ }
18134
+ keyHome(currentCellCoords, ctrlKey) {
18135
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18136
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18137
+ return super.keyHome(currentCellCoords, ctrlKey);
18138
+ }
18139
+ nextCellCoords.x = 0;
18140
+ nextCellCoords.y = currentCellCoords.y - 1;
18141
+ if (ctrlKey) {
18142
+ nextCellCoords.y = 0;
18143
+ }
18144
+ return nextCellCoords;
18145
+ }
18146
+ keyPageUp(currentCellCoords) {
18147
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18148
+ const itemsPerPage = this.utils.itemsPerPage;
18149
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18150
+ if (!this.utils.isActionCell(currentCellCoords)) {
18151
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18152
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18153
+ nextCellCoords.y = nextCellCoords.y + 1;
18154
+ nextCellCoords.x = 0;
18155
+ }
18156
+ }
18157
+ else if (!this.utils.isDetailsRow(currentCellCoords.y)) {
18158
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18159
+ nextCellCoords.x = 0;
18160
+ }
18161
+ }
18162
+ else if (this.utils.isDetailsRow(currentCellCoords.y)) {
18163
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18164
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18165
+ }
18166
+ }
18167
+ }
18168
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18169
+ nextCellCoords.y = nextCellCoords.y - 1;
18170
+ }
18171
+ return nextCellCoords;
18172
+ }
18173
+ keyPageDown(currentCellCoords) {
18174
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18175
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18176
+ const itemsPerPage = this.utils.itemsPerPage;
18177
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18178
+ if (!this.utils.isActionCell(currentCellCoords)) {
18179
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18180
+ if (nextCellCoords.y < numOfRows && !this.utils.isDetailsRow(nextCellCoords.y)) {
18181
+ nextCellCoords.y = nextCellCoords.y + 1;
18182
+ }
18183
+ }
18184
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18185
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18186
+ }
18187
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18188
+ nextCellCoords.x = 0;
18189
+ }
18190
+ }
18191
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18192
+ nextCellCoords.y = nextCellCoords.y - 1;
18193
+ }
18194
+ return nextCellCoords;
18195
+ }
18196
+ }
18197
+
18198
+ /*
18199
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18200
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18201
+ * This software is released under MIT license.
18202
+ * The full license information can be found in LICENSE in the root directory of this project.
18203
+ */
18204
+ class ExpandedColumnsRowKeyNavigationStrategy extends ExpandedRowKeyNavigationStrategy {
18205
+ constructor(utils) {
18206
+ super(utils);
18207
+ }
18208
+ keyUp(currentCellCoords) {
18209
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18210
+ if (currentCellCoords.y === 0) {
18211
+ return nextCellCoords;
18212
+ }
18213
+ nextCellCoords.y = currentCellCoords.y - 1;
18214
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18215
+ return super.keyUp(currentCellCoords);
18216
+ }
18217
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18218
+ if (isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18219
+ nextCellCoords.y = nextCellCoords.y - 1;
18220
+ }
18221
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18222
+ nextCellCoords.y = nextCellCoords.y - 1;
18223
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18224
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18225
+ }
18226
+ }
18227
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18228
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18229
+ }
18230
+ else if (!isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18231
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18232
+ }
18233
+ return nextCellCoords;
18234
+ }
18235
+ keyDown(currentCellCoords) {
18236
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18237
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18238
+ const numOfColumns = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
18239
+ if (currentCellCoords.y >= numOfRows) {
18240
+ return nextCellCoords;
18241
+ }
18242
+ nextCellCoords.y = currentCellCoords.y + 1;
18243
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18244
+ return super.keyDown(currentCellCoords);
18245
+ }
18246
+ if (!this.utils.isActionCell(currentCellCoords)) {
18247
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18248
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18249
+ }
18250
+ else if (this.utils.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18251
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18252
+ }
18253
+ else {
18254
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18255
+ }
18256
+ }
18257
+ else {
18258
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18259
+ }
18260
+ return nextCellCoords;
18261
+ }
18262
+ keyLeft(currentCellCoords) {
18263
+ return super.keyLeft(currentCellCoords);
18264
+ }
18265
+ keyRight(currentCellCoords) {
18266
+ return super.keyRight(currentCellCoords);
18267
+ }
18268
+ keyEnd(currentCellCoords, ctrlKey) {
18269
+ return super.keyEnd(currentCellCoords, ctrlKey);
18270
+ }
18271
+ keyHome(currentCellCoords, ctrlKey) {
18272
+ return super.keyHome(currentCellCoords, ctrlKey);
18273
+ }
18274
+ keyPageUp(currentCellCoords) {
18275
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18276
+ const itemsPerPage = this.utils.itemsPerPage;
18277
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18278
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18279
+ return super.keyPageUp(currentCellCoords);
18280
+ }
18281
+ if (!this.utils.isActionCell(currentCellCoords)) {
18282
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18283
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18284
+ nextCellCoords.y = nextCellCoords.y + 1;
18285
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18286
+ }
18287
+ }
18288
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18289
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18290
+ }
18291
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18292
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18293
+ }
18294
+ }
18295
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18296
+ nextCellCoords.y = nextCellCoords.y - 1;
18297
+ }
18298
+ return nextCellCoords;
18299
+ }
18300
+ keyPageDown(currentCellCoords) {
18301
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18302
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18303
+ const itemsPerPage = this.utils.itemsPerPage;
18304
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18305
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18306
+ return super.keyPageDown(currentCellCoords);
18307
+ }
18308
+ if (!this.utils.isActionCell(currentCellCoords)) {
18309
+ if (this.utils.isRowReplaced(nextCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18310
+ if (nextCellCoords.y < numOfRows) {
18311
+ nextCellCoords.y = nextCellCoords.y + 1;
18312
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18313
+ }
18314
+ }
18315
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18316
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18317
+ }
18318
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18319
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18320
+ }
18321
+ }
18322
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18323
+ nextCellCoords.y = nextCellCoords.y - 1;
18324
+ }
18325
+ return nextCellCoords;
18326
+ }
18327
+ }
18328
+
18329
+ /*
18330
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18331
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18332
+ * This software is released under MIT license.
18333
+ * The full license information can be found in LICENSE in the root directory of this project.
18334
+ */
18335
+ class KeyNavigationUtils {
18336
+ constructor(host, config) {
18337
+ this.host = host;
18338
+ this.config = config;
18339
+ }
18340
+ get grid() {
18341
+ var _a;
18342
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
18343
+ }
18344
+ get rows() {
18345
+ var _a;
18346
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
18347
+ }
18348
+ get cells() {
18349
+ var _a;
18350
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
18351
+ }
18352
+ get currentCellCoordinates() {
18353
+ const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
18354
+ const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18355
+ const coordinates = {
18356
+ x: currentRow && currentCell
18357
+ ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
18358
+ : 0,
18359
+ y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
18360
+ };
18361
+ return coordinates;
18362
+ }
18363
+ get itemsPerPage() {
18364
+ var _a;
18365
+ return Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
18366
+ }
18367
+ getNextItemCoordinate(e) {
18368
+ const currentCellCoords = this.currentCellCoordinates;
18369
+ const strategy = this.getNavStrategy(currentCellCoords);
18370
+ const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18371
+ const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18372
+ switch (e.key) {
18373
+ case Keys.ArrowUp:
18374
+ return strategy.keyUp(currentCellCoords);
18375
+ case Keys.ArrowDown:
18376
+ return strategy.keyDown(currentCellCoords);
18377
+ case inlineStart:
18378
+ return strategy.keyLeft(currentCellCoords);
18379
+ case inlineEnd:
18380
+ return strategy.keyRight(currentCellCoords);
18381
+ case Keys.Home:
18382
+ return strategy.keyHome(currentCellCoords, e.ctrlKey);
18383
+ case Keys.End:
18384
+ return strategy.keyEnd(currentCellCoords, e.ctrlKey);
18385
+ case Keys.PageUp:
18386
+ return strategy.keyPageUp(currentCellCoords);
18387
+ case Keys.PageDown:
18388
+ return strategy.keyPageDown(currentCellCoords);
18389
+ default:
18390
+ return currentCellCoords;
18391
+ }
18392
+ }
18393
+ getCellsForRow(index) {
18394
+ return this.rows[index].querySelectorAll(this.config.keyGridCells);
18395
+ }
18396
+ isExpandedRow(index) {
18397
+ const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
18398
+ return selectedElement ? selectedElement.style.display !== 'none' : false;
18399
+ }
18400
+ isDetailsRow(index) {
18401
+ return this.rows[index].classList.contains('datagrid-row-detail');
18402
+ }
18403
+ isRowReplaced(index) {
18404
+ return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18405
+ }
18406
+ isSingleCellExpandedRow(index) {
18407
+ var _a;
18408
+ return ((_a = this.rows[index]) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells).length) === 1;
18409
+ }
18410
+ actionCellCount(index) {
18411
+ return this.actionCellsAsArray(index).length;
18412
+ }
18413
+ actionCellsAsArray(index) {
18414
+ return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
18415
+ }
18416
+ isActionCell(cellCoords) {
18417
+ return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18418
+ }
18419
+ createNextCellCoords(cellCoords) {
18420
+ return {
18421
+ x: cellCoords.x,
18422
+ y: cellCoords.y,
18423
+ };
18424
+ }
18425
+ getNavStrategy(currentCellCoords) {
18426
+ switch (true) {
18427
+ case this.isSingleCellExpandedRow(currentCellCoords.y):
18428
+ return new ExpandedRowKeyNavigationStrategy(this);
18429
+ case this.isDetailsRow(currentCellCoords.y):
18430
+ case this.isExpandedRow(currentCellCoords.y):
18431
+ return new ExpandedColumnsRowKeyNavigationStrategy(this);
18432
+ default:
18433
+ return new DefaultKeyNavigationStrategy(this);
18434
+ }
18435
+ }
18436
+ }
18437
+
17828
18438
  /*
17829
18439
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
17830
18440
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -17866,18 +18476,6 @@ class KeyNavigationGridController {
17866
18476
  keyGrid: '[role=grid]',
17867
18477
  };
17868
18478
  }
17869
- get grid() {
17870
- var _a;
17871
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
17872
- }
17873
- get rows() {
17874
- var _a;
17875
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
17876
- }
17877
- get cells() {
17878
- var _a;
17879
- return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
17880
- }
17881
18479
  ngOnDestroy() {
17882
18480
  this.destroy$.next();
17883
18481
  this.destroy$.complete();
@@ -17887,33 +18485,33 @@ class KeyNavigationGridController {
17887
18485
  return;
17888
18486
  }
17889
18487
  this.zone.runOutsideAngular(() => {
17890
- fromEvent(this.grid, 'mousedown')
18488
+ fromEvent(this.keyNavUtils.grid, 'mousedown')
17891
18489
  .pipe(takeUntil(this.destroy$))
17892
18490
  .subscribe((e) => {
17893
18491
  // 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
17894
18492
  if (e.buttons === 1 && !e.ctrlKey) {
17895
- const activeCell = this.cells
17896
- ? Array.from(this.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
18493
+ const activeCell = this.keyNavUtils.cells
18494
+ ? Array.from(this.keyNavUtils.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
17897
18495
  : null;
17898
18496
  if (activeCell) {
17899
18497
  this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
17900
18498
  }
17901
18499
  }
17902
18500
  });
17903
- fromEvent(this.grid, 'wheel')
18501
+ fromEvent(this.keyNavUtils.grid, 'wheel')
17904
18502
  .pipe(takeUntil(this.destroy$))
17905
18503
  .subscribe(() => {
17906
18504
  this.removeActiveCell();
17907
18505
  });
17908
- fromEvent(this.grid, 'focusout')
18506
+ fromEvent(this.keyNavUtils.grid, 'focusout')
17909
18507
  .pipe(debounceTime(0), takeUntil(this.destroy$))
17910
18508
  .subscribe(() => {
17911
- if (this.grid.contains(document.activeElement)) {
18509
+ if (this.keyNavUtils.grid.contains(document.activeElement)) {
17912
18510
  return;
17913
18511
  }
17914
18512
  this.removeActiveCell();
17915
18513
  });
17916
- fromEvent(this.grid, 'keydown')
18514
+ fromEvent(this.keyNavUtils.grid, 'keydown')
17917
18515
  .pipe(takeUntil(this.destroy$))
17918
18516
  .subscribe((e) => {
17919
18517
  // Skip column resize events
@@ -17929,12 +18527,9 @@ class KeyNavigationGridController {
17929
18527
  e.key === Keys.Home ||
17930
18528
  e.key === Keys.PageUp ||
17931
18529
  e.key === Keys.PageDown) {
17932
- const currentCellCoords = this.getCurrentCellCoordinates();
17933
- const nextCellCoords = this.isExpandedRow(currentCellCoords.y) || this.isDetailsRow(currentCellCoords.y)
17934
- ? this.getNextForExpandedRowCoordinate(e, currentCellCoords)
17935
- : this.getNextItemCoordinate(e, currentCellCoords);
17936
- const activeItem = this.rows
17937
- ? Array.from(this.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
18530
+ const nextCellCoords = this.keyNavUtils.getNextItemCoordinate(e);
18531
+ const activeItem = this.keyNavUtils.rows
18532
+ ? Array.from(this.keyNavUtils.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
17938
18533
  : null;
17939
18534
  if (activeItem) {
17940
18535
  this.setActiveCell(activeItem);
@@ -17946,14 +18541,14 @@ class KeyNavigationGridController {
17946
18541
  this.listenersAdded = true;
17947
18542
  }
17948
18543
  initializeKeyGrid(host) {
17949
- this.host = host;
18544
+ this.keyNavUtils = new KeyNavigationUtils(host, this.config);
17950
18545
  this.addListeners();
17951
18546
  this.resetKeyGrid();
17952
18547
  }
17953
18548
  resetKeyGrid() {
17954
18549
  var _a;
17955
- (_a = this.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
17956
- const firstCell = this.cells ? this.cells[0] : null;
18550
+ (_a = this.keyNavUtils.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
18551
+ const firstCell = this.keyNavUtils.cells ? this.keyNavUtils.cells[0] : null;
17957
18552
  firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
17958
18553
  }
17959
18554
  removeActiveCell() {
@@ -17963,7 +18558,9 @@ class KeyNavigationGridController {
17963
18558
  return this._activeCell;
17964
18559
  }
17965
18560
  setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
17966
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
18561
+ const prior = this.keyNavUtils.cells
18562
+ ? Array.from(this.keyNavUtils.cells).find(c => c.getAttribute('tabindex') === '0')
18563
+ : null;
17967
18564
  if (prior) {
17968
18565
  prior.setAttribute('tabindex', '-1');
17969
18566
  }
@@ -17981,223 +18578,6 @@ class KeyNavigationGridController {
17981
18578
  elementToFocus.focus();
17982
18579
  }
17983
18580
  }
17984
- getNextForExpandedRowCoordinate(e, currentCellCoords) {
17985
- if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
17986
- return this.getNextItemCoordinate(e, currentCellCoords);
17987
- }
17988
- if (!this.isDetailsRow(currentCellCoords.y) &&
17989
- !this.isRowReplaced(currentCellCoords.y) &&
17990
- (e.key === Keys.Home || e.key === Keys.End || e.key === Keys.ArrowRight || e.key === Keys.ArrowLeft)) {
17991
- return this.getNextItemCoordinate(e, currentCellCoords);
17992
- }
17993
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
17994
- const isSingleCellExpandedRow = this.isSingleCellExpandedRow(currentCellCoords.y);
17995
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
17996
- nextCellCoords.y = currentCellCoords.y - 1;
17997
- if (isSingleCellExpandedRow && !isActionCell) {
17998
- if (this.isRowReplaced(currentCellCoords.y)) {
17999
- nextCellCoords.y = nextCellCoords.y - 1;
18000
- }
18001
- if (this.isDetailsRow(nextCellCoords.y)) {
18002
- nextCellCoords.x = 0;
18003
- }
18004
- else if (this.isDetailsRow(currentCellCoords.y) === false) {
18005
- // false check is intentional, the ! operator may be missed easily in this case
18006
- nextCellCoords.x = currentCellCoords.x;
18007
- }
18008
- else {
18009
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
18010
- }
18011
- return nextCellCoords;
18012
- }
18013
- if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18014
- nextCellCoords.y = nextCellCoords.y - 1;
18015
- }
18016
- else if (this.isRowReplaced(nextCellCoords.y)) {
18017
- nextCellCoords.y = nextCellCoords.y - 1;
18018
- if (!this.isDetailsRow(nextCellCoords.y)) {
18019
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18020
- }
18021
- }
18022
- else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
18023
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18024
- }
18025
- else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18026
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18027
- }
18028
- }
18029
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
18030
- nextCellCoords.y = currentCellCoords.y + 1;
18031
- if (isSingleCellExpandedRow && !isActionCell) {
18032
- if (this.isRowReplaced(nextCellCoords.y)) {
18033
- nextCellCoords.y = nextCellCoords.y + 1;
18034
- }
18035
- if (this.isDetailsRow(nextCellCoords.y)) {
18036
- nextCellCoords.x = 0;
18037
- }
18038
- else {
18039
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
18040
- }
18041
- return nextCellCoords;
18042
- }
18043
- if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
18044
- nextCellCoords.y = nextCellCoords.y + 1;
18045
- }
18046
- else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18047
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18048
- }
18049
- else {
18050
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18051
- }
18052
- }
18053
- else if (e.key === inlineStart) {
18054
- if (currentCellCoords.x !== 0) {
18055
- nextCellCoords.x = currentCellCoords.x - 1;
18056
- }
18057
- else if (!isActionCell) {
18058
- nextCellCoords.y = currentCellCoords.y - 1;
18059
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y) - 1;
18060
- }
18061
- }
18062
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
18063
- if (isActionCell &&
18064
- currentCellCoords.x === this.actionCellCount(currentCellCoords.x) - 1 &&
18065
- this.isRowReplaced(currentCellCoords.y) &&
18066
- !this.isDetailsRow(currentCellCoords.y)) {
18067
- nextCellCoords.y = currentCellCoords.y + 1;
18068
- nextCellCoords.x = 0;
18069
- }
18070
- else {
18071
- nextCellCoords.x = currentCellCoords.x + 1;
18072
- }
18073
- }
18074
- else if (e.key === Keys.End) {
18075
- nextCellCoords.x = this.getCellsForRow(currentCellCoords.y).length - 1;
18076
- if (e.ctrlKey) {
18077
- nextCellCoords.x = numOfColumns;
18078
- nextCellCoords.y = numOfRows;
18079
- }
18080
- }
18081
- else if (e.key === Keys.Home) {
18082
- nextCellCoords.x = 0;
18083
- nextCellCoords.y = currentCellCoords.y - 1;
18084
- if (e.ctrlKey) {
18085
- nextCellCoords.y = 0;
18086
- }
18087
- }
18088
- return nextCellCoords;
18089
- }
18090
- getNextItemCoordinate(e, currentCellCoords) {
18091
- const { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords } = this.getCalcVariables(currentCellCoords);
18092
- if (e.key === Keys.ArrowUp && currentCellCoords.y !== 0) {
18093
- nextCellCoords.y = currentCellCoords.y - 1;
18094
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18095
- nextCellCoords.x = 0;
18096
- return nextCellCoords;
18097
- }
18098
- if (this.isDetailsRow(nextCellCoords.y)) {
18099
- if (isActionCell) {
18100
- nextCellCoords.y = nextCellCoords.y - 1;
18101
- }
18102
- else {
18103
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
18104
- }
18105
- }
18106
- }
18107
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
18108
- nextCellCoords.y = currentCellCoords.y + 1;
18109
- if (this.isSingleCellExpandedRow(nextCellCoords.y) && !isActionCell && this.isRowReplaced(nextCellCoords.y)) {
18110
- nextCellCoords.x = 0;
18111
- nextCellCoords.y = nextCellCoords.y + 1;
18112
- return nextCellCoords;
18113
- }
18114
- if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
18115
- nextCellCoords.y = nextCellCoords.y + 1;
18116
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
18117
- }
18118
- }
18119
- else if (e.key === inlineStart && currentCellCoords.x !== 0) {
18120
- nextCellCoords.x = currentCellCoords.x - 1;
18121
- }
18122
- else if (e.key === inlineEnd && currentCellCoords.x < numOfColumns) {
18123
- nextCellCoords.x = currentCellCoords.x + 1;
18124
- }
18125
- else if (e.key === Keys.End) {
18126
- nextCellCoords.x = numOfColumns;
18127
- if (e.ctrlKey) {
18128
- nextCellCoords.y = numOfRows;
18129
- }
18130
- }
18131
- else if (e.key === Keys.Home) {
18132
- nextCellCoords.x = 0;
18133
- if (e.ctrlKey) {
18134
- nextCellCoords.y = 0;
18135
- }
18136
- }
18137
- else if (e.key === Keys.PageUp) {
18138
- nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18139
- }
18140
- else if (e.key === Keys.PageDown) {
18141
- nextCellCoords.y =
18142
- currentCellCoords.y + itemsPerPage < numOfRows ? currentCellCoords.y + itemsPerPage : numOfRows;
18143
- }
18144
- return nextCellCoords;
18145
- }
18146
- getCalcVariables(currentCellCoords) {
18147
- var _a;
18148
- const numOfRows = this.rows ? this.rows.length - 1 : 0;
18149
- // calculate numOfColumns based on header cells.
18150
- const numOfColumns = numOfRows ? this.getCellsForRow(0).length - 1 : 0;
18151
- const dir = this.host.dir;
18152
- const inlineStart = dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18153
- const inlineEnd = dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18154
- const itemsPerPage = Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.rows[0].clientHeight) - 1 || 0;
18155
- const isActionCell = this.isActionCell(currentCellCoords);
18156
- const nextCellCoords = {
18157
- x: currentCellCoords.x,
18158
- y: currentCellCoords.y,
18159
- };
18160
- return { numOfRows, numOfColumns, inlineStart, inlineEnd, itemsPerPage, isActionCell, nextCellCoords };
18161
- }
18162
- getCurrentCellCoordinates() {
18163
- const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
18164
- const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18165
- const coordinates = {
18166
- x: currentRow && currentCell
18167
- ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell)
18168
- : 0,
18169
- y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0,
18170
- };
18171
- return coordinates;
18172
- }
18173
- getCellsForRow(index) {
18174
- return this.rows[index].querySelectorAll(this.config.keyGridCells);
18175
- }
18176
- isExpandedRow(index) {
18177
- const selectedElement = this.rows[index].querySelector('.datagrid-row-detail');
18178
- return selectedElement ? selectedElement.style.display !== 'none' : false;
18179
- }
18180
- isDetailsRow(index) {
18181
- return this.rows[index].classList.contains('datagrid-row-detail');
18182
- }
18183
- isRowReplaced(index) {
18184
- return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18185
- }
18186
- isSingleCellExpandedRow(index) {
18187
- const row = this.rows[index].classList.contains('datagrid-row-detail')
18188
- ? this.rows[index]
18189
- : this.rows[index].querySelector('.datagrid-row-detail');
18190
- return (row === null || row === void 0 ? void 0 : row.querySelectorAll(this.config.keyGridCells).length) === 1;
18191
- }
18192
- actionCellCount(index) {
18193
- return this.actionCellsAsArray(index).length;
18194
- }
18195
- actionCellsAsArray(index) {
18196
- return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column'));
18197
- }
18198
- isActionCell(cellCoords) {
18199
- return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18200
- }
18201
18581
  }
18202
18582
  KeyNavigationGridController.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
18203
18583
  KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
@@ -19909,18 +20289,14 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19909
20289
  if (typeof comparator === 'string') {
19910
20290
  this._sortBy = new DatagridPropertyComparator(comparator);
19911
20291
  }
20292
+ else if (comparator) {
20293
+ this._sortBy = comparator;
20294
+ }
20295
+ else if (this.field) {
20296
+ this._sortBy = new DatagridPropertyComparator(this.field);
20297
+ }
19912
20298
  else {
19913
- if (comparator) {
19914
- this._sortBy = comparator;
19915
- }
19916
- else {
19917
- if (this.field) {
19918
- this._sortBy = new DatagridPropertyComparator(this.field);
19919
- }
19920
- else {
19921
- delete this._sortBy;
19922
- }
19923
- }
20299
+ delete this._sortBy;
19924
20300
  }
19925
20301
  }
19926
20302
  get sortOrder() {
@@ -20303,6 +20679,10 @@ class Items {
20303
20679
  this._pageSub.unsubscribe();
20304
20680
  }
20305
20681
  }
20682
+ smartenDown() {
20683
+ this._smart = false;
20684
+ this.destroy();
20685
+ }
20306
20686
  smartenUp() {
20307
20687
  this._smart = true;
20308
20688
  /*
@@ -21305,6 +21685,16 @@ class ClrDatagridRow {
21305
21685
  }
21306
21686
  if (viewChange === DatagridDisplayMode.CALCULATE) {
21307
21687
  this.displayCells = false;
21688
+ // Inserts a fixed cell if any of these conditions are true.
21689
+ const fixedCellConditions = [
21690
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
21691
+ this.rowActionService.hasActionableRow,
21692
+ this.globalExpandable.hasExpandableRow,
21693
+ this.detailService.enabled,
21694
+ ];
21695
+ fixedCellConditions
21696
+ .filter(Boolean)
21697
+ .forEach(() => this._calculatedCells.insert(this._fixedCellTemplate.createEmbeddedView(null)));
21308
21698
  this.dgCells.forEach(cell => {
21309
21699
  if (!cell._view.destroyed) {
21310
21700
  this._calculatedCells.insert(cell._view);
@@ -21346,7 +21736,7 @@ class ClrDatagridRow {
21346
21736
  * selection browser functionality, which is inconsistently implemented in browsers anyway.
21347
21737
  */
21348
21738
  clearRanges(event) {
21349
- if (event.shiftKey) {
21739
+ if (this.selection.rowSelectionMode && event.shiftKey) {
21350
21740
  this.document.getSelection().removeAllRanges();
21351
21741
  // Firefox is too persistent about its text-selection behaviour. So we need to add a preventDefault();
21352
21742
  // We should not try to enforce this on the other browsers, though, because their toggle cycle does not get canceled by
@@ -21363,7 +21753,7 @@ class ClrDatagridRow {
21363
21753
  selectRow(selected = !this.selected, $event) {
21364
21754
  // The label also captures clicks that bubble up to the row event listener, causing
21365
21755
  // this handler to run twice. This exits early to prevent toggling the checkbox twice.
21366
- if ($event.target.tagName === 'LABEL') {
21756
+ if (!this.selection.rowSelectionMode || $event.target.tagName === 'LABEL') {
21367
21757
  return;
21368
21758
  }
21369
21759
  if (this.selection.selectionType === this.SELECTION_TYPE.Single) {
@@ -21402,7 +21792,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
21402
21792
  DatagridIfExpandService,
21403
21793
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21404
21794
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21405
- ], 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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\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: "component", type: ClrDatagridCell, selector: "clr-dg-cell" }, { kind: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }, { kind: "directive", type: DatagridCellRenderer, selector: "clr-dg-cell" }] });
21795
+ ], 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" }] });
21406
21796
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
21407
21797
  type: Component,
21408
21798
  args: [{ selector: 'clr-dg-row', host: {
@@ -21415,7 +21805,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21415
21805
  DatagridIfExpandService,
21416
21806
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21417
21807
  { provide: LoadingListener, useExisting: DatagridIfExpandService },
21418
- ], 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 <clr-dg-cell class=\"skeleton-loading\" *ngIf=\"skeletonLoading\"></clr-dg-cell>\n </div>\n</ng-template>\n\n<ng-container #calculatedCells></ng-container>\n" }]
21808
+ ], 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" }]
21419
21809
  }], ctorParameters: function () {
21420
21810
  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: [{
21421
21811
  type: Inject,
@@ -21441,7 +21831,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21441
21831
  args: [ClrDatagridCell]
21442
21832
  }], expandAnimation: [{
21443
21833
  type: ViewChild,
21444
- args: [ClrExpandableAnimation]
21834
+ args: [ClrExpandableAnimationDirective]
21445
21835
  }], detailButton: [{
21446
21836
  type: ViewChild,
21447
21837
  args: ['detailButton']
@@ -21454,6 +21844,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21454
21844
  }], _calculatedCells: [{
21455
21845
  type: ViewChild,
21456
21846
  args: ['calculatedCells', { read: ViewContainerRef }]
21847
+ }], _fixedCellTemplate: [{
21848
+ type: ViewChild,
21849
+ args: ['fixedCellTemplate']
21457
21850
  }], item: [{
21458
21851
  type: Input,
21459
21852
  args: ['clrDgItem']
@@ -21655,6 +22048,12 @@ class ClrDatagridVirtualScrollDirective {
21655
22048
  this.updateFixedSizeVirtualScrollInputs();
21656
22049
  }
21657
22050
  set dataRange(range) {
22051
+ if (!range) {
22052
+ return;
22053
+ }
22054
+ if (this.items.smart) {
22055
+ this.items.smartenDown();
22056
+ }
21658
22057
  this.totalItems = range.total;
21659
22058
  this.updateDataRange(range.skip, range.data);
21660
22059
  }
@@ -21662,11 +22061,7 @@ class ClrDatagridVirtualScrollDirective {
21662
22061
  return this._totalItems;
21663
22062
  }
21664
22063
  set totalItems(value) {
21665
- if (this._totalItems === value) {
21666
- return;
21667
- }
21668
22064
  this._totalItems = value;
21669
- this.populatePlaceholderData();
21670
22065
  }
21671
22066
  ngAfterViewInit() {
21672
22067
  this.injector.runInContext(() => {
@@ -21677,7 +22072,9 @@ class ClrDatagridVirtualScrollDirective {
21677
22072
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
21678
22073
  this.updateCdkVirtualForInputs();
21679
22074
  this.subscriptions.push(this.items.change.subscribe(newItems => {
21680
- this.cdkVirtualFor.cdkVirtualForOf = newItems;
22075
+ if (this.items.smart) {
22076
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
22077
+ }
21681
22078
  }), this.cdkVirtualFor.dataStream.subscribe(data => {
21682
22079
  this.updateAriaRowCount(data.length);
21683
22080
  }), this.virtualScrollViewport.scrolledIndexChange.subscribe(index => {
@@ -21716,16 +22113,13 @@ class ClrDatagridVirtualScrollDirective {
21716
22113
  var _a;
21717
22114
  (_a = this.virtualScrollViewport) === null || _a === void 0 ? void 0 : _a.scrollToIndex(index, behavior);
21718
22115
  }
21719
- populatePlaceholderData() {
21720
- this.cdkVirtualForOf = Array(this.totalItems);
21721
- }
21722
22116
  updateDataRange(skip, data) {
21723
- if (!this.persistItems) {
21724
- this.populatePlaceholderData();
22117
+ let items = this.cdkVirtualForOf;
22118
+ if (!this.persistItems || !items || (items === null || items === void 0 ? void 0 : items.length) !== this.totalItems) {
22119
+ items = Array(this.totalItems);
21725
22120
  }
21726
- const items = this.items.all;
21727
22121
  items.splice(skip, data.length, ...data);
21728
- this.items.all = items;
22122
+ this.cdkVirtualForOf = Array.from(items);
21729
22123
  }
21730
22124
  updateCdkVirtualForInputs() {
21731
22125
  if (this.cdkVirtualFor) {
@@ -21786,7 +22180,7 @@ class ClrDatagridVirtualScrollDirective {
21786
22180
  return virtualScrollViewport;
21787
22181
  }
21788
22182
  }
21789
- 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 });
22183
+ 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 });
21790
22184
  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 });
21791
22185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
21792
22186
  type: Directive,
@@ -21795,9 +22189,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21795
22189
  providers: [Items],
21796
22190
  }]
21797
22191
  }], ctorParameters: function () {
21798
- return [{ type: i0.ChangeDetectorRef }, { type: i0.IterableDiffers }, { type: Items, decorators: [{
21799
- type: SkipSelf
21800
- }] }, { 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 }];
22192
+ 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: [{
22193
+ type: Inject,
22194
+ args: [forwardRef(() => ClrDatagrid)]
22195
+ }] }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
21801
22196
  }, propDecorators: { renderedRangeChange: [{
21802
22197
  type: Output
21803
22198
  }], persistItems: [{
@@ -22036,6 +22431,11 @@ class ClrDatagrid {
22036
22431
  * Output emitted whenever the data needs to be refreshed, based on user action or external ones
22037
22432
  */
22038
22433
  this.refresh = new EventEmitter(false);
22434
+ /**
22435
+ * The application can provide custom select all logic.
22436
+ */
22437
+ this.customSelectAllEnabled = false;
22438
+ this.customSelectAll = new EventEmitter();
22039
22439
  /* reference to the enum so that template can access */
22040
22440
  this.SELECTION_TYPE = SelectionType;
22041
22441
  /**
@@ -22102,13 +22502,18 @@ class ClrDatagrid {
22102
22502
  get allSelected() {
22103
22503
  return this.selection.isAllSelected();
22104
22504
  }
22105
- set allSelected(_value) {
22106
- /**
22107
- * This is a setter but we ignore the value.
22108
- * It's strange, but it lets us have an indeterminate state where only
22109
- * some of the items are selected.
22110
- */
22111
- this.selection.toggleAll();
22505
+ set allSelected(value) {
22506
+ if (this.customSelectAllEnabled) {
22507
+ this.customSelectAll.emit(value);
22508
+ }
22509
+ else {
22510
+ /**
22511
+ * This is a setter but we ignore the value.
22512
+ * It's strange, but it lets us have an indeterminate state where only
22513
+ * some of the items are selected.
22514
+ */
22515
+ this.selection.toggleAll();
22516
+ }
22112
22517
  }
22113
22518
  ngAfterContentInit() {
22114
22519
  if (!this.items.smart) {
@@ -22154,7 +22559,7 @@ class ClrDatagrid {
22154
22559
  this.updateDetailState();
22155
22560
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
22156
22561
  this.refresh.emit(this.stateProvider.state);
22157
- this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22562
+ this._subscriptions.push(this.stickyHeaders.changes.subscribe(() => this.resize()), this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22158
22563
  if (this.selection.selectionType === SelectionType.Single) {
22159
22564
  this.singleSelectedChanged.emit(s);
22160
22565
  }
@@ -22200,6 +22605,15 @@ class ClrDatagrid {
22200
22605
  else {
22201
22606
  // Set state, style for the datagrid to CALCULATE and insert row & columns into containers
22202
22607
  this.renderer.addClass(this.el.nativeElement, 'datagrid-calculate-mode');
22608
+ // Inserts a fixed column if any of these conditions are true.
22609
+ const fixedColumnConditions = [
22610
+ this.rowActionService.hasActionableRow,
22611
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
22612
+ this.expandableRows.hasExpandableRow || this.detailService.enabled,
22613
+ ];
22614
+ fixedColumnConditions
22615
+ .filter(Boolean)
22616
+ .forEach(() => this._projectedCalculationColumns.insert(this._fixedColumnTemplate.createEmbeddedView(null)));
22203
22617
  this.columns.forEach(column => {
22204
22618
  this._projectedCalculationColumns.insert(column._view);
22205
22619
  });
@@ -22226,11 +22640,9 @@ class ClrDatagrid {
22226
22640
  this._subscriptions.forEach((sub) => sub.unsubscribe());
22227
22641
  }
22228
22642
  toggleAllSelected($event) {
22643
+ var _a;
22229
22644
  $event.preventDefault();
22230
- if (this.virtualScroll) {
22231
- return;
22232
- }
22233
- this.allSelected = !this.allSelected;
22645
+ (_a = this.selectAllCheckbox) === null || _a === void 0 ? void 0 : _a.nativeElement.click();
22234
22646
  }
22235
22647
  resize() {
22236
22648
  this.organizer.resize();
@@ -22266,7 +22678,7 @@ class ClrDatagrid {
22266
22678
  }
22267
22679
  }
22268
22680
  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 });
22269
- 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: [
22681
+ 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: [
22270
22682
  Selection,
22271
22683
  Sort,
22272
22684
  FiltersProvider,
@@ -22282,7 +22694,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
22282
22694
  ColumnsService,
22283
22695
  DisplayModeService,
22284
22696
  KeyNavigationGridController,
22285
- ], 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", "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" }] });
22697
+ ], 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" }] });
22286
22698
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
22287
22699
  type: Component,
22288
22700
  args: [{ selector: 'clr-datagrid', providers: [
@@ -22304,7 +22716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22304
22716
  ], host: {
22305
22717
  '[class.datagrid-host]': 'true',
22306
22718
  '[class.datagrid-detail-open]': 'detailService.isOpen',
22307
- }, 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" }]
22719
+ }, 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" }]
22308
22720
  }], ctorParameters: function () {
22309
22721
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
22310
22722
  type: Inject,
@@ -22330,6 +22742,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22330
22742
  }], refresh: [{
22331
22743
  type: Output,
22332
22744
  args: ['clrDgRefresh']
22745
+ }], customSelectAllEnabled: [{
22746
+ type: Input,
22747
+ args: ['clrDgCustomSelectAllEnabled']
22748
+ }], customSelectAll: [{
22749
+ type: Output,
22750
+ args: ['clrDgCustomSelectAll']
22333
22751
  }], virtualScroll: [{
22334
22752
  type: ContentChild,
22335
22753
  args: [ClrDatagridVirtualScrollDirective]
@@ -22366,6 +22784,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22366
22784
  }], _calculationRows: [{
22367
22785
  type: ViewChild,
22368
22786
  args: ['calculationRows', { read: ViewContainerRef }]
22787
+ }], _fixedColumnTemplate: [{
22788
+ type: ViewChild,
22789
+ args: ['fixedColumnTemplate']
22790
+ }], stickyHeaders: [{
22791
+ type: ViewChildren,
22792
+ args: ['stickyHeader', { emitDistinctChangesOnly: true }]
22793
+ }], selectAllCheckbox: [{
22794
+ type: ViewChild,
22795
+ args: ['selectAllCheckbox']
22369
22796
  }], loading: [{
22370
22797
  type: Input,
22371
22798
  args: ['clrDgLoading']
@@ -26685,7 +27112,7 @@ class ClrModal {
26685
27112
  }
26686
27113
  }
26687
27114
  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 });
26688
- 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: [
27115
+ 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: [
26689
27116
  trigger('fadeMove', [
26690
27117
  transition('* => fadeDown', [
26691
27118
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -26720,7 +27147,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26720
27147
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
26721
27148
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
26722
27149
  ]),
26723
- ], 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"] }]
27150
+ ], 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"] }]
26724
27151
  }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
26725
27152
  type: ViewChild,
26726
27153
  args: ['title']
@@ -26760,6 +27187,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26760
27187
  }], bypassScrollService: [{
26761
27188
  type: Input,
26762
27189
  args: ['clrModalOverrideScrollService']
27190
+ }], modalContentTemplate: [{
27191
+ type: ContentChild,
27192
+ args: ['clrInternalModalContentTemplate']
26763
27193
  }], bodyElementRef: [{
26764
27194
  type: ViewChild,
26765
27195
  args: ['body']
@@ -29629,6 +30059,15 @@ class ClrWizard {
29629
30059
  * Set the modal size of the wizard. Set using `[clrWizardSize]` input.
29630
30060
  */
29631
30061
  this.size = 'xl';
30062
+ /**
30063
+ * Enable "in page" wizard. Set using `[clrWizardInPage]` input.
30064
+ */
30065
+ this.inPage = false;
30066
+ /**
30067
+ * Make an "in page" wizard fill the `.content-area`. Set using `[clrWizardInPageFillContentArea]` input.
30068
+ * If you can't use this option, you will likely need to provide custom CSS to set the wizard's height and margins.
30069
+ */
30070
+ this.inPageFillContentArea = false;
29632
30071
  /**
29633
30072
  * Tells the modal part of the wizard whether it should have a close "X"
29634
30073
  * in the top right corner. Set using `[clrWizardClosable]` input.
@@ -29787,6 +30226,9 @@ class ClrWizard {
29787
30226
  ngAfterContentInit() {
29788
30227
  this.pageCollection.pages = this.pages;
29789
30228
  this.headerActionService.wizardHeaderActions = this.headerActions;
30229
+ if (this.inPage) {
30230
+ this.open();
30231
+ }
29790
30232
  this.initializeButtons();
29791
30233
  }
29792
30234
  ngDoCheck() {
@@ -29984,7 +30426,7 @@ class ClrWizard {
29984
30426
  (_a = this.pageTitle) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
29985
30427
  this.currentPageChanged.emit();
29986
30428
  // scroll to top of page in case there is long page content
29987
- (_b = this.modal) === null || _b === void 0 ? void 0 : _b.scrollTop();
30429
+ (_b = this.bodyElementRef) === null || _b === void 0 ? void 0 : _b.nativeElement.scrollTo(0, 0);
29988
30430
  });
29989
30431
  }
29990
30432
  updateNavOnPageChanges() {
@@ -30008,7 +30450,7 @@ class ClrWizard {
30008
30450
  }
30009
30451
  }
30010
30452
  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 });
30011
- 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"] }] });
30453
+ 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"] }] });
30012
30454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
30013
30455
  type: Component,
30014
30456
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -30016,8 +30458,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30016
30458
  '[class.wizard-md]': "size == 'md'",
30017
30459
  '[class.wizard-lg]': "size == 'lg'",
30018
30460
  '[class.wizard-xl]': "size == 'xl'",
30019
- '[class.lastPage]': 'navService.currentPageIsLast',
30020
- }, 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" }]
30461
+ '[class.wizard-in-page]': 'inPage',
30462
+ '[class.wizard-in-page--fill-content-area]': 'inPage && inPageFillContentArea',
30463
+ }, 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" }]
30021
30464
  }], ctorParameters: function () {
30022
30465
  return [{ type: undefined, decorators: [{
30023
30466
  type: Inject,
@@ -30029,6 +30472,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30029
30472
  }], size: [{
30030
30473
  type: Input,
30031
30474
  args: ['clrWizardSize']
30475
+ }], inPage: [{
30476
+ type: Input,
30477
+ args: ['clrWizardInPage']
30478
+ }], inPageFillContentArea: [{
30479
+ type: Input,
30480
+ args: ['clrWizardInPageFillContentArea']
30032
30481
  }], closable: [{
30033
30482
  type: Input,
30034
30483
  args: ['clrWizardClosable']
@@ -30068,6 +30517,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30068
30517
  }], wizardTitle: [{
30069
30518
  type: ContentChild,
30070
30519
  args: [ClrWizardTitle]
30520
+ }], bodyElementRef: [{
30521
+ type: ViewChild,
30522
+ args: ['body']
30071
30523
  }], modal: [{
30072
30524
  type: ViewChild,
30073
30525
  args: [ClrModal]
@@ -30609,5 +31061,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30609
31061
  * Generated bundle index. Do not edit.
30610
31062
  */
30611
31063
 
30612
- 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 };
31064
+ 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 };
30613
31065
  //# sourceMappingURL=clr-angular.mjs.map