@clr/angular 17.9.0 → 17.11.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 (108) hide show
  1. package/clarity.api.md +183 -87
  2. package/data/datagrid/datagrid-column.d.ts +6 -1
  3. package/data/datagrid/datagrid-filter.d.ts +2 -9
  4. package/data/datagrid/datagrid-row.d.ts +6 -4
  5. package/data/datagrid/datagrid-virtual-scroll.directive.d.ts +5 -7
  6. package/data/datagrid/datagrid.d.ts +15 -4
  7. package/data/datagrid/index.d.ts +1 -0
  8. package/data/datagrid/interfaces/key-nav-grid-strategy.interface.d.ts +11 -0
  9. package/data/datagrid/interfaces/virtual-scroll-data-range.interface.d.ts +5 -0
  10. package/data/datagrid/providers/items.d.ts +1 -0
  11. package/data/datagrid/utils/datagrid-filter-registrar.d.ts +1 -1
  12. package/data/datagrid/utils/key-navigation-grid.controller.d.ts +8 -24
  13. package/data/datagrid/utils/key-navigation-strategies/default.d.ts +15 -0
  14. package/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.d.ts +12 -0
  15. package/data/datagrid/utils/key-navigation-strategies/expanded-row.d.ts +12 -0
  16. package/data/datagrid/utils/key-navigation-utils.d.ts +24 -0
  17. package/esm2020/accordion/stepper/stepper-panel.mjs +3 -3
  18. package/esm2020/button/button-group/button.mjs +20 -4
  19. package/esm2020/data/datagrid/datagrid-column.mjs +40 -28
  20. package/esm2020/data/datagrid/datagrid-detail-header.mjs +3 -3
  21. package/esm2020/data/datagrid/datagrid-filter.mjs +2 -21
  22. package/esm2020/data/datagrid/datagrid-pagination.mjs +35 -31
  23. package/esm2020/data/datagrid/datagrid-row.mjs +23 -11
  24. package/esm2020/data/datagrid/datagrid-virtual-scroll.directive.mjs +52 -51
  25. package/esm2020/data/datagrid/datagrid.mjs +87 -24
  26. package/esm2020/data/datagrid/index.mjs +2 -1
  27. package/esm2020/data/datagrid/interfaces/key-nav-grid-strategy.interface.mjs +8 -0
  28. package/esm2020/data/datagrid/interfaces/virtual-scroll-data-range.interface.mjs +8 -0
  29. package/esm2020/data/datagrid/providers/items.mjs +5 -1
  30. package/esm2020/data/datagrid/utils/datagrid-filter-registrar.mjs +1 -1
  31. package/esm2020/data/datagrid/utils/key-navigation-grid.controller.mjs +44 -271
  32. package/esm2020/data/datagrid/utils/key-navigation-strategies/default.mjs +132 -0
  33. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-columns-row.mjs +129 -0
  34. package/esm2020/data/datagrid/utils/key-navigation-strategies/expanded-row.mjs +165 -0
  35. package/esm2020/data/datagrid/utils/key-navigation-utils.mjs +121 -0
  36. package/esm2020/data/stack-view/stack-block.mjs +3 -3
  37. package/esm2020/emphasis/alert/alert.mjs +3 -3
  38. package/esm2020/forms/combobox/combobox.mjs +3 -3
  39. package/esm2020/forms/combobox/combobox.module.mjs +20 -3
  40. package/esm2020/forms/combobox/index.mjs +2 -1
  41. package/esm2020/forms/combobox/option-group.mjs +42 -0
  42. package/esm2020/forms/combobox/option-items.directive.mjs +5 -1
  43. package/esm2020/forms/combobox/options.mjs +3 -3
  44. package/esm2020/forms/common/abstract-control.mjs +1 -1
  45. package/esm2020/forms/common/if-control-state/abstract-if-state.mjs +1 -1
  46. package/esm2020/forms/datepicker/datepicker-view-manager.mjs +3 -3
  47. package/esm2020/forms/file-input/file-input-container.mjs +2 -2
  48. package/esm2020/forms/file-input/file-input.mjs +11 -4
  49. package/esm2020/forms/number-input/number-input-container.mjs +6 -3
  50. package/esm2020/forms/number-input/number-input.mjs +10 -3
  51. package/esm2020/layout/breadcrumbs/breadcrumbs.mjs +2 -2
  52. package/esm2020/modal/index.mjs +2 -2
  53. package/esm2020/modal/modal-host.component.mjs +29 -0
  54. package/esm2020/modal/modal.mjs +11 -4
  55. package/esm2020/modal/modal.module.mjs +4 -4
  56. package/esm2020/modal/side-panel.mjs +102 -47
  57. package/esm2020/popover/common/abstract-popover.mjs +8 -2
  58. package/esm2020/popover/common/popover.mjs +2 -2
  59. package/esm2020/popover/dropdown/dropdown-item.mjs +10 -4
  60. package/esm2020/popover/dropdown/dropdown-trigger.mjs +12 -4
  61. package/esm2020/popover/dropdown/utils/content-wrapping.mjs +22 -0
  62. package/esm2020/utils/animations/constants.mjs +7 -1
  63. package/esm2020/utils/animations/expandable-animation/base-expandable-animation.mjs +46 -0
  64. package/esm2020/utils/animations/expandable-animation/expandable-animation.directive.mjs +56 -0
  65. package/esm2020/utils/animations/expandable-animation/expandable-animation.mjs +13 -36
  66. package/esm2020/utils/animations/expandable-animation/expandable-animation.module.mjs +3 -2
  67. package/esm2020/utils/animations/expandable-animation/index.mjs +4 -2
  68. package/esm2020/utils/chocolate/oompa-loompa.mjs +1 -1
  69. package/esm2020/utils/focus/focusable-item/basic-focusable-item.service.mjs +2 -2
  70. package/esm2020/utils/i18n/common-strings.default.mjs +2 -1
  71. package/esm2020/utils/i18n/common-strings.interface.mjs +1 -1
  72. package/esm2020/wizard/wizard-stepnav-item.mjs +60 -24
  73. package/esm2020/wizard/wizard.mjs +29 -6
  74. package/fesm2015/clr-angular.mjs +1377 -646
  75. package/fesm2015/clr-angular.mjs.map +1 -1
  76. package/fesm2020/clr-angular.mjs +1371 -641
  77. package/fesm2020/clr-angular.mjs.map +1 -1
  78. package/forms/combobox/combobox.module.d.ts +12 -11
  79. package/forms/combobox/index.d.ts +1 -0
  80. package/forms/combobox/option-group.d.ts +9 -0
  81. package/forms/combobox/option-items.directive.d.ts +1 -0
  82. package/forms/common/abstract-control.d.ts +1 -1
  83. package/forms/common/if-control-state/abstract-if-state.d.ts +1 -1
  84. package/forms/file-input/file-input.d.ts +2 -0
  85. package/forms/number-input/number-input-container.d.ts +1 -0
  86. package/forms/number-input/number-input.d.ts +2 -0
  87. package/modal/index.d.ts +1 -1
  88. package/modal/modal-host.component.d.ts +5 -0
  89. package/modal/modal.d.ts +3 -2
  90. package/modal/modal.module.d.ts +2 -2
  91. package/modal/side-panel.d.ts +18 -10
  92. package/package.json +2 -2
  93. package/popover/common/abstract-popover.d.ts +1 -1
  94. package/popover/dropdown/dropdown-item.d.ts +5 -1
  95. package/popover/dropdown/dropdown-trigger.d.ts +5 -2
  96. package/popover/dropdown/utils/content-wrapping.d.ts +2 -0
  97. package/utils/animations/constants.d.ts +1 -0
  98. package/utils/animations/expandable-animation/base-expandable-animation.d.ts +16 -0
  99. package/utils/animations/expandable-animation/expandable-animation.d.ts +2 -9
  100. package/utils/animations/expandable-animation/expandable-animation.directive.d.ts +16 -0
  101. package/utils/animations/expandable-animation/expandable-animation.module.d.ts +3 -2
  102. package/utils/animations/expandable-animation/index.d.ts +1 -0
  103. package/utils/chocolate/oompa-loompa.d.ts +1 -1
  104. package/utils/i18n/common-strings.interface.d.ts +4 -0
  105. package/wizard/wizard-stepnav-item.d.ts +16 -2
  106. package/wizard/wizard.d.ts +12 -2
  107. package/esm2020/modal/modal-host.directive.mjs +0 -20
  108. package/modal/modal-host.directive.d.ts +0 -5
@@ -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.
@@ -372,6 +378,7 @@ const commonStringsDefault = {
372
378
  datagridExpandableRowsHelperText: `Screen reader table commands may not work for viewing expanded content, please use your screen reader's browse mode to read the content exposed by this button`,
373
379
  // Wizard
374
380
  wizardStep: 'Step',
381
+ wizardStepCurrent: 'Current',
375
382
  wizardStepSuccess: 'Completed',
376
383
  wizardStepError: 'Error',
377
384
  wizardStepnavAriaLabel: 'Wizard steps',
@@ -1252,10 +1259,10 @@ class ClrStepperPanel extends ClrAccordionPanel {
1252
1259
  }
1253
1260
  }
1254
1261
  ClrStepperPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: i1.FormGroupName, optional: true }, { token: i1.NgModelGroup, optional: true }, { token: StepperService }, { token: IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1255
- ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-stepper-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1262
+ ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-stepper-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <span class=\"clr-step-status-icon\">\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1256
1263
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, decorators: [{
1257
1264
  type: Component,
1258
- args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-stepper-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1265
+ args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-stepper-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <span class=\"clr-step-status-icon\">\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1259
1266
  }], ctorParameters: function () {
1260
1267
  return [{ type: undefined, decorators: [{
1261
1268
  type: Inject,
@@ -2630,10 +2637,18 @@ ClrButton.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15
2630
2637
  [attr.id]="id"
2631
2638
  >
2632
2639
  <span class="spinner spinner-inline" *ngIf="loading"></span>
2633
- <ng-content></ng-content>
2640
+ <ng-container *ngIf="inMenu; then inMenuTemplate; else defaultTemplate"></ng-container>
2634
2641
  </button>
2635
2642
  </ng-template>
2636
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2643
+ <ng-template #defaultTemplate>
2644
+ <ng-content></ng-content>
2645
+ </ng-template>
2646
+ <ng-template #inMenuTemplate>
2647
+ <span class="dropdown-item-content">
2648
+ <ng-container [ngTemplateOutlet]="defaultTemplate"></ng-container>
2649
+ </span>
2650
+ </ng-template>
2651
+ `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
2637
2652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrButton, decorators: [{
2638
2653
  type: Component,
2639
2654
  args: [{
@@ -2650,9 +2665,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
2650
2665
  [attr.id]="id"
2651
2666
  >
2652
2667
  <span class="spinner spinner-inline" *ngIf="loading"></span>
2653
- <ng-content></ng-content>
2668
+ <ng-container *ngIf="inMenu; then inMenuTemplate; else defaultTemplate"></ng-container>
2654
2669
  </button>
2655
2670
  </ng-template>
2671
+ <ng-template #defaultTemplate>
2672
+ <ng-content></ng-content>
2673
+ </ng-template>
2674
+ <ng-template #inMenuTemplate>
2675
+ <span class="dropdown-item-content">
2676
+ <ng-container [ngTemplateOutlet]="defaultTemplate"></ng-container>
2677
+ </span>
2678
+ </ng-template>
2656
2679
  `,
2657
2680
  providers: [{ provide: LoadingListener, useExisting: ClrButton }],
2658
2681
  }]
@@ -3117,55 +3140,74 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3117
3140
  * This software is released under MIT license.
3118
3141
  * The full license information can be found in LICENSE in the root directory of this project.
3119
3142
  */
3120
- class ClrExpandableAnimation {
3143
+ class BaseExpandableAnimation {
3121
3144
  constructor(element, domAdapter, renderer) {
3122
3145
  this.element = element;
3123
3146
  this.domAdapter = domAdapter;
3124
3147
  this.renderer = renderer;
3125
- this.clrExpandTrigger = false;
3126
3148
  this.startHeight = 0;
3127
3149
  }
3150
+ updateStartHeight() {
3151
+ this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3152
+ }
3153
+ initAnimationEffects() {
3154
+ this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3155
+ }
3156
+ cleanupAnimationEffects(cancelAnimations = false) {
3157
+ this.renderer.removeStyle(this.element.nativeElement, 'overflow');
3158
+ // A "safe" auto-update of the height ensuring basic OOTB user experience .
3159
+ // Prone to small jumps in initial animation height if data was changed in the meantime, the window was resized, etc.
3160
+ // For optimal behavior call manually updateStartHeight() from the parent component before initiating the update.
3161
+ this.updateStartHeight();
3162
+ if (cancelAnimations) {
3163
+ this.cancelElementAnimations();
3164
+ }
3165
+ }
3166
+ cancelElementAnimations() {
3167
+ this.element.nativeElement.getAnimations().forEach(animation => {
3168
+ if (animation.playState === 'finished') {
3169
+ animation.cancel(); // clears animation-style set on the element
3170
+ }
3171
+ });
3172
+ }
3173
+ }
3174
+ BaseExpandableAnimation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: BaseExpandableAnimation, deps: [{ token: i0.ElementRef }, { token: DomAdapter }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
3175
+ BaseExpandableAnimation.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: BaseExpandableAnimation, ngImport: i0 });
3176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: BaseExpandableAnimation, decorators: [{
3177
+ type: Directive
3178
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }]; } });
3179
+
3180
+ /*
3181
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3182
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3183
+ * This software is released under MIT license.
3184
+ * The full license information can be found in LICENSE in the root directory of this project.
3185
+ */
3186
+ class ClrExpandableAnimation extends BaseExpandableAnimation {
3187
+ constructor() {
3188
+ super(...arguments);
3189
+ this.clrExpandTrigger = false;
3190
+ }
3128
3191
  get expandAnimation() {
3129
3192
  return { value: this.clrExpandTrigger, params: { startHeight: this.startHeight } };
3130
3193
  }
3131
3194
  animationStart(event) {
3132
3195
  if (event.fromState !== 'void') {
3133
- this.renderer.setStyle(this.element.nativeElement, 'overflow', 'hidden');
3196
+ this.initAnimationEffects();
3134
3197
  }
3135
3198
  }
3136
3199
  animationDone(event) {
3137
3200
  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();
3201
+ this.cleanupAnimationEffects();
3143
3202
  }
3144
3203
  }
3145
- updateStartHeight() {
3146
- this.startHeight = this.domAdapter.computedHeight(this.element.nativeElement) || 0;
3147
- }
3148
3204
  }
3149
- 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
- ] });
3205
+ ClrExpandableAnimation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, deps: null, target: i0.ɵɵFactoryTarget.Component });
3206
+ 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
3207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimation, decorators: [{
3159
3208
  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"] }]
3168
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }]; }, propDecorators: { clrExpandTrigger: [{
3209
+ 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"] }]
3210
+ }], propDecorators: { clrExpandTrigger: [{
3169
3211
  type: Input
3170
3212
  }], expandAnimation: [{
3171
3213
  type: HostBinding,
@@ -3184,7 +3226,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
3184
3226
  * This software is released under MIT license.
3185
3227
  * The full license information can be found in LICENSE in the root directory of this project.
3186
3228
  */
3187
- const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation];
3229
+ class ClrExpandableAnimationDirective extends BaseExpandableAnimation {
3230
+ constructor(element, domAdapter, renderer, builder) {
3231
+ super(element, domAdapter, renderer);
3232
+ this.builder = builder;
3233
+ this.expanded = false;
3234
+ }
3235
+ ngOnChanges(changes) {
3236
+ if (changes['expanded'] && !changes['expanded'].firstChange) {
3237
+ Promise.resolve().then(() => this.playAnimation());
3238
+ }
3239
+ }
3240
+ ngOnDestroy() {
3241
+ var _a;
3242
+ (_a = this.player) === null || _a === void 0 ? void 0 : _a.destroy();
3243
+ }
3244
+ playAnimation() {
3245
+ if (this.player) {
3246
+ this.player.destroy();
3247
+ }
3248
+ this.player = this.builder
3249
+ .build([useAnimation(defaultExpandAnimation, { params: { startHeight: this.startHeight } })])
3250
+ .create(this.element.nativeElement);
3251
+ this.player.onStart(() => this.initAnimationEffects());
3252
+ this.player.onDone(() => this.cleanupAnimationEffects(true));
3253
+ this.player.play();
3254
+ }
3255
+ }
3256
+ 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 });
3257
+ 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 });
3258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationDirective, decorators: [{
3259
+ type: Directive,
3260
+ args: [{
3261
+ selector: '[clrExpandableAnimation]',
3262
+ providers: [DomAdapter],
3263
+ host: {
3264
+ '[class.clr-expandable-animation]': 'true',
3265
+ },
3266
+ }]
3267
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: DomAdapter }, { type: i0.Renderer2 }, { type: i2.AnimationBuilder }]; }, propDecorators: { expanded: [{
3268
+ type: Input,
3269
+ args: ['clrExpandableAnimation']
3270
+ }] } });
3271
+
3272
+ /*
3273
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
3274
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
3275
+ * This software is released under MIT license.
3276
+ * The full license information can be found in LICENSE in the root directory of this project.
3277
+ */
3278
+ const EXPANDABLE_ANIMATION_DIRECTIVES = [ClrExpandableAnimation, ClrExpandableAnimationDirective];
3188
3279
 
3189
3280
  /*
3190
3281
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -5185,7 +5276,7 @@ class Popover {
5185
5276
  this._scroll = new Subject();
5186
5277
  const anchor = e;
5187
5278
  let current = e;
5188
- while (current && current !== document) {
5279
+ while (current && current !== document && current.nodeType === Node.ELEMENT_NODE) {
5189
5280
  if (this.scrolls(current)) {
5190
5281
  current.addEventListener('scroll', this.boundOnScrollListener);
5191
5282
  this.scrollableElements.push(current);
@@ -5238,7 +5329,13 @@ class AbstractPopover {
5238
5329
  this.documentESCListener = null;
5239
5330
  this.closeOnOutsideClickCallback = event => {
5240
5331
  // The anchor element containing the click event origin means, the click wasn't triggered outside.
5241
- if (this.anchorElem.contains(event.target)) {
5332
+ if (event.target.shadowRoot) {
5333
+ const containsNode = event.composedPath().some((element) => element === this.anchorElem);
5334
+ if (containsNode) {
5335
+ return;
5336
+ }
5337
+ }
5338
+ else if (this.anchorElem.contains(event.target)) {
5242
5339
  return;
5243
5340
  }
5244
5341
  this.toggleService.open = false;
@@ -5452,6 +5549,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5452
5549
  args: ['clrPosition']
5453
5550
  }] } });
5454
5551
 
5552
+ /*
5553
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
5554
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
5555
+ * This software is released under MIT license.
5556
+ * The full license information can be found in LICENSE in the root directory of this project.
5557
+ */
5558
+ function wrapHostContentInsideSpan(hostElement, renderer, wrapperClass) {
5559
+ if (!hostElement || !renderer) {
5560
+ return;
5561
+ }
5562
+ const wrapper = renderer.createElement('span');
5563
+ if (wrapperClass) {
5564
+ renderer.addClass(wrapper, wrapperClass);
5565
+ }
5566
+ // Move all existing children into the wrapper
5567
+ // We must loop while there are child nodes and re-append them to wrapper.
5568
+ while (hostElement.firstChild) {
5569
+ renderer.appendChild(wrapper, hostElement.firstChild);
5570
+ }
5571
+ renderer.appendChild(hostElement, wrapper);
5572
+ }
5573
+
5455
5574
  /*
5456
5575
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
5457
5576
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -5459,8 +5578,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5459
5578
  * The full license information can be found in LICENSE in the root directory of this project.
5460
5579
  */
5461
5580
  class ClrDropdownTrigger {
5462
- constructor(dropdown, toggleService, el, focusHandler) {
5581
+ constructor(dropdown, toggleService, el, focusHandler, renderer) {
5463
5582
  this.toggleService = toggleService;
5583
+ this.el = el;
5584
+ this.renderer = renderer;
5464
5585
  this.isRootLevelToggle = true;
5465
5586
  // if the containing dropdown has a parent, then this is not the root level one
5466
5587
  if (dropdown.parent) {
@@ -5474,8 +5595,13 @@ class ClrDropdownTrigger {
5474
5595
  onDropdownTriggerClick(event) {
5475
5596
  this.toggleService.toggleWithEvent(event);
5476
5597
  }
5598
+ ngAfterViewInit() {
5599
+ if (!this.isRootLevelToggle) {
5600
+ wrapHostContentInsideSpan(this.el.nativeElement, this.renderer, 'dropdown-item-content');
5601
+ }
5602
+ }
5477
5603
  }
5478
- ClrDropdownTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownTrigger, deps: [{ token: ClrDropdown }, { token: ClrPopoverToggleService }, { token: i0.ElementRef }, { token: DropdownFocusHandler }], target: i0.ɵɵFactoryTarget.Directive });
5604
+ ClrDropdownTrigger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownTrigger, deps: [{ token: ClrDropdown }, { token: ClrPopoverToggleService }, { token: i0.ElementRef }, { token: DropdownFocusHandler }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
5479
5605
  ClrDropdownTrigger.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDropdownTrigger, selector: "[clrDropdownTrigger],[clrDropdownToggle]", host: { listeners: { "click": "onDropdownTriggerClick($event)" }, properties: { "class.dropdown-toggle": "isRootLevelToggle", "class.dropdown-item": "!isRootLevelToggle", "class.expandable": "!isRootLevelToggle", "class.active": "active", "attr.aria-haspopup": "\"menu\"", "attr.aria-expanded": "active" } }, ngImport: i0 });
5480
5606
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownTrigger, decorators: [{
5481
5607
  type: Directive,
@@ -5491,7 +5617,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5491
5617
  '[attr.aria-expanded]': 'active',
5492
5618
  },
5493
5619
  }]
5494
- }], ctorParameters: function () { return [{ type: ClrDropdown }, { type: ClrPopoverToggleService }, { type: i0.ElementRef }, { type: DropdownFocusHandler }]; }, propDecorators: { onDropdownTriggerClick: [{
5620
+ }], ctorParameters: function () { return [{ type: ClrDropdown }, { type: ClrPopoverToggleService }, { type: i0.ElementRef }, { type: DropdownFocusHandler }, { type: i0.Renderer2 }]; }, propDecorators: { onDropdownTriggerClick: [{
5495
5621
  type: HostListener,
5496
5622
  args: ['click', ['$event']]
5497
5623
  }] } });
@@ -5516,7 +5642,7 @@ class BasicFocusableItem {
5516
5642
  if (isPlatformBrowser(this.platformId)) {
5517
5643
  this.renderer.setAttribute(this.el.nativeElement, 'tabindex', '0');
5518
5644
  this.el.nativeElement.focus();
5519
- this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });
5645
+ this.el.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
5520
5646
  }
5521
5647
  }
5522
5648
  blur() {
@@ -5555,10 +5681,12 @@ const BASIC_FOCUSABLE_ITEM_PROVIDER = [
5555
5681
  * The full license information can be found in LICENSE in the root directory of this project.
5556
5682
  */
5557
5683
  class ClrDropdownItem {
5558
- constructor(dropdown, _dropdownService, focusableItem) {
5684
+ constructor(dropdown, _dropdownService, focusableItem, el, renderer) {
5559
5685
  this.dropdown = dropdown;
5560
5686
  this._dropdownService = _dropdownService;
5561
5687
  this.focusableItem = focusableItem;
5688
+ this.el = el;
5689
+ this.renderer = renderer;
5562
5690
  }
5563
5691
  get disabled() {
5564
5692
  return this.focusableItem.disabled;
@@ -5576,6 +5704,9 @@ class ClrDropdownItem {
5576
5704
  set dropdownItemId(value) {
5577
5705
  this.focusableItem.id = value;
5578
5706
  }
5707
+ ngAfterViewInit() {
5708
+ wrapHostContentInsideSpan(this.el.nativeElement, this.renderer, 'dropdown-item-content');
5709
+ }
5579
5710
  onDropdownItemClick() {
5580
5711
  // Move focus back to the root dropdown trigger.
5581
5712
  // This is done BEFORE the dropdown is closed so that focus gets moved properly if a modal is opened.
@@ -5613,7 +5744,7 @@ class ClrDropdownItem {
5613
5744
  return rootDropdown;
5614
5745
  }
5615
5746
  }
5616
- ClrDropdownItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownItem, deps: [{ token: ClrDropdown }, { token: RootDropdownService }, { token: FocusableItem }], target: i0.ɵɵFactoryTarget.Directive });
5747
+ ClrDropdownItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownItem, deps: [{ token: ClrDropdown }, { token: RootDropdownService }, { token: FocusableItem }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
5617
5748
  ClrDropdownItem.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDropdownItem, selector: "[clrDropdownItem]", inputs: { disabled: ["clrDisabled", "disabled"], dropdownItemId: ["id", "dropdownItemId"] }, host: { listeners: { "click": "onDropdownItemClick()", "keydown.space": "onSpaceKeydown($event)", "keydown.enter": "onEnterKeydown($event)" }, properties: { "class.disabled": "disabled", "class.dropdown-item": "true", "attr.role": "\"menuitem\"", "attr.aria-disabled": "disabled", "attr.id": "dropdownItemId" } }, providers: [BASIC_FOCUSABLE_ITEM_PROVIDER], ngImport: i0 });
5618
5749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDropdownItem, decorators: [{
5619
5750
  type: Directive,
@@ -5628,7 +5759,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
5628
5759
  },
5629
5760
  providers: [BASIC_FOCUSABLE_ITEM_PROVIDER],
5630
5761
  }]
5631
- }], ctorParameters: function () { return [{ type: ClrDropdown }, { type: RootDropdownService }, { type: FocusableItem }]; }, propDecorators: { disabled: [{
5762
+ }], ctorParameters: function () { return [{ type: ClrDropdown }, { type: RootDropdownService }, { type: FocusableItem }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { disabled: [{
5632
5763
  type: Input,
5633
5764
  args: ['clrDisabled']
5634
5765
  }], dropdownItemId: [{
@@ -8993,7 +9124,7 @@ class ClrOptions {
8993
9124
  }
8994
9125
  }
8995
9126
  ClrOptions.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrOptions, deps: [{ token: OptionSelectionService }, { token: IF_ACTIVE_ID }, { token: i0.ElementRef }, { token: ClrCommonStringsService }, { token: ComboboxFocusHandler }, { token: ClrPopoverToggleService }, { token: POPOVER_HOST_ANCHOR, optional: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
8996
- ClrOptions.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOptions, selector: "clr-options", inputs: { optionsId: ["id", "optionsId"] }, host: { properties: { "class.clr-combobox-options": "true", "attr.role": "\"listbox\"", "id": "optionsId" } }, providers: [{ provide: LoadingListener, useExisting: ClrOptions }], queries: [{ propertyName: "items", predicate: ClrOption }], ngImport: i0, template: `
9127
+ ClrOptions.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOptions, selector: "clr-options", inputs: { optionsId: ["id", "optionsId"] }, host: { properties: { "class.clr-combobox-options": "true", "attr.role": "\"listbox\"", "id": "optionsId" } }, providers: [{ provide: LoadingListener, useExisting: ClrOptions }], queries: [{ propertyName: "items", predicate: ClrOption, descendants: true }], ngImport: i0, template: `
8997
9128
  <div *ngIf="optionSelectionService.loading" class="clr-combobox-options-loading">
8998
9129
  <clr-spinner clrInline>
8999
9130
  {{ commonStrings.keys.loading }}
@@ -9062,7 +9193,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9062
9193
  args: ['id']
9063
9194
  }], items: [{
9064
9195
  type: ContentChildren,
9065
- args: [ClrOption]
9196
+ args: [ClrOption, { descendants: true }]
9066
9197
  }] } });
9067
9198
 
9068
9199
  /*
@@ -9341,7 +9472,7 @@ ClrCombobox.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
9341
9472
  IF_ACTIVE_ID_PROVIDER,
9342
9473
  FOCUS_SERVICE_PROVIDER,
9343
9474
  COMBOBOX_FOCUS_HANDLER_PROVIDER,
9344
- ], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }, { propertyName: "options", first: true, predicate: ClrOptions, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], 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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] });
9475
+ ], queries: [{ propertyName: "optionSelected", first: true, predicate: ClrOptionSelected, descendants: true }, { propertyName: "options", first: true, predicate: ClrOptions, descendants: true }], viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textboxInput"], descendants: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true }], usesInheritance: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], 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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n class=\"clr-combobox-pills\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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.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: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrRovingTabindex, selector: "[clrRovingTabindex]", inputs: ["clrRovingTabindex", "clrRovingTabindexDisabled"] }, { kind: "directive", type: ClrKeyFocusItem, selector: "[clrKeyFocusItem]" }, { kind: "directive", type: ClrPopoverAnchor, selector: "[clrPopoverAnchor]" }, { kind: "directive", type: ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose"] }] });
9345
9476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrCombobox, decorators: [{
9346
9477
  type: Component,
9347
9478
  args: [{ selector: 'clr-combobox', providers: [
@@ -9354,7 +9485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9354
9485
  '[class.aria-required]': 'true',
9355
9486
  '[class.clr-combobox]': 'true',
9356
9487
  '[class.clr-combobox-disabled]': 'control?.disabled',
9357
- }, 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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <span class=\"clr-combobox-input-wrapper\">\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n </span>\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n" }]
9488
+ }, 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<!-- The (click) handler is needed to auto-focus on input field which can not currently occupy the whole\n width of the component, after being wrapped to a new line -->\n<div\n class=\"clr-combobox-wrapper\"\n clrPopoverAnchor\n (click)=\"focusInput()\"\n [class.multi]=\"multiSelect\"\n [class.invalid]=\"invalid\"\n [class.disabled]=\"control?.disabled? true: null\"\n>\n <span\n *ngIf=\"multiSelect && optionSelectionService.selectionModel.model && multiSelectModel.length > 0\"\n role=\"grid\"\n clrRovingTabindex\n [clrRovingTabindexDisabled]=\"control?.disabled\"\n clrDirection=\"both\"\n [attr.aria-label]=\"getSelectionAriaLabel()\"\n [attr.aria-disabled]=\"control?.disabled? true: null\"\n class=\"clr-combobox-pills\"\n >\n <span *ngFor=\"let item of multiSelectModel; let i = index\" class=\"label label-combobox-pill\" role=\"row\">\n <span role=\"gridcell\">\n <span class=\"clr-combobox-pill-content\" clrKeyFocusItem>\n <ng-container\n *ngIf=\"optionSelected\"\n [ngTemplateOutlet]=\"optionSelected.template\"\n [ngTemplateOutletContext]=\"{$implicit: optionSelectionService.selectionModel.model[i]}\"\n ></ng-container>\n </span>\n </span>\n <span role=\"gridcell\">\n <button\n clrKeyFocusItem\n type=\"button\"\n class=\"clr-combobox-remove-btn\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxDelete + ' ' + optionSelectionService.selectionModel.toString(displayField, i)\"\n (click)=\"unselect(item)\"\n >\n <cds-icon shape=\"window-close\" size=\"12\"></cds-icon>\n </button>\n </span>\n </span>\n </span>\n\n <input\n #textboxInput\n type=\"text\"\n role=\"combobox\"\n [id]=\"inputId()\"\n class=\"clr-input clr-combobox-input\"\n [(ngModel)]=\"searchText\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n [attr.aria-expanded]=\"openState\"\n [attr.aria-owns]=\"ariaOwns\"\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n [attr.aria-invalid]=\"control?.invalid? true: null\"\n [disabled]=\"control?.disabled? true: null\"\n [attr.aria-activedescendant]=\"getActiveDescendant()\"\n [attr.placeholder]=\"placeholder\"\n />\n\n <!-- No click handler, as it uses the handler on the .clr-combobox-wrapper -->\n <button\n clrPopoverOpenCloseButton\n #trigger\n type=\"button\"\n class=\"clr-combobox-trigger\"\n tabindex=\"-1\"\n [disabled]=\"control?.disabled || null\"\n [attr.aria-label]=\"commonStrings.keys.comboboxOpen\"\n >\n <cds-icon shape=\"angle\" direction=\"down\"></cds-icon>\n </button>\n\n <div class=\"clr-focus-indicator\" [class.clr-focus]=\"focused\"></div>\n</div>\n\n<!-- Both close handlers are handled manually due to issues in Edge browser.\n Additionally 'outsideClickToClose' has complex handling that's necessary\n to be manual due to the component architecture -->\n<div role=\"dialog\" *clrPopoverContent=\"openState at smartPosition; outsideClickToClose: false; scrollToClose: false\">\n <ng-content></ng-content>\n</div>\n" }]
9358
9489
  }], ctorParameters: function () {
9359
9490
  return [{ type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl, decorators: [{
9360
9491
  type: Self
@@ -9432,6 +9563,10 @@ class ClrOptionItems {
9432
9563
  this._filterField = field;
9433
9564
  this.optionService.displayField = field;
9434
9565
  }
9566
+ get hasResults() {
9567
+ // explicity return `undefined` instead of `false` if the answer is not known
9568
+ return this.filteredItems ? this.filteredItems.length : undefined;
9569
+ }
9435
9570
  ngDoCheck() {
9436
9571
  if (!this.differ) {
9437
9572
  this.differ = this.differs.find(this.filteredItems).create(this.iterableProxy.ngForTrackBy);
@@ -9501,6 +9636,44 @@ function normalizeValue(value) {
9501
9636
  .toLowerCase();
9502
9637
  }
9503
9638
 
9639
+ /*
9640
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
9641
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
9642
+ * This software is released under MIT license.
9643
+ * The full license information can be found in LICENSE in the root directory of this project.
9644
+ */
9645
+ class ClrOptionGroup {
9646
+ constructor() {
9647
+ this.labelId = uniqueIdFactory();
9648
+ }
9649
+ }
9650
+ ClrOptionGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrOptionGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
9651
+ ClrOptionGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrOptionGroup, selector: "clr-option-group", inputs: { label: ["clrOptionGroupLabel", "label"] }, host: { properties: { "attr.role": "\"group\"", "attr.aria-labelledby": "labelId", "style.display": "clrOptionItems.hasResults ? undefined : \"none\"" } }, queries: [{ propertyName: "clrOptionItems", first: true, predicate: ClrOptionItems, descendants: true }], ngImport: i0, template: `
9652
+ <span [id]="labelId" class="clr-option-group-label" role="presentation">{{ label }}</span>
9653
+ <ng-content></ng-content>
9654
+ `, isInline: true });
9655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrOptionGroup, decorators: [{
9656
+ type: Component,
9657
+ args: [{
9658
+ selector: 'clr-option-group',
9659
+ host: {
9660
+ '[attr.role]': '"group"',
9661
+ '[attr.aria-labelledby]': 'labelId',
9662
+ '[style.display]': 'clrOptionItems.hasResults ? undefined : "none"',
9663
+ },
9664
+ template: `
9665
+ <span [id]="labelId" class="clr-option-group-label" role="presentation">{{ label }}</span>
9666
+ <ng-content></ng-content>
9667
+ `,
9668
+ }]
9669
+ }], propDecorators: { label: [{
9670
+ type: Input,
9671
+ args: ['clrOptionGroupLabel']
9672
+ }], clrOptionItems: [{
9673
+ type: ContentChild,
9674
+ args: [ClrOptionItems]
9675
+ }] } });
9676
+
9504
9677
  /*
9505
9678
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
9506
9679
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -9513,7 +9686,13 @@ class ClrComboboxModule {
9513
9686
  }
9514
9687
  }
9515
9688
  ClrComboboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrComboboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9516
- ClrComboboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrComboboxModule, declarations: [ClrCombobox, ClrComboboxContainer, ClrOptions, ClrOption, ClrOptionSelected, ClrOptionItems], imports: [CommonModule,
9689
+ ClrComboboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrComboboxModule, declarations: [ClrCombobox,
9690
+ ClrComboboxContainer,
9691
+ ClrOptions,
9692
+ ClrOption,
9693
+ ClrOptionGroup,
9694
+ ClrOptionSelected,
9695
+ ClrOptionItems], imports: [CommonModule,
9517
9696
  FormsModule,
9518
9697
  ClrIconModule,
9519
9698
  ClrKeyFocusModule,
@@ -9525,6 +9704,7 @@ ClrComboboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
9525
9704
  ClrComboboxContainer,
9526
9705
  ClrOptions,
9527
9706
  ClrOption,
9707
+ ClrOptionGroup,
9528
9708
  ClrOptionSelected,
9529
9709
  ClrConditionalModule,
9530
9710
  ClrOptionItems] });
@@ -9550,13 +9730,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
9550
9730
  ClrPopoverModuleNext,
9551
9731
  ClrSpinnerModule,
9552
9732
  ],
9553
- declarations: [ClrCombobox, ClrComboboxContainer, ClrOptions, ClrOption, ClrOptionSelected, ClrOptionItems],
9733
+ declarations: [
9734
+ ClrCombobox,
9735
+ ClrComboboxContainer,
9736
+ ClrOptions,
9737
+ ClrOption,
9738
+ ClrOptionGroup,
9739
+ ClrOptionSelected,
9740
+ ClrOptionItems,
9741
+ ],
9554
9742
  exports: [
9555
9743
  ClrCommonFormsModule,
9556
9744
  ClrCombobox,
9557
9745
  ClrComboboxContainer,
9558
9746
  ClrOptions,
9559
9747
  ClrOption,
9748
+ ClrOptionGroup,
9560
9749
  ClrOptionSelected,
9561
9750
  ClrConditionalModule,
9562
9751
  ClrOptionItems,
@@ -10049,14 +10238,14 @@ class ClrBreadcrumbs {
10049
10238
  }
10050
10239
  }
10051
10240
  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" }] });
10241
+ 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(--clr-base-gap-s)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;height:var(--clr-base-row-height-s);color:var(--cds-alias-typography-color-400);font-size:var(--clr-base-typography-font-size-inline);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--clr-base-typography-line-height-16);letter-spacing:calc(-.1 * (1rem / var(--cds-global-base)))}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center}.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 a:visited:active{color:var(--clr-link-active-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space)}.clr-breadcrumb-menu .clr-breadcrumb-expand{height:var(--clr-base-icon-size-l);width:var(--clr-base-icon-size-l);min-height:var(--clr-base-icon-size-l);min-width:var(--clr-base-icon-size-l);margin:0;padding:0;gap:0}\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
10242
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrBreadcrumbs, decorators: [{
10054
10243
  type: Component,
10055
10244
  args: [{ selector: 'clr-breadcrumbs', host: {
10056
10245
  class: 'clr-breadcrumb',
10057
10246
  '[attr.aria-label]': 'commonStrings.keys.breadcrumbsLabel',
10058
10247
  '[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"] }]
10248
+ }, 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(--clr-base-gap-s)}.clr-breadcrumb-menu{display:flex;flex-wrap:wrap;align-items:center}.clr-breadcrumb-menu .clr-breadcrumb-item{display:flex;align-items:center;height:var(--clr-base-row-height-s);color:var(--cds-alias-typography-color-400);font-size:var(--clr-base-typography-font-size-inline);font-weight:var(--cds-alias-typography-secondary-font-weight);line-height:var(--clr-base-typography-line-height-16);letter-spacing:calc(-.1 * (1rem / var(--cds-global-base)))}.clr-breadcrumb-menu .clr-breadcrumb-item a{text-decoration:none;text-align:center}.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 a:visited:active{color:var(--clr-link-active-color)}.clr-breadcrumb-menu .clr-breadcrumb-item:not(:last-child):after{content:\"/\";margin:0 var(--clr-breadcrumb-item-space)}.clr-breadcrumb-menu .clr-breadcrumb-expand{height:var(--clr-base-icon-size-l);width:var(--clr-base-icon-size-l);min-height:var(--clr-base-icon-size-l);min-width:var(--clr-base-icon-size-l);margin:0;padding:0;gap:0}\n"] }]
10060
10249
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }]; }, propDecorators: { items: [{
10061
10250
  type: Input
10062
10251
  }], clrBreadcrumbItemClick: [{
@@ -14863,7 +15052,7 @@ class ClrDatepickerViewManager {
14863
15052
  }
14864
15053
  }
14865
15054
  ClrDatepickerViewManager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, deps: [{ token: ClrCommonStringsService }, { token: ViewManagerService }, { token: DateNavigationService }, { token: DateIOService }], target: i0.ɵɵFactoryTarget.Component });
14866
- ClrDatepickerViewManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager", host: { attributes: { "role": "dialog" }, properties: { "class.datepicker": "true", "class.has-range-option": "hasRangeOptions", "class.has-action-buttons": "hasActionButtons", "attr.aria-modal": "true", "attr.aria-label": "commonStrings.keys.datepickerDialogLabel" } }, providers: [DatepickerFocusService], 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=\"hasRangeOptions; else calendarView\">\n <clr-vertical-nav class=\"clr-date-range-picker-nav\">\n <ng-container *ngFor=\"let option of dateRangeOptions\">\n <a\n clrVerticalNavLink\n href=\"javascript:void(0)\"\n [attr.aria-label]=\"option?.label\"\n tabindex=\"0\"\n (keyup.enter)=\"onRangeOptionSelect(option)\"\n (click)=\"onRangeOptionSelect(option)\"\n >\n {{option.label}}\n </a>\n </ng-container>\n </clr-vertical-nav>\n\n <div class=\"datepicker-view-manager\">\n <ng-container *ngTemplateOutlet=\"calendarView\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #calendarView>\n <clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n <clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n <clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n <clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\n</ng-template>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrVerticalNav, selector: "clr-vertical-nav", inputs: ["clrVerticalNavToggleLabel", "clrVerticalNavCollapsible", "clrVerticalNavCollapsed"], outputs: ["clrVerticalNavCollapsedChange"] }, { kind: "component", type: ClrVerticalNavLink, selector: "[clrVerticalNavLink]" }, { kind: "component", type: ClrMonthpicker, selector: "clr-monthpicker" }, { kind: "component", type: ClrYearpicker, selector: "clr-yearpicker" }, { kind: "component", type: ClrDaypicker, selector: "clr-daypicker" }, { kind: "component", type: ClrDatepickerActions, selector: "clr-datepicker-actions" }] });
15055
+ ClrDatepickerViewManager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatepickerViewManager, selector: "clr-datepicker-view-manager", host: { attributes: { "role": "dialog" }, properties: { "class.datepicker": "true", "class.has-range-option": "hasRangeOptions", "class.has-action-buttons": "hasActionButtons", "attr.aria-modal": "true", "attr.aria-label": "commonStrings.keys.datepickerDialogLabel" } }, providers: [DatepickerFocusService], 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=\"hasRangeOptions; else calendarView\">\n <clr-vertical-nav class=\"clr-date-range-picker-nav\">\n <ng-container *ngFor=\"let option of dateRangeOptions\">\n <a\n clrVerticalNavLink\n href=\"javascript:void(0)\"\n [attr.aria-label]=\"option?.label\"\n tabindex=\"0\"\n (keyup.enter)=\"onRangeOptionSelect(option)\"\n (click)=\"onRangeOptionSelect(option)\"\n >\n {{option.label}}\n </a>\n </ng-container>\n </clr-vertical-nav>\n\n <ng-container *ngTemplateOutlet=\"calendarView\"></ng-container>\n</ng-container>\n\n<ng-template #calendarView>\n <div class=\"datepicker-view-manager\">\n <clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n <clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n <clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n <clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\n </div>\n</ng-template>\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: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ClrVerticalNav, selector: "clr-vertical-nav", inputs: ["clrVerticalNavToggleLabel", "clrVerticalNavCollapsible", "clrVerticalNavCollapsed"], outputs: ["clrVerticalNavCollapsedChange"] }, { kind: "component", type: ClrVerticalNavLink, selector: "[clrVerticalNavLink]" }, { kind: "component", type: ClrMonthpicker, selector: "clr-monthpicker" }, { kind: "component", type: ClrYearpicker, selector: "clr-yearpicker" }, { kind: "component", type: ClrDaypicker, selector: "clr-daypicker" }, { kind: "component", type: ClrDatepickerActions, selector: "clr-datepicker-actions" }] });
14867
15056
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatepickerViewManager, decorators: [{
14868
15057
  type: Component,
14869
15058
  args: [{ selector: 'clr-datepicker-view-manager', providers: [DatepickerFocusService], host: {
@@ -14873,7 +15062,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14873
15062
  '[attr.aria-modal]': 'true',
14874
15063
  '[attr.aria-label]': 'commonStrings.keys.datepickerDialogLabel',
14875
15064
  role: 'dialog',
14876
- }, 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=\"hasRangeOptions; else calendarView\">\n <clr-vertical-nav class=\"clr-date-range-picker-nav\">\n <ng-container *ngFor=\"let option of dateRangeOptions\">\n <a\n clrVerticalNavLink\n href=\"javascript:void(0)\"\n [attr.aria-label]=\"option?.label\"\n tabindex=\"0\"\n (keyup.enter)=\"onRangeOptionSelect(option)\"\n (click)=\"onRangeOptionSelect(option)\"\n >\n {{option.label}}\n </a>\n </ng-container>\n </clr-vertical-nav>\n\n <div class=\"datepicker-view-manager\">\n <ng-container *ngTemplateOutlet=\"calendarView\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #calendarView>\n <clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n <clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n <clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n <clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\n</ng-template>\n" }]
15065
+ }, 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=\"hasRangeOptions; else calendarView\">\n <clr-vertical-nav class=\"clr-date-range-picker-nav\">\n <ng-container *ngFor=\"let option of dateRangeOptions\">\n <a\n clrVerticalNavLink\n href=\"javascript:void(0)\"\n [attr.aria-label]=\"option?.label\"\n tabindex=\"0\"\n (keyup.enter)=\"onRangeOptionSelect(option)\"\n (click)=\"onRangeOptionSelect(option)\"\n >\n {{option.label}}\n </a>\n </ng-container>\n </clr-vertical-nav>\n\n <ng-container *ngTemplateOutlet=\"calendarView\"></ng-container>\n</ng-container>\n\n<ng-template #calendarView>\n <div class=\"datepicker-view-manager\">\n <clr-monthpicker *ngIf=\"isMonthView\"></clr-monthpicker>\n <clr-yearpicker *ngIf=\"isYearView\"></clr-yearpicker>\n <clr-daypicker *ngIf=\"isDayView\"></clr-daypicker>\n <clr-datepicker-actions *ngIf=\"hasActionButtons\"></clr-datepicker-actions>\n </div>\n</ng-template>\n" }]
14877
15066
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: ViewManagerService }, { type: DateNavigationService }, { type: DateIOService }]; } });
14878
15067
 
14879
15068
  /*
@@ -15667,7 +15856,7 @@ class ClrFileInputContainer extends ClrAbstractContainer {
15667
15856
  return this.fileInput.elementRef.nativeElement.multiple;
15668
15857
  }
15669
15858
  get disabled() {
15670
- return this.fileInput.elementRef.nativeElement.disabled;
15859
+ return this.fileInput.elementRef.nativeElement.disabled || (this.control && this.control.disabled);
15671
15860
  }
15672
15861
  get browseButtonText() {
15673
15862
  var _a, _b;
@@ -15891,9 +16080,13 @@ class ClrFileInput extends WrappedFormControl {
15891
16080
  constructor(injector, renderer, viewContainerRef, elementRef, control, commonStrings) {
15892
16081
  super(viewContainerRef, ClrFileInputContainer, injector, control, renderer, elementRef);
15893
16082
  this.elementRef = elementRef;
16083
+ this.control = control;
15894
16084
  this.commonStrings = commonStrings;
15895
16085
  this.selection = undefined;
15896
16086
  }
16087
+ get disabled() {
16088
+ return this.control && this.control.disabled;
16089
+ }
15897
16090
  handleChange() {
15898
16091
  this.updateSelection();
15899
16092
  }
@@ -15925,7 +16118,7 @@ class ClrFileInput extends WrappedFormControl {
15925
16118
  }
15926
16119
  }
15927
16120
  ClrFileInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Directive });
15928
- ClrFileInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInput, selector: "input[type=\"file\"][clrFileInput]", host: { attributes: { "tabindex": "-1", "aria-hidden": "true" }, listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true" } }, usesInheritance: true, ngImport: i0 });
16121
+ ClrFileInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrFileInput, selector: "input[type=\"file\"][clrFileInput]", host: { attributes: { "tabindex": "-1", "aria-hidden": "true" }, listeners: { "change": "handleChange()" }, properties: { "class.clr-file-input": "true", "disabled": "this.disabled" } }, usesInheritance: true, ngImport: i0 });
15929
16122
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrFileInput, decorators: [{
15930
16123
  type: Directive,
15931
16124
  args: [{
@@ -15942,7 +16135,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15942
16135
  }, {
15943
16136
  type: Optional
15944
16137
  }] }, { type: ClrCommonStringsService }];
15945
- }, propDecorators: { handleChange: [{
16138
+ }, propDecorators: { disabled: [{
16139
+ type: HostBinding,
16140
+ args: ['disabled']
16141
+ }], handleChange: [{
15946
16142
  type: HostListener,
15947
16143
  args: ['change']
15948
16144
  }] } });
@@ -16138,6 +16334,9 @@ class ClrNumberInputContainer extends ClrAbstractContainer {
16138
16334
  this.focus = false;
16139
16335
  this.subscriptions.push(focusService.focusChange.subscribe(state => (this.focus = state)));
16140
16336
  }
16337
+ focusOut() {
16338
+ this.input.dispatchBlur();
16339
+ }
16141
16340
  }
16142
16341
  ClrNumberInputContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInputContainer, deps: [{ token: ControlClassService }, { token: LayoutService, optional: true }, { token: NgControlService }, { token: FocusService }, { token: IfControlStateService }], target: i0.ɵɵFactoryTarget.Component });
16143
16342
  ClrNumberInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrNumberInputContainer, selector: "clr-number-input-container", host: { properties: { "class.clr-form-control": "true", "class.clr-form-control-disabled": "control?.disabled", "class.clr-form-control-readonly": "input.readonly", "class.clr-row": "addGrid()" } }, providers: [FocusService, IfControlStateService, NgControlService, ControlIdService, ControlClassService], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return ClrNumberInput; }), descendants: true }], usesInheritance: true, ngImport: i0, template: `
@@ -16145,7 +16344,7 @@ ClrNumberInputContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
16145
16344
  <label *ngIf="!label && addGrid()"></label>
16146
16345
  <div class="clr-control-container" [ngClass]="controlClass()">
16147
16346
  <div class="clr-number-input-wrapper">
16148
- <div class="clr-input-group" [class.clr-focus]="focus">
16347
+ <div class="clr-input-group" [class.clr-focus]="focus" (focusout)="focusOut()">
16149
16348
  <ng-content select="[clrNumberInput]"></ng-content>
16150
16349
  <div class="clr-input-group-actions">
16151
16350
  <button
@@ -16196,7 +16395,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
16196
16395
  <label *ngIf="!label && addGrid()"></label>
16197
16396
  <div class="clr-control-container" [ngClass]="controlClass()">
16198
16397
  <div class="clr-number-input-wrapper">
16199
- <div class="clr-input-group" [class.clr-focus]="focus">
16398
+ <div class="clr-input-group" [class.clr-focus]="focus" (focusout)="focusOut()">
16200
16399
  <ng-content select="[clrNumberInput]"></ng-content>
16201
16400
  <div class="clr-input-group-actions">
16202
16401
  <button
@@ -16290,14 +16489,21 @@ class ClrNumberInput extends WrappedFormControl {
16290
16489
  }
16291
16490
  stepUp() {
16292
16491
  this.el.nativeElement.stepUp();
16293
- this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
16492
+ this.dispatchStepChangeEvents();
16294
16493
  this.control.control.markAllAsTouched();
16295
16494
  }
16296
16495
  stepDown() {
16297
16496
  this.el.nativeElement.stepDown();
16298
- this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
16497
+ this.dispatchStepChangeEvents();
16299
16498
  this.control.control.markAllAsTouched();
16300
16499
  }
16500
+ dispatchBlur() {
16501
+ this.el.nativeElement.dispatchEvent(new Event('blur', { bubbles: true, cancelable: true }));
16502
+ }
16503
+ dispatchStepChangeEvents() {
16504
+ this.el.nativeElement.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
16505
+ this.el.nativeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true }));
16506
+ }
16301
16507
  }
16302
16508
  ClrNumberInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrNumberInput, deps: [{ token: FocusService, optional: true }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1.NgControl, optional: true, self: true }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
16303
16509
  ClrNumberInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrNumberInput, selector: "input[type=\"number\"][clrNumberInput]", host: { listeners: { "focus": "triggerFocus()", "blur": "triggerValidation()" }, properties: { "class.clr-input": "true", "class.clr-number-input": "true" } }, usesInheritance: true, ngImport: i0 });
@@ -17338,7 +17544,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17338
17544
  class ClrExpandableAnimationModule {
17339
17545
  }
17340
17546
  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] });
17547
+ 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
17548
  ClrExpandableAnimationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, imports: [CommonModule] });
17343
17549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrExpandableAnimationModule, decorators: [{
17344
17550
  type: NgModule,
@@ -17362,7 +17568,7 @@ class CdkDragModule_CdkDrag extends CdkDrag {
17362
17568
  super(elementRef, dropContainer, document, ngZone, viewContainerRef, config, dir, dragDrop, changeDetectorRef);
17363
17569
  }
17364
17570
  }
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 });
17571
+ 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
17572
  CdkDragModule_CdkDrag.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: CdkDragModule_CdkDrag, selector: "[cdkDrag]", usesInheritance: true, ngImport: i0 });
17367
17573
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: CdkDragModule_CdkDrag, decorators: [{
17368
17574
  type: Directive,
@@ -17385,7 +17591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17385
17591
  }, {
17386
17592
  type: Inject,
17387
17593
  args: [CDK_DRAG_CONFIG]
17388
- }] }, { type: i1$3.Directionality }, { type: i2.DragDrop }, { type: i0.ChangeDetectorRef }];
17594
+ }] }, { type: i1$3.Directionality }, { type: i2$1.DragDrop }, { type: i0.ChangeDetectorRef }];
17389
17595
  } });
17390
17596
  /**
17391
17597
  * This module allows us to avoid importing all of CdkDragDropModule which results in a smaller application bundle.
@@ -17831,335 +18037,450 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
17831
18037
  * This software is released under MIT license.
17832
18038
  * The full license information can be found in LICENSE in the root directory of this project.
17833
18039
  */
17834
- const actionableItemSelectors = [
17835
- 'a[href]',
17836
- 'area[href]',
17837
- 'input:not([disabled])',
17838
- 'button:not([disabled])',
17839
- 'select:not([disabled])',
17840
- 'textarea:not([disabled])',
17841
- 'iframe',
17842
- 'object',
17843
- 'embed',
17844
- '[contenteditable=true]',
17845
- '[role=button]:not([disabled])',
17846
- ];
17847
- function getTabbableItems(el) {
17848
- const tabbableItemSelectors = [...actionableItemSelectors, '[tabindex="0"]:not([disabled])'];
17849
- const tabbableSelector = tabbableItemSelectors.join(',');
17850
- return Array.from(el.querySelectorAll(tabbableSelector));
17851
- }
17852
- function isActionableItem(el) {
17853
- const actionableSelector = actionableItemSelectors.join(',');
17854
- return el.matches(actionableSelector);
17855
- }
17856
- class KeyNavigationGridController {
17857
- constructor(zone) {
17858
- this.zone = zone;
17859
- this.skipItemFocus = false;
17860
- this.listenersAdded = false;
17861
- this.destroy$ = new Subject();
17862
- this._activeCell = null;
17863
- this.config = {
17864
- keyGridRows: '[role=row]:not(.datagrid-placeholder):not([style*="display: none"])',
17865
- keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
17866
- keyGrid: '[role=grid]',
17867
- };
17868
- }
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
- ngOnDestroy() {
17882
- this.destroy$.next();
17883
- this.destroy$.complete();
18040
+ class DefaultKeyNavigationStrategy {
18041
+ constructor(utils) {
18042
+ this.utils = utils;
17884
18043
  }
17885
- addListeners() {
17886
- if (this.listenersAdded) {
17887
- return;
18044
+ keyUp(currentCellCoords) {
18045
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18046
+ if (currentCellCoords.y === 0) {
18047
+ return nextCellCoords;
17888
18048
  }
17889
- this.zone.runOutsideAngular(() => {
17890
- fromEvent(this.grid, 'mousedown')
17891
- .pipe(takeUntil(this.destroy$))
17892
- .subscribe((e) => {
17893
- // 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
- 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))
17897
- : null;
17898
- if (activeCell) {
17899
- this.setActiveCell(activeCell, { keepFocus: isActionableItem(e.target) });
17900
- }
17901
- }
17902
- });
17903
- fromEvent(this.grid, 'wheel')
17904
- .pipe(takeUntil(this.destroy$))
17905
- .subscribe(() => {
17906
- this.removeActiveCell();
17907
- });
17908
- fromEvent(this.grid, 'focusout')
17909
- .pipe(debounceTime(0), takeUntil(this.destroy$))
17910
- .subscribe(() => {
17911
- if (this.grid.contains(document.activeElement)) {
17912
- return;
17913
- }
17914
- this.removeActiveCell();
17915
- });
17916
- fromEvent(this.grid, 'keydown')
17917
- .pipe(takeUntil(this.destroy$))
17918
- .subscribe((e) => {
17919
- // Skip column resize events
17920
- if (e.target.classList.contains('drag-handle') &&
17921
- (e.key === Keys.ArrowLeft || e.key === Keys.ArrowRight)) {
17922
- return;
17923
- }
17924
- if (e.key === Keys.ArrowUp ||
17925
- e.key === Keys.ArrowDown ||
17926
- e.key === Keys.ArrowLeft ||
17927
- e.key === Keys.ArrowRight ||
17928
- e.key === Keys.End ||
17929
- e.key === Keys.Home ||
17930
- e.key === Keys.PageUp ||
17931
- 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]
17938
- : null;
17939
- if (activeItem) {
17940
- this.setActiveCell(activeItem);
17941
- }
17942
- e.preventDefault();
17943
- }
17944
- });
17945
- });
17946
- this.listenersAdded = true;
17947
- }
17948
- initializeKeyGrid(host) {
17949
- this.host = host;
17950
- this.addListeners();
17951
- this.resetKeyGrid();
17952
- }
17953
- resetKeyGrid() {
17954
- 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;
17957
- firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
17958
- }
17959
- removeActiveCell() {
17960
- this._activeCell = null;
17961
- }
17962
- getActiveCell() {
17963
- return this._activeCell;
17964
- }
17965
- setActiveCell(activeCell, { keepFocus } = { keepFocus: false }) {
17966
- const prior = this.cells ? Array.from(this.cells).find(c => c.getAttribute('tabindex') === '0') : null;
17967
- if (prior) {
17968
- prior.setAttribute('tabindex', '-1');
18049
+ nextCellCoords.y = currentCellCoords.y - 1;
18050
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18051
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y) &&
18052
+ !isActionCell &&
18053
+ this.utils.isDetailsRow(nextCellCoords.y)) {
18054
+ nextCellCoords.x = 0;
17969
18055
  }
17970
- activeCell.setAttribute('tabindex', '0');
17971
- this._activeCell = activeCell;
17972
- if (!this.skipItemFocus && !keepFocus) {
17973
- let elementToFocus;
17974
- if (activeCell.getAttribute('role') === 'columnheader') {
17975
- elementToFocus = activeCell;
18056
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18057
+ if (isActionCell) {
18058
+ nextCellCoords.y = nextCellCoords.y - 1;
17976
18059
  }
17977
18060
  else {
17978
- const tabbableElements = getTabbableItems(activeCell);
17979
- elementToFocus = tabbableElements.length ? tabbableElements[0] : activeCell;
18061
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17980
18062
  }
17981
- elementToFocus.focus();
17982
18063
  }
18064
+ return nextCellCoords;
17983
18065
  }
17984
- getNextForExpandedRowCoordinate(e, currentCellCoords) {
17985
- if (e.key === Keys.PageUp || e.key === Keys.PageDown) {
17986
- return this.getNextItemCoordinate(e, currentCellCoords);
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;
17987
18071
  }
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);
18072
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18073
+ nextCellCoords.y = currentCellCoords.y + 1;
18074
+ if (!isActionCell && this.utils.isRowReplaced(nextCellCoords.y)) {
18075
+ nextCellCoords.y = nextCellCoords.y + 1;
18076
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
18077
+ ? 0
18078
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
17992
18079
  }
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;
18080
+ return nextCellCoords;
18081
+ }
18082
+ keyLeft(currentCellCoords) {
18083
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18084
+ if (currentCellCoords.x === 0) {
18085
+ return nextCellCoords;
18086
+ }
18087
+ nextCellCoords.x = currentCellCoords.x - 1;
18088
+ return nextCellCoords;
18089
+ }
18090
+ keyRight(currentCellCoords) {
18091
+ var _a;
18092
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18093
+ // calculate numOfColumns based on header cells.
18094
+ const numOfColumns = ((_a = this.utils.rows) === null || _a === void 0 ? void 0 : _a.length) - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
18095
+ nextCellCoords.x = currentCellCoords.x < numOfColumns ? nextCellCoords.x + 1 : nextCellCoords.x;
18096
+ return nextCellCoords;
18097
+ }
18098
+ keyEnd(currentCellCoords, ctrlKey) {
18099
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18100
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18101
+ // calculate X based on header cells.
18102
+ nextCellCoords.x = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
18103
+ if (ctrlKey) {
18104
+ nextCellCoords.y = numOfRows;
18105
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18106
+ nextCellCoords.x = this.utils.getCellsForRow(nextCellCoords.y).length - 1;
18107
+ }
18108
+ }
18109
+ return nextCellCoords;
18110
+ }
18111
+ keyHome(currentCellCoords, ctrlKey) {
18112
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18113
+ nextCellCoords.x = 0;
18114
+ if (ctrlKey) {
18115
+ nextCellCoords.y = 0;
18116
+ }
18117
+ return nextCellCoords;
18118
+ }
18119
+ keyPageUp(currentCellCoords) {
18120
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18121
+ const itemsPerPage = this.utils.itemsPerPage;
18122
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18123
+ if (!this.utils.isActionCell(currentCellCoords)) {
18124
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18125
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
18126
+ ? 0
18127
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18128
+ }
18129
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18130
+ nextCellCoords.y = nextCellCoords.y + 1;
18131
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
18132
+ ? 0
18133
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18012
18134
  }
18013
- if (isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18135
+ }
18136
+ else {
18137
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18014
18138
  nextCellCoords.y = nextCellCoords.y - 1;
18015
18139
  }
18016
- else if (this.isRowReplaced(nextCellCoords.y)) {
18140
+ }
18141
+ return nextCellCoords;
18142
+ }
18143
+ keyPageDown(currentCellCoords) {
18144
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18145
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18146
+ const itemsPerPage = this.utils.itemsPerPage;
18147
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18148
+ if (this.utils.isActionCell(currentCellCoords) && this.utils.isDetailsRow(nextCellCoords.y)) {
18149
+ nextCellCoords.y = nextCellCoords.y - 1;
18150
+ }
18151
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18152
+ nextCellCoords.x = 0;
18153
+ }
18154
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18155
+ nextCellCoords.x = nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18156
+ }
18157
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18158
+ nextCellCoords.y = nextCellCoords.y + 1;
18159
+ nextCellCoords.x = this.utils.isSingleCellExpandedRow(nextCellCoords.y)
18160
+ ? 0
18161
+ : nextCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18162
+ }
18163
+ return nextCellCoords;
18164
+ }
18165
+ }
18166
+
18167
+ /*
18168
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18169
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18170
+ * This software is released under MIT license.
18171
+ * The full license information can be found in LICENSE in the root directory of this project.
18172
+ */
18173
+ class ExpandedRowKeyNavigationStrategy extends DefaultKeyNavigationStrategy {
18174
+ keyUp(currentCellCoords) {
18175
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18176
+ if (currentCellCoords.y === 0) {
18177
+ return nextCellCoords;
18178
+ }
18179
+ nextCellCoords.y = currentCellCoords.y - 1;
18180
+ if (!this.utils.isActionCell(currentCellCoords)) {
18181
+ if (this.utils.isRowReplaced(currentCellCoords.y)) {
18017
18182
  nextCellCoords.y = nextCellCoords.y - 1;
18018
- if (!this.isDetailsRow(nextCellCoords.y)) {
18019
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18020
- }
18021
18183
  }
18022
- else if (this.isDetailsRow(currentCellCoords.y) && !this.isDetailsRow(nextCellCoords.y)) {
18023
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18184
+ switch (true) {
18185
+ case this.utils.isDetailsRow(nextCellCoords.y):
18186
+ nextCellCoords.x = 0;
18187
+ break;
18188
+ case this.utils.isDetailsRow(currentCellCoords.y) === false:
18189
+ nextCellCoords.x = currentCellCoords.x;
18190
+ break;
18191
+ default:
18192
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18193
+ }
18194
+ }
18195
+ else if (this.utils.isDetailsRow(nextCellCoords.y) && nextCellCoords.y > 0) {
18196
+ nextCellCoords.y = nextCellCoords.y - 1;
18197
+ }
18198
+ return nextCellCoords;
18199
+ }
18200
+ keyDown(currentCellCoords) {
18201
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18202
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18203
+ if (currentCellCoords.y >= numOfRows) {
18204
+ return nextCellCoords;
18205
+ }
18206
+ nextCellCoords.y = currentCellCoords.y + 1;
18207
+ if (!this.utils.isActionCell(currentCellCoords)) {
18208
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18209
+ nextCellCoords.y = nextCellCoords.y + 1;
18024
18210
  }
18025
- else if (!isActionCell && this.isDetailsRow(nextCellCoords.y)) {
18026
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18211
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18212
+ nextCellCoords.x = 0;
18213
+ }
18214
+ else {
18215
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18027
18216
  }
18028
18217
  }
18029
- else if (e.key === Keys.ArrowDown && currentCellCoords.y < numOfRows) {
18218
+ else {
18219
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y;
18220
+ }
18221
+ return nextCellCoords;
18222
+ }
18223
+ keyLeft(currentCellCoords) {
18224
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18225
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18226
+ return super.keyLeft(currentCellCoords);
18227
+ }
18228
+ if (currentCellCoords.x !== 0) {
18229
+ nextCellCoords.x = currentCellCoords.x - 1;
18230
+ }
18231
+ else if (!this.utils.isActionCell(currentCellCoords)) {
18232
+ nextCellCoords.y = currentCellCoords.y - 1;
18233
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y) - 1;
18234
+ }
18235
+ return nextCellCoords;
18236
+ }
18237
+ keyRight(currentCellCoords) {
18238
+ var _a;
18239
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18240
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18241
+ return super.keyRight(currentCellCoords);
18242
+ }
18243
+ // calculate numOfColumns based on header cells.
18244
+ const numOfColumns = ((_a = this.utils.rows) === null || _a === void 0 ? void 0 : _a.length) - 1 ? this.utils.getCellsForRow(0).length - 1 : 0;
18245
+ if (currentCellCoords.x >= numOfColumns) {
18246
+ return nextCellCoords;
18247
+ }
18248
+ if (this.utils.isActionCell(currentCellCoords) &&
18249
+ currentCellCoords.x === this.utils.actionCellCount(currentCellCoords.x) - 1 &&
18250
+ this.utils.isRowReplaced(currentCellCoords.y) &&
18251
+ !this.utils.isDetailsRow(currentCellCoords.y)) {
18030
18252
  nextCellCoords.y = currentCellCoords.y + 1;
18031
- if (isSingleCellExpandedRow && !isActionCell) {
18032
- if (this.isRowReplaced(nextCellCoords.y)) {
18253
+ nextCellCoords.x = 0;
18254
+ }
18255
+ else {
18256
+ nextCellCoords.x = currentCellCoords.x + 1;
18257
+ }
18258
+ return nextCellCoords;
18259
+ }
18260
+ keyEnd(currentCellCoords, ctrlKey) {
18261
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18262
+ if ((!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) || ctrlKey) {
18263
+ return super.keyEnd(currentCellCoords, ctrlKey);
18264
+ }
18265
+ nextCellCoords.x = this.utils.getCellsForRow(currentCellCoords.y).length - 1;
18266
+ return nextCellCoords;
18267
+ }
18268
+ keyHome(currentCellCoords, ctrlKey) {
18269
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18270
+ if (!this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isRowReplaced(currentCellCoords.y)) {
18271
+ return super.keyHome(currentCellCoords, ctrlKey);
18272
+ }
18273
+ nextCellCoords.x = 0;
18274
+ nextCellCoords.y = currentCellCoords.y - 1;
18275
+ if (ctrlKey) {
18276
+ nextCellCoords.y = 0;
18277
+ }
18278
+ return nextCellCoords;
18279
+ }
18280
+ keyPageUp(currentCellCoords) {
18281
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18282
+ const itemsPerPage = this.utils.itemsPerPage;
18283
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18284
+ if (!this.utils.isActionCell(currentCellCoords)) {
18285
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18286
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18033
18287
  nextCellCoords.y = nextCellCoords.y + 1;
18288
+ nextCellCoords.x = 0;
18034
18289
  }
18035
- if (this.isDetailsRow(nextCellCoords.y)) {
18290
+ }
18291
+ else if (!this.utils.isDetailsRow(currentCellCoords.y)) {
18292
+ if (this.utils.isDetailsRow(nextCellCoords.y)) {
18036
18293
  nextCellCoords.x = 0;
18037
18294
  }
18038
- else {
18039
- nextCellCoords.x = this.actionCellCount(nextCellCoords.y);
18295
+ }
18296
+ else if (this.utils.isDetailsRow(currentCellCoords.y)) {
18297
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18298
+ nextCellCoords.x = this.utils.actionCellCount(nextCellCoords.y);
18040
18299
  }
18041
- return nextCellCoords;
18042
18300
  }
18043
- if (isActionCell || this.isRowReplaced(nextCellCoords.y)) {
18044
- nextCellCoords.y = nextCellCoords.y + 1;
18301
+ }
18302
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18303
+ nextCellCoords.y = nextCellCoords.y - 1;
18304
+ }
18305
+ return nextCellCoords;
18306
+ }
18307
+ keyPageDown(currentCellCoords) {
18308
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18309
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18310
+ const itemsPerPage = this.utils.itemsPerPage;
18311
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18312
+ if (!this.utils.isActionCell(currentCellCoords)) {
18313
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18314
+ if (nextCellCoords.y < numOfRows && !this.utils.isDetailsRow(nextCellCoords.y)) {
18315
+ nextCellCoords.y = nextCellCoords.y + 1;
18316
+ }
18045
18317
  }
18046
- else if (this.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18047
- nextCellCoords.x = currentCellCoords.x - this.actionCellCount(currentCellCoords.y);
18318
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18319
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18048
18320
  }
18049
- else {
18050
- nextCellCoords.x = currentCellCoords.x + this.actionCellCount(nextCellCoords.y);
18321
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18322
+ nextCellCoords.x = 0;
18051
18323
  }
18052
18324
  }
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;
18325
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18326
+ nextCellCoords.y = nextCellCoords.y - 1;
18327
+ }
18328
+ return nextCellCoords;
18329
+ }
18330
+ }
18331
+
18332
+ /*
18333
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18334
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18335
+ * This software is released under MIT license.
18336
+ * The full license information can be found in LICENSE in the root directory of this project.
18337
+ */
18338
+ class ExpandedColumnsRowKeyNavigationStrategy extends ExpandedRowKeyNavigationStrategy {
18339
+ keyUp(currentCellCoords) {
18340
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18341
+ if (currentCellCoords.y === 0) {
18342
+ return nextCellCoords;
18343
+ }
18344
+ nextCellCoords.y = currentCellCoords.y - 1;
18345
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18346
+ return super.keyUp(currentCellCoords);
18347
+ }
18348
+ const isActionCell = this.utils.isActionCell(currentCellCoords);
18349
+ if (isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18350
+ nextCellCoords.y = nextCellCoords.y - 1;
18351
+ }
18352
+ else if (this.utils.isRowReplaced(nextCellCoords.y)) {
18353
+ nextCellCoords.y = nextCellCoords.y - 1;
18354
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18355
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18060
18356
  }
18061
18357
  }
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;
18358
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18359
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18360
+ }
18361
+ else if (!isActionCell && this.utils.isDetailsRow(nextCellCoords.y)) {
18362
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18363
+ }
18364
+ return nextCellCoords;
18365
+ }
18366
+ keyDown(currentCellCoords) {
18367
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18368
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18369
+ const numOfColumns = numOfRows ? this.utils.getCellsForRow(0).length - 1 : 0;
18370
+ if (currentCellCoords.y >= numOfRows) {
18371
+ return nextCellCoords;
18372
+ }
18373
+ nextCellCoords.y = currentCellCoords.y + 1;
18374
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18375
+ return super.keyDown(currentCellCoords);
18376
+ }
18377
+ if (!this.utils.isActionCell(currentCellCoords)) {
18378
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18379
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18069
18380
  }
18070
- else {
18071
- nextCellCoords.x = currentCellCoords.x + 1;
18381
+ else if (this.utils.getCellsForRow(currentCellCoords.y).length > numOfColumns) {
18382
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18072
18383
  }
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;
18384
+ else {
18385
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18079
18386
  }
18080
18387
  }
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
- }
18388
+ else {
18389
+ nextCellCoords.y = nextCellCoords.y < numOfRows ? nextCellCoords.y + 1 : nextCellCoords.y - 1;
18087
18390
  }
18088
18391
  return nextCellCoords;
18089
18392
  }
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);
18393
+ keyLeft(currentCellCoords) {
18394
+ return super.keyLeft(currentCellCoords);
18395
+ }
18396
+ keyRight(currentCellCoords) {
18397
+ return super.keyRight(currentCellCoords);
18398
+ }
18399
+ keyEnd(currentCellCoords, ctrlKey) {
18400
+ return super.keyEnd(currentCellCoords, ctrlKey);
18401
+ }
18402
+ keyHome(currentCellCoords, ctrlKey) {
18403
+ return super.keyHome(currentCellCoords, ctrlKey);
18404
+ }
18405
+ keyPageUp(currentCellCoords) {
18406
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18407
+ const itemsPerPage = this.utils.itemsPerPage;
18408
+ nextCellCoords.y = currentCellCoords.y - itemsPerPage > 0 ? currentCellCoords.y - itemsPerPage + 1 : 1;
18409
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18410
+ return super.keyPageUp(currentCellCoords);
18411
+ }
18412
+ if (!this.utils.isActionCell(currentCellCoords)) {
18413
+ if (this.utils.isRowReplaced(nextCellCoords.y)) {
18414
+ if (!this.utils.isDetailsRow(nextCellCoords.y)) {
18415
+ nextCellCoords.y = nextCellCoords.y + 1;
18416
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18104
18417
  }
18105
18418
  }
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;
18419
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18420
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18113
18421
  }
18114
- if (!isActionCell && this.isRowReplaced(nextCellCoords.y)) {
18115
- nextCellCoords.y = nextCellCoords.y + 1;
18116
- nextCellCoords.x = nextCellCoords.x - this.actionCellCount(currentCellCoords.y);
18422
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18423
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18117
18424
  }
18118
18425
  }
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;
18426
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18427
+ nextCellCoords.y = nextCellCoords.y - 1;
18124
18428
  }
18125
- else if (e.key === Keys.End) {
18126
- nextCellCoords.x = numOfColumns;
18127
- if (e.ctrlKey) {
18128
- nextCellCoords.y = numOfRows;
18429
+ return nextCellCoords;
18430
+ }
18431
+ keyPageDown(currentCellCoords) {
18432
+ const nextCellCoords = this.utils.createNextCellCoords(currentCellCoords);
18433
+ const numOfRows = this.utils.rows ? this.utils.rows.length - 1 : 0;
18434
+ const itemsPerPage = this.utils.itemsPerPage;
18435
+ nextCellCoords.y = currentCellCoords.y + itemsPerPage >= numOfRows ? numOfRows : currentCellCoords.y + itemsPerPage;
18436
+ if (this.utils.isSingleCellExpandedRow(nextCellCoords.y)) {
18437
+ return super.keyPageDown(currentCellCoords);
18438
+ }
18439
+ if (!this.utils.isActionCell(currentCellCoords)) {
18440
+ if (this.utils.isRowReplaced(nextCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18441
+ if (nextCellCoords.y < numOfRows) {
18442
+ nextCellCoords.y = nextCellCoords.y + 1;
18443
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18444
+ }
18129
18445
  }
18130
- }
18131
- else if (e.key === Keys.Home) {
18132
- nextCellCoords.x = 0;
18133
- if (e.ctrlKey) {
18134
- nextCellCoords.y = 0;
18446
+ else if (this.utils.isDetailsRow(currentCellCoords.y) && !this.utils.isDetailsRow(nextCellCoords.y)) {
18447
+ nextCellCoords.x = currentCellCoords.x + this.utils.actionCellCount(nextCellCoords.y);
18448
+ }
18449
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18450
+ nextCellCoords.x = currentCellCoords.x - this.utils.actionCellCount(currentCellCoords.y);
18135
18451
  }
18136
18452
  }
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;
18453
+ else if (this.utils.isDetailsRow(nextCellCoords.y)) {
18454
+ nextCellCoords.y = nextCellCoords.y - 1;
18143
18455
  }
18144
18456
  return nextCellCoords;
18145
18457
  }
18146
- getCalcVariables(currentCellCoords) {
18458
+ }
18459
+
18460
+ /*
18461
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18462
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18463
+ * This software is released under MIT license.
18464
+ * The full license information can be found in LICENSE in the root directory of this project.
18465
+ */
18466
+ class KeyNavigationUtils {
18467
+ constructor(host, config) {
18468
+ this.host = host;
18469
+ this.config = config;
18470
+ }
18471
+ get grid() {
18147
18472
  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 };
18473
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector(this.config.keyGrid);
18161
18474
  }
18162
- getCurrentCellCoordinates() {
18475
+ get rows() {
18476
+ var _a;
18477
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridRows);
18478
+ }
18479
+ get cells() {
18480
+ var _a;
18481
+ return (_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells);
18482
+ }
18483
+ get currentCellCoordinates() {
18163
18484
  const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null;
18164
18485
  const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null;
18165
18486
  const coordinates = {
@@ -18170,6 +18491,49 @@ class KeyNavigationGridController {
18170
18491
  };
18171
18492
  return coordinates;
18172
18493
  }
18494
+ get averageRowHeight() {
18495
+ const heightSum = Array.from(this.rows.values()).reduce((sum, row) => {
18496
+ return sum + row.clientHeight;
18497
+ }, 0);
18498
+ return Math.round(heightSum / this.rows.length);
18499
+ }
18500
+ get itemsPerPage() {
18501
+ var _a;
18502
+ return Math.floor(((_a = this.host) === null || _a === void 0 ? void 0 : _a.querySelector('.datagrid').clientHeight) / this.averageRowHeight) - 1 || 0;
18503
+ }
18504
+ setAriaRowIndexTo(cellCoords) {
18505
+ let ariaRowIndex = this.rows[cellCoords.y].getAttribute('aria-rowindex');
18506
+ if (!ariaRowIndex) {
18507
+ ariaRowIndex = this.rows[cellCoords.y - 1].getAttribute('aria-rowindex');
18508
+ }
18509
+ cellCoords.ariaRowIndex = ariaRowIndex;
18510
+ }
18511
+ getNextItemCoordinate(e) {
18512
+ const currentCellCoords = this.currentCellCoordinates;
18513
+ const strategy = this.getNavStrategy(currentCellCoords);
18514
+ const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft;
18515
+ const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight;
18516
+ switch (e.key) {
18517
+ case Keys.ArrowUp:
18518
+ return strategy.keyUp(currentCellCoords);
18519
+ case Keys.ArrowDown:
18520
+ return strategy.keyDown(currentCellCoords);
18521
+ case inlineStart:
18522
+ return strategy.keyLeft(currentCellCoords);
18523
+ case inlineEnd:
18524
+ return strategy.keyRight(currentCellCoords);
18525
+ case Keys.Home:
18526
+ return strategy.keyHome(currentCellCoords, e.ctrlKey);
18527
+ case Keys.End:
18528
+ return strategy.keyEnd(currentCellCoords, e.ctrlKey);
18529
+ case Keys.PageUp:
18530
+ return strategy.keyPageUp(currentCellCoords);
18531
+ case Keys.PageDown:
18532
+ return strategy.keyPageDown(currentCellCoords);
18533
+ default:
18534
+ return currentCellCoords;
18535
+ }
18536
+ }
18173
18537
  getCellsForRow(index) {
18174
18538
  return this.rows[index].querySelectorAll(this.config.keyGridCells);
18175
18539
  }
@@ -18184,10 +18548,8 @@ class KeyNavigationGridController {
18184
18548
  return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced');
18185
18549
  }
18186
18550
  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;
18551
+ var _a;
18552
+ return ((_a = this.rows[index]) === null || _a === void 0 ? void 0 : _a.querySelectorAll(this.config.keyGridCells).length) === 1;
18191
18553
  }
18192
18554
  actionCellCount(index) {
18193
18555
  return this.actionCellsAsArray(index).length;
@@ -18198,6 +18560,166 @@ class KeyNavigationGridController {
18198
18560
  isActionCell(cellCoords) {
18199
18561
  return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x];
18200
18562
  }
18563
+ createNextCellCoords(cellCoords) {
18564
+ return {
18565
+ x: cellCoords.x,
18566
+ y: cellCoords.y,
18567
+ };
18568
+ }
18569
+ getNavStrategy(currentCellCoords) {
18570
+ switch (true) {
18571
+ case this.isSingleCellExpandedRow(currentCellCoords.y):
18572
+ return new ExpandedRowKeyNavigationStrategy(this);
18573
+ case this.isDetailsRow(currentCellCoords.y):
18574
+ case this.isExpandedRow(currentCellCoords.y):
18575
+ return new ExpandedColumnsRowKeyNavigationStrategy(this);
18576
+ default:
18577
+ return new DefaultKeyNavigationStrategy(this);
18578
+ }
18579
+ }
18580
+ }
18581
+
18582
+ /*
18583
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
18584
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18585
+ * This software is released under MIT license.
18586
+ * The full license information can be found in LICENSE in the root directory of this project.
18587
+ */
18588
+ const actionableItemSelectors = [
18589
+ 'a[href]',
18590
+ 'area[href]',
18591
+ 'input:not([disabled])',
18592
+ 'button:not([disabled])',
18593
+ 'select:not([disabled])',
18594
+ 'textarea:not([disabled])',
18595
+ 'iframe',
18596
+ 'object',
18597
+ 'embed',
18598
+ '[contenteditable=true]',
18599
+ '[role=button]:not([disabled])',
18600
+ ];
18601
+ function getTabbableItems(el) {
18602
+ const tabbableItemSelectors = [...actionableItemSelectors, '[tabindex="0"]:not([disabled])'];
18603
+ const tabbableSelector = tabbableItemSelectors.join(',');
18604
+ return Array.from(el.querySelectorAll(tabbableSelector));
18605
+ }
18606
+ function isActionableItem(el) {
18607
+ const actionableSelector = actionableItemSelectors.join(',');
18608
+ return el.matches(actionableSelector);
18609
+ }
18610
+ class KeyNavigationGridController {
18611
+ constructor(zone) {
18612
+ this.zone = zone;
18613
+ this.nextCellCoordsEmitter = new EventEmitter(false);
18614
+ this.skipItemFocus = false;
18615
+ this.preventScrollOnFocus = false;
18616
+ this.config = {
18617
+ keyGridRows: '[role=row]:not(.datagrid-placeholder):not([style*="display: none"])',
18618
+ keyGridCells: '[role=gridcell]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), [role=columnheader]:not(.datagrid-hidden-column):not(.datagrid-placeholder-content), .datagrid-detail-caret',
18619
+ keyGrid: '[role=grid]',
18620
+ };
18621
+ this.listenersAdded = false;
18622
+ this.destroy$ = new Subject();
18623
+ }
18624
+ ngOnDestroy() {
18625
+ this.destroy$.next();
18626
+ this.destroy$.complete();
18627
+ }
18628
+ addListeners() {
18629
+ if (this.listenersAdded) {
18630
+ return;
18631
+ }
18632
+ this.zone.runOutsideAngular(() => {
18633
+ fromEvent(this.keyNavUtils.grid, 'mousedown')
18634
+ .pipe(takeUntil(this.destroy$))
18635
+ .subscribe((e) => {
18636
+ // 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
18637
+ if (e.buttons === 1 && !e.ctrlKey) {
18638
+ const activeCell = this.keyNavUtils.cells
18639
+ ? Array.from(this.keyNavUtils.cells).find(c => c === e.target || c === e.target.closest(this.config.keyGridCells))
18640
+ : null;
18641
+ if (activeCell) {
18642
+ this.setActiveCell(activeCell);
18643
+ if (!isActionableItem(e.target)) {
18644
+ this.focusElement(activeCell);
18645
+ }
18646
+ }
18647
+ }
18648
+ });
18649
+ fromEvent(this.keyNavUtils.grid, 'wheel')
18650
+ .pipe(takeUntil(this.destroy$))
18651
+ .subscribe(() => {
18652
+ this.nextCellCoordsEmitter.emit(null);
18653
+ });
18654
+ fromEvent(this.keyNavUtils.grid, 'keydown')
18655
+ .pipe(takeUntil(this.destroy$))
18656
+ .subscribe((e) => {
18657
+ // Skip column resize events
18658
+ if (e.target.classList.contains('drag-handle') &&
18659
+ (e.key === Keys.ArrowLeft || e.key === Keys.ArrowRight)) {
18660
+ return;
18661
+ }
18662
+ if (e.key === Keys.ArrowUp ||
18663
+ e.key === Keys.ArrowDown ||
18664
+ e.key === Keys.ArrowLeft ||
18665
+ e.key === Keys.ArrowRight ||
18666
+ e.key === Keys.End ||
18667
+ e.key === Keys.Home ||
18668
+ e.key === Keys.PageUp ||
18669
+ e.key === Keys.PageDown) {
18670
+ const nextCellCoords = this.keyNavUtils.getNextItemCoordinate(e);
18671
+ if (nextCellCoords.y > 0 &&
18672
+ (e.key === Keys.ArrowUp || e.key === Keys.ArrowDown || e.key === Keys.PageUp || e.key === Keys.PageDown)) {
18673
+ this.keyNavUtils.setAriaRowIndexTo(nextCellCoords);
18674
+ this.nextCellCoordsEmitter.emit(nextCellCoords);
18675
+ }
18676
+ const activeItem = this.keyNavUtils.rows
18677
+ ? Array.from(this.keyNavUtils.getCellsForRow(nextCellCoords.y))[nextCellCoords.x]
18678
+ : null;
18679
+ if (activeItem) {
18680
+ this.setActiveCell(activeItem);
18681
+ this.focusElement(activeItem, { preventScroll: this.preventScrollOnFocus });
18682
+ }
18683
+ e.preventDefault();
18684
+ }
18685
+ });
18686
+ });
18687
+ this.listenersAdded = true;
18688
+ }
18689
+ initializeKeyGrid(host) {
18690
+ this.keyNavUtils = new KeyNavigationUtils(host, this.config);
18691
+ this.addListeners();
18692
+ this.resetKeyGrid();
18693
+ }
18694
+ resetKeyGrid() {
18695
+ var _a;
18696
+ (_a = this.keyNavUtils.cells) === null || _a === void 0 ? void 0 : _a.forEach((i) => i.setAttribute('tabindex', '-1'));
18697
+ const firstCell = this.keyNavUtils.cells ? this.keyNavUtils.cells[0] : null;
18698
+ firstCell === null || firstCell === void 0 ? void 0 : firstCell.setAttribute('tabindex', '0');
18699
+ }
18700
+ setActiveCell(activeCell) {
18701
+ const prior = this.keyNavUtils.cells
18702
+ ? Array.from(this.keyNavUtils.cells).find(c => c.getAttribute('tabindex') === '0')
18703
+ : null;
18704
+ if (prior) {
18705
+ prior.setAttribute('tabindex', '-1');
18706
+ }
18707
+ activeCell.setAttribute('tabindex', '0');
18708
+ }
18709
+ focusElement(activeCell, options = { preventScroll: false }) {
18710
+ if (this.skipItemFocus) {
18711
+ return;
18712
+ }
18713
+ let elementToFocus;
18714
+ if (activeCell.getAttribute('role') === 'columnheader') {
18715
+ elementToFocus = activeCell;
18716
+ }
18717
+ else {
18718
+ const tabbableElements = getTabbableItems(activeCell);
18719
+ elementToFocus = tabbableElements.length ? tabbableElements[0] : activeCell;
18720
+ }
18721
+ elementToFocus.focus(options);
18722
+ }
18201
18723
  }
18202
18724
  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
18725
  KeyNavigationGridController.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: KeyNavigationGridController });
@@ -18268,36 +18790,17 @@ class ClrDatagridFilter extends DatagridFilterRegistrar {
18268
18790
  get active() {
18269
18791
  return !!this.filter && this.filter.isActive();
18270
18792
  }
18271
- ngOnChanges() {
18272
- setTimeout(() => {
18273
- this.setToggleButtonAriaLabel();
18274
- });
18275
- }
18276
18793
  ngOnDestroy() {
18277
18794
  super.ngOnDestroy();
18278
18795
  this.subs.forEach(sub => sub.unsubscribe());
18279
18796
  }
18280
- /**
18281
- * This is not in a getter to prevent "expression has changed after it was checked" errors.
18282
- * And it's more performant this way since it only runs on change.
18283
- */
18284
- setToggleButtonAriaLabel() {
18285
- var _a;
18286
- const columnElement = (_a = this.elementRef.nativeElement) === null || _a === void 0 ? void 0 : _a.closest('clr-dg-column');
18287
- const columnTitleElement = columnElement === null || columnElement === void 0 ? void 0 : columnElement.querySelector('.datagrid-column-title');
18288
- const columnTitle = columnTitleElement === null || columnTitleElement === void 0 ? void 0 : columnTitleElement.textContent.trim().toLocaleLowerCase();
18289
- this.toggleButtonAriaLabel = this.commonStrings.parse(this.commonStrings.keys.datagridFilterAriaLabel, {
18290
- COLUMN: columnTitle || '',
18291
- });
18292
- }
18293
18797
  }
18294
18798
  ClrDatagridFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridFilter, deps: [{ token: FiltersProvider }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: KeyNavigationGridController, optional: true }], target: i0.ɵɵFactoryTarget.Component });
18295
- ClrDatagridFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: { open: ["clrDgFilterOpen", "open"], customFilter: ["clrDgFilter", "customFilter"] }, outputs: { openChange: "clrDgFilterOpenChange" }, providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `
18799
+ ClrDatagridFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: { open: ["clrDgFilterOpen", "open"], customFilter: ["clrDgFilter", "customFilter"] }, outputs: { openChange: "clrDgFilterOpenChange" }, providers: [{ provide: CustomFilter, useExisting: ClrDatagridFilter }], viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: `
18296
18800
  <button
18297
18801
  class="datagrid-filter-toggle"
18298
18802
  type="button"
18299
18803
  #anchor
18300
- [attr.aria-label]="toggleButtonAriaLabel"
18301
18804
  [attr.aria-expanded]="ariaExpanded"
18302
18805
  [attr.aria-controls]="popoverId"
18303
18806
  clrPopoverAnchor
@@ -18340,7 +18843,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
18340
18843
  class="datagrid-filter-toggle"
18341
18844
  type="button"
18342
18845
  #anchor
18343
- [attr.aria-label]="toggleButtonAriaLabel"
18344
18846
  [attr.aria-expanded]="ariaExpanded"
18345
18847
  [attr.aria-controls]="popoverId"
18346
18848
  clrPopoverAnchor
@@ -19843,13 +20345,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
19843
20345
  * The full license information can be found in LICENSE in the root directory of this project.
19844
20346
  */
19845
20347
  class ClrDatagridColumn extends DatagridFilterRegistrar {
19846
- constructor(el, _sort, filters, vcr, detailService, changeDetectorRef) {
20348
+ constructor(el, _sort, filters, vcr, detailService, changeDetectorRef, commonStrings) {
19847
20349
  super(filters);
19848
20350
  this.el = el;
19849
20351
  this._sort = _sort;
19850
20352
  this.vcr = vcr;
19851
20353
  this.detailService = detailService;
19852
20354
  this.changeDetectorRef = changeDetectorRef;
20355
+ this.commonStrings = commonStrings;
19853
20356
  this.sortOrderChange = new EventEmitter();
19854
20357
  this.filterValueChange = new EventEmitter();
19855
20358
  /**
@@ -19909,18 +20412,14 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
19909
20412
  if (typeof comparator === 'string') {
19910
20413
  this._sortBy = new DatagridPropertyComparator(comparator);
19911
20414
  }
20415
+ else if (comparator) {
20416
+ this._sortBy = comparator;
20417
+ }
20418
+ else if (this.field) {
20419
+ this._sortBy = new DatagridPropertyComparator(this.field);
20420
+ }
19912
20421
  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
- }
20422
+ delete this._sortBy;
19924
20423
  }
19925
20424
  }
19926
20425
  get sortOrder() {
@@ -20023,6 +20522,9 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
20023
20522
  ngOnInit() {
20024
20523
  this.wrappedInjector = new HostWrapper(WrappedColumn, this.vcr);
20025
20524
  }
20525
+ ngAfterViewInit() {
20526
+ this.setFilterToggleAriaLabel();
20527
+ }
20026
20528
  ngOnChanges(changes) {
20027
20529
  if (changes.colType &&
20028
20530
  changes.colType.currentValue &&
@@ -20062,6 +20564,15 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
20062
20564
  }
20063
20565
  });
20064
20566
  }
20567
+ setFilterToggleAriaLabel() {
20568
+ var _a;
20569
+ const filterToggle = this.el.nativeElement.querySelector('.datagrid-filter-toggle');
20570
+ if (filterToggle) {
20571
+ filterToggle.ariaLabel = this.commonStrings.parse(this.commonStrings.keys.datagridFilterAriaLabel, {
20572
+ COLUMN: (_a = this === null || this === void 0 ? void 0 : this.titleContainer) === null || _a === void 0 ? void 0 : _a.nativeElement.textContent.trim().toLocaleLowerCase(),
20573
+ });
20574
+ }
20575
+ }
20065
20576
  listenForSortingChanges() {
20066
20577
  return this._sort.change.subscribe(sort => {
20067
20578
  // Need to manually mark the component to be checked
@@ -20091,10 +20602,10 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
20091
20602
  }
20092
20603
  }
20093
20604
  }
20094
- ClrDatagridColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, deps: [{ token: i0.ElementRef }, { token: Sort }, { token: FiltersProvider }, { token: i0.ViewContainerRef }, { token: DetailService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
20095
- ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridColumn, selector: "clr-dg-column", inputs: { filterStringPlaceholder: ["clrFilterStringPlaceholder", "filterStringPlaceholder"], filterNumberMaxPlaceholder: ["clrFilterNumberMaxPlaceholder", "filterNumberMaxPlaceholder"], filterNumberMinPlaceholder: ["clrFilterNumberMinPlaceholder", "filterNumberMinPlaceholder"], colType: ["clrDgColType", "colType"], field: ["clrDgField", "field"], sortBy: ["clrDgSortBy", "sortBy"], sortOrder: ["clrDgSortOrder", "sortOrder"], updateFilterValue: ["clrFilterValue", "updateFilterValue"] }, outputs: { sortOrderChange: "clrDgSortOrderChange", filterValueChange: "clrFilterValueChange" }, host: { attributes: { "role": "columnheader" }, properties: { "class.datagrid-column": "true", "attr.aria-sort": "ariaSort" } }, queries: [{ propertyName: "projectedFilter", first: true, predicate: CustomFilter, descendants: true }], usesInheritance: true, usesOnChanges: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
20605
+ ClrDatagridColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, deps: [{ token: i0.ElementRef }, { token: Sort }, { token: FiltersProvider }, { token: i0.ViewContainerRef }, { token: DetailService }, { token: i0.ChangeDetectorRef }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
20606
+ ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridColumn, selector: "clr-dg-column", inputs: { filterStringPlaceholder: ["clrFilterStringPlaceholder", "filterStringPlaceholder"], filterNumberMaxPlaceholder: ["clrFilterNumberMaxPlaceholder", "filterNumberMaxPlaceholder"], filterNumberMinPlaceholder: ["clrFilterNumberMinPlaceholder", "filterNumberMinPlaceholder"], colType: ["clrDgColType", "colType"], field: ["clrDgField", "field"], sortBy: ["clrDgSortBy", "sortBy"], sortOrder: ["clrDgSortOrder", "sortOrder"], updateFilterValue: ["clrFilterValue", "updateFilterValue"] }, outputs: { sortOrderChange: "clrDgSortOrderChange", filterValueChange: "clrFilterValueChange" }, host: { attributes: { "role": "columnheader" }, properties: { "class.datagrid-column": "true", "attr.aria-sort": "ariaSort" } }, queries: [{ propertyName: "projectedFilter", first: true, predicate: CustomFilter, descendants: true }], viewQueries: [{ propertyName: "titleContainer", first: true, predicate: ["titleContainer"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
20096
20607
  <div class="datagrid-column-flex">
20097
- <button class="datagrid-column-title" *ngIf="sortable" (click)="sort()" type="button">
20608
+ <button class="datagrid-column-title" *ngIf="sortable" (click)="sort()" type="button" #titleContainer>
20098
20609
  <ng-container *ngTemplateOutlet="columnTitle"></ng-container>
20099
20610
  <cds-icon
20100
20611
  *ngIf="sortDirection"
@@ -20126,7 +20637,7 @@ ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
20126
20637
  <ng-content></ng-content>
20127
20638
  </ng-template>
20128
20639
 
20129
- <span class="datagrid-column-title" *ngIf="!sortable">
20640
+ <span class="datagrid-column-title" *ngIf="!sortable" #titleContainer>
20130
20641
  <ng-container *ngTemplateOutlet="columnTitle"></ng-container>
20131
20642
  </span>
20132
20643
 
@@ -20139,7 +20650,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
20139
20650
  selector: 'clr-dg-column',
20140
20651
  template: `
20141
20652
  <div class="datagrid-column-flex">
20142
- <button class="datagrid-column-title" *ngIf="sortable" (click)="sort()" type="button">
20653
+ <button class="datagrid-column-title" *ngIf="sortable" (click)="sort()" type="button" #titleContainer>
20143
20654
  <ng-container *ngTemplateOutlet="columnTitle"></ng-container>
20144
20655
  <cds-icon
20145
20656
  *ngIf="sortDirection"
@@ -20171,7 +20682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
20171
20682
  <ng-content></ng-content>
20172
20683
  </ng-template>
20173
20684
 
20174
- <span class="datagrid-column-title" *ngIf="!sortable">
20685
+ <span class="datagrid-column-title" *ngIf="!sortable" #titleContainer>
20175
20686
  <ng-container *ngTemplateOutlet="columnTitle"></ng-container>
20176
20687
  </span>
20177
20688
 
@@ -20186,7 +20697,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
20186
20697
  },
20187
20698
  changeDetection: ChangeDetectionStrategy.OnPush,
20188
20699
  }]
20189
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Sort }, { type: FiltersProvider }, { type: i0.ViewContainerRef }, { type: DetailService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { filterStringPlaceholder: [{
20700
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Sort }, { type: FiltersProvider }, { type: i0.ViewContainerRef }, { type: DetailService }, { type: i0.ChangeDetectorRef }, { type: ClrCommonStringsService }]; }, propDecorators: { filterStringPlaceholder: [{
20190
20701
  type: Input,
20191
20702
  args: ['clrFilterStringPlaceholder']
20192
20703
  }], filterNumberMaxPlaceholder: [{
@@ -20201,6 +20712,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
20201
20712
  }], filterValueChange: [{
20202
20713
  type: Output,
20203
20714
  args: ['clrFilterValueChange']
20715
+ }], titleContainer: [{
20716
+ type: ViewChild,
20717
+ args: ['titleContainer', { read: ElementRef }]
20204
20718
  }], colType: [{
20205
20719
  type: Input,
20206
20720
  args: ['clrDgColType']
@@ -20303,6 +20817,10 @@ class Items {
20303
20817
  this._pageSub.unsubscribe();
20304
20818
  }
20305
20819
  }
20820
+ smartenDown() {
20821
+ this._smart = false;
20822
+ this.destroy();
20823
+ }
20306
20824
  smartenUp() {
20307
20825
  this._smart = true;
20308
20826
  /*
@@ -21075,77 +21593,23 @@ class ClrDatagridSelectionCellDirective {
21075
21593
  if (this.selection.rowSelectionMode) {
21076
21594
  return;
21077
21595
  }
21078
- // If click was outside the label/input, forward the click to the input.
21079
- if (event.target.tagName !== 'LABEL' && event.target.tagName !== 'INPUT') {
21080
- (_a = event.target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.click();
21081
- }
21082
- }
21083
- }
21084
- ClrDatagridSelectionCellDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridSelectionCellDirective, deps: [{ token: Selection }], target: i0.ɵɵFactoryTarget.Directive });
21085
- ClrDatagridSelectionCellDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select", host: { listeners: { "click": "onSelectionCellClick($event)" } }, ngImport: i0 });
21086
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridSelectionCellDirective, decorators: [{
21087
- type: Directive,
21088
- args: [{
21089
- selector: '.datagrid-select',
21090
- }]
21091
- }], ctorParameters: function () { return [{ type: Selection }]; }, propDecorators: { onSelectionCellClick: [{
21092
- type: HostListener,
21093
- args: ['click', ['$event']]
21094
- }] } });
21095
-
21096
- /*
21097
- * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21098
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
21099
- * This software is released under MIT license.
21100
- * The full license information can be found in LICENSE in the root directory of this project.
21101
- */
21102
- class DatagridCellRenderer {
21103
- constructor(el, renderer, organizer) {
21104
- this.el = el;
21105
- this.renderer = renderer;
21106
- this.subscriptions = [];
21107
- this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
21108
- }
21109
- ngOnDestroy() {
21110
- this.subscriptions.forEach(sub => sub.unsubscribe());
21111
- if (this.stateSubscription) {
21112
- this.stateSubscription.unsubscribe();
21113
- }
21114
- }
21115
- resetState(state) {
21116
- this.setWidth(state);
21117
- this.setHidden(state);
21118
- }
21119
- setWidth(state) {
21120
- if (state.strictWidth) {
21121
- this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21122
- }
21123
- else {
21124
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21125
- }
21126
- this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
21127
- }
21128
- setHidden(state) {
21129
- if (state.hidden) {
21130
- this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21131
- }
21132
- else {
21133
- this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
21596
+ // If click was outside the label/input, forward the click to the input.
21597
+ if (event.target.tagName !== 'LABEL' && event.target.tagName !== 'INPUT') {
21598
+ (_a = event.target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.click();
21134
21599
  }
21135
21600
  }
21136
- clearWidth() {
21137
- this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
21138
- this.renderer.setStyle(this.el.nativeElement, 'width', null);
21139
- }
21140
21601
  }
21141
- DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
21142
- DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
21143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
21602
+ ClrDatagridSelectionCellDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridSelectionCellDirective, deps: [{ token: Selection }], target: i0.ɵɵFactoryTarget.Directive });
21603
+ ClrDatagridSelectionCellDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select", host: { listeners: { "click": "onSelectionCellClick($event)" } }, ngImport: i0 });
21604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridSelectionCellDirective, decorators: [{
21144
21605
  type: Directive,
21145
21606
  args: [{
21146
- selector: 'clr-dg-cell',
21607
+ selector: '.datagrid-select',
21147
21608
  }]
21148
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
21609
+ }], ctorParameters: function () { return [{ type: Selection }]; }, propDecorators: { onSelectionCellClick: [{
21610
+ type: HostListener,
21611
+ args: ['click', ['$event']]
21612
+ }] } });
21149
21613
 
21150
21614
  /*
21151
21615
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
@@ -21163,6 +21627,7 @@ class ClrDatagridRow {
21163
21627
  this.detailService = detailService;
21164
21628
  this.displayMode = displayMode;
21165
21629
  this.vcr = vcr;
21630
+ this.el = el;
21166
21631
  this.commonStrings = commonStrings;
21167
21632
  this.items = items;
21168
21633
  this.document = document;
@@ -21305,6 +21770,16 @@ class ClrDatagridRow {
21305
21770
  }
21306
21771
  if (viewChange === DatagridDisplayMode.CALCULATE) {
21307
21772
  this.displayCells = false;
21773
+ // Inserts a fixed cell if any of these conditions are true.
21774
+ const fixedCellConditions = [
21775
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
21776
+ this.rowActionService.hasActionableRow,
21777
+ this.globalExpandable.hasExpandableRow,
21778
+ this.detailService.enabled,
21779
+ ];
21780
+ fixedCellConditions
21781
+ .filter(Boolean)
21782
+ .forEach(() => this._calculatedCells.insert(this._fixedCellTemplate.createEmbeddedView(null)));
21308
21783
  this.dgCells.forEach(cell => {
21309
21784
  if (!cell._view.destroyed) {
21310
21785
  this._calculatedCells.insert(cell._view);
@@ -21346,7 +21821,7 @@ class ClrDatagridRow {
21346
21821
  * selection browser functionality, which is inconsistently implemented in browsers anyway.
21347
21822
  */
21348
21823
  clearRanges(event) {
21349
- if (event.shiftKey) {
21824
+ if (this.selection.rowSelectionMode && event.shiftKey) {
21350
21825
  this.document.getSelection().removeAllRanges();
21351
21826
  // Firefox is too persistent about its text-selection behaviour. So we need to add a preventDefault();
21352
21827
  // We should not try to enforce this on the other browsers, though, because their toggle cycle does not get canceled by
@@ -21363,7 +21838,7 @@ class ClrDatagridRow {
21363
21838
  selectRow(selected = !this.selected, $event) {
21364
21839
  // The label also captures clicks that bubble up to the row event listener, causing
21365
21840
  // this handler to run twice. This exits early to prevent toggling the checkbox twice.
21366
- if ($event.target.tagName === 'LABEL') {
21841
+ if (!this.selection.rowSelectionMode || $event.target.tagName === 'LABEL' || !this._selectable) {
21367
21842
  return;
21368
21843
  }
21369
21844
  if (this.selection.selectionType === this.SELECTION_TYPE.Single) {
@@ -21402,7 +21877,7 @@ ClrDatagridRow.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version
21402
21877
  DatagridIfExpandService,
21403
21878
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21404
21879
  { 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" }] });
21880
+ ], 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</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: "directive", type: ClrDatagridSelectionCellDirective, selector: ".datagrid-select" }] });
21406
21881
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridRow, decorators: [{
21407
21882
  type: Component,
21408
21883
  args: [{ selector: 'clr-dg-row', host: {
@@ -21415,7 +21890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21415
21890
  DatagridIfExpandService,
21416
21891
  { provide: IfExpandService, useExisting: DatagridIfExpandService },
21417
21892
  { 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" }]
21893
+ ], 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</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
21894
  }], ctorParameters: function () {
21420
21895
  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
21896
  type: Inject,
@@ -21441,7 +21916,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21441
21916
  args: [ClrDatagridCell]
21442
21917
  }], expandAnimation: [{
21443
21918
  type: ViewChild,
21444
- args: [ClrExpandableAnimation]
21919
+ args: [ClrExpandableAnimationDirective]
21445
21920
  }], detailButton: [{
21446
21921
  type: ViewChild,
21447
21922
  args: ['detailButton']
@@ -21454,6 +21929,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21454
21929
  }], _calculatedCells: [{
21455
21930
  type: ViewChild,
21456
21931
  args: ['calculatedCells', { read: ViewContainerRef }]
21932
+ }], _fixedCellTemplate: [{
21933
+ type: ViewChild,
21934
+ args: ['fixedCellTemplate']
21457
21935
  }], item: [{
21458
21936
  type: Input,
21459
21937
  args: ['clrDgItem']
@@ -21562,6 +22040,7 @@ const defaultCdkFixedSizeVirtualScrollInputs = {
21562
22040
  };
21563
22041
  class ClrDatagridVirtualScrollDirective {
21564
22042
  constructor(changeDetectorRef, iterableDiffers, items, ngZone, renderer2, templateRef, viewContainerRef, directionality, scrollDispatcher, viewportRuler, datagrid, columnsService, injector) {
22043
+ var _a;
21565
22044
  this.changeDetectorRef = changeDetectorRef;
21566
22045
  this.iterableDiffers = iterableDiffers;
21567
22046
  this.items = items;
@@ -21577,9 +22056,11 @@ class ClrDatagridVirtualScrollDirective {
21577
22056
  this.injector = injector;
21578
22057
  this.renderedRangeChange = new EventEmitter();
21579
22058
  this.persistItems = true;
22059
+ this.shouldUpdateAriaRowIndexes = false;
21580
22060
  this._cdkFixedSizeVirtualScrollInputs = Object.assign({}, defaultCdkFixedSizeVirtualScrollInputs);
21581
22061
  this.subscriptions = [];
21582
22062
  this.topIndex = 0;
22063
+ // @deprecated remove the mutation observer when `datagrid-compact` class is deleted
21583
22064
  this.mutationChanges = new MutationObserver((mutations) => {
21584
22065
  mutations.forEach((mutation) => {
21585
22066
  // it is possible this to be called twice because the old class is removed and the new added
@@ -21597,12 +22078,21 @@ class ClrDatagridVirtualScrollDirective {
21597
22078
  this.datagridElementRef = datagrid.el;
21598
22079
  // default
21599
22080
  this.cdkVirtualForTemplateCacheSize = 20;
22081
+ const rowHeightToken = window.getComputedStyle(document.body).getPropertyValue('--clr-table-row-height');
22082
+ const rowHeightValue = +((_a = /calc\(([0-9]+) \* calc\(\(1rem \/ 20\) \* 1\)\)/.exec(rowHeightToken)) === null || _a === void 0 ? void 0 : _a[1]);
22083
+ if (rowHeightValue && this.itemSize > rowHeightValue) {
22084
+ this.itemSize = rowHeightValue;
22085
+ }
21600
22086
  this.mutationChanges.observe(this.datagridElementRef.nativeElement, {
21601
22087
  attributeFilter: ['class'],
21602
22088
  attributeOldValue: true,
21603
22089
  });
21604
22090
  this.virtualScrollStrategy = new FixedSizeVirtualScrollStrategy(this._cdkFixedSizeVirtualScrollInputs.itemSize, this._cdkFixedSizeVirtualScrollInputs.minBufferPx, this._cdkFixedSizeVirtualScrollInputs.maxBufferPx);
21605
22091
  }
22092
+ get totalContentHeight() {
22093
+ var _a;
22094
+ return ((_a = this.virtualScrollViewport) === null || _a === void 0 ? void 0 : _a._totalContentHeight) || '';
22095
+ }
21606
22096
  get cdkVirtualForOf() {
21607
22097
  return this.cdkVirtualForInputs.cdkVirtualForOf;
21608
22098
  }
@@ -21655,6 +22145,12 @@ class ClrDatagridVirtualScrollDirective {
21655
22145
  this.updateFixedSizeVirtualScrollInputs();
21656
22146
  }
21657
22147
  set dataRange(range) {
22148
+ if (!range) {
22149
+ return;
22150
+ }
22151
+ if (this.items.smart) {
22152
+ this.items.smartenDown();
22153
+ }
21658
22154
  this.totalItems = range.total;
21659
22155
  this.updateDataRange(range.skip, range.data);
21660
22156
  }
@@ -21662,11 +22158,7 @@ class ClrDatagridVirtualScrollDirective {
21662
22158
  return this._totalItems;
21663
22159
  }
21664
22160
  set totalItems(value) {
21665
- if (this._totalItems === value) {
21666
- return;
21667
- }
21668
22161
  this._totalItems = value;
21669
- this.populatePlaceholderData();
21670
22162
  }
21671
22163
  ngAfterViewInit() {
21672
22164
  this.injector.runInContext(() => {
@@ -21677,13 +22169,17 @@ class ClrDatagridVirtualScrollDirective {
21677
22169
  this.gridRoleElement = this.datagridElementRef.nativeElement.querySelector('[role="grid"]');
21678
22170
  this.updateCdkVirtualForInputs();
21679
22171
  this.subscriptions.push(this.items.change.subscribe(newItems => {
21680
- this.cdkVirtualFor.cdkVirtualForOf = newItems;
22172
+ if (this.items.smart) {
22173
+ this.cdkVirtualFor.cdkVirtualForOf = newItems;
22174
+ }
22175
+ this.shouldUpdateAriaRowIndexes = true;
21681
22176
  }), this.cdkVirtualFor.dataStream.subscribe(data => {
21682
22177
  this.updateAriaRowCount(data.length);
21683
22178
  }), this.virtualScrollViewport.scrolledIndexChange.subscribe(index => {
21684
22179
  this.topIndex = index;
21685
22180
  }), this.virtualScrollViewport.renderedRangeStream.subscribe(renderedRange => {
21686
22181
  this.renderedRangeChange.emit(renderedRange);
22182
+ this.shouldUpdateAriaRowIndexes = true;
21687
22183
  }), this.datagrid.refresh.subscribe(datagridState => {
21688
22184
  if (datagridState.filters) {
21689
22185
  this.scrollToIndex(0);
@@ -21695,7 +22191,10 @@ class ClrDatagridVirtualScrollDirective {
21695
22191
  ngDoCheck() {
21696
22192
  var _a;
21697
22193
  (_a = this.cdkVirtualFor) === null || _a === void 0 ? void 0 : _a.ngDoCheck();
21698
- this.updateAriaRowIndexes();
22194
+ if (this.shouldUpdateAriaRowIndexes) {
22195
+ this.updateAriaRowIndexes();
22196
+ this.shouldUpdateAriaRowIndexes = false;
22197
+ }
21699
22198
  }
21700
22199
  ngOnDestroy() {
21701
22200
  var _a, _b, _c;
@@ -21716,16 +22215,13 @@ class ClrDatagridVirtualScrollDirective {
21716
22215
  var _a;
21717
22216
  (_a = this.virtualScrollViewport) === null || _a === void 0 ? void 0 : _a.scrollToIndex(index, behavior);
21718
22217
  }
21719
- populatePlaceholderData() {
21720
- this.cdkVirtualForOf = Array(this.totalItems);
21721
- }
21722
22218
  updateDataRange(skip, data) {
21723
- if (!this.persistItems) {
21724
- this.populatePlaceholderData();
22219
+ let items = this.cdkVirtualForOf;
22220
+ if (!this.persistItems || !items || (items === null || items === void 0 ? void 0 : items.length) !== this.totalItems) {
22221
+ items = Array(this.totalItems);
21725
22222
  }
21726
- const items = this.items.all;
21727
22223
  items.splice(skip, data.length, ...data);
21728
- this.items.all = items;
22224
+ this.cdkVirtualForOf = Array.from(items);
21729
22225
  }
21730
22226
  updateCdkVirtualForInputs() {
21731
22227
  if (this.cdkVirtualFor) {
@@ -21751,42 +22247,21 @@ class ClrDatagridVirtualScrollDirective {
21751
22247
  const rootElements = viewRef.rootNodes;
21752
22248
  const datagridRowElement = rootElements.find(rowElement => rowElement.tagName === 'CLR-DG-ROW');
21753
22249
  const rowRoleElement = datagridRowElement === null || datagridRowElement === void 0 ? void 0 : datagridRowElement.querySelector('[role="row"]');
21754
- // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
21755
- rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', (viewRef.context.index + 1).toString());
22250
+ const newAriaRowIndex = (viewRef.context.index + 1).toString();
22251
+ if ((rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.getAttribute('aria-rowindex')) !== newAriaRowIndex) {
22252
+ // aria-rowindex should start with one, not zero, so we have to add one to the zero-based index
22253
+ rowRoleElement === null || rowRoleElement === void 0 ? void 0 : rowRoleElement.setAttribute('aria-rowindex', newAriaRowIndex);
22254
+ }
21756
22255
  }
21757
22256
  }
21758
22257
  createVirtualScrollViewportForDatagrid(changeDetectorRef, ngZone, renderer2, directionality, scrollDispatcher, viewportRuler, datagridElementRef, virtualScrollStrategy) {
21759
- const datagridDivElement = datagridElementRef.nativeElement.querySelector('.datagrid');
21760
- const datagridTableElement = datagridElementRef.nativeElement.querySelector('.datagrid-table');
22258
+ const datagridContentElement = datagridElementRef.nativeElement.querySelector('.datagrid-content');
21761
22259
  const datagridRowsElement = datagridElementRef.nativeElement.querySelector('.datagrid-rows');
21762
- const datagridDivElementRef = { nativeElement: datagridDivElement };
21763
- let topOffset = 0;
21764
- let totalContentSize = 0;
21765
- function updateDatagridElementStyles() {
21766
- datagridRowsElement.style.transform = `translateY(${topOffset}px)`;
21767
- datagridRowsElement.style.height = `${totalContentSize - topOffset}px`;
21768
- }
21769
- const virtualScrollViewport = createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
21770
- virtualScrollViewport._contentWrapper = {
21771
- nativeElement: {
21772
- style: {
21773
- set transform(value) {
21774
- var _a;
21775
- topOffset = value === undefined ? 0 : +((_a = /translateY\(([0-9]+)px\)/.exec(value)) === null || _a === void 0 ? void 0 : _a[1]);
21776
- updateDatagridElementStyles();
21777
- },
21778
- },
21779
- },
21780
- };
21781
- virtualScrollViewport.setTotalContentSize = (value) => {
21782
- totalContentSize = value;
21783
- datagridTableElement.style.height = `${totalContentSize}px`;
21784
- updateDatagridElementStyles();
21785
- };
22260
+ const virtualScrollViewport = createCdkVirtualScrollViewport(new ElementRef(datagridContentElement), new ElementRef(datagridRowsElement), changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, null);
21786
22261
  return virtualScrollViewport;
21787
22262
  }
21788
22263
  }
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 });
22264
+ 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
22265
  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
22266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridVirtualScrollDirective, decorators: [{
21792
22267
  type: Directive,
@@ -21795,9 +22270,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21795
22270
  providers: [Items],
21796
22271
  }]
21797
22272
  }], 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 }];
22273
+ 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: [{
22274
+ type: Inject,
22275
+ args: [forwardRef(() => ClrDatagrid)]
22276
+ }] }, { type: ColumnsService }, { type: i0.EnvironmentInjector }];
21801
22277
  }, propDecorators: { renderedRangeChange: [{
21802
22278
  type: Output
21803
22279
  }], persistItems: [{
@@ -21828,9 +22304,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21828
22304
  type: Input,
21829
22305
  args: ['clrVirtualDataRange']
21830
22306
  }] } });
21831
- function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
22307
+ function createCdkVirtualScrollViewport(datagridDivElementRef, contentWrapper, changeDetectorRef, ngZone, renderer2, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable) {
22308
+ let viewPort;
21832
22309
  if (+VERSION.major < 19) {
21833
- return new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
22310
+ viewPort = new CdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef, ngZone, virtualScrollStrategy, directionality, scrollDispatcher, viewportRuler, scrollable);
21834
22311
  }
21835
22312
  else {
21836
22313
  const virtualScrollViewportInjector = Injector.create({
@@ -21848,8 +22325,10 @@ function createCdkVirtualScrollViewport(datagridDivElementRef, changeDetectorRef
21848
22325
  { provide: CdkVirtualScrollViewport, useClass: CdkVirtualScrollViewport },
21849
22326
  ],
21850
22327
  });
21851
- return virtualScrollViewportInjector.get(CdkVirtualScrollViewport);
22328
+ viewPort = virtualScrollViewportInjector.get(CdkVirtualScrollViewport);
21852
22329
  }
22330
+ viewPort._contentWrapper = contentWrapper;
22331
+ return viewPort;
21853
22332
  }
21854
22333
  function createCdkVirtualForOfDirective(viewContainerRef, templateRef, iterableDiffers, viewRepeater, virtualScrollViewport, ngZone) {
21855
22334
  if (+VERSION.major < 19) {
@@ -21942,6 +22421,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21942
22421
  type: Injectable
21943
22422
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
21944
22423
 
22424
+ /*
22425
+ * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
22426
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
22427
+ * This software is released under MIT license.
22428
+ * The full license information can be found in LICENSE in the root directory of this project.
22429
+ */
22430
+ class DatagridCellRenderer {
22431
+ constructor(el, renderer, organizer) {
22432
+ this.el = el;
22433
+ this.renderer = renderer;
22434
+ this.subscriptions = [];
22435
+ this.subscriptions.push(organizer.filterRenderSteps(DatagridRenderStep.CLEAR_WIDTHS).subscribe(() => this.clearWidth()));
22436
+ }
22437
+ ngOnDestroy() {
22438
+ this.subscriptions.forEach(sub => sub.unsubscribe());
22439
+ if (this.stateSubscription) {
22440
+ this.stateSubscription.unsubscribe();
22441
+ }
22442
+ }
22443
+ resetState(state) {
22444
+ this.setWidth(state);
22445
+ this.setHidden(state);
22446
+ }
22447
+ setWidth(state) {
22448
+ if (state.strictWidth) {
22449
+ this.renderer.addClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
22450
+ }
22451
+ else {
22452
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
22453
+ }
22454
+ this.renderer.setStyle(this.el.nativeElement, 'width', state.width + 'px');
22455
+ }
22456
+ setHidden(state) {
22457
+ if (state.hidden) {
22458
+ this.renderer.addClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
22459
+ }
22460
+ else {
22461
+ this.renderer.removeClass(this.el.nativeElement, HIDDEN_COLUMN_CLASS);
22462
+ }
22463
+ }
22464
+ clearWidth() {
22465
+ this.renderer.removeClass(this.el.nativeElement, STRICT_WIDTH_CLASS);
22466
+ this.renderer.setStyle(this.el.nativeElement, 'width', null);
22467
+ }
22468
+ }
22469
+ DatagridCellRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DatagridRenderOrganizer }], target: i0.ɵɵFactoryTarget.Directive });
22470
+ DatagridCellRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridCellRenderer, selector: "clr-dg-cell", ngImport: i0 });
22471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridCellRenderer, decorators: [{
22472
+ type: Directive,
22473
+ args: [{
22474
+ selector: 'clr-dg-cell',
22475
+ }]
22476
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: DatagridRenderOrganizer }]; } });
22477
+
21945
22478
  /*
21946
22479
  * Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
21947
22480
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -22036,6 +22569,11 @@ class ClrDatagrid {
22036
22569
  * Output emitted whenever the data needs to be refreshed, based on user action or external ones
22037
22570
  */
22038
22571
  this.refresh = new EventEmitter(false);
22572
+ /**
22573
+ * The application can provide custom select all logic.
22574
+ */
22575
+ this.customSelectAllEnabled = false;
22576
+ this.customSelectAll = new EventEmitter();
22039
22577
  /* reference to the enum so that template can access */
22040
22578
  this.SELECTION_TYPE = SelectionType;
22041
22579
  /**
@@ -22102,13 +22640,18 @@ class ClrDatagrid {
22102
22640
  get allSelected() {
22103
22641
  return this.selection.isAllSelected();
22104
22642
  }
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();
22643
+ set allSelected(value) {
22644
+ if (this.customSelectAllEnabled) {
22645
+ this.customSelectAll.emit(value);
22646
+ }
22647
+ else {
22648
+ /**
22649
+ * This is a setter but we ignore the value.
22650
+ * It's strange, but it lets us have an indeterminate state where only
22651
+ * some of the items are selected.
22652
+ */
22653
+ this.selection.toggleAll();
22654
+ }
22112
22655
  }
22113
22656
  ngAfterContentInit() {
22114
22657
  if (!this.items.smart) {
@@ -22136,13 +22679,18 @@ class ClrDatagrid {
22136
22679
  });
22137
22680
  this.updateDetailState();
22138
22681
  // retain active cell when navigating with Up/Down Arrows, PageUp and PageDown buttons in virtual scroller
22139
- if (this.virtualScroll) {
22140
- const active = this.keyNavigation.getActiveCell();
22141
- if (active) {
22142
- this.zone.runOutsideAngular(() => {
22143
- setTimeout(() => this.keyNavigation.setActiveCell(active));
22682
+ if (this.virtualScroll && this.activeCellCoords) {
22683
+ this.zone.runOutsideAngular(() => {
22684
+ const row = Array.from(this.rows).find(row => {
22685
+ return row.el.nativeElement.children[0].ariaRowIndex === this.activeCellCoords.ariaRowIndex;
22144
22686
  });
22145
- }
22687
+ if (!row) {
22688
+ return;
22689
+ }
22690
+ const activeCell = row.el.nativeElement.querySelectorAll(this.keyNavigation.config.keyGridCells)[this.activeCellCoords.x];
22691
+ this.keyNavigation.setActiveCell(activeCell);
22692
+ this.keyNavigation.focusElement(activeCell, { preventScroll: true });
22693
+ });
22146
22694
  }
22147
22695
  }));
22148
22696
  }
@@ -22151,10 +22699,12 @@ class ClrDatagrid {
22151
22699
  */
22152
22700
  ngAfterViewInit() {
22153
22701
  this.keyNavigation.initializeKeyGrid(this.el.nativeElement);
22702
+ // the virtual scroll will handle the scrolling
22703
+ this.keyNavigation.preventScrollOnFocus = !!this.virtualScroll;
22154
22704
  this.updateDetailState();
22155
22705
  // TODO: determine if we can get rid of provider wiring in view init so that subscriptions can be done earlier
22156
22706
  this.refresh.emit(this.stateProvider.state);
22157
- this._subscriptions.push(this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22707
+ this._subscriptions.push(this.stickyHeaders.changes.subscribe(() => this.resize()), this.stateProvider.change.subscribe(state => this.refresh.emit(state)), this.selection.change.subscribe(s => {
22158
22708
  if (this.selection.selectionType === SelectionType.Single) {
22159
22709
  this.singleSelectedChanged.emit(s);
22160
22710
  }
@@ -22200,6 +22750,15 @@ class ClrDatagrid {
22200
22750
  else {
22201
22751
  // Set state, style for the datagrid to CALCULATE and insert row & columns into containers
22202
22752
  this.renderer.addClass(this.el.nativeElement, 'datagrid-calculate-mode');
22753
+ // Inserts a fixed column if any of these conditions are true.
22754
+ const fixedColumnConditions = [
22755
+ this.rowActionService.hasActionableRow,
22756
+ this.selection.selectionType !== this.SELECTION_TYPE.None,
22757
+ this.expandableRows.hasExpandableRow || this.detailService.enabled,
22758
+ ];
22759
+ fixedColumnConditions
22760
+ .filter(Boolean)
22761
+ .forEach(() => this._projectedCalculationColumns.insert(this._fixedColumnTemplate.createEmbeddedView(null)));
22203
22762
  this.columns.forEach(column => {
22204
22763
  this._projectedCalculationColumns.insert(column._view);
22205
22764
  });
@@ -22221,16 +22780,33 @@ class ClrDatagrid {
22221
22780
  }
22222
22781
  }));
22223
22782
  });
22783
+ if (this.virtualScroll) {
22784
+ this._subscriptions.push(fromEvent(this.contentWrapper.nativeElement, 'scroll').subscribe(() => {
22785
+ this.datagridHeader.nativeElement.scrollLeft = this.contentWrapper.nativeElement.scrollLeft;
22786
+ }), this.keyNavigation.nextCellCoordsEmitter.subscribe(cellCoords => {
22787
+ var _a;
22788
+ if (!(cellCoords === null || cellCoords === void 0 ? void 0 : cellCoords.ariaRowIndex)) {
22789
+ this.activeCellCoords = null;
22790
+ return;
22791
+ }
22792
+ if (cellCoords.ariaRowIndex === ((_a = this.activeCellCoords) === null || _a === void 0 ? void 0 : _a.ariaRowIndex)) {
22793
+ this.activeCellCoords = cellCoords;
22794
+ return;
22795
+ }
22796
+ this.activeCellCoords = cellCoords;
22797
+ // aria-rowindex is always + 1. Check virtual scroller updateAriaRowIndexes method.
22798
+ const rowIndex = Number(cellCoords.ariaRowIndex) - 1;
22799
+ this.virtualScroll.scrollToIndex(rowIndex);
22800
+ }));
22801
+ }
22224
22802
  }
22225
22803
  ngOnDestroy() {
22226
22804
  this._subscriptions.forEach((sub) => sub.unsubscribe());
22227
22805
  }
22228
22806
  toggleAllSelected($event) {
22807
+ var _a;
22229
22808
  $event.preventDefault();
22230
- if (this.virtualScroll) {
22231
- return;
22232
- }
22233
- this.allSelected = !this.allSelected;
22809
+ (_a = this.selectAllCheckbox) === null || _a === void 0 ? void 0 : _a.nativeElement.click();
22234
22810
  }
22235
22811
  resize() {
22236
22812
  this.organizer.resize();
@@ -22266,7 +22842,7 @@ class ClrDatagrid {
22266
22842
  }
22267
22843
  }
22268
22844
  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: [
22845
+ 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", "class.datagrid-virtual-scroll": "!!virtualScroll" } }, providers: [
22270
22846
  Selection,
22271
22847
  Sort,
22272
22848
  FiltersProvider,
@@ -22282,7 +22858,7 @@ ClrDatagrid.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
22282
22858
  ColumnsService,
22283
22859
  DisplayModeService,
22284
22860
  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" }] });
22861
+ ], 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, emitDistinctChangesOnly: false }], viewQueries: [{ propertyName: "datagrid", first: true, predicate: ["datagrid"], descendants: true, read: ElementRef }, { propertyName: "datagridTable", first: true, predicate: ["datagridTable"], descendants: true, read: ElementRef }, { propertyName: "datagridHeader", first: true, predicate: ["datagridHeader"], descendants: true, read: ElementRef }, { propertyName: "contentWrapper", first: true, predicate: ["contentWrapper"], 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\" #datagridHeader>\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 *ngIf=\"virtualScroll\" class=\"datagrid-row-sticky datagrid-row-sticky-scroll\">\n <div class=\"datagrid-column\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"datagrid-content\" [class.datagrid-content-virtual]=\"virtualScroll\" #contentWrapper>\n <div\n *ngIf=\"virtualScroll\"\n class=\"datagrid-content-virtual-spacer\"\n [style.height]=\"virtualScroll?.totalContentHeight\"\n ></div>\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 </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
22862
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagrid, decorators: [{
22287
22863
  type: Component,
22288
22864
  args: [{ selector: 'clr-datagrid', providers: [
@@ -22304,7 +22880,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22304
22880
  ], host: {
22305
22881
  '[class.datagrid-host]': 'true',
22306
22882
  '[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" }]
22883
+ '[class.datagrid-virtual-scroll]': '!!virtualScroll',
22884
+ }, 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\" #datagridHeader>\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 *ngIf=\"virtualScroll\" class=\"datagrid-row-sticky datagrid-row-sticky-scroll\">\n <div class=\"datagrid-column\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"datagrid-content\" [class.datagrid-content-virtual]=\"virtualScroll\" #contentWrapper>\n <div\n *ngIf=\"virtualScroll\"\n class=\"datagrid-content-virtual-spacer\"\n [style.height]=\"virtualScroll?.totalContentHeight\"\n ></div>\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 </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
22885
  }], ctorParameters: function () {
22309
22886
  return [{ type: DatagridRenderOrganizer }, { type: Items }, { type: ExpandableRowsCount }, { type: Selection }, { type: RowActionService }, { type: StateProvider }, { type: DisplayModeService }, { type: i0.Renderer2 }, { type: DetailService }, { type: undefined, decorators: [{
22310
22887
  type: Inject,
@@ -22330,6 +22907,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22330
22907
  }], refresh: [{
22331
22908
  type: Output,
22332
22909
  args: ['clrDgRefresh']
22910
+ }], customSelectAllEnabled: [{
22911
+ type: Input,
22912
+ args: ['clrDgCustomSelectAllEnabled']
22913
+ }], customSelectAll: [{
22914
+ type: Output,
22915
+ args: ['clrDgCustomSelectAll']
22333
22916
  }], virtualScroll: [{
22334
22917
  type: ContentChild,
22335
22918
  args: [ClrDatagridVirtualScrollDirective]
@@ -22344,13 +22927,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22344
22927
  args: [ClrDatagridColumn]
22345
22928
  }], rows: [{
22346
22929
  type: ContentChildren,
22347
- args: [ClrDatagridRow]
22930
+ args: [ClrDatagridRow, { emitDistinctChangesOnly: false }]
22348
22931
  }], datagrid: [{
22349
22932
  type: ViewChild,
22350
22933
  args: ['datagrid', { read: ElementRef }]
22351
22934
  }], datagridTable: [{
22352
22935
  type: ViewChild,
22353
22936
  args: ['datagridTable', { read: ElementRef }]
22937
+ }], datagridHeader: [{
22938
+ type: ViewChild,
22939
+ args: ['datagridHeader', { read: ElementRef }]
22940
+ }], contentWrapper: [{
22941
+ type: ViewChild,
22942
+ args: ['contentWrapper', { read: ElementRef }]
22354
22943
  }], scrollableColumns: [{
22355
22944
  type: ViewChild,
22356
22945
  args: ['scrollableColumns', { read: ViewContainerRef }]
@@ -22366,6 +22955,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22366
22955
  }], _calculationRows: [{
22367
22956
  type: ViewChild,
22368
22957
  args: ['calculationRows', { read: ViewContainerRef }]
22958
+ }], _fixedColumnTemplate: [{
22959
+ type: ViewChild,
22960
+ args: ['fixedColumnTemplate']
22961
+ }], stickyHeaders: [{
22962
+ type: ViewChildren,
22963
+ args: ['stickyHeader', { emitDistinctChangesOnly: true }]
22964
+ }], selectAllCheckbox: [{
22965
+ type: ViewChild,
22966
+ args: ['selectAllCheckbox']
22369
22967
  }], loading: [{
22370
22968
  type: Input,
22371
22969
  args: ['clrDgLoading']
@@ -22833,7 +23431,7 @@ ClrDatagridDetailHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
22833
23431
  <div class="datagrid-detail-pane-close">
22834
23432
  <button
22835
23433
  type="button"
22836
- class="btn btn-link"
23434
+ class="btn btn-icon btn-link"
22837
23435
  (click)="detailService.close()"
22838
23436
  [attr.aria-label]="commonStrings.keys.close"
22839
23437
  >
@@ -22855,7 +23453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
22855
23453
  <div class="datagrid-detail-pane-close">
22856
23454
  <button
22857
23455
  type="button"
22858
- class="btn btn-link"
23456
+ class="btn btn-icon btn-link"
22859
23457
  (click)="detailService.close()"
22860
23458
  [attr.aria-label]="commonStrings.keys.close"
22861
23459
  >
@@ -23532,22 +24130,24 @@ ClrDatagridPagination.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
23532
24130
  <span class="clr-sr-only">{{ commonStrings.keys.previousPage }}</span>
23533
24131
  <cds-icon shape="angle" direction="left"></cds-icon>
23534
24132
  </button>
23535
- <input
23536
- *ngIf="!disableCurrentPageInput; else readOnly"
23537
- #currentPageInput
23538
- type="text"
23539
- class="pagination-current clr-input"
23540
- [size]="page.last.toString().length"
23541
- [value]="page.current"
23542
- (keydown.enter)="updateCurrentPage($event)"
23543
- (blur)="verifyCurrentPage($event)"
23544
- [attr.aria-label]="commonStrings.keys.currentPage"
23545
- />
23546
- <ng-template #readOnly>
23547
- <span>{{ page.current }}</span>
23548
- </ng-template>
24133
+ <div class="pagination-pages">
24134
+ <input
24135
+ *ngIf="!disableCurrentPageInput; else readOnly"
24136
+ #currentPageInput
24137
+ type="text"
24138
+ class="pagination-current clr-input"
24139
+ [size]="page.last.toString().length"
24140
+ [value]="page.current"
24141
+ (keydown.enter)="updateCurrentPage($event)"
24142
+ (blur)="verifyCurrentPage($event)"
24143
+ [attr.aria-label]="commonStrings.keys.currentPage"
24144
+ />
24145
+ <ng-template #readOnly>
24146
+ <span>{{ page.current }}</span>
24147
+ </ng-template>
23549
24148
 
23550
- &nbsp;/&nbsp;<span [attr.aria-label]="commonStrings.keys.totalPages">{{ page.last }}</span>
24149
+ &nbsp;/&nbsp;<span [attr.aria-label]="commonStrings.keys.totalPages">{{ page.last }}</span>
24150
+ </div>
23551
24151
  <button
23552
24152
  type="button"
23553
24153
  class="pagination-next"
@@ -23632,22 +24232,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
23632
24232
  <span class="clr-sr-only">{{ commonStrings.keys.previousPage }}</span>
23633
24233
  <cds-icon shape="angle" direction="left"></cds-icon>
23634
24234
  </button>
23635
- <input
23636
- *ngIf="!disableCurrentPageInput; else readOnly"
23637
- #currentPageInput
23638
- type="text"
23639
- class="pagination-current clr-input"
23640
- [size]="page.last.toString().length"
23641
- [value]="page.current"
23642
- (keydown.enter)="updateCurrentPage($event)"
23643
- (blur)="verifyCurrentPage($event)"
23644
- [attr.aria-label]="commonStrings.keys.currentPage"
23645
- />
23646
- <ng-template #readOnly>
23647
- <span>{{ page.current }}</span>
23648
- </ng-template>
24235
+ <div class="pagination-pages">
24236
+ <input
24237
+ *ngIf="!disableCurrentPageInput; else readOnly"
24238
+ #currentPageInput
24239
+ type="text"
24240
+ class="pagination-current clr-input"
24241
+ [size]="page.last.toString().length"
24242
+ [value]="page.current"
24243
+ (keydown.enter)="updateCurrentPage($event)"
24244
+ (blur)="verifyCurrentPage($event)"
24245
+ [attr.aria-label]="commonStrings.keys.currentPage"
24246
+ />
24247
+ <ng-template #readOnly>
24248
+ <span>{{ page.current }}</span>
24249
+ </ng-template>
23649
24250
 
23650
- &nbsp;/&nbsp;<span [attr.aria-label]="commonStrings.keys.totalPages">{{ page.last }}</span>
24251
+ &nbsp;/&nbsp;<span [attr.aria-label]="commonStrings.keys.totalPages">{{ page.last }}</span>
24252
+ </div>
23651
24253
  <button
23652
24254
  type="button"
23653
24255
  class="pagination-next"
@@ -24593,7 +25195,7 @@ ClrStackBlock.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version:
24593
25195
  [attr.aria-expanded]="ariaExpanded"
24594
25196
  [attr.aria-controls]="getStackChildrenId()"
24595
25197
  >
24596
- <cds-icon shape="angle" class="stack-block-caret" *ngIf="expandable" [attr.direction]="caretDirection"></cds-icon>
25198
+ <cds-icon shape="angle" class="stack-block-caret" [attr.direction]="caretDirection"></cds-icon>
24597
25199
  <span class="clr-sr-only" *ngIf="getChangedValue">{{ commonStrings.keys.stackViewChanged }}</span>
24598
25200
  <div class="stack-view-key">
24599
25201
  <!-- This structure changed to fix #3567 and the a11y request was to move away from dl's -->
@@ -24636,7 +25238,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
24636
25238
  [attr.aria-expanded]="ariaExpanded"
24637
25239
  [attr.aria-controls]="getStackChildrenId()"
24638
25240
  >
24639
- <cds-icon shape="angle" class="stack-block-caret" *ngIf="expandable" [attr.direction]="caretDirection"></cds-icon>
25241
+ <cds-icon shape="angle" class="stack-block-caret" [attr.direction]="caretDirection"></cds-icon>
24640
25242
  <span class="clr-sr-only" *ngIf="getChangedValue">{{ commonStrings.keys.stackViewChanged }}</span>
24641
25243
  <div class="stack-view-key">
24642
25244
  <!-- This structure changed to fix #3567 and the a11y request was to move away from dl's -->
@@ -26228,10 +26830,10 @@ class ClrAlert {
26228
26830
  }
26229
26831
  }
26230
26832
  ClrAlert.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAlert, deps: [{ token: AlertIconAndTypesService }, { token: i0.ChangeDetectorRef }, { token: MultiAlertService, optional: true }, { token: ClrCommonStringsService }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
26231
- ClrAlert.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAlert, selector: "clr-alert", inputs: { isSmall: ["clrAlertSizeSmall", "isSmall"], closable: ["clrAlertClosable", "closable"], isAppLevel: ["clrAlertAppLevel", "isAppLevel"], clrCloseButtonAriaLabel: "clrCloseButtonAriaLabel", isLightweight: ["clrAlertLightweight", "isLightweight"], alertType: ["clrAlertType", "alertType"], alertIconShape: ["clrAlertIcon", "alertIconShape"], closed: ["clrAlertClosed", "closed"] }, outputs: { _closedChanged: "clrAlertClosedChange" }, providers: [AlertIconAndTypesService], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div\n *ngIf=\"!_closed\"\n class=\"alert\"\n [ngClass]=\"alertClass\"\n [class.alert-sm]=\"isSmall\"\n [class.alert-lightweight]=\"isLightweight\"\n [class.alert-app-level]=\"isAppLevel\"\n>\n <div class=\"alert-items\">\n <ng-content></ng-content>\n </div>\n <button type=\"button\" class=\"close\" *ngIf=\"closable\" (click)=\"close()\" [attr.aria-label]=\"clrCloseButtonAriaLabel\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n</div>\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: CdsIconCustomTag, selector: "cds-icon" }] });
26833
+ ClrAlert.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAlert, selector: "clr-alert", inputs: { isSmall: ["clrAlertSizeSmall", "isSmall"], closable: ["clrAlertClosable", "closable"], isAppLevel: ["clrAlertAppLevel", "isAppLevel"], clrCloseButtonAriaLabel: "clrCloseButtonAriaLabel", isLightweight: ["clrAlertLightweight", "isLightweight"], alertType: ["clrAlertType", "alertType"], alertIconShape: ["clrAlertIcon", "alertIconShape"], closed: ["clrAlertClosed", "closed"] }, outputs: { _closedChanged: "clrAlertClosedChange" }, providers: [AlertIconAndTypesService], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div\n *ngIf=\"!_closed\"\n class=\"alert\"\n [ngClass]=\"alertClass\"\n [class.alert-sm]=\"isSmall\"\n [class.alert-lightweight]=\"isLightweight\"\n [class.alert-app-level]=\"isAppLevel\"\n>\n <div class=\"alert-items\">\n <ng-content></ng-content>\n </div>\n <button type=\"button\" class=\"close\" *ngIf=\"closable\" (click)=\"close()\" [attr.aria-label]=\"clrCloseButtonAriaLabel\">\n <cds-icon shape=\"times\"></cds-icon>\n </button>\n</div>\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: CdsIconCustomTag, selector: "cds-icon" }] });
26232
26834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAlert, decorators: [{
26233
26835
  type: Component,
26234
- args: [{ selector: 'clr-alert', providers: [AlertIconAndTypesService], template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div\n *ngIf=\"!_closed\"\n class=\"alert\"\n [ngClass]=\"alertClass\"\n [class.alert-sm]=\"isSmall\"\n [class.alert-lightweight]=\"isLightweight\"\n [class.alert-app-level]=\"isAppLevel\"\n>\n <div class=\"alert-items\">\n <ng-content></ng-content>\n </div>\n <button type=\"button\" class=\"close\" *ngIf=\"closable\" (click)=\"close()\" [attr.aria-label]=\"clrCloseButtonAriaLabel\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n</div>\n" }]
26836
+ args: [{ selector: 'clr-alert', providers: [AlertIconAndTypesService], template: "<!--\n ~ Copyright (c) 2016-2025 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n<div\n *ngIf=\"!_closed\"\n class=\"alert\"\n [ngClass]=\"alertClass\"\n [class.alert-sm]=\"isSmall\"\n [class.alert-lightweight]=\"isLightweight\"\n [class.alert-app-level]=\"isAppLevel\"\n>\n <div class=\"alert-items\">\n <ng-content></ng-content>\n </div>\n <button type=\"button\" class=\"close\" *ngIf=\"closable\" (click)=\"close()\" [attr.aria-label]=\"clrCloseButtonAriaLabel\">\n <cds-icon shape=\"times\"></cds-icon>\n </button>\n</div>\n" }]
26235
26837
  }], ctorParameters: function () {
26236
26838
  return [{ type: AlertIconAndTypesService }, { type: i0.ChangeDetectorRef }, { type: MultiAlertService, decorators: [{
26237
26839
  type: Optional
@@ -26685,7 +27287,7 @@ class ClrModal {
26685
27287
  }
26686
27288
  }
26687
27289
  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: [
27290
+ 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 [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</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
27291
  trigger('fadeMove', [
26690
27292
  transition('* => fadeDown', [
26691
27293
  style({ opacity: 0, transform: 'translate(0, -25%)' }),
@@ -26696,6 +27298,8 @@ ClrModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.
26696
27298
  ]),
26697
27299
  transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
26698
27300
  transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
27301
+ transition('* => fadeUp', [style({ opacity: 0, transform: 'translate(0, 50%)' }), animate('0.2s ease-in-out')]),
27302
+ transition('fadeUp => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, 50%)' }))]),
26699
27303
  ]),
26700
27304
  trigger('fade', [
26701
27305
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
@@ -26715,12 +27319,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26715
27319
  ]),
26716
27320
  transition('* => fadeLeft', [style({ opacity: 0, transform: 'translate(25%, 0)' }), animate('0.2s ease-in-out')]),
26717
27321
  transition('fadeLeft => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(25%, 0)' }))]),
27322
+ transition('* => fadeUp', [style({ opacity: 0, transform: 'translate(0, 50%)' }), animate('0.2s ease-in-out')]),
27323
+ transition('fadeUp => *', [animate('0.2s ease-in-out', style({ opacity: 0, transform: 'translate(0, 50%)' }))]),
26718
27324
  ]),
26719
27325
  trigger('fade', [
26720
27326
  transition('void => *', [style({ opacity: 0 }), animate('0.2s ease-in-out', style({ opacity: 0.85 }))]),
26721
27327
  transition('* => void', [animate('0.2s ease-in-out', style({ opacity: 0 }))]),
26722
27328
  ]),
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"] }]
27329
+ ], 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 [@fade] *ngIf=\"backdrop\" class=\"modal-backdrop\" aria-hidden=\"true\" (click)=\"backdropClick()\"></div>\n</div>\n", styles: [":host{display:none}:host.open{display:inline}\n"] }]
26724
27330
  }], ctorParameters: function () { return [{ type: ScrollingService }, { type: ClrCommonStringsService }, { type: ModalStackService }, { type: ClrModalConfigurationService }]; }, propDecorators: { title: [{
26725
27331
  type: ViewChild,
26726
27332
  args: ['title']
@@ -26760,6 +27366,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26760
27366
  }], bypassScrollService: [{
26761
27367
  type: Input,
26762
27368
  args: ['clrModalOverrideScrollService']
27369
+ }], modalContentTemplate: [{
27370
+ type: ContentChild,
27371
+ args: ['clrInternalModalContentTemplate']
26763
27372
  }], bodyElementRef: [{
26764
27373
  type: ViewChild,
26765
27374
  args: ['body']
@@ -26834,15 +27443,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26834
27443
  * This software is released under MIT license.
26835
27444
  * The full license information can be found in LICENSE in the root directory of this project.
26836
27445
  */
26837
- class ClrModalHostDirective {
27446
+ class ClrModalHostComponent {
26838
27447
  }
26839
- ClrModalHostDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalHostDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
26840
- ClrModalHostDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrModalHostDirective, selector: "[clrModalHost]", host: { properties: { "class.clr-modal-host": "true" } }, ngImport: i0 });
26841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalHostDirective, decorators: [{
26842
- type: Directive,
27448
+ ClrModalHostComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
27449
+ ClrModalHostComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrModalHostComponent, selector: "[clrModalHost]", host: { properties: { "class.clr-modal-host": "true" } }, ngImport: i0, template: `
27450
+ <div class="clr-modal-host-scrollable">
27451
+ <ng-content></ng-content>
27452
+ </div>
27453
+ `, isInline: true });
27454
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalHostComponent, decorators: [{
27455
+ type: Component,
26843
27456
  args: [{
26844
27457
  selector: '[clrModalHost]',
26845
27458
  host: { '[class.clr-modal-host]': 'true' },
27459
+ template: `
27460
+ <div class="clr-modal-host-scrollable">
27461
+ <ng-content></ng-content>
27462
+ </div>
27463
+ `,
26846
27464
  }]
26847
27465
  }] });
26848
27466
 
@@ -26852,14 +27470,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26852
27470
  * This software is released under MIT license.
26853
27471
  * The full license information can be found in LICENSE in the root directory of this project.
26854
27472
  */
26855
- const CLR_MODAL_DIRECTIVES = [ClrModal, ClrModalBody, ClrModalHostDirective];
27473
+ const CLR_MODAL_DIRECTIVES = [ClrModal, ClrModalBody, ClrModalHostComponent];
26856
27474
  class ClrModalModule {
26857
27475
  constructor() {
26858
27476
  ClarityIcons.addIcons(windowCloseIcon);
26859
27477
  }
26860
27478
  }
26861
27479
  ClrModalModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
26862
- ClrModalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, declarations: [ClrModal, ClrModalBody, ClrModalHostDirective], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule], exports: [ClrModal, ClrModalBody, ClrModalHostDirective, ClrIconModule] });
27480
+ ClrModalModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, declarations: [ClrModal, ClrModalBody, ClrModalHostComponent], imports: [CommonModule, CdkTrapFocusModule, ClrIconModule], exports: [ClrModal, ClrModalBody, ClrModalHostComponent, ClrIconModule] });
26863
27481
  ClrModalModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, imports: [CommonModule, CdkTrapFocusModule, ClrIconModule, ClrIconModule] });
26864
27482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrModalModule, decorators: [{
26865
27483
  type: NgModule,
@@ -26881,16 +27499,29 @@ class ClrSidePanel {
26881
27499
  this.element = element;
26882
27500
  this.configuration = configuration;
26883
27501
  this.commonStrings = commonStrings;
26884
- this._open = false;
26885
27502
  this.openChange = new EventEmitter(false);
26886
27503
  this.skipAnimation = false;
26887
27504
  this.staticBackdrop = false;
27505
+ this.closable = true;
26888
27506
  this.preventClose = false;
26889
27507
  this.altClose = new EventEmitter(false);
26890
27508
  this._pinnable = false;
26891
27509
  this._pinned = false;
27510
+ this._position = 'right';
27511
+ this.__open = false;
26892
27512
  this._size = 'md';
26893
27513
  }
27514
+ get _open() {
27515
+ return this.__open;
27516
+ }
27517
+ set _open(open) {
27518
+ if (open !== this.__open) {
27519
+ this.__open = open;
27520
+ if (this.pinned) {
27521
+ this.updateModalState();
27522
+ }
27523
+ }
27524
+ }
26894
27525
  get size() {
26895
27526
  return this._size;
26896
27527
  }
@@ -26900,9 +27531,22 @@ class ClrSidePanel {
26900
27531
  }
26901
27532
  if (this._size !== value) {
26902
27533
  this._size = value;
26903
- if (this.clrSidePanelPinnable && this.pinned) {
26904
- this.displayOverlapping();
26905
- this.displaySideBySide();
27534
+ if (this.pinned) {
27535
+ this.updateModalState();
27536
+ }
27537
+ }
27538
+ }
27539
+ get position() {
27540
+ return this._position;
27541
+ }
27542
+ set position(position) {
27543
+ if (position && position !== this._position) {
27544
+ this._position = position;
27545
+ if (this._position === 'right') {
27546
+ this.configuration.fadeMove = 'fadeLeft';
27547
+ }
27548
+ else if (this._position === 'bottom') {
27549
+ this.configuration.fadeMove = 'fadeUp';
26906
27550
  }
26907
27551
  }
26908
27552
  }
@@ -26910,17 +27554,9 @@ class ClrSidePanel {
26910
27554
  return this._pinned;
26911
27555
  }
26912
27556
  set pinned(pinned) {
26913
- if (this.clrSidePanelPinnable) {
26914
- this._pinned = pinned;
26915
- if (pinned) {
26916
- this.originalStopClose = this.modal.stopClose;
26917
- this.modal.stopClose = true;
26918
- this.displaySideBySide();
26919
- }
26920
- else {
26921
- this.modal.stopClose = this.originalStopClose;
26922
- this.displayOverlapping();
26923
- }
27557
+ this._pinned = pinned;
27558
+ if (this.modal) {
27559
+ this.updateModalState();
26924
27560
  }
26925
27561
  }
26926
27562
  get clrSidePanelBackdrop() {
@@ -26937,28 +27573,37 @@ class ClrSidePanel {
26937
27573
  set clrSidePanelPinnable(pinnable) {
26938
27574
  this._pinnable = pinnable;
26939
27575
  }
27576
+ get modal() {
27577
+ return this._modal;
27578
+ }
27579
+ set modal(modal) {
27580
+ this._modal = modal;
27581
+ this.originalStopClose = this.modal.stopClose;
27582
+ this.updateModalState();
27583
+ }
26940
27584
  get hostElement() {
26941
27585
  return this.element.nativeElement.closest('.clr-modal-host') || document.body;
26942
27586
  }
27587
+ get bottomPositionCssClass() {
27588
+ return this.position === 'bottom';
27589
+ }
26943
27590
  ngOnInit() {
26944
27591
  this.configuration.fadeMove = 'fadeLeft';
26945
- }
26946
- ngOnChanges(changes) {
26947
- if (changes && Object.prototype.hasOwnProperty.call(changes, '_open')) {
26948
- if (changes._open.currentValue) {
26949
- if (this.clrSidePanelPinnable && this.pinned) {
26950
- this.displaySideBySide();
26951
- }
26952
- }
26953
- else {
26954
- if (this.clrSidePanelPinnable && this.pinned) {
26955
- this.displayOverlapping();
26956
- }
26957
- }
27592
+ if (this.position === 'bottom') {
27593
+ this.configuration.fadeMove = 'fadeUp';
26958
27594
  }
26959
27595
  }
26960
27596
  ngOnDestroy() {
26961
- this.displayOverlapping();
27597
+ this.cleanupPinnedClasses();
27598
+ }
27599
+ handleModalOpen(open) {
27600
+ if (open) {
27601
+ this.updateModalState();
27602
+ }
27603
+ else {
27604
+ this.cleanupPinnedClasses();
27605
+ }
27606
+ this.openChange.emit(open);
26962
27607
  }
26963
27608
  open() {
26964
27609
  this.modal.open();
@@ -26976,28 +27621,41 @@ class ClrSidePanel {
26976
27621
  this.modal.close();
26977
27622
  }
26978
27623
  }
26979
- displaySideBySide() {
26980
- this.hostElement.classList.add('clr-side-panel-pinned-' + this.size);
27624
+ updateModalState() {
27625
+ if (!this.modal) {
27626
+ return;
27627
+ }
27628
+ if (this.pinned) {
27629
+ this.modal.stopClose = true;
27630
+ this.updatePinnedClasses();
27631
+ }
27632
+ else {
27633
+ this.modal.stopClose = this.originalStopClose;
27634
+ this.cleanupPinnedClasses();
27635
+ }
26981
27636
  }
26982
- displayOverlapping() {
26983
- this.hostElement.classList.forEach(className => {
26984
- if (className.startsWith('clr-side-panel-pinned-')) {
26985
- this.hostElement.classList.remove(className);
26986
- }
27637
+ cleanupPinnedClasses() {
27638
+ [this.hostElement, document.body].forEach(host => {
27639
+ host.classList.forEach(className => {
27640
+ if (className.startsWith('clr-side-panel-pinned-')) {
27641
+ host.classList.remove(className);
27642
+ }
27643
+ });
26987
27644
  });
26988
27645
  }
27646
+ updatePinnedClasses() {
27647
+ this.cleanupPinnedClasses();
27648
+ this.hostElement.classList.add(`clr-side-panel-pinned-${this.position}-${this.size}`);
27649
+ }
26989
27650
  }
26990
27651
  ClrSidePanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, deps: [{ token: i0.ElementRef }, { token: ClrModalConfigurationService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
26991
- ClrSidePanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSidePanel, selector: "clr-side-panel", inputs: { _open: ["clrSidePanelOpen", "_open"], closeButtonAriaLabel: ["clrSidePanelCloseButtonAriaLabel", "closeButtonAriaLabel"], skipAnimation: ["clrSidePanelSkipAnimation", "skipAnimation"], labelledById: ["clrSidePanelLabelledById", "labelledById"], staticBackdrop: ["clrSidePanelStaticBackdrop", "staticBackdrop"], preventClose: ["clrSidePanelPreventClose", "preventClose"], size: ["clrSidePanelSize", "size"], clrSidePanelBackdrop: "clrSidePanelBackdrop", clrSidePanelPinnable: "clrSidePanelPinnable" }, outputs: { openChange: "clrSidePanelOpenChange", altClose: "clrSidePanelAlternateClose" }, host: { listeners: { "document:pointerup": "documentClick($event)" }, properties: { "class.side-panel": "true" } }, viewQueries: [{ propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"openChange.emit($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { 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" }] });
27652
+ ClrSidePanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSidePanel, selector: "clr-side-panel", inputs: { closeButtonAriaLabel: ["clrSidePanelCloseButtonAriaLabel", "closeButtonAriaLabel"], skipAnimation: ["clrSidePanelSkipAnimation", "skipAnimation"], labelledById: ["clrSidePanelLabelledById", "labelledById"], staticBackdrop: ["clrSidePanelStaticBackdrop", "staticBackdrop"], closable: ["clrSidePanelClosable", "closable"], preventClose: ["clrSidePanelPreventClose", "preventClose"], _open: ["clrSidePanelOpen", "_open"], size: ["clrSidePanelSize", "size"], position: ["clrSidePanelPosition", "position"], pinned: ["clrSidePanelPinned", "pinned"], clrSidePanelBackdrop: "clrSidePanelBackdrop", clrSidePanelPinnable: "clrSidePanelPinnable" }, outputs: { openChange: "clrSidePanelOpenChange", altClose: "clrSidePanelAlternateClose" }, host: { listeners: { "document:pointerup": "documentClick($event)" }, properties: { "class.side-panel": "true", "class.side-panel-bottom": "this.bottomPositionCssClass" } }, viewQueries: [{ propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"handleModalOpen($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n [clrModalClosable]=\"closable\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { 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" }] });
26992
27653
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, decorators: [{
26993
27654
  type: Component,
26994
27655
  args: [{ selector: 'clr-side-panel', host: {
26995
27656
  '[class.side-panel]': 'true',
26996
- }, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"openChange.emit($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n" }]
26997
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ClrModalConfigurationService }, { type: ClrCommonStringsService }]; }, propDecorators: { _open: [{
26998
- type: Input,
26999
- args: ['clrSidePanelOpen']
27000
- }], openChange: [{
27657
+ }, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"handleModalOpen($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n [clrModalClosable]=\"closable\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n" }]
27658
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: ClrModalConfigurationService }, { type: ClrCommonStringsService }]; }, propDecorators: { openChange: [{
27001
27659
  type: Output,
27002
27660
  args: ['clrSidePanelOpenChange']
27003
27661
  }], closeButtonAriaLabel: [{
@@ -27012,22 +27670,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
27012
27670
  }], staticBackdrop: [{
27013
27671
  type: Input,
27014
27672
  args: ['clrSidePanelStaticBackdrop']
27673
+ }], closable: [{
27674
+ type: Input,
27675
+ args: ['clrSidePanelClosable']
27015
27676
  }], preventClose: [{
27016
27677
  type: Input,
27017
27678
  args: ['clrSidePanelPreventClose']
27018
27679
  }], altClose: [{
27019
27680
  type: Output,
27020
27681
  args: ['clrSidePanelAlternateClose']
27021
- }], modal: [{
27022
- type: ViewChild,
27023
- args: [ClrModal]
27682
+ }], _open: [{
27683
+ type: Input,
27684
+ args: ['clrSidePanelOpen']
27024
27685
  }], size: [{
27025
27686
  type: Input,
27026
27687
  args: ['clrSidePanelSize']
27688
+ }], position: [{
27689
+ type: Input,
27690
+ args: ['clrSidePanelPosition']
27691
+ }], pinned: [{
27692
+ type: Input,
27693
+ args: ['clrSidePanelPinned']
27027
27694
  }], clrSidePanelBackdrop: [{
27028
27695
  type: Input
27029
27696
  }], clrSidePanelPinnable: [{
27030
27697
  type: Input
27698
+ }], modal: [{
27699
+ type: ViewChild,
27700
+ args: [ClrModal]
27701
+ }], bottomPositionCssClass: [{
27702
+ type: HostBinding,
27703
+ args: ['class.side-panel-bottom']
27031
27704
  }], documentClick: [{
27032
27705
  type: HostListener,
27033
27706
  args: ['document:pointerup', ['$event']]
@@ -29402,10 +30075,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29402
30075
  * The full license information can be found in LICENSE in the root directory of this project.
29403
30076
  */
29404
30077
  class ClrWizardStepnavItem {
29405
- constructor(navService, pageCollection, commonStrings) {
30078
+ constructor(navService, pageCollection, commonStrings, elementRef) {
29406
30079
  this.navService = navService;
29407
30080
  this.pageCollection = pageCollection;
29408
30081
  this.commonStrings = commonStrings;
30082
+ this.elementRef = elementRef;
30083
+ /**
30084
+ * This is used to prevent the steps from scrolling as the user clicks on the steps.
30085
+ */
30086
+ this.skipNextScroll = false;
29409
30087
  }
29410
30088
  get id() {
29411
30089
  this.pageGuard();
@@ -29451,12 +30129,43 @@ class ClrWizardStepnavItem {
29451
30129
  const allIds = this.isComplete ? [this.stepIconId, ...textIds] : textIds;
29452
30130
  return allIds.join(' ');
29453
30131
  }
30132
+ get icon() {
30133
+ if (this.isCurrent) {
30134
+ return {
30135
+ shape: 'dot-circle',
30136
+ label: this.commonStrings.keys.wizardStepCurrent || this.commonStrings.keys.timelineStepCurrent,
30137
+ };
30138
+ }
30139
+ else if (this.hasError) {
30140
+ return {
30141
+ shape: 'error-standard',
30142
+ label: this.commonStrings.keys.wizardStepError || this.commonStrings.keys.timelineStepError,
30143
+ };
30144
+ }
30145
+ else if (this.isComplete) {
30146
+ return {
30147
+ shape: 'success-standard',
30148
+ label: this.commonStrings.keys.wizardStepSuccess || this.commonStrings.keys.timelineStepSuccess,
30149
+ };
30150
+ }
30151
+ else {
30152
+ return null;
30153
+ }
30154
+ }
30155
+ ngOnInit() {
30156
+ this.subscription = this.ensureCurrentStepIsScrolledIntoView().subscribe();
30157
+ }
30158
+ ngOnDestroy() {
30159
+ var _a;
30160
+ (_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
30161
+ }
29454
30162
  click() {
29455
30163
  this.pageGuard();
29456
30164
  // if we click on our own stepnav or a disabled stepnav, we don't want to do anything
29457
30165
  if (this.isDisabled || this.isCurrent) {
29458
30166
  return;
29459
30167
  }
30168
+ this.skipNextScroll = true;
29460
30169
  this.navService.goTo(this.page);
29461
30170
  }
29462
30171
  pageGuard() {
@@ -29464,8 +30173,20 @@ class ClrWizardStepnavItem {
29464
30173
  throw new Error('Wizard stepnav item is not associated with a wizard page.');
29465
30174
  }
29466
30175
  }
30176
+ ensureCurrentStepIsScrolledIntoView() {
30177
+ // Don't use "smooth" scrolling when the wizard is first opened to avoid a delay in scrolling the current step into view.
30178
+ // The current step when the wizard is opened might not be the first step. For example, the wizard can be closed and re-opened.
30179
+ let scrollBehavior = 'auto';
30180
+ return this.navService.currentPageChanged.pipe(startWith$1(this.navService.currentPage), tap$1(currentPage => {
30181
+ if (!this.skipNextScroll && currentPage === this.page) {
30182
+ this.elementRef.nativeElement.scrollIntoView({ behavior: scrollBehavior, block: 'center', inline: 'center' });
30183
+ }
30184
+ scrollBehavior = 'smooth';
30185
+ this.skipNextScroll = false;
30186
+ }));
30187
+ }
29467
30188
  }
29468
- ClrWizardStepnavItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardStepnavItem, deps: [{ token: WizardNavigationService }, { token: PageCollectionService }, { token: ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component });
30189
+ ClrWizardStepnavItem.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardStepnavItem, deps: [{ token: WizardNavigationService }, { token: PageCollectionService }, { token: ClrCommonStringsService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
29469
30190
  ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrWizardStepnavItem, selector: "[clr-wizard-stepnav-item]", inputs: { page: "page" }, host: { properties: { "id": "id", "attr.aria-current": "stepAriaCurrent", "attr.aria-controls": "page.id", "class.clr-nav-link": "true", "class.nav-item": "true", "class.active": "isCurrent", "class.disabled": "isDisabled", "class.no-click": "!canNavigate", "class.complete": "isComplete", "class.error": "hasError" } }, ngImport: i0, template: `
29470
30191
  <button
29471
30192
  type="button"
@@ -29476,18 +30197,12 @@ ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
29476
30197
  >
29477
30198
  <div class="clr-wizard-stepnav-link-icon">
29478
30199
  <cds-icon
29479
- *ngIf="hasError"
29480
- [id]="stepIconId"
29481
- shape="error-standard"
29482
- role="img"
29483
- [attr.aria-label]="commonStrings.keys.wizardStepError"
29484
- ></cds-icon>
29485
- <cds-icon
29486
- *ngIf="!hasError && isComplete"
30200
+ *ngIf="icon; let icon"
29487
30201
  [id]="stepIconId"
29488
- shape="success-standard"
29489
30202
  role="img"
29490
- [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
30203
+ class="clr-wizard-stepnav-link-icon"
30204
+ [attr.shape]="icon.shape"
30205
+ [attr.aria-label]="icon.label"
29491
30206
  ></cds-icon>
29492
30207
  </div>
29493
30208
 
@@ -29514,18 +30229,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29514
30229
  >
29515
30230
  <div class="clr-wizard-stepnav-link-icon">
29516
30231
  <cds-icon
29517
- *ngIf="hasError"
29518
- [id]="stepIconId"
29519
- shape="error-standard"
29520
- role="img"
29521
- [attr.aria-label]="commonStrings.keys.wizardStepError"
29522
- ></cds-icon>
29523
- <cds-icon
29524
- *ngIf="!hasError && isComplete"
30232
+ *ngIf="icon; let icon"
29525
30233
  [id]="stepIconId"
29526
- shape="success-standard"
29527
30234
  role="img"
29528
- [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
30235
+ class="clr-wizard-stepnav-link-icon"
30236
+ [attr.shape]="icon.shape"
30237
+ [attr.aria-label]="icon.label"
29529
30238
  ></cds-icon>
29530
30239
  </div>
29531
30240
 
@@ -29551,7 +30260,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
29551
30260
  '[class.error]': 'hasError',
29552
30261
  },
29553
30262
  }]
29554
- }], ctorParameters: function () { return [{ type: WizardNavigationService }, { type: PageCollectionService }, { type: ClrCommonStringsService }]; }, propDecorators: { page: [{
30263
+ }], ctorParameters: function () { return [{ type: WizardNavigationService }, { type: PageCollectionService }, { type: ClrCommonStringsService }, { type: i0.ElementRef }]; }, propDecorators: { page: [{
29555
30264
  type: Input,
29556
30265
  args: ['page']
29557
30266
  }] } });
@@ -29629,6 +30338,15 @@ class ClrWizard {
29629
30338
  * Set the modal size of the wizard. Set using `[clrWizardSize]` input.
29630
30339
  */
29631
30340
  this.size = 'xl';
30341
+ /**
30342
+ * Enable "in page" wizard. Set using `[clrWizardInPage]` input.
30343
+ */
30344
+ this.inPage = false;
30345
+ /**
30346
+ * Make an "in page" wizard fill the `.content-area`. Set using `[clrWizardInPageFillContentArea]` input.
30347
+ * If you can't use this option, you will likely need to provide custom CSS to set the wizard's height and margins.
30348
+ */
30349
+ this.inPageFillContentArea = false;
29632
30350
  /**
29633
30351
  * Tells the modal part of the wizard whether it should have a close "X"
29634
30352
  * in the top right corner. Set using `[clrWizardClosable]` input.
@@ -29787,6 +30505,9 @@ class ClrWizard {
29787
30505
  ngAfterContentInit() {
29788
30506
  this.pageCollection.pages = this.pages;
29789
30507
  this.headerActionService.wizardHeaderActions = this.headerActions;
30508
+ if (this.inPage) {
30509
+ this.open();
30510
+ }
29790
30511
  this.initializeButtons();
29791
30512
  }
29792
30513
  ngDoCheck() {
@@ -29984,7 +30705,7 @@ class ClrWizard {
29984
30705
  (_a = this.pageTitle) === null || _a === void 0 ? void 0 : _a.nativeElement.focus();
29985
30706
  this.currentPageChanged.emit();
29986
30707
  // scroll to top of page in case there is long page content
29987
- (_b = this.modal) === null || _b === void 0 ? void 0 : _b.scrollTop();
30708
+ (_b = this.bodyElementRef) === null || _b === void 0 ? void 0 : _b.nativeElement.scrollTo(0, 0);
29988
30709
  });
29989
30710
  }
29990
30711
  updateNavOnPageChanges() {
@@ -30008,7 +30729,7 @@ class ClrWizard {
30008
30729
  }
30009
30730
  }
30010
30731
  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"] }] });
30732
+ 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 </div>\n </div>\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 <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
30733
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizard, decorators: [{
30013
30734
  type: Component,
30014
30735
  args: [{ selector: 'clr-wizard', providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], host: {
@@ -30016,8 +30737,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30016
30737
  '[class.wizard-md]': "size == 'md'",
30017
30738
  '[class.wizard-lg]': "size == 'lg'",
30018
30739
  '[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" }]
30740
+ '[class.wizard-in-page]': 'inPage',
30741
+ '[class.wizard-in-page--fill-content-area]': 'inPage && inPageFillContentArea',
30742
+ }, 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 </div>\n </div>\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 <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
30743
  }], ctorParameters: function () {
30022
30744
  return [{ type: undefined, decorators: [{
30023
30745
  type: Inject,
@@ -30029,6 +30751,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30029
30751
  }], size: [{
30030
30752
  type: Input,
30031
30753
  args: ['clrWizardSize']
30754
+ }], inPage: [{
30755
+ type: Input,
30756
+ args: ['clrWizardInPage']
30757
+ }], inPageFillContentArea: [{
30758
+ type: Input,
30759
+ args: ['clrWizardInPageFillContentArea']
30032
30760
  }], closable: [{
30033
30761
  type: Input,
30034
30762
  args: ['clrWizardClosable']
@@ -30068,6 +30796,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30068
30796
  }], wizardTitle: [{
30069
30797
  type: ContentChild,
30070
30798
  args: [ClrWizardTitle]
30799
+ }], bodyElementRef: [{
30800
+ type: ViewChild,
30801
+ args: ['body']
30071
30802
  }], modal: [{
30072
30803
  type: ViewChild,
30073
30804
  args: [ClrModal]
@@ -30609,5 +31340,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
30609
31340
  * Generated bundle index. Do not edit.
30610
31341
  */
30611
31342
 
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 };
31343
+ 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, ClrModalHostComponent, ClrModalModule, ClrMonthpicker, ClrNavLevel, ClrNavigationModule, ClrNumberInput, ClrNumberInputContainer, ClrNumberInputModule, ClrOption, ClrOptionGroup, 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
31344
  //# sourceMappingURL=clr-angular.mjs.map